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