159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/*
259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2009-2010 jMonkeyEngine
359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * All rights reserved.
459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Redistribution and use in source and binary forms, with or without
659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modification, are permitted provided that the following conditions are
759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * met:
859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions of source code must retain the above copyright
1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   notice, this list of conditions and the following disclaimer.
1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions in binary form must reproduce the above copyright
1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   notice, this list of conditions and the following disclaimer in the
1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   documentation and/or other materials provided with the distribution.
1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   may be used to endorse or promote products derived from this software
1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   without specific prior written permission.
1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */
3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// $Id: Torus.java 4131 2009-03-19 20:15:28Z blaine.dev $
3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.scene.shape;
3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.InputCapsule;
3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.JmeExporter;
3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.JmeImporter;
3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.OutputCapsule;
4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.FastMath;
4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.Vector3f;
4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.Mesh;
4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.VertexBuffer.Type;
4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.BufferUtils;
4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.IOException;
4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.FloatBuffer;
4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.ShortBuffer;
4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/**
5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * An ordinary (single holed) torus.
5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <p>
5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * The center is by default the origin.
5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Mark Powell
5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @version $Revision: 4131 $, $Date: 2009-03-19 16:15:28 -0400 (Thu, 19 Mar 2009) $
5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */
5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class Torus extends Mesh {
5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private int circleSamples;
6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private int radialSamples;
6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private float innerRadius;
6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private float outerRadius;
6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public Torus() {
6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Constructs a new Torus. Center is the origin, but the Torus may be
7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * transformed.
7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param circleSamples
7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            The number of samples along the circles.
7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param radialSamples
7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            The number of samples along the radial.
7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param innerRadius
7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            The radius of the inner begining of the Torus.
8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param outerRadius
8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *            The radius of the outter end of the Torus.
8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public Torus(int circleSamples, int radialSamples,
8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            float innerRadius, float outerRadius) {
8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        super();
8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        updateGeometry(circleSamples, radialSamples, innerRadius, outerRadius);
8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public int getCircleSamples() {
9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return circleSamples;
9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public float getInnerRadius() {
9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return innerRadius;
9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public float getOuterRadius() {
9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return outerRadius;
9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public int getRadialSamples() {
10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return radialSamples;
10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void read(JmeImporter e) throws IOException {
10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        super.read(e);
10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        InputCapsule capsule = e.getCapsule(this);
10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        circleSamples = capsule.readInt("circleSamples", 0);
11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        radialSamples = capsule.readInt("radialSamples", 0);
11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        innerRadius = capsule.readFloat("innerRadius", 0);
11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        outerRadius = capsule.readFloat("outerRaidus", 0);
11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private void setGeometryData() {
11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // allocate vertices
11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int vertCount = (circleSamples + 1) * (radialSamples + 1);
11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        FloatBuffer fpb = BufferUtils.createVector3Buffer(vertCount);
11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setBuffer(Type.Position, 3, fpb);
12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // allocate normals if requested
12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        FloatBuffer fnb = BufferUtils.createVector3Buffer(vertCount);
12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setBuffer(Type.Normal, 3, fnb);
12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // allocate texture coordinates
12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        FloatBuffer ftb = BufferUtils.createVector2Buffer(vertCount);
12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setBuffer(Type.TexCoord, 2, ftb);
12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // generate geometry
13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        float inverseCircleSamples = 1.0f / circleSamples;
13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        float inverseRadialSamples = 1.0f / radialSamples;
13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int i = 0;
13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // generate the cylinder itself
13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Vector3f radialAxis = new Vector3f(), torusMiddle = new Vector3f(), tempNormal = new Vector3f();
13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int circleCount = 0; circleCount < circleSamples; circleCount++) {
13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            // compute center point on torus circle at specified angle
13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            float circleFraction = circleCount * inverseCircleSamples;
13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            float theta = FastMath.TWO_PI * circleFraction;
13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            float cosTheta = FastMath.cos(theta);
14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            float sinTheta = FastMath.sin(theta);
14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            radialAxis.set(cosTheta, sinTheta, 0);
14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            radialAxis.mult(outerRadius, torusMiddle);
14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            // compute slice vertices with duplication at end point
14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            int iSave = i;
14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            for (int radialCount = 0; radialCount < radialSamples; radialCount++) {
14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                float radialFraction = radialCount * inverseRadialSamples;
14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                // in [0,1)
14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                float phi = FastMath.TWO_PI * radialFraction;
15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                float cosPhi = FastMath.cos(phi);
15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                float sinPhi = FastMath.sin(phi);
15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                tempNormal.set(radialAxis).multLocal(cosPhi);
15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                tempNormal.z += sinPhi;
15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                fnb.put(tempNormal.x).put(tempNormal.y).put(
15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                        tempNormal.z);
15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                tempNormal.multLocal(innerRadius).addLocal(torusMiddle);
15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                fpb.put(tempNormal.x).put(tempNormal.y).put(
15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                        tempNormal.z);
16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                ftb.put(radialFraction).put(circleFraction);
16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                i++;
16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            BufferUtils.copyInternalVector3(fpb, iSave, i);
16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            BufferUtils.copyInternalVector3(fnb, iSave, i);
16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            ftb.put(1.0f).put(circleFraction);
16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            i++;
17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // duplicate the cylinder ends to form a torus
17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int iR = 0; iR <= radialSamples; iR++, i++) {
17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            BufferUtils.copyInternalVector3(fpb, iR, i);
17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            BufferUtils.copyInternalVector3(fnb, iR, i);
17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            BufferUtils.copyInternalVector2(ftb, iR, i);
17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            ftb.put(i * 2 + 1, 1.0f);
17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private void setIndexData() {
18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // allocate connectivity
18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int triCount = 2 * circleSamples * radialSamples;
18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        ShortBuffer sib = BufferUtils.createShortBuffer(3 * triCount);
18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setBuffer(Type.Index, 3, sib);
18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int i;
19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // generate connectivity
19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int connectionStart = 0;
19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int index = 0;
19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int circleCount = 0; circleCount < circleSamples; circleCount++) {
19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            int i0 = connectionStart;
19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            int i1 = i0 + 1;
19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            connectionStart += radialSamples + 1;
19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            int i2 = connectionStart;
19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            int i3 = i2 + 1;
19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            for (i = 0; i < radialSamples; i++, index += 6) {
20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//                if (true) {
20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    sib.put((short)i0++);
20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    sib.put((short)i2);
20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    sib.put((short)i1);
20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    sib.put((short)i1++);
20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    sib.put((short)i2++);
20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    sib.put((short)i3++);
20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//                    getIndexBuffer().put(i0++);
20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//                    getIndexBuffer().put(i2);
21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//                    getIndexBuffer().put(i1);
21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//                    getIndexBuffer().put(i1++);
21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//                    getIndexBuffer().put(i2++);
21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//                    getIndexBuffer().put(i3++);
21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//                } else {
21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//                    getIndexBuffer().put(i0++);
21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//                    getIndexBuffer().put(i1);
21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//                    getIndexBuffer().put(i2);
21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//                    getIndexBuffer().put(i1++);
21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//                    getIndexBuffer().put(i3++);
22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//                    getIndexBuffer().put(i2++);
22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//                }
22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Rebuilds this torus based on a new set of parameters.
22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     *
22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param circleSamples the number of samples along the circles.
23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param radialSamples the number of samples along the radial.
23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param innerRadius the radius of the inner begining of the Torus.
23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param outerRadius the radius of the outter end of the Torus.
23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void updateGeometry(int circleSamples, int radialSamples, float innerRadius, float outerRadius) {
23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.circleSamples = circleSamples;
23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.radialSamples = radialSamples;
23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.innerRadius = innerRadius;
23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.outerRadius = outerRadius;
23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setGeometryData();
24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setIndexData();
24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        updateBound();
24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        updateCounts();
24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(JmeExporter e) throws IOException {
24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        super.write(e);
24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        OutputCapsule capsule = e.getCapsule(this);
24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        capsule.write(circleSamples, "circleSamples", 0);
25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        capsule.write(radialSamples, "radialSamples", 0);
25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        capsule.write(innerRadius, "innerRadius", 0);
25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        capsule.write(outerRadius, "outerRadius", 0);
25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta}