From aae497eff189a280963c88c3dae3c32dca576f1f Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 12 Jul 2020 13:59:09 +0100 Subject: [PATCH] Pass pre-combined rotations into the rendering code. --- OpenRA.Game/Graphics/ModelAnimation.cs | 4 ++-- OpenRA.Game/Graphics/ModelRenderer.cs | 6 ++---- OpenRA.Mods.Cnc/Traits/Render/WithVoxelUnloadBody.cs | 6 +++--- OpenRA.Mods.Cnc/Traits/Render/WithVoxelWalkerBody.cs | 4 ++-- OpenRA.Mods.Common/Graphics/ModelRenderable.cs | 8 ++++---- OpenRA.Mods.Common/Graphics/UIModelRenderable.cs | 4 ++-- OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs | 12 +++++------- OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs | 4 ++-- OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs | 12 ++++++------ 9 files changed, 28 insertions(+), 32 deletions(-) diff --git a/OpenRA.Game/Graphics/ModelAnimation.cs b/OpenRA.Game/Graphics/ModelAnimation.cs index 83f58dc493..d35e004031 100644 --- a/OpenRA.Game/Graphics/ModelAnimation.cs +++ b/OpenRA.Game/Graphics/ModelAnimation.cs @@ -19,12 +19,12 @@ namespace OpenRA.Graphics { public readonly IModel Model; public readonly Func OffsetFunc; - public readonly Func> RotationFunc; + public readonly Func RotationFunc; public readonly Func DisableFunc; public readonly Func FrameFunc; public readonly bool ShowShadow; - public ModelAnimation(IModel model, Func offset, Func> rotation, Func disable, Func frame, bool showshadow) + public ModelAnimation(IModel model, Func offset, Func rotation, Func disable, Func frame, bool showshadow) { Model = model; OffsetFunc = offset; diff --git a/OpenRA.Game/Graphics/ModelRenderer.cs b/OpenRA.Game/Graphics/ModelRenderer.cs index 7912424b77..184f6e122c 100644 --- a/OpenRA.Game/Graphics/ModelRenderer.cs +++ b/OpenRA.Game/Graphics/ModelRenderer.cs @@ -114,8 +114,7 @@ namespace OpenRA.Graphics var offsetVec = Util.MatrixVectorMultiply(invCameraTransform, wr.ScreenVector(m.OffsetFunc())); var offsetTransform = Util.TranslationMatrix(offsetVec[0], offsetVec[1], offsetVec[2]); - var worldTransform = m.RotationFunc().Aggregate(Util.IdentityMatrix(), - (x, y) => Util.MatrixMultiply(Util.MakeFloatMatrix(y.AsMatrix()), x)); + var worldTransform = Util.MakeFloatMatrix(m.RotationFunc().AsMatrix()); worldTransform = Util.MatrixMultiply(scaleTransform, worldTransform); worldTransform = Util.MatrixMultiply(offsetTransform, worldTransform); @@ -189,8 +188,7 @@ namespace OpenRA.Graphics var offsetVec = Util.MatrixVectorMultiply(invCameraTransform, wr.ScreenVector(m.OffsetFunc())); var offsetTransform = Util.TranslationMatrix(offsetVec[0], offsetVec[1], offsetVec[2]); - var rotations = m.RotationFunc().Aggregate(Util.IdentityMatrix(), - (x, y) => Util.MatrixMultiply(Util.MakeFloatMatrix(y.AsMatrix()), x)); + var rotations = Util.MakeFloatMatrix(m.RotationFunc().AsMatrix()); var worldTransform = Util.MatrixMultiply(scaleTransform, rotations); worldTransform = Util.MatrixMultiply(offsetTransform, worldTransform); diff --git a/OpenRA.Mods.Cnc/Traits/Render/WithVoxelUnloadBody.cs b/OpenRA.Mods.Cnc/Traits/Render/WithVoxelUnloadBody.cs index 7f884e9184..1d3042062b 100644 --- a/OpenRA.Mods.Cnc/Traits/Render/WithVoxelUnloadBody.cs +++ b/OpenRA.Mods.Cnc/Traits/Render/WithVoxelUnloadBody.cs @@ -40,7 +40,7 @@ namespace OpenRA.Mods.Cnc.Traits.Render var body = init.Actor.TraitInfo(); var model = init.World.ModelCache.GetModelSequence(image, IdleSequence); yield return new ModelAnimation(model, () => WVec.Zero, - () => new[] { body.QuantizeOrientation(orientation(), facings) }, + () => body.QuantizeOrientation(orientation(), facings), () => false, () => 0, ShowShadow); } } @@ -59,7 +59,7 @@ namespace OpenRA.Mods.Cnc.Traits.Render var idleModel = self.World.ModelCache.GetModelSequence(rv.Image, info.IdleSequence); modelAnimation = new ModelAnimation(idleModel, () => WVec.Zero, - () => new[] { body.QuantizeOrientation(self, self.Orientation) }, + () => body.QuantizeOrientation(self, self.Orientation), () => Docked, () => 0, info.ShowShadow); @@ -67,7 +67,7 @@ namespace OpenRA.Mods.Cnc.Traits.Render var unloadModel = self.World.ModelCache.GetModelSequence(rv.Image, info.UnloadSequence); rv.Add(new ModelAnimation(unloadModel, () => WVec.Zero, - () => new[] { body.QuantizeOrientation(self, self.Orientation) }, + () => body.QuantizeOrientation(self, self.Orientation), () => !Docked, () => 0, info.ShowShadow)); } diff --git a/OpenRA.Mods.Cnc/Traits/Render/WithVoxelWalkerBody.cs b/OpenRA.Mods.Cnc/Traits/Render/WithVoxelWalkerBody.cs index c93f1654d8..8be1ed3ba1 100644 --- a/OpenRA.Mods.Cnc/Traits/Render/WithVoxelWalkerBody.cs +++ b/OpenRA.Mods.Cnc/Traits/Render/WithVoxelWalkerBody.cs @@ -39,7 +39,7 @@ namespace OpenRA.Mods.Cnc.Traits.Render var frame = init.GetValue(this, 0); yield return new ModelAnimation(model, () => WVec.Zero, - () => new[] { body.QuantizeOrientation(orientation(), facings) }, + () => body.QuantizeOrientation(orientation(), facings), () => false, () => frame, ShowShadow); } } @@ -64,7 +64,7 @@ namespace OpenRA.Mods.Cnc.Traits.Render var model = self.World.ModelCache.GetModelSequence(rv.Image, info.Sequence); frames = model.Frames; modelAnimation = new ModelAnimation(model, () => WVec.Zero, - () => new[] { body.QuantizeOrientation(self, self.Orientation) }, + () => body.QuantizeOrientation(self, self.Orientation), () => false, () => frame, info.ShowShadow); rv.Add(modelAnimation); diff --git a/OpenRA.Mods.Common/Graphics/ModelRenderable.cs b/OpenRA.Mods.Common/Graphics/ModelRenderable.cs index b0a98d5657..f8ca37d18c 100644 --- a/OpenRA.Mods.Common/Graphics/ModelRenderable.cs +++ b/OpenRA.Mods.Common/Graphics/ModelRenderable.cs @@ -183,8 +183,8 @@ namespace OpenRA.Mods.Common.Graphics foreach (var v in draw) { var bounds = v.Model.Bounds(v.FrameFunc()); - var worldTransform = v.RotationFunc().Reverse().Aggregate(scaleTransform, - (x, y) => OpenRA.Graphics.Util.MatrixMultiply(x, OpenRA.Graphics.Util.MakeFloatMatrix(y.AsMatrix()))); + var rotation = OpenRA.Graphics.Util.MakeFloatMatrix(v.RotationFunc().AsMatrix()); + var worldTransform = OpenRA.Graphics.Util.MatrixMultiply(scaleTransform, rotation); var pxPos = pxOrigin + wr.ScreenVectorComponents(v.OffsetFunc()); var screenTransform = OpenRA.Graphics.Util.MatrixMultiply(cameraTransform, worldTransform); @@ -241,8 +241,8 @@ namespace OpenRA.Mods.Common.Graphics foreach (var v in draw) { var bounds = v.Model.Bounds(v.FrameFunc()); - var worldTransform = v.RotationFunc().Reverse().Aggregate(scaleTransform, - (x, y) => OpenRA.Graphics.Util.MatrixMultiply(x, OpenRA.Graphics.Util.MakeFloatMatrix(y.AsMatrix()))); + var rotation = OpenRA.Graphics.Util.MakeFloatMatrix(v.RotationFunc().AsMatrix()); + var worldTransform = OpenRA.Graphics.Util.MatrixMultiply(scaleTransform, rotation); var pxPos = pxOrigin + wr.ScreenVectorComponents(v.OffsetFunc()); var screenTransform = OpenRA.Graphics.Util.MatrixMultiply(cameraTransform, worldTransform); diff --git a/OpenRA.Mods.Common/Graphics/UIModelRenderable.cs b/OpenRA.Mods.Common/Graphics/UIModelRenderable.cs index 5f312f8260..afa75bb848 100644 --- a/OpenRA.Mods.Common/Graphics/UIModelRenderable.cs +++ b/OpenRA.Mods.Common/Graphics/UIModelRenderable.cs @@ -129,8 +129,8 @@ namespace OpenRA.Mods.Common.Graphics foreach (var v in draw) { var bounds = v.Model.Bounds(v.FrameFunc()); - var worldTransform = v.RotationFunc().Reverse().Aggregate(scaleTransform, - (x, y) => OpenRA.Graphics.Util.MatrixMultiply(x, OpenRA.Graphics.Util.MakeFloatMatrix(y.AsMatrix()))); + var rotation = OpenRA.Graphics.Util.MakeFloatMatrix(v.RotationFunc().AsMatrix()); + var worldTransform = OpenRA.Graphics.Util.MatrixMultiply(scaleTransform, rotation); var pxPos = pxOrigin + wr.ScreenVectorComponents(v.OffsetFunc()); var screenTransform = OpenRA.Graphics.Util.MatrixMultiply(cameraTransform, worldTransform); diff --git a/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs b/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs index fc76cb3779..753dce7eb7 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs @@ -57,9 +57,8 @@ namespace OpenRA.Mods.Common.Traits.Render Func quantizedTurret = () => body.QuantizeOrientation(turretOrientation(), facings); Func quantizedBody = () => body.QuantizeOrientation(orientation(), facings); Func barrelOffset = () => body.LocalToWorld((t.Offset + LocalOffset.Rotate(quantizedTurret())).Rotate(quantizedBody())); - - yield return new ModelAnimation(model, barrelOffset, () => new[] { turretOrientation(), orientation() }, - () => false, () => 0, ShowShadow); + Func barrelOrientation = () => turretOrientation().Rotate(orientation()); + yield return new ModelAnimation(model, barrelOffset, barrelOrientation, () => false, () => 0, ShowShadow); } } @@ -97,13 +96,12 @@ namespace OpenRA.Mods.Common.Traits.Render return body.LocalToWorld((turretLocalOffset + localOffset.Rotate(turretOrientation)).Rotate(qb)); } - IEnumerable BarrelRotation() + WRot BarrelRotation() { var b = self.Orientation; var qb = body.QuantizeOrientation(self, b); - yield return Info.LocalOrientation; - yield return turreted.WorldOrientation(self) - b + WRot.FromYaw(b.Yaw - qb.Yaw); - yield return qb; + var t = turreted.WorldOrientation(self) - b + WRot.FromYaw(b.Yaw - qb.Yaw); + return Info.LocalOrientation.Rotate(t).Rotate(qb); } } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs b/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs index 92b449f903..1003c559b7 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs @@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Traits.Render var body = init.Actor.TraitInfo(); var model = init.World.ModelCache.GetModelSequence(image, Sequence); yield return new ModelAnimation(model, () => WVec.Zero, - () => new[] { body.QuantizeOrientation(orientation(), facings) }, + () => body.QuantizeOrientation(orientation(), facings), () => false, () => 0, ShowShadow); } } @@ -52,7 +52,7 @@ namespace OpenRA.Mods.Common.Traits.Render var model = self.World.ModelCache.GetModelSequence(rv.Image, info.Sequence); modelAnimation = new ModelAnimation(model, () => WVec.Zero, - () => new[] { body.QuantizeOrientation(self, self.Orientation) }, + () => body.QuantizeOrientation(self, self.Orientation), () => IsTraitDisabled, () => 0, info.ShowShadow); rv.Add(modelAnimation); diff --git a/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs b/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs index 6e5678d0e5..318b061910 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs @@ -45,9 +45,10 @@ namespace OpenRA.Mods.Common.Traits.Render Func turretOffset = () => body.LocalToWorld(t.Offset.Rotate(orientation())); var turretFacing = Turreted.TurretFacingFromInit(init, t); - Func turretBodyOrientation = () => WRot.FromYaw(turretFacing() - orientation().Yaw); - yield return new ModelAnimation(model, turretOffset, - () => new[] { turretBodyOrientation(), body.QuantizeOrientation(orientation(), facings) }, () => false, () => 0, ShowShadow); + Func turretOrientation = () => WRot.FromYaw(turretFacing() - orientation().Yaw) + .Rotate(body.QuantizeOrientation(orientation(), facings)); + + yield return new ModelAnimation(model, turretOffset, turretOrientation, () => false, () => 0, ShowShadow); } } @@ -71,12 +72,11 @@ namespace OpenRA.Mods.Common.Traits.Render () => IsTraitDisabled, () => 0, info.ShowShadow)); } - IEnumerable TurretRotation() + WRot TurretRotation() { var b = self.Orientation; var qb = body.QuantizeOrientation(self, b); - yield return turreted.WorldOrientation(self) - b + WRot.FromYaw(b.Yaw - qb.Yaw); - yield return qb; + return (turreted.WorldOrientation(self) - b + WRot.FromYaw(b.Yaw - qb.Yaw)).Rotate(qb); } } }