mirror of
https://github.com/devZoGok/vb01.git
synced 2026-08-26 19:43:30 +00:00
refactored light updating to account for lights in hidden nodes
This commit is contained in:
@@ -75,32 +75,39 @@ namespace vb01{
|
|||||||
glBindFramebuffer(GL_FRAMEBUFFER, *(Root::getSingleton()->getFBO()));
|
glBindFramebuffer(GL_FRAMEBUFFER, *(Root::getSingleton()->getFBO()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Light::update(){
|
void Light::update(bool render){
|
||||||
Root *root = Root::getSingleton();
|
Root *root = Root::getSingleton();
|
||||||
Node *rootNode = root->getRootNode();
|
Node *rootNode = root->getRootNode();
|
||||||
|
|
||||||
vector<Node*> descendants;
|
vector<Node*> descendants;
|
||||||
rootNode->getDescendants(descendants);
|
rootNode->getDescendants(descendants);
|
||||||
descendants.push_back(rootNode);
|
descendants.push_back(rootNode);
|
||||||
|
|
||||||
vector<Light*> lights;
|
vector<Light*> lights;
|
||||||
vector<Material*> materials;
|
vector<Material*> materials;
|
||||||
|
|
||||||
for(Node *d : descendants){
|
for(Node *d : descendants){
|
||||||
for(Light *l : d->getLights())
|
for(Light *l : d->getLights())
|
||||||
lights.push_back(l);
|
lights.push_back(l);
|
||||||
for(Mesh *m : d->getMeshes())
|
for(Mesh *mesh : d->getMeshes())
|
||||||
materials.push_back(m->getMaterial());
|
materials.push_back(mesh->getMaterial());
|
||||||
}
|
}
|
||||||
|
|
||||||
int thisId = -1;
|
int thisId = -1;
|
||||||
|
|
||||||
for(int i = 0; i < lights.size(); i++)
|
for(int i = 0; i < lights.size(); i++)
|
||||||
if(lights[i] == this)
|
if(lights[i] == this)
|
||||||
thisId = i;
|
thisId = i;
|
||||||
|
|
||||||
|
for(Material *mat : materials){
|
||||||
|
Shader *shader = mat->getShader();
|
||||||
|
shader->use();
|
||||||
|
shader->setBool(render, "lights[" + to_string(thisId) + "].render");
|
||||||
|
}
|
||||||
|
|
||||||
mat4 proj = mat4(1.), view = mat4(1.);
|
mat4 proj = mat4(1.), view = mat4(1.);
|
||||||
renderShadow(descendants, proj, view);
|
renderShadow(descendants, proj, view);
|
||||||
updateShader(materials, thisId, proj, view);
|
updateShader(materials, thisId, proj, view);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Light::renderShadow(std::vector<Node*> descendants, mat4 &proj, mat4 &view){
|
void Light::renderShadow(std::vector<Node*> descendants, mat4 &proj, mat4 &view){
|
||||||
@@ -176,8 +183,10 @@ namespace vb01{
|
|||||||
glViewport(0, 0, root->getWidth(), root->getHeight());
|
glViewport(0, 0, root->getWidth(), root->getHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO replace depth map id literals
|
||||||
void Light::updateShader(vector<Material*> materials, int thisId, mat4 &proj, mat4 &view){
|
void Light::updateShader(vector<Material*> materials, int thisId, mat4 &proj, mat4 &view){
|
||||||
Vector3 position = node->localToGlobalPosition(Vector3::VEC_ZERO), direction = node->getGlobalAxis(2);
|
Vector3 position = node->localToGlobalPosition(Vector3::VEC_ZERO), direction = node->getGlobalAxis(2);
|
||||||
|
|
||||||
for(Material *m : materials){
|
for(Material *m : materials){
|
||||||
Shader *shader = m->getShader();
|
Shader *shader = m->getShader();
|
||||||
shader->use();
|
shader->use();
|
||||||
@@ -200,7 +209,7 @@ namespace vb01{
|
|||||||
shader->setFloat(attenuationValues.x, "lights[" + to_string(thisId) + "].a");
|
shader->setFloat(attenuationValues.x, "lights[" + to_string(thisId) + "].a");
|
||||||
shader->setFloat(attenuationValues.y, "lights[" + to_string(thisId) + "].b");
|
shader->setFloat(attenuationValues.y, "lights[" + to_string(thisId) + "].b");
|
||||||
shader->setFloat(attenuationValues.z, "lights[" + to_string(thisId) + "].c");
|
shader->setFloat(attenuationValues.z, "lights[" + to_string(thisId) + "].c");
|
||||||
shader->setBool(useAngle, "lights[" + to_string(thisId) + "].additive");
|
shader->setBool(useAngle, "lights[" + to_string(thisId) + "].useAngle");
|
||||||
break;
|
break;
|
||||||
case DIRECTIONAL:
|
case DIRECTIONAL:
|
||||||
shader->setMat4(proj * view, "lights[" + to_string(thisId) + "].lightMat");
|
shader->setMat4(proj * view, "lights[" + to_string(thisId) + "].lightMat");
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ namespace vb01{
|
|||||||
|
|
||||||
Light(Type, std::string = "");
|
Light(Type, std::string = "");
|
||||||
~Light();
|
~Light();
|
||||||
void update();
|
void update(bool);
|
||||||
|
inline Vector3 getColor(){return color;}
|
||||||
|
inline Type getLightType(){return type;}
|
||||||
inline void setColor(Vector3 color){this->color = color;}
|
inline void setColor(Vector3 color){this->color = color;}
|
||||||
inline void setAttenuationValues(float a, float b, float c){
|
inline void setAttenuationValues(float a, float b, float c){
|
||||||
attenuationValues.x = a;
|
attenuationValues.x = a;
|
||||||
|
|||||||
@@ -58,10 +58,10 @@ namespace vb01{
|
|||||||
if(!render) break;
|
if(!render) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(render){
|
for(Light *l : lights)
|
||||||
for(Light *l : lights)
|
l->update(render);
|
||||||
l->update();
|
|
||||||
|
|
||||||
|
if(render){
|
||||||
for(Mesh *m : meshes)
|
for(Mesh *m : meshes)
|
||||||
m->update();
|
m->update();
|
||||||
|
|
||||||
|
|||||||
+5
-3
@@ -15,7 +15,7 @@ layout (location = 1) out vec4 BrightColor;
|
|||||||
//0-POINT,1-DIRECTIONAL,2-SPOT
|
//0-POINT,1-DIRECTIONAL,2-SPOT
|
||||||
|
|
||||||
struct Light{
|
struct Light{
|
||||||
bool useAngle, additive;
|
bool useAngle, additive, render;
|
||||||
int type, attenuation;
|
int type, attenuation;
|
||||||
vec3 pos, color, direction;
|
vec3 pos, color, direction;
|
||||||
float innerAngle, outerAngle;
|
float innerAngle, outerAngle;
|
||||||
@@ -100,8 +100,10 @@ void main(){
|
|||||||
bool addedLighting = false;
|
bool addedLighting = false;
|
||||||
|
|
||||||
for(int i = 0; i < numLights; i++){
|
for(int i = 0; i < numLights; i++){
|
||||||
|
if(!lights[i].render) continue;
|
||||||
|
|
||||||
vec3 lightDir = vec3(0), viewDir = normalize(camPos - fragPos);
|
vec3 lightDir = vec3(0), viewDir = normalize(camPos - fragPos);
|
||||||
float attenuation = 0, coef = 1;
|
float attenuation = 1, coef = 1;
|
||||||
float factor = 0;
|
float factor = 0;
|
||||||
bool canAdd = false;
|
bool canAdd = false;
|
||||||
|
|
||||||
@@ -125,7 +127,7 @@ void main(){
|
|||||||
}
|
}
|
||||||
else if(lights[i].type == 1){
|
else if(lights[i].type == 1){
|
||||||
lightDir = -normalize(lights[i].direction);
|
lightDir = -normalize(lights[i].direction);
|
||||||
factor = max(dot(lightDir, normalize(normal)), 0.) * attenuation * coef;
|
factor = max(dot(lightDir, normalize(normal)), 0.) * attenuation;
|
||||||
}
|
}
|
||||||
else if(lights[i].type == 2){
|
else if(lights[i].type == 2){
|
||||||
lightDir = normalize(lights[i].pos - fragPos);
|
lightDir = normalize(lights[i].pos - fragPos);
|
||||||
|
|||||||
Reference in New Issue
Block a user