mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2026-04-28 05:31:37 +00:00
add dts parser
This commit is contained in:
parent
7b2292739e
commit
5e09678bc5
15 changed files with 1008 additions and 0 deletions
9
src/DtsObject.hx
Normal file
9
src/DtsObject.hx
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
import h3d.Matrix;
|
||||||
|
import h3d.scene.CustomObject;
|
||||||
|
|
||||||
|
class DtsObject extends CustomObject {
|
||||||
|
public function getMountTransform(mountPoint:Int) {
|
||||||
|
// TODO FIX WHEN DTS SUPPORT
|
||||||
|
return Matrix.I();
|
||||||
|
}
|
||||||
|
}
|
||||||
76
src/ForceObject.hx
Normal file
76
src/ForceObject.hx
Normal file
|
|
@ -0,0 +1,76 @@
|
||||||
|
package src;
|
||||||
|
|
||||||
|
import h3d.Vector;
|
||||||
|
import h3d.scene.CustomObject;
|
||||||
|
|
||||||
|
enum ForceType {
|
||||||
|
NoForce;
|
||||||
|
ForceSpherical;
|
||||||
|
ForceField;
|
||||||
|
ForceCone;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ForceData {
|
||||||
|
public var forceType:ForceType;
|
||||||
|
public var forceNode:Int;
|
||||||
|
public var forceVector:Vector;
|
||||||
|
public var forceRadius:Float;
|
||||||
|
public var forceStrength:Float;
|
||||||
|
public var forceArc:Float;
|
||||||
|
|
||||||
|
public function new() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ForceObject extends DtsObject {
|
||||||
|
var forceDatas:Array<ForceData>;
|
||||||
|
|
||||||
|
public function getForce(pos:Vector) {
|
||||||
|
var strength = 0.0;
|
||||||
|
var dot = 0.0;
|
||||||
|
var posVec = new Vector();
|
||||||
|
var retForce = new Vector();
|
||||||
|
for (forceData in forceDatas) {
|
||||||
|
if (forceData.forceType == NoForce) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var node = this.getMountTransform(forceData.forceNode);
|
||||||
|
var nodeVec:Vector;
|
||||||
|
if (forceData.forceVector.length() == 0) {
|
||||||
|
nodeVec = new Vector(node._12, node._22, node._32);
|
||||||
|
} else {
|
||||||
|
nodeVec = forceData.forceVector;
|
||||||
|
}
|
||||||
|
|
||||||
|
posVec = pos.sub(node.getPosition());
|
||||||
|
dot = posVec.length();
|
||||||
|
|
||||||
|
if (forceData.forceRadius < dot) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var forceType = forceData.forceType;
|
||||||
|
strength = (1 - dot / forceData.forceRadius) * forceData.forceStrength;
|
||||||
|
|
||||||
|
if (forceType == ForceSpherical) {
|
||||||
|
dot = strength / dot;
|
||||||
|
retForce = retForce.add(posVec.multiply(dot));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (forceType == ForceField) {
|
||||||
|
retForce = retForce.add(nodeVec.multiply(strength));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (forceType == ForceCone) {
|
||||||
|
posVec = posVec.multiply(1 / dot);
|
||||||
|
var newDot = nodeVec.dot(posVec);
|
||||||
|
var arc = forceData.forceArc;
|
||||||
|
if (arc < newDot) {
|
||||||
|
retForce = retForce.add(posVec.multiply(strength).multiply(newDot - arc).multiply(1 / (1 - arc)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return retForce;
|
||||||
|
}
|
||||||
|
}
|
||||||
25
src/dts/Detail.hx
Normal file
25
src/dts/Detail.hx
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
package dts;
|
||||||
|
|
||||||
|
class Detail {
|
||||||
|
var name:Int;
|
||||||
|
var subShape:Int;
|
||||||
|
var objectDetail:Int;
|
||||||
|
var size:Float;
|
||||||
|
var avgError:Float;
|
||||||
|
var maxError:Float;
|
||||||
|
var polyCount:Int;
|
||||||
|
|
||||||
|
public function new() {}
|
||||||
|
|
||||||
|
public static function read(reader:DtsAlloc) {
|
||||||
|
var d = new Detail();
|
||||||
|
d.name = reader.readU32();
|
||||||
|
d.subShape = reader.readU32();
|
||||||
|
d.objectDetail = reader.readU32();
|
||||||
|
d.size = reader.readF32();
|
||||||
|
d.avgError = reader.readF32();
|
||||||
|
d.maxError = reader.readF32();
|
||||||
|
d.polyCount = reader.readU32();
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
}
|
||||||
124
src/dts/DtsAlloc.hx
Normal file
124
src/dts/DtsAlloc.hx
Normal file
|
|
@ -0,0 +1,124 @@
|
||||||
|
package dts;
|
||||||
|
|
||||||
|
import haxe.Exception;
|
||||||
|
import h3d.Matrix;
|
||||||
|
import dif.math.QuatF;
|
||||||
|
import dif.math.Box3F;
|
||||||
|
import dif.math.Point3F;
|
||||||
|
import dif.math.Point2F;
|
||||||
|
import dif.io.BytesReader;
|
||||||
|
import haxe.io.Bytes;
|
||||||
|
|
||||||
|
class DtsAlloc {
|
||||||
|
public var buf:BytesReader;
|
||||||
|
|
||||||
|
public var index32:Int;
|
||||||
|
|
||||||
|
public var index16:Int;
|
||||||
|
|
||||||
|
public var index8:Int;
|
||||||
|
|
||||||
|
public var lastGuardValue:Int = 0;
|
||||||
|
|
||||||
|
public function new(buf:BytesReader, start32:Int, start16:Int, start8:Int) {
|
||||||
|
this.buf = buf;
|
||||||
|
this.index32 = start32;
|
||||||
|
this.index16 = start32 + start16 * 4;
|
||||||
|
this.index8 = start32 + start8 * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readU32() {
|
||||||
|
buf.seek(this.index32);
|
||||||
|
var val = buf.readInt32();
|
||||||
|
this.index32 += 4;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readS32() {
|
||||||
|
buf.seek(this.index32);
|
||||||
|
var val = buf.readInt32();
|
||||||
|
this.index32 += 4;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readF32() {
|
||||||
|
buf.seek(this.index32);
|
||||||
|
var val = buf.readFloat();
|
||||||
|
this.index32 += 4;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readPoint2F():Point2F {
|
||||||
|
return new Point2F(this.readF32(), this.readF32());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readPoint3F():Point3F {
|
||||||
|
return new Point3F(this.readF32(), this.readF32(), this.readF32());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readBoxF():Box3F {
|
||||||
|
return new Box3F(this.readF32(), this.readF32(), this.readF32(), this.readF32(), this.readF32(), this.readF32());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readU16() {
|
||||||
|
buf.seek(this.index16);
|
||||||
|
var val = this.buf.readInt16();
|
||||||
|
this.index16 += 2;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readS16() {
|
||||||
|
buf.seek(this.index16);
|
||||||
|
var val = this.buf.readInt16();
|
||||||
|
this.index16 += 2;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readU8() {
|
||||||
|
buf.seek(this.index8);
|
||||||
|
var val = this.buf.readByte();
|
||||||
|
this.index8 += 1;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readQuat16() {
|
||||||
|
var quat = new QuatF();
|
||||||
|
quat.x = this.readS16();
|
||||||
|
quat.y = this.readS16();
|
||||||
|
quat.z = this.readS16();
|
||||||
|
quat.w = this.readS16();
|
||||||
|
return quat;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readMatrixF() {
|
||||||
|
var mat = new Matrix();
|
||||||
|
mat._11 = this.readF32();
|
||||||
|
mat._12 = this.readF32();
|
||||||
|
mat._13 = this.readF32();
|
||||||
|
mat._14 = this.readF32();
|
||||||
|
mat._21 = this.readF32();
|
||||||
|
mat._22 = this.readF32();
|
||||||
|
mat._23 = this.readF32();
|
||||||
|
mat._24 = this.readF32();
|
||||||
|
mat._31 = this.readF32();
|
||||||
|
mat._32 = this.readF32();
|
||||||
|
mat._33 = this.readF32();
|
||||||
|
mat._34 = this.readF32();
|
||||||
|
mat._41 = this.readF32();
|
||||||
|
mat._42 = this.readF32();
|
||||||
|
mat._43 = this.readF32();
|
||||||
|
mat._44 = this.readF32();
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function guard() {
|
||||||
|
var guard32 = this.readU32();
|
||||||
|
var guard16 = this.readU16();
|
||||||
|
var guard8 = this.readU8();
|
||||||
|
if (!(guard32 == guard16 && guard16 == guard8 && guard8 == this.lastGuardValue)) {
|
||||||
|
throw new Exception("Guard fail! Expected " + this.lastGuardValue + " but got " + guard32 + " for 32, " + guard16 + " for 16 and " + guard8
|
||||||
|
+ " for 8.");
|
||||||
|
}
|
||||||
|
this.lastGuardValue++;
|
||||||
|
}
|
||||||
|
}
|
||||||
354
src/dts/DtsFile.hx
Normal file
354
src/dts/DtsFile.hx
Normal file
|
|
@ -0,0 +1,354 @@
|
||||||
|
package dts;
|
||||||
|
|
||||||
|
import haxe.Exception;
|
||||||
|
import sys.io.File;
|
||||||
|
import dif.io.BytesReader;
|
||||||
|
import dif.math.QuatF;
|
||||||
|
import dif.math.Box3F;
|
||||||
|
import dif.math.Point3F;
|
||||||
|
|
||||||
|
@:publicFields
|
||||||
|
class DtsFile {
|
||||||
|
var fileVersion:Int;
|
||||||
|
var exporterVersion:Int;
|
||||||
|
var sequences:Array<Sequence>;
|
||||||
|
var matNames:Array<String>;
|
||||||
|
var matFlags:Array<Int>;
|
||||||
|
var matReflectanceMaps:Array<Int>;
|
||||||
|
var matBumpMaps:Array<Int>;
|
||||||
|
var matDetailMaps:Array<Int>;
|
||||||
|
var matDetailScales:Array<Float>;
|
||||||
|
var matReflectionAmounts:Array<Float>;
|
||||||
|
var smallestVisibleSize:Float;
|
||||||
|
var smallestVisibleDL:Float;
|
||||||
|
|
||||||
|
var radius:Float;
|
||||||
|
var radiusTube:Float;
|
||||||
|
var center:Point3F;
|
||||||
|
var bounds:Box3F;
|
||||||
|
|
||||||
|
var nodes:Array<Node>;
|
||||||
|
var objects:Array<Object>;
|
||||||
|
var mats:Array<IflMaterial>;
|
||||||
|
var subshapes:Array<SubShape>;
|
||||||
|
|
||||||
|
var defaultRotations:Array<QuatF>;
|
||||||
|
var defaultTranslations:Array<Point3F>;
|
||||||
|
|
||||||
|
var nodeTranslations:Array<Point3F>;
|
||||||
|
var nodeRotations:Array<QuatF>;
|
||||||
|
|
||||||
|
var nodeUniformScales:Array<Float>;
|
||||||
|
var nodeAlignedScales:Array<Point3F>;
|
||||||
|
var nodeArbitraryScaleFactors:Array<Point3F>;
|
||||||
|
var nodeArbitraryScaleRots:Array<QuatF>;
|
||||||
|
|
||||||
|
var groundTranslations:Array<Point3F>;
|
||||||
|
var groundRots:Array<QuatF>;
|
||||||
|
|
||||||
|
var objectStates:Array<ObjectState>;
|
||||||
|
var decalStates:Array<Int>;
|
||||||
|
var triggers:Array<Trigger>;
|
||||||
|
|
||||||
|
var detailLevels:Array<Detail>;
|
||||||
|
var meshes:Array<Mesh>;
|
||||||
|
|
||||||
|
var names:Array<String>;
|
||||||
|
|
||||||
|
var alphaIn:Array<Int>;
|
||||||
|
var alphaOut:Array<Int>;
|
||||||
|
|
||||||
|
public function new() {}
|
||||||
|
|
||||||
|
public function read(filepath:String) {
|
||||||
|
var f = File.read(filepath);
|
||||||
|
var bytes = f.readAll();
|
||||||
|
var br = new BytesReader(bytes);
|
||||||
|
|
||||||
|
fileVersion = br.readInt16();
|
||||||
|
exporterVersion = br.readInt16();
|
||||||
|
fileVersion &= 0xFF;
|
||||||
|
|
||||||
|
var memBuffer:BytesReader;
|
||||||
|
var start32:Int;
|
||||||
|
var start16:Int;
|
||||||
|
var start8:Int;
|
||||||
|
|
||||||
|
if (fileVersion > 24) {
|
||||||
|
throw new Exception("Invalid DTS version");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileVersion < 19) {
|
||||||
|
throw new Exception("Cant read this!");
|
||||||
|
} else {
|
||||||
|
var sizeMemBuffer = br.readInt32();
|
||||||
|
memBuffer = br;
|
||||||
|
start16 = br.readInt32();
|
||||||
|
start8 = br.readInt32();
|
||||||
|
start32 = br.tell();
|
||||||
|
|
||||||
|
br.seek(br.tell() + sizeMemBuffer * 4);
|
||||||
|
|
||||||
|
var numSequences = br.readInt32();
|
||||||
|
sequences = [];
|
||||||
|
for (i in 0...numSequences) {
|
||||||
|
var seq = new Sequence();
|
||||||
|
seq.read(br, fileVersion, true);
|
||||||
|
sequences.push(seq);
|
||||||
|
}
|
||||||
|
|
||||||
|
parseMaterialList(br, fileVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
var alloc = new DtsAlloc(memBuffer, start32, start16, start8);
|
||||||
|
this.assembleShape(alloc);
|
||||||
|
}
|
||||||
|
|
||||||
|
function assembleShape(ar:DtsAlloc) {
|
||||||
|
var numNodes = ar.readS32();
|
||||||
|
var numObjects = ar.readS32();
|
||||||
|
var numDecals = ar.readS32();
|
||||||
|
var numSubShapes = ar.readS32();
|
||||||
|
var numIflMaterials = ar.readS32();
|
||||||
|
|
||||||
|
var numNodeRots:Int;
|
||||||
|
var numNodeTrans:Int;
|
||||||
|
var numNodeUniformScales:Int;
|
||||||
|
var numNodeAlignedScales:Int;
|
||||||
|
var numNodeArbitraryScales:Int;
|
||||||
|
if (this.fileVersion < 22) {
|
||||||
|
numNodeRots = numNodeTrans = ar.readS32() - numNodes;
|
||||||
|
numNodeUniformScales = numNodeAlignedScales = numNodeArbitraryScales = 0;
|
||||||
|
} else {
|
||||||
|
numNodeRots = ar.readS32();
|
||||||
|
numNodeTrans = ar.readS32();
|
||||||
|
numNodeUniformScales = ar.readS32();
|
||||||
|
numNodeAlignedScales = ar.readS32();
|
||||||
|
numNodeArbitraryScales = ar.readS32();
|
||||||
|
}
|
||||||
|
var numGroundFrames = 0;
|
||||||
|
if (this.fileVersion > 23) {
|
||||||
|
numGroundFrames = ar.readS32();
|
||||||
|
}
|
||||||
|
var numObjectStates = ar.readS32();
|
||||||
|
var numDecalStates = ar.readS32();
|
||||||
|
var numTriggers = ar.readS32();
|
||||||
|
var numDetails = ar.readS32();
|
||||||
|
var numMeshes = ar.readS32();
|
||||||
|
var numSkins = 0;
|
||||||
|
if (this.fileVersion < 23) {
|
||||||
|
numSkins = ar.readS32();
|
||||||
|
}
|
||||||
|
var numNames = ar.readS32();
|
||||||
|
this.smallestVisibleSize = ar.readF32();
|
||||||
|
this.smallestVisibleDL = ar.readS32();
|
||||||
|
|
||||||
|
ar.guard();
|
||||||
|
|
||||||
|
radius = ar.readF32();
|
||||||
|
radiusTube = ar.readF32();
|
||||||
|
center = ar.readPoint3F();
|
||||||
|
bounds = ar.readBoxF();
|
||||||
|
|
||||||
|
ar.guard();
|
||||||
|
|
||||||
|
nodes = [];
|
||||||
|
for (i in 0...numNodes) {
|
||||||
|
nodes.push(Node.read(ar));
|
||||||
|
}
|
||||||
|
ar.guard();
|
||||||
|
|
||||||
|
objects = [];
|
||||||
|
for (i in 0...numObjects) {
|
||||||
|
objects.push(Object.read(ar));
|
||||||
|
}
|
||||||
|
ar.guard();
|
||||||
|
ar.guard();
|
||||||
|
|
||||||
|
mats = [];
|
||||||
|
for (i in 0...numIflMaterials) {
|
||||||
|
mats.push(IflMaterial.read(ar));
|
||||||
|
}
|
||||||
|
ar.guard();
|
||||||
|
|
||||||
|
subshapes = [];
|
||||||
|
for (i in 0...numSubShapes) {
|
||||||
|
subshapes.push(new SubShape(0, 0, 0, 0, 0, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i in 0...numSubShapes)
|
||||||
|
subshapes[i].firstNode = ar.readS32();
|
||||||
|
for (i in 0...numSubShapes)
|
||||||
|
subshapes[i].firstObject = ar.readS32();
|
||||||
|
for (i in 0...numSubShapes)
|
||||||
|
subshapes[i].firstDecal = ar.readS32();
|
||||||
|
|
||||||
|
ar.guard();
|
||||||
|
|
||||||
|
for (i in 0...numSubShapes)
|
||||||
|
subshapes[i].numNodes = ar.readS32();
|
||||||
|
for (i in 0...numSubShapes)
|
||||||
|
subshapes[i].numObjects = ar.readS32();
|
||||||
|
for (i in 0...numSubShapes)
|
||||||
|
subshapes[i].numDecals = ar.readS32();
|
||||||
|
ar.guard();
|
||||||
|
|
||||||
|
if (fileVersion < 16) {
|
||||||
|
var num = ar.readS32();
|
||||||
|
for (i in 0...num)
|
||||||
|
ar.readS32();
|
||||||
|
}
|
||||||
|
|
||||||
|
defaultRotations = [];
|
||||||
|
defaultTranslations = [];
|
||||||
|
for (i in 0...numNodes) {
|
||||||
|
defaultRotations.push(ar.readQuat16());
|
||||||
|
defaultTranslations.push(ar.readPoint3F());
|
||||||
|
}
|
||||||
|
|
||||||
|
nodeTranslations = [];
|
||||||
|
for (i in 0...numNodeTrans)
|
||||||
|
nodeTranslations.push(ar.readPoint3F());
|
||||||
|
|
||||||
|
nodeRotations = [];
|
||||||
|
for (i in 0...numNodeRots)
|
||||||
|
nodeRotations.push(ar.readQuat16());
|
||||||
|
|
||||||
|
ar.guard();
|
||||||
|
|
||||||
|
nodeUniformScales = [];
|
||||||
|
nodeAlignedScales = [];
|
||||||
|
nodeArbitraryScaleFactors = [];
|
||||||
|
nodeArbitraryScaleRots = [];
|
||||||
|
|
||||||
|
if (fileVersion > 21) {
|
||||||
|
for (i in 0...numNodeUniformScales)
|
||||||
|
nodeUniformScales.push(ar.readF32());
|
||||||
|
for (i in 0...numNodeAlignedScales)
|
||||||
|
nodeAlignedScales.push(ar.readPoint3F());
|
||||||
|
for (i in 0...numNodeArbitraryScales)
|
||||||
|
nodeArbitraryScaleFactors.push(ar.readPoint3F());
|
||||||
|
for (i in 0...numNodeArbitraryScales)
|
||||||
|
nodeArbitraryScaleRots.push(ar.readQuat16());
|
||||||
|
ar.guard();
|
||||||
|
} else {
|
||||||
|
for (i in 0...numNodeUniformScales)
|
||||||
|
nodeUniformScales.push(1);
|
||||||
|
for (i in 0...numNodeAlignedScales)
|
||||||
|
nodeAlignedScales.push(new Point3F(1, 1, 1));
|
||||||
|
for (i in 0...numNodeArbitraryScales)
|
||||||
|
nodeArbitraryScaleFactors.push(new Point3F(1, 1, 1));
|
||||||
|
for (i in 0...numNodeArbitraryScales)
|
||||||
|
nodeArbitraryScaleRots.push(new QuatF());
|
||||||
|
}
|
||||||
|
|
||||||
|
groundTranslations = [];
|
||||||
|
groundRots = [];
|
||||||
|
if (fileVersion > 23) {
|
||||||
|
for (i in 0...numGroundFrames) {
|
||||||
|
groundTranslations.push(ar.readPoint3F());
|
||||||
|
}
|
||||||
|
for (i in 0...numGroundFrames) {
|
||||||
|
groundRots.push(ar.readQuat16());
|
||||||
|
}
|
||||||
|
ar.guard();
|
||||||
|
} else {
|
||||||
|
for (i in 0...numGroundFrames) {
|
||||||
|
groundTranslations.push(new Point3F(1, 1, 1));
|
||||||
|
}
|
||||||
|
for (i in 0...numGroundFrames) {
|
||||||
|
groundRots.push(new QuatF());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
objectStates = [];
|
||||||
|
for (i in 0...numObjectStates) {
|
||||||
|
objectStates.push(ObjectState.read(ar));
|
||||||
|
}
|
||||||
|
ar.guard();
|
||||||
|
|
||||||
|
decalStates = [];
|
||||||
|
for (i in 0...numDecalStates) {
|
||||||
|
decalStates.push(ar.readS32());
|
||||||
|
}
|
||||||
|
ar.guard();
|
||||||
|
|
||||||
|
triggers = [];
|
||||||
|
for (i in 0...numTriggers) {
|
||||||
|
triggers.push(Trigger.read(ar));
|
||||||
|
}
|
||||||
|
ar.guard();
|
||||||
|
|
||||||
|
detailLevels = [];
|
||||||
|
for (i in 0...numDetails) {
|
||||||
|
detailLevels.push(Detail.read(ar));
|
||||||
|
}
|
||||||
|
ar.guard();
|
||||||
|
|
||||||
|
meshes = [];
|
||||||
|
for (i in 0...numMeshes) {
|
||||||
|
meshes.push(Mesh.read(this, ar));
|
||||||
|
}
|
||||||
|
ar.guard();
|
||||||
|
|
||||||
|
names = [];
|
||||||
|
for (i in 0...numNames) {
|
||||||
|
var str = "";
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
var charCode = ar.readU8();
|
||||||
|
if (charCode == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
str += String.fromCharCode(charCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
names.push(str);
|
||||||
|
}
|
||||||
|
ar.guard();
|
||||||
|
|
||||||
|
alphaIn = [];
|
||||||
|
alphaOut = [];
|
||||||
|
|
||||||
|
if (fileVersion >= 26) {
|
||||||
|
for (i in 0...numDetails) {
|
||||||
|
alphaIn.push(ar.readS32());
|
||||||
|
}
|
||||||
|
for (i in 0...numDetails) {
|
||||||
|
alphaOut.push(ar.readS32());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseMaterialList(br:BytesReader, version:Int) {
|
||||||
|
var matStreamType = br.readInt32();
|
||||||
|
var numMaterials = br.readInt32();
|
||||||
|
matNames = [];
|
||||||
|
for (i in 0...numMaterials) {
|
||||||
|
matNames.push(br.readStr());
|
||||||
|
}
|
||||||
|
for (i in 0...numMaterials) {
|
||||||
|
matFlags.push(br.readInt32());
|
||||||
|
}
|
||||||
|
for (i in 0...numMaterials) {
|
||||||
|
matReflectanceMaps.push(br.readInt32());
|
||||||
|
}
|
||||||
|
for (i in 0...numMaterials) {
|
||||||
|
matBumpMaps.push(br.readInt32());
|
||||||
|
}
|
||||||
|
for (i in 0...numMaterials) {
|
||||||
|
matDetailMaps.push(br.readInt32());
|
||||||
|
}
|
||||||
|
if (version == 25) {
|
||||||
|
for (i in 0...numMaterials) {
|
||||||
|
br.readInt32();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i in 0...numMaterials) {
|
||||||
|
matDetailScales.push(br.readFloat());
|
||||||
|
}
|
||||||
|
for (i in 0...numMaterials) {
|
||||||
|
matReflectionAmounts.push(br.readFloat());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
23
src/dts/IflMaterial.hx
Normal file
23
src/dts/IflMaterial.hx
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
package dts;
|
||||||
|
|
||||||
|
import dif.io.BytesReader;
|
||||||
|
|
||||||
|
class IflMaterial {
|
||||||
|
var name:Int;
|
||||||
|
var slot:Int;
|
||||||
|
var firstFrame:Int;
|
||||||
|
var time:Int;
|
||||||
|
var numFrames:Int;
|
||||||
|
|
||||||
|
public function new() {}
|
||||||
|
|
||||||
|
public static function read(reader:DtsAlloc) {
|
||||||
|
var ifl = new IflMaterial();
|
||||||
|
ifl.name = reader.readU32();
|
||||||
|
ifl.slot = reader.readU32();
|
||||||
|
ifl.firstFrame = reader.readU32();
|
||||||
|
ifl.time = reader.readU32();
|
||||||
|
ifl.numFrames = reader.readU32();
|
||||||
|
return ifl;
|
||||||
|
}
|
||||||
|
}
|
||||||
156
src/dts/Mesh.hx
Normal file
156
src/dts/Mesh.hx
Normal file
|
|
@ -0,0 +1,156 @@
|
||||||
|
package dts;
|
||||||
|
|
||||||
|
import haxe.Exception;
|
||||||
|
import dif.math.Point2F;
|
||||||
|
import dif.math.Point3F;
|
||||||
|
import dif.math.Box3F;
|
||||||
|
|
||||||
|
class Mesh {
|
||||||
|
var meshType:Int;
|
||||||
|
var numFrames:Int;
|
||||||
|
var numMatFrames:Int;
|
||||||
|
var parent:Int;
|
||||||
|
var bounds:Box3F;
|
||||||
|
var center:Point3F;
|
||||||
|
var radius:Float;
|
||||||
|
var vertices:Array<Point3F>;
|
||||||
|
var uv:Array<Point2F>;
|
||||||
|
var normals:Array<Point3F>;
|
||||||
|
var enormals:Array<Int>;
|
||||||
|
var primitives:Array<Primitive>;
|
||||||
|
var indices:Array<Int>;
|
||||||
|
var mindices:Array<Int>;
|
||||||
|
var vertsPerFrame:Int;
|
||||||
|
var type:Int;
|
||||||
|
var shape:DtsFile;
|
||||||
|
|
||||||
|
public function new() {}
|
||||||
|
|
||||||
|
function readStandard(reader:DtsAlloc) {
|
||||||
|
reader.guard();
|
||||||
|
|
||||||
|
numFrames = reader.readU32();
|
||||||
|
numMatFrames = reader.readU32();
|
||||||
|
parent = reader.readS32();
|
||||||
|
bounds = reader.readBoxF();
|
||||||
|
center = reader.readPoint3F();
|
||||||
|
radius = reader.readF32();
|
||||||
|
|
||||||
|
var numVerts = reader.readU32();
|
||||||
|
vertices = [];
|
||||||
|
if (this.parent < 0) {
|
||||||
|
for (i in 0...numVerts) {
|
||||||
|
vertices.push(reader.readPoint3F());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
vertices = shape.meshes[this.parent].vertices;
|
||||||
|
}
|
||||||
|
|
||||||
|
var tVerts = reader.readU32();
|
||||||
|
uv = [];
|
||||||
|
if (this.parent < 0) {
|
||||||
|
for (i in 0...tVerts) {
|
||||||
|
uv.push(reader.readPoint2F());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
uv = shape.meshes[this.parent].uv;
|
||||||
|
}
|
||||||
|
|
||||||
|
var numNormals = reader.readU32();
|
||||||
|
normals = [];
|
||||||
|
if (this.parent < 0) {
|
||||||
|
for (i in 0...numNormals) {
|
||||||
|
normals.push(reader.readPoint3F());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
normals = shape.meshes[this.parent].normals;
|
||||||
|
}
|
||||||
|
|
||||||
|
enormals = [];
|
||||||
|
if (this.parent < 0) {
|
||||||
|
for (i in 0...numVerts) {
|
||||||
|
enormals.push(reader.readU8());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
primitives = [];
|
||||||
|
var numPrimitives = reader.readU32();
|
||||||
|
for (i in 0...numPrimitives) {
|
||||||
|
primitives.push(Primitive.read(reader));
|
||||||
|
}
|
||||||
|
|
||||||
|
indices = [];
|
||||||
|
var numIndices = reader.readU32();
|
||||||
|
for (i in 0...numIndices) {
|
||||||
|
indices.push(reader.readS16());
|
||||||
|
}
|
||||||
|
|
||||||
|
mindices = [];
|
||||||
|
var numMIndices = reader.readU32();
|
||||||
|
for (i in 0...numMIndices) {
|
||||||
|
mindices.push(reader.readS16());
|
||||||
|
}
|
||||||
|
|
||||||
|
vertsPerFrame = reader.readS32();
|
||||||
|
type = reader.readS32();
|
||||||
|
|
||||||
|
reader.guard();
|
||||||
|
}
|
||||||
|
|
||||||
|
function readSkinned(reader:DtsAlloc) {
|
||||||
|
readStandard(reader);
|
||||||
|
|
||||||
|
var sz = reader.readS32();
|
||||||
|
for (i in 0...sz) {
|
||||||
|
reader.readPoint3F();
|
||||||
|
}
|
||||||
|
for (i in 0...sz) {
|
||||||
|
reader.readPoint3F();
|
||||||
|
}
|
||||||
|
for (i in 0...sz) {
|
||||||
|
reader.readU8();
|
||||||
|
}
|
||||||
|
|
||||||
|
sz = reader.readS32();
|
||||||
|
for (i in 0...sz) {
|
||||||
|
for (j in 0...16) {
|
||||||
|
reader.readF32();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sz = reader.readS32();
|
||||||
|
for (i in 0...sz) {
|
||||||
|
reader.readS32();
|
||||||
|
}
|
||||||
|
for (i in 0...sz) {
|
||||||
|
reader.readS32();
|
||||||
|
}
|
||||||
|
for (i in 0...sz) {
|
||||||
|
reader.readF32();
|
||||||
|
}
|
||||||
|
|
||||||
|
sz = reader.readS32();
|
||||||
|
for (i in 0...sz) {
|
||||||
|
reader.readS32();
|
||||||
|
}
|
||||||
|
|
||||||
|
reader.guard();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function read(shape:DtsFile, reader:DtsAlloc) {
|
||||||
|
var mesh = new Mesh();
|
||||||
|
mesh.shape = shape;
|
||||||
|
mesh.meshType = reader.readS32() & 7;
|
||||||
|
|
||||||
|
if (mesh.meshType == 0)
|
||||||
|
mesh.readStandard(reader);
|
||||||
|
else if (mesh.meshType == 1)
|
||||||
|
mesh.readSkinned(reader);
|
||||||
|
else if (mesh.meshType == 4)
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
throw new Exception("idk how to read this");
|
||||||
|
|
||||||
|
return mesh;
|
||||||
|
}
|
||||||
|
}
|
||||||
23
src/dts/Node.hx
Normal file
23
src/dts/Node.hx
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
package dts;
|
||||||
|
|
||||||
|
import dif.io.BytesReader;
|
||||||
|
|
||||||
|
class Node {
|
||||||
|
var name:Int;
|
||||||
|
var parent:Int;
|
||||||
|
var firstObject:Int = -1;
|
||||||
|
var firstChild:Int = -1;
|
||||||
|
var nextSibling:Int = -1;
|
||||||
|
|
||||||
|
public function new() {}
|
||||||
|
|
||||||
|
public static function read(reader:DtsAlloc) {
|
||||||
|
var node = new Node();
|
||||||
|
node.name = reader.readU32();
|
||||||
|
node.parent = reader.readU32();
|
||||||
|
node.firstObject = reader.readU32();
|
||||||
|
node.firstChild = reader.readU32();
|
||||||
|
node.nextSibling = reader.readU32();
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
}
|
||||||
25
src/dts/Object.hx
Normal file
25
src/dts/Object.hx
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
package dts;
|
||||||
|
|
||||||
|
import dif.io.BytesReader;
|
||||||
|
|
||||||
|
class Object {
|
||||||
|
var name:Int;
|
||||||
|
var numMeshes:Int;
|
||||||
|
var firstMesh:Int;
|
||||||
|
var node:Int;
|
||||||
|
var firstDecal:Int;
|
||||||
|
var nextSibling:Int;
|
||||||
|
|
||||||
|
public function new() {}
|
||||||
|
|
||||||
|
public static function read(reader:DtsAlloc) {
|
||||||
|
var obj = new Object();
|
||||||
|
obj.name = reader.readU32();
|
||||||
|
obj.numMeshes = reader.readU32();
|
||||||
|
obj.firstMesh = reader.readU32();
|
||||||
|
obj.node = reader.readU32();
|
||||||
|
obj.nextSibling = reader.readU32();
|
||||||
|
obj.firstDecal = reader.readU32();
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
}
|
||||||
19
src/dts/ObjectState.hx
Normal file
19
src/dts/ObjectState.hx
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
package dts;
|
||||||
|
|
||||||
|
import dif.io.BytesReader;
|
||||||
|
|
||||||
|
class ObjectState {
|
||||||
|
var vis:Float;
|
||||||
|
var frame:Int;
|
||||||
|
var matFrame:Int;
|
||||||
|
|
||||||
|
public function new() {}
|
||||||
|
|
||||||
|
public static function read(reader:DtsAlloc) {
|
||||||
|
var os = new ObjectState();
|
||||||
|
os.vis = reader.readF32();
|
||||||
|
os.frame = reader.readU32();
|
||||||
|
os.matFrame = reader.readU32();
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
}
|
||||||
19
src/dts/Primitive.hx
Normal file
19
src/dts/Primitive.hx
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
package dts;
|
||||||
|
|
||||||
|
import dif.io.BytesReader;
|
||||||
|
|
||||||
|
class Primitive {
|
||||||
|
var firstElement:Int;
|
||||||
|
var numElements:Int;
|
||||||
|
var type:Int;
|
||||||
|
|
||||||
|
public function new() {}
|
||||||
|
|
||||||
|
public static function read(reader:DtsAlloc) {
|
||||||
|
var p = new Primitive();
|
||||||
|
p.firstElement = reader.readU16();
|
||||||
|
p.numElements = reader.readU16();
|
||||||
|
p.type = reader.readU32();
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
}
|
||||||
106
src/dts/Sequence.hx
Normal file
106
src/dts/Sequence.hx
Normal file
|
|
@ -0,0 +1,106 @@
|
||||||
|
package dts;
|
||||||
|
|
||||||
|
import dif.io.BytesReader;
|
||||||
|
import hl.I64;
|
||||||
|
|
||||||
|
class Sequence {
|
||||||
|
var nameIndex:Int;
|
||||||
|
var numKeyFrames:Int;
|
||||||
|
var duration:Float;
|
||||||
|
var baseRotation:Int;
|
||||||
|
var baseTranslation:Int;
|
||||||
|
var baseScale:Int;
|
||||||
|
var baseObjectState:Int;
|
||||||
|
var baseDecalState:Int;
|
||||||
|
var firstGroundFrame:Int;
|
||||||
|
var numGroundFrames:Int;
|
||||||
|
var firstTrigger:Int;
|
||||||
|
var numTriggers:Int;
|
||||||
|
var toolBegin:Float;
|
||||||
|
|
||||||
|
var rotationMatters:Array<Int>;
|
||||||
|
var translationMatters:Array<Int>;
|
||||||
|
var scaleMatters:Array<Int>;
|
||||||
|
var visMatters:Array<Int>;
|
||||||
|
var frameMatters:Array<Int>;
|
||||||
|
var matFrameMatters:Array<Int>;
|
||||||
|
var decalMatters:Array<Int>;
|
||||||
|
var iflMatters:Array<Int>;
|
||||||
|
|
||||||
|
var priority:Int;
|
||||||
|
var flags:Int;
|
||||||
|
var dirtyFlags:Int;
|
||||||
|
|
||||||
|
public function new() {}
|
||||||
|
|
||||||
|
public function read(reader:BytesReader, fileVersion:Int, readNameIndex:Bool) {
|
||||||
|
if (readNameIndex) {
|
||||||
|
this.nameIndex = reader.readInt32();
|
||||||
|
}
|
||||||
|
this.flags = 0;
|
||||||
|
|
||||||
|
if (fileVersion > 21) {
|
||||||
|
this.flags = reader.readInt32();
|
||||||
|
}
|
||||||
|
this.numKeyFrames = reader.readInt32();
|
||||||
|
this.duration = reader.readFloat();
|
||||||
|
|
||||||
|
if (fileVersion < 22) {
|
||||||
|
var tmp = reader.readByte();
|
||||||
|
if (tmp > 0) {
|
||||||
|
flags |= ShapeFlags.Blend;
|
||||||
|
}
|
||||||
|
tmp = reader.readByte();
|
||||||
|
if (tmp > 0) {
|
||||||
|
flags |= ShapeFlags.Cyclic;
|
||||||
|
}
|
||||||
|
tmp = reader.readByte();
|
||||||
|
if (tmp > 0) {
|
||||||
|
flags |= ShapeFlags.MakePath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.priority = reader.readInt32();
|
||||||
|
this.firstGroundFrame = reader.readInt32();
|
||||||
|
this.numGroundFrames = reader.readInt32();
|
||||||
|
|
||||||
|
if (fileVersion > 21) {
|
||||||
|
this.baseRotation = reader.readInt32();
|
||||||
|
this.baseTranslation = reader.readInt32();
|
||||||
|
this.baseScale = reader.readInt32();
|
||||||
|
this.baseObjectState = reader.readInt32();
|
||||||
|
this.baseDecalState = reader.readInt32();
|
||||||
|
} else {
|
||||||
|
this.baseRotation = reader.readInt32();
|
||||||
|
this.baseTranslation = this.baseRotation;
|
||||||
|
this.baseObjectState = reader.readInt32();
|
||||||
|
this.baseDecalState = reader.readInt32();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.firstTrigger = reader.readInt32();
|
||||||
|
this.numTriggers = reader.readInt32();
|
||||||
|
this.toolBegin = reader.readInt32();
|
||||||
|
|
||||||
|
rotationMatters = readBitSet(reader);
|
||||||
|
translationMatters = readBitSet(reader);
|
||||||
|
scaleMatters = readBitSet(reader);
|
||||||
|
decalMatters = readBitSet(reader);
|
||||||
|
iflMatters = readBitSet(reader);
|
||||||
|
visMatters = readBitSet(reader);
|
||||||
|
frameMatters = readBitSet(reader);
|
||||||
|
matFrameMatters = readBitSet(reader);
|
||||||
|
|
||||||
|
this.dirtyFlags = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function readBitSet(reader:BytesReader) {
|
||||||
|
var dummy = reader.readInt32();
|
||||||
|
var numWords = reader.readInt32();
|
||||||
|
var ret = [];
|
||||||
|
for (i in 0...numWords) {
|
||||||
|
ret.push(reader.readInt32());
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
13
src/dts/ShapeFlags.hx
Normal file
13
src/dts/ShapeFlags.hx
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
package dts;
|
||||||
|
|
||||||
|
class ShapeFlags {
|
||||||
|
public static var UniformScale = 0;
|
||||||
|
public static var AlignedScale = 1;
|
||||||
|
public static var ArbitraryScale = 2;
|
||||||
|
public static var Blend = 4;
|
||||||
|
public static var Cyclic = 8;
|
||||||
|
public static var MakePath = 16;
|
||||||
|
public static var IflInit = 32;
|
||||||
|
public static var HasTranslucency = 64;
|
||||||
|
public static var AnyScale = 3;
|
||||||
|
}
|
||||||
19
src/dts/SubShape.hx
Normal file
19
src/dts/SubShape.hx
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
package dts;
|
||||||
|
|
||||||
|
class SubShape {
|
||||||
|
public var firstNode:Int;
|
||||||
|
public var firstObject:Int;
|
||||||
|
public var firstDecal:Int;
|
||||||
|
public var numNodes:Int;
|
||||||
|
public var numObjects:Int;
|
||||||
|
public var numDecals:Int;
|
||||||
|
|
||||||
|
public function new(firstNode:Int, firstObject:Int, firstDecal:Int, numNodes:Int, numObjects:Int, numDecals:Int) {
|
||||||
|
this.firstNode = firstNode;
|
||||||
|
this.firstObject = firstObject;
|
||||||
|
this.firstDecal = firstDecal;
|
||||||
|
this.numNodes = numNodes;
|
||||||
|
this.numObjects = numObjects;
|
||||||
|
this.numDecals = numDecals;
|
||||||
|
}
|
||||||
|
}
|
||||||
17
src/dts/Trigger.hx
Normal file
17
src/dts/Trigger.hx
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
package dts;
|
||||||
|
|
||||||
|
import dif.io.BytesReader;
|
||||||
|
|
||||||
|
class Trigger {
|
||||||
|
var state:Int;
|
||||||
|
var position:Float;
|
||||||
|
|
||||||
|
public function new() {}
|
||||||
|
|
||||||
|
public static function read(reader:DtsAlloc) {
|
||||||
|
var t = new Trigger();
|
||||||
|
t.state = reader.readU32();
|
||||||
|
t.position = reader.readU32();
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue