Added fading between states
This commit is contained in:
parent
c78abf303e
commit
7ea56370d6
10
NFPackCreator/AssetBuild/base/shaders/fadeFragment.shader
Normal file
10
NFPackCreator/AssetBuild/base/shaders/fadeFragment.shader
Normal 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);
|
||||||
|
}
|
8
NFPackCreator/AssetBuild/base/shaders/fadeVertex.shader
Normal file
8
NFPackCreator/AssetBuild/base/shaders/fadeVertex.shader
Normal 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);
|
||||||
|
}
|
@ -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 |
@ -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) {
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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 {
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
Reference in New Issue
Block a user