diff options
author | admin <admin@optics-design.com> | 2025-08-05 10:11:14 +0200 |
---|---|---|
committer | admin <admin@optics-design.com> | 2025-08-05 10:11:14 +0200 |
commit | 9496ae0a50e6848121c7e913ca2dc55c8e6c84c1 (patch) | |
tree | 0a8705a31233bc07710950e653d1f55e7155f78a /include | |
parent | b59995f9732720e8c82e22f44c0c8cb3efe2c708 (diff) |
rewrote clustering
Diffstat (limited to 'include')
-rw-r--r-- | include/glamac_render.h | 34 | ||||
-rw-r--r-- | include/glamac_view.h | 66 |
2 files changed, 63 insertions, 37 deletions
diff --git a/include/glamac_render.h b/include/glamac_render.h index a07e055..899702d 100644 --- a/include/glamac_render.h +++ b/include/glamac_render.h @@ -16,12 +16,12 @@ void draw_filled_circle(SDL_Renderer *renderer, i32 centerX, i32 centerY, i32 ra // UI element rendering
void draw_axes(SDL_Renderer *renderer, TTF_Font *font, TTF_Font *titleFont, 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, GlassCluster* clusters, i32 clusterCount);
+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);
// Main render function
-void render(SDL_Renderer *renderer, TTF_Font *font, TTF_Font *titleFont, TTF_Font *labelFont, ViewState* view, GlassCluster* clusters, i32 clusterCount);
+void render(SDL_Renderer *renderer, TTF_Font *font, TTF_Font *titleFont, TTF_Font *labelFont, ViewState* view);
// Font management
typedef struct {
@@ -40,33 +40,11 @@ b32 load_adaptive_fonts(FontSet *fonts, i32 windowWidth, i32 windowHeight, f32 d void free_fonts(FontSet *fonts);
void clear_text_cache(void);
-// Simple collision detection structures
-typedef struct {
- i32 x, y; // Screen position
- i32 width, height; // Label dimensions
-} LabelRect;
-
-// Pre-calculated label positions (updated only on catalog changes)
-typedef struct {
- i32 glassIndex; // Which glass this label belongs to
- i32 screenX, screenY; // Fixed screen position
- b32 visible; // Whether to show this label
- char text[64]; // Label text
-} PreCalculatedLabel;
-
-// Global label positioning system
-void recalculate_label_positions(const ViewState* view, GlassCluster* clusters, i32 clusterCount);
-void draw_precalculated_labels(SDL_Renderer *renderer, TTF_Font *labelFont, const ViewState* view);
-b32 needs_label_recalculation(ViewState* view);
-
-// Collision detection functions for debug mode
-b32 rects_overlap(const LabelRect* a, const LabelRect* b);
-b32 label_collides_with_point(const LabelRect* label, i32 pointX, i32 pointY, i32 pointRadius);
-
-// Advanced label visibility functions for testing
+// Simple glass property display helper
void calculate_smart_window_position(i32 glassX, i32 glassY, i32 windowWidth, i32 windowHeight,
const ViewState* view, i32* windowX, i32* windowY);
-f32 calculate_label_priority(i32 glassIndex, const ViewState* view, GlassCluster* clusters, i32 clusterCount);
-b32 should_show_label_advanced(i32 glassIndex, const ViewState* view, GlassCluster* clusters, i32 clusterCount);
+
+// Debug mode check
+b32 is_debug_mode(void);
#endif /* GLAMAC_RENDER_H */
diff --git a/include/glamac_view.h b/include/glamac_view.h index 9eec63a..6ca4b9b 100644 --- a/include/glamac_view.h +++ b/include/glamac_view.h @@ -20,14 +20,45 @@ #define LABEL_OFFSET_Y -8 // Vertical offset from glass point (pixels)
#define LABEL_SIZE_SCALE 1.4f // Scale factor for glass name labels
-// Glass clustering for nearly identical glasses
-#define MAX_CLUSTER_SIZE 8
+// Tight clustering parameters
+#define MAX_CLUSTER_SIZE 8 // Maximum glasses per cluster
+#define DEFAULT_TIGHT_CLUSTER_ND_THRESHOLD 0.0005f // Default nd difference threshold
+#define DEFAULT_TIGHT_CLUSTER_VD_THRESHOLD 0.15f // Default vd difference threshold
+
+// Loose clustering parameters (zoom-dependent)
+#define DEFAULT_LOOSE_CLUSTER_ND_THRESHOLD 0.3f // Default nd base threshold
+#define DEFAULT_LOOSE_CLUSTER_VD_THRESHOLD 0.55f // Default vd base threshold
+#define DEFAULT_LOOSE_CLUSTER_ND_FRACTION 4.9f // Default nd fraction of visible range
+#define DEFAULT_LOOSE_CLUSTER_VD_FRACTION 0.9f // Default vd fraction of visible range
+
+// Global tight cluster thresholds (adjustable parameters)
+extern f32 g_tight_cluster_nd_threshold;
+extern f32 g_tight_cluster_vd_threshold;
+
+// Global loose cluster parameters (adjustable parameters)
+extern f32 g_loose_cluster_nd_threshold; // Base threshold
+extern f32 g_loose_cluster_vd_threshold; // Base threshold
+extern f32 g_loose_cluster_nd_fraction; // Zoom scaling fraction
+extern f32 g_loose_cluster_vd_fraction; // Zoom scaling fraction
+
+// Tight cluster structure
typedef struct {
i32 glassIndices[MAX_CLUSTER_SIZE]; // Indices of glasses in this cluster
i32 count; // Number of glasses in cluster
- f32 avgAbbeNumber; // Average position for rendering
+ i32 representativeIndex; // Index of glass with shortest name
+ f32 avgAbbeNumber; // Average position for reference
f32 avgRefractiveIndex;
-} GlassCluster;
+} TightCluster;
+
+// Loose cluster structure (zoom-dependent)
+typedef struct {
+ i32 glassIndices[MAX_CLUSTER_SIZE]; // Indices of glasses in this cluster
+ i32 count; // Number of glasses in cluster
+ i32 representativeIndex; // Index of glass with shortest name
+ f32 avgAbbeNumber; // Average position for reference
+ f32 avgRefractiveIndex;
+} LooseCluster;
+
// State for zooming and panning
typedef struct {
@@ -44,7 +75,15 @@ 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)
- i32 selectedCluster; // Index of selected cluster (-1 if none)
+ i32 selectedCluster; // Index of selected tight cluster (-1 if none)
+
+ // Tight cluster data (per catalog)
+ TightCluster* tightClusters; // Array of tight clusters for current catalog
+ i32 tightClusterCount; // Number of tight clusters
+
+ // Loose cluster data (per catalog, zoom-dependent)
+ LooseCluster* looseClusters; // Array of loose clusters for current catalog
+ i32 looseClusterCount; // Number of loose clusters
// Label recalculation tracking
f32 lastZoomLevel; // Last zoom level for which labels were calculated
@@ -119,9 +158,18 @@ void toggle_fullscreen(SDL_Window* window); // Reset view to default
void reset_view(ViewState* view);
-// Glass clustering functions
-GlassCluster* create_glass_clusters(i32* clusterCount);
-void free_glass_clusters(GlassCluster* clusters);
-i32 find_cluster_at_position(GlassCluster* clusters, i32 clusterCount, i32 x, i32 y, const 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);
+
+// Loose clustering functions (zoom-dependent)
+void create_loose_clusters(ViewState* view);
+void free_loose_clusters(ViewState* view);
+i32 find_loose_cluster_for_glass(i32 glassIndex, const ViewState* view);
+
+// Combined clustering logic
+b32 should_show_glass_label(i32 glassIndex, const ViewState* view);
+
#endif /* GLAMAC_VIEW_H */
|