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 9d3714c..276626f 100644 Binary files a/build/CMakeFiles/radar_simulation.dir/src/main.cpp.o and b/build/CMakeFiles/radar_simulation.dir/src/main.cpp.o differ diff --git a/build/CMakeFiles/radar_simulation.dir/src/main.cpp.o.d b/build/CMakeFiles/radar_simulation.dir/src/main.cpp.o.d index fe623a4..e92c158 100644 --- a/build/CMakeFiles/radar_simulation.dir/src/main.cpp.o.d +++ b/build/CMakeFiles/radar_simulation.dir/src/main.cpp.o.d @@ -233,9 +233,6 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: \ /usr/include/x86_64-linux-gnu/c++/15/bits/c++io.h \ /usr/include/c++/15/bits/fstream.tcc /usr/include/c++/15/sstream \ /usr/include/c++/15/bits/sstream.tcc /usr/include/c++/15/iostream \ - /usr/include/c++/15/chrono /usr/include/c++/15/bits/chrono.h \ - /usr/include/c++/15/ratio /usr/include/c++/15/cstdint \ - /usr/include/c++/15/ctime /usr/include/c++/15/bits/parse_numbers.h \ /usr/include/c++/15/algorithm /usr/include/c++/15/bits/stl_algo.h \ /usr/include/c++/15/bits/algorithmfwd.h \ /usr/include/c++/15/bits/stl_heap.h \ diff --git a/build/Makefile b/build/Makefile index b1bc909..dedca34 100644 --- a/build/Makefile +++ b/build/Makefile @@ -129,6 +129,19 @@ radar_simulation/fast: $(MAKE) $(MAKESILENT) -f CMakeFiles/radar_simulation.dir/build.make CMakeFiles/radar_simulation.dir/build .PHONY : radar_simulation/fast +#============================================================================= +# Target rules for targets named copy_shaders + +# Build rule for target. +copy_shaders: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 copy_shaders +.PHONY : copy_shaders + +# fast build rule for target. +copy_shaders/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/copy_shaders.dir/build.make CMakeFiles/copy_shaders.dir/build +.PHONY : copy_shaders/fast + glad/src/glad.o: glad/src/glad.c.o .PHONY : glad/src/glad.o @@ -185,6 +198,7 @@ help: @echo "... depend" @echo "... edit_cache" @echo "... rebuild_cache" + @echo "... copy_shaders" @echo "... radar_simulation" @echo "... glad/src/glad.o" @echo "... glad/src/glad.i" diff --git a/build/radar_simulation b/build/radar_simulation index 80e30ad..593b72e 100755 Binary files a/build/radar_simulation and b/build/radar_simulation differ diff --git a/build/shaders/ascope_graticule.frag b/build/shaders/ascope_graticule.frag new file mode 100644 index 0000000..e845509 --- /dev/null +++ b/build/shaders/ascope_graticule.frag @@ -0,0 +1,6 @@ +#version 330 core +uniform vec3 uColor; +out vec4 FragColor; +void main() { + FragColor = vec4(uColor, 1.0); +} diff --git a/build/shaders/ascope_graticule.vert b/build/shaders/ascope_graticule.vert new file mode 100644 index 0000000..bd1a394 --- /dev/null +++ b/build/shaders/ascope_graticule.vert @@ -0,0 +1,6 @@ +#version 330 core +layout(location = 0) in vec2 aPos; +uniform float uYOffset; +void main() { + gl_Position = vec4(aPos.x, aPos.y + uYOffset, 0.0, 1.0); +} diff --git a/build/shaders/ascope_graticule_text.frag b/build/shaders/ascope_graticule_text.frag new file mode 100644 index 0000000..83e1f3d --- /dev/null +++ b/build/shaders/ascope_graticule_text.frag @@ -0,0 +1,9 @@ +#version 330 core +in vec2 vUV; +uniform sampler2D uTexture; +uniform vec3 uColor; +out vec4 FragColor; +void main() { + float alpha = texture(uTexture, vUV).r; + FragColor = vec4(uColor, alpha); +} diff --git a/build/shaders/ascope_graticule_text.vert b/build/shaders/ascope_graticule_text.vert new file mode 100644 index 0000000..a27e74a --- /dev/null +++ b/build/shaders/ascope_graticule_text.vert @@ -0,0 +1,9 @@ +#version 330 core +layout(location = 0) in vec2 aPos; +layout(location = 1) in vec2 aUV; +uniform float uYOffset; +out vec2 vUV; +void main() { + gl_Position = vec4(aPos.x, aPos.y + uYOffset, 0.0, 1.0); + vUV = aUV; +} diff --git a/build/shaders/ppi_range_rings.frag b/build/shaders/ppi_range_rings.frag new file mode 100644 index 0000000..e24db23 --- /dev/null +++ b/build/shaders/ppi_range_rings.frag @@ -0,0 +1,6 @@ +#version 330 core +in vec3 vColor; +out vec4 fragColor; +void main() { + fragColor = vec4(vColor, 1.0); +} diff --git a/build/shaders/ppi_range_rings.vert b/build/shaders/ppi_range_rings.vert new file mode 100644 index 0000000..5413791 --- /dev/null +++ b/build/shaders/ppi_range_rings.vert @@ -0,0 +1,8 @@ +#version 330 core +layout(location = 0) in vec2 aPos; +layout(location = 1) in vec3 aColor; +out vec3 vColor; +void main() { + gl_Position = vec4(aPos, 0.0, 1.0); + vColor = aColor; +} diff --git a/build/shaders/ppi_targets.frag b/build/shaders/ppi_targets.frag new file mode 100644 index 0000000..64d95b7 --- /dev/null +++ b/build/shaders/ppi_targets.frag @@ -0,0 +1,11 @@ +#version 330 core +in vec2 vUV; // [-1,1] range — distance from blob centre +out vec4 fragColor; +uniform vec3 uColor; +uniform float uFalloff; // gaussian width: larger = tighter core +void main() { + float d = length(vUV); + if (d > 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;