Avatar
Hi! I'm Udayshankar, Unity/C# dev, OSS dev, and other stuff. CTO, http://uralstech.in.

it's been HOW long?!

Has it really been… EIGHT MONTHS????

yeah… so like i wanted to keep the blog updated like every month but, welll, here we are.

most of my posts have been about ‘something’, like a project, or a topic, or an update about a project, but since this isn’t really about any specific topic, im not sure what i should write here.

i guess i’ll do a review of what’s been going on since the last post.

UXR.QuestCamera

it’s gotten 2 rewrites since november, with version 4.0.0 just released hours ago. imho it’s actually been one of the most interesting projects i’ve worked on to date.

like how ezrSquared really made me think about how programming languages work and helped me learn more about C#, this helped me learn more about kotlin, the broader android ‘ecosystem’, compute shaders, C++, OpenGL and the JNI.

it’s really been quite a mixed bag and i think i love it for that.

UXR.QuestMeshing

this is another project i like a lot. similar to UXR.QuestCamera, this project rose from the need of a new feature in hAI! MR. we wanted an AR environment, which wouldn’t require going through Meta’s Space Setup, while still providing interactivity with the avatars. they should be able to sit down, lie down, follow you, all without needing a scan from Meta.

the solution was to create a scan of the environment in real-time! the project is heavily inspired by Julian Triveri’s Lasertag, which is completely open-source!

the project doesn’t actually contain many public apis. it is mainly two scripts (and a compute shader), one which preprocesses frames from the Depth API, and acts as a replacement for Meta’s EnvironmentDepthManager (as it doesn’t expose information needed for the next script), and a script which populates a TSDF volume with the depth data and generates a mesh out of it. it can also create and bake a meshcollider from said mesh, and also update the scene’s navmesh at runtime.

i decided to use surface nets to generate the mesh as it created simpler meshes by default when compared to an algorithm like marching cubes. the implementation is inspired by this repo by Quoc-Minh Ton-That.

UAI.LiteRTLM

LiteRT-LM is a framework for running LLMs packaged in the LiteRT format (previously known as TFLite), made by Google. it’s quite good. actually, it’s really good, especially as of recently. i think it may eventually lead to local LLMs being used by android apps, unlike whatever google is/was doing with gemini nano.

i’m even able to run gemma 4 on my quest 3 while also running hAI! in VR! isn’t that crazy? on top of that, i’m recording the entire thing. it still manages to run quite fast.

now, i have to add that this is still really early stuff. my own experience with converting a model to LiteRT, then packaging it for LiteRT-LM, didn’t yield the best results, in fact, it was barely coherent. of course, it could have been something i messed up, but i only followed the steps shown in their repo. another example is how they seemingly still haven’t open sourced the conversion pipeline for gemma 3n.

anyways, i think their foundation is really strong, and they’re doing great work. so obviously, i had to make it work in unity :3

the project is still stuck on LiteRT-LM v0.8.0, so this video is really outdated in terms of performance, but still:

i have to admit though, the current implementation of the package is quite lazy. litert-lm provides a multiplatform C++ api, but i chose to wrap the kotlin wrapper of the C++ api since it was easier. i “plan” to actually work on it… uh… later.

The hAI! MR Model Sideloader

there’s not much to say about this, essentially, readyplayerme shut down -> we needed to replace it in hAI! -> why don’t we allow users to add whatever avatar they want? -> you can now sideload VRM avatars into hAI! using a PC app which transfers the avatar using wifi to your headset. i consider it a neat project but it’s really rushed since i had like 1 month to remove rpm from hAI!.

AvLoader

this is actually related to the Model Sideloader, at least a little bit. before i started working on support for VRM models in hAI!, i decided i wanted a unified api to load (3d) models of different formats and capabilities. that’s how AvLoader came to be, and i’m quite proud of it. in fact, while working on it, i even found a bug in UniVRM!

AvLoader provides what is essentially a fallback-based pipeline, or “flow”, for loading avatars.

you build a flow by first defining which data loaders it should use. the package has two built-in loaders, one which loads from a folder/files, and one which loads from URLs, using UnityWebRequest. users can also create their own loaders, for example, hAI! has a custom loader to download backed-up avatars from Firebase Storage. loaders not only load the binary model, but also a metadata file and optional thumbnails of the avatar.

next, you declare the importers you want to use. the package provides 3, one which uses Unity’s glTFast to load glTF models, one which uses UniGLTF instead, and one for VRM models, using UniVRM. again, users can build their own importers if needed. i actually wanted to add fbx support, but didn’t find any actively maintained Unity packages/plugins for loading fbx models at runtime.

next, you can optionally also add post-processors, both sync and async. the package provides many built in ones, like for assigning an animator controller and avatar, for overriding materials or shaders, and even one which caches models in device storage (useful if you downloaded it from a URL)! there’s even conditional post-processors which run other post-processors based on lambda functions!

finally, there’s also “capabilities”. these are interfaces that expose functionality in imported models “guaranteed” by the importer. that is, they are features created by the importer. the package provides support for UniVRM’s LookAt and Expressions, and glTF blendshapes through capabilities.

UGemini (and UAI.Abstraction)

they’re officially dead. i first archived ugemini as 1- i don’t use it anymore, and 2- google released their GenAI SDK for .NET and the Firebase AI Logic SDK for Unity specifically, which accomplish what ugemini was trying to do.

uai.abstraction is pretty funny. i basically lost all need for it really quickly. the commit history of the repo lasts literally two days (excluding my archive commits). with ugemini was archived, uai.abstraction lost half of whatever utility it had, so i decided to officially archive it.

AIDE-Chip Surrogates

this is actually not at all related to unity, or even C#, it’s an ml project made in python (and partly in c). tldr; the project aims to provide a pipeline to train small, lightweight ml models for predicting the performance (as ipc, instructions per cycle, or cache miss rate) of a given benchmark for a given architecture. the proof-of-concept was trained on a dataset of 15,000 gem5 simulation results, for 6 benchmarks, for a single-core RISC-V processor.

since this is quite different from my other projects, i recommend checking out the repo and linked resources to know more. the code, dataset and trained models are all publicly available.


well, that’s what i’ve been up to on github since the last post. i did exclude one project from having its own entry, “Qwen KCC On-Device Pipeline”, but more so because it didn’t really meet my expectations to deserve a mention, mainly due to the LiteRT-LM conversion issue i talked about.

i felt like i should talk about the games i’ve played recently-ish, so here goes.

Celeste

i completed all c-sides in celeste, and got the moonberry! i even made my steam profile public: https://steamcommunity.com/id/SoullessTomb86/

celeste is such a great game like it’s genuinely imo one of THE top 3 games of all time. the soundtrack is unmatched, and the gameplay is so good it makes me forget i died 20k+ times. i cannot even describe what farewell felt like,,, it’s just something special. anyways here’s me doing old site in 2 minutes 32 seconds

Deadlock

oooh my god. this game. it’s so good. i’m so bad at it. but it is so fun i can’t be mad. i main silver btw, awoo.

i think? i’ve been improving recently? i got my first mvp in a match with actual humans. so that’s something…

i’ll probably keep posting more about deadlock on my x/twitter, idk. i think i’ve yapped enough for now. thanks for reading!

also, lmao the official x publish website generates embeds which still use the twitter.com link

all tags