summaryrefslogtreecommitdiffstats
path: root/src/jake2/qcommon/qfiles.java
diff options
context:
space:
mode:
authorHolger Zickner <[email protected]>2004-07-07 19:59:59 +0000
committerHolger Zickner <[email protected]>2004-07-07 19:59:59 +0000
commit6e23fc1074d1f0c2c2812f4c2e663f5a21a43c20 (patch)
tree46ecc6d0255c874ba4cd26dc3d0733f785019896 /src/jake2/qcommon/qfiles.java
import of Jake2 version sunrisesunrise
Diffstat (limited to 'src/jake2/qcommon/qfiles.java')
-rw-r--r--src/jake2/qcommon/qfiles.java655
1 files changed, 655 insertions, 0 deletions
diff --git a/src/jake2/qcommon/qfiles.java b/src/jake2/qcommon/qfiles.java
new file mode 100644
index 0000000..6a51fd4
--- /dev/null
+++ b/src/jake2/qcommon/qfiles.java
@@ -0,0 +1,655 @@
+/*
+ * qfiles.java
+ * Copyright (C) 2003
+ *
+ * $Id: qfiles.java,v 1.1 2004-07-07 19:59:34 hzi Exp $
+ */
+/*
+Copyright (C) 1997-2001 Id Software, Inc.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+package jake2.qcommon;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+import jake2.*;
+import jake2.client.*;
+import jake2.game.*;
+import jake2.render.*;
+import jake2.server.*;
+
+/**
+ * qfiles
+ *
+ * @author cwei
+ */
+public class qfiles {
+ //
+ // qfiles.h: quake file formats
+ // This file must be identical in the quake and utils directories
+ //
+
+ /*
+ ========================================================================
+
+ The .pak files are just a linear collapse of a directory tree
+
+ ========================================================================
+ */
+
+ /*
+ ========================================================================
+
+ PCX files are used for as many images as possible
+
+ ========================================================================
+ */
+ public static class pcx_t {
+
+ // size of byte arrays
+ static final int PALETTE_SIZE = 48;
+ static final int FILLER_SIZE = 58;
+
+ public byte manufacturer;
+ public byte version;
+ public byte encoding;
+ public byte bits_per_pixel;
+ public int xmin, ymin, xmax, ymax; // unsigned short
+ public int hres, vres; // unsigned short
+ public byte[] palette; //unsigned byte; size 48
+ public byte reserved;
+ public byte color_planes;
+ public int bytes_per_line; // unsigned short
+ public int palette_type; // unsigned short
+ public byte[] filler; // size 58
+ public ByteBuffer data; //unbounded data
+
+ public pcx_t(byte[] dataBytes) {
+ this(ByteBuffer.wrap(dataBytes));
+ }
+
+ public pcx_t(ByteBuffer b) {
+ // is stored as little endian
+ b.order(ByteOrder.LITTLE_ENDIAN);
+
+ // fill header
+ manufacturer = b.get();
+ version = b.get();
+ encoding = b.get();
+ bits_per_pixel = b.get();
+ xmin = b.getShort() & 0xffff;
+ ymin = b.getShort() & 0xffff;
+ xmax = b.getShort() & 0xffff;
+ ymax = b.getShort() & 0xffff;
+ hres = b.getShort() & 0xffff;
+ vres = b.getShort() & 0xffff;
+ b.get(palette = new byte[PALETTE_SIZE]);
+ reserved = b.get();
+ color_planes = b.get();
+ bytes_per_line = b.getShort() & 0xffff;
+ palette_type = b.getShort() & 0xffff;
+ b.get(filler = new byte[FILLER_SIZE]);
+
+ // fill data
+ data = b.slice();
+ }
+ }
+
+ /*
+ ========================================================================
+
+ .MD2 triangle model file format
+
+ ========================================================================
+ */
+
+ public static final int IDALIASHEADER = (('2'<<24)+('P'<<16)+('D'<<8)+'I');
+ public static final int ALIAS_VERSION = 8;
+
+ public static final int MAX_TRIANGLES = 4096;
+ public static final int MAX_VERTS = 2048;
+ public static final int MAX_FRAMES = 512;
+ public static final int MAX_MD2SKINS = 32;
+ public static final int MAX_SKINNAME = 64;
+
+ public static class dstvert_t {
+ public short s;
+ public short t;
+
+ public dstvert_t(ByteBuffer b) {
+ s = b.getShort();
+ t = b.getShort();
+ }
+ }
+
+ public static class dtriangle_t {
+ public short index_xyz[] = { 0, 0, 0 };
+ public short index_st[] = { 0, 0, 0 };
+
+ public dtriangle_t(ByteBuffer b) {
+ index_xyz[0] = b.getShort();
+ index_xyz[1] = b.getShort();
+ index_xyz[2] = b.getShort();
+
+ index_st[0] = b.getShort();
+ index_st[1] = b.getShort();
+ index_st[2] = b.getShort();
+ }
+ }
+
+ public static class dtrivertx_t {
+ public int v[] = { 0, 0, 0 }; // byte 0..255 scaled byte to fit in frame mins/maxs
+ public int lightnormalindex; // byte 0 .. 255;
+
+ public dtrivertx_t(ByteBuffer b) {
+ v[0] = b.get() & 0xff; // unsigned byte
+ v[1] = b.get() & 0xff; // unsigned byte
+ v[2] = b.get() & 0xff; // unsigned byte
+ lightnormalindex = b.get() & 0xff; // unsigned byte
+ }
+ }
+
+ public static final int DTRIVERTX_V0 = 0;
+ public static final int DTRIVERTX_V1 = 1;
+ public static final int DTRIVERTX_V2 = 2;
+ public static final int DTRIVERTX_LNI = 3;
+ public static final int DTRIVERTX_SIZE = 4;
+
+ public static class daliasframe_t {
+ public float[] scale = {0, 0, 0}; // multiply byte verts by this
+ public float[] translate = {0, 0, 0}; // then add this
+ public String name; // frame name from grabbing (size 16)
+ public dtrivertx_t[] verts; // variable sized
+
+ public daliasframe_t(ByteBuffer b) {
+ scale[0] = b.getFloat(); scale[1] = b.getFloat(); scale[2] = b.getFloat();
+ translate[0] = b.getFloat(); translate[1] = b.getFloat(); translate[2] = b.getFloat();
+ byte[] nameBuf = new byte[16];
+ b.get(nameBuf);
+ name = new String(nameBuf).trim();
+ }
+ }
+
+ // the glcmd format:
+ // a positive integer starts a tristrip command, followed by that many
+ // vertex structures.
+ // a negative integer starts a trifan command, followed by -x vertexes
+ // a zero indicates the end of the command list.
+ // a vertex consists of a floating point s, a floating point t,
+ // and an integer vertex index.
+
+ public static class dmdl_t {
+ public int ident;
+ public int version;
+
+ public int skinwidth;
+ public int skinheight;
+ public int framesize; // byte size of each frame
+
+ public int num_skins;
+ public int num_xyz;
+ public int num_st; // greater than num_xyz for seams
+ public int num_tris;
+ public int num_glcmds; // dwords in strip/fan command list
+ public int num_frames;
+
+ public int ofs_skins; // each skin is a MAX_SKINNAME string
+ public int ofs_st; // byte offset from start for stverts
+ public int ofs_tris; // offset for dtriangles
+ public int ofs_frames; // offset for first frame
+ public int ofs_glcmds;
+ public int ofs_end; // end of file
+
+ // wird extra gebraucht
+ public String[] skinNames;
+ public dstvert_t[] stVerts;
+ public dtriangle_t[] triAngles;
+ public int[] glCmds;
+ public daliasframe_t[] aliasFrames;
+
+
+ public dmdl_t(ByteBuffer b) {
+ ident = b.getInt();
+ version = b.getInt();
+
+ skinwidth = b.getInt();
+ skinheight = b.getInt();
+ framesize = b.getInt(); // byte size of each frame
+
+ num_skins = b.getInt();
+ num_xyz = b.getInt();
+ num_st = b.getInt(); // greater than num_xyz for seams
+ num_tris = b.getInt();
+ num_glcmds = b.getInt(); // dwords in strip/fan command list
+ num_frames = b.getInt();
+
+ ofs_skins = b.getInt(); // each skin is a MAX_SKINNAME string
+ ofs_st = b.getInt(); // byte offset from start for stverts
+ ofs_tris = b.getInt(); // offset for dtriangles
+ ofs_frames = b.getInt(); // offset for first frame
+ ofs_glcmds = b.getInt();
+ ofs_end = b.getInt(); // end of file
+ }
+ }
+
+ /*
+ ========================================================================
+
+ .SP2 sprite file format
+
+ ========================================================================
+ */
+ // little-endian "IDS2"
+ public static final int IDSPRITEHEADER = (('2'<<24)+('S'<<16)+('D'<<8)+'I');
+ public static final int SPRITE_VERSION = 2;
+
+ public static class dsprframe_t {
+ public int width, height;
+ public int origin_x, origin_y; // raster coordinates inside pic
+ public String name; // name of pcx file (MAX_SKINNAME)
+
+ public dsprframe_t(ByteBuffer b) {
+ width = b.getInt();
+ height = b.getInt();
+ origin_x = b.getInt();
+ origin_y = b.getInt();
+
+ byte[] nameBuf = new byte[MAX_SKINNAME];
+ b.get(nameBuf);
+ name = new String(nameBuf).trim();
+ }
+ }
+
+ public static class dsprite_t {
+ public int ident;
+ public int version;
+ public int numframes;
+ public dsprframe_t frames[]; // variable sized
+
+ public dsprite_t(ByteBuffer b) {
+ ident = b.getInt();
+ version = b.getInt();
+ numframes = b.getInt();
+
+ frames = new dsprframe_t[numframes];
+ for (int i=0; i < numframes; i++) {
+ frames[i] = new dsprframe_t(b);
+ }
+ }
+ }
+
+ /*
+ ==============================================================================
+
+ .WAL texture file format
+
+ ==============================================================================
+ */
+ public static class miptex_t {
+
+ static final int MIPLEVELS = 4;
+ static final int NAME_SIZE = 32;
+
+ public String name; // char name[32];
+ public int width, height;
+ public int[] offsets = new int[MIPLEVELS]; // 4 mip maps stored
+ // next frame in animation chain
+ public String animname; // char animname[32];
+ public int flags;
+ public int contents;
+ public int value;
+
+ public miptex_t(byte[] dataBytes) {
+ this(ByteBuffer.wrap(dataBytes));
+ }
+
+ public miptex_t(ByteBuffer b) {
+ // is stored as little endian
+ b.order(ByteOrder.LITTLE_ENDIAN);
+
+ byte[] nameBuf = new byte[NAME_SIZE];
+ // fill header
+ b.get(nameBuf);
+ name = new String(nameBuf).trim();
+ width = b.getInt();
+ height = b.getInt();
+ offsets[0] = b.getInt();
+ offsets[1] = b.getInt();
+ offsets[2] = b.getInt();
+ offsets[3] = b.getInt();
+ b.get(nameBuf);
+ animname = new String(nameBuf).trim();
+ flags = b.getInt();
+ contents = b.getInt();
+ value = b.getInt();
+ }
+
+ }
+
+ /*
+ ==============================================================================
+
+ .BSP file format
+
+ ==============================================================================
+ */
+
+ public static final int IDBSPHEADER = (('P'<<24)+('S'<<16)+('B'<<8)+'I');
+
+ // =============================================================================
+
+ public static class dheader_t {
+
+ public dheader_t(ByteBuffer bb) {
+ bb.order(ByteOrder.LITTLE_ENDIAN);
+ this.ident = bb.getInt();
+ this.version = bb.getInt();
+
+ for (int n = 0; n < Defines.HEADER_LUMPS; n++)
+ lumps[n] = new lump_t(bb.getInt(), bb.getInt());
+
+ }
+
+ public int ident;
+ public int version;
+ public lump_t lumps[] = new lump_t[Defines.HEADER_LUMPS];
+ }
+
+ public static class dmodel_t {
+
+ public dmodel_t(ByteBuffer bb) {
+ bb.order(ByteOrder.LITTLE_ENDIAN);
+
+ for (int j = 0; j < 3; j++)
+ mins[j] = bb.getFloat();
+
+ for (int j = 0; j < 3; j++)
+ maxs[j] = bb.getFloat();
+
+ for (int j = 0; j < 3; j++)
+ origin[j] = bb.getFloat();
+
+ headnode = bb.getInt();
+ firstface = bb.getInt();
+ numfaces = bb.getInt();
+ }
+ public float mins[] = { 0, 0, 0 };
+ public float maxs[] = { 0, 0, 0 };
+ public float origin[] = { 0, 0, 0 }; // for sounds or lights
+ public int headnode;
+ public int firstface, numfaces; // submodels just draw faces
+ // without walking the bsp tree
+
+ public static int SIZE = 3 * 4 + 3 * 4 + 3 * 4 + 4 + 8;
+ }
+
+ public static class dvertex_t {
+
+ public static final int SIZE = 3 * 4; // 3 mal 32 bit float
+
+ public float[] point = { 0, 0, 0 };
+
+ public dvertex_t(ByteBuffer b) {
+ point[0] = b.getFloat();
+ point[1] = b.getFloat();
+ point[2] = b.getFloat();
+ }
+ }
+
+
+ // planes (x&~1) and (x&~1)+1 are always opposites
+ public static class dplane_t {
+
+ public dplane_t(ByteBuffer bb) {
+ bb.order(ByteOrder.LITTLE_ENDIAN);
+
+ normal[0] = (bb.getFloat());
+ normal[1] = (bb.getFloat());
+ normal[2] = (bb.getFloat());
+
+ dist = (bb.getFloat());
+ type = (bb.getInt());
+ }
+
+ public float normal[] = { 0, 0, 0 };
+ public float dist;
+ public int type; // PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate
+
+ public static final int SIZE = 3 * 4 + 4 + 4;
+ }
+
+ public static class dnode_t {
+
+ public dnode_t(ByteBuffer bb) {
+
+ bb.order(ByteOrder.LITTLE_ENDIAN);
+ planenum = bb.getInt();
+
+ children[0] = bb.getInt();
+ children[1] = bb.getInt();
+
+ for (int j = 0; j < 3; j++)
+ mins[j] = bb.getShort();
+
+ for (int j = 0; j < 3; j++)
+ maxs[j] = bb.getShort();
+
+ firstface = bb.getShort() & 0xffff;
+ numfaces = bb.getShort() & 0xffff;
+
+ }
+
+ public int planenum;
+ public int children[] = { 0, 0 };
+ // negative numbers are -(leafs+1), not nodes
+ public short mins[] = { 0, 0, 0 }; // for frustom culling
+ public short maxs[] = { 0, 0, 0 };
+
+ /*
+ unsigned short firstface;
+ unsigned short numfaces; // counting both sides
+ */
+
+ public int firstface;
+ public int numfaces;
+
+ public static int SIZE = 4 + 8 + 6 + 6 + 2 + 2; // counting both sides
+ }
+
+
+
+ // note that edge 0 is never used, because negative edge nums are used for
+ // counterclockwise use of the edge in a face
+
+ public static class dedge_t {
+ // unsigned short v[2];
+ int v[] = { 0, 0 };
+ }
+
+ public static class dface_t {
+
+ public static final int SIZE =
+ 4 * Defines.SIZE_OF_SHORT
+ + 2 * Defines.SIZE_OF_INT
+ + Defines.MAXLIGHTMAPS;
+
+ //unsigned short planenum;
+ public int planenum;
+ public short side;
+
+ public int firstedge; // we must support > 64k edges
+ public short numedges;
+ public short texinfo;
+
+ // lighting info
+ public byte styles[] = new byte[Defines.MAXLIGHTMAPS];
+ public int lightofs; // start of [numstyles*surfsize] samples
+
+ public dface_t(ByteBuffer b) {
+ planenum = b.getShort() & 0xFFFF;
+ side = b.getShort();
+ firstedge = b.getInt();
+ numedges = b.getShort();
+ texinfo = b.getShort();
+ b.get(styles);
+ lightofs = b.getInt();
+ }
+
+ }
+
+ public static class dleaf_t {
+
+ public dleaf_t(byte[] cmod_base, int i, int j) {
+ this(ByteBuffer.wrap(cmod_base, i, j).order(ByteOrder.LITTLE_ENDIAN));
+ }
+
+ public dleaf_t(ByteBuffer bb) {
+ contents = bb.getInt();
+ cluster = bb.getShort();
+ area = bb.getShort();
+
+ mins[0] = bb.getShort();
+ mins[1] = bb.getShort();
+ mins[2] = bb.getShort();
+
+ maxs[0] = bb.getShort();
+ maxs[1] = bb.getShort();
+ maxs[2] = bb.getShort();
+
+ firstleafface = bb.getShort() & 0xffff;
+ numleaffaces = bb.getShort() & 0xffff;
+
+ firstleafbrush = bb.getShort() & 0xffff;
+ numleafbrushes = bb.getShort() & 0xffff;
+ }
+
+ public static final int SIZE = 4 + 8 * 2 + 4 * 2;
+
+ public int contents; // OR of all brushes (not needed?)
+
+ public short cluster;
+ public short area;
+
+ public short mins[] = { 0, 0, 0 }; // for frustum culling
+ public short maxs[] = { 0, 0, 0 };
+
+ public int firstleafface; // unsigned short
+ public int numleaffaces; // unsigned short
+
+ public int firstleafbrush; // unsigned short
+ public int numleafbrushes; // unsigned short
+ }
+
+ public static class dbrushside_t {
+
+ public dbrushside_t(ByteBuffer bb) {
+ bb.order(ByteOrder.LITTLE_ENDIAN);
+
+ planenum = bb.getShort() & 0xffff;
+ texinfo = bb.getShort();
+ }
+
+ //unsigned short planenum;
+ int planenum; // facing out of the leaf
+
+ short texinfo;
+
+ public static int SIZE = 4;
+ }
+
+ public static class dbrush_t {
+
+ public dbrush_t(ByteBuffer bb) {
+ bb.order(ByteOrder.LITTLE_ENDIAN);
+ firstside = bb.getInt();
+ numsides = bb.getInt();
+ contents = bb.getInt();
+ }
+
+ public static int SIZE = 3 * 4;
+
+ int firstside;
+ int numsides;
+ int contents;
+ }
+
+ // #define ANGLE_UP -1
+ // #define ANGLE_DOWN -2
+
+ // the visibility lump consists of a header with a count, then
+ // byte offsets for the PVS and PHS of each cluster, then the raw
+ // compressed bit vectors
+ // #define DVIS_PVS 0
+ // #define DVIS_PHS 1
+
+ public static class dvis_t {
+
+ public dvis_t(ByteBuffer bb) {
+ numclusters = bb.getInt();
+ bitofs = new int[numclusters][2];
+
+ for (int i = 0; i < numclusters; i++) {
+ bitofs[i][0] = bb.getInt();
+ bitofs[i][1] = bb.getInt();
+ }
+ }
+
+ public int numclusters;
+ public int bitofs[][] = new int[8][2]; // bitofs[numclusters][2]
+ }
+
+ // each area has a list of portals that lead into other areas
+ // when portals are closed, other areas may not be visible or
+ // hearable even if the vis info says that it should be
+
+ public static class dareaportal_t {
+
+ public dareaportal_t() {
+ }
+
+ public dareaportal_t(ByteBuffer bb) {
+ bb.order(ByteOrder.LITTLE_ENDIAN);
+
+ portalnum = bb.getShort();
+ otherarea = bb.getShort();
+ }
+
+ int portalnum;
+ int otherarea;
+
+ public static int SIZE = 8;
+ }
+
+ public static class darea_t {
+
+ public darea_t(ByteBuffer bb) {
+
+ bb.order(ByteOrder.LITTLE_ENDIAN);
+
+ numareaportals = bb.getInt();
+ firstareaportal = bb.getInt();
+
+ }
+ int numareaportals;
+ int firstareaportal;
+
+ public static int SIZE = 8;
+ }
+
+} \ No newline at end of file