package wow.doge.mygame.game.nodes import com.jme3.scene.Node import com.jme3.scene.CameraNode import com.jme3.scene.Geometry import com.jme3.renderer.Camera import com.jme3.asset.AssetManager import wow.doge.mygame.state.MyMaterial import com.jme3.math.Vector3f import com.jme3.scene.control.CameraControl.ControlDirection import com.jme3.syntax._ import com.jme3.scene.shape.Box import com.jme3.bullet.control.BetterCharacterControl import com.jme3.bullet.BulletAppState import wow.doge.mygame.game.GameApp import wow.doge.mygame.implicits._ import wow.doge.mygame.math.ImVector3f import com.jme3.math.FastMath // class PlayerNode(val name: String) extends Node(name) {} trait Player object PlayerController { def defaultMesh = { lazy val b = new Box(1, 1, 1) lazy val geom = new Geometry("playerMesh", b) geom } def defaultTexture(assetManager: AssetManager) = MyMaterial( assetManager = assetManager, path = os.rel / "Common" / "MatDefs" / "Misc" / "Unshaded.j3md" ) def apply( app: GameApp, modelPath: os.RelPath, cam: Camera )(assetManager: AssetManager, bulletAppState: BulletAppState) = { lazy val playerPos = ImVector3f.ZERO lazy val playerPhysicsControl = new BetterCharacterControl(1.5f, 6f, 1f) .withJumpForce(ImVector3f(0, 5f, 0)) lazy val playerNode = new Node("PlayerNode") .withChildren( new CameraNode("CameraNode", cam) .withControlDir(ControlDirection.SpatialToCamera) .withLocalTranslation(ImVector3f(0, 1.5f, 10)) .withLookAt(playerPos, ImVector3f.UNIT_Y), assetManager .loadModel(modelPath) .asInstanceOf[Node] .withRotate(0, FastMath.PI, 0) ) .withLocalTranslation(playerPos) .withControl(playerPhysicsControl) { bulletAppState.physicsSpace += playerNode bulletAppState.physicsSpace += playerPhysicsControl } { app.rootNode += playerNode } playerPhysicsControl } def apply( mesh: Geometry = defaultMesh, texturePath: os.RelPath = os.rel / "Common" / "MatDefs" / "Misc" / "Unshaded.j3md", cam: Camera )(assetManager: AssetManager): Node = { lazy val playerNode = new Node("PlayerNode") lazy val camNode = new CameraNode("CameraNode", cam) { val mat = MyMaterial( assetManager = assetManager, path = texturePath ) mesh.setMaterial(mat) } // lazy val camNode = new CameraNode("CameraNode", simpleApp.getCamera()) // camNode.setCamera(simpleApp.getCamera()) discard { playerNode .withChild(camNode) .withChild(mesh) // playerNode.children(Seq(camNode, geom)) } { camNode.setControlDir(ControlDirection.SpatialToCamera) camNode.setLocalTranslation( new Vector3f(0, 1.5f, 10) ) camNode.lookAt(playerNode.getLocalTranslation(), Vector3f.UNIT_Y) } playerNode } }