This commit is contained in:
2026-03-07 07:48:16 +03:00
parent a998771486
commit 95daf12fc5
48 changed files with 4613 additions and 66 deletions

View File

@@ -205,6 +205,8 @@ SceneManager* g_sceneManager;
SceneManager::SceneManager()
{
m_sceneLoaded = false;
DLightManager::GetInstance()->Clear();
}
SceneManager::~SceneManager()
@@ -214,6 +216,8 @@ SceneManager::~SceneManager()
void SceneManager::loadScene(const char* filename)
{
unloadIfScenePresent();
char filenameBuffer[kMaxPathLength];
snprintf(filenameBuffer, kMaxPathLength, "data/levels/%s/%s.xml", filename, filename);
@@ -478,6 +482,8 @@ void SceneManager::unloadScene()
m_sceneMeshes.clear();
DLightManager::GetInstance()->Clear();
m_sceneLoaded = false;
}
@@ -777,7 +783,14 @@ void SceneStaticMesh::LoadMtl(const char* filename)
char stupidBuffer[1000];
fgets(stupidBuffer, 1000, file);
const char* textureFilename = stupidBuffer + 1;
char* textureFilename = stupidBuffer + 1;
int str_len = strlen(textureFilename);
if (textureFilename[str_len - 1] == '\n')
textureFilename[str_len - 1] = '\0';
m_albedoTexture = g_texturesManager->LoadTexture2D(textureFilename, true);
}
@@ -799,7 +812,7 @@ void SceneStaticMesh::LoadMtl(const char* filename)
static glm::mat4 s_identity = glm::mat4(1.0f);
void R_SceneStaticMesh_BindShader(const glm::mat4& worldMatrix, Texture2D* albedoTexture)
void R_SceneStaticMesh_BindShader(const glm::mat4& worldMatrix, Texture2D* albedoTexture, DLight* light)
{
extern Shader* g_unlitShader;
extern Shader* g_litShader;
@@ -807,7 +820,7 @@ void R_SceneStaticMesh_BindShader(const glm::mat4& worldMatrix, Texture2D* albed
SDL_assert(g_unlitShader);
SDL_assert(g_litShader);
Shader* shader = g_litShader;
Shader* shader = light ? g_litShader : g_unlitShader;
g_shaderSystem->SetShader(shader);
@@ -825,17 +838,22 @@ void R_SceneStaticMesh_BindShader(const glm::mat4& worldMatrix, Texture2D* albed
if (shader->HasUniform(UNIFORM_SUN_DIRECTION))
{
glm::vec4 lightPos = glm::vec4(1.0f, 1.0f, 1.0f, 0.0f);
// g_debugRender->DrawAxis(glm::vec3(lightPos));
Camera* camera = g_cameraManager.GetActiveCamera();
if (camera)
lightPos = glm::vec4(camera->GetPosition(), 1.0f);
glm::vec4 lightPos = glm::vec4(0.0f, 0.0f, 0.0f, 0.0f);
if (light)
lightPos = glm::vec4(light->position, light->radius);
g_shaderSystem->SetUniformFloat4(shader, UNIFORM_SUN_DIRECTION, &lightPos);
}
if (shader->HasUniform(UNIFORM_SUN_COLOR))
{
glm::vec4 lightColor = glm::vec4(0.0f, 0.0f, 0.0f, 0.0f);
if (light)
lightColor = glm::vec4(light->color, 1.0f);
g_shaderSystem->SetUniformFloat4(shader, UNIFORM_SUN_COLOR, &lightColor);
}
if (shader->HasUniform(UNIFORM_SUN_AMBIENT))
{
glm::vec4 lightColor = glm::vec4(0.1f);
@@ -854,14 +872,149 @@ void SceneStaticMesh::RenderObjects()
g_renderDevice->SetCullFace(true);
g_renderDevice->SetDepthTest(true);
g_renderDevice->SetDepthWrite(true);
g_renderDevice->SetBlending(false);
g_renderDevice->SetVerticesBuffer(m_vb);
int numlights = DLightManager::GetInstance()->GetNumLights();
if (!numlights)
{
g_renderDevice->SetVerticesBuffer(m_vb);
R_SceneStaticMesh_BindShader(s_identity, m_albedoTexture);
R_SceneStaticMesh_BindShader(s_identity, m_albedoTexture, nullptr);
g_renderDevice->DrawArrays(PT_TRIANGLES, 0, m_vbcount);
g_renderDevice->DrawArrays(PT_TRIANGLES, 0, m_vbcount);
g_NumModels++;
g_NumModels++;
}
else
{
// first pass
g_renderDevice->SetVerticesBuffer(m_vb);
R_SceneStaticMesh_BindShader(s_identity, m_albedoTexture, DLightManager::GetInstance()->GetDLight(0));
g_renderDevice->DrawArrays(PT_TRIANGLES, 0, m_vbcount);
g_NumModels++; // overdraw YAAAY
if (numlights > 1)
{
// fragment passed, can turn off depth write
g_renderDevice->SetDepthWrite(false);
// testing only written fragments
glDepthFunc(GL_EQUAL);
// additive blending
g_renderDevice->SetBlending(true);
g_renderDevice->SetBlendingFunction(BF_ONE, BF_ONE);
glBlendFunc(GL_ONE, GL_ONE);
for (int i = 1; i < numlights; i++)
{
g_renderDevice->SetVerticesBuffer(m_vb);
R_SceneStaticMesh_BindShader(s_identity, m_albedoTexture, DLightManager::GetInstance()->GetDLight(i));
g_renderDevice->DrawArrays(PT_TRIANGLES, 0, m_vbcount);
g_NumModels++; // overdraw YAAAY
}
g_renderDevice->SetBlending(false);
glDepthFunc(GL_LESS);
}
}
}
DLightManager* DLightManager::GetInstance()
{
static DLightManager instance;
return &instance;
}
DLight* DLightManager::AllocLight()
{
return &m_dlights[m_numdlights++];
}
void DLightManager::Clear()
{
memset(m_dlights, 0, sizeof(m_dlights));
m_numdlights = 0;
}
DLight* DLightManager::GetDLight(int index)
{
if (index >= m_numdlights)
Core::Error("DLightManager::GetDLight: index is out of range");
return &m_dlights[index];
}
int DLightManager::GetNumLights()
{
return m_numdlights;
}
//void R_SceneStaticMesh_BindShader(const glm::mat4& worldMatrix, Texture2D* albedoTexture)
//{
// extern Shader* g_unlitShader;
// extern Shader* g_litShader;
//
// SDL_assert(g_unlitShader);
// SDL_assert(g_litShader);
//
// Shader* shader = g_litShader;
//
// g_shaderSystem->SetShader(shader);
//
// g_shaderSystem->SetUniformMatrix(shader, UNIFORM_MODEL_MATRIX, &worldMatrix[0]);
//
// glm::mat4 mvp = g_render->GetProjectionMatrix() * g_render->GetViewMatrix() * worldMatrix;
// g_shaderSystem->SetUniformMatrix(shader, UNIFORM_MVP_MATRIX, &mvp[0]);
//
// Camera* camera = g_cameraManager.GetActiveCamera();
// if (camera && shader->HasUniform(UNIFORM_CAMERA_POS))
// {
// glm::vec4 campos = glm::vec4(camera->GetPosition(), 1.0f);
// g_shaderSystem->SetUniformFloat4(shader, UNIFORM_CAMERA_POS, &campos);
// }
//
// if (shader->HasUniform(UNIFORM_SUN_DIRECTION))
// {
// glm::vec4 lightPos = glm::vec4(1.0f, 1.0f, 1.0f, 0.0f);
//
// // g_debugRender->DrawAxis(glm::vec3(lightPos));
//
// Camera* camera = g_cameraManager.GetActiveCamera();
// if (camera)
// lightPos = glm::vec4(camera->GetPosition(), 1.0f);
//
// g_shaderSystem->SetUniformFloat4(shader, UNIFORM_SUN_DIRECTION, &lightPos);
// }
//
// if (shader->HasUniform(UNIFORM_SUN_AMBIENT))
// {
// glm::vec4 lightColor = glm::vec4(0.1f);
// g_shaderSystem->SetUniformFloat4(shader, UNIFORM_SUN_AMBIENT, &lightColor);
// }
//
// g_texturesManager->SetTexture(0, albedoTexture);
// g_shaderSystem->SetUniformSampler(shader, SAMPLER_ALBEDO, 0);
//}
//
//void SceneStaticMesh::RenderObjects()
//{
// glFrontFace(GL_CCW);
// glDepthFunc(GL_LESS);
//
// g_renderDevice->SetCullFace(true);
// g_renderDevice->SetDepthTest(true);
// g_renderDevice->SetDepthWrite(true);
//
// g_renderDevice->SetBlending(false);
//
// g_renderDevice->SetVerticesBuffer(m_vb);
//
// R_SceneStaticMesh_BindShader(s_identity, m_albedoTexture);
//
// g_renderDevice->DrawArrays(PT_TRIANGLES, 0, m_vbcount);
//
// g_NumModels++;
//}