Destrovi4 icon

MeshReader

Destrovi4 | PRO | 02/26/15 02:13:09 AM UTC | 0 ⭐ | 349 👁️ | Never ⏰ | []
Java |

2.09 KB

|

None

|

0 👍

/

0 👎

package org.destr.jogl.mesh;
 
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
 
import javax.media.opengl.GL2;
 
public class MeshReader extends DataInputStream {
 
    public static int glTypeToSize(int glType) {
        switch(glType) {
        
            case GL2.GL_BYTE:   return  1;
            case GL2.GL_SHORT:  return  2;
            case GL2.GL_INT:    return  4;
            case GL2.GL_DOUBLE: return  8;
            
            case GL2.GL_FLOAT:  return  4;
            
            default: return -1;
        }
    }
    
    public MeshReader(InputStream is) {
        super(is);
    }
    
    public BufferedMeshData readMesh() throws IOException {
        BufferedMeshData mesh = new BufferedMeshData();
        
        String version = readUTF();
        
        if(!version.equals("JMESH1.0")) {
            throw new IOException(String.format(
                "Invalis header \"%s\"", version
            ));
        }
        
        String format = readUTF().toUpperCase();
        
        if(format.equals("VNC")) {
            
            mesh.count  = readInt();
            
            mesh.vGLType    = readInt();
            mesh.vSize  = readInt();
            mesh.vStride    = readInt();
            mesh.vOffset    = readLong();
            
            mesh.nUsed  = true;
            mesh.nGLType    = readInt();
            mesh.nStride    = readInt();
            mesh.nOffset    = readLong();
            
            mesh.tUsed  = true;
            mesh.tGLType    = readInt();
            mesh.tSize  = readInt();
            mesh.tStride    = readInt();
            mesh.tOffset    = readLong();
                        
            int vBytes = mesh.vSize * glTypeToSize(mesh.vGLType);
            if(vBytes < 0) {
                throw new IOException(String.format(
                    "Can not read vertex glType %d", mesh.vGLType
                ));
            }
            
            int nBytes = 3 * glTypeToSize(mesh.nGLType);
            if(nBytes < 0) {
                throw new IOException(String.format(
                    "Can not read normal glType %d", mesh.nGLType
                ));
            }
            
            int tBytes = mesh.tSize * glTypeToSize(mesh.tGLType);
            if(tBytes < 0) {
                throw new IOException(String.format(
                    "Can not read texture coord glType %d", mesh.tGLType
                ));
            }
            
            mesh.data = new byte[mesh.count * (vBytes + nBytes + tBytes)];
            read(mesh.data);
            
        } else {
            throw new IOException(String.format(
                "Invalid format \"%s\"", format
            ));
        }
        
        return mesh;
    }
    
}

Comments