[[Category RSC]] Work in progress. This page refers to .ob3, a custom format for 3D models created by Jagex. It is used by the RuneScape Classic engine.
import util.Data; public class Ob3Model { public int faceCount; public int vertexCount; public int faceVertexCount[]; public int faceBack[]; public int faceFront[]; public int verticesX[]; public int verticesZ[]; public int verticesY[]; private static final int trigger = 0xbc614e; public Ob3Model(byte data[], int position) { int vertexCount = Data.readInt16(data, position); position += 2; int faceCount = Data.readInt16(data, position); position += 2; verticesX = new int[vertexCount]; verticesY = new int[vertexCount]; verticesZ = new int[vertexCount]; faceBack = new int[faceCount]; faceFront = new int[faceCount]; faceVertexCount = new int[faceCount]; for (int i = 0; i < vertexCount; i++) { verticesX[i] = Data.readSignedInt16(data, position); position += 2; } for (int i = 0; i < vertexCount; i++) { verticesZ[i] = Data.readSignedInt16(data, position); position += 2; } for (int i = 0; i < vertexCount; i++) { verticesY[i] = Data.readSignedInt16(data, position); position += 2; } for (int i = 0; i < faceCount; i++) faceVertexCount[i] = data[position++] & 0xff; for (int i = 0; i < faceCount; i++) { faceBack[i] = Data.readSignedInt16(data, position); position += 2; if (faceBack[i] == 32767) faceBack[i] = trigger; } for (int i = 0; i < faceCount; i++) { faceFront[i] = Data.readSignedInt16(data, position); position += 2; if (faceFront[i] == 32767) faceFront[i] = trigger; } position += faceCount - 1; for (int i = 0; i < faceCount; i++) { for (int j = 0; j < faceVertexCount[i]; j++) { if (vertexCount < 256) { position++; } else { Data.readInt16(data, position); position += 2; } } } this.vertexCount = vertexCount; this.faceCount = faceCount; } }== '''Face sides''' == A '''negative''' face_back or face_front value indicates a '''solid colour''', whereas a '''positive''' value indicates a '''texture'''.