package clientdata.visitors; import java.util.Vector; import org.apache.commons.math3.geometry.euclidean.threed.Vector3D; import org.apache.mina.core.buffer.IoBuffer; import clientdata.VisitorInterface; import utils.scene.u3d.Triangle; @SuppressWarnings("unused") public class FLRVisitor implements VisitorInterface { public Vector<Vector3D> vertices = new Vector<Vector3D>(); public Vector<CollisionTriangle> triangles = new Vector<CollisionTriangle>(); public int version; @Override public void parseData(String nodename, IoBuffer data, int depth, int size) throws Exception { if(nodename.length() >= 8) { if(nodename.substring(4, 8).equals("VERT")) { switch(String.valueOf(nodename.charAt(3))) { case "5": version = 5; case "6": version = 6; default: System.out.println("Unknown .flr version"); } for(int i = size/3; i > 0; --i) { float x = data.getFloat(); if(!data.hasRemaining()) break; float y = data.getFloat(); float z = data.getFloat(); Vector3D vec = new Vector3D(x, y, z); vertices.add(vec); } } } else if(nodename.equals("TRIS")) { int count = 0; if(version == 5) { count = size / 60; } else if(version == 6) { count = data.getInt(); } else { System.out.println("Unknown .flr version"); } for(int i = 0; i < count; i++) { CollisionTriangle collisionTri = new CollisionTriangle(); collisionTri.tri.a = data.getInt(); collisionTri.tri.b = data.getInt(); collisionTri.tri.c = data.getInt(); int id = data.getInt(); collisionTri.adjacentTris = new int[3]; collisionTri.adjacentTris[0] = data.getInt(); collisionTri.adjacentTris[1] = data.getInt(); collisionTri.adjacentTris[2] = data.getInt(); data.getFloat(); data.getFloat(); // unks data.getFloat(); collisionTri.edge1 = data.get(); collisionTri.edge2 = data.get(); collisionTri.edge3 = data.get(); collisionTri.freeYAxis = data.get(); collisionTri.groupNumber = data.getInt(); data.getInt(); data.getInt(); // unks data.getInt(); triangles.add(collisionTri); } } } @Override public void notifyFolder(String nodeName, int depth) throws Exception { // TODO Auto-generated method stub } private class CollisionTriangle { public Triangle tri = new Triangle(); int[] adjacentTris; //0 = cannot exit, 1 = can enter+exit, 2 = catches falls. Used on player structure stairs byte edge1, edge2, edge3; byte freeYAxis; // 0 = constrained to floor, 1 = free // isolates sections of collision floor int groupNumber; } }