forked from flavius-st/TheAdventure
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGameRenderer.cs
More file actions
100 lines (85 loc) · 2.92 KB
/
Copy pathGameRenderer.cs
File metadata and controls
100 lines (85 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using Silk.NET.Maths;
using Silk.NET.SDL;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using TheAdventure.Models;
using Point = Silk.NET.SDL.Point;
namespace TheAdventure;
public unsafe class GameRenderer
{
private Sdl _sdl;
private Renderer* _renderer;
private GameWindow _window;
private Camera _camera;
private Dictionary<int, IntPtr> _textures = new();
private Dictionary<int, TextureInfo> _textureData = new();
private int _textureId;
public GameRenderer(Sdl sdl, GameWindow window)
{
_window = window;
_sdl = sdl;
_renderer = (Renderer*)window.CreateRenderer();
_sdl.SetRenderDrawBlendMode(_renderer, BlendMode.Blend);
var windowSize = window.Size;
_camera = new Camera(windowSize.Width, windowSize.Height);
}
public void SetWorldBounds(Rectangle<int> bounds)
{
_camera.SetWorldBounds(bounds);
}
public void CameraLookAt(int x, int y)
{
_camera.LookAt(x, y);
}
public int LoadTexture(string fileName, out TextureInfo textureInfo)
{
using (var fStream = new FileStream(fileName, FileMode.Open))
{
var image = Image.Load<Rgba32>(fStream);
textureInfo = new TextureInfo()
{
Width = image.Width,
Height = image.Height
};
var imageRAWData = new byte[textureInfo.Width * textureInfo.Height * 4];
image.CopyPixelDataTo(imageRAWData.AsSpan());
fixed (byte* data = imageRAWData)
{
var imageSurface = _sdl.CreateRGBSurfaceWithFormatFrom(data, textureInfo.Width,
textureInfo.Height, 8, textureInfo.Width * 4, (uint)PixelFormatEnum.Rgba32);
var imageTexture = _sdl.CreateTextureFromSurface(_renderer, imageSurface);
_sdl.FreeSurface(imageSurface);
_textureData[_textureId] = textureInfo;
_textures[_textureId] = (IntPtr)imageTexture;
}
}
return _textureId++;
}
public void RenderTexture(int textureId, Rectangle<int> src, Rectangle<int> dst,
RendererFlip flip = RendererFlip.None, double angle = 0.0, Point center = default)
{
if (_textures.TryGetValue(textureId, out var imageTexture))
{
_sdl.RenderCopyEx(_renderer, (Texture*)imageTexture, src,
_camera.TranslateToScreenCoordinates(dst),
angle,
center, flip);
}
}
public Vector2D<int> TranslateFromScreenToWorldCoordinates(int x, int y)
{
return _camera.FromScreenToWorld(x, y);
}
public void SetDrawColor(byte r, byte g, byte b, byte a)
{
_sdl.SetRenderDrawColor(_renderer, r, g, b, a);
}
public void ClearScreen()
{
_sdl.RenderClear(_renderer);
}
public void PresentFrame()
{
_sdl.RenderPresent(_renderer);
}
}