Added fading between states

This commit is contained in:
Grayson Riffe (Laptop) 2021-09-07 01:08:37 -05:00
parent c78abf303e
commit 7ea56370d6
10 changed files with 146 additions and 18 deletions

View File

@ -0,0 +1,10 @@
#version 330 core
uniform float opacity;
out vec4 color;
void main() {
color = vec4(0.0, 0.0, 0.0, opacity);
}

View File

@ -0,0 +1,8 @@
#version 330 core
layout(location = 0) in vec2 pos;
void main() {
gl_Position = vec4(pos.xy, 0.0, 1.0);
}

View File

@ -8,7 +8,7 @@ uniform float opacity;
out vec4 color; out vec4 color;
void main() { 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);
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 937 KiB

View File

@ -251,6 +251,7 @@ namespace nf {
void Application::runMainGameThread() { void Application::runMainGameThread() {
m_renderer = new Renderer(this); m_renderer = new Renderer(this);
startIntroState(); 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 currentTime = std::chrono::steady_clock::now();
std::chrono::steady_clock::time_point lastFrame = std::chrono::steady_clock::now(); std::chrono::steady_clock::time_point lastFrame = std::chrono::steady_clock::now();
while (m_running) { while (m_running) {
@ -280,16 +281,25 @@ namespace nf {
void Application::startIntroState() { void Application::startIntroState() {
m_sIntro = new IntroGamestate(this); m_sIntro = new IntroGamestate(this);
m_sIntro->onEnter();
m_currentState = m_sIntro; m_currentState = m_sIntro;
m_currentState->onEnter();
} }
void Application::doStateChange() { void Application::doStateChange() {
m_stateChange = false; static bool once = true;
//TODO: Do fade in and out here if (once) {
m_currentState->onExit(); m_renderer->setFade(false, true, false);
m_currentState = m_states[m_nextState]; once = false;
m_currentState->onEnter(); }
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) { LRESULT CALLBACK Application::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

View File

@ -162,10 +162,13 @@ namespace nf {
return m_assets[in]; return m_assets[in];
} }
AssetPack::~AssetPack() { void AssetPack::unload() {
for (auto curr : m_assets) { for (auto curr : m_assets)
delete curr.second; delete curr.second;
} }
AssetPack::~AssetPack() {
unload();
} }
AModel* BaseAssets::cube; AModel* BaseAssets::cube;

View File

@ -24,18 +24,15 @@ namespace nf {
app->changeState(app->getDefaultState()); app->changeState(app->getDefaultState());
} }
static double opacity = 0.0; static double scale = 2.0;
static double scale = 1.0;
logoTex.setOpacity(opacity);
logoTex.setScale(scale); logoTex.setScale(scale);
text.setOpacity(opacity);
if (m_counter >= 20) { if (m_counter >= 20) {
opacity += 0.02;
scale += 0.002; scale += 0.002;
} }
m_counter++; m_counter++;
if (app->isInput(NFI_SPACE))
m_counter = 240;
if (app->isInput(NFI_ESCAPE)) if (app->isInput(NFI_ESCAPE))
app->quit(); app->quit();
} }

View File

@ -15,7 +15,11 @@
namespace nf { namespace nf {
Renderer::Renderer(Application* app) : 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_app = app;
m_hdc = GetDC(m_app->getWindow()); m_hdc = GetDC(m_app->getWindow());
@ -75,6 +79,9 @@ namespace nf {
const char* cubemapVertex = m_baseAP["cubemapVertex.shader"]->data; const char* cubemapVertex = m_baseAP["cubemapVertex.shader"]->data;
const char* cubemapFragment = m_baseAP["cubemapFragment.shader"]->data; const char* cubemapFragment = m_baseAP["cubemapFragment.shader"]->data;
m_cubemapShader = new Shader(cubemapVertex, cubemapFragment); 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::cube = (AModel*)m_baseAP["cube.obj"];
BaseAssets::plane = (AModel*)m_baseAP["plane.obj"]; BaseAssets::plane = (AModel*)m_baseAP["plane.obj"];
@ -84,6 +91,33 @@ namespace nf {
BaseAssets::torus = (AModel*)m_baseAP["torus.obj"]; BaseAssets::torus = (AModel*)m_baseAP["torus.obj"];
BaseAssets::logo = (ATexture*)m_baseAP["logo.png"]; BaseAssets::logo = (ATexture*)m_baseAP["logo.png"];
BaseAssets::defaultFont = (AFont*)m_baseAP["default.ttf"]; 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<float>(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) { void Renderer::render(Entity& in) {
@ -156,6 +190,43 @@ namespace nf {
} }
} }
m_lUI.clear(); 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); glEnable(GL_DEPTH_TEST);
SwapBuffers(m_hdc); SwapBuffers(m_hdc);
@ -169,6 +240,10 @@ namespace nf {
delete m_entityShader; delete m_entityShader;
delete m_textShader; delete m_textShader;
delete m_uiTextureShader; delete m_uiTextureShader;
delete m_cubemapShader;
delete m_fadeShader;
delete m_fadeVAO;
delete m_fadeIB;
ReleaseDC(m_app->getWindow(), m_hdc); ReleaseDC(m_app->getWindow(), m_hdc);
wglMakeCurrent(NULL, NULL); wglMakeCurrent(NULL, NULL);
wglDeleteContext(m_hglrc); wglDeleteContext(m_hglrc);

View File

@ -52,6 +52,9 @@ namespace nf {
public: public:
Renderer(Application* app); Renderer(Application* app);
void setFade(bool in, bool out, bool noText);
bool isFadeOutComplete();
void render(Entity& in); void render(Entity& in);
void render(UIElement& in); void render(UIElement& in);
void render(Light& in); void render(Light& in);
@ -76,6 +79,14 @@ namespace nf {
Shader* m_textShader; Shader* m_textShader;
Shader* m_uiTextureShader; Shader* m_uiTextureShader;
Shader* m_cubemapShader; 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 { class Application {

View File

@ -3,6 +3,7 @@
#include <Windows.h> #include <Windows.h>
#include "Assets.h" #include "Assets.h"
#include "Text.h"
namespace nf { namespace nf {
class Application; class Application;
@ -12,11 +13,16 @@ namespace nf {
class Light; class Light;
class Cubemap; class Cubemap;
class Camera; class Camera;
class VertexArray;
class IndexBuffer;
class Renderer { class Renderer {
public: public:
Renderer(Application* app); Renderer(Application* app);
void setFade(bool in, bool out, bool noText);
bool isFadeOutComplete();
void render(Entity& in); void render(Entity& in);
void render(UIElement& in); void render(UIElement& in);
void render(Light& in); void render(Light& in);
@ -41,5 +47,13 @@ namespace nf {
Shader* m_textShader; Shader* m_textShader;
Shader* m_uiTextureShader; Shader* m_uiTextureShader;
Shader* m_cubemapShader; 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;
}; };
} }