From 337d4236398ac159381874c9fcfbeee0224257c0 Mon Sep 17 00:00:00 2001 From: Mark Allyn Date: Sun, 5 Apr 2026 18:25:42 -0700 Subject: [PATCH] Add feature for cursor and range rings --- CLAUDE.md | 41 +- .../compiler_depend.internal | 21 + .../radar_simulation.dir/compiler_depend.make | 265 ++++--- .../radar_simulation.dir/src/main.cpp.o | Bin 56280 -> 72832 bytes build/radar_simulation | Bin 113760 -> 122504 bytes build/shaders/ppi_cursor.frag | 6 + build/shaders/ppi_cursor.vert | 5 + shaders/ascope_graticule.frag | 6 + shaders/ascope_graticule.vert | 6 + shaders/ascope_graticule_text.frag | 9 + shaders/ascope_graticule_text.vert | 9 + shaders/ppi_cursor.frag | 6 + shaders/ppi_cursor.vert | 5 + shaders/ppi_range_rings.frag | 6 + shaders/ppi_range_rings.vert | 8 + shaders/ppi_targets.frag | 11 + shaders/ppi_targets.vert | 8 + src/main.cpp | 651 +++++++++++++----- 18 files changed, 779 insertions(+), 284 deletions(-) create mode 100644 build/shaders/ppi_cursor.frag create mode 100644 build/shaders/ppi_cursor.vert create mode 100644 shaders/ascope_graticule.frag create mode 100644 shaders/ascope_graticule.vert create mode 100644 shaders/ascope_graticule_text.frag create mode 100644 shaders/ascope_graticule_text.vert create mode 100644 shaders/ppi_cursor.frag create mode 100644 shaders/ppi_cursor.vert create mode 100644 shaders/ppi_range_rings.frag create mode 100644 shaders/ppi_range_rings.vert create mode 100644 shaders/ppi_targets.frag create mode 100644 shaders/ppi_targets.vert diff --git a/CLAUDE.md b/CLAUDE.md index f1e3ac9..9a78153 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -22,6 +22,8 @@ The proposed location of the radar antenna is at the dock of the Community boating center in Bellingham, Washington. Location is 48.72° N Latitude and -122.51° W Longitude +Zero degrees on Radar Scope is True North. + The proposed maximum range is 15 miles. Selectable ranges should be 2, 5, 10, and 15 miles @@ -119,7 +121,7 @@ Display colors: 1. A Scope is P1 (same as oscilloscope) 2. A Scope graticule is incandescent color 3. PPI scope active targets including scatters, graticule range rings, shoreline, - all p7 phosphor (active white blue) + all p7 phosphor (active blue) 4. All persistence (also p7 greenish yellow persistence) for PPI scope active targets including scatters, graticule range rings, shoreline 5. PPI scope bearing ring and ticks is incandescent color. @@ -135,12 +137,16 @@ is 15 miles from the center. Signal strength: Need to have following fixed signal strength: -1. large ship would be bright and blooming -2. yachts would be bright but not blooming -3. sailboats would be medium bright and not blooming -4. kayaks and rowboats would be small and dim + Size is part of data for some targets (based on AIS and ADS-B + data. Use size of boat (usually in feet) expressed in length + and width. Use those values in relation of the heading if known. + Unknown heading shall assume size is between length and width. +1. large ship (over 100 feet) would be bright and blooming slightly +2. yachts ( 50 to 100 feet) feet would be bright but not blooming +3. sailboats ( 10 to 50 feet) would be medium bright and not blooming +4. kayaks and rowboats would be dim 5. May consider fading small boats like kayaks - and sailboats above 3 miles + and sailboats above 10 miles Details of each feature: @@ -159,6 +165,7 @@ A scope: 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" + Movement of graticles would be a bit slow and erratic (maybe about 10 seconds) 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 @@ -166,10 +173,10 @@ to do whatever is needed to reduce aliasing or flickering PPI Scope active targets 1. Active boats/planes; brightness determined by size as noted above -2. Blue white color +2. Blue PPI Scope range rings -1. blue white (dim) +1. blue (dim) 2. These change if operator changes max range PPI Scope cursor (In the day, this was a moveable plastic @@ -184,6 +191,7 @@ PPI Scope Bearing ticks and ring 3. Degrees count clockwise. 4. Use text for every 10 degrees, but text on outside of ring. 5. Have ring around tick marks +6. 2nd ring around the text marks Controls: @@ -283,12 +291,17 @@ Order of testing features. 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 -8. PPI scope handling of shoreline - test by running for a few seconds + four fake targets: one small, one large and two very large with + 1. target 5 miles north of radar, 100 feet long heding 1 knot south + head on, width of target is 20 feet. + 2. target 5 miles south of radar, 20 feet long, 5 feet wide + headng away at 20 knots + 3. 6 mile east 30 feet long, heading north about 30 knots, full side view to radar + 4. 6 mile west 100 feet long, heading south 5 knots, full side view +6. PPI scope cursor - test by slowly changing range and bearing +7. PPI scope weather noise - test by changing noise level slowly +8. PPI scope waves noise - test by changing noise level slowly +9. PPI scope handling of shoreline - test by running for a few seconds ======================================================== diff --git a/build/CMakeFiles/radar_simulation.dir/compiler_depend.internal b/build/CMakeFiles/radar_simulation.dir/compiler_depend.internal index 02b873e..8060d30 100644 --- a/build/CMakeFiles/radar_simulation.dir/compiler_depend.internal +++ b/build/CMakeFiles/radar_simulation.dir/compiler_depend.internal @@ -27,12 +27,21 @@ 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 @@ -283,13 +292,23 @@ 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 @@ -328,6 +347,8 @@ 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 6132bd5..8ca0044 100644 --- a/build/CMakeFiles/radar_simulation.dir/compiler_depend.make +++ b/build/CMakeFiles/radar_simulation.dir/compiler_depend.make @@ -26,12 +26,21 @@ 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 \ @@ -281,13 +290,23 @@ 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 \ @@ -326,6 +345,8 @@ 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 \ @@ -403,8 +424,6 @@ 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: @@ -445,24 +464,24 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h: -/usr/include/c++/15/bits/stl_algobase.h: +/usr/include/x86_64-linux-gnu/bits/setjmp2.h: -/usr/include/c++/15/clocale: +/usr/include/x86_64-linux-gnu/bits/sched.h: -/usr/include/c++/15/bits/sstream.tcc: +/usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h: -/usr/include/c++/15/bits/locale_facets.h: +/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: -/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h: +/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: -/usr/include/c++/15/cstdlib: +/usr/include/x86_64-linux-gnu/bits/mathcalls.h: -/usr/include/freetype2/freetype/ftmoderr.h: +/usr/include/x86_64-linux-gnu/bits/mathcalls-narrow.h: + +/usr/include/x86_64-linux-gnu/bits/mathcalls-macros.h: /usr/include/c++/15/bits/predefined_ops.h: -/usr/include/c++/15/bits/postypes.h: - /usr/include/x86_64-linux-gnu/asm/posix_types.h: /usr/include/c++/15/bits/ostream.tcc: @@ -489,8 +508,6 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /usr/include/c++/15/ext/type_traits.h: -/usr/include/c++/15/bits/stl_algo.h: - /usr/include/c++/15/bits/cxxabi_forced.h: /usr/include/x86_64-linux-gnu/sys/types.h: @@ -503,12 +520,16 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /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: @@ -543,39 +564,55 @@ 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/stdint-least.h: +/usr/include/x86_64-linux-gnu/bits/wchar.h: -/usr/include/x86_64-linux-gnu/bits/stdint-intn.h: +/usr/include/x86_64-linux-gnu/bits/types/cookie_io_functions_t.h: -/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.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/uintn-identity.h: /usr/include/x86_64-linux-gnu/bits/stdlib-float.h: -/usr/include/x86_64-linux-gnu/bits/wchar.h: +/usr/include/stdc-predef.h: -/usr/include/x86_64-linux-gnu/bits/types/cookie_io_functions_t.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/c++/15/bits/algorithmfwd.h: @@ -589,6 +626,14 @@ 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: @@ -597,16 +642,10 @@ 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: @@ -643,19 +682,15 @@ CMakeFiles/radar_simulation.dir/src/main.cpp.o: /usr/include/c++/15/bits/uses_allocator.h: -/home/maallyn/radar-simulation/glad/src/glad.c: - /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: -/usr/include/string.h: +/home/maallyn/radar-simulation/glad/src/glad.c: -/usr/include/c++/15/bits/stl_function.h: +/usr/include/x86_64-linux-gnu/bits/select2.h: -/usr/include/c++/15/cwchar: +/usr/include/c++/15/ext/alloc_traits.h: -/usr/include/c++/15/bits/requires_hosted.h: - -/usr/include/dlfcn.h: +/usr/include/linux/types.h: /lib/x86_64-linux-gnu/libmvec.so.1: @@ -665,22 +700,12 @@ 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: @@ -695,10 +720,6 @@ 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: @@ -713,8 +734,6 @@ 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: @@ -727,10 +746,6 @@ 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: @@ -743,29 +758,45 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/c++/15/bits/codecvt.h: -/usr/include/x86_64-linux-gnu/bits/mathcalls-macros.h: +/usr/include/string.h: -/usr/include/c++/15/bits/refwrap.h: +/usr/include/c++/15/bits/postypes.h: -/usr/include/c++/15/type_traits: +/usr/include/x86_64-linux-gnu/bits/stdio.h: -/usr/include/stdint.h: +/usr/include/c++/15/bits/stl_function.h: -/usr/include/endian.h: +/usr/include/c++/15/cwchar: -/usr/include/c++/15/cmath: +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: -/usr/include/x86_64-linux-gnu/bits/types/timer_t.h: +/usr/include/x86_64-linux-gnu/bits/stdint-least.h: -/usr/include/c++/15/bits/basic_ios.tcc: +/usr/include/x86_64-linux-gnu/bits/strings_fortified.h: -/usr/include/c++/15/system_error: +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: -/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: +/usr/include/x86_64-linux-gnu/bits/timex.h: -/usr/include/c++/15/bits/stl_uninitialized.h: +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: -/usr/include/x86_64-linux-gnu/asm/errno.h: +/usr/include/c++/15/tr1/gamma.tcc: + +/usr/lib/gcc/x86_64-linux-gnu/15/include/stdarg.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/stdio.h: @@ -775,27 +806,53 @@ 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/x86_64-linux-gnu/bits/types/clock_t.h: + /usr/include/x86_64-linux-gnu/bits/byteswap.h: -/usr/include/c++/15/concepts: - /usr/include/freetype2/freetype/fterrors.h: +/usr/include/c++/15/concepts: + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: /usr/include/c++/15/istream: -/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: +/usr/include/c++/15/bits/refwrap.h: -/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h: +/usr/include/c++/15/type_traits: -/usr/include/freetype2/freetype/fttypes.h: +/usr/include/c++/15/bits/sstream.tcc: -/usr/include/locale.h: +/usr/include/c++/15/bits/std_abs.h: -/usr/lib/x86_64-linux-gnu/crtn.o: +/usr/include/c++/15/typeinfo: -/usr/include/x86_64-linux-gnu/bits/waitflags.h: +/usr/include/c++/15/bits/stl_algo.h: + +/usr/include/c++/15/bits/stl_algobase.h: + +/usr/include/c++/15/clocale: /usr/include/c++/15/bits/stl_iterator.h: @@ -829,6 +886,10 @@ 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: @@ -859,10 +920,6 @@ 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: @@ -913,10 +970,10 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/c++/15/tr1/ell_integral.tcc: -/usr/include/c++/15/tr1/legendre_function.tcc: - /usr/include/x86_64-linux-gnu/bits/mathcalls-helper-functions.h: +/usr/include/c++/15/tr1/legendre_function.tcc: + /usr/include/c++/15/bits/charconv.h: /usr/include/c++/15/pstl/glue_algorithm_defs.h: @@ -949,6 +1006,8 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/freetype2/freetype/fterrdef.h: +/usr/include/x86_64-linux-gnu/bits/stdio2-decl.h: + /usr/include/linux/posix_types.h: /usr/include/GLFW/glfw3.h: @@ -971,10 +1030,6 @@ 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: @@ -985,6 +1040,8 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /usr/include/x86_64-linux-gnu/bits/fp-fast.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/bits/types/struct_FILE.h: @@ -996,15 +1053,3 @@ CMakeFiles/radar_simulation.dir/glad/src/glad.c.o: /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/src/main.cpp.o b/build/CMakeFiles/radar_simulation.dir/src/main.cpp.o index 276626f6da95209591982327a26a4156a2fa2c1f..aa631057d064daded9a2dd29034aa17aa7c1ee61 100644 GIT binary patch literal 72832 zcmd?S3wRaP)jvGB9EgaSfLLRT8ufs|3*?Xx62+PW37qIb5rTq7Ld*qHLqd}i5?WLs z32+QiR9dyg7A^YPS8A=L7ARu4qoPu@irQ9G)I?NJyr32N|JK@jpR>*+L#^-o|DNyp zzIk#oGrw7T?X}lld+oLN?3uZxAUHNYF3vJrob^L1dS+0|$~z^B<}sXSoo)?e+P*kH z2|uDZ8NUJe`HKp}Ur!E%KMRDvd5SJf3WQ%gb_x!xK=>m@)S16+lvf?KHCRvGxx}(G zRolsdw)&)X`++bV81k~ZQs8^qzcvYsd{3|Mg}gS#)A2EN(d@7D9lPFNd~6V9XrGz) ze_fuGe!cH!5QkFwO8d-w%Q|eI@zsKFNW~4F<}c$yy|*ZQBk8saKa|p{ ztQ=~e*+M5)p!M_6dC>X40^u(L%^#!$!Xa-`Ctqp9QJ{G%pf>{H&DU|_KwIxXLQ`j3 zV_Ng`ahhG8>S@a_Lg1~?S>K4+R`bY*=a z6(sym&9C8{KwCjapl$v=fZLX>p#OaA&)r_oUOpf`-wqxMG;fIuH2>?OhK+%?@k{c< zrHKXh@88W2|2V0zY-=Fg+H~yLv4Yn9_7bE<_V>|wp!IdTrJckHzrlG0!ms&04}^CF z!Ugjc&{nV{u%loli5P5e>KpKUP07Or%MP5T>LJivurjW&c}Hq6_oiib%g4;UVP&Kk z%*G$y+S<|Z5)~uZ_AnQtV1+;2+u!yxDvdvUO=3aYp9n7qHzxVp{?x%}W8cEIKh4Ks zrQfb;-HL<2rf+&x+BMHt+Ba+h`0}`vg4WM(zJZDyDBBz;yJ4A-z#+f=`_KH%+u{OcpBE;q@ji^Js_^Zj zQVViFYS`5_`JT3d6_Jv*=f}sRF1f(1HuT80_|#``2c`*Mzl4n%b*PZG%%|Rjr_d*t zCkDcMC!#qA+OD6!KH)U9;?Mc|q?vJO*E0#pZ_7*4+?uzht&baw_8ylGmk{NnKr0s1 zoK(_{WJocB-PECq2Fp|jt*?jdK--_#9JCdzrKWYDU_H6BK>G;%$L9muQ$hak> zslq!t=Y0*kGTeQz+Q~c11LqImX3{V$&|b0kI)AbMdjB+k$@NMgX z1xJq^z3_#o13JCXS_l`AZVN*M8Np=B{`g zEI4MLYgvt(+s9-y|LcS~DRHm2k73d!V`(>VNiQ;@V7MY_^!CIw=(UCQ9j(L^RN_7e zejPervTjum=$iaj!%yA3-9Nc7{5Pt=T@)Ko|MXNp_zUWx4%_{L-oDDj4*TttVs9$# zioAUf+bOtWr*AoIU+@*MV$|DVyZBk0?j(|Y?*JTr3}`d%h@XP0sH<$dNjH9oO+K-0@&J=kP?;Et zf&{J}Q=2NBT1N3yplw`Iux(sQFt;OgG78fx(A<%TD$M&j5FVGbWf`jWOVnycu+0t* z*~xwB=D=EX611He*mNvDkh{Z%oT!@CW9(`vL`e_W1?YBz-n2lt$eS97I}*f6O5iC@ zM=5iGz=s9waXSL-qgt6k`#|0+UxV-_J{+!0 z1XIEQOAzi?824Hr>`w}YuS$VVGp^gh{u{Ab^9K<1Qpi*6MNL+d9ruINMudz5*gQO& z@{YtkmAa8JNr&xeFxM#^Fn2atP@(~J-uMkU)iKEPVopv?##l9yAla0skz|u5AEn6A zgK2VP3o^8;DSJSs8wZ3L(Am$)8Nv$AsYvoVlAv|6Aa9|=qJpPJy+Uu4I^B466)*XV z(1SI9kcQaN%f34pE{E3IXP_F+MewRkL&dM*&y-@J1n7BFp!ta1cnSW;HDuUN6j)2B z)N~0$hVYoA?TPU)&lmv$5Fm}LcuSzQBeds0dZ0Z-T^onMu#!lY+ZwCB@Cv?kq3o8bF z3gwz8<6!3#R5cOi-TG9!^(ADc`_(|W)3jrM$ri1!yw1Q5l;5Ui*tR0^2<_VoQ0xK= z))p>E;@CKyxUg+aN-gkxcp$lQ8Jc?>l$}yY0b}lNyZJQG1TU@zujb!@i~WQ(dP)9; zs1vH3NvWWzdp6LP0F57;Fu|Y)I!ruT*j^A948KqHf;u=TTT_Eo7~Wpkd^FB(A%8Kx z^~2DKM2aX2r_r!OHMRx-C;(-9@tD;5(GUc|7lcVX&*TbO>I=FR;Ah|!%%uXf)WX{s z4s{qvD5+s^#~S{q21ify@-OLipv7E@7U(hPNA;1jsEC5kBFqNCdnX@TNFun8&jwrBtQHvg3KN2B>a(yCCxs7 zV6^YXg|Sg)UqqSL2ik+)j7XHJ(yvdZij9pLxvpXB8A>b|O2+ZS%r6feJC+}QPfK)A z?Wv8B2BOZ1LKadI#hnzisE|eJa~oHHJT~@f#=`8yro{N^09sD#({{^l^svG9QGE(? zU$I-Z-~=-wh2hWa^h1T=mwm^4pI6!kJ1S+6E227kV|;UGM)Q#q8q)*!fN+1HJu$Da zJ-E$k^A9|1pI4feyB)*b^Zf&IcfbK}wXZx9XxAliYuq=K051AM(iz-xk=KhP z@8YP~n||1yx(&Z~;Ia=P<(oj^3-Q0)dqH&mpwQlU21aMi2PhD<7k@z`c}Nf_d!2a0 zAr`h5Z6oM9szCVJ)8Knd}Z#RV4 zrG!22f#o1-yK|``#g%FKB=(dJJH0E82u*K?-WBi%T&{tfuYDf+Eb4stKXU9>O~L%Z z4@sg~iD30Nrp6I;k)_k@w$s1DrK1r->HwjZe)Fg+#Qz-pFQ;A<|MNQgd_iSESrIKz zj{xGJH{DK0kD7A2D$f)g7w-i<#jf-}zw@Qfj~y!{&s4|(0h)Ttn=m${DMFX8Vx|c& z3s8_BXxWd8JBS-%;*LbdL7VSIof~~{_pY?TVxZu-ivRhYmBTkg_-_?T56oUL*T`czY)fcCzi^w449bmF$);B6?MD-wm%I_@dp5s}HX(*!q z*&@de(2aF3`aDr|Qs_76h9Lv2EFuGG`m;P{O2o(DOKT5s{j{7>E?FSQL-! zXsOB(s*L1F3T^0~;~v-!%Vx|=D)c^e5mv2poUY4`hKzR5K@BE<8>)-iDjOAg`0a7y zbHA`#yU;QzYzRbrr`=kL5+JskA|eYt9|r%NW#Xn-owN?5z694tnd@Dr0g0x|i{KUL z?4o!N{JI8%g2yA^7ftsU^qtXkIfh?Uj;?v2FzKRlP^cSC*HeD4KvI(~nqPH{{5|D& zp-30a?;*_eMDyz@T{S4U!=p?^|3Li@CQE5L7IUYQeIL?fND|dXc%FB9pnZjx<{N@= zz_V#w72vugZ`pw(jBap*;XuCu@UZYx^dCM>bYm@EiUoZgcE52ccE8@(!6?)iIk00~ z2Ci8YIX2P3j&TF4kn;f_O+hnXMM%caEN?AEhkX^?uLm&SzCQFbU{{-vk`fP)~51t^{NZKDS! zj85G#+Pj+_&D6KUqmlJg-A6#r`N*=^n{!}{(ighPdERPj5Hm?*+d<2Ea_XztTaB!W zKt;)+PV{9N{;KWI?b@{~zYX2hUw2+|@4fe)*65)#WRhZvuXQ^W0vgSA*R;{FQRep% zK7mJH*v3>uXsVU~V4e(q9d&wqWxjq;)di|&N?%>aoEm~hEdp*Prn;R%{0v->N}0-c zkYX~@_f(}bxk_(Aa|d@_rKn0}y{4*^6}OG{CX7zoG5P{BgYan5JG6fQQ3TzWakuvj zXZ=BZ6diT&zi04sK5`g*g!{L%_-v%_Nj=Kq(_r!B@Tc>@YL%3M>FYY3V2`wf#&p} z-F)!IlmZ!tJ!GKwKo!QDnAVvRfL&wuRdrJo#CC5d1>sKQSVZPOm75A|Cv79*8EYN= z!!^W7xCRMK6DWSh-+Z*pzU@(IQFo(mD9(+;Ha{68cYTu zVn*@R;II)66?=cU7fVEmKnoEgJU;u7ctp~^ zi&LHUVv}}kVr*j6P&%dzX%66segN6ZN%2gC2u%)yY46a;-x7ZwRt8V0j1W3)%z zqzG8}{_#5aYOCugdTCBgLq0L~Q+HilL33M14HToq|4-pGzpn4is%iBFA2g9MhnKRU z1lqZ?3&0$gpp-D{d~Z4aFZC{0r|3tx-DSlD0Ax9IH!-a56k_<-mcJkor!);i6WxXV z*a711EqTs8KD62M4pGCW8E|xmMc}|Tn-^?f?WLR7$VS;eS_s!V0GjbZnhwxX+s5x{ zgfwK?u(lTOTHxHOlE582=|TX$RW%i)M~Bo!8L~g#5&!78vwn!7a3UJd=E{Iw^H!x@ zz18l22*)>nQkeU)-Levb?1*pfcqWGK6VPq9`*#xEfx_H>+ATXl=WpH`wpi)?#mzQfLPu+>!;ZLWGPsG0h z=ntJW>X>JZG1QF4O{BQaVV$}gVY)0u2gixo;gA5h5V-|%@>?WQuuWx- zVyMi6xu4jrbKq{+Bbp|U%4lKPy3xy;X{{9T_ZluM7?|?eLlg^cpvPkvt-{tzz>w{N zDvEUK#*gY5GoW0iXjydOOtrV30Cvq}*KPQhs~Upc{zG^Tvebvc9~G(XI^`0aQkBie z4w~YIFq7zB(kHX&g!)J_=_YOo)A4_vcM6#n+5ik*C66`tq61CKkPmLo8aqd-AAL>6 z{uPXPhu!}O8Sz(a?2|YM#c(-I5Z5vB`yk$?iT}kGKSvRldvjPHuy}AT``X|9btak( zE|Or#x|n82Ai#8E_uAr-4SI4F4p-V}3IVc$nRYs?M@8h-4{!0#}A zZ^HU8x1)Hdb2A3$hZ5uJr*=9Ky$zybZxKkY2QPS$H2jC;_>UggPTz~`?B}NG$eZp^ zsE9$kc=XYEASy^?3!l2&R3IrZOw=#YakMKEeH%~)l*+Pf7M39)2jqr%UIJZro= z`66yylBlb^yVU7x-1q~4lu;T5o5Lh@*)gX~m7- z@!KcaXX|wEYSzsSo&S7ri!{+kFpNeOVrWbiPPs^zNM=g{kS1Gyz@b%ph%8f zE4d@`>k)Sp$lYtVlq9i}p+P<-?x5ypkY5wG=R;`E&)faKq{e?Fkh{fhnWc!Scv0fn zOnd~yFWCJ*CgMX(+-5jOr>e-M5Z9NX1a3>J{g_ryI(rym2GV)_w*4s zuj>Sk=w2_F)T^%iZI`N>AO5ym^r{4ySPM8%5VsYXWdh`{zCKr18^a@SX51W!2>f1#gP+G6@ ze-sYWj<3@1$Q%1U-{Wa53E+nd6L`kU9=5r$0cR%OEk=`p?}ueY`lP=ewl{B%vx|1)3isRCn|}O45)f91 zn*~!p!S8*D$!0v|8ytl=l&+>uj&8(kvxjj}?8R>*72iEgNTjyh;++Z2Mn)rc>$F~g z7i^_KokuQj1cv-GIx5kF57P}gikJ>7FWzJi+iNd+9u);)H*hRZ-LpN6d{Waud$AW8 z<5G(b^Qp*Mb3g~FQWbYV3tIWbyH)qDG+{4(7_3Q~i{3-ngCq#l@gLy{7kehFp%6WO)Ecn6mj*voD0;QWuV4AgnVxc_HQ7n{4 zClmBZ8l9x+6Uus?Hvl;y5OiN;55cW8-T+Npt5%2hgc0Y!=W$> zhLk~XPA76F_23YzhC2M=&HiwQf7APC`oGwlZwET^!>{;p|IJ?X2-KJ#-o#TI2S(Uu z&ZmS6zI>0gv*;ce`hqWM)s(%c1;^o?&D#?TzjzOeu1;L=<*ygTS#$b?|JwXzS>tn< zSqy(1{wmOh0SnDD4pN4yw7S!u&01L*+q_N(N6I2@t`INXnKM8*h4lb-633O?INPRhj@;9n|Lnurh|xLa#Apu8tM(YE;K7* z&zhzsFG+!m=XulAj00Dam~n{9zgRg4`?eV{8k$MXDa`%IZlUhd>9_RSqu`Lw*lz{H zpRnI541b7w91)MDmxRH0rI=f|+#&&BMv5D$!nypgN|e7mj5Yu_GyT}#0&P80(^{!x ze~Vcv)tD+4K?TE|dXZFM)4qX$O`U1s%_^UmrKQHJji)6mCn3rRw4s>mD|W_n8U zn8tU_ZKrCEKfNi$2!E9%n9YG=&` z9iWCWwbiwCR>RaQD=X_OLRLdjMN_DuuELsAQ5LGLyXc~l@g;Q?rPbB7WhJGvXIIpe zTVqOVYHCAiK+DtWnIHIA6Y6Sb)RoRktFEfK5$Ebc{jk}yt4eODD6OlinK87ou5?C^ z7v@ydg(4S15FnP65vCaz9D7Y{IVYBum)4~fRn&*l-kQHWZEQs;NnfAlyD;0jrmCjA zwlS>?l7@^H`dH(F{`^=TM%MbW+SwH)H`F%Nl-I{f5OXC)+ER51MGsY#HB?u`rt5Y! zCN1fvuC!)GMG2|Lk)`uux0IpMx)~Lr9#WYL-BOe_)YaG4#Y#xoXq@RA#!_8ZR>F($ zR;DUj>##mle$hqBGSaFk|GKo$%+i{)S*1-S^;JKqNFQR--B4OzRaR0TqLN(%d#k}= zLs_V*wkEBzu69;hO+$5cT2*}-S<;-+>Z)>`a9Bfq-7r*0UB$4<+L}=PFeIx8!Mul6 zSKUxSTCS}b7K|KDDy^x%aAL)b21qkB6sn9^kyG;}QM2NlOr7^k$ErZkTtE*^B=Y*u zhKpjJv}nF*z7@hUKlQ{$+fDP?2gRm1iS9vAZqa|sVwfNj6RT7aO|avQQqw{{TEvG= zJ#kP97}+O|-i}3$;ym)u1McBQy(_Kzj7pvqBZoO5FC4oP?feKcEq8Yk6iLn42qEdw z47F&DqDmFl2AXk~gcXGSe|n?jl!%B?)(3vWIg&)npa{;1;<=S{f{;C(FCSPObMO2B zZrh1l=?50XoOY>YmV%(`dcNZ*k;}Uwx!sU+yCJ7AVme#Z$s!O7rRtFu1Wv+mOBabw z5FhLD*#Kp3{>b`L6q({*4%tnpOhs1R9s)nIL-fot=nHoqxLtGK;O&5p^vOK$>G;nAVSdG0D~#R%(fhOh&dAZW1MV_ zw}X@I54{--e~yJPI@!BAXCynYgYGx-Lh zQs*X%pMmic?&H}lhj^f{#+yfgE>G9%3`$;ik?qB*se6kJwyox67Xj?|alt>tnmXb| zOVre|;$Y+sAqwBM0~aamIDp6U{yl#(0xS(#?VYW)J0E*494$-6El8;NU?hX^-mc4a zIXa9Iy1qa}e(YFWzY8{@{yXA-ov^UC)!wTNvn|Ks62FHz73@zR4s$4aKd!}N?T>#X zZkfkglQ;w?A15Z@m>GavzC?0HI`5}1kM}G{v0jY# zd}dp3CVIMTYo*8Y58HazQ zX<^&C_ax8JWNXz)o==ml?I(GF{Ou%9XR@{LB+nbkoY&P#oIBz+BzhhkWF1KK{AIB9 z3ytJj5smSE_13ixpvi@}XvvKPOS+Asd?jCGC zaF*w`!PbXod0Gcscb)C|dXV+cvpt6gSu4-+yg!Jg8>6Iq$dmpq#_~^kJTEp{TYI-A zywPaA-N*CuIo3ygJewP==T1Bg7ml3hd9BWB?mP7U2J6|ro+p~Dm-~9|Z?gVjdw$ns z{UXJ4w9$Go#j~i%I*{VIy~%3s=eeiJ`ei@QH+9w@`*{}ETL=4jT0_?2{+`=H)~`^G zdaI+q=ly!?mHwW?_12gDJzv*b%TD&(TW>vnvgd(%>zR{1kJMWW26)!gTTcz}JPDcs zp6&J4J*RkHsJH%nif3=Vb>tM!vU=<8?|JTNu-1Lgv#7y(=v2?`4c5L>J#U4qW2br! zgsi($J)efGSHJIheU5eH`<_=CtYts&>}#+d|AD8g!Fpq$=aUBOUjse=YOwA)-P1D1 z+IhOCeU7#F49})U>zlJYo13ir&hd0LS?z0Hkzbyml@p3j=BPtW}w zL5~dayjy2IF~sw7$a?)ehJJB@=XVX(gBN(V&#~^ma4}J>AL@B@j6mLhc)924xz_riXU|;gZ$Z!NbFKHsd!BEwTCeczYqB1_ zV(#-z)(cnm0{@RD?u~n;$@+4#=b1+9(W^a&=2#D1YE)U4!-IwVp@kT6bROd2p_^`Z~{_=UUsZ^DLNa z9lUN0vEF!nALO%Xn&;NJ)_c=Dcg?l#FYz1=SvyKRcZaOz>7JD#>$lTAzYSUMO!qt< zvf4^Le+gOJN1LWh2f)kwrX=A zZg*h4;zAEo?Z$Idn*;j!Dbwj-1}&v`AiVAHXgnyDHokQ~Ikvap+f0{uMSJ-mJP7r9 z$S!Pazymvx$&SMCEGrQAkMVdw5Qp@zQ<9k2knt6jN0eg02c0Nz%<=XQ5lf(X&S-%For+x zM2y~XVcn&;fWsmhnV;99S*iJ5UaA8H+UZ{huv&qhPKd0$(f45!36pz zW>fL(T=7vg*VJz{-@LZdv8u0lH-69A>A0PHJ#J*0o3v9|!8ku%C7<#f=3YUHo3dVe zz(4ZsbXs>B#LBL8x^so+^pF*&@!JEQw!il*P4XN(sq~SLi#gQ(m;w58DGivrk^*wNQ9mTF&bV_#g=g>k=8^>4CL< zAu<-{MYFhIH(F9~H_bq^zQ~#|ugqy$Q1wAf#o%cVs51quXvXHlb+|u4Re<3D)ehY= zq`>CzBg7<#s>KX1?9`$qc2p%3a7;||=sHc=(g`nop#TYDZtzZLg8)aYc*mkS#>#=& zSP(%(ydD`5C}w>zt4z6~@_Sw$$ECvrsTXBbGsLv=3oLP$fP{lq`SFTrOLeaN&>&Cd zpcNozgiQFql*Nv!4j5+H)hbU=sa2h3z6dLINLs*zJwh;2 z4hscigs#$Ynxs^!Dm9_SI}jKeExlf%vJkW3q&lsn<-GQY?pwklo}~+vH!XCaDfa0| zL0Y5ixy-Z_!xTd$MXtEALK_LD#CC$jPFD}IN3JNU<=h&W(FUe^Hp)va@=&~p1*n!X zQ^Sj78vr?|$){qE>2LVg0PH0P5|gwv>R^UJkj##@S8}*m)2&7lK{7sh4GZW*%*_$0 znhC_10Zdbnm13&B8-?g(MYN_41DV)398$xr;D0f#i9k5dOUdD1U_dYBF{Ygc$X07i7MJ4(npSR+O) zw1_<7uJQ01ikffqN4%)1nOHrNxgJdWI@YBkAHXON8+(3uwU?geq-LxAAZ%hMh(MuM zCQ%LD1Ayu=gq&d8hwb#Y^D%XN0j0#FRi-9rzmL=6uJvv{n99XPQ(EO+1%N1M?wOb- zftj6-W#Gt&tO%TNPXL~7IiD2c-e1ZpHgjZ&l`y!n7FRgQ6g&lwJ6|cfv1!qf2~9hL zoSp$wcP!NsGZujKOJ0L2pE6g*trm7tYgvZk@O3oDl{lu2R>Mx$$6&I8RlrRPAXgZq zY|$EnM6jVL9f~n`3}p4Ql}yTC(+S#S-zjwD`KG?HJx67&0UbogG!gz|5u-?E%sSRa2C$UY z3%6P}PGJKa7gDkgB!dkcL9S{6Hy;pc7|{A15N?R@-@wP_@+vjU28y*2idB5f6nqX|tYI1yK}h5gRm4QzA5Fm5jQ2BM$fa zu{9KF#k)BZZSQnKjq&d$Ww|QnE>Q|P=F24FPIZC2CLJ=4n83_?bt`D|(L}rTWJC%y zV@K{6h2D=wxtbSmwT(_h=(7(|5?1%a>#0>l)3BbfA694}Sig<#(dW1Qh*t|B8J7a< z6sC~9K|L$jmHP28I{0*uYv0cTVtpo^?BkOb?|e|x`QP>V5`BIM=M+6toR)!1S9n+A z3gfqVP66SRbvH^Ex=PnhAbWP)RXu3) zEl_IG!VXg$EK~@z;jss$0`##U;A>=iAE>%#&a$etH=B6vO;>d7%?oPnO&AMnB5Q9hMiVmYZm1=i zbvN7!*P7Ku;b*V{C-4O(LYymbwulutc!~xyx%qL=W0eh+%u;J`ILbz7(?k$97LgwK zFqS>kh&go1wSFi5Ypi2PT(`O19hY;t6I@28X;)b3d(n+D9jlRjq(5MqaycGZg}h zTsL@W#gdVkYzmH_q=!So4Fr@NCoEo16WYxiyz@ydp%4j4hjc^beC1{$g`z+fjzJqH zEQ}2mOLNK6`r7^C1L4srdL|}tv2x>f%YWly07R5JwW}H{8fg7W5XGbQEcsl_&yOq78k4MUqTbH^c_#_tJGcnz}k#c#2r8CXrYGX<{rZUz7J%#K8;uei*#syO3r1W z8Yf`fz@vR0+h<{L!ta8D`2=xnbA#g zm6-hE%K_kgycb`Z7fnh!l199yN*tQyOElod;|M$`G2OD& zC;|;0x$YwgQAnEe;C!f%sj`sdHS*=vG0IUe5 z25!(5-n~e`qpv7Rrz>MmAB#Qhz^Spc)yzUyf?iJt^^zbF^-?Ch=uRPQVNSIf1)06E zFejbRsW>#LC~^?iWQO20*LoysWX6PW%Q|}a1$0De)XG*92N1Quw?~zZ)Q#)#$6NtH zEQnkNo#vy(--A7wU zCQ~|$H3{sF*IxgZ^h4#0(T@)c!a9uM(W8H)AudKf3Qc;@b`rBl``g&Zw=WR}LZr;@ zZbj6%X;t0ail}iluS2nlu4eUkEY)is3S#P&7hq%Ir;6QB!xa95hTiVOx=F=I_QGdzg0xhIb#NWBuqY+5q*7u?a_<*k>i#qG+&i9PQmUJWJb-H<869IM>S|ozMSWV;V@|aS3IELOh{viuzueY z`g58=Mk1Om?!hlXun7?<^ldqe8N zY`Q>-jTCI2y3j-y@Y5HJZvg)ypo%&wBVpfK#^WUGwiFuLY9UF)iz9ItA|e4wI3Fi^ zd9;$sh#IpvT3aPv)MvMZQ?(&lIH22Re>oM>m#t>ogL2vS&GcUWEK5HaqQgWGY|v9K z#cD0HYEZxjEaWzmjy8ivg0@9N5xh_%w*633E64K>L-*Ua)}Ue9!v;ak)|~#pFQg+h zNHtB6#IL+mrNTwW96yFDOZ5~k-bJe4I0`bJ;Vf3q=Yr;tu35CisM;_UBv0syv-)^G z!XAd_E5qCD#qZ*6>h#n-R-EWZ2yth2GNw4Dp_KM8ZY}oWesFJe%l3-CF#Ol~@t1F4 zTrAXd{O6z!qT<$Ba24RcIG+sc^jrHRQLa7WAe6^wj2*E&6ep`ZLVI zDdqv1h1>A@XJpB~0Q==U!vijw8_C6?3)mFVkdkh>;Xl_a_91T?v_@Sr(gH8MstL@qS7(VL@zVJn3<+LOxMF4_aUoQ z-mjT5=AD{YwH}Gm_`!#bXc77y_h?!jIEh%F(koZA@@gu-sd!#VDMnGQM=r7L5$|P8 z#haTF=^cXsyLAf|9hoL7?3l^MU z1C$XH&ypu}CB~{XwIBDkR3Mi41~48D*e$a$B17T|`Ul~Sn<(C@tr5vwJ6PDKJ#>$K zEBPwZywW$%=?hk-!N7o&zp#gO&Y`>R#XPrsJxvB&Pc5^UTBd5oi|O@MzP9!c;*uIE-OpYIJwksh zBHsdL)xb0nD5T>*{GMs2A--{E?)74df*Ne3oob=TQG#Cq{-Jo_Fm*hs0MiZlZ?c<$ z$Im!NyE%{Mv-HWr!%F{LdCp3;QJIS}K@C3abWz()RNII(=A#gmmGAx#@~&2sld!iu zQ^*kKtt(+FmJ)#VRxV(qXz-c*PGj(nluspNzd)};fK8L``Hm*0dX=+6)Rk(dBP^SO zTW-a8B8whJpSFY7K}^BxtBUb1-fk{HO)$6cbS1w6a2lkEY2_T

k+u(N4#6I;NYM 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 literal 56280 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 z⪚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 XgGqNEmjB@&YfAd;fgyM0Ho*S{)qT+k literal 113760 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 W*FwkROH}^9`bR_ADl&+l-v0v-xbcqw diff --git a/build/shaders/ppi_cursor.frag b/build/shaders/ppi_cursor.frag new file mode 100644 index 0000000..e845509 --- /dev/null +++ b/build/shaders/ppi_cursor.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/ppi_cursor.vert b/build/shaders/ppi_cursor.vert new file mode 100644 index 0000000..bd444ef --- /dev/null +++ b/build/shaders/ppi_cursor.vert @@ -0,0 +1,5 @@ +#version 330 core +layout(location = 0) in vec2 aPos; +void main() { + gl_Position = vec4(aPos, 0.0, 1.0); +} diff --git a/shaders/ascope_graticule.frag b/shaders/ascope_graticule.frag new file mode 100644 index 0000000..e845509 --- /dev/null +++ b/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/shaders/ascope_graticule.vert b/shaders/ascope_graticule.vert new file mode 100644 index 0000000..bd1a394 --- /dev/null +++ b/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/shaders/ascope_graticule_text.frag b/shaders/ascope_graticule_text.frag new file mode 100644 index 0000000..83e1f3d --- /dev/null +++ b/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/shaders/ascope_graticule_text.vert b/shaders/ascope_graticule_text.vert new file mode 100644 index 0000000..a27e74a --- /dev/null +++ b/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/shaders/ppi_cursor.frag b/shaders/ppi_cursor.frag new file mode 100644 index 0000000..e845509 --- /dev/null +++ b/shaders/ppi_cursor.frag @@ -0,0 +1,6 @@ +#version 330 core +uniform vec3 uColor; +out vec4 FragColor; +void main() { + FragColor = vec4(uColor, 1.0); +} diff --git a/shaders/ppi_cursor.vert b/shaders/ppi_cursor.vert new file mode 100644 index 0000000..bd444ef --- /dev/null +++ b/shaders/ppi_cursor.vert @@ -0,0 +1,5 @@ +#version 330 core +layout(location = 0) in vec2 aPos; +void main() { + gl_Position = vec4(aPos, 0.0, 1.0); +} diff --git a/shaders/ppi_range_rings.frag b/shaders/ppi_range_rings.frag new file mode 100644 index 0000000..e24db23 --- /dev/null +++ b/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/shaders/ppi_range_rings.vert b/shaders/ppi_range_rings.vert new file mode 100644 index 0000000..5413791 --- /dev/null +++ b/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/shaders/ppi_targets.frag b/shaders/ppi_targets.frag new file mode 100644 index 0000000..64d95b7 --- /dev/null +++ b/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/shaders/ppi_targets.vert b/shaders/ppi_targets.vert new file mode 100644 index 0000000..f25d9e0 --- /dev/null +++ b/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 0cea2e9..a8c5f9b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,8 +1,12 @@ -// Radar Simulation — Feature Test: 1, 2 & 3 +// Radar Simulation — Feature Test: 1–6 // Feature 1: Initialize display, draw scope boundaries (PPI circle, A scope box) -// Feature 2: PPI bearing ring with tick marks and degree labels +// Feature 2: PPI bearing ring with tick marks, degree labels, and outer label ring // 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. +// 5 s hold per range, 0.5 s slide animation between ranges +// Feature 4: PPI range rings with rotating sweep and P7 persistence +// Feature 5: Four fake targets with size-based brightness +// Feature 6: PPI cursor — range ring + bearing line + intersection box (incandescent), +// auto-animates slowly (range oscillates, bearing rotates) for test // Press ESC to exit. #include @@ -22,37 +26,47 @@ // ─── Constants ─────────────────────────────────────────────────────────────── -static constexpr float PI = 3.14159265358979323846f; -static constexpr int CIRCLE_SEGS = 360; +static constexpr float PI = 3.14159265358979323846f; +static constexpr int CIRCLE_SEGS = 360; // 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 boundary +// P1 phosphor (green) — A scope static constexpr float P1_R = 0.00f; static constexpr float P1_G = 0.90f; static constexpr float P1_B = 0.20f; +// P7 phosphor active (blue) — PPI scope active display +static constexpr float P7A_R = 0.10f; +static constexpr float P7A_G = 0.45f; +static constexpr float P7A_B = 1.00f; + +// P7 phosphor persistence (greenish yellow) — PPI scope trail/fade +static constexpr float P7P_R = 0.35f; +static constexpr float P7P_G = 0.88f; +static constexpr float P7P_B = 0.18f; + // Digits rendered into the font atlas: '0'–'9' -static constexpr int GLYPH_FIRST = '0'; -static constexpr int GLYPH_COUNT = 10; +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; +static constexpr float HOLD_SEC = 20.0f; // seconds per range setting +static constexpr float SLIDE_OUT_SEC = 5.0f; // slide current graticule out (up) +static constexpr float WAIT_SEC = 2.0f; // blank pause between graticules +static constexpr float SLIDE_IN_SEC = 5.0f; // slide new graticule in (from top) -// 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; +// Feature 4 — sweep +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 head (°) +static constexpr int RING_SEGS = 300; +static constexpr int TRAIL_SEGS = 50; -// 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; +// Feature 5 — target glow lifetime (s) after sweep passes +static constexpr float TARG_PERSIST = 5.0f; // ─── NDC helpers ───────────────────────────────────────────────────────────── @@ -286,6 +300,14 @@ static Layout computeLayout(float W, float H, float marginPx) return L; } +// ─── 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 1: Scope boundaries ───────────────────────────────────────────── struct ScopeBounds { @@ -299,6 +321,7 @@ static ScopeBounds buildScopeBounds(const Layout& L, float W, float H) ScopeBounds sb{}; std::vector v; + // PPI scope circle sb.ppiStart = 0; sb.ppiCount = CIRCLE_SEGS + 1; for (int i = 0; i <= CIRCLE_SEGS; ++i) { @@ -307,16 +330,17 @@ static ScopeBounds buildScopeBounds(const Layout& L, float W, float H) v.push_back(ndcY(L.ppiCY + L.ppiR * std::sin(a), H)); } + // A scope bounding box 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); - 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); + 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"); @@ -329,8 +353,9 @@ struct BearingGraticule { GLuint lineProg = 0, textProg = 0; GLuint lineVAO = 0, lineVBO = 0; GLuint textVAO = 0, textVBO = 0; - int ringStart = 0, ringCount = 0; - int tickStart = 0, tickCount = 0; + int ring1Start = 0, ring1Count = 0; // inner ring (at scope edge) + int tickStart = 0, tickCount = 0; // degree tick marks (outward) + int ring2Start = 0, ring2Count = 0; // outer ring (encircles labels) int textVerts = 0; GLuint fontTex = 0; }; @@ -343,33 +368,46 @@ static BearingGraticule buildBearingGraticule(const Layout& L, const FontAtlas& std::vector lineV; - bg.ringStart = 0; - bg.ringCount = CIRCLE_SEGS + 1; + // Inner ring (scope edge) + bg.ring1Start = 0; + bg.ring1Count = CIRCLE_SEGS + 1; for (int i = 0; i <= CIRCLE_SEGS; ++i) { float a = 2.0f * PI * i / CIRCLE_SEGS; lineV.push_back(ndcX(cx + R * std::cos(a), W)); lineV.push_back(ndcY(cy + R * std::sin(a), H)); } + // Tick marks pointing outward from the scope edge const float majorLen = 0.055f * R; const float minorLen = 0.025f * R; - bg.tickStart = bg.ringStart + bg.ringCount; + bg.tickStart = bg.ring1Start + bg.ring1Count; bg.tickCount = 360 * 2; for (int b = 0; b < 360; ++b) { float brad = b * PI / 180.0f; - float sb = std::sin(brad); - float cb = std::cos(brad); + float sb_ = std::sin(brad); + float cb_ = std::cos(brad); float len = (b % 10 == 0) ? majorLen : minorLen; - lineV.push_back(ndcX(cx + R * sb, W)); - lineV.push_back(ndcY(cy - R * cb, H)); - lineV.push_back(ndcX(cx + (R-len) * sb, W)); - lineV.push_back(ndcY(cy - (R-len) * cb, H)); + lineV.push_back(ndcX(cx + R * sb_, W)); + lineV.push_back(ndcY(cy - R * cb_, H)); + lineV.push_back(ndcX(cx + (R + len) * sb_, W)); + lineV.push_back(ndcY(cy - (R + len) * cb_, H)); + } + + // Outer ring (encircles the degree labels) + const float outerR = R * 1.18f; + bg.ring2Start = bg.tickStart + bg.tickCount; + bg.ring2Count = CIRCLE_SEGS + 1; + for (int i = 0; i <= CIRCLE_SEGS; ++i) { + float a = 2.0f * PI * i / CIRCLE_SEGS; + lineV.push_back(ndcX(cx + outerR * std::cos(a), W)); + lineV.push_back(ndcY(cy + outerR * std::sin(a), H)); } makeLineVAO(bg.lineVAO, bg.lineVBO, lineV); + // Degree labels (every 10°) between the tick tips and the outer ring std::vector textV; - const float textR = R * 1.07f; + const float textR = R * 1.09f; for (int b = 0; b < 360; b += 10) { float brad = b * PI / 180.0f; float tx = cx + textR * std::sin(brad); @@ -386,11 +424,8 @@ static BearingGraticule buildBearingGraticule(const Layout& L, const FontAtlas& return bg; } -// ─── Feature 3: A scope replaceable graticule ──────────────────────────────── +// ─── Range configs (shared by Features 3, 4, 5) ────────────────────────────── -// 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; @@ -405,6 +440,8 @@ static const RangeConfig RANGE_CONFIGS[4] = { }; static constexpr int RANGE_COUNT = 4; +// ─── Feature 3: A scope replaceable graticule ──────────────────────────────── + struct AScopeGraticule { GLuint lineVAO = 0, lineVBO = 0; GLuint textVAO = 0, textVBO = 0; @@ -412,7 +449,6 @@ struct AScopeGraticule { int textVerts = 0; }; -// Shared shader programs for all A scope graticules (uYOffset drives animation) struct AScopeGratProg { GLuint line = 0; GLuint text = 0; @@ -436,10 +472,10 @@ static AScopeGraticule buildAScopeGraticule( 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 gx0 = L.asLeft + pad; + const float gx1 = L.asRight - pad; + const float gy0 = L.asTop + pad; // top of signal area + const float gy1 = L.asTop + asH * 0.80f; // baseline const float sigW = gx1 - gx0; const float sigH = gy1 - gy0; @@ -449,7 +485,7 @@ static AScopeGraticule buildAScopeGraticule( lineV.push_back(ndcX(x2,W)); lineV.push_back(ndcY(y2,H)); }; - // Outer frame (the physical glass plate border) + // Outer frame 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); @@ -459,7 +495,7 @@ static AScopeGraticule buildAScopeGraticule( ln(gx0, gy1, gx1, gy1); ln(gx0, gy0, gx1, gy0); - // Horizontal amplitude guide lines at 25 %, 50 %, 75 % + // Horizontal amplitude guides at 25 %, 50 %, 75 % for (int i = 1; i <= 3; ++i) ln(gx0, gy0 + sigH * i * 0.25f, gx1, gy0 + sigH * i * 0.25f); @@ -469,11 +505,9 @@ static AScopeGraticule buildAScopeGraticule( 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; @@ -484,12 +518,12 @@ static AScopeGraticule buildAScopeGraticule( 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) + // Range labels at each major tick std::vector textV; - const float labelY = L.asTop + asH * 0.90f; + 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; + float x = gx0 + m * majorSpan; int labelMi = (int)std::round(m * milesPerMajor); appendTextQuads(textV, fa, std::to_string(labelMi), x, labelY, W, H); } @@ -499,15 +533,11 @@ static AScopeGraticule buildAScopeGraticule( 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), @@ -535,20 +565,9 @@ static void drawAScopeGraticule( 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 +// 5 floats/vertex: NDC x, y, r, g, b static void buildRingVerts(std::vector& v, const Layout& L, int rangeIdx, float sweepAngle, float W, float H) @@ -561,7 +580,7 @@ static void buildRingVerts(std::vector& v, v.push_back(r); v.push_back(g); v.push_back(b); }; - // Full persistence rings (dim) + // Full persistence rings (dim greenish yellow) for (int ri = 1; ri <= nr; ++ri) { float frac = (float)ri / nr; for (int i = 0; i <= RING_SEGS; ++i) { @@ -572,7 +591,7 @@ static void buildRingVerts(std::vector& v, } } - // Sweep trail arcs (active at head → persistence at tail) + // Sweep trail arcs: gradient from active blue at head to dim persistence at tail for (int ri = 1; ri <= nr; ++ri) { float frac = (float)ri / nr; for (int i = 0; i <= TRAIL_SEGS; ++i) { @@ -585,17 +604,27 @@ static void buildRingVerts(std::vector& v, } } - // Sweep line (centre → edge) + // Sweep line (centre → edge) in active blue 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); } +// Unsigned angular separation between two headings (°) +static float angDiff(float a, float b) +{ + float d = std::fmod(std::fabs(a - b), 360.0f); + return d > 180.0f ? 360.0f - d : d; +} + struct RingLayer { - GLuint prog = 0, vao = 0, vbo = 0; + GLuint prog = 0, vao = 0, vbo = 0; + GLuint textProg = 0, textVAO = 0, textVBO = 0; + GLuint fontTex = 0; + float labelLastActT = -999.0f; // glfwGetTime() when sweep last passed 180° }; -static RingLayer buildRingLayer() +static RingLayer buildRingLayer(const FontAtlas& fa) { RingLayer rl{}; glGenVertexArrays(1, &rl.vao); glGenBuffers(1, &rl.vbo); @@ -609,11 +638,25 @@ static RingLayer buildRingLayer() glBindVertexArray(0); rl.prog = makeProgram("shaders/ppi_range_rings.vert", "shaders/ppi_range_rings.frag"); + + // Text layer for range labels + glGenVertexArrays(1, &rl.textVAO); glGenBuffers(1, &rl.textVBO); + glBindVertexArray(rl.textVAO); + glBindBuffer(GL_ARRAY_BUFFER, rl.textVBO); + 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); + rl.textProg = makeProgram("shaders/text.vert", "shaders/text.frag"); + rl.fontTex = fa.texture; return rl; } static void renderRingLayer(RingLayer& rl, const Layout& L, - int rangeIdx, float sweepAngle, float W, float H) + int rangeIdx, float sweepAngle, float curTime, + float W, float H, const FontAtlas& fa) { std::vector v; buildRingVerts(v, L, rangeIdx, sweepAngle, W, H); @@ -637,36 +680,203 @@ static void renderRingLayer(RingLayer& rl, const Layout& L, } glDrawArrays(GL_LINES, off, 2); glBindVertexArray(0); + + // Range labels — placed just below (south of) each ring. + // Sweep activates blue at 180°; color fades to P7P persistence at same + // rate as targets (TARG_PERSIST seconds). + static constexpr float LABEL_THRESH = 3.5f; + static constexpr float LABEL_OFFSET_PX = 10.0f; + + if (angDiff(sweepAngle, 180.0f) < LABEL_THRESH) + rl.labelLastActT = curTime; + + float ldt = curTime - rl.labelLastActT; + float lfade = (rl.labelLastActT < 0.0f) ? 0.0f + : std::max(0.0f, 1.0f - ldt / TARG_PERSIST); + bool lact = angDiff(sweepAngle, 180.0f) < LABEL_THRESH; + + float lr, lg, lb; + if (lact) { lr=P7A_R; lg=P7A_G; lb=P7A_B; } + else { lr=P7P_R * lfade; lg=P7P_G * lfade; lb=P7P_B * lfade; } + + if (lr + lg + lb > 0.01f) { + std::vector tv; + for (int ri = 1; ri <= nr; ++ri) { + float frac = (float)ri / nr; + float px = L.ppiCX; + float py = L.ppiCY + frac * L.ppiR + LABEL_OFFSET_PX; + int lmi = (int)std::round(RANGE_CONFIGS[rangeIdx].maxMiles * frac); + appendTextQuads(tv, fa, std::to_string(lmi), px, py, W, H); + } + if (!tv.empty()) { + glBindBuffer(GL_ARRAY_BUFFER, rl.textVBO); + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)(tv.size()*sizeof(float)), + tv.data(), GL_DYNAMIC_DRAW); + glUseProgram(rl.textProg); + glBindVertexArray(rl.textVAO); + glUniform3f(glGetUniformLocation(rl.textProg, "uColor"), lr, lg, lb); + glUniform1i(glGetUniformLocation(rl.textProg, "uTexture"), 0); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, rl.fontTex); + glDrawArrays(GL_TRIANGLES, 0, (GLsizei)(tv.size() / 4)); + glBindTexture(GL_TEXTURE_2D, 0); + glBindVertexArray(0); + } + } } // ─── Feature 5: Fake targets ────────────────────────────────────────────────── +// +// Apparent radar cross-section is computed from vessel dimensions and +// aspect angle: apparent = length*|sin(aspect)| + beam*|cos(aspect)| +// where aspect = bearing_from_radar_to_target - target_heading_true +// +// Signal strength tiers (apparent size in feet): +// >= 100 ft : full bright (large ship) +// 50-100 ft : full bright (yacht) +// 10-50 ft : bright (sailboat) +// < 10 ft : medium (kayak/rowboat) 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 + float bearingDeg; // bearing from radar to target (° true, CW from N) + float rangeMiles; // range from radar + float lengthFt; // vessel length + float beamFt; // vessel beam (width) + float headingDeg; // vessel heading (° true) + mutable float lastActT; // glfwGetTime() when sweep last lit this target }; -static float angDiff(float a, float b) // unsigned angular separation (°) +// Radar cross-section: effective width presented toward the radar +static float apparentFt(const FakeTarget& t) { - float d = std::fmod(std::fabs(a - b), 360.0f); - return d > 180.0f ? 360.0f - d : d; + float aspect = t.bearingDeg - t.headingDeg; + float rad = aspect * (PI / 180.0f); + return t.lengthFt * std::fabs(std::sin(rad)) + + t.beamFt * std::fabs(std::cos(rad)); } -// Build one textured quad (x,y,u,v = 4 floats/vertex) centred at screen pixel (px,py). +// Blob radius and bloom radius (in pixels) from apparent size +static void sizeFromApparent(float apparent, float ppiR, + float& coreRad, float& bloomRad, float& bright) +{ + if (apparent >= 100.0f) { + coreRad = ppiR * 0.028f; + bloomRad = 0.0f; + bright = 1.00f; + } else if (apparent >= 50.0f) { + coreRad = ppiR * 0.022f; + bloomRad = 0.0f; + bright = 1.00f; + } else if (apparent >= 10.0f) { + coreRad = ppiR * 0.015f; + bloomRad = 0.0f; + bright = 0.90f; + } else { + coreRad = ppiR * 0.010f; + bloomRad = 0.0f; + bright = 0.75f; + } +} + +// ─── A scope signal trace ───────────────────────────────────────────────────── +// Draws P1-green target spikes on the A scope at the current bearing. +// Activated when the PPI sweep passes the A scope bearing; fades like PPI targets. + +struct AScopeTrace { + GLuint vao = 0, vbo = 0, prog = 0; + float lastActT[4]; +}; + +static AScopeTrace buildAScopeTrace() +{ + AScopeTrace at{}; + for (int i = 0; i < 4; ++i) at.lastActT[i] = -999.0f; + glGenVertexArrays(1, &at.vao); glGenBuffers(1, &at.vbo); + glBindVertexArray(at.vao); + glBindBuffer(GL_ARRAY_BUFFER, at.vbo); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(float), nullptr); + glEnableVertexAttribArray(0); + glBindVertexArray(0); + at.prog = makeProgram("shaders/scope_bounds.vert", "shaders/scope_bounds.frag"); + return at; +} + +// Renders target return spikes on the A scope clipped to the A scope box. +static void renderAScopeTrace(AScopeTrace& at, const Layout& L, + FakeTarget* tgts, int nTgts, + float maxRangeMi, float ascopeBearingDeg, + float sweepAngle, float curTime, float W, float H) +{ + static const float THRESH = 3.5f; + static const float PAD = 4.0f; + static const float HALF_W = 3.0f; // spike half-width in pixels + + const float asH = L.asBot - L.asTop; + const float gx0 = L.asLeft + PAD; + const float gx1 = L.asRight - PAD; + const float gy1 = L.asTop + asH * 0.80f; // baseline + const float sigW = gx1 - gx0; + const float sigH = (L.asTop + PAD) - gy1; // negative: upward from baseline + + const bool sweepHere = angDiff(sweepAngle, ascopeBearingDeg) < THRESH; + + glEnable(GL_SCISSOR_TEST); + glScissor((GLint)L.asLeft, (GLint)(H - L.asBot), + (GLint)(L.asRight - L.asLeft), (GLint)(L.asBot - L.asTop)); + glUseProgram(at.prog); + glBindVertexArray(at.vao); + const GLint locCol = glGetUniformLocation(at.prog, "uColor"); + + for (int i = 0; i < nTgts; ++i) { + FakeTarget& t = tgts[i]; + + if (sweepHere && angDiff(ascopeBearingDeg, t.bearingDeg) < THRESH) + at.lastActT[i] = curTime; + + float rangeFrac = t.rangeMiles / maxRangeMi; + if (rangeFrac > 1.0f) continue; + + float dt = curTime - at.lastActT[i]; + float fade = (at.lastActT[i] < 0.0f) ? 0.0f + : std::max(0.0f, 1.0f - dt / TARG_PERSIST); + if (fade < 0.02f) continue; + + float coreRad, bloomRad, baseBright; + sizeFromApparent(apparentFt(t), L.ppiR, coreRad, bloomRad, baseBright); + float bright = baseBright * fade; + float height = sigH * bright; // upward (sigH is negative → spike goes up) + + float sx = gx0 + rangeFrac * sigW; + float sy0 = gy1; // baseline + float sy1 = gy1 + height; // peak (upward because sigH < 0) + + float verts[6] = { + ndcX(sx - HALF_W, W), ndcY(sy0, H), + ndcX(sx, W), ndcY(sy1, H), + ndcX(sx + HALF_W, W), ndcY(sy0, H) + }; + glBindBuffer(GL_ARRAY_BUFFER, at.vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_DYNAMIC_DRAW); + glUniform3f(locCol, P1_R * bright, P1_G * bright, P1_B * bright); + glDrawArrays(GL_TRIANGLES, 0, 3); + } + + glBindVertexArray(0); + glDisable(GL_SCISSOR_TEST); +} + +// Build one textured quad (x,y,u,v = 4 floats/vertex) centred at (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); + 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 { @@ -691,7 +901,7 @@ static TargetLayer buildTargetLayer() static void renderTargets(TargetLayer& tl, FakeTarget* tgts, int nTgts, - const Layout& L, float maxRangeMi, + const Layout& L, float maxRangeMi, float ppiR, float sweepAngle, float curTime, float W, float H) { static const float THRESH = 3.5f; // sweep activation threshold (°) @@ -709,7 +919,7 @@ static void renderTargets(TargetLayer& tl, t.lastActT = curTime; float rangeFrac = t.rangeMiles / maxRangeMi; - if (rangeFrac > 1.0f) continue; + if (rangeFrac > 1.0f) continue; // outside current range setting float px = polarPx(L, t.bearingDeg, rangeFrac); float py = polarPy(L, t.bearingDeg, rangeFrac); @@ -717,9 +927,12 @@ static void renderTargets(TargetLayer& tl, 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 coreRad, bloomRad, baseBright; + sizeFromApparent(apparentFt(t), ppiR, coreRad, bloomRad, baseBright); + + float bright = active ? baseBright : baseBright * fade; + if (bright < 0.02f) continue; float cr, cg, cb; if (active) { cr=P7A_R; cg=P7A_G; cb=P7A_B; } @@ -728,7 +941,7 @@ static void renderTargets(TargetLayer& tl, // Core blob { std::vector bv; - genBlob(bv, px, py, t.coreRadPx, W, H); + genBlob(bv, px, py, coreRad, W, H); glBindBuffer(GL_ARRAY_BUFFER, tl.vbo); glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)(bv.size()*sizeof(float)), bv.data(), GL_DYNAMIC_DRAW); @@ -736,22 +949,83 @@ static void renderTargets(TargetLayer& tl, 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 ──────────────────────────────────────────────────────────── +// ─── Feature 6: PPI cursor ─────────────────────────────────────────────────── +// +// Cursor has three graphical elements (all incandescent): +// • Range ring — full circle at the cursor range fraction +// • Bearing line — radial line from centre to scope edge at cursor bearing +// • Intersection box — small square centred where the two cross + +struct CursorLayer { + GLuint prog = 0, vao = 0, vbo = 0; +}; + +static CursorLayer buildCursorLayer() +{ + CursorLayer cl{}; + glGenVertexArrays(1, &cl.vao); glGenBuffers(1, &cl.vbo); + glBindVertexArray(cl.vao); + glBindBuffer(GL_ARRAY_BUFFER, cl.vbo); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(float), nullptr); + glEnableVertexAttribArray(0); + glBindVertexArray(0); + cl.prog = makeProgram("shaders/ppi_cursor.vert", "shaders/ppi_cursor.frag"); + return cl; +} + +static void renderCursor(CursorLayer& cl, const Layout& L, + float rangeFrac, float bearingDeg, float W, float H) +{ + std::vector v; + + // ── Range ring (circle at cursor range) ──────────────────────────────── + const float rPx = rangeFrac * L.ppiR; + const int ringStart = 0; + for (int i = 0; i <= CIRCLE_SEGS; ++i) { + float a = 2.0f * PI * i / CIRCLE_SEGS; + v.push_back(ndcX(L.ppiCX + rPx * std::cos(a), W)); + v.push_back(ndcY(L.ppiCY + rPx * std::sin(a), H)); + } + + // ── Bearing line (centre → scope edge) ──────────────────────────────── + const int lineStart = ringStart + CIRCLE_SEGS + 1; + v.push_back(ndcX(L.ppiCX, W)); + v.push_back(ndcY(L.ppiCY, H)); + v.push_back(ndcX(polarPx(L, bearingDeg, 1.0f), W)); + v.push_back(ndcY(polarPy(L, bearingDeg, 1.0f), H)); + + // ── Intersection box ─────────────────────────────────────────────────── + const float ix = polarPx(L, bearingDeg, rangeFrac); + const float iy = polarPy(L, bearingDeg, rangeFrac); + const float half = L.ppiR * 0.035f; + const int boxStart = lineStart + 2; + // 5 vertices to close the square loop + v.push_back(ndcX(ix - half, W)); v.push_back(ndcY(iy - half, H)); + v.push_back(ndcX(ix + half, W)); v.push_back(ndcY(iy - half, H)); + v.push_back(ndcX(ix + half, W)); v.push_back(ndcY(iy + half, H)); + v.push_back(ndcX(ix - half, W)); v.push_back(ndcY(iy + half, H)); + v.push_back(ndcX(ix - half, W)); v.push_back(ndcY(iy - half, H)); + + glBindBuffer(GL_ARRAY_BUFFER, cl.vbo); + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)(v.size() * sizeof(float)), + v.data(), GL_DYNAMIC_DRAW); + + glUseProgram(cl.prog); + glUniform3f(glGetUniformLocation(cl.prog, "uColor"), INCAN_R, INCAN_G, INCAN_B); + glBindVertexArray(cl.vao); + + glDrawArrays(GL_LINE_STRIP, ringStart, CIRCLE_SEGS + 1); // range ring + glDrawArrays(GL_LINES, lineStart, 2); // bearing line + glDrawArrays(GL_LINE_STRIP, boxStart, 5); // intersection box + + glBindVertexArray(0); +} + +// ─── Key callback ───────────────────────────────────────────────────────────── static void onKey(GLFWwindow* win, int key, int /*scan*/, int action, int /*mods*/) { @@ -759,7 +1033,7 @@ static void onKey(GLFWwindow* win, int key, int /*scan*/, int action, int /*mods glfwSetWindowShouldClose(win, GLFW_TRUE); } -// ─── main ──────────────────────────────────────────────────────────────────── +// ─── main ───────────────────────────────────────────────────────────────────── int main() { @@ -774,7 +1048,7 @@ int main() GLFWwindow* win = glfwCreateWindow( mode->width, mode->height, - "Radar Test — Features 1–5", + "Radar Test — Features 1-6", nullptr, nullptr); if (!win) { std::cerr << "Window create failed\n"; glfwTerminate(); return 1; } @@ -794,7 +1068,7 @@ int main() int mmW, mmH; glfwGetMonitorPhysicalSize(mon, &mmW, &mmH); const float dpiX = static_cast(mode->width) / (static_cast(mmW) / 25.4f); - const float margin = 0.5f * dpiX; + const float margin = 1.0f * dpiX; const Layout layout = computeLayout(W, H, margin); @@ -820,29 +1094,43 @@ int main() graticules[i] = buildAScopeGraticule(layout, fa, RANGE_CONFIGS[i], W, H); // Feature 4 — PPI range rings - RingLayer rl = buildRingLayer(); + RingLayer rl = buildRingLayer(fa); - // Feature 5 — Fake targets (one per quadrant: NE small, SE large, SW/NW very large) - const float pR = layout.ppiR; + // Feature 5 — Four fake targets per CLAUDE.md spec: + // 1. 10 mi north, 100 ft long / 20 ft beam, heading south (head-on) → apparent ~20 ft + // 2. 5 mi south, 20 ft long / 5 ft beam, heading south (stern-on) → apparent ~5 ft + // 3. 4 mi east, 30 ft long / 10 ft beam, heading north (full side) → apparent ~30 ft + // 4. 1 mi west, 100 ft long / 25 ft beam, heading south (full side) → apparent ~100 ft 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 + { 0.0f, 10.0f, 100.0f, 20.0f, 180.0f, -999.0f }, // N – head-on, ~20 ft apparent + { 180.0f, 5.0f, 20.0f, 5.0f, 180.0f, -999.0f }, // S – stern-on, ~5 ft apparent + { 90.0f, 4.0f, 30.0f, 10.0f, 0.0f, -999.0f }, // E – full side, ~30 ft apparent + { 270.0f, 1.0f, 100.0f, 25.0f, 180.0f, -999.0f }, // W – full side, ~100 ft apparent }; TargetLayer tl = buildTargetLayer(); - float sweepAngle = 0.0f; // degrees, 0 = north, clockwise + // A scope trace + AScopeTrace at = buildAScopeTrace(); - // NDC height of the A scope box — used to compute slide distance + // Feature 6 — PPI cursor + CursorLayer cl = buildCursorLayer(); + + const float ppiR = layout.ppiR; + + // NDC height of A scope box — used for slide animation 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; + // Feature 3 animation state — 4 phases per range cycle + enum class GratPhase { HOLD, SLIDE_OUT, WAIT, SLIDE_IN }; + int curRange = 0; + int nextRange = 1; + GratPhase gratPhase = GratPhase::HOLD; + float phaseTimer = 0.0f; + + // A scope bearing (° true, CW from N) + const float ascopeBearingDeg = 90.0f; + + float sweepAngle = 0.0f; float prevTime = static_cast(glfwGetTime()); glEnable(GL_BLEND); @@ -857,20 +1145,34 @@ int main() 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; - } + phaseTimer += dt; + switch (gratPhase) { + case GratPhase::HOLD: + if (phaseTimer >= HOLD_SEC) { + nextRange = (curRange + 1) % RANGE_COUNT; + gratPhase = GratPhase::SLIDE_OUT; + phaseTimer = 0.0f; + } + break; + case GratPhase::SLIDE_OUT: + if (phaseTimer >= SLIDE_OUT_SEC) { + gratPhase = GratPhase::WAIT; + phaseTimer = 0.0f; + } + break; + case GratPhase::WAIT: + if (phaseTimer >= WAIT_SEC) { + curRange = nextRange; + gratPhase = GratPhase::SLIDE_IN; + phaseTimer = 0.0f; + } + break; + case GratPhase::SLIDE_IN: + if (phaseTimer >= SLIDE_IN_SEC) { + gratPhase = GratPhase::HOLD; + phaseTimer = 0.0f; + } + break; } glClearColor(0.0f, 0.0f, 0.0f, 1.0f); @@ -881,7 +1183,7 @@ int main() const GLint sbCol = glGetUniformLocation(sb.prog, "uColor"); glBindVertexArray(sb.vao); - glUniform3f(sbCol, 0.25f, 0.35f, 0.55f); + glUniform3f(sbCol, P7A_R * 0.4f, P7A_G * 0.4f, P7A_B * 0.4f); glDrawArrays(GL_LINE_STRIP, sb.ppiStart, sb.ppiCount); glUniform3f(sbCol, P1_R, P1_G, P1_B); @@ -889,13 +1191,14 @@ int main() glBindVertexArray(0); - // ── Feature 2: PPI bearing ring + ticks ────────────────────────────── + // ── Feature 2: PPI bearing rings + ticks ───────────────────────────── glUseProgram(bg.lineProg); glUniform3f(glGetUniformLocation(bg.lineProg, "uColor"), INCAN_R, INCAN_G, INCAN_B); glBindVertexArray(bg.lineVAO); - glDrawArrays(GL_LINE_STRIP, bg.ringStart, bg.ringCount); - glDrawArrays(GL_LINES, bg.tickStart, bg.tickCount); + glDrawArrays(GL_LINE_STRIP, bg.ring1Start, bg.ring1Count); + glDrawArrays(GL_LINES, bg.tickStart, bg.tickCount); + glDrawArrays(GL_LINE_STRIP, bg.ring2Start, bg.ring2Count); glBindVertexArray(0); glUseProgram(bg.textProg); @@ -909,36 +1212,58 @@ 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 3: A scope graticule (4-phase slide animation) ────────── + switch (gratPhase) { + case GratPhase::HOLD: + drawAScopeGraticule(agProg, graticules[curRange], + 0.0f, fa, W, H, layout); + break; + case GratPhase::SLIDE_OUT: { + float t = std::min(phaseTimer / SLIDE_OUT_SEC, 1.0f); + drawAScopeGraticule(agProg, graticules[curRange], + t * scopeNDCH, fa, W, H, layout); + break; + } + case GratPhase::WAIT: + // blank — no graticule drawn + break; + case GratPhase::SLIDE_IN: { + float t = std::min(phaseTimer / SLIDE_IN_SEC, 1.0f); + // new graticule slides down from above (starts at +scopeNDCH → 0) + drawAScopeGraticule(agProg, graticules[curRange], + (1.0f - t) * scopeNDCH, fa, W, H, layout); + break; + } } + // ── A scope signal trace ────────────────────────────────────────────── + renderAScopeTrace(at, layout, targets, 4, + RANGE_CONFIGS[curRange].maxMiles, ascopeBearingDeg, + sweepAngle, now, W, H); + // ── Feature 4: PPI range rings ──────────────────────────────────────── - renderRingLayer(rl, layout, curRange, sweepAngle, W, H); + renderRingLayer(rl, layout, curRange, sweepAngle, now, W, H, fa); // ── Feature 5: Active targets + persistence ─────────────────────────── renderTargets(tl, targets, 4, layout, - RANGE_CONFIGS[curRange].maxMiles, + RANGE_CONFIGS[curRange].maxMiles, ppiR, sweepAngle, now, W, H); + // ── Feature 6: PPI cursor (slow auto-animation for test) ────────────── + // Range oscillates between ~15 % and ~85 % over 12 s period. + // Bearing rotates slowly at 18 °/s (one full revolution per 20 s). + float cursorRangeFrac = 0.15f + 0.70f * (std::sin(now * (2.0f*PI/12.0f)) * 0.5f + 0.5f); + float cursorBearingDeg = std::fmod(now * 18.0f, 360.0f); + renderCursor(cl, layout, cursorRangeFrac, cursorBearingDeg, W, H); + glfwSwapBuffers(win); glfwPollEvents(); } // ── Cleanup ─────────────────────────────────────────────────────────────── - glDeleteVertexArrays(1, &sb.vao); glDeleteBuffers(1, &sb.vbo); - glDeleteVertexArrays(1, &bg.lineVAO); glDeleteBuffers(1, &bg.lineVBO); - glDeleteVertexArrays(1, &bg.textVAO); glDeleteBuffers(1, &bg.textVBO); + glDeleteVertexArrays(1, &sb.vao); glDeleteBuffers(1, &sb.vbo); + glDeleteVertexArrays(1, &bg.lineVAO); glDeleteBuffers(1, &bg.lineVBO); + glDeleteVertexArrays(1, &bg.textVAO); glDeleteBuffers(1, &bg.textVBO); glDeleteTextures(1, &fa.texture); glDeleteProgram(sb.prog); glDeleteProgram(bg.lineProg); @@ -952,10 +1277,16 @@ int main() } glDeleteProgram(agProg.line); glDeleteProgram(agProg.text); - glDeleteVertexArrays(1, &rl.vao); glDeleteBuffers(1, &rl.vbo); + glDeleteVertexArrays(1, &rl.vao); glDeleteBuffers(1, &rl.vbo); + glDeleteVertexArrays(1, &rl.textVAO); glDeleteBuffers(1, &rl.textVBO); glDeleteProgram(rl.prog); - glDeleteVertexArrays(1, &tl.vao); glDeleteBuffers(1, &tl.vbo); + glDeleteProgram(rl.textProg); + glDeleteVertexArrays(1, &tl.vao); glDeleteBuffers(1, &tl.vbo); glDeleteProgram(tl.prog); + glDeleteVertexArrays(1, &at.vao); glDeleteBuffers(1, &at.vbo); + glDeleteProgram(at.prog); + glDeleteVertexArrays(1, &cl.vao); glDeleteBuffers(1, &cl.vbo); + glDeleteProgram(cl.prog); glfwDestroyWindow(win); glfwTerminate();