From 9496ae0a50e6848121c7e913ca2dc55c8e6c84c1 Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 5 Aug 2025 10:11:14 +0200 Subject: rewrote clustering --- include/glamac_render.h | 34 +++++-------------------- include/glamac_view.h | 66 ++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 63 insertions(+), 37 deletions(-) (limited to 'include') 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 */ -- cgit v1.2.3