using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OpenVIII.Fields
{
///
/// this works only as a preview for field models and proof-of-concept
///
public class Module_field_object_test
{
private static int lastFieldId = -1;
static int debugModelId = 0;
static int animId = 0;
static int animFrame = 0;
static float timer = 0.0f;
static FieldCharaOne charaOne;
private static FPS_Camera fps_camera;
private static Matrix projectionMatrix, viewMatrix, worldMatrix;
private static float degrees;
private static float camDistance = 10.0f;
private static float renderCamDistance = 1200f;
private static Vector3 camPosition, camTarget;
public static BasicEffect effect;
public static AlphaTestEffect ate;
static bool bInitialized = false;
public static void Update()
{
if(!bInitialized)
{
fps_camera = 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;
//init_debugger_Audio.PlayMusic();
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 = fps_camera.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, ButtonTrigger.OnPress))
Memory.FieldHolder.FieldID++;
if (Input2.Button(Microsoft.Xna.Framework.Input.Keys.F3, ButtonTrigger.OnPress))
Memory.FieldHolder.FieldID--;
if (Input2.Button(Microsoft.Xna.Framework.Input.Keys.F4, ButtonTrigger.OnPress))
{
animId++;
animFrame = 0;
}
timer += (float)Memory.gameTime.ElapsedGameTime.TotalMilliseconds / 1000.0f;
if (timer > 0.033f)
{
animFrame++;
timer = 0f;
}
}
private static void ReInit()
{
lastFieldId = Memory.FieldHolder.FieldID;
charaOne = new FieldCharaOne(Memory.FieldHolder.FieldID);
}
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(Microsoft.Xna.Framework.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;
int 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;
Tuple charaCollection =
charaOne.fieldModels[whichModel].mch.GetVertexPositions(Vector3.Zero,Quaternion.Identity, animId, animFrame);
Dictionary> vptCollection = new Dictionary>();
for (int i = 0; i < charaCollection.Item2.Length; i += 3)
{
Texture2D 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 (KeyValuePair> kvp in vptCollection)
{
ate.Texture = kvp.Key;
foreach (EffectPass 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 - reinit (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 - reinit (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();
}
}
}