rswiki-book/OB3.mediawiki
2015-06-13 00:15:00 -04:00

90 lines
2.2 KiB
Plaintext

[[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 since version #74.
<pre>package jagex.client;
import jagex.Data;
public class OB3Model {
private static final int num_seq = 0xbc614e;
public int gouraud_shade[];
public int vert_count;
public int vert_x[];
public int vert_y[];
public int vert_z[];
public int face_count;
public int face_v_count[];
public int face[][];
public int face_back[];
public int face_front[];
public OB3Model(byte data[], int offset) {
int vert_count = Data.getUnsignedShort(data, offset);
offset += 2;
int face_count = Data.getUnsignedShort(data, offset);
offset += 2;
for (int v = 0; v < vert_count; v++) {
vert_x[v] = Data.getSignedShort(data, offset);
offset += 2;
}
for (int v = 0; v < vert_count; v++) {
vert_y[v] = Data.getSignedShort(data, offset);
offset += 2;
}
for (int v = 0; v < vert_count; v++) {
vert_z[v] = Data.getSignedShort(data, offset);
offset += 2;
}
this.vert_count = vert_count;
for (int f = 0; f < face_count; f++)
face_v_count[f] = (data[offset++] & 0xff);
for (int f = 0; f < face_count; f++) {
face_back[f] = Data.getSignedShort(data, offset);
offset += 2;
if (face_back[f] == 32767)
face_back[f] = num_seq;
}
for (int f = 0; f < face_count; f++) {
face_front[f] = Data.getSignedShort(data, offset);
offset += 2;
if (face_front[f] == 32767)
face_front[f] = num_seq;
}
for (int f = 0; f < face_count; f++) {
int i = data[offset++] & 0xff;
if (i == 0)
gouraud_shade[f] = 0;
else
gouraud_shade[f] = num_seq;
}
for (int f = 0; f < face_count; f++) {
face[f] = new int[face_v_count[f]];
for (int fv = 0; fv < face_v_count[f]; fv++) {
if (vert_count < 256) {
face[f][fv] = data[offset++] & 0xff;
} else {
face[f][fv] = Data.getUnsignedShort(data, offset);
offset += 2;
}
}
}
this.face_count = face_count;
}
}</pre>
== '''Face sides''' ==
A '''negative''' face_back or face_front value indicates a '''solid colour''', whereas a '''positive''' value indicates a '''texture'''.
The texture is defined by its offset in the client's texture array.