mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-12-21 10:49:23 +00:00
Completely overhauled resource loading in preparation for projects
This commit is contained in:
@@ -2,8 +2,8 @@
|
||||
#include <iostream>
|
||||
#include <list>
|
||||
|
||||
CBasicModel::CBasicModel()
|
||||
: CResource()
|
||||
CBasicModel::CBasicModel(CResourceEntry *pEntry /*= 0*/)
|
||||
: CResource(pEntry)
|
||||
, mVertexCount(0)
|
||||
, mTriangleCount(0)
|
||||
, mBuffered(false)
|
||||
|
||||
@@ -21,7 +21,7 @@ protected:
|
||||
std::vector<SSurface*> mSurfaces;
|
||||
|
||||
public:
|
||||
CBasicModel();
|
||||
CBasicModel(CResourceEntry *pEntry = 0);
|
||||
~CBasicModel();
|
||||
|
||||
u32 GetVertexCount();
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
#include "CModel.h"
|
||||
#include "Core/Render/CDrawUtil.h"
|
||||
#include "Core/Render/CRenderer.h"
|
||||
#include "Core/Resource/Area/CGameArea.h"
|
||||
#include "Core/OpenGL/GLCommon.h"
|
||||
#include <Common/AssertMacro.h>
|
||||
|
||||
CModel::CModel()
|
||||
: CBasicModel()
|
||||
CModel::CModel(CResourceEntry *pEntry /*= 0*/)
|
||||
: CBasicModel(pEntry)
|
||||
{
|
||||
mHasOwnMaterials = true;
|
||||
mHasOwnSurfaces = true;
|
||||
|
||||
@@ -21,7 +21,7 @@ class CModel : public CBasicModel
|
||||
bool mHasOwnMaterials;
|
||||
|
||||
public:
|
||||
CModel();
|
||||
CModel(CResourceEntry *pEntry = 0);
|
||||
CModel(CMaterialSet *pSet, bool OwnsMatSet);
|
||||
~CModel();
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include "Core/OpenGL/GLCommon.h"
|
||||
|
||||
CStaticModel::CStaticModel()
|
||||
: CBasicModel()
|
||||
: CBasicModel(nullptr)
|
||||
, mpMaterial(nullptr)
|
||||
, mTransparent(false)
|
||||
{
|
||||
@@ -75,11 +75,11 @@ void CStaticModel::BufferGL()
|
||||
}
|
||||
|
||||
// Make sure the number of submesh offset vectors matches the number of IBOs, then add the offsets
|
||||
while (mIBOs.size() > mSubmeshEndOffsets.size())
|
||||
mSubmeshEndOffsets.emplace_back(std::vector<u32>(mSurfaces.size()));
|
||||
while (mIBOs.size() > mSurfaceEndOffsets.size())
|
||||
mSurfaceEndOffsets.emplace_back(std::vector<u32>(mSurfaces.size()));
|
||||
|
||||
for (u32 iIBO = 0; iIBO < mIBOs.size(); iIBO++)
|
||||
mSubmeshEndOffsets[iIBO][iSurf] = mIBOs[iIBO].GetSize();
|
||||
mSurfaceEndOffsets[iIBO][iSurf] = mIBOs[iIBO].GetSize();
|
||||
}
|
||||
|
||||
mVBO.Buffer();
|
||||
@@ -101,7 +101,7 @@ void CStaticModel::ClearGLBuffer()
|
||||
{
|
||||
mVBO.Clear();
|
||||
mIBOs.clear();
|
||||
mSubmeshEndOffsets.clear();
|
||||
mSurfaceEndOffsets.clear();
|
||||
mBuffered = false;
|
||||
}
|
||||
|
||||
@@ -139,8 +139,8 @@ void CStaticModel::DrawSurface(FRenderOptions Options, u32 Surface)
|
||||
{
|
||||
// Since there is a shared IBO for every mesh, we need two things to draw a single one: an offset and a size
|
||||
u32 Offset = 0;
|
||||
if (Surface > 0) Offset = mSubmeshEndOffsets[iIBO][Surface - 1];
|
||||
u32 Size = mSubmeshEndOffsets[iIBO][Surface] - Offset;
|
||||
if (Surface > 0) Offset = mSurfaceEndOffsets[iIBO][Surface - 1];
|
||||
u32 Size = mSurfaceEndOffsets[iIBO][Surface] - Offset;
|
||||
|
||||
if (!Size) continue; // The chosen submesh doesn't use this IBO
|
||||
|
||||
@@ -179,7 +179,7 @@ CMaterial* CStaticModel::GetMaterial()
|
||||
void CStaticModel::SetMaterial(CMaterial *pMat)
|
||||
{
|
||||
mpMaterial = pMat;
|
||||
mTransparent = ((pMat->Options() & CMaterial::eTransparent) != 0);
|
||||
mTransparent = pMat->Options().HasFlag(CMaterial::eTransparent);
|
||||
}
|
||||
|
||||
bool CStaticModel::IsTransparent()
|
||||
@@ -189,7 +189,7 @@ bool CStaticModel::IsTransparent()
|
||||
|
||||
bool CStaticModel::IsOccluder()
|
||||
{
|
||||
return ((mpMaterial->Options() & CMaterial::eOccluder) != 0);
|
||||
return mpMaterial->Options().HasFlag(CMaterial::eOccluder);
|
||||
}
|
||||
|
||||
CIndexBuffer* CStaticModel::InternalGetIBO(EGXPrimitiveType Primitive)
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
#include "Core/Render/FRenderOptions.h"
|
||||
#include "Core/OpenGL/CIndexBuffer.h"
|
||||
|
||||
/* A CStaticModel is meant for meshes that don't move. It's built specifically with terrain in mind.
|
||||
* It only links to one material, and what it does best is combining submeshes from different models
|
||||
* into shared VBOs and IBOs. This allows for a significantly reduced number of draw calls. */
|
||||
/* A CStaticModel is meant for meshes that don't move. It only links to one material,
|
||||
* and is used to combine surfaces from different world models into shared VBOs and
|
||||
* IBOs. This allows for a significantly reduced number of draw calls. */
|
||||
class CStaticModel : public CBasicModel
|
||||
{
|
||||
CMaterial *mpMaterial;
|
||||
std::vector<CIndexBuffer> mIBOs;
|
||||
std::vector<std::vector<u32>> mSubmeshEndOffsets;
|
||||
std::vector<std::vector<u32>> mSurfaceEndOffsets;
|
||||
bool mTransparent;
|
||||
|
||||
public:
|
||||
|
||||
Reference in New Issue
Block a user