TDME2  1.9.200
EngineGL3Renderer.cpp
Go to the documentation of this file.
2 
3 #if defined(_MSC_VER)
4  // this suppresses a warning redefinition of APIENTRY macro
5  #define NOMINMAX
6  #include <windows.h>
7 #endif
8 #define GLFW_INCLUDE_NONE
9 #include <GLFW/glfw3.h>
10 
11 #if !defined(__APPLE__)
12  #define GLEW_NO_GLU
13  #include <GL/glew.h>
14  #if defined(_WIN32)
15  #include <GL/wglew.h>
16  #endif
17 #endif
18 
19 #include <string>
20 
21 #include <tdme/tdme.h>
26 #include <tdme/engine/Engine.h>
27 #include <tdme/engine/Version.h>
29 
31 
32 using std::string;
33 
41 
42 EngineGL3Renderer::EngineGL3Renderer()
43 {
44 }
45 
47  array<array<int, 3>, 2> glVersions = {{ {{1, 4, 3}}, {{1, 3, 2}} }};
48  if (tryIdx >= glVersions.size()) return false;
49  #if defined(__APPLE__)
50  glfwWindowHint(GLFW_COCOA_RETINA_FRAMEBUFFER, GLFW_FALSE);
51  #endif
52  const auto& glVersion = glVersions[tryIdx];
53  #if !defined(__HAIKU__)
54  // does not work for now with Haiku OS
55  glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, glVersion[0] == 1?GLFW_TRUE:GLFW_FALSE);
56  #endif
57  glfwWindowHint(GLFW_OPENGL_PROFILE, glVersion[0] == 1?GLFW_OPENGL_CORE_PROFILE:GLFW_OPENGL_ANY_PROFILE);
58  glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, glVersion[1]);
59  glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, glVersion[2]);
60  return true;
61 }
62 
64  glfwMakeContextCurrent(glfwWindow);
65  if (glfwGetCurrentContext() == nullptr) {
66  Console::println("EngineGL3Renderer::initializeWindowSystemRendererContext(): glfwMakeContextCurrent(): Error: No window attached to context");
67  return false;
68  }
69  #if !defined(__APPLE__)
70  //glewExperimental = true;
71  GLenum glewInitStatus = glewInit();
72  if (glewInitStatus != GLEW_OK) {
73  Console::println("EngineGL3Renderer::initializeWindowSystemRendererContext(): glewInit(): Error: " + (string((char*)glewGetErrorString(glewInitStatus))));
74  return false;
75  }
76  #endif
77  return true;
78 }
79 
81 {
82  if (Engine::lightingShader != nullptr)
83  Engine::lightingShader->updateMatrices(contextIdx);
84 
85  if (Engine::particlesShader != nullptr)
86  Engine::particlesShader->updateMatrices(contextIdx);
87 
88  if (Engine::linesShader != nullptr)
89  Engine::linesShader->updateMatrices(contextIdx);
90 
91  if (Engine::currentEngine->shadowMapping != nullptr)
92  Engine::currentEngine->shadowMapping->updateMatrices(contextIdx);
93 }
94 
96 {
97  if (Engine::lightingShader != nullptr)
98  Engine::lightingShader->updateMatrices(contextIdx);
99 
100  if (Engine::particlesShader != nullptr)
101  Engine::particlesShader->updateMatrices(contextIdx);
102 
103  if (Engine::linesShader != nullptr)
104  Engine::linesShader->updateMatrices(contextIdx);
105 
106  if (Engine::currentEngine->shadowMapping != nullptr)
107  Engine::currentEngine->shadowMapping->updateMatrices(contextIdx);
108 }
109 
111 {
112  if (Engine::lightingShader != nullptr)
113  Engine::lightingShader->updateMatrices(contextIdx);
114 
115  if (Engine::particlesShader != nullptr)
116  Engine::particlesShader->updateMatrices(contextIdx);
117 
118  if (Engine::linesShader != nullptr)
119  Engine::linesShader->updateMatrices(contextIdx);
120 
121  if (Engine::currentEngine->shadowMapping != nullptr)
122  Engine::currentEngine->shadowMapping->updateMatrices(contextIdx);
123 }
124 
125 void EngineGL3Renderer::onBindTexture(int contextIdx, int32_t textureId)
126 {
127  if (Engine::lightingShader != nullptr)
128  Engine::lightingShader->bindTexture(contextIdx, textureId);
129 
130  if (Engine::guiShader != nullptr)
131  Engine::guiShader->bindTexture(textureId);
132 
133  if (Engine::currentEngine->shadowMapping != nullptr)
134  Engine::currentEngine->shadowMapping->bindTexture(contextIdx, textureId);
135 }
136 
138 {
139  if (Engine::lightingShader != nullptr)
140  Engine::lightingShader->updateTextureMatrix(contextIdx);
141 
142  if (Engine::currentEngine->shadowMapping != nullptr)
143  Engine::currentEngine->shadowMapping->updateTextureMatrix(contextIdx);
144 
145  if (Engine::guiShader != nullptr)
146  Engine::guiShader->updateTextureMatrix();
147 }
148 
150 {
151  if (Engine::lightingShader != nullptr)
152  Engine::lightingShader->updateEffect(contextIdx);
153 
154  if (Engine::particlesShader != nullptr)
155  Engine::particlesShader->updateEffect(contextIdx);
156 
157  if (Engine::linesShader != nullptr)
158  Engine::linesShader->updateEffect(contextIdx);
159 
160  if (Engine::guiShader != nullptr)
161  Engine::guiShader->updateEffect();
162 
163 }
164 
165 void EngineGL3Renderer::onUpdateLight(int contextIdx, int32_t lightId)
166 {
167  if (Engine::lightingShader != nullptr)
168  Engine::lightingShader->updateLight(contextIdx, lightId);
169 
170  if (Engine::currentEngine->shadowMapping != nullptr)
171  Engine::currentEngine->shadowMapping->updateLight(contextIdx, lightId);
172 }
173 
175 {
176  if (Engine::lightingShader != nullptr)
177  Engine::lightingShader->updateMaterial(contextIdx);
178 
179  if (Engine::currentEngine->shadowMapping != nullptr)
180  Engine::currentEngine->shadowMapping->updateMaterial(contextIdx);
181 }
182 
183 void EngineGL3Renderer::onUpdateShader(int contextIdx) {
184  if (Engine::lightingShader != nullptr)
185  Engine::lightingShader->setShader(contextIdx, getShader(contextIdx));
186 
187  if (Engine::currentEngine->shadowMapping != nullptr)
188  Engine::currentEngine->shadowMapping->setShader(contextIdx, getShader(contextIdx));
189 }
190 
192  if (Engine::lightingShader != nullptr)
193  Engine::lightingShader->updateShaderParameters(contextIdx);
194 
195  if (Engine::currentEngine->shadowMapping != nullptr)
196  Engine::currentEngine->shadowMapping->updateShaderParameters(contextIdx);
197 }
198 
199 // end point for engine to create renderer
201 {
203  Console::println("EngineGL3Renderer::createInstance(): Engine and renderer version do not match: '" + EngineGL3Renderer::getRendererVersion() + "' != '" + Version::getVersion() + "'");
204  return nullptr;
205  }
206  Console::println("EngineGL3Renderer::createInstance(): Creating EngineGL3Renderer instance!");
207  return new EngineGL3Renderer();
208 }
EngineGL3Renderer * createInstance()
Engine main class.
Definition: Engine.h:131
static STATIC_DLL_IMPEXT Engine * currentEngine
Definition: Engine.h:201
static STATIC_DLL_IMPEXT unique_ptr< GUIShader > guiShader
Definition: Engine.h:220
static STATIC_DLL_IMPEXT unique_ptr< LinesShader > linesShader
Definition: Engine.h:218
static STATIC_DLL_IMPEXT unique_ptr< LightingShader > lightingShader
Definition: Engine.h:216
static STATIC_DLL_IMPEXT unique_ptr< ParticlesShader > particlesShader
Definition: Engine.h:217
unique_ptr< ShadowMapping > shadowMapping
Definition: Engine.h:301
Interface to lighting shader program.
Engine connector of GL3 renderer to other engine functionality.
void onUpdateCameraMatrix(int contextIdx) override
Update camera matrix event.
void onUpdateModelViewMatrix(int contextIdx) override
Update model view matrix event.
void onUpdateProjectionMatrix(int contextIdx) override
Update projection matrix event.
void onUpdateTextureMatrix(int contextIdx) override
Update texture matrix for active texture unit event.
void onBindTexture(int contextIdx, int32_t textureId) override
On bind texture event.
void onUpdateMaterial(int contextIdx) override
On update material.
bool prepareWindowSystemRendererContext(int tryIdx) override
Prepare window system renderer context.
void onUpdateEffect(int contextIdx) override
Update material.
bool initializeWindowSystemRendererContext(GLFWwindow *glfwWindow) override
Initialize window system renderer context.
void onUpdateLight(int contextIdx, int32_t lightId) override
Update light.
void onUpdateShaderParameters(int contextIdx) override
On update shader parameters.
void onUpdateShader(int contextIdx) override
On update shader.
const string & getShader(int contextIdx)
Get shader.
Definition: Renderer.h:1182
static string getVersion()
Definition: Version.cpp:11