using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System; using System.Collections.Generic; namespace OpenVIII { public class VertexPositionTexture_Texture2D : IDisposable { #region Fields public TextureHandler Texture; public VertexPositionTexture[] VPT; private AlphaTestEffect ate; /// /// Buffer that holds the VPT after transforming the location. /// private VertexPositionTexture[] TransformedVPT; #endregion Fields #region Constructors public VertexPositionTexture_Texture2D(VertexPositionTexture[] vPT, TextureHandler texture) { VPT = vPT; TransformedVPT = (VertexPositionTexture[])VPT.Clone(); Texture = texture; ate = new AlphaTestEffect(Memory.Graphics.GraphicsDevice) { Texture = (Texture2D)Texture }; } #endregion Constructors #region Destructors ~VertexPositionTexture_Texture2D() { Dispose(); } #endregion Destructors #region Methods public static VertexPositionTexture_Texture2D operator +(VertexPositionTexture_Texture2D left, VertexPositionTexture_Texture2D right) { if (left.Texture == right.Texture) { //could be optimized. var tmp = new List(left.VPT.Length + right.VPT.Length); tmp.AddRange(left.VPT); tmp.AddRange(right.VPT); return new VertexPositionTexture_Texture2D(tmp.ToArray(), left.Texture); } else throw new Exception("Textures must match or else won't work"); } public void Dispose() => ((IDisposable)ate).Dispose(); public void UpdateForBattle(Vector3 pos) => //if used beyond battle might need to update this to use different matrices //Viewport vp = Memory.graphics.GraphicsDevice.Viewport; //var _1 = vp.Unproject(new Vector3(vp.Width / 2f, vp.Height / 2f, 0f), Module_battle_debug.ProjectionMatrix, Module_battle_debug.ViewMatrix, Module_battle_debug.WorldMatrix); //var _2 = vp.Unproject(new Vector3(vp.Width / 2f, vp.Height / 2f, 1f), Module_battle_debug.ProjectionMatrix, Module_battle_debug.ViewMatrix, Module_battle_debug.WorldMatrix); //var centerscreen = Vector3.Normalize(_2 - _1); //Matrix t = Matrix.CreateTranslation(pos); //Matrix lookat = Matrix.CreateLookAt(pos, _1, Vector3.Up); //float yaw = (float)Math.Atan2(lookat.M13, lookat.M33); //float pitch = (float)Math.Asin(-lookat.M23); //float roll = (float)Math.Atan2(lookat.M21, lookat.M22); //Quaternion q = Quaternion.CreateFromYawPitchRoll(yaw, pitch, 0f); //The above code does the same thing as CreateBillboard but if you need more control might be worth having. Update(ModuleBattleDebug.CreateBillboard(pos)); public void Update(Matrix bb) { for (var i = 0; i < VPT.Length; i++) { TransformedVPT[i].Position = Vector3.Transform(VPT[i].Position, bb); //TransformedVPT[i].Position = Vector3.Transform(VPT[i].Position, q); //TransformedVPT[i].Position = Vector3.Transform(TransformedVPT[i].Position, t); } } public void DrawForBattle() { ate.World = ModuleBattleDebug.WorldMatrix; ate.View = ModuleBattleDebug.ViewMatrix; ate.Projection = ModuleBattleDebug.ProjectionMatrix; Draw(); } public void Draw() { Memory.Graphics.GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise; Memory.Graphics.GraphicsDevice.BlendState = BlendState.AlphaBlend; Memory.Graphics.GraphicsDevice.DepthStencilState = DepthStencilState.Default; Memory.Graphics.GraphicsDevice.SamplerStates[0] = SamplerState.PointClamp; ModuleBattleDebug.Effect.TextureEnabled = true; foreach (var pass in ate.CurrentTechnique.Passes) { pass.Apply(); Memory.Graphics.GraphicsDevice.DrawUserPrimitives(primitiveType: PrimitiveType.TriangleList, vertexData: TransformedVPT, vertexOffset: 0, primitiveCount: VPT.Length / 3); } } #endregion Methods } }