diff --git a/res/shaders/texture.frag b/res/shaders/texture.frag index 0d2d5dc..a2995c5 100644 --- a/res/shaders/texture.frag +++ b/res/shaders/texture.frag @@ -1,12 +1,10 @@ #version 430 core -in layout(location = 0) vec3 normal; in layout(location = 1) vec2 textureCoordinates; -in layout(location = 2) vec3 worldPosition; out vec4 fragColor; void main() { - fragColor = vec4(1.0); + fragColor = vec4(1.0, 0.0, 0.0, 1.0); } diff --git a/res/shaders/texture.vert b/res/shaders/texture.vert new file mode 100644 index 0000000..ad121ef --- /dev/null +++ b/res/shaders/texture.vert @@ -0,0 +1,14 @@ +#version 430 core + +in layout(location = 0) vec2 position; +in layout(location = 2) vec2 textureCoordinates_in; + +out layout(location = 1) vec2 textureCoordinates; + +uniform mat4 orthoMatrix; + +void main() +{ + gl_Position = vec4(position, 0.0, 1.0); + textureCoordinates = textureCoordinates_in; +} diff --git a/src/gamelogic.cpp b/src/gamelogic.cpp index 9da8bc2..e7e909a 100644 --- a/src/gamelogic.cpp +++ b/src/gamelogic.cpp @@ -119,18 +119,6 @@ void initGame(GLFWwindow* window, CommandLineOptions gameOptions) { shader = new Gloom::Shader(); shader->makeBasicShader("../res/shaders/simple.vert", "../res/shaders/simple.frag"); - std::cout << "loading textures..." << std::endl; - - textureShader = new Gloom::Shader(); - textureShader->makeBasicShader("../res/shaders/simple.vert", "../res/shaders/texture.frag"); - - auto img = loadPNGFile("../res/textures/charmap.png"); - auto tid = createTextureFromImage(&img); - auto mesh = generateTextGeometryBuffer("hello world", 39.0 / 29.0, 120.0); - generateBuffer(mesh); - - std::cout << "loaded textures" << std::endl; - Mesh padMesh = cube(padDimensions, glm::vec2(30, 40), true); Mesh boxMesh = cube(boxDimensions, glm::vec2(90), true, true); // inverted for interior view Mesh ballMesh = generateSphere(1.0, 40, 40); @@ -144,10 +132,6 @@ void initGame(GLFWwindow* window, CommandLineOptions gameOptions) { padNode = createSceneNode(); ballNode = createSceneNode(); - textureNode = createSceneNode(); - addChild(rootNode, textureNode); - textureNode->position = {0.0, 0.0, 0.0}; - rootNode->children.push_back(boxNode); rootNode->children.push_back(padNode); rootNode->children.push_back(ballNode); @@ -173,13 +157,31 @@ void initGame(GLFWwindow* window, CommandLineOptions gameOptions) { auto* ballLight = lightNodes[2]; boxNode->children.push_back(ceilingLight); - ceilingLight->position = { 0, 0, 5 }; + ceilingLight->position = { 0, 10, 0 }; - boxNode->children.push_back(padLight); - padLight->position = { -10, 0, 5 }; + padNode->children.push_back(padLight); + padLight->position = { 0, 10, 0 }; - boxNode->children.push_back(ballLight); - ballLight->position = { 10, 0, 5 }; + ballNode->children.push_back(ballLight); + ballLight->position = { 0, 0, 0 }; + + std::cout << "loading textures..." << std::endl; + + textureShader = new Gloom::Shader(); + textureShader->makeBasicShader("../res/shaders/texture.vert", "../res/shaders/texture.frag"); + textureNode = createSceneNode(); + + auto img = loadPNGFile("../res/textures/charmap.png"); + textureNode->textureID = createTextureFromImage(&img); + auto textureMesh = generateTextGeometryBuffer("hello world", 39.0 / 29, 0.4); + textureNode->vertexArrayObjectID = generateBuffer(textureMesh); + textureNode->VAOIndexCount = textureMesh.indices.size(); + textureNode->nodeType = FLAT_GEOMETRY; + + rootNode->children.push_back(textureNode); + textureNode->position = {0, 0, 0}; + + std::cout << "loaded textures" << std::endl; getTimeDeltaSeconds(); // prime the timer @@ -332,56 +334,64 @@ void updateFrame(GLFWwindow* window) { } void updateNodeTransformations(SceneNode* node, glm::mat4 vpSoFar, glm::mat4 modelSoFar) { - glm::mat4 local = glm::translate(node->position) - * glm::translate(node->referencePoint) - * glm::rotate(node->rotation.y, glm::vec3(0,1,0)) - * glm::rotate(node->rotation.x, glm::vec3(1,0,0)) - * glm::rotate(node->rotation.z, glm::vec3(0,0,1)) - * glm::scale(node->scale) - * glm::translate(-node->referencePoint); + if (node->nodeType != FLAT_GEOMETRY) { + glm::mat4 local = glm::translate(node->position) + * glm::translate(node->referencePoint) + * glm::rotate(node->rotation.y, glm::vec3(0,1,0)) + * glm::rotate(node->rotation.x, glm::vec3(1,0,0)) + * glm::rotate(node->rotation.z, glm::vec3(0,0,1)) + * glm::scale(node->scale) + * glm::translate(-node->referencePoint); - node->currentTransformationMatrix = vpSoFar * local; // MVP - node->modelMatrix = modelSoFar * local; // world transform - node->normalMatrix = glm::transpose(glm::inverse(glm::mat3(node->modelMatrix))); + node->currentTransformationMatrix = vpSoFar * local; // MVP + node->modelMatrix = modelSoFar * local; // world transform + node->normalMatrix = glm::transpose(glm::inverse(glm::mat3(node->modelMatrix))); - if (node->nodeType == POINT_LIGHT) { - node->worldPosition = glm::vec3(node->modelMatrix * glm::vec4(0, 0, 0, 1)); + if (node->nodeType == POINT_LIGHT) { + node->worldPosition = glm::vec3(node->modelMatrix * glm::vec4(0, 0, 0, 1)); + } } - for (auto* child : node->children) { updateNodeTransformations(child, node->currentTransformationMatrix, node->modelMatrix); } } void renderNode(SceneNode* node) { - glUniformMatrix4fv(3, 1, GL_FALSE, glm::value_ptr(node->currentTransformationMatrix)); - glUniformMatrix4fv(4, 1, GL_FALSE, glm::value_ptr(node->modelMatrix)); - glUniformMatrix3fv(5, 1, GL_FALSE, glm::value_ptr(node->normalMatrix)); + if (node->nodeType != FLAT_GEOMETRY) { + glUniformMatrix4fv(3, 1, GL_FALSE, glm::value_ptr(node->currentTransformationMatrix)); + glUniformMatrix4fv(4, 1, GL_FALSE, glm::value_ptr(node->modelMatrix)); + glUniformMatrix3fv(5, 1, GL_FALSE, glm::value_ptr(node->normalMatrix)); - glUniform3fv(shader->getUniformFromName("cameraPosition"), 1, glm::value_ptr(cameraPosition)); - glUniform3fv(shader->getUniformFromName("ballPosition"), 1, glm::value_ptr(ballPosition)); + glUniform3fv(shader->getUniformFromName("cameraPosition"), 1, glm::value_ptr(cameraPosition)); + glUniform3fv(shader->getUniformFromName("ballPosition"), 1, glm::value_ptr(ballPosition)); - for (size_t i = 0; i < lights.size(); i++) { - std::string base = "lights[" + std::to_string(i) + "]"; - glUniform3fv(shader->getUniformFromName((base + ".position").c_str()), 1, glm::value_ptr(lights[i].position)); - glUniform3fv(shader->getUniformFromName((base + ".color").c_str()), 1, glm::value_ptr(lights[i].color)); + for (size_t i = 0; i < lights.size(); i++) { + std::string base = "lights[" + std::to_string(i) + "]"; + glUniform3fv(shader->getUniformFromName((base + ".position").c_str()), 1, glm::value_ptr(lights[i].position)); + glUniform3fv(shader->getUniformFromName((base + ".color").c_str()), 1, glm::value_ptr(lights[i].color)); + } + + if (node->nodeType == GEOMETRY && node->vertexArrayObjectID != -1) { + glBindVertexArray(node->vertexArrayObjectID); + glDrawElements(GL_TRIANGLES, node->VAOIndexCount, GL_UNSIGNED_INT, nullptr); + } } - - if (node->nodeType == GEOMETRY && node->vertexArrayObjectID != -1) { - glBindVertexArray(node->vertexArrayObjectID); - glDrawElements(GL_TRIANGLES, node->VAOIndexCount, GL_UNSIGNED_INT, nullptr); - } - for (auto* child : node->children) { renderNode(child); } } -void renderTexture(SceneNode *node) { - glUniformMatrix4fv(3, 1, GL_FALSE, glm::value_ptr(node->currentTransformationMatrix)); - glUniformMatrix4fv(4, 1, GL_FALSE, glm::value_ptr(node->modelMatrix)); - glUniformMatrix3fv(5, 1, GL_FALSE, glm::value_ptr(node->normalMatrix)); - +void renderTexture(SceneNode *node, glm::mat4 orthoMatrix) { + GLint orthoLoc = textureShader->getUniformFromName("orthoMatrix"); + glUniformMatrix4fv(orthoLoc, 1, GL_FALSE, glm::value_ptr(orthoMatrix)); + if (node->nodeType == FLAT_GEOMETRY) { + glBindTexture(GL_TEXTURE_2D, node->textureID); + glBindVertexArray(node->vertexArrayObjectID); + glDrawElements(GL_TRIANGLES, node->VAOIndexCount, GL_UNSIGNED_INT, nullptr); + } + for (auto* child : node->children) { + renderTexture(child, orthoMatrix); + } } void renderFrame(GLFWwindow* window) { @@ -389,11 +399,11 @@ void renderFrame(GLFWwindow* window) { glfwGetWindowSize(window, &w, &h); glViewport(0, 0, w, h); + glm::mat4 orthoMatrix = glm::ortho(0.0f, static_cast(w), 0.0f, static_cast(h), -1.0f, 1.0f); + shader->activate(); renderNode(rootNode); - shader->deactivate(); textureShader->activate(); - renderTexture(textureNode); - textureShader->deactivate(); + renderTexture(rootNode, orthoMatrix); } diff --git a/src/utilities/glfont.cpp b/src/utilities/glfont.cpp index 61a21a1..98c4246 100644 --- a/src/utilities/glfont.cpp +++ b/src/utilities/glfont.cpp @@ -1,4 +1,5 @@ #include +#include #include "glfont.h" Mesh generateTextGeometryBuffer(std::string text, float characterHeightOverWidth, float totalTextWidth) { @@ -7,7 +8,7 @@ Mesh generateTextGeometryBuffer(std::string text, float characterHeightOverWidth unsigned int vertexCount = 4 * text.length(); unsigned int indexCount = 6 * text.length(); - unsigned int texCoordCount = characterWidth * characterHeight * text.length(); + unsigned int texCoordCount = 4 * text.length(); Mesh mesh; @@ -35,11 +36,11 @@ Mesh generateTextGeometryBuffer(std::string text, float characterHeightOverWidth mesh.indices.at(6 * i + 4) = 4 * i + 2; mesh.indices.at(6 * i + 5) = 4 * i + 3; - for (int v = 0; v < characterWidth; v++) { - for (int u = 0; u < characterHeight; u++) { - mesh.textureCoordinates.at(i * (v * characterWidth + u)) = {u / characterWidth, v / characterHeight}; - } - } + auto u = (int)text.at(i) / 128.0f; + mesh.textureCoordinates[4*i + 0] = {u, 0}; + mesh.textureCoordinates[4*i + 1] = {u + 1/128.0f, 0}; + mesh.textureCoordinates[4*i + 2] = {u + 1/128.0f, characterHeight/128.0f}; + mesh.textureCoordinates[4*i + 3] = {u, characterHeight/128.0f}; } return mesh;