Handmade Network»Ryan Fleury

Recent Activity

Dynamically sized thumbnails; Metadesk-encoded help menu and command history; filtering based on tag.

wheeljam
New forum thread: Jam Project Templates
Ryan Fleury
Ryan Fleury

Communication has become very important to the Dion project. So, a huge priority for us was building a new website that allowed us to communicate.

The new site has a blog, project information, a gallery, FAQ, and more. https://dion.systems/

We've got our first blog post up, outlining our roadmap for the Dion project moving forward. https://dion.systems/blog_0002_roadmap

Early experiments of an editor on top of new format ideas. Certainly less pretty than the old demo (for now, just using developer debug rendering), but with much clearer thoughts about what the format's role is in the compute system. Here's an example of storing visual layout hints inside of the format and altering it on a per-subtree basis.

One important detail of Dion's goals is that it needs to be much easier to build tools than it ever has been with text. This WIP viewer/editor took 2 hours to make today (on top of our internal base layer). That includes the node structure itself, rendering, and layout.

https://cdn.discordapp.com/attachments/729080610995437578/830219331869736980/fJheFPddiR.gif

Metadesk-based static site generator being used for docs generation (in this case, docs for Metadesk 🙂).

Working on new shared developer layer for Dion development, including UI, tweak variables, and plugins for prototyping our new tools.

Quick tool I wrote for 4coder yesterday evening, LOC breakdown for buffers in 4coder. Breaks things down by file (all), section (comments starting with //~, forming divider lines), and sorts by size. Accounts for { lines and empty lines too. Intended for figuring out what parts of a big codefile are actually the bottleneck in size quickly.

4coder fun: Syntax highlighting "visors"

Some debug visualizations that might give some insight into how entities are working.

Messing around with graph-based crafting systems.

Turns out trees are also great for making tables.

Jai code indexing and stuff in 4coder.

School project for one of my last university classes, but it was actually one I had fun with. https://cdn.discordapp.com/attachments/703366926981922830/783554263284056064/Wuyw6toxmS.mp4

Tooltips, basic profiler UI

Brief demo of the state of my new UI experiment, up until this point in time.

Infinite list with a scrollbar, adjusting the maximum number of items (notice how the number of actual reserved widgets remains ~constant once the list area is full)

"Infinite" list in the new immediate-mode UI experiment

Window sorting with completely immediate-mode UI, and no input-handling deferring. Works hierarchically---this can happen for any widget sub-tree.

New IMGUI experiment I cranked out this morning. Unlike my previous IMGUI experiments with Dion, this doesn't defer input handling, but still allows for smart autolayout.

Should be clear, but it works both ways too (+ short editing sample):

I may or may not have stolen this idea from @rxi

Quick demo of the internal developer system that has been really useful in working through a provably correct/functional cursor movement/editing scheme.

Editing at various granularities

Checkbox and collapsable juice

Some work with inputting type expressions.

https://cdn.discordapp.com/attach...715661986733490272/ohaUMGy3TA.gif

Immediate-mode UI keyboard navigation. Traverses any widget tree, discounts groups (only targets leaf-nodes in the widget tree), skips non-interactive widgets, remembers which widget was last selected in a group and recalls it.

Automatic HTML documentation generation from metatags on C code. Still need parameter linking up (see @Parameter thing in doc string), but overall it's working! Implemented by doing an approximate parse on the C code, forming a Data Desk AST, and traversing it and generating HTML (which uses a Data Desk helper function to transpile out to the C displayed in the docs), which is then fed into my static site generator.

Example of a very strict size specified on the left column

Working on expression editing.

Ryan Fleury

Auto-resolving unresolved references

Blog comment: The library is live!
Ryan Fleury

Made a prototype in a few hours today because I am stuck on The Melodist and wanted to test out my "off-the-ground" pace in Telescope. Turned out interesting, made a little "electricity" simulation thing

Forum reply: Multiple Cursors
Ryan Fleury
Ryan Fleury

Plotting multiple functions, and plotting data (soon to be extended to C arrays as data), with graph metadata customization. All custom inside my 4coder custom layer, available here: https://github.com/ryanfleury/4coder_fleury

Graphing with calculator expressions in 4coder! (heavy WIP, very early showcase!)

One of the features in my 4coder custom layer: calculator comments! They are comments that begin with //c, followed by a mathematical expression. I just implemented variables and functions.

Spent today working on some 4coder beta 4.1.0 customizations... https://www.youtube.com/watch?v=bawpr3nzT68

Ryan Fleury
Ryan Fleury

Developer terminal improvements. Now I have all formerly only stdout directing to: stdout, the Windows debug output, and also the developer terminal. Warnings and errors are logged as such, so warnings are yellow and errors are red. Builds for programmers have notifications for warnings/errors. I implemented this because I was spending far too much time trying to debug shaders when they were just failing to compile. Now I'll be notified of it so I won't waste my time thinking I wrote my shader code right. :) (Also has the benefit of catching slow spots)

https://www.youtube.com/watch?v=eHDf_Jii_Kk

Ryan Fleury
Ryan Fleury

Demonstration of the custom scripting language in The Melodist, and how that works with development flow. I run into some compile errors, still need to work on getting those errors reported in the editor. Nevertheless hot-reloading and runtime compilation (for developer builds) on a worker thread is working pretty well. :) An experiment happening soon: Visual script editing inside the editor! https://www.youtube.com/watch?v=YXrgB3AnZFI

The Melodist developer tools tablet integration.

Ryan Fleury
Ryan Fleury

Recently got my Wavefront OBJ parser to a much more usable state. There are two APIs you can use: (1) A low level API where you provide your own parsing memory buffer, error callbacks, loaded file contents and where you manually load in MTL files, and (2) A high level API, which basically does all of that for you using the CRT, and automatically loads MTL files (less shippable, but nice for getting something working quickly). The parser will spit out a list of renderables, which correspond one-to-one with the materials in the OBJ file, so you can directly pipe those to your renderer as renderable model subsets. It will also merge renderables with the same material. Currently, vertex buffers are interleaved, just XYZUVNNN (position, UV, then normals); let me know if you want API support for other output formats. Adding in other formats should be pretty easy to do.

The low level API does not allocate any memory, so you don't need to call any freeing functions if you provide your own parsing memory.

Here's the parser: https://gist.github.com/ryanfleury/0062f2ffdec07bcda8a4a0ef5c7f8f37. It's a single file, and you use it STB-style, e.g. with #define OBJ_PARSE_IMPLEMENTATION then #include "obj_parse.h".

Here's Sponza with all materials loaded in!

Ryan Fleury
Ryan Fleury
Ryan Fleury
Forum reply: Handmade JS
Ryan Fleury

Handmade-style development is often seen as producing higher quality results, but ultimately being impractical in practice because of how much longer things take. To an extent, this is true; writing things yourself does take more up-front cost. However, once you've built up your own tech stack that serves the kinds of projects you work on, there are several benefits that provide a net win:

  • Complete control
  • Ability to make reasoned decisions about the requirements of a system
  • Knowledge that allows you to choose between your existing tech, a library, or a new solution
  • Using that knowledge to save you time while keeping quality high

As an example, I was recently approached to do a video collaboration jam game. I've used my own tech to make the game, and in <24 hours of development, I have the following:

https://youtu.be/IptM20CIAr4

A quick video showing a bunch of different code-generation and IMGUI features I've been working on, including: Arbitrarily-ordered windows, nested dropdowns, and automatic UI generation from introspection (the Static Object Editor UI is auto-generated from the definition of a Static Object)

https://www.youtube.com/watch?v=v5C38sDNKLU

New devlog which goes a bit more in-depth on Data Desk: https://www.youtube.com/watch?v=rR79AGmExq0

Ryan Fleury

Below demonstrates some basic UI code generation functionality that can be implemented using Data Desk (https://github.com/ryanfleury/data_desk). All of the UI calls are directly generated from the structure parse.

https://www.youtube.com/watch?v=5TstiBqWcyk

On the left: Custom data description format with compile-time introspection and project-specific custom code generation support.

On the right: C code generated by a custom layer, which would exist specifically for a project.

Ryan Fleury
Ryan Fleury

Random experimentation with real-time CPU-side 2D ray tracing!

Ryan Fleury
Ryan Fleury

The Melodist scripting system improvements! Messages can now have dynamically changing speeds and colors, and also choices! The player's selected choice can be queried inside of the scripting language to make decisions about which options were chosen.

https://cdn.discordapp.com/attachments/518236585133867009/539853785057722399/unknown.png https://cdn.discordapp.com/attachments/518236585133867009/539853826166095882/unknown.png

The Melodist event scripting language! Test script source code in the top left, result in the bottom left, C program that compiles and runs the script on the right.

The scripting language allows calling into native functions. These native functions just receive the parameters as a big buffer, and then they take it from there.

Ryan Fleury
Ryan Fleury

Writing a little scripting language parser for cutscenes/events in The Melodist. First time successfully writing a language recursive descent parser that generates an abstract syntax tree; this has been notoriously difficult in the past for me, for whatever reason. The text on the left is generated from the abstract syntax tree, which is created from the text passed into the parse_script function.

The code on the left is generated from the code on the right, using a bit of custom code that plugs into the prebuild program (custom code would be project-specific)

Basic C prebuild program with introspection, inspired by Handmade Hero's initial implementation of introspection. Allows custom code to hook into, calling that custom code as it parses new introspected types, so that the custom code can do whatever it wants with that information (generate functions based on that type, etc.)

Ryan Fleury

Fun little projectile test for the Handmade Network stream today.

Ryan Fleury

Software rendering! Experimenting a bit for the next Handmade Network stream.

Camera focus regions allow map developers to force the game camera to target particular positions in the map, with varying zoom levels and strengths. Not only does this allow the map developer to ensure that something in particular is seen by the player (irrespective of their screen resolution), it allows certain parts of maps to be tied with a particular "focus point", which is great for indoor/cave maps https://www.youtube.com/watch?v=qhEt71_bvpM

Re-added dynamic shadows.

Got layered rendering back in. Game is finally starting to look like itself again! https://www.youtube.com/watch?v=RKKTRzM4hS0

Ryan Fleury
Ryan Fleury
Blog comment: CDbg Build 0.0.0.8
Ryan Fleury

Website code block syntax highlighting (rolled it myself)

Wrote a C program to take my own blog file format and generate HTML from it, looking something like:

@Title: A Theoretical Examination of the Abstraction

It is without doubt that all software developers...

(...)

@Image: some_path.png

@Code: {
    // stuff
}

I then integrated it into my personal website so that all blogs are automatically shown as lists, etc. :)

Ryan Fleury

More voxel experimentation. Been working with real-time world modification and chunking.

More marching cubes experimentation. Just exported a mesh generated from voxel data to a .obj and viewed it in Windows 10's thingy

Marching cubes experimentation, on a whim...

Apologies for the lag... Recording on a laptop. It's smooth as butter in person. :) Note how the third background option is added with the modification of a text file! https://www.youtube.com/watch?v=kSfc2FHgDQ4

(~1.5 months of Vulkan)

Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury

Asset-tag hot reloading (modifying the use of certain textures at runtime)

https://youtu.be/gOCw11EHbrk

Working on a new renderer for The Melodist (abstracting out for different backends, making it more performant)--having some fun with it:

Ryan Fleury
New forum thread: Modified Configuration Bug
Ryan Fleury
Ryan Fleury

The Melodist is a game where you are told how to feel.

https://www.youtube.com/watch?v=bUTQ9cGRn18 Much better! Still have a lot of visual improvements to make, but it's working.

Getting particles in the game so that I can work on weather. The weather will react to musical changes in the world. https://youtu.be/GxN248peHZc

Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury

Short side project...

Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
New blog post: Alternatives to Patreon
Ryan Fleury
Blog comment: Name Change (7/5/2017)
Ryan Fleury
New blog post: Name Change (7/5/2017)
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
Ryan Fleury
New blog post: Update (1/9/2017)
Ryan Fleury
Ryan Fleury
Ryan Fleury
Blog comment: Devlogs (?)
Ryan Fleury
Ryan Fleury
New blog post: Devlogs (?)
Ryan Fleury
Ryan Fleury
Ryan Fleury
New blog post: Art Update (11/25/2016)
Ryan Fleury