/*
** 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;
/**
* Displacement info data structure.
*
* @author Nico Bergemann <barracuda415 at yahoo.de>
*/
public class DDispInfo implements DStruct {
public static final int DISP_INFO_FLAG_HAS_MULTIBLEND = 0x40000000;
public static final int DISP_INFO_FLAG_MAGIC = 0x80000000;
public Vector3f startPos; // start position
public int dispVertStart; // index into disp verts
public int dispTriStart; // index into disp tris
public int power; // power (size)
public int minTess; // min tesselation
public float smoothingAngle; // smoothing angle
public int contents; // surf contents
public int mapFace; // map face
public int lightmapAlphaStart;
public int lightmapSamplePositionStart;
protected byte[] neighbors = new byte[90]; // TODO: use structures
public int[] allowedVerts = new int[10]; // allowed verts
public int getPowerSize() {
return 1 << power;
}
public int getVertexCount() {
return (getPowerSize() + 1) * (getPowerSize() + 1);
}
public int getTriangleTagCount() {
return 2 * getPowerSize() * getPowerSize();
}
@Override
public int getSize() {
return 176;
}
@Override
public void read(DataReader in) throws IOException {
startPos = Vector3f.read(in);
dispVertStart = in.readInt();
dispTriStart = in.readInt();
power = in.readInt();
minTess = in.readInt();
smoothingAngle = in.readFloat();
contents = in.readInt();
mapFace = in.readUnsignedShort();
lightmapAlphaStart = in.readInt();
lightmapSamplePositionStart = in.readInt();
in.readBytes(neighbors);
for (int i = 0; i < allowedVerts.length; i++) {
allowedVerts[i] = in.readInt();
}
}
@Override
public void write(DataWriter out) throws IOException {
Vector3f.write(out, startPos);
out.writeInt(dispVertStart);
out.writeInt(dispTriStart);
out.writeInt(power);
out.writeInt(minTess);
out.writeFloat(smoothingAngle);
out.writeInt(contents);
out.writeUnsignedShort(mapFace);
out.writeInt(lightmapAlphaStart);
out.writeInt(lightmapSamplePositionStart);
out.writeBytes(neighbors);
for (int i = 0; i < allowedVerts.length; i++) {
out.writeInt(allowedVerts[i]);
}
}
public boolean hasMultiBlend() {
return ((minTess + DDispInfo.DISP_INFO_FLAG_MAGIC) & DDispInfo.DISP_INFO_FLAG_HAS_MULTIBLEND) != 0;
}
}