📄 ms3dloader.java
字号:
package org.java3dgamesdk.graphics.MS3D;import java.nio.*;import java.io.*;import java.util.*;import javax.media.j3d.*;import javax.vecmath.*;import com.sun.j3d.utils.image.*;public class MS3DLoader { // Boundings private float maxX; private float maxY; private float maxZ; private float minX; private float minY; private float minZ; private static java.awt.Component component; private MS3DModel model; private ByteBuffer byteBuffer; private Hashtable textureCache; public MS3DLoader() { model = null; byteBuffer = null; textureCache = new Hashtable(); } public MS3DModel loadModel(String name, String filename) { model = null; maxX = 0.0f; maxY = 0.0f; maxZ = 0.0f; minX = 0.0f; minY = 0.0f; minZ = 0.0f; byte data[] = getRawData(filename); if(data != null) { byteBuffer = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN); model = new MS3DModel(name); readHeader(); readNumberVertices(); readVertices(); readNumberTriangles(); readTriangles(); readNumberGroups(); readGroups(); readNumberMaterials(); readMaterials(); readKeyFrameData(); readNumberJoints(); readJoints(); buildModel(); makeBones(); reset(); } return model; } /* * Loads the raw data from the ms3d file. */ private byte[] getRawData(String filename) { byte buffer[] = null; try { File file = new File(filename); int length = (int)file.length(); buffer = new byte[length]; FileInputStream fis = new FileInputStream(file); fis.read(buffer); fis.close(); } catch(Exception e) { buffer = null; } return buffer; } // read the Header private void readHeader() { byte buffer[] = new byte[10]; for(int k = 0; k < 10; k++) buffer[k] = byteBuffer.get(); model.id = makeString(buffer); model.version = byteBuffer.getInt(); } // read number of vertices private void readNumberVertices() { model.nNumVertices = byteBuffer.getShort(); model.vertices = new MS3DVertex[model.nNumVertices]; model.vertex = new float[3*model.nNumVertices]; } // read vertices private void readVertices() { MS3DVertex vertex = null; for(int i = 0; i < model.nNumVertices; i++) { vertex = new MS3DVertex(); vertex.flags = byteBuffer.get(); vertex.x = byteBuffer.getFloat(); vertex.y = byteBuffer.getFloat(); vertex.z = byteBuffer.getFloat(); vertex.boneId = byteBuffer.get(); vertex.referenceCount = byteBuffer.get(); model.vertices[i] = vertex; model.vertex[3*i] = vertex.x; model.vertex[3*i+1] = vertex.y; model.vertex[3*i+2] = vertex.z; // new for bounds if(i == 0) { minX = maxX = vertex.x; minY = maxY = vertex.y; minZ = maxZ = vertex.z; } else { if(vertex.x < minX) minX = vertex.x; else if(vertex.x > maxX) maxX = vertex.x; if(vertex.y < minY) minY = vertex.y; else if(vertex.y > maxY) maxY = vertex.y; if(vertex.z < minZ) minZ = vertex.z; else if(vertex.z > maxZ) maxZ = vertex.z; } } } // read number of triangles private void readNumberTriangles() { model.nNumTriangles = byteBuffer.getShort(); model.triangles = new MS3DTriangle[model.nNumTriangles]; } // read triangles private void readTriangles() { MS3DTriangle triangle = null; for(int i = 0; i < model.nNumTriangles; i++) { triangle = new MS3DTriangle(); triangle.flags = byteBuffer.getShort(); for(int k = 0; k < 3; k++) triangle.vertexIndices[k] = byteBuffer.getShort(); for(int k = 0; k < 3; k++) { triangle.vertexNormals[k] = new Vector3f(byteBuffer.getFloat(), byteBuffer.getFloat(), byteBuffer.getFloat()); } for(int k = 0; k < 3; k++) { triangle.texCoord[k] = new TexCoord2f(byteBuffer.getFloat(), 0.0f); } for(int k = 0; k < 3; k++) triangle.texCoord[k].y = 1.0f - byteBuffer.getFloat(); triangle.smoothingGroup = byteBuffer.get(); triangle.groupIndex = byteBuffer.get(); model.triangles[i] = triangle; } } // read number of groups private void readNumberGroups() { model.nNumGroups = byteBuffer.getShort(); model.groups = new MS3DGroup[model.nNumGroups]; } // read groups private void readGroups() { MS3DGroup group = null; for(int i = 0; i < model.nNumGroups; i++) { group = new MS3DGroup(); group.flags = byteBuffer.get(); byte buffer[] = new byte[32]; for(int k = 0; k < 32; k++) buffer[k] = byteBuffer.get(); group.name = makeString(buffer); group.numtriangles = byteBuffer.getShort(); group.triangleIndices = new short[group.numtriangles]; for (int k = 0; k < group.numtriangles; k++) group.triangleIndices[k] = byteBuffer.getShort(); group.materialIndex = byteBuffer.get(); model.groups[i] = group; } } // read number of materials private void readNumberMaterials() { model.nNumMaterials = byteBuffer.getShort(); model.materials = new MS3DMaterial[model.nNumMaterials]; } // read materials private void readMaterials() { MS3DMaterial material = null; for(int i = 0; i < model.nNumMaterials; i++) { material = new MS3DMaterial(); byte buffer[] = new byte[32]; for(int k = 0; k < 32; k++) buffer[k] = byteBuffer.get(); material.name = makeString(buffer); material.ambient = new Color4f(byteBuffer.getFloat(), byteBuffer.getFloat(), byteBuffer.getFloat(), byteBuffer.getFloat()); material.diffuse = new Color4f(byteBuffer.getFloat(), byteBuffer.getFloat(), byteBuffer.getFloat(), byteBuffer.getFloat()); material.specular = new Color4f(byteBuffer.getFloat(), byteBuffer.getFloat(), byteBuffer.getFloat(), byteBuffer.getFloat()); material.emissive = new Color4f(byteBuffer.getFloat(), byteBuffer.getFloat(), byteBuffer.getFloat(), byteBuffer.getFloat()); material.shininess = byteBuffer.getFloat(); material.transparency = byteBuffer.getFloat(); material.mode = (char)byteBuffer.get(); buffer = new byte[128]; for(int k = 0; k < 128; k++) buffer[k] = byteBuffer.get(); material.texture = makeString(buffer); buffer = new byte[128]; for(int k = 0; k < 128; k++) buffer[k] = byteBuffer.get(); material.alphamap = makeString(buffer); model.materials[i] = material; } } // read key frame data private void readKeyFrameData() { model.fAnimationFPS = byteBuffer.getFloat(); model.currentTime = (long)(byteBuffer.getFloat()*1000);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -