Skip to content

Instantly share code, notes, and snippets.

@catchouli
Last active March 29, 2018 14:24
Show Gist options
  • Save catchouli/1bc079526a856be10193ad6695124aa4 to your computer and use it in GitHub Desktop.
Save catchouli/1bc079526a856be10193ad6695124aa4 to your computer and use it in GitHub Desktop.
scala simple scenegraph
val hexapod = new AssemblyNode {
transform.scale(0.1f, 0.1f, 0.1f)
// Body
children += new AssemblyNode {
children += new ModelNode(assets.get("assets/Base.obj"))
}
// Legs
(1 to 6).foreach(i => {
children += new AssemblyNode {
transform.rotate(0.0f, 1.0f, 0.0f, i * 60.0f)
children += new ModelNode(assets.get("assets/Leg v30.obj"))
}
})
}
class RenderContext {
val modelBatch = new ModelBatch
val environment = new Environment
val worldTransform = new Matrix4
def render(cam: Camera, node: Node) = {
worldTransform.idt
modelBatch.begin(cam)
node.traverse(this)
modelBatch.end
}
}
abstract class Node {
def traverse(ctx: RenderContext): Unit
val children = new ArrayBuffer[Node]
}
class AssemblyNode extends Node {
val transform = new Matrix4
def traverse(ctx: RenderContext) = {
val oldTransform = new Matrix4(ctx.worldTransform)
ctx.worldTransform.mul(transform)
children.foreach(_.traverse(ctx))
ctx.worldTransform.set(oldTransform)
}
}
class ModelNode(model: Model) extends Node {
val instance = new ModelInstance(model)
def traverse(ctx: RenderContext) = {
instance.transform.set(ctx.worldTransform)
ctx.modelBatch.render(instance, ctx.environment)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment