Add joint transformation to modelfile
This commit is contained in:
parent
9c71529d8e
commit
a8bdf37097
|
@ -288,6 +288,73 @@ public class ModelFile
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Apply transforms to normals and stuff
|
||||||
|
public void ApplyJoints(float[] joints)
|
||||||
|
{
|
||||||
|
// Build map of objects to their parent id
|
||||||
|
var objCount = Objects.Length;
|
||||||
|
var parentIds = new int[objCount];
|
||||||
|
for (var i = 0; i < objCount; i++)
|
||||||
|
{
|
||||||
|
parentIds[i] = -1;
|
||||||
|
}
|
||||||
|
for (var i = 0; i < objCount; i++)
|
||||||
|
{
|
||||||
|
var subObj = Objects[i];
|
||||||
|
var childIdx = subObj.Child;
|
||||||
|
while (childIdx != -1)
|
||||||
|
{
|
||||||
|
parentIds[childIdx] = i;
|
||||||
|
childIdx = Objects[childIdx].Next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate base transforms for every subobj (including joint)
|
||||||
|
var subObjTransforms = new Matrix4x4[objCount];
|
||||||
|
for (var i = 0; i < objCount; i++)
|
||||||
|
{
|
||||||
|
var subObj = Objects[i];
|
||||||
|
var objTrans = Matrix4x4.Identity;
|
||||||
|
if (subObj.Joint != -1)
|
||||||
|
{
|
||||||
|
var ang = float.DegreesToRadians(joints[subObj.Joint]);
|
||||||
|
// TODO: Is this correct? Should I use a manual rotation matrix?
|
||||||
|
var jointRot = Matrix4x4.CreateFromYawPitchRoll(0, ang, 0);
|
||||||
|
objTrans = jointRot * subObj.Transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
subObjTransforms[i] = objTrans;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply sub object transforms
|
||||||
|
for (var i = 0; i < objCount; i++)
|
||||||
|
{
|
||||||
|
var subObj = Objects[i];
|
||||||
|
var transform = subObjTransforms[i];
|
||||||
|
|
||||||
|
// Build compound transformation
|
||||||
|
var parentId = parentIds[i];
|
||||||
|
while (parentId != -1)
|
||||||
|
{
|
||||||
|
transform *= subObjTransforms[parentId];
|
||||||
|
parentId = parentIds[parentId];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var j = 0; j < subObj.VhotCount; j++)
|
||||||
|
{
|
||||||
|
var v = VHots[subObj.VhotIdx + j];
|
||||||
|
v.Position = Vector3.Transform(v.Position, transform);
|
||||||
|
VHots[subObj.VhotIdx + j] = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var j = 0; j < subObj.PointCount; j++)
|
||||||
|
{
|
||||||
|
var v = Vertices[subObj.PointIdx + j];
|
||||||
|
Vertices[subObj.PointIdx + j] = Vector3.Transform(v, transform);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public bool TryGetVhot(VhotId id, out VHot vhot)
|
public bool TryGetVhot(VhotId id, out VHot vhot)
|
||||||
{
|
{
|
||||||
foreach (var v in VHots)
|
foreach (var v in VHots)
|
||||||
|
|
Loading…
Reference in New Issue