This is a project for a museum to demonstrate a simulation of a 1940's to 1960's vintage radar, including the Chain Home radar from early World War 2, marine radar, The project will be implemented on a Geekom A8 Max 32 GB RAM AMD Ryzen 9 8945HS w/ Radeon 780M Graphics We need to render to the Radeon 780M Graphics GPU Tech Stack: We are using C++20, OpenGL 4.3 Core, GLFW, GLAD, FreeType, GDAL (libgdal-dev) Compiler: is g++ (Ubuntu 15.2.0-4ubuntu4) 15.2.0 FreeType is the text type we use GDAL is used for reading the LIDAR/ENC chart files GLFW (graphics library framework) open-source, multi-platform library used to manage windows GLAD (Multi-Language GL/GLES/WGL/GLX Loader-Generator) Loads the pointers to OpenGL functions (like glDrawArrays or glCompileShader) PostgreSQL is installed. Database: radar. User: radar. Password: radar. User has full privileges on database radar. Table is target_data. Operating system details: Distributor ID: Ubuntu Description: Ubuntu 25.10 Release: 25.10 Codename: questing Use cmake for building. [DIRECTIVE: GPU ROBUSTNESS PROTOCOL] Debug Callback: Enable GL_DEBUG_OUTPUT and glDebugMessageCallback to capture driver-level warnings and errors in real-time. I will be using SSH from Windows to write code and check with claude. You may compile the code during an SSH session. Please do not try to run the code during SSH session. I will run the code while physically using the Geekom. Please add MIT license header to each file Please add Author: Mark Allyn to each file Use snake_case for variables and PascalCase for classes use #pragma once Use // for single line comments use /* */ for multiple block comments spanning multiple lines avoid using auto Summary of project: This is a museum exhibit displaying and providing some interaction of vintage 1940's, 1950's, and 1960's radars. A key objective is to provide interaction with and viewing of radars from that era. There will be three main areas of the screen. On the right hand side will be the radar scope. On the left hand side of the screen will be a text description of the scope as well as the controls of the scope and keyboard keys for each control. This text will be white while the control labels will be red and the keystrokes will be in pink. At some point, pending a decision with the museum, we may purchase components to mount the controls on a panel. Until that is done, the controls will be on the keyboard. On the right hand side of the screen, below the scope, would be a text status window, showing current maximum range, range, and bearing as appropriate to which scope we are using as well as the identification of the scope that we are using. Suggest that we use glViewport to define the left-hand text area, the main scope, and the yellow status bar. This allows you to render the scope with its own coordinate system while keeping the text fixed. Along with glViewport, use glScissor and glEnable(GL_SCISSOR_TEST) Below the scope will be a text status window. This text will be yellow Scopes in the right panel 1. Introduction of Exhibit (Explanation of the project on the left hand text panel. 2. A-scope for Chain Home Radar in the 1940's (first radar and could be tricky) 3. A-scope for marine radar in the 1940's (Before PPI radar); was a bit tedious to operate 4. PPI scope for marine traffic control (uses beam sweeping in all 360 degrees of rotation); Easier to use than a scope 5. PPI scope on board a boat. Shows how movement of a boat affects the radar display Please note that these scopes will not appear all at once. The selection of which scope the visitor sees is done by pressing a forward control and a reverse control to go around the loop of scopes. The first display when the system is turned on or booted up is the Introduction of the exhibit. Please note that the first iteration of the project will have only minimal controls. This is a suggestion I got after meeting with the museum staff. Perhaps later we may add more controls. Also, please note that the state of the controls of each scope is independent of any other scope. Furthermore, the controls will reset when a scope is exited and then re-entered. Controls to affect the behavior of the scopes; (these first implemented using keyboard strokes; later when and if physical controls are completed, the keyboard controls will be removed) These controls will affect the state variables and the uniform variables of the shaders. Please note that identical controls will be the same keyboard strikes or physical controls for all scopes. ======================================================= Overall control information These are knobs on the panel once that is built. Keyboard keys until then 1. Intensity - scope overall intensity - Keyboard 3 is lower; 4 is higher 2. Receiver Sensitivity - signal intensity - Keyboard 5 is lower; 6 is higher 3. STC Sensitivity - sensitivity for closer in targets which can overwhelm overall sensitivity - keyboard q for lower; w for higher 4. STC Range - range to which sensitivity to closer targets is effective keyboard e for lower; r for higher 5. Radiogoniometer knob for Chain Home; keyboard t for left turn; y for right turn. 6. Maximum Range for all scopes except for chain home, which is fixed. This control will not operate for Chain Home. These maximum range selections will be defined for each scope; If you try to go beyond the stated maximum ranges, the control will have no effect; note that the default maximum range would be the highest for that scope; keyboard u for lower; i for higher 7. Range Cursor (for ppi scopes, not for a scopes) keyboard o for lower; p for higher 8. Bearing Cursor (for all ppi scopes; not for a scopes) keyboard a for counterclockwise s for clockwise 9. Bearing for Marine A Scope. This is not for a cursor, but this operates the motor that revolves the antenna unit keyboard d for counterclockwise and f for clockwise Notes; I am maintaining control separation between radiogon, marine a scope bearing, and ppi bearing. However, when I make the control panel, those will be combined as one physical knob with three labels, chain home radiogon, marine a scope antenna rotation, and ppi scope bearing to save on hardware; the same physical control can be used for multiple scopes. Note that the range cursor is different from the maximum range. Maximum range is the maximum radar range setting and range cursor is the range portion of the ppi cursor. ======================================================== Individual scope informations 1. Introduction to project. Just text. No scopes. Only one control for entering scope selection loop. Keyboard keys 1 for forward; 2 for backward. This is a loop type selection If you are in the Introduction, and you touch keyboard 2 for backward, you would go to scope 5, PPI Scope for a boat. 2. A Scope - sweep on horizontal axis. A pulse will appear for a return. The distance from the left hand side to the pulse is the range. The height of the pulse is the strength of the return signal. The bearing is determined by manual control. The basic controls for both A Scopes include: Intensity Sensitivity (the strength of the signal amplification of the receiver). This has nothing to do with the brightness of the pulses. This only affects the height of the pulse and the height of any noise floor. STC sensitivity; sensitivity for close in targets. STC sensitivity range; how far shall the STC sensitivity have effect. Please note that the phosphor (chemical that glows when hit by electrons in the tube) is green, similar to an oscilloscope. The Hex for green is ##39FF14; there is a short persistance of the phosphor after being struck by the electron beam. That persistance is about 25 millesconds and its color is darker green at aboutu Hex #004400 PLease also note that there are no graticules on either the Chain Home a scope nor the marine a a scope. 2-1 Chain Home A Scope Because the receiving antennas are very large (about 100 feet), the operator cannot physically move them. Therefore, the bearing is determined through a process called radio direction finding (RDF) using a specialized instrument known as a Radiogoniometer. The receiver towers (which were separate from the transmitter towers) featured two sets of dipole antennas mounted at right angles to one another—essentially one oriented North-South and the other East-West. The signals from these two perpendicular antennas were fed into a Radiogoniometer located in the receiver hut. Inside the device there are two fixed coils (field coils) that were mounted at right angles matching the orientation of the outdoor antennas. A third coil, the search coil, is mounted on a rotating shaft inside the two field coils. The operator would physically turn a knob to rotate the search coil. The relative strength of the signal in each antenna depended on the angle of the incoming wave. For example, a target directly to the North would produce a maximum signal in the North-South antenna and zero in the East-West antenna. The operator would look for a null point (a signal or pip weaker than the noise floor). At that point, the operator would read the bearing from a calibrated scale attached to the radiogoniometer knob. We can simulate the radiogoniometer knob that would affect the null point depending on the bearing of a target. The museum visitor could experience seeing different null points for each target. Since we do not have a physical calibrated knob, we can put the bearing as a text indicator below the A Scope. The range is 200 miles. That is the only range option for this scope. There is no graticule. Photos only show crystal oscillator generated 'pips' for every 20 miles. We do need to have those small pips every 20 miles. Note that the operator cannot change this. This is due to the limitations of the technology for that era. 2-2 Marine A Scope Utilization of A scope marine was limited to military use prior to PPI scope invention. An example is British Type 271 radar, introduced in 1941. Marine radar frequencies allowed the use of much smaller antennas; dishes or horns. Those antennas would be mounted on the shaft of a servo motor. The servo motor would be driven by another servo that is attached to the bearing control knob on the radar console. The bearing is on a calibrated dial on the bearing control knob. We can simulate the bearing knob that would affect the simulated pointing of the dish antenna. The museum visitor could experience seeing different pips appear as they rotate the antenna toward them. Likewise the pips would disappear as the antenna is rotated away. The range is indicated at how far the pip is from the left hand side of the scope which is the location of the radar transmitter. If the target goes further away, the pip will move to the right. If the target comes close to you, the pip will move left. This pip has a finite rise time as the transmitter starts. The width is set by the modulator stage in the transmitter. Following the width, the pip has a finite fall time as the transmitter stops. This creates a curved waveform; not just a line. A photograph for this display show no graticule at all. Only range pips formed by an oscillator. Those oscillator pips are fixed. Range settings do not affect them. The maximum ranges for this scope are: 1. 1.5 miles; marker pips every 0.25 miles 2. 3.0 miles; marker pips every 0.5 miles 3. 6.0 miles; marker pips every 1.0 miles 4. 12.0 miles; marker pips every 2.0 miles 2. PPI Scope PPI stands for Plan Position Indicator The Core VisualizationThe PPI scope represents the radar antenna as a central point (the origin).The "Sweep": A radial line rotates 360 degrees around the center, synchronized with the physical rotation of the radar antenna.Distance (Range): The distance from the center of the screen to a "blip" represents how far away the object is. Bearing (Azimuth): The angle of the blip relative to the top of the screen (usually North or the front of a ship/aircraft) represents its direction. Key Technical ComponentsIf you are prompting an AI to simulate or analyze a PPI, use these technical markers:Persistence: Older CRT scopes used "long-persistence phosphors" so that a target would remain visible as a glowing trail even after the sweep line passed over it. Range Rings: Concentric circles overlaid on the display to help the operator estimate distance at a glance. Strobe/Cursor: A line or marker used to pinpoint the exact coordinates of a specific target. Mathematical LogicFor an AI to process PPI data, it needs to understand the conversion from Polar to Cartesian coordinates. If a radar detects a target at distance $r$ and angle $\theta$, the position on the 2D screen $(x, y)$ is calculated as:$$x = r \cdot \sin(\theta)$$$$y = r \cdot \cos(\theta)$$4. Why it differs from other ScopesTo clarify for the AI, distinguish it from the A-Scope: A simple 1D graph showing "Energy vs. Distance" (looks like an EKG). PLease note that there are three different colors for the phosphors in vintge PPI Scope radars. When the phosphor is first struck by the electron beam, the color is blue white; About hex #A0CFFF. There are three afterglows of the p7 phosphor after it is struck by the electron beam. They are #E2FF80 - the color just behind the sweep - this lasts about 3 seconds; #8A9600 - the trail of history of the pulse - this lasts about 10 seconds, and #050700 - very dark, warm trail - This lasts about 20 seconds. Suggested Simulation Table: 1. Excitation 0 (flash) Bright Blue 2. Immediate blue - 1 ms 3. Short term Yellow Green - 1 second 4. Long Term Amber - 10 seconds 5. Expiration - 12 seconds black Graticules - These are plastic overlays over the face of the scope. They are for the purposes of showing the bearing. Theey are calibrated in degrees; short line (1/8 inch) each degree; medium line (1/4 inch) for every 5 degres; and a longer line (1/2 inch) for every 10 degrees. Line for true north; 2/3 inch. Notes that these graticule lines are lie by a #47 incidenscent bulb #FFB347. ================================== RADAR EQUATION Lets start here by mentioning the radar equation that sets the perceived strength of any radar echoes, no matter what kind of radar (a scope and ppi scopes) Summary of radar equation: The fundamental radar equation describes how much power returns to a radar system after bouncing off a distant target. Physically, it follows a "round-trip" journey of energy: the radar transmits a signal that spreads out as a sphere (losing strength by the square of the distance, $R^2$), hits a target that reflects a portion of that energy (the Radar Cross Section, $\sigma$), and that reflection then spreads out again as a second sphere on its way back (losing another factor of $R^2$). Mathematically, this results in the received power being inversely proportional to the fourth power of the distance ($1/R^4$), meaning that if a target moves twice as far away, the returning signal becomes 16 times weaker. To calculate the final received power ($P_r$), you multiply the transmitted power ($P_t$) by the antenna's ability to focus that energy (Gain, $G$) and its physical size (Aperture, $A$), then factor in the target's reflectivity ($\sigma$) and the wavelength of the signal ($\lambda$), all while dividing by the spreading losses $(4\pi)^3 R^4$. $$P_r = \frac{P_t G^2 \lambda^2 \sigma}{(4\pi)^3 R^4}$$ Since we had four distinct radar types, and each one has it's own hardware loop gain that does not change, we can set that as a constant in each radar's target handling shader set. ======================================