Search in sources :

Example 56 with Quad

use of com.jme3.scene.shape.Quad in project jmonkeyengine by jMonkeyEngine.

the class TerrainQuad method getHeightmapHeight.

/**
     * This will just get the heightmap value at the supplied point,
     * not an interpolated (actual) height value.
     */
protected float getHeightmapHeight(int x, int z) {
    int quad = findQuadrant(x, z);
    int split = (size + 1) >> 1;
    if (children != null) {
        for (int i = children.size(); --i >= 0; ) {
            Spatial spat = children.get(i);
            int col = x;
            int row = z;
            boolean match = false;
            // get the childs quadrant
            int childQuadrant = 0;
            if (spat instanceof TerrainQuad) {
                childQuadrant = ((TerrainQuad) spat).getQuadrant();
            } else if (spat instanceof TerrainPatch) {
                childQuadrant = ((TerrainPatch) spat).getQuadrant();
            }
            if (childQuadrant == 1 && (quad & 1) != 0) {
                match = true;
            } else if (childQuadrant == 2 && (quad & 2) != 0) {
                row = z - split + 1;
                match = true;
            } else if (childQuadrant == 3 && (quad & 4) != 0) {
                col = x - split + 1;
                match = true;
            } else if (childQuadrant == 4 && (quad & 8) != 0) {
                col = x - split + 1;
                row = z - split + 1;
                match = true;
            }
            if (match) {
                if (spat instanceof TerrainQuad) {
                    return ((TerrainQuad) spat).getHeightmapHeight(col, row);
                } else if (spat instanceof TerrainPatch) {
                    return ((TerrainPatch) spat).getHeightmapHeight(col, row);
                }
            }
        }
    }
    return Float.NaN;
}
Also used : Spatial(com.jme3.scene.Spatial)

Example 57 with Quad

use of com.jme3.scene.shape.Quad in project jmonkeyengine by jMonkeyEngine.

the class TerrainQuad method findMatchingChild.

private QuadrantChild findMatchingChild(int x, int z) {
    int quad = findQuadrant(x, z);
    int split = (size + 1) >> 1;
    if (children != null) {
        for (int i = children.size(); --i >= 0; ) {
            Spatial spat = children.get(i);
            int col = x;
            int row = z;
            boolean match = false;
            // get the childs quadrant
            int childQuadrant = 0;
            if (spat instanceof TerrainQuad) {
                childQuadrant = ((TerrainQuad) spat).getQuadrant();
            } else if (spat instanceof TerrainPatch) {
                childQuadrant = ((TerrainPatch) spat).getQuadrant();
            }
            if (childQuadrant == 1 && (quad & 1) != 0) {
                match = true;
            } else if (childQuadrant == 2 && (quad & 2) != 0) {
                row = z - split + 1;
                match = true;
            } else if (childQuadrant == 3 && (quad & 4) != 0) {
                col = x - split + 1;
                match = true;
            } else if (childQuadrant == 4 && (quad & 8) != 0) {
                col = x - split + 1;
                row = z - split + 1;
                match = true;
            }
            if (match)
                return new QuadrantChild(col, row, spat);
        }
    }
    return null;
}
Also used : Spatial(com.jme3.scene.Spatial)

Example 58 with Quad

use of com.jme3.scene.shape.Quad in project jmonkeyengine by jMonkeyEngine.

the class AssetTileLoader method getTerrainQuadAt.

public TerrainQuad getTerrainQuadAt(Vector3f location) {
    String modelName = assetPath + "/" + name + "_" + Math.round(location.x) + "_" + Math.round(location.y) + "_" + Math.round(location.z) + ".j3o";
    Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Load terrain grid tile: {0}", modelName);
    TerrainQuad quad = null;
    try {
        quad = (TerrainQuad) manager.loadModel(modelName);
    } catch (Exception e) {
    //            e.printStackTrace();
    }
    if (quad == null) {
        Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Could not load terrain grid tile: {0}", modelName);
        quad = createNewQuad(location);
    } else {
        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Loaded terrain grid tile: {0}", modelName);
    }
    return quad;
}
Also used : TerrainQuad(com.jme3.terrain.geomipmap.TerrainQuad) IOException(java.io.IOException)

Example 59 with Quad

use of com.jme3.scene.shape.Quad in project jmonkeyengine by jMonkeyEngine.

the class FractalTileLoader method getTerrainQuadAt.

public TerrainQuad getTerrainQuadAt(Vector3f location) {
    HeightMap heightMapAt = getHeightMapAt(location);
    TerrainQuad q = new TerrainQuad("Quad" + location, patchSize, quadSize, heightMapAt == null ? null : heightMapAt.getHeightMap());
    return q;
}
Also used : AbstractHeightMap(com.jme3.terrain.heightmap.AbstractHeightMap) HeightMap(com.jme3.terrain.heightmap.HeightMap) TerrainQuad(com.jme3.terrain.geomipmap.TerrainQuad)

Example 60 with Quad

use of com.jme3.scene.shape.Quad 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)

Aggregations

Geometry (com.jme3.scene.Geometry)35 Quad (com.jme3.scene.shape.Quad)34 Material (com.jme3.material.Material)30 Vector3f (com.jme3.math.Vector3f)23 Node (com.jme3.scene.Node)10 Spatial (com.jme3.scene.Spatial)10 DirectionalLight (com.jme3.light.DirectionalLight)9 Texture (com.jme3.texture.Texture)9 Quaternion (com.jme3.math.Quaternion)8 TerrainQuad (com.jme3.terrain.geomipmap.TerrainQuad)7 ColorRGBA (com.jme3.math.ColorRGBA)6 AmbientLight (com.jme3.light.AmbientLight)5 Vector2f (com.jme3.math.Vector2f)5 Mesh (com.jme3.scene.Mesh)5 Texture2D (com.jme3.texture.Texture2D)5 Picture (com.jme3.ui.Picture)5 File (java.io.File)5 ScreenshotAppState (com.jme3.app.state.ScreenshotAppState)4 BulletAppState (com.jme3.bullet.BulletAppState)4 CapsuleCollisionShape (com.jme3.bullet.collision.shapes.CapsuleCollisionShape)4