aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/graphics/graphic.cpp
blob: 7659e4e5cca91e5f7f0b0e0ee757e4e015af71f8 (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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include "../core/configuration.h"
#if defined(jin_graphics)

#include <stdlib.h>

#include "../math/matrix.h"
#include "../math/vector2.hpp"

#include "shaders/shader.h"
#include "graphic.h"

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

namespace JinEngine
{
    namespace Graphics
    {

        Graphic::Graphic(int w, int h)
            : mTexture(0)
            , mSize(w, h)
        {
            mTexture = gl.genTexture();
        }

        Graphic::Graphic(const Bitmap* bitmap)
            : mTexture(0)
        {
            mSize.w() = bitmap->getWidth();
            mSize.h() = bitmap->getHeight();

            const Color* pixels = bitmap->getPixels();

            mTexture = gl.genTexture();
            gl.bindTexture2D(mTexture);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
            gl.texImage(GL_RGBA8, mSize.w(), mSize.h(), GL_RGBA, GL_UNSIGNED_BYTE, pixels);
        }

        Graphic::~Graphic()
        {
            glDeleteTextures(1, &mTexture);
        }

        void Graphic::setFilter(GLint min_filter, GLint max_filter)
        {
            gl.bindTexture2D(mTexture);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, max_filter);
        }

        void Graphic::render(float x, float y, float sx, float sy, float r, float ox, float oy) const
        {
            Math::Matrix modelViewMatrix = gl.getModelViewMatrix(x, y, sx, sy, r, ox, oy);
            int w = getWidth(), h = getHeight();
            static float vertexCoords[8];
            static float textureCoords[8];
            // Set vertex coordinates.
            vertexCoords[0] = 0; vertexCoords[1] = 0;
            vertexCoords[2] = 0; vertexCoords[3] = h;
            vertexCoords[4] = w; vertexCoords[5] = h;
            vertexCoords[6] = w; vertexCoords[7] = 0;
            // Set texture coordinates.
            textureCoords[0] = 0; textureCoords[1] = 0;
            textureCoords[2] = 0; textureCoords[3] = 1;
            textureCoords[4] = 1; textureCoords[5] = 1;
            textureCoords[6] = 1; textureCoords[7] = 0;
            // Set shader.
            Shader* shader = gl.getShader();
            shader->begin()
                .sendMatrix4(SHADER_MODELVIEW_MATRIX, &modelViewMatrix)
                .sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.getProjectionMatrix())
                .uploadVertices(2, GL_FLOAT, 0, vertexCoords)
                .uploadUV(2, GL_FLOAT, 0, textureCoords);

            gl.bindTexture2D(mTexture);
            gl.drawArrays(GL_QUADS, 0, 4);

            shader->end();
        }

        void Graphic::render(const Math::Quad& slice, float x, float y, float sx, float sy, float r, float ax, float ay) const
        {
            static float vertexCoords[8];
            static float textureCoords[8];

            // Set vertex coordinates.
            vertexCoords[0] = 0;       vertexCoords[1] = 0;
            vertexCoords[2] = 0;       vertexCoords[3] = slice.h;
            vertexCoords[4] = slice.w; vertexCoords[5] = slice.h;
            vertexCoords[6] = slice.w; vertexCoords[7] = 0;
            // Set texture coordinates.
            float slx = slice.x / mSize.w();
            float sly = slice.y / mSize.h();
            float slw = slice.w / mSize.w();
            float slh = slice.h / mSize.h();
            textureCoords[0] = slx;       textureCoords[1] = sly;
            textureCoords[2] = slx;       textureCoords[3] = sly + slh;
            textureCoords[4] = slx + slw; textureCoords[5] = sly + slh;
            textureCoords[6] = slx + slw; textureCoords[7] = sly;

            Math::Matrix modelViewMatrix = gl.getModelViewMatrix(x, y, sx, sy, r, ax, ay);

            Shader* shader = gl.getShader();
            shader->begin()
                .sendMatrix4(SHADER_MODELVIEW_MATRIX, &modelViewMatrix)
                .sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.getProjectionMatrix())
                .uploadVertices(2, GL_FLOAT, 0, vertexCoords)
                .uploadUV(2, GL_FLOAT, 0, textureCoords);

            gl.bindTexture2D(mTexture);
            gl.drawArrays(GL_QUADS, 0, 4);

            shader->end();
        }

        void Graphic::render(const Math::Transform& transform) const
        {
            Vector2<float> position = transform.getPosition();
            Vector2<float> origin = transform.getOrigin();
            Vector2<float> scale = transform.getScale();
            float angle = transform.getRotation();
            render(position.x(), position.y(), scale.x(), scale.y(), angle, origin.x(), origin.y());
        }

        void Graphic::render(const Math::Quad& slice, const Math::Transform& transform) const
        {
            Vector2<float> position = transform.getPosition();
            Vector2<float> origin = transform.getOrigin();
            Vector2<float> scale = transform.getScale();
            float angle = transform.getRotation();
            render(slice, position.x(), position.y(), scale.x(), scale.y(), angle, origin.x(), origin.y());
        }

        //void Graphic::setFilter(GLint min, GLint max)
        //{
        //    glTexParameteri(GL_)
        //}

    } // namespace Graphics
} // namespace JinEngine

#endif // defined(jin_graphics)