🌸 Mon, Apr 6, 2026 🌸

We have to send four people around the Moon to realize, at the end of the day, that we are all human.

https://www.nytimes.com/2026/04/06/science/moon-crater-carroll-reid-wiseman.html


🌸 Mon, Apr 6, 2026 🌸

Move static mesh physics initialization and optimize UI event handling

  • Physics: Moved the static mesh physics body creation from Gameplay::run into Mesh::loadJson. Meshes now automatically register with the Jolt physics system if the "isStatic": true property is present in the JSON definition.
  • Scene Management: Added a specialized getPlayer() method to the Scene class to replace generic get<Player>() calls in Gameplay and CrystalSanctuaryGuardian.
  • UI Optimization: Refactored UI event loops (mouse motion, clicks, and wheel) in Gameplay to use a new getNodeUis() helper, avoiding manual dynamic_cast checks on every node.
  • Projectiles: Refactored BhsProjectile to handle its self-removal timer in a postCtor() override rather than a deferred action in the constructor.
  • Documentation: Updated todo.md to replace “recipe” tasks with specific multi-tier model requirements (x1 to x32768) for Entropy, Harmony, and Essence items.
  • Code Quality: Cleaned up Mesh class implementation by moving inline logic to mesh.cpp and implementing saveJson/loadJson.
  • Scrollbar & Input: Fixed TileView scrolling logic by properly calculating column counts (nCol) to prevent division by zero. Corrected the scrollPos clamping math and implemented functionality to scroll by clicking and dragging the scrollbar thumb.

🌸 Mon, Apr 6, 2026 🌸

Modern devices are so annoying, if you are not using it for years and you suddenly need it for some small task, it will take hours just because it became outdated and needed to install all years of patches.


🌸 Sun, Apr 5, 2026 🌸

Ctor structs, node IDs, Scene/Physics into node.hpp, cleanup

  • Add Ctor structs to Node3d, NodeUi, SkMesh, Mesh, PointLight, Spotlight, Img, Label, MenuItem, RadialProgress, TileView, Scrollbar
  • Pass position/scale/rot via Ctor instead of post-construction setters
  • Add Node::getId() using stable per-instance integer IDs
  • Remove toNodeId(void*) pointer-hash; replace with Node::getId()
  • Add idToNode map to Scene for O(1) getById lookup
  • Move Scene and Physics declarations from scene.hpp into node.hpp
  • Delete scene.hpp; update all includes accordingly
  • Use swap-and-pop for O(1) node removal in Scene::cleanup
  • Move Scene to oup::observable_sealed_ptr in gameplay and editor
  • Add scene pointer cached in Node constructor to avoid root traversal
  • Add Node3d::Ctor forwarding through inheritance chain
  • Fix Scrollbar::getPos renamed to getVal for consistency
  • Fix scrollbar shader thumb UV calculation
  • Update scrollbar assets
  • Use oup::make_observable_sealed for Scene in gameplay and editor
  • Set editor scene to uiMode by default
  • Various glm brace-initialization cleanups

🌸 Sun, Apr 5, 2026 🌸

Scrollbar, TileView template, InvItemTile, uiMode to Scene

  • Add Scrollbar node with track/thumb/arrow shader and assets
  • Templatize TileView<ItemT, TileT>
  • Replace TileViewItem with InvItemTile (hover highlight, click cb)
  • Add onTileClick callback to TileView
  • Move uiMode state from gameplay local variable into Scene
  • Add Player::toggleInv to show/hide inventory and toggle uiMode
  • Separate HUD and inventory into distinct NodeUi nodes in Player
  • Move items ownership to Player; TileView takes items by reference
  • Rename img-uivs.sc to common-uivs.sc; update all asset paths
  • Add isVisible check to Node::prepareRenderData
  • Consolidate isVisible into Node base class; remove duplicates
  • Replace lastMotion with mouseCapture in scene editor
  • Remove alive field
  • Add left mouse button UI handling in gameplay
  • Gate mouse wheel events behind uiMode check
  • Remove debug LOG from mouse wheel handler

🌸 Sat, Apr 4, 2026 🌸

WIP TileView: Wheel scroll, item textures, UI left click handling

  • Add mouseWheel/mouseWheelInternal to NodeUi event system
  • Add mouse wheel scroll to TileView with clamped scroll range
  • Fix mouseMotionInternal to keep mouseCapture across frames
  • Add mouseBtnDownInternal capture forwarding
  • Add left mouse button handling in gameplay UI mode
  • Add mouse wheel event forwarding in gameplay
  • Add Item constructor taking a Tex reference
  • Wire TileViewItem::setItem to swap texture
  • Populate player inventory with hp-ico and mana-ico test items
  • Fix TileView cell size to 128x128 and center tile positions
  • Add virtual scrolling: only render visible rows in TileView
  • Add mouseWheel override to TileView

🌸 Sat, Apr 4, 2026 🌸

Because I made $37 on Twitch last year, I have to report myself to the IRS as a “content creator” now. It is official!


🌸 Sat, Apr 4, 2026 🌸

WIP TileView

  • Add mouseBtnUp virtual method and mouseBtnUpInternal to NodeUi
  • Add mouseCapture to NodeUi for drag tracking across frames
  • Remove clip parameter from mouseMotionInternal
  • Add Render::getMousePos() helper for UI coordinate conversion
  • Replace inline mouse pos calculations with getMousePos()
  • Add uiMode toggle in gameplay (B key) with SDL relative mouse toggle
  • Add right mouse button and mouse up handling in gameplay
  • Add mouseCapture to Gameplay for UI drag events
  • Add TileView scrolling via right mouse button drag
  • Move inventory TileView to scene root instead of player node
  • Add design doc mockup updates

🌸 Thu, Apr 2, 2026 🌸

Switch to oup, Physics to Scene, CtxMenu, TileView, getAsset

  • Replace std::shared_ptr/weak_ptr with oup observable pointers
  • Move Physics out of Assets into Scene; Assets no longer owns physics
  • Add getAsset() to Node via Scene::getAssets() for asset access
  • Remove Assets parameter from node constructors; use getAsset instead
  • Add Physics struct; Scene takes optional hasPhysics flag
  • Scene::tick now steps physics simulation
  • Defer physics destruction until after scene teardown
  • Add CtxMenu node wrapping Img + VLayout for context menus
  • Replace raw Img+VLayout menus in scene editor with CtxMenu
  • Add tint uniform to img shader and Img::Ctor
  • Make Img non-final to allow subclassing
  • Add scissor support to NodeUi via scissorCache
  • Add Render::getScissor and getUiViewProj helpers
  • WIP: Implement TileView with scrollable grid, scissor clipping, bg image
  • WIP: Implement TileViewItem as Img subclass with setItem
  • Rename BlackHoleSingularityProjectile to BhsProjectile
  • Change setAnim to take const AnimAsset reference instead of pointer
  • Add SkMesh::clearAnim
  • Change socketedNodes to use NodeId key with observer_ptr
  • Change all tick signatures from float to double dt
  • Make snapping default to true in scene editor
  • Add hp-ico, mana-ico, xy textures to asset preloads

🌸 Wed, Apr 1, 2026 🌸

Of<T> asset API, TileView, render pipeline cleanup

  • Replace get<T>() with get(path, Of<T>{})
  • Add load() as private method for internal asset construction
  • Assert on get() if asset not pre-loaded in Assets constructor
  • Sort asset preloads alphabetically in Assets constructor
  • Preload shader programs (ProgAsset) in Assets constructor
  • Rename ImgIn to UiIn in Render
  • Remove deferred UI and light render queues; submit immediately
  • Move UI pass setup before scene data collection in render loop
  • Add TileView and TileViewItem node stubs for inventory UI
  • Add Item base class stub
  • Add inventory UI node to Player
  • Add assert messages to load-prog file error handling
  • Fix ref<T> alias spacing

🌸 Tue, Mar 31, 2026 🌸

GDD updates, Alt+Middle Mouse focus

  • Add Pills and Earbuds (10 tiers each) to GDD and todo list
  • Replace Health/Mana Elixir with Pills/Earbuds in item lists
  • Add consume pills and put on earbuds animation stubs to todo
  • Abbreviate Black Hole Singularity to BHS in todo and GDD
  • Mark all 5 survival stats as implemented in todo
  • Add Alt+Middle Mouse focus point snap in scene editor
  • Fix projection matrix for non-homogeneous depth (Vulkan/Metal)
  • Revert border sampler flags that caused SSAO regression
  • Initialize level label position in Player constructor
  • Adjust max HP, mana, and XP level scaling curves
  • Add inventory and radial menu mockups to design doc

🌸 Tue, Mar 31, 2026 🌸

TIL: Blender’s Alt+Middle Mouse will focus on whatever you click. I used to select the object and use Numpad period, but it’s multistep and Numpad is far away from your left hand. Also, if the object is very big, it will focus to the origin, and sometimes you don’t want that — I used a hack by switching to Edit Mode, selecting a bit of mesh, and focusing on that. TIL I can just Alt+Middle Mouse. 🤯


🌸 Mon, Mar 30, 2026 🌸

Player stats mechanics, level scaling, HUD polish

  • Move crosshair target to Player from Gameplay
  • Add level label to HUD, centered on stats icon
  • Replace static min/max/val on RadialProgress with callbacks
  • Wire gauge callbacks to Player stat getters
  • Add stat decay over time: hunger, thirst, energy
  • Add level-scaled max stat formulas (exponential for HP/mana/XP)
  • Add getNextLevelXp with exponential level curve
  • Fix Guardian applyDamage: play death immediately if HP hits zero
  • Remove unused hp-ico and mana-ico assets
  • Add target-ico intermediate blend asset
  • Update player default stats to full in gameplay.json
  • Change xp field from int64 to double

🌸 Mon, Mar 30, 2026 🌸

Radial progress bar, ProgAsset, ref alias, render refactor

  • Add RadialProgress node with custom fragment shader
  • Add ProgAsset to manage shader programs as cached assets
  • Add ref alias for std::reference_wrapper to reduce verbosity
  • Refactor renderer: pass prog handle via ImgIn and LightIn structs
  • Merge PointLightIn and SpotlightIn into unified LightIn struct
  • Move shader programs out of Render into Material and light nodes
  • PointLight and Spotlight now load their own shader programs
  • Remove pre-initialized named asset members from Assets class
  • Fix double free in MeshAsset by removing Part destructor
  • Rename load-program to load-prog
  • Rename nodeId to nodeIdTex in shaders to avoid name collision
  • Add stat gauge background and foreground texture assets
  • Wire survival stats gauges to Player HUD
  • Enable sequential view mode for UI render pass

🌸 Sun, Mar 29, 2026 🌸

Survival stats, HUD mockup, Guardian retexture, build opts

  • Skip DDS conversion if texture has not changed
  • Add survival stats to Player: HP, mana, hunger, thirst, energy
  • Serialize/deserialize Player survival stats to/from JSON
  • Add HUD mockup with survival stats icon
  • Add HP, mana, and stats icon assets
  • Add ProgressBar node stub
  • Retexture and re-rig Crystal Sanctuary Guardian
  • Make backward movement speed 2x slower
  • Fix Node3d saveJson to call Node::saveJson
  • Fix rsync target path for Windows build

🌸 Sun, Mar 29, 2026 🌸

Mock-up for HUD survival stats.


🌸 Sat, Mar 28, 2026 🌸

Assets, scene, skeleton, add projectile and timer

  • Expose all assets as named members on Assets class
  • Create Scene class from Node with cleanup, remove, getById
  • Separate Skeleton into standalone asset (skeleton.cpp/hpp)
  • Separate Joint struct into joint.hpp
  • Add Mob base class with applyDamage interface
  • Add BlackHoleSingularityProjectile node with collision
  • Add Timer singleton for deferred callbacks
  • Move animation update from tick to geomPass
  • Add looping flag to setAnim; support non-looping animations
  • Add inner body shape and user data to character physics
  • Set user data on static mesh bodies for collision lookup
  • Replace getRoot with getScene returning typed Scene pointer
  • Add getCam to Render
  • Add border sampler flags to fix artifacts on the edges of the screen
  • Use double precision for dt and animation time
  • Remove anim-test asset; clean up gameplay scene setup
  • Move export-gltf.py to project root
  • Guardian: add HP, applyDamage, death and receive-hit logic

Just was working on my game the whole day — today is Saturday, so…


🌸 Sat, Mar 28, 2026 🌸

That is a bit annoying — shared_from_this is not available in the constructor, understandable, but still annoying.


🌸 Fri, Mar 27, 2026 🌸

Copy levels to data dir, load from data dir, fix emission strength

  • Copy levels to data directory
  • Load levels from data directory
  • Make emission strength have effect
  • Add temporary skeleton logging

Felt tired the whole day. I think I need longer rest. Will try to go to bed early.


🌸 Fri, Mar 27, 2026 🌸

Check that code:

if (something bad)
      return;

It is good you are doing the early returns; it is bad you are failing silently. Return an error code.

if (something bad)
  return ESomethingBad;

Throw an exception.

if (something bad)
  throw ESomethingBad;

Assert:

assert(!something bad);

Log it:

if (something bad)
{
   std::clog << "something bad\n";
   return;
}

🌸 Thu, Mar 26, 2026 🌸

WIP Black Hole Singularity projectila mesh and animations

I need to figure out how to do attachments in a more robust way.

Brain is not working. Should take longer breaks.


🌸 Wed, Mar 25, 2026 🌸

Finalize 1st person Alara’s mesh

Worked in the office. Kind of tired. Blood sugar was on the high side at 117 — still in the green. The motivational pop-ups are kind of funny because they’re a bit tone-deaf. If your blood sugar has been in the green for a long time, you get a pop-up: “Keep it up.” LUL


🌸 Wed, Mar 25, 2026 🌸

“Modern C++ Design” book is a quarter century old, time to write “Contemporary C++ Design”.


🌸 Tue, Mar 24, 2026 🌸

Black Hole Singularity anim, redo jump animation

  • Add Black Hole Singularity spell animation
  • Redo jump animation
  • Hide weapon mesh by default
  • Improve glTF animation export settings
  • Add paper doll art and ground fog to todo list

Nothing spectacular happened today. Just working my day work and working on the game. Weight 158 lb, blood sugar 103.


🌸 Tue, Mar 24, 2026 🌸

That’s an interesting coincidence. I worked last week on the Crystal Sanctuary Guardian boss. Which is a mob made out of stone. And today I discovered Epic gives away Stone Golem asset for free on Fab. And the quality, of course, is a million times better than mine.


1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20 - 21 - 22 - 23 - 24 - 25 - 26 - 27 - 28 - 29 - 30 - 31 - 32 - 33 - 34 - 35 - 36 - 37 - 38 - 39 - 40 - 41 - 42 - 43 - 44 - 45 - 46 - 47 - 48 - 49 - 50 - 51 - 52 - 53 - 54 - 55 - 56 - 57 - 58 - Next