goo3d

Game Overdrive On 3D. The 3D half of the good engine: transforms, hierarchy and the camera, on the same kernel goo2d runs on.

There is no renderer yet, and this package does not pretend otherwise. Meshes, materials, lights and the draw path are not written. What is here is everything underneath them, which is maths and columns and needs no GPU.

What a prefab looks like

An entity kind is a struct of columns, and [entity] indexes a row in one:

import 'package:goo3d/goo3d.dart';

class Crate extends EntityStruct with Transform3D, WorldTransform3D, Child {}
crate.transformOffsetY[entity] += 2.0;             // +Y is up

entity<Transform3D>().setEuler(yaw: 0.5);          // radians, about +Y
entity<Transform3D>().lookAt(0, 0, 0);             // points its -Z at a point
final aim = entity<Transform3D>().forwardX;

Columns are read and written through the prefab; everything you do with them hangs off entity<Transform3D>(), a view of the entity that costs nothing - it erases to the entity handle, which erases to an int.

Position, scale and rotation are separate columns - never a matrix. Rotation is a quaternion in four of them, so combining a parent's turn with a child's does not gimbal-lock, and nothing asks you to type one: setEuler and lookAt write the four columns, and yaw/pitch/roll and the forward/right/up getters read them back.

The hierarchy

Child and Parent come from the kernel and are shared with 2D:

scene.parent(wheel, of: car);

WorldTransform3DSystem walks parents before children once per fixed tick and writes worldX/worldY/worldZ, the world quaternion and the world scale. Anything reading those must be ordered after it, or it reads last tick's answer.

WorldTransform3D is opt-in. An entity that is never parented has world equal to local by construction, and declaring it without the world columns means the composition pass never touches it.

Which way is up

Right-handed, +Y up, -Z forward - what glTF uses, so a mesh exported from Blender arrives oriented correctly. goo2d puts +Y up too, so a system that moves something upward moves it upward in either dimension.

Status

Not on pub.dev yet. The renderer is tracked as its own issue, and this package lands there before it is published.

Libraries

goo3d
The 3D good engine.