using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System.Collections.Generic; using System.Linq; namespace OpenVIII.Fields { /// /// this works only as a preview for field models and proof-of-concept /// public class ModuleFieldObjectTest { #region Fields public static AlphaTestEffect Ate; public static BasicEffect Effect; //private static float _camDistance = 10.0f; private const float RenderCamDistance = 1200f; private static int _animFrame; private static int _animId; private static bool _bInitialized; private static Vector3 _camPosition, _camTarget; private static FieldCharaOne _charaOne; private static int _debugModelId; private static float _degrees; private static FPS_Camera _fpsCamera; private static int _lastFieldId = -1; private static Matrix _projectionMatrix, _viewMatrix, _worldMatrix; private static double _timer; #endregion Fields #region Methods public static void Draw() { Memory.Graphics.GraphicsDevice.RasterizerState = RasterizerState.CullNone; //Memory.graphics.GraphicsDevice.BlendState = BlendState.NonPremultiplied; Memory.Graphics.GraphicsDevice.BlendState = BlendState.AlphaBlend; Memory.Graphics.GraphicsDevice.DepthStencilState = DepthStencilState.Default; Memory.Graphics.GraphicsDevice.SamplerStates[0] = SamplerState.PointClamp; Memory.Graphics.GraphicsDevice.Clear(Color.Aqua); if (!_bInitialized) return; uint maxAnim = 0; uint maxFrame = 0; Ate.Projection = _projectionMatrix; Ate.View = _viewMatrix; Ate.World = _worldMatrix; Effect.Projection = _projectionMatrix; Effect.View = _viewMatrix; Effect.World = _worldMatrix; if (_charaOne.FieldModels == null) goto _doNotDraw; if (_debugModelId >= _charaOne.FieldModels.Length) _debugModelId = 0; var whichModel = _debugModelId; if (_charaOne.FieldModels[whichModel].MCH == null) goto _doNotDraw; _charaOne.FieldModels[whichModel].MCH.AssignTextureSizes( _charaOne.FieldModels[whichModel].Textures, Enumerable.Range(0, _charaOne.FieldModels[whichModel].Textures.Length).ToArray()); maxAnim = _charaOne.FieldModels[whichModel].MCH.GetAnimationCount(); if (_animId >= maxAnim) _animId = 0; maxFrame = _charaOne.FieldModels[whichModel].MCH.GetAnimationFramesCount(_animId); if (_animFrame >= maxFrame) _animFrame = 0; var charaCollection = _charaOne.FieldModels[whichModel].MCH.GetVertexPositions(Vector3.Zero, Quaternion.Identity, _animId, _animFrame); var vptCollection = new Dictionary>(); for (var i = 0; i < charaCollection.Item2.Length; i += 3) { var charaTexture = _charaOne.FieldModels[whichModel].Textures[charaCollection.Item2[i]]; if (!vptCollection.ContainsKey(charaTexture)) vptCollection.Add(charaTexture, new List()); vptCollection[charaTexture].AddRange(charaCollection.Item1.Skip(i).Take(3).ToArray()); } foreach (var kvp in vptCollection) { Ate.Texture = kvp.Key; foreach (var pass in Ate.CurrentTechnique.Passes) { pass.Apply(); Memory.Graphics.GraphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, kvp.Value.ToArray(), 0, kvp.Value.Count / 3); } } _doNotDraw: Memory.SpriteBatchStartAlpha(); if (_charaOne.FieldModels == null) { Memory.Font.RenderBasicText( $"FIELD AT: {Memory.FieldHolder.FieldID} - {Memory.FieldHolder.GetString()}\n" + $"World Map Camera: ={_camPosition}\n" + $"FPS camera degrees: ={_degrees}°\n" + "Current model is: =BROKEN\n" + $"Animation={_animId + 1} of {maxAnim} -- frame: {_animFrame + 1} of {maxFrame}\n" + "F1 - re-init (for reparsing and live code debugging)\n" + "F2 - Next field\n" + "F3 - Previous field\n" + "F4 - Next animation\n" + "LMB - Next NPC model\n" + "NULL: =0", 30, 20, 1f, 2f, lineSpacing: 5); } else Memory.Font.RenderBasicText( $"FIELD AT: {Memory.FieldHolder.FieldID} - {Memory.FieldHolder.GetString()}\n" + $"World Map Camera: ={_camPosition}\n" + $"FPS camera degrees: ={_degrees}°\n" + $"Current model is: ={_debugModelId + 1} of {_charaOne.FieldModels.Length} which is {new string(_charaOne.FieldModels[_debugModelId].ModelName, 0, 4)}\n" + $"Animation={_animId + 1} of {maxAnim} -- frame: {_animFrame + 1} of {maxFrame}\n" + "F1 - re-init (for reparsing and live code debugging)\n" + "F2 - Next field\n" + "F3 - Previous field\n" + "F4 - Next animation\n" + "LMB - Next NPC model\n" + "NULL: =0", 30, 20, 1f, 2f, lineSpacing: 5); Memory.SpriteBatchEnd(); } public static void Update() { if (!_bInitialized) { _fpsCamera = new FPS_Camera(); //init renderer Effect = new BasicEffect(Memory.Graphics.GraphicsDevice); Effect.EnableDefaultLighting(); Effect.TextureEnabled = true; Effect.DirectionalLight0.Enabled = true; Effect.DirectionalLight1.Enabled = false; Effect.DirectionalLight2.Enabled = false; Effect.DirectionalLight0.Direction = new Vector3( -0.349999f, 0.499999f, -0.650000f ); Effect.DirectionalLight0.SpecularColor = new Vector3(0.8500003f, 0.8500003f, 0.8500003f); Effect.DirectionalLight0.DiffuseColor = new Vector3(1.54999f, 1.54999f, 1.54999f); _camTarget = new Vector3(0, 0f, 0f); _camPosition = new Vector3(0, 0f, 0f); _projectionMatrix = Matrix.CreatePerspectiveFieldOfView( MathHelper.ToRadians(60), Memory.Graphics.GraphicsDevice.Viewport.AspectRatio, 1f, 10000f); _viewMatrix = Matrix.CreateLookAt(_camPosition, _camTarget, new Vector3(0f, 1f, 0f));// Y up //worldMatrix = Matrix.CreateWorld(camTarget, Vector3. // Forward, Vector3.Up); _worldMatrix = Matrix.CreateTranslation(0, 0, 0); //temporarily disabling this, because I'm getting more and more tired of this music playing over and over when debugging //Memory.musicIndex = 30; //AV.Music.Play(); Ate = new AlphaTestEffect(Memory.Graphics.GraphicsDevice) { Projection = _projectionMatrix, View = _viewMatrix, World = _worldMatrix, FogEnabled = false, FogColor = Color.CornflowerBlue.ToVector3(), FogStart = 9.75f, FogEnd = RenderCamDistance }; _bInitialized = true; } if (_lastFieldId != Memory.FieldHolder.FieldID) ReInit(); _viewMatrix = _fpsCamera.Update(ref _camPosition, ref _camTarget, ref _degrees); if (Input2.Button(MouseButtons.LeftButton, ButtonTrigger.OnRelease)) _debugModelId++; if (Input2.Button(Microsoft.Xna.Framework.Input.Keys.F1, ButtonTrigger.OnRelease)) ReInit(); if (Input2.Button(Microsoft.Xna.Framework.Input.Keys.F2)) Memory.FieldHolder.FieldID++; if (Input2.Button(Microsoft.Xna.Framework.Input.Keys.F3)) Memory.FieldHolder.FieldID--; if (Input2.Button(Microsoft.Xna.Framework.Input.Keys.F4)) { _animId++; _animFrame = 0; } _timer += Memory.ElapsedGameTime.TotalMilliseconds / 1000.0d; if (_timer > 0.033d) { _animFrame++; _timer = 0f; } } private static void ReInit() { _lastFieldId = Memory.FieldHolder.FieldID; _charaOne = new FieldCharaOne(Memory.FieldHolder.FieldID); } #endregion Methods } }