From cc9a5827172cb821ba56cf61576327af7133e433 Mon Sep 17 00:00:00 2001 From: MrLetsplay2003 Date: Tue, 12 Sep 2023 22:01:50 +0200 Subject: [PATCH] Fix crash if scene not set --- src/kekengine/cpp/common/engine.cpp | 132 +++++++++++++------------- src/kekengine/cpp/physics/physics.cpp | 2 + 2 files changed, 69 insertions(+), 65 deletions(-) diff --git a/src/kekengine/cpp/common/engine.cpp b/src/kekengine/cpp/common/engine.cpp index c031270..323945b 100644 --- a/src/kekengine/cpp/common/engine.cpp +++ b/src/kekengine/cpp/common/engine.cpp @@ -186,87 +186,89 @@ int start() { cb.second(kekData.window); } - kekData.shader->use(); + if(kekData.activeScene) { + kekData.shader->use(); - glm::mat4 view = kekData.activeCamera->transformationMatrix(); + glm::mat4 view = kekData.activeCamera->transformationMatrix(); - glm::mat4 projection; - projection = glm::perspective(glm::radians(90.0f), kekData.screenWidth / (float) kekData.screenHeight, KEK_CAMERA_NEAR, KEK_CAMERA_FAR); + glm::mat4 projection; + projection = glm::perspective(glm::radians(90.0f), kekData.screenWidth / (float) kekData.screenHeight, KEK_CAMERA_NEAR, KEK_CAMERA_FAR); - glm::vec3 position = kekData.activeCamera->getPosition(); + glm::vec3 position = kekData.activeCamera->getPosition(); - glUniformMatrix4fv(glGetUniformLocation(kekData.shader->id, "view"), 1, GL_FALSE, glm::value_ptr(view)); - glUniformMatrix4fv(glGetUniformLocation(kekData.shader->id, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); - glUniform3fv(glGetUniformLocation(kekData.shader->id, "cameraPos"), 1, glm::value_ptr(position)); + glUniformMatrix4fv(glGetUniformLocation(kekData.shader->id, "view"), 1, GL_FALSE, glm::value_ptr(view)); + glUniformMatrix4fv(glGetUniformLocation(kekData.shader->id, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); + glUniform3fv(glGetUniformLocation(kekData.shader->id, "cameraPos"), 1, glm::value_ptr(position)); - if(kekData.shader->lighting) { - LightList *lights = kekData.activeScene->lights; + if(kekData.shader->lighting) { + LightList *lights = kekData.activeScene->lights; - std::vector shaderLights; // TODO: Maybe don't compute on every frame + std::vector shaderLights; // TODO: Maybe don't compute on every frame - for(PointLight *light : lights->point) { - if(glm::length2(glm::abs(light->getPosition() - kekData.activeCamera->getPosition())) < KEK_LIGHT_MAX_DISTANCE_SQUARED) { + for(PointLight *light : lights->point) { + if(glm::length2(glm::abs(light->getPosition() - kekData.activeCamera->getPosition())) < KEK_LIGHT_MAX_DISTANCE_SQUARED) { + shaderLights.push_back(light); + } + } + + for(DirectionalLight *light : lights->directional) { shaderLights.push_back(light); } - } - for(DirectionalLight *light : lights->directional) { - shaderLights.push_back(light); - } - - for(SpotLight *light : lights->spot) { - if(glm::length2(glm::abs(light->getPosition() - kekData.activeCamera->getPosition())) < KEK_LIGHT_MAX_DISTANCE_SQUARED) { - shaderLights.push_back(light); - } - } - - unsigned int i = 0; - int numPointLights = 0, numDirectionalLights = 0, numSpotLights = 0; - - for(Light *light : shaderLights) { - ShaderLight shLight; - memcpy(shLight.color, glm::value_ptr(light->color), sizeof(shLight.color)); - switch(light->getType()) { - case LightType::POINT: - { - PointLight *l = (PointLight *) light; - memcpy(&shLight.position, glm::value_ptr(l->getPosition()), sizeof(shLight.position)); - memcpy(&shLight.attenuation, glm::value_ptr(glm::vec3(l->constant, l->linear, l->quadratic)), sizeof(shLight.attenuation)); - numPointLights++; - break; - } - case LightType::DIRECTIONAL: - { - DirectionalLight *l = (DirectionalLight *) light; - memcpy(&shLight.direction, glm::value_ptr(l->direction), sizeof(shLight.direction)); - numDirectionalLights++; - break; - } - case LightType::SPOT: - { - SpotLight *l = (SpotLight *) light; - memcpy(&shLight.position, glm::value_ptr(l->getPosition()), sizeof(shLight.position)); - memcpy(&shLight.direction, glm::value_ptr(l->direction), sizeof(shLight.direction)); - memcpy(&shLight.attenuation, glm::value_ptr(glm::vec3(l->constant, l->linear, l->quadratic)), sizeof(shLight.attenuation)); - memcpy(&shLight.cutoff, glm::value_ptr(glm::vec2(glm::cos(l->innerCutoff), glm::cos(l->outerCutoff))), sizeof(shLight.cutoff)); - numSpotLights++; - break; + for(SpotLight *light : lights->spot) { + if(glm::length2(glm::abs(light->getPosition() - kekData.activeCamera->getPosition())) < KEK_LIGHT_MAX_DISTANCE_SQUARED) { + shaderLights.push_back(light); } } - kekData.shader->lighting->buffer[i] = shLight; - i++; + + unsigned int i = 0; + int numPointLights = 0, numDirectionalLights = 0, numSpotLights = 0; + + for(Light *light : shaderLights) { + ShaderLight shLight; + memcpy(shLight.color, glm::value_ptr(light->color), sizeof(shLight.color)); + switch(light->getType()) { + case LightType::POINT: + { + PointLight *l = (PointLight *) light; + memcpy(&shLight.position, glm::value_ptr(l->getPosition()), sizeof(shLight.position)); + memcpy(&shLight.attenuation, glm::value_ptr(glm::vec3(l->constant, l->linear, l->quadratic)), sizeof(shLight.attenuation)); + numPointLights++; + break; + } + case LightType::DIRECTIONAL: + { + DirectionalLight *l = (DirectionalLight *) light; + memcpy(&shLight.direction, glm::value_ptr(l->direction), sizeof(shLight.direction)); + numDirectionalLights++; + break; + } + case LightType::SPOT: + { + SpotLight *l = (SpotLight *) light; + memcpy(&shLight.position, glm::value_ptr(l->getPosition()), sizeof(shLight.position)); + memcpy(&shLight.direction, glm::value_ptr(l->direction), sizeof(shLight.direction)); + memcpy(&shLight.attenuation, glm::value_ptr(glm::vec3(l->constant, l->linear, l->quadratic)), sizeof(shLight.attenuation)); + memcpy(&shLight.cutoff, glm::value_ptr(glm::vec2(glm::cos(l->innerCutoff), glm::cos(l->outerCutoff))), sizeof(shLight.cutoff)); + numSpotLights++; + break; + } + } + kekData.shader->lighting->buffer[i] = shLight; + i++; + } + + glNamedBufferData(kekData.shader->lighting->ubo, kekData.shader->lighting->blockSize, &kekData.shader->lighting->buffer, GL_DYNAMIC_DRAW); + glBindBufferBase(GL_UNIFORM_BUFFER, KEK_UNIFORM_LIGHTS_BINDING, kekData.shader->lighting->ubo); + + glUniform1i(glGetUniformLocation(kekData.shader->id, "numPointLights"), numPointLights); + glUniform1i(glGetUniformLocation(kekData.shader->id, "numDirectionalLights"), numDirectionalLights); + glUniform1i(glGetUniformLocation(kekData.shader->id, "numSpotLights"), numSpotLights); } - glNamedBufferData(kekData.shader->lighting->ubo, kekData.shader->lighting->blockSize, &kekData.shader->lighting->buffer, GL_DYNAMIC_DRAW); - glBindBufferBase(GL_UNIFORM_BUFFER, KEK_UNIFORM_LIGHTS_BINDING, kekData.shader->lighting->ubo); - - glUniform1i(glGetUniformLocation(kekData.shader->id, "numPointLights"), numPointLights); - glUniform1i(glGetUniformLocation(kekData.shader->id, "numDirectionalLights"), numDirectionalLights); - glUniform1i(glGetUniformLocation(kekData.shader->id, "numSpotLights"), numSpotLights); + kekData.activeScene->draw(kekData.shader); } - if(kekData.activeScene) kekData.activeScene->draw(kekData.shader); - glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); diff --git a/src/kekengine/cpp/physics/physics.cpp b/src/kekengine/cpp/physics/physics.cpp index c946773..afad517 100644 --- a/src/kekengine/cpp/physics/physics.cpp +++ b/src/kekengine/cpp/physics/physics.cpp @@ -32,6 +32,8 @@ void destroy() { } void step(float deltaT) { + if(!kekData.activeScene) return; + for(GameObject *obj : kekData.activeScene->objects) { if(obj->physics) { obj->physics->body->getWorldTransform().setOrigin(fromGLM(obj->getPosition()));