mirror of
https://github.com/Dejvino/roadtrip
synced 2024-11-24 08:33:20 +00:00
Themeless: made map texture a grid, added grid-aligned rocks instead of grass.
This commit is contained in:
parent
e04114e877
commit
d69faa4852
BIN
assets/Textures/map-high.png
Normal file
BIN
assets/Textures/map-high.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 558 B |
BIN
assets/Textures/map-low.png
Normal file
BIN
assets/Textures/map-low.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 559 B |
BIN
assets/Textures/map-mid.png
Normal file
BIN
assets/Textures/map-mid.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 559 B |
Binary file not shown.
Before Width: | Height: | Size: 1.7 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.8 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.8 KiB |
@ -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();
|
||||
|
@ -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));
|
||||
|
@ -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.
|
||||
@ -49,19 +52,25 @@ public class GameWorldView {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -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<Spatial> 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();
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user