1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-09-27 21:56:19 -04:00

Cleaned up rendering logic to reduce verbose code

This commit is contained in:
Tim Sarbin 2018-11-22 14:30:37 -05:00
parent 68d942ab4a
commit 78190b12d6
9 changed files with 117 additions and 52 deletions

View File

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OpenDiablo2.Common.Interfaces
{
public interface IFont
{
}
}

View File

@ -1,6 +1,7 @@
using OpenDiablo2.Common.Models; using OpenDiablo2.Common.Models;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@ -14,8 +15,10 @@ namespace OpenDiablo2.Common.Interfaces
void Update(); void Update();
void Clear(); void Clear();
void Sync(); void Sync();
ISprite LoadSprite(ImageSet source); ISprite LoadSprite(string resourcePath, string palette, Point location);
ISprite LoadSprite(string resourcePath, string palette);
void Draw(ISprite sprite); void Draw(ISprite sprite);
void Draw(ISprite sprite, int frame);
void Draw(ISprite sprite, int xSegments, int ySegments, int offset); void Draw(ISprite sprite, int xSegments, int ySegments, int offset);
} }
} }

View File

@ -11,6 +11,6 @@ namespace OpenDiablo2.Common.Interfaces
{ {
string Text { get; set; } string Text { get; set; }
Point Position { get; set; } Point Position { get; set; }
ISprite Font { get; set; } IFont Font { get; set; }
} }
} }

View File

@ -68,6 +68,7 @@
<ItemGroup> <ItemGroup>
<Compile Include="Attributes\SceneAttribute.cs" /> <Compile Include="Attributes\SceneAttribute.cs" />
<Compile Include="Enums\eMPQFormatVersion.cs" /> <Compile Include="Enums\eMPQFormatVersion.cs" />
<Compile Include="Interfaces\IFont.cs" />
<Compile Include="Interfaces\IGameEngine.cs" /> <Compile Include="Interfaces\IGameEngine.cs" />
<Compile Include="Interfaces\IMPQProvider.cs" /> <Compile Include="Interfaces\IMPQProvider.cs" />
<Compile Include="Interfaces\IMusicProvider.cs" /> <Compile Include="Interfaces\IMusicProvider.cs" />
@ -88,7 +89,9 @@
<Compile Include="Models\Palette.cs" /> <Compile Include="Models\Palette.cs" />
<Compile Include="Models\PKLibDecompress.cs" /> <Compile Include="Models\PKLibDecompress.cs" />
<Compile Include="Models\SoundEntry.cs" /> <Compile Include="Models\SoundEntry.cs" />
<Compile Include="Palettes.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ResourcePaths.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="packages.config" /> <None Include="packages.config" />

View File

@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OpenDiablo2.Common
{
public static class Palettes
{
public static string Act1 => "ACT1";
public static string Act2 => "ACT2";
public static string Act3 => "ACT3";
public static string Act4 => "ACT4";
public static string Act5 => "ACT5";
public static string EndGame => "EndGame";
public static string EndGame2 => "EndGame2";
public static string Fechar => "fechar";
public static string Loading => "loading";
public static string Menu0 => "Menu0";
public static string Menu1 => "menu1";
public static string Menu2 => "menu2";
public static string Menu3 => "menu3";
public static string Menu4 => "menu4";
public static string Sky => "Sky";
public static string Static => "STATIC";
public static string Trademark => "Trademark";
public static string Units => "Units";
}
}

View File

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OpenDiablo2.Common
{
public static class ResourcePaths
{
// --- Loading Screen ---
public static string LoadingScreen = "data\\global\\ui\\Loading\\loadingscreen.dc6";
// --- Main Menu ---
public static string GameSelectScreen = "data\\global\\ui\\FrontEnd\\gameselectscreenEXP.dc6";
public static string Diablo2LogoFireLeft = "data\\global\\ui\\FrontEnd\\D2logoFireLeft.DC6";
public static string Diablo2LogoFireRight = "data\\global\\ui\\FrontEnd\\D2logoFireRight.DC6";
public static string Diablo2LogoBlackLeft = "data\\global\\ui\\FrontEnd\\D2logoBlackLeft.DC6";
public static string Diablo2LogoBlackRight = "data\\global\\ui\\FrontEnd\\D2logoBlackRight.DC6";
// --- Mouse Pointers ---
public static string CursorDefault = "data\\global\\ui\\CURSOR\\ohand.DC6";
}
}

View File

@ -16,7 +16,7 @@ namespace OpenDiablo2.Core
static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private readonly IMPQProvider mpqProvider; private readonly IMPQProvider mpqProvider;
private readonly IRenderWindow renderWindow; private readonly Func<IRenderWindow> getRenderWindow;
private readonly Func<string, IScene> getScene; private readonly Func<string, IScene> getScene;
private IScene currentScene; private IScene currentScene;
@ -27,10 +27,10 @@ namespace OpenDiablo2.Core
private Stopwatch sw = new Stopwatch(); private Stopwatch sw = new Stopwatch();
public GameEngine(IMPQProvider mpqProvider, IRenderWindow renderWindow, Func<string, IScene> getScene) public GameEngine(IMPQProvider mpqProvider, Func<IRenderWindow> getRenderWindow, Func<string, IScene> getScene)
{ {
this.mpqProvider = mpqProvider; this.mpqProvider = mpqProvider;
this.renderWindow = renderWindow; this.getRenderWindow = getRenderWindow;
this.getScene = getScene; this.getScene = getScene;
MPQs = mpqProvider.GetMPQs().ToArray(); MPQs = mpqProvider.GetMPQs().ToArray();
@ -68,7 +68,7 @@ namespace OpenDiablo2.Core
currentScene = getScene("Main Menu"); currentScene = getScene("Main Menu");
sw.Start(); sw.Start();
while (renderWindow.IsRunning) while (getRenderWindow().IsRunning)
{ {
while (sw.ElapsedMilliseconds < 16) while (sw.ElapsedMilliseconds < 16)
Thread.Sleep(1); // Oh yes we did Thread.Sleep(1); // Oh yes we did
@ -82,7 +82,7 @@ namespace OpenDiablo2.Core
continue; continue;
} }
sw.Restart(); sw.Restart();
renderWindow.Update(); getRenderWindow().Update();
currentScene.Update(ms); currentScene.Update(ms);
currentScene.Render(); currentScene.Render();

View File

@ -15,6 +15,7 @@ namespace OpenDiablo2.SDL2_
public sealed class SDL2RenderWindow : IRenderWindow, IRenderTarget, IMouseInfoProvider public sealed class SDL2RenderWindow : IRenderWindow, IRenderTarget, IMouseInfoProvider
{ {
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private IntPtr window, renderer; private IntPtr window, renderer;
private bool running; private bool running;
public bool IsRunning => running; public bool IsRunning => running;
@ -24,11 +25,16 @@ namespace OpenDiablo2.SDL2_
public bool LeftMouseDown { get; internal set; } = false; public bool LeftMouseDown { get; internal set; } = false;
public bool RightMouseDown { get; internal set; } = false; public bool RightMouseDown { get; internal set; } = false;
private readonly ILifetimeScope lifetimeScope; private readonly IMPQProvider mpqProvider;
private readonly IPaletteProvider paletteProvider;
public SDL2RenderWindow(ILifetimeScope lifetimeScope) public SDL2RenderWindow(
IMPQProvider mpqProvider,
IPaletteProvider paletteProvider
)
{ {
this.lifetimeScope = lifetimeScope; this.mpqProvider = mpqProvider;
this.paletteProvider = paletteProvider;
SDL.SDL_Init(SDL.SDL_INIT_EVERYTHING); SDL.SDL_Init(SDL.SDL_INIT_EVERYTHING);
if (SDL.SDL_SetHint(SDL.SDL_HINT_RENDER_SCALE_QUALITY, "0") == SDL.SDL_bool.SDL_FALSE) if (SDL.SDL_SetHint(SDL.SDL_HINT_RENDER_SCALE_QUALITY, "0") == SDL.SDL_bool.SDL_FALSE)
@ -87,6 +93,12 @@ namespace OpenDiablo2.SDL2_
} }
public void Draw(ISprite sprite, int frame)
{
sprite.Frame = frame;
Draw(sprite);
}
public void Draw(ISprite sprite) public void Draw(ISprite sprite)
{ {
var spr = sprite as SDL2Sprite; var spr = sprite as SDL2Sprite;
@ -128,7 +140,13 @@ namespace OpenDiablo2.SDL2_
} }
} }
public ISprite LoadSprite(ImageSet source) public ISprite LoadSprite(string resourcePath, string palette) => LoadSprite(resourcePath, palette, Point.Empty);
=> new SDL2Sprite(source, renderer); public ISprite LoadSprite(string resourcePath, string palette, Point location)
{
var result = new SDL2Sprite(ImageSet.LoadFromStream(mpqProvider.GetStream(resourcePath)), renderer);
result.CurrentPalette = paletteProvider.PaletteTable[palette];
result.Location = location;
return result;
}
} }
} }

View File

@ -1,4 +1,5 @@
using OpenDiablo2.Common.Attributes; using OpenDiablo2.Common;
using OpenDiablo2.Common.Attributes;
using OpenDiablo2.Common.Interfaces; using OpenDiablo2.Common.Interfaces;
using OpenDiablo2.Common.Models; using OpenDiablo2.Common.Models;
using System; using System;
@ -38,40 +39,18 @@ namespace OpenDiablo2.Scenes
this.mpqProvider = mpqProvider; this.mpqProvider = mpqProvider;
this.mouseInfoProvider = mouseInfoProvider; this.mouseInfoProvider = mouseInfoProvider;
//var texture = renderWindow.LoadSprite(ImageSet.LoadFromStream(mpqProvider.GetStream("data\\global\\ui\\Logo\\logo.DC6"))); backgroundSprite = renderWindow.LoadSprite(ResourcePaths.GameSelectScreen, Palettes.Sky);
backgroundSprite = renderWindow.LoadSprite(ImageSet.LoadFromStream(mpqProvider.GetStream("data\\global\\ui\\FrontEnd\\gameselectscreenEXP.dc6"))); diabloLogoLeft = renderWindow.LoadSprite(ResourcePaths.Diablo2LogoFireLeft, Palettes.Units, new Point(400, 120));
backgroundSprite.CurrentPalette = paletteProvider.PaletteTable["Sky"]; diabloLogoRight = renderWindow.LoadSprite(ResourcePaths.Diablo2LogoFireRight, Palettes.Units, new Point(400, 120));
backgroundSprite.Location = new Point(0, 0); diabloLogoLeftBlack = renderWindow.LoadSprite(ResourcePaths.Diablo2LogoBlackLeft, Palettes.Units, new Point(400, 120));
diabloLogoRightBlack = renderWindow.LoadSprite(ResourcePaths.Diablo2LogoBlackRight, Palettes.Units, new Point(400, 120));
diabloLogoLeft = renderWindow.LoadSprite(ImageSet.LoadFromStream(mpqProvider.GetStream("data\\global\\ui\\FrontEnd\\D2logoFireLeft.DC6"))); mouseSprite = renderWindow.LoadSprite(ResourcePaths.CursorDefault, Palettes.Units);
diabloLogoLeft.CurrentPalette = paletteProvider.PaletteTable["Units"]; wideButton = renderWindow.LoadSprite("data\\global\\ui\\FrontEnd\\WideButtonBlank.dc6", "ACT1");
diabloLogoRight = renderWindow.LoadSprite(ImageSet.LoadFromStream(mpqProvider.GetStream("data\\global\\ui\\FrontEnd\\D2logoFireRight.DC6")));
diabloLogoRight.CurrentPalette = paletteProvider.PaletteTable["Units"];
diabloLogoLeftBlack = renderWindow.LoadSprite(ImageSet.LoadFromStream(mpqProvider.GetStream("data\\global\\ui\\FrontEnd\\D2logoBlackLeft.DC6")));
diabloLogoLeftBlack.CurrentPalette = paletteProvider.PaletteTable["Units"];
diabloLogoRightBlack = renderWindow.LoadSprite(ImageSet.LoadFromStream(mpqProvider.GetStream("data\\global\\ui\\FrontEnd\\D2logoBlackRight.DC6")));
diabloLogoRightBlack.CurrentPalette = paletteProvider.PaletteTable["Units"];
mouseSprite = renderWindow.LoadSprite(ImageSet.LoadFromStream(mpqProvider.GetStream("data\\global\\ui\\CURSOR\\ohand.DC6")));
mouseSprite.CurrentPalette = paletteProvider.PaletteTable["STATIC"];
wideButton = renderWindow.LoadSprite(ImageSet.LoadFromStream(mpqProvider.GetStream("data\\global\\ui\\FrontEnd\\WideButtonBlank.dc6")));
wideButton.CurrentPalette = paletteProvider.PaletteTable["ACT1"];
logoFrame = 0f;
diabloLogoLeft.Location = new Point(400, 120);
diabloLogoRight.Location = new Point(400, 120);
diabloLogoLeftBlack.Location = new Point(400, 120);
diabloLogoRightBlack.Location = new Point(400, 120);
var loadingSprite = renderWindow.LoadSprite(ImageSet.LoadFromStream(mpqProvider.GetStream("data\\global\\ui\\Loading\\loadingscreen.dc6"))); var loadingSprite = renderWindow.LoadSprite(ResourcePaths.LoadingScreen, Palettes.Loading, new Point(300, 400));
loadingSprite.CurrentPalette = paletteProvider.PaletteTable["loading"];
loadingSprite.Location = new Point(300, 400);
renderWindow.Clear(); renderWindow.Clear();
renderWindow.Draw(loadingSprite); renderWindow.Draw(loadingSprite);
renderWindow.Sync(); renderWindow.Sync();
@ -99,15 +78,11 @@ namespace OpenDiablo2.Scenes
renderWindow.Draw(backgroundSprite, 4, 3, 0); renderWindow.Draw(backgroundSprite, 4, 3, 0);
diabloLogoLeftBlack.Frame = (int)((float)diabloLogoLeftBlack.TotalFrames * logoFrame); renderWindow.Draw(diabloLogoLeftBlack, (int)((float)diabloLogoLeftBlack.TotalFrames * logoFrame));
renderWindow.Draw(diabloLogoLeftBlack); renderWindow.Draw(diabloLogoRightBlack, (int)((float)diabloLogoRightBlack.TotalFrames * logoFrame));
diabloLogoRightBlack.Frame = (int)((float)diabloLogoRightBlack.TotalFrames * logoFrame);
renderWindow.Draw(diabloLogoRightBlack);
diabloLogoLeft.Frame = (int)((float)diabloLogoLeft.TotalFrames * logoFrame); renderWindow.Draw(diabloLogoLeft, (int)((float)diabloLogoLeft.TotalFrames * logoFrame));
renderWindow.Draw(diabloLogoLeft); renderWindow.Draw(diabloLogoRight, (int)((float)diabloLogoRight.TotalFrames * logoFrame));
diabloLogoRight.Frame = (int)((float)diabloLogoRight.TotalFrames * logoFrame);
renderWindow.Draw(diabloLogoRight);
wideButton.Location = new Point(264, 290); wideButton.Location = new Point(264, 290);
renderWindow.Draw(wideButton, 2, 1, 0); renderWindow.Draw(wideButton, 2, 1, 0);