/*
** 2011 April 5
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
** May you do good and not evil.
** May you find forgiveness for yourself and forgive others.
** May you share freely, never taking more than you give.
*/
package info.ata4.bsplib.struct;
import info.ata4.bsplib.vector.Vector3f;
import info.ata4.io.DataReader;
import info.ata4.io.DataWriter;
import java.io.IOException;
/**
* Overlay data structure.
*
* @author Nico Bergemann <barracuda415 at yahoo.de>
*/
public class DOverlay implements DStruct {
public static final int OVERLAY_BSP_FACE_COUNT = 64;
public static final int OVERLAY_RENDER_ORDER_NUM_BITS = 2;
public static final int OVERLAY_RENDER_ORDER_MASK = 0xC000; // top 2 bits set
public int id;
public short texinfo;
public int faceCountAndRenderOrder;
public int[] ofaces = new int[OVERLAY_BSP_FACE_COUNT];
public float[] u = new float[2];
public float[] v = new float[2];
public Vector3f[] uvpoints = new Vector3f[4];
public Vector3f origin;
public Vector3f basisNormal;
public int getFaceCount() {
return faceCountAndRenderOrder & ~OVERLAY_RENDER_ORDER_MASK;
}
public int getRenderOrder() {
return faceCountAndRenderOrder >> (16 - OVERLAY_RENDER_ORDER_NUM_BITS);
}
@Override
public int getSize() {
return 352;
}
@Override
public void read(DataReader in) throws IOException {
id = in.readInt();
texinfo = in.readShort();
faceCountAndRenderOrder = in.readUnsignedShort();
for (int j = 0; j < OVERLAY_BSP_FACE_COUNT; j++) {
ofaces[j] = in.readInt();
}
u[0] = in.readFloat();
u[1] = in.readFloat();
v[0] = in.readFloat();
v[1] = in.readFloat();
for (int j = 0; j < 4; j++) {
uvpoints[j] = Vector3f.read(in);
}
origin = Vector3f.read(in);
basisNormal = Vector3f.read(in);
}
@Override
public void write(DataWriter out) throws IOException {
out.writeInt(id);
out.writeShort(texinfo);
out.writeUnsignedShort(faceCountAndRenderOrder);
for (int j = 0; j < OVERLAY_BSP_FACE_COUNT; j++) {
out.writeInt(ofaces[j]);
}
out.writeFloat(u[0]);
out.writeFloat(u[1]);
out.writeFloat(v[0]);
out.writeFloat(v[1]);
for (int j = 0; j < 4; j++) {
Vector3f.write(out, origin);
}
}
}