using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using SynapseGaming.LightingSystem.Core; using SynapseGaming.LightingSystem.Rendering.Forward; namespace BasicSunBurn_03 { /// /// Helper class for drawing a tank model with animated wheels and turret. /// public class Tank { // The XNA framework Model object that we are going to display. Model tankModel; // Shortcut references to the bones that we are going to animate. // We could just look these up inside the Draw method, but it is more // efficient to do the lookups while loading and cache the results. ModelBone leftBackWheelBone; ModelBone rightBackWheelBone; ModelBone leftFrontWheelBone; ModelBone rightFrontWheelBone; ModelBone leftSteerBone; ModelBone rightSteerBone; ModelBone turretBone; ModelBone cannonBone; ModelBone hatchBone; // Store the original transform matrix for each animating bone. Matrix leftBackWheelTransform; Matrix rightBackWheelTransform; Matrix leftFrontWheelTransform; Matrix rightFrontWheelTransform; Matrix leftSteerTransform; Matrix rightSteerTransform; Matrix turretTransform; Matrix cannonTransform; Matrix hatchTransform; public float WheelRotation; public float SteerRotation; public float TurretRotation; public float CannonRotation; public float HatchRotation; /// /// Loads the tank model. /// public void Load(ContentManager content) { // Load the tank model from the ContentManager. tankModel = content.Load("tank"); // Look up shortcut references to the bones we are going to animate. leftBackWheelBone = tankModel.Bones["l_back_wheel_geo"]; rightBackWheelBone = tankModel.Bones["r_back_wheel_geo"]; leftFrontWheelBone = tankModel.Bones["l_front_wheel_geo"]; rightFrontWheelBone = tankModel.Bones["r_front_wheel_geo"]; leftSteerBone = tankModel.Bones["l_steer_geo"]; rightSteerBone = tankModel.Bones["r_steer_geo"]; turretBone = tankModel.Bones["turret_geo"]; cannonBone = tankModel.Bones["canon_geo"]; hatchBone = tankModel.Bones["hatch_geo"]; // Store the original transform matrix for each animating bone. leftBackWheelTransform = leftBackWheelBone.Transform; rightBackWheelTransform = rightBackWheelBone.Transform; leftFrontWheelTransform = leftFrontWheelBone.Transform; rightFrontWheelTransform = rightFrontWheelBone.Transform; leftSteerTransform = leftSteerBone.Transform; rightSteerTransform = rightSteerBone.Transform; turretTransform = turretBone.Transform; cannonTransform = cannonBone.Transform; hatchTransform = hatchBone.Transform; } /// /// Draws the tank model, using the current animation settings. /// public void Draw(Matrix world, RenderManager renderManager, ObjectVisibility visibility, ObjectLifeSpan lifeSpan) { // Calculate matrices based on the current animation position. Matrix wheelRotation = Matrix.CreateRotationX(WheelRotation); Matrix steerRotation = Matrix.CreateRotationY(SteerRotation); Matrix turretRotation = Matrix.CreateRotationY(TurretRotation); Matrix cannonRotation = Matrix.CreateRotationX(CannonRotation); Matrix hatchRotation = Matrix.CreateRotationX(HatchRotation); // Apply matrices to the relevant bones. leftBackWheelBone.Transform = wheelRotation * leftBackWheelTransform; rightBackWheelBone.Transform = wheelRotation * rightBackWheelTransform; leftFrontWheelBone.Transform = wheelRotation * leftFrontWheelTransform; rightFrontWheelBone.Transform = wheelRotation * rightFrontWheelTransform; leftSteerBone.Transform = steerRotation * leftSteerTransform; rightSteerBone.Transform = steerRotation * rightSteerTransform; turretBone.Transform = turretRotation * turretTransform; cannonBone.Transform = cannonRotation * cannonTransform; hatchBone.Transform = hatchRotation * hatchTransform; // submit the tank to the render manager renderManager.SubmitRenderableObject(tankModel, world, visibility, lifeSpan); } } }