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

📄 maxloader.java

📁 world wind java sdk load 3D model
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * MaxLoader.java
 *
 * Created on February 12, 2008, 10:19 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package model;

import java.awt.Color;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 *
 * @author RodgersGB
 * modifications made by Brian Wood
 */
class MaxLoader implements MaxConstants {
    private File file;
    private String baseDir;
    private boolean loaded = false;
    private FileInputStream fileInputStream;
    private DataInputStream dataInputStream;
    private Model3D.BoundingBox boundingBox = null;
    private float minx, maxx, miny, maxy, minz, maxz;
    
// Global chunks
    private Chunk currentChunk, tempChunk;
    
// the model
    private Model3D model = null;
    
    // Constructor
    public MaxLoader() {
        currentChunk = new Chunk();
        tempChunk = new Chunk();
        model = new Model3D();
    }
    
    // Verified
    public Model3D load(String path) throws IOException {
        String strMessage;
        
        String tokens[] = path.split("/");
        baseDir = "/";
        for(int i = 0; i < tokens.length - 1; i++) {
            baseDir += tokens[i] + "/";
        }
        
        dataInputStream = new DataInputStream(MaxLoader.class.getResourceAsStream("/" + path));
        
        if(dataInputStream == null){
            return null;
        }
        
        readChunkHeader(currentChunk);
        
        if (currentChunk.id != TYPE_3DS_FILE) {
            System.err.println("Unable to load PRIMARY chuck from file!");
            return null;
        }
        
        processNextChunk(currentChunk);
        
        //computeNormals();
        
        model.setBoundingBox(new Model3D.BoundingBox(minx, maxx, miny, maxy, minz, maxz));
        
        dataInputStream.close();
        
        return model;
    }
    
    private void processNextChunk(Chunk root) throws IOException {
        int version = 0;
        byte buffer[] = null;
        
        currentChunk = new Chunk();
        
        while (root.bytesRead < root.length) {
            readChunkHeader(currentChunk);
            
            switch (currentChunk.id) {
                case TYPE_3DS_VERSION:
                    version = readInt(currentChunk);
                    
                    if (version > 0x03)
                        System.err.println("This 3DS file is over version 3 so it may load incorrectly");
                    break;
                    
                case TYPE_MESH_DATA:
                    readChunkHeader(tempChunk);
                    readBytes(tempChunk, tempChunk.length - tempChunk.bytesRead);
                    currentChunk.bytesRead += tempChunk.bytesRead;
                    processNextChunk(currentChunk);
                    break;
                    
                case TYPE_MATERIAL:
                    Model3D.Material m = new Model3D.Material();
                    processMaterial(m, currentChunk);
                    model.addMaterial(m);
                    break;
                    
                case TYPE_NAMED_OBJECT:
                    Model3D.ModelObject obj = new Model3D.ModelObject();
                    obj.name = readString(currentChunk);
                    getObjectChunk(obj, currentChunk);
                    model.addObject(obj);
                    break;
                    
                case TYPE_KEY_FRAME:
                    processKeyFrame(currentChunk);
                    break;
                    
                default:
                    readBytes(currentChunk, currentChunk.length - currentChunk.bytesRead);
                    break;
            }
            root.bytesRead += currentChunk.bytesRead;
        }
        
        currentChunk = root;
    }
    
    private void processKeyFrame(Chunk root) throws IOException {
        currentChunk = new Chunk();
        
        while (root.bytesRead < root.length) {
            readChunkHeader(currentChunk);
            
            switch (currentChunk.id) {
                default:
                    readBytes(currentChunk, currentChunk.length - currentChunk.bytesRead);
                    break;
            }
            root.bytesRead += currentChunk.bytesRead;
        }
        currentChunk = root;
    }
    
    private void readChunkHeader(Chunk c) throws IOException {
        c.bytesRead = 0;
        c.id = this.readShort(c);
        c.length = this.readInt(c);
    }
    
    private void getObjectChunk(Model3D.ModelObject object, Chunk root) throws IOException {
        currentChunk = new Chunk();
        
        while (root.bytesRead < root.length) {
            readChunkHeader(currentChunk);
            
            switch (currentChunk.id) {
                case TYPE_TRIANGLE_OBJECT:
                    getObjectChunk(object, currentChunk);
                    break;
                    
                case TYPE_DIRECT_LIGHT:
                    readBytes(currentChunk, currentChunk.length - currentChunk.bytesRead);
                    break;
                    
                case TYPE_POINT_LIST:
                    readVertices(object, currentChunk);
                    break;
                    
                case TYPE_FACE_LIST:
                    readFaceList(object, currentChunk);
                    break;
                    
                case TYPE_MAT_FACE_LIST:
                    readObjectMaterial(object, currentChunk);
                    readBytes(currentChunk, currentChunk.length - currentChunk.bytesRead);
                    break;
                    
                case TYPE_MAT_UV:
                    object.hasTexture = true;
                    model.addMaterial(new Model3D.Material());
                    object.materialID = 0;
                    readUVCoordinates(object, currentChunk);
                    break;
                    
                default:
                    readBytes(currentChunk, currentChunk.length - currentChunk.bytesRead);
                    break;
            }
            root.bytesRead += currentChunk.bytesRead;
        }
        
        currentChunk = root;
    }
    
    private void processMaterial(Model3D.Material material, Chunk root) throws IOException {
        byte buffer[] = null;
        
        currentChunk = new Chunk();
        
        while (root.bytesRead < root.length) {
            readChunkHeader(currentChunk);
            
            switch (currentChunk.id) {
                case TYPE_MATERIAL_NAME:
                    material.name = readString(currentChunk);
                    readBytes(currentChunk, currentChunk.length - currentChunk.bytesRead);
                    break;
                    
                case TYPE_MAT_AMBIENT:
                    material.setAmbientColor(readColor(currentChunk));
                    break;
                    
                case TYPE_MAT_SPECULAR:
                    material.setSpecularColor(readColor(currentChunk));
                    break;
                    
                case TYPE_MAT_DIFFUSE:
                    material.setDiffuseColor(readColor(currentChunk));
                    break;
                    
                case TYPE_MAT_SHININESS:
                    float shin = 1.0f+127.0f*readPercentage(currentChunk);
                    material.setShininess(shin);
                    break;
                    
                case TYPE_MAT_SHININESS2:
                    float shin2 = 1.0f+127.0f*readPercentage(currentChunk);
                    break;
                    
                case TYPE_MAT_TRANSPARENCY:
                    float trans = readPercentage(currentChunk);
                    break;
                    
                case TYPE_MAT_2_SIDED:
                    readBytes(currentChunk, currentChunk.length - currentChunk.bytesRead);
                    break;
                    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -