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