Pass pre-combined rotations into the rendering code.

This commit is contained in:
Paul Chote
2020-07-12 13:59:09 +01:00
committed by tovl
parent 3c9db4c2ac
commit aae497eff1
9 changed files with 28 additions and 32 deletions

View File

@@ -19,12 +19,12 @@ namespace OpenRA.Graphics
{ {
public readonly IModel Model; public readonly IModel Model;
public readonly Func<WVec> OffsetFunc; public readonly Func<WVec> OffsetFunc;
public readonly Func<IEnumerable<WRot>> RotationFunc; public readonly Func<WRot> RotationFunc;
public readonly Func<bool> DisableFunc; public readonly Func<bool> DisableFunc;
public readonly Func<uint> FrameFunc; public readonly Func<uint> FrameFunc;
public readonly bool ShowShadow; public readonly bool ShowShadow;
public ModelAnimation(IModel model, Func<WVec> offset, Func<IEnumerable<WRot>> rotation, Func<bool> disable, Func<uint> frame, bool showshadow) public ModelAnimation(IModel model, Func<WVec> offset, Func<WRot> rotation, Func<bool> disable, Func<uint> frame, bool showshadow)
{ {
Model = model; Model = model;
OffsetFunc = offset; OffsetFunc = offset;

View File

@@ -114,8 +114,7 @@ namespace OpenRA.Graphics
var offsetVec = Util.MatrixVectorMultiply(invCameraTransform, wr.ScreenVector(m.OffsetFunc())); var offsetVec = Util.MatrixVectorMultiply(invCameraTransform, wr.ScreenVector(m.OffsetFunc()));
var offsetTransform = Util.TranslationMatrix(offsetVec[0], offsetVec[1], offsetVec[2]); var offsetTransform = Util.TranslationMatrix(offsetVec[0], offsetVec[1], offsetVec[2]);
var worldTransform = m.RotationFunc().Aggregate(Util.IdentityMatrix(), var worldTransform = Util.MakeFloatMatrix(m.RotationFunc().AsMatrix());
(x, y) => Util.MatrixMultiply(Util.MakeFloatMatrix(y.AsMatrix()), x));
worldTransform = Util.MatrixMultiply(scaleTransform, worldTransform); worldTransform = Util.MatrixMultiply(scaleTransform, worldTransform);
worldTransform = Util.MatrixMultiply(offsetTransform, worldTransform); worldTransform = Util.MatrixMultiply(offsetTransform, worldTransform);
@@ -189,8 +188,7 @@ namespace OpenRA.Graphics
var offsetVec = Util.MatrixVectorMultiply(invCameraTransform, wr.ScreenVector(m.OffsetFunc())); var offsetVec = Util.MatrixVectorMultiply(invCameraTransform, wr.ScreenVector(m.OffsetFunc()));
var offsetTransform = Util.TranslationMatrix(offsetVec[0], offsetVec[1], offsetVec[2]); var offsetTransform = Util.TranslationMatrix(offsetVec[0], offsetVec[1], offsetVec[2]);
var rotations = m.RotationFunc().Aggregate(Util.IdentityMatrix(), var rotations = Util.MakeFloatMatrix(m.RotationFunc().AsMatrix());
(x, y) => Util.MatrixMultiply(Util.MakeFloatMatrix(y.AsMatrix()), x));
var worldTransform = Util.MatrixMultiply(scaleTransform, rotations); var worldTransform = Util.MatrixMultiply(scaleTransform, rotations);
worldTransform = Util.MatrixMultiply(offsetTransform, worldTransform); worldTransform = Util.MatrixMultiply(offsetTransform, worldTransform);

View File

@@ -40,7 +40,7 @@ namespace OpenRA.Mods.Cnc.Traits.Render
var body = init.Actor.TraitInfo<BodyOrientationInfo>(); var body = init.Actor.TraitInfo<BodyOrientationInfo>();
var model = init.World.ModelCache.GetModelSequence(image, IdleSequence); var model = init.World.ModelCache.GetModelSequence(image, IdleSequence);
yield return new ModelAnimation(model, () => WVec.Zero, yield return new ModelAnimation(model, () => WVec.Zero,
() => new[] { body.QuantizeOrientation(orientation(), facings) }, () => body.QuantizeOrientation(orientation(), facings),
() => false, () => 0, ShowShadow); () => false, () => 0, ShowShadow);
} }
} }
@@ -59,7 +59,7 @@ namespace OpenRA.Mods.Cnc.Traits.Render
var idleModel = self.World.ModelCache.GetModelSequence(rv.Image, info.IdleSequence); var idleModel = self.World.ModelCache.GetModelSequence(rv.Image, info.IdleSequence);
modelAnimation = new ModelAnimation(idleModel, () => WVec.Zero, modelAnimation = new ModelAnimation(idleModel, () => WVec.Zero,
() => new[] { body.QuantizeOrientation(self, self.Orientation) }, () => body.QuantizeOrientation(self, self.Orientation),
() => Docked, () => Docked,
() => 0, info.ShowShadow); () => 0, info.ShowShadow);
@@ -67,7 +67,7 @@ namespace OpenRA.Mods.Cnc.Traits.Render
var unloadModel = self.World.ModelCache.GetModelSequence(rv.Image, info.UnloadSequence); var unloadModel = self.World.ModelCache.GetModelSequence(rv.Image, info.UnloadSequence);
rv.Add(new ModelAnimation(unloadModel, () => WVec.Zero, rv.Add(new ModelAnimation(unloadModel, () => WVec.Zero,
() => new[] { body.QuantizeOrientation(self, self.Orientation) }, () => body.QuantizeOrientation(self, self.Orientation),
() => !Docked, () => !Docked,
() => 0, info.ShowShadow)); () => 0, info.ShowShadow));
} }

View File

@@ -39,7 +39,7 @@ namespace OpenRA.Mods.Cnc.Traits.Render
var frame = init.GetValue<BodyAnimationFrameInit, uint>(this, 0); var frame = init.GetValue<BodyAnimationFrameInit, uint>(this, 0);
yield return new ModelAnimation(model, () => WVec.Zero, yield return new ModelAnimation(model, () => WVec.Zero,
() => new[] { body.QuantizeOrientation(orientation(), facings) }, () => body.QuantizeOrientation(orientation(), facings),
() => false, () => frame, ShowShadow); () => false, () => frame, ShowShadow);
} }
} }
@@ -64,7 +64,7 @@ namespace OpenRA.Mods.Cnc.Traits.Render
var model = self.World.ModelCache.GetModelSequence(rv.Image, info.Sequence); var model = self.World.ModelCache.GetModelSequence(rv.Image, info.Sequence);
frames = model.Frames; frames = model.Frames;
modelAnimation = new ModelAnimation(model, () => WVec.Zero, modelAnimation = new ModelAnimation(model, () => WVec.Zero,
() => new[] { body.QuantizeOrientation(self, self.Orientation) }, () => body.QuantizeOrientation(self, self.Orientation),
() => false, () => frame, info.ShowShadow); () => false, () => frame, info.ShowShadow);
rv.Add(modelAnimation); rv.Add(modelAnimation);

View File

@@ -183,8 +183,8 @@ namespace OpenRA.Mods.Common.Graphics
foreach (var v in draw) foreach (var v in draw)
{ {
var bounds = v.Model.Bounds(v.FrameFunc()); var bounds = v.Model.Bounds(v.FrameFunc());
var worldTransform = v.RotationFunc().Reverse().Aggregate(scaleTransform, var rotation = OpenRA.Graphics.Util.MakeFloatMatrix(v.RotationFunc().AsMatrix());
(x, y) => OpenRA.Graphics.Util.MatrixMultiply(x, OpenRA.Graphics.Util.MakeFloatMatrix(y.AsMatrix()))); var worldTransform = OpenRA.Graphics.Util.MatrixMultiply(scaleTransform, rotation);
var pxPos = pxOrigin + wr.ScreenVectorComponents(v.OffsetFunc()); var pxPos = pxOrigin + wr.ScreenVectorComponents(v.OffsetFunc());
var screenTransform = OpenRA.Graphics.Util.MatrixMultiply(cameraTransform, worldTransform); var screenTransform = OpenRA.Graphics.Util.MatrixMultiply(cameraTransform, worldTransform);
@@ -241,8 +241,8 @@ namespace OpenRA.Mods.Common.Graphics
foreach (var v in draw) foreach (var v in draw)
{ {
var bounds = v.Model.Bounds(v.FrameFunc()); var bounds = v.Model.Bounds(v.FrameFunc());
var worldTransform = v.RotationFunc().Reverse().Aggregate(scaleTransform, var rotation = OpenRA.Graphics.Util.MakeFloatMatrix(v.RotationFunc().AsMatrix());
(x, y) => OpenRA.Graphics.Util.MatrixMultiply(x, OpenRA.Graphics.Util.MakeFloatMatrix(y.AsMatrix()))); var worldTransform = OpenRA.Graphics.Util.MatrixMultiply(scaleTransform, rotation);
var pxPos = pxOrigin + wr.ScreenVectorComponents(v.OffsetFunc()); var pxPos = pxOrigin + wr.ScreenVectorComponents(v.OffsetFunc());
var screenTransform = OpenRA.Graphics.Util.MatrixMultiply(cameraTransform, worldTransform); var screenTransform = OpenRA.Graphics.Util.MatrixMultiply(cameraTransform, worldTransform);

View File

@@ -129,8 +129,8 @@ namespace OpenRA.Mods.Common.Graphics
foreach (var v in draw) foreach (var v in draw)
{ {
var bounds = v.Model.Bounds(v.FrameFunc()); var bounds = v.Model.Bounds(v.FrameFunc());
var worldTransform = v.RotationFunc().Reverse().Aggregate(scaleTransform, var rotation = OpenRA.Graphics.Util.MakeFloatMatrix(v.RotationFunc().AsMatrix());
(x, y) => OpenRA.Graphics.Util.MatrixMultiply(x, OpenRA.Graphics.Util.MakeFloatMatrix(y.AsMatrix()))); var worldTransform = OpenRA.Graphics.Util.MatrixMultiply(scaleTransform, rotation);
var pxPos = pxOrigin + wr.ScreenVectorComponents(v.OffsetFunc()); var pxPos = pxOrigin + wr.ScreenVectorComponents(v.OffsetFunc());
var screenTransform = OpenRA.Graphics.Util.MatrixMultiply(cameraTransform, worldTransform); var screenTransform = OpenRA.Graphics.Util.MatrixMultiply(cameraTransform, worldTransform);

View File

@@ -57,9 +57,8 @@ namespace OpenRA.Mods.Common.Traits.Render
Func<WRot> quantizedTurret = () => body.QuantizeOrientation(turretOrientation(), facings); Func<WRot> quantizedTurret = () => body.QuantizeOrientation(turretOrientation(), facings);
Func<WRot> quantizedBody = () => body.QuantizeOrientation(orientation(), facings); Func<WRot> quantizedBody = () => body.QuantizeOrientation(orientation(), facings);
Func<WVec> barrelOffset = () => body.LocalToWorld((t.Offset + LocalOffset.Rotate(quantizedTurret())).Rotate(quantizedBody())); Func<WVec> barrelOffset = () => body.LocalToWorld((t.Offset + LocalOffset.Rotate(quantizedTurret())).Rotate(quantizedBody()));
Func<WRot> barrelOrientation = () => turretOrientation().Rotate(orientation());
yield return new ModelAnimation(model, barrelOffset, () => new[] { turretOrientation(), orientation() }, yield return new ModelAnimation(model, barrelOffset, barrelOrientation, () => false, () => 0, ShowShadow);
() => false, () => 0, ShowShadow);
} }
} }
@@ -97,13 +96,12 @@ namespace OpenRA.Mods.Common.Traits.Render
return body.LocalToWorld((turretLocalOffset + localOffset.Rotate(turretOrientation)).Rotate(qb)); return body.LocalToWorld((turretLocalOffset + localOffset.Rotate(turretOrientation)).Rotate(qb));
} }
IEnumerable<WRot> BarrelRotation() WRot BarrelRotation()
{ {
var b = self.Orientation; var b = self.Orientation;
var qb = body.QuantizeOrientation(self, b); var qb = body.QuantizeOrientation(self, b);
yield return Info.LocalOrientation; var t = turreted.WorldOrientation(self) - b + WRot.FromYaw(b.Yaw - qb.Yaw);
yield return turreted.WorldOrientation(self) - b + WRot.FromYaw(b.Yaw - qb.Yaw); return Info.LocalOrientation.Rotate(t).Rotate(qb);
yield return qb;
} }
} }
} }

View File

@@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Traits.Render
var body = init.Actor.TraitInfo<BodyOrientationInfo>(); var body = init.Actor.TraitInfo<BodyOrientationInfo>();
var model = init.World.ModelCache.GetModelSequence(image, Sequence); var model = init.World.ModelCache.GetModelSequence(image, Sequence);
yield return new ModelAnimation(model, () => WVec.Zero, yield return new ModelAnimation(model, () => WVec.Zero,
() => new[] { body.QuantizeOrientation(orientation(), facings) }, () => body.QuantizeOrientation(orientation(), facings),
() => false, () => 0, ShowShadow); () => false, () => 0, ShowShadow);
} }
} }
@@ -52,7 +52,7 @@ namespace OpenRA.Mods.Common.Traits.Render
var model = self.World.ModelCache.GetModelSequence(rv.Image, info.Sequence); var model = self.World.ModelCache.GetModelSequence(rv.Image, info.Sequence);
modelAnimation = new ModelAnimation(model, () => WVec.Zero, modelAnimation = new ModelAnimation(model, () => WVec.Zero,
() => new[] { body.QuantizeOrientation(self, self.Orientation) }, () => body.QuantizeOrientation(self, self.Orientation),
() => IsTraitDisabled, () => 0, info.ShowShadow); () => IsTraitDisabled, () => 0, info.ShowShadow);
rv.Add(modelAnimation); rv.Add(modelAnimation);

View File

@@ -45,9 +45,10 @@ namespace OpenRA.Mods.Common.Traits.Render
Func<WVec> turretOffset = () => body.LocalToWorld(t.Offset.Rotate(orientation())); Func<WVec> turretOffset = () => body.LocalToWorld(t.Offset.Rotate(orientation()));
var turretFacing = Turreted.TurretFacingFromInit(init, t); var turretFacing = Turreted.TurretFacingFromInit(init, t);
Func<WRot> turretBodyOrientation = () => WRot.FromYaw(turretFacing() - orientation().Yaw); Func<WRot> turretOrientation = () => WRot.FromYaw(turretFacing() - orientation().Yaw)
yield return new ModelAnimation(model, turretOffset, .Rotate(body.QuantizeOrientation(orientation(), facings));
() => new[] { turretBodyOrientation(), body.QuantizeOrientation(orientation(), facings) }, () => false, () => 0, ShowShadow);
yield return new ModelAnimation(model, turretOffset, turretOrientation, () => false, () => 0, ShowShadow);
} }
} }
@@ -71,12 +72,11 @@ namespace OpenRA.Mods.Common.Traits.Render
() => IsTraitDisabled, () => 0, info.ShowShadow)); () => IsTraitDisabled, () => 0, info.ShowShadow));
} }
IEnumerable<WRot> TurretRotation() WRot TurretRotation()
{ {
var b = self.Orientation; var b = self.Orientation;
var qb = body.QuantizeOrientation(self, b); var qb = body.QuantizeOrientation(self, b);
yield return turreted.WorldOrientation(self) - b + WRot.FromYaw(b.Yaw - qb.Yaw); return (turreted.WorldOrientation(self) - b + WRot.FromYaw(b.Yaw - qb.Yaw)).Rotate(qb);
yield return qb;
} }
} }
} }