diff --git a/Assets/Scripts/DrawSpriteCall.cs b/Assets/Scripts/DrawSpriteCall.cs index 8620951..238266b 100644 --- a/Assets/Scripts/DrawSpriteCall.cs +++ b/Assets/Scripts/DrawSpriteCall.cs @@ -13,6 +13,7 @@ class DrawSpriteCall private Vector4 color; private Vector2 origin; private SpriteEffects spriteEffects; + private Viewport viewport; public Texture2D Texture2D { get { @@ -49,8 +50,16 @@ class DrawSpriteCall return this.spriteEffects; } } - - public DrawSpriteCall(Texture2D texture2D, Vector2 position, Nullable source, Vector4 color, Vector2 origin, SpriteEffects spriteEffects) + + public Viewport Viewport + { + get + { + return this.viewport; + } + } + + public DrawSpriteCall(Texture2D texture2D, Vector2 position, Nullable source, Vector4 color, Vector2 origin, SpriteEffects spriteEffects, Viewport viewport) { // TODO: Complete member initialization this.texture2D = texture2D; @@ -59,6 +68,7 @@ class DrawSpriteCall this.color = color; this.origin = origin; this.spriteEffects = spriteEffects; - } + this.viewport = viewport; + } } diff --git a/Assets/Scripts/DrawStringCall.cs b/Assets/Scripts/DrawStringCall.cs index 53a8eae..dcb012b 100644 --- a/Assets/Scripts/DrawStringCall.cs +++ b/Assets/Scripts/DrawStringCall.cs @@ -10,9 +10,10 @@ class DrawStringCall private SpriteFont font; private string value; private Vector2 position; - private Vector4 color ; + private Vector4 color; + private Viewport viewport; - public SpriteFont Font { + public SpriteFont Font { get { return this.font; } @@ -35,12 +36,22 @@ class DrawStringCall return this.color; } } - public DrawStringCall(SpriteFont font, string value, Vector2 position, Vector4 color) + + public Viewport Viewport + { + get + { + return this.viewport; + } + } + + public DrawStringCall(SpriteFont font, string value, Vector2 position, Vector4 color, Viewport viewport) { this.font = font; this.value = value; this.position = position; this.color = color; + this.viewport = viewport; } } \ No newline at end of file diff --git a/Assets/Scripts/XNAEmulator/Game/Game.cs b/Assets/Scripts/XNAEmulator/Game/Game.cs index f2c1382..faafcc7 100644 --- a/Assets/Scripts/XNAEmulator/Game/Game.cs +++ b/Assets/Scripts/XNAEmulator/Game/Game.cs @@ -44,10 +44,18 @@ namespace Microsoft.Xna.Framework { content = new ContentManager(null, ""); - _components = new GameComponentCollection(); + _components = new GameComponentCollection(); + } + + protected virtual void Initialize() + { } protected virtual void Update(GameTime gameTime) + { + } + + protected virtual void UnloadContent() { } @@ -96,14 +104,14 @@ namespace Microsoft.Xna.Framework } public void Dispose() { + UnloadContent(); Dispose(true); GC.SuppressFinalize(this); } - - internal void Begin() { + Initialize(); LoadContent(); // XNA's first update call has a zero elapsed time, so do one now. GameTime gameTime = new GameTime(new TimeSpan(0), new TimeSpan(0), new TimeSpan(0, 0, 0, 0, 0), new TimeSpan(0, 0, 0, 0, 0)); @@ -118,8 +126,6 @@ namespace Microsoft.Xna.Framework GameTime gameTime = new GameTime(new TimeSpan(0), new TimeSpan(0), new TimeSpan(totalTicks), new TimeSpan(ticks)); Update(gameTime); Draw(gameTime); - } - - + } } } diff --git a/Assets/Scripts/XNAEmulator/Game/GraphicsDeviceManager.cs b/Assets/Scripts/XNAEmulator/Game/GraphicsDeviceManager.cs index 9b38a5d..5710ebe 100644 --- a/Assets/Scripts/XNAEmulator/Game/GraphicsDeviceManager.cs +++ b/Assets/Scripts/XNAEmulator/Game/GraphicsDeviceManager.cs @@ -10,6 +10,9 @@ namespace Microsoft.Xna.Framework { private Game game; + private int _preferredBackBufferHeight; + private int _preferredBackBufferWidth; + public GraphicsDevice GraphicsDevice { get @@ -23,5 +26,31 @@ namespace Microsoft.Xna.Framework // TODO: Complete member initialization this.game = game; } + + public int PreferredBackBufferWidth + { + get + { + return _preferredBackBufferWidth; + } + set + { + //_shouldApplyChanges = true; + _preferredBackBufferWidth = value; + } + } + + public int PreferredBackBufferHeight + { + get + { + return _preferredBackBufferHeight; + } + set + { + //_shouldApplyChanges = true; + _preferredBackBufferHeight = value; + } + } } } diff --git a/Assets/Scripts/XNAEmulator/Game/UnityGameWindow.cs b/Assets/Scripts/XNAEmulator/Game/UnityGameWindow.cs index dd056e4..552123e 100644 --- a/Assets/Scripts/XNAEmulator/Game/UnityGameWindow.cs +++ b/Assets/Scripts/XNAEmulator/Game/UnityGameWindow.cs @@ -27,11 +27,11 @@ namespace Microsoft.Xna.Framework { if (!Application.isEditor) { - return new Rectangle(Screen.mainWindowPosition.x, Screen.mainWindowPosition.y, Screen.height, Screen.width); + return new Rectangle(Screen.mainWindowPosition.x, Screen.mainWindowPosition.y, Screen.width, Screen.height); } else { - return new Rectangle(0, 0, Screen.height, Screen.width); + return new Rectangle(0, 0, Screen.width, Screen.height); } } } diff --git a/Assets/Scripts/XNAEmulator/Graphics/SpriteBatch.cs b/Assets/Scripts/XNAEmulator/Graphics/SpriteBatch.cs index 879c2c6..7a196d1 100644 --- a/Assets/Scripts/XNAEmulator/Graphics/SpriteBatch.cs +++ b/Assets/Scripts/XNAEmulator/Graphics/SpriteBatch.cs @@ -71,19 +71,19 @@ namespace Microsoft.Xna.Framework.Graphics internal void Draw(Texture2D texture2D, Vector2 position, Nullable source, Color color, float p, Vector2 Origin, float p_2, SpriteEffects spriteEffects, float p_3) { - graphicsDevice.DrawQueue.EnqueueSprite(new DrawSpriteCall(texture2D, position, source, color.ToVector4(), Origin, spriteEffects)); + graphicsDevice.DrawQueue.EnqueueSprite(new DrawSpriteCall(texture2D, position, source, color.ToVector4(), Origin, spriteEffects, graphicsDevice.Viewport)); } //TODO: Draw stretching internal void Draw(Texture2D texture2D, Nullable source, Color color) { - graphicsDevice.DrawQueue.EnqueueSprite(new DrawSpriteCall(texture2D, Vector2.Zero, source, color.ToVector4(), Vector2.Zero, SpriteEffects.None)); + graphicsDevice.DrawQueue.EnqueueSprite(new DrawSpriteCall(texture2D, Vector2.Zero, source, color.ToVector4(), Vector2.Zero, SpriteEffects.None, graphicsDevice.Viewport)); } //Draw texture section internal void Draw(Texture2D texture2D, Vector2 position, Nullable source, Color color) { - graphicsDevice.DrawQueue.EnqueueSprite(new DrawSpriteCall(texture2D, position, source, color.ToVector4(), Vector2.Zero, SpriteEffects.None)); + graphicsDevice.DrawQueue.EnqueueSprite(new DrawSpriteCall(texture2D, position, source, color.ToVector4(), Vector2.Zero, SpriteEffects.None, graphicsDevice.Viewport)); } //TODO: @@ -115,23 +115,23 @@ namespace Microsoft.Xna.Framework.Graphics texCoordTL.X = temp; } */ - graphicsDevice.DrawQueue.EnqueueSprite(new DrawSpriteCall(texture, Vector2.Zero, source, color.ToVector4(), Vector2.Zero, SpriteEffects.None)); + graphicsDevice.DrawQueue.EnqueueSprite(new DrawSpriteCall(texture, Vector2.Zero, source, color.ToVector4(), Vector2.Zero, SpriteEffects.None, graphicsDevice.Viewport)); } //TODO: internal void Draw (Texture2D texture, Nullable source, Rectangle? sourceRectangle, Color color) { - graphicsDevice.DrawQueue.EnqueueSprite(new DrawSpriteCall(texture, Vector2.Zero, source, color.ToVector4(), Vector2.Zero, SpriteEffects.None)); + graphicsDevice.DrawQueue.EnqueueSprite(new DrawSpriteCall(texture, Vector2.Zero, source, color.ToVector4(), Vector2.Zero, SpriteEffects.None, graphicsDevice.Viewport)); } internal void Draw(Texture2D texture2D, Vector2 position, Color color) { - graphicsDevice.DrawQueue.EnqueueSprite(new DrawSpriteCall(texture2D, position, null, color.ToVector4(), Vector2.Zero, SpriteEffects.None)); + graphicsDevice.DrawQueue.EnqueueSprite(new DrawSpriteCall(texture2D, position, null, color.ToVector4(), Vector2.Zero, SpriteEffects.None, graphicsDevice.Viewport)); } internal void DrawString(SpriteFont font, string value, Vector2 position, Color color) { - graphicsDevice.DrawQueue.EnqueueString(new DrawStringCall(font, value, position, color.ToVector4())); + graphicsDevice.DrawQueue.EnqueueString(new DrawStringCall(font, value, position, color.ToVector4(), graphicsDevice.Viewport)); } } } diff --git a/Assets/Scripts/XNAEmulator/Graphics/Texture2D.cs b/Assets/Scripts/XNAEmulator/Graphics/Texture2D.cs index cdce3e1..00ad1dd 100644 --- a/Assets/Scripts/XNAEmulator/Graphics/Texture2D.cs +++ b/Assets/Scripts/XNAEmulator/Graphics/Texture2D.cs @@ -35,6 +35,14 @@ namespace Microsoft.Xna.Framework.Graphics get { return unityTexture.height; } } + public Rectangle Bounds + { + get + { + return new Rectangle(0, 0, unityTexture.width, unityTexture.height); + } + } + public void Dispose() { } } diff --git a/Assets/Scripts/XNAEmulator/Graphics/Viewport.cs b/Assets/Scripts/XNAEmulator/Graphics/Viewport.cs index c5378d4..e9d6993 100644 --- a/Assets/Scripts/XNAEmulator/Graphics/Viewport.cs +++ b/Assets/Scripts/XNAEmulator/Graphics/Viewport.cs @@ -33,6 +33,7 @@ SOFTWARE. using Microsoft.Xna.Framework; using System; using System.Globalization; +using UnityEngine; namespace Microsoft.Xna.Framework.Graphics { @@ -106,8 +107,7 @@ namespace Microsoft.Xna.Framework.Graphics int x, int y, int width, - int height - ) + int height) { this.x = x; this.y = y; @@ -117,7 +117,14 @@ namespace Microsoft.Xna.Framework.Graphics minDepth = 0; maxDepth = 0; titleSafeArea = new Rectangle(x, y, width, height); - } + + /*GameObject _camGo = new GameObject("Camera"); + _camGo.transform.position = new UnityEngine.Vector3((float)x, (float)y, 0.0f); + var _camera = _camGo.AddComponent(); + _camera.rect = new Rect(x, y, width, height);*/ + + //Camera.main.rect = new Rect(x, y, width, height); + } #region Public Methods public Vector3 Project(Vector3 source, Matrix projection, Matrix view, Matrix world) diff --git a/Assets/Scripts/XNATest.cs b/Assets/Scripts/XNATest.cs index 504e3c4..dd9d79f 100644 --- a/Assets/Scripts/XNATest.cs +++ b/Assets/Scripts/XNATest.cs @@ -95,7 +95,9 @@ public class XNATest : MonoBehaviour { sourceRect.height *= -1; } - GUI.DrawTextureWithTexCoords(new Rect(x, y, width * Mathf.Abs(sourceRect.width), height * Mathf.Abs(sourceRect.height)), call.Texture2D.UnityTexture, sourceRect); + var viewport = call.Viewport; + //Debug.Log("Viewport: " + viewport); + GUI.DrawTextureWithTexCoords(new Rect(x + viewport.X, y + viewport.Y, width * Mathf.Abs(sourceRect.width), height * Mathf.Abs(sourceRect.height)), call.Texture2D.UnityTexture, sourceRect); } // Draw strings from SpriteBatch.DrawString() @@ -106,9 +108,7 @@ public class XNATest : MonoBehaviour { GUI.color = new Color(call.Color.X, call.Color.Y, call.Color.Z, call.Color.W); Vector2 size = GUI.skin.label.CalcSize(new GUIContent(call.Value)); - string[] x = call.Font.PathTo.Split('/'); - string path = $"{call.Font.PathTo.Remove(call.Font.PathTo.Length - 1 - x[x.Length-1].Length)}/{call.Font.FontName.ToString()}"; - Font myFont = (Font)UnityEngine.Resources.Load($"{path}", typeof(Font)); + Font myFont = (Font)UnityEngine.Resources.Load($"Content/{call.Font.FontName.ToString()}", typeof(Font)); //GUI.skin.font = myFont; GUIStyle myStyle = new GUIStyle(); @@ -116,7 +116,8 @@ public class XNATest : MonoBehaviour { myStyle.fontSize = (int)call.Font.Size; myStyle.normal.textColor = new Color(call.Color.X, call.Color.Y, call.Color.Z, call.Color.W); - GUI.Label(new Rect(call.Position.X, call.Position.Y, size.x, size.y), call.Value, myStyle); + var viewport = call.Viewport; + GUI.Label(new Rect(call.Position.X + viewport.X, call.Position.Y + viewport.Y, size.x, size.y), call.Value, myStyle); } //GUIStyle style = new GUIStyle();