[{"content":"So last year, I wrote my own little package manager called binget. You can check the blog post here. A year later, binget received a major glow up since I wanted it to be more of a \u0026ldquo;proper\u0026rdquo; command line app with help messages and a more appealing UI.\nAs a result, I used libraries such as\nConsoleAppFramework Spectre.Console So, when you list the help, it looks like this during in the console.\nbinget -h Usage: [command] [-h|--help] [--version] Commands: clean, c Removes any local packages that are not listed in the config file. Your config file is effectively your primary list. install, update, i, u Installs/updates packages from a configuration file. list, l Displays all packages in the destination directory and the config file. And\u0026hellip;running an install or update command produces the following output in your console.\n➜ binget install --config .\\config2.toml √ omnisharp-linux ----------------------------------------100% √ omnisharp-windows ----------------------------------------100% √ lua ----------------------------------------100% √ nvy ----------------------------------------100% Installed: 4, Failed: 0, Skipped: 0 ┌───────────────────┬───────────────┐ │ Package │ Status │ ├───────────────────┼───────────────┤ │ omnisharp-linux │ √ - Installed │ │ omnisharp-windows │ √ - Installed │ │ lua │ √ - Installed │ │ nvy │ √ - Installed │ └───────────────────┴───────────────┘ Summary of the new changes New Commands list - lists all installed packages and diffs them with your configuration toml file. clean - removes any installed packages that are not listed in your configuration toml file. install/update - can use either as they\u0026rsquo;re aliases of each other. Downloading Woes One of my biggest gripes with my v1 version was that, it was always fetching new packages whether or not there was an update. For example, OmniSharp Roslyn is on v1.39.15 as of today (07-26-2026). Let\u0026rsquo;s say I make a tiny configuration locally in the downloaded package. If I ran binget config.toml (the old v1 version), it will download v1.39.15 again and overwrite everything locally.\nThis was annoying as it meant I had to remove the entry from my configuration toml file just to avoid it from updating. The entire point of my configuration toml file was just to serve as a main list of packages to download and \u0026ldquo;install\u0026rdquo; locally.\nI use the word \u0026ldquo;install\u0026rdquo; loosely as the packages are not installed like a traditional installer. The packages are just downloaded and/or extracted.\nNow, binget will write a manifest.toml to any extracted package locally. The manifest.toml file will list the following info:\npackage - the name of the package (this is user defined in your configuration toml) repository - the unique identifier of the repository on Github tag - this is really the version number and will try to parse semantic versioning asset - the actual package downloaded checksum - the cryptographic hash of the downloaded asset installed - the date the package was downloaded and \u0026ldquo;installed\u0026rdquo; The main field that binget cares about is the tag entry. If the fetched package is the same version or an older version, binget does not proceed with the download and skips that package. This now prevents unnecessary download and disk operations.\nIf the version is newer, then binget will proceed to indiscriminately overwrite your existing package with the new version. This will error out if an installed package is currently in use.\nSome Security Measures Okay, so how can I tell if the package you downloaded is the correct package? Github\u0026rsquo;s API provides a field called digest in its json response. The digest field will typically include the hash type and it\u0026rsquo;s hash value, however there are cases where the digest can be empty.\nFor now, assuming that the digest field is valid, I parse the hash type and and its hash value. The package is already downloaded, but *not extracted yet. Based on the hash type, I hash the downloaded archive locally and compare it to the digest\u0026rsquo;s hash value. If they are not the same, the package \u0026ldquo;installation\u0026rdquo; effectively fails.\nAdditionally, I use FileTypeChecker, to ensure that whatever is downloaded is either an archive or an executable.\nYou can set the security level in your configuration toml file to\n0 - none, effectively no checks will be performed 1 - laxed, checks will be performed if available (e.g. if the digest field is not empty, then a hash checksum will occur) 2 - strict, all checks will be performed. Any package that fails these basic checks will fail the \u0026ldquo;installation.\u0026rdquo; Updates? Updates will come as I have more needs to fill. Otherwise, feel free to fork this repo and add some more updates! For now, I am very content with the current state of it as it fits my needs. I do want to axe Spectre.Console in favor of an imgui styled console UI from scratch (but that is a side project for another day).\nAt the very least, a Linux release will drop very soon\\u2122.\n","permalink":"https://psuong.github.io/posts/bingetv2/","summary":"Binget received a glowup!","title":"BinGet v2.x.x"},{"content":"Premise Over the past couple of months, I was burned out from many life events happening out of my control. During that time period, I did not have the capacity to much work on any open source project or my rendering engine. At any kind of mild inconvenience of a challenge, I struggled to keep my motivation up.\nI needed to do something somewhat mechanical and creative, so I picked up how to read music sheets again. I grew up learning how to play woodwind instruments like clarinet/saxophone but dropped it once I hit college.\nI don\u0026rsquo;t have access to woodwind instruments like before, but DAW (digital audio workstations) do exist so, I looked into software like:\nReaper FL Studio However, these are paid software and I needed free and open source due to being on a budget. Luckily, I came across LMMS, which fit my needs exactly!\nThe software itself is intuitive to use. You click on the notes and the duration of the notes you want to play. I chose to learn how to read piano sheets and found community contributed soundfont files of grand pianos.\nLearning how to read piano sheets is not so terribly different from woodwind instruments. You still have the bass and treble cleffs, but a wider range of octaves. Learning and recognizing the octaves is probably the most difficult part of the process, because I would often confuse the octave I am in. After messing around with the software blindly and going through a few weeks of reading the music sheet for Megaman Zero 3: Cannonball, I finally got the rendition finished!\nI am working on my next piece, still from the Megaman Zero series, Trail on a Powdery Snow!\nSome small updates I am hosting some of the music I am writing on Soundcloud now!\n","permalink":"https://psuong.github.io/posts/relearning-music-and-cannonball/","summary":"Relearning how to read music","title":"Relearning Music and Cannonball!"},{"content":"A little while ago I wrote a small client, binget, formerly called LspManager, to automate pulling the latest binaries from Github Releases from repos I mainly use. This was mainly to pull debuggers and LSPs executables because of my setup with Neovim.\nI wrote this in C# because I wanted to\na. Do more C# in a .NET environment I\u0026rsquo;ve mainly been doing mono with Unity for the longest time, which is a slightly different environment. If I were to create DLLs, they would strictly target C# 9 and .NET 2.1 Standard. (I was being really patient with CoreCLR integration in Unity but it looks like it\u0026rsquo;s taking longer, understandably.) On a side note, I am doing a lot of .NET 8 (and .NET Standard 2.1) dlls for games! (I\u0026rsquo;ll be dabbling with Vulkan/OpenGL for C#. Of course, depending on how much time I have.) b. Play around with NativeAOT compilation pipeline. I would only create Native DLLs with C++ and Rust and interop them C#. Although fun, sometimes I don\u0026rsquo;t want to create the bindings manually and I haven\u0026rsquo;t had the time to look into an automated process yet (or build one). c. Although not exclusive to C#, I also wanted to play with Github actions. Being in games, I often work with custom pipelines that are not usually on Github. So what does binget do? binget reads from a config.toml that you supply. There you would define\nthe base url to download from, the repositories to get the contents the target you actually want An example would be the following:\nurl = \u0026#34;https://api.github.com/repos/\u0026#34; destination = \u0026#34;your-destination-path\u0026#34; [[repositories]] name = \u0026#34;OmniSharp/omnisharp-roslyn\u0026#34; target = \u0026#34;omnisharp-win-x64.zip\u0026#34; display = \u0026#34;omnisharp\u0026#34; [[repositories]] name = \u0026#34;LuaLS/lua-language-server\u0026#34; target = \u0026#34;win32-x64.zip\u0026#34; display = \u0026#34;lua\u0026#34; [[repositories]] name = \u0026#34;shader-slang/slang\u0026#34; target = \u0026#34;windows-x86_64.zip\u0026#34; display = \u0026#34;slang\u0026#34; You would execute binget.exe /path/to/your/config.toml and would get a screen similar to the following in your terminal:\n➜ .\\binget.exe .\\config.toml [Url]: https://api.github.com/repos/OmniSharp/omnisharp-roslyn/releases/latest, [Target]: omnisharp-win-x64.zip, [Zip]: \\language-servers\\omnisharp-win-x64.zip ██████████████████████████████████████████████████ 100.0% - https://github.com/OmniSharp/omnisharp-roslyn/releases/download/v1.39.13/omnisharp-win-x64.zip.zip Cleaned up zip and extracted to: \\language-servers\\omnisharp [Url]: https://api.github.com/repos/LuaLS/lua-language-server/releases/latest, [Target]: win32-x64.zip, [Zip]: \\language-servers\\lua-language-server-3.13.6-win32-x64.zip ██████████████████████████████████████████████████ 100.0% - https://github.com/LuaLS/lua-language-server/releases/download/3.13.6/lua-language-server-3.13.6-win32-x64.zip Cleaned up zip and extracted to: \\language-servers\\lua [Url]: https://api.github.com/repos/shader-slang/slang/releases/latest, [Target]: windows-x86_64.zip, [Zip]: \\language-servers\\slang-2025.6.1-windows-x86_64.zip ██████████████████████████████████████████████████ 100.0% - https://github.com/shader-slang/slang/releases/download/v2025.6.1/slang-2025.6.1-windows-x86_64.zip Cleaned up zip and extracted to: \\language-servers\\slang Now this utility is supposed to kept pretty minimal, so versioning is not supported, I just pull the latest. Since the utility pipes everything to console, I kept the console logic pretty minimal too. I.e, if I am outputting too much for a single console to contain, I just leave don\u0026rsquo;t output the content that\u0026rsquo;s offscreen.\n","permalink":"https://psuong.github.io/posts/binget/","summary":"Building a cli to grab releases from Github.","title":"binget"},{"content":"Not too long ago, I read Sebastian\u0026rsquo;s blog post, Programming Without Friction and I was also in the need to try and practice Vulkan. In the same fashion, I started building out my own finance tool using egui, winit, and vulkan-ash.\nI have had some experience trying to build out a vulkan app in C++ first and through my attempts of my own game engine, but that effort is inconsistent due to the usual reasons of life. So, I needed something with smaller effort and started to work on my own opiniated CSV editor for my own finance. While Google Sheets, LibreOffice Calc, Excel all exist and works, it won\u0026rsquo;t fit my need of building something small and getting more comfortable rewriting Vulkan code.\nAfter a few nights of exploring egui\u0026rsquo;s APIs and looking how to get the mesh data, I ended up getting something working quite nicely.\nSome features, I ended up going with are (left to right based on the screenshot).\nSide Panel loading/saving csv files adding/removing rows filtering by month and/or category (pretty happy with this one, I\u0026rsquo;m just using bit flags to figure out how to filter) editing the categories Central Panel main table with clickable rows, drag and drop, editing values in the csv Right panel quick summary to view stats (WIP) Eventually, I want to explore plotting so I can visualize data from my CSV. Like I said, all of this I can do already in any off the shelf CSV editor, but this is more fun for me. I even ended up with a template I can continuously fork to create small apps that run at 60 fps. It doesn\u0026rsquo;t support things like images yet, mainly because I don\u0026rsquo;t have a need to load and display images, but if I do, I can always update the template.\n","permalink":"https://psuong.github.io/posts/minimal-vulkan-template/","summary":"Writing my own template for app creation and having fun doing so","title":"Minimal Vulkan Template"},{"content":"\nAsset Link\nBackground I needed a way to quickly draw functional UI for debugging purposes that\nwas a static API (no inheritance) seamless with MonoBehaviours or any Entity Component System (DOTS or any Third Party system) high performance With those needs, I ended up building NimGui over time as my internal go to library. Many of the inspirations came from DearImGui and eGui. While interopting those libraries was an option, I wanted something that was primarily C# and easy to install.\nMost details of the implementation and architecture can be found at the documentation website.\n","permalink":"https://psuong.github.io/posts/nimgui/","summary":"NimGui, a 1 draw call ImGui for Unity","title":"NimGui Brief"},{"content":"Scaffolding in Development So I preferably enjoy working with low level APIs instead of high level APIs. The main reason behind that is the amount of control I have as a developer, especially on creating the functionality I need. So if there is an alternative API which provides a lower level solution than a high level API which does exactly what I need…\nI would still go for the lower level solution, even if I have to recreate the same functionality as the high level API.\nNow truthfully, that sounds like I’m just redoing the same work for the same functionality I need. But let’s step back a little bit and think about some of the benefits of a lower level API.\nScaffolding A low level API which allows you to chain functions together to create the desired outcome you need provides a scaffold.\nScaffolds in construction are temporary structures to aid in the construction or repair of a building or structure. But as a bystander you can clearly see how construction workers are constructing the building and their methodology. Take a look at the image of a bamboo scaffold used in Hong Kong below, you can clearly see how workers are going about the billboard.\nImage credit goes to Wikipedia, with photo taken by Greg Hume So relating back to development, scaffolds can not only give you the guidelines to create a high level API, but also the logical reasoning and the specific data you’ll need to solve the problem you have! An API/framework that provides this is invaluable to you as a developer!\nA Common Scenario throughout Development Imagine as your developing a feature using some API. Now this API gives you an out of the box solution which works and solves the problem you’re trying to solve with a single function! Now that’s a whole lot of time saved and you can now move onto the next feature.\nBut\u0026hellip; some time down the line you need to tweak a functionality within the API to allow you do to do something a bit more grand. You look through StackOverflow, a forum, or Github issues to get some kind of idea on how to tweak the API’s pipeline, but then you realize that currently there is no way to solve your particular solution and the developer(s) of said API wouldn’t support said feature until X months later.\nIt’s a terrible situation to be in and you’ll likely plan accordingly to compensate for the situation.\nConclusion Now if you’re an API designer, you should not only think about the high level functionalities your developers will likely use. You should still support low level operations such that developers can really extend your API and make something unique you’ve never even thought of supporting!\nVisibility in the framework encourages that developers care about what they’re using!\nThus, a good API is one that can be used multiple times in various similar situations to solve problems many developers face.\n","permalink":"https://psuong.github.io/posts/scaffolding-in-development/","summary":"Thoughts on development","title":"Scaffolding in Development"},{"content":"Over the last decade, I\u0026rsquo;ve worked on a various number of projects professionally.\nSenior Unity Engineer @ Decoy Games Developed a non photorealistic shader to render characters in DOTS graphics with procedural rim lighting, emission blending, and gradient ramping for in game cinematics. Developed a selective post processing effect to target specific rendering layers with depth testing to avoid incorrect depth sorting of post processed layers. Optimized render pipeline by 30% to maintain 6-7 ms render times on a NVIDIA GTX 1080TI by reducing the total number of temporary render textures and read/writes to those textures. Developed custom animation timeline with scrubbing controls using Yoga flexbox allowing multiple artists to simultaneously edit timelines and reduce complex merge conflicts. Cofounder of InitialPrefabs, LLC Co-founded with my brother in June 2016, where we did consulting work for the following companies. Developed NimGui, a 1 draw call user interface to allow developers to draw using an immediate mode API. NimGui processes 20k vertices in 0.38 ms/frame on a Ryzen 5 5600. Integrated font packing with MSDF in Rust interoping with C# to reduce font atlas disk size by 30% and improve atlas generation times by 2x via lockless multithreading to a single image. Developing a TaskGraph in C99 with an API similar to Unity’s Job System, work stealing, cyclic dependency prevention, and automated bindings to other languages via Cpp.AST.NET. PHYND Developed C# \u0026amp; C++ SDK to support Unity Game Engine (v2017LTS -\u0026gt; 6.0LTS) and Unreal Engine (v4.6 -\u0026gt; v6.1) enabling low latency in-game video/audio cloud streaming on a Ryzen 5 5600 (2.5ms time frame). The Feast Developed a custom deferred non physically based render (NPBR) pipeline in URP allowing better scalability when authoring many spot lights. Developed custom Amplify shader templates to Developed a procedural spot light system using indirect rendering to visualize enemy detection range. Developed a runtime CPU culling system using spatial maps for interior levels allowing unnecessary objects to be culled reducing frametime from 8ms to 5ms on a NVIDIA GTX 1080. Cell To Singularity Developed a backward compatible save game schema to replace the existing save game schema allowing players to have multiple saves and to rollback their existing save to an earlier version. ESC Game Theater (Defunct) Developed a customize rendering system to allow ESC Game Theater to render thousands and millions of sprites via WebGL on stadium jumbotrons Metamorphosis Games Developed an hierarchical finite state machine (HFSM) to allow the game designers to author more complex behaviours using a node like system. Glued behaviour states to override the animation\u0026rsquo;s state machine allowing animations to blend consistently. VrWiz (Defunct) Developed a pipeline to trim Unity\u0026rsquo;s terrain system and bake it as a custom mesh to draw with indirect rendering Developed a procedural tree system allowing the player to design their own tree and use that tree to draw indirectly through out the entire world. Developed custom Blinn-Phong shaders using LUTs and reduced render texture allocations on runtime to optimize the frame time to run at 72 FPS on the Oculus Quest. KungFu Kickball Trained machine learned agents to play KungFu Kickball in order to fill a lobby with feasible and believable bots instead of using behaviour trees to design the behaviors. Mokuni Games Developed procedural level generation reducing the amount of time spent designing reasonable levels for Kitty in the Box 2. Developed a force and penetration detection system for Kitty in the Box VR on the HTC Vive. This prevents the virtual hands from clipping directly into the the main character\u0026rsquo;s body. Developed an efficient navigation sampling system to allow NPCs to quickly navigate between platforms. Metis Suns Developed a visualization system to display the state of BoB\u0026rsquo;s individual thought nodes. Developed a dampening system to normalize force to ensure that BoB\u0026rsquo;s individual nodes do not violently react under extreme pressure. Developed a pipeline to store control attendee inputs to help normalize the forces from attendees. Developed a neural network based utility theory system allowing NPCs to constantly evaluate needs with multi agent coordination/support for Emissary in the Squat of Gods. Developed an node based graph editor allowing designers to develop agent sensors and behaviours with minimal inputs from the developers for Emissary in the Squat of Gods. Software Engineer \u0026amp; Technical Writer @ Thousand Ant At Thousand Ant, I was a technical writer and software engineer helping other companies build technical demos and writing easy to digest technical documentations. Kart Microgame My team and I were responsible for updating Unity\u0026rsquo;s Kart Microgame to match more modern arcades. Some features I contributed to the project include:\nNew game modes Mobile WebGL optimizations for low end phones Optimized a 35ms runtime on Samsung S6, iPhone6s, \u0026amp; Google Pixel 1 to 18 ms Please visit the link here to test the game on mobile ML Agents integration (check out the video below) Asset Store Link\nHyperCastle Developed an SVG parser to parse all unique unicodes and pack them efficiently on runtime. Developed a custom glyph renderer to draw all glyphs within the SVG with culling support in orthographic and perspective mode for efficient rendering. Tutorials for Unity Below are a bunch of video tutorials I have written the scripts and recording to. Narration was done by a professional voice actor.\nFlocking with the C# Job System C# Job System: Using DOTS with Managed C# APIs Bolt Adaptive Performance Physics Optimizations Shader Graph Feature Video Editor Scripting with UI Toolkit Scriptable Objects Tutorial Kart Microgame Updates \u0026amp; Video Device Simulator Tutorials for Genvid Technologies Genvid provides a streaming engine solution to help interface Twitch viewers with the game they are viewing by allowing interactions between the viewers and streamers through customize interfaces!\n","permalink":"https://psuong.github.io/works/","summary":"\u003cp\u003eOver the last decade, I\u0026rsquo;ve worked on a various number of projects professionally.\u003c/p\u003e\n\u003ch1 id=\"senior-unity-engineer--decoy-games\"\u003eSenior Unity Engineer @ Decoy Games\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eDeveloped a non photorealistic shader to render characters in DOTS graphics with procedural rim lighting,\nemission blending, and gradient ramping for in game cinematics.\u003c/li\u003e\n\u003cli\u003eDeveloped a selective post processing effect to target specific rendering layers with depth testing\nto avoid incorrect depth sorting of post processed layers.\u003c/li\u003e\n\u003cli\u003eOptimized render pipeline by 30% to maintain 6-7 ms render times on a NVIDIA GTX 1080TI by reducing the\ntotal number of temporary render textures and read/writes to those textures.\u003c/li\u003e\n\u003cli\u003eDeveloped custom animation timeline with scrubbing controls using Yoga flexbox allowing multiple artists\nto simultaneously edit timelines and reduce complex merge conflicts.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"cofounder-of-initialprefabs-llc\"\u003eCofounder of InitialPrefabs, LLC\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eCo-founded with my brother in June 2016, where we did consulting work for the following companies.\u003c/li\u003e\n\u003cli\u003eDeveloped \u003ca href=\"https://initialprefabs.gitlab.io/imgui.book/\"\u003eNimGui\u003c/a\u003e, a 1 draw call user interface to\nallow developers to draw using an immediate mode API. NimGui processes 20k vertices in 0.38 ms/frame\non a Ryzen 5 5600.\u003c/li\u003e\n\u003cli\u003eIntegrated \u003ca href=\"https://github.com/InitialPrefabs/InitialPrefabs.Msdf\"\u003efont packing with MSDF\u003c/a\u003e in Rust\ninteroping with C# to reduce font atlas disk size by 30% and improve atlas generation times by 2x\nvia lockless multithreading to a single image.\u003c/li\u003e\n\u003cli\u003eDeveloping a \u003ca href=\"https://initialprefabs.com/tools/c-taskgraph/\"\u003eTaskGraph\u003c/a\u003e in C99 with an API similar\nto Unity’s Job System, work stealing, cyclic dependency prevention, and automated bindings to other\nlanguages via Cpp.AST.NET.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"phynd\"\u003ePHYND\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDeveloped C# \u0026amp; C++ SDK to support Unity Game Engine (v2017LTS -\u0026gt; 6.0LTS) and Unreal Engine\n(v4.6 -\u0026gt; v6.1) enabling low latency in-game video/audio cloud streaming on a Ryzen 5 5600\n(2.5ms time frame).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"the-feast\"\u003eThe Feast\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDeveloped a custom deferred non physically based render (NPBR) pipeline in URP allowing\nbetter scalability when authoring many spot lights.\u003c/li\u003e\n\u003cli\u003eDeveloped custom Amplify shader templates to\u003c/li\u003e\n\u003cli\u003eDeveloped a procedural spot light system using indirect rendering to visualize enemy detection range.\u003c/li\u003e\n\u003cli\u003eDeveloped a runtime CPU culling system using spatial maps for interior levels allowing unnecessary\nobjects to be culled reducing frametime from 8ms to 5ms on a NVIDIA GTX 1080.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"cell-to-singularity\"\u003eCell To Singularity\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDeveloped a backward compatible save game schema to replace the existing save game schema allowing\nplayers to have multiple saves and to rollback their existing save to an earlier version.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"esc-game-theater-defunct\"\u003eESC Game Theater (Defunct)\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDeveloped a customize rendering system to allow ESC Game Theater to render thousands and millions\nof sprites via WebGL on stadium jumbotrons\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"metamorphosis-games\"\u003eMetamorphosis Games\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDeveloped an hierarchical finite state machine (HFSM) to allow the game designers to author more\ncomplex behaviours using a node like system.\u003c/li\u003e\n\u003cli\u003eGlued behaviour states to override the animation\u0026rsquo;s state machine allowing animations to blend\nconsistently.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"vrwiz-defunct\"\u003eVrWiz (Defunct)\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDeveloped a pipeline to trim Unity\u0026rsquo;s terrain system and bake it as a custom mesh to draw\nwith indirect rendering\u003c/li\u003e\n\u003cli\u003eDeveloped a procedural tree system allowing the player to design their own tree and use that tree\nto draw indirectly through out the entire world.\u003c/li\u003e\n\u003cli\u003eDeveloped custom Blinn-Phong shaders using LUTs and reduced render texture allocations on runtime\nto optimize the frame time to run at 72 FPS on the Oculus Quest.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"kungfu-kickball\"\u003eKungFu Kickball\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eTrained machine learned agents to play KungFu Kickball in order to fill a lobby with feasible and\nbelievable bots instead of using behaviour trees to design the behaviors.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"mokuni-games\"\u003eMokuni Games\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDeveloped procedural level generation reducing the amount of time spent designing reasonable levels\nfor Kitty in the Box 2.\u003c/li\u003e\n\u003cli\u003eDeveloped a force and penetration detection system for Kitty in the Box VR on the HTC Vive. This\nprevents the virtual hands from clipping directly into the the main character\u0026rsquo;s body.\u003c/li\u003e\n\u003cli\u003eDeveloped an efficient navigation sampling system to allow NPCs to quickly navigate between\nplatforms.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"metis-suns\"\u003eMetis Suns\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDeveloped a visualization system to display the state of BoB\u0026rsquo;s individual thought nodes.\u003c/li\u003e\n\u003cli\u003eDeveloped a dampening system to normalize force to ensure that BoB\u0026rsquo;s individual nodes do not\nviolently react under extreme pressure.\n\u003cul\u003e\n\u003cli\u003eDeveloped a pipeline to store control attendee inputs to help normalize the forces from attendees.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eDeveloped a neural network based utility theory system allowing NPCs to constantly evaluate needs\nwith multi agent coordination/support for Emissary in the Squat of Gods.\u003c/li\u003e\n\u003cli\u003eDeveloped an node based graph editor allowing designers to develop agent sensors and behaviours\nwith minimal inputs from the developers for Emissary in the Squat of Gods.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"software-engineer--technical-writer--thousand-ant\"\u003eSoftware Engineer \u0026amp; Technical Writer @ Thousand Ant\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eAt Thousand Ant, I was a technical writer and software engineer helping other companies build\ntechnical demos and writing easy to digest technical documentations.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"kart\"\u003eKart Microgame\u003c/h2\u003e\n\u003cp\u003eMy team and I were responsible for updating Unity\u0026rsquo;s Kart Microgame to match more modern arcades. Some\nfeatures I contributed to the project include:\u003c/p\u003e","title":"My Works"},{"content":"Personal Projects A bunch of open source projects I\u0026rsquo;ve developed/contributed to.\nBinGet BinGet is a tiny little package manager I wrote for myself in C#. It is a 8.78MB binary that reads a configuration toml file to pull archives/binaries from Github. It can list packages, install/update packages, and perform version \u0026amp; checksum checking.\nDocGen DocGen is a documentation generator that reads and parses docstrings from source code to generate documentation in markdown.The project is written in .NET 10 and currently supports parsing languages such as C and C#. An example of the documentation generated can be viewed here.\nMinimal Vulkan GUI Template I wanted to create some really quick apps with an imgui rendering for my UI. This project mainly serves as a template for quick rust apps.\nC# Stackalloc Collections I wanted to write a library that let\u0026rsquo;s me create per frame data structures without needing to allocate on the heap. Right now it supports the following data structures: bit array, list, queue, priority queue, hashset, and hashmap.\nImportOverrides Import Overrides is a custom gui that aims to enhance the import pipeline. When importing Textures through a custom asset post processor, you often have to set the texture settings yourself manually through code. If you\u0026rsquo;re aiming to create a visual importer, you would need to write the GUI yourself. This package provides the GUI by default to TextureImporterSettings and TextureImporterPlatformSettings allowing you to create your own visual scriptable import pipeline.\nInitialPrefabs.Msdf This is an implementation of MSDF Font Rendering. This allows for crispy sharp fonts at a fraction of the size compared to SDF rendering. SDF rendering does provide effects such as a glowing effect which MSDF loses out on, but that can be remedied by providing an SDF field to the Alpha channel.\nThis repo shows how to render a glyph orthographically, but does not provide text layout. Italics and bold also do not exist at the moment. This work exists to integrate with my custom 1 draw call ui: Nimgui.\n","permalink":"https://psuong.github.io/projects/","summary":"projects","title":"Projects"}]