diff --git a/OB3.mediawiki b/OB3.mediawiki index 37eb165..6f0ee27 100644 --- a/OB3.mediawiki +++ b/OB3.mediawiki @@ -1,107 +1,106 @@ [[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 client version #74. For the earlier version of the format see [[OB2|OB2]].
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_v[][]; - public int face_back[]; - public int face_front[]; + private static final int num_seq = 0xbc614e; + public int vertex_count; + public int vertices_x[]; + public int vertices_y[]; + public int vertices_z[]; + public int face_count; + public int face_vertex_count[]; + public int face_vertices[][]; + public int face_fill_back[]; + public int face_fill_front[]; + public int face_gouraud[]; - public OB3Model(byte data[], int offset) { - int vert_count = get_u_short(data, offset); - offset += 2; - int face_count = get_u_short(data, offset); - offset += 2; + public OB3Model(byte data[], int offset) { + int vertex_count = get_uint16(data, offset); + offset += 2; + int face_count = get_uint16(data, offset); + offset += 2; - vert_x = new int[vert_count]; - vert_y = new int[vert_count]; - vert_z = new int[vert_count]; - face_v_count = new int[face_count]; - faces = new int[face_count][]; - face_back = new int[face_count]; - face_front = new int[face_count]; - gouraud_shade = new int[face_count]; + vertices_x = new int[vertex_count]; + vertices_y = new int[vertex_count]; + vertices_z = new int[vertex_count]; + face_vertex_count = new int[face_count]; + face_vertices = new int[face_count][]; + face_fill_back = new int[face_count]; + face_fill_front = new int[face_count]; + face_gouraud = new int[face_count]; - for (int v = 0; v < vert_count; v++) { - vert_x[v] = get_short(data, offset); - offset += 2; - } + for (int v = 0; v < vertex_count; v++) { + vertices_x[v] = get_int16b(data, offset); + offset += 2; + } - for (int v = 0; v < vert_count; v++) { - vert_y[v] = get_short(data, offset); - offset += 2; - } + for (int v = 0; v < vertex_count; v++) { + vertices_y[v] = get_int16b(data, offset); + offset += 2; + } - for (int v = 0; v < vert_count; v++) { - vert_z[v] = get_short(data, offset); - offset += 2; - } + for (int v = 0; v < vertex_count; v++) { + vertices_z[v] = get_int16b(data, offset); + offset += 2; + } - this.vert_count = vert_count; - for (int f = 0; f < face_count; f++) - face_v_count[f] = get_u_byte(data[offset++]); + this.vertex_count = vertex_count; + for (int f = 0; f < face_count; f++) + face_vertex_count[f] = get_ubyte(data[offset++]); - for (int f = 0; f < face_count; f++) { - face_back[f] = get_short(data, offset); - offset += 2; - if (face_back[f] == 32767) - face_back[f] = num_seq; - } + for (int f = 0; f < face_count; f++) { + face_fill_back[f] = get_int16b(data, offset); + offset += 2; + if (face_fill_back[f] == 32767) + face_fill_back[f] = num_seq; + } - for (int f = 0; f < face_count; f++) { - face_front[f] = get_short(data, offset); - offset += 2; - if (face_front[f] == 32767) - face_front[f] = num_seq; - } + for (int f = 0; f < face_count; f++) { + face_fill_front[f] = get_int16b(data, offset); + offset += 2; + if (face_fill_front[f] == 32767) + face_fill_front[f] = num_seq; + } - for (int f = 0; f < face_count; f++) { - int i = get_u_byte(data[offset++]); - if (i == 0) - gouraud_shade[f] = 0; - else - gouraud_shade[f] = num_seq; - } + for (int f = 0; f < face_count; f++) { + int i = get_ubyte(data[offset++]); + if (i == 0) + face_gouraud[f] = 0; + else + face_gouraud[f] = num_seq; + } - for (int f = 0; f < face_count; f++) { - face_v[f] = new int[face_v_count[f]]; - for (int fv = 0; fv < face_v_count[f]; fv++) { - if (vert_count < 256) { - face_v[f][fv] = get_u_byte(data[offset++]); - } else { - face_v[f][fv] = get_u_short(data, offset); - offset += 2; - } - } - } + for (int f = 0; f < face_count; f++) { + face_vertices[f] = new int[face_vertex_count[f]]; + for (int fv = 0; fv < face_vertex_count[f]; fv++) { + if (vertex_count < 256) { + face_vertices[f][fv] = get_ubyte(data[offset++]); + } else { + face_vertices[f][fv] = get_uint16(data, offset); + offset += 2; + } + } + } - this.face_count = face_count; - } + this.face_count = face_count; + } - public static int get_u_byte(byte b) { - return (b & 0xff); - } + private static int get_ubyte(byte b) { + return (b & 0xff); + } - public static int get_u_short(byte b[], int start) { - return ((b[start] & 0xff) << 8) + (b[start + 1] & 0xff); - } + private static int get_uint16(byte b[], int start) { + return (get_ubyte(b[start]) << 8) + get_ubyte(b[start + 1]); + } - public static int get_short(byte b[], int start) { - int i = get_u_byte(b[start]) * 256 + get_u_byte(b[start + 1]); - if (i > 32767) - i -= 0x10000; - return i; - } + private static int get_int16b(byte b[], int start) { + int i = get_ubyte(b[start]) * 256 + get_ubyte(b[start + 1]); + if (i > 32767) + i -= 0x10000; + return i; + } }@@ -111,15 +110,15 @@ A '''negative''' face_back or face_front value indicates a '''solid colour''', w When converting to/from [http://en.wikipedia.org/wiki/Wavefront_.obj_file Wavefront OBJ] format, remember that the OB3 face vertices are one less than the OBJ face vertices.
public static int decode_colour(int i) { - i = -(i + 1); - int r = i >> 10 & 0x1f; - int g = i >> 5 & 0x1f; - int b = i & 0x1f; - return (r << 19) + (g << 11) + (b << 3); + i = -(i + 1); + int r = i >> 10 & 0x1f; + int g = i >> 5 & 0x1f; + int b = i & 0x1f; + return (r << 19) + (g << 11) + (b << 3); }-
public static final int encode_colour(int r, int g, int b) { - return -1 - (r / 8) * 1024 - (g / 8) * 32 - b / 8; +public static int encode_colour(int r, int g, int b) { + return -1 - (r / 8) * 1024 - (g / 8) * 32 - b / 8; }\ No newline at end of file