1 | #include <list> |
2 |
|
3 | #include "ZydecoCommon.hpp" |
4 | #include "GLRenderObject.hpp" |
5 | #include "GLProgram.hpp" |
6 | #include "GLTexture.hpp" |
7 |
|
8 |
|
9 | static Logger LOGGER("GLRenderObject"); |
10 |
|
11 | // static initialize |
12 | std::map<uint64_t, std::list<GLRenderObject*>> GLRenderObject::s_renderObjects = {}; |
13 |
|
14 |
|
15 | GLRenderObject::GLRenderObject(std::string gl_program_name, uint64_t render_order): |
16 | m_renderOrder(render_order), |
17 | m_renderEnabled(true) |
18 | { |
19 | if (gl_program_name != "") |
20 | { |
21 | m_glProgram = GLProgram::GetGLProgram(gl_program_name); |
22 | if (m_glProgram == nullptr) { ZydecoFault("GLRenderObject(): Program '{}' is nonexistent", gl_program_name); } |
23 | } |
24 |
|
25 | s_renderObjects.insert(std::pair<uint64_t, std::list<GLRenderObject*>>(render_order, {})); |
26 | s_renderObjects.at(render_order).push_back(this); |
27 | } |
28 |
|
29 | GLRenderObject::~GLRenderObject() |
30 | { |
31 | s_renderObjects.at(m_renderOrder).remove(this); |
32 | if (s_renderObjects.at(m_renderOrder).empty()) |
33 | { |
34 | s_renderObjects.erase(m_renderOrder); |
35 | } |
36 | } |
37 |
|
38 | void GLRenderObject::RenderEnable() |
39 | { |
40 | m_renderEnabled = true; |
41 | } |
42 |
|
43 | void GLRenderObject::RenderDisable() |
44 | { |
45 | m_renderEnabled = false; |
46 | } |
47 |
|
48 | void GLRenderObject::AddTexture(uint64_t texture_unit, GLTexture *texture) |
49 | { |
50 | m_textures[texture_unit] = texture; |
51 | } |
52 |
|
53 | void GLRenderObject::GLTargetSetup() |
54 | { |
55 | int program = m_glProgram->GetGLProgramID(); |
56 |
|
57 | glUseProgram(program); |
58 |
|
59 | UploadUniforms(program); |
60 |
|
61 | for (std::pair<uint64_t, GLTexture*> texture : m_textures) |
62 | { |
63 | texture.second->BindAsTexture(texture.first); |
64 | } |
65 | } |
66 |
|
67 | std::map<uint64_t, std::list<GLRenderObject*>>& GLRenderObject::GetRenderObjects() |
68 | { |
69 | return s_renderObjects; |
70 | } |
71 |
|