From 9158de2f39b9a947c2cd4226b373153ffc8b995f Mon Sep 17 00:00:00 2001 From: "Grayson Riffe (Desktop)" Date: Mon, 6 Sep 2021 01:06:47 -0500 Subject: [PATCH] Added Cubemap --- DevScreenshots/8. Cubemap.png | Bin 0 -> 101394 bytes Game/src/MainState.cpp | 1 - .../base/shaders/cubemapFragment.shader | 16 +++ .../base/shaders/cubemapVertex.shader | 15 ++ NothinFancy/NothinFancy.vcxproj | 2 + NothinFancy/NothinFancy.vcxproj.filters | 6 + NothinFancy/src/Assets.cpp | 62 +++++++++ NothinFancy/src/Renderer/Camera.cpp | 9 +- NothinFancy/src/Renderer/Drawable/Cubemap.cpp | 129 ++++++++++++++++++ NothinFancy/src/Renderer/Drawable/Entity.cpp | 6 + .../src/Renderer/Drawable/UIElement.cpp | 1 + .../src/Renderer/Drawable/UITexture.cpp | 7 +- NothinFancy/src/Renderer/Renderer.cpp | 27 +++- NothinFancy/src/Renderer/Shader.cpp | 4 + NothinFancy/src/Renderer/Texture.cpp | 2 +- NothinFancy/src/include/Assets.h | 20 ++- NothinFancy/src/include/Camera.h | 2 +- NothinFancy/src/include/Cubemap.h | 20 +++ NothinFancy/src/include/Entity.h | 2 + NothinFancy/src/include/NothinFancy.h | 4 + NothinFancy/src/include/Renderer.h | 4 + NothinFancy/src/include/UITexture.h | 2 +- 22 files changed, 325 insertions(+), 16 deletions(-) create mode 100644 DevScreenshots/8. Cubemap.png create mode 100644 NFPackCreator/AssetBuild/base/shaders/cubemapFragment.shader create mode 100644 NFPackCreator/AssetBuild/base/shaders/cubemapVertex.shader create mode 100644 NothinFancy/src/Renderer/Drawable/Cubemap.cpp create mode 100644 NothinFancy/src/include/Cubemap.h diff --git a/DevScreenshots/8. Cubemap.png b/DevScreenshots/8. Cubemap.png new file mode 100644 index 0000000000000000000000000000000000000000..ea823d936fbc8ee419b5f85954ffc722f0c7200a GIT binary patch literal 101394 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 0.99 || texCoord.y < -0.99) { + tc = vec3(texCoord.x, texCoord.y, texCoord.z); + } + color = texture(cm, tc); +} diff --git a/NFPackCreator/AssetBuild/base/shaders/cubemapVertex.shader b/NFPackCreator/AssetBuild/base/shaders/cubemapVertex.shader new file mode 100644 index 0000000..2fb68e1 --- /dev/null +++ b/NFPackCreator/AssetBuild/base/shaders/cubemapVertex.shader @@ -0,0 +1,15 @@ +#version 330 core + +layout(location = 0) in vec3 pos; + +uniform mat4 view; +uniform mat4 proj; + +out vec3 texCoord; + +void main() { + texCoord = pos; + + vec4 vertexPos = proj * view * vec4(pos, 1.0); + gl_Position = vertexPos.xyww; +} \ No newline at end of file diff --git a/NothinFancy/NothinFancy.vcxproj b/NothinFancy/NothinFancy.vcxproj index 31e9c3f..7585a7b 100644 --- a/NothinFancy/NothinFancy.vcxproj +++ b/NothinFancy/NothinFancy.vcxproj @@ -200,6 +200,7 @@ + @@ -218,6 +219,7 @@ + diff --git a/NothinFancy/NothinFancy.vcxproj.filters b/NothinFancy/NothinFancy.vcxproj.filters index 20f3352..c80a66a 100644 --- a/NothinFancy/NothinFancy.vcxproj.filters +++ b/NothinFancy/NothinFancy.vcxproj.filters @@ -72,6 +72,9 @@ Source Files + + Source Files + @@ -140,6 +143,9 @@ Header Files + + Header Files + diff --git a/NothinFancy/src/Assets.cpp b/NothinFancy/src/Assets.cpp index 3a77c9e..778164c 100644 --- a/NothinFancy/src/Assets.cpp +++ b/NothinFancy/src/Assets.cpp @@ -16,6 +16,15 @@ namespace nf { } + ACubemap::~ACubemap() { + delete[] frontData; + delete[] backData; + delete[] topData; + delete[] bottomData; + delete[] leftData; + delete[] rightData; + } + AShader::~AShader() { } @@ -31,6 +40,7 @@ namespace nf { void AssetPack::load(const char* packName) { std::string path = "assets/" + (std::string)packName; std::string packContents = readFile(path); + unsigned int cubemapCount = 0; while (packContents.size()) { unsigned int startingPos = packContents.find_first_of("#NFASSET ") + 9; packContents = packContents.substr(9); @@ -62,6 +72,56 @@ namespace nf { continue; } if (extension == "png") { + if (assetName.find("_cmfront") != std::string::npos || assetName.find("_cmback") != std::string::npos || assetName.find("_cmtop") != std::string::npos || assetName.find("_cmbottom") != std::string::npos || assetName.find("_cmleft") != std::string::npos || assetName.find("_cmright") != std::string::npos) { + static std::unordered_map cubemaps; + std::string cmName = assetName.substr(0, assetName.find('_')); + ACubemap* curr; + if (cubemaps.find(cmName) == cubemaps.end()) { + cubemaps[cmName] = new ACubemap; + cubemaps[cmName]->numImages = 0; + } + curr = cubemaps[cmName]; + if (curr->numImages == 6) + Error("Duplicate cubemap images in pack \"" + (std::string)packName + (std::string)"\"!"); + if (assetName.find("_cmfront") != std::string::npos) { + curr->frontData = new char[assetSize]; + std::memcpy(curr->frontData, &assetContents[0], assetSize); + curr->frontSize = assetSize; + } + if (assetName.find("_cmback") != std::string::npos) { + curr->backData = new char[assetSize]; + std::memcpy(curr->backData, &assetContents[0], assetSize); + curr->backSize = assetSize; + } + if (assetName.find("_cmtop") != std::string::npos) { + curr->topData = new char[assetSize]; + std::memcpy(curr->topData, &assetContents[0], assetSize); + curr->topSize = assetSize; + } + if (assetName.find("_cmbottom") != std::string::npos) { + curr->bottomData = new char[assetSize]; + std::memcpy(curr->bottomData, &assetContents[0], assetSize); + curr->bottomSize = assetSize; + } + if (assetName.find("_cmleft") != std::string::npos) { + curr->leftData = new char[assetSize]; + std::memcpy(curr->leftData, &assetContents[0], assetSize); + curr->leftSize = assetSize; + } + if (assetName.find("_cmright") != std::string::npos) { + curr->rightData = new char[assetSize]; + std::memcpy(curr->rightData, &assetContents[0], assetSize); + curr->rightSize = assetSize; + } + curr->numImages++; + + if (curr->numImages == 6) { + m_assets[cmName] = curr; + } + + cubemapCount++; + continue; + } ATexture* texture = new ATexture; texture->data = new char[assetSize]; std::memcpy(texture->data, &assetContents[0], assetSize); @@ -87,6 +147,8 @@ namespace nf { } Error("Invalid asset extention in pack \"" + (std::string)packName + (std::string)"\"!"); } + if (cubemapCount % 6 != 0) + Error("Could not find full cubemap in pack \"" + (std::string)packName + (std::string)"\"!") } Asset* AssetPack::operator[](const char* in) { diff --git a/NothinFancy/src/Renderer/Camera.cpp b/NothinFancy/src/Renderer/Camera.cpp index 4181953..5f0c483 100644 --- a/NothinFancy/src/Renderer/Camera.cpp +++ b/NothinFancy/src/Renderer/Camera.cpp @@ -71,7 +71,7 @@ namespace nf { return m_front; } - void Camera::bind(Shader* shader) { + void Camera::bind(Shader* entityShader, Shader* cubemapShader) { glm::mat4 view; switch (m_type) { @@ -112,8 +112,11 @@ namespace nf { } } glm::vec3 pos(m_position.x, m_position.y, m_position.z); - shader->setUniform("camera.pos", pos); - shader->setUniform("view", view); + entityShader->setUniform("camera.pos", pos); + entityShader->setUniform("view", view); + + glm::mat4 cubemapView = glm::mat4(glm::mat3(view)); + cubemapShader->setUniform("view", cubemapView); } Camera::~Camera() { diff --git a/NothinFancy/src/Renderer/Drawable/Cubemap.cpp b/NothinFancy/src/Renderer/Drawable/Cubemap.cpp new file mode 100644 index 0000000..36d4757 --- /dev/null +++ b/NothinFancy/src/Renderer/Drawable/Cubemap.cpp @@ -0,0 +1,129 @@ +#include "Cubemap.h" + +#include +#include "GL/glew.h" +#include "stb_image.h" + +#include "Assets.h" + +namespace nf { + Cubemap::Cubemap() : + m_constructed(false), + m_id(0) + { + + } + + void Cubemap::create(Asset* cubemapAsset) { + m_constructed = true; + ACubemap& cm = *(ACubemap*)cubemapAsset; + glGenTextures(1, &m_id); + glBindTexture(GL_TEXTURE_CUBE_MAP, m_id); + struct CMFace { + CMFace(unsigned char* d, unsigned int w, unsigned int h, unsigned int nc) : + data(d), + width(w), + height(h), + nChannels(nc) + { + + } + unsigned char* data; + unsigned int width; + unsigned int height; + unsigned int nChannels; + }; + std::vector faces; + int tempWidth, tempHeight, tempNChannels; + unsigned char* tempData; + stbi_set_flip_vertically_on_load(false); + tempData = stbi_load_from_memory((unsigned char*)cm.leftData, cm.leftSize, &tempWidth, &tempHeight, &tempNChannels, 0); + faces.emplace_back(tempData, tempWidth, tempHeight, tempNChannels); + tempData = stbi_load_from_memory((unsigned char*)cm.rightData, cm.rightSize, &tempWidth, &tempHeight, &tempNChannels, 0); + faces.emplace_back(tempData, tempWidth, tempHeight, tempNChannels); + stbi_set_flip_vertically_on_load(true); + tempData = stbi_load_from_memory((unsigned char*)cm.topData, cm.topSize, &tempWidth, &tempHeight, &tempNChannels, 0); + faces.emplace_back(tempData, tempWidth, tempHeight, tempNChannels); + tempData = stbi_load_from_memory((unsigned char*)cm.bottomData, cm.bottomSize, &tempWidth, &tempHeight, &tempNChannels, 0); + faces.emplace_back(tempData, tempWidth, tempHeight, tempNChannels); + stbi_set_flip_vertically_on_load(false); + tempData = stbi_load_from_memory((unsigned char*)cm.backData, cm.backSize, &tempWidth, &tempHeight, &tempNChannels, 0); + faces.emplace_back(tempData, tempWidth, tempHeight, tempNChannels); + tempData = stbi_load_from_memory((unsigned char*)cm.frontData, cm.frontSize, &tempWidth, &tempHeight, &tempNChannels, 0); + faces.emplace_back(tempData, tempWidth, tempHeight, tempNChannels); + for (unsigned int i = 0; i < faces.size(); i++) { + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGBA, faces[i].width, faces[i].height, 0, faces[i].nChannels == 3 ? GL_RGB : GL_RGBA, GL_UNSIGNED_BYTE, faces[i].data); + stbi_image_free(faces[i].data); + } + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + + float vb[] = { + -1.0f, 1.0f, -1.0f, + -1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + 1.0f, 1.0f, -1.0f, + -1.0f, 1.0f, -1.0f, + + -1.0f, -1.0f, 1.0f, + -1.0f, -1.0f, -1.0f, + -1.0f, 1.0f, -1.0f, + -1.0f, 1.0f, -1.0f, + -1.0f, 1.0f, 1.0f, + -1.0f, -1.0f, 1.0f, + + 1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + + -1.0f, -1.0f, 1.0f, + -1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, -1.0f, 1.0f, + -1.0f, -1.0f, 1.0f, + + -1.0f, 1.0f, -1.0f, + 1.0f, 1.0f, -1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + -1.0f, 1.0f, 1.0f, + -1.0f, 1.0f, -1.0f, + + -1.0f, -1.0f, -1.0f, + -1.0f, -1.0f, 1.0f, + 1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + -1.0f, -1.0f, 1.0f, + 1.0f, -1.0f, 1.0f + }; + m_vao = new VertexArray; + m_vao->addBuffer(vb, sizeof(vb)); + m_vao->push(3); + m_vao->finishBufferLayout(); + } + + bool Cubemap::isConstructed() { + return m_constructed; + } + + void Cubemap::render() { + m_vao->bind(); + glBindTexture(GL_TEXTURE_CUBE_MAP, m_id); + glDepthFunc(GL_LEQUAL); + glDrawArrays(GL_TRIANGLES, 0, 36); + glDepthFunc(GL_LESS); + } + + Cubemap::~Cubemap() { + if(m_constructed) + glDeleteTextures(1, &m_id); + } +} \ No newline at end of file diff --git a/NothinFancy/src/Renderer/Drawable/Entity.cpp b/NothinFancy/src/Renderer/Drawable/Entity.cpp index 8cca00b..9ffe35c 100644 --- a/NothinFancy/src/Renderer/Drawable/Entity.cpp +++ b/NothinFancy/src/Renderer/Drawable/Entity.cpp @@ -6,6 +6,7 @@ namespace nf { Entity::Entity() : + m_constructed(false), m_model(nullptr), m_position(0.0), m_rotation(0.0), @@ -15,6 +16,7 @@ namespace nf { } void Entity::create(Asset* modelAsset, Asset* textureAsset) { + m_constructed = true; AModel& model = *(AModel*)modelAsset; if (model.alreadyLoaded && textureAsset == nullptr) { m_model = model.loadedModel; @@ -36,6 +38,10 @@ namespace nf { model.loadedModel = m_model; } + bool Entity::isConstructed() { + return m_constructed; + } + void Entity::setPosition(double x, double y, double z) { m_position = { x, y, z }; } diff --git a/NothinFancy/src/Renderer/Drawable/UIElement.cpp b/NothinFancy/src/Renderer/Drawable/UIElement.cpp index 945bf2e..c94a49d 100644 --- a/NothinFancy/src/Renderer/Drawable/UIElement.cpp +++ b/NothinFancy/src/Renderer/Drawable/UIElement.cpp @@ -2,6 +2,7 @@ namespace nf { UIElement::UIElement() : + m_constructed(false), m_centeredX(false), m_centeredY(false) { diff --git a/NothinFancy/src/Renderer/Drawable/UITexture.cpp b/NothinFancy/src/Renderer/Drawable/UITexture.cpp index a32ccf6..dc6f5a5 100644 --- a/NothinFancy/src/Renderer/Drawable/UITexture.cpp +++ b/NothinFancy/src/Renderer/Drawable/UITexture.cpp @@ -7,14 +7,15 @@ namespace nf { UITexture::UITexture() : - m_texture(0) + m_texture(nullptr), + m_scale(1.0f) { } - void UITexture::create(Asset* texture, const Vec2& position, double scale) { + void UITexture::create(Asset* textureAsset, const Vec2& position, double scale) { m_constructed = true; - ATexture* tex = (ATexture*)texture; + ATexture* tex = (ATexture*)textureAsset; m_position = position; m_scale = (float)scale; if (tex->alreadyLoaded) { diff --git a/NothinFancy/src/Renderer/Renderer.cpp b/NothinFancy/src/Renderer/Renderer.cpp index b3c7617..060dfea 100644 --- a/NothinFancy/src/Renderer/Renderer.cpp +++ b/NothinFancy/src/Renderer/Renderer.cpp @@ -8,12 +8,15 @@ #include "Shader.h" #include "Light.h" #include "Entity.h" +#include "Cubemap.h" #include "UIElement.h" #include "Camera.h" #include "Utility.h" namespace nf { - Renderer::Renderer(Application* app) { + Renderer::Renderer(Application* app) : + m_cubemap(nullptr) + { m_app = app; m_hdc = GetDC(m_app->getWindow()); PIXELFORMATDESCRIPTOR pfd = { @@ -69,6 +72,9 @@ namespace nf { const char* uiTextureVertex = m_baseAP["uiTextureVertex.shader"]->data; const char* uiTextureFragment = m_baseAP["uiTextureFragment.shader"]->data; m_uiTextureShader = new Shader(uiTextureVertex, uiTextureFragment); + const char* cubemapVertex = m_baseAP["cubemapVertex.shader"]->data; + const char* cubemapFragment = m_baseAP["cubemapFragment.shader"]->data; + m_cubemapShader = new Shader(cubemapVertex, cubemapFragment); BaseAssets::cube = (AModel*)m_baseAP["cube.obj"]; BaseAssets::plane = (AModel*)m_baseAP["plane.obj"]; @@ -80,7 +86,7 @@ namespace nf { } void Renderer::render(Entity& in) { - if (in.getModel() == nullptr) + if (in.isConstructed() == false) Error("Tried to render Entity before being created!"); m_lGame.push_back(&in); //TODO: Sort transparent objects by distance; Farthest first @@ -95,10 +101,17 @@ namespace nf { Error("Tried to render a light before being created!"); m_lights.push_back(&in); } + void Renderer::render(Cubemap& in) { + if (in.isConstructed() == false) + Error("Tried to render a cubemap before being created!"); + m_cubemap = ∈ + } void Renderer::doFrame(Camera* camera) { + //Begin frame glViewport(0, 0, m_app->getConfig().width, m_app->getConfig().height); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + camera->bind(m_entityShader, m_cubemapShader); //Draw Entities (3D models) glm::mat4 proj = glm::perspective(glm::radians(45.0f), (float)m_app->getConfig().width / (float)m_app->getConfig().height, 0.1f, 100000.0f); @@ -107,7 +120,6 @@ namespace nf { for (Entity* draw : m_lGame) { Entity& curr = *draw; curr.bind(m_entityShader); - camera->bind(m_entityShader); //TODO: Clean this up a bit m_entityShader->setUniform("numberOfLights", (int)m_lights.size() + 1); for (unsigned int i = 0; i < m_lights.size(); i++) { @@ -120,19 +132,24 @@ namespace nf { m_lGame.clear(); m_lights.clear(); + //Draw cubemap where there isn't anything else + if (m_cubemap != nullptr) { + m_cubemapShader->setUniform("proj", proj); + m_cubemap->render(); + } + m_cubemap = nullptr; + //Draw UI elements glDisable(GL_DEPTH_TEST); proj = glm::ortho(0.0f, (float)m_app->getConfig().width, 0.0f, (float)m_app->getConfig().height); for (UIElement* draw : m_lUI) { UIElement& curr = *draw; if (curr.identity() == "text") { - m_textShader->bind(); m_textShader->setUniform("proj", proj); curr.render(m_textShader, m_app->getConfig().width, m_app->getConfig().height); continue; } if (curr.identity() == "texture") { - m_uiTextureShader->bind(); m_uiTextureShader->setUniform("proj", proj); curr.render(m_uiTextureShader, m_app->getConfig().width, m_app->getConfig().height); } diff --git a/NothinFancy/src/Renderer/Shader.cpp b/NothinFancy/src/Renderer/Shader.cpp index 9932261..839ca51 100644 --- a/NothinFancy/src/Renderer/Shader.cpp +++ b/NothinFancy/src/Renderer/Shader.cpp @@ -48,21 +48,25 @@ namespace nf { } void Shader::setUniform(const std::string& name, glm::mat4& data) { + bind(); if (m_uniformLocations.find(name) == m_uniformLocations.end()) getUniformLocation(name); glUniformMatrix4fv(m_uniformLocations[name], 1, GL_FALSE, glm::value_ptr(data)); } void Shader::setUniform(const std::string& name, glm::vec3& data) { + bind(); if (m_uniformLocations.find(name) == m_uniformLocations.end()) getUniformLocation(name); glUniform3fv(m_uniformLocations[name], 1, glm::value_ptr(data)); } void Shader::setUniform(const std::string& name, int data) { + bind(); if (m_uniformLocations.find(name) == m_uniformLocations.end()) getUniformLocation(name); glUniform1i(m_uniformLocations[name], data); } void Shader::setUniform(const std::string& name, float data) { + bind(); if (m_uniformLocations.find(name) == m_uniformLocations.end()) getUniformLocation(name); glUniform1f(m_uniformLocations[name], data); diff --git a/NothinFancy/src/Renderer/Texture.cpp b/NothinFancy/src/Renderer/Texture.cpp index 911ac4d..331981e 100644 --- a/NothinFancy/src/Renderer/Texture.cpp +++ b/NothinFancy/src/Renderer/Texture.cpp @@ -20,7 +20,7 @@ namespace nf { glBindTexture(GL_TEXTURE_2D, m_id); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, nChannels == 3 ? GL_RGB : GL_RGBA, m_x, m_y, 0, nChannels == 3 ? GL_RGB : GL_RGBA, GL_UNSIGNED_BYTE, texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_x, m_y, 0, nChannels == 3 ? GL_RGB : GL_RGBA, GL_UNSIGNED_BYTE, texture); glGenerateMipmap(GL_TEXTURE_2D); stbi_image_free(texture); } diff --git a/NothinFancy/src/include/Assets.h b/NothinFancy/src/include/Assets.h index 507693f..af7758c 100644 --- a/NothinFancy/src/include/Assets.h +++ b/NothinFancy/src/include/Assets.h @@ -9,7 +9,6 @@ namespace nf { struct Asset { char* data; bool alreadyLoaded = false; - virtual ~Asset(); }; @@ -26,6 +25,25 @@ namespace nf { ~ATexture() override; }; + struct ACubemap : Asset { + char* frontData; + size_t frontSize; + char* backData; + size_t backSize; + char* topData; + size_t topSize; + char* bottomData; + size_t bottomSize; + char* leftData; + size_t leftSize; + char* rightData; + size_t rightSize; + + unsigned int numImages; + + ~ACubemap(); + }; + struct AShader : Asset { ~AShader() override; }; diff --git a/NothinFancy/src/include/Camera.h b/NothinFancy/src/include/Camera.h index d594ba5..982f89d 100644 --- a/NothinFancy/src/include/Camera.h +++ b/NothinFancy/src/include/Camera.h @@ -27,7 +27,7 @@ namespace nf { const Vec3& getPosition(); const Vec3& getRotation(); - void bind(Shader* shader); + void bind(Shader* entityShader, Shader* cubemapShader); ~Camera(); private: diff --git a/NothinFancy/src/include/Cubemap.h b/NothinFancy/src/include/Cubemap.h new file mode 100644 index 0000000..604fa71 --- /dev/null +++ b/NothinFancy/src/include/Cubemap.h @@ -0,0 +1,20 @@ +#pragma once +#include "Drawable.h" + +namespace nf { + struct Asset; + + class Cubemap : public Drawable { + public: + Cubemap(); + + void create(Asset* cubemapAsset); + bool isConstructed(); + void render(); + + ~Cubemap(); + private: + bool m_constructed; + unsigned int m_id; + }; +} \ No newline at end of file diff --git a/NothinFancy/src/include/Entity.h b/NothinFancy/src/include/Entity.h index a229ce3..0a4eca5 100644 --- a/NothinFancy/src/include/Entity.h +++ b/NothinFancy/src/include/Entity.h @@ -11,6 +11,7 @@ namespace nf { Entity(); void create(Asset* modelAsset, Asset* textureAsset = nullptr); + bool isConstructed(); void setPosition(double x, double y, double z); void setPosition(const Vec3& position); @@ -27,6 +28,7 @@ namespace nf { private: void setModelMatrix(Shader* shader); + bool m_constructed; Model* m_model; Vec3 m_position; diff --git a/NothinFancy/src/include/NothinFancy.h b/NothinFancy/src/include/NothinFancy.h index 9d9b649..a2f5961 100644 --- a/NothinFancy/src/include/NothinFancy.h +++ b/NothinFancy/src/include/NothinFancy.h @@ -10,6 +10,7 @@ #include "IntroGamestate.h" #include "Assets.h" #include "Light.h" +#include "Cubemap.h" #include "Text.h" #include "UITexture.h" #include "Input.h" @@ -54,6 +55,7 @@ namespace nf { void render(Entity& in); void render(UIElement& in); void render(Light& in); + void render(Cubemap& in); void doFrame(Camera* camera); @@ -68,10 +70,12 @@ namespace nf { std::vector m_lights; std::vector m_lGame; + Cubemap* m_cubemap; std::vector m_lUI; Shader* m_entityShader; Shader* m_textShader; Shader* m_uiTextureShader; + Shader* m_cubemapShader; }; class Application { diff --git a/NothinFancy/src/include/Renderer.h b/NothinFancy/src/include/Renderer.h index bd74a00..ca5a2a3 100644 --- a/NothinFancy/src/include/Renderer.h +++ b/NothinFancy/src/include/Renderer.h @@ -10,6 +10,7 @@ namespace nf { class Entity; class UIElement; class Light; + class Cubemap; class Camera; class Renderer { @@ -19,6 +20,7 @@ namespace nf { void render(Entity& in); void render(UIElement& in); void render(Light& in); + void render(Cubemap& in); void doFrame(Camera* camera); @@ -33,9 +35,11 @@ namespace nf { std::vector m_lights; std::vector m_lGame; + Cubemap* m_cubemap; std::vector m_lUI; Shader* m_entityShader; Shader* m_textShader; Shader* m_uiTextureShader; + Shader* m_cubemapShader; }; } \ No newline at end of file diff --git a/NothinFancy/src/include/UITexture.h b/NothinFancy/src/include/UITexture.h index 2e34ac1..46999d8 100644 --- a/NothinFancy/src/include/UITexture.h +++ b/NothinFancy/src/include/UITexture.h @@ -10,7 +10,7 @@ namespace nf { public: UITexture(); - void create(Asset* texture, const Vec2& position, double scale = 1.0); + void create(Asset* textureAsset, const Vec2& position, double scale = 1.0); const char* identity() override; void render(Shader* shader, unsigned int windowWidth, unsigned int windowHeight) override;