Fix lighting: Normalmatrix was never applied
This commit is contained in:
@@ -5,7 +5,7 @@ project(Fall-Fever)
|
|||||||
if(WIN32)
|
if(WIN32)
|
||||||
set(GLFW3_ROOT "${PROJECT_SOURCE_DIR}/glfw")
|
set(GLFW3_ROOT "${PROJECT_SOURCE_DIR}/glfw")
|
||||||
include_directories(${PROJECT_SOURCE_DIR}/glfw/include)
|
include_directories(${PROJECT_SOURCE_DIR}/glfw/include)
|
||||||
endif(WIN32)
|
endif()
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
||||||
|
|
||||||
@@ -23,6 +23,6 @@ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG")
|
|||||||
add_subdirectory(${PROJECT_SOURCE_DIR}/lib)
|
add_subdirectory(${PROJECT_SOURCE_DIR}/lib)
|
||||||
add_subdirectory(${PROJECT_SOURCE_DIR}/src)
|
add_subdirectory(${PROJECT_SOURCE_DIR}/src)
|
||||||
|
|
||||||
if(!WIN32)
|
if(NOT WIN32)
|
||||||
add_subdirectory(${PROJECT_SOURCE_DIR}/tools)
|
add_subdirectory(${PROJECT_SOURCE_DIR}/tools)
|
||||||
endif(!WIN32)
|
endif()
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Size=400,400
|
|||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
[Window][Object Modifier]
|
[Window][Object Modifier]
|
||||||
Pos=60,60
|
Pos=182,52
|
||||||
Size=925,127
|
Size=925,127
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
|
|||||||
@@ -7,4 +7,4 @@ target_include_directories(glad PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
|||||||
|
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
target_link_libraries(glad dl)
|
target_link_libraries(glad dl)
|
||||||
endif(UNIX)
|
endif()
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ struct Material {
|
|||||||
sampler2D texture_specular1;
|
sampler2D texture_specular1;
|
||||||
sampler2D texture_normal0;
|
sampler2D texture_normal0;
|
||||||
sampler2D texture_normal1;
|
sampler2D texture_normal1;
|
||||||
|
sampler2D texture_height0;
|
||||||
|
sampler2D texture_height1;
|
||||||
sampler2D texture_gloss0;
|
sampler2D texture_gloss0;
|
||||||
sampler2D texture_gloss1;
|
sampler2D texture_gloss1;
|
||||||
float shininess;
|
float shininess;
|
||||||
@@ -73,7 +75,7 @@ void main() {
|
|||||||
|
|
||||||
vec3 fragmentColor = vec3(0.0f);
|
vec3 fragmentColor = vec3(0.0f);
|
||||||
|
|
||||||
vec3 normal = normalize(v_normal);
|
vec3 normal = normalize(u_normalMatrix * v_normal);
|
||||||
vec3 viewDir = normalize(u_viewPosition - v_fragmentPosition);
|
vec3 viewDir = normalize(u_viewPosition - v_fragmentPosition);
|
||||||
|
|
||||||
fragmentColor += directionalLightContribution(u_directionalLight, normal, viewDir);
|
fragmentColor += directionalLightContribution(u_directionalLight, normal, viewDir);
|
||||||
|
|||||||
@@ -4,13 +4,8 @@ layout(location = 0) in vec3 a_position;
|
|||||||
layout(location = 1) in vec2 a_texCoord;
|
layout(location = 1) in vec2 a_texCoord;
|
||||||
layout(location = 2) in vec4 a_color;
|
layout(location = 2) in vec4 a_color;
|
||||||
|
|
||||||
out vec4 v_color;
|
|
||||||
out vec2 v_texCoord;
|
|
||||||
|
|
||||||
uniform mat4 u_modelViewProjMatrix;
|
uniform mat4 u_modelViewProjMatrix;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
gl_Position = u_modelViewProjMatrix * vec4(a_position, 1.0f);
|
gl_Position = u_modelViewProjMatrix * vec4(a_position, 1.0f);
|
||||||
v_texCoord = a_texCoord;
|
|
||||||
v_color = a_color;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,28 +82,26 @@ void Controller::run() {
|
|||||||
//Model model_plant("res/models/plant.ffo");
|
//Model model_plant("res/models/plant.ffo");
|
||||||
Model model_container("res/models/container.ffo");
|
Model model_container("res/models/container.ffo");
|
||||||
Model model_cube("res/models/cube.ffo");
|
Model model_cube("res/models/cube.ffo");
|
||||||
//Model model_dragon("res/models/dragon.ffo");
|
Model model_dragon("res/models/dragon.ffo");
|
||||||
Model model_hut("res/models/hut.ffo");
|
//Model model_hut("res/models/hut.ffo");
|
||||||
//Model model_sphere("res/models/sphere.ffo");
|
//Model model_sphere("res/models/sphere.ffo");
|
||||||
|
|
||||||
//Entity backpack(&model_backpack, &shaderProgram);
|
//Entity backpack(&model_backpack, &shaderProgram);
|
||||||
//Entity sphere(&model_sphere, &shaderProgram);
|
//Entity sphere(&model_sphere, &shaderProgram);
|
||||||
//Entity container(&model_container, &shaderProgram);
|
//Entity container(&model_container, &shaderProgram);
|
||||||
Entity hut(&model_hut, &shaderProgram);
|
//Entity hut(&model_hut, &shaderProgram);
|
||||||
//Entity dragon(&model_dragon, &shaderProgram);
|
Entity dragon(&model_dragon, &shaderProgram);
|
||||||
//Entity plant(&model_plant, &shaderProgram);
|
//Entity plant(&model_plant, &shaderProgram);
|
||||||
Entity lightSource(&model_cube, &lightProgram);
|
Entity lightSource(&model_cube, &lightProgram);
|
||||||
|
|
||||||
lightSource.translate(glm::vec3(-5.0f, 1.0f, 0.0f));
|
lightSource.translate(glm::vec3(-5.0f, 1.0f, 0.0f));
|
||||||
lightSource.setScale(0.2f);
|
lightSource.setScale(0.2f);
|
||||||
//plant.setScale(5.0f);
|
//plant.setScale(5.0f);
|
||||||
//dragon.setScale(0.2f);
|
dragon.setScale(0.2f);
|
||||||
|
|
||||||
World world(&shaderProgram);
|
World world(&shaderProgram);
|
||||||
world.addEntity(hut);
|
world.addEntity(dragon);
|
||||||
world.addEntity(lightSource);
|
world.addEntity(lightSource);
|
||||||
|
|
||||||
world.updatePointLight(0, true, lightSource.getPosition(), glm::vec3(1.0f));
|
|
||||||
|
|
||||||
camera->translate(glm::vec3(0.0f, 0.0f, 7.5f));
|
camera->translate(glm::vec3(0.0f, 0.0f, 7.5f));
|
||||||
|
|
||||||
@@ -114,6 +112,11 @@ void Controller::run() {
|
|||||||
|
|
||||||
// Update game
|
// Update game
|
||||||
// ...
|
// ...
|
||||||
|
//world.getEntities()->operator[](0).rotate(glm::vec3(0.f,1.0f,0.f), deltaTime*0.2);
|
||||||
|
float radius = 4.0;
|
||||||
|
glm::vec3 newPos = glm::vec3(cos(glfwGetTime()*0.2), 0.f, sin(glfwGetTime()*0.2)) * radius;
|
||||||
|
world.getEntities()->operator[](1).setPosition(newPos);
|
||||||
|
world.updatePointLight(0, true, world.getEntities()->operator[](1).getPosition(), glm::vec3(1.0f));
|
||||||
|
|
||||||
// Render and buffer swap
|
// Render and buffer swap
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
@@ -194,6 +197,7 @@ void Controller::renderImGui(std::vector<Entity> *entites) {
|
|||||||
static float color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
|
static float color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
|
|
||||||
entites->operator[](0).setPosition(glm::vec3(translation[0], 0.0f, translation[1]));
|
entites->operator[](0).setPosition(glm::vec3(translation[0], 0.0f, translation[1]));
|
||||||
|
entites->operator[](0).setRotation(glm::vec3(0.f,1.0f,0.f) * rotation);
|
||||||
//entity->setRotation()
|
//entity->setRotation()
|
||||||
|
|
||||||
// color picker
|
// color picker
|
||||||
|
|||||||
@@ -19,7 +19,8 @@ void Entity::draw(glm::mat4 viewProjMatrix, glm::vec3 viewPosition) {
|
|||||||
|
|
||||||
shaderProgram->setUniform("u_modelMatrix", modelMatrix);
|
shaderProgram->setUniform("u_modelMatrix", modelMatrix);
|
||||||
|
|
||||||
glm::mat3 normalMatrix = glm::mat3(glm::transpose(glm::inverse(modelMatrix)));
|
glm::mat3 normalMatrix = glm::mat3(modelMatrix);
|
||||||
|
normalMatrix = glm::transpose(glm::inverse(normalMatrix));
|
||||||
shaderProgram->setUniform("u_normalMatrix", normalMatrix);
|
shaderProgram->setUniform("u_normalMatrix", normalMatrix);
|
||||||
|
|
||||||
shaderProgram->setUniform("u_viewPosition", viewPosition);
|
shaderProgram->setUniform("u_viewPosition", viewPosition);
|
||||||
@@ -37,11 +38,7 @@ void Entity::translate(glm::vec3 vector) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Entity::rotate(glm::vec3 axis, float radians) {
|
void Entity::rotate(glm::vec3 axis, float radians) {
|
||||||
glm::mat4 rotationMatrix(1.0f);
|
orientation += axis * radians;
|
||||||
rotationMatrix = glm::rotate(rotationMatrix, radians, axis);
|
|
||||||
|
|
||||||
// Rotate orientation vector
|
|
||||||
orientation = glm::normalize(glm::vec3(rotationMatrix * glm::vec4(orientation, 1.0)));
|
|
||||||
updateModelMatrix();
|
updateModelMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,6 +47,11 @@ void Entity::setPosition(glm::vec3 position) {
|
|||||||
updateModelMatrix();
|
updateModelMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Entity::setRotation(glm::vec3 orientation) {
|
||||||
|
this->orientation = orientation;
|
||||||
|
updateModelMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
void Entity::setScale(float scaleFactor) {
|
void Entity::setScale(float scaleFactor) {
|
||||||
modelScale = scaleFactor;
|
modelScale = scaleFactor;
|
||||||
updateModelMatrix();
|
updateModelMatrix();
|
||||||
@@ -66,8 +68,9 @@ void Entity::updateModelMatrix() {
|
|||||||
newModelMatrix = glm::translate(newModelMatrix, position);
|
newModelMatrix = glm::translate(newModelMatrix, position);
|
||||||
|
|
||||||
// Rotate
|
// Rotate
|
||||||
glm::vec3 const up(0.0f, 0.0f, 1.0f);
|
newModelMatrix = glm::rotate(newModelMatrix, orientation.x, glm::vec3(1.f, 0.f, 0.f));
|
||||||
//newModelMatrix = glm::rotate(newModelMatrix, , )
|
newModelMatrix = glm::rotate(newModelMatrix, orientation.y, glm::vec3(0.f, 1.f, 0.f));
|
||||||
|
newModelMatrix = glm::rotate(newModelMatrix, orientation.z, glm::vec3(0.f, 0.f, 1.f));
|
||||||
|
|
||||||
// Scale
|
// Scale
|
||||||
newModelMatrix = glm::scale(newModelMatrix, glm::vec3(modelScale, modelScale, modelScale));
|
newModelMatrix = glm::scale(newModelMatrix, glm::vec3(modelScale, modelScale, modelScale));
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public:
|
|||||||
void rotate(glm::vec3 axis, float radians);
|
void rotate(glm::vec3 axis, float radians);
|
||||||
|
|
||||||
void setPosition(glm::vec3 position);
|
void setPosition(glm::vec3 position);
|
||||||
void setOrientiation(glm::vec3 orientation);
|
void setRotation(glm::vec3 orientation);
|
||||||
void setScale(float scaleFactor);
|
void setScale(float scaleFactor);
|
||||||
|
|
||||||
void setId(uint32_t id) { this->id = id; }
|
void setId(uint32_t id) { this->id = id; }
|
||||||
|
|||||||
@@ -54,11 +54,14 @@ void Texture::bind(uint8_t textureUnit, ShaderProgram* shaderProgram, uint8_t te
|
|||||||
case texture_specular:
|
case texture_specular:
|
||||||
uniformName += "specular" + std::to_string(textureTypeNum);
|
uniformName += "specular" + std::to_string(textureTypeNum);
|
||||||
break;
|
break;
|
||||||
|
case texture_normal:
|
||||||
|
uniformName += "normal" + std::to_string(textureTypeNum);
|
||||||
|
break;
|
||||||
case texture_height:
|
case texture_height:
|
||||||
uniformName += "height" + std::to_string(textureTypeNum);
|
uniformName += "height" + std::to_string(textureTypeNum);
|
||||||
break;
|
break;
|
||||||
case texture_normal:
|
case texture_gloss:
|
||||||
uniformName += "normal" + std::to_string(textureTypeNum);
|
uniformName += "gloss" + std::to_string(textureTypeNum);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,14 @@
|
|||||||
#define INIT_WINDOW_WIDTH 960
|
#define INIT_WINDOW_WIDTH 960
|
||||||
#define INIT_WINDOW_HEIGHT 720
|
#define INIT_WINDOW_HEIGHT 720
|
||||||
|
|
||||||
enum textureType{texture_diffuse, texture_specular, texture_normal, texture_height, TEXTURE_TYPE_NUM_ITEMS};
|
enum textureType{
|
||||||
|
texture_diffuse,
|
||||||
|
texture_specular,
|
||||||
|
texture_normal,
|
||||||
|
texture_height,
|
||||||
|
texture_gloss,
|
||||||
|
TEXTURE_TYPE_NUM_ITEMS
|
||||||
|
};
|
||||||
|
|
||||||
struct Vertex {
|
struct Vertex {
|
||||||
// Postition
|
// Postition
|
||||||
|
|||||||
Reference in New Issue
Block a user