Search in sources :

Example 26 with BlenderFileException

use of com.jme3.scene.plugins.blender.file.BlenderFileException in project jmonkeyengine by jMonkeyEngine.

the class CurvesTemporalMesh method loadBevelObject.

/**
     * The method loads the bevel object that sould be applied to curve. It can either be another curve or a generated one
     * based on the bevel generating parameters in blender.
     * @param curveStructure
     *            the structure with the curve's data (the curve being loaded, NOT the bevel curve)
     * @return the curve's bevel object
     * @throws BlenderFileException
     *             an exception is thrown when problems with reading occur
     */
@SuppressWarnings("unchecked")
private CurvesTemporalMesh loadBevelObject(Structure curveStructure) throws BlenderFileException {
    CurvesTemporalMesh bevelObject = null;
    Pointer pBevelObject = (Pointer) curveStructure.getFieldValue("bevobj");
    boolean cyclic = false;
    if (pBevelObject.isNotNull()) {
        Structure bevelObjectStructure = pBevelObject.fetchData().get(0);
        DynamicArray<Number> scaleArray = (DynamicArray<Number>) bevelObjectStructure.getFieldValue("size");
        Vector3f scale = blenderContext.getBlenderKey().isFixUpAxis() ? new Vector3f(scaleArray.get(0).floatValue(), scaleArray.get(1).floatValue(), scaleArray.get(2).floatValue()) : new Vector3f(scaleArray.get(0).floatValue(), scaleArray.get(2).floatValue(), scaleArray.get(1).floatValue());
        Pointer pBevelStructure = (Pointer) bevelObjectStructure.getFieldValue("data");
        Structure bevelStructure = pBevelStructure.fetchData().get(0);
        bevelObject = new CurvesTemporalMesh(bevelStructure, scale, false, blenderContext);
        // transforming the bezier lines from plane XZ to plane YZ
        for (BezierLine bl : bevelObject.beziers) {
            for (Vector3f v : bl.vertices) {
                // casting the bezier curve orthogonally on the plane XZ (making Y = 0) and then moving the plane XZ to ZY in a way that:
                // -Z => +Y and +X => +Z and +Y => +X (but because casting would make Y = 0, then we simply set X = 0)
                v.y = -v.z;
                v.z = v.x;
                v.x = 0;
            }
            // bevel curves should not have repeated the first vertex at the end when they are cyclic (this is handled differently)
            if (bl.isCyclic()) {
                bl.removeLastVertex();
            }
        }
    } else {
        // this option is inactive in blender when there is no bevel object applied
        fillCaps = false;
        int bevResol = ((Number) curveStructure.getFieldValue("bevresol")).intValue();
        float extrude = ((Number) curveStructure.getFieldValue("ext1")).floatValue();
        float bevelDepth = ((Number) curveStructure.getFieldValue("ext2")).floatValue();
        float offset = ((Number) curveStructure.getFieldValue("offset", 0)).floatValue();
        if (offset != 0) {
            // TODO: add support for offset parameter
            LOGGER.warning("Offset parameter not yet supported.");
        }
        Curve bevelCurve = null;
        if (bevelDepth > 0.0f) {
            float handlerLength = bevelDepth / 2.0f;
            cyclic = !isFront && !isBack;
            List<Vector3f> conrtolPoints = new ArrayList<Vector3f>();
            // when neither fron and back face is selected all version behave the same and draw full bevel around the curve
            if (cyclic || blenderContext.getBlenderVersion() < 253) {
                conrtolPoints.add(new Vector3f(0, -extrude - bevelDepth, 0));
                conrtolPoints.add(new Vector3f(0, -extrude - bevelDepth, -handlerLength));
                conrtolPoints.add(new Vector3f(0, -extrude - handlerLength, -bevelDepth));
                conrtolPoints.add(new Vector3f(0, -extrude, -bevelDepth));
                conrtolPoints.add(new Vector3f(0, -extrude + handlerLength, -bevelDepth));
                if (extrude > 0) {
                    conrtolPoints.add(new Vector3f(0, extrude - handlerLength, -bevelDepth));
                    conrtolPoints.add(new Vector3f(0, extrude, -bevelDepth));
                    conrtolPoints.add(new Vector3f(0, extrude + handlerLength, -bevelDepth));
                }
                conrtolPoints.add(new Vector3f(0, extrude + bevelDepth, -handlerLength));
                conrtolPoints.add(new Vector3f(0, extrude + bevelDepth, 0));
                if (cyclic) {
                    conrtolPoints.add(new Vector3f(0, extrude + bevelDepth, handlerLength));
                    conrtolPoints.add(new Vector3f(0, extrude + handlerLength, bevelDepth));
                    conrtolPoints.add(new Vector3f(0, extrude, bevelDepth));
                    conrtolPoints.add(new Vector3f(0, extrude - handlerLength, bevelDepth));
                    if (extrude > 0) {
                        conrtolPoints.add(new Vector3f(0, -extrude + handlerLength, bevelDepth));
                        conrtolPoints.add(new Vector3f(0, -extrude, bevelDepth));
                        conrtolPoints.add(new Vector3f(0, -extrude - handlerLength, bevelDepth));
                    }
                    conrtolPoints.add(new Vector3f(0, -extrude - bevelDepth, handlerLength));
                    conrtolPoints.add(new Vector3f(0, -extrude - bevelDepth, 0));
                }
            } else {
                if (extrude > 0) {
                    if (isBack) {
                        conrtolPoints.add(new Vector3f(0, -extrude - bevelDepth, 0));
                        conrtolPoints.add(new Vector3f(0, -extrude - bevelDepth, -handlerLength));
                        conrtolPoints.add(new Vector3f(0, -extrude - handlerLength, -bevelDepth));
                    }
                    conrtolPoints.add(new Vector3f(0, -extrude, -bevelDepth));
                    conrtolPoints.add(new Vector3f(0, -extrude + handlerLength, -bevelDepth));
                    conrtolPoints.add(new Vector3f(0, extrude - handlerLength, -bevelDepth));
                    conrtolPoints.add(new Vector3f(0, extrude, -bevelDepth));
                    if (isFront) {
                        conrtolPoints.add(new Vector3f(0, extrude + handlerLength, -bevelDepth));
                        conrtolPoints.add(new Vector3f(0, extrude + bevelDepth, -handlerLength));
                        conrtolPoints.add(new Vector3f(0, extrude + bevelDepth, 0));
                    }
                } else {
                    if (isFront && isBack) {
                        conrtolPoints.add(new Vector3f(0, -bevelDepth, 0));
                        conrtolPoints.add(new Vector3f(0, -bevelDepth, -handlerLength));
                        conrtolPoints.add(new Vector3f(0, -handlerLength, -bevelDepth));
                        conrtolPoints.add(new Vector3f(0, 0, -bevelDepth));
                        conrtolPoints.add(new Vector3f(0, handlerLength, -bevelDepth));
                        conrtolPoints.add(new Vector3f(0, bevelDepth, -handlerLength));
                        conrtolPoints.add(new Vector3f(0, bevelDepth, 0));
                    } else {
                        if (isBack) {
                            conrtolPoints.add(new Vector3f(0, -bevelDepth, 0));
                            conrtolPoints.add(new Vector3f(0, -bevelDepth, -handlerLength));
                            conrtolPoints.add(new Vector3f(0, -handlerLength, -bevelDepth));
                            conrtolPoints.add(new Vector3f(0, 0, -bevelDepth));
                        } else {
                            conrtolPoints.add(new Vector3f(0, 0, -bevelDepth));
                            conrtolPoints.add(new Vector3f(0, handlerLength, -bevelDepth));
                            conrtolPoints.add(new Vector3f(0, bevelDepth, -handlerLength));
                            conrtolPoints.add(new Vector3f(0, bevelDepth, 0));
                        }
                    }
                }
            }
            bevelCurve = new Curve(new Spline(SplineType.Bezier, conrtolPoints, 0, false), bevResol);
        } else if (extrude > 0.0f) {
            Spline bevelSpline = new Spline(SplineType.Linear, new Vector3f[] { new Vector3f(0, extrude, 0), new Vector3f(0, -extrude, 0) }, 1, false);
            bevelCurve = new Curve(bevelSpline, bevResol);
        }
        if (bevelCurve != null) {
            bevelObject = new CurvesTemporalMesh(blenderContext);
            FloatBuffer vertsBuffer = (FloatBuffer) bevelCurve.getBuffer(Type.Position).getData();
            Vector3f[] verts = BufferUtils.getVector3Array(vertsBuffer);
            if (cyclic) {
                // get rid of the last vertex which is identical to the first one
                verts = Arrays.copyOf(verts, verts.length - 1);
            }
            bevelObject.beziers.add(new BezierLine(verts, 0, false, cyclic));
        }
    }
    return bevelObject;
}
Also used : Curve(com.jme3.scene.shape.Curve) ArrayList(java.util.ArrayList) Pointer(com.jme3.scene.plugins.blender.file.Pointer) FloatBuffer(java.nio.FloatBuffer) Spline(com.jme3.math.Spline) DynamicArray(com.jme3.scene.plugins.blender.file.DynamicArray) Vector3f(com.jme3.math.Vector3f) Structure(com.jme3.scene.plugins.blender.file.Structure)

Example 27 with BlenderFileException

use of com.jme3.scene.plugins.blender.file.BlenderFileException in project jmonkeyengine by jMonkeyEngine.

the class CurvesTemporalMesh method applyBevelAndTaper.

/**
     * This method applies bevel and taper objects to the curve.
     * @param curve
     *            the curve we apply the objects to
     * @param bevelObject
     *            the bevel object
     * @param taperObject
     *            the taper object
     * @param blenderContext
     *            the blender context
     * @return a list of geometries representing the beveled and/or tapered curve
     * @throws BlenderFileException
     *             an exception is thrown when problems with reading occur
     */
private CurvesTemporalMesh applyBevelAndTaper(CurvesTemporalMesh curve, CurvesTemporalMesh bevelObject, CurvesTemporalMesh taperObject, BlenderContext blenderContext) throws BlenderFileException {
    List<BezierLine> bevelBezierLines = bevelObject.getScaledBeziers();
    List<BezierLine> curveLines = curve.beziers;
    if (bevelBezierLines.size() == 0 || curveLines.size() == 0) {
        return null;
    }
    CurvesTemporalMesh result = new CurvesTemporalMesh(blenderContext);
    for (BezierLine curveLine : curveLines) {
        Vector3f[] curveLineVertices = curveLine.getVertices(bevelStart, bevelEnd);
        for (BezierLine bevelBezierLine : bevelBezierLines) {
            CurvesTemporalMesh partResult = new CurvesTemporalMesh(blenderContext);
            Vector3f[] bevelLineVertices = bevelBezierLine.getVertices();
            List<Vector3f[]> bevels = new ArrayList<Vector3f[]>();
            Vector3f[] bevelPoints = curvesHelper.transformToFirstLineOfBevelPoints(bevelLineVertices, curveLineVertices[0], curveLineVertices[1]);
            bevels.add(bevelPoints);
            for (int i = 1; i < curveLineVertices.length - 1; ++i) {
                bevelPoints = curvesHelper.transformBevel(bevelPoints, curveLineVertices[i - 1], curveLineVertices[i], curveLineVertices[i + 1]);
                bevels.add(bevelPoints);
            }
            bevelPoints = curvesHelper.transformBevel(bevelPoints, curveLineVertices[curveLineVertices.length - 2], curveLineVertices[curveLineVertices.length - 1], null);
            bevels.add(bevelPoints);
            Vector3f subtractResult = new Vector3f();
            if (bevels.size() > 2) {
                // changing the first and last bevel so that they are parallel to their neighbours (blender works this way)
                // notice this implicates that the distances of every corresponding point in the two bevels must be identical and
                // equal to the distance between the points on curve that define the bevel position
                // so instead doing complicated rotations on each point we will simply properly translate each of them
                int[][] pointIndexes = new int[][] { { 0, 1 }, { curveLineVertices.length - 1, curveLineVertices.length - 2 } };
                for (int[] indexes : pointIndexes) {
                    float distance = curveLineVertices[indexes[1]].subtract(curveLineVertices[indexes[0]], subtractResult).length();
                    Vector3f[] bevel = bevels.get(indexes[0]);
                    Vector3f[] nextBevel = bevels.get(indexes[1]);
                    for (int i = 0; i < bevel.length; ++i) {
                        float d = bevel[i].subtract(nextBevel[i], subtractResult).length();
                        subtractResult.normalizeLocal().multLocal(distance - d);
                        bevel[i].addLocal(subtractResult);
                    }
                }
            }
            if (taperObject != null) {
                float curveLength = curveLine.getLength(), lengthAlongCurve = bevelStart;
                for (int i = 0; i < curveLineVertices.length; ++i) {
                    if (i > 0) {
                        lengthAlongCurve += curveLineVertices[i].subtract(curveLineVertices[i - 1], subtractResult).length();
                    }
                    float taperScale = -taperObject.getValueAlongCurve(lengthAlongCurve / curveLength).z * taperObject.scale.z;
                    if (taperScale != 1) {
                        this.applyScale(bevels.get(i), curveLineVertices[i], taperScale);
                    }
                }
            }
            // adding vertices to the part result
            for (Vector3f[] bevel : bevels) {
                for (Vector3f d : bevel) {
                    partResult.getVertices().add(d);
                }
            }
            // preparing faces for the part result (each face is a quad)
            int bevelVertCount = bevelPoints.length;
            for (int i = 0; i < bevels.size() - 1; ++i) {
                for (int j = 0; j < bevelVertCount - 1; ++j) {
                    Integer[] indexes = new Integer[] { i * bevelVertCount + j + 1, (i + 1) * bevelVertCount + j + 1, (i + 1) * bevelVertCount + j, i * bevelVertCount + j };
                    partResult.getFaces().add(new Face(indexes, curveLine.isSmooth(), curveLine.getMaterialNumber(), null, null, partResult));
                    partResult.getEdges().add(new Edge(indexes[0], indexes[1], 0, true, partResult));
                    partResult.getEdges().add(new Edge(indexes[1], indexes[2], 0, true, partResult));
                    partResult.getEdges().add(new Edge(indexes[2], indexes[3], 0, true, partResult));
                    partResult.getEdges().add(new Edge(indexes[3], indexes[0], 0, true, partResult));
                }
                if (bevelBezierLine.isCyclic()) {
                    int j = bevelVertCount - 1;
                    Integer[] indexes = new Integer[] { i * bevelVertCount, (i + 1) * bevelVertCount, (i + 1) * bevelVertCount + j, i * bevelVertCount + j };
                    partResult.getFaces().add(new Face(indexes, curveLine.isSmooth(), curveLine.getMaterialNumber(), null, null, partResult));
                    partResult.getEdges().add(new Edge(indexes[0], indexes[1], 0, true, partResult));
                    partResult.getEdges().add(new Edge(indexes[1], indexes[2], 0, true, partResult));
                    partResult.getEdges().add(new Edge(indexes[2], indexes[3], 0, true, partResult));
                    partResult.getEdges().add(new Edge(indexes[3], indexes[0], 0, true, partResult));
                }
            }
            partResult.generateNormals();
            if (fillCaps) {
                // caps in blender behave as if they weren't affected by the smooth factor
                // START CAP
                Vector3f[] cap = bevels.get(0);
                List<Integer> capIndexes = new ArrayList<Integer>(cap.length);
                Vector3f capNormal = curveLineVertices[0].subtract(curveLineVertices[1]).normalizeLocal();
                for (int i = 0; i < cap.length; ++i) {
                    capIndexes.add(partResult.getVertices().size());
                    partResult.getVertices().add(cap[i]);
                    partResult.getNormals().add(capNormal);
                }
                // the indexes ned to be reversed for the face to have fron face outside the beveled line
                Collections.reverse(capIndexes);
                partResult.getFaces().add(new Face(capIndexes.toArray(new Integer[capIndexes.size()]), false, curveLine.getMaterialNumber(), null, null, partResult));
                for (int i = 1; i < capIndexes.size(); ++i) {
                    partResult.getEdges().add(new Edge(capIndexes.get(i - 1), capIndexes.get(i), 0, true, partResult));
                }
                // END CAP
                cap = bevels.get(bevels.size() - 1);
                capIndexes.clear();
                capNormal = curveLineVertices[curveLineVertices.length - 1].subtract(curveLineVertices[curveLineVertices.length - 2]).normalizeLocal();
                for (int i = 0; i < cap.length; ++i) {
                    capIndexes.add(partResult.getVertices().size());
                    partResult.getVertices().add(cap[i]);
                    partResult.getNormals().add(capNormal);
                }
                partResult.getFaces().add(new Face(capIndexes.toArray(new Integer[capIndexes.size()]), false, curveLine.getMaterialNumber(), null, null, partResult));
                for (int i = 1; i < capIndexes.size(); ++i) {
                    partResult.getEdges().add(new Edge(capIndexes.get(i - 1), capIndexes.get(i), 0, true, partResult));
                }
            }
            result.append(partResult);
        }
    }
    return result;
}
Also used : ArrayList(java.util.ArrayList) Vector3f(com.jme3.math.Vector3f) Face(com.jme3.scene.plugins.blender.meshes.Face) Edge(com.jme3.scene.plugins.blender.meshes.Edge)

Example 28 with BlenderFileException

use of com.jme3.scene.plugins.blender.file.BlenderFileException in project jmonkeyengine by jMonkeyEngine.

the class CurvesTemporalMesh method loadBezierCurve.

/**
     * The methods loads the bezier curve from the given structure.
     * @param nurbStructure
     *            the structure containing a single curve definition
     * @param materialIndex
     *            the index of this segment's material
     * @throws BlenderFileException
     *             an exception is thrown when problems with reading occur
     */
private void loadBezierCurve(Structure nurbStructure, int materialIndex) throws BlenderFileException {
    Pointer pBezierTriple = (Pointer) nurbStructure.getFieldValue("bezt");
    if (pBezierTriple.isNotNull()) {
        int resolution = ((Number) nurbStructure.getFieldValue("resolu")).intValue();
        boolean cyclic = (((Number) nurbStructure.getFieldValue("flagu")).intValue() & 0x01) != 0;
        boolean smooth = (((Number) nurbStructure.getFieldValue("flag")).intValue() & FLAG_SMOOTH) != 0;
        // creating the curve object
        BezierCurve bezierCurve = new BezierCurve(0, pBezierTriple.fetchData(), 3, blenderContext.getBlenderKey().isFixUpAxis());
        List<Vector3f> controlPoints = bezierCurve.getControlPoints();
        if (cyclic) {
            // copy the first three points at the end
            for (int i = 0; i < 3; ++i) {
                controlPoints.add(controlPoints.get(i));
            }
        }
        // removing the first and last handles
        controlPoints.remove(0);
        controlPoints.remove(controlPoints.size() - 1);
        // creating curve
        Curve curve = new Curve(new Spline(SplineType.Bezier, controlPoints, 0, false), resolution);
        FloatBuffer vertsBuffer = (FloatBuffer) curve.getBuffer(Type.Position).getData();
        beziers.add(new BezierLine(BufferUtils.getVector3Array(vertsBuffer), materialIndex, smooth, cyclic));
    }
}
Also used : Vector3f(com.jme3.math.Vector3f) Curve(com.jme3.scene.shape.Curve) Pointer(com.jme3.scene.plugins.blender.file.Pointer) FloatBuffer(java.nio.FloatBuffer) Spline(com.jme3.math.Spline)

Example 29 with BlenderFileException

use of com.jme3.scene.plugins.blender.file.BlenderFileException in project jmonkeyengine by jMonkeyEngine.

the class LightHelper method toLight.

public Light toLight(Structure structure, BlenderContext blenderContext) throws BlenderFileException {
    Light result = (Light) blenderContext.getLoadedFeature(structure.getOldMemoryAddress(), LoadedDataType.FEATURE);
    if (result != null) {
        return result;
    }
    Light light = null;
    int type = ((Number) structure.getFieldValue("type")).intValue();
    switch(type) {
        case // Lamp
        0:
            light = new PointLight();
            float distance = ((Number) structure.getFieldValue("dist")).floatValue();
            ((PointLight) light).setRadius(distance);
            break;
        case // Sun
        1:
            LOGGER.log(Level.WARNING, "'Sun' lamp is not supported in jMonkeyEngine. Using PointLight with radius = Float.MAX_VALUE.");
            light = new PointLight();
            ((PointLight) light).setRadius(Float.MAX_VALUE);
            break;
        case // Spot
        2:
            light = new SpotLight();
            // range
            ((SpotLight) light).setSpotRange(((Number) structure.getFieldValue("dist")).floatValue());
            // outer angle
            float outerAngle = ((Number) structure.getFieldValue("spotsize")).floatValue() * FastMath.DEG_TO_RAD * 0.5f;
            ((SpotLight) light).setSpotOuterAngle(outerAngle);
            // inner angle
            float spotblend = ((Number) structure.getFieldValue("spotblend")).floatValue();
            spotblend = FastMath.clamp(spotblend, 0, 1);
            float innerAngle = outerAngle * (1 - spotblend);
            ((SpotLight) light).setSpotInnerAngle(innerAngle);
            break;
        case // Hemi
        3:
            LOGGER.log(Level.WARNING, "'Hemi' lamp is not supported in jMonkeyEngine. Using DirectionalLight instead.");
        case // Area
        4:
            light = new DirectionalLight();
            break;
        default:
            throw new BlenderFileException("Unknown light source type: " + type);
    }
    float r = ((Number) structure.getFieldValue("r")).floatValue();
    float g = ((Number) structure.getFieldValue("g")).floatValue();
    float b = ((Number) structure.getFieldValue("b")).floatValue();
    light.setColor(new ColorRGBA(r, g, b, 1.0f));
    light.setName(structure.getName());
    return light;
}
Also used : ColorRGBA(com.jme3.math.ColorRGBA) DirectionalLight(com.jme3.light.DirectionalLight) SpotLight(com.jme3.light.SpotLight) Light(com.jme3.light.Light) PointLight(com.jme3.light.PointLight) DirectionalLight(com.jme3.light.DirectionalLight) BlenderFileException(com.jme3.scene.plugins.blender.file.BlenderFileException) PointLight(com.jme3.light.PointLight) SpotLight(com.jme3.light.SpotLight)

Example 30 with BlenderFileException

use of com.jme3.scene.plugins.blender.file.BlenderFileException in project jmonkeyengine by jMonkeyEngine.

the class Point method loadAll.

/**
     * Loads all points of the mesh that do not belong to any edge.
     * @param meshStructure
     *            the mesh structure
     * @return a list of points
     * @throws BlenderFileException
     *             an exception is thrown when problems with file reading occur
     */
public static List<Point> loadAll(Structure meshStructure) throws BlenderFileException {
    LOGGER.log(Level.FINE, "Loading all points that do not belong to any edge from mesh: {0}", meshStructure.getName());
    List<Point> result = new ArrayList<Point>();
    Pointer pMEdge = (Pointer) meshStructure.getFieldValue("medge");
    if (pMEdge.isNotNull()) {
        int count = ((Number) meshStructure.getFieldValue("totvert")).intValue();
        Set<Integer> unusedVertices = new HashSet<Integer>(count);
        for (int i = 0; i < count; ++i) {
            unusedVertices.add(i);
        }
        List<Structure> edges = pMEdge.fetchData();
        for (Structure edge : edges) {
            unusedVertices.remove(((Number) edge.getFieldValue("v1")).intValue());
            unusedVertices.remove(((Number) edge.getFieldValue("v2")).intValue());
        }
        for (Integer unusedIndex : unusedVertices) {
            result.add(new Point(unusedIndex));
        }
    }
    LOGGER.log(Level.FINE, "Loaded {0} points.", result.size());
    return result;
}
Also used : ArrayList(java.util.ArrayList) Pointer(com.jme3.scene.plugins.blender.file.Pointer) Structure(com.jme3.scene.plugins.blender.file.Structure) HashSet(java.util.HashSet)

Aggregations

Structure (com.jme3.scene.plugins.blender.file.Structure)31 Pointer (com.jme3.scene.plugins.blender.file.Pointer)26 ArrayList (java.util.ArrayList)19 BlenderFileException (com.jme3.scene.plugins.blender.file.BlenderFileException)10 Vector3f (com.jme3.math.Vector3f)7 FileBlockHeader (com.jme3.scene.plugins.blender.file.FileBlockHeader)7 List (java.util.List)7 DynamicArray (com.jme3.scene.plugins.blender.file.DynamicArray)6 TemporalMesh (com.jme3.scene.plugins.blender.meshes.TemporalMesh)5 Map (java.util.Map)5 Node (com.jme3.scene.Node)4 AnimationHelper (com.jme3.scene.plugins.blender.animations.AnimationHelper)4 MeshHelper (com.jme3.scene.plugins.blender.meshes.MeshHelper)4 ObjectHelper (com.jme3.scene.plugins.blender.objects.ObjectHelper)4 Texture (com.jme3.texture.Texture)4 HashMap (java.util.HashMap)4 BlenderKey (com.jme3.asset.BlenderKey)3 Light (com.jme3.light.Light)3 ColorRGBA (com.jme3.math.ColorRGBA)3 Spline (com.jme3.math.Spline)3