From 6cf9091c05ac262678c30f86a658b998670b0949 Mon Sep 17 00:00:00 2001 From: Mark Allyn Date: Sat, 4 Apr 2026 22:26:38 -0700 Subject: [PATCH] New modules compiled --- CLAUDE.md | 15 +- CMakeLists.txt | 8 +- build/CMakeFiles/CMakeRuleHashes.txt | 2 + build/CMakeFiles/Makefile.cmake | 84 +-- build/CMakeFiles/Makefile2 | 45 +- build/CMakeFiles/TargetDirectories.txt | 1 + .../copy_shaders.dir/DependInfo.cmake | 22 + build/CMakeFiles/copy_shaders.dir/build.make | 91 +++ .../copy_shaders.dir/cmake_clean.cmake | 8 + .../copy_shaders.dir/compiler_depend.make | 2 + .../copy_shaders.dir/compiler_depend.ts | 2 + .../CMakeFiles/copy_shaders.dir/progress.make | 2 + build/CMakeFiles/progress.marks | 2 +- .../compiler_depend.internal | 27 - .../radar_simulation.dir/compiler_depend.make | 333 +++++----- .../radar_simulation.dir/progress.make | 6 +- .../radar_simulation.dir/src/main.cpp.o | Bin 33184 -> 56280 bytes .../radar_simulation.dir/src/main.cpp.o.d | 3 - build/Makefile | 14 + build/radar_simulation | Bin 100848 -> 113760 bytes build/shaders/ascope_graticule.frag | 6 + build/shaders/ascope_graticule.vert | 6 + build/shaders/ascope_graticule_text.frag | 9 + build/shaders/ascope_graticule_text.vert | 9 + build/shaders/ppi_range_rings.frag | 6 + build/shaders/ppi_range_rings.vert | 8 + build/shaders/ppi_targets.frag | 11 + build/shaders/ppi_targets.vert | 8 + src/main.cpp | 568 ++++++++++++++++-- 29 files changed, 908 insertions(+), 390 deletions(-) create mode 100644 build/CMakeFiles/CMakeRuleHashes.txt create mode 100644 build/CMakeFiles/copy_shaders.dir/DependInfo.cmake create mode 100644 build/CMakeFiles/copy_shaders.dir/build.make create mode 100644 build/CMakeFiles/copy_shaders.dir/cmake_clean.cmake create mode 100644 build/CMakeFiles/copy_shaders.dir/compiler_depend.make create mode 100644 build/CMakeFiles/copy_shaders.dir/compiler_depend.ts create mode 100644 build/CMakeFiles/copy_shaders.dir/progress.make create mode 100644 build/shaders/ascope_graticule.frag create mode 100644 build/shaders/ascope_graticule.vert create mode 100644 build/shaders/ascope_graticule_text.frag create mode 100644 build/shaders/ascope_graticule_text.vert create mode 100644 build/shaders/ppi_range_rings.frag create mode 100644 build/shaders/ppi_range_rings.vert create mode 100644 build/shaders/ppi_targets.frag create mode 100644 build/shaders/ppi_targets.vert diff --git a/CLAUDE.md b/CLAUDE.md index a46a2aa..f1e3ac9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,10 +6,12 @@ vintage marine radar. There will be two scopes. An early A Scope and a PPI scope. The PPI scope will take up the entire right hand side of the display -(1/2 inch margins on top,bottom, and right hand side) and the A Scope will +(1 inch margins on top,bottom, and right hand side) and the A Scope will be smaller, located in the center of the left hand side of the display near the left margin. +Please impliment 1 inch margins around both scopes. I am getting them cut off + Display should be whole screen. An escape, possibly with the escape key needs to be provided to exit the program and go back to shell. @@ -153,7 +155,10 @@ A scope: graticule appear to move up and out and the replacement graticule move in and down in place. The operator takes them out from a slot above the scope and inserts the replacement through the same slot. All these graticules - are lighted with incandescent colors. + are lighted with incandescent colors. Graticule should have vertical lines + for each range and a horizontal line at the bottom. Left of the screen you + have the words "SIGNAL STRENGTH" and bottom of the screen you + have the words "RANGE" Note on screen update vs pulse repetition frequency. We need to be careful since we have no control of the display update frequency and need @@ -277,6 +282,9 @@ Order of testing features. and hold for 5 seconds for each range 4. PPI scope range rings; both active display and persistence display - test for each range settings; hold for 5 seconds each +5. PPI scope active target operation, as well as persistance. Create + four fake targets, one small, one large and two very large with + blooming. Do random range and bearing with one in earch quadrant. 5. PPI scope cursor - test by slowly changing range and bearing 6. PPI scope weather noise - test by changing noise level slowly 7. PPI scope waves noise - test by changing noise level slowly @@ -284,9 +292,10 @@ Order of testing features. ======================================================== -Generate code for testiong feature 1 and 2 only; +Generate code for testiong feature 1 and 2 and 3 only; 1. General initialization and set up basic boundaries of the two scopes on the screen. No features on each scope yet. 2. Edge graticule on ppi scope (Bearing ticks and numbers) +3. replaceable graticules for A scope Do not generate any other code Generate code the run this and hold for 10 seconds and exit diff --git a/CMakeLists.txt b/CMakeLists.txt index ea1366e..774c297 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,5 +24,11 @@ target_link_libraries(radar_simulation PRIVATE Freetype::Freetype ) -file(COPY ${CMAKE_SOURCE_DIR}/shaders DESTINATION ${CMAKE_BINARY_DIR}) +add_custom_target(copy_shaders ALL + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_SOURCE_DIR}/shaders + ${CMAKE_BINARY_DIR}/shaders + COMMENT "Copying shaders to build directory" +) +add_dependencies(radar_simulation copy_shaders) diff --git a/build/CMakeFiles/CMakeRuleHashes.txt b/build/CMakeFiles/CMakeRuleHashes.txt new file mode 100644 index 0000000..263a5e2 --- /dev/null +++ b/build/CMakeFiles/CMakeRuleHashes.txt @@ -0,0 +1,2 @@ +# Hashes of file build rules. +98892458fd275ab36edb4060d435198d CMakeFiles/copy_shaders diff --git a/build/CMakeFiles/Makefile.cmake b/build/CMakeFiles/Makefile.cmake index c7121a4..5924cc4 100644 --- a/build/CMakeFiles/Makefile.cmake +++ b/build/CMakeFiles/Makefile.cmake @@ -15,97 +15,22 @@ set(CMAKE_MAKEFILE_DEPENDS "/usr/lib/x86_64-linux-gnu/cmake/glfw3/glfw3ConfigVersion.cmake" "/usr/lib/x86_64-linux-gnu/cmake/glfw3/glfw3Targets-none.cmake" "/usr/lib/x86_64-linux-gnu/cmake/glfw3/glfw3Targets.cmake" - "/usr/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" - "/usr/share/cmake-3.31/Modules/CMakeCCompilerABI.c" "/usr/share/cmake-3.31/Modules/CMakeCInformation.cmake" - "/usr/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" - "/usr/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp" "/usr/share/cmake-3.31/Modules/CMakeCXXInformation.cmake" "/usr/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" - "/usr/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" - "/usr/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake" - "/usr/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake" - "/usr/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" - "/usr/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" - "/usr/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" - "/usr/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake" - "/usr/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" "/usr/share/cmake-3.31/Modules/CMakeFindDependencyMacro.cmake" "/usr/share/cmake-3.31/Modules/CMakeGenericSystem.cmake" "/usr/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake" "/usr/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" - "/usr/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" - "/usr/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" - "/usr/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" - "/usr/share/cmake-3.31/Modules/CMakeSystem.cmake.in" "/usr/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake" "/usr/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake" - "/usr/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake" - "/usr/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake" - "/usr/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" - "/usr/share/cmake-3.31/Modules/CMakeUnixFindMake.cmake" "/usr/share/cmake-3.31/Modules/CheckCSourceCompiles.cmake" "/usr/share/cmake-3.31/Modules/CheckIncludeFile.cmake" "/usr/share/cmake-3.31/Modules/CheckLibraryExists.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" "/usr/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake" "/usr/share/cmake-3.31/Modules/Compiler/GNU-C.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" "/usr/share/cmake-3.31/Modules/Compiler/GNU-CXX.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/GNU-FindBinUtils.cmake" "/usr/share/cmake-3.31/Modules/Compiler/GNU.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake" - "/usr/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" "/usr/share/cmake-3.31/Modules/FindFreetype.cmake" "/usr/share/cmake-3.31/Modules/FindOpenGL.cmake" "/usr/share/cmake-3.31/Modules/FindPackageHandleStandardArgs.cmake" @@ -114,9 +39,7 @@ set(CMAKE_MAKEFILE_DEPENDS "/usr/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake" "/usr/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake" "/usr/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" - "/usr/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" "/usr/share/cmake-3.31/Modules/Internal/CheckSourceCompiles.cmake" - "/usr/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" "/usr/share/cmake-3.31/Modules/Linker/GNU-C.cmake" "/usr/share/cmake-3.31/Modules/Linker/GNU-CXX.cmake" "/usr/share/cmake-3.31/Modules/Linker/GNU.cmake" @@ -124,7 +47,6 @@ set(CMAKE_MAKEFILE_DEPENDS "/usr/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU-C.cmake" "/usr/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU-CXX.cmake" "/usr/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake" - "/usr/share/cmake-3.31/Modules/Platform/Linux-Determine-CXX.cmake" "/usr/share/cmake-3.31/Modules/Platform/Linux-GNU-C.cmake" "/usr/share/cmake-3.31/Modules/Platform/Linux-GNU-CXX.cmake" "/usr/share/cmake-3.31/Modules/Platform/Linux-GNU.cmake" @@ -142,15 +64,11 @@ set(CMAKE_MAKEFILE_OUTPUTS # Byproducts of CMake generate step: set(CMAKE_MAKEFILE_PRODUCTS - "CMakeFiles/3.31.6/CMakeSystem.cmake" - "CMakeFiles/3.31.6/CMakeCXXCompiler.cmake" - "CMakeFiles/3.31.6/CMakeCCompiler.cmake" - "CMakeFiles/3.31.6/CMakeCXXCompiler.cmake" - "CMakeFiles/3.31.6/CMakeCCompiler.cmake" "CMakeFiles/CMakeDirectoryInformation.cmake" ) # Dependency information for all targets: set(CMAKE_DEPEND_INFO_FILES "CMakeFiles/radar_simulation.dir/DependInfo.cmake" + "CMakeFiles/copy_shaders.dir/DependInfo.cmake" ) diff --git a/build/CMakeFiles/Makefile2 b/build/CMakeFiles/Makefile2 index 2c1d56f..1e9c2e8 100644 --- a/build/CMakeFiles/Makefile2 +++ b/build/CMakeFiles/Makefile2 @@ -64,10 +64,12 @@ CMAKE_BINARY_DIR = /home/maallyn/radar-simulation/build # The main recursive "all" target. all: CMakeFiles/radar_simulation.dir/all +all: CMakeFiles/copy_shaders.dir/all .PHONY : all # The main recursive "codegen" target. codegen: CMakeFiles/radar_simulation.dir/codegen +codegen: CMakeFiles/copy_shaders.dir/codegen .PHONY : codegen # The main recursive "preinstall" target. @@ -76,21 +78,22 @@ preinstall: # The main recursive "clean" target. clean: CMakeFiles/radar_simulation.dir/clean +clean: CMakeFiles/copy_shaders.dir/clean .PHONY : clean #============================================================================= # Target rules for target CMakeFiles/radar_simulation.dir # All Build rule for target. -CMakeFiles/radar_simulation.dir/all: +CMakeFiles/radar_simulation.dir/all: CMakeFiles/copy_shaders.dir/all $(MAKE) $(MAKESILENT) -f CMakeFiles/radar_simulation.dir/build.make CMakeFiles/radar_simulation.dir/depend $(MAKE) $(MAKESILENT) -f CMakeFiles/radar_simulation.dir/build.make CMakeFiles/radar_simulation.dir/build - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/maallyn/radar-simulation/build/CMakeFiles --progress-num=1,2,3 "Built target radar_simulation" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/maallyn/radar-simulation/build/CMakeFiles --progress-num=2,3,4 "Built target radar_simulation" .PHONY : CMakeFiles/radar_simulation.dir/all # Build rule for subdir invocation for target. CMakeFiles/radar_simulation.dir/rule: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /home/maallyn/radar-simulation/build/CMakeFiles 3 + $(CMAKE_COMMAND) -E cmake_progress_start /home/maallyn/radar-simulation/build/CMakeFiles 4 $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/radar_simulation.dir/all $(CMAKE_COMMAND) -E cmake_progress_start /home/maallyn/radar-simulation/build/CMakeFiles 0 .PHONY : CMakeFiles/radar_simulation.dir/rule @@ -100,9 +103,9 @@ radar_simulation: CMakeFiles/radar_simulation.dir/rule .PHONY : radar_simulation # codegen rule for target. -CMakeFiles/radar_simulation.dir/codegen: +CMakeFiles/radar_simulation.dir/codegen: CMakeFiles/copy_shaders.dir/all $(MAKE) $(MAKESILENT) -f CMakeFiles/radar_simulation.dir/build.make CMakeFiles/radar_simulation.dir/codegen - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/maallyn/radar-simulation/build/CMakeFiles --progress-num=1,2,3 "Finished codegen for target radar_simulation" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/maallyn/radar-simulation/build/CMakeFiles --progress-num=2,3,4 "Finished codegen for target radar_simulation" .PHONY : CMakeFiles/radar_simulation.dir/codegen # clean rule for target. @@ -110,6 +113,38 @@ CMakeFiles/radar_simulation.dir/clean: $(MAKE) $(MAKESILENT) -f CMakeFiles/radar_simulation.dir/build.make CMakeFiles/radar_simulation.dir/clean .PHONY : CMakeFiles/radar_simulation.dir/clean +#============================================================================= +# Target rules for target CMakeFiles/copy_shaders.dir + +# All Build rule for target. +CMakeFiles/copy_shaders.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/copy_shaders.dir/build.make CMakeFiles/copy_shaders.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/copy_shaders.dir/build.make CMakeFiles/copy_shaders.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/maallyn/radar-simulation/build/CMakeFiles --progress-num=1 "Built target copy_shaders" +.PHONY : CMakeFiles/copy_shaders.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/copy_shaders.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/maallyn/radar-simulation/build/CMakeFiles 1 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/copy_shaders.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/maallyn/radar-simulation/build/CMakeFiles 0 +.PHONY : CMakeFiles/copy_shaders.dir/rule + +# Convenience name for target. +copy_shaders: CMakeFiles/copy_shaders.dir/rule +.PHONY : copy_shaders + +# codegen rule for target. +CMakeFiles/copy_shaders.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/copy_shaders.dir/build.make CMakeFiles/copy_shaders.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/maallyn/radar-simulation/build/CMakeFiles --progress-num=1 "Finished codegen for target copy_shaders" +.PHONY : CMakeFiles/copy_shaders.dir/codegen + +# clean rule for target. +CMakeFiles/copy_shaders.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/copy_shaders.dir/build.make CMakeFiles/copy_shaders.dir/clean +.PHONY : CMakeFiles/copy_shaders.dir/clean + #============================================================================= # Special targets to cleanup operation of make. diff --git a/build/CMakeFiles/TargetDirectories.txt b/build/CMakeFiles/TargetDirectories.txt index f2e723e..06ab80c 100644 --- a/build/CMakeFiles/TargetDirectories.txt +++ b/build/CMakeFiles/TargetDirectories.txt @@ -1,3 +1,4 @@ /home/maallyn/radar-simulation/build/CMakeFiles/radar_simulation.dir +/home/maallyn/radar-simulation/build/CMakeFiles/copy_shaders.dir /home/maallyn/radar-simulation/build/CMakeFiles/edit_cache.dir /home/maallyn/radar-simulation/build/CMakeFiles/rebuild_cache.dir diff --git a/build/CMakeFiles/copy_shaders.dir/DependInfo.cmake b/build/CMakeFiles/copy_shaders.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/build/CMakeFiles/copy_shaders.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/copy_shaders.dir/build.make b/build/CMakeFiles/copy_shaders.dir/build.make new file mode 100644 index 0000000..3c2cc7e --- /dev/null +++ b/build/CMakeFiles/copy_shaders.dir/build.make @@ -0,0 +1,91 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.31 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/maallyn/radar-simulation + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/maallyn/radar-simulation/build + +# Utility rule file for copy_shaders. + +# Include any custom commands dependencies for this target. +include CMakeFiles/copy_shaders.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/copy_shaders.dir/progress.make + +CMakeFiles/copy_shaders: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --blue --bold --progress-dir=/home/maallyn/radar-simulation/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Copying shaders to build directory" + /usr/bin/cmake -E copy_directory /home/maallyn/radar-simulation/shaders /home/maallyn/radar-simulation/build/shaders + +CMakeFiles/copy_shaders.dir/codegen: +.PHONY : CMakeFiles/copy_shaders.dir/codegen + +copy_shaders: CMakeFiles/copy_shaders +copy_shaders: CMakeFiles/copy_shaders.dir/build.make +.PHONY : copy_shaders + +# Rule to build all files generated by this target. +CMakeFiles/copy_shaders.dir/build: copy_shaders +.PHONY : CMakeFiles/copy_shaders.dir/build + +CMakeFiles/copy_shaders.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/copy_shaders.dir/cmake_clean.cmake +.PHONY : CMakeFiles/copy_shaders.dir/clean + +CMakeFiles/copy_shaders.dir/depend: + cd /home/maallyn/radar-simulation/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/maallyn/radar-simulation /home/maallyn/radar-simulation /home/maallyn/radar-simulation/build /home/maallyn/radar-simulation/build /home/maallyn/radar-simulation/build/CMakeFiles/copy_shaders.dir/DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/copy_shaders.dir/depend + diff --git a/build/CMakeFiles/copy_shaders.dir/cmake_clean.cmake b/build/CMakeFiles/copy_shaders.dir/cmake_clean.cmake new file mode 100644 index 0000000..a8b4a0a --- /dev/null +++ b/build/CMakeFiles/copy_shaders.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/copy_shaders" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/copy_shaders.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/build/CMakeFiles/copy_shaders.dir/compiler_depend.make b/build/CMakeFiles/copy_shaders.dir/compiler_depend.make new file mode 100644 index 0000000..b81c80d --- /dev/null +++ b/build/CMakeFiles/copy_shaders.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for copy_shaders. +# This may be replaced when dependencies are built. diff --git a/build/CMakeFiles/copy_shaders.dir/compiler_depend.ts b/build/CMakeFiles/copy_shaders.dir/compiler_depend.ts new file mode 100644 index 0000000..4bda549 --- /dev/null +++ b/build/CMakeFiles/copy_shaders.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for copy_shaders. diff --git a/build/CMakeFiles/copy_shaders.dir/progress.make b/build/CMakeFiles/copy_shaders.dir/progress.make new file mode 100644 index 0000000..781c7de --- /dev/null +++ b/build/CMakeFiles/copy_shaders.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 1 + diff --git a/build/CMakeFiles/progress.marks b/build/CMakeFiles/progress.marks index 00750ed..b8626c4 100644 --- a/build/CMakeFiles/progress.marks +++ b/build/CMakeFiles/progress.marks @@ -1 +1 @@ -3 +4 diff --git a/build/CMakeFiles/radar_simulation.dir/compiler_depend.internal b/build/CMakeFiles/radar_simulation.dir/compiler_depend.internal index ed67816..02b873e 100644 --- a/build/CMakeFiles/radar_simulation.dir/compiler_depend.internal +++ b/build/CMakeFiles/radar_simulation.dir/compiler_depend.internal @@ -27,21 +27,12 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o /usr/include/x86_64-linux-gnu/bits/long-double.h /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h - /usr/include/x86_64-linux-gnu/bits/select-decl.h /usr/include/x86_64-linux-gnu/bits/select.h - /usr/include/x86_64-linux-gnu/bits/select2.h /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/x86_64-linux-gnu/bits/stdint-least.h /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h - /usr/include/x86_64-linux-gnu/bits/stdio.h - /usr/include/x86_64-linux-gnu/bits/stdio2-decl.h - /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/x86_64-linux-gnu/bits/stdio_lim.h - /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h /usr/include/x86_64-linux-gnu/bits/stdlib-float.h - /usr/include/x86_64-linux-gnu/bits/stdlib.h - /usr/include/x86_64-linux-gnu/bits/string_fortified.h - /usr/include/x86_64-linux-gnu/bits/strings_fortified.h /usr/include/x86_64-linux-gnu/bits/struct_mutex.h /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h @@ -104,7 +95,6 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o /usr/include/c++/15/bits/basic_string.tcc /usr/include/c++/15/bits/char_traits.h /usr/include/c++/15/bits/charconv.h - /usr/include/c++/15/bits/chrono.h /usr/include/c++/15/bits/codecvt.h /usr/include/c++/15/bits/concept_check.h /usr/include/c++/15/bits/cpp_type_traits.h @@ -133,7 +123,6 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o /usr/include/c++/15/bits/ostream.h /usr/include/c++/15/bits/ostream.tcc /usr/include/c++/15/bits/ostream_insert.h - /usr/include/c++/15/bits/parse_numbers.h /usr/include/c++/15/bits/postypes.h /usr/include/c++/15/bits/predefined_ops.h /usr/include/c++/15/bits/ptr_traits.h @@ -168,16 +157,13 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o /usr/include/c++/15/bits/version.h /usr/include/c++/15/cctype /usr/include/c++/15/cerrno - /usr/include/c++/15/chrono /usr/include/c++/15/clocale /usr/include/c++/15/cmath /usr/include/c++/15/concepts /usr/include/c++/15/cstddef - /usr/include/c++/15/cstdint /usr/include/c++/15/cstdio /usr/include/c++/15/cstdlib /usr/include/c++/15/cstring - /usr/include/c++/15/ctime /usr/include/c++/15/cwchar /usr/include/c++/15/cwctype /usr/include/c++/15/debug/assertions.h @@ -200,7 +186,6 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o /usr/include/c++/15/pstl/execution_defs.h /usr/include/c++/15/pstl/glue_algorithm_defs.h /usr/include/c++/15/pstl/pstl_config.h - /usr/include/c++/15/ratio /usr/include/c++/15/sstream /usr/include/c++/15/stdexcept /usr/include/c++/15/stdlib.h @@ -298,23 +283,13 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h /usr/include/x86_64-linux-gnu/bits/sched.h - /usr/include/x86_64-linux-gnu/bits/select-decl.h /usr/include/x86_64-linux-gnu/bits/select.h - /usr/include/x86_64-linux-gnu/bits/select2.h /usr/include/x86_64-linux-gnu/bits/setjmp.h - /usr/include/x86_64-linux-gnu/bits/setjmp2.h /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/x86_64-linux-gnu/bits/stdint-least.h /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h - /usr/include/x86_64-linux-gnu/bits/stdio.h - /usr/include/x86_64-linux-gnu/bits/stdio2-decl.h - /usr/include/x86_64-linux-gnu/bits/stdio2.h /usr/include/x86_64-linux-gnu/bits/stdio_lim.h - /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h /usr/include/x86_64-linux-gnu/bits/stdlib-float.h - /usr/include/x86_64-linux-gnu/bits/stdlib.h - /usr/include/x86_64-linux-gnu/bits/string_fortified.h - /usr/include/x86_64-linux-gnu/bits/strings_fortified.h /usr/include/x86_64-linux-gnu/bits/struct_mutex.h /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h @@ -353,8 +328,6 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o /usr/include/x86_64-linux-gnu/bits/waitflags.h /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/x86_64-linux-gnu/bits/wchar.h - /usr/include/x86_64-linux-gnu/bits/wchar2-decl.h - /usr/include/x86_64-linux-gnu/bits/wchar2.h /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h /usr/include/x86_64-linux-gnu/bits/wordsize.h /usr/include/x86_64-linux-gnu/bits/xopen_lim.h diff --git a/build/CMakeFiles/radar_simulation.dir/compiler_depend.make b/build/CMakeFiles/radar_simulation.dir/compiler_depend.make index 9c9a963..6132bd5 100644 --- a/build/CMakeFiles/radar_simulation.dir/compiler_depend.make +++ b/build/CMakeFiles/radar_simulation.dir/compiler_depend.make @@ -26,21 +26,12 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /home/maallyn/radar-simulatio /usr/include/x86_64-linux-gnu/bits/long-double.h \ /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ - /usr/include/x86_64-linux-gnu/bits/select-decl.h \ /usr/include/x86_64-linux-gnu/bits/select.h \ - /usr/include/x86_64-linux-gnu/bits/select2.h \ /usr/include/x86_64-linux-gnu/bits/stdint-intn.h \ /usr/include/x86_64-linux-gnu/bits/stdint-least.h \ /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ - /usr/include/x86_64-linux-gnu/bits/stdio.h \ - /usr/include/x86_64-linux-gnu/bits/stdio2-decl.h \ - /usr/include/x86_64-linux-gnu/bits/stdio2.h \ /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ - /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ - /usr/include/x86_64-linux-gnu/bits/stdlib.h \ - /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ - /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h \ /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ @@ -102,7 +93,6 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /home/maallyn/radar-simulation/s /usr/include/c++/15/bits/basic_string.tcc \ /usr/include/c++/15/bits/char_traits.h \ /usr/include/c++/15/bits/charconv.h \ - /usr/include/c++/15/bits/chrono.h \ /usr/include/c++/15/bits/codecvt.h \ /usr/include/c++/15/bits/concept_check.h \ /usr/include/c++/15/bits/cpp_type_traits.h \ @@ -131,7 +121,6 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /home/maallyn/radar-simulation/s /usr/include/c++/15/bits/ostream.h \ /usr/include/c++/15/bits/ostream.tcc \ /usr/include/c++/15/bits/ostream_insert.h \ - /usr/include/c++/15/bits/parse_numbers.h \ /usr/include/c++/15/bits/postypes.h \ /usr/include/c++/15/bits/predefined_ops.h \ /usr/include/c++/15/bits/ptr_traits.h \ @@ -166,16 +155,13 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /home/maallyn/radar-simulation/s /usr/include/c++/15/bits/version.h \ /usr/include/c++/15/cctype \ /usr/include/c++/15/cerrno \ - /usr/include/c++/15/chrono \ /usr/include/c++/15/clocale \ /usr/include/c++/15/cmath \ /usr/include/c++/15/concepts \ /usr/include/c++/15/cstddef \ - /usr/include/c++/15/cstdint \ /usr/include/c++/15/cstdio \ /usr/include/c++/15/cstdlib \ /usr/include/c++/15/cstring \ - /usr/include/c++/15/ctime \ /usr/include/c++/15/cwchar \ /usr/include/c++/15/cwctype \ /usr/include/c++/15/debug/assertions.h \ @@ -198,7 +184,6 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /home/maallyn/radar-simulation/s /usr/include/c++/15/pstl/execution_defs.h \ /usr/include/c++/15/pstl/glue_algorithm_defs.h \ /usr/include/c++/15/pstl/pstl_config.h \ - /usr/include/c++/15/ratio \ /usr/include/c++/15/sstream \ /usr/include/c++/15/stdexcept \ /usr/include/c++/15/stdlib.h \ @@ -296,23 +281,13 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /home/maallyn/radar-simulation/s /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ /usr/include/x86_64-linux-gnu/bits/sched.h \ - /usr/include/x86_64-linux-gnu/bits/select-decl.h \ /usr/include/x86_64-linux-gnu/bits/select.h \ - /usr/include/x86_64-linux-gnu/bits/select2.h \ /usr/include/x86_64-linux-gnu/bits/setjmp.h \ - /usr/include/x86_64-linux-gnu/bits/setjmp2.h \ /usr/include/x86_64-linux-gnu/bits/stdint-intn.h \ /usr/include/x86_64-linux-gnu/bits/stdint-least.h \ /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ - /usr/include/x86_64-linux-gnu/bits/stdio.h \ - /usr/include/x86_64-linux-gnu/bits/stdio2-decl.h \ - /usr/include/x86_64-linux-gnu/bits/stdio2.h \ /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ - /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ - /usr/include/x86_64-linux-gnu/bits/stdlib.h \ - /usr/include/x86_64-linux-gnu/bits/string_fortified.h \ - /usr/include/x86_64-linux-gnu/bits/strings_fortified.h \ /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h \ /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ @@ -351,8 +326,6 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /home/maallyn/radar-simulation/s /usr/include/x86_64-linux-gnu/bits/waitflags.h \ /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ /usr/include/x86_64-linux-gnu/bits/wchar.h \ - /usr/include/x86_64-linux-gnu/bits/wchar2-decl.h \ - /usr/include/x86_64-linux-gnu/bits/wchar2.h \ /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h \ /usr/include/x86_64-linux-gnu/bits/wordsize.h \ /usr/include/x86_64-linux-gnu/bits/xopen_lim.h \ @@ -430,6 +403,8 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /lib64/ld-linux-x86-64.so.2: +/lib/x86_64-linux-gnu/libpng16.so.16: + /lib/x86_64-linux-gnu/libc.so.6: /lib/x86_64-linux-gnu/libbz2.so.1.0: @@ -470,27 +445,25 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h: -/usr/include/x86_64-linux-gnu/bits/setjmp2.h: +/usr/include/c++/15/bits/stl_algobase.h: -/usr/include/x86_64-linux-gnu/bits/sched.h: +/usr/include/c++/15/clocale: -/usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h: +/usr/include/c++/15/bits/sstream.tcc: -/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: +/usr/include/c++/15/bits/locale_facets.h: -/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: +/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h: -/usr/include/x86_64-linux-gnu/bits/mathcalls.h: +/usr/include/c++/15/cstdlib: -/usr/include/x86_64-linux-gnu/bits/mathcalls-narrow.h: +/usr/include/freetype2/freetype/ftmoderr.h: -/usr/include/x86_64-linux-gnu/bits/mathcalls-macros.h: +/usr/include/c++/15/bits/predefined_ops.h: -/usr/include/x86_64-linux-gnu/bits/iscanonical.h: +/usr/include/c++/15/bits/postypes.h: -/usr/include/x86_64-linux-gnu/bits/wchar2.h: - -/usr/include/x86_64-linux-gnu/bits/fp-logb.h: +/usr/include/x86_64-linux-gnu/asm/posix_types.h: /usr/include/c++/15/bits/ostream.tcc: @@ -510,44 +483,32 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /usr/include/c++/15/bits/locale_classes.tcc: +/usr/include/x86_64-linux-gnu/bits/iscanonical.h: + /usr/include/c++/15/bits/functional_hash.h: /usr/include/c++/15/ext/type_traits.h: -/usr/include/c++/15/bits/predefined_ops.h: +/usr/include/c++/15/bits/stl_algo.h: /usr/include/c++/15/bits/cxxabi_forced.h: -/usr/include/c++/15/bits/chrono.h: - -/usr/include/c++/15/bits/nested_exception.h: - -/usr/include/linux/sched/types.h: - /usr/include/x86_64-linux-gnu/sys/types.h: /lib/x86_64-linux-gnu/libm.so.6: /usr/include/c++/15/bits/char_traits.h: -/usr/include/x86_64-linux-gnu/bits/locale.h: - -/usr/include/c++/15/bits/basic_ios.h: - /usr/include/c++/15/tr1/modified_bessel_func.tcc: /usr/include/linux/limits.h: +/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: + /usr/include/c++/15/bits/ios_base.h: /usr/include/c++/15/bits/alloc_traits.h: -/usr/include/x86_64-linux-gnu/bits/math-vector.h: - -/usr/include/c++/15/bits/hash_bytes.h: - -/usr/include/c++/15/algorithm: - /usr/lib/gcc/x86_64-linux-gnu/15/crtbeginS.o: /usr/include/c++/15/bits/range_access.h: @@ -582,55 +543,39 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /usr/include/setjmp.h: +/usr/include/c++/15/bits/std_abs.h: + +/usr/include/c++/15/typeinfo: + +/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: + /usr/include/x86_64-linux-gnu/gnu/stubs.h: /usr/include/x86_64-linux-gnu/bits/endian.h: +/usr/lib/gcc/x86_64-linux-gnu/15/crtendS.o: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/c++/15/ext/string_conversions.h: + /usr/include/x86_64-linux-gnu/bits/wordsize.h: /usr/include/c++/15/pstl/execution_defs.h: -/usr/include/x86_64-linux-gnu/bits/wchar.h: +/usr/include/x86_64-linux-gnu/bits/stdint-least.h: -/usr/include/x86_64-linux-gnu/bits/types/cookie_io_functions_t.h: +/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: -/usr/include/c++/15/bits/ostream_insert.h: - -/usr/include/x86_64-linux-gnu/bits/errno.h: - -/usr/lib/x86_64-linux-gnu/crtn.o: - -/usr/include/x86_64-linux-gnu/bits/waitflags.h: +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: /usr/include/x86_64-linux-gnu/bits/uintn-identity.h: /usr/include/x86_64-linux-gnu/bits/stdlib-float.h: -/usr/include/stdc-predef.h: +/usr/include/x86_64-linux-gnu/bits/wchar.h: -/usr/include/x86_64-linux-gnu/bits/typesizes.h: - -/usr/include/c++/15/system_error: - -/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: - -/usr/include/x86_64-linux-gnu/bits/stdlib.h: - -/usr/include/c++/15/bits/stl_uninitialized.h: - -/usr/include/x86_64-linux-gnu/asm/errno.h: - -/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: - -/lib/x86_64-linux-gnu/libpng16.so.16: - -/usr/include/x86_64-linux-gnu/bits/select-decl.h: - -/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: - -/usr/include/freetype2/freetype/fttypes.h: - -/usr/include/locale.h: +/usr/include/x86_64-linux-gnu/bits/types/cookie_io_functions_t.h: /usr/include/c++/15/bits/algorithmfwd.h: @@ -644,14 +589,6 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /usr/include/x86_64-linux-gnu/bits/endianness.h: -/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: - -/usr/include/stdint.h: - -/usr/include/endian.h: - -/usr/include/c++/15/cmath: - /usr/include/c++/15/bits/cpp_type_traits.h: /usr/include/c++/15/bits/basic_string.h: @@ -660,10 +597,16 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /usr/include/c++/15/bits/concept_check.h: -/usr/include/x86_64-linux-gnu/bits/wchar2-decl.h: - /usr/include/c++/15/bits/version.h: +/usr/include/stdc-predef.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/c++/15/backward/binders.h: + +/usr/include/c++/15/bits/specfun.h: + /usr/include/x86_64-linux-gnu/bits/floatn.h: /usr/include/c++/15/bits/istream.tcc: @@ -700,15 +643,19 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /usr/include/c++/15/bits/uses_allocator.h: -/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: - /home/maallyn/radar-simulation/glad/src/glad.c: -/usr/include/x86_64-linux-gnu/bits/select2.h: +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: -/usr/include/c++/15/ext/alloc_traits.h: +/usr/include/string.h: -/usr/include/linux/types.h: +/usr/include/c++/15/bits/stl_function.h: + +/usr/include/c++/15/cwchar: + +/usr/include/c++/15/bits/requires_hosted.h: + +/usr/include/dlfcn.h: /lib/x86_64-linux-gnu/libmvec.so.1: @@ -718,12 +665,22 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /usr/include/freetype2/freetype/config/mac-support.h: +/usr/include/c++/15/tr1/gamma.tcc: + +/usr/lib/gcc/x86_64-linux-gnu/15/include/stdarg.h: + /usr/include/c++/15/bits/locale_facets.tcc: /usr/include/ctype.h: /usr/include/features.h: +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/include/x86_64-linux-gnu/bits/timex.h: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h: /usr/include/c++/15/bits/exception_ptr.h: @@ -738,6 +695,10 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /usr/include/pthread.h: +/usr/include/x86_64-linux-gnu/bits/types/struct___jmp_buf_tag.h: + +/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: + /usr/include/x86_64-linux-gnu/bits/time64.h: /usr/include/freetype2/freetype/config/ftconfig.h: @@ -752,6 +713,8 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/c++/15/bits/invoke.h: +/usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h: + /usr/include/c++/15/bits/memoryfwd.h: /usr/include/freetype2/freetype/ftsystem.h: @@ -764,6 +727,10 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/c++/15/bits/stringfwd.h: +/usr/include/c++/15/bits/ostream_insert.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + /usr/include/features-time64.h: /usr/include/c++/15/bits/uniform_int_dist.h: @@ -776,41 +743,29 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/c++/15/bits/codecvt.h: -/usr/include/string.h: +/usr/include/x86_64-linux-gnu/bits/mathcalls-macros.h: -/usr/include/c++/15/bits/stl_function.h: +/usr/include/c++/15/bits/refwrap.h: -/usr/include/c++/15/cwchar: +/usr/include/c++/15/type_traits: -/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: +/usr/include/stdint.h: -/usr/include/x86_64-linux-gnu/bits/stdint-least.h: +/usr/include/endian.h: -/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: +/usr/include/c++/15/cmath: -/usr/include/x86_64-linux-gnu/bits/types/FILE.h: +/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: -/usr/include/x86_64-linux-gnu/bits/timex.h: +/usr/include/c++/15/bits/basic_ios.tcc: -/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: +/usr/include/c++/15/system_error: -/usr/include/c++/15/tr1/gamma.tcc: +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: -/usr/lib/gcc/x86_64-linux-gnu/15/include/stdarg.h: +/usr/include/c++/15/bits/stl_uninitialized.h: -/usr/include/x86_64-linux-gnu/bits/stdio2.h: - -/usr/include/c++/15/bits/locale_facets.h: - -/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h: - -/usr/include/dlfcn.h: - -/usr/include/c++/15/bits/requires_hosted.h: - -/usr/include/c++/15/cstdlib: - -/usr/include/freetype2/freetype/ftmoderr.h: +/usr/include/x86_64-linux-gnu/asm/errno.h: /usr/include/stdio.h: @@ -820,61 +775,27 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/c++/15/tr1/exp_integral.tcc: -/usr/include/x86_64-linux-gnu/bits/types/struct___jmp_buf_tag.h: - -/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h: - -/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: - -/usr/lib/gcc/x86_64-linux-gnu/15/crtendS.o: - -/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: - -/usr/include/c++/15/ext/string_conversions.h: - -/usr/include/x86_64-linux-gnu/bits/string_fortified.h: - -/usr/include/c++/15/bits/basic_ios.tcc: - -/usr/include/c++/15/backward/binders.h: - -/usr/include/c++/15/bits/specfun.h: - -/usr/include/c++/15/bits/parse_numbers.h: - -/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: - /usr/include/x86_64-linux-gnu/bits/byteswap.h: -/usr/include/freetype2/freetype/fterrors.h: - /usr/include/c++/15/concepts: +/usr/include/freetype2/freetype/fterrors.h: + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: /usr/include/c++/15/istream: -/usr/include/x86_64-linux-gnu/bits/stdio.h: +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: -/usr/include/c++/15/bits/postypes.h: +/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: -/usr/include/x86_64-linux-gnu/asm/posix_types.h: +/usr/include/freetype2/freetype/fttypes.h: -/usr/include/c++/15/bits/refwrap.h: +/usr/include/locale.h: -/usr/include/c++/15/type_traits: +/usr/lib/x86_64-linux-gnu/crtn.o: -/usr/include/c++/15/bits/sstream.tcc: - -/usr/include/c++/15/bits/std_abs.h: - -/usr/include/c++/15/typeinfo: - -/usr/include/c++/15/bits/stl_algo.h: - -/usr/include/c++/15/bits/stl_algobase.h: - -/usr/include/c++/15/clocale: +/usr/include/x86_64-linux-gnu/bits/waitflags.h: /usr/include/c++/15/bits/stl_iterator.h: @@ -898,12 +819,6 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/c++/15/bits/stl_iterator_base_types.h: -/usr/include/x86_64-linux-gnu/bits/fp-fast.h: - -/usr/include/c++/15/bits/stl_bvector.h: - -/usr/include/c++/15/bits/stl_pair.h: - /usr/include/c++/15/cctype: /usr/include/c++/15/bits/stl_tempbuf.h: @@ -914,10 +829,6 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/c++/15/bits/stl_vector.h: -/usr/include/x86_64-linux-gnu/asm/types.h: - -/usr/include/c++/15/cwctype: - /usr/include/c++/15/bits/basic_string.tcc: /usr/include/c++/15/bits/streambuf.tcc: @@ -936,10 +847,6 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/c++/15/cerrno: -/usr/include/c++/15/chrono: - -/usr/include/c++/15/cstdint: - /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: /usr/include/c++/15/cstring: @@ -952,6 +859,10 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/c++/15/exception: +/usr/include/c++/15/ext/alloc_traits.h: + +/usr/include/linux/types.h: + /usr/include/c++/15/ext/numeric_traits.h: /usr/include/c++/15/ios: @@ -986,12 +897,8 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/c++/15/tr1/poly_hermite.tcc: -/usr/include/c++/15/ratio: - /usr/include/c++/15/stdexcept: -/usr/include/c++/15/ctime: - /usr/include/c++/15/stdlib.h: /usr/include/c++/15/string: @@ -1006,10 +913,10 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/c++/15/tr1/ell_integral.tcc: -/usr/include/x86_64-linux-gnu/bits/mathcalls-helper-functions.h: - /usr/include/c++/15/tr1/legendre_function.tcc: +/usr/include/x86_64-linux-gnu/bits/mathcalls-helper-functions.h: + /usr/include/c++/15/bits/charconv.h: /usr/include/c++/15/pstl/glue_algorithm_defs.h: @@ -1042,20 +949,16 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/freetype2/freetype/fterrdef.h: -/usr/include/x86_64-linux-gnu/bits/libm-simd-decl-stubs.h: - -/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: - -/usr/include/freetype2/ft2build.h: - -/usr/include/x86_64-linux-gnu/bits/stdio2-decl.h: - /usr/include/linux/posix_types.h: /usr/include/GLFW/glfw3.h: /usr/include/x86_64-linux-gnu/bits/flt-eval-method.h: +/usr/include/c++/15/bits/nested_exception.h: + +/usr/include/linux/sched/types.h: + /usr/include/c++/15/bits/locale_classes.h: /usr/include/linux/stddef.h: @@ -1068,6 +971,40 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/time.h: +/usr/include/c++/15/cwctype: + +/usr/include/x86_64-linux-gnu/asm/types.h: + /usr/include/x86_64-linux-gnu/asm/posix_types_64.h: /usr/include/x86_64-linux-gnu/bits/cpu-set.h: + +/usr/include/c++/15/bits/stl_bvector.h: + +/usr/include/c++/15/bits/stl_pair.h: + +/usr/include/x86_64-linux-gnu/bits/fp-fast.h: + +/usr/include/x86_64-linux-gnu/bits/fp-logb.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/freetype2/ft2build.h: + +/usr/include/x86_64-linux-gnu/bits/libm-simd-decl-stubs.h: + +/usr/include/c++/15/bits/basic_ios.h: + +/usr/include/x86_64-linux-gnu/bits/locale.h: + +/usr/include/c++/15/bits/hash_bytes.h: + +/usr/include/c++/15/algorithm: + +/usr/include/x86_64-linux-gnu/bits/math-vector.h: + +/usr/include/x86_64-linux-gnu/bits/mathcalls-narrow.h: + +/usr/include/x86_64-linux-gnu/bits/mathcalls.h: + +/usr/include/x86_64-linux-gnu/bits/sched.h: diff --git a/build/CMakeFiles/radar_simulation.dir/progress.make b/build/CMakeFiles/radar_simulation.dir/progress.make index 6a9dc74..4b14cc1 100644 --- a/build/CMakeFiles/radar_simulation.dir/progress.make +++ b/build/CMakeFiles/radar_simulation.dir/progress.make @@ -1,4 +1,4 @@ -CMAKE_PROGRESS_1 = 1 -CMAKE_PROGRESS_2 = 2 -CMAKE_PROGRESS_3 = 3 +CMAKE_PROGRESS_1 = 2 +CMAKE_PROGRESS_2 = 3 +CMAKE_PROGRESS_3 = 4 diff --git a/build/CMakeFiles/radar_simulation.dir/src/main.cpp.o b/build/CMakeFiles/radar_simulation.dir/src/main.cpp.o index 9d3714c65399b4a7be375e36a8a5469ebfb22cf3..276626f6da95209591982327a26a4156a2fa2c1f 100644 GIT binary patch literal 56280 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 W*FwkROH}^9`bR_ADl&+l-v0v-xbcqw literal 100848 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 u=^yjY{W8-H^G?6|pYi9%h;pnm%RE 1.0) discard; + float intensity = exp(-uFalloff * d * d); + fragColor = vec4(uColor * intensity, intensity); +} diff --git a/build/shaders/ppi_targets.vert b/build/shaders/ppi_targets.vert new file mode 100644 index 0000000..f25d9e0 --- /dev/null +++ b/build/shaders/ppi_targets.vert @@ -0,0 +1,8 @@ +#version 330 core +layout(location = 0) in vec2 aPos; +layout(location = 1) in vec2 aUV; +out vec2 vUV; +void main() { + gl_Position = vec4(aPos, 0.0, 1.0); + vUV = aUV; +} diff --git a/src/main.cpp b/src/main.cpp index 63fd7cb..0cea2e9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,9 @@ -// Radar Simulation — Feature Test: 1 & 2 +// Radar Simulation — Feature Test: 1, 2 & 3 // Feature 1: Initialize display, draw scope boundaries (PPI circle, A scope box) // Feature 2: PPI bearing ring with tick marks and degree labels -// Runs for 10 seconds then exits. Press ESC to exit early. +// Feature 3: Replaceable A scope graticule — cycles through 2/5/10/15 mi ranges, +// 5 s hold per range, 0.5 s slide animation between ranges. +// Press ESC to exit. #include #include @@ -15,7 +17,6 @@ #include #include #include -#include #include #include @@ -24,12 +25,12 @@ static constexpr float PI = 3.14159265358979323846f; static constexpr int CIRCLE_SEGS = 360; -// Incandescent (warm lamp) — bearing graticule +// Incandescent (warm lamp) — bearing graticule and A scope graticule static constexpr float INCAN_R = 1.00f; static constexpr float INCAN_G = 0.78f; static constexpr float INCAN_B = 0.35f; -// P1 phosphor (green) — A scope +// P1 phosphor (green) — A scope boundary static constexpr float P1_R = 0.00f; static constexpr float P1_G = 0.90f; static constexpr float P1_B = 0.20f; @@ -38,6 +39,21 @@ static constexpr float P1_B = 0.20f; static constexpr int GLYPH_FIRST = '0'; static constexpr int GLYPH_COUNT = 10; +// Feature 3 timing +static constexpr float HOLD_SEC = 5.0f; +static constexpr float SLIDE_SEC = 0.5f; + +// P7 phosphor — active (blueish white) and persistence (greenish yellow) +static constexpr float P7A_R = 0.85f, P7A_G = 0.92f, P7A_B = 1.00f; +static constexpr float P7P_R = 0.35f, P7P_G = 0.88f, P7P_B = 0.18f; + +// Sweep / persistence +static constexpr float SWEEP_DEG_PS = 20.0f * 6.0f; // 20 RPM → 120 °/s +static constexpr float TRAIL_DEG = 50.0f; // lit arc behind sweep (°) +static constexpr float TARG_PERSIST = 5.0f; // target glow lifetime (s) +static constexpr int RING_SEGS = 300; +static constexpr int TRAIL_SEGS = 50; + // ─── NDC helpers ───────────────────────────────────────────────────────────── static inline float ndcX(float px, float W) { return px / W * 2.0f - 1.0f; } @@ -114,12 +130,12 @@ static void makeTextVAO(GLuint& vao, GLuint& vbo, const std::vector& v) // ─── FreeType font atlas ───────────────────────────────────────────────────── struct GlyphInfo { - int atlasX; // pixel x offset in atlas - int bitmapW; // rendered width - int bitmapH; // rendered height - int bearingX; // horizontal offset from cursor to left of bitmap - int bearingY; // vertical offset from baseline to top of bitmap - int advance; // horizontal advance in pixels + int atlasX; + int bitmapW; + int bitmapH; + int bearingX; + int bearingY; + int advance; }; struct FontAtlas { @@ -143,12 +159,11 @@ static bool buildFontAtlas(FontAtlas& fa, const std::string& fontPath, int sizeP } FT_Set_Pixel_Sizes(face, 0, sizePx); - // First pass — measure atlas dimensions int totalW = 0, maxH = 0; for (int i = 0; i < GLYPH_COUNT; ++i) { if (FT_Load_Char(face, GLYPH_FIRST + i, FT_LOAD_RENDER)) continue; FT_GlyphSlot g = face->glyph; - totalW += (int)g->bitmap.width + 2; // 2-pixel padding between glyphs + totalW += (int)g->bitmap.width + 2; maxH = std::max(maxH, (int)g->bitmap.rows); } @@ -156,16 +171,15 @@ static bool buildFontAtlas(FontAtlas& fa, const std::string& fontPath, int sizeP fa.atlasH = maxH; std::vector atlas(fa.atlasW * fa.atlasH, 0); - // Second pass — render each glyph into the atlas int xOff = 0; for (int i = 0; i < GLYPH_COUNT; ++i) { if (FT_Load_Char(face, GLYPH_FIRST + i, FT_LOAD_RENDER)) continue; FT_GlyphSlot g = face->glyph; GlyphInfo& gi = fa.glyphs[i]; - gi.atlasX = xOff; - gi.bitmapW = (int)g->bitmap.width; - gi.bitmapH = (int)g->bitmap.rows; + gi.atlasX = xOff; + gi.bitmapW = (int)g->bitmap.width; + gi.bitmapH = (int)g->bitmap.rows; gi.bearingX = g->bitmap_left; gi.bearingY = g->bitmap_top; gi.advance = (int)(g->advance.x >> 6); @@ -178,7 +192,6 @@ static bool buildFontAtlas(FontAtlas& fa, const std::string& fontPath, int sizeP xOff += gi.bitmapW + 2; } - // Upload atlas as single-channel (RED) texture glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glGenTextures(1, &fa.texture); glBindTexture(GL_TEXTURE_2D, fa.texture); @@ -188,7 +201,7 @@ static bool buildFontAtlas(FontAtlas& fa, const std::string& fontPath, int sizeP glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glBindTexture(GL_TEXTURE_2D, 0); - glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // restore default + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); FT_Done_Face(face); FT_Done_FreeType(ft); @@ -196,17 +209,16 @@ static bool buildFontAtlas(FontAtlas& fa, const std::string& fontPath, int sizeP } // Append NDC quad vertices for string s, visually centered at screen pixel (cx, cy). -// Only digits '0'–'9' are supported (sufficient for 0..350 degree labels). +// Only digits '0'–'9' are supported. static void appendTextQuads(std::vector& verts, const FontAtlas& fa, const std::string& s, float cx, float cy, float W, float H) { if (s.empty()) return; - // Measure total advance and vertical extent float totalAdv = 0.0f; - int maxBY = 0; // highest bearingY (top above baseline) - int minBY = 0; // lowest (bearingY - bitmapH), typically <= 0 + int maxBY = 0; + int minBY = 0; for (char c : s) { int i = (int)c - GLYPH_FIRST; @@ -217,9 +229,8 @@ static void appendTextQuads(std::vector& verts, const FontAtlas& fa, minBY = std::min(minBY, g.bearingY - g.bitmapH); } - // Position baseline so the visual center of the glyphs sits at (cx, cy) float visualCenterAboveBaseline = (maxBY + minBY) * 0.5f; - float baselineY = cy + visualCenterAboveBaseline; // screen y (y-down) + float baselineY = cy + visualCenterAboveBaseline; float cursorX = cx - totalAdv * 0.5f; for (char c : s) { @@ -227,27 +238,19 @@ static void appendTextQuads(std::vector& verts, const FontAtlas& fa, if (i < 0 || i >= GLYPH_COUNT) continue; const GlyphInfo& g = fa.glyphs[i]; - // Glyph bounding box in screen pixel space (y increases downward) float gx0 = cursorX + g.bearingX; - float gy0 = baselineY - g.bearingY; // top edge + float gy0 = baselineY - g.bearingY; float gx1 = gx0 + g.bitmapW; - float gy1 = gy0 + g.bitmapH; // bottom edge + float gy1 = gy0 + g.bitmapH; - // Atlas UV: - // GL uploads atlas row 0 as texture bottom (t = 0). - // Atlas row 0 is the TOP of the glyph bitmap. - // Screen top vertex (gy0) → t = 0 → samples glyph top ✓ - // Screen bottom vertex (gy1) → t = v1 → samples glyph bottom ✓ float u0 = (float) g.atlasX / fa.atlasW; float u1 = (float)(g.atlasX + g.bitmapW)/ fa.atlasW; float v0 = 0.0f; float v1 = (float) g.bitmapH / fa.atlasH; - // Triangle 1: TL, TR, BR verts.push_back(ndcX(gx0,W)); verts.push_back(ndcY(gy0,H)); verts.push_back(u0); verts.push_back(v0); verts.push_back(ndcX(gx1,W)); verts.push_back(ndcY(gy0,H)); verts.push_back(u1); verts.push_back(v0); verts.push_back(ndcX(gx1,W)); verts.push_back(ndcY(gy1,H)); verts.push_back(u1); verts.push_back(v1); - // Triangle 2: TL, BR, BL verts.push_back(ndcX(gx0,W)); verts.push_back(ndcY(gy0,H)); verts.push_back(u0); verts.push_back(v0); verts.push_back(ndcX(gx1,W)); verts.push_back(ndcY(gy1,H)); verts.push_back(u1); verts.push_back(v1); verts.push_back(ndcX(gx0,W)); verts.push_back(ndcY(gy1,H)); verts.push_back(u0); verts.push_back(v1); @@ -259,22 +262,20 @@ static void appendTextQuads(std::vector& verts, const FontAtlas& fa, // ─── Layout ────────────────────────────────────────────────────────────────── struct Layout { - float ppiCX, ppiCY, ppiR; // PPI scope center and radius (pixels) - float asLeft, asTop, asRight, asBot; // A scope rectangle (pixels) + float ppiCX, ppiCY, ppiR; + float asLeft, asTop, asRight, asBot; }; static Layout computeLayout(float W, float H, float marginPx) { Layout L{}; - // PPI: right half of screen; margins top/bottom/right = marginPx, left = screen centre float availW = (W - marginPx) - W * 0.5f; float availH = (H - marginPx) - marginPx; L.ppiR = std::min(availW, availH) * 0.5f; L.ppiCX = W * 0.5f + availW * 0.5f; L.ppiCY = marginPx + availH * 0.5f; - // A scope: left half, smaller, centred vertically, near left margin float asW = (W * 0.5f - 2.0f * marginPx) * 0.65f; float asH = H * 0.22f; L.asLeft = marginPx; @@ -298,7 +299,6 @@ static ScopeBounds buildScopeBounds(const Layout& L, float W, float H) ScopeBounds sb{}; std::vector v; - // PPI circle (LINE_STRIP, CIRCLE_SEGS+1 verts — last = first, closes the loop) sb.ppiStart = 0; sb.ppiCount = CIRCLE_SEGS + 1; for (int i = 0; i <= CIRCLE_SEGS; ++i) { @@ -307,17 +307,16 @@ static ScopeBounds buildScopeBounds(const Layout& L, float W, float H) v.push_back(ndcY(L.ppiCY + L.ppiR * std::sin(a), H)); } - // A scope box (4 × GL_LINES = 8 verts) sb.asStart = sb.ppiStart + sb.ppiCount; sb.asCount = 8; auto ln = [&](float x1, float y1, float x2, float y2) { v.push_back(ndcX(x1,W)); v.push_back(ndcY(y1,H)); v.push_back(ndcX(x2,W)); v.push_back(ndcY(y2,H)); }; - ln(L.asLeft, L.asTop, L.asRight, L.asTop); // top edge - ln(L.asRight, L.asTop, L.asRight, L.asBot); // right edge - ln(L.asRight, L.asBot, L.asLeft, L.asBot); // bottom edge - ln(L.asLeft, L.asBot, L.asLeft, L.asTop); // left edge + ln(L.asLeft, L.asTop, L.asRight, L.asTop); + ln(L.asRight, L.asTop, L.asRight, L.asBot); + ln(L.asRight, L.asBot, L.asLeft, L.asBot); + ln(L.asLeft, L.asBot, L.asLeft, L.asTop); makeLineVAO(sb.vao, sb.vbo, v); sb.prog = makeProgram("shaders/scope_bounds.vert", "shaders/scope_bounds.frag"); @@ -342,10 +341,8 @@ static BearingGraticule buildBearingGraticule(const Layout& L, const FontAtlas& BearingGraticule bg{}; const float cx = L.ppiCX, cy = L.ppiCY, R = L.ppiR; - // ── Line geometry (ring + ticks) ────────────────────────────────────────── std::vector lineV; - // Bearing ring circle (LINE_STRIP, closed) bg.ringStart = 0; bg.ringCount = CIRCLE_SEGS + 1; for (int i = 0; i <= CIRCLE_SEGS; ++i) { @@ -354,10 +351,6 @@ static BearingGraticule buildBearingGraticule(const Layout& L, const FontAtlas& lineV.push_back(ndcY(cy + R * std::sin(a), H)); } - // Tick marks: every 1 degree, longer every 10 degrees - // Radar convention: 0° = top (north), increasing clockwise - // screen_x = cx + R * sin(bearing_rad) - // screen_y = cy - R * cos(bearing_rad) const float majorLen = 0.055f * R; const float minorLen = 0.025f * R; bg.tickStart = bg.ringStart + bg.ringCount; @@ -367,19 +360,16 @@ static BearingGraticule buildBearingGraticule(const Layout& L, const FontAtlas& float sb = std::sin(brad); float cb = std::cos(brad); float len = (b % 10 == 0) ? majorLen : minorLen; - // Outer point (on the ring) lineV.push_back(ndcX(cx + R * sb, W)); lineV.push_back(ndcY(cy - R * cb, H)); - // Inner point lineV.push_back(ndcX(cx + (R-len) * sb, W)); lineV.push_back(ndcY(cy - (R-len) * cb, H)); } makeLineVAO(bg.lineVAO, bg.lineVBO, lineV); - // ── Text geometry (degree labels every 10°) ──────────────────────────────── std::vector textV; - const float textR = R * 1.07f; // label-centre radius (just outside the ring) + const float textR = R * 1.07f; for (int b = 0; b < 360; b += 10) { float brad = b * PI / 180.0f; float tx = cx + textR * std::sin(brad); @@ -396,6 +386,371 @@ static BearingGraticule buildBearingGraticule(const Layout& L, const FontAtlas& return bg; } +// ─── Feature 3: A scope replaceable graticule ──────────────────────────────── + +// One entry per selectable range. The graticule has numMajor labeled ticks +// (full-height vertical lines) and numMinorPerMajor minor ticks between each +// pair of major ticks. Label values are computed as (m * maxMiles / numMajor). +struct RangeConfig { + float maxMiles; + int numMajor; + int numMinorPerMajor; +}; + +static const RangeConfig RANGE_CONFIGS[4] = { + { 2.0f, 2, 4 }, // labels: 1, 2 mi + { 5.0f, 5, 1 }, // labels: 1,2,3,4,5 mi + { 10.0f, 5, 1 }, // labels: 2,4,6,8,10 mi + { 15.0f, 5, 2 }, // labels: 3,6,9,12,15 mi +}; +static constexpr int RANGE_COUNT = 4; + +struct AScopeGraticule { + GLuint lineVAO = 0, lineVBO = 0; + GLuint textVAO = 0, textVBO = 0; + int lineCount = 0; + int textVerts = 0; +}; + +// Shared shader programs for all A scope graticules (uYOffset drives animation) +struct AScopeGratProg { + GLuint line = 0; + GLuint text = 0; +}; + +static AScopeGratProg buildAScopeGratPrograms() +{ + return { + makeProgram("shaders/ascope_graticule.vert", + "shaders/ascope_graticule.frag"), + makeProgram("shaders/ascope_graticule_text.vert", + "shaders/ascope_graticule_text.frag") + }; +} + +static AScopeGraticule buildAScopeGraticule( + const Layout& L, const FontAtlas& fa, const RangeConfig& rc, + float W, float H) +{ + AScopeGraticule ag{}; + + const float asH = L.asBot - L.asTop; + const float pad = 4.0f; + const float gx0 = L.asLeft + pad; // signal area left + const float gx1 = L.asRight - pad; // signal area right + const float gy0 = L.asTop + pad; // top of signal area + const float gy1 = L.asTop + asH * 0.80f; // baseline (signal y = 0) + const float sigW = gx1 - gx0; + const float sigH = gy1 - gy0; + + std::vector lineV; + auto ln = [&](float x1, float y1, float x2, float y2) { + lineV.push_back(ndcX(x1,W)); lineV.push_back(ndcY(y1,H)); + lineV.push_back(ndcX(x2,W)); lineV.push_back(ndcY(y2,H)); + }; + + // Outer frame (the physical glass plate border) + ln(L.asLeft, L.asTop, L.asRight, L.asTop); + ln(L.asRight, L.asTop, L.asRight, L.asBot); + ln(L.asRight, L.asBot, L.asLeft, L.asBot); + ln(L.asLeft, L.asBot, L.asLeft, L.asTop); + + // Baseline and top amplitude reference + ln(gx0, gy1, gx1, gy1); + ln(gx0, gy0, gx1, gy0); + + // Horizontal amplitude guide lines at 25 %, 50 %, 75 % + for (int i = 1; i <= 3; ++i) + ln(gx0, gy0 + sigH * i * 0.25f, gx1, gy0 + sigH * i * 0.25f); + + // Vertical tick marks + const float majorSpan = sigW / rc.numMajor; + const float minorSpan = majorSpan / (rc.numMinorPerMajor + 1); + const float minorTickH = sigH * 0.35f; + + for (int m = 0; m < rc.numMajor; ++m) { + // Major tick (full signal height) at right edge of each interval + float xMaj = gx0 + (m + 1) * majorSpan; + ln(xMaj, gy1, xMaj, gy0); + + // Minor ticks between this major and the next + float xBase = gx0 + m * majorSpan; + for (int n = 1; n <= rc.numMinorPerMajor; ++n) { + float xMin = xBase + n * minorSpan; + ln(xMin, gy1, xMin, gy1 - minorTickH); + } + } + + ag.lineCount = (int)lineV.size() / 2; + makeLineVAO(ag.lineVAO, ag.lineVBO, lineV); + + // Range labels at each major tick (whole-number miles, centred in label area) + std::vector textV; + const float labelY = L.asTop + asH * 0.90f; + const float milesPerMajor = rc.maxMiles / rc.numMajor; + for (int m = 1; m <= rc.numMajor; ++m) { + float x = gx0 + m * majorSpan; + int labelMi = (int)std::round(m * milesPerMajor); + appendTextQuads(textV, fa, std::to_string(labelMi), x, labelY, W, H); + } + ag.textVerts = (int)textV.size() / 4; + makeTextVAO(ag.textVAO, ag.textVBO, textV); + + return ag; +} + +// Draw one graticule with a vertical NDC offset (positive = up on screen). +// glScissor clips to the A scope box so the slide animation looks like the +// graticule is being pulled out / pushed in through a slot at the top. +static void drawAScopeGraticule( + const AScopeGratProg& prog, const AScopeGraticule& ag, + float yOffNDC, const FontAtlas& fa, float W, float H, const Layout& L) +{ + glEnable(GL_SCISSOR_TEST); + // OpenGL scissor uses window coords (y=0 at bottom of window) + glScissor((GLint) L.asLeft, + (GLint)(H - L.asBot), + (GLint)(L.asRight - L.asLeft), + (GLint)(L.asBot - L.asTop)); + + glUseProgram(prog.line); + glUniform3f(glGetUniformLocation(prog.line, "uColor"), INCAN_R, INCAN_G, INCAN_B); + glUniform1f(glGetUniformLocation(prog.line, "uYOffset"), yOffNDC); + glBindVertexArray(ag.lineVAO); + glDrawArrays(GL_LINES, 0, ag.lineCount); + + if (ag.textVerts > 0) { + glUseProgram(prog.text); + glUniform3f(glGetUniformLocation(prog.text, "uColor"), INCAN_R, INCAN_G, INCAN_B); + glUniform1f(glGetUniformLocation(prog.text, "uYOffset"), yOffNDC); + glUniform1i(glGetUniformLocation(prog.text, "uTexture"), 0); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, fa.texture); + glBindVertexArray(ag.textVAO); + glDrawArrays(GL_TRIANGLES, 0, ag.textVerts); + glBindTexture(GL_TEXTURE_2D, 0); + } + + glBindVertexArray(0); + glDisable(GL_SCISSOR_TEST); +} + +// ─── Polar coordinate helpers (bearing ° CW from N, range fraction) ───────── + +static inline float polarPx(const Layout& L, float bearDeg, float frac) +{ return L.ppiCX + frac * L.ppiR * std::sin(bearDeg * (PI/180.0f)); } + +static inline float polarPy(const Layout& L, float bearDeg, float frac) +{ return L.ppiCY - frac * L.ppiR * std::cos(bearDeg * (PI/180.0f)); } + +// ─── Feature 4: PPI range rings ────────────────────────────────────────────── + +// Build vertex data (x,y,r,g,b = 5 floats/vertex): +// 1. Full persistence rings (dim P7 green-yellow) +// 2. Active sweep-trail arc per ring (active → persistence colour gradient) +// 3. Sweep line from centre to edge +static void buildRingVerts(std::vector& v, + const Layout& L, int rangeIdx, + float sweepAngle, float W, float H) +{ + const RangeConfig& rc = RANGE_CONFIGS[rangeIdx]; + const int nr = rc.numMajor; + + auto push = [&](float px, float py, float r, float g, float b) { + v.push_back(ndcX(px,W)); v.push_back(ndcY(py,H)); + v.push_back(r); v.push_back(g); v.push_back(b); + }; + + // Full persistence rings (dim) + for (int ri = 1; ri <= nr; ++ri) { + float frac = (float)ri / nr; + for (int i = 0; i <= RING_SEGS; ++i) { + float a = 2.0f * PI * i / RING_SEGS; + push(L.ppiCX + frac*L.ppiR*std::cos(a), + L.ppiCY + frac*L.ppiR*std::sin(a), + P7P_R*0.45f, P7P_G*0.45f, P7P_B*0.45f); + } + } + + // Sweep trail arcs (active at head → persistence at tail) + for (int ri = 1; ri <= nr; ++ri) { + float frac = (float)ri / nr; + for (int i = 0; i <= TRAIL_SEGS; ++i) { + float t = 1.0f - (float)i / TRAIL_SEGS; + float ang = sweepAngle - (float)i * TRAIL_DEG / TRAIL_SEGS; + float r = P7A_R * t + P7P_R * 0.45f * (1.0f - t); + float g2 = P7A_G * t + P7P_G * 0.45f * (1.0f - t); + float b = P7A_B * t + P7P_B * 0.45f * (1.0f - t); + push(polarPx(L,ang,frac), polarPy(L,ang,frac), r, g2, b); + } + } + + // Sweep line (centre → edge) + push(L.ppiCX, L.ppiCY, P7A_R, P7A_G, P7A_B); + push(polarPx(L,sweepAngle,1.0f), polarPy(L,sweepAngle,1.0f), + P7A_R, P7A_G, P7A_B); +} + +struct RingLayer { + GLuint prog = 0, vao = 0, vbo = 0; +}; + +static RingLayer buildRingLayer() +{ + RingLayer rl{}; + glGenVertexArrays(1, &rl.vao); glGenBuffers(1, &rl.vbo); + glBindVertexArray(rl.vao); + glBindBuffer(GL_ARRAY_BUFFER, rl.vbo); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5*sizeof(float), nullptr); + glEnableVertexAttribArray(0); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5*sizeof(float), + reinterpret_cast(2*sizeof(float))); + glEnableVertexAttribArray(1); + glBindVertexArray(0); + rl.prog = makeProgram("shaders/ppi_range_rings.vert", + "shaders/ppi_range_rings.frag"); + return rl; +} + +static void renderRingLayer(RingLayer& rl, const Layout& L, + int rangeIdx, float sweepAngle, float W, float H) +{ + std::vector v; + buildRingVerts(v, L, rangeIdx, sweepAngle, W, H); + + glBindBuffer(GL_ARRAY_BUFFER, rl.vbo); + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)(v.size()*sizeof(float)), + v.data(), GL_DYNAMIC_DRAW); + + glUseProgram(rl.prog); + glBindVertexArray(rl.vao); + + const int nr = RANGE_CONFIGS[rangeIdx].numMajor; + int off = 0; + for (int ri = 0; ri < nr; ++ri) { + glDrawArrays(GL_LINE_STRIP, off, RING_SEGS+1); + off += RING_SEGS+1; + } + for (int ri = 0; ri < nr; ++ri) { + glDrawArrays(GL_LINE_STRIP, off, TRAIL_SEGS+1); + off += TRAIL_SEGS+1; + } + glDrawArrays(GL_LINES, off, 2); + glBindVertexArray(0); +} + +// ─── Feature 5: Fake targets ────────────────────────────────────────────────── + +struct FakeTarget { + float bearingDeg; + float rangeMiles; + float coreRadPx; // core blob radius (pixels) + float bloomRadPx; // bloom glow radius (pixels); 0 = no bloom + mutable float lastActT; // glfwGetTime() when sweep last lit this target +}; + +static float angDiff(float a, float b) // unsigned angular separation (°) +{ + float d = std::fmod(std::fabs(a - b), 360.0f); + return d > 180.0f ? 360.0f - d : d; +} + +// Build one textured quad (x,y,u,v = 4 floats/vertex) centred at screen pixel (px,py). +static void genBlob(std::vector& v, + float px, float py, float radiusPx, float W, float H) +{ + float x0=ndcX(px-radiusPx,W), y0=ndcY(py-radiusPx,H); + float x1=ndcX(px+radiusPx,W), y1=ndcY(py+radiusPx,H); + v.push_back(x0);v.push_back(y0);v.push_back(-1.f);v.push_back(-1.f); + v.push_back(x1);v.push_back(y0);v.push_back( 1.f);v.push_back(-1.f); + v.push_back(x1);v.push_back(y1);v.push_back( 1.f);v.push_back( 1.f); + v.push_back(x0);v.push_back(y0);v.push_back(-1.f);v.push_back(-1.f); + v.push_back(x1);v.push_back(y1);v.push_back( 1.f);v.push_back( 1.f); + v.push_back(x0);v.push_back(y1);v.push_back(-1.f);v.push_back( 1.f); +} + +struct TargetLayer { + GLuint prog = 0, vao = 0, vbo = 0; +}; + +static TargetLayer buildTargetLayer() +{ + TargetLayer tl{}; + glGenVertexArrays(1, &tl.vao); glGenBuffers(1, &tl.vbo); + glBindVertexArray(tl.vao); + glBindBuffer(GL_ARRAY_BUFFER, tl.vbo); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4*sizeof(float), nullptr); + glEnableVertexAttribArray(0); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4*sizeof(float), + reinterpret_cast(2*sizeof(float))); + glEnableVertexAttribArray(1); + glBindVertexArray(0); + tl.prog = makeProgram("shaders/ppi_targets.vert","shaders/ppi_targets.frag"); + return tl; +} + +static void renderTargets(TargetLayer& tl, + FakeTarget* tgts, int nTgts, + const Layout& L, float maxRangeMi, + float sweepAngle, float curTime, float W, float H) +{ + static const float THRESH = 3.5f; // sweep activation threshold (°) + + glUseProgram(tl.prog); + glBindVertexArray(tl.vao); + + const GLint locCol = glGetUniformLocation(tl.prog, "uColor"); + const GLint locFall = glGetUniformLocation(tl.prog, "uFalloff"); + + for (int i = 0; i < nTgts; ++i) { + FakeTarget& t = tgts[i]; + + if (angDiff(sweepAngle, t.bearingDeg) < THRESH) + t.lastActT = curTime; + + float rangeFrac = t.rangeMiles / maxRangeMi; + if (rangeFrac > 1.0f) continue; + + float px = polarPx(L, t.bearingDeg, rangeFrac); + float py = polarPy(L, t.bearingDeg, rangeFrac); + + float dt = curTime - t.lastActT; + float fade = (dt < 0.0f) ? 0.0f : std::max(0.0f, 1.0f - dt/TARG_PERSIST); + bool active = angDiff(sweepAngle, t.bearingDeg) < THRESH; + float bright = active ? 1.0f : fade; + + if (bright < 0.01f) continue; + + float cr, cg, cb; + if (active) { cr=P7A_R; cg=P7A_G; cb=P7A_B; } + else { cr=P7P_R; cg=P7P_G; cb=P7P_B; } + + // Core blob + { + std::vector bv; + genBlob(bv, px, py, t.coreRadPx, W, H); + glBindBuffer(GL_ARRAY_BUFFER, tl.vbo); + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)(bv.size()*sizeof(float)), + bv.data(), GL_DYNAMIC_DRAW); + glUniform3f(locCol, cr*bright, cg*bright, cb*bright); + glUniform1f(locFall, 4.5f); + glDrawArrays(GL_TRIANGLES, 0, 6); + } + // Bloom glow (large targets only) + if (t.bloomRadPx > 0.0f && bright > 0.05f) { + std::vector bv; + genBlob(bv, px, py, t.bloomRadPx, W, H); + glBindBuffer(GL_ARRAY_BUFFER, tl.vbo); + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)(bv.size()*sizeof(float)), + bv.data(), GL_DYNAMIC_DRAW); + glUniform3f(locCol, cr*bright*0.35f, cg*bright*0.35f, cb*bright*0.35f); + glUniform1f(locFall, 0.8f); + glDrawArrays(GL_TRIANGLES, 0, 6); + } + } + glBindVertexArray(0); +} + // ─── Key callback ──────────────────────────────────────────────────────────── static void onKey(GLFWwindow* win, int key, int /*scan*/, int action, int /*mods*/) @@ -419,7 +774,7 @@ int main() GLFWwindow* win = glfwCreateWindow( mode->width, mode->height, - "Radar Test — Features 1 & 2", + "Radar Test — Features 1–5", nullptr, nullptr); if (!win) { std::cerr << "Window create failed\n"; glfwTerminate(); return 1; } @@ -436,7 +791,6 @@ int main() const float W = static_cast(fbW); const float H = static_cast(fbH); - // Convert 0.5-inch margin to pixels using monitor physical size int mmW, mmH; glfwGetMonitorPhysicalSize(mon, &mmW, &mmH); const float dpiX = static_cast(mode->width) / (static_cast(mmW) / 25.4f); @@ -444,7 +798,7 @@ int main() const Layout layout = computeLayout(W, H, margin); - // Build FreeType font atlas (digits only, ~1.8 % of screen height) + // Font atlas (digits only, ~1.8 % of screen height) FontAtlas fa{}; const std::string fontPath = "/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf"; @@ -459,15 +813,65 @@ int main() // Feature 2 — PPI bearing graticule BearingGraticule bg = buildBearingGraticule(layout, fa, W, H); + // Feature 3 — A scope replaceable graticules + AScopeGratProg agProg = buildAScopeGratPrograms(); + AScopeGraticule graticules[RANGE_COUNT]; + for (int i = 0; i < RANGE_COUNT; ++i) + graticules[i] = buildAScopeGraticule(layout, fa, RANGE_CONFIGS[i], W, H); + + // Feature 4 — PPI range rings + RingLayer rl = buildRingLayer(); + + // Feature 5 — Fake targets (one per quadrant: NE small, SE large, SW/NW very large) + const float pR = layout.ppiR; + FakeTarget targets[4] = { + { 55.0f, 1.3f, pR*0.010f, 0.0f, -999.0f }, // NE – small (kayak) + { 135.0f, 3.8f, pR*0.022f, pR*0.048f, -999.0f }, // SE – large, blooming + { 215.0f, 2.2f, pR*0.032f, pR*0.075f, -999.0f }, // SW – very large + { 310.0f, 9.0f, pR*0.032f, pR*0.075f, -999.0f }, // NW – very large + }; + TargetLayer tl = buildTargetLayer(); + + float sweepAngle = 0.0f; // degrees, 0 = north, clockwise + + // NDC height of the A scope box — used to compute slide distance + const float scopeNDCH = (layout.asBot - layout.asTop) * 2.0f / H; + + // Animation state + int curRange = 0; + int nextRange = 1; + bool sliding = false; + float holdTimer = 0.0f; + float slideTimer = 0.0f; + float prevTime = static_cast(glfwGetTime()); + glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - const auto t0 = std::chrono::steady_clock::now(); - while (!glfwWindowShouldClose(win)) { - const float elapsed = std::chrono::duration( - std::chrono::steady_clock::now() - t0).count(); - if (elapsed >= 10.0f) break; + const float now = static_cast(glfwGetTime()); + const float dt = now - prevTime; + prevTime = now; + + // ── Advance sweep (Features 4 & 5) ─────────────────────────────────── + sweepAngle = std::fmod(sweepAngle + SWEEP_DEG_PS * dt, 360.0f); + + // ── Advance Feature 3 animation ─────────────────────────────────────── + if (!sliding) { + holdTimer += dt; + if (holdTimer >= HOLD_SEC) { + holdTimer = 0.0f; + slideTimer = 0.0f; + nextRange = (curRange + 1) % RANGE_COUNT; + sliding = true; + } + } else { + slideTimer += dt; + if (slideTimer >= SLIDE_SEC) { + curRange = nextRange; + sliding = false; + } + } glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); @@ -477,11 +881,9 @@ int main() const GLint sbCol = glGetUniformLocation(sb.prog, "uColor"); glBindVertexArray(sb.vao); - // PPI scope boundary — dim blue-white ring glUniform3f(sbCol, 0.25f, 0.35f, 0.55f); glDrawArrays(GL_LINE_STRIP, sb.ppiStart, sb.ppiCount); - // A scope boundary — P1 green glUniform3f(sbCol, P1_R, P1_G, P1_B); glDrawArrays(GL_LINES, sb.asStart, sb.asCount); @@ -496,7 +898,6 @@ int main() glDrawArrays(GL_LINES, bg.tickStart, bg.tickCount); glBindVertexArray(0); - // ── Feature 2: degree labels ────────────────────────────────────────── glUseProgram(bg.textProg); glUniform3f(glGetUniformLocation(bg.textProg, "uColor"), INCAN_R, INCAN_G, INCAN_B); @@ -508,6 +909,28 @@ int main() glBindVertexArray(0); glBindTexture(GL_TEXTURE_2D, 0); + // ── Feature 3: A scope graticule (with slide animation) ─────────────── + if (!sliding) { + drawAScopeGraticule(agProg, graticules[curRange], + 0.0f, fa, W, H, layout); + } else { + float t = std::min(slideTimer / SLIDE_SEC, 1.0f); + // Old graticule slides UP (+NDC Y = up) and out through the top slot + drawAScopeGraticule(agProg, graticules[curRange], + t * scopeNDCH, fa, W, H, layout); + // New graticule descends from above into position + drawAScopeGraticule(agProg, graticules[nextRange], + (1.0f - t) * scopeNDCH, fa, W, H, layout); + } + + // ── Feature 4: PPI range rings ──────────────────────────────────────── + renderRingLayer(rl, layout, curRange, sweepAngle, W, H); + + // ── Feature 5: Active targets + persistence ─────────────────────────── + renderTargets(tl, targets, 4, layout, + RANGE_CONFIGS[curRange].maxMiles, + sweepAngle, now, W, H); + glfwSwapBuffers(win); glfwPollEvents(); } @@ -521,6 +944,19 @@ int main() glDeleteProgram(bg.lineProg); glDeleteProgram(bg.textProg); + for (int i = 0; i < RANGE_COUNT; ++i) { + glDeleteVertexArrays(1, &graticules[i].lineVAO); + glDeleteBuffers(1, &graticules[i].lineVBO); + glDeleteVertexArrays(1, &graticules[i].textVAO); + glDeleteBuffers(1, &graticules[i].textVBO); + } + glDeleteProgram(agProg.line); + glDeleteProgram(agProg.text); + glDeleteVertexArrays(1, &rl.vao); glDeleteBuffers(1, &rl.vbo); + glDeleteProgram(rl.prog); + glDeleteVertexArrays(1, &tl.vao); glDeleteBuffers(1, &tl.vbo); + glDeleteProgram(tl.prog); + glfwDestroyWindow(win); glfwTerminate(); return 0;