Files
pke/src/render/modelsystem.cpp
2026-03-05 01:42:40 +03:00

126 lines
2.7 KiB
C++

#include <assert.h>
#include <vector>
#include <string>
#include "ifilesystem.h"
#include "log.h"
#include "render.h"
#include "gpu_buffer.h"
#include "shader.h"
#include "shadersystem.h"
#include "renderdevice.h"
#include "model.h"
#include "modelsystem.h"
#include "texturesmanager.h"
ModelSystem* g_modelSystem = nullptr;
static InputLayoutDesc_t g_staticVertexLayout[] = {
{ VERTEXATTR_VEC3, SHADERSEMANTIC_POSITION },
{ VERTEXATTR_VEC3, SHADERSEMANTIC_NORMAL },
{ VERTEXATTR_VEC2, SHADERSEMANTIC_TEXCOORD },
};
static InputLayoutDesc_t g_skinnedVertexLayout[] = {
{ VERTEXATTR_VEC3, SHADERSEMANTIC_POSITION },
{ VERTEXATTR_VEC3, SHADERSEMANTIC_NORMAL },
{ VERTEXATTR_VEC2, SHADERSEMANTIC_TEXCOORD }
};
Shader* g_unlitShader = nullptr;
Shader* g_litShader = nullptr;
static std::string getFileNameWithoutExtension(const std::string& filename)
{
size_t lastindex = filename.find_last_of(".");
if (lastindex != std::string::npos) {
return filename.substr(0, lastindex);
}
return filename;
}
ModelSystem::ModelSystem()
{
}
ModelSystem::~ModelSystem()
{
}
void ModelSystem::Init()
{
// Load unlighted model generic shader
g_unlitShader = g_shaderSystem->CreateShader("unlit_generic", "data/shaders/unlit_generic.vs", "data/shaders/unlit_generic.ps",
g_staticVertexLayout, sizeof(g_staticVertexLayout) / sizeof(g_staticVertexLayout[0]));
// Load lighted model generic shader
g_litShader = g_shaderSystem->CreateShader("lit_generic", "data/shaders/lit_generic.vs", "data/shaders/lit_generic.ps",
g_staticVertexLayout, sizeof(g_staticVertexLayout) / sizeof(g_staticVertexLayout[0]));
}
void ModelSystem::Shutdown()
{
for (int i = 0; i < m_models.size(); i++)
{
if (m_models[i].model)
{
delete m_models[i].model;
m_models[i].model = nullptr;
}
}
m_models.clear();
}
Model* ModelSystem::LoadModel(const char* filename)
{
auto it = std::find_if(m_models.begin(), m_models.end(), [=](const ModelEntry& entry) { return strcmp(entry.filename, filename) == 0; });
if (it != m_models.end())
{
return it->model;
}
if (!GetFileSystem()->IsExist(filename))
{
Msg("ModelSystem::LoadModel: File '%s' not exist.", filename);
return nullptr;
}
Model* model = new Model();
if (strstr(filename, ".obj"))
{
model->LoadObj(filename);
}
else
{
// Find file extension
size_t stringLength = strlen(filename);
for (int i = stringLength; i > 0; --i)
{
if (filename[i] == '.')
{
stringLength = i;
break;
}
}
const char* fileExtension = &filename[stringLength];
Msg("ModelSystem::LoadModel: Unknowed file format '%s'", filename, fileExtension);
return nullptr;
}
ModelEntry entry = {};
strcpy(entry.filename, filename);
entry.model = model;
m_models.push_back(entry);
Msg("Loaded Model '%s'", filename);
return model;
}