diff --git a/assets/Textures/map-high.png b/assets/Textures/map-high.png new file mode 100644 index 0000000..5752d57 Binary files /dev/null and b/assets/Textures/map-high.png differ diff --git a/assets/Textures/map-low.png b/assets/Textures/map-low.png new file mode 100644 index 0000000..7dc6c4b Binary files /dev/null and b/assets/Textures/map-low.png differ diff --git a/assets/Textures/map-mid.png b/assets/Textures/map-mid.png new file mode 100644 index 0000000..8f7ccb3 Binary files /dev/null and b/assets/Textures/map-mid.png differ diff --git a/assets/Textures/solid-grass.png b/assets/Textures/solid-grass.png deleted file mode 100644 index db8fca5..0000000 Binary files a/assets/Textures/solid-grass.png and /dev/null differ diff --git a/assets/Textures/solid-road.png b/assets/Textures/solid-road.png deleted file mode 100644 index 863bac7..0000000 Binary files a/assets/Textures/solid-road.png and /dev/null differ diff --git a/assets/Textures/solid-stone.png b/assets/Textures/solid-stone.png deleted file mode 100644 index f14e503..0000000 Binary files a/assets/Textures/solid-stone.png and /dev/null differ diff --git a/src/roadtrip/RoadTrip.java b/src/roadtrip/RoadTrip.java index 1a9a990..a490bcd 100644 --- a/src/roadtrip/RoadTrip.java +++ b/src/roadtrip/RoadTrip.java @@ -20,6 +20,7 @@ import roadtrip.model.VehicleInstance; import roadtrip.view.CompassNode; import roadtrip.view.GameMenuNode; import roadtrip.view.GameWorldView; +import roadtrip.view.HideControl; import roadtrip.view.VehicleNode; import roadtrip.view.model.GameWorldState; import roadtrip.view.model.Player; @@ -82,7 +83,13 @@ public class RoadTrip extends GameApplication implements ActionListener { rootNode.addLight(al); gameWorldState = new GameWorldState(1L); - gameWorldView = GameWorldView.create(gameWorldState, assetManager, cam, rootNode, getPhysicsSpace()); + gameWorldView = GameWorldView.create(gameWorldState, assetManager, cam, rootNode, getPhysicsSpace(), new HideControl.TargetProvider() { + + @Override + public Vector3f getTarget() { + return player.node.getWorldTranslation(); + } + }); addCar(); addCar(); diff --git a/src/roadtrip/RoadTripPlanner.java b/src/roadtrip/RoadTripPlanner.java index 6ecb781..d882ee7 100644 --- a/src/roadtrip/RoadTripPlanner.java +++ b/src/roadtrip/RoadTripPlanner.java @@ -5,6 +5,7 @@ import com.jme3.bullet.BulletAppState; import com.jme3.bullet.PhysicsSpace; import com.jme3.math.*; import roadtrip.view.GameWorldView; +import roadtrip.view.HideControl; import roadtrip.view.model.GameWorldState; /** @@ -37,7 +38,13 @@ public class RoadTripPlanner extends SimpleApplication { bulletAppState.setDebugEnabled(DEBUG); gameWorldState = new GameWorldState(1L); - gameWorldView = GameWorldView.create(gameWorldState, assetManager, cam, rootNode, getPhysicsSpace()); + gameWorldView = GameWorldView.create(gameWorldState, assetManager, cam, rootNode, getPhysicsSpace(), new HideControl.TargetProvider() { + + @Override + public Vector3f getTarget() { + return cam.getLocation(); + } + }); flyCam.setMoveSpeed(300f); cam.setLocation(new Vector3f(0, 200f, 0)); diff --git a/src/roadtrip/view/GameWorldView.java b/src/roadtrip/view/GameWorldView.java index d52fe80..cb64c81 100644 --- a/src/roadtrip/view/GameWorldView.java +++ b/src/roadtrip/view/GameWorldView.java @@ -15,8 +15,10 @@ import com.jme3.math.Vector3f; import com.jme3.post.FilterPostProcessor; import com.jme3.post.filters.DepthOfFieldFilter; import com.jme3.renderer.Camera; +import com.jme3.scene.Geometry; import com.jme3.scene.Node; import com.jme3.scene.Spatial; +import com.jme3.scene.shape.Box; import com.jme3.terrain.geomipmap.*; import com.jme3.terrain.geomipmap.grid.FractalTileLoader; import com.jme3.terrain.geomipmap.lodcalc.DistanceLodCalculator; @@ -35,6 +37,7 @@ import roadtrip.model.MapObjectInstance; import roadtrip.model.ProceduralMapQuadBlock; import roadtrip.model.TerrainDataProvider; import roadtrip.view.model.GameWorldState; +import roadtrip.view.model.Player; /** * Created by dejvino on 14.01.2017. @@ -42,26 +45,32 @@ import roadtrip.view.model.GameWorldState; public class GameWorldView { public static boolean DEBUG = false;//true; - + private final GameWorldState state; private final AssetManager assetManager; private final Camera camera; private final Node rootNode; private final PhysicsSpace physicsSpace; + private final HideControl.TargetProvider targetProvider; public TerrainView terrain = new TerrainView(new TerrainDataProvider()); - public GameWorldView(GameWorldState gameWorldState, AssetManager assetManager, Camera camera, Node rootNode, PhysicsSpace physicsSpace) { + public GameWorldView(GameWorldState gameWorldState, AssetManager assetManager, + Camera camera, Node rootNode, PhysicsSpace physicsSpace, + HideControl.TargetProvider targetProvider) { this.state = gameWorldState; this.assetManager = assetManager; this.camera = camera; this.rootNode = rootNode; this.physicsSpace = physicsSpace; + this.targetProvider = targetProvider; } - public static GameWorldView create(GameWorldState gameWorldState, AssetManager assetManager, Camera camera, Node rootNode, PhysicsSpace physicsSpace) { - GameWorldView gameWorldView = new GameWorldView(gameWorldState, assetManager, camera, rootNode, physicsSpace); + public static GameWorldView create(GameWorldState gameWorldState, + AssetManager assetManager, Camera camera, Node rootNode, + PhysicsSpace physicsSpace, HideControl.TargetProvider targetProvider) { + GameWorldView gameWorldView = new GameWorldView(gameWorldState, assetManager, camera, rootNode, physicsSpace, targetProvider); gameWorldView.initialize(); return gameWorldView; } @@ -95,28 +104,27 @@ public class GameWorldView { // slopeColorMap: the texture to be used for cliffs, and steep mountain sites // slopeTileFactor: the texture scale for slopes // terrainSize: the total size of the terrain (used for scaling the texture) - // GRASS texture - Texture grass = this.assetManager.loadTexture("Textures/solid-grass.png"); - grass.setWrap(Texture.WrapMode.Repeat); - Texture dirt = this.assetManager.loadTexture("Textures/solid-road.png"); - dirt.setWrap(Texture.WrapMode.Repeat); - Texture rock = this.assetManager.loadTexture("Textures/solid-stone.png"); - rock.setWrap(Texture.WrapMode.Repeat); + Texture textureMid = this.assetManager.loadTexture("Textures/map-mid.png"); + textureMid.setWrap(Texture.WrapMode.Repeat); + Texture textureLow = this.assetManager.loadTexture("Textures/map-low.png"); + textureLow.setWrap(Texture.WrapMode.Repeat); + Texture textureHigh = this.assetManager.loadTexture("Textures/map-high.png"); + textureHigh.setWrap(Texture.WrapMode.Repeat); float modif = (heightScale / 100f) / 3f; - terrain.mat_terrain.setTexture("region1ColorMap", dirt); - terrain.mat_terrain.setVector3("region1", new Vector3f(0, 80 * modif, terrain.dirtScale)); + terrain.mat_terrain.setTexture("region1ColorMap", textureLow); + terrain.mat_terrain.setVector3("region1", new Vector3f(0, 80 * modif, terrain.texLowScale)); - terrain.mat_terrain.setTexture("region2ColorMap", grass); - terrain.mat_terrain.setVector3("region2", new Vector3f(100 * modif, 160 * modif, terrain.grassScale)); + terrain.mat_terrain.setTexture("region2ColorMap", textureMid); + terrain.mat_terrain.setVector3("region2", new Vector3f(100 * modif, 160 * modif, terrain.texMidScale)); - terrain.mat_terrain.setTexture("region3ColorMap", rock); - terrain.mat_terrain.setVector3("region3", new Vector3f(190 * modif, 240 * modif, terrain.rockScale)); + terrain.mat_terrain.setTexture("region3ColorMap", textureHigh); + terrain.mat_terrain.setVector3("region3", new Vector3f(190 * modif, 240 * modif, terrain.texHighScale)); - terrain.mat_terrain.setTexture("region4ColorMap", dirt); - terrain.mat_terrain.setVector3("region4", new Vector3f(250 * modif, 350 * modif, terrain.dirtScale)); + terrain.mat_terrain.setTexture("region4ColorMap", textureLow); + terrain.mat_terrain.setVector3("region4", new Vector3f(250 * modif, 350 * modif, terrain.texLowScale)); - terrain.mat_terrain.setTexture("slopeColorMap", rock); + terrain.mat_terrain.setTexture("slopeColorMap", textureHigh); terrain.mat_terrain.setFloat("slopeTileFactor", 32); terrain.mat_terrain.setFloat("terrainSize", 513); @@ -175,6 +183,13 @@ public class GameWorldView { 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 FineTerrainGrid terrainGrid = terrain.terrainGrid; terrainGrid.addListener(new TerrainGridListener() { @@ -248,15 +263,24 @@ public class GameWorldView { objects.attachChild(modelInstance); } - for (int i = 0; i < rand.nextInt(10000); i++) { - Vector3f pos = new Vector3f((rand.nextFloat() - 0.5f) * 128f, 0f, (rand.nextFloat() - 0.5f) * 128f).addLocal(quad.getWorldTranslation()); + int w = 128; + for (int i = 0; i < w*w; i++) { + int x = i % w; + int z = i / w; + if (((x % 8) + (z % 8)) != 0) continue; + 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; Spatial modelInstance; + float s = 0.1f; + if (i == 0) { + s = 0.4f; + } else if ((x % 16) + (z % 16) == 0) { + s = 0.2f; + } switch ("grass") { case "grass": - modelInstance = grassModel.clone(); - float s = 0.2f + rand.nextFloat() * 2f; + modelInstance = rockModel.clone(); scale = new Vector3f(s, s, s); break; default: @@ -264,7 +288,7 @@ public class GameWorldView { } modelInstance.setLocalTranslation(pos); modelInstance.setLocalScale(scale); - modelInstance.addControl(new HideControl()); + modelInstance.addControl(new HideControl(20f + 140f * s, targetProvider)); objects.attachChild(modelInstance); } } diff --git a/src/roadtrip/view/HideControl.java b/src/roadtrip/view/HideControl.java index 492734e..3ac2f3b 100644 --- a/src/roadtrip/view/HideControl.java +++ b/src/roadtrip/view/HideControl.java @@ -2,6 +2,7 @@ package roadtrip.view; import java.util.ArrayList; import com.jme3.bounding.BoundingVolume; +import com.jme3.math.Vector3f; import com.jme3.renderer.Camera; import com.jme3.renderer.RenderManager; import com.jme3.renderer.ViewPort; @@ -12,13 +13,29 @@ import com.jme3.scene.control.Control; public class HideControl extends AbstractControl { - private static final float DISTANCE_HIDE = 200; + private final float distanceToHide; private ArrayList children; private boolean hidden; private BoundingVolume prevBv; + + private TargetProvider targetProvider; + public HideControl(float distanceToHide) { + this(distanceToHide, null); + } + + public HideControl(float distanceToHide, TargetProvider targetProvider) { + this.distanceToHide = distanceToHide; + this.targetProvider = targetProvider; + } + + public void setTargetProvider(TargetProvider targetProvider) + { + this.targetProvider = targetProvider; + } + @Override public Control cloneForSpatial(Spatial spatial) { @@ -29,8 +46,18 @@ public class HideControl extends AbstractControl @Override protected void controlRender(RenderManager rm, ViewPort vp) { - Camera cam = vp.getCamera(); - BoundingVolume bv = spatial.getWorldBound(); + if (targetProvider == null) { + final Camera cam = vp.getCamera(); + targetProvider = new TargetProvider() { + + @Override + public Vector3f getTarget() { + return cam.getLocation(); + } + }; + } + + /*BoundingVolume bv = spatial.getWorldBound(); if (bv == null) { bv = prevBv; @@ -38,9 +65,10 @@ public class HideControl extends AbstractControl prevBv = bv; } - float distance = bv.distanceTo(cam.getLocation()); + float distance = bv.distanceTo(targetProvider.getTarget());*/ + float distance = spatial.getWorldTranslation().distance(targetProvider.getTarget()); - if (distance > HideControl.DISTANCE_HIDE) { + if (distance > distanceToHide) { if (!hidden) { for (int i = 0; i < children.size(); i++) { children.get(i).removeFromParent(); @@ -74,4 +102,9 @@ public class HideControl extends AbstractControl children = new ArrayList<>(((Node) spatial).getChildren()); } + + public interface TargetProvider + { + Vector3f getTarget(); + } } diff --git a/src/roadtrip/view/TerrainView.java b/src/roadtrip/view/TerrainView.java index 733d7da..734d0b6 100644 --- a/src/roadtrip/view/TerrainView.java +++ b/src/roadtrip/view/TerrainView.java @@ -10,9 +10,9 @@ import roadtrip.model.TerrainDataProvider; public class TerrainView { public Material mat_terrain; public FineTerrainGrid terrainGrid; - public float grassScale = 64; - public float dirtScale = 64; - public float rockScale = 64; + public float texMidScale = 64; + public float texLowScale = 64; + public float texHighScale = 64; public TerrainDataProvider terrainDataProvider; public TerrainView(TerrainDataProvider terrainDataProvider) {