mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2026-02-15 02:36:01 +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