a modern 3D modeling tool designed for game developers

About Half-Edge


Half-Edge aims to be the Procreate of 3D modeling - a lightweight, intuitive, polished tool, obsessively focused on its target audience, instead of trying to appeal to everyone

Thesis

None of the mainstream 3D modeling tools, are made for game developers

We've been stuck using massive software, with years of baggage, whether it's the prohibitively expensive Maya or 3Ds max, or even the wonderful open source tool Blender - what we need as game devs is often just an afterthought, at best. I think you deserve a UV editor that doesn't make you hate yourself. I think it's annoying to have to wade through several aircraft panels of buttons, only to find sub-par, overengineered features, that only gets you halfway there. Really, opening up and editing a model should be as simple as opening a text document

Tech

Half-Edge is being created in Unity, the game engine.

  • Written primarily in C#, using Unity's burst compiler and the parallel job system for performance critical paths, such as the mesh generator
  • I make heavy use of compute shaders, written in HLSL, where tens of thousands of elements are involved, to get real-time performance for things like box selections
  • The polygonal meshing engine is written entirely from scratch, with my own half-edge based data structure, math libraries, and mesh generation, mesh manipulation operations, and more. (This is simply because I'm a math nerd and I love these challenges)

Business model

The current plan is to release it with a one-time payment of around $100/$150 or so, for a commercial indie license. Probably on either Steam and/or itch.io!

A subscription model isn't good for this project, first because I don't like them as a consumer, and second, it would imply ongoing technical support, which is hard for me to promise as a solo developer on this project!

Read more
Filters

Recent Activity

implemented half-edge box selection in &half-edge !

View original message on Discord

I've done so many boring backend plumbing things with &half-edge of late so the only visually interesting thing I have done is having implemented camera zoom :pensivebread:

View original message on Discord

been experimenting with making a tabbed interface for &half-edge ! It's just the UI right now, but this is one of those things that would make it feel a lot more modern compared to the big established modeling tools, where every time you want to open a new model, you have to decide whether to save or discard whatever you already have open. tabs like this would let you work much more fluently in terms of UX, something I'm prioritizing a lot with this tool!

View original message on Discord

iterated a little more on the &half-edge logo! I kinda like this one!

View original message on Discord

got the standalone build of &half-edge looking fancy with a custom titlebar!! i had to go to win32 hell and back as some of you might've seen in #workspace, to support all the windows features, but it finally works well :SCWblushHEART:

View original message on Discord

okay I know using unity's UI system is like, the opposite vibe of handmade, but I'm really happy with the progress setting up the UI for &half-edge :heart_cat:
I finally tried their UITK, and it's actually pretty dang nice so far! It's very web-like, for better or worse, but it made me jump into that quick iteration web dev mode where you can just refresh and immediately see changes, which, I didn't think they'd pull off! maybe I had low expectations but, so far it's been nice! The big thing that remains to be seen is how well I can capture input and add all my custom handles into this, since all of that was done with the legacy IMGUI. ~~and also figuring out how to hook into win32 APIs from C# to get borderless windowed with proper resize controls and drop shadow when not full screen and all that which I'm not looking forward to :SCWWcrying: ~~

View original message on Discord

got trackball rotation for the rotation gizmo in &half-edge working now! lots of quaternion math today, which was fun!

there are a few things that made this an interesting case to implement:

  1. all my handles cache the initial state when you start dragging, and then only add a delta. this is useful to prevent the kind of drifting/precision loss you sometimes see in certain gizmos when you only ever apply a per-frame delta, which will accumulate error. unreal's rotation gizmo had this issue, for example
  2. in this case, unlike the per-axis rotation, I still do need a cumulative delta

given these constraints, there were lots of space transformation with quaternions I had to do which was kind fun to brush up on and finally grok more properly, so I wrote down some quaternion notes which might be useful to others too! my solution was basically:

  • on start drag, cache the current world space quaternion rotation w
  • the mouse pixel delta is divided by the radius (in pixels) of the gizmo, which makes it so that the distance you move the cursor, also corresponds to the radians you want to rotate by, thanks to radians being 1:1 with arc length (yay radians :heart_cat: )
  • the magnitude of this scaled delta is the angle, and the axis of rotation is a perpendicular vector to this direction, which is a simple (-y,x) or (y,-x) swizzle
  • from this, we can construct a quaternion representing a per-frame delta rotation, as a camera space quaternion
  • this is then accumulated in another camera space quaternion, by composition delta = frameDelta * delta, the order here ensuring delta is applied in the extrinsic space (swapping them would apply the rotation in the frameDelta's own intrinsic axes, which is, not what we want)
  • then, in order to calculate the final rotation, we need to transform our camera space rotation delta, and apply it to a world space rotation. In other words, we want to transform the delta rotation as an intrinsic rotation applied to the camera's rotation c, but as an extrinsic (world space) rotation.
  • I did a bunch of math today, and basically it ends up being
    c * delta * c.conjugate(), which, as applied to our initial cached world space starting orientation w, we get
    c * delta * c.conjugate() * w, aaaand then it works!

thanks for coming to my ted talk :henlo:

View original message on Discord

got the rotation gizmo for &half-edge functional now! it uh, was a little broken bc I forgot to normalize a vector but now it's working c:

View original message on Discord

finally been able to do more work on the transform gizmo for &half-edge (really bad timing on that apartment move :SCWWcrying:). I've now got basic handle mouseover detection going, and migrated the handles to be less coupled with the IMGUI loop! the things up next are:

  • adding interactivity, to drag these cones for linear movement
  • adding the lines for the arrows, so it's not just arrowheads
  • adding planar handles for xy/yz/zx movement, and their interactions
  • optionally adding modifiers like precision movement, as well as camera-plane dragging!
View original message on Discord

I'm gonna make a transform gizmo for my 3D modeling tool (tentatively called &half-edge ) for wheel reinvention jam! as with most things in life, it always starts with working out the math for intersection testing a cone in the fragment shader of a quad

View original message on Discord