<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://www.sixtensch.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.sixtensch.github.io/" rel="alternate" type="text/html" /><updated>2024-12-10T22:55:53+00:00</updated><id>https://www.sixtensch.github.io/feed.xml</id><title type="html">Developer Portfolio</title><subtitle>My software portfolio.
</subtitle><author><name>Sixten Schelin</name><email>sixtensch@gmail.com</email></author><entry><title type="html">Tinker Tails</title><link href="https://www.sixtensch.github.io/2024/12/10/tinker-tails.html" rel="alternate" type="text/html" title="Tinker Tails" /><published>2024-12-10T00:00:00+00:00</published><updated>2024-12-10T00:00:00+00:00</updated><id>https://www.sixtensch.github.io/2024/12/10/tinker-tails</id><content type="html" xml:base="https://www.sixtensch.github.io/2024/12/10/tinker-tails.html"><![CDATA[<p>A fast-paced multiplayer team action game about building airships! <strong>Whole program</strong> built from scratch in 14 weeks.</p>

<!--more-->

<p>Tinker Tails marks the apex of our university programme, second only to the research thesis itself. The game, along with the engine, has been built from scratch using agile/scrum methodology in a team of 12 developers. All engine development, networking, architecture, devops, resource management, gameplay scripting, and art/music was done in-house.</p>

<hr />

<!-- <div style="width: 80%; margin-left: auto; margin-right: auto;"><div class="extensions extensions--video">
  <iframe src="https://www.youtube.com/embed/jSfU6uw6qy8?rel=0&showinfo=0"
    frameborder="0" scrolling="no" allowfullscreen></iframe>
</div>
</div> -->

<p>The program is built in two main layers: a game engine programmed in C++, along with the game itself developed entirely in LUA. The engine works off of an entity-component system and powers a completely custom and extensive scripting interface for gameplay development.</p>

<p>One of my largest contributions was the <em>resource precompiler</em>, and <em>resource manager</em> system. The precompiler is an external utility for managing assets and compiling/preprocessing asset binaries from raw asset files. It operates a chain of loading and packing operations for each file, where the artist has the option to configure settings for each asset regarding compression and formatting. This system is fully multithreaded and works on many files at once. Metaresources referencing eachother and bunching assets into materials, or whatever else, are also a core feature. The asset binary is shipped with the game alongside a metadata file on how to read it. The resource <em>manager</em> system in the live applicaiton opens and tracks all resources, both synchronously and asynchronously during the course of the game.</p>

<p><img src="/assets/resource-precompiler.png" width="60%" style="display:flex; margin-left: auto; margin-right: auto; border-radius: 5%;" /></p>

<p>These are my other contributions to the project:</p>
<ul>
  <li>Cloud volumetrics.</li>
  <li>Debugging and logging systems.</li>
  <li>Argument handling.</li>
  <li>TOOL, the standard library. Read more about it <a href="https://sixtensch.github.io/2024/10/10/tool.html">here.</a></li>
  <li>TOON, another library for noise generation.</li>
  <li>Many gameplay systems.</li>
  <li>Devops and build automation. I set up submodules for asset handling and custom GitLab hosting on a teammate’s home server.</li>
  <li>Lots of work regarding engine architecture and system design.</li>
  <li>Responsible for game and gameplay systems architecture.</li>
  <li>Codebase maintenance and refactoring.</li>
  <li>Music and iconography.</li>
</ul>

<p><img class="image image--lg" src="/assets/tinker-tails-poster.jpg" style="display: flex; margin-left:auto; margin-right:auto;" /></p>]]></content><author><name>Sixten Schelin</name><email>sixtensch@gmail.com</email></author><category term="C++" /><category term="Game" /><category term="Engine" /><category term="Team" /><category term="TOOL" /><summary type="html"><![CDATA[A fast-paced multiplayer team action game about building airships! Whole program built from scratch in 14 weeks.]]></summary></entry><entry><title type="html">TOOL</title><link href="https://www.sixtensch.github.io/2024/10/10/tool.html" rel="alternate" type="text/html" title="TOOL" /><published>2024-10-10T00:00:00+00:00</published><updated>2024-10-10T00:00:00+00:00</updated><id>https://www.sixtensch.github.io/2024/10/10/tool</id><content type="html" xml:base="https://www.sixtensch.github.io/2024/10/10/tool.html"><![CDATA[<p>A kitchen sink function-oriented <b>standard library</b> to simplify development and cut compile times in C++ game software.</p>

<!--more-->

<p>Made for projects that distance themselves from the monolithic language standard libraries, the library is built for simplicity and real usability in game software. TOOL is the newer standard library of mine, more or less replacing the object-oriented CHSL. In recognizing that good low-level software strives to be simple to maintain both performance and modifiability, TOOL aims to break down the most common and useful software tools into digestible functional interfaces.</p>

<div style="display: flex; align-items: center; margin-right: 10px;">
<img src="/assets/github-mark.svg" style="height: 30px; margin-right: 10px;" />
<a class="button button--secondary button--rounded button--lg" href="https://github.com/crazysissen/TOOL" style="margin-right: 10px;">
TOOL on GitHub
</a>
</div>

<hr />

<p>The <em>Tired-Of-Objects Library</em>, or <em>TOOL</em>, is a constantly evolving multi-platform function-oriented standard library built for performance, simplicity, and flexibility. The library was born out of dissatisfaction with much of modern object-oriented design, along with the massive C++ standard libraries that follow. While these massive and feature-rich libraries naturally serve an important purpose, having a simpler, more direct alternative for all of the most common functionality serves to streamline and speed up development. From these feelings spring a desire for something better, and more suited to my needs and the needs of my peers.</p>

<p>Headers are intentionally built <strong>short</strong>, <strong>simple</strong>, and <strong>straight-forward</strong>. This works in a low-level software developer’s favor for a number of reasons.</p>

<ul>
  <li>It cuts down the horrendous compile times often experienced with the humongous templated C++ standard library includes to near-zero. Wanting a translation unit to act on a string of text should not require an extra second on every compile.</li>
  <li>It simplifies error logging, as functionality is more specific and less templated. The smallest perceivable error in a call to <code class="language-plaintext highlighter-rouge">std::format</code> or <code class="language-plaintext highlighter-rouge">std::regex_search</code> can produce a short novel for you to read through, a waste of time if there ever was one.</li>
  <li>It self-documents the functionality through a legible and digestible interface. Following a <code class="language-plaintext highlighter-rouge">#include &lt;string&gt;</code> link to the source file seldom provides enlightenment on anything. Well-designed code can benefit from, but should not <em>require</em>, extensive commenting or documentation to be comprehensible.</li>
  <li>It breaks down the humongous array of esoteric utilities made available through large modern standard libraries into the most core constituent parts. Performance-oriented programmers often strive to optimize their software and understand its workings, not pray to higher powers that the standard library becomes the bottleneck.</li>
</ul>]]></content><author><name>Sixten Schelin</name><email>sixtensch@gmail.com</email></author><category term="C++" /><category term="Library" /><category term="TOOL" /><summary type="html"><![CDATA[A kitchen sink function-oriented standard library to simplify development and cut compile times in C++ game software.]]></summary></entry><entry><title type="html">Captain Catnip</title><link href="https://www.sixtensch.github.io/2024/04/19/captain-catnip.html" rel="alternate" type="text/html" title="Captain Catnip" /><published>2024-04-19T00:00:00+00:00</published><updated>2024-04-19T00:00:00+00:00</updated><id>https://www.sixtensch.github.io/2024/04/19/captain-catnip</id><content type="html" xml:base="https://www.sixtensch.github.io/2024/04/19/captain-catnip.html"><![CDATA[<p>An infinite game about navigating treacherous water, collecting as much gold as possible, and escaping from the maritime Dog Empire.</p>

<!--more-->

<p><em>Captain Catnip</em> is our submission to ScoreSpace Jam 29, ranking 14th overall out of 139 entries. It is the second game jam entry made by me and a friend of mine under the KONGSTRONK name. As with the previous game, our reason for participating is three-fold: grow as game developers, finish more games, and have fun.</p>

<p>If you’re on desktop, you can try out the game right in your web browser by following the link!</p>

<iframe frameborder="0" src="https://itch.io/embed/2661979" width="100%" height="167"><a href="https://kongstronk.itch.io/captain-catnip">Captain Catnip by KONGSTRONK</a></iframe>

<hr />

<p>Captain Catnip was made in 72 hours from scratch in Unity. For this game I acted as the main programmer, and we incorporated a number of interesting features to distinguish it from the rest. Besides being one of the few 3D games, we added fun realistically based fluid dynamics for controlling the ship through the water.</p>

<p>Besides procedurally generating the obstacles and pickups in the environment, the geometry for the water and game world itself is generated programmatically as the game runs, continuously building a cylindrical “barrel world” for the ship to move over. This skips any illusions and instead physically represents the horizon and objects appearing over it in the world itself. Through our custom water shading and other tricks, it looks seemless!</p>

<p><img src="/assets/captain-catnip-example-1.jpg" width="80%" style="display:flex; margin-left: auto; margin-right: auto; border-radius: 5%;" /></p>

<p><img src="/assets/captain-catnip-example-2.jpg" width="80%" style="display:flex; margin-left: auto; margin-right: auto; border-radius: 5%;" /></p>]]></content><author><name>Sixten Schelin</name><email>sixtensch@gmail.com</email></author><category term="C#" /><category term="Unity" /><category term="Game" /><category term="Jam" /><category term="Duo" /><summary type="html"><![CDATA[An infinite game about navigating treacherous water, collecting as much gold as possible, and escaping from the maritime Dog Empire.]]></summary></entry><entry><title type="html">FastNeurons</title><link href="https://www.sixtensch.github.io/2024/03/22/fast-neurons.html" rel="alternate" type="text/html" title="FastNeurons" /><published>2024-03-22T00:00:00+00:00</published><updated>2024-03-22T00:00:00+00:00</updated><id>https://www.sixtensch.github.io/2024/03/22/fast-neurons</id><content type="html" xml:base="https://www.sixtensch.github.io/2024/03/22/fast-neurons.html"><![CDATA[<p>A blazing fast CUDA-parallelized library for neural networks and machine learning. Highly optimized while maintaining a flexible API.</p>

<!--more-->

<p>The <em>FastNeurons</em> neural network library is centered around training performance above all else. When comparing with a popular sequential LeNet5 C implementation, training and testing over the MNIST handwritten digit datagbase, FastNeurons manages a speedup of more than <strong>100x</strong>.</p>

<div style="display: flex; align-items: center; margin-right: 10px;">
<img src="/assets/github-mark.svg" style="height: 30px; margin-right: 10px;" />
<a class="button button--secondary button--rounded button--lg" href="https://github.com/sixtensch/FastNeurons" style="margin-right: 10px;">
FastNeurons on GitHub
</a>
</div>

<hr />

<p>Below you’ll find a comparison of two LeNet5-esque neural network training sequences (using MNIST), showing first FastNeurons, then an equivalent sequential CPU implementation available <a href="https://github.com/fan-wenjie/LeNet-5">here</a>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Parallel version:

Train average 1:	3.751 seconds
Train average 2:	4.073 seconds
Train average 3:	3.732 seconds
Train average 4:	3.688 seconds

Test time 1:		1.062 seconds
Test time 2:		1.121 seconds
Test time 3:		0.915 seconds
Test time 4:		0.945 seconds

               Predicted label
               0     1     2     3     4     5     6     7     8     9     Total
----------------------------------------------------------------------
True label
         0   970     0     2     0     0     0     4     1     3     0       980
         1     0  1125     0     4     0     0     3     0     3     0      1135
         2    11     7   969     9     5     1     5    10    15     0      1032
         3     2     0     4   970     1    13     0    11     6     3      1010
         4     0     0     1     1   958     0     8     0     2    12       982
         5     6     1     0     9     1   862     2     1     6     4       892
         6     9     3     0     1     4     5   931     0     5     0       958
         7     2    12    17     4     0     1     0   950     2    40      1028
         8    10     4     1     7    10     3     2     7   915    15       974
         9    10     6     0     5    17     7     0     4     7   953      1009
----------------------------------------------------------------------
                                Total number of input images tested =      10000
----------------------------------------------------------------------

Correct guesses: 9603 / 10000 (96.0300%)
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Sequential version:

Total 1:	424 seconds
Total 2:	420.54 seconds

               Predicted label
               0     1     2     3     4     5     6     7     8     9     Total
----------------------------------------------------------------------
True label
         0   971     0     1     0     0     1     3     1     3     0       980
         1     0  1122     1     3     1     0     1     0     7     0      1135
         2    10     2   989     2     5     0     5     9    10     0      1032
         3     1     3    12   949     0    21     0    11    12     1      1010
         4     1     2     1     0   961     0     6     1     2     8       982
         5     4     3     0     2     0   872     3     1     5     2       892
         6    10     4     2     1     4     3   930     0     4     0       958
         7     1    11    22     1     3     0     0   978     2    10      1028
         8     7     4     2     3     7     4     1     4   938     4       974
         9     9     8     0     3    27     9     1     7    10   935      1009
----------------------------------------------------------------------
                                Total number of input images tested =      10000
----------------------------------------------------------------------
Testing: Correct predictions = 9645 (96.45%)
</code></pre></div></div>

<p>When training over multiple epochs, this classic convolutional neural network design can achieve accuracy of over 99%! While this is one possible network using the library, a developer could build any other design incorporating fully connected, pooling, and convolutional layers. Below you’ll find a code snippet showing how LeNet5 is implemented using FastNeurons.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">NetworkCreateLeNet5</span><span class="p">(</span><span class="n">Network</span><span class="o">*</span> <span class="n">network</span><span class="p">)</span>
<span class="p">{</span>
	<span class="k">const</span> <span class="kt">int</span> <span class="n">kernelWidth</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span>
    
	<span class="n">NetworkCreate</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
    
	<span class="c1">// Add the layers</span>
	<span class="n">NetworkAddLayerInput2D</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span>
	<span class="n">NetworkAddLayerConvolution2D</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="n">kernelWidth</span><span class="p">,</span> <span class="n">ActivationTypeReLU</span><span class="p">);</span>
	<span class="n">NetworkAddLayerPooling2D</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">PoolingTypeMax</span><span class="p">);</span>
	<span class="n">NetworkAddLayerConvolution2D</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="n">kernelWidth</span><span class="p">,</span> <span class="n">ActivationTypeReLU</span><span class="p">);</span>
	<span class="n">NetworkAddLayerPooling2D</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">PoolingTypeMax</span><span class="p">);</span>
	<span class="n">NetworkAddLayerFullyConnected</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="n">ActivationTypeReLU</span><span class="p">);</span>
	<span class="n">NetworkAddLayerFullyConnected</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="mi">84</span><span class="p">,</span> <span class="n">ActivationTypeReLU</span><span class="p">);</span>
	<span class="n">NetworkAddLayerFullyConnected</span><span class="p">(</span><span class="n">network</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">ActivationTypeReLU</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>Sixten Schelin</name><email>sixtensch@gmail.com</email></author><category term="C++" /><category term="CUDA" /><category term="Library" /><summary type="html"><![CDATA[A blazing fast CUDA-parallelized library for neural networks and machine learning. Highly optimized while maintaining a flexible API.]]></summary></entry><entry><title type="html">Push Hour</title><link href="https://www.sixtensch.github.io/2024/03/04/push-hour.html" rel="alternate" type="text/html" title="Push Hour" /><published>2024-03-04T00:00:00+00:00</published><updated>2024-03-04T00:00:00+00:00</updated><id>https://www.sixtensch.github.io/2024/03/04/push-hour</id><content type="html" xml:base="https://www.sixtensch.github.io/2024/03/04/push-hour.html"><![CDATA[<p>A fun speedrunning game about shoving commuters onto the subway.</p>

<!--more-->

<p><em>Push Hour</em> is our <strong>prize-winning</strong> submission to SpeedJam 4. For the game, we won the <em>streamer’s choice award</em>, becoming one of three winning games for the first section of the 72-hour game jam!</p>

<p>The first game made as part of the the KONGSTRONK project: a game development duo made up of myself and a close friend of mine. The goal of these jams has always been a three-way split: grow as game developers, finish more games, and have fun. While I’ve been making games for many years, putting the pressure on each other really helps bring out my enthusiasm for game development.</p>

<p>If you’re on desktop, you can try out the game right in your web browser by following the link below!</p>

<iframe frameborder="0" src="https://itch.io/embed/2565645" width="100%" height="167"><a href="https://kongstronk.itch.io/push-hour">Push Hour by KONGSTRONK</a></iframe>

<hr />

<p>Push Hour was developed from scratch in 72 hours using the Unity game engine. We both have lots of prior experience using Unity, and for this game I acted as lead programmer. Trying out new techniques and features to distinguish the game, we decided to build a core part of the game on <em>simulated crowd dynamics</em>. Commuters are individual agents and all move with respect to each other. The entire game exists within a one-scene environment, with individual games stopping and starting smoothly without transitions and loading screens: the player gets thrown right into the action.</p>

<p><img src="/assets/push-hour-example-1.png" width="80%" style="display:flex; margin-left: auto; margin-right: auto; border-radius: 5%;" /></p>

<p><img src="/assets/push-hour-example-2.png" width="80%" style="display:flex; margin-left: auto; margin-right: auto; border-radius: 5%;" /></p>]]></content><author><name>Sixten Schelin</name><email>sixtensch@gmail.com</email></author><category term="C#" /><category term="Unity" /><category term="Game" /><category term="Jam" /><category term="Duo" /><summary type="html"><![CDATA[A fun speedrunning game about shoving commuters onto the subway.]]></summary></entry><entry><title type="html">Whisperwoods</title><link href="https://www.sixtensch.github.io/2023/03/16/whisperwoods.html" rel="alternate" type="text/html" title="Whisperwoods" /><published>2023-03-16T00:00:00+00:00</published><updated>2023-03-16T00:00:00+00:00</updated><id>https://www.sixtensch.github.io/2023/03/16/whisperwoods</id><content type="html" xml:base="https://www.sixtensch.github.io/2023/03/16/whisperwoods.html"><![CDATA[<p>A <strong>video game</strong> and <strong>engine</strong> built from scratch in six weeks as a university group project</p>

<!--more-->

<p>Representing the culmination of our first three years in university, Whisperwoods shows off many facets of video game tech, rendering, creative optimization, and software engineering. Developed with little integration of external software libraries, the game features a renderer built from scratch using DirectX 11, custom resource asset formats, procedural world generation, and fast-paced strategic stealth gameplay, all optimized to run smoothly on very rudimentary hardware.</p>

<div style="display: flex; align-items: center; margin-right: 10px;">
<img src="/assets/github-mark.svg" style="height: 30px; margin-right: 10px;" />
<a class="button button--secondary button--rounded button--lg" href="https://github.com/sixtensch/Whisperwoods" style="margin-right: 10px;">
Whisperwoodson GitHub
</a>
</div>

<hr />

<div style="width: 80%; margin-left: auto; margin-right: auto;"><div class="extensions extensions--video">
  <iframe src="https://www.youtube.com/embed/jSfU6uw6qy8?rel=0&amp;showinfo=0" frameborder="0" scrolling="no" allowfullscreen=""></iframe>
</div>
</div>

<p>The team, consisting of six developers specialized and interested in different things, synergized to build a fairly well-rounded game engine. The software features and gameplay overview are demonstrated in an early build trailer available on YouTube.</p>

<p>Of course, I was not the totality of the development group. These are my contributions:</p>
<ul>
  <li>Initial rendering and lighting</li>
  <li>Render pass optimizations and mass instancing</li>
  <li>Program infrastructure and core system design</li>
  <li>Codebase maintenance and refactoring</li>
  <li>Procedural world generation</li>
  <li>Contributions to core software architecture</li>
  <li>Build system configuration and build automation</li>
  <li>Music and iconography</li>
</ul>

<p><img class="image image--lg" src="/assets/whisperwoods-poster.png" style="display: flex; margin-left:auto; margin-right:auto;" /></p>]]></content><author><name>Sixten Schelin</name><email>sixtensch@gmail.com</email></author><category term="C++" /><category term="Game" /><category term="Engine" /><category term="Team" /><category term="CHSL" /><summary type="html"><![CDATA[A video game and engine built from scratch in six weeks as a university group project]]></summary></entry><entry><title type="html">CHSL</title><link href="https://www.sixtensch.github.io/2023/03/15/chsl.html" rel="alternate" type="text/html" title="CHSL" /><published>2023-03-15T00:00:00+00:00</published><updated>2023-03-15T00:00:00+00:00</updated><id>https://www.sixtensch.github.io/2023/03/15/chsl</id><content type="html" xml:base="https://www.sixtensch.github.io/2023/03/15/chsl.html"><![CDATA[<p>An object-oriented <b>standard library</b> consisting of utility classes for various purposes, used by many projects of mine.</p>

<!--more-->

<p>CHSL is a more fully featured <em>object-oriented</em> counterpart to TOOL, my newer library.</p>

<div style="display: flex; align-items: center; margin-right: 10px;">
<img src="/assets/github-mark.svg" style="height: 30px; margin-right: 10px;" />
<a class="button button--secondary button--rounded button--lg" href="https://github.com/crazysissen/CHSL" style="margin-right: 10px;">
CHSL on GitHub
</a>
</div>

<hr />

<p>The <em>Crazy High Standards Library</em>, or <em>CHSL</em>, is an older but more feature rich standard library adhering to object-oriented principles. It has been used in a number of my other projects since, and has grown over time to include many features.</p>]]></content><author><name>Sixten Schelin</name><email>sixtensch@gmail.com</email></author><category term="C++" /><category term="Library" /><category term="CHSL" /><summary type="html"><![CDATA[An object-oriented standard library consisting of utility classes for various purposes, used by many projects of mine.]]></summary></entry></feed>