diff --git a/src/main/java/no/myke/parser/ModelObject.java b/src/main/java/no/myke/parser/ModelObject.java index addddcd..0ac34f2 100644 --- a/src/main/java/no/myke/parser/ModelObject.java +++ b/src/main/java/no/myke/parser/ModelObject.java @@ -4,9 +4,10 @@ * */ public class ModelObject { - private String name; - public float[] vertices; + private final String name; + public Vector[] vectors; public short[] polygons; + public java.util.HashMap materialType = new java.util.HashMap(); //Key is the face number as a short, value is the face material as a string public float[] textureCoordinates; public ModelObject(String name) { diff --git a/src/main/java/no/myke/parser/Parser.java b/src/main/java/no/myke/parser/Parser.java index 68c9076..df1b50b 100644 --- a/src/main/java/no/myke/parser/Parser.java +++ b/src/main/java/no/myke/parser/Parser.java @@ -6,7 +6,7 @@ * This parser understands the layout of the 3ds file and is * able to construct a Model from a reader. * - * @author Kjetil Østerås + * @author Kjetil ØsterÃ¥s */ public class Parser { @@ -41,29 +41,33 @@ private int readChunk() throws IOException { private void parseChunk(short type, int size) throws IOException { switch (type) { - case 0x0002: + case 0x0002: //M3D Version parseVersionChunk(); break; - case 0x3d3d: + case 0x3d3d: //Start of object mesh data. break; - case 0x4000: + case 0x4000: //first item of Subchunk 4000 is an ASCIIZ string of the objects name. Remember an object can be a mesh, a light or a camera. parseObjectChunk(); break; - case 0x4100: + case 0x4100: //Header for Triangular Polygon Object (Just an identifier, no actual information) + parseTriangularMesh(); break; - case 0x4110: + case 0x4110: //Count of verticus, followed by X,Y,Z co-ords parseVerticesList(); break; - case 0x4120: + case 0x4120: //Faces Description / Point List parseFacesDescription(); break; - case 0x4140: + case 0x4130: //Face Material + parseFaceMaterial(); + break; + case 0x4140: //Mapping Coordinates List parseMappingCoordinates(); break; - case 0x4160: + case 0x4160: //Local Coordinates System / Translation Matrix parseLocalCoordinateSystem(); break; - case 0x4d4d: + case 0x4d4d: //A 3ds file has the Primary chunk ID 0x4D4D. This is always the first chunk of the file. With in the primary chunk are the main chunks. parseMainChunk(); break; case (short)0xafff: // Material block @@ -105,20 +109,55 @@ private void parseObjectChunk() throws IOException { currentObject = model.newModelObject(name); } + private void parseTriangularMesh() throws IOException { + log("Found Mesh Header"); + } + private void parseVerticesList() throws IOException { + //byte range: 0-1 + //Size: 2 + //Type: short int + //Description: Total vertices in object short numVertices = reader.getShort(); + //vertices always come in multiples of 3 (X,Y,Z) co-ordinates float[] vertices = new float[numVertices * 3]; + + //byte range: 2-5, 6-9, 10-13 + //Size: 4 (each) + //Type: float (each) + //Description: X, Y and Z values as a float + //These 12 bytes are repeated for however many vertices are in the object, with the next 3 (X,Y,Z) being in the byte range 14-25. for (int i=0; i