1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-06-13 03:00:42 +00: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 System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
@ -14,8 +15,10 @@ namespace OpenDiablo2.Common.Interfaces
void Update();
void Clear();
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, int frame);
void Draw(ISprite sprite, int xSegments, int ySegments, int offset);
}
}

View File

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

View File

@ -68,6 +68,7 @@
<ItemGroup>
<Compile Include="Attributes\SceneAttribute.cs" />
<Compile Include="Enums\eMPQFormatVersion.cs" />
<Compile Include="Interfaces\IFont.cs" />
<Compile Include="Interfaces\IGameEngine.cs" />
<Compile Include="Interfaces\IMPQProvider.cs" />
<Compile Include="Interfaces\IMusicProvider.cs" />
@ -88,7 +89,9 @@
<Compile Include="Models\Palette.cs" />
<Compile Include="Models\PKLibDecompress.cs" />
<Compile Include="Models\SoundEntry.cs" />
<Compile Include="Palettes.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ResourcePaths.cs" />
</ItemGroup>
<ItemGroup>
<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);
private readonly IMPQProvider mpqProvider;
private readonly IRenderWindow renderWindow;
private readonly Func<IRenderWindow> getRenderWindow;
private readonly Func<string, IScene> getScene;
private IScene currentScene;
@ -27,10 +27,10 @@ namespace OpenDiablo2.Core
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.renderWindow = renderWindow;
this.getRenderWindow = getRenderWindow;
this.getScene = getScene;
MPQs = mpqProvider.GetMPQs().ToArray();
@ -68,7 +68,7 @@ namespace OpenDiablo2.Core
currentScene = getScene("Main Menu");
sw.Start();
while (renderWindow.IsRunning)
while (getRenderWindow().IsRunning)
{
while (sw.ElapsedMilliseconds < 16)
Thread.Sleep(1); // Oh yes we did
@ -82,7 +82,7 @@ namespace OpenDiablo2.Core
continue;
}
sw.Restart();
renderWindow.Update();
getRenderWindow().Update();
currentScene.Update(ms);
currentScene.Render();

View File

@ -15,6 +15,7 @@ namespace OpenDiablo2.SDL2_
public sealed class SDL2RenderWindow : IRenderWindow, IRenderTarget, IMouseInfoProvider
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private IntPtr window, renderer;
private bool running;
public bool IsRunning => running;
@ -24,11 +25,16 @@ namespace OpenDiablo2.SDL2_
public bool LeftMouseDown { 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);
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)
{
var spr = sprite as SDL2Sprite;
@ -128,7 +140,13 @@ namespace OpenDiablo2.SDL2_
}
}
public ISprite LoadSprite(ImageSet source)
=> new SDL2Sprite(source, renderer);
public ISprite LoadSprite(string resourcePath, string palette) => LoadSprite(resourcePath, palette, Point.Empty);
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.Models;
using System;
@ -38,40 +39,18 @@ namespace OpenDiablo2.Scenes
this.mpqProvider = mpqProvider;
this.mouseInfoProvider = mouseInfoProvider;
//var texture = renderWindow.LoadSprite(ImageSet.LoadFromStream(mpqProvider.GetStream("data\\global\\ui\\Logo\\logo.DC6")));
backgroundSprite = renderWindow.LoadSprite(ImageSet.LoadFromStream(mpqProvider.GetStream("data\\global\\ui\\FrontEnd\\gameselectscreenEXP.dc6")));
backgroundSprite.CurrentPalette = paletteProvider.PaletteTable["Sky"];
backgroundSprite.Location = new Point(0, 0);
backgroundSprite = renderWindow.LoadSprite(ResourcePaths.GameSelectScreen, Palettes.Sky);
diabloLogoLeft = renderWindow.LoadSprite(ResourcePaths.Diablo2LogoFireLeft, Palettes.Units, new Point(400, 120));
diabloLogoRight = renderWindow.LoadSprite(ResourcePaths.Diablo2LogoFireRight, Palettes.Units, new Point(400, 120));
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")));
diabloLogoLeft.CurrentPalette = paletteProvider.PaletteTable["Units"];
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);
mouseSprite = renderWindow.LoadSprite(ResourcePaths.CursorDefault, Palettes.Units);
wideButton = renderWindow.LoadSprite("data\\global\\ui\\FrontEnd\\WideButtonBlank.dc6", "ACT1");
var loadingSprite = renderWindow.LoadSprite(ImageSet.LoadFromStream(mpqProvider.GetStream("data\\global\\ui\\Loading\\loadingscreen.dc6")));
loadingSprite.CurrentPalette = paletteProvider.PaletteTable["loading"];
loadingSprite.Location = new Point(300, 400);
var loadingSprite = renderWindow.LoadSprite(ResourcePaths.LoadingScreen, Palettes.Loading, new Point(300, 400));
renderWindow.Clear();
renderWindow.Draw(loadingSprite);
renderWindow.Sync();
@ -99,15 +78,11 @@ namespace OpenDiablo2.Scenes
renderWindow.Draw(backgroundSprite, 4, 3, 0);
diabloLogoLeftBlack.Frame = (int)((float)diabloLogoLeftBlack.TotalFrames * logoFrame);
renderWindow.Draw(diabloLogoLeftBlack);
diabloLogoRightBlack.Frame = (int)((float)diabloLogoRightBlack.TotalFrames * logoFrame);
renderWindow.Draw(diabloLogoRightBlack);
renderWindow.Draw(diabloLogoLeftBlack, (int)((float)diabloLogoLeftBlack.TotalFrames * logoFrame));
renderWindow.Draw(diabloLogoRightBlack, (int)((float)diabloLogoRightBlack.TotalFrames * logoFrame));
diabloLogoLeft.Frame = (int)((float)diabloLogoLeft.TotalFrames * logoFrame);
renderWindow.Draw(diabloLogoLeft);
diabloLogoRight.Frame = (int)((float)diabloLogoRight.TotalFrames * logoFrame);
renderWindow.Draw(diabloLogoRight);
renderWindow.Draw(diabloLogoLeft, (int)((float)diabloLogoLeft.TotalFrames * logoFrame));
renderWindow.Draw(diabloLogoRight, (int)((float)diabloLogoRight.TotalFrames * logoFrame));
wideButton.Location = new Point(264, 290);
renderWindow.Draw(wideButton, 2, 1, 0);