From 4a7b7f24843a246bbd460006d3c60c665e958bac Mon Sep 17 00:00:00 2001 From: Dejvino Date: Wed, 1 Feb 2017 23:38:37 +0100 Subject: [PATCH] Unthemed trees and rocks. --- src/roadtrip/view/GameWorldView.java | 62 ++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/src/roadtrip/view/GameWorldView.java b/src/roadtrip/view/GameWorldView.java index cb64c81..40fdd18 100644 --- a/src/roadtrip/view/GameWorldView.java +++ b/src/roadtrip/view/GameWorldView.java @@ -10,6 +10,7 @@ import com.jme3.light.AmbientLight; import com.jme3.light.DirectionalLight; import com.jme3.material.Material; import com.jme3.math.ColorRGBA; +import com.jme3.math.Quaternion; import com.jme3.math.Vector2f; import com.jme3.math.Vector3f; import com.jme3.post.FilterPostProcessor; @@ -19,6 +20,7 @@ import com.jme3.scene.Geometry; import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.scene.shape.Box; +import com.jme3.scene.shape.Sphere; import com.jme3.terrain.geomipmap.*; import com.jme3.terrain.geomipmap.grid.FractalTileLoader; import com.jme3.terrain.geomipmap.lodcalc.DistanceLodCalculator; @@ -179,16 +181,8 @@ public class GameWorldView { lodControl.setLodCalculator(new DistanceLodCalculator(patchSize + 1, 3.7f)); // patch size, and a multiplier terrain.terrainGrid.addControl(lodControl); - final Spatial treeModel = assetManager.loadModel("Models/tree.j3o"); - final Spatial houseModel = assetManager.loadModel("Models/house1.j3o"); - final Spatial grassModel = assetManager.loadModel("Models/grass.j3o"); - - Material rockMat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - rockMat.setColor("Color", ColorRGBA.Gray); - Geometry rockGeom = new Geometry("rock", new Box(1f, 1f, 1f)); - rockGeom.setMaterial(rockMat); - final Node rockModel = new Node("rockNode"); - rockModel.attachChild(rockGeom); + final Node treeModel = createTree(); + final Node rockModel = createRock(); final FineTerrainGrid terrainGrid = terrain.terrainGrid; terrainGrid.addListener(new TerrainGridListener() { @@ -231,27 +225,31 @@ public class GameWorldView { Vector3f pos = mapObject.getPosition(); Vector3f scale = Vector3f.UNIT_XYZ; Vector3f boxHalf = Vector3f.UNIT_XYZ; + float rotation = 0f; Spatial modelInstance; RigidBodyControl modelPhysics; switch (mapObject.getType()) { case "tree": + case "house": modelInstance = treeModel.clone(); float s = 0.2f + rand.nextFloat() * 5f; scale = new Vector3f(s, s, s); + rotation = rand.nextFloat() * 2f * 3.14f; boxHalf = new Vector3f(s * 0.2f, s * 3f, s * 0.2f); modelPhysics = new RigidBodyControl(new BoxCollisionShape(boxHalf), 0f); break; - case "house": + /*case "house": modelInstance = houseModel.clone(); boxHalf = new Vector3f(2f + rand.nextFloat() * 10f, 2f + rand.nextFloat() * 10f, 2f + rand.nextFloat() * 10f); scale = boxHalf; modelPhysics = new RigidBodyControl(new BoxCollisionShape(boxHalf), 0f); - break; + break;*/ default: throw new RuntimeException("Unhandled object type: " + mapObject.getType()); } modelInstance.setLocalTranslation(pos); modelInstance.setLocalScale(scale); + modelInstance.setLocalRotation(new Quaternion().fromAngles(0f, rotation, 0f)); // TODO: physics from the model and not hard-coded //RigidBodyControl control = treeInstance.getControl(RigidBodyControl.class); if (modelPhysics != null) { @@ -271,6 +269,7 @@ public class GameWorldView { Vector3f pos = new Vector3f(x - w/2f + 0.25f*terrainGrid.getLocalScale().x, 0f, z - w/2f + 0.25f*terrainGrid.getLocalScale().z).addLocal(quad.getWorldTranslation()); pos.addLocal(0f, getHeight(quad, pos), 0f); Vector3f scale = Vector3f.UNIT_XYZ; + float rotation = 0f; Spatial modelInstance; float s = 0.1f; if (i == 0) { @@ -282,12 +281,14 @@ public class GameWorldView { case "grass": modelInstance = rockModel.clone(); scale = new Vector3f(s, s, s); + rotation = i * 5.2f; break; default: throw new RuntimeException("Unhandled object type"); } modelInstance.setLocalTranslation(pos); modelInstance.setLocalScale(scale); + modelInstance.setLocalRotation(new Quaternion().fromAngles(0f, rotation, 0f)); modelInstance.addControl(new HideControl(20f + 140f * s, targetProvider)); objects.attachChild(modelInstance); } @@ -325,4 +326,41 @@ public class GameWorldView { } + private Node createTree() { + Material trunkMat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); + trunkMat.setColor("Color", ColorRGBA.Brown); + + Material branchesMat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); + branchesMat.setColor("Color", new ColorRGBA(0.3f, 0.7f, 0.3f, 1f)); + branchesMat.getAdditionalRenderState().setWireframe(true); + + Geometry treeTrunk = new Geometry("tree-trunk", new Box(0.1f, 1f, 0.1f)); + treeTrunk.setLocalTranslation(0f, 0.5f, 0f); + treeTrunk.setMaterial(trunkMat); + + Geometry treeBranches = new Geometry("tree-branches", new Sphere(6, 5, 1f)); + treeBranches.setLocalTranslation(0f, 1.5f, 0f); + treeBranches.setMaterial(branchesMat); + + Node treeModel = new Node("tree"); + treeModel.attachChild(treeTrunk); + treeModel.attachChild(treeBranches); + + return treeModel; + } + + private Node createRock() { + Material rockMat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); + rockMat.setColor("Color", ColorRGBA.Gray); + rockMat.getAdditionalRenderState().setWireframe(true); + + Geometry rockGeom = new Geometry("rock", new Sphere(3, 3, 1f)); + rockGeom.setMaterial(rockMat); + + Node rockModel = new Node("rockNode"); + rockModel.attachChild(rockGeom); + + return rockModel; + } + }