parent
866bf8d694
commit
49c6705bcc
@ -0,0 +1,179 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2009-2015 jMonkeyEngine |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* * Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
*/ |
||||||
|
package com.jme3.gde.scenecomposer.gizmo.light.shape; |
||||||
|
|
||||||
|
import com.jme3.asset.AssetManager; |
||||||
|
import com.jme3.material.Material; |
||||||
|
import com.jme3.math.ColorRGBA; |
||||||
|
import com.jme3.math.FastMath; |
||||||
|
import com.jme3.scene.Geometry; |
||||||
|
import com.jme3.scene.Mesh; |
||||||
|
import com.jme3.scene.VertexBuffer.Type; |
||||||
|
import com.jme3.scene.control.BillboardControl; |
||||||
|
import com.jme3.util.BufferUtils; |
||||||
|
import java.nio.FloatBuffer; |
||||||
|
import java.nio.ShortBuffer; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* A debuging shape for a BoundingSphere |
||||||
|
* Consists of 3 axis aligned circles. |
||||||
|
* |
||||||
|
* @author nehon |
||||||
|
*/ |
||||||
|
public class ProbeRadiusShape extends Mesh { |
||||||
|
|
||||||
|
protected int vertCount; |
||||||
|
protected int triCount; |
||||||
|
protected int radialSamples = 64; |
||||||
|
protected boolean useEvenSlices; |
||||||
|
protected boolean interior; |
||||||
|
/** |
||||||
|
* the distance from the center point each point falls on |
||||||
|
*/ |
||||||
|
public float radius; |
||||||
|
|
||||||
|
public float getRadius() { |
||||||
|
return radius; |
||||||
|
} |
||||||
|
|
||||||
|
public ProbeRadiusShape() { |
||||||
|
setGeometryData(); |
||||||
|
setIndexData(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* builds the vertices based on the radius |
||||||
|
*/ |
||||||
|
private void setGeometryData() { |
||||||
|
setMode(Mode.Lines); |
||||||
|
|
||||||
|
FloatBuffer posBuf = BufferUtils.createVector3Buffer((radialSamples + 1)); |
||||||
|
FloatBuffer colBuf = BufferUtils.createFloatBuffer((radialSamples + 1) * 4); |
||||||
|
|
||||||
|
setBuffer(Type.Position, 3, posBuf); |
||||||
|
setBuffer(Type.Color, 4, colBuf); |
||||||
|
|
||||||
|
// generate geometry
|
||||||
|
float fInvRS = 1.0f / radialSamples; |
||||||
|
|
||||||
|
// Generate points on the unit circle to be used in computing the mesh
|
||||||
|
// points on a sphere slice.
|
||||||
|
float[] afSin = new float[(radialSamples + 1)]; |
||||||
|
float[] afCos = new float[(radialSamples + 1)]; |
||||||
|
for (int iR = 0; iR < radialSamples; iR++) { |
||||||
|
float fAngle = FastMath.TWO_PI * fInvRS * iR; |
||||||
|
afCos[iR] = FastMath.cos(fAngle); |
||||||
|
afSin[iR] = FastMath.sin(fAngle); |
||||||
|
} |
||||||
|
afSin[radialSamples] = afSin[0]; |
||||||
|
afCos[radialSamples] = afCos[0]; |
||||||
|
|
||||||
|
for (int iR = 0; iR <= radialSamples; iR++) { |
||||||
|
posBuf.put(afCos[iR]) |
||||||
|
.put(afSin[iR]) |
||||||
|
.put(0); |
||||||
|
colBuf.put(ColorRGBA.Orange.r) |
||||||
|
.put(ColorRGBA.Orange.g) |
||||||
|
.put(ColorRGBA.Orange.b) |
||||||
|
.put(ColorRGBA.Orange.a); |
||||||
|
|
||||||
|
} |
||||||
|
// for (int iR = 0; iR <= radialSamples; iR++) {
|
||||||
|
// posBuf.put(afCos[iR])
|
||||||
|
// .put(0)
|
||||||
|
// .put(afSin[iR]);
|
||||||
|
// colBuf.put(ColorRGBA.Green.r)
|
||||||
|
// .put(ColorRGBA.Green.g)
|
||||||
|
// .put(ColorRGBA.Green.b)
|
||||||
|
// .put(ColorRGBA.Green.a);
|
||||||
|
// }
|
||||||
|
// for (int iR = 0; iR <= radialSamples; iR++) {
|
||||||
|
// posBuf.put(0)
|
||||||
|
// .put(afCos[iR])
|
||||||
|
// .put(afSin[iR]);
|
||||||
|
// colBuf.put(ColorRGBA.Yellow.r)
|
||||||
|
// .put(ColorRGBA.Yellow.g)
|
||||||
|
// .put(ColorRGBA.Yellow.b)
|
||||||
|
// .put(ColorRGBA.Yellow.a);
|
||||||
|
// }
|
||||||
|
|
||||||
|
updateBound(); |
||||||
|
setStatic(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* sets the indices for rendering the sphere. |
||||||
|
*/ |
||||||
|
private void setIndexData() { |
||||||
|
// allocate connectivity
|
||||||
|
int nbSegments = (radialSamples);// * 3;
|
||||||
|
|
||||||
|
ShortBuffer idxBuf = BufferUtils.createShortBuffer(2 * nbSegments); |
||||||
|
setBuffer(Type.Index, 2, idxBuf); |
||||||
|
|
||||||
|
int idx = 0; |
||||||
|
int segDone = 0; |
||||||
|
while (segDone < nbSegments) { |
||||||
|
idxBuf.put((short) idx); |
||||||
|
idxBuf.put((short) (idx + 1)); |
||||||
|
idx++; |
||||||
|
segDone++; |
||||||
|
// if (segDone == radialSamples || segDone == radialSamples * 2) {
|
||||||
|
// idx++;
|
||||||
|
// }
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Convenience factory method that creates a debuging bounding sphere geometry |
||||||
|
* @param assetManager the assetManager |
||||||
|
* @return the bounding sphere debug geometry. |
||||||
|
*/ |
||||||
|
public static Geometry createShape(AssetManager assetManager) { |
||||||
|
ProbeRadiusShape b = new ProbeRadiusShape(); |
||||||
|
Geometry geom = new Geometry("BoundingDebug", b); |
||||||
|
|
||||||
|
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||||
|
mat.setBoolean("VertexColor", true); |
||||||
|
mat.getAdditionalRenderState().setWireframe(true); |
||||||
|
geom.addControl(new BillboardControl()); |
||||||
|
|
||||||
|
|
||||||
|
geom.setMaterial(mat); |
||||||
|
return geom; |
||||||
|
|
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue