Scene composition, controllers, input and FX.

The behavior-facing layer over the renderer: scene graph, character controller, particle effects and Arduino-style input API.

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:

  • moveX
  • moveY
  • jump
  • sprint

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) const
  • applyFirstPerson(Camera& cam) const
  • render(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:

  • maxParticles
  • emitRate
  • minLifetime
  • maxLifetime
  • initialSpeed
  • spread
  • acceleration
  • startColor
  • endColor
  • startSize
  • endSize
  • looping
  • additive

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) const
  • createFire(...)
  • 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:

  • ButtonConfig
  • Button
  • AnalogAxisConfig
  • AnalogAxis
  • JoystickConfig
  • Joystick

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