diff options
author | admin <admin@optics-design.com> | 2025-08-06 11:31:21 +0200 |
---|---|---|
committer | admin <admin@optics-design.com> | 2025-08-06 11:31:21 +0200 |
commit | a3389f25f786be7139feaca837c86442f7745745 (patch) | |
tree | e24041fdb924ade084180c4f0cd38159f10b3fbd /include | |
parent | 04b3fcb479f5aaae06d18b315a8bdc8c298f4eae (diff) |
changed gui stuff
Diffstat (limited to 'include')
-rw-r--r-- | include/glamac/graphics/glamac_render.h | 26 | ||||
-rw-r--r-- | include/glamac/graphics/glamac_view.h | 66 |
2 files changed, 76 insertions, 16 deletions
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 */
|