Last active
March 29, 2018 14:24
-
-
Save catchouli/1bc079526a856be10193ad6695124aa4 to your computer and use it in GitHub Desktop.
scala simple scenegraph
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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")) | |
} | |
}) | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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