xp12camera

Owner: IIIlllIIIllI URL: git@github.com:nyangkosense/xp12camera.git

10

Commit c3066de4494230b6948b21640eadb05cb97c3497 by SM <seb.michalk@gmail.com> on 2025-06-25 15:54:30 +0200
diff --git a/FLIR_Camera.cpp b/FLIR_Camera.cpp
index 748ee02..e6b9505 100644
--- a/FLIR_Camera.cpp
+++ b/FLIR_Camera.cpp
@@ -532,41 +532,44 @@ static float GetDistanceToCamera(float x, float y, float z);
      }
      
      glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
-     glLineWidth(5.0f); // Make lines thicker to be more visible
+     glLineWidth(3.0f);
  
      glBegin(GL_LINES);
-     // Crosshair - make it bigger and more visible
-     glVertex2f(centerX - 50, centerY);
-     glVertex2f(centerX + 50, centerY);
-     glVertex2f(centerX, centerY - 50);
-     glVertex2f(centerX, centerY + 50);
+     // No crosshair - only brackets
      
-     // Targeting brackets
-     float bracketSize = 60.0f / gZoomLevel;
+     // Military-style targeting brackets [ ] - FIXED SIZE
+     float bracketSize = 50.0f;  // Fixed size - doesn't change with zoom
+     float bracketLength = 20.0f;
      
-     // Top-left bracket
+     // Top-left bracket [
      glVertex2f(centerX - bracketSize, centerY + bracketSize);
-     glVertex2f(centerX - bracketSize + 20, centerY + bracketSize);
+     glVertex2f(centerX - bracketSize + bracketLength, centerY + bracketSize);
      glVertex2f(centerX - bracketSize, centerY + bracketSize);
-     glVertex2f(centerX - bracketSize, centerY + bracketSize - 20);
+     glVertex2f(centerX - bracketSize, centerY + bracketSize - bracketLength);
      
-     // Top-right bracket
+     // Top-right bracket ]
      glVertex2f(centerX + bracketSize, centerY + bracketSize);
-     glVertex2f(centerX + bracketSize - 20, centerY + bracketSize);
+     glVertex2f(centerX + bracketSize - bracketLength, centerY + bracketSize);
      glVertex2f(centerX + bracketSize, centerY + bracketSize);
-     glVertex2f(centerX + bracketSize, centerY + bracketSize - 20);
+     glVertex2f(centerX + bracketSize, centerY + bracketSize - bracketLength);
      
-     // Bottom-left bracket
+     // Bottom-left bracket [
      glVertex2f(centerX - bracketSize, centerY - bracketSize);
-     glVertex2f(centerX - bracketSize + 20, centerY - bracketSize);
+     glVertex2f(centerX - bracketSize + bracketLength, centerY - bracketSize);
      glVertex2f(centerX - bracketSize, centerY - bracketSize);
-     glVertex2f(centerX - bracketSize, centerY - bracketSize + 20);
+     glVertex2f(centerX - bracketSize, centerY - bracketSize + bracketLength);
      
-     // Bottom-right bracket
+     // Bottom-right bracket ]
      glVertex2f(centerX + bracketSize, centerY - bracketSize);
-     glVertex2f(centerX + bracketSize - 20, centerY - bracketSize);
+     glVertex2f(centerX + bracketSize - bracketLength, centerY - bracketSize);
      glVertex2f(centerX + bracketSize, centerY - bracketSize);
-     glVertex2f(centerX + bracketSize, centerY - bracketSize + 20);
+     glVertex2f(centerX + bracketSize, centerY - bracketSize + bracketLength);
+     
+     // Small center dot for precise aiming
+     glVertex2f(centerX - 2, centerY);
+     glVertex2f(centerX + 2, centerY);
+     glVertex2f(centerX, centerY - 2);
+     glVertex2f(centerX, centerY + 2);
      glEnd();
  
      // Draw thermal effects based on thermal mode - using same reliable approach as crosshair
@@ -660,63 +663,76 @@ static float GetDistanceToCamera(float x, float y, float z);
      glVertex2f(30 + zoomBar, 40);
      glEnd();
      
-     // Target lock indicator (minimal and professional)
+     // TARGET LOCK INDICATOR - VERY VISIBLE
      if (gTargetLocked) {
-         glColor4f(1.0f, 0.0f, 0.0f, 0.9f); // Red for locked
-         glLineWidth(2.0f);
+         glColor4f(1.0f, 0.0f, 0.0f, 1.0f); // Bright red for locked
+         glLineWidth(4.0f);
          
-         // Simple lock indicator box around center crosshair
+         // Large red box around the entire targeting area
          glBegin(GL_LINE_LOOP);
-         glVertex2f(centerX - 80, centerY - 80);
-         glVertex2f(centerX + 80, centerY - 80);
-         glVertex2f(centerX + 80, centerY + 80);
-         glVertex2f(centerX - 80, centerY + 80);
+         glVertex2f(centerX - 100, centerY - 100);
+         glVertex2f(centerX + 100, centerY - 100);
+         glVertex2f(centerX + 100, centerY + 100);
+         glVertex2f(centerX - 100, centerY + 100);
          glEnd();
          
-         // Lock indicator corners
+         // Flashing corner indicators
+         float time = XPLMGetElapsedTime();
+         float flash = (sinf(time * 4.0f) + 1.0f) * 0.5f; // 0-1 flashing
+         glColor4f(1.0f, 0.0f, 0.0f, 0.5f + flash * 0.5f);
+         
          glBegin(GL_LINES);
-         // Corner brackets
-         float lockSize = 20.0f;
-         // Top-left
-         glVertex2f(centerX - 80, centerY + 80 - lockSize); glVertex2f(centerX - 80, centerY + 80);
-         glVertex2f(centerX - 80, centerY + 80); glVertex2f(centerX - 80 + lockSize, centerY + 80);
-         // Top-right
-         glVertex2f(centerX + 80 - lockSize, centerY + 80); glVertex2f(centerX + 80, centerY + 80);
-         glVertex2f(centerX + 80, centerY + 80); glVertex2f(centerX + 80, centerY + 80 - lockSize);
-         // Bottom-left
-         glVertex2f(centerX - 80, centerY - 80 + lockSize); glVertex2f(centerX - 80, centerY - 80);
-         glVertex2f(centerX - 80, centerY - 80); glVertex2f(centerX - 80 + lockSize, centerY - 80);
-         // Bottom-right
-         glVertex2f(centerX + 80 - lockSize, centerY - 80); glVertex2f(centerX + 80, centerY - 80);
-         glVertex2f(centerX + 80, centerY - 80); glVertex2f(centerX + 80, centerY - 80 + lockSize);
+         float lockSize = 30.0f;
+         // Top-left corner
+         glVertex2f(centerX - 100, centerY + 100 - lockSize); glVertex2f(centerX - 100, centerY + 100);
+         glVertex2f(centerX - 100, centerY + 100); glVertex2f(centerX - 100 + lockSize, centerY + 100);
+         // Top-right corner
+         glVertex2f(centerX + 100 - lockSize, centerY + 100); glVertex2f(centerX + 100, centerY + 100);
+         glVertex2f(centerX + 100, centerY + 100); glVertex2f(centerX + 100, centerY + 100 - lockSize);
+         // Bottom-left corner
+         glVertex2f(centerX - 100, centerY - 100 + lockSize); glVertex2f(centerX - 100, centerY - 100);
+         glVertex2f(centerX - 100, centerY - 100); glVertex2f(centerX - 100 + lockSize, centerY - 100);
+         // Bottom-right corner
+         glVertex2f(centerX + 100 - lockSize, centerY - 100); glVertex2f(centerX + 100, centerY - 100);
+         glVertex2f(centerX + 100, centerY - 100); glVertex2f(centerX + 100, centerY - 100 + lockSize);
          glEnd();
          
-         // Distance readout (bottom of lock box)
-         if (gFocusDistance > 0) {
-             // Simple distance indicator bar
-             float distBar = fminf(gFocusDistance / 50.0f, 60.0f); // Scale distance to bar length
-             glBegin(GL_LINES);
-             glVertex2f(centerX - 30, centerY - 100);
-             glVertex2f(centerX - 30 + distBar, centerY - 100);
-             glEnd();
-         }
+         // LOCKED text indicator (top of screen)
+         glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
+         glLineWidth(3.0f);
+         glBegin(GL_LINES);
+         // Simple "LOCKED" text using lines at top center
+         float textY = screenHeight - 100;
+         // L
+         glVertex2f(centerX - 80, textY); glVertex2f(centerX - 80, textY - 20);
+         glVertex2f(centerX - 80, textY - 20); glVertex2f(centerX - 65, textY - 20);
+         // O
+         glVertex2f(centerX - 60, textY); glVertex2f(centerX - 45, textY);
+         glVertex2f(centerX - 60, textY - 20); glVertex2f(centerX - 45, textY - 20);
+         glVertex2f(centerX - 60, textY); glVertex2f(centerX - 60, textY - 20);
+         glVertex2f(centerX - 45, textY); glVertex2f(centerX - 45, textY - 20);
+         // C
+         glVertex2f(centerX - 40, textY); glVertex2f(centerX - 25, textY);
+         glVertex2f(centerX - 40, textY - 20); glVertex2f(centerX - 25, textY - 20);
+         glVertex2f(centerX - 40, textY); glVertex2f(centerX - 40, textY - 20);
+         // K
+         glVertex2f(centerX - 20, textY); glVertex2f(centerX - 20, textY - 20);
+         glVertex2f(centerX - 20, textY - 10); glVertex2f(centerX - 5, textY);
+         glVertex2f(centerX - 20, textY - 10); glVertex2f(centerX - 5, textY - 20);
+         // E
+         glVertex2f(centerX, textY); glVertex2f(centerX, textY - 20);
+         glVertex2f(centerX, textY); glVertex2f(centerX + 15, textY);
+         glVertex2f(centerX, textY - 10); glVertex2f(centerX + 10, textY - 10);
+         glVertex2f(centerX, textY - 20); glVertex2f(centerX + 15, textY - 20);
+         // D
+         glVertex2f(centerX + 20, textY); glVertex2f(centerX + 20, textY - 20);
+         glVertex2f(centerX + 20, textY); glVertex2f(centerX + 30, textY - 5);
+         glVertex2f(centerX + 30, textY - 5); glVertex2f(centerX + 30, textY - 15);
+         glVertex2f(centerX + 30, textY - 15); glVertex2f(centerX + 20, textY - 20);
+         glEnd();
      }
      
-     // Range circles around center
-     glColor4f(0.0f, 1.0f, 0.0f, 0.3f);
-     glLineWidth(1.0f);
-     for (int i = 1; i <= 3; i++) {
-         float radius = 80.0f * i / gZoomLevel;
-         if (radius < screenWidth / 4) {
-             glBegin(GL_LINE_LOOP);
-             for (int angle = 0; angle < 360; angle += 10) {
-                 float x = centerX + radius * cosf(angle * M_PI / 180.0f);
-                 float y = centerY + radius * sinf(angle * M_PI / 180.0f);
-                 glVertex2f(x, y);
-             }
-             glEnd();
-         }
-     }
+     // No range circles - clean display
      
      // Heading indicator (top center)
      glColor4f(0.0f, 1.0f, 0.0f, 0.9f);
diff --git a/FLIR_Camera.o b/FLIR_Camera.o
index 510ca94..5682571 100644
Binary files a/FLIR_Camera.o and b/FLIR_Camera.o differ
diff --git a/FLIR_HUD.lua b/FLIR_HUD.lua
index d426344..31c1569 100644
--- a/FLIR_HUD.lua
+++ b/FLIR_HUD.lua
@@ -1,25 +1,22 @@
 -- FLIR Camera HUD Display Script for FlyWithLua
 -- Place this file in X-Plane/Resources/plugins/FlyWithLua/Scripts/
--- This provides professional text overlay for the FLIR camera system
+-- Simple and safe version
 
--- Only display when FLIR camera is active
--- You can detect this by checking if the external view is active and camera controls are locked
-
-if PLANE_ICAO == nil then PLANE_ICAO = "UNKNOWN" end
+-- Global variables
+flir_start_time = flir_start_time or os.time()
 
 function draw_flir_hud()
-    -- Only draw when in external view (indicating FLIR might be active)
-    local view_type = XPLMGetDataf("sim/graphics/view/view_type")
+    -- Only draw when in external view (likely FLIR active)
+    local view_type = dataref_table("sim/graphics/view/view_type")
     
-    if view_type == 1026 then  -- External view
-        -- Get current aircraft data
-        local zulu_time = XPLMGetDataf("sim/time/zulu_time_sec")
-        local latitude = XPLMGetDataf("sim/flightmodel/position/latitude")
-        local longitude = XPLMGetDataf("sim/flightmodel/position/longitude")
-        local altitude_msl = XPLMGetDataf("sim/flightmodel/position/elevation")
-        local altitude_agl = XPLMGetDataf("sim/flightmodel/position/y_agl")
-        local ground_speed = XPLMGetDataf("sim/flightmodel/position/groundspeed")
-        local heading = XPLMGetDataf("sim/flightmodel/position/psi")
+    if view_type[0] == 1026 then  -- External view
+        -- Get basic aircraft data safely
+        local zulu_time = dataref_table("sim/time/zulu_time_sec")[0]
+        local latitude = dataref_table("sim/flightmodel/position/latitude")[0]
+        local longitude = dataref_table("sim/flightmodel/position/longitude")[0]
+        local altitude_msl = dataref_table("sim/flightmodel/position/elevation")[0]
+        local ground_speed = dataref_table("sim/flightmodel/position/groundspeed")[0]
+        local heading = dataref_table("sim/flightmodel/position/psi")[0]
         
         -- Convert zulu time to HH:MM format
         local hours = math.floor(zulu_time / 3600) % 24
@@ -28,66 +25,43 @@ function draw_flir_hud()
         
         -- Convert altitude to feet
         local alt_feet = math.floor(altitude_msl * 3.28084)
-        local agl_feet = math.floor(altitude_agl * 3.28084)
         
         -- Convert ground speed to knots
         local speed_knots = math.floor(ground_speed * 1.94384)
         
         -- Set text color to FLIR green
-        glColor4f(0.0, 1.0, 0.0, 1.0)
+        graphics.set_color(0.0, 1.0, 0.0, 1.0)
         
         -- Top status line
-        local status_line = string.format("FLIR CAMERA  %s  %.4f°N %.4f°W  %dft MSL  %dft AGL", 
-                                         time_string, latitude, math.abs(longitude), alt_feet, agl_feet)
-        draw_string(30, SCREEN_HEIGHT - 30, status_line)
+        local status_line = string.format("FLIR CAMERA  %s  LAT:%.4f LON:%.4f  ALT:%dft", 
+                                         time_string, latitude, longitude, alt_feet)
+        graphics.draw_string(30, SCREEN_HEIGHT - 30, status_line)
         
         -- Navigation data
-        local nav_line = string.format("HDG: %03d°  SPD: %d kts  GS: %.1f m/s", 
+        local nav_line = string.format("HDG:%03d  SPD:%d kts  GS:%.1f m/s", 
                                       math.floor(heading), speed_knots, ground_speed)
-        draw_string(30, SCREEN_HEIGHT - 50, nav_line)
-        
-        -- Aircraft identification
-        local aircraft_line = string.format("ACFT: %s  TAIL: %s", 
-                                           PLANE_ICAO, get_aircraft_tailnumber())
-        draw_string(30, SCREEN_HEIGHT - 70, aircraft_line)
+        graphics.draw_string(30, SCREEN_HEIGHT - 50, nav_line)
         
-        -- Mission timer (time since FLIR activation)
-        local mission_time = os.time() - (flir_start_time or os.time())
+        -- Mission timer
+        local mission_time = os.time() - flir_start_time
         local mission_mins = math.floor(mission_time / 60)
         local mission_secs = mission_time % 60
         local mission_line = string.format("MISSION TIME: %02d:%02d", mission_mins, mission_secs)
-        draw_string(SCREEN_WIDTH - 250, SCREEN_HEIGHT - 30, mission_line)
+        graphics.draw_string(SCREEN_WIDTH - 250, SCREEN_HEIGHT - 30, mission_line)
         
-        -- Target information (if available)
-        draw_string(SCREEN_WIDTH - 250, SCREEN_HEIGHT - 50, "TGT: SCANNING...")
+        -- Target status
+        graphics.draw_string(SCREEN_WIDTH - 250, SCREEN_HEIGHT - 50, "TGT: SCANNING...")
         
         -- Camera status
-        local zoom_level = 1.0  -- Would read from plugin if dataref available
-        local thermal_mode = "WHT"  -- Would read from plugin if dataref available
-        local camera_line = string.format("ZOOM: %.1fx  THERMAL: %s", zoom_level, thermal_mode)
-        draw_string(30, 70, camera_line)
+        graphics.draw_string(30, 70, "ZOOM: ACTIVE  THERMAL: WHT")
         
     end
 end
 
-function get_aircraft_tailnumber()
-    local tailnum = XPLMGetDatab("sim/aircraft/view/acf_tailnum")
-    if tailnum and string.len(tailnum) > 0 then
-        return tailnum
-    else
-        return "UNKNOWN"
-    end
-end
-
--- Initialize mission start time when script loads
-if flir_start_time == nil then
-    flir_start_time = os.time()
-end
-
--- Register the drawing function
+-- Register the drawing function (safe method)
 do_every_draw("draw_flir_hud()")
 
--- Add hotkey to reset mission timer
-add_macro("FLIR: Reset Mission Timer", "flir_start_time = os.time()", "", "")
+-- Add macro to reset mission timer
+add_macro("FLIR: Reset Mission Timer", "flir_start_time = os.time()", "", "activate")
 
-logMsg("FLIR HUD Display Script Loaded - Professional text overlay active")
\ No newline at end of file
+logMsg("FLIR HUD Display Script Loaded (Safe Version)")
\ No newline at end of file
diff --git a/build/FLIR_Camera/win_x64/FLIR_Camera.xpl b/build/FLIR_Camera/win_x64/FLIR_Camera.xpl
index ba35afb..c03ae4a 100755
Binary files a/build/FLIR_Camera/win_x64/FLIR_Camera.xpl and b/build/FLIR_Camera/win_x64/FLIR_Camera.xpl differ