Search in sources :

Example 1 with Spline

use of com.jme3.math.Spline in project jmonkeyengine by jMonkeyEngine.

the class MotionPath method CreateLinearPath.

private Geometry CreateLinearPath() {
    Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
    mat.getAdditionalRenderState().setWireframe(true);
    mat.setColor("Color", ColorRGBA.Blue);
    Geometry lineGeometry = new Geometry("line", new Curve(spline, 0));
    lineGeometry.setMaterial(mat);
    return lineGeometry;
}
Also used : Geometry(com.jme3.scene.Geometry) Curve(com.jme3.scene.shape.Curve) Material(com.jme3.material.Material)

Example 2 with Spline

use of com.jme3.math.Spline in project jmonkeyengine by jMonkeyEngine.

the class MotionPath method setPathSplineType.

/**
     * sets the type of spline used for the path interpolation for this path
     * @param pathSplineType
     */
public void setPathSplineType(SplineType pathSplineType) {
    spline.setType(pathSplineType);
    if (debugNode != null) {
        Node parent = debugNode.getParent();
        debugNode.removeFromParent();
        debugNode.detachAllChildren();
        debugNode = null;
        attachDebugNode(parent);
    }
}
Also used : Node(com.jme3.scene.Node)

Example 3 with Spline

use of com.jme3.math.Spline in project jmonkeyengine by jMonkeyEngine.

the class CurvesTemporalMesh method loadNurbSurface.

/**
     * This method loads the NURBS curve or surface.
     * @param nurb
     *            the NURBS data structure
     * @throws BlenderFileException
     *             an exception is thrown when problems with reading occur
     */
@SuppressWarnings("unchecked")
private void loadNurbSurface(Structure nurb, int materialIndex) throws BlenderFileException {
    // loading the knots
    List<Float>[] knots = new List[2];
    Pointer[] pKnots = new Pointer[] { (Pointer) nurb.getFieldValue("knotsu"), (Pointer) nurb.getFieldValue("knotsv") };
    for (int i = 0; i < knots.length; ++i) {
        if (pKnots[i].isNotNull()) {
            FileBlockHeader fileBlockHeader = blenderContext.getFileBlock(pKnots[i].getOldMemoryAddress());
            BlenderInputStream blenderInputStream = blenderContext.getInputStream();
            blenderInputStream.setPosition(fileBlockHeader.getBlockPosition());
            int knotsAmount = fileBlockHeader.getCount() * fileBlockHeader.getSize() / 4;
            knots[i] = new ArrayList<Float>(knotsAmount);
            for (int j = 0; j < knotsAmount; ++j) {
                knots[i].add(Float.valueOf(blenderInputStream.readFloat()));
            }
        }
    }
    // loading the flags and orders (basis functions degrees)
    int flag = ((Number) nurb.getFieldValue("flag")).intValue();
    boolean smooth = (flag & FLAG_SMOOTH) != 0;
    int flagU = ((Number) nurb.getFieldValue("flagu")).intValue();
    int flagV = ((Number) nurb.getFieldValue("flagv")).intValue();
    int orderU = ((Number) nurb.getFieldValue("orderu")).intValue();
    int orderV = ((Number) nurb.getFieldValue("orderv")).intValue();
    // loading control points and their weights
    int pntsU = ((Number) nurb.getFieldValue("pntsu")).intValue();
    int pntsV = ((Number) nurb.getFieldValue("pntsv")).intValue();
    List<Structure> bPoints = ((Pointer) nurb.getFieldValue("bp")).fetchData();
    List<List<Vector4f>> controlPoints = new ArrayList<List<Vector4f>>(pntsV);
    for (int i = 0; i < pntsV; ++i) {
        List<Vector4f> uControlPoints = new ArrayList<Vector4f>(pntsU);
        for (int j = 0; j < pntsU; ++j) {
            DynamicArray<Float> vec = (DynamicArray<Float>) bPoints.get(j + i * pntsU).getFieldValue("vec");
            if (blenderContext.getBlenderKey().isFixUpAxis()) {
                uControlPoints.add(new Vector4f(vec.get(0).floatValue(), vec.get(2).floatValue(), -vec.get(1).floatValue(), vec.get(3).floatValue()));
            } else {
                uControlPoints.add(new Vector4f(vec.get(0).floatValue(), vec.get(1).floatValue(), vec.get(2).floatValue(), vec.get(3).floatValue()));
            }
        }
        if ((flagU & 0x01) != 0) {
            for (int k = 0; k < orderU - 1; ++k) {
                uControlPoints.add(uControlPoints.get(k));
            }
        }
        controlPoints.add(uControlPoints);
    }
    if ((flagV & 0x01) != 0) {
        for (int k = 0; k < orderV - 1; ++k) {
            controlPoints.add(controlPoints.get(k));
        }
    }
    int originalVerticesAmount = vertices.size();
    int resolu = ((Number) nurb.getFieldValue("resolu")).intValue();
    if (knots[1] == null) {
        // creating the NURB curve
        Curve curve = new Curve(new Spline(controlPoints.get(0), knots[0]), resolu);
        FloatBuffer vertsBuffer = (FloatBuffer) curve.getBuffer(Type.Position).getData();
        beziers.add(new BezierLine(BufferUtils.getVector3Array(vertsBuffer), materialIndex, smooth, false));
    } else {
        // creating the NURB surface
        int resolv = ((Number) nurb.getFieldValue("resolv")).intValue();
        int uSegments = resolu * controlPoints.get(0).size() - 1;
        int vSegments = resolv * controlPoints.size() - 1;
        Surface nurbSurface = Surface.createNurbsSurface(controlPoints, knots, uSegments, vSegments, orderU, orderV, smooth);
        FloatBuffer vertsBuffer = (FloatBuffer) nurbSurface.getBuffer(Type.Position).getData();
        vertices.addAll(Arrays.asList(BufferUtils.getVector3Array(vertsBuffer)));
        FloatBuffer normalsBuffer = (FloatBuffer) nurbSurface.getBuffer(Type.Normal).getData();
        normals.addAll(Arrays.asList(BufferUtils.getVector3Array(normalsBuffer)));
        IndexBuffer indexBuffer = nurbSurface.getIndexBuffer();
        for (int i = 0; i < indexBuffer.size(); i += 3) {
            int index1 = indexBuffer.get(i) + originalVerticesAmount;
            int index2 = indexBuffer.get(i + 1) + originalVerticesAmount;
            int index3 = indexBuffer.get(i + 2) + originalVerticesAmount;
            faces.add(new Face(new Integer[] { index1, index2, index3 }, smooth, materialIndex, null, null, this));
        }
    }
}
Also used : ArrayList(java.util.ArrayList) Pointer(com.jme3.scene.plugins.blender.file.Pointer) FloatBuffer(java.nio.FloatBuffer) Spline(com.jme3.math.Spline) Surface(com.jme3.scene.shape.Surface) IndexBuffer(com.jme3.scene.mesh.IndexBuffer) Vector4f(com.jme3.math.Vector4f) ArrayList(java.util.ArrayList) List(java.util.List) BlenderInputStream(com.jme3.scene.plugins.blender.file.BlenderInputStream) Structure(com.jme3.scene.plugins.blender.file.Structure) Face(com.jme3.scene.plugins.blender.meshes.Face) FileBlockHeader(com.jme3.scene.plugins.blender.file.FileBlockHeader) Curve(com.jme3.scene.shape.Curve) DynamicArray(com.jme3.scene.plugins.blender.file.DynamicArray)

Example 4 with Spline

use of com.jme3.math.Spline in project jmonkeyengine by jMonkeyEngine.

the class MotionPath method CreateCatmullRomPath.

private Geometry CreateCatmullRomPath() {
    Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
    mat.getAdditionalRenderState().setWireframe(true);
    mat.setColor("Color", ColorRGBA.Blue);
    Geometry lineGeometry = new Geometry("line", new Curve(spline, 10));
    lineGeometry.setMaterial(mat);
    return lineGeometry;
}
Also used : Geometry(com.jme3.scene.Geometry) Curve(com.jme3.scene.shape.Curve) Material(com.jme3.material.Material)

Example 5 with Spline

use of com.jme3.math.Spline 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)

Aggregations

Curve (com.jme3.scene.shape.Curve)5 Spline (com.jme3.math.Spline)3 Pointer (com.jme3.scene.plugins.blender.file.Pointer)3 FloatBuffer (java.nio.FloatBuffer)3 Material (com.jme3.material.Material)2 Vector3f (com.jme3.math.Vector3f)2 Geometry (com.jme3.scene.Geometry)2 DynamicArray (com.jme3.scene.plugins.blender.file.DynamicArray)2 Structure (com.jme3.scene.plugins.blender.file.Structure)2 ArrayList (java.util.ArrayList)2 Vector4f (com.jme3.math.Vector4f)1 Node (com.jme3.scene.Node)1 IndexBuffer (com.jme3.scene.mesh.IndexBuffer)1 BlenderInputStream (com.jme3.scene.plugins.blender.file.BlenderInputStream)1 FileBlockHeader (com.jme3.scene.plugins.blender.file.FileBlockHeader)1 Face (com.jme3.scene.plugins.blender.meshes.Face)1 Surface (com.jme3.scene.shape.Surface)1 List (java.util.List)1