[[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.

<pre>
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;
	}
}</pre>

== '''Face sides''' ==

A '''negative''' face_back or face_front value indicates a '''solid colour''', whereas a '''positive''' value indicates a '''texture'''.