updated sara.objectionable.solutions content
This commit is contained in:
parent
e53fa6a6e5
commit
9f0bc9d2c7
24 changed files with 267 additions and 54 deletions
BIN
sites/sara.objectionable.solutions/assets/boids.mkv
Normal file
BIN
sites/sara.objectionable.solutions/assets/boids.mkv
Normal file
Binary file not shown.
Binary file not shown.
BIN
sites/sara.objectionable.solutions/assets/fencer-collisions.png
Normal file
BIN
sites/sara.objectionable.solutions/assets/fencer-collisions.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 139 KiB |
BIN
sites/sara.objectionable.solutions/assets/fencer.png
Normal file
BIN
sites/sara.objectionable.solutions/assets/fencer.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 402 KiB |
BIN
sites/sara.objectionable.solutions/assets/practice-shooter.mkv
Normal file
BIN
sites/sara.objectionable.solutions/assets/practice-shooter.mkv
Normal file
Binary file not shown.
BIN
sites/sara.objectionable.solutions/assets/spirit-signal.mkv
Normal file
BIN
sites/sara.objectionable.solutions/assets/spirit-signal.mkv
Normal file
Binary file not shown.
BIN
sites/sara.objectionable.solutions/assets/terrain-editor.mp4
Normal file
BIN
sites/sara.objectionable.solutions/assets/terrain-editor.mp4
Normal file
Binary file not shown.
BIN
sites/sara.objectionable.solutions/assets/terrain-editor.png
Normal file
BIN
sites/sara.objectionable.solutions/assets/terrain-editor.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.9 MiB |
|
|
@ -32,12 +32,15 @@
|
|||
<div class="personal-info-grid" indented>
|
||||
<div>
|
||||
<p>
|
||||
My tool of choice is Godot engine modules, but I'm adept with a variety of libraries, engines, and frameworks.
|
||||
Most of my experience is C++, both using STL and with engines like Unreal and Godot.
|
||||
I get the most enjoyment out of writing player-facing gameplay systems and designer-facing tools and interfaces.
|
||||
Which is to say, I like writing code that people get to interact with directly.
|
||||
My tool of choice is Godot engine modules, but I'm adept with a variety of libraries, engines, and frameworks.
|
||||
Most of my experience is C++, both using STL and with engines like Unreal and Godot.
|
||||
</p>
|
||||
</p>
|
||||
I get the most enjoyment out of writing player-facing gameplay systems and designer-facing tools and interfaces.
|
||||
Which is to say, I like writing code that people get to interact with directly.
|
||||
</p>
|
||||
<p style="color: #FFF4">you can email me at sara on this domain (objectionable dot solutions or saragerretsen dot nl)</p>
|
||||
<p><b>Contact:</b>you can email me at sara on this domain (objectionable dot solutions or saragerretsen dot nl)</p>
|
||||
<p style="color: #FFF4"><b>Disclaimer:</b> This website, the text, and all of my code are written by me, personally; I have not used LLMs or "AI" at any point.</p>
|
||||
</div>
|
||||
<div class="personal-info-photo"></div>
|
||||
</div>
|
||||
|
|
@ -61,7 +64,18 @@
|
|||
</div>
|
||||
<h3>Student @ HKU</h3>
|
||||
<div indented>
|
||||
<div class="project-grid">
|
||||
<div class="project-grid">
|
||||
<a class="internal" href="projects/terrain-editor.html">
|
||||
<div class="project-card" terrain-editor></div>
|
||||
<div class="project-labels">
|
||||
<p>godot</p>
|
||||
<p>c++ module</p>
|
||||
<p>solo</p>
|
||||
<p>tool</p>
|
||||
</div>
|
||||
<h2 class="project-title">Terrain Editor</h2>
|
||||
<p class="project-card-role">C++ Tool Programmer</p>
|
||||
</a>
|
||||
<a class="internal" href="projects/you-done-it.html">
|
||||
<div class="project-card" you-done-it></div>
|
||||
<div class="project-labels">
|
||||
|
|
@ -96,6 +110,30 @@
|
|||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<h3>Chief Experimentor @ Home</h3>
|
||||
<div indented>
|
||||
<div class="project-grid">
|
||||
<a class="internal" href="projects/fencer-collision.html">
|
||||
<div class="project-card" fencer-collision></div>
|
||||
<div class="project-labels">
|
||||
<p>sdl2</p>
|
||||
<p>from scratch</p>
|
||||
<p>solo</p>
|
||||
</div>
|
||||
<h2 class="project-title">Fencer Collision</h2>
|
||||
<p class="project-card-role">C Engine Programmer</p>
|
||||
</a>
|
||||
<a class="internal" href="projects/practice-shooter.html">
|
||||
<div class="project-card" practice-shooter></div>
|
||||
<div class="project-labels">
|
||||
<p>unity</p>
|
||||
<p>solo</p>
|
||||
</div>
|
||||
<h2 class="project-title">Practice Shooter</h2>
|
||||
<p class="project-card-role">Solo Developer</p>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<h3>Student @ GLU</h3>
|
||||
<div indented>
|
||||
<div class="project-grid">
|
||||
|
|
@ -129,31 +167,7 @@
|
|||
<h2 class="project-title">Boids</h2>
|
||||
<p class="project-card-role">C Programmer</p>
|
||||
</a>
|
||||
<a class="internal" href="projects/hlo-projectvtd.html">
|
||||
<div class="project-card" tower-vr></div>
|
||||
<div class="project-labels">
|
||||
<p>unreal engine</p>
|
||||
<p>team</p>
|
||||
<p>hlo</p>
|
||||
</div>
|
||||
<h2 class="project-title">Tower VR</h2>
|
||||
<p class="project-card-role">C++ Programmer</p>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<h3>Chief Experimentor @ Home</h3>
|
||||
<div indented>
|
||||
<div class="project-grid">
|
||||
<a class="internal" href="projects/gml-tile-movement.html">
|
||||
<div class="project-card" gml-tile-movement></div>
|
||||
<div class="project-labels">
|
||||
<p>game maker 2</p>
|
||||
<p>solo</p>
|
||||
</div>
|
||||
<h2 class="project-title">Tile Movement System</h2>
|
||||
<p class="project-card-role">GML Programmer</p>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section>
|
||||
|
|
|
|||
|
|
@ -19,8 +19,7 @@
|
|||
</div>
|
||||
<iframe frameborder="0" src="https://itch.io/embed/3964851?bg_color=222222&fg_color=eeeeee&border_color=363636" width="552" height="167"><a href="https://sg-dev.itch.io/agoraphobia">Agoraphobia by Sara</a></iframe>
|
||||
<a class="git-block" href="https://git.objectionable.solutions/Sara/trenches/src/branch/main/src" target="_blank">
|
||||
<div class="git-logo"></div>
|
||||
<h2>Sara/trenches.git</h2>
|
||||
<div class="git-logo"></div><h2>Sara/trenches.git</h2>
|
||||
</a>
|
||||
<h2>Product Overview</h2>
|
||||
<p>
|
||||
|
|
|
|||
|
|
@ -23,10 +23,9 @@
|
|||
</div>
|
||||
|
||||
<h2 id="video-v2">Video</h2>
|
||||
<iframe
|
||||
src="https://www.youtube.com/embed/unTQRpplFGU?mute=1&loop=1&autoplay=1"
|
||||
class="embed" youtube
|
||||
></iframe>
|
||||
<video height="500" style="max-width:100%" muted autoplay controls>
|
||||
<source src="../assets/boids.mkv">
|
||||
</video>
|
||||
<h2 id="product-overview-v2">Product Overview</h2>
|
||||
<p indented>
|
||||
My second implementation of a <a href="https://en.wikipedia.org/wiki/Boids">boids simulation</a>. This time written in C using a combination of SDL2 for rendering and a self-made ecs library for object management.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,79 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Fencer Collision - Sara Gerretsen</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<script type="text/javascript" src="../shared/jquery.min.js"></script>
|
||||
<link rel="stylesheet" href="../shared/style.css">
|
||||
|
||||
<div id="site-header">
|
||||
<script>$(function(){$("#site-header").load("../shared/header.html");});</script>
|
||||
</div>
|
||||
</head>
|
||||
<body>
|
||||
<img src="../assets/fencer.png" style="width:100%">
|
||||
<h1>Fencer Collision</h1>
|
||||
<section class="project">
|
||||
<h2>Info</h2>
|
||||
<div indented>
|
||||
<p>Project Type: SDL2 Toy Engine</p>
|
||||
<p>Project Timeframe: November 2023</p>
|
||||
</div>
|
||||
<a class="git-block" href="https://git.objectionable.solutions/Sara/fencer" target="_blank">
|
||||
<div class="git-logo"></div><h2>Sara/fencer.git</h2>
|
||||
</a>
|
||||
<h2>Project Summary</h2>
|
||||
<p>
|
||||
The goal of the project was to build, from theory and whitepapers, a simple 2d physics engine that can be used to make games. Mainly as a practice project to teach myself the basics of how physics engines work.
|
||||
</p>
|
||||
<h2>Snippets</h2>
|
||||
<p>
|
||||
(Linked text directs to the relevant spot in
|
||||
<a href="https://git.objectionable.solutions/Sara/fencer/src/branch/main/src">the code repository</a>)
|
||||
</p>
|
||||
<p>
|
||||
The start of the project was building a 2-body arbitrary shape collision solver. For this I used the
|
||||
<a href="https://git.objectionable.solutions/Sara/fencer/src/commit/c3f059eeb78db6a4b60ccdbf5928ad32d3ce55b9/src/collision.c">Separating Axis Theorem</a>,
|
||||
as it is relatively simple to implement.
|
||||
</p>
|
||||
<p>
|
||||
With a working 2-body solver in hand, the next step was to implement an iterative multi-body solver. But this requires a lot more than a toy SAT implementation. So first I went and figured out world and object representations.
|
||||
</p>
|
||||
<h3>World Representation</h3>
|
||||
<p>
|
||||
Although I really like using C for quick toy examples, I had now reached the point at which I usually switch to C++, and in hindsight that would've probably been the better option. However, my recent explorations of Rust meant that I had learned of the joy of "Trait"-style polymorphism (most comparable to C++ interfaces). So I wanted to try using those in C. For this I found an approach to implementing typeclasses in C (the article for which isn't online anymore, but I explained my version over on
|
||||
<a href="https://blog.winter-software.com/2024/02/22/typeclasses-in-c"> my blog</a>).
|
||||
</p>
|
||||
<p>
|
||||
The requirements for any game object to be part of the physics world is that it has to at least implement
|
||||
<a href="https://git.objectionable.solutions/Sara/fencer/src/commit/c3f059eeb78db6a4b60ccdbf5928ad32d3ce55b9/src/physics_entity.h"><code>PhysicsEntity</code></a>,
|
||||
which in turn requires
|
||||
<a href="https://git.objectionable.solutions/Sara/fencer/src/commit/c3f059eeb78db6a4b60ccdbf5928ad32d3ce55b9/src/transformable.h"><code>Transformable</code></a>
|
||||
to be implemented. As solving collisions requires modifying the transform of the object.
|
||||
In order to be rendered, and for the update function to be called, the object also has to implement
|
||||
<a href="https://git.objectionable.solutions/Sara/fencer/src/branch/main/src/behaviour_entity.h"><code>BehaviourEntity</code></a>,
|
||||
which exposes the object lifetime functions spawn, update, start, and draw. And itself requires
|
||||
<a href="https://git.objectionable.solutions/Sara/fencer/src/branch/main/src/drop.h"><code>Drop</code></a>
|
||||
to be implemented. <code>Drop</code> being pretty much the best destructor implementation you can get in C without implementing a garbage collector.
|
||||
</p>
|
||||
<p>
|
||||
With the world represented, the work on the collision solver could start. Objects that implement <code>PhysicsEntity</code> can then register themselves with the
|
||||
<a href="https://git.objectionable.solutions/Sara/fencer/src/branch/main/src/physics_world.h">physics world</a>.
|
||||
Once an object is registered to the physics world it will use the SAT to check for collisions, and finally, that comes to the multi-body iterative collision solver.
|
||||
</p>
|
||||
<img src="../assets/fencer-collisions.png" style="width:50%">
|
||||
<p>
|
||||
<a href="https://git.objectionable.solutions/Sara/fencer/src/commit/c3f059eeb78db6a4b60ccdbf5928ad32d3ce55b9/src/physics_entity.c#L50">The iterative solver</a>
|
||||
is implemented in the static functions of the <code>PhysicsEntity</code> typeclass.
|
||||
</p>
|
||||
<p>
|
||||
This all then comes together in something like the
|
||||
<a href="https://git.objectionable.solutions/Sara/fencer/src/branch/archive/platformer-prototype/src/player.h"><code>Player</code></a>
|
||||
struct, which implements all these typeclasses and uses them to create a platformer character. Or the
|
||||
<a href="https://git.objectionable.solutions/Sara/fencer/src/branch/archive/platformer-prototype/src/tilemap.c"><code>Tilemap</code></a>
|
||||
object that can be loaded from <a href="https://ldtk.io/" target="_blank">LDTK</a> levels to create a renderable physics entity that can be hit and interacted with by the player.
|
||||
</p>
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -19,8 +19,7 @@
|
|||
</div>
|
||||
<iframe frameborder="0" src="https://itch.io/embed/3650021?bg_color=222222&fg_color=eeeeee&border_color=363636" width="552" height="167"><a href="https://sg-dev.itch.io/keep-going">(Keep) Going by Sara</a></iframe>
|
||||
<a class="git-block" href="https://git.objectionable.solutions/Sara/going/src/branch/development/modules/going" target="_blank">
|
||||
<div class="git-logo"></div>
|
||||
<h2>Sara/keep-going</h2>
|
||||
<div class="git-logo"></div><h2>Sara/keep-going</h2>
|
||||
</a>
|
||||
<h2>Product Overview</h2>
|
||||
<p>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<script type="text/javascript" src="../shared/jquery.min.js"></script>
|
||||
<link rel="stylesheet" href="../shared/style.css">
|
||||
|
||||
<div id="site-header">
|
||||
<script>$(function(){$("#site-header").load("../shared/header.html");});</script>
|
||||
</div>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Practice Shooter</h1>
|
||||
<video height="500" style="max-width:100%" style="max-width:100%" muted autoplay controls>
|
||||
<source src="../assets/practice-shooter.mkv">
|
||||
</video>
|
||||
<section class="project">
|
||||
<h2>Info</h2>
|
||||
<div indented>
|
||||
<p>Project Type: Unity Toy Project</p>
|
||||
<p>Project Timeframe: 2023</p>
|
||||
</div>
|
||||
<h2>Project Summary</h2>
|
||||
<p indented>
|
||||
A simple practice project, primarily focused on aesthetics and game feel. The goal was to experiment with animation and VFX to create satisfying combat encounters.
|
||||
</p>
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -21,13 +21,12 @@
|
|||
</div>
|
||||
|
||||
<h2>Video</h2>
|
||||
<iframe
|
||||
src="https://youtube.com/embed/7Zueiw9SIrI?mute=1&autoplay=1&loop=1"
|
||||
class="embed" youtube
|
||||
></iframe>
|
||||
<video height="500" style="max-width:100%" muted autoplay controls>
|
||||
<source src="../assets/spirit-signal.mkv">
|
||||
</video>
|
||||
<iframe
|
||||
src="https://itch.io/embed/1415379"
|
||||
class="embed" itch
|
||||
class="embed" itch
|
||||
frameborder="0">
|
||||
<a href="https://sg-dev.itch.io/spirit-signal-iegj2022">
|
||||
Spirit Signal by sg_dev, Saltoc, villewilly, jrosenbe, hallo_schoonheid
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
<h2>Info</h2>
|
||||
<div indented>
|
||||
<p>Project Type: Unreal Engine Management Game</p>
|
||||
<p>Project Timeframe: Internship during 2022 Jan-Jul</p>
|
||||
<p>Project Timeframe: Internship during 2023 Jan-Jul</p>
|
||||
</div>
|
||||
<p>
|
||||
A fun, relaxing but still challenging, resource management puzzle game by Galaxy Grove. That I had the chance to work on for an internship of six months.
|
||||
|
|
@ -35,4 +35,4 @@
|
|||
</iframe>
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -22,10 +22,9 @@
|
|||
</div>
|
||||
|
||||
<h2>Video</h2>
|
||||
<iframe
|
||||
src="https://www.youtube.com/embed/0gehGW9LS58?mute=1&autoplay=1"
|
||||
class="embed" youtube
|
||||
></iframe>
|
||||
<video height="500" style="max-width:100%" muted autoplay controls>
|
||||
<source src="../assets/bottom-gear-stig-kart.mp4">
|
||||
</video>
|
||||
<iframe
|
||||
src="https://itch.io/embed/1372223"
|
||||
width="552" height="167"
|
||||
|
|
|
|||
34
sites/sara.objectionable.solutions/projects/template.html
Normal file
34
sites/sara.objectionable.solutions/projects/template.html
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<script type="text/javascript" src="../shared/jquery.min.js"></script>
|
||||
<link rel="stylesheet" href="../shared/style.css">
|
||||
|
||||
<div id="site-header">
|
||||
<script>$(function(){$("#site-header").load("../shared/header.html");});</script>
|
||||
</div>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Project Name</h1>
|
||||
<section class="project">
|
||||
<h2>Info</h2>
|
||||
<div indented>
|
||||
<p>Project Type: Engine, Genre, Application</p>
|
||||
<p>Project Timeframe: Length, Year</p>
|
||||
</div>
|
||||
<h2>Product Overview</h2>
|
||||
<p indented>
|
||||
Description of the game.
|
||||
</p>
|
||||
|
||||
<h2>Project Overview</h2>
|
||||
<p indented>
|
||||
Description of role in development.
|
||||
</p>
|
||||
<h2>Postmortem</h2>
|
||||
<p>Thoughts on the development process and what I learned from it.</p>
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Terrain Editor - Sara Gerretsen</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<script type="text/javascript" src="../shared/jquery.min.js"></script>
|
||||
<link rel="stylesheet" href="../shared/style.css">
|
||||
|
||||
<div id="site-header">
|
||||
<script>$(function(){$("#site-header").load("../shared/header.html");});</script>
|
||||
</div>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Terrain Editor</h1>
|
||||
<section class="project">
|
||||
<h2>Info</h2>
|
||||
<div indented>
|
||||
<p>Project Type: Godot Application</p>
|
||||
<p>Project Timeframe: 2 Months, 2025</p>
|
||||
</div>
|
||||
<video height="500" style="max-width:100%" style="max-width:100%" muted autoplay controls>
|
||||
<source src="../assets/terrain-editor.mp4">
|
||||
</video>
|
||||
<a class="git-block" href="https://git.objectionable.solutions/Sara/terrain-editor" target="_blank">
|
||||
<div class="git-logo"></div><h2>Sara/terrain-editor</h2>
|
||||
</a>
|
||||
<h2>Product Overview</h2>
|
||||
<p indented>
|
||||
A prototype for a node-based terrain editor. In my time working with game editors, I've grown to rather dislike the standard bitmap-based terrain sculpting tools. In my experience working with them to any level of detail rapidly becomes an exercise in enduring frustration. So the goal for this tool was to explore a more modular approach to terrain editing. Something that could give the user more control to create more interesting terrains, faster. To do this, I took inspiration from vector graphics, as well as CSG (Constructive Solid Geometry) modeling. Which both have one thing in common: they are "non-destructive".
|
||||
</p>
|
||||
<h2>Postmortem</h2>
|
||||
<p>The initial prototyping phase went really smoothly. Generating basic terrain meshes is easy enough that the first working version was down in a week or so. From there came the challenges.</p>
|
||||
<p>In testing this with the target user group, I got some common feedback: "This should be built into the editor, having it separate makes it difficult to work with" and "I'd like to be able to see real time what's being changed."</p>
|
||||
<p>The first one was off the table (for now) due to assignment requirements (a standalone executable). But the latter was mainly a matter of optimisation. At this point the process of generating terrains was entirely synchronous. Making it really <i>really</i> slow. Which was fine since I was only updating the actual terrain whenever the users stops moving things. But that stretches the iteration loop in a way that designers would rather not deal with (constantly trial-and-erroring placements of mountains can be a bit tedious). So I would have to optimise the terrain generation.</p>
|
||||
<p>I'd intentionally designed the data and ownership rules to enable thread-safety, but not worked out an exact parallelisation strategy. As I was trying to get a working version first. So from this point on most of my time was split between implementing the UI controls, and optimising as much as I could. First optimisation was, as mentioned, basic multi-threading.</p>
|
||||
<p>There's also more subtle option. The users did not need to see a full-detail version of the terrain, just a quick preview of what changed. So I added LOD generation, and started generating LOD models separately from each-other. Combining this with a biased task scheduler, which would prioritise faster, high LOD levels first, meant that I could freely issue rebuilds every frame. Which would process the lower detail models at a pace high enough to give immediate feedback.</p>
|
||||
<p>From there I had enough time to think about some stretch goal features. In particular I wanted to implement "scriptable terrain". The ability for designers, using godot's existing scripting tools, design terrain generation algorithms. Which technically could be used to facilitate procedural content, but the design of the system already allowed placing mountains procedurally if one wanted to. The main goal is to "close the loop" for designers. To enable designers to prototype and implement custom terrain modifiers, in a way that is designed to avoid creating dependencies and complex code structures.</p>
|
||||
<p>For this prototype application, I decided to implement this using godot's Expression objects. Which provide an interface for parsing and executing simple math expressions. Expressions can be passed a collection of values and objects, by name when parsed, and by value when executed, and they evaluate to some dynamically typed object (Variant). In the way I used them, they are passed the information unique to the primitive type they are attached to, and some allowed to use any static maths functions. Giving them nearly unlimited customisability.</p>
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -21,6 +21,9 @@
|
|||
<p>Timeframe: 2 Months, 2025</p>
|
||||
<p>Team: 2 Artists, 2 Designers, 1 Programmer </p>
|
||||
</div>
|
||||
<a class="git-block" href="https://git.objectionable.solutions/Team-Immerse-Yourself/YouDunIt" target="_blank">
|
||||
<div class="git-logo"></div><h2>Team-Immerse-Yourself/YouDunIt.git</h2>
|
||||
</a>
|
||||
|
||||
<h2>Product Overview</h2>
|
||||
<p indented>
|
||||
|
|
@ -67,7 +70,7 @@
|
|||
<p>
|
||||
Once connected, the game starts the VR scene, which contains the player node that sets up the OpenXR API. The game will now be rendering to the VR headset. From here on most of the remaining logic is managed through scripting, as most of it amounts to checking input and passing events to native C++ APIs.
|
||||
</p>
|
||||
<img src="../assets/you-done-it-client-setup.png" style="width:50%;"/>
|
||||
<img src="../assets/you-done-it-vr-start.png" style="width:100%"/>
|
||||
<h3>Server</h3>
|
||||
<p>
|
||||
The server of the network is the flatscreen game. It boots into a short info screen with a button which, once pressed, opens the <code>6667</code> port and starts listening for connections. Once a client sends a
|
||||
|
|
@ -77,7 +80,8 @@
|
|||
which completes the connection flow. From now on all connection requests are responded to with
|
||||
<a href="https://git.objectionable.solutions/Team-Immerse-Yourself/YouDunIt/src/commit/ad0c352b34be69939b0de67d552770d448d4d983/modules/you_done_it/ydi_networking.h#L66">NOK_OUT_OF_CONTEXT</a>.
|
||||
</p>
|
||||
<img src="../assets/you-done-it-server-setup.png" style="width:50%;"/>
|
||||
<img src="../assets/you-done-it-server-setup.png" style="height:260px"/>
|
||||
<img src="../assets/you-done-it-flatscreen.png" style="height:260px"/>
|
||||
<p>
|
||||
With the connection established, the actual gameplay scene opens, and the game proper starts. From this point on the server thread will send
|
||||
<a href="https://git.objectionable.solutions/Team-Immerse-Yourself/YouDunIt/src/commit/ad0c352b34be69939b0de67d552770d448d4d983/modules/you_done_it/ydi_networking.h#L22">MSG_HEART</a>
|
||||
|
|
|
|||
|
|
@ -108,6 +108,21 @@
|
|||
background-position: 50% 50%;
|
||||
}
|
||||
|
||||
.project-card[fencer-collision] {
|
||||
background-image: url('../assets/fencer-collisions.png');
|
||||
background-position: 50% 50%;
|
||||
}
|
||||
|
||||
.project-card[practice-shooter] {
|
||||
background-image: url('../assets/practice-shooter-cover.png');
|
||||
background-position: 50% 50%;
|
||||
}
|
||||
|
||||
.project-card[terrain-editor] {
|
||||
background-image: url('../assets/terrain-editor.png');
|
||||
background-position: 50% 50%;
|
||||
}
|
||||
|
||||
.project-card > h2 {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,8 +41,8 @@ a.internal {
|
|||
color: var(--foreground-color);
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--link-hover-color);
|
||||
a {
|
||||
color: var(--link-hover-color);
|
||||
}
|
||||
|
||||
section {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue