diff --git a/NFPackCreator/AssetBuild/base/shaders/fadeFragment.shader b/NFPackCreator/AssetBuild/base/shaders/fadeFragment.shader new file mode 100644 index 0000000..cd8ce3d --- /dev/null +++ b/NFPackCreator/AssetBuild/base/shaders/fadeFragment.shader @@ -0,0 +1,10 @@ +#version 330 core + +uniform float opacity; + +out vec4 color; + +void main() { + + color = vec4(0.0, 0.0, 0.0, opacity); +} diff --git a/NFPackCreator/AssetBuild/base/shaders/fadeVertex.shader b/NFPackCreator/AssetBuild/base/shaders/fadeVertex.shader new file mode 100644 index 0000000..48d755a --- /dev/null +++ b/NFPackCreator/AssetBuild/base/shaders/fadeVertex.shader @@ -0,0 +1,8 @@ +#version 330 core + +layout(location = 0) in vec2 pos; + +void main() { + + gl_Position = vec4(pos.xy, 0.0, 1.0); +} \ No newline at end of file diff --git a/NFPackCreator/AssetBuild/base/shaders/uiTextureFragment.shader b/NFPackCreator/AssetBuild/base/shaders/uiTextureFragment.shader index 60b8796..f91476c 100644 --- a/NFPackCreator/AssetBuild/base/shaders/uiTextureFragment.shader +++ b/NFPackCreator/AssetBuild/base/shaders/uiTextureFragment.shader @@ -8,7 +8,7 @@ uniform float opacity; out vec4 color; void main() { - vec3 texColor = texture(tex, texCoord).rgb; + vec4 texColor = texture(tex, texCoord); - color = vec4(texColor.rgb, opacity); + color = vec4(texColor.rgb, texColor.a * opacity); } diff --git a/NFPackCreator/AssetBuild/base/textures/logo.png b/NFPackCreator/AssetBuild/base/textures/logo.png index 3d1ce99..765225e 100644 Binary files a/NFPackCreator/AssetBuild/base/textures/logo.png and b/NFPackCreator/AssetBuild/base/textures/logo.png differ diff --git a/NothinFancy/src/Application.cpp b/NothinFancy/src/Application.cpp index 9eef727..d5fbb60 100644 --- a/NothinFancy/src/Application.cpp +++ b/NothinFancy/src/Application.cpp @@ -251,6 +251,7 @@ namespace nf { void Application::runMainGameThread() { m_renderer = new Renderer(this); startIntroState(); + m_renderer->setFade(true, false, true); std::chrono::steady_clock::time_point currentTime = std::chrono::steady_clock::now(); std::chrono::steady_clock::time_point lastFrame = std::chrono::steady_clock::now(); while (m_running) { @@ -280,16 +281,25 @@ namespace nf { void Application::startIntroState() { m_sIntro = new IntroGamestate(this); - m_sIntro->onEnter(); m_currentState = m_sIntro; + m_currentState->onEnter(); } void Application::doStateChange() { - m_stateChange = false; - //TODO: Do fade in and out here - m_currentState->onExit(); - m_currentState = m_states[m_nextState]; - m_currentState->onEnter(); + static bool once = true; + if (once) { + m_renderer->setFade(false, true, false); + once = false; + } + + if (m_renderer->isFadeOutComplete()) { + m_currentState->onExit(); + m_currentState = m_states[m_nextState]; + m_currentState->onEnter(); + m_renderer->setFade(true, false, false); + m_stateChange = false; + once = true; + } } LRESULT CALLBACK Application::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { diff --git a/NothinFancy/src/Assets.cpp b/NothinFancy/src/Assets.cpp index a75f555..99b3ad5 100644 --- a/NothinFancy/src/Assets.cpp +++ b/NothinFancy/src/Assets.cpp @@ -162,10 +162,13 @@ namespace nf { return m_assets[in]; } - AssetPack::~AssetPack() { - for (auto curr : m_assets) { + void AssetPack::unload() { + for (auto curr : m_assets) delete curr.second; - } + } + + AssetPack::~AssetPack() { + unload(); } AModel* BaseAssets::cube; diff --git a/NothinFancy/src/IntroGamestate.cpp b/NothinFancy/src/IntroGamestate.cpp index 659c284..2a585ff 100644 --- a/NothinFancy/src/IntroGamestate.cpp +++ b/NothinFancy/src/IntroGamestate.cpp @@ -24,18 +24,15 @@ namespace nf { app->changeState(app->getDefaultState()); } - static double opacity = 0.0; - static double scale = 1.0; - logoTex.setOpacity(opacity); + static double scale = 2.0; logoTex.setScale(scale); - text.setOpacity(opacity); if (m_counter >= 20) { - opacity += 0.02; scale += 0.002; } - m_counter++; + if (app->isInput(NFI_SPACE)) + m_counter = 240; if (app->isInput(NFI_ESCAPE)) app->quit(); } diff --git a/NothinFancy/src/Renderer/Renderer.cpp b/NothinFancy/src/Renderer/Renderer.cpp index d7d75bd..7da3a24 100644 --- a/NothinFancy/src/Renderer/Renderer.cpp +++ b/NothinFancy/src/Renderer/Renderer.cpp @@ -15,7 +15,11 @@ namespace nf { Renderer::Renderer(Application* app) : - m_cubemap(nullptr) + m_cubemap(nullptr), + m_fadeIn(false), + m_fadeOut(false), + m_fadeNoText(false), + m_fadeOutComplete(false) { m_app = app; m_hdc = GetDC(m_app->getWindow()); @@ -75,6 +79,9 @@ namespace nf { const char* cubemapVertex = m_baseAP["cubemapVertex.shader"]->data; const char* cubemapFragment = m_baseAP["cubemapFragment.shader"]->data; m_cubemapShader = new Shader(cubemapVertex, cubemapFragment); + const char* fadeVertex = m_baseAP["fadeVertex.shader"]->data; + const char* fadeFragment = m_baseAP["fadeFragment.shader"]->data; + m_fadeShader = new Shader(fadeVertex, fadeFragment); BaseAssets::cube = (AModel*)m_baseAP["cube.obj"]; BaseAssets::plane = (AModel*)m_baseAP["plane.obj"]; @@ -84,6 +91,33 @@ namespace nf { BaseAssets::torus = (AModel*)m_baseAP["torus.obj"]; BaseAssets::logo = (ATexture*)m_baseAP["logo.png"]; BaseAssets::defaultFont = (AFont*)m_baseAP["default.ttf"]; + + float fadeVB[] = { + -1.0, -1.0, + 1.0, -1.0, + 1.0, 1.0, + -1.0, 1.0 + }; + unsigned int fadeIB[] = { + 0, 1, 2, + 2, 3, 0 + }; + m_fadeVAO = new VertexArray; + m_fadeVAO->addBuffer(fadeVB, sizeof(fadeVB)); + m_fadeVAO->push(2); + m_fadeVAO->finishBufferLayout(); + m_fadeIB = new IndexBuffer(fadeIB, 6); + m_loadingText.create("Loading...", Vec2(0.025, 0.044), Vec3(0.7, 0.7, 0.7)); + } + + void Renderer::setFade(bool in, bool out, bool noText) { + m_fadeIn = in; + m_fadeOut = out; + m_fadeNoText = noText; + } + + bool Renderer::isFadeOutComplete() { + return m_fadeOutComplete; } void Renderer::render(Entity& in) { @@ -156,6 +190,43 @@ namespace nf { } } m_lUI.clear(); + + if (m_fadeIn) { + static double opacity = 1.0; + m_fadeShader->setUniform("opacity", (float)opacity); + m_fadeVAO->bind(); + m_fadeIB->bind(); + glDrawElements(GL_TRIANGLES, m_fadeIB->getCount(), GL_UNSIGNED_INT, nullptr); + if (!m_fadeNoText) { + m_textShader->setUniform("proj", proj); + m_loadingText.setOpacity(opacity); + m_loadingText.render(m_textShader, m_app->getConfig().width, m_app->getConfig().height); + } + opacity -= 0.03; + if (opacity <= 0.0) { + m_fadeIn = false; + m_fadeOutComplete = false; + opacity = 1.0; + } + } + else if (m_fadeOut) { + static double opacity = 0.0; + m_fadeShader->setUniform("opacity", (float)opacity); + m_fadeVAO->bind(); + m_fadeIB->bind(); + glDrawElements(GL_TRIANGLES, m_fadeIB->getCount(), GL_UNSIGNED_INT, nullptr); + if (!m_fadeNoText) { + m_textShader->setUniform("proj", proj); + m_loadingText.setOpacity(opacity); + m_loadingText.render(m_textShader, m_app->getConfig().width, m_app->getConfig().height); + } + opacity += 0.03; + if (opacity >= 1.0) { + m_fadeIn = false; + m_fadeOutComplete = true; + opacity = 0.0; + } + } glEnable(GL_DEPTH_TEST); SwapBuffers(m_hdc); @@ -169,6 +240,10 @@ namespace nf { delete m_entityShader; delete m_textShader; delete m_uiTextureShader; + delete m_cubemapShader; + delete m_fadeShader; + delete m_fadeVAO; + delete m_fadeIB; ReleaseDC(m_app->getWindow(), m_hdc); wglMakeCurrent(NULL, NULL); wglDeleteContext(m_hglrc); diff --git a/NothinFancy/src/include/NothinFancy.h b/NothinFancy/src/include/NothinFancy.h index 3b52e10..2946094 100644 --- a/NothinFancy/src/include/NothinFancy.h +++ b/NothinFancy/src/include/NothinFancy.h @@ -52,6 +52,9 @@ namespace nf { public: Renderer(Application* app); + void setFade(bool in, bool out, bool noText); + bool isFadeOutComplete(); + void render(Entity& in); void render(UIElement& in); void render(Light& in); @@ -76,6 +79,14 @@ namespace nf { Shader* m_textShader; Shader* m_uiTextureShader; Shader* m_cubemapShader; + Shader* m_fadeShader; + + bool m_fadeIn, m_fadeOut; + bool m_fadeNoText; + bool m_fadeOutComplete; + Text m_loadingText; + VertexArray* m_fadeVAO; + IndexBuffer* m_fadeIB; }; class Application { diff --git a/NothinFancy/src/include/Renderer.h b/NothinFancy/src/include/Renderer.h index ca5a2a3..85ee9ef 100644 --- a/NothinFancy/src/include/Renderer.h +++ b/NothinFancy/src/include/Renderer.h @@ -3,6 +3,7 @@ #include #include "Assets.h" +#include "Text.h" namespace nf { class Application; @@ -12,11 +13,16 @@ namespace nf { class Light; class Cubemap; class Camera; + class VertexArray; + class IndexBuffer; class Renderer { public: Renderer(Application* app); + void setFade(bool in, bool out, bool noText); + bool isFadeOutComplete(); + void render(Entity& in); void render(UIElement& in); void render(Light& in); @@ -41,5 +47,13 @@ namespace nf { Shader* m_textShader; Shader* m_uiTextureShader; Shader* m_cubemapShader; + Shader* m_fadeShader; + + bool m_fadeIn, m_fadeOut; + bool m_fadeNoText; + bool m_fadeOutComplete; + Text m_loadingText; + VertexArray* m_fadeVAO; + IndexBuffer* m_fadeIB; }; } \ No newline at end of file