Search in sources :

Example 51 with BoundingBox

use of com.jme3.bounding.BoundingBox in project jmonkeyengine by jMonkeyEngine.

the class TerrainTestAdvanced method simpleInitApp.

@Override
public void simpleInitApp() {
    setupKeys();
    // First, we load up our textures and the heightmap texture for the terrain
    // TERRAIN TEXTURE material
    matTerrain = new Material(assetManager, "Common/MatDefs/Terrain/TerrainLighting.j3md");
    matTerrain.setBoolean("useTriPlanarMapping", false);
    matTerrain.setFloat("Shininess", 0.0f);
    // ALPHA map (for splat textures)
    matTerrain.setTexture("AlphaMap", assetManager.loadTexture("Textures/Terrain/splat/alpha1.png"));
    matTerrain.setTexture("AlphaMap_1", assetManager.loadTexture("Textures/Terrain/splat/alpha2.png"));
    // this material also supports 'AlphaMap_2', so you can get up to 12 diffuse textures
    // HEIGHTMAP image (for the terrain heightmap)
    TextureKey hmKey = new TextureKey("Textures/Terrain/splat/mountains512.png", false);
    Texture heightMapImage = assetManager.loadTexture(hmKey);
    // DIRT texture, Diffuse textures 0 to 3 use the first AlphaMap
    Texture dirt = assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg");
    dirt.setWrap(WrapMode.Repeat);
    matTerrain.setTexture("DiffuseMap", dirt);
    matTerrain.setFloat("DiffuseMap_0_scale", dirtScale);
    // DARK ROCK texture
    Texture darkRock = assetManager.loadTexture("Textures/Terrain/Rock2/rock.jpg");
    darkRock.setWrap(WrapMode.Repeat);
    matTerrain.setTexture("DiffuseMap_1", darkRock);
    matTerrain.setFloat("DiffuseMap_1_scale", darkRockScale);
    // PINK ROCK texture
    Texture pinkRock = assetManager.loadTexture("Textures/Terrain/Rock/Rock.PNG");
    pinkRock.setWrap(WrapMode.Repeat);
    matTerrain.setTexture("DiffuseMap_2", pinkRock);
    matTerrain.setFloat("DiffuseMap_2_scale", pinkRockScale);
    // RIVER ROCK texture, this texture will use the next alphaMap: AlphaMap_1
    Texture riverRock = assetManager.loadTexture("Textures/Terrain/Pond/Pond.jpg");
    riverRock.setWrap(WrapMode.Repeat);
    matTerrain.setTexture("DiffuseMap_3", riverRock);
    matTerrain.setFloat("DiffuseMap_3_scale", riverRockScale);
    // GRASS texture
    Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg");
    grass.setWrap(WrapMode.Repeat);
    matTerrain.setTexture("DiffuseMap_4", grass);
    matTerrain.setFloat("DiffuseMap_4_scale", grassScale);
    // BRICK texture
    Texture brick = assetManager.loadTexture("Textures/Terrain/BrickWall/BrickWall.jpg");
    brick.setWrap(WrapMode.Repeat);
    matTerrain.setTexture("DiffuseMap_5", brick);
    matTerrain.setFloat("DiffuseMap_5_scale", brickScale);
    // ROAD texture
    Texture road = assetManager.loadTexture("Textures/Terrain/splat/road.jpg");
    road.setWrap(WrapMode.Repeat);
    matTerrain.setTexture("DiffuseMap_6", road);
    matTerrain.setFloat("DiffuseMap_6_scale", roadScale);
    // diffuse textures 0 to 3 use AlphaMap
    // diffuse textures 4 to 7 use AlphaMap_1
    // diffuse textures 8 to 11 use AlphaMap_2
    // NORMAL MAPS
    Texture normalMapDirt = assetManager.loadTexture("Textures/Terrain/splat/dirt_normal.png");
    normalMapDirt.setWrap(WrapMode.Repeat);
    Texture normalMapPinkRock = assetManager.loadTexture("Textures/Terrain/Rock/Rock_normal.png");
    normalMapPinkRock.setWrap(WrapMode.Repeat);
    Texture normalMapGrass = assetManager.loadTexture("Textures/Terrain/splat/grass_normal.jpg");
    normalMapGrass.setWrap(WrapMode.Repeat);
    Texture normalMapRoad = assetManager.loadTexture("Textures/Terrain/splat/road_normal.png");
    normalMapRoad.setWrap(WrapMode.Repeat);
    matTerrain.setTexture("NormalMap", normalMapDirt);
    matTerrain.setTexture("NormalMap_1", normalMapPinkRock);
    matTerrain.setTexture("NormalMap_2", normalMapPinkRock);
    matTerrain.setTexture("NormalMap_4", normalMapGrass);
    matTerrain.setTexture("NormalMap_6", normalMapRoad);
    // WIREFRAME material (used to debug the terrain, only useful for this test case)
    matWire = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
    matWire.getAdditionalRenderState().setWireframe(true);
    matWire.setColor("Color", ColorRGBA.Green);
    createSky();
    // CREATE HEIGHTMAP
    AbstractHeightMap heightmap = null;
    try {
        heightmap = new ImageBasedHeightMap(heightMapImage.getImage(), 0.3f);
        heightmap.load();
        heightmap.smooth(0.9f, 1);
    } catch (Exception e) {
        e.printStackTrace();
    }
    /*
         * Here we create the actual terrain. The tiles will be 65x65, and the total size of the
         * terrain will be 513x513. It uses the heightmap we created to generate the height values.
         */
    /**
         * Optimal terrain patch size is 65 (64x64).
         * The total size is up to you. At 1025 it ran fine for me (200+FPS), however at
         * size=2049 it got really slow. But that is a jump from 2 million to 8 million triangles...
         */
    //, new LodPerspectiveCalculatorFactory(getCamera(), 4)); // add this in to see it use entropy for LOD calculations
    terrain = new TerrainQuad("terrain", 65, 513, heightmap.getHeightMap());
    TerrainLodControl control = new TerrainLodControl(terrain, getCamera());
    // patch size, and a multiplier
    control.setLodCalculator(new DistanceLodCalculator(65, 2.7f));
    terrain.addControl(control);
    terrain.setMaterial(matTerrain);
    terrain.setModelBound(new BoundingBox());
    terrain.updateModelBound();
    terrain.setLocalTranslation(0, -100, 0);
    terrain.setLocalScale(1f, 1f, 1f);
    rootNode.attachChild(terrain);
    //Material debugMat = assetManager.loadMaterial("Common/Materials/VertexColor.j3m");
    //terrain.generateDebugTangents(debugMat);
    DirectionalLight light = new DirectionalLight();
    light.setDirection((new Vector3f(-0.1f, -0.1f, -0.1f)).normalize());
    rootNode.addLight(light);
    cam.setLocation(new Vector3f(0, 10, -10));
    cam.lookAtDirection(new Vector3f(0, -1.5f, -1).normalizeLocal(), Vector3f.UNIT_Y);
    flyCam.setMoveSpeed(400);
    rootNode.attachChild(createAxisMarker(20));
}
Also used : TextureKey(com.jme3.asset.TextureKey) AbstractHeightMap(com.jme3.terrain.heightmap.AbstractHeightMap) BoundingBox(com.jme3.bounding.BoundingBox) DirectionalLight(com.jme3.light.DirectionalLight) Vector3f(com.jme3.math.Vector3f) TerrainLodControl(com.jme3.terrain.geomipmap.TerrainLodControl) Material(com.jme3.material.Material) Texture(com.jme3.texture.Texture) TerrainQuad(com.jme3.terrain.geomipmap.TerrainQuad) DistanceLodCalculator(com.jme3.terrain.geomipmap.lodcalc.DistanceLodCalculator) ImageBasedHeightMap(com.jme3.terrain.heightmap.ImageBasedHeightMap)

Example 52 with BoundingBox

use of com.jme3.bounding.BoundingBox in project jmonkeyengine by jMonkeyEngine.

the class TerrainTestCollision method simpleInitApp.

@Override
public void simpleInitApp() {
    bulletAppState = new BulletAppState();
    bulletAppState.setThreadingType(BulletAppState.ThreadingType.PARALLEL);
    stateManager.attach(bulletAppState);
    setupKeys();
    matRock = new Material(assetManager, "Common/MatDefs/Terrain/Terrain.j3md");
    matRock.setTexture("Alpha", assetManager.loadTexture("Textures/Terrain/splat/alphamap.png"));
    Texture heightMapImage = assetManager.loadTexture("Textures/Terrain/splat/mountains512.png");
    Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg");
    grass.setWrap(WrapMode.Repeat);
    matRock.setTexture("Tex1", grass);
    matRock.setFloat("Tex1Scale", 64f);
    Texture dirt = assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg");
    dirt.setWrap(WrapMode.Repeat);
    matRock.setTexture("Tex2", dirt);
    matRock.setFloat("Tex2Scale", 32f);
    Texture rock = assetManager.loadTexture("Textures/Terrain/splat/road.jpg");
    rock.setWrap(WrapMode.Repeat);
    matRock.setTexture("Tex3", rock);
    matRock.setFloat("Tex3Scale", 128f);
    matWire = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
    matWire.getAdditionalRenderState().setWireframe(true);
    matWire.setColor("Color", ColorRGBA.Green);
    AbstractHeightMap heightmap = null;
    try {
        heightmap = new ImageBasedHeightMap(heightMapImage.getImage(), 0.25f);
        heightmap.load();
    } catch (Exception e) {
    }
    terrain = new TerrainQuad("terrain", 65, 513, heightmap.getHeightMap());
    TerrainLodControl control = new TerrainLodControl(terrain, getCamera());
    // patch size, and a multiplier
    control.setLodCalculator(new DistanceLodCalculator(65, 2.7f));
    terrain.addControl(control);
    terrain.setMaterial(matRock);
    terrain.setLocalScale(new Vector3f(2, 2, 2));
    // unlock it so we can edit the height
    terrain.setLocked(false);
    rootNode.attachChild(terrain);
    /**
         * Create PhysicsRigidBodyControl for collision
         */
    terrain.addControl(new RigidBodyControl(0));
    bulletAppState.getPhysicsSpace().addAll(terrain);
    // let them drop from the sky
    for (int i = 0; i < 5; i++) {
        float r = (float) (8 * Math.random());
        Geometry sphere = new Geometry("cannonball", new Sphere(10, 10, r));
        sphere.setMaterial(matWire);
        // random position
        float x = (float) (20 * Math.random()) - 40;
        // random position
        float y = (float) (20 * Math.random()) - 40;
        // random position
        float z = (float) (20 * Math.random()) - 40;
        sphere.setLocalTranslation(new Vector3f(x, 100 + y, z));
        sphere.addControl(new RigidBodyControl(new SphereCollisionShape(r), 2));
        rootNode.attachChild(sphere);
        bulletAppState.getPhysicsSpace().add(sphere);
    }
    collisionBox = new Geometry("collisionBox", new Box(2, 2, 2));
    collisionBox.setModelBound(new BoundingBox());
    collisionBox.setLocalTranslation(new Vector3f(20, 95, 30));
    collisionBox.setMaterial(matWire);
    rootNode.attachChild(collisionBox);
    selectedCollisionObject = collisionBox;
    DirectionalLight dl = new DirectionalLight();
    dl.setDirection(new Vector3f(1, -0.5f, -0.1f).normalizeLocal());
    dl.setColor(new ColorRGBA(0.50f, 0.40f, 0.50f, 1.0f));
    rootNode.addLight(dl);
    cam.setLocation(new Vector3f(0, 25, -10));
    cam.lookAtDirection(new Vector3f(0, -1, 0).normalizeLocal(), Vector3f.UNIT_Y);
}
Also used : SphereCollisionShape(com.jme3.bullet.collision.shapes.SphereCollisionShape) Material(com.jme3.material.Material) BoundingBox(com.jme3.bounding.BoundingBox) Box(com.jme3.scene.shape.Box) Texture(com.jme3.texture.Texture) DistanceLodCalculator(com.jme3.terrain.geomipmap.lodcalc.DistanceLodCalculator) RigidBodyControl(com.jme3.bullet.control.RigidBodyControl) ImageBasedHeightMap(com.jme3.terrain.heightmap.ImageBasedHeightMap) Geometry(com.jme3.scene.Geometry) Sphere(com.jme3.scene.shape.Sphere) AbstractHeightMap(com.jme3.terrain.heightmap.AbstractHeightMap) ColorRGBA(com.jme3.math.ColorRGBA) BulletAppState(com.jme3.bullet.BulletAppState) Vector3f(com.jme3.math.Vector3f) BoundingBox(com.jme3.bounding.BoundingBox) DirectionalLight(com.jme3.light.DirectionalLight) TerrainLodControl(com.jme3.terrain.geomipmap.TerrainLodControl) TerrainQuad(com.jme3.terrain.geomipmap.TerrainQuad)

Example 53 with BoundingBox

use of com.jme3.bounding.BoundingBox in project jmonkeyengine by jMonkeyEngine.

the class TerrainQuad method read.

@Override
public void read(JmeImporter e) throws IOException {
    super.read(e);
    InputCapsule c = e.getCapsule(this);
    size = c.readInt("size", 0);
    stepScale = (Vector3f) c.readSavable("stepScale", null);
    offset = (Vector2f) c.readSavable("offset", new Vector2f(0, 0));
    offsetAmount = c.readFloat("offsetAmount", 0);
    quadrant = c.readInt("quadrant", 0);
    totalSize = c.readInt("totalSize", 0);
    if (!(getParent() instanceof TerrainQuad)) {
        BoundingBox all = new BoundingBox(getWorldTranslation(), totalSize, totalSize, totalSize);
        affectedAreaBBox = all;
        updateNormals();
    }
}
Also used : InputCapsule(com.jme3.export.InputCapsule) Vector2f(com.jme3.math.Vector2f) BoundingBox(com.jme3.bounding.BoundingBox)

Example 54 with BoundingBox

use of com.jme3.bounding.BoundingBox in project jmonkeyengine by jMonkeyEngine.

the class TerrainQuad method createQuadPatch.

/**
     * <code>createQuadPatch</code> creates four child patches from this quad.
     */
protected void createQuadPatch(float[] heightMap) {
    // create 4 terrain patches
    int quarterSize = size >> 2;
    int halfSize = size >> 1;
    int split = (size + 1) >> 1;
    //if (lodCalculator == null)
    //    lodCalculator = createDefaultLodCalculator(); // set a default one
    offsetAmount += quarterSize;
    // 1 lower left
    float[] heightBlock1 = createHeightSubBlock(heightMap, 0, 0, split);
    Vector3f origin1 = new Vector3f(-halfSize * stepScale.x, 0, -halfSize * stepScale.z);
    Vector2f tempOffset1 = new Vector2f();
    tempOffset1.x = offset.x;
    tempOffset1.y = offset.y;
    tempOffset1.x += origin1.x / 2;
    tempOffset1.y += origin1.z / 2;
    TerrainPatch patch1 = new TerrainPatch(getName() + "Patch1", split, stepScale, heightBlock1, origin1, totalSize, tempOffset1, offsetAmount);
    patch1.setQuadrant((short) 1);
    this.attachChild(patch1);
    patch1.setModelBound(new BoundingBox());
    patch1.updateModelBound();
    //patch1.setLodCalculator(lodCalculator);
    //TangentBinormalGenerator.generate(patch1);
    // 2 upper left
    float[] heightBlock2 = createHeightSubBlock(heightMap, 0, split - 1, split);
    Vector3f origin2 = new Vector3f(-halfSize * stepScale.x, 0, 0);
    Vector2f tempOffset2 = new Vector2f();
    tempOffset2.x = offset.x;
    tempOffset2.y = offset.y;
    tempOffset2.x += origin1.x / 2;
    tempOffset2.y += quarterSize * stepScale.z;
    TerrainPatch patch2 = new TerrainPatch(getName() + "Patch2", split, stepScale, heightBlock2, origin2, totalSize, tempOffset2, offsetAmount);
    patch2.setQuadrant((short) 2);
    this.attachChild(patch2);
    patch2.setModelBound(new BoundingBox());
    patch2.updateModelBound();
    //patch2.setLodCalculator(lodCalculator);
    //TangentBinormalGenerator.generate(patch2);
    // 3 lower right
    float[] heightBlock3 = createHeightSubBlock(heightMap, split - 1, 0, split);
    Vector3f origin3 = new Vector3f(0, 0, -halfSize * stepScale.z);
    Vector2f tempOffset3 = new Vector2f();
    tempOffset3.x = offset.x;
    tempOffset3.y = offset.y;
    tempOffset3.x += quarterSize * stepScale.x;
    tempOffset3.y += origin3.z / 2;
    TerrainPatch patch3 = new TerrainPatch(getName() + "Patch3", split, stepScale, heightBlock3, origin3, totalSize, tempOffset3, offsetAmount);
    patch3.setQuadrant((short) 3);
    this.attachChild(patch3);
    patch3.setModelBound(new BoundingBox());
    patch3.updateModelBound();
    //patch3.setLodCalculator(lodCalculator);
    //TangentBinormalGenerator.generate(patch3);
    // 4 upper right
    float[] heightBlock4 = createHeightSubBlock(heightMap, split - 1, split - 1, split);
    Vector3f origin4 = new Vector3f(0, 0, 0);
    Vector2f tempOffset4 = new Vector2f();
    tempOffset4.x = offset.x;
    tempOffset4.y = offset.y;
    tempOffset4.x += quarterSize * stepScale.x;
    tempOffset4.y += quarterSize * stepScale.z;
    TerrainPatch patch4 = new TerrainPatch(getName() + "Patch4", split, stepScale, heightBlock4, origin4, totalSize, tempOffset4, offsetAmount);
    patch4.setQuadrant((short) 4);
    this.attachChild(patch4);
    patch4.setModelBound(new BoundingBox());
    patch4.updateModelBound();
//patch4.setLodCalculator(lodCalculator);
//TangentBinormalGenerator.generate(patch4);
}
Also used : Vector2f(com.jme3.math.Vector2f) Vector3f(com.jme3.math.Vector3f) BoundingBox(com.jme3.bounding.BoundingBox)

Example 55 with BoundingBox

use of com.jme3.bounding.BoundingBox in project jmonkeyengine by jMonkeyEngine.

the class TerrainQuad method attachBoundingBox.

/**
     * used by attachBoundChildren()
     */
private void attachBoundingBox(BoundingBox bb, Node parent) {
    WireBox wb = new WireBox(bb.getXExtent(), bb.getYExtent(), bb.getZExtent());
    Geometry g = new Geometry();
    g.setMesh(wb);
    g.setLocalTranslation(bb.getCenter());
    parent.attachChild(g);
}
Also used : Geometry(com.jme3.scene.Geometry) WireBox(com.jme3.scene.debug.WireBox)

Aggregations

BoundingBox (com.jme3.bounding.BoundingBox)42 Vector3f (com.jme3.math.Vector3f)35 Geometry (com.jme3.scene.Geometry)14 TempVars (com.jme3.util.TempVars)14 BoundingVolume (com.jme3.bounding.BoundingVolume)10 BoundingSphere (com.jme3.bounding.BoundingSphere)8 Material (com.jme3.material.Material)7 Vector2f (com.jme3.math.Vector2f)4 Texture (com.jme3.texture.Texture)4 Test (org.junit.Test)4 DirectionalLight (com.jme3.light.DirectionalLight)3 Matrix4f (com.jme3.math.Matrix4f)3 Ray (com.jme3.math.Ray)3 Node (com.jme3.scene.Node)3 Spatial (com.jme3.scene.Spatial)3 TerrainLodControl (com.jme3.terrain.geomipmap.TerrainLodControl)3 TerrainQuad (com.jme3.terrain.geomipmap.TerrainQuad)3 DistanceLodCalculator (com.jme3.terrain.geomipmap.lodcalc.DistanceLodCalculator)3 AbstractHeightMap (com.jme3.terrain.heightmap.AbstractHeightMap)3 ImageBasedHeightMap (com.jme3.terrain.heightmap.ImageBasedHeightMap)3