Engine update
This commit is contained in:
@@ -9,8 +9,7 @@
|
||||
#include "ifilesystem.h"
|
||||
#include "camera.h"
|
||||
#include "imguimanager.h"
|
||||
|
||||
#include <pugixml.hpp>
|
||||
#include "scenemanager.h"
|
||||
|
||||
static GLuint g_VAO = 0;
|
||||
|
||||
@@ -66,17 +65,16 @@ void APIENTRY GL_DebugOutput(GLenum source,
|
||||
}
|
||||
}
|
||||
|
||||
Render* g_pRender = nullptr;
|
||||
Render* g_render = nullptr;
|
||||
|
||||
Render::Render() :
|
||||
m_pWindow(nullptr),
|
||||
m_pGLContext(nullptr),
|
||||
m_pStretchedPicVBuf(nullptr),
|
||||
m_sceneModel(nullptr),
|
||||
m_bUsingVAO(false)
|
||||
m_usingVAO(false)
|
||||
{
|
||||
m_ViewMatrix = glm::identity<glm::mat4>();
|
||||
m_ProjectionMatrix = glm::identity<glm::mat4>();
|
||||
m_viewMatrix = glm::identity<glm::mat4>();
|
||||
m_projectionMatrix = glm::identity<glm::mat4>();
|
||||
}
|
||||
|
||||
Render::~Render()
|
||||
@@ -101,7 +99,7 @@ void Render::Init(SDL_Window* pWindow)
|
||||
|
||||
// Core profile probably, should use VAO
|
||||
if (GLVersion.major >= 3 && GLVersion.minor >= 1)
|
||||
m_bUsingVAO = true;
|
||||
m_usingVAO = true;
|
||||
|
||||
Msg("%s", (const char*)glGetString(GL_VENDOR));
|
||||
Msg("%s", (const char*)glGetString(GL_RENDERER));
|
||||
@@ -126,31 +124,35 @@ void Render::Init(SDL_Window* pWindow)
|
||||
|
||||
|
||||
// Create render device
|
||||
g_pRenderDevice = new RenderDevice();
|
||||
g_renderDevice = new RenderDevice();
|
||||
|
||||
// Create texture manager
|
||||
g_pTexturesManager = new TexturesManager();
|
||||
g_pTexturesManager->Init();
|
||||
g_texturesManager = new TexturesManager();
|
||||
g_texturesManager->Init();
|
||||
|
||||
// Create shader system
|
||||
g_pShaderSystem = new ShaderSystem();
|
||||
g_pShaderSystem->Init();
|
||||
g_shaderSystem = new ShaderSystem();
|
||||
g_shaderSystem->Init();
|
||||
|
||||
// Create model system
|
||||
g_pModelSystem = new ModelSystem();
|
||||
g_modelSystem = new ModelSystem();
|
||||
g_modelSystem->Init();
|
||||
|
||||
// Create scene manager
|
||||
g_sceneManager = new SceneManager();
|
||||
|
||||
// Create debug render
|
||||
g_pDebugRender = new DebugRender();
|
||||
g_pDebugRender->Initialize();
|
||||
g_debugRender = new DebugRender();
|
||||
g_debugRender->Initialize();
|
||||
|
||||
// Create imgui manager
|
||||
g_ImGuiManager.Init();
|
||||
|
||||
// Create stretched picture filenameBuffer
|
||||
m_pStretchedPicVBuf = g_pRenderDevice->CreateVertexBuffer(nullptr, MAX_STRETCH_VX, true);
|
||||
m_pStretchedPicVBuf = g_renderDevice->CreateVertexBuffer(nullptr, MAX_STRETCH_VX, true);
|
||||
|
||||
// Core profile require Vertex Array Object to render
|
||||
if (m_bUsingVAO)
|
||||
if (m_usingVAO)
|
||||
{
|
||||
// Create global vertex array
|
||||
glGenVertexArrays(1, &g_VAO);
|
||||
@@ -160,7 +162,7 @@ void Render::Init(SDL_Window* pWindow)
|
||||
|
||||
void Render::Shutdown()
|
||||
{
|
||||
if (m_bUsingVAO)
|
||||
if (m_usingVAO)
|
||||
{
|
||||
glBindVertexArray(0);
|
||||
glDeleteVertexArrays(1, &g_VAO);
|
||||
@@ -171,24 +173,27 @@ void Render::Shutdown()
|
||||
|
||||
g_ImGuiManager.Shutdown();
|
||||
|
||||
g_pDebugRender->Shutdown();
|
||||
delete g_pDebugRender;
|
||||
g_pDebugRender = nullptr;
|
||||
g_debugRender->Shutdown();
|
||||
delete g_debugRender;
|
||||
g_debugRender = nullptr;
|
||||
|
||||
g_pModelSystem->Shutdown();
|
||||
delete g_pModelSystem;
|
||||
g_pModelSystem = nullptr;
|
||||
delete g_sceneManager;
|
||||
g_sceneManager = nullptr;
|
||||
|
||||
g_pShaderSystem->Shutdown();
|
||||
delete g_pShaderSystem;
|
||||
g_pShaderSystem = nullptr;
|
||||
g_modelSystem->Shutdown();
|
||||
delete g_modelSystem;
|
||||
g_modelSystem = nullptr;
|
||||
|
||||
g_pTexturesManager->Shutdown();
|
||||
delete g_pTexturesManager;
|
||||
g_pTexturesManager = nullptr;
|
||||
g_shaderSystem->Shutdown();
|
||||
delete g_shaderSystem;
|
||||
g_shaderSystem = nullptr;
|
||||
|
||||
delete g_pRenderDevice;
|
||||
g_pRenderDevice = nullptr;
|
||||
g_texturesManager->Shutdown();
|
||||
delete g_texturesManager;
|
||||
g_texturesManager = nullptr;
|
||||
|
||||
delete g_renderDevice;
|
||||
g_renderDevice = nullptr;
|
||||
|
||||
// Destroy OpenGL context
|
||||
SDL_GL_MakeCurrent(nullptr, nullptr);
|
||||
@@ -197,35 +202,40 @@ void Render::Shutdown()
|
||||
}
|
||||
|
||||
void Render::RenderScene() {
|
||||
if (m_sceneModel) {
|
||||
Camera* camera = g_cameraManager.GetActiveCamera();
|
||||
if (camera) {
|
||||
glm::mat4 viewProj = m_ProjectionMatrix * m_ViewMatrix;
|
||||
viewProj = glm::transpose(viewProj);
|
||||
//if (m_sceneModel) {
|
||||
// Camera* camera = g_cameraManager.GetActiveCamera();
|
||||
// if (camera) {
|
||||
// glm::mat4 viewProj = m_projectionMatrix * m_viewMatrix;
|
||||
// viewProj = glm::transpose(viewProj);
|
||||
|
||||
camera->GetFrustum().Build(viewProj);
|
||||
// camera->GetFrustum().Build(viewProj);
|
||||
|
||||
if (camera->GetFrustum().CullBoundingBox(m_sceneModel->GetBoundingBox()))
|
||||
return;
|
||||
}
|
||||
// if (camera->GetFrustum().CullBoundingBox(m_sceneModel->GetBoundingBox()))
|
||||
// return;
|
||||
// }
|
||||
|
||||
static glm::mat4 s_identity = glm::mat4(1.0f);
|
||||
m_sceneModel->Draw(s_identity);
|
||||
// static glm::mat4 s_identity = glm::mat4(1.0f);
|
||||
// m_sceneModel->Draw(s_identity);
|
||||
|
||||
g_NumModels++;
|
||||
|
||||
g_pDebugRender->DrawBoundingBox(m_sceneModel->GetBoundingBox(), glm::vec3(1.0f));
|
||||
}
|
||||
// g_NumModels++;
|
||||
//
|
||||
// g_debugRender->DrawBoundingBox(m_sceneModel->GetBoundingBox(), glm::vec3(1.0f));
|
||||
//}
|
||||
|
||||
g_pDebugRender->RenderFrame();
|
||||
static glm::mat4 s_identity = glm::mat4(1.0f);
|
||||
if (g_sceneManager->isSceneLoaded())
|
||||
g_sceneManager->renderScene(s_identity);
|
||||
|
||||
g_debugRender->RenderFrame();
|
||||
}
|
||||
|
||||
void Render::RenderStats()
|
||||
{
|
||||
char buffer[256];
|
||||
|
||||
snprintf(buffer, sizeof(buffer), "Scene: %s", m_sceneName.c_str());
|
||||
snprintf(buffer, sizeof(buffer), "Scene: %s", g_sceneManager->getSceneName());
|
||||
ImGui::GetForegroundDrawList()->AddText(ImVec2(0.0f, 0.0f), 0xffffffff, buffer);
|
||||
|
||||
snprintf(buffer, sizeof(buffer), "numModels: %d", g_NumModels);
|
||||
ImGui::GetForegroundDrawList()->AddText(ImVec2(0.0f, 15.0f), 0xffffffff, buffer);
|
||||
}
|
||||
@@ -240,65 +250,30 @@ void Render::Present(bool vsync)
|
||||
|
||||
void Render::ResetStates()
|
||||
{
|
||||
g_pRenderDevice->SetDepthTest(true);
|
||||
g_pRenderDevice->SetDepthWrite(true);
|
||||
g_pRenderDevice->SetStencilTest(false);
|
||||
g_pRenderDevice->SetScissorTest(false);
|
||||
g_pRenderDevice->SetCullFace(false);
|
||||
g_pRenderDevice->SetBlending(false);
|
||||
g_renderDevice->SetDepthTest(true);
|
||||
g_renderDevice->SetDepthWrite(true);
|
||||
g_renderDevice->SetStencilTest(false);
|
||||
g_renderDevice->SetScissorTest(false);
|
||||
g_renderDevice->SetCullFace(false);
|
||||
g_renderDevice->SetBlending(false);
|
||||
}
|
||||
|
||||
void Render::SetViewMatrix(const glm::mat4& matView)
|
||||
{
|
||||
m_ViewMatrix = matView;
|
||||
m_viewMatrix = matView;
|
||||
}
|
||||
|
||||
void Render::SetProjectionMatrix(const glm::mat4& matProjection)
|
||||
{
|
||||
m_ProjectionMatrix = matProjection;
|
||||
m_projectionMatrix = matProjection;
|
||||
}
|
||||
|
||||
void Render::LoadSceneXML(const char* filename)
|
||||
{
|
||||
char filenameBuffer[kMaxPathLength];
|
||||
snprintf(filenameBuffer, kMaxPathLength, "data/levels/%s/%s.xml", filename, filename);
|
||||
|
||||
FileHandle_t file = GetFileSystem()->OpenFile(filenameBuffer, "rb");
|
||||
SDL_assert_always(file != kInvalidFileHandleValue);
|
||||
|
||||
size_t length = GetFileSystem()->GetFileLength(file);
|
||||
|
||||
char* filedata = new char[length + 1];
|
||||
GetFileSystem()->ReadFile(file, filedata, length);
|
||||
filedata[length] = '\0';
|
||||
|
||||
GetFileSystem()->CloseFile(file);
|
||||
|
||||
pugi::xml_document doc;
|
||||
pugi::xml_parse_result result = doc.load_buffer(filedata, length);
|
||||
delete[] filedata;
|
||||
if (!result) {
|
||||
Core::Error("SceneManager::LoadScene: Error while reading level description file '%s'\nError: %s:%i",
|
||||
filenameBuffer, result.description(), result.offset);
|
||||
}
|
||||
|
||||
pugi::xml_node root = doc.document_element();
|
||||
const char* scenefilename = root.child("SceneFile").attribute("filename").value();
|
||||
|
||||
m_sceneName = scenefilename;
|
||||
|
||||
sprintf(filenameBuffer, "data/levels/%s/%s", filename, scenefilename);
|
||||
|
||||
if (!GetFileSystem()->IsExist(filenameBuffer)) {
|
||||
Core::Error("SceneManager::LoadScene: scene file '%s' doesnt exist", scenefilename);
|
||||
}
|
||||
|
||||
m_sceneFilename = filenameBuffer;
|
||||
|
||||
m_sceneModel = g_pModelSystem->LoadModel(m_sceneFilename.c_str());
|
||||
g_sceneManager->loadScene(filename);
|
||||
}
|
||||
|
||||
//IRender* GetRender()
|
||||
//{
|
||||
// return g_pRender;
|
||||
// return g_render;
|
||||
//}
|
||||
Reference in New Issue
Block a user