ObjExporter { public void export(PrintWriter objWriter, PrintWriter mtlWriter) { model.computeNormals(); model.computeTextureUVCoordinates(); objWriter.println("mtllib " + model.id + ".mtl"); objWriter.println("o runescapemodel"); for (int i = 0; i < model.vertexCount; ++i) { objWriter.println("v " + model.vertexPositionsX[i] + " " + model.vertexPositionsY[i] * -1 + " " + model.vertexPositionsZ[i] * -1); } if (model.faceTextures != null) { float[][] u = model.faceTextureUCoordinates; float[][] v = model.faceTextureVCoordinates; for (int i = 0; i < model.faceCount; ++i) { objWriter.println("vt " + u[i][0] + " " + v[i][0]); objWriter.println("vt " + u[i][1] + " " + v[i][1]); objWriter.println("vt " + u[i][2] + " " + v[i][2]); } } for (VertexNormal normal : model.vertexNormals) { objWriter.println("vn " + normal.x + " " + normal.y + " " + normal.z); } for (int i = 0; i < model.faceCount; ++i) { int x = model.faceVertexIndices1[i] + 1; int y = model.faceVertexIndices2[i] + 1; int z = model.faceVertexIndices3[i] + 1; objWriter.println("usemtl m" + i); if (model.faceTextures != null) { objWriter.println("f " + x + "/" + (i * 3 + 1) + " " + y + "/" + (i * 3 + 2) + " " + z + "/" + (i * 3 + 3)); } else { objWriter.println("f " + x + " " + y + " " + z); } objWriter.println(""); } for (int i = 0; i < model.faceCount; ++i) { short textureId = -1; if (model.faceTextures != null) { textureId = model.faceTextures[i]; } mtlWriter.println("newmtl m" + i); if (textureId == -1) { Color color = rs2hsbToColor(model.faceColors[i]); double r = color.getRed() / 255.0; double g = color.getGreen() / 255.0; double b = color.getBlue() / 255.0; mtlWriter.println("Kd " + r + " " + g + " " + b); } else { TextureDefinition texture = textureManager.findTexture(textureId); assert texture != null; mtlWriter.println("map_Kd sprite/" + texture.getFileIds()[0] + "-0.png"); } int alpha = 0; if (model.faceAlphas != null) { alpha = model.faceAlphas[i] & 0xFF; } if (alpha != 0) { mtlWriter.println("d " + (alpha / 255.0)); } } } ObjExporter(TextureManager textureManager, ModelDefinition model); void export(PrintWriter objWriter, PrintWriter mtlWriter);  }
@Test @Ignore public void testExport() throws Exception { try (Store store = new Store(StoreLocation.LOCATION)) { store.load(); TextureManager tm = new TextureManager(store); tm.load(); ModelLoader loader = new ModelLoader(); ModelDefinition model = loader.load(9638, Files.readAllBytes(new File("D:\\rs\\07\\cache\\models\\9638.model").toPath())); ObjExporter exporter = new ObjExporter(tm, model); try (PrintWriter objWriter = new PrintWriter(new FileWriter(new File("D:\\rs\\07\\temp\\9638.obj"))); PrintWriter mtlWriter = new PrintWriter(new FileWriter(new File("D:\\rs\\07\\temp\\9638.mtl")))) { exporter.export(objWriter, mtlWriter); } } }