//#define HQ_ATTENUATION\r
\r
\r
-varying vec2 texCoord;\r
+varying LOWP vec2 texCoord;\r
\r
varying LOWP vec4 AmbientSum;\r
varying LOWP vec4 DiffuseSum;\r
#ifdef ALPHAMAP\r
alpha = alpha * texture2D(m_AlphaMap, newTexCoord).r;\r
#endif\r
- if(alpha < 0.1 /*m_AlphaDiscardThreshold*/){\r
- discard;\r
- }\r
+ //if(alpha < 0.1 /*m_AlphaDiscardThreshold*/){\r
+ // discard;\r
+ //}\r
\r
// ***********************\r
// Read from textures\r
return vec2(diffuseFactor, specularFactor) * vec2(lightDir.w);\r
}\r
#endif\r
-attribute vec4 inBoneWeight;\r
-attribute vec4 inBoneIndices;\r
-attribute vec4 inBoneIndex;\r
+attribute vec2 inBoneWeight;\r
+attribute vec2 inBoneIndex;\r
#ifdef USE_HWSKINNING\r
void Skinning_Compute(inout vec4 position, inout vec4 normal){\r
// vec4 index = inBoneIndices;\r
- vec4 index = inBoneIndex;\r
- vec4 weight = inBoneWeight;\r
+ vec2 index = inBoneIndex;\r
+ vec2 weight = inBoneWeight;\r
\r
- vec4 newPos = vec4(0.0,0.0,0.0,0.0);\r
- vec4 newNormal = vec4(0.0,0.0,0.0,0.0);\r
+ vec4 newPos;\r
+ vec4 newNormal;\r
\r
//for (float i = 1.0; i < 2.0; i += 1.0){\r
- mat4 skinMat = m_BoneMatrices[int(index.x)];\r
- newPos = weight.x * (skinMat * position);\r
- newNormal = weight.x * (skinMat * normal);\r
+ mat4 skinMat;\r
+#if NUM_BONES != 1\r
+ if (weight.x == 1.0) {\r
+ skinMat = m_BoneMatrices[int(index.x)];\r
+ newPos = (skinMat * position);\r
+ newNormal = (skinMat * normal);\r
+ } else if (weight.x == 0.0) {\r
+ skinMat = m_BoneMatrices[int(index.y)];\r
+ newPos = (skinMat * position);\r
+ newNormal = (skinMat * normal);\r
+ } else {\r
+ skinMat = m_BoneMatrices[int(index.x)];\r
+ newPos = weight.x * (skinMat * position);\r
+ newNormal = weight.x * (skinMat * normal);\r
+\r
+ skinMat = m_BoneMatrices[int(index.y)];\r
+ newPos = newPos + weight.y * (skinMat * position);\r
+ newNormal = newNormal + weight.y * (skinMat * normal);\r
+ }\r
+#else\r
+ skinMat = m_BoneMatrices[0];\r
+ newPos = (skinMat * position);\r
+ newNormal = (skinMat * normal);\r
+#endif\r
//index = index.yzwx;\r
//weight = weight.yzwx;\r
- skinMat = m_BoneMatrices[int(index.y)];\r
- newPos = newPos + weight.y * (skinMat * position);\r
- newNormal = newNormal + weight.y * (skinMat * normal);\r
//}\r
\r
position = newPos;\r
#ifdef USE_HWSKINNING\r
uniform mat4 m_BoneMatrices[NUM_BONES];\r
-attribute vec4 inBoneWeight;\r
-attribute vec4 inBoneIndices;\r
-attribute vec4 inBoneIndex;\r
+attribute vec2 inBoneWeight;\r
+attribute vec2 inBoneIndex;\r
#endif\r
uniform float m_EdgeSize; \r
// #import "MatDefs/pmd/Skinning.glsllib"\r
#ifdef USE_HWSKINNING\r
// Skinning_Compute(pos, normal);\r
// vec4 index = inBoneIndices;\r
- vec4 index = inBoneIndex;\r
- vec4 weight = inBoneWeight;\r
+ vec2 index = inBoneIndex;\r
+ vec2 weight = inBoneWeight;\r
\r
- vec4 newPos = vec4(0.0,0.0,0.0,0.0);\r
- vec4 newNormal = vec4(0.0,0.0,0.0,0.0);\r
+ vec4 newPos;\r
+ vec4 newNormal;\r
\r
//for (float i = 1.0; i < 2.0; i += 1.0){\r
- mat4 skinMat = m_BoneMatrices[int(index.x)];\r
- newPos = weight.x * (skinMat * pos);\r
- newNormal = weight.x * (skinMat * normal);\r
- //index = index.yzwx;\r
- //weight = weight.yzwx;\r
- skinMat = m_BoneMatrices[int(index.y)];\r
- newPos = newPos + weight.y * (skinMat * pos);\r
- newNormal = newNormal + weight.y * (skinMat * normal);\r
+ mat4 skinMat;\r
+#if NUM_BONES != 1\r
+ if (weight.x == 1.0) {\r
+ skinMat = m_BoneMatrices[int(index.x)];\r
+ newPos = (skinMat * pos);\r
+ newNormal = (skinMat * normal);\r
+ } else if (weight.x == 0.0) {\r
+ skinMat = m_BoneMatrices[int(index.y)];\r
+ newPos = (skinMat * pos);\r
+ newNormal = (skinMat * normal);\r
+ } else {\r
+ skinMat = m_BoneMatrices[int(index.x)];\r
+ newPos = weight.x * (skinMat * pos);\r
+ newNormal = weight.x * (skinMat * normal);\r
+\r
+ skinMat = m_BoneMatrices[int(index.y)];\r
+ newPos = newPos + weight.y * (skinMat * pos);\r
+ newNormal = newNormal + weight.y * (skinMat * normal);\r
+ }\r
+#else\r
+ skinMat = m_BoneMatrices[0];\r
+ newPos = (skinMat * pos);\r
+ newNormal = (skinMat * normal);\r
+#endif\r
//}\r
\r
pos = newPos;\r
// System.out.println("child size = "+node.getChildren().size()+" "+meshList.size()+" "+skinMeshList.size());
node.pmdGeometryArray = new PMDGeometry[meshConverter.getMeshDataList().size()];
int pmdGeometryIndex = 0;
+// GeometryOptimizer go = GeometryOptimizer.createNewInstance();
for(int i=0;i<meshConverter.getMeshDataList().size();i++) {
MeshData md = meshConverter.getMeshDataList().get(i);
PMDMesh mesh = createMesh_old(md);
meshList.add(mesh);
node.pmdGeometryArray[pmdGeometryIndex++] = geom;
meshConverter.getMeshDataList().set(i, null);
-// GeometryOptimizer go = GeometryOptimizer.createNewInstance();
// go.add(mesh);
-// mesh.setInterleaved();
-// go.optimize();
+ mesh.setInterleaved();
}
-// go.add(meshList.get(0));
-// go.add(meshList.get(1));
+// go.optimize();
createSkinCommonVertData();
for (PMDMaterial pmdMaterial : meshConverter.getSkinMeshData().getIndexMap().keySet()) {
PMDSkinMesh mesh = createSkinMesh(pmdMaterial);
tfb = BufferUtils.createFloatBuffer(md.getVertIndexList().size() * 2);
}
VertexBuffer wb = new VertexBuffer(VertexBuffer.Type.BoneWeight);
- FloatBuffer wfb = BufferUtils.createFloatBuffer(md.getVertIndexList().size() * 4);
+ FloatBuffer wfb = BufferUtils.createFloatBuffer(md.getVertIndexList().size() * 2);
VertexBuffer ib = new VertexBuffer(VertexBuffer.Type.Index);
ShortBuffer isb = BufferUtils.createShortBuffer(md.getIndexList().size()/*md.getMaterial().getFaceVertCount()*/);
VertexBuffer bib = new VertexBuffer(VertexBuffer.Type.BoneIndex);
- ShortBuffer bisb = BufferUtils.createShortBuffer(md.getVertIndexList().size() * 4);
+ ShortBuffer bisb = BufferUtils.createShortBuffer(md.getVertIndexList().size() * 2);
PMDVertex v = new PMDVertex();
for (Integer vertIndex : md.getVertIndexList()) {
model.getVertex(vertIndex, v);
tfb.put(v.getUv().getU()).put(1f - v.getUv().getV());
}
float weight = (float) v.getBoneWeight() / 100.0f;
- wfb.put(weight).put(1f - weight).put(0).put(0);
- bisb.put((short) md.getBoneList().indexOf(v.getBoneNum1())).put((short) md.getBoneList().indexOf(v.getBoneNum2())).put((short) 0).put((short) 0);
+ wfb.put(weight).put(1f - weight);
+ bisb.put((short) md.getBoneList().indexOf(v.getBoneNum1())).put((short) md.getBoneList().indexOf(v.getBoneNum2()));
}
for (Integer index : md.getIndexList()) {
isb.put(index.shortValue());
}
// System.out.println("isb.capacity() = " + isb.capacity());
// System.out.println("isb.capacity() = " + md.getIndexList().size());
- vb.setupData(VertexBuffer.Usage.Dynamic, 3, VertexBuffer.Format.Float, vfb);
- nb.setupData(VertexBuffer.Usage.Dynamic, 3, VertexBuffer.Format.Float, nfb);
+ vb.setupData(VertexBuffer.Usage.Static, 3, VertexBuffer.Format.Float, vfb);
+ nb.setupData(VertexBuffer.Usage.Static, 3, VertexBuffer.Format.Float, nfb);
// bvb.setupData(VertexBuffer.Usage.CpuOnly, 3, VertexBuffer.Format.Float, bvfb);
// bnb.setupData(VertexBuffer.Usage.CpuOnly, 3, VertexBuffer.Format.Float, bnfb);
if (textureFlag) {
tb.setupData(VertexBuffer.Usage.Static, 2, VertexBuffer.Format.Float, tfb);
}
- wb.setupData(VertexBuffer.Usage.Static, 4, VertexBuffer.Format.Float, wfb);
+ wb.setupData(VertexBuffer.Usage.Static, 2, VertexBuffer.Format.Float, wfb);
ib.setupData(VertexBuffer.Usage.Static, 1, VertexBuffer.Format.UnsignedShort, isb);
- bib.setupData(VertexBuffer.Usage.Static, 4, VertexBuffer.Format.Short, bisb);
+ bib.setupData(VertexBuffer.Usage.Static, 2, VertexBuffer.Format.Short, bisb);
mesh.setBuffer(vb);
mesh.setBuffer(nb);
geom.setGlslSkinningMaterial(mat);
mat = createMaterial(m, false);
geom.setNoSkinningMaterial(mat);
+ PMDMesh mesh = (PMDMesh)geom.getMesh();
+// mat.setInt("NumBones", mesh.boneIndexArray.length);
+
}
geom.setPmdMaterial(m);
if (m.getMaterial().getFaceColor().getAlpha() < 1f) {
mat.getAdditionalRenderState().setAlphaTest(true);
// mat.getAdditionalRenderState().setFaceCullMode(FaceCullMode.Back);
} else {
- mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
+// mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
// mat.getAdditionalRenderState().setFaceCullMode(FaceCullMode.Back);
// mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
- mat.getAdditionalRenderState().setAlphaTest(true);
+// mat.getAdditionalRenderState().setAlphaTest(true);
}
return mat;
}
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
+import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel.MapMode;
import java.util.logging.Level;
import java.util.logging.Logger;
public static File tmpDir = null;
public static final Logger logger = Logger.getLogger(BufferUtil.class.getName());
public static ByteBuffer createByteBuffer2(int size) {
- ByteBuffer bb = ByteBuffer.allocate(size);
+ ByteBuffer bb = ByteBuffer.allocateDirect(size);
+ bb.order(ByteOrder.nativeOrder());
return bb;
}
public static ByteBuffer createByteBuffer(int size) {
RandomAccessFile os = new RandomAccessFile(tmpFile, "rw");
os.seek(size);
os.write(0);
- ByteBuffer bb = os.getChannel().map(MapMode.READ_WRITE, 0, size);
+ MappedByteBuffer bb = os.getChannel().map(MapMode.READ_WRITE, 0, size);
os.close();
tmpFile.delete();
bb.order(ByteOrder.nativeOrder());
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class MeshConverter implements Serializable{
PMDModel model;
- public static int DEFAULT_MAX_BONE_SIZE = 20;
+ public static int DEFAULT_MAX_BONE_SIZE = 50;
int maxBoneSize = DEFAULT_MAX_BONE_SIZE;
List<MeshData> meshDataList = new ArrayList<MeshData>();
SkinMeshData skinMeshData;
// meshTmpVertMap = null;
skinTmpVertMap = null;
// createInterleavedBuffer();
+ Iterator<MeshData> it = meshDataList.iterator();
+ while(it.hasNext()) {
+ MeshData md = it.next();
+ if (md.getIndexList().size() == 0) {
+ it.remove();
+ }
+ }
}
void createInterleavedBuffer() {
int size = 0;
}
private void addBoneList(int vertIndex) {
PMDVertex v = model.getVertex(vertIndex, tmpVert);
- if (!boneList.contains(v.getBoneNum1()))
+ if (v.getBoneWeight() != 0 && !boneList.contains(v.getBoneNum1()))
boneList.add(v.getBoneNum1());
- if (!boneList.contains(v.getBoneNum2()))
+ if (v.getBoneWeight() != 100 && !boneList.contains(v.getBoneNum2()))
boneList.add(v.getBoneNum2());
}
private void addVertex(MeshConverter mc, int vertIndex) {