From a3389f25f786be7139feaca837c86442f7745745 Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 6 Aug 2025 11:31:21 +0200 Subject: changed gui stuff --- include/glamac/graphics/glamac_render.h | 26 +++++++------ include/glamac/graphics/glamac_view.h | 66 +++++++++++++++++++++++++++++++-- 2 files changed, 76 insertions(+), 16 deletions(-) (limited to 'include') diff --git a/include/glamac/graphics/glamac_render.h b/include/glamac/graphics/glamac_render.h index 4c20751..29e7613 100644 --- a/include/glamac/graphics/glamac_render.h +++ b/include/glamac/graphics/glamac_render.h @@ -9,26 +9,28 @@ #include "../core/glamacdef.h" #include "glamac_view.h" +// Font management +typedef struct { + TTF_Font *regular; + TTF_Font *title; + TTF_Font *label; + TTF_Font *axis; // Smaller font for axis labels + TTF_Font *label_bold; // Bold font for cluster representatives +} FontSet; + // Drawing primitives void draw_text(SDL_Renderer *renderer, TTF_Font *font, const char *text, i32 x, i32 y, SDL_Color color); void draw_filled_circle(SDL_Renderer *renderer, i32 centerX, i32 centerY, i32 radius); // UI element rendering -void draw_axes(SDL_Renderer *renderer, TTF_Font *font, TTF_Font *titleFont, const ViewState* view); +void draw_axes(SDL_Renderer *renderer, const FontSet *fonts, const ViewState* view); void draw_grid(SDL_Renderer *renderer, const ViewState* view); -void draw_glass_points(SDL_Renderer *renderer, TTF_Font *labelFont, const ViewState* view); -void draw_glass_properties(SDL_Renderer *renderer, TTF_Font *font, TTF_Font *titleFont, const ViewState* view); -void draw_help_window(SDL_Renderer *renderer, TTF_Font *font, TTF_Font *titleFont, const ViewState* view); +void draw_glass_points(SDL_Renderer *renderer, const FontSet *fonts, const ViewState* view); +void draw_glass_properties(SDL_Renderer *renderer, const FontSet *fonts, const ViewState* view); +void draw_help_window(SDL_Renderer *renderer, const FontSet *fonts, const ViewState* view); // Main render function -void render(SDL_Renderer *renderer, TTF_Font *font, TTF_Font *titleFont, TTF_Font *labelFont, ViewState* view); - -// Font management -typedef struct { - TTF_Font *regular; - TTF_Font *title; - TTF_Font *label; -} FontSet; +void render(SDL_Renderer *renderer, const FontSet *fonts, ViewState* view); // Load all required fonts b32 load_fonts(FontSet *fonts); diff --git a/include/glamac/graphics/glamac_view.h b/include/glamac/graphics/glamac_view.h index 58de2b1..a15aaf1 100644 --- a/include/glamac/graphics/glamac_view.h +++ b/include/glamac/graphics/glamac_view.h @@ -8,8 +8,8 @@ #include "../core/glamacdef.h" // Constants for view -#define MIN_PADDING 20 // Minimum padding in pixels -#define MAX_PADDING_PERCENT 0.04f // Maximum padding as percentage of window size +#define MIN_PADDING 15 // Minimum padding in pixels (reduced for small windows) +#define MAX_PADDING_PERCENT 0.06f // Maximum padding as percentage of window size (increased for responsiveness) #define PAN_STEP 0.05f // Step size for keyboard panning #define ZOOM_FACTOR 1.2f // Zoom factor for zoom operations #define MIN_ZOOM 0.5f // Minimum zoom level @@ -20,7 +20,28 @@ #define LABEL_OFFSET_Y -8 // Vertical offset from glass point (pixels) #define LABEL_SIZE_SCALE 1.4f // Scale factor for glass name labels +// Performance optimization constants +#define LABEL_VISIBILITY_THRESHOLD 2.0f // Minimum zoom level to show labels +#define VIEWPORT_CULL_MARGIN 50 // Extra margin for viewport culling (pixels) +// Tight clustering constants (easily adjustable thresholds) +#define TIGHT_CLUSTER_ND_THRESHOLD 0.0001f // Maximum nd difference for tight clustering +#define TIGHT_CLUSTER_VD_THRESHOLD 0.1f // Maximum vd difference for tight clustering +#define MAX_CLUSTER_SIZE 8 // Maximum glasses per tight cluster + + + +// Forward declaration for tight cluster +typedef struct TightCluster TightCluster; + +// Tight cluster structure for glasses with similar optical properties +struct TightCluster { + u32 glassIndices[MAX_CLUSTER_SIZE]; // Indices of glasses in this cluster + u32 count; // Number of glasses in cluster + u32 representativeIndex; // Index of glass with shortest name (for display) + f32 centerNd; // Average nd of cluster + f32 centerVd; // Average vd of cluster +}; // State for zooming and panning typedef struct { @@ -37,6 +58,13 @@ typedef struct { b32 gKeyPressed; // Flag to track if 'g' was pressed u32 gKeyTime; // Time when 'g' was pressed for sequence timing i32 selectedGlass; // Index of selected glass (-1 if none) + b32 viewDirty; // Flag to track if view needs re-rendering + + // Tight clustering data + TightCluster* tightClusters; // Array of tight clusters + u32 tightClusterCount; // Number of tight clusters + i32* glassToCluster; // Map from glass index to cluster index (-1 if not clustered) + u32 clusteringGlassCount; // Glass count when clustering was created (for bounds checking) } ViewState; // Initialize a view state with default values @@ -95,15 +123,45 @@ i32 find_nearest_glass(i32 x, i32 y, const ViewState* view, f32 maxDistance); void get_visible_data_range(const ViewState* view, f32 *visibleMinAbbe, f32 *visibleMaxAbbe, f32 *visibleMinRI, f32 *visibleMaxRI); +// Check if a glass point is visible in the current viewport (optimized for data-space culling) +static inline b32 is_glass_visible_fast(f32 abbeNumber, f32 refractiveIndex, + f32 visibleMinAbbe, f32 visibleMaxAbbe, + f32 visibleMinRI, f32 visibleMaxRI) { + // Simple bounds check in data space (no coordinate transformation needed) + return (abbeNumber >= visibleMinAbbe && abbeNumber <= visibleMaxAbbe && + refractiveIndex >= visibleMinRI && refractiveIndex <= visibleMaxRI); +} + +// Legacy function for compatibility - use is_glass_visible_fast for better performance +static inline b32 is_glass_visible(f32 abbeNumber, f32 refractiveIndex, const ViewState* view) { + i32 x, y; + data_to_screen_coords(abbeNumber, refractiveIndex, view, &x, &y); + + const i32 margin = VIEWPORT_CULL_MARGIN; + return (x >= -margin && x < view->windowWidth + margin && + y >= -margin && y < view->windowHeight + margin); +} + +// Mark view as dirty (needs re-rendering) +static inline void mark_view_dirty(ViewState* view) { + view->viewDirty = 1; +} + // Handle mouse wheel zoom void handle_mouse_wheel_zoom(i32 wheelY, i32 mouseX, i32 mouseY, ViewState* view); -// Toggle fullscreen -void toggle_fullscreen(SDL_Window* window); +// Toggle fullscreen with proper state synchronization +void toggle_fullscreen(SDL_Window* window, ViewState* view); // Reset view to default void reset_view(ViewState* view); +// Tight clustering functions +void create_tight_clusters(ViewState* view); +void free_tight_clusters(ViewState* view); +i32 find_tight_cluster_for_glass(i32 glassIndex, const ViewState* view); +b32 should_show_glass_label_tight(i32 glassIndex, const ViewState* view); + #endif /* GLAMAC_VIEW_H */ -- cgit v1.2.3