aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/graphics/sprite.cpp
blob: a09a315adfcc3b69ce4475ddcf22c0f3316e5017 (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
#include "graphic.h"
#include "sprite.h"

using namespace JinEngine::Math;
using namespace JinEngine::Graphics;

namespace JinEngine
{
	namespace Graphics
	{

		Sprite::Sprite(const Graphic* graphic, const Math::Quad& quad, Origin origin)
			: mGraphic(graphic)
			, mQuad(quad)
		{
			setOrigin(origin);
		}

		Sprite::Sprite(const Graphic* graphic, const Math::Quad& quad, float ox, float oy)
			: mGraphic(graphic)
			, mQuad(quad)
			, mOrigin(ox, oy)
		{
		}

		Sprite::Sprite(const Graphic* graphic, Origin origin)
			: mGraphic(graphic)
			, mQuad(0, 0, graphic->getWidth(), graphic->getHeight())
		{
			setOrigin(origin);
		}

		Sprite::Sprite(const Graphic* graphic, float ox, float oy)
			: mGraphic(graphic)
			, mQuad(0, 0, graphic->getWidth(), graphic->getHeight())
			, mOrigin(ox, oy)
		{
		}

		Sprite::~Sprite()
		{
		}

		Math::Vector2<int> Sprite::getSize() 
		{
			return Math::Vector2<int>(mQuad.w, mQuad.h); 
		}

		void Sprite::render(float x, float y, float sx, float sy, float r) const
		{
			if (mGraphic != nullptr)
				mGraphic->render(mQuad, x, y, sx, sy, r, mOrigin.x(), mOrigin.y());
		}

		void Sprite::setOrigin(Origin origin)
		{
			int l = 0, r = 0, t = 0, b = 0;
			Vector2<int> size = getSize();
			r = size.w();
			b = size.h();
			Vector2<float>* org = const_cast<Vector2<float>*>(&mOrigin);
			switch (origin)
			{
			case Origin::TOPLEFT:
				org->set(l, t);
				break;
			case Origin::TOPCENTER:
				org->set(r / 2.f, t);
				break;
			case Origin::TOPRIGHT:
				org->set(r, t);
				break;
			case Origin::MIDDLELEFT:
				org->set(l, b / 2.f);
				break;
			case Origin::MIDDLECENTER:
				org->set(r / 2.f, b / 2.f);
				break;
			case Origin::MIDDLERIGHT:
				org->set(r, b / 2.f);
				break;
			case Origin::BOTTOMLEFT:
				org->set(l, b);
				break;
			case Origin::BOTTOMCENTER:
				org->set(r / 2.f, b);
				break;
			case Origin::BOTTOMRIGHT:
				org->set(r, b);
				break;
			}
		}

	} // namespace Graphics
} // namespace JinEngine