Katherine 🏳️‍⚧️

@quadraticink.bsky.social

Software Engineer specializing in game engines. Former Cryptic, Crystal Dynamics, Blizzard, et al. If I'm posting/sharing code, it's probably cursed. she/her

The talk I presented at #SIGGRAPH2026 is now available on YouTube, for anyone who couldn’t attend or would like to revisit it :) youtu.be/OFJYBUArVPc?...

Dual Contouring of Signed Distance Data - SIGGRAPH 2026 [Technical paper presentation]

YouTube video by Xiana Carrera

youtu.be

Xiana Carrera@xianacarrera.bsky.social · 2mo ago

1/6 Excited to share our #SIGGRAPH2026 paper, Dual Contouring of Signed Distance Data! We propose a new method for reconstructing sharp meshes from discrete samples of signed distance functions (SDFs) that does not require gradients. Project page: gatc.cs.columbia.edu/projects/dua...

Animation folks that are looking for work currently, or in the next few weeks, I have a lead on an Adult Animation/Action/Superhero show staffing up soon: BG Layout - mid level Blender knowledge needed Prop 2d FX Char Design Feel free to drop portfolio links below, and I will send them along to AD

Hi everyone, today me and 22 others at Double Fine were hit by layoffs today. All the people who lost their jobs today care so much about the games they make and the people they work with. If anyone is looking for a tools SE with 7 years of experience and who brings baked goods on Mondays lmk.

C++26 is a helluva drug. I'm doing some work with Godot Extensions, and I was thinking, there got to be a better way than copying functions from header over to the API struct... Well, yeah, with 26 there is. Need to do some string formatting to go from type name to function name, but otherwise...

#include <meta>
#include <print>
#include <string_view>
#include <utility>
#include <vector>

namespace impl_api // Using a namespace wrapper to clearly identify import targets.
{
    // Say, included from api.h
    typedef int (*IdentityInt)(int);
    typedef int (*AddTwoInts)(int, int);
    typedef float (*IdentityFloat)(float);
    typedef float (*AddTwoFloats)(float, float);
}

// Purely for demonstration. Fakes loading from a dynamic library.
template <typename R, typename... Args>
void LoadFunction(R(**func)(Args...), std::string_view name)
{
    std::println("Loading {}...", name);
    *func = +[](Args... args)->R { return (args + ...); };
}

auto LoadApi()
{
    struct Api;
    consteval
    {
        constexpr auto ctx = std::meta::access_context::current();
        static constexpr auto infos = std::define_static_array(std::meta::members_of(^^impl_api, ctx));
        std::vector<std::meta::info> specs;
        template for (constexpr auto info : infos)
        {
            specs.push_back(std::meta::data_member_spec(info, { .name = std::meta::identifier_of(info) }));
        }
        std::meta::define_aggregate(^^Api, specs);
    }

    Api api;
    constexpr auto ctx = std::meta::access_context::current();
    static constexpr auto infos = std::define_static_array(std::meta::nonstatic_data_members_of(^^Api, ctx));
    template for (constexpr auto info : infos)
    {
        LoadFunction(&api.[:info:], std::meta::identifier_of(info));
    }

    return api;
}

int main()
{
    auto api = LoadApi();

    std::println();
    std::println("{}", api.IdentityInt(42));
    std::println("{}", api.AddTwoInts(6, 7));
    std::println("{}", api.IdentityFloat(3.14f));
    std::println("{}", api.AddTwoFloats(2.7f, 0.01828f));

    return 0;
}Program stdout

Loading IdentityInt...
Loading AddTwoInts...
Loading IdentityFloat...
Loading AddTwoFloats...

42
13
3.14
2.71828

With a caveat. If you have any sort of a grid, it's really easy to end up with visible striping with a bad choice of a generator. So specifically for populating vegetation in an open world, for example, you need to make sure you have good entropy.

loren schmidt@lorenschmidt.bsky.social · 2w ago

advice for programmers: for most procedural generation you don't actually need "good" number generators! use whatever you like. it doesn't have to be cryptographically secure, it's the x, y position of a cactus.

Not quite ready to share the game itself yet, but here's a bit of an almost-tangent work. I wanted to have a bit more flexibility on building out dynamic music in Godot and went with, "I'll just roll my own," route. This is 100% synth, but realistically, I'll likely end up using samples. #gamedev

Just finished playing The Mermaid Mask last night. (Early this morning? I might have stayed up too late with it.) It is a fantastic modern point-and-click. The art, story, and voice acting are great, and the puzzles, while on the easier side, are enjoyable. I highly recommend the game.

Adam Vian@sfbdim.bsky.social · 3w ago

🪸The Mermaid Mask🪸 is OUT NOW on Steam, Switch 1 and Switch 2 - and hopefully very soon on PS5! A murder-mystery detective adventure aboard the world's strangest submarine...

Getting publishing for indy games has never been easy, but it feels like it's gotten worse lately, with publishers expecting production polish on vertical slices. Which really sucks if you don't have an artist. I've been thinking lately, is barter viable? Asking gamedev moots. Will code for art. 😸

CALLING ALL LOW BUDGET INDIE GAMES‼️ We're gathering games interested in participating in a "Low Budget, Big Heart" Steam Festival! 💰Self Published, Self Funded 🤏Under ~50k budget 🚫NO AI if you're interested in the festival sign up here: forms.gle/cndDrEf4rxiL... rts appreciated :)

Low Budget, Big Heart Steam Festival interest form

We're looking for interested developers of low budget games to participate in our potential steam festival! Self published/self funded games are also welcome. If your game had a development budget ov...

forms.gle

🪸The Mermaid Mask🪸 is OUT NOW on Steam, Switch 1 and Switch 2 - and hopefully very soon on PS5! A murder-mystery detective adventure aboard the world's strangest submarine...