A UGC (User-Generated-Content) Node Graph Library for S&Box
Nodebox is a reimagining of Wiremod gates from Garry's Mod made in S&Box
Inspired by Unreal Engine'sBlueprints and Resonite's Protoflux
- The
Nodes themselves are separate from any visual/interactive parts - There should be wrappers for them, which provide different visualization/interactions/functionality, etc.
- Currently, only
Node3Dexists, which displays the innerNodevia aWorldPanel(1Node= 1WorldPanel)
- Currently, only
- Each
Nodetype and theirPins have some simple metadata attached to it (Name, Desc, etc.)
Wire3D-Wire3D wrapper (like Node3D)- Colors for
Wire3Ds (orWirein general) - A
Nodetype collection- Search functionality
- A tool to drag around, copy, select and delete
Node3Ds, connect/disconnect pins - Read/Write for
ComponentProperty values - A
Pintype, that acts as a "pulse", which makesNodes work more like UE Blueprints (or Resonite's "Discrete" nodes) Implement aNodevariant code generator tool (forNodes likeAdd<T>(where T is float, double, VectorN, ...))- Figure out networking
- Collapse/Uncollapse (Pack/Unpack in Protoflux) node graphs into GameObjects
- And, ofcourse, more
Nodes 🛠️
Nodebox is an S&Box library (for now..?) , but it's not published yet.
- Open the
<project>/Libraries/folder (or create one if it's missing) - Open a cmd/shell and run
git clone git@github.com:Manonox/Nodebox.git - Profit
Put the Node3dTool component on your first person camera
- Q(
menu) opens theNodespawn menu - R(
reload) opens the context menu on GameObjects- (Property List / Destroy / Duplicate)
- Left Mouse Button(
attack1)- Hold to drag
Nodes - Click pins to create
Wires - Double click while holding a
Wireto spawn aConstant<T>or aDisplaynode
- Hold to drag
- Right Mouse Button(
attack2)- Drag left/right while holding a
Nodeto rotate it on the Z axis(yaw) - Click pins to disconnect all
Wires (if holding aWirecancels/destroys it)
- Drag left/right while holding a
Place the GameTime->Square->Display combo with Node3D wrappers in the world
protectedoverridevoidOnStart(){varnodes=newList<Node>(){newNodebox.Nodes.GameTime(),newNodebox.Nodes.Square<float>(),newNodebox.Nodes.Display(),};vargos=nodes.Enumerate().Select((pair)=>{var(index,x)=pair;vargo=Node3D.Wrap(x);go.WorldPosition=newVector3(80f,-index*30f,50f);go.WorldRotation=Rotation.FromYaw(180f);returngo;}).ToList();Wire3D.Connect(gos[0],0,gos[1],0);Wire3D.Connect(gos[1],0,gos[2],0);}