Hello gopher friends,

It's been a while since I put out a video or text update on the
Eternal game engine. That's because I've been busy on implementing
some tricky stuff (instancing), and I've also had to take on some
part-time work in order to make ends meet, which is unfortunately
eating into a lot of my time.

 ,----[ Overly-technical 3D engine guts rant following ]----\/\/-
/

While, the OpenGL part of implementing instancing is not
particuarly complicated I am finding myself in a situation where
I'm having to re-organize a lot of the fundamental structures of
how the scene graph  works, and it's proving to be quite a bit of
work.

Before, we just had geometry nodes, containing geometry to be
rendered to the screen. Each geometry node has it's own bounding
box, and every frame, we'd just check which bounding boxes of all
geometry nodes intersect with the frustrum of the active camera,
and consider those objects for rendering.

But now, with instancing, I had to introduce the concept of a mesh
- and allow a single geometry node to contain one or more meshes,
with each geometry node being an instance of a mesh.
So, each mesh can have multiple geometry nodes as instances, and
each geometry node can contain multiple meshes.
Each geometry node instance still has the bounding box like before
but we can't just get the geometry nodes intersecting the camera,
because 2 of those might just be instances of the same mesh, and
we don't want to make 2 draw calls. All instances have to be
aggregated into a single draw call, that's the whole point of
doing instancing, to speed things up because you've got less draw
calls to make.

Unfortunately, it gets more complicated, as each of those mesh
instances has a different position/rotation/scale (so a different
model matrix), and may have different textures. We deal with that
by passing an array of matrices and material structs to the shader
and an array of textures. Among other things, the material struct
contains indexes into the textures array for the diffuse, normal,
pbr, etc,... textures of each instance. -- but -- we hit a snag
here. If we have multiple textures per instance, and a mesh may
have many many instances, we will quickly hit a limit on the
number of textures we may pass to the shader. So that means that
we still have to make separate draw calls as soon as we hit this
limit. Which also means that we need to have a process in place
that figures all of this out, and generates 'draw lists' that
groups all the instances, meshes, and data required for each draw
call. It's a completely separate thing that needs to be computed,
we can't just simply iterate through meshes or instances and go
draw them.

I have a prelimenary implementation of this working, however, the
framerate absolutely tanked. All of this figuring out,... sorting
and grouping of meshes & instances into draw lists every frame, as
it turns out is quite expensive to do. So expensive in fact, that
I'm ending up with frame timings several orders of magnitude worse
than I had without instancing.

The obvious answer to this, of course, is to not sort all of the
things, all of the time, on every frame, but instead, only update
the drawlists when something moves. In the case of an object in
the scene moving, that'd mean we only need to add or remove it
from the collection of drawlists if it moves in and out of the
active camera frustrum. That's doable. However, in the case of the
camera itself moving, we still have to reconsider /all/ of the
objects in the scene, and we're back to a really bad slow case.
However, instead of doing the recomputation on the fly, we can
just add the nodes with changed matrices to a list, and have the
scene graph re-compute it's draw-lists in a separate thread. The
updating of the drawlists does not have to happen every frame at
all, it's perfectly fine for objects to fade in and out a while
after you move the camera around in the scene, especially if you
pad the camera frustrum and make it larger than it actually is. At
least, that's the plan I have for fixing this mess, but it's going
to take me some time to do properly.
                                                               |
                                                              /
---\/\/---------------------------[end technical rant]--------'

Meanwhile,  the whole work thing has me going through random  fits
of depression. Having to explain project concepts over and over to
people who are looking to up-end the entire architecture you came
up with just for the sake of their own ego or whatever,... I did
not miss it, and I just can't handle it anymore like I used to.

I've been so burnt out of the tech industry, my BS tolerance is
just sub-zero, and a seemingly innocuous question is enough to
set me off into the despair of the possibility of having to do
this kind of crap for the rest of my life. Don't get me wrong, I
do love writing code, and I don't even mind interacting with other
people, but as soon as any type of politics get involved, or
buzzwords get thrown around, or people act passive agressively, I
just completely freakin' break down in despair. I don't even know
what to say,... I'm just so, so tired. I don't have the energy to
deal with any of it anymore. And that's after starting something
for 4 hours a day part-time, after having take an almost 2 year
break from any type of working for other people. I just want to
write some friggin' code and make awesome things and be left alone
beyond that, but I guess that's too much to ask. Everything has to
be justified, pleaded for, planned, laid out in detail, explained,
re-explained, argued for, argued about, bla bla bla, in the time
it took for me to go back and forth on all this shit, I could have
implemented half of it already. Please may I write some code, Sir.

A while ago I tried to apply for a woodworking job for a pipe
organ building company just because I'm so desperately looking for
an out of this tech nightmare, never heard back.

Anyway, I'll quit whining. :P

I still haven't received any submissions for an Eternal ascii logo
so I guess I'll have to come up with one, so that'll be in the
works,...

Oh yeah, in other other news. A few weeks ago I attended a VCF
in Indiana (indy classic: https://indyclassic.org/ ) - I
spent most of the time hanging out with AJ from Forgotten Machines
( https://forgottenmachines.com ), attempting to fix some power
supplies for his fantastic Convergent Technologies machines --
while I was there I met another interesting character, selling
random odds and ends, including a series of interesting VOIP dumb
phones. I ended up snagging one of these. Turns out he hangs out
on lambdamoo as well. Anyway, he is starting up his own phone
company, selling voip phones with data-only SIM cards, that
connect to his own voip network. It's quite interesting and neat.
https://vrhelmutt.com

- Check out this RAD ad:
   https://www.youtube.com/watch?v=Z0wXH15bnz0

Anyway, that's about all from me for now!
Take care, folks!
Thanks for reading my nonsense as always ;)

UPDATE may 3 2024 -- vrhelmutt is now on gopher too!
                    gopher://spout.it