June 16, 2025
Added low-light preference per-pixel dynamic sampling!
A feature to reduce noise in low-light areas of the render by dynamically increasing the number of samples based on how dark the pixel is.
Currently an experimental feature, but works quite well! Doesn't kick into effect until 2 samples later, so the viewport is still plenty responsive
please. https://semver.org/
After install WSL on my PC again, I managed to fix gcc compilation problems (restricting -static flags to Windows MinGW only), and now Linux builds should work now! MacOS builds are also semi-tested, and Linux builds have been tested to work on WSL Ubuntu. Pretty cool that WSL now has graphical app and OpenGL support
once again, wakatime bullshit removed like 2 hours of time for no reason at all '<'
but anyways, object properties now work! Sphere is implemented, but this properties system was hell to implement. A lot of refactoring was needed to make this work in realtime. But after wrapping it in some UI things look are looking pretty good
Geometry panel is half done, scene objects can be removed/added, drag and drop support is here, and work has begun for modifying geometry at runtime. This will be hell to do, since a lot of geometry is generated using a system not really suited for runtime modification, esp. most need to regenerate low-level data based on the changing high-level parameters.
Scene view is done.
There's some very nasty background stuff going on with render workers (I hate multithreaded code omfg)
But it now kinda works???! The code is not pretty nor optimal but it's good for the use case (I hope)
anyways scene system is done so geometry coming up next
Added a system to make the rendering process perceptually faster and more responsive!
The render workers will randomly decline rendering some pixels to speed up the image submit process, so a render will be presented to the user quicker. Then after a few cycles, the workers will prefer rendering pixels that has been neglected (with low sample counts) so the final image will have roughly the same amount of samples.
Multithreaded rendering is done!
C++ ownership/references/pointer is hell lol 0-0
but now multithreading works! Here I have 10 render workers running each on there own thread, with 1 sample per worker. The result is then merged together on the fly.
Still a bit slow, maybe checkerboard rendering in the future? But mixing algorithm would be pretty hellish
Implemented bounding volume hierarchy, which uses AABBs to do an initial ray intersection test before doing the expensive shape intersection checks. This brings some dramatic speed increases! sped up by 87% with 50 samples!
Also added space-time rendering (fancy way of saying motion blur) but yeah animation is technically possible now lol
Added more materials!
- refractive
- reflective
- debug normal thingy (prototype of a basic custom shader system, lambert with normal as albedo)
More camera controls!
- FOV
- Pose control
- Depth of Field
Started work on more primitive meshes too
- Y-aligned circular disk (arbitrary height and radius)
Gotta work on getting this thing multithreaded, and make a gui (im thinking sdl+dear imgui? not sure yet) for it some time.
Doing barebones graphics stuff is super fun though.
Here's a render showcasing everything new (DOF made everything a bit blurry)
150 samples, 800x450, max 24 bounces
A multithreaded interactive software(aka CPU) raytracing renderer written in pure c++. Renderer core uses no external libraries. Libraries are only for UI and file loading. Comes with a custom interactive graphical user interface for real-time rendering and editing, UI is done via dear imgui and openGL. (OpenGL's only for UI! Raytracer is pure math!)
I'm proud to announce that ACEDIA 1.2 is now released!
Please check out the release trailer.
If you can, please download and try out the game! (click no thanks when asked to pay, Windows and Linux builds are provided) alternatively, please watch the trailer, there's also someone's playthrough of Version 1 in the comments of the itch.io page.
Overall, not only is a large new scene <INTERMISSION> added, dialog is added, a lot of newgame+ content and variations are implemented, plus a bunch of bugfixes, performance improvements and added the much requested mouse sensitivity slider.
So much work on the sky system! Please check out the video! (btw 100 hours celebration! :D)
- Animation system done, some sky animations are added
- sky overlay shader thingy done (looks very cool imo! Not the same as the hl2 effect I wanted to do originally, but this looks super cool too!)
- Ambience added!
All that's left is to actually write the dialog ;-;
A lot of changes.
- MAIN: Migrated all scenes to use the V2.5 Planar reflection shader. This is a modified version of the shader that's in my smart planar reflector plugin.
- Added sit transition for chair
- Started work on egg dialog UI prototype
- Tweaked Pause UI again (now it's darkened, looks okayish not sure if ill keep it)
A loooot of visual tweaks for INTERMISSION. Like the finale chase, both sections are in the same scene, so rendering setttings / fog / camera / compositing / audio has to be carefully tweaks to make the two areas have their own distinctive atmosphere.
Experimented with lightmapping, but raytraced lightmap cant really replicate the stylized environment I wanted, esp. for the house of leaves section.
Btw, the floor is a long planar reflector! Used the addon version of my planar reflecto since the ACEDIA version currently in project is somewhat outdated.
Added mouse and stick look sensitivity settings, which were much requested! ;)
one of the lots of qol features and tweaks thats going to be part of 1.2!
qol things will be considered the unreleased 1.1 version of acedia, and the new content will be technically 1.2. But since work for both parts are ongoing together, so I'm just going to skip 1.1 and release all the new stuff under the 1.2 update.
Devlog's mostly to reset whatever funky thing was happening with time tracking with the last devlog.
Mostly worked on promotion materials (not tracked ;o;) Commited some of my filming setup and refined some readmes and itchio pages. Finished some EARLY work of extracting stuff from my other unreleased project to prepare it for transferring it to ACEDIA. Tbh I started the preparations a loong time ago, but I was never sure abt whether i should link my projects together. But maybe it would be kinda cool, maybe it can work as some sort of teaser? Yes the previous is a house of leaves reference :3
Extracted the assets from ACEDIA and turned it into a standalone plugin! Added readmes, tooltips and everything.
This is the first time making a godot plugin so hope everything's working haha
I didn't expect to take this long to make this plugin standalone so didn't make any devlogs haha ;-;
Currently waiting for verification by Godot~!
A simple-to-use and performant 3D planar reflector plugin for Godot that provides crystal-clear reflections in complex environments. (Includes a video demo in the asset library. For an interactive demo, create an empty Godot project, install the plugin from the asset library, then check the addons/smart_planar_reflector/DEMO folder!)
A suite of FOSS apps that allow anyone to easily 3d scan and texture building interiors for projects of any size, using just a Meta Quest’s 3(s).
ACEDIA is published!
All supporting pages are finished, and the github repo is now live!
Spent a lot of time wrestling with Git LFS, but hackatime doesn't track that ¯_(ツ)_/¯
Check it out!
https://kip.gay/acedia
Finished music production! Unfortunately not tracked since its done on iOS :(
Full soundtrack is published noww
YouTube: https://youtube.com/playlist?list=PLerme6EePpdE4NGK1pCkN5AA0sxJJn0jp&si=B2sjhdxzUvClAwYf
Soundcloud: https://soundcloud.com/kip_music/sets/acedia-original-soundtrack
Also here's one of the songs, [Runner].
Working on music production!
Originally wanted to learn ableton for this project, but if I did that this project is probably gonna get delayed for another month again ;-;
So I'm using garageband instead haha
Since nothing's finished yet, here's the album art I made when I was borrrrrred
The finale animation is done!
The finale scene is scrapped, it's going together with this scene instead.
Very happy with the camera work in this shot.
There's a lot of juggling between different animation handlers, had to wrangle controls away from the player and put them back multiple times haha
Current testing doesn't show any situations where the animation chain will get decoupled and result in the bag sibling getting stuck in place (i hope not)
All the peeps are moved by hand cause I'm a idiot and did all the animation manually in Godot instead of Blender ;-;
The chase is complete!
Still some sound work needs to be done, but I'll put that off until I made the music for this project.
All that's left is to take control away from the player and show them the finale cutscene (I may make this interactive, not sure yet)
Here's the full(ish) chase!
(Invisible upload requirements requires me to compress the video a lot ;-; I'll probably make a trailer when everything's done)
Architecture for the finale chase is now complete.
All the peeps and level geometry has been placed, all now to do is to finish the animations.
On schedule for a june release (at lease on schedule for now haha ;-;)
There's around 1000 peeps, which has quite a huge performance hit but occlusion culling + a modern pc should be able to handle it ;-;
Finished building the finale chase cityscape mesh!
The camera's going to zoom out from the player into a top-down view of the whole city.
This is probably the MOST expensive scene in the project, with 400 buildings and hundreds of people (not sure yet if people should be placed via Blender or Godot.)
Hopefully occlusion culling will handle most of this, however it will be hell to enable culling for all these meshes.
With the office chase done, the entire chase sequence is now complete.
The player can actually outrun the bag sibling sometimes, so a few peeps has to be artificially moved around to block the player when they get too close. It's annoying, but I can't figure out a better solution than slowing the player down, which itself would be annoying and weird.
Finished the train chase sequence. It's basically the same as the hallway chase so here's how the mirror works instead.
For planar reflections I added a camera that reflects the player camera's pose. The rendered image is mapped onto the reflector's surface using screenspace UVs.
I'm using perspective projection instead of frustum projection, mainly because perspective has optimal pixel density (1:1 to the screen opposed to the inverse square law), and there's no issues with anti-aliasing.
However perspective has one big issue which is near plane culling. If an object is behind the mirror in just the right way, it could obstruct the reflector camera. Since Godot doesn't support custom near plane matrix yet, I made a system where the reflector tries to find the optimal near plane based on its pose.
The system (dynamic near plane) tries to find the closest near plane to the reflection surface where none of the near plane exceeds the surface. However planes outside the reflector or camera frustum boundary is allowed to exceed the plane.
Conviniently, this also creates a quite optimal camera culling system for the reflectors, so it can be immediately paused when out of view. Unfortunately occlusion culling is nontrivial as that's done on the GPU, so I used manually placed activation areas to mimic occlusion culling for now.
The performance isn't perfect, and there's situations where it's impossible to get a perfect near plane, but combined with render layers it's okay for this project.
Finished the chase intro animation. The bag sibling's walk animation is procedurally driven by their velocity, this makes authoring animations way much easier. Some additional tweaks was done to the player controller so that changing the fov and tracking wouldn't freak out the input handler.
Also tweaked the controller support so that there are now haptics for each footstep. Frustratingly, Godot doesn't support dualsense haptics yet, so a dualshock has to be emulated using something like DualsenseY first.
Working on the finale chase scene. You can have three planar reflectors in view simultaneously in this part so the performance hit is pretty substantial (oh yeah gotta make the planar reflection deep dive soon(TM))
Godot's occlusion system is pretty seamless, though. Keeps the drawcalls down at least.
First devlog! gonna post more backlogged stuff later.
Office scene, one of the earliest (and most unoptimized) scenes finished. Really pleased with the ambience audio I did for the hallway.
Reflections are from a custom planar reflection script, I need to document how it worked soon cause its soo janky
You are not alone. ACEDIA is a game about being queer. A 3D first-person immersive game made in Godot, with a focus on atmospheric environments and soundscapes. The project is fully open-sourced and in the creative commons. All original assets and code are personally handcrafted for this project, including a custom dynamic near perspective-based planar reflection rendering system for Godot. UPDATE 1.2 IS OUT NOW! (Check the demo link!)
An unofficial Android client app for the Reykunyu Na'vi dictionary, with Material design
An Android app that helps you manage your OPNSense firewall's WireGuard VPN.
This was widely regarded as a great move by everyone.