diff --git a/model-viewer/pom.xml b/model-viewer/pom.xml
index f89e997c13..8528adaa37 100644
--- a/model-viewer/pom.xml
+++ b/model-viewer/pom.xml
@@ -70,6 +70,12 @@
2.5
+
+ org.projectlombok
+ lombok
+ provided
+
+
junit
junit
diff --git a/model-viewer/src/main/java/net/runelite/modelviewer/LocationKey.java b/model-viewer/src/main/java/net/runelite/modelviewer/LocationKey.java
index 990dc6f3aa..82f8d1b8bf 100644
--- a/model-viewer/src/main/java/net/runelite/modelviewer/LocationKey.java
+++ b/model-viewer/src/main/java/net/runelite/modelviewer/LocationKey.java
@@ -24,57 +24,12 @@
*/
package net.runelite.modelviewer;
+import lombok.Value;
+
+@Value
public class LocationKey
{
private final int id;
private final int type;
private final int orientation;
-
- public LocationKey(int id, int type, int orientation)
- {
- this.id = id;
- this.type = type;
- this.orientation = orientation;
- }
-
- @Override
- public int hashCode()
- {
- int hash = 5;
- hash = 97 * hash + this.id;
- hash = 97 * hash + this.type;
- hash = 97 * hash + this.orientation;
- return hash;
- }
-
- @Override
- public boolean equals(Object obj)
- {
- if (this == obj)
- {
- return true;
- }
- if (obj == null)
- {
- return false;
- }
- if (getClass() != obj.getClass())
- {
- return false;
- }
- final LocationKey other = (LocationKey) obj;
- if (this.id != other.id)
- {
- return false;
- }
- if (this.type != other.type)
- {
- return false;
- }
- if (this.orientation != other.orientation)
- {
- return false;
- }
- return true;
- }
}
diff --git a/model-viewer/src/main/java/net/runelite/modelviewer/ModelManager.java b/model-viewer/src/main/java/net/runelite/modelviewer/ModelManager.java
index a086de34ac..b24faa08ec 100644
--- a/model-viewer/src/main/java/net/runelite/modelviewer/ModelManager.java
+++ b/model-viewer/src/main/java/net/runelite/modelviewer/ModelManager.java
@@ -46,9 +46,11 @@ public class ModelManager
{
LocationKey key;
+ int rot = location.getOrientation();
+
if (location != null)
{
- key = new LocationKey(id, location.getType(), location.getOrientation());
+ key = new LocationKey(id, location.getType(), rot);
}
else
{
@@ -70,7 +72,8 @@ public class ModelManager
if (object != null && location != null)
{
- rotate(md, object, location);
+ rotate(md, object, location, rot);
+ md.computeNormals();
}
models.put(key, md);
@@ -84,13 +87,13 @@ public class ModelManager
}
// this logic is from method3697 in 140
- private static void rotate(ModelDefinition md, ObjectDefinition object, Location location)
+ private static void rotate(ModelDefinition md, ObjectDefinition object, Location location, int rot)
{
if (object.getObjectTypes() == null)
{
boolean isRotate = object.isRotated();
- if (location.getType() == 2 && location.getOrientation() > 3)
+ if (location.getType() == 2 && rot > 3)
{
isRotate = !isRotate;
}
@@ -102,7 +105,7 @@ public class ModelManager
}
else
{
- boolean isRotate = object.isRotated() ^ location.getOrientation() > 3;
+ boolean isRotate = object.isRotated() ^ rot > 3;
if (isRotate)
{
@@ -110,7 +113,7 @@ public class ModelManager
}
}
- switch (location.getOrientation())
+ switch (rot & 3)
{
case 1:
md.rotate1();
diff --git a/model-viewer/src/main/java/net/runelite/modelviewer/ModelViewer.java b/model-viewer/src/main/java/net/runelite/modelviewer/ModelViewer.java
index 51d180df3c..47c4e426ec 100644
--- a/model-viewer/src/main/java/net/runelite/modelviewer/ModelViewer.java
+++ b/model-viewer/src/main/java/net/runelite/modelviewer/ModelViewer.java
@@ -225,6 +225,10 @@ public class ModelViewer
GL11.glCullFace(GL11.GL_BACK);
GL11.glEnable(GL11.GL_CULL_FACE);
+
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+
long last = 0;
Camera camera = new Camera();
@@ -297,6 +301,11 @@ public class ModelViewer
nB.y = -nB.y;
nC.y = -nC.y;
+ // and z
+ nA.z = -nA.z;
+ nB.z = -nB.z;
+ nC.z = -nC.z;
+
int vertexAx = md.vertexPositionsX[vertexA];
int vertexAy = md.vertexPositionsY[vertexA];
int vertexAz = md.vertexPositionsZ[vertexA];
@@ -310,6 +319,12 @@ public class ModelViewer
int vertexCz = md.vertexPositionsZ[vertexC];
short textureId = md.faceTextures != null ? md.faceTextures[i] : -1;
+ int alpha = md.faceAlphas != null ? (md.faceAlphas[i] & 0xFF) : 255;
+ if (alpha == 0)
+ {
+ alpha = 255;
+ }
+
Color color;
float[] u = null;
@@ -359,34 +374,32 @@ public class ModelViewer
float rf = (float) color.getRed() / 255f;
float gf = (float) color.getGreen() / 255f;
float bf = (float) color.getBlue() / 255f;
+ float af = (float) alpha / 255f;
GL11.glBegin(GL11.GL_TRIANGLES);
- GL11.glColor3f(rf, gf, bf);
+ GL11.glColor4f(rf, gf, bf, af);
- // With GL11.GL_CCW we have to draw A -> C -> B when
- // inverting y instead of A -> B -> C, or else with cull
- // face will cull the wrong side
GL11.glNormal3f(nA.x, nA.y, nA.z);
if (textureId != -1)
{
GL11.glTexCoord2f(u[0], v[0]);
}
- GL11.glVertex3i(vertexAx, -vertexAy, vertexAz);
-
- GL11.glNormal3f(nC.x, nC.y, nC.z);
- if (textureId != -1)
- {
- GL11.glTexCoord2f(u[2], v[2]);
- }
- GL11.glVertex3i(vertexCx, -vertexCy, vertexCz);
+ GL11.glVertex3i(vertexAx, -vertexAy, -vertexAz);
GL11.glNormal3f(nB.x, nB.y, nB.z);
if (textureId != -1)
{
GL11.glTexCoord2f(u[1], v[1]);
}
- GL11.glVertex3i(vertexBx, -vertexBy, vertexBz);
+ GL11.glVertex3i(vertexBx, -vertexBy, -vertexBz);
+
+ GL11.glNormal3f(nC.x, nC.y, nC.z);
+ if (textureId != -1)
+ {
+ GL11.glTexCoord2f(u[2], v[2]);
+ }
+ GL11.glVertex3i(vertexCx, -vertexCy, -vertexCz);
GL11.glEnd();
@@ -556,15 +569,19 @@ public class ModelViewer
int height = -region.getTileHeight(objectPos.getZ(), regionX, regionY) / HEIGHT_MOD;
GL11.glMatrixMode(GL11.GL_MODELVIEW);
-
// TILE_SCALE/2 to draw the object from the center of the tile it is on
- GL11.glTranslatef(regionX * TILE_SCALE + (TILE_SCALE / 2), height, -regionY * TILE_SCALE - (TILE_SCALE / 2));
+ GL11.glTranslatef(regionX * TILE_SCALE + (TILE_SCALE / 2), height * (location.getPosition().getZ() + 1), -regionY * TILE_SCALE - (TILE_SCALE / 2));
for (int i = 0; i < object.getObjectModels().length; ++i)
{
+ if (object.getObjectTypes() != null && object.getObjectTypes()[i] != location.getType())
+ {
+ continue;
+ }
+
ModelDefinition md = ModelManager.getModel(object.getObjectModels()[i], object, location);
- if (object.getObjectTypes() != null && object.getObjectTypes()[i] != location.getType())
+ if (md == null)
{
continue;
}
@@ -572,7 +589,7 @@ public class ModelViewer
drawModel(md, object.getRecolorToFind(), object.getRecolorToReplace());
}
- GL11.glTranslatef(-regionX * TILE_SCALE - (TILE_SCALE / 2), -height, regionY * TILE_SCALE + (TILE_SCALE / 2));
+ GL11.glTranslatef(-regionX * TILE_SCALE - (TILE_SCALE / 2), -(height * (location.getPosition().getZ() + 1)), regionY * TILE_SCALE + (TILE_SCALE / 2));
GL11.glPopMatrix();
}
}