<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>SigSegOwl Blog</title>
        <link>https://blog.sigsegowl.xyz/</link>
        <description>SigSegOwl Blog</description>
        <lastBuildDate>Wed, 21 Oct 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[goodbye word press]]></title>
            <link>https://blog.sigsegowl.xyz/2026/10/21/goodbye-wp</link>
            <guid>https://blog.sigsegowl.xyz/2026/10/21/goodbye-wp</guid>
            <pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[php has 2 critical CVEs that allow remote code execution, see https://www.php.net/archive/2026.php#2026-10-21-5]]></description>
            <content:encoded><![CDATA[<p>php has 2 critical CVEs that allow remote code execution, see <a href="https://www.php.net/archive/2026.php#2026-10-21-5" target="_blank" rel="noopener noreferrer" class="">https://www.php.net/archive/2026.php#2026-10-21-5</a></p>
<p>Time to turn it off, and say goodbye to Wordpress in one go! Wordpress had a lot of security findings in the past, and I used it as a file hoster anyways.</p>]]></content:encoded>
            <category>web</category>
        </item>
        <item>
            <title><![CDATA[midi-slayer-one]]></title>
            <link>https://blog.sigsegowl.xyz/2025/03/01/midi-slayer-one</link>
            <guid>https://blog.sigsegowl.xyz/2025/03/01/midi-slayer-one</guid>
            <pubDate>Sat, 01 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[midi slayer cad]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="midi slayer cad" src="https://blog.sigsegowl.xyz/assets/images/midi-ctrl-cad-xray-1024x626-ac054b5c5c143bd831ef5fcc3743f748.jpg" width="1024" height="626" class="img_XUCP"></p>
<p>In this project, I'll take you through my journey of designing and building a custom MIDI DJ controller from scratch. Combining CAD software, 3D printing, and custom microcontroller software, I'll show you how to create a fully functional device that seamlessly integrates both hardware and software—capable of controlling popular DJ software like <a href="https://mixxx.org/" target="_blank" rel="noopener noreferrer" class="">Mixxx</a>. This step-by-step guide offers a hands-on approach to constructing a personalized MIDI controller, making it perfect for anyone with an interest in electronics, 3D printing, or music technology.</p>
<!-- -->
<p><strong>Disclaimer:</strong> Prior to this project I've never used any DJ controller!</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="layout">Layout<a href="https://blog.sigsegowl.xyz/2025/03/01/midi-slayer-one#layout" class="hash-link" aria-label="Direct link to Layout" title="Direct link to Layout" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Mixxx UI layout" src="https://blog.sigsegowl.xyz/assets/images/mixxx-layout-1024x259-4cddf71c12df8aae5251b35f900b5192.jpg" width="1024" height="259" class="img_XUCP"></p>
<p>Woah a lot of buttons, knobs and sliders... This is the UI of Mixxx, the virtual counterpart of the planned MIDI controller. As a first step, all the controls that I planned to use, needed to be selected and suitable parts ordered. Let's focus on one side of the UI, as it is mirrored anyways. So I ended up with the following selection of UI elements that I wanted to control:</p>
<ul>
<li class="">Jog wheel - to seek forwards and backwards in tracks</li>
<li class="">Pause play tracks</li>
<li class="">Sync lock button to sync the speed of tracks</li>
<li class="">Temporary slow down and speed up</li>
<li class="">Slow down and speed up</li>
<li class="">Speed slider</li>
<li class="">High, mid, low filter, including their mute buttons</li>
<li class="">Filter knobs and their activation buttons</li>
<li class="">Volume slider and gain knobs</li>
<li class="">Cross-fade slider</li>
<li class="">Headphones button to select which side is playing on headphones</li>
</ul>
<p>Here is the planned layout in CAD compared to Mixxx's UI, side by side:</p>
<p><img decoding="async" loading="lazy" alt="CAD layout vs Mixxx" src="https://blog.sigsegowl.xyz/assets/images/midi-controller-layout-1024x394-800900fb73055a681e534545cdfb30a0.jpg" width="1024" height="394" class="img_XUCP"></p>
<p>I ended up with the following components:</p>
<ul>
<li class="">26 push buttons</li>
<li class="">16 rotary potentiometers</li>
<li class="">5 linear potentiometers</li>
<li class="">2 rotary encoders including push button functionality (in red)</li>
<li class="">12 LEDs</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Pin connections" src="https://blog.sigsegowl.xyz/assets/images/midi-ctrl-pins-1024x603-49cc98bf1518549e38e5f5826c288b96.jpg" width="1024" height="603" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="efficient-microcontroller-wiring-using-multiplexers">Efficient microcontroller wiring using multiplexers<a href="https://blog.sigsegowl.xyz/2025/03/01/midi-slayer-one#efficient-microcontroller-wiring-using-multiplexers" class="hash-link" aria-label="Direct link to Efficient microcontroller wiring using multiplexers" title="Direct link to Efficient microcontroller wiring using multiplexers" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="16-pin multiplexer" src="https://blog.sigsegowl.xyz/assets/images/16-pin-multiplexer-8eba0601a7024c9a8aeb101cbc7eaffd.jpg" title="width: 287px" width="654" height="287" class="img_XUCP"></p>
<p>Directly wiring all the components would have required a microcontroller with an impractical number of pins—around 65, not even counting ground and power connections. Fortunately, there's a simple solution: multiplexers. I used four 16-channel CD74HC4067 multiplexers to reduce the number of pins needed to interface with multiple components.</p>
<h3 class="anchor anchorTargetStickyNavbar_lB72" id="how-multiplexers-work">How multiplexers work<a href="https://blog.sigsegowl.xyz/2025/03/01/midi-slayer-one#how-multiplexers-work" class="hash-link" aria-label="Direct link to How multiplexers work" title="Direct link to How multiplexers work" translate="no">​</a></h3>
<p>A multiplexer acts like a digital switchboard, allowing you to connect multiple signals to a single communication line. With these multiplexers, it is possible to connect up to 64 different signals (4 multiplexers × 16 channels) while only using 6 pins on the microcontroller.</p>
<h3 class="anchor anchorTargetStickyNavbar_lB72" id="pin-connection-breakdown">Pin connection breakdown<a href="https://blog.sigsegowl.xyz/2025/03/01/midi-slayer-one#pin-connection-breakdown" class="hash-link" aria-label="Direct link to Pin connection breakdown" title="Direct link to Pin connection breakdown" translate="no">​</a></h3>
<ul>
<li class=""><strong>Enable (EN) Pins</strong>: These control which multiplexer is active</li>
<li class=""><strong>Select Pins (S0-S4)</strong>: Used to choose a specific channel (0-15)</li>
<li class=""><strong>Signal (SIG) Pin</strong>: The communication line for reading or writing</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_lB72" id="reading-channels-step-by-step">Reading channels: step by step<a href="https://blog.sigsegowl.xyz/2025/03/01/midi-slayer-one#reading-channels-step-by-step" class="hash-link" aria-label="Direct link to Reading channels: step by step" title="Direct link to Reading channels: step by step" translate="no">​</a></h3>
<p>Here's the systematic process for reading all channels:</p>
<ol>
<li class="">Enable a specific multiplexer by activating its <strong>EN</strong> pin</li>
<li class="">Use the <strong>S0</strong>-<strong>S4</strong> pins to select a specific channel (0-15)</li>
<li class="">Read the signal on the <strong>SIG</strong> pin</li>
<li class="">Repeat for all 16 channels</li>
<li class="">Move to the next multiplexer and repeat</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_lB72" id="writing-channels-leds">Writing channels: LEDs<a href="https://blog.sigsegowl.xyz/2025/03/01/midi-slayer-one#writing-channels-leds" class="hash-link" aria-label="Direct link to Writing channels: LEDs" title="Direct link to Writing channels: LEDs" translate="no">​</a></h3>
<p>This setup isn't just for reading signals. It works beautifully for:</p>
<ul>
<li class="">Reading potentiometer values</li>
<li class="">Reading button states</li>
<li class="">Controlling LEDs</li>
</ul>
<p>By rapidly cycling through channels, you can control LEDs without noticeable flickering. The speed of modern microcontrollers and the persistence of vision makes this possible.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="additional-component-connections">Additional component connections<a href="https://blog.sigsegowl.xyz/2025/03/01/midi-slayer-one#additional-component-connections" class="hash-link" aria-label="Direct link to Additional component connections" title="Direct link to Additional component connections" translate="no">​</a></h2>
<p>Not everything needs a multiplexer. For instance, the two rotary encoders connect directly to the microcontroller, requiring only three pins each:</p>
<ul>
<li class="">Clock (CLK)</li>
<li class="">Data Transfer (DT)</li>
<li class="">Switch (SW)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="wiring">Wiring<a href="https://blog.sigsegowl.xyz/2025/03/01/midi-slayer-one#wiring" class="hash-link" aria-label="Direct link to Wiring" title="Direct link to Wiring" translate="no">​</a></h2>
<p>My wiring still got slightly out of hand, but the four multiplexers significantly reduced the complexity and pin requirements, making this project a lot more accessible. When designing complex electronic systems, always look for ways to reduce direct pin connections. Multiplexers, shift registers, and other expansion techniques can be game-changers.</p>
<p>Anyways here's a picture of the wiring. To simplify the microcontroller connection, a green prototyping PCB connects all the signal (SIG), enable (EN), and channel (C0-C15) pins of the four blue multiplexer boards, effectively creating a centralized wiring hub.</p>
<p><img decoding="async" loading="lazy" alt="Wiring setup" src="https://blog.sigsegowl.xyz/assets/images/midi-controller-wiring-20597757aa8a1297c80114508b1fdaa5.jpg" width="915" height="649" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="microcontroller">Microcontroller<a href="https://blog.sigsegowl.xyz/2025/03/01/midi-slayer-one#microcontroller" class="hash-link" aria-label="Direct link to Microcontroller" title="Direct link to Microcontroller" translate="no">​</a></h2>
<p>To power this project, I selected the <strong>ESP32-S2</strong> microcontroller—specifically the <strong>T8-ESP32-S2-WOOR v1.1</strong>—which brings several capabilities to our design. This microcontroller is particularly well-suited for this MIDI controller project due to the following features:</p>
<ul>
<li class="">Native USB functionality, allowing it to act as a MIDI class USB device</li>
<li class="">Integrated WiFi for network connectivity</li>
<li class="">Sufficient processor power to handle multiple tasks</li>
<li class="">Flexible configuration options through onboard dip switches</li>
</ul>
<p>The dip switches provide a crucial flexibility for device mode selection. They allow toggling between two USB modes:</p>
<ol>
<li class=""><strong>USB</strong> mode: Debugging and development</li>
<li class=""><strong>OTG</strong> (On-The-Go) mode: In our specific implementation, this enables MIDI device functionality</li>
</ol>
<p>This microcontroller's ability to rapidly iterate through connected components while simultaneously performing signal filtering makes it an excellent choice for complex input mapping and real-time music interface applications.</p>
<p><img decoding="async" loading="lazy" alt="ESP32-S2 microcontroller" src="https://blog.sigsegowl.xyz/assets/images/esp32-s2-micro-1-487d8fd50b96a81463aaa614416b59b5.jpg" width="868" height="504" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="Dip switches" src="https://blog.sigsegowl.xyz/assets/images/dip-switches-080756913c79b25e030bbd735a917035.jpg" title="width: 214px" width="264" height="158" class="img_XUCP"></p>
<p>The microcontroller's dip switches create a programming limitation: <strong>USB</strong> mode is required for firmware uploads, while <strong>OTG</strong> mode enables MIDI device functionality. Once the microcontroller is built into the case, the dip switches aren't easily accessible anymore. However, this isn't a significant issue. The initial firmware can be loaded via USB, and subsequent updates can be performed wirelessly using the built-in WiFi through Over-The-Air (OTA) updates. This means you'll only need a physical USB connection once to set up the device, with all future firmware updates happening seamlessly over the network.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="software">Software<a href="https://blog.sigsegowl.xyz/2025/03/01/midi-slayer-one#software" class="hash-link" aria-label="Direct link to Software" title="Direct link to Software" translate="no">​</a></h2>
<p>Here's the repository with the code: <a href="https://github.com/AJ92/midi-slayer-one" target="_blank" rel="noopener noreferrer" class="">https://github.com/AJ92/midi-slayer-one</a></p>
<p>Building the firmware should be done with the Arduino IDE in version 2.x, and ESP32 board manager in version 2.0.4. <strong>Version 3.x and newer do not work!</strong> Same goes for <strong>EspTinyUSB</strong> dependency. It has to be the one mentioned in the readme.</p>
<p>The microcontroller implements button <strong>debouncing</strong> and potentiometer value <strong>filtering</strong> to reduce analog signal noise and jitter. These signal processing techniques smooth out input signals but can introduce slight input lag. The filtering parameters are configurable, allowing users to balance signal stability and responsiveness according to their specific needs. By mitigating noise from analog inputs and multiplexing, the controller ensures more reliable and consistent performance.</p>
<p><strong>OTA firmware updates</strong> are enabled by holding button B0 for 5 seconds after connecting power via USB. All LEDs light up and the ESP32 connects to the hardcoded WiFi access point. The firmware can be uploaded via any browser. After the update the ESP32 has to be restarted. Disconnect and connect it again.</p>
<p><strong>Calibrating potentiometer</strong> center and end points is done by holding the button B12 for 5 seconds after connecting power via USB. All LEDs start to blink. Move all potentiometers to their minimum, then to their maximum, and center them. Once all of them are centered, press B12 again, and the calibration is stored.</p>
<p>After wiring make sure to use the correct PINs. Adjust <a href="https://github.com/AJ92/midi-slayer-one/blob/main/midictrl/midictrl.ino" target="_blank" rel="noopener noreferrer" class="">this file</a> to your PIN layout!</p>
<p>For Mixxx you can import the controller mapping <strong>midi-slayer-one.midi.xml</strong> linked below.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="pictures">Pictures<a href="https://blog.sigsegowl.xyz/2025/03/01/midi-slayer-one#pictures" class="hash-link" aria-label="Direct link to Pictures" title="Direct link to Pictures" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="CAD model" src="https://blog.sigsegowl.xyz/assets/images/midi-ctrl-cad-1024x678-cfec771f0e0f497bbb093be6bda7c8f4.jpg" width="1024" height="678" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Photo 1" src="https://blog.sigsegowl.xyz/assets/images/photo_2025-03-01_00-18-38-1024x577-ad6240fd7a7a6dbd6768fc2da5b3ab70.jpg" width="1024" height="577" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Photo 2" src="https://blog.sigsegowl.xyz/assets/images/photo_2025-02-28_20-48-50-1024x577-b24c68fb8ca80853bae1174a033a3635.jpg" width="1024" height="577" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Photo 3" src="https://blog.sigsegowl.xyz/assets/images/photo_2025-02-28_20-48-52-1024x577-d0d53f2c37b1c68b1bbe26704418a574.jpg" width="1024" height="577" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Photo 4" src="https://blog.sigsegowl.xyz/assets/images/photo_2025-02-28_20-48-53-1024x577-648b5985bcdc0638a61efa38bd7badb4.jpg" width="1024" height="577" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Photo 5" src="https://blog.sigsegowl.xyz/assets/images/photo_2025-02-28_20-44-12-1-1024x577-9847f779856859c037d2b7b22b0d24bc.jpg" width="1024" height="577" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="downloads">Downloads<a href="https://blog.sigsegowl.xyz/2025/03/01/midi-slayer-one#downloads" class="hash-link" aria-label="Direct link to Downloads" title="Direct link to Downloads" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://blog.sigsegowl.xyz/assets/files/midi-slayer-one.midi.xml_-b0b4c3a25f283eb331bddb49ec72acdb.zip" target="_blank" class="">midi-slayer-one.midi.xml.zip</a></li>
<li class=""><a href="https://blog.sigsegowl.xyz/assets/files/midictrl-b12e72362be34a9131d50604612dc6f4.zip" target="_blank" class="">cad-midictrl.zip</a></li>
</ul>]]></content:encoded>
            <category>diy</category>
        </item>
        <item>
            <title><![CDATA[pr0p]]></title>
            <link>https://blog.sigsegowl.xyz/2024/08/25/pr0p</link>
            <guid>https://blog.sigsegowl.xyz/2024/08/25/pr0p</guid>
            <pubDate>Sun, 25 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[pr0p screenshot]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="pr0p screenshot" src="https://blog.sigsegowl.xyz/assets/images/pr0p_screenshot_2-1024x535-951caa9fec00c7be50ae8eaf5dff0ec4.jpg" width="1024" height="535" class="img_XUCP"></p>
<p>I had the idea to simulate a <a href="https://betaflight.com/" target="_blank" rel="noopener noreferrer" class="">Betaflight</a> flight controller for some time and, in 2023, I began porting the code to C#. However, I soon discovered that Betaflight already had a target that does exactly this! The <a href="https://betaflight.com/docs/development/sitl" target="_blank" rel="noopener noreferrer" class="">SITL</a> (Software in the Loop) target can be built on a Linux machine and even runs smoothly in WSL (Windows Subsystem for Linux), which is fantastic. However, this setup presents several challenges for the average Windows user.</p>
<!-- -->
<p>First, WSL as a dependency complicates the setup. Installing WSL can be a significant hurdle for inexperienced users, and to make matters worse, the host IP address tends to change after each restart. While this issue can be addressed with scripts and IP queries, I wanted to avoid that level of complexity. Diagnosing such problems remotely, especially for non-tech-savvy users, can be difficult, and it also introduces platform dependency. Don’t believe me? Try setting it up yourself using the official guide: <a href="https://betaflight.com/docs/development/sitl" target="_blank" rel="noopener noreferrer" class="">Betaflight SITL Guide</a>.</p>
<p>The second major problem is the ping-pong like synchronous communication over the network stack between the virtual flight controller (SITL) and the simulation. The SITL process waits for updated simulation data (fdmPkt) and then generates motor outputs (pwmPkt) that are sent back to the simulation. The simulation interprets these motor outputs and adjusts the virtual quadcopter's orientation accordingly. This, in turn, creates new gyro input for the SITL, and the loop repeats. However, this introduces latency and undesirable artifacts in the simulation, such as sudden jumps in RC data, gyro input, or motor outputs. These issues arise when the simulation doesn't run a perfectly timed, high-frequency update loop, which is virtually impossible. You can check out the code <a href="https://github.com/betaflight/betaflight/blob/master/src/main/target/SITL/sitl.c" target="_blank" rel="noopener noreferrer" class="">here</a>. It's extremely simple: it receives inputs and responds with outputs. While this simplicity likely aims to offer flexibility, it also limits how fast updates can be processed. Given that an average quadcopter processes gyro samples at 4kHz, you only have 0.25 ms to run the simulation, including the overhead caused by UDP-based network communication, threading, and the OS scheduler!</p>
<p>And lastly, where are the OSD and blackbox features? Unfortunately, SITL doesn’t include these out of the box.</p>
<p>Fortunately, <a href="https://github.com/timower/KwadSim" target="_blank" rel="noopener noreferrer" class="">KwadSim</a> and its counterpart, <a href="https://github.com/timower/KwadSimSITL" target="_blank" rel="noopener noreferrer" class="">KwadSimITL</a>, were mentioned on the <a href="https://discord.betaflight.com/invite" target="_blank" rel="noopener noreferrer" class="">Betaflight Discord</a>, and they address some of the shortcomings of the Betaflight SITL target. First off, KwadSim comes with a Windows CMake toolchain that uses <a href="https://www.mingw-w64.org/" target="_blank" rel="noopener noreferrer" class="">MinGW</a>, eliminating the need for WSL. That's a big win—no more WSL dependency!</p>
<p>KwadSimITL also features parameterized physics and allows to run multiple simulation steps with a single input. In other words, a single input packet can generate a finer simulation resolution. This shifts some of the computational load from the game client to the SITL process, as a low-frequency game physics loop can trigger multiple SITL physics updates. For example, the game client's physics loop might run at 60Hz, but each update could trigger 100 SITL physics updates, providing the PID loop with 6kHz of fresh, unique gyro inputs.</p>
<p>But that’s not all—OSD and blackbox recording are already integrated and fully functional.</p>
<p>However, KwadSimITL isn't without its flaws. The project hasn't been updated since early 2020 and is based on Betaflight version 4.1.0, which is quite outdated. But the most significant challenge for me was the game client. KwadSim uses Godot 3.2, a game engine I have no experience with. So, I decided to rewrite the game client from scratch in <a href="https://unity.com/" target="_blank" rel="noopener noreferrer" class="">Unity</a>—and that’s how <a href="https://pr0p.dev/" target="_blank" rel="noopener noreferrer" class="">pr0p</a> was born.</p>
<p>This is my attempt at creating a quad copter simulation based on the previous work of KwadSimITL and a few of the biggest problems I tried to solve.</p>
<video width="100%" controls="" src="https://fpvcat.sigsegowl.xyz/file/9fdc9cbf-1f0b-4010-b9b2-cc4b182781e6"></video>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="fun-with-state-updates">fun with state updates<a href="https://blog.sigsegowl.xyz/2024/08/25/pr0p#fun-with-state-updates" class="hash-link" aria-label="Direct link to fun with state updates" title="Direct link to fun with state updates" translate="no">​</a></h2>
<p>Updating the simulation state across two processes was a tough challenge, particularly because any added latency in this step was immediately noticeable in the overall flight experience. Since the default SITL target simply responds to requests from the simulation process, it's important to understand the relationship between these two processes.</p>
<p><img decoding="async" loading="lazy" alt="Process relationship between the simulation and SITL" src="https://blog.sigsegowl.xyz/assets/images/image-3-0ea9581b25b2d339b42222755f0e76e4.png" width="1093" height="165" class="img_XUCP"></p>
<p>It's worth noting that while the functions used to demonstrate this timing problem may not take long in practice, they help illustrate the issue. Let’s assume the simulation runs at 60Hz, and the "simulate" function of the simulation process generates a new simulation state (fdmPkt) for the SITL process. The SITL process then receives this data, generates motor outputs (pwmPkt), and sends them back to the simulation process. Once the motor outputs are received, the simulation updates its state in the next step, feeding the new information back to the SITL process, and the loop continues.</p>
<p>If the goal is to reduce latency by pushing the update frequency to its limits, the process would look something like this:</p>
<p><img decoding="async" loading="lazy" alt="High frequency update loop between the simulation and SITL" src="https://blog.sigsegowl.xyz/assets/images/image-373af1685e2402f9bf1cb482fc2ddce6.png" width="968" height="165" class="img_XUCP"></p>
<p>The gap between function pairs narrows, and simulations are called more frequently than before. However, the update frequency can only be pushed so far—if it goes too high, the simulation may miss motor inputs. If the simulation runs ahead without waiting for fresh motor outputs, it ends up calculating two packets based on the same motor data.</p>
<p><img decoding="async" loading="lazy" alt="Simulation running ahead of the motor outputs" src="https://blog.sigsegowl.xyz/assets/images/image-2-ef934613e62dae3d6d6fb9ba0138601f.png" width="1032" height="165" class="img_XUCP"></p>
<p>Why is this behavior undesirable?</p>
<p>In simple terms, the simulation requests new motor output values from the SITL process. SITL’s PID loop calculates these motor outputs, and the simulation uses them to update the quadcopter's orientation. If the simulation step begins before receiving fresh motor outputs, it calculates the orientation based on outdated data. In the worst case, the new orientation will be the same as the previous one, or it may miss a critical change that would have occurred with the updated motor outputs. When this stale orientation data is fed back into the PID loop, the motor outputs may increase because no orientation change was detected. It’s as if an external force is preventing the quadcopter from responding to control inputs for an additional simulation step.</p>
<p>This effect is something most people have experienced in real life: if a quadcopter’s motors are spinning without propellers and it’s armed with RC inputs requesting orientation changes, the motors will keep increasing RPMs. This happens because the flight controller detects no orientation change, even though the motors are spinning faster and faster, so it continues to push harder.</p>
<p>To summarize, SITL needs input that reflects the previous output—meaning the orientation must respond to motor outputs with every round trip. If this isn’t guaranteed, motor outputs may become higher than expected, either for single or multiple update steps.</p>
<p>KwadSim(ITL) has a nice concept for this problem. It introduced 2 simulations, one for each process. The SITL process has it's own physics simulation, the same that the game client has and both run more or less independent fom each other, but include updates from each other. The game client receives the orientation and acceleration updates, calculated from SITL physics updates, and the game client sends its version of these values back.</p>
<p>This concept is modified slightly for pr0p and its SITL fork, <a href="https://github.com/AJ92/SimITL" target="_blank" rel="noopener noreferrer" class="">SimITL</a>. The game client (pr0p) handles the complex task of calculating collisions between the quadcopter and the environment, which can be CPU-intensive. SimITL, on the other hand, focuses solely on quadcopter physics—handling the motors, propellers, frame, and overall behavior as if the quadcopter were flying in free space without obstacles or collisions. This makes SimITL’s task simpler and less CPU-intensive per update step, allowing it to run at a much higher frequency—currently around 3.2kHz—to generate realistic motor noise. The game client, meanwhile, skips these detailed flight dynamics calculations and simply incorporates the acceleration updates from the SimITL process whenever they are received.</p>
<p><img decoding="async" loading="lazy" alt="pr0p simulation update timing" src="https://blog.sigsegowl.xyz/assets/images/image-1-08ba9e1a2c9803ff9addfe29e50ef003.png" width="1875" height="151" class="img_XUCP"></p>
<p>This diagram illustrates pr0p’s simulation updates, which are executed almost simultaneously at a single time point (7 state packets in the first line) due to Unity's physics simulation running in a simple loop with constant time deltas. Thanks to the rapid response from SITL (first packet in the second line), pr0p is able to incorporate this new data into one of its subsequent state updates. The time scale is in microseconds, and the events were recorded using Wireshark. Notably, the SITL process responds incredibly quickly to pr0p's initial state update—within approximately 40 microseconds in this specific time window. This near-instant response is achieved by using separate threads for networking on both sides, which actively spin to immediately respond to incoming data.</p>
<p>The beauty of this approach lies in its speed, even when operating over the network stack. Both processes integrate new packets immediately upon receipt, while SITL fills in the gaps by calculating finer steps between packets to generate more realistic motor and propeller noise. In the event of a collision, pr0p uses its own physics engine to handle the majority of the calculations, blending them with SITL's orientation data. This combined result is then fed back to SITL, allowing the flight controller to respond accurately to collisions.</p>
<p>Of course, this entire process is a simplified depiction. Input queues can discard packets if too many are received before processing, which may lead to sudden jumps in orientation and cause the PID loop to react harshly. Additionally, the operating system's scheduler can delay the execution of a process, potentially preventing an immediate response from SITL. Despite these challenges, the system performs well overall, delivering a convincing flight experience with impressive responsiveness and reasonable CPU utilization.</p>
<p>Update:</p>
<p>I received a suggestion to simplify and speed up the process by building SITL as a shared library and calling the simulation functions directly from the fixed game loop. After adjusting the interface and tinkering with compiler settings, I now have a native SITL library that performs faster than all previously mentioned methods. The result? Noticeably reduced latency and lower CPU load. Gone are the unnecessary spinning threads waiting for packets—now it's just efficient, direct function calls.</p>
<p>You can try it yourself—available since version 0.8.x <a href="https://pr0p.dev/download" target="_blank" rel="noopener noreferrer" class="">pr0p.dev/download</a></p>]]></content:encoded>
            <category>drones</category>
            <category>pr0p</category>
            <category>simitl</category>
        </item>
        <item>
            <title><![CDATA[vtx-slayer-one]]></title>
            <link>https://blog.sigsegowl.xyz/2022/05/01/vtx-slayer-one</link>
            <guid>https://blog.sigsegowl.xyz/2022/05/01/vtx-slayer-one</guid>
            <pubDate>Sun, 01 May 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[At the end of 2020 I started to fly quadcopters, and I got hooked! The freedome to fly how ever you want is awesome, but can also lead to damaged hardware pretty quick. My first copter was the HGLRC XJB 145 v1.2, which I destroyed a few times within the first 10 flights. RX loss has lead to a bad crash where I've broken one of its arms. This means I had to wait a few weeks for a replacement bottom plate. I also had problems with the VTX antenna after it got pulled a few times. Little did I know, as this damaged antenna destroyed a handfull of VTXs, but the worst part was the frame, which was a bit tricky to assemble. It was rather cramped, and every time you put it together something wasn't fitting 100% correct.]]></description>
            <content:encoded><![CDATA[<p>At the end of 2020 I started to fly quadcopters, and I got hooked! The freedome to fly how ever you want is awesome, but can also lead to damaged hardware pretty quick. My first copter was the <strong>HGLRC XJB 145 v1.2</strong>, which I destroyed a few times within the first 10 flights. RX loss has lead to a bad crash where I've broken one of its arms. This means I had to wait a few weeks for a replacement bottom plate. I also had problems with the VTX antenna after it got pulled a few times. Little did I know, as this damaged antenna destroyed a handfull of VTXs, but the worst part was the frame, which was a bit tricky to assemble. It was rather cramped, and every time you put it together something wasn't fitting 100% correct.</p>
<p><img decoding="async" loading="lazy" alt="HGLRC XJB 145 v1.2 disassembled to replace the vtx." src="https://blog.sigsegowl.xyz/assets/images/xjb-assemble-1024x768-8f967811548e387d14ba923e55f87f06.jpg" width="1024" height="768" class="img_XUCP"></p>
<!-- -->
<p>After another bad crash in a tall tree and a recovery a few weeks later, the copter was in a bad shape and I decided to improve the disassemble/assemble process by using a single TPU canopy, instead of 3 carbon fiber plates ( 2 side plates + top plate + 4 standoffs ).</p>
<p><img decoding="async" loading="lazy" alt="recovered from tree" src="https://blog.sigsegowl.xyz/assets/images/xjb-tree-recovery-e1651401728511-6cff13c5bc0b4c4d37d86fd82d29262b.jpg" width="944" height="531" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="tpu canopy upgrade" src="https://blog.sigsegowl.xyz/assets/images/xjb-tpu-canopy-e1651401751239-d70d97137bb352abc8896a5ef0980fe9.jpg" width="886" height="499" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="design">Design<a href="https://blog.sigsegowl.xyz/2022/05/01/vtx-slayer-one#design" class="hash-link" aria-label="Direct link to Design" title="Direct link to Design" translate="no">​</a></h2>
<p>Now that the copter is discontinued and the replacement parts will be unavailable soon, I decided to design my own <strong>3"</strong> frame, which should be extremely durable, a bit more roomy inside, and easy to assemble / swap out broken parts. I started by scanning the remaining <strong>XJB 145</strong> frame plate I had, so the mounting holes for the motors and stack would be perfect. The frame was streched a bit to have more room inside and fit a bigger camera, which was a problem bofore and lead to the tall TPU canopy to clear the propellers. In addition to that, the most important update was durability. I wanted to get away from the 3mm thick bottom carbon fiber plate and use 5mm thick independant arms, so the arm mounting concept of the <strong>five33 switchback pro</strong> frame got adopted.</p>
<p><img decoding="async" loading="lazy" alt="first test printed iteration in PLA" src="https://blog.sigsegowl.xyz/assets/images/xjb-clone-1024x577-6f93f690aadac10bd6f4da6c1ab4985f.jpg" width="1024" height="577" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="arm mounting concept" src="https://blog.sigsegowl.xyz/assets/images/vtx-slayer-one-arms-a84c6d2555959b32f750f2d0a1dda6a7.jpg" width="553" height="320" class="img_XUCP"></p>
<p>Each arm is held in place by one single screw, which goes through a bottom plate, the arm, a top plate and screws into a pressnut on the upper plate and into a standoff. Those screws are m3 now, to withstand crashes better and a single screw is enough here, as the arms fit like a puzzle into the center wiggle plate, and can not rotate anymore. A lower and upper carbon fiber plate is pressing them thogether and the arms are sitting perfectly tight in frame. The 2mm thick center wiggle plate has 4 screws for the stack and at the same time holds itself to the upper plate of the arm sandwich. The 3mm gap between the wiggle plate and the lower plate is reserved for a lipo strap.</p>
<p><img decoding="async" loading="lazy" alt="bottom, center and upper plate holding the arms" src="https://blog.sigsegowl.xyz/assets/images/vtx-slayer-one_bottom-1024x582-3b48a307ac982e51f9fe4ebb54c531af.jpg" width="1024" height="582" class="img_XUCP"></p>
<p>The bottom plate has a front grill to provide a little bit of impact protection for the camera and holes and space to mount additional hardware like a <strong>buzzer</strong> or a <strong>RX</strong>. The upper plate has also a small grill which can be used to ziptie a capacitor if needed.</p>
<p>Two spikes for the arms should protect the motors from impacts. Also the arms are now a bit thinner and have a cross section of 6mm x 5mm. This reduces blocking of the airflow, but still provides enough strength to survive a few crashes.</p>
<p>A top plate, camera and antenna mount complete the <strong>vtx-slayer-one</strong>. The mounts are 3d printed with TPU and are flexible enough to survive crashes without breaking immediately and still protect the camera and antenna. The top plate has holes to mount additional hardware like a camera.</p>
<p><img decoding="async" loading="lazy" alt="final cad design of the vtx-slayer-one" src="https://blog.sigsegowl.xyz/assets/images/vtx-slayer-one-e1651398621186-1024x672-6d5884aea19090553971b337568135d2.jpg" width="1024" height="672" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="first-prototype">First prototype<a href="https://blog.sigsegowl.xyz/2022/05/01/vtx-slayer-one#first-prototype" class="hash-link" aria-label="Direct link to First prototype" title="Direct link to First prototype" translate="no">​</a></h2>
<p>The final cad design was sent to a fpv buddy with a cnc milling machine for final checks of holes and tolerances. ~43 grams should be the total weight of the frame with m3 screws and aluminum standoffs.</p>
<p><img decoding="async" loading="lazy" alt="cnc milling in water bath" src="https://blog.sigsegowl.xyz/assets/images/photo_2022-05-01_14-19-34-114ee1862754de0df46683d3cf644451.jpg" width="960" height="1280" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="cnc cut arms" src="https://blog.sigsegowl.xyz/assets/images/photo_2022-05-01_14-19-33-2-358c5f4eb3d277a8d81c99b33c727040.jpg" width="960" height="1280" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="final frame (m2 screws and standoffs)" src="https://blog.sigsegowl.xyz/assets/images/photo_2022-05-01_14-19-33-2737279b407a2328717b20fd003197c7.jpg" width="1280" height="721" class="img_XUCP"></p>
<p>By adding new spare motors, a <strong>runcam phoenix 2</strong> camera, the original hglrc stack ( esc + fc ), a new <strong>elrs happymodel EP2 RX</strong> and a new <strong>EWRF E7082VM VTX</strong>, the build was complete. Total weight with a 850mAh 4s lipo is ~280g. On the software side the rx received a fw update, and the vtx was flashed with <a href="https://github.com/OpenVTx/OpenVTx" target="_blank" rel="noopener noreferrer" class="">openVTX</a>. After fixing motor directions and configuring <a href="https://betaflight.com/" target="_blank" rel="noopener noreferrer" class="">betaflight</a> the 3" <strong>vtx-slayer-one</strong> was ready for its first flight.</p>
<p><img decoding="async" loading="lazy" alt="Photo 1" src="https://blog.sigsegowl.xyz/assets/images/photo_2022-05-01_14-39-34-1024x577-7e0b17e97717b504c30f0e74a480171f.jpg" width="1024" height="577" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="Photo 2" src="https://blog.sigsegowl.xyz/assets/images/photo_2022-05-01_14-39-38-1024x577-06cb5ee70575ffb1b26195048fd3fc35.jpg" width="1024" height="577" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="Photo 3" src="https://blog.sigsegowl.xyz/assets/images/photo_2022-05-01_14-39-42-1024x577-fa32a3e1df409c593ec160a655db4d7a.jpg" width="1024" height="577" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="Photo 4" src="https://blog.sigsegowl.xyz/assets/images/photo_2022-05-01_14-39-47-1024x577-19c63334081604ef923e262868ba9dba.jpg" width="1024" height="577" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="assembly">Assembly<a href="https://blog.sigsegowl.xyz/2022/05/01/vtx-slayer-one#assembly" class="hash-link" aria-label="Direct link to Assembly" title="Direct link to Assembly" translate="no">​</a></h2>
<video width="100%" controls="" src="./files/Vtx-Slayer-1.0-V68-1.webm"></video>
<p>Parts:</p>
<ul>
<li class="">1x topplate 1,5mm</li>
<li class="">4x arms 5mm</li>
<li class="">1x top sandwich plate 2mm (for arm and stack mount)</li>
<li class="">1x bottom sandwich plate 2mm (for arm mount and stack mount)</li>
<li class="">1x armconnector 2mm (center wiggle plate for arm mount)</li>
<li class="">5x M3x8mm</li>
<li class="">5x M3x16mm</li>
<li class="">5x pressnuts</li>
<li class="">16x M2x7mm motorscrews</li>
<li class="">4x M2x20mm stackscrews</li>
<li class="">8x M2 (nylock)nuts for stack screws</li>
<li class="">1x TPU cam mount</li>
<li class="">1x TPU dipole antenna mount</li>
<li class="">4x M3x20mm standoffs (15mm for a slammed build)</li>
</ul>
<p>Cost ~46€</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="the-4-variant-on-the-race-track">The 4" variant on the race track<a href="https://blog.sigsegowl.xyz/2022/05/01/vtx-slayer-one#the-4-variant-on-the-race-track" class="hash-link" aria-label="Direct link to The 4&quot; variant on the race track" title="Direct link to The 4&quot; variant on the race track" translate="no">​</a></h2>
<p>The 4" frame with 1407 3700KV (4s) motors performed decent during DCS Aichtal. Rear motors became hot, but that's the only problem i experienced. Arms and the frame in general experienced no noticable damage, even after a few midairs. Over 55 packs where flown during the event, all on one quadcopter.</p>
<video width="100%" controls="" src="https://fpvcat.sigsegowl.xyz/file/12efeb86-4cd8-45df-ace4-31fa53190208"></video>
<p>After an upgrade to 1606 3300KV (4s) motors over 36 packs where emtied with the same quadcopter that I used during DCS and the same overall reliability could be observer. No broken motors, no broken arms. I also used the same old props.</p>
<video width="100%" controls="" src="https://fpvcat.sigsegowl.xyz/file/e9e754c1-024d-4dc1-b03a-8f067b5510e6"></video>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="update-13">Update 1.3<a href="https://blog.sigsegowl.xyz/2022/05/01/vtx-slayer-one#update-13" class="hash-link" aria-label="Direct link to Update 1.3" title="Direct link to Update 1.3" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="vtx-slayer-one 1.3 design" src="https://blog.sigsegowl.xyz/assets/images/grafik-1-1024x638-3d4b0d4347189707a95fb36a0229d677.png" width="1024" height="638" class="img_XUCP"></p>
<ul>
<li class="">
<p>increased arm strength around the motor holes</p>
</li>
<li class="">
<p>added 25.5 x 25.5 mm stack/AIO mounting holes</p>
</li>
<li class="">
<p>added 20 x 20 mm mounting holes to the top plate (e.g. vista mount)</p>
</li>
<li class="">
<p>added new vtx antenna mount</p>
</li>
<li class="">
<p><a href="https://blog.sigsegowl.xyz/assets/files/VTX-SLAYER-1.3-54835cc31281323ca0453d19f1d28c45.zip" target="_blank" class="">VTX-SLAYER-1.3.zip</a></p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="update-14">Update 1.4<a href="https://blog.sigsegowl.xyz/2022/05/01/vtx-slayer-one#update-14" class="hash-link" aria-label="Direct link to Update 1.4" title="Direct link to Update 1.4" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="vtx-slayer-one 1.4 design" src="https://blog.sigsegowl.xyz/assets/images/image-1024x593-282f128e77c8d5c9b049708584470723.png" width="1024" height="593" class="img_XUCP"></p>
<ul>
<li class="">
<p>4" arms</p>
</li>
<li class="">
<p>caddx vista antenna mount</p>
</li>
<li class="">
<p><a href="https://blog.sigsegowl.xyz/assets/files/VTX-SLAYER-1.4-afd6e15629c3848c3d088960f5f21c45.zip" target="_blank" class="">VTX-SLAYER-1.4.zip</a></p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="update-22">Update 2.2<a href="https://blog.sigsegowl.xyz/2022/05/01/vtx-slayer-one#update-22" class="hash-link" aria-label="Direct link to Update 2.2" title="Direct link to Update 2.2" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="vtx-slayer-one 2.2 design" src="https://blog.sigsegowl.xyz/assets/images/slayer-2.2-1024x759-7aa7175326a7decb66aea75cf8ce98b1.jpg" width="1024" height="759" class="img_XUCP"></p>
<ul>
<li class="">
<p>TPU canopy</p>
</li>
<li class="">
<p>amost-true-x arm layout</p>
</li>
<li class="">
<p>removed press-nuts, thick enough standoffs are enough</p>
</li>
<li class="">
<p>parametric arm length</p>
</li>
<li class="">
<p><a href="https://blog.sigsegowl.xyz/assets/files/slayer-4-v2.2-v21.f3z-aea80b7a931d2d2f94e2a0442e7bf383.zip" target="_blank" class="">VTX-SLAYER-2.2.zip</a></p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="update-23">Update 2.3<a href="https://blog.sigsegowl.xyz/2022/05/01/vtx-slayer-one#update-23" class="hash-link" aria-label="Direct link to Update 2.3" title="Direct link to Update 2.3" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="vtx-slayer-one 2.3 design" src="https://blog.sigsegowl.xyz/assets/images/slayer-2.3-1024x670-505fae8d6358924dae28b1055fe726bc.jpg" width="1024" height="670" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="broken arm around m3 screw" src="https://blog.sigsegowl.xyz/assets/images/broken-arm-8a5e33c1c27aebbe40db6665614c8364.jpg" width="604" height="340" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="led fin" src="https://blog.sigsegowl.xyz/assets/images/led-fin-656d278aea5c911ca1894a6e6ba0c277.jpg" width="898" height="506" class="img_XUCP"></p>
<ul>
<li class="">
<p>added 5cm LED strip insert in canopy fin</p>
</li>
<li class="">
<p>added strength to fin base</p>
</li>
<li class="">
<p>changed canopy air holes</p>
</li>
<li class="">
<p>stronger arms around m3 holes</p>
</li>
<li class="">
<p><a href="https://blog.sigsegowl.xyz/assets/files/slayer-4-v2.3-fcfd304f09e5cc01cfa56007ac0a286d.zip" target="_blank" class="">VTX-SLAYER-2.3</a></p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="split-canopy">Split canopy<a href="https://blog.sigsegowl.xyz/2022/05/01/vtx-slayer-one#split-canopy" class="hash-link" aria-label="Direct link to Split canopy" title="Direct link to Split canopy" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="split canopy design" src="https://blog.sigsegowl.xyz/assets/images/image-1024x876-ec6b9ebf901ed5189014b5c87eb3538f.png" width="1024" height="876" class="img_XUCP"></p>
<p>Cam part is split from rest of the canopy. This allows the fin to be printed upright, and has the benefit of easier access to the electronics, without removing the cam all the time.</p>
<ul>
<li class=""><a href="https://blog.sigsegowl.xyz/assets/files/slayer-4-v2.3-split-canopy-d114f0259bf9913b26a53a2d0c0e5533.zip" target="_blank" class="">slayer-4-v2.3-split-canopy</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="happy-pilots-">Happy pilots <!-- -->:D<a href="https://blog.sigsegowl.xyz/2022/05/01/vtx-slayer-one#happy-pilots-" class="hash-link" aria-label="Direct link to happy-pilots-" title="Direct link to happy-pilots-" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="original slayer one" src="https://blog.sigsegowl.xyz/assets/images/1663353921119-scaled-5ed16e9998b00c77e81c63c7154f6f3d.jpg" width="2560" height="1441" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="clone of the original one by pDR8iLQ4go" src="https://blog.sigsegowl.xyz/assets/images/IMG_3982-1024x768-f7a184037012b4a49ec2a71813e5ff40.jpg" width="1024" height="768" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="HD Zero build by ShepherdFPV" src="https://blog.sigsegowl.xyz/assets/images/IMG_20220515_130611-scaled-1a8e0b0645b755deac2fcce2ab227f59.jpg" width="2560" height="1440" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="DJI build by DaDesasta" src="https://blog.sigsegowl.xyz/assets/images/DSC06204-scaled-cdef2c66fec1263d3c6d3a748814c8cf.jpg" width="2560" height="1710" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="slammed HD Zero build by rumpelst1lzk1n" src="https://blog.sigsegowl.xyz/assets/images/rn_image_picker_lib_temp_3a3e95a3-aace-4ccc-8e15-1b3062a811e1-scaled-1ec29d996a9c5d699c40ffb8aadde172.jpg" width="2560" height="1920" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="led-slayer" src="https://blog.sigsegowl.xyz/assets/images/photo_2022-11-29_12-05-30-1024x577-b3e864a76304eec207f0bc17109c483f.jpg" width="1024" height="577" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="analog slayer by LegoRJ35" src="https://blog.sigsegowl.xyz/assets/images/IMG_20230101_161745-1024x768-0ff349229563c27ef1404a3197f34963.jpg" width="1024" height="768" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="fet(tec)-digi-slayer" src="https://blog.sigsegowl.xyz/assets/images/20230308_192627-914x1024-606be06f0b4df5a324378f0244c26d88.jpg" width="914" height="1024" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="slayer meetup" src="https://blog.sigsegowl.xyz/assets/images/20230722_204123-1024x768-19ddfbd719569ba7aa5c26690efd1e77.jpg" width="1024" height="768" class="img_XUCP"></p>]]></content:encoded>
            <category>drones</category>
            <category>vtx-slayer</category>
        </item>
        <item>
            <title><![CDATA[TeamSpeak 3 server update script]]></title>
            <link>https://blog.sigsegowl.xyz/2020/07/22/ts3-update-script</link>
            <guid>https://blog.sigsegowl.xyz/2020/07/22/ts3-update-script</guid>
            <pubDate>Wed, 22 Jul 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[This is the short TeamSpeak 3 server update script that I use on the blog server. The script takes one parameter, which is the url of the release archive. It downloads the archive, extracts it and copies the files into the directory of the running server.]]></description>
            <content:encoded><![CDATA[<p>This is the short <a href="https://www.teamspeak.com/en/downloads/#server" target="_blank" rel="noopener noreferrer" class="">TeamSpeak 3</a> server update script that I use on the blog server. The script takes one parameter, which is the url of the release archive. It downloads the archive, extracts it and copies the files into the directory of the running server.</p>
<!-- -->
<p>Two steps are needed around the script. The server service has to be stopped first, and it has to be started again after the script finished. The copy command writes into <code>ts3/</code>, which is the folder that holds the actual server files. Adjust that path for your layout.</p>
<div class="language-sh codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-sh codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token plain">#!/bin/sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">if [ $# -eq 0 ]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  then</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    echo "Add url parameter to download"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    exit</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir ts3_dl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">wget $1 -P ts3_dl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tar -xjf ts3_dl/teamspeak3*.tar.bz2 -C ts3_dl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cp -r ts3_dl/teamspeak3*/* ts3/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">rm -r ts3_dl</span><br></div></code></pre></div></div>
<p>Run it like this, and give the archive url as the only argument:</p>
<div class="language-sh codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-sh codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token plain">./ts3-update.sh &lt;archive-url&gt;</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>tools</category>
            <category>linux</category>
        </item>
        <item>
            <title><![CDATA[helpfull goaccess commands]]></title>
            <link>https://blog.sigsegowl.xyz/2020/06/30/goaccess-commands</link>
            <guid>https://blog.sigsegowl.xyz/2020/06/30/goaccess-commands</guid>
            <pubDate>Tue, 30 Jun 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[I recently removed google analytics and found out about goaccess which just works with log files. So here are a few usefull commands for running goaccess on the command line with apache logs for future me and anybody else.]]></description>
            <content:encoded><![CDATA[<p>I recently removed google analytics and found out about <a href="https://goaccess.io/" target="_blank" rel="noopener noreferrer" class="">goaccess</a> which just works with log files. So here are a few usefull commands for running goaccess on the command line with apache logs for future me and anybody else.</p>
<!-- -->
<p>First change to the dir of the log file.</p>
<div class="language-text codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-text codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token plain">cd /var/log/apache2</span><br></div></code></pre></div></div>
<p>This line uses all <strong>access.log</strong> files, also those of previous days:</p>
<div class="language-text codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-text codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token plain">zcat access.log.*.gz | goaccess access.log --log-format=COMMON</span><br></div></code></pre></div></div>
<p>This line uses all <strong>other_vhosts_access.log</strong> files, also those previous days:</p>
<div class="language-text codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-text codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token plain">zcat other_vhosts_access.log.*.gz | goaccess other_vhosts_access.log --log-format=VCOMMON</span><br></div></code></pre></div></div>
<p>It should look something like this:</p>
<p><img decoding="async" loading="lazy" alt="go access" src="https://blog.sigsegowl.xyz/assets/images/goaccess-92f3691fd84b4ac0d4d6d841af544928.jpg" width="860" height="318" class="img_XUCP"></p>]]></content:encoded>
            <category>tools</category>
            <category>web</category>
        </item>
        <item>
            <title><![CDATA[benzine?]]></title>
            <link>https://blog.sigsegowl.xyz/2020/05/04/benzine-announcement</link>
            <guid>https://blog.sigsegowl.xyz/2020/05/04/benzine-announcement</guid>
            <pubDate>Mon, 04 May 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[What's benzine? That's the placeholder name of a project, I am working on for over a year now. It is supposed to be an online multiplayer game, based on the unity engine.]]></description>
            <content:encoded><![CDATA[<p>What's <strong>benzine</strong>? That's the placeholder name of a project, I am working on for over a year now. It is supposed to be an online multiplayer game, based on the unity engine.</p>
<p><img decoding="async" loading="lazy" alt="banner" src="https://blog.sigsegowl.xyz/assets/images/title-9e6e516c1ea3705fb9089667fe0b0f11.gif" width="600" height="256" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="what-is-it-about">What is it about?<a href="https://blog.sigsegowl.xyz/2020/05/04/benzine-announcement#what-is-it-about" class="hash-link" aria-label="Direct link to What is it about?" title="Direct link to What is it about?" translate="no">​</a></h2>
<p>As I am currently the only developer working on this game in my spare time, I want to keep the game fairly simple. It is a turn based online multiplayer strategy game with two sides, blue and red, that fight over resources, construct fortifications and try to eliminate each other.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="what-is-already-done">What is already done?<a href="https://blog.sigsegowl.xyz/2020/05/04/benzine-announcement#what-is-already-done" class="hash-link" aria-label="Direct link to What is already done?" title="Direct link to What is already done?" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="server log" src="https://blog.sigsegowl.xyz/assets/images/server-log-2-a806fcfeb314ac2410cd36d6a34ecb53.gif" width="600" height="200" class="img_XUCP"></p>
<p>Let's start with the server side. The server is powered by <a href="https://nodejs.org/" target="_blank" rel="noopener noreferrer" class="">https://nodejs.org/</a> and uses <a href="https://colyseus.io/" target="_blank" rel="noopener noreferrer" class="">https://colyseus.io/</a> to communicate with <a href="https://unity.com/" target="_blank" rel="noopener noreferrer" class="">https://unity.com</a> clients. Why nodejs and colyseus? It is cross-platform, runs fairly well on my vps, as well as local machine and is easy to deploy. And the most benefit is, no need to run unity on the server side.</p>
<p>Following components of the server are already more or less done:</p>
<ul>
<li class="">user registrations</li>
<li class="">user/client authentications</li>
<li class="">presistent data storage (pgsql)</li>
<li class="">game room creation</li>
<li class="">random map generation</li>
<li class="">unit creation</li>
<li class="">unit movement</li>
<li class="">unit attacks</li>
<li class="">turns</li>
<li class="">web based chat</li>
</ul>
<p><img decoding="async" loading="lazy" alt="movement of units" src="https://blog.sigsegowl.xyz/assets/images/move-bfd47edb1b7c501574a57675a4b934f2.gif" width="600" height="256" class="img_XUCP"></p>
<p>Why unity on the client side? This has a bunch of reasons, but just to name a few: unity is "free", has a ton of tutorials and a fairly nice documentation. Yes I point at you unreal! Get your docs together :). Did I mention it is cross platform? I plan to release the game as a mobile (android) version first.</p>
<p>The client side has already the following features:</p>
<ul>
<li class="">login screen</li>
<li class="">a simple main menu</li>
<li class="">join a game room</li>
<li class="">create a new game room</li>
<li class="">rejoin same game room on crash / lost connection</li>
<li class="">visualize the server's map</li>
<li class="">camera movement / zoom</li>
<li class="">basic unit movement</li>
<li class="">basic unit attacks</li>
<li class="">visualization of the unit's possible moves/attacks</li>
<li class="">basic UI</li>
<li class="">ingame chat</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="what-is-planned-">What is planned ?<a href="https://blog.sigsegowl.xyz/2020/05/04/benzine-announcement#what-is-planned-" class="hash-link" aria-label="Direct link to What is planned ?" title="Direct link to What is planned ?" translate="no">​</a></h2>
<p>There are quite a few features that I want to add, but at the moment I try to keep the feature set quite limited. Otherwise I fear that nothing will be finished in my life time...</p>
<p>The main goal is to get a simple online multiplayer game running, so at the beginning I will try to restrict myself to only implement the absolute basics like some sort of player level progression with basic statistics about the player. Something like the count of played, won and lost matches. Also the game mechanics will stay quite simple. There will be basic attacks for each unit type. The only differences will be how far and how strong attacks are based on the unit type and the current terrain the unit is positioned at. Looking at the first "playable" version, only a few components are missing. I need some sort of simple Ai, so users don't have to wait until someone is available to play against. And the game logic needs winning conditions, fancy animations and sounds.</p>
<p>I guess that's enough for a first post. I will try to post a bit more frequently about this project :)</p>]]></content:encoded>
            <category>games</category>
        </item>
        <item>
            <title><![CDATA[Compressor preview]]></title>
            <link>https://blog.sigsegowl.xyz/2019/05/27/compressor-preview</link>
            <guid>https://blog.sigsegowl.xyz/2019/05/27/compressor-preview</guid>
            <pubDate>Mon, 27 May 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[At the moment I only have limited mobile bandwidth but still like to browse the web and read some articles. The problem with browsing news sites or blogs or basically anything today is the massive bloat that comes along the small information one is actually looking for. As I don't care much about fancy css, js or images i decided to set up a small nodejs server app that loads the html document behind an url, strips all the bloat and only sends the text I want to read.]]></description>
            <content:encoded><![CDATA[<p>At the moment I only have limited mobile bandwidth but still like to browse the web and read some articles. The problem with browsing news sites or blogs or basically anything today is the massive bloat that comes along the small information one is actually looking for. As I don't care much about fancy css, js or images i decided to set up a small nodejs server app that loads the html document behind an url, strips all the bloat and only sends the text I want to read.</p>
<!-- -->
<p>This is compressor: <code>http://compressor.sigsegowl.xyz</code> (discontinued)</p>
<p>It only works more or less for static sites. Everything that requires a login on dynamic elements, forms, javascript or all the other fancy things won't work correctly.</p>
<p><img decoding="async" loading="lazy" alt="This is how a techcrunch article looks like." src="https://blog.sigsegowl.xyz/assets/images/techcrunch-1-25d3ceaa5eae545676db873ebbfff104.jpg" width="681" height="768" class="img_XUCP"></p>
<p><em>This is how a techcrunch article looks like.</em></p>
<p><img decoding="async" loading="lazy" alt="This is an arstechnica article." src="https://blog.sigsegowl.xyz/assets/images/arstechnica-f0cea2d4e6668f9b266e7bdf0b8bb99d.jpg" width="681" height="768" class="img_XUCP"></p>
<p><em>This is an arstechnica article.</em></p>
<p>Images are currently also replaced by a placeholder which links to the original just in case.</p>
<p>All links are replaced by a compressor link so following links should lead to the same stripping like opening an url.</p>
<p><del>If you like it, use it, if you abuse it, it will not stay public anymore! Source code will be released soon on github.</del></p>]]></content:encoded>
            <category>tools</category>
            <category>web</category>
        </item>
        <item>
            <title><![CDATA[Simple sharpen shader]]></title>
            <link>https://blog.sigsegowl.xyz/2018/09/27/simple-sharpen-shader</link>
            <guid>https://blog.sigsegowl.xyz/2018/09/27/simple-sharpen-shader</guid>
            <pubDate>Thu, 27 Sep 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[Use the mouse to adjust the sharpness:]]></description>
            <content:encoded><![CDATA[<p>Use the mouse to adjust the sharpness:</p>
<!-- -->
<iframe src="https://www.shadertoy.com/embed/XlycDV?gui=true&amp;t=10&amp;paused=true&amp;muted=false" allowfullscreen="" width="640" height="360" frameborder="0"></iframe>]]></content:encoded>
            <category>glsl</category>
            <category>rendering</category>
        </item>
        <item>
            <title><![CDATA[HwR, hardware sensor monitor for Android]]></title>
            <link>https://blog.sigsegowl.xyz/2018/05/22/hwr-hardware-sensor-monitor</link>
            <guid>https://blog.sigsegowl.xyz/2018/05/22/hwr-hardware-sensor-monitor</guid>
            <pubDate>Tue, 22 May 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[This post collects the whole history of one project. The desktop server HwInfoTransmitter reads the sensor data of your Windows machine, and the mobile client HwInfoReceiver, later called HwR, shows these sensors on your Android device. The notes below cover June 2014 until May 2018.]]></description>
            <content:encoded><![CDATA[<p>This post collects the whole history of one project. The desktop server HwInfoTransmitter reads the sensor data of your Windows machine, and the mobile client HwInfoReceiver, later called <strong>HwR</strong>, shows these sensors on your Android device. The notes below cover June 2014 until May 2018.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="the-idea-in-june-2014">The idea in June 2014<a href="https://blog.sigsegowl.xyz/2018/05/22/hwr-hardware-sensor-monitor#the-idea-in-june-2014" class="hash-link" aria-label="Direct link to The idea in June 2014" title="Direct link to The idea in June 2014" translate="no">​</a></h2>
<p>My laptop GPU died, and the engine work had to wait. So I started a small tool instead. It reads the sensor information of a desktop machine and sends it to an Android device for monitoring. The server reads the sensor data from <a href="http://www.hwinfo.com/" target="_blank" rel="noopener noreferrer" class="">HWInfo</a>, and the server side was almost done within weeks.</p>
<p><img decoding="async" loading="lazy" alt="HwInfoTransmitter on the desktop." src="https://blog.sigsegowl.xyz/assets/images/HwInfoTransmitter-300x185-372e33992e5538dfe0314ad7316defae.png" width="300" height="185" class="img_XUCP"></p>
<p>The plan for the code was this: the sensor retrieval server stays free and closed source, at least the sensor retrieval code and the shared memory layout. The Android client gets published without charge and might be fully open source.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="features-in-august-2014">Features in August 2014<a href="https://blog.sigsegowl.xyz/2018/05/22/hwr-hardware-sensor-monitor#features-in-august-2014" class="hash-link" aria-label="Direct link to Features in August 2014" title="Direct link to Features in August 2014" translate="no">​</a></h2>
<ul>
<li class="">monitor all sensors that HWInfo offers</li>
<li class="">work inside a WLAN or LAN network, or over the internet</li>
<li class="">a SQLite database on the Android side to keep the settings</li>
<li class="">save multiple servers and their sensors</li>
<li class="">planned: gauges, bars, more options</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Desktop transmitter and Android receiver side by side." src="https://blog.sigsegowl.xyz/assets/images/HWtransmitter-300x167-f61287b8b6b14ecd92326b6ae95ede38.png" width="300" height="167" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="Android receiver with sensor list." src="https://blog.sigsegowl.xyz/assets/images/HWreceiver-187x300-f26aa765fe8d3aa4c09ab3ef4a82db1c.png" width="187" height="300" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="alpha-in-february-2015">Alpha in February 2015<a href="https://blog.sigsegowl.xyz/2018/05/22/hwr-hardware-sensor-monitor#alpha-in-february-2015" class="hash-link" aria-label="Direct link to Alpha in February 2015" title="Direct link to Alpha in February 2015" translate="no">​</a></h2>
<p>The app reached alpha status and the UI was still rough. Three files are needed to run the setup, because the client alone does nothing.</p>
<ul>
<li class="">HWInfo: get it from <a href="http://www.hwinfo.com/download.php" target="_blank" rel="noopener noreferrer" class="">hwinfo.com</a></li>
<li class="">desktop server: <a href="https://blog.sigsegowl.xyz/assets/files/HwInfoTransmitter-release-v1.0-70558ae408e16660fac84cacdec667db.zip" target="_blank" class="">HwInfoTransmitter-release-v1.0.zip</a></li>
<li class="">Android client: <a href="https://blog.sigsegowl.xyz/assets/files/HwInfoReceiver-debug-ea2ad6f7f63441503712f7a24af7ec03.zip" target="_blank" class="">HwInfoReceiver-debug.zip</a></li>
</ul>
<p>The important step is inside HWInfo itself. The shared memory option must be enabled, and the sensors must be running. Without that step the server has no data to read.</p>
<p><img decoding="async" loading="lazy" alt="Android client in alpha, single gauge." src="https://blog.sigsegowl.xyz/assets/images/Screenshot_2015-02-16-17-31-56-187x300-4ddba2e3e461a8a95a04a21f8d9bf394.png" width="187" height="300" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="new-gui-in-october-2016">New GUI in October 2016<a href="https://blog.sigsegowl.xyz/2018/05/22/hwr-hardware-sensor-monitor#new-gui-in-october-2016" class="hash-link" aria-label="Direct link to New GUI in October 2016" title="Direct link to New GUI in October 2016" translate="no">​</a></h2>
<p>The old layout showed few gauges on the screen. The new GUI fits many more gauges, and it was still work in progress. The remaining steps were the font size, the connection of gauges to sensor data, the setup UI for gauges and a layout bug with scrolling.</p>
<p><img decoding="async" loading="lazy" alt="New GUI with several gauges in portrait." src="https://blog.sigsegowl.xyz/assets/images/Screenshot_2016-10-17-21-04-36-576x1024-06862fcf551aa966356cad30199e4182.png" width="576" height="1024" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="New GUI in landscape." src="https://blog.sigsegowl.xyz/assets/images/Screenshot_2016-10-17-21-04-43-1024x576-1dcfec5c7563ceaaa086ae99e75b940c.png" width="1024" height="576" class="img_XUCP"></p>
<p>In the same month the app got the short name <strong>HwR</strong>, and the open beta went live on the Playstore. The beta allowed 1000 downloads, because the version could be very unstable.</p>
<ul>
<li class=""><a href="https://play.google.com/store/apps/details?id=com.threedevs.aj.HwInfoReceiver" target="_blank" rel="noopener noreferrer" class="">HwR on the Playstore</a></li>
<li class="">desktop build for that beta: <a href="https://blog.sigsegowl.xyz/assets/files/HwInfoTransmitterReleaseOpenBeta-1f251dea68181c2ce91c2a0e33c1460d.zip" target="_blank" class="">HwInfoTransmitterReleaseOpenBeta.zip</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="update-15-in-february-2017">Update 1.5 in February 2017<a href="https://blog.sigsegowl.xyz/2018/05/22/hwr-hardware-sensor-monitor#update-15-in-february-2017" class="hash-link" aria-label="Direct link to Update 1.5 in February 2017" title="Direct link to Update 1.5 in February 2017" translate="no">​</a></h2>
<p>New in the app:</p>
<ul>
<li class="">keep the screen on while you view sensors, as a setting</li>
<li class="">add sensors by name from the phone instead of by id</li>
<li class="">bug fixes</li>
</ul>
<p>The desktop counterpart got the same update. Get the desktop build <a href="https://blog.sigsegowl.xyz/assets/files/HwInfoTransmitterReleaseOpenBeta1_1_1-9f05b0ed0232497504f4fe14c0a63ba0.zip" target="_blank" class="">here</a>. Two days later I fixed the desktop app, because it did not respond to client requests.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="update-16-in-may-2018">Update 1.6 in May 2018<a href="https://blog.sigsegowl.xyz/2018/05/22/hwr-hardware-sensor-monitor#update-16-in-may-2018" class="hash-link" aria-label="Direct link to Update 1.6 in May 2018" title="Direct link to Update 1.6 in May 2018" translate="no">​</a></h2>
<ul>
<li class="">fixed font colors for the dark theme</li>
<li class="">custom scale for the texts next to the gauges</li>
<li class="">custom scale for temperature values</li>
<li class="">minimum and maximum values now scale automatically depending on the input values</li>
</ul>
<p>This is the state of the app today. The Playstore link above is the current download.</p>]]></content:encoded>
            <category>hwinfo</category>
            <category>android</category>
            <category>tools</category>
            <category>archive</category>
        </item>
        <item>
            <title><![CDATA[openGL offscreen software rendering on linux server without x11]]></title>
            <link>https://blog.sigsegowl.xyz/2017/07/12/opengl-offscreen-software-rendering-on-linux-server</link>
            <guid>https://blog.sigsegowl.xyz/2017/07/12/opengl-offscreen-software-rendering-on-linux-server</guid>
            <pubDate>Wed, 12 Jul 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[opengl in software mode]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="opengl in software mode" src="https://blog.sigsegowl.xyz/assets/images/test-5797d0f6d3c09574a403560f4aa24f90.jpg" width="400" height="400" class="img_XUCP"></p>
<p>Ever tried to render something with openGL on a linux server that has no x11 installed nor has a physical gpu connected? I searched for a long time for a solution that would work almost out of the box and the first solution i could find was actually installing x11, mesa3d and a dummy x-display. Via putty that has x11-forwarding enabled it is possible to run x-applications just fine and even render with openGL thanks to mesa in software mode!</p>
<p>But as soon as you close the ssh connection x11 stops and after that x-applications and openGL won't be able to connect to a display! So after every server restart openGL won't work anymore...</p>
<p>So why do you need a display or x11 if you want to render offscreen?</p>
<!-- -->
<p>The answer is you don't! Here is a quick test:</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="1-install-libraries">1. Install libraries<a href="https://blog.sigsegowl.xyz/2017/07/12/opengl-offscreen-software-rendering-on-linux-server#1-install-libraries" class="hash-link" aria-label="Direct link to 1. Install libraries" title="Direct link to 1. Install libraries" translate="no">​</a></h2>
<p>I set up a virtual machine in virtual box based on ubuntu server 17.04 and installed the following libs to get started:</p>
<ul>
<li class="">mesa for openGL software rendering</li>
<li class="">osmesa for offscreen rendering</li>
<li class="">glu1-mesa for some glu :)</li>
<li class="">gcc to compile c</li>
</ul>
<div class="language-bash codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-bash codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token plain">sudo apt install mesa-common-dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo apt install libosmesa6-dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo apt install libglu1-mesa-dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo apt install gcc</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="2-create-source-file">2. Create source file<a href="https://blog.sigsegowl.xyz/2017/07/12/opengl-offscreen-software-rendering-on-linux-server#2-create-source-file" class="hash-link" aria-label="Direct link to 2. Create source file" title="Direct link to 2. Create source file" translate="no">​</a></h2>
<p>Now lets create the osmesa demo which i have modified slightly to compile out of the box:</p>
<div class="language-bash codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-bash codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token plain">sudo nano osdemo.c</span><br></div></code></pre></div></div>
<p>Paste the following code in nano:</p>
<div class="language-c codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-c codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/*</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">based on: </span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">https://github.com/JoakimSoderberg/mesademos/blob/master/src/osdemos/osdemo32.c</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">&lt;stdio.h&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">&lt;stdlib.h&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">&lt;GL/osmesa.h&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">&lt;GL/glu.h&gt;</span><span class="token macro property" style="color:#36acaa">     </span><span class="token macro property comment" style="color:#999988;font-style:italic">//replaced by default header in linux</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">define</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property macro-name" style="color:#36acaa">SAVE_TARGA</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">define</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property macro-name" style="color:#36acaa">WIDTH</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property expression number" style="color:#36acaa">400</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">define</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property macro-name" style="color:#36acaa">HEIGHT</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property expression number" style="color:#36acaa">400</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">render_image</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   GLfloat light_ambient</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   GLfloat light_diffuse</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   GLfloat light_specular</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   GLfloat light_position</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   GLfloat red_mat</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">   </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   GLfloat green_mat</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   GLfloat blue_mat</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">  </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   GLfloat white_mat</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">  </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   GLfloat purple_mat</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   GLUquadricObj </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">qobj </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">gluNewQuadric</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glLightfv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_LIGHT0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GL_AMBIENT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> light_ambient</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glLightfv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_LIGHT0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GL_DIFFUSE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> light_diffuse</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glLightfv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_LIGHT0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GL_SPECULAR</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> light_specular</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glLightfv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_LIGHT0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GL_POSITION</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> light_position</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glEnable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_LIGHTING</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glEnable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_LIGHT0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glEnable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_DEPTH_TEST</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glMatrixMode</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_PROJECTION</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glLoadIdentity</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glOrtho</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">2.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">2.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">10.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glMatrixMode</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_MODELVIEW</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glClear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> GL_COLOR_BUFFER_BIT </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> GL_DEPTH_BUFFER_BIT </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glPushMatrix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glRotatef</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">20.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">if</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property expression number" style="color:#36acaa">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glPushMatrix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glTranslatef</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">0.75</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glRotatef</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">90.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glMaterialfv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> GL_FRONT_AND_BACK</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GL_AMBIENT_AND_DIFFUSE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> red_mat </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glutSolidTorus</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0.275</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.85</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glPopMatrix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">endif</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">/* red square */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glPushMatrix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glTranslatef</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glRotatef</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">90</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glScalef</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glDisable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_LIGHTING</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glColor4f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glBegin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_POLYGON</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glVertex2f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glVertex2f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glVertex2f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glVertex2f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glEnd</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glEnable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_LIGHTING</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glPopMatrix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">if</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property expression number" style="color:#36acaa">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">/* green square */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glPushMatrix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glTranslatef</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glDisable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_LIGHTING</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glColor3f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glBegin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_POLYGON</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glVertex2f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glVertex2f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glVertex2f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glVertex2f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glEnd</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glEnable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_LIGHTING</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glPopMatrix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">/* blue square */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glPushMatrix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glTranslatef</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0.75</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glDisable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_LIGHTING</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glColor3f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glBegin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_POLYGON</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glVertex2f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glVertex2f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glVertex2f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glVertex2f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glEnd</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glEnable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_LIGHTING</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glPopMatrix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">endif</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glPushMatrix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glTranslatef</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">0.75</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glRotatef</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">270.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glMaterialfv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> GL_FRONT_AND_BACK</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GL_AMBIENT_AND_DIFFUSE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> green_mat </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glColor4f</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glEnable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_BLEND</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glBlendFunc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_SRC_ALPHA</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GL_ONE_MINUS_SRC_ALPHA</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">gluCylinder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">qobj</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">16</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glDisable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_BLEND</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glPopMatrix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glPushMatrix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glTranslatef</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0.75</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glMaterialfv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> GL_FRONT_AND_BACK</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GL_AMBIENT_AND_DIFFUSE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> blue_mat </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">gluSphere</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">qobj</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glPopMatrix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glPopMatrix</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">/* This is very important!!!</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">    * Make sure buffered commands are finished!!!</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">    */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">glFinish</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">gluDeleteQuadric</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">qobj</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      GLint r</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> a</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">glGetIntegerv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_RED_BITS</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">r</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">glGetIntegerv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_GREEN_BITS</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">g</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">glGetIntegerv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_BLUE_BITS</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">b</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">glGetIntegerv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_ALPHA_BITS</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">printf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"channel sizes: %d %d %d %d\n"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> a</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">write_targa</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">char</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">filename</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> GLfloat </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">buffer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> width</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   FILE </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">f </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fopen</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> filename</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"w"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> i</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> GLfloat </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ptr </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> buffer</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">printf</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"osdemo, writing tga file \n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0x00</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">	</span><span class="token comment" style="color:#999988;font-style:italic">/* ID Length, 0 =&gt; No ID	*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0x00</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">	</span><span class="token comment" style="color:#999988;font-style:italic">/* Color Map Type, 0 =&gt; No color map included	*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0x02</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">	</span><span class="token comment" style="color:#999988;font-style:italic">/* Image Type, 2 =&gt; Uncompressed, True-color Image */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0x00</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">	</span><span class="token comment" style="color:#999988;font-style:italic">/* Next five bytes are about the color map entries */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0x00</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">	</span><span class="token comment" style="color:#999988;font-style:italic">/* 2 bytes Index, 2 bytes length, 1 byte size */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0x00</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0x00</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0x00</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0x00</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">	</span><span class="token comment" style="color:#999988;font-style:italic">/* X-origin of Image	*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0x00</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0x00</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">	</span><span class="token comment" style="color:#999988;font-style:italic">/* Y-origin of Image	*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0x00</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">WIDTH </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0xff</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">/* Image Width	*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">WIDTH</span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0xff</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">HEIGHT </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0xff</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">     </span><span class="token comment" style="color:#999988;font-style:italic">/* Image Height	*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">HEIGHT</span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0xff</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0x18</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">		</span><span class="token comment" style="color:#999988;font-style:italic">/* Pixel Depth, 0x18 =&gt; 24 Bits	*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fputc</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0x20</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">		</span><span class="token comment" style="color:#999988;font-style:italic">/* Image Descriptor	*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fclose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      f </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fopen</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> filename</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ab"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* reopen in binary append mode */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">y</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">height</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> y</span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> y</span><span class="token operator" style="color:#393A34">--</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> x</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> x</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">y</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">width </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> r </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ptr</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> g </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ptr</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> b </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ptr</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">r </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> r </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">g </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> g </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">b </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> b </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token function" style="color:#d73a49">fputc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">b</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* write blue */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token function" style="color:#d73a49">fputc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* write green */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token function" style="color:#d73a49">fputc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">r</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* write red */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">write_ppm</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">char</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">filename</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> GLfloat </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">buffer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> width</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> binary </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   FILE </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">f </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fopen</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> filename</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"w"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> i</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> GLfloat </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ptr </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> buffer</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">binary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token function" style="color:#d73a49">fprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">"P6\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token function" style="color:#d73a49">fprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">"# ppm-file created by osdemo.c\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token function" style="color:#d73a49">fprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">"%i %i\n"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> width</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">height</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token function" style="color:#d73a49">fprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">"255\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token function" style="color:#d73a49">fclose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         f </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fopen</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> filename</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ab"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* reopen in binary append mode */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">y</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">height</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> y</span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> y</span><span class="token operator" style="color:#393A34">--</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> x</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> x</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">y</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">width </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> r </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ptr</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> g </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ptr</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> b </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ptr</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">r </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> r </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">g </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> g </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">b </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> b </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token function" style="color:#d73a49">fputc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">r</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">/* write red */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token function" style="color:#d73a49">fputc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* write green */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token function" style="color:#d73a49">fputc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">b</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* write blue */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token comment" style="color:#999988;font-style:italic">/*ASCII*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> counter </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token function" style="color:#d73a49">fprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">"P3\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token function" style="color:#d73a49">fprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">"# ascii ppm file created by osdemo.c\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token function" style="color:#d73a49">fprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">"%i %i\n"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> width</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token function" style="color:#d73a49">fprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">"255\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">y</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">height</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> y</span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> y</span><span class="token operator" style="color:#393A34">--</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> x</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> x</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">y</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">width </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> r </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ptr</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> g </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ptr</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> b </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ptr</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">r </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> r </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">g </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> g </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">b </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> b </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token function" style="color:#d73a49">fprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" %3d %3d %3d"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               counter</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">counter </span><span class="token operator" style="color:#393A34">%</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token function" style="color:#d73a49">fprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">fclose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">char</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">argv</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   GLfloat </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">buffer</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">/* Create an RGBA-mode context */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">if</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property expression" style="color:#36acaa">OSMESA_MAJOR_VERSION </span><span class="token macro property expression operator" style="color:#393A34">*</span><span class="token macro property expression" style="color:#36acaa"> </span><span class="token macro property expression number" style="color:#36acaa">100</span><span class="token macro property expression" style="color:#36acaa"> </span><span class="token macro property expression operator" style="color:#393A34">+</span><span class="token macro property expression" style="color:#36acaa"> OSMESA_MINOR_VERSION </span><span class="token macro property expression operator" style="color:#393A34">&gt;=</span><span class="token macro property expression" style="color:#36acaa"> </span><span class="token macro property expression number" style="color:#36acaa">305</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">/* specify Z, stencil, accum sizes */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   OSMesaContext ctx </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">OSMesaCreateContextExt</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> GL_RGBA</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">16</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">else</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   OSMesaContext ctx </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">OSMesaCreateContext</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> GL_RGBA</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">NULL</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">endif</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">printf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"OSMesaCreateContext failed!\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">/* Allocate the image buffer */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   buffer </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GLfloat </span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">malloc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> WIDTH </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> HEIGHT </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">sizeof</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GLfloat</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">buffer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">printf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Alloc image buffer failed!\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">/* Bind the buffer to the context and make it current */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token function" style="color:#d73a49">OSMesaMakeCurrent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> buffer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GL_FLOAT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> WIDTH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> HEIGHT </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">printf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"OSMesaMakeCurrent failed!\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">render_image</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">argc</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">ifdef</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property expression" style="color:#36acaa">SAVE_TARGA</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">write_targa</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">argv</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> buffer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> WIDTH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> HEIGHT</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">else</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">write_ppm</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">argv</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> buffer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> WIDTH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> HEIGHT</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">endif</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">printf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Specify a filename if you want to make an image file\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">printf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"all done\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">/* free the image buffer */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">free</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> buffer </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">/* destroy the context */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token function" style="color:#d73a49">OSMesaDestroyContext</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> ctx </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The code is actually pretty straight forward. Just have a look at the main function. Create an OSMesaContext, allocate a buffer and call OSMesaMakeCurrent with the new buffer. After that you can call openGL functions and have fun. If you are done destroy the context and free the allocated buffer.
Now hit CTRL+O to save it and leave nano with CTRL+X.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="3-build-executable-and-run-the-test">3. Build executable and run the test<a href="https://blog.sigsegowl.xyz/2017/07/12/opengl-offscreen-software-rendering-on-linux-server#3-build-executable-and-run-the-test" class="hash-link" aria-label="Direct link to 3. Build executable and run the test" title="Direct link to 3. Build executable and run the test" translate="no">​</a></h2>
<p>To create an executable program run the following command:</p>
<div class="language-bash codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-bash codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token plain">gcc osdemo.c -lGLU -lOSMesa -lm -o osdemo32</span><br></div></code></pre></div></div>
<p>And try it out:</p>
<div class="language-bash codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-bash codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token plain">./osdemo32 test.tga</span><br></div></code></pre></div></div>
<p>If everything went right you will see something like this:</p>
<p><img decoding="async" loading="lazy" alt="test cli" src="https://blog.sigsegowl.xyz/assets/images/testrun-335e1f38a406c56cf1da129fa7433414.jpg" width="732" height="371" class="img_XUCP"></p>
<p>and the output image looks like this:</p>
<p><img decoding="async" loading="lazy" alt="test output" src="https://blog.sigsegowl.xyz/assets/images/test-5797d0f6d3c09574a403560f4aa24f90.jpg" width="400" height="400" class="img_XUCP"></p>
<p>That's it! Rendering openGL stuff without x11, a physical display and gpu!</p>]]></content:encoded>
            <category>linux</category>
            <category>rendering</category>
            <category>tools</category>
        </item>
        <item>
            <title><![CDATA[TileDownloader]]></title>
            <link>https://blog.sigsegowl.xyz/2015/09/13/tile-downloader</link>
            <guid>https://blog.sigsegowl.xyz/2015/09/13/tile-downloader</guid>
            <pubDate>Sun, 13 Sep 2015 00:00:00 GMT</pubDate>
            <description><![CDATA[I made a little tool which allows me to download tiles from bing maps and puts them together.]]></description>
            <content:encoded><![CDATA[<p>I made a little tool which allows me to download tiles from bing maps and puts them together.</p>
<p><img decoding="async" loading="lazy" alt="tiledownloader" src="https://blog.sigsegowl.xyz/assets/images/tiledownloader-11b5bb45cca354e2420d4c3ae5f4903a.jpg" width="749" height="330" class="img_XUCP"></p>
<p>The next updates will add a proper thread for the stiching process which currently blocks the Ui till it's done. Anyways grab it from <a href="https://github.com/AJ92/TileDownloader/releases" target="_blank" rel="noopener noreferrer" class="">github</a>.</p>
<!-- -->
<p>This is basically the size i managed to put together. The current release only manages half of the size because of Qt's QImage limits:</p>
<p><img decoding="async" loading="lazy" alt="F-1-1" src="https://blog.sigsegowl.xyz/assets/images/F-1-1-df19f8149c165a25768eb58bbacae855.jpg" width="1024" height="1024" class="img_XUCP"></p>
<p>Here's a pic with a bit more resolution (i won't upload a full scale image cause it will make my page super slow...):</p>
<p><img decoding="async" loading="lazy" alt="satmap" src="https://blog.sigsegowl.xyz/assets/images/satmap-1024x499-cad767366ad40361c40f3b2ef03c3079.jpg" width="1024" height="499" class="img_XUCP"></p>
<p><strong>Additional hint</strong>: Stiching atm only works if you have downloaded all tiles and restart the app and point to the output directory again. <del>(update will fix this issue)</del></p>]]></content:encoded>
            <category>tools</category>
        </item>
        <item>
            <title><![CDATA[Gamma correction]]></title>
            <link>https://blog.sigsegowl.xyz/2015/04/01/gamma-correction</link>
            <guid>https://blog.sigsegowl.xyz/2015/04/01/gamma-correction</guid>
            <pubDate>Wed, 01 Apr 2015 00:00:00 GMT</pubDate>
            <description><![CDATA[Gamma correction in openGL is very easily to achieve, but why do you need gamma correction? Let's keep it simple... First of all your textures you use as input for your openGL renderer are most likely in non linear color space. Your renderer on the other hand is probably calculating light under the assumption of linear color spaced color values in your loaded textures. So you might be working in two different color spaces. After your renderer is done it writes the colors to the screen, which uses non linear color space like your textures do! So what happens is, that your calculation might be visually wrong...]]></description>
            <content:encoded><![CDATA[<p>Gamma correction in openGL is very easily to achieve, but why do you need gamma correction? Let's keep it simple... First of all your textures you use as input for your openGL renderer are most likely in <strong>non linear color space</strong>. Your renderer on the other hand is probably calculating light under the assumption of <strong>linear color space</strong>d color values in your loaded textures. So you might be working in two different color spaces. After your renderer is done it writes the colors to the screen, which uses non linear color space like your textures do! So what happens is, that your calculation might be visually wrong...</p>
<p>So how can you solve this?</p>
<p>The answer is very easy:</p>
<!-- -->
<p><strong>First switch your input textures to sRGB:</strong></p>
<div class="language-c codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-c codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">//this texture will stay uncorrected if it is non linear</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">glTexImage2D</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_TEXTURE_2D</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GL_RGB8</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> width</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GL_BGR</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GL_UNSIGNED_BYTE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//this one will be corrected on texture lookups</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">glTexImage2D</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_TEXTURE_2D</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GL_SRGB8</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> width</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GL_BGR</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GL_UNSIGNED_BYTE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p><strong>Second switch your final color output to sRGB:</strong></p>
<div class="language-c codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-c codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">//if you use GLFW</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">glfwWindowHint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GLFW_SRGB_CAPABLE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> TRUE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">glEnable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_FRAMEBUFFER_SRGB</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//if you go full hardcore</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//use glRenderbufferStorage() with GL_SRGB instead of GL_RGB</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//for your final renderbuffer that uses the final non-sampleable framebuffer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//and dont forget</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">glEnable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">GL_FRAMEBUFFER_SRGB</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Thats all you need. If you want more information about gamma correction check this link: <a href="http://http.developer.nvidia.com/GPUGems3/gpugems3_ch24.html" target="_blank" rel="noopener noreferrer" class="">GPU Gems 3 Chapter 24</a></p>
<p>And here's a screenshot of gamma correction in action (with post processing noise, fxaa and sharpen filter):</p>
<p><img decoding="async" loading="lazy" alt="gamma_corrected_final" src="https://blog.sigsegowl.xyz/assets/images/gamma_corrected_final-4192498e6cf78d61388f26e99abd4987.png" width="793" height="582" class="img_XUCP"></p>
<p>This is the skybox side's input texture:</p>
<p><img decoding="async" loading="lazy" alt="cubemap_side_input" src="https://blog.sigsegowl.xyz/assets/images/cubemap_side_input-d64f7ec0b228f877af5a9857146b0822.png" width="1024" height="1024" class="img_XUCP"></p>]]></content:encoded>
            <category>rendering</category>
            <category>glsl</category>
        </item>
        <item>
            <title><![CDATA[Post processing aa (fxaa)]]></title>
            <link>https://blog.sigsegowl.xyz/2015/04/01/post-processing-aa-fxaa</link>
            <guid>https://blog.sigsegowl.xyz/2015/04/01/post-processing-aa-fxaa</guid>
            <pubDate>Wed, 01 Apr 2015 00:00:00 GMT</pubDate>
            <description><![CDATA[Why post processing antialiasing ? Because of two reasons. A good and fast post processing filter like fxaa or cmaa can achieve almost the same visual output like the usual multisampling counter part (msaa) and costs way less on the GPU because you dont need multiple samples per fragment/pixel! Another restriction is the rendering pipeline you might choose. A deferred renderer uses multiple framebuffers to achieve multiple different effects and using multiple samples on each of those framebuffers might have a really big impact on performance. Additionally it is practically impossible to use mxaa in a deferred renderer, because multisampling the position framebuffer results in wrong values around objects!]]></description>
            <content:encoded><![CDATA[<p>Why post processing antialiasing ? Because of two reasons. A good and fast post processing filter like fxaa or cmaa can achieve almost the same visual output like the usual multisampling counter part (msaa) and costs way less on the GPU because you dont need multiple samples per fragment/pixel! Another restriction is the rendering pipeline you might choose. A deferred renderer uses multiple framebuffers to achieve multiple different effects and using multiple samples on each of those framebuffers might have a really big impact on performance. Additionally it is practically impossible to use mxaa in a deferred renderer, because multisampling the <em>position framebuffer</em> results in wrong values around objects!</p>
<p>Let's have a look on the code:</p>
<!-- -->
<p>The complete scene is rendered and stored in a framebuffer and bound as a texture (<em>l_tex</em>) for the following shader. The output buffer is bound properly (<em>def_e</em> in the fragment shader)...</p>
<div class="language-c codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-c codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">//render a full screen quad with vertex coordinates:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//-1.0, -1.0,  0.5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//-1.0,  1.0,  0.5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 1.0,  1.0,  0.5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 1.0, -1.0,  0.5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//or similar</span><br></div></code></pre></div></div>
<div class="language-c codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-c codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">//vertex shader, nothing special here...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">version</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property expression number" style="color:#36acaa">400</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">layout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">location</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> in vec4 vp</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	gl_Position </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> vp</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<div class="language-c codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-c codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">//fragment shader, the interesting part!</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">version</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property expression number" style="color:#36acaa">400</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">uniform sampler2D l_tex</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">//the rendered framebuffer containing the color bound as sampler2D</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">uniform vec2 win_size</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//the size of the window/framebuffer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">layout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> location </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> out vec4 def_e</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//the manipulated color output</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//////////////////////////////////////////////////////////////////////////////</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//FXAA</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">ifndef</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property expression" style="color:#36acaa">FXAA_REDUCE_MIN</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">define</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property macro-name" style="color:#36acaa">FXAA_REDUCE_MIN</span><span class="token macro property" style="color:#36acaa">   </span><span class="token macro property expression punctuation" style="color:#393A34">(</span><span class="token macro property expression number" style="color:#36acaa">1.0</span><span class="token macro property expression operator" style="color:#393A34">/</span><span class="token macro property expression" style="color:#36acaa"> </span><span class="token macro property expression number" style="color:#36acaa">128.0</span><span class="token macro property expression punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">endif</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">ifndef</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property expression" style="color:#36acaa">FXAA_REDUCE_MUL</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">define</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property macro-name" style="color:#36acaa">FXAA_REDUCE_MUL</span><span class="token macro property" style="color:#36acaa">   </span><span class="token macro property expression punctuation" style="color:#393A34">(</span><span class="token macro property expression number" style="color:#36acaa">1.0</span><span class="token macro property expression" style="color:#36acaa"> </span><span class="token macro property expression operator" style="color:#393A34">/</span><span class="token macro property expression" style="color:#36acaa"> </span><span class="token macro property expression number" style="color:#36acaa">8.0</span><span class="token macro property expression punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">endif</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">ifndef</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property expression" style="color:#36acaa">FXAA_SPAN_MAX</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">define</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property macro-name" style="color:#36acaa">FXAA_SPAN_MAX</span><span class="token macro property" style="color:#36acaa">     </span><span class="token macro property expression number" style="color:#36acaa">8.0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">endif</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//optimized version for mobile, where dependent </span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//texture reads can be a bottleneck</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">vec4 </span><span class="token function" style="color:#d73a49">fxaa</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sampler2D tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> vec2 fragCoord</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> vec2 resolution</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    vec4 color</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec2 inverseVP </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> resolution</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">xy</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec2 v_rgbNW </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fragCoord </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vec2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> inverseVP</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec2 v_rgbNE </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fragCoord </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vec2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> inverseVP</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec2 v_rgbSW </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fragCoord </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vec2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> inverseVP</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec2 v_rgbSE </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fragCoord </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vec2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> inverseVP</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec2 v_rgbM </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vec2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fragCoord </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> inverseVP</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec3 rgbNW </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture2D</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> v_rgbNW</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">xyz</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec3 rgbNE </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture2D</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> v_rgbNE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">xyz</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec3 rgbSW </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture2D</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> v_rgbSW</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">xyz</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec3 rgbSE </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture2D</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> v_rgbSE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">xyz</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec4 texColor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture2D</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> v_rgbM</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec3 rgbM  </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> texColor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">xyz</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec3 luma </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vec3</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0.299</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.587</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.114</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> lumaNW </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">dot</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rgbNW</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> luma</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> lumaNE </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">dot</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rgbNE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> luma</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> lumaSW </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">dot</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rgbSW</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> luma</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> lumaSE </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">dot</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rgbSE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> luma</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> lumaM  </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">dot</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rgbM</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  luma</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> lumaMin </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">min</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lumaM</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">min</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">min</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lumaNW</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> lumaNE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">min</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lumaSW</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> lumaSE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> lumaMax </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">max</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lumaM</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">max</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">max</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lumaNW</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> lumaNE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">max</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lumaSW</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> lumaSE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  mediump vec2 dir</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  dir</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">x </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lumaNW </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> lumaNE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lumaSW </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> lumaSE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  dir</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">y </span><span class="token operator" style="color:#393A34">=</span><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lumaNW </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> lumaSW</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lumaNE </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> lumaSE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> dirReduce </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">max</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lumaNW </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> lumaNE </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> lumaSW </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> lumaSE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0.25</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> FXAA_REDUCE_MUL</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> FXAA_REDUCE_MIN</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> rcpDirMin </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">min</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">abs</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dir</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">abs</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dir</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> dirReduce</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  dir </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">min</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">vec2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">FXAA_SPAN_MAX</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> FXAA_SPAN_MAX</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token function" style="color:#d73a49">max</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">vec2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">FXAA_SPAN_MAX</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">FXAA_SPAN_MAX</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            dir </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> rcpDirMin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> inverseVP</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec3 rgbA </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">texture2D</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> fragCoord </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> inverseVP </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> dir </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1.0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3.0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">xyz </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">texture2D</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> fragCoord </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> inverseVP </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> dir </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2.0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3.0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">xyz</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec3 rgbB </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> rgbA </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.25</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">texture2D</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> fragCoord </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> inverseVP </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> dir </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">xyz </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">texture2D</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> fragCoord </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> inverseVP </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> dir </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">xyz</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> lumaB </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">dot</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rgbB</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> luma</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lumaB </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> lumaMin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lumaB </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> lumaMax</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      color </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vec4</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rgbA</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> texColor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      color </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vec4</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rgbB</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> texColor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> color</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//FXAA END</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//////////////////////////////////////////////////////////////////////////////</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">//calculate smoothed color by applying fxaa (usually at sharp edges)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  def_e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fxaa</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">l_tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">gl_FragCoord</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">st</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">win_size</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  def_e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">a </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0f</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Don't forget to properly bind your framebuffers and disable the depthtest or clear your depth if you use any when you render the fullscreen quad!</p>
<p>Below's a screenshot where fxaa is applied (no zoom left and 2x zoomed right):</p>
<p><img decoding="async" loading="lazy" alt="fxaa" src="https://blog.sigsegowl.xyz/assets/images/fxaa-5ea9e8133bd8c37a6e5e1c992d36ab93.png" width="994" height="345" class="img_XUCP"></p>
<p>Source for shader found here: <a href="https://github.com/mattdesl/glsl-fxaa" target="_blank" rel="noopener noreferrer" class="">https://github.com/mattdesl/glsl-fxaa</a></p>]]></content:encoded>
            <category>rendering</category>
            <category>glsl</category>
        </item>
        <item>
            <title><![CDATA[The Quark renderer, desktop OpenGL 4.0]]></title>
            <link>https://blog.sigsegowl.xyz/2015/03/16/renderer-quark-desktop-open-gl</link>
            <guid>https://blog.sigsegowl.xyz/2015/03/16/renderer-quark-desktop-open-gl</guid>
            <pubDate>Mon, 16 Mar 2015 00:00:00 GMT</pubDate>
            <description><![CDATA[The 2012 engine was built for OpenGL ES on Symbian. Symbian died in 2013, so I ported everything to desktop OpenGL and started again from scratch. The new renderer got the name Quark. This post collects the notes from August 2013 until March 2015.]]></description>
            <content:encoded><![CDATA[<p>The 2012 engine was built for OpenGL ES on Symbian. Symbian died in 2013, so I ported everything to desktop OpenGL and started again from scratch. The new renderer got the name <strong>Quark</strong>. This post collects the notes from August 2013 until March 2015.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="why-a-rewrite-and-not-a-port">Why a rewrite and not a port<a href="https://blog.sigsegowl.xyz/2015/03/16/renderer-quark-desktop-open-gl#why-a-rewrite-and-not-a-port" class="hash-link" aria-label="Direct link to Why a rewrite and not a port" title="Direct link to Why a rewrite and not a port" translate="no">​</a></h2>
<p>The 2012 engine emulated OpenGL ES 2.0 on the desktop. That emulation did not support threading, and threading is what I needed on the desktop side. So I dropped the emulation and moved to real desktop OpenGL. I also wrote my own math classes. They passed 1500 lines of code at 50 percent completion, because I wanted code that I could extend myself. SFML handled window creation and window events.</p>
<p>The code almost used no external libraries. The only exceptions were freeGlut, GLEW and Qt, and I avoided most of the Qt API.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="the-deferred-pipeline">The deferred pipeline<a href="https://blog.sigsegowl.xyz/2015/03/16/renderer-quark-desktop-open-gl#the-deferred-pipeline" class="hash-link" aria-label="Direct link to The deferred pipeline" title="Direct link to The deferred pipeline" translate="no">​</a></h2>
<p>A deferred lighting pass went in within two days. The picture below shows the point lights.</p>
<p><img decoding="async" loading="lazy" alt="Deferred lighting pass with many point lights." src="https://blog.sigsegowl.xyz/assets/images/lights7-3b63393d0a9c203355b23945cd2103e3.gif" width="574" height="260" class="img_XUCP"></p>
<p>Ambient light and a directional light came next. Both are additive, and both can be used multiple times.</p>
<p><img decoding="async" loading="lazy" alt="Ambient and directional light in the deferred pipeline." src="https://blog.sigsegowl.xyz/assets/images/ambientlight-3fd4e0407dbf38a77cd0efcf45490d07.png" width="625" height="451" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="Deferred scene with additive lights." src="https://blog.sigsegowl.xyz/assets/images/lights9-19ec783cfb9b811e8d788a5ff3d0622c.gif" width="588" height="339" class="img_XUCP"></p>
<p>The frustum culling had a fault, and I fixed it together with some smaller light bugs.</p>
<p><img decoding="async" loading="lazy" alt="Frustum culling result." src="https://blog.sigsegowl.xyz/assets/images/frustumculling2-194d50dd9e4ae142f42c5b4f415617ac.gif" width="808" height="259" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="Renderer with global directional ambient light." src="https://blog.sigsegowl.xyz/assets/images/engine_renderer-17f684fac3d7a792e1feafbb8615f233.gif" width="596" height="580" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="the-gpu-problem-of-2014">The GPU problem of 2014<a href="https://blog.sigsegowl.xyz/2015/03/16/renderer-quark-desktop-open-gl#the-gpu-problem-of-2014" class="hash-link" aria-label="Direct link to The GPU problem of 2014" title="Direct link to The GPU problem of 2014" translate="no">​</a></h2>
<p>My laptop GPU died in spring 2014. The remaining Intel HD4000 supports OpenGL 3.3 only, and the engine targeted OpenGL 4.0. Two options existed:</p>
<ul>
<li class="">bring the OpenGL target down to 3.3</li>
<li class="">get a new machine</li>
</ul>
<p>A downgrade would have meant a shader rewrite and changed rendering procedures. I bought a desktop machine instead. The engine code then failed to render the loaded textures on the new machine. That fault was small, and I fixed it in August 2014.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="scene-management">Scene management<a href="https://blog.sigsegowl.xyz/2015/03/16/renderer-quark-desktop-open-gl#scene-management" class="hash-link" aria-label="Direct link to Scene management" title="Direct link to Scene management" translate="no">​</a></h2>
<p>The biggest gain came from spatial subdivision. I implemented two octrees, one for static objects and one for dynamic objects. Under average conditions the octrees raised performance enormously.</p>
<p><img decoding="async" loading="lazy" alt="Loading models into an octree." src="https://blog.sigsegowl.xyz/assets/images/octtree2-76deb88011a966a3faf3f41acbaeb520.gif" width="792" height="620" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="Octree debug view in wireframe." src="https://blog.sigsegowl.xyz/assets/images/octree_best-5e6e0a3706ccfd5324be99a4cd4b3b3a.gif" width="795" height="593" class="img_XUCP"></p>
<p>Alongside the octrees these changes happened:</p>
<ul>
<li class="">restructured most classes</li>
<li class="">a CompositeObject class as container for all GameObject related parts</li>
<li class="">graphs to measure performance</li>
<li class="">memory leaks fixed by moving to smart pointers, and the new bugs caused by that move fixed as well</li>
<li class="">bugs in the event system fixed</li>
<li class="">octree related bugs fixed</li>
<li class="">wireframe and vertex render modes back in the render pipeline</li>
<li class="">plans for debug output of light geometry and octree geometry</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Wireframe and vertex debug modes." src="https://blog.sigsegowl.xyz/assets/images/debug2-c5c30c23d700c1bdfcd035fc481685a8.png" width="813" height="636" class="img_XUCP"></p>
<p>Debugging the GPU side used AMD CodeXL.</p>
<p><img decoding="async" loading="lazy" alt="Debugging the engine with CodeXL." src="https://blog.sigsegowl.xyz/assets/images/engine_debug-151dc24bcac92ffebd7efdb42d28618b.png" width="628" height="429" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="asset-loading-and-sky">Asset loading and sky<a href="https://blog.sigsegowl.xyz/2015/03/16/renderer-quark-desktop-open-gl#asset-loading-and-sky" class="hash-link" aria-label="Direct link to Asset loading and sky" title="Direct link to Asset loading and sky" translate="no">​</a></h2>
<p>My hand written OBJ loader got replaced by the Assimp library. The classes were already prepared for multiple formats, so the swap was easy.</p>
<p><img decoding="async" loading="lazy" alt="Assimp loading OBJ files." src="https://blog.sigsegowl.xyz/assets/images/assimp_import-1024x656-f5466e96fc4483101a49b7dd6bf305a4.png" width="1024" height="656" class="img_XUCP"></p>
<p>Skyboxes add a lot to a 3D scene. Not everything worked correct at that point, but it was close.</p>
<p><img decoding="async" loading="lazy" alt="Skybox test scene." src="https://blog.sigsegowl.xyz/assets/images/skybox-1024x546-5b16860052ce0e469d6abec7a392e804.png" width="1024" height="546" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="Second skybox test scene." src="https://blog.sigsegowl.xyz/assets/images/skybox2-1024x546-f59f6cd7ab9b5b628654619dc2b1ff66.png" width="1024" height="546" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="feature-list-of-the-renderer-in-2015">Feature list of the renderer in 2015<a href="https://blog.sigsegowl.xyz/2015/03/16/renderer-quark-desktop-open-gl#feature-list-of-the-renderer-in-2015" class="hash-link" aria-label="Direct link to Feature list of the renderer in 2015" title="Direct link to Feature list of the renderer in 2015" translate="no">​</a></h2>
<ul>
<li class="">entity management system, work in progress</li>
<li class="">post processing render passes</li>
<li class="">FXAA, NFAA, sharpening filter, Gauss blur, SSAO</li>
<li class="">gamma correction</li>
<li class="">Assimp model import</li>
<li class="">sky cubes</li>
<li class="">improved texture map handling</li>
<li class="">octrees</li>
<li class="">early view frustum culling</li>
<li class="">unlimited amount of dynamic point lights</li>
<li class="">directional lights</li>
<li class="">ambient light</li>
<li class="">deferred rendering pipeline</li>
</ul>
<p>The shader work lives in its own posts, because those posts contain the code: <a class="" href="https://blog.sigsegowl.xyz/2015/04/01/gamma-correction">gamma correction</a>, <a class="" href="https://blog.sigsegowl.xyz/2015/04/01/post-processing-aa-fxaa">post processing aa with FXAA</a> and <a class="" href="https://blog.sigsegowl.xyz/2014/10/10/nfaa-post-process-antialiasing">NFAA</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="what-came-after">What came after<a href="https://blog.sigsegowl.xyz/2015/03/16/renderer-quark-desktop-open-gl#what-came-after" class="hash-link" aria-label="Direct link to What came after" title="Direct link to What came after" translate="no">​</a></h2>
<p>The renderer never got a new mobile port. The desktop version reached a usable state, and after that the work moved to other projects. The projects that came before this engine are documented in <a class="" href="https://blog.sigsegowl.xyz/2010/07/01/old-3devs-page-archive">the old page archive</a>.</p>]]></content:encoded>
            <category>engine-3d</category>
            <category>rendering</category>
            <category>glsl</category>
            <category>archive</category>
        </item>
        <item>
            <title><![CDATA[NFAA]]></title>
            <link>https://blog.sigsegowl.xyz/2014/10/10/nfaa-post-process-antialiasing</link>
            <guid>https://blog.sigsegowl.xyz/2014/10/10/nfaa-post-process-antialiasing</guid>
            <pubDate>Fri, 10 Oct 2014 00:00:00 GMT</pubDate>
            <description><![CDATA[nfaa]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="nfaa" src="https://blog.sigsegowl.xyz/assets/images/nfaa-718c069880ff8780576d15c173f366f5.png" width="520" height="468" class="img_XUCP"></p>
<p>Added post processing anti aliaising. Still tweaking it a bit.</p>
<p>The idea behind this shader: <a href="http://www.gamedev.net/topic/580517-nfaa---a-post-process-anti-aliasing-filter-results-implementation-details/" target="_blank" rel="noopener noreferrer" class="">NFAA</a></p>
<!-- -->
<p>Update:</p>
<p>Some improvements with less samples per pixel:</p>
<p><img decoding="async" loading="lazy" alt="NFAA_best" src="https://blog.sigsegowl.xyz/assets/images/NFAA_best-4581d28d22a79f67f44e4b816504be76.png" width="799" height="596" class="img_XUCP"></p>
<p>And here is a rather high freqency image but with low color luminance varianc:</p>
<p><img decoding="async" loading="lazy" alt="nfaa_final" src="https://blog.sigsegowl.xyz/assets/images/nfaa_final-467948ff335e64d69a15fd62ccdb8dea.png" width="799" height="596" class="img_XUCP"></p>
<p>And here is the same scene but with the edges detected:</p>
<p><img decoding="async" loading="lazy" alt="nfaa_debug" src="https://blog.sigsegowl.xyz/assets/images/nfaa_debug-b8b11dc6299f8f2be1c95f66f31b678b.png" width="799" height="596" class="img_XUCP"></p>
<p>Update #2:</p>
<p>I went back to the 13 pixel lookups because testing only horizontal and vertical pixel differences caused on some "edge"-conditions no smoothing at all... Here's my shader if anybody is interessted (Fragment shader):</p>
<div class="language-c codeBlockContainer_UcZe theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HsSq"><pre tabindex="0" class="prism-code language-c codeBlock_HrVd thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ZoHH"><div class="token-line" style="color:#393A34"><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">version</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property expression number" style="color:#36acaa">400</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//the final image buffer we want to smooth</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">uniform sampler2D l_tex</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">uniform vec2 win_size</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//the output buffer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">layout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> location </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> out vec4 def_e</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//the spread of the edge detection algorithm</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> fScale </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3.0f</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetColorLuminance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> vec3 i_vColor </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">dot</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> i_vColor</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vec3</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.2126f</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.7152f</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0722f</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec2 st</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  st</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">s </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> gl_FragCoord</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">x </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> win_size</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  st</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">t </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> gl_FragCoord</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">y </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> win_size</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">y</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec2 vPixelViewport </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vec2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0f</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> win_size</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0f</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> win_size</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">y </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Offset coordinates</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec2 upOffset </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vec2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0f</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> vPixelViewport</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">y </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> fScale</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec2 rightOffset </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vec2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> vPixelViewport</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0f</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> fScale</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> topHeight </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetColorLuminance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> l_tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> st </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> upOffset</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> bottomHeight </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetColorLuminance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> l_tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> st </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> upOffset</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> rightHeight </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetColorLuminance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> l_tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> st </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> rightOffset</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> leftHeight </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetColorLuminance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> l_tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> st </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> rightOffset</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> leftTopHeight </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetColorLuminance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> l_tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> st </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> rightOffset </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> upOffset</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> leftBottomHeight </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetColorLuminance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> l_tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> st </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> rightOffset </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> upOffset</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> rightBottomHeight </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetColorLuminance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> l_tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> st </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> rightOffset </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> upOffset</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> rightTopHeight </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetColorLuminance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> l_tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> st </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> rightOffset </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> upOffset</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Normal map creation</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> sum0 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> rightTopHeight</span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> topHeight </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> rightBottomHeight</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> sum1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> leftTopHeight </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> bottomHeight </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> leftBottomHeight</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> sum2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> leftTopHeight </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> leftHeight </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> rightTopHeight</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> sum3 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> leftBottomHeight </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> rightHeight </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> rightBottomHeight</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> vector1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sum1 </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> sum0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">float</span><span class="token plain"> vector2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sum2 </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> sum3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">//for horizontal and vertical only...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">//float vector1 = -(topHeight - bottomHeight);</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">//float vector2 = rightHeight - leftHeight;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vec3 Scene0 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> l_tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> st </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">abs</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">vector1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0001</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">abs</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">vector2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0001</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//we don't need to smooth ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    def_e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Scene0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Put them together and scale.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    vec2 Normal </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vec2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> vector2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> vector1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Normal</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">xy </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">clamp</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Normal</span><span class="token punctuation" style="color:#393A34">,</span><span class="token function" style="color:#d73a49">vec2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">*</span><span class="token number" style="color:#36acaa">0.4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token function" style="color:#d73a49">vec2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">*</span><span class="token number" style="color:#36acaa">0.4</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//Prevent over-blurring in high-contrast areas! -venzon</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    vec2 final_norm </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Normal </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> vPixelViewport </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> fScale</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Increase pixel size to get more blur</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    vec3 Scene1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> l_tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> st </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> final_norm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">xy </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    vec3 Scene2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> l_tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> st </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> final_norm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">xy </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    vec3 Scene3 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> l_tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> st </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vec2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">final_norm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">final_norm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5f</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    vec3 Scene4 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">texture</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> l_tex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> st </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vec2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">final_norm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain">final_norm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5f</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//Final color smoothed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    def_e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rgb </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Scene0 </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> Scene1 </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> Scene2 </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> Scene3 </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> Scene4</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//show the normals of the smooth pixels</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//def_e.rgb = normalize( vec3(Normal.x, Normal.y , 1.0f ) * 0.5f + 0.5f);</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//show  pixels where the smoothing is applied to</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//def_e.rgb = vec3(1.0,0.0,0.0);</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  def_e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">a </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0f</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>rendering</category>
            <category>glsl</category>
        </item>
        <item>
            <title><![CDATA[Switcher, Symbian task manager]]></title>
            <link>https://blog.sigsegowl.xyz/2013/10/02/switcher-symbian-taskmanager</link>
            <guid>https://blog.sigsegowl.xyz/2013/10/02/switcher-symbian-taskmanager</guid>
            <pubDate>Wed, 02 Oct 2013 00:00:00 GMT</pubDate>
            <description><![CDATA[Switcher is a task manager for Symbian S^3 that showed running processes as tiles. The 3D part of the app ran on my OpenGL ES engine. The app went into the Ovi Store in 2012, and Symbian died in 2013. Everything below is history.]]></description>
            <content:encoded><![CDATA[<p>Switcher is a task manager for Symbian S^3 that showed running processes as tiles. The 3D part of the app ran on my OpenGL ES engine. The app went into the Ovi Store in 2012, and Symbian died in 2013. Everything below is history.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="where-the-project-comes-from">Where the project comes from<a href="https://blog.sigsegowl.xyz/2013/10/02/switcher-symbian-taskmanager#where-the-project-comes-from" class="hash-link" aria-label="Direct link to Where the project comes from" title="Direct link to Where the project comes from" translate="no">​</a></h2>
<p>The idea of a task manager existed months before the S^3 version. The first attempt was based on Python and PyS60. That attempt became too time intensive next to my university studies, and PyS60 does not run well on S^3. The S^3 version used the C++ engine instead. A video of the older attempt existed, but unfortunately it got lost in time.</p>
<p>In April 2012 I started the new project on top of the <a class="" href="https://blog.sigsegowl.xyz/2012/09/28/3d-engine-open-gl-es">2012 engine</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="process-control">Process control<a href="https://blog.sigsegowl.xyz/2013/10/02/switcher-symbian-taskmanager#process-control" class="hash-link" aria-label="Direct link to Process control" title="Direct link to Process control" translate="no">​</a></h2>
<p>Task reading and task closing worked in April 2012. Killing a process needs a certificate with the PowerMgmt capability. Without that certificate the thread panics and the app exits. The planned Task Settings window would have offered these actions:</p>
<ul>
<li class="">send system events like <code>EApaSystemEventShutdown</code></li>
<li class="">kill the thread of a task</li>
<li class="">read CPU time, priority and flags</li>
</ul>
<p>Two problems blocked me. First, my knowledge of Symbian C++ was not enough to capture the menu key long press event inside Qt. Second, the 3D window refused to work after the Qt 2D content was opened. The menu key was also unusable outside the application, so I used the proximity sensor to bring the app to the foreground.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="releases">Releases<a href="https://blog.sigsegowl.xyz/2013/10/02/switcher-symbian-taskmanager#releases" class="hash-link" aria-label="Direct link to Releases" title="Direct link to Releases" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_lB72" id="alpha-v011-unsigned-april-2012">Alpha v0.11, unsigned, April 2012<a href="https://blog.sigsegowl.xyz/2013/10/02/switcher-symbian-taskmanager#alpha-v011-unsigned-april-2012" class="hash-link" aria-label="Direct link to Alpha v0.11, unsigned, April 2012" title="Direct link to Alpha v0.11, unsigned, April 2012" translate="no">​</a></h3>
<p>Implemented: the GUI, thread priority setup, process priority setup, killing tasks. The 3D window was not part of the alpha.</p>
<p><img decoding="async" loading="lazy" alt="Switcher alpha on the Nokia N8" src="https://blog.sigsegowl.xyz/assets/images/scr000001-d1bb060b542f73d7bd5df610257aa6ec.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher alpha screenshot 4" src="https://blog.sigsegowl.xyz/assets/images/scr000004-fb9b04b482a706f0ce2debf6937a3815.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher alpha screenshot 7" src="https://blog.sigsegowl.xyz/assets/images/scr000007-2c0942ab161ef33256c1b2c7a7aefbb6.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher alpha screenshot 14" src="https://blog.sigsegowl.xyz/assets/images/scr000014-e2bc56ae9b08d60dd39baf3a5dddaa3a.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher alpha screenshot 16" src="https://blog.sigsegowl.xyz/assets/images/Scr000016-09fdea6e9e1de9acfd0273d59b99c473.jpg" width="640" height="360" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher alpha screenshot 17" src="https://blog.sigsegowl.xyz/assets/images/Scr000017-237bbe1c7533f6029bd4150b1768d258.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher alpha screenshot 18" src="https://blog.sigsegowl.xyz/assets/images/Scr000018-6cf438f6152dbf43bd6c42e585ed9ab0.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher alpha screenshot 19" src="https://blog.sigsegowl.xyz/assets/images/Scr000019-825f610736db076cccdfacc9c47cb0ec.jpg" width="360" height="640" class="img_XUCP"></p>
<p>Early 3D gui to list all running tasks:</p>
<p><img decoding="async" loading="lazy" alt="Switcher alpha 3d task view 1" src="https://blog.sigsegowl.xyz/assets/images/scr000009-eca5fcb7e8cae772fc3781194ade336f.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher alpha 3d task view 2" src="https://blog.sigsegowl.xyz/assets/images/scr000015-936f478856efa9854f013459878b7813.jpg" width="640" height="360" class="img_XUCP"></p>
<h3 class="anchor anchorTargetStickyNavbar_lB72" id="alpha-v020-unsigned-june-2012">Alpha v0.20, unsigned, June 2012<a href="https://blog.sigsegowl.xyz/2013/10/02/switcher-symbian-taskmanager#alpha-v020-unsigned-june-2012" class="hash-link" aria-label="Direct link to Alpha v0.20, unsigned, June 2012" title="Direct link to Alpha v0.20, unsigned, June 2012" translate="no">​</a></h3>
<p>New features:</p>
<ul>
<li class="">main window with CPU usage in percent for every task</li>
<li class="">long press menu in the main window</li>
<li class="">bigger buttons</li>
<li class="">colored buttons and attribute values in the task setup window</li>
<li class="">system info window with drive stats and a CPU usage graph</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Switcher alpha screenshot 20" src="https://blog.sigsegowl.xyz/assets/images/Scr000020-d66a8ebfd87a638a40539c938a0bcce5.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher alpha screenshot 21" src="https://blog.sigsegowl.xyz/assets/images/Scr000021-47ec60171a7dee3b4590800fd6ad57a8.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher alpha screenshot 22" src="https://blog.sigsegowl.xyz/assets/images/Scr000022-80885a326866abfcd98acb50f54de820.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher alpha screenshot 23" src="https://blog.sigsegowl.xyz/assets/images/Scr000023-8ab7d315388010c0b0668ee942c31c56.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher alpha screenshot 24" src="https://blog.sigsegowl.xyz/assets/images/Scr000024-98059281623f9afc27d07f1f40a59bab.jpg" width="360" height="640" class="img_XUCP"></p>
<p>The tiles update themselves, and the proximity sensor brings the task manager back to the foreground. What remained was scrolling the tiles, making them touchable, and connecting the 3D app to the working 2D app. I also asked at this point whether the app should be free or paid, and I added a donation option.</p>
<h3 class="anchor anchorTargetStickyNavbar_lB72" id="version-10-september-2012">Version 1.0, September 2012<a href="https://blog.sigsegowl.xyz/2013/10/02/switcher-symbian-taskmanager#version-10-september-2012" class="hash-link" aria-label="Direct link to Version 1.0, September 2012" title="Direct link to Version 1.0, September 2012" translate="no">​</a></h3>
<p>Version 1.0 went to the store. The submission failed first, because the permission to read the <code>C:\</code> drive was missing, where the settings file and the logs were stored. That caused a fatal chain reaction in the graph drawing.</p>
<p>Switcher passed the Ovi Store quality assurance on 2012-09-19, and it became available on 2012-09-25. The store listing existed at <code>http://store.ovi.com/content/313719</code>. The 100th purchase happened in November 2012.</p>
<p><img decoding="async" loading="lazy" alt="Switcher in the Ovi Store." src="https://blog.sigsegowl.xyz/assets/images/Swicther_store-84a26c05d30777f01f7943921639829c.jpg" width="823" height="621" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="Purchase counter of Switcher at 100 purchases." src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtkAAADKCAYAAABwkFyCAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAHhlJREFUeF7t3T1y67Yeh+GzFa/B63CvFaRO40aT9tZ3Ukrtncka7MlZQrqMneq02UDS84oUKYEUvwXBgv2cGU1iCwTBH1/KL/4G6W+FfxKQgAQkIAEJSEACEpBA1AS+Re1NZxKQgAQkIAEJSEACEpBAQbJBIAEJSEACEpCABCQggcgJkOzIgepOAhKQgAQkIAEJSEACJBsDEpCABCQgAQlIQAISiJwAyY4cqO4kIAEJSEACEpCABCRAsjEgAQlIQAISkIAEJCCByAncsWT/Xfy6/bn4eftr8Xfkg9adBCQgAQlIQAISkIAEbpnAoGT//efvxc8//VT8dPH6pfhr9Yj+Kn6p+pvTR06SfTyuX/772+pklm74+/9+PeT4c/H7n6YgS7PTXgISkIAEJCABCdw6gRWSfRTv317WqDbJjnVCSXasJPUjAQlIQAISkIAE4icwKdm//u/31l6Pcje3Gn3NgFWyx9Ij2dewZVsJSEACEpCABCRw2wQWS3Y5nN/++0trqcJfL7/1LCvpW8pwrGT3rbPuLk/5efuf4j8r1mQfxxYuc7lcmtId79h4yklGt31YxR9aVtNdOnKenBzH1rfP49jL8R4nGM1xdNteHmPZp6Ujt71U9C4BCUhAAhKQgATmJ7BCshsBPMtrv2T3LSvpl+yx7eff+NgW01C0w2p8v6BeSurwmvR22zmSPbzP9gRguF17vTfJng+4lhKQgAQkIAEJSOAjElgs2U1Fdlp++24G7JPsZp12txK7bLnI0LjK7zeSfRbittw224bV51Cew8p107a9jGb4xsfjBOKyytz03zcBaGfbv47dcpGPuFzsUwISkIAEJCABCcxLYFKyL58uMrw0oa/C2l42cSnZTRW7u/a7qJdMTMt8eaCX1fW+w28E+fKmzcvt+yS42lP91JW+4+p7ushYdbrMNtzmvFykPfru8pzyXZI9D3CtJCABCUhAAhKQwEcksFiy+6R3bLnHlGQPy+KSSvbwWu8w1CGJ7ZPWIckuDiumLx/XN1TJHl7C0kxe5kh2X0Yk+yMuF/uUgAQkIAEJSEAC8xKYlOzLCnO342Y5w0+nZRnHFvOWi3wFyZ5XjW9uKL28UZNkz4NZKwlIQAISkIAEJHAvCVwt2WsqvqF0NlXwoSUc8wQ13XKRZZXsyyexjJ34oUo7yb6Xy8U4JCABCUhAAhKQwLwEokl2V4YbeZ5aLjJ0M2Lz/XmS3axRvnw0XjmOa258vKzkz6vQN/Gfl9Jc3vwY3pRZtl8u2Wv/KNA8OLSSgAQkIAEJSEACEliXwNWSfZbDvj/B3v1T4/1rp8duDpwr2U2Fue9GzWse4TdPsi/XXl+ute7P53Js85aLXK6D95zsdZeArSQgAQlIQAISkED8BKJI9vnpHuEfWllW8W2LdimMf1Z/kGW+ZB/D6Qp73/Zz/jDMsmUw5Z7Pa9O7Tw2p3u35gz3dp5EsqWSXfbaPg2THvzz0KAEJSEACEpCABNYlMCjZ67qzlQQkIAEJSEACEpCABCRAsjEgAQlIQAISkIAEJCCByAmQ7MiB6k4CEpCABCQgAQlIQAIkGwMSkIAEJCABCUhAAhKInADJjhyo7iQgAQlIQAISkIAEJECyMSABCUhAAhKQgAQkIIHICZDsyIHqTgISkIAEJCABCUhAAiQbAxKQgAQkIAEJSEACEoicAMmOHKjuJCABCUhAAhKQgAQkQLIxIAEJSEACEpCABCQggcgJkOzIgepOAhKQgAQkIAEJSEACJBsDEpCABCQgAQlIQAISiJwAyY4cqO4kIAEJSEACEpCABCRAsjEgAQlIQAISkIAEJCCByAmQ7MiB6k4CEpCABCQgAQlIQAKDkv3tpz8KLxlgAAMYwAAGMIABDGBgBQND8wxhrgjTxMTEDAMYwAAGMIABDGCgZEAxXwISkIAEJCABCUhAAhKImwDJjpun3iQgAQlIQAISkIAEJKCSjQEJSEACEpCABCQgAQnETkAlO3ai+pOABCQgAQlIQAIS+PIJkOwvj4AAJCABCUhAAhKQgARiJ0CyYyeqPwlIQAISkIAEJCCBL58Ayf7yCAhAAhKQgAQkIAEJSCB2AiQ7dqL6k4AEJCABCUhAAhL48gkMSvYff/xReMkAAxjAAAYwgAEMYAADwwwMzSZGJfuff/8tvGSAAQxgAAMYwAAGMICBSwbKyQfJNmEwYcIABjCAAQxgAAMYiMgAyY4YplmcmTwGMIABDGAAAxjAQMkAySbZZq0YwAAGMIABDGAAA5EZINmRAzV7NXvFAAYwgAEMYAADGCDZJNvMFQMYwAAGMIABDGAgMgMkO3KgZq5mrhjAAAYwgAEMYAADJJtkm7liAAMYwAAGMIABDERmgGRHDtTM1cwVAxjAAAYwgAEMYIBkk2wzVwxgAAMYwAAGMICByAyQ7MiBmrmauWIAAxjAAAYwgAEMkGySbeaKAQxgAAMYwAAGMBCZAZIdOVAzVzNXDGAAAxjAAAYwgAGSTbLNXDGAAQxgAAMYwAAGIjNwe8l+3xebx23xchr4e7HbPBaPm33xFvlg1s8ayzFtit37yKyrPI67GrMZ4vrzLTvZYQADGMAABjBwWwaSS/bL9iDY29c7my3NkOy7mRDcFggXnHwxgAEMYAADGMDA9Qwkley3/aangl1Xth8P8v3YVJOP39u+Bgf4uu2vfteV8l3Zd9XHcbtK5lt9ln0N76vZtvpvWbGuK9e7qp9DJb5VyQ77OVflz/t8LDb79zubSFwPiwtOhhjAAAYwgAEMYGAeA+kke0CSSzE9CWnYpvz/oOJdtmtJd1NZriS700ct2hUEQZ+D+6rku7NcpO73tM9Asnur8a3jey12JNskw28/MIABDGAAAxj4sgwkkuy6qnyxpvm12LbWa5dfN7IbvtdtF8wgumulB78e29eAZIfjPfU7MJahSruL68teXGb682b6cpITBjCAAQx8RgYSSXZ542Mpp51lFHW1uLVU4yTZxyUfZZW7WmYytI57rmSP7muBZF/cyNlcGO0lJL1Vd8JNuDGAAQxgAAMYwMCXYCChZB9ktLsEoxLv8MkjnZlcJdDbYjv25I+5kj26rxiSfR57/9pzs9TPOEt1TLjGAAYwgAEMYKCPgbSSfZi5VQIaiHVrnfTh/Zftwsf9zZbsc2W8CSLc18Wa78F+64p1p7L+tt+eHwHYWU/u4nPxYQADGMAABjCAga/FQHLJLgE7PoWjken+J3WcRXjghsfwxsfetdP1iZzxVJBqX+FykuDpIqdneY/1Uwp3Kdb1003CSYQL6mtdUM63840BDGAAAxjAQMnA7SX7qnVHE8tJruobAD4EMIABDGAAAxjAAAZuw8BdS/boDY8E+0vcNODCv82FL1e5YgADGMAABm7LwF1LtpN/25MvX/liAAMYwAAGMICB2zBAslXEVcQxgAEMYAADGMAABiIzQLIjB2o2eJvZoFzligEMYAADGMBATgyQbJJt5ooBDGAAAxjAAAYwEJkBkh050JxmWMaqIoABDGAAAxjAAAZuwwDJJtlmrhjAAAYwgAEMYAADkRkg2ZEDNRu8zWxQrnLFAAYwgAEMYCAnBkg2yTZzxQAGMIABDGAAAxiIzADJjhxoTjMsY1URwAAGMIABDGAAA7dhgGSTbDNXDGAAAxjAAAYwgIHIDJDsyIGaDd5mNihXuWIAAxjAAAYwkBMDqyW73NBLBhjAAAYwgAEMYAADGOhnoBj4923ojTLInGYSxmrmiwEMYAADGMDAPTEwVuUc8i/fzyuB1ZXsewLVWHxwYgADGMAABjCQEwMkOy9hXjNakm1Ntt9KYAADGMAABjCQmAGSvUZb89qGZCe+qHKaZRurqhAGMIABDGDgNgyQ7LyEec1oSTbJVr3AAAYwgAEMYCAxAyR7jbbmtQ3JTnxRqQjcpiIgV7liAAMYwEBODJDsvIR5zWhJNslWvcAABjCAAQxgIDEDJHuNtua1DclOfFHlNMs2VlUhDGAAAxjAwG0YINl5CfOa0ZJskq16gQEMYAADGMBAYgZI9hptzWsbkp34olIRuE1FQK5yxQAGMICBnBgg2XkJ85rRkmySrXqBAQxgAAMYwEBiBkj2Gm3NaxuSnfiiymmWbayqQhjAAAYwgIHbMECy8xLmNaMl2SRb9QIDGMAABjCAgcQMkOw12prXNvcr2e/7YrPZF2990I+917Sf02bOBRWrn6l9pdrP1Di87wcNBjCAAQxg4OYMkOy8hHnNaG8v2aU8Pj4Wj6fXtniZc/HOkew5bebsa6xNbPkd6m/WsbwXu82m2L3f5ldXfiUoVwxgAAMYwEAaBkj2Gm39iG2+F88Pz8X3FbtOJNlnsX7bb4rHoQp1KLuzpHPkQoglx7H6mZL9Wfsh2T7803z4y1nOGMAABm7LAMleYa2JN/n+/FA8PJSvTCT7n6qyXUt3VyzDr+v/322bKnhQwW3aBe1fTu0ei83+vaj2c5D53u0r4S2Ftafv8r1u9X1i2UrfPqrJRFDBr8bU9N30t2g/22J7Gm897tO4Bo6lznoXjGX7+m9xzuqc6UV+h7FW35szIZqaQHj/5r929MPwtj8M5StfDGAgNgMkO7Exr95dRpXsRZJ9kNRSCkuwWxXwrmS/bgMZfC12jWQH2//TanMUyJP4tt47Cmuz30bWB9eGD42xW5V/rIX2NDFYuJ9Kdvsr2YPHUkt86zj7MunLj2QTY5MjDGAAAxi4GQMke7X1Jt4wI8muqqPb18uqbl+VN6yi9lXAG2HtCPRFxbjb97+vxbapplcfIOXXgQSH7y1athL00/pgCuQ4nCAs3k+fZE8cSzfDvq/78vPBerMP1tjVEP2psGEAAxjIjwGSndiVV+/u7iU7uPFxjvRdSHEjwp1lJp2qcLM8o6pCTy1Fad2MWY6vluyucF4h2e0lI51K9qr99Ej2xY2lwbGMZdDKOFxuElTxiTbRxgAGMIABDNyEAZK92noTb3j3kj3wRJGwOn1NJTv4ADgtKxkVzG71N5gBT4np2M2Z4fGUEn2qVA9UsscmHL37mVPJXnAsPROI2Tem+tC9yYeualR+1SjnzDnDAAbWMECyE7vy6t1lLdmdm+/CmwIDCe1dZlJL4st+e36sXSm35XKUCVlurWOu1h83E4H2ko9R6ezso2pbL4UJ//+4Dr27Jnvdfspxn9aL16I7eCxTE4ax/KzJJtEmUhjAAAYwcDMGSPZq6028Ya6S3dzQWC/d2O6DP0Az9uSNvhsfu8/hnhLM1tNFOk/RqKrQxyUum4N8j/5RnHDZSetJHKVEN08BKZ8M0pXsw8x/yX76nkjS+3SR4FimMgjXtPc8x9zTRVRn1lRnbIMbDGAAA9MMkOzErrxid+dH+B0f5fe0+7Gol9s/J/szz4LH1mt/5uN2bDerbPjBNP2DSUYywgAGPgMDJHuRr2bZmGRfI4wkm2xew49t8YMBDGDgyzJAsrP05kWDJtk+4L7sB9xnqIQ4BhU9DGAAA3kyQLIX+WqWjUk2ySbZGMAABjCAAQwkZoBkZ+nNiwZNshNfVCoOeVYcnDfnDQMYwAAGYjJAshf5apaNSTbJVr3AAAYwgAEMYCAxAyQ7S29eNGiSnfiiijkL1peqCgYwgAEMYCBPBkj2Il/NsjHJJtmqFxjAAAYwgAEMJGaAZGfpzYsGTbITX1QqDnlWHJw35w0DGMAABmIyQLIX+WqWjUk2yVa9wAAGMIABDGAgMQMkO0tvXjRokp34ooo5C9aXqgoGMIABDGAgTwZI9iJfzbIxySbZqhcYwAAGMIABDCRmgGRn6c2LBk2yE19UKg55VhycN+cNAxjAAAZiMkCyF/lqlo1XS3a5oZcMMIABDGAAAxjAAAYw0M/A0Ozg29AbZZAxZ3P6Uh3AAAYwgAEMYOArMaCSnWVxetGgV1eyv9KF4Fh98GMAAxjAAAYwEJMBkr3IV7NsTLKtyfZbCQxgAAMYwAAGEjNAsrP05kWDJtmJL6qYs2B9qapgAAMYwAAG8mSAZC/y1Swbk2ySrXqBAQxgAAMYwEBiBkh2lt68aNAkO/FFpeKQZ8XBeXPeMIABDGAgJgMke5GvZtmYZJNs1QsMYAADGMAABhIzQLKz9OZFgybZiS+qmLNgfamqYAADGMAABvJkgGQv8tUsG5Nskq16gQEMYAADGMBAYgZIdpbevGjQJDvxRaXikGfFwXlz3jCAAQxgICYDJHuRr2bZmGSTbNULDGAAAxjAAAYSM0Cys/TmRYMm2YkvqpizYH2pqmAAAxjAAAbyZIBkL/LVLBuTbJKteoEBDGAAAxjAQGIGSHaW3rxo0PlL9vu+2Gz2xVvii0PlIM/KgfPmvGEAAxjAwD0wQLIX+WqWjW8v2aUEPz4Wj6fXtniJKcQkW/UhJk/6whMGMIABDCRggGSn9ubvxfPDc/H9Yrfl9x+Kh+rVfX/svenxJ5Lss1i/7TfFY8zKM8n2YZjgw/Aeqh7GoPqGAQxg4PMwQLKnJTVWi+/PQxL9o9g9PRTPjXl/fy4eTl+MvTdvZMkl+5+qsl1Ld1eQw6/r/99tyyp4I+nvxW4TVMVLWW+1K9/bFLv340VYCX1QRd/s309C+lL1e3ydvx/2f+6n7KuvffW9mBMGsmjCgAEMYAADGPgSDJDseaIar1VfJbvzvR+74ulUzR57b96o7luyDwK8fT3PWiup3b62L756Ocqp3eu2X3yrdrU4t9q8Frtavsv+T8IdthlpT7I/T1VBhci5xAAGMICBVAyQ7HmiGq9Vj2S3pPqwp/DrsfdmDiq5ZLdEeUYl+3xD42uxPVW0gw+BsT5a1YCySt0n2U1f3f7Lr8fa+yBK9UFkP1jDAAYwgIHPxgDJnmmq0ZrNkOzDiu3nh6di96Mj3NUYgvdmjimRZHeWeDTyu0Syw2UmoTxPSHZ7yUizBKS97KSqgl/coBkuPelp79d5X+LXeZ/tQ93xEBUMYAAD98EAyZ5pqtGazZDs3CvZrYu7K849a7JPlew1kl0u82it526vsz6t267WVQ9UyjsyHf3GTbJO1jGAAQxgAANfjgGSHc2eZ3b0FdZkd6vQwY2KrRsJL54aUleT+9ZkhzcfBttVQty0D9Zkv+23p5sj/ylFvG7TWpNd3ex4vOFyrL012fdREVCZcR4wgAEMYCAnBkj2TDeO1qxPsj/b00X6KsP1Uz62++APy/Q+mq/zdJFSjkeXi5TV6XqpymZbbMM12b3P7e55ekk53qoi3ix5OT+O0NNFfKDn9IFurHjFAAYwcD8MkOxo9jzZ0fkRfsdH+T1Vi66bfzk/J9uvwL7cr8B8iN/Ph7hz4VxgAAMYuE8GSPakG2ff4PY3PpJsko0BDGAAAxjAAAZaDJDs7B168gBItoveBz8GMIABDGAAA4kZINmTjpp9A5Kd+KLya7v7/LWd8+K8YAADGMBASgZIdvYOPXkAJJtkq15gAAMYwAAGMJCYAZI96ajZNyDZiS+qlLNk+1KVwQAGMIABDNwnAyQ7e4eePACSTbJVLzCAAQxgAAMYSMwAyZ501OwbkOzEF5WKwn1WFJwX5wUDGMAABlIyQLKzd+jJAyDZJFv1AgMYwAAGMICBxAyQ7ElHzb4ByU58UaWcJduXqgwGMIABDGDgPhkg2dk79OQBkGySrXqBAQxgAAMYwEBiBkj2pKNm34BkJ76oVBTus6LgvDgvGMAABjCQkgGSnb1DTx4AySbZqhcYwAAGMIABDCRmgGRPOmr2DVZLdrmhlwwwgAEMYAADGMAABjDQz8DQTOHb0BtlkCl/pWJffoWHAQxgAAMYwMBnYkAlO/tC9eQBrK5kfybQHYsPbgxgAAMYwAAGUjJAsicdNfsGJDvxGqyUF7B9+YGBAQxgAAMYuE8GSHb2Dj15ACSbZFv6gwEMYAADGMBAYgZI9qSjZt+AZCe+qFQU7rOi4Lw4LxjAAAYwkJIBkp29Q08eAMkm2aoXGMAABjCAAQwkZoBkTzpq9g1IduKLKuUs2b5UZTCAAQxgAAP3yQDJzt6hJw+AZJNs1QsMYAADGMAABhIzQLInHTX7BiQ78UWlonCfFQXnxXnBAAYwgIGUDJDs7B168gBINslWvcAABjCAAQxgIDEDJHvSUbNvQLITX1QpZ8n2pSqDAQxgAAMYuE8GSHb2Dj15ACSbZKteYAADGMAABjCQmAGSPemo2Tcg2YkvKhWF+6woOC/OCwYwgAEMpGSAZGfv0JMHQLKXSPb7vths9sXbkm20VR3BAAYwgAEMYKDDAMmedNTsG9xesksxfXwsHruv7evABfde7DabYvcezKijyW1P30s++KKNQ7UgZbXAvvCGAQxgAAP3xgDJbjv0j91T8fDw0Hk9FbsfZbvvxXPrvefDd2b8+/586K/Ttvpes5+m/+G+vj93xvS0K6ohzfiXSLK3xctsmb1ShEf3c2XfJFslYjbHfqDd2w8048EkBjBwTwyQ7AlL/bErnhpBPvz/89G2q3+VkE/JbrV9KciBZFffO4v1UeyHhP1HsXs6bD+1n5HD+HDJftmeq9yb/euhit2pepfLMxq5rari22K335wq49vXf4tzH8cK+FvwfllB3+zfD3JYCnZP35U0he/1VNHDKvzQcpF6jLvqeJpJRV+/x++V4z5d7K/b4vHU78BYWv2X+wjG2ZX/i8nA8PFV2VkCY/Jg8oABDGAAA0kZINnjkl1WkJ8CsW61DgW8t5uy8l3KdPnfs0RXUv0c1sCPIt36VtNfXxV8RvU6bPKxkt2Sy4Ngn2R4YLlIvfTkKM0HSS23PwjwSVhb/dUSW23T9NdfyS5Fs9VnR3hP/Y9VsuuxhfI82G85zmC5TNhucJtu/+GxTkj28PHVExSSnfSD9Z4qKcaisocBDGDgYxgg2SPGOiHR45XsUJznSfalzHeXp8xfXvIBkn25JruS0T4prqrKI5IdCuFkBbepUo9J9muxPVWey/bl13X7unJ+WuoyJdktWR3pt9pHU+0O9tf6fs9Yho59NIexcXzMB4sPdLljAAMYwMBXZ4Bkj6+DHqxi1+uze6vP5ertVgW8LdmHNzvLQ45C3revy6r3wjL2ofnHVrI7SziOVeA4kt1eMjIi2b03Ztbtu5OAJZI91u+hCl9Wly8mGmPbjIn01HsXN552JjF+RaiSjQEMYAADGEjKAMkekNbRKvaxwjws4PU66sEbKOv13J33L4V9oJK9cH32B0v2eSZfSXFVqY0g2dUyknBd9JJK9shTTZZI9kVVulO1qJeMlMd9XmLSrTrPHMtoxX2kTx+oST9Qv3rVxvGrXGIAAxg4M0Cy+yV7eC32UXyHKtgDvbXWZF+26VS6wwa5r8l+2x9uYmwe1ResUz5VeRsJDG98nLFc5KUU9mbNc2tNdlBBDgSztWa5qjL3LeWob6icuPExfIb2cL/npSCbTfvJK4PbTFarz9Xp7s2MY+Nw46Mfen7oYQADGMBAegZIdo8WD1axxwW7esxeb5V5RKIPD+IbWipSP8Mkl6eLDDwnu75x8fgM7UA2w2UT3aeLzJDst6qKXO/zILHbcI13t++Lp4t0nrYRjHFzkO/BP0bTW+XuPNGkI+iV4F48L3xgm4n15+HymO2++0dzhsdBstN/sPphJnMMYAADGCDZXckekd7Ws63Pz61uqtrzJbu9nGROVfy+n5NtSYIlCRjAAAYwgAEMYKDFAMlefiNhblvcfk22i8oHKwYwgAEMYAADGCDZuVnyleMl2S56H/wYwAAGMIABDCRmQCX7SoPNYHOSnfiisg7POjwMYAADGMAABkh2BpZ85RBJNslWvcAABjCAAQxgIDEDJPtKg81gc5Kd+KJSvVC9wAAGMIABDGCAZGdgyVcOkWSTbNULDGAAAxjAAAYSM0CyrzTYDDYn2YkvKtUL1QsMYAADGMAABkh2BpZ85RBJNslWvcAABjCAAQxgIDEDJPtKg81gc5Kd+KJSvVC9wAAGMIABDGCAZGdgyVcOkWSTbNULDGAAAxjAAAYSM0CyrzTYDDYn2YkvKtUL1QsMYAADGMAABkh2BpZ85RBJNslWvcAABjCAAQxgIDEDJPtKg81g89WSXW7oJQMMYAADGMAABjCAAQz0MzA0F/iWwSTBECUgAQlIQAISkIAEJJBVAiQ7q9NlsBKQgAQkIAEJSEACOSRAsnM4S8YoAQlIQAISkIAEJJBVAiQ7q9NlsBKQgAQkIAEJSEACOSRAsnM4S8YoAQlIQAISkIAEJJBVAiQ7q9NlsBKQgAQkIAEJSEACOSRAsnM4S8YoAQlIQAISkIAEJJBVAv8HSNhZPM+xJAMAAAAASUVORK5CYII=" width="729" height="202" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="Switcher beta screenshot 28" src="https://blog.sigsegowl.xyz/assets/images/Scr000028-53796ad1a1fddb09df3d2afa0110b680.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher beta screenshot 29" src="https://blog.sigsegowl.xyz/assets/images/Scr000029-2b7f9454e0e8b28810400774dae9d76e.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher beta screenshot 30" src="https://blog.sigsegowl.xyz/assets/images/Scr000030-f63f64c697cad9ec56d4a93a41fd2c80.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher beta screenshot 31" src="https://blog.sigsegowl.xyz/assets/images/Scr000031-f0ed68dfd9d71067a98d5739c58263bc.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher beta screenshot 32" src="https://blog.sigsegowl.xyz/assets/images/Scr000032-7583819fecccd8cff37630e407d44deb.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher beta screenshot 33" src="https://blog.sigsegowl.xyz/assets/images/Scr000033-d233709c59a17438119301ca94c29800.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher beta screenshot 34" src="https://blog.sigsegowl.xyz/assets/images/Scr000034-907916db5793d636150b4d00ac695e4c.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher beta screenshot 35" src="https://blog.sigsegowl.xyz/assets/images/Scr000035-b10204c203b161b0aaf2338a09e49026.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher beta screenshot 36" src="https://blog.sigsegowl.xyz/assets/images/Scr000036-193154ffab0eb4361e85479a7d460cc6.jpg" width="360" height="640" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Switcher beta screenshot 38" src="https://blog.sigsegowl.xyz/assets/images/Scr000038-77188c869f3de02d39458af12edb91bb.jpg" width="360" height="640" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="bugs-on-the-platform">Bugs on the platform<a href="https://blog.sigsegowl.xyz/2013/10/02/switcher-symbian-taskmanager#bugs-on-the-platform" class="hash-link" aria-label="Direct link to Bugs on the platform" title="Direct link to Bugs on the platform" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_lB72" id="out-of-memory-in-the-qt-ui-code">Out of memory in the Qt UI code<a href="https://blog.sigsegowl.xyz/2013/10/02/switcher-symbian-taskmanager#out-of-memory-in-the-qt-ui-code" class="hash-link" aria-label="Direct link to Out of memory in the Qt UI code" title="Direct link to Out of memory in the Qt UI code" translate="no">​</a></h3>
<p>This bug deserved its own post. See <a class="" href="https://blog.sigsegowl.xyz/2012/05/20/qt-qpixmap-out-of-memory">the QPixmap bug</a> for the broken code, the working code and the reasoning. Short version: scaling a <code>QPixmap</code> leaks memory on Symbian, and converting to <code>QImage</code> before the scale fixes it.</p>
<h3 class="anchor anchorTargetStickyNavbar_lB72" id="custom-fonts-in-modded-roms">Custom fonts in modded ROMs<a href="https://blog.sigsegowl.xyz/2013/10/02/switcher-symbian-taskmanager#custom-fonts-in-modded-roms" class="hash-link" aria-label="Direct link to Custom fonts in modded ROMs" title="Direct link to Custom fonts in modded ROMs" translate="no">​</a></h3>
<p>One bug appeared on devices with custom fonts. It looked like modded ROM fonts were the cause, yet the app worked once on a device with modded fonts. The error was <code>QSymbianLeaveExceptionKrerralreadyExists</code>, and it appeared in all applications. Other people had the same problem, and the Qt developers at Digia had an exception in the basic Symbian implementation without knowing the reason for the failure.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="the-3d-ui-rewrite">The 3D UI rewrite<a href="https://blog.sigsegowl.xyz/2013/10/02/switcher-symbian-taskmanager#the-3d-ui-rewrite" class="hash-link" aria-label="Direct link to The 3D UI rewrite" title="Direct link to The 3D UI rewrite" translate="no">​</a></h2>
<p>The UI of the first release was bad. The new UI was rendered in OpenGL ES 2.0 without any Qt element. A preview animation showed the idea in December 2012, see <a href="http://www.youtube.com/watch?v=1we-DUqh-HU" target="_blank" rel="noopener noreferrer" class="">the UI preview video</a>.</p>
<p>The design work in March 2013 started on paper, then it became a digital layout with metrics. Red areas were touch areas and buttons. Green areas were dynamic information rectangles. A yellow area was a simple overlay.</p>
<p><img decoding="async" loading="lazy" alt="UI design sketch." src="https://blog.sigsegowl.xyz/assets/images/scan_corrected-94713384a8e7ff35a68cbd58fa68f3d3.jpg" width="7008" height="4960" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="First menu as digital layout with touch areas and metrics." src="https://blog.sigsegowl.xyz/assets/images/switcher_ui_design_metrics-a3d86259139293513eaa974a74d73141.jpg" width="960" height="1280" class="img_XUCP"></p>
<p>Almost every UI element used one single image as texture atlas. That choice lets the user modify the whole look by replacing one file.</p>
<p><img decoding="async" loading="lazy" alt="Switcher UI version 3, single texture atlas." src="https://blog.sigsegowl.xyz/assets/images/Switcher-UI-V3-2a2ee3f1016dac5e7afec048c76e0555.png" width="256" height="128" class="img_XUCP"></p>
<p>In the code the base classes came first, and the higher level classes like buttons, lists and switches came from them. Elements were detected by touch gestures in 3D space. The engine emulated OpenGL ES 2.0 on my desktop machine, so everything on the screen looked 100 percent identical to the phone.</p>
<p><img decoding="async" loading="lazy" alt="Scrollable tile list test." src="https://blog.sigsegowl.xyz/assets/images/switcher_scroolable_tiles_test-73fd521e0af8476cdf96d38ef71b66d6.png" width="1600" height="900" class="img_XUCP"></p>
<p><img decoding="async" loading="lazy" alt="3D UI work in progress with pseudo buttons." src="https://blog.sigsegowl.xyz/assets/images/switcher_3d_update_work_in_progress_0001-dbe0e4e827492b936aaffe551cef8425.png" width="798" height="982" class="img_XUCP"></p>
<p>The engine project got its own repository, and the phone got started for the first time in May 2013. The app needed a few seconds at the start, and after that it ran like on the desktop machine. The demo showed a draggable green formation that springs back on release, and the exit button already worked. The demo is still downloadable: <a href="https://blog.sigsegowl.xyz/assets/files/switcher-a076323246b1e98f3d9168ed22e58a2e.zip" target="_blank" class="">switcher.zip</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="source-code-and-the-end">Source code and the end<a href="https://blog.sigsegowl.xyz/2013/10/02/switcher-symbian-taskmanager#source-code-and-the-end" class="hash-link" aria-label="Direct link to Source code and the end" title="Direct link to Source code and the end" translate="no">​</a></h2>
<p>I published the source of Switcher v1.0 in October 2013.</p>
<ul>
<li class="">Switcher source: <a href="https://github.com/AJ92/Switcher" target="_blank" rel="noopener noreferrer" class="">github.com/AJ92/Switcher</a></li>
</ul>
<p>Nokia's Symbian OS died, and Switcher with it. The old Symbian downloads with the <code>.sis</code> files are gone.</p>]]></content:encoded>
            <category>switcher</category>
            <category>symbian</category>
            <category>qt</category>
            <category>archive</category>
        </item>
        <item>
            <title><![CDATA[University projects: Spectre and Wochenplaner]]></title>
            <link>https://blog.sigsegowl.xyz/2013/01/06/university-projects</link>
            <guid>https://blog.sigsegowl.xyz/2013/01/06/university-projects</guid>
            <pubDate>Sun, 06 Jan 2013 00:00:00 GMT</pubDate>
            <description><![CDATA[These two projects came out of my studies at university. I study media informatics, and the semester projects allowed any object oriented programming language. Neither project became a long running hobby project, so the whole story sits in one post.]]></description>
            <content:encoded><![CDATA[<p>These two projects came out of my studies at university. I study media informatics, and the semester projects allowed any object oriented programming language. Neither project became a long running hobby project, so the whole story sits in one post.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="spectre-a-music-visualizer">Spectre, a music visualizer<a href="https://blog.sigsegowl.xyz/2013/01/06/university-projects#spectre-a-music-visualizer" class="hash-link" aria-label="Direct link to Spectre, a music visualizer" title="Direct link to Spectre, a music visualizer" translate="no">​</a></h2>
<p>Spectre is a small music visualization program. It is powered by the FMOD Ex sound engine, and the GUI uses Qt. I was surprised how easy FMOD is to use and to combine with Qt. The project was part of the media subject in my second semester.</p>
<p><img decoding="async" loading="lazy" alt="Spectre visualizing music." src="https://blog.sigsegowl.xyz/assets/images/spectre_screen-300x243-3007a7ba393697b6f727de453e00c89b.png" width="300" height="243" class="img_XUCP"></p>
<p>Two archives exist: <a href="https://blog.sigsegowl.xyz/assets/files/spectre-7ad20b9db2d0bd2fcfc70401d2c68954.zip" target="_blank" class="">spectre.zip</a> and the source <a href="https://blog.sigsegowl.xyz/assets/files/spectr_source-8d6a7fa4002a20c51cad7acb7b2f69f1.zip" target="_blank" class="">spectr_source.zip</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="wochenplaner-a-weekly-schedule-manager">Wochenplaner, a weekly schedule manager<a href="https://blog.sigsegowl.xyz/2013/01/06/university-projects#wochenplaner-a-weekly-schedule-manager" class="hash-link" aria-label="Direct link to Wochenplaner, a weekly schedule manager" title="Direct link to Wochenplaner, a weekly schedule manager" translate="no">​</a></h2>
<p>The tool manages a weekly schedule. The features include a printable schedule and a SQL database. The GUI uses Qt, because any object oriented language was allowed. The server is a simple Windows console application that runs as a CGI application on an Apache server with a MySQL database. The server code uses only the standard Windows libraries and the MySQL libraries from Visual Studio.</p>
<p><img decoding="async" loading="lazy" alt="Wochenplaner interface." src="https://blog.sigsegowl.xyz/assets/images/Wochenplaner-300x223-166a20ae3c43709281a0599b5c2cd0ac.png" width="300" height="223" class="img_XUCP"></p>
<p>The project never went beyond that state, so no download and no source exists for it.</p>]]></content:encoded>
            <category>tools</category>
            <category>qt</category>
            <category>archive</category>
        </item>
        <item>
            <title><![CDATA[OpenGL ES 3D engine on Symbian and Windows]]></title>
            <link>https://blog.sigsegowl.xyz/2012/09/28/3d-engine-open-gl-es</link>
            <guid>https://blog.sigsegowl.xyz/2012/09/28/3d-engine-open-gl-es</guid>
            <pubDate>Fri, 28 Sep 2012 00:00:00 GMT</pubDate>
            <description><![CDATA[This post collects the development notes of my first C++ 3D engine. The engine ran on my notebook under Windows and on my Nokia N8 under Symbian S^3 Belle. It used OpenGL ES 2.0, and the Qt framework provided the application shell. The engine became later the base of a 3d rewrite for the Switcher task manager.]]></description>
            <content:encoded><![CDATA[<p>This post collects the development notes of my first C++ 3D engine. The engine ran on my notebook under Windows and on my Nokia N8 under Symbian S^3 Belle. It used OpenGL ES 2.0, and the Qt framework provided the application shell. The engine became later the base of a 3d rewrite for the <a class="" href="https://blog.sigsegowl.xyz/2013/10/02/switcher-symbian-taskmanager">Switcher task manager</a>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="first-output">First output<a href="https://blog.sigsegowl.xyz/2012/09/28/3d-engine-open-gl-es#first-output" class="hash-link" aria-label="Direct link to First output" title="Direct link to First output" translate="no">​</a></h2>
<p>The graphical part reached a first release in March 2012. Physics with the Bullet engine, audio and touch input were planned for a later date. A level editor and a shader editor were planned as well.</p>
<p><img decoding="async" loading="lazy" alt="First screenshot of the engine in action." src="https://blog.sigsegowl.xyz/assets/images/engine_first_pic-1024x544-ee95093c151f32865ccffe78cd41a44d.png" width="1024" height="544" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="draw-call-and-buffer-management">Draw call and buffer management<a href="https://blog.sigsegowl.xyz/2012/09/28/3d-engine-open-gl-es#draw-call-and-buffer-management" class="hash-link" aria-label="Direct link to Draw call and buffer management" title="Direct link to Draw call and buffer management" translate="no">​</a></h2>
<p>All meshes are sorted by material. This prevents multiple texture and shader switches per frame. Identical meshes are sorted next to each other, so the vertex arrays do not get send to the GPU again.</p>
<p>The debug window below shows CPU and GPU load, framerate, timestep, both averages, material switches per frame and vertex array switches per frame. The engine ran on one CPU core only.</p>
<p><img decoding="async" loading="lazy" alt="Debug window with CPU and GPU usage, fps, timestep, material switches and vertex array switches per frame." src="https://blog.sigsegowl.xyz/assets/images/engine_performance_test-1024x575-eebd2efec6da68a6c60c5f88afab2193.png" width="1024" height="575" class="img_XUCP"></p>
<p>Vertex buffer objects replaced the vertex arrays and the gain was large. The numbers below are triangles per second.</p>
<ul>
<li class="">about 34 560 720 triangles per second without VBOs</li>
<li class="">about 115 200 720 triangles per second with VBOs</li>
</ul>
<p>The test machine used an Intel Core i7 at 2.2 GHz and an nVidia GT 540. The Nokia N8 also gained a lot of speed.</p>
<p>The phone test reached about 1.5 million triangles per second. That equals 48 012 triangles in 33.3 frames.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="shader-class-rewrite">Shader class rewrite<a href="https://blog.sigsegowl.xyz/2012/09/28/3d-engine-open-gl-es#shader-class-rewrite" class="hash-link" aria-label="Direct link to Shader class rewrite" title="Direct link to Shader class rewrite" translate="no">​</a></h2>
<p>The shader class got a full rewrite, and the renderer adapted to the new class. After that change it became possible to write own shaders and own rendering techniques. The cost was the reimplementation of the shader class with a few own functions.</p>
<p><img decoding="async" loading="lazy" alt="A few thousand cubes rendered with a simple directional light shader." src="https://blog.sigsegowl.xyz/assets/images/engine_shader_test-1024x575-95c0c5cec4d79d87b30f650c40830e2e.png" width="1024" height="575" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="runtime-object-and-texture-control">Runtime object and texture control<a href="https://blog.sigsegowl.xyz/2012/09/28/3d-engine-open-gl-es#runtime-object-and-texture-control" class="hash-link" aria-label="Direct link to Runtime object and texture control" title="Direct link to Runtime object and texture control" translate="no">​</a></h2>
<p>The early release could not delete models, meshes, materials or texture maps at runtime. That became possible later, and these were the rules I had to respect:</p>
<ul>
<li class="">load a model once and create instances of it, or load a full copy into RAM</li>
<li class="">update single texture maps of a material at runtime</li>
<li class="">delete a model when it is no longer needed</li>
<li class="">never update or delete the real model when instances exist, because that changes every instance</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="engine-tools-and-the-model-viewer">Engine tools and the model viewer<a href="https://blog.sigsegowl.xyz/2012/09/28/3d-engine-open-gl-es#engine-tools-and-the-model-viewer" class="hash-link" aria-label="Direct link to Engine tools and the model viewer" title="Direct link to Engine tools and the model viewer" translate="no">​</a></h2>
<p>I started a tool window in April 2012. The first version held system stats and window tools only.</p>
<p><img decoding="async" loading="lazy" alt="Engine tools in a very early stage." src="https://blog.sigsegowl.xyz/assets/images/Engine_editor_v0_001-300x155-9b9826a987f5bd8fc662863dc6eecab0.png" width="300" height="155" class="img_XUCP"></p>
<p>In September 2012 I built a small model viewer to preview models inside the engine and to play around with shaders and settings. The model is Betty, the first ship of Gallaxy on Fire 2. A strong specular map makes the scratches shine and the hull starts to look like metal.</p>
<p><img decoding="async" loading="lazy" alt="Model viewer screenshot." src="https://blog.sigsegowl.xyz/assets/images/modelviewer-300x168-32818decb11c146f30809341494173fe.png" width="300" height="168" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Model viewer screenshot with a specular map." src="https://blog.sigsegowl.xyz/assets/images/viewer_screen3-300x168-9e366d7b70006e9f8e941c6482cac74a.png" width="300" height="168" class="img_XUCP"></p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="procedural-planets">Procedural planets<a href="https://blog.sigsegowl.xyz/2012/09/28/3d-engine-open-gl-es#procedural-planets" class="hash-link" aria-label="Direct link to Procedural planets" title="Direct link to Procedural planets" translate="no">​</a></h2>
<p>In april 2010 I got inspired by the amazing tech demo that later became <a href="https://inovaestudios.com/Battlescape" target="_blank" rel="noopener noreferrer" class="">Infinity: Battlescape</a></p>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/h7eREddMjt4" title="Infinity tech demo part 1 2012 april" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/3muhlQYFgLE" title="Infinity tech demo part 2 2012 april" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<p>I played around with pocedural generation of spherical shapes. The first step of was the vertex generation of an icosahedron sphere. Subdivision level 2 gives about 0.9k vertices. Subdivision level 5 gives over 61k vertices.</p>
<p><img decoding="async" loading="lazy" alt="Icosahedron sphere with 2x subdivision, about 0.9k vertices." src="https://blog.sigsegowl.xyz/assets/images/icosahedron_2xSubdivided-300x134-c8d413abba7416e9ae833ce4685708c7.png" width="300" height="134" class="img_XUCP">
<img decoding="async" loading="lazy" alt="Icosahedron sphere with 5x subdivision, over 61k vertices." src="https://blog.sigsegowl.xyz/assets/images/icosahedron_5xSubdivided-300x134-2d7563a2856ed6e9cf9f866f80176b56.png" width="300" height="134" class="img_XUCP"></p>
<p>The experiment never went any where far, but later I tried to pick up the idea again in unity, but also quickly dropped it.</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="first-release">First release<a href="https://blog.sigsegowl.xyz/2012/09/28/3d-engine-open-gl-es#first-release" class="hash-link" aria-label="Direct link to First release" title="Direct link to First release" translate="no">​</a></h2>
<p>The manual and the class diagram went along with the graphical part. The release also used the Imagination Technologie emulator for Windows, which was the way to develop for the phone from a desktop machine. The code was opensourced and ultimately ended up later in the following repository: <a href="https://github.com/AJ92/Engine" target="_blank" rel="noopener noreferrer" class="">https://github.com/AJ92/Engine</a></p>
<p><img decoding="async" loading="lazy" alt="Class diagram of the engine at that time." src="https://blog.sigsegowl.xyz/assets/images/Class_diagramm_I-300x225-e659014b76918d52dd0e75983f9299c7.png" width="300" height="225" class="img_XUCP"></p>
<p>The 3D part of a future project Switcher used an early version of this engine and went out for testing in May 2012 as an unsigned app. The <a href="https://github.com/AJ92/Switcher" target="_blank" rel="noopener noreferrer" class="">https://github.com/AJ92/Switcher</a> repository still contains parts of this version...</p>
<h2 class="anchor anchorTargetStickyNavbar_lB72" id="planned-never-shipped-features">Planned, never shipped features<a href="https://blog.sigsegowl.xyz/2012/09/28/3d-engine-open-gl-es#planned-never-shipped-features" class="hash-link" aria-label="Direct link to Planned, never shipped features" title="Direct link to Planned, never shipped features" translate="no">​</a></h2>
<p>The plan for the next engine version listed these items:</p>
<ul>
<li class="">model viewer with ASE, OBJ, FBX and a binary model format loader</li>
<li class="">binary model format exporter</li>
<li class="">shader tweaking and shader coding at runtime</li>
<li class="">model variable editing at runtime, for example light parameters</li>
<li class="">Bullet physics 2.8x</li>
<li class="">an Android port where everything gets written once again</li>
</ul>
<p>The engine never reached that state. Symbian died in 2013, and the desktop rewrite got a new name. See <a class="" href="https://blog.sigsegowl.xyz/2015/03/16/renderer-quark-desktop-open-gl">the Quark renderer</a> for the follow-up project.</p>]]></content:encoded>
            <category>engine-3d</category>
            <category>symbian</category>
            <category>archive</category>
        </item>
        <item>
            <title><![CDATA[Notebook fried and replaced in 2012]]></title>
            <link>https://blog.sigsegowl.xyz/2012/08/17/notebook-hardware-upgrade</link>
            <guid>https://blog.sigsegowl.xyz/2012/08/17/notebook-hardware-upgrade</guid>
            <pubDate>Fri, 17 Aug 2012 00:00:00 GMT</pubDate>
            <description><![CDATA[On 2012-07-25 I destroyed my notebook by mistake. The BIOS got fried during an update and the damage was not repairable. Development stopped for two weeks, because I had no machine that could compile and test my projects. I managed to back up all projects before the loss.]]></description>
            <content:encoded><![CDATA[<p>On 2012-07-25 I destroyed my notebook by mistake. The BIOS got fried during an update and the damage was not repairable. Development stopped for two weeks, because I had no machine that could compile and test my projects. I managed to back up all projects before the loss.</p>
<!-- -->
<p>On 2012-08-17 the replacement arrived, and development could go on. This was the hardware change:</p>
<table><thead><tr><th>Part</th><th>Old machine</th><th>New machine</th></tr></thead><tbody><tr><td>Laptop</td><td>Asus X53</td><td>Samsung, model unknown at that time</td></tr><tr><td>CPU</td><td>Intel Core i7 2nd gen at 2.2 GHz</td><td>Intel Core i7 3rd gen at 2.3 GHz</td></tr><tr><td>RAM</td><td>8 GB</td><td>8 GB</td></tr><tr><td>GPU</td><td>nVidia GT 540M, 2 GB</td><td>nVidia GT 650M, 2 GB</td></tr></tbody></table>
<p>The same problem appeared again in 2014, when the laptop GPU died and the Intel HD4000 left with OpenGL 3.3 only. See <a class="" href="https://blog.sigsegowl.xyz/2015/03/16/renderer-quark-desktop-open-gl">the Quark renderer post</a> for more info.</p>]]></content:encoded>
            <category>hardware</category>
            <category>archive</category>
        </item>
    </channel>
</rss>