⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ms3dloader.java

📁 Java 3D Game SDK.老外做的.
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -