cache: add textures to objexporter, from @UniquePassive

This commit is contained in:
Adam
2017-03-26 19:49:09 -04:00
parent 731fa488dd
commit 16f23c9e8f
2 changed files with 91 additions and 38 deletions

View File

@@ -26,22 +26,25 @@ package net.runelite.cache.models;
import java.awt.Color;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Set;
import net.runelite.cache.TextureManager;
import net.runelite.cache.definitions.ModelDefinition;
import net.runelite.cache.definitions.TextureDefinition;
public class ObjExporter
{
private final TextureManager textureManager;
private final ModelDefinition model;
public ObjExporter(ModelDefinition model)
public ObjExporter(TextureManager textureManager, ModelDefinition model)
{
this.textureManager = textureManager;
this.model = model;
}
public void export(PrintWriter objWriter, PrintWriter mtlWriter)
{
model.computeNormals();
model.computeTextureUVCoordinates();
objWriter.println("mtllib " + model.id + ".mtl");
@@ -49,19 +52,80 @@ public class ObjExporter
for (int i = 0; i < model.vertexCount; ++i)
{
objWriter.println(" v " + model.vertexPositionsX[i] + " " + model.vertexPositionsY[i] + " " + model.vertexPositionsZ[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);
objWriter.println("vn " + normal.x + " " + normal.y + " " + normal.z);
}
Set<Integer> usedMaterials = new HashSet<>();
for (int i = 0; i < model.faceCount; ++i)
{
Color color = rs2hsbToColor(model.faceColors[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("");
}
// Write material
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;
@@ -70,31 +134,9 @@ public class ObjExporter
alpha = model.faceAlphas[i] & 0xFF;
}
int rgba = color.getRGB() << 8 | alpha;
objWriter.println(" usemtl color" + rgba);
objWriter.println(" f " + (model.faceVertexIndices1[i] + 1) + "//" + (model.faceVertexIndices1[i] + 1) +
" " + (model.faceVertexIndices2[i] + 1) + "//" + (model.faceVertexIndices2[i] + 1) +
" " + (model.faceVertexIndices3[i] + 1) + "//" + (model.faceVertexIndices3[i] + 1));
objWriter.println("");
// Write material
if (usedMaterials.contains(rgba))
continue;
usedMaterials.add(rgba);
mtlWriter.println("newmtl color" + rgba);
double r = color.getRed() / 255.0;
double g = color.getGreen() / 255.0;
double b = color.getBlue() / 255.0;
mtlWriter.println(" Kd " + r + " " + g + " " + b);
if (alpha != 0)
{
mtlWriter.println(" d " + (alpha / 255.0));
mtlWriter.println("d " + (alpha / 255.0));
}
}
}

View File

@@ -28,8 +28,11 @@ import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.nio.file.Files;
import net.runelite.cache.StoreLocation;
import net.runelite.cache.TextureManager;
import net.runelite.cache.definitions.ModelDefinition;
import net.runelite.cache.definitions.loaders.ModelLoader;
import net.runelite.cache.fs.Store;
import org.junit.Ignore;
import org.junit.Test;
@@ -39,14 +42,22 @@ public class ObjExporterTest
@Ignore
public void testExport() throws Exception
{
ModelLoader loader = new ModelLoader();
ModelDefinition model = loader.load(11048, Files.readAllBytes(new File("D:\\rs\\07\\cache\\models\\11048.model").toPath()));
ObjExporter exporter = new ObjExporter(model);
try (PrintWriter objWriter = new PrintWriter(new FileWriter(new File("C:\\rs\\temp\\11048.obj")));
PrintWriter mtlWriter = new PrintWriter(new FileWriter(new File("C:\\rs\\temp\\11048.mtl"))))
try (Store store = new Store(StoreLocation.LOCATION))
{
exporter.export(objWriter, mtlWriter);
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);
}
}
}
}