10. Scene Graph
10.1. Node
Base scene node.
Main methods:
addChild(...)removeChild(...)getChild(...)findChild(...)getChildCount()getParent()setPosition(...)setRotation(...)setScale(...)translate(...)rotate(...)getPosition()getRotation()getScale()getWorldPosition()getWorldTransform()getLocalTransform()setVisible(...)isVisible()setEnabled(...)isEnabled()setName(...)getName()update(float deltaTime)render(Renderer* renderer)
10.2. MeshNode
Node for Mesh.
Main methods:
setMesh(...)getMesh()setCastShadows(bool cast)getCastShadows()
10.3. CameraNode
Node for a camera.
Main methods:
setFOV(...)getFOV()setNearPlane(...)getNearPlane()setFarPlane(...)getFarPlane()setProjectionType(...)getProjectionType()applyToCamera(Camera& camera)
10.4. LightNode
Node for a light.
Main methods:
setLightType(...)getLightType()setColor(...)getColor()setIntensity(...)getIntensity()setDirection(...)getDirection()setRange(...)getRange()applyToLight(Light& light)
10.5. SceneGraph
Main container for the scene graph.
Main methods:
getRoot()createNode<T>(...)createMeshNode(...)createCameraNode(...)createLightNode(...)setActiveCamera(...)getActiveCamera()update(float deltaTime)render()findNode(...)
Example:
SceneGraph scene(&r);
CameraNode* camNode = scene.createCameraNode("MainCamera");
camNode->setPosition(0.0f, 2.0f, -6.0f);
scene.setActiveCamera(camNode);
Cube* cube = new Cube(1.0f, Color::WHITE);
MeshNode* cubeNode = scene.createMeshNode(cube, "Cube");
cubeNode->setPosition(0.0f, 0.5f, 5.0f);
10.6. SceneBuilder
Convenience builder:
withCamera(...)withSun(...)withPointLight(...)addMesh(...)build()
11. Character Controller
11.1. CharacterInput
Fields:
moveXmoveYjumpsprint
11.2. CharacterController
Ready-made public controller for a simple character.
Main methods:
setVisual(MeshInstance* mesh)setVisualRig(...)initDefaultVisual()setPosition(...)getPosition()getYaw()setYaw(...)update(float deltaTime, const CharacterInput& input, const Camera& camera)applyToCamera(Camera& cam, const Vector3& offset) constapplyFirstPerson(Camera& cam) constrender(Renderer* renderer)
Important:
- this is not a full AAA-grade physics character controller
- by default it gives you basic movement, gravity, jump and a simple visual rig
- for prototypes, demos and simple games this is usually enough
13. Particle Effects
13.1. ParticleEmitterConfig
Fields:
maxParticlesemitRateminLifetimemaxLifetimeinitialSpeedspreadaccelerationstartColorendColorstartSizeendSizeloopingadditive
13.2. ParticleEmitter
Main methods:
setPosition(...)getPosition()setVelocityOffset(...)setEnabled(...)isEnabled()triggerBurst(int count)update(float dt)render(Renderer& renderer) const
13.3. FXSystem
Manager for emitters and ready-made preset effects.
Main methods:
createEmitter(...)destroyEmitter(...)clear()update(float dt)render(Renderer& renderer) constcreateFire(...)createSmoke(...)createExplosion(...)createSparks(...)
Example:
FXSystem fx;
ParticleEmitter* smoke = fx.createSmoke(Vector3(0.0f, 0.5f, 6.0f));
In the loop:
fx.update(dt);
fx.render(r);
14. Input API
Pip3D exports a simple Arduino-style input layer in the pip3D::input namespace.
Available types:
ButtonConfigButtonAnalogAxisConfigAnalogAxisJoystickConfigJoystick
14.1. Button
Main methods:
begin()update()isPressed()wasPressed()wasReleased()
14.2. AnalogAxis
Main methods:
begin()update(float deltaTime)value()
14.3. Joystick
Main methods:
begin()update(float deltaTime)x()y()isPressed()wasPressed()wasReleased()
Example:
using namespace pip3D::input;
Joystick stick(
JoystickConfig(
AnalogAxisConfig(1, 0, 4095, 0.12f, false),
AnalogAxisConfig(2, 0, 4095, 0.12f, true),
ButtonConfig(3, true, 30)
)
);
stick.begin();
stick.update(dt);
Important:
- this input layer is designed specifically for Arduino/ESP32-style pins
- PC keyboard/mouse runtime in the simulator is a separate layer, not part of
Input.h