parent
ca497f458a
commit
f2cd1334ec
@ -1,39 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (c) 2009-2012 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 jme3tools.converters; |
|
||||||
|
|
||||||
import java.util.Map; |
|
||||||
|
|
||||||
public interface Converter<T> { |
|
||||||
public T convert(T input, Map<String, String> params); |
|
||||||
} |
|
@ -1,80 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (c) 2009-2012 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 jme3tools.converters; |
|
||||||
|
|
||||||
import com.jme3.asset.AssetManager; |
|
||||||
import com.jme3.system.JmeSystem; |
|
||||||
import java.io.File; |
|
||||||
import java.io.FileOutputStream; |
|
||||||
import java.io.IOException; |
|
||||||
import java.util.jar.JarEntry; |
|
||||||
import java.util.jar.JarOutputStream; |
|
||||||
|
|
||||||
public class FolderConverter { |
|
||||||
|
|
||||||
private static AssetManager assetManager; |
|
||||||
private static File sourceRoot; |
|
||||||
private static JarOutputStream jarOut; |
|
||||||
private static long time; |
|
||||||
|
|
||||||
private static void process(File file) throws IOException{ |
|
||||||
String name = file.getName().replaceAll("[\\/\\.]", "_"); |
|
||||||
JarEntry entry = new JarEntry(name); |
|
||||||
entry.setTime(time); |
|
||||||
|
|
||||||
jarOut.putNextEntry(entry); |
|
||||||
} |
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException{ |
|
||||||
if (args.length == 0){ |
|
||||||
System.out.println("Usage: java -jar FolderConverter <input folder>"); |
|
||||||
System.out.println(); |
|
||||||
System.out.println(" Converts files from input to output"); |
|
||||||
System.exit(1); |
|
||||||
} |
|
||||||
|
|
||||||
sourceRoot = new File(args[0]); |
|
||||||
|
|
||||||
File jarFile = new File(sourceRoot.getParent(), sourceRoot.getName()+".jar"); |
|
||||||
FileOutputStream out = new FileOutputStream(jarFile); |
|
||||||
jarOut = new JarOutputStream(out); |
|
||||||
|
|
||||||
assetManager = JmeSystem.newAssetManager(); |
|
||||||
assetManager.registerLocator(sourceRoot.toString(), |
|
||||||
"com.jme3.asset.plugins.FileSystemLocator"); |
|
||||||
for (File f : sourceRoot.listFiles()){ |
|
||||||
process(f); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,351 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (c) 2009-2012 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 jme3tools.converters.model; |
|
||||||
|
|
||||||
import com.jme3.bounding.BoundingBox; |
|
||||||
import com.jme3.math.Transform; |
|
||||||
import com.jme3.math.Vector2f; |
|
||||||
import com.jme3.math.Vector3f; |
|
||||||
import com.jme3.scene.Geometry; |
|
||||||
import com.jme3.scene.Mesh; |
|
||||||
import com.jme3.scene.VertexBuffer; |
|
||||||
import com.jme3.scene.VertexBuffer.Format; |
|
||||||
import com.jme3.scene.VertexBuffer.Type; |
|
||||||
import com.jme3.scene.VertexBuffer.Usage; |
|
||||||
import com.jme3.scene.mesh.IndexBuffer; |
|
||||||
import com.jme3.util.BufferUtils; |
|
||||||
import java.nio.*; |
|
||||||
|
|
||||||
@Deprecated |
|
||||||
public class FloatToFixed { |
|
||||||
|
|
||||||
private static final float shortSize = Short.MAX_VALUE - Short.MIN_VALUE; |
|
||||||
private static final float shortOff = (Short.MAX_VALUE + Short.MIN_VALUE) * 0.5f; |
|
||||||
|
|
||||||
private static final float byteSize = Byte.MAX_VALUE - Byte.MIN_VALUE; |
|
||||||
private static final float byteOff = (Byte.MAX_VALUE + Byte.MIN_VALUE) * 0.5f; |
|
||||||
|
|
||||||
@Deprecated |
|
||||||
public static void convertToFixed(Geometry geom, Format posFmt, Format nmFmt, Format tcFmt){ |
|
||||||
geom.updateModelBound(); |
|
||||||
BoundingBox bbox = (BoundingBox) geom.getModelBound(); |
|
||||||
Mesh mesh = geom.getMesh(); |
|
||||||
|
|
||||||
VertexBuffer positions = mesh.getBuffer(Type.Position); |
|
||||||
VertexBuffer normals = mesh.getBuffer(Type.Normal); |
|
||||||
VertexBuffer texcoords = mesh.getBuffer(Type.TexCoord); |
|
||||||
VertexBuffer indices = mesh.getBuffer(Type.Index); |
|
||||||
|
|
||||||
// positions
|
|
||||||
FloatBuffer fb = (FloatBuffer) positions.getData(); |
|
||||||
if (posFmt != Format.Float){ |
|
||||||
Buffer newBuf = VertexBuffer.createBuffer(posFmt, positions.getNumComponents(), |
|
||||||
mesh.getVertexCount()); |
|
||||||
Transform t = convertPositions(fb, bbox, newBuf); |
|
||||||
t.combineWithParent(geom.getLocalTransform()); |
|
||||||
geom.setLocalTransform(t); |
|
||||||
|
|
||||||
VertexBuffer newPosVb = new VertexBuffer(Type.Position); |
|
||||||
newPosVb.setupData(positions.getUsage(), |
|
||||||
positions.getNumComponents(), |
|
||||||
posFmt, |
|
||||||
newBuf); |
|
||||||
mesh.clearBuffer(Type.Position); |
|
||||||
mesh.setBuffer(newPosVb); |
|
||||||
} |
|
||||||
|
|
||||||
// normals, automatically convert to signed byte
|
|
||||||
fb = (FloatBuffer) normals.getData(); |
|
||||||
|
|
||||||
ByteBuffer bb = BufferUtils.createByteBuffer(fb.capacity()); |
|
||||||
convertNormals(fb, bb); |
|
||||||
|
|
||||||
normals = new VertexBuffer(Type.Normal); |
|
||||||
normals.setupData(Usage.Static, 3, Format.Byte, bb); |
|
||||||
normals.setNormalized(true); |
|
||||||
mesh.clearBuffer(Type.Normal); |
|
||||||
mesh.setBuffer(normals); |
|
||||||
|
|
||||||
// texcoords
|
|
||||||
fb = (FloatBuffer) texcoords.getData(); |
|
||||||
if (tcFmt != Format.Float){ |
|
||||||
Buffer newBuf = VertexBuffer.createBuffer(tcFmt, |
|
||||||
texcoords.getNumComponents(), |
|
||||||
mesh.getVertexCount()); |
|
||||||
convertTexCoords2D(fb, newBuf); |
|
||||||
|
|
||||||
VertexBuffer newTcVb = new VertexBuffer(Type.TexCoord); |
|
||||||
newTcVb.setupData(texcoords.getUsage(), |
|
||||||
texcoords.getNumComponents(), |
|
||||||
tcFmt, |
|
||||||
newBuf); |
|
||||||
mesh.clearBuffer(Type.TexCoord); |
|
||||||
mesh.setBuffer(newTcVb); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static void compressIndexBuffer(Mesh mesh){ |
|
||||||
int vertCount = mesh.getVertexCount(); |
|
||||||
VertexBuffer vb = mesh.getBuffer(Type.Index); |
|
||||||
Format targetFmt; |
|
||||||
if (vb.getFormat() == Format.UnsignedInt && vertCount <= 0xffff){ |
|
||||||
if (vertCount <= 256) |
|
||||||
targetFmt = Format.UnsignedByte; |
|
||||||
else |
|
||||||
targetFmt = Format.UnsignedShort; |
|
||||||
}else if (vb.getFormat() == Format.UnsignedShort && vertCount <= 0xff){ |
|
||||||
targetFmt = Format.UnsignedByte; |
|
||||||
}else{ |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
IndexBuffer src = mesh.getIndexBuffer(); |
|
||||||
Buffer newBuf = VertexBuffer.createBuffer(targetFmt, vb.getNumComponents(), src.size()); |
|
||||||
|
|
||||||
VertexBuffer newVb = new VertexBuffer(Type.Index); |
|
||||||
newVb.setupData(vb.getUsage(), vb.getNumComponents(), targetFmt, newBuf); |
|
||||||
mesh.clearBuffer(Type.Index); |
|
||||||
mesh.setBuffer(newVb); |
|
||||||
|
|
||||||
IndexBuffer dst = mesh.getIndexBuffer(); |
|
||||||
for (int i = 0; i < src.size(); i++){ |
|
||||||
dst.put(i, src.get(i)); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private static void convertToFixed(FloatBuffer input, IntBuffer output){ |
|
||||||
if (output.capacity() < input.capacity()) |
|
||||||
throw new RuntimeException("Output must be at least as large as input!"); |
|
||||||
|
|
||||||
input.clear(); |
|
||||||
output.clear(); |
|
||||||
for (int i = 0; i < input.capacity(); i++){ |
|
||||||
output.put( (int) (input.get() * (float)(1<<16)) ); |
|
||||||
} |
|
||||||
output.flip(); |
|
||||||
} |
|
||||||
|
|
||||||
private static void convertToFloat(IntBuffer input, FloatBuffer output){ |
|
||||||
if (output.capacity() < input.capacity()) |
|
||||||
throw new RuntimeException("Output must be at least as large as input!"); |
|
||||||
|
|
||||||
input.clear(); |
|
||||||
output.clear(); |
|
||||||
for (int i = 0; i < input.capacity(); i++){ |
|
||||||
output.put( ((float)input.get() / (float)(1<<16)) ); |
|
||||||
} |
|
||||||
output.flip(); |
|
||||||
} |
|
||||||
|
|
||||||
private static void convertToUByte(FloatBuffer input, ByteBuffer output){ |
|
||||||
if (output.capacity() < input.capacity()) |
|
||||||
throw new RuntimeException("Output must be at least as large as input!"); |
|
||||||
|
|
||||||
input.clear(); |
|
||||||
output.clear(); |
|
||||||
for (int i = 0; i < input.capacity(); i++){ |
|
||||||
output.put( (byte) (input.get() * 255f) ); |
|
||||||
} |
|
||||||
output.flip(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static VertexBuffer convertToUByte(VertexBuffer vb){ |
|
||||||
FloatBuffer fb = (FloatBuffer) vb.getData(); |
|
||||||
ByteBuffer bb = BufferUtils.createByteBuffer(fb.capacity()); |
|
||||||
convertToUByte(fb, bb); |
|
||||||
|
|
||||||
VertexBuffer newVb = new VertexBuffer(vb.getBufferType()); |
|
||||||
newVb.setupData(vb.getUsage(), |
|
||||||
vb.getNumComponents(), |
|
||||||
Format.UnsignedByte, |
|
||||||
bb); |
|
||||||
newVb.setNormalized(true); |
|
||||||
return newVb; |
|
||||||
} |
|
||||||
|
|
||||||
public static VertexBuffer convertToFixed(VertexBuffer vb){ |
|
||||||
if (vb.getFormat() == Format.Int) |
|
||||||
return vb; |
|
||||||
|
|
||||||
FloatBuffer fb = (FloatBuffer) vb.getData(); |
|
||||||
IntBuffer ib = BufferUtils.createIntBuffer(fb.capacity()); |
|
||||||
convertToFixed(fb, ib); |
|
||||||
|
|
||||||
VertexBuffer newVb = new VertexBuffer(vb.getBufferType()); |
|
||||||
newVb.setupData(vb.getUsage(), |
|
||||||
vb.getNumComponents(), |
|
||||||
Format.Int, |
|
||||||
ib); |
|
||||||
return newVb; |
|
||||||
} |
|
||||||
|
|
||||||
public static VertexBuffer convertToFloat(VertexBuffer vb){ |
|
||||||
if (vb.getFormat() == Format.Float) |
|
||||||
return vb; |
|
||||||
|
|
||||||
IntBuffer ib = (IntBuffer) vb.getData(); |
|
||||||
FloatBuffer fb = BufferUtils.createFloatBuffer(ib.capacity()); |
|
||||||
convertToFloat(ib, fb); |
|
||||||
|
|
||||||
VertexBuffer newVb = new VertexBuffer(vb.getBufferType()); |
|
||||||
newVb.setupData(vb.getUsage(), |
|
||||||
vb.getNumComponents(), |
|
||||||
Format.Float, |
|
||||||
fb); |
|
||||||
return newVb; |
|
||||||
} |
|
||||||
|
|
||||||
private static void convertNormals(FloatBuffer input, ByteBuffer output){ |
|
||||||
if (output.capacity() < input.capacity()) |
|
||||||
throw new RuntimeException("Output must be at least as large as input!"); |
|
||||||
|
|
||||||
input.clear(); |
|
||||||
output.clear(); |
|
||||||
Vector3f temp = new Vector3f(); |
|
||||||
int vertexCount = input.capacity() / 3; |
|
||||||
for (int i = 0; i < vertexCount; i++){ |
|
||||||
BufferUtils.populateFromBuffer(temp, input, i); |
|
||||||
|
|
||||||
// offset and scale vector into -128 ... 127
|
|
||||||
temp.multLocal(127).addLocal(0.5f, 0.5f, 0.5f); |
|
||||||
|
|
||||||
// quantize
|
|
||||||
byte v1 = (byte) temp.getX(); |
|
||||||
byte v2 = (byte) temp.getY(); |
|
||||||
byte v3 = (byte) temp.getZ(); |
|
||||||
|
|
||||||
// store
|
|
||||||
output.put(v1).put(v2).put(v3); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private static void convertTexCoords2D(FloatBuffer input, Buffer output){ |
|
||||||
if (output.capacity() < input.capacity()) |
|
||||||
throw new RuntimeException("Output must be at least as large as input!"); |
|
||||||
|
|
||||||
input.clear(); |
|
||||||
output.clear(); |
|
||||||
Vector2f temp = new Vector2f(); |
|
||||||
int vertexCount = input.capacity() / 2; |
|
||||||
|
|
||||||
ShortBuffer sb = null; |
|
||||||
IntBuffer ib = null; |
|
||||||
|
|
||||||
if (output instanceof ShortBuffer) |
|
||||||
sb = (ShortBuffer) output; |
|
||||||
else if (output instanceof IntBuffer) |
|
||||||
ib = (IntBuffer) output; |
|
||||||
else |
|
||||||
throw new UnsupportedOperationException(); |
|
||||||
|
|
||||||
for (int i = 0; i < vertexCount; i++){ |
|
||||||
BufferUtils.populateFromBuffer(temp, input, i); |
|
||||||
|
|
||||||
if (sb != null){ |
|
||||||
sb.put( (short) (temp.getX()*Short.MAX_VALUE) ); |
|
||||||
sb.put( (short) (temp.getY()*Short.MAX_VALUE) ); |
|
||||||
}else{ |
|
||||||
int v1 = (int) (temp.getX() * ((float)(1 << 16))); |
|
||||||
int v2 = (int) (temp.getY() * ((float)(1 << 16))); |
|
||||||
ib.put(v1).put(v2); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private static Transform convertPositions(FloatBuffer input, BoundingBox bbox, Buffer output){ |
|
||||||
if (output.capacity() < input.capacity()) |
|
||||||
throw new RuntimeException("Output must be at least as large as input!"); |
|
||||||
|
|
||||||
Vector3f offset = bbox.getCenter().negate(); |
|
||||||
Vector3f size = new Vector3f(bbox.getXExtent(), bbox.getYExtent(), bbox.getZExtent()); |
|
||||||
size.multLocal(2); |
|
||||||
|
|
||||||
ShortBuffer sb = null; |
|
||||||
ByteBuffer bb = null; |
|
||||||
float dataTypeSize; |
|
||||||
float dataTypeOffset; |
|
||||||
if (output instanceof ShortBuffer){ |
|
||||||
sb = (ShortBuffer) output; |
|
||||||
dataTypeOffset = shortOff; |
|
||||||
dataTypeSize = shortSize; |
|
||||||
}else{ |
|
||||||
bb = (ByteBuffer) output; |
|
||||||
dataTypeOffset = byteOff; |
|
||||||
dataTypeSize = byteSize; |
|
||||||
} |
|
||||||
Vector3f scale = new Vector3f(); |
|
||||||
scale.set(dataTypeSize, dataTypeSize, dataTypeSize).divideLocal(size); |
|
||||||
|
|
||||||
Vector3f invScale = new Vector3f(); |
|
||||||
invScale.set(size).divideLocal(dataTypeSize); |
|
||||||
|
|
||||||
offset.multLocal(scale); |
|
||||||
offset.addLocal(dataTypeOffset, dataTypeOffset, dataTypeOffset); |
|
||||||
|
|
||||||
// offset = (-modelOffset * shortSize)/modelSize + shortOff
|
|
||||||
// scale = shortSize / modelSize
|
|
||||||
|
|
||||||
input.clear(); |
|
||||||
output.clear(); |
|
||||||
Vector3f temp = new Vector3f(); |
|
||||||
int vertexCount = input.capacity() / 3; |
|
||||||
for (int i = 0; i < vertexCount; i++){ |
|
||||||
BufferUtils.populateFromBuffer(temp, input, i); |
|
||||||
|
|
||||||
// offset and scale vector into -32768 ... 32767
|
|
||||||
// or into -128 ... 127 if using bytes
|
|
||||||
temp.multLocal(scale); |
|
||||||
temp.addLocal(offset); |
|
||||||
|
|
||||||
// quantize and store
|
|
||||||
if (sb != null){ |
|
||||||
short v1 = (short) temp.getX(); |
|
||||||
short v2 = (short) temp.getY(); |
|
||||||
short v3 = (short) temp.getZ(); |
|
||||||
sb.put(v1).put(v2).put(v3); |
|
||||||
}else{ |
|
||||||
byte v1 = (byte) temp.getX(); |
|
||||||
byte v2 = (byte) temp.getY(); |
|
||||||
byte v3 = (byte) temp.getZ(); |
|
||||||
bb.put(v1).put(v2).put(v3); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
Transform transform = new Transform(); |
|
||||||
transform.setTranslation(offset.negate().multLocal(invScale)); |
|
||||||
transform.setScale(invScale); |
|
||||||
return transform; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
Loading…
Reference in new issue