summaryrefslogtreecommitdiff
path: root/loader/d3d_sprite.hpp
blob: 584fddb6769798f888ab189df50b09e09dbc5d13 (plain)
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
101
102
103
104
105
106
107
#pragma once
#include <vector>
#include "d3d.hpp"


namespace d3d
{
	class c_sprite;

	extern std::vector< c_sprite* > sprites;

	class c_sprite {
	public:
		size_t m_width{ };
		size_t m_height{ };

		IDirect3DDevice9*  m_device{ };
		ID3DXSprite*	   m_sprite{ };
		IDirect3DTexture9* m_texture{ };
		const byte*		   m_image{ };
		size_t			   m_image_size{ };


	public:
		c_sprite( ) {
			sprites.push_back( this );
		}

		~c_sprite( ) {
			on_reset( );
		}

		void init( IDirect3DDevice9* device, const byte* file, size_t img_size, size_t width, size_t height ) {
			m_width = width;
			m_height = height;

			m_device = device;
			m_image = file;	
			m_image_size = img_size;
		}

		void begin( IDirect3DDevice9* device ) {
			m_device = device;

			if( !m_device ) {
				return;
			}

			if( !m_sprite )
				D3DXCreateSprite( m_device, &m_sprite );

			if( m_sprite )
				m_sprite->Begin( D3DXSPRITE_ALPHABLEND );

			if( !m_texture ) {
				auto hr = D3DXCreateTextureFromFileInMemoryEx(
					m_device, m_image, m_image_size,
					m_width, m_height, D3DX_DEFAULT, 0, D3DFMT_A8B8G8R8,
					D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0,
					0, 0, &m_texture );
			}
		}

		void end( ) {
			if( !m_device || !m_sprite || !m_texture ) return;
			if( m_sprite ) m_sprite->End( );
		}

		void on_reset( ) {
			if( m_sprite && m_device && m_texture ) {
				m_sprite->OnLostDevice( );
				m_sprite->OnResetDevice( );
				m_texture->Release( );
				m_texture = nullptr;
			}
		}

		void draw( int x, int y, clr_t color ) {
			if( !m_device || !m_texture || !m_sprite ) {
				return;
			}

			ulong_t hr;
			D3DXVECTOR2 center = D3DXVECTOR2( m_width * 0.5f, m_height * 0.5f );
			D3DXVECTOR2 trans = D3DXVECTOR2( x - center.x, y - center.y );
			D3DXMATRIX matrix;
			D3DXVECTOR2 scale( 1.f, 1.f );
			D3DXMatrixTransformation2D( &matrix, 0, 0.f, &scale, &center, 0.f, &trans );

			hr = m_sprite->SetTransform( &matrix );

			auto d3dcolor = D3DCOLOR_RGBA( color.r( ),
				color.g( ), color.b( ), color.a( ) );
			hr = m_sprite->Draw( m_texture, 0, 0, 0, d3dcolor );
		}
	};
}

namespace icons
{
	extern d3d::c_sprite sprite_legit;
	extern d3d::c_sprite sprite_visuals_;
	extern d3d::c_sprite sprite_rage;
	extern d3d::c_sprite sprite_visuals;
	extern d3d::c_sprite sprite_misc;
	extern d3d::c_sprite sprite_config;
}