//--------------------------------------------------------------------------------------------------------------------------------------------------- // // Copyright (C)2007 DarkWynter Studios. All rights reserved. // //--------------------------------------------------------------------------------------------------------------------------------------------------- // {License Information: Creative Commons} //--------------------------------------------------------------------------------------------------------------------------------------------------- namespace ElementalGame { #region Using Statements using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Storage; using System.Xml; #endregion public class Prop : GameObject { public Prop(Mass darkMass) { mass = darkMass; mass.COR = 0.99999f; } /* GameObject Interface Methods * */ public override void Load(XmlNode node) { base.Load(node); if (objectModelName == "object") { mass.mass = 10; _boundingSphere.Radius = 10.0f * mass.scale; } if (objectModelName.Contains("tree")) { _boundingSphere.Radius = mass.scale; } if (objectModelName.Contains("rock")) { _boundingSphere.Radius = mass.scale / 10.0f; } _boundingSphere.Center = mass.currentPosition + new Vector3(0.0f, mass.scale / 2.0f, 0.0f); mass.dynamicFrictionCoefficient = 0.0f; mass.isMoving = true; mass.objectType = Mass.ObjectType.PROP; mass.objectHeight = 5; // Load Effect effect = ElementalGame.content.Load("Shaders/ElementalGPU"); } public override void Update(ObjectLibrary objectLibrary) { mass.UpdatePosition(); _boundingSphere.Center = mass.currentPosition; objectValues = new VertexFogBinormalTangentWeightTess(); matrix = Matrix.CreateScale(mass.scale) * Matrix.CreateFromQuaternion(mass.currentRotation) * Matrix.CreateTranslation(mass.currentPosition); objectValues.Fog = new Vector4(matrix.M11, matrix.M12, matrix.M13, matrix.M14); // Store the first row objectValues.Binormal = new Vector4(matrix.M21, matrix.M22, matrix.M23, matrix.M24); // Store the second row objectValues.Tangent = new Vector4(matrix.M31, matrix.M32, matrix.M33, matrix.M34); // Store the third row objectValues.BlendWeight = new Vector4(matrix.M41, matrix.M42, matrix.M43, matrix.M44); // Store the fourth row } public override void DrawShadow(ModelManager modelManager) { ModelInfo modelInfo = new ModelInfo(); // Calculate ObjectSpace(Rotation) and WorldSpace(Translation) Transformation Matrix matrix = Matrix.CreateScale(mass.scale) * Matrix.CreateFromQuaternion(mass.currentRotation) * Matrix.CreateTranslation(mass.currentPosition); modelInfo = modelManager.GetModelInfo(objectModelName); // Matrices ShaderParameters.World.SetValue(matrix); // Draw the model foreach (ModelMesh mesh in modelInfo.model.Meshes) { foreach (Effect currentEffect in mesh.Effects) { currentEffect.CurrentTechnique = currentEffect.Techniques["ShadowMap"]; } mesh.Draw(); } } public override void Draw(ModelManager modelManager) { ModelInfo modelInfo = new ModelInfo(); // Calculate ObjectSpace(Rotation) and WorldSpace(Translation) Transformation Matrix matrix = Matrix.CreateScale(mass.scale) * Matrix.CreateFromQuaternion(mass.currentRotation) * Matrix.CreateTranslation(mass.currentPosition); // Matricies ShaderParameters.World.SetValue(matrix); modelInfo = modelManager.GetModelInfo(objectModelName); // Lighting ShaderParameters.coreShininess.SetValue(7000.0f); ShaderParameters.coreMaterialDiffuse.SetValue(modelInfo.materialDiffuse); ShaderParameters.coreMaterialSpecular.SetValue(modelInfo.materialSpecular); // Load resources for that catagory ShaderParameters.modelTexture1.SetValue(modelInfo.currentTexture); ShaderParameters.bumpTexture1.SetValue(modelInfo.bumpTexture); foreach (ModelMesh mesh in modelInfo.model.Meshes) { ElementalGame.graphics.GraphicsDevice.Indices = mesh.IndexBuffer; foreach (ModelMeshPart part in mesh.MeshParts) { ElementalGame.graphics.GraphicsDevice.VertexDeclaration = part.VertexDeclaration; ElementalGame.graphics.GraphicsDevice.Vertices[0].SetSource(mesh.VertexBuffer, part.StreamOffset, part.VertexStride); part.Effect.CurrentTechnique = part.Effect.Techniques["BasicLightingShaderMain"]; part.Effect.Begin(); for (int k = 0; k < part.Effect.CurrentTechnique.Passes.Count; k++) { EffectPass pass = part.Effect.CurrentTechnique.Passes[k]; pass.Begin(); ElementalGame.graphics.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, part.BaseVertex, 0, part.NumVertices, part.StartIndex, part.PrimitiveCount); pass.End(); } part.Effect.End(); } } } } }