Merge pull request #111 from SHADE-DP/SP3-13-Assets-Manager
Restructured Asset Manager with Generalised Template Types for Asset Data All asset types are derived from asset type for casting and storing to facilitate general GetData function
This commit is contained in:
commit
5f73e8d1c0
|
@ -1,3 +1,3 @@
|
||||||
Name: Cube.003
|
Name: Cube.003
|
||||||
ID: 110152941
|
ID: 110152941
|
||||||
Type:
|
Type: 6
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
Name: Cube.012
|
Name: Cube.012
|
||||||
ID: 107348815
|
ID: 107348815
|
||||||
Type:
|
Type: 6
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
Name: RaccoonPreTexturedVer1_Base9
|
Name: RaccoonPreTexturedVer1_Base9
|
||||||
ID: 91918845
|
ID: 91918845
|
||||||
Type:
|
Type: 4
|
||||||
|
|
|
@ -52,7 +52,7 @@ namespace Sandbox
|
||||||
if (asset.name == "Cube.012")
|
if (asset.name == "Cube.012")
|
||||||
handles.emplace_back(SHResourceManager::LoadOrGet<SHMesh>(asset.id));
|
handles.emplace_back(SHResourceManager::LoadOrGet<SHMesh>(asset.id));
|
||||||
break;
|
break;
|
||||||
case AssetType::TEXTURE:
|
case AssetType::IMAGE:
|
||||||
texHandles.emplace_back(SHResourceManager::LoadOrGet<SHTexture>(asset.id));
|
texHandles.emplace_back(SHResourceManager::LoadOrGet<SHTexture>(asset.id));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHAnimationAsset.h
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date October 2022
|
||||||
|
* \brief
|
||||||
|
*
|
||||||
|
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
*****************************************************************************/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <assimp/anim.h>
|
||||||
|
#include "SH_API.power h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
struct SH_API SHAnimationAsset
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
|
||||||
|
std::vector<aiNodeAnim*> nodeChannels;
|
||||||
|
std::vector<aiMeshAnim*> meshChannels;
|
||||||
|
std::vector<aiMeshMorphAnim*> morphMeshChannels;
|
||||||
|
|
||||||
|
double duration;
|
||||||
|
double ticksPerSecond;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHAnimationAsset.h
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date October 2022
|
||||||
|
* \brief
|
||||||
|
*
|
||||||
|
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
*****************************************************************************/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <assimp/anim.h>
|
||||||
|
#include "SHAssetData.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
struct SH_API SHAnimationAsset : SHAssetData
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
|
||||||
|
std::vector<aiNodeAnim*> nodeChannels;
|
||||||
|
std::vector<aiMeshAnim*> meshChannels;
|
||||||
|
std::vector<aiMeshMorphAnim*> morphMeshChannels;
|
||||||
|
|
||||||
|
double duration;
|
||||||
|
double ticksPerSecond;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHAssetDataBase.h
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date October 2022
|
||||||
|
* \brief
|
||||||
|
*
|
||||||
|
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
*****************************************************************************/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
struct SHAssetData
|
||||||
|
{
|
||||||
|
virtual ~SHAssetData(){}
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "SHMeshAsset.h"
|
||||||
|
#include "SHTextureAsset.h"
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHInternalAsset.h
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date October 2022
|
||||||
|
* \brief
|
||||||
|
*
|
||||||
|
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
*****************************************************************************/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "SHAsset.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
struct SHInternalAsset : SHAsset
|
||||||
|
{
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "Math/SHMath.h"
|
#include "Math/SHMath.h"
|
||||||
#include "SH_API.h"
|
#include "SHAssetData.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -22,10 +22,10 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
uint32_t vertexCount;
|
uint32_t vertexCount;
|
||||||
uint32_t indexCount;
|
uint32_t indexCount;
|
||||||
std::string meshName;
|
std::string name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SH_API SHMeshAsset
|
struct SH_API SHMeshAsset : SHAssetData
|
||||||
{
|
{
|
||||||
bool compiled;
|
bool compiled;
|
||||||
bool changed;
|
bool changed;
|
||||||
|
|
|
@ -2,10 +2,11 @@
|
||||||
|
|
||||||
#include "tinyddsloader.h"
|
#include "tinyddsloader.h"
|
||||||
#include "Graphics/MiddleEnd/Textures/SHTextureLibrary.h"
|
#include "Graphics/MiddleEnd/Textures/SHTextureLibrary.h"
|
||||||
|
#include "SHAssetData.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
struct SHTextureAsset
|
struct SHTextureAsset : SHAssetData
|
||||||
{
|
{
|
||||||
bool compiled;
|
bool compiled;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHAssetLoader.h
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date October 2022
|
||||||
|
* \brief
|
||||||
|
*
|
||||||
|
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
*****************************************************************************/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Assets/Asset Types/SHAssetData.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
struct SHAssetLoader
|
||||||
|
{
|
||||||
|
virtual SHAssetData* Load(AssetPath path) = 0;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,141 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHAssimpLibrary.cpp
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date October 2022
|
||||||
|
* \brief
|
||||||
|
*
|
||||||
|
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "SHpch.h"
|
||||||
|
#include "SHAssimpLibrary.h"
|
||||||
|
#include <assimp/postprocess.h>
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
Assimp::Importer SHAssimpLibrary::aiImporter;
|
||||||
|
|
||||||
|
void SHAssimpLibrary::ProcessNode(aiNode const& node, aiScene const& scene, MeshVectorRef meshes) noexcept
|
||||||
|
{
|
||||||
|
for (size_t i {0}; i < node.mNumMeshes; ++i)
|
||||||
|
{
|
||||||
|
aiMesh* mesh = scene.mMeshes[node.mMeshes[i]];
|
||||||
|
meshes.push_back(ProcessMesh(*mesh));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i{ 0 }; i < node.mNumChildren; ++i)
|
||||||
|
{
|
||||||
|
ProcessNode(*node.mChildren[i], scene, meshes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHAssimpLibrary::ExtractAnimations(aiScene const& scene, AnimVectorRef anims) noexcept
|
||||||
|
{
|
||||||
|
if (scene.HasAnimations())
|
||||||
|
{
|
||||||
|
std::vector<SHAnimationAsset> anims(scene.mNumAnimations);
|
||||||
|
for (auto i{0}; i < scene.mNumAnimations; ++i)
|
||||||
|
{
|
||||||
|
auto const& anim {*scene.mAnimations[i]};
|
||||||
|
|
||||||
|
anims[i].name = anim.mName.C_Str();
|
||||||
|
|
||||||
|
anims[i].duration = anim.mDuration;
|
||||||
|
anims[i].ticksPerSecond = anim.mTicksPerSecond;
|
||||||
|
|
||||||
|
std::copy_n(anim.mChannels, anim.mNumChannels, anims[i].nodeChannels.data());
|
||||||
|
std::copy_n(anim.mMeshChannels, anim.mNumMeshChannels, anims[i].meshChannels.data());
|
||||||
|
std::copy_n(anim.mMorphMeshChannels, anim.mNumMorphMeshChannels, anims[i].morphMeshChannels.data());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SHMeshAsset* SHAssimpLibrary::ProcessMesh(aiMesh const& mesh) noexcept
|
||||||
|
{
|
||||||
|
SHMeshAsset* result = new SHMeshAsset();
|
||||||
|
result->compiled = false;
|
||||||
|
result->changed = false;
|
||||||
|
|
||||||
|
for (size_t i{0}; i < mesh.mNumVertices; ++i)
|
||||||
|
{
|
||||||
|
// Vertex position
|
||||||
|
SHVec3 vertex;
|
||||||
|
vertex.x = mesh.mVertices[i].x;
|
||||||
|
vertex.y = mesh.mVertices[i].y;
|
||||||
|
vertex.z = mesh.mVertices[i].z;
|
||||||
|
result->vertexPosition.push_back(vertex);
|
||||||
|
|
||||||
|
// Tex coords
|
||||||
|
SHVec2 texCoord{0.f, 0.f};
|
||||||
|
if (mesh.mTextureCoords[0])
|
||||||
|
{
|
||||||
|
texCoord.x = mesh.mTextureCoords[0][i].x;
|
||||||
|
texCoord.y = mesh.mTextureCoords[0][i].y;
|
||||||
|
}
|
||||||
|
result->texCoords.push_back(texCoord);
|
||||||
|
|
||||||
|
// Normals
|
||||||
|
SHVec3 normal{0.f, 0.f, 0.f};
|
||||||
|
if (mesh.mNormals)
|
||||||
|
{
|
||||||
|
normal.x = mesh.mNormals[i].x;
|
||||||
|
normal.y = mesh.mNormals[i].y;
|
||||||
|
normal.z = mesh.mNormals[i].z;
|
||||||
|
}
|
||||||
|
result->vertexNormal.push_back(normal);
|
||||||
|
|
||||||
|
// Tangent
|
||||||
|
SHVec3 tangent{0.f, 0.f, 0.f};
|
||||||
|
if (mesh.mTangents)
|
||||||
|
{
|
||||||
|
tangent.x = mesh.mTangents[i].x;
|
||||||
|
tangent.y = mesh.mTangents[i].y;
|
||||||
|
tangent.z = mesh.mTangents[i].z;
|
||||||
|
}
|
||||||
|
result->vertexTangent.push_back(tangent);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i {0}; i < mesh.mNumFaces; ++i)
|
||||||
|
{
|
||||||
|
aiFace face = mesh.mFaces[i];
|
||||||
|
for (size_t j{0}; j < face.mNumIndices; ++j)
|
||||||
|
{
|
||||||
|
result->indices.push_back(face.mIndices[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result->header.vertexCount = static_cast<uint32_t>(result->vertexPosition.size());
|
||||||
|
result->header.indexCount = static_cast<uint32_t>(result->indices.size());
|
||||||
|
result->header.name = mesh.mName.C_Str();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHAssimpLibrary::LoadFromFile(AssetPath path, MeshVectorRef meshes, AnimVectorRef anims) noexcept
|
||||||
|
{
|
||||||
|
const aiScene* scene = aiImporter.ReadFile(path.string().c_str(),
|
||||||
|
aiProcess_Triangulate // Make sure we get triangles rather than nvert polygons
|
||||||
|
| aiProcess_GenUVCoords // Convert any type of mapping to uv mapping
|
||||||
|
| aiProcess_TransformUVCoords // preprocess UV transformations (scaling, translation ...)
|
||||||
|
| aiProcess_FindInstances // search for instanced meshes and remove them by references to one master
|
||||||
|
| aiProcess_CalcTangentSpace // calculate tangents and bitangents if possible
|
||||||
|
| aiProcess_JoinIdenticalVertices // join identical vertices/ optimize indexing
|
||||||
|
| aiProcess_RemoveRedundantMaterials // remove redundant materials
|
||||||
|
| aiProcess_FindInvalidData // detect invalid model data, such as invalid normal vectors
|
||||||
|
| aiProcess_FlipUVs // flip the V to match the Vulkans way of doing UVs
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!scene || !scene->HasMeshes())
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("ERROR in GLTF::ASSIMP: {}\nFile: {}", aiImporter.GetErrorString(), path.string());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ExtractAnimations(*scene, anims);
|
||||||
|
|
||||||
|
ProcessNode(*scene->mRootNode, *scene, meshes);
|
||||||
|
|
||||||
|
aiImporter.FreeScene();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHAssimpLibrary.h
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date October 2022
|
||||||
|
* \brief
|
||||||
|
*
|
||||||
|
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <assimp/Importer.hpp>
|
||||||
|
#include <assimp/scene.h>
|
||||||
|
#include <vector>
|
||||||
|
#include "../SHAssetMacros.h"
|
||||||
|
#include "../Asset Types/SHMeshAsset.h"
|
||||||
|
#include "../Asset Types/SHAnimationAsset.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
class SHAssimpLibrary
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
using MeshVectorRef = std::vector<SHMeshAsset*>&;
|
||||||
|
using AnimVectorRef = std::vector<SHAnimationAsset*>&;
|
||||||
|
|
||||||
|
static Assimp::Importer aiImporter;
|
||||||
|
static void ProcessNode(aiNode const& node, aiScene const& scene,MeshVectorRef meshes) noexcept;
|
||||||
|
static void ExtractAnimations(aiScene const& scene, AnimVectorRef anims) noexcept;
|
||||||
|
static SHMeshAsset* ProcessMesh(aiMesh const& mesh) noexcept;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static void LoadFromFile(AssetPath path, MeshVectorRef meshes, AnimVectorRef anims) noexcept;
|
||||||
|
};
|
||||||
|
}
|
|
@ -20,7 +20,7 @@ std::string SHADE::SHMeshCompiler::CompileMeshBinary(SHMeshAsset const& asset, A
|
||||||
{
|
{
|
||||||
std::string newPath{ path.string() };
|
std::string newPath{ path.string() };
|
||||||
newPath = newPath.substr(0, newPath.find_last_of('/') + 1);
|
newPath = newPath.substr(0, newPath.find_last_of('/') + 1);
|
||||||
newPath += asset.header.meshName + MESH_EXTENSION;
|
newPath += asset.header.name + MESH_EXTENSION.data();
|
||||||
|
|
||||||
std::ofstream file{ newPath, std::ios::out | std::ios::binary | std::ios::trunc };
|
std::ofstream file{ newPath, std::ios::out | std::ios::binary | std::ios::trunc };
|
||||||
if (!file.is_open())
|
if (!file.is_open())
|
||||||
|
|
|
@ -12,129 +12,11 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#include "SHpch.h"
|
#include "SHpch.h"
|
||||||
#include "SHMeshLoader.h"
|
#include "SHMeshLoader.h"
|
||||||
#include <assimp/postprocess.h>
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
Assimp::Importer SHMeshLoader::aiImporter;
|
void SHMeshLoader::LoadSHMesh(AssetPath path, SHMeshAsset& mesh) noexcept
|
||||||
|
|
||||||
void SHMeshLoader::ProcessNode(aiNode const& node, aiScene const& scene, std::vector<SHMeshAsset>& meshes) noexcept
|
|
||||||
{
|
|
||||||
for (size_t i {0}; i < node.mNumMeshes; ++i)
|
|
||||||
{
|
|
||||||
aiMesh* mesh = scene.mMeshes[node.mMeshes[i]];
|
|
||||||
meshes.push_back(ProcessMesh(*mesh, scene));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t i{ 0 }; i < node.mNumChildren; ++i)
|
|
||||||
{
|
|
||||||
ProcessNode(*node.mChildren[i], scene, meshes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SHMeshAsset SHMeshLoader::ProcessMesh(aiMesh const& mesh, aiScene const& scene) noexcept
|
|
||||||
{
|
|
||||||
(void)scene;
|
|
||||||
|
|
||||||
SHMeshAsset result
|
|
||||||
{
|
|
||||||
.compiled { false},
|
|
||||||
.changed { false }
|
|
||||||
};
|
|
||||||
|
|
||||||
for (size_t i{0}; i < mesh.mNumVertices; ++i)
|
|
||||||
{
|
|
||||||
// Vertex position
|
|
||||||
SHVec3 vertex;
|
|
||||||
vertex.x = mesh.mVertices[i].x;
|
|
||||||
vertex.y = mesh.mVertices[i].y;
|
|
||||||
vertex.z = mesh.mVertices[i].z;
|
|
||||||
result.vertexPosition.push_back(vertex);
|
|
||||||
|
|
||||||
// Tex coords
|
|
||||||
SHVec2 texCoord{0.f, 0.f};
|
|
||||||
if (mesh.mTextureCoords[0])
|
|
||||||
{
|
|
||||||
texCoord.x = mesh.mTextureCoords[0][i].x;
|
|
||||||
texCoord.y = mesh.mTextureCoords[0][i].y;
|
|
||||||
}
|
|
||||||
result.texCoords.push_back(texCoord);
|
|
||||||
|
|
||||||
// Normals
|
|
||||||
SHVec3 normal{0.f, 0.f, 0.f};
|
|
||||||
if (mesh.mNormals)
|
|
||||||
{
|
|
||||||
normal.x = mesh.mNormals[i].x;
|
|
||||||
normal.y = mesh.mNormals[i].y;
|
|
||||||
normal.z = mesh.mNormals[i].z;
|
|
||||||
}
|
|
||||||
result.vertexNormal.push_back(normal);
|
|
||||||
|
|
||||||
// Tangent
|
|
||||||
SHVec3 tangent{0.f, 0.f, 0.f};
|
|
||||||
if (mesh.mTangents)
|
|
||||||
{
|
|
||||||
tangent.x = mesh.mTangents[i].x;
|
|
||||||
tangent.y = mesh.mTangents[i].y;
|
|
||||||
tangent.z = mesh.mTangents[i].z;
|
|
||||||
}
|
|
||||||
result.vertexTangent.push_back(tangent);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t i {0}; i < mesh.mNumFaces; ++i)
|
|
||||||
{
|
|
||||||
aiFace face = mesh.mFaces[i];
|
|
||||||
for (size_t j{0}; j < face.mNumIndices; ++j)
|
|
||||||
{
|
|
||||||
result.indices.push_back(face.mIndices[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result.header.vertexCount = static_cast<uint32_t>(result.vertexPosition.size());
|
|
||||||
result.header.indexCount = static_cast<uint32_t>(result.indices.size());
|
|
||||||
result.header.meshName = mesh.mName.C_Str();
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SHMeshLoader::LoadExternal(std::vector<SHMeshAsset>& meshes, AssetPath path) noexcept
|
|
||||||
{
|
|
||||||
const aiScene* scene = aiImporter.ReadFile(path.string().c_str(),
|
|
||||||
aiProcess_Triangulate // Make sure we get triangles rather than nvert polygons
|
|
||||||
| aiProcess_GenUVCoords // Convert any type of mapping to uv mapping
|
|
||||||
| aiProcess_TransformUVCoords // preprocess UV transformations (scaling, translation ...)
|
|
||||||
| aiProcess_FindInstances // search for instanced meshes and remove them by references to one master
|
|
||||||
| aiProcess_CalcTangentSpace // calculate tangents and bitangents if possible
|
|
||||||
| aiProcess_JoinIdenticalVertices // join identical vertices/ optimize indexing
|
|
||||||
| aiProcess_RemoveRedundantMaterials // remove redundant materials
|
|
||||||
| aiProcess_FindInvalidData // detect invalid model data, such as invalid normal vectors
|
|
||||||
| aiProcess_FlipUVs // flip the V to match the Vulkans way of doing UVs
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!scene || !scene->HasMeshes())
|
|
||||||
{
|
|
||||||
SHLOG_ERROR("ERROR in GLTF::ASSIMP: {}\nFile: {}", aiImporter.GetErrorString(), path.string());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO MATERIALS FROM MESHES
|
|
||||||
//if (scene->HasMaterials())
|
|
||||||
//{
|
|
||||||
// for (int i{0}; i < scene->mNumMaterials; ++i)
|
|
||||||
// {
|
|
||||||
// if (scene->mMaterials[i]->mNumProperties > 0)
|
|
||||||
// {
|
|
||||||
// for (int j{0}; j < scene->mMaterials[i]->mProperties[j].)
|
|
||||||
// }
|
|
||||||
//std::cout << scene->mMaterials[i]->;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
ProcessNode(*scene->mRootNode, *scene, meshes);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SHMeshLoader::LoadSHMesh(SHMeshAsset& mesh, AssetPath path) noexcept
|
|
||||||
{
|
{
|
||||||
std::ifstream file{ path.string(), std::ios::in | std::ios::binary };
|
std::ifstream file{ path.string(), std::ios::in | std::ios::binary };
|
||||||
if (!file.is_open())
|
if (!file.is_open())
|
||||||
|
@ -168,45 +50,13 @@ namespace SHADE
|
||||||
file.read(reinterpret_cast<char *>(vertNorm.data()), vertexVec3Byte);
|
file.read(reinterpret_cast<char *>(vertNorm.data()), vertexVec3Byte);
|
||||||
file.read(reinterpret_cast<char *>(texCoord.data()), vertexVec2Byte);
|
file.read(reinterpret_cast<char *>(texCoord.data()), vertexVec2Byte);
|
||||||
file.read(reinterpret_cast<char *>(indices.data()), sizeof(uint32_t) * indexCount);
|
file.read(reinterpret_cast<char *>(indices.data()), sizeof(uint32_t) * indexCount);
|
||||||
|
|
||||||
//for (auto i{ 0 }; i < vertCount; ++i)
|
|
||||||
//{
|
|
||||||
// file >> vertPos[i].x;
|
|
||||||
// file >> vertPos[i].y;
|
|
||||||
// file >> vertPos[i].z;
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//for (auto i{ 0 }; i < vertCount; ++i)
|
|
||||||
//{
|
|
||||||
// file >> vertTan[i].x;
|
|
||||||
// file >> vertTan[i].y;
|
|
||||||
// file >> vertTan[i].z;
|
|
||||||
//}
|
|
||||||
|
|
||||||
//for (auto i{ 0 }; i < vertCount; ++i)
|
|
||||||
//{
|
|
||||||
// file >> vertNorm[i].x;
|
|
||||||
// file >> vertNorm[i].y;
|
|
||||||
// file >> vertNorm[i].z;
|
|
||||||
//}
|
|
||||||
|
|
||||||
//for (auto i{ 0 }; i < vertCount; ++i)
|
|
||||||
//{
|
|
||||||
// file >> texCoord[i].x;
|
|
||||||
// file >> texCoord[i].y;
|
|
||||||
//}
|
|
||||||
|
|
||||||
//for (auto i{ 0 }; i < indexCount; ++i)
|
|
||||||
//{
|
|
||||||
// file >> indices[i];
|
|
||||||
//}
|
|
||||||
|
|
||||||
mesh.compiled = true;
|
mesh.compiled = true;
|
||||||
mesh.changed = false;
|
mesh.changed = false;
|
||||||
|
|
||||||
mesh.header.indexCount = indexCount;
|
mesh.header.indexCount = indexCount;
|
||||||
mesh.header.vertexCount = vertCount;
|
mesh.header.vertexCount = vertCount;
|
||||||
mesh.header.meshName = name;
|
mesh.header.name = name;
|
||||||
|
|
||||||
mesh.vertexPosition = std::move(vertPos);
|
mesh.vertexPosition = std::move(vertPos);
|
||||||
mesh.vertexTangent = std::move(vertTan);
|
mesh.vertexTangent = std::move(vertTan);
|
||||||
|
@ -217,15 +67,12 @@ namespace SHADE
|
||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHMeshLoader::LoadMesh(std::vector<SHMeshAsset>& meshes, AssetPath path) noexcept
|
SHAssetData* SHMeshLoader::Load(AssetPath path)
|
||||||
{
|
{
|
||||||
if (path.extension().string() == GLTF_EXTENSION)
|
auto result = new SHMeshAsset();
|
||||||
{
|
|
||||||
LoadExternal(meshes, path);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
meshes.emplace_back();
|
LoadSHMesh(path, *result);
|
||||||
LoadSHMesh(meshes.back(), path);
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,27 +10,15 @@
|
||||||
* of DigiPen Institute of Technology is prohibited.
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <assimp/Importer.hpp>
|
|
||||||
#include <assimp/scene.h>
|
|
||||||
#include "../SHAssetMacros.h"
|
#include "../SHAssetMacros.h"
|
||||||
#include "../Asset Types/SHMeshAsset.h"
|
#include "../Asset Types/SHMeshAsset.h"
|
||||||
#include <vector>
|
#include "SHAssetLoader.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
class SHMeshLoader
|
struct SHMeshLoader : public SHAssetLoader
|
||||||
{
|
{
|
||||||
private:
|
void LoadSHMesh(AssetPath path, SHMeshAsset& meshes) noexcept;
|
||||||
static Assimp::Importer aiImporter;
|
SHAssetData* Load(AssetPath path) override;
|
||||||
|
|
||||||
static void ProcessNode(aiNode const& node, aiScene const& scene, std::vector<SHMeshAsset>& meshes) noexcept;
|
|
||||||
|
|
||||||
static SHMeshAsset ProcessMesh(aiMesh const& mesh, aiScene const& scene) noexcept;
|
|
||||||
|
|
||||||
static void LoadExternal(std::vector<SHMeshAsset>& meshes, AssetPath path) noexcept;
|
|
||||||
|
|
||||||
public:
|
|
||||||
static void LoadMesh(std::vector<SHMeshAsset>& meshes, AssetPath path) noexcept;
|
|
||||||
static void LoadSHMesh(SHMeshAsset& meshes, AssetPath path) noexcept;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -133,6 +133,15 @@ namespace SHADE
|
||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SHAssetData* SHTextureLoader::Load(AssetPath path)
|
||||||
|
{
|
||||||
|
auto result = new SHTextureAsset();
|
||||||
|
|
||||||
|
LoadImageAsset(path, *result);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void SHTextureLoader::LoadImageAsset(AssetPath path, SHTextureAsset& asset)
|
void SHTextureLoader::LoadImageAsset(AssetPath path, SHTextureAsset& asset)
|
||||||
{
|
{
|
||||||
if (path.extension().string() == DDS_EXTENSION)
|
if (path.extension().string() == DDS_EXTENSION)
|
||||||
|
|
|
@ -15,19 +15,20 @@
|
||||||
#include "../SHAssetMacros.h"
|
#include "../SHAssetMacros.h"
|
||||||
#include "../Asset Types/SHTextureAsset.h"
|
#include "../Asset Types/SHTextureAsset.h"
|
||||||
#include "tinyddsloader.h"
|
#include "tinyddsloader.h"
|
||||||
|
#include "SHAssetLoader.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
class SHTextureLoader
|
class SHTextureLoader : public SHAssetLoader
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
static std::string TinyDDSResultToString(tinyddsloader::Result value);
|
std::string TinyDDSResultToString(tinyddsloader::Result value);
|
||||||
static vk::Format ddsLoaderToVkFormat(tinyddsloader::DDSFile::DXGIFormat format, bool isLinear);
|
vk::Format ddsLoaderToVkFormat(tinyddsloader::DDSFile::DXGIFormat format, bool isLinear);
|
||||||
|
|
||||||
|
void LoadTinyDDS(AssetPath path, SHTextureAsset& asset) noexcept;
|
||||||
static void LoadTinyDDS(AssetPath path, SHTextureAsset& asset) noexcept;
|
|
||||||
public:
|
public:
|
||||||
static void LoadImageAsset(AssetPath paths, SHTextureAsset& image);
|
void LoadImageAsset(AssetPath paths, SHTextureAsset& image);
|
||||||
static void LoadSHTexture(AssetPath path, SHTextureAsset& asset) noexcept;
|
void LoadSHTexture(AssetPath path, SHTextureAsset& asset) noexcept;
|
||||||
|
SHAssetData* Load(AssetPath path) override;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,11 +12,12 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Filesystem/SHFileSystem.h"
|
#include "Filesystem/SHFileSystem.h"
|
||||||
#include "SHAssetMacros.h"
|
#include "Assets/SHAssetMacros.h"
|
||||||
|
#include "SH_API.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
struct SHAsset
|
struct SH_API SHAsset
|
||||||
{
|
{
|
||||||
AssetName name;
|
AssetName name;
|
||||||
AssetID id;
|
AssetID id;
|
||||||
|
|
|
@ -32,12 +32,12 @@ typedef std::filesystem::path AssetPath;
|
||||||
typedef unsigned char* AssetData;
|
typedef unsigned char* AssetData;
|
||||||
typedef std::string AssetMetaVersion;
|
typedef std::string AssetMetaVersion;
|
||||||
typedef std::string AssetExtension;
|
typedef std::string AssetExtension;
|
||||||
typedef unsigned char AssetTypeMeta;
|
typedef size_t AssetTypeMeta;
|
||||||
|
|
||||||
typedef FMOD::Sound* SHSound;
|
typedef FMOD::Sound* SHSound;
|
||||||
|
|
||||||
// Asset Meta Version
|
// Asset Meta Version
|
||||||
#define ASSET_META_VER "1.0"
|
constexpr std::string_view ASSET_META_VER { "1.0" };
|
||||||
|
|
||||||
// Asset type enum
|
// Asset type enum
|
||||||
enum class AssetType : AssetTypeMeta
|
enum class AssetType : AssetTypeMeta
|
||||||
|
@ -53,34 +53,35 @@ enum class AssetType : AssetTypeMeta
|
||||||
SCENE,
|
SCENE,
|
||||||
PREFAB,
|
PREFAB,
|
||||||
AUDIO_WAV,
|
AUDIO_WAV,
|
||||||
DDS
|
DDS,
|
||||||
|
MAX_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
//Directory
|
//Directory
|
||||||
#ifdef _PUBLISH
|
#ifdef _PUBLISH
|
||||||
#define ASSET_ROOT "Assets"
|
constexpr std::string_view ASSET_ROOT {"Assets"};
|
||||||
#else
|
#else
|
||||||
#define ASSET_ROOT "../../Assets"
|
constexpr std::string_view ASSET_ROOT {"../../Assets"};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// ASSET EXTENSIONS
|
// ASSET EXTENSIONS
|
||||||
#define META_EXTENSION ".shmeta"
|
constexpr std::string_view META_EXTENSION {".shmeta"};
|
||||||
#define IMAGE_EXTENSION ".png"
|
constexpr std::string_view IMAGE_EXTENSION {".png"};
|
||||||
#define AUDIO_EXTENSION ".ogg"
|
constexpr std::string_view AUDIO_EXTENSION {".ogg"};
|
||||||
#define AUDIO_WAV_EXTENSION ".wav"
|
constexpr std::string_view AUDIO_WAV_EXTENSION {".wav"};
|
||||||
#define SHADER_EXTENSION ".glsl"
|
constexpr std::string_view SHADER_EXTENSION {".glsl"};
|
||||||
#define SCRIPT_EXTENSION ".cs"
|
constexpr std::string_view SCRIPT_EXTENSION {".cs"};
|
||||||
#define SCENE_EXTENSION ".SHADE"
|
constexpr std::string_view SCENE_EXTENSION {".SHADE"};
|
||||||
#define PREFAB_EXTENSION ".SHPrefab"
|
constexpr std::string_view PREFAB_EXTENSION {".SHPrefab"};
|
||||||
#define MATERIAL_EXTENSION ".SHMat"
|
constexpr std::string_view MATERIAL_EXTENSION {".SHMat"};
|
||||||
#define TEXTURE_EXTENSION ".shtex"
|
constexpr std::string_view TEXTURE_EXTENSION {".shtex"};
|
||||||
#define DDS_EXTENSION ".dds"
|
constexpr std::string_view DDS_EXTENSION {".dds"};
|
||||||
#define FBX_EXTENSION ".fbx"
|
constexpr std::string_view FBX_EXTENSION {".fbx"};
|
||||||
#define GLTF_EXTENSION ".gltf"
|
constexpr std::string_view GLTF_EXTENSION {".gltf"};
|
||||||
#define MESH_EXTENSION ".shmesh"
|
constexpr std::string_view MESH_EXTENSION {".shmesh"};
|
||||||
|
|
||||||
std::string const EXTENSIONS[] = {
|
constexpr std::string_view EXTENSIONS[] = {
|
||||||
AUDIO_EXTENSION,
|
AUDIO_EXTENSION,
|
||||||
SHADER_EXTENSION,
|
SHADER_EXTENSION,
|
||||||
MATERIAL_EXTENSION,
|
MATERIAL_EXTENSION,
|
||||||
|
@ -96,10 +97,12 @@ std::string const EXTENSIONS[] = {
|
||||||
GLTF_EXTENSION
|
GLTF_EXTENSION
|
||||||
};
|
};
|
||||||
|
|
||||||
|
constexpr size_t TYPE_COUNT {static_cast<size_t>(AssetType::MAX_COUNT) };
|
||||||
|
|
||||||
// Error flags
|
// Error flags
|
||||||
#define FILE_NOT_FOUND_ERR "FILE NOT FOUND"
|
constexpr std::string_view FILE_NOT_FOUND_ERR {"FILE NOT FOUND"};
|
||||||
#define META_NOT_FOUND_ERR "META NOT FOUND"
|
constexpr std::string_view META_NOT_FOUND_ERR {"META NOT FOUND"};
|
||||||
#define ASSET_NOT_FOUND_ERR "ASSET NOT FOUND"
|
constexpr std::string_view ASSET_NOT_FOUND_ERR {"ASSET NOT FOUND"};
|
||||||
#define EXT_DOES_NOT_EXIST "TYPE DOES NOT HAVE EXTENSION DEFINED"
|
constexpr std::string_view EXT_DOES_NOT_EXIST {"TYPE DOES NOT HAVE EXTENSION DEFINED"};
|
||||||
|
|
||||||
#endif // !SH_ASSET_MACROS_H
|
#endif // !SH_ASSET_MACROS_H
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include "SHAssetMetaHandler.h"
|
#include "SHAssetMetaHandler.h"
|
||||||
#include "Filesystem/SHFileSystem.h"
|
#include "Filesystem/SHFileSystem.h"
|
||||||
|
|
||||||
|
#include "Libraries/SHAssimpLibrary.h"
|
||||||
#include "Libraries/SHMeshLoader.h"
|
#include "Libraries/SHMeshLoader.h"
|
||||||
#include "Libraries/SHTextureLoader.h"
|
#include "Libraries/SHTextureLoader.h"
|
||||||
|
|
||||||
|
@ -25,11 +26,10 @@ namespace SHADE
|
||||||
FMOD::System* SHAssetManager::audioSystem;
|
FMOD::System* SHAssetManager::audioSystem;
|
||||||
std::unordered_map<AssetID, SHSound >* SHAssetManager::audioSoundList;
|
std::unordered_map<AssetID, SHSound >* SHAssetManager::audioSoundList;
|
||||||
|
|
||||||
std::vector<SHAsset> SHAssetManager::assetCollection;
|
std::vector<SHAssetLoader*> SHAssetManager::loaders(TYPE_COUNT);
|
||||||
std::unordered_map<AssetID, SHAsset> SHAssetManager::assetRegistry;
|
|
||||||
|
|
||||||
std::unordered_map<AssetID, SHMeshAsset> SHAssetManager::meshCollection;
|
std::vector<SHAsset> SHAssetManager::assetCollection;
|
||||||
std::unordered_map<AssetID, SHTextureAsset> SHAssetManager::textureCollection;
|
std::unordered_map<AssetID, SHAssetData * const> SHAssetManager::assetData;
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* \brief Static function to generate asset ID.
|
* \brief Static function to generate asset ID.
|
||||||
|
@ -56,18 +56,15 @@ namespace SHADE
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
void SHAssetManager::Unload() noexcept
|
void SHAssetManager::Unload() noexcept
|
||||||
{
|
{
|
||||||
for (auto const& asset : assetCollection)
|
|
||||||
{
|
|
||||||
SHAssetMetaHandler::WriteMetaData(asset);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHAssetManager::Unload(AssetID assetId) noexcept
|
void SHAssetManager::Unload(AssetID assetId) noexcept
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
AssetPath SHAssetManager::GenerateLocalPath(AssetPath path) noexcept
|
AssetPath SHAssetManager::GenerateLocalPath(AssetPath path) noexcept
|
||||||
{
|
{
|
||||||
if (!IsRecognised(path.extension().string().c_str()))
|
if (!IsRecognised(path.extension().string().c_str()))
|
||||||
{
|
{
|
||||||
|
@ -85,7 +82,37 @@ namespace SHADE
|
||||||
// return std::filesystem::path();
|
// return std::filesystem::path();
|
||||||
//}
|
//}
|
||||||
|
|
||||||
return std::filesystem::path(ASSET_ROOT + folder + path.filename().string());
|
return std::filesystem::path(std::string(ASSET_ROOT) + folder + path.filename().string());
|
||||||
|
}
|
||||||
|
|
||||||
|
AssetPath SHAssetManager::GenerateNewPath(AssetName name, AssetType type)
|
||||||
|
{
|
||||||
|
std::string folder;
|
||||||
|
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case AssetType::SCENE:
|
||||||
|
folder = "scenes/";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AssetType::PREFAB:
|
||||||
|
folder = "prefabs/";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AssetType::MATERIAL:
|
||||||
|
folder = "materials/";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
folder = "/";
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::filesystem::path{
|
||||||
|
std::string(ASSET_ROOT) +
|
||||||
|
folder +
|
||||||
|
name +
|
||||||
|
std::string(EXTENSIONS[static_cast<size_t>(type)])
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -121,7 +148,7 @@ namespace SHADE
|
||||||
// folder = "";
|
// folder = "";
|
||||||
// break;
|
// break;
|
||||||
//}
|
//}
|
||||||
AssetPath path{ ASSET_ROOT + folder + name + SHAssetMetaHandler::GetExtensionFromType(type) };
|
AssetPath path{ std::string{ASSET_ROOT} + folder + name + SHAssetMetaHandler::GetExtensionFromType(type) };
|
||||||
|
|
||||||
SHAssetMetaHandler::WriteMetaData(meta);
|
SHAssetMetaHandler::WriteMetaData(meta);
|
||||||
|
|
||||||
|
@ -130,6 +157,19 @@ namespace SHADE
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AssetID SHAssetManager::CreateAsset(AssetName name, AssetType type) noexcept
|
||||||
|
{
|
||||||
|
AssetID id = GenerateAssetID(type);
|
||||||
|
|
||||||
|
assetCollection.emplace_back(
|
||||||
|
name,
|
||||||
|
id,
|
||||||
|
type,
|
||||||
|
GenerateNewPath(name, type),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* \brief Import new asset from outside editor window.
|
* \brief Import new asset from outside editor window.
|
||||||
*
|
*
|
||||||
|
@ -138,7 +178,10 @@ namespace SHADE
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
AssetID SHAssetManager::ImportNewAsset(char const* p) noexcept
|
AssetID SHAssetManager::ImportNewAsset(char const* p) noexcept
|
||||||
{
|
{
|
||||||
std::filesystem::path const path{ p };
|
std::filesystem::path const path{ p };
|
||||||
|
|
||||||
|
auto const type = SHAssetMetaHandler::GetTypeFromExtension(path.extension().string());
|
||||||
|
auto const id = GenerateAssetID(type);
|
||||||
|
|
||||||
std::filesystem::path const newPath{ GenerateLocalPath(path) };
|
std::filesystem::path const newPath{ GenerateLocalPath(path) };
|
||||||
if (newPath.empty())
|
if (newPath.empty())
|
||||||
|
@ -149,11 +192,7 @@ namespace SHADE
|
||||||
|
|
||||||
std::filesystem::copy(path, newPath);
|
std::filesystem::copy(path, newPath);
|
||||||
|
|
||||||
AssetID id{ RetrieveAsset(newPath.string().c_str()) };
|
assetCollection.push_back(CreateAssetFromPath(newPath));
|
||||||
if (id != 0)
|
|
||||||
{
|
|
||||||
LoadData(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
@ -164,158 +203,14 @@ namespace SHADE
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
void SHAssetManager::RefreshAllAssets() noexcept
|
void SHAssetManager::RefreshAllAssets() noexcept
|
||||||
{
|
{
|
||||||
std::vector<AssetPath> metaFiles;
|
|
||||||
std::vector<AssetPath> AssetFiles;
|
|
||||||
|
|
||||||
//SHFileSystem::LoadAllFiles(metaFiles, AssetFiles);
|
|
||||||
//std::vector<AssetPath> AssetFilesVerified;
|
|
||||||
std::vector<AssetPath> AssetFilesNew;
|
|
||||||
|
|
||||||
for (auto const& asset : AssetFiles)
|
|
||||||
{
|
|
||||||
bool found = false;
|
|
||||||
for (auto it {metaFiles.begin()}; it != metaFiles.end(); ++it)
|
|
||||||
{
|
|
||||||
std::string fileExtCheck{ asset.filename().string() };
|
|
||||||
fileExtCheck += META_EXTENSION;
|
|
||||||
if (it->filename().string() == fileExtCheck)
|
|
||||||
{
|
|
||||||
metaFiles.erase(it);
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found && IsRecognised(asset.extension().string().c_str()))
|
|
||||||
{
|
|
||||||
AssetFilesNew.push_back(asset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<SHAsset> newLoad;
|
|
||||||
newLoad.reserve(AssetFilesNew.size());
|
|
||||||
|
|
||||||
//TODO: Handle if meta does not match all assets (if meta exist and asset doesnt, vice versa)
|
|
||||||
for (auto const& file : AssetFilesNew)
|
|
||||||
{
|
|
||||||
newLoad.push_back(RegisterAssetNew(file));
|
|
||||||
}
|
|
||||||
|
|
||||||
//UpdateAllSpriteSets();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void SHAssetManager::LoadDataTemp(std::string p) noexcept
|
|
||||||
{
|
|
||||||
AssetPath path{ p };
|
|
||||||
|
|
||||||
if (path.extension().string() == FBX_EXTENSION
|
|
||||||
|| path.extension().string() == GLTF_EXTENSION
|
|
||||||
|| path.extension().string() == MESH_EXTENSION)
|
|
||||||
{
|
|
||||||
LoadGLTF(
|
|
||||||
{
|
|
||||||
.name {path.filename().string()},
|
|
||||||
.id {0},
|
|
||||||
.type {AssetType::MESH},
|
|
||||||
.path {path},
|
|
||||||
.location {0}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else if (path.extension().string() == DDS_EXTENSION
|
|
||||||
|| path.extension().string() == TEXTURE_EXTENSION)
|
|
||||||
{
|
|
||||||
LoadDDS(
|
|
||||||
{
|
|
||||||
.name {path.filename().string()},
|
|
||||||
.id {0},
|
|
||||||
.type {AssetType::DDS},
|
|
||||||
.path {path},
|
|
||||||
.location {0}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<SHMeshAsset> SHAssetManager::GetAllMeshes() noexcept
|
|
||||||
{
|
|
||||||
std::vector<SHMeshAsset> result;
|
|
||||||
for (auto const& mesh : meshCollection)
|
|
||||||
{
|
|
||||||
result.push_back(mesh.second);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<SHTextureAsset> SHAssetManager::GetAllTextures() noexcept
|
|
||||||
{
|
|
||||||
std::vector<SHTextureAsset> result;
|
|
||||||
for (auto const& dds : textureCollection)
|
|
||||||
{
|
|
||||||
result.push_back(dds.second);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
SHMeshAsset const* SHAssetManager::GetMesh(AssetID id) noexcept
|
|
||||||
{
|
|
||||||
if (meshCollection.find(id) == meshCollection.end())
|
|
||||||
{
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return &meshCollection[id];
|
|
||||||
}
|
|
||||||
|
|
||||||
SHTextureAsset const* SHAssetManager::GetTexture(AssetID id) noexcept
|
|
||||||
{
|
|
||||||
if (textureCollection.find(id) == textureCollection.end())
|
|
||||||
{
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return &textureCollection[id];
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* \param Path for meta data file
|
|
||||||
* \param Path for asset file
|
|
||||||
|
|
||||||
* \brief Links meta data to asset in registries. Meta data should
|
|
||||||
* already exist
|
|
||||||
****************************************************************************/
|
|
||||||
void SHAssetManager::RegisterAsset(AssetPath const& metaPath, AssetPath const& path) noexcept
|
|
||||||
{
|
|
||||||
SHAsset const meta = SHAssetMetaHandler::RetrieveMetaData(metaPath);
|
|
||||||
|
|
||||||
assetCollection.push_back(meta);
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* \param Path for asset file
|
|
||||||
|
|
||||||
* \brief Creates new meta data for new asset.
|
|
||||||
****************************************************************************/
|
|
||||||
SHAsset SHAssetManager::RegisterAssetNew(AssetPath const& asset) noexcept
|
|
||||||
{
|
|
||||||
SHAsset meta;
|
|
||||||
meta.type = SHAssetMetaHandler::GetTypeFromExtension(asset.extension().string());
|
|
||||||
meta.id = GenerateAssetID(meta.type);
|
|
||||||
|
|
||||||
assetCollection.push_back(meta);
|
|
||||||
|
|
||||||
SHAssetMetaHandler::WriteMetaData(meta);
|
|
||||||
return assetCollection.back();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SHAssetManager::IsRecognised(char const* ext) noexcept
|
bool SHAssetManager::IsRecognised(char const* ext) noexcept
|
||||||
{
|
{
|
||||||
for (auto const& e : EXTENSIONS)
|
for (auto const& e : EXTENSIONS)
|
||||||
{
|
{
|
||||||
if (strcmp(ext, e.c_str()) == 0)
|
if (strcmp(ext, e.data()) == 0)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -324,54 +219,31 @@ namespace SHADE
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHAssetManager::LoadGLTF(SHAsset asset) noexcept
|
SHAsset SHAssetManager::CreateAssetFromPath(AssetPath path) noexcept
|
||||||
{
|
{
|
||||||
std::vector<SHMeshAsset> meshes;
|
SHAsset result;
|
||||||
|
|
||||||
SHMeshLoader::LoadMesh(meshes, asset.path);
|
result.name = path.stem().string();
|
||||||
|
result.type = SHAssetMetaHandler::GetTypeFromExtension(path.extension().string());
|
||||||
|
result.id = GenerateAssetID(result.type);
|
||||||
|
result.path = path;
|
||||||
|
|
||||||
for (auto const& mesh : meshes)
|
return result;
|
||||||
{
|
|
||||||
auto id{ GenerateAssetID(AssetType::MESH) };
|
|
||||||
meshCollection.emplace(id, mesh);
|
|
||||||
|
|
||||||
AssetPath path;
|
|
||||||
if (!mesh.compiled)
|
|
||||||
{
|
|
||||||
path = SHMeshCompiler::CompileMeshBinary(mesh, asset.path);
|
|
||||||
}
|
|
||||||
|
|
||||||
assetCollection.emplace_back(
|
|
||||||
mesh.header.meshName,
|
|
||||||
id,
|
|
||||||
AssetType::MESH,
|
|
||||||
path,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHAssetManager::LoadDDS(SHAsset asset) noexcept
|
void SHAssetManager::InitLoaders() noexcept
|
||||||
{
|
{
|
||||||
SHTextureAsset image;
|
loaders[static_cast<size_t>(AssetType::AUDIO)] = nullptr;
|
||||||
|
loaders[static_cast<size_t>(AssetType::SHADER)] = nullptr;
|
||||||
SHTextureLoader::LoadImageAsset(asset.path, image);
|
loaders[static_cast<size_t>(AssetType::MATERIAL)] = nullptr;
|
||||||
|
loaders[static_cast<size_t>(AssetType::IMAGE)] = dynamic_cast<SHAssetLoader*>(new SHTextureLoader());
|
||||||
if (!image.compiled)
|
loaders[static_cast<size_t>(AssetType::TEXTURE)] = nullptr;
|
||||||
{
|
loaders[static_cast<size_t>(AssetType::MESH)] = dynamic_cast<SHAssetLoader*>(new SHMeshLoader());
|
||||||
auto id{ GenerateAssetID(AssetType::TEXTURE) };
|
loaders[static_cast<size_t>(AssetType::SCRIPT)] = nullptr;
|
||||||
textureCollection.emplace(id, image);
|
loaders[static_cast<size_t>(AssetType::SCENE)] = nullptr;
|
||||||
|
loaders[static_cast<size_t>(AssetType::PREFAB)] = nullptr;
|
||||||
auto path{ SHTextureCompiler::CompileTextureBinary(image, asset.path) };
|
loaders[static_cast<size_t>(AssetType::AUDIO_WAV)] = nullptr;
|
||||||
|
loaders[static_cast<size_t>(AssetType::DDS)] = nullptr;
|
||||||
assetCollection.emplace_back(
|
|
||||||
image.name,
|
|
||||||
id,
|
|
||||||
AssetType::TEXTURE,
|
|
||||||
path,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -379,8 +251,9 @@ namespace SHADE
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
void SHAssetManager::Load() noexcept
|
void SHAssetManager::Load() noexcept
|
||||||
{
|
{
|
||||||
RetrieveAssets();
|
InitLoaders();
|
||||||
LoadAllData();
|
BuildAssetCollection();
|
||||||
|
//LoadAllData();
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -388,143 +261,40 @@ namespace SHADE
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
void SHAssetManager::LoadAllData() noexcept
|
void SHAssetManager::LoadAllData() noexcept
|
||||||
{
|
{
|
||||||
//TODO Remove when on demand loading is done
|
|
||||||
for (auto const& asset : assetCollection)
|
for (auto const& asset : assetCollection)
|
||||||
{
|
{
|
||||||
switch (asset.type)
|
SHAssetData* data = loaders[static_cast<size_t>(asset.type)]->Load(asset.path);
|
||||||
{
|
assetData.emplace(asset.id, data);
|
||||||
case AssetType::MESH:
|
|
||||||
meshCollection.emplace(asset.id, SHMeshAsset());
|
|
||||||
SHMeshLoader::LoadSHMesh(meshCollection[asset.id], asset.path);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AssetType::TEXTURE:
|
|
||||||
textureCollection.emplace(asset.id, SHTextureAsset());
|
|
||||||
SHTextureLoader::LoadSHTexture(asset.path, textureCollection[asset.id]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
void;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHAssetManager::LoadData(AssetID id) noexcept
|
SHAssetData* SHAssetManager::LoadData(SHAsset const& asset) noexcept
|
||||||
{
|
{
|
||||||
(void)id;
|
SHAssetData* data = loaders[static_cast<size_t>(asset.type)]->Load(asset.path);
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
if (data == nullptr)
|
||||||
* \brief Retrieve all asset files and meta files from filesystem
|
|
||||||
****************************************************************************/
|
|
||||||
void SHAssetManager::RetrieveAssets() noexcept
|
|
||||||
{
|
|
||||||
std::vector<AssetPath> metaFiles;
|
|
||||||
std::vector<AssetPath> AssetFiles;
|
|
||||||
|
|
||||||
for (auto const dir : std::filesystem::recursive_directory_iterator(ASSET_ROOT))
|
|
||||||
{
|
{
|
||||||
if (dir.path().extension().string() == META_EXTENSION)
|
SHLOG_ERROR("Unable to load asset into memory: {}\n", asset.path.string());
|
||||||
{
|
|
||||||
auto meta{ SHAssetMetaHandler::RetrieveMetaData(dir.path()) };
|
|
||||||
|
|
||||||
assetCollection.push_back(meta);
|
|
||||||
assetRegistry.emplace(meta.id, meta);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: Write new function for file manager to loop through all files
|
|
||||||
//SHFileSystem::StartupFillDirectories(ASSET_ROOT);
|
|
||||||
//FolderPointer rootFolder = SHFileSystem::GetRoot();
|
|
||||||
|
|
||||||
//for (auto const& meta : metaFiles)
|
|
||||||
//{
|
|
||||||
// for (std::vector<AssetPath>::const_iterator it{ AssetFiles.cbegin() };
|
|
||||||
// it != AssetFiles.cend();
|
|
||||||
// ++it)
|
|
||||||
// {
|
|
||||||
// // Asset exists for meta file
|
|
||||||
// std::string fileExtCheck{ it->filename().string() };
|
|
||||||
// fileExtCheck += META_EXTENSION;
|
|
||||||
// if (meta.filename().string() == fileExtCheck)
|
|
||||||
// {
|
|
||||||
// RegisterAsset(meta, *it);
|
|
||||||
// AssetFiles.erase(it);
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
//TODO: Handle if meta does not match all assets (if meta exist and asset doesnt, vice versa)
|
|
||||||
//for (auto const& file : AssetFiles)
|
|
||||||
//{
|
|
||||||
// if (IsRecognised(file.extension().string().c_str()))
|
|
||||||
// {
|
|
||||||
// SHAssetMetaHandler::WriteMetaData(RegisterAssetNew(file));
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// std::cout << "Unsupported File Format: " << file.filename() << "\n";
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
AssetID SHAssetManager::RetrieveAsset(char const* path) noexcept
|
|
||||||
{
|
|
||||||
std::filesystem::path p{ path };
|
|
||||||
if (IsRecognised(p.extension().string().c_str()))
|
|
||||||
{
|
|
||||||
SHAsset const& meta{ RegisterAssetNew(p) };
|
|
||||||
SHAssetMetaHandler::WriteMetaData(meta);
|
|
||||||
return meta.id;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::cout << "Unsupported File Format: " << p.filename() << "\n";
|
assetData.emplace(asset.id, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assert that file imported is not recognised
|
return data;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
void SHAssetManager::BuildAssetCollection() noexcept
|
||||||
* \param Full path of file
|
|
||||||
|
|
||||||
* \brief Extracts file name from path. Formats file name into readable
|
|
||||||
* with spaces and capitalises first letter of every word
|
|
||||||
****************************************************************************/
|
|
||||||
AssetName SHAssetManager::GetNameFromPath(AssetPath filepath) noexcept
|
|
||||||
{
|
{
|
||||||
std::string name{ filepath.filename().string() };
|
for (auto const& dir : std::filesystem::recursive_directory_iterator{ASSET_ROOT})
|
||||||
name = name.substr(0, name.find_last_of('.'));
|
{
|
||||||
|
if (dir.is_regular_file())
|
||||||
//if (name[0] <= 122 && name[0] >= 97)
|
{
|
||||||
//{
|
if (dir.path().extension().string() == META_EXTENSION.data())
|
||||||
// name[0] -= 32;
|
{
|
||||||
//}
|
assetCollection.push_back(SHAssetMetaHandler::RetrieveMetaData(dir.path()));
|
||||||
|
}
|
||||||
//for (size_t i{ 1 }; i < name.length(); ++i)
|
}
|
||||||
//{
|
}
|
||||||
// // Replace all underscores with spaces
|
|
||||||
// if (name[i] == '_')
|
|
||||||
// {
|
|
||||||
// name[i] = ' ';
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if (name[i + 1] <= 'Z' && name[i + 1] >= 'A'
|
|
||||||
// && name[i] <= 'z' && name[i] >= 'a')
|
|
||||||
// {
|
|
||||||
// name.insert(i + 1, 1, ' ');
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if (name[i - 1] == ' ' && name[i] <= 'z' && name[i] >= 'a')
|
|
||||||
// {
|
|
||||||
// name[i] -= 32;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
return name;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,9 +11,10 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "tinyddsloader.h"
|
#include "tinyddsloader.h"
|
||||||
#include "SHAsset.h"
|
#include "SHAsset.h"
|
||||||
|
#include "Asset Types/SHAssetData.h"
|
||||||
|
#include "Libraries/SHAssetLoader.h"
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "Asset Types/SHMeshAsset.h"
|
|
||||||
#include "Asset Types/SHTextureAsset.h"
|
|
||||||
#include "SH_API.h"
|
#include "SH_API.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
|
@ -28,6 +29,8 @@ namespace SHADE
|
||||||
|
|
||||||
static AssetPath GenerateLocalPath(AssetPath path) noexcept;
|
static AssetPath GenerateLocalPath(AssetPath path) noexcept;
|
||||||
|
|
||||||
|
static AssetPath GenerateNewPath(AssetName name, AssetType type);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* \brief Deallocate all memory used by resource data
|
* \brief Deallocate all memory used by resource data
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
@ -55,6 +58,7 @@ namespace SHADE
|
||||||
* \return resource id generated for new asset
|
* \return resource id generated for new asset
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static AssetID CreateNewAsset(AssetType, AssetName) noexcept;
|
static AssetID CreateNewAsset(AssetType, AssetName) noexcept;
|
||||||
|
static AssetID CreateAsset(AssetName name, AssetType type) noexcept;
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* \brief Import new resource from outside editor window.
|
* \brief Import new resource from outside editor window.
|
||||||
|
@ -71,66 +75,33 @@ namespace SHADE
|
||||||
static void RefreshAllAssets() noexcept;
|
static void RefreshAllAssets() noexcept;
|
||||||
// -------------------------------------------------------------------------/
|
// -------------------------------------------------------------------------/
|
||||||
|
|
||||||
//TODO: TEMPORARY FOR TESTING GLTF & DDS
|
template<typename T>
|
||||||
static void LoadDataTemp(std::string path) noexcept;
|
static std::enable_if_t<std::is_base_of_v<SHAssetData, T>, T const* const> GetData(AssetID id) noexcept;
|
||||||
static std::vector<SHMeshAsset> GetAllMeshes() noexcept;
|
|
||||||
static std::vector<SHTextureAsset> GetAllTextures() noexcept;
|
|
||||||
|
|
||||||
static SHMeshAsset const* GetMesh(AssetID id) noexcept;
|
|
||||||
static SHTextureAsset const* GetTexture(AssetID id) noexcept;
|
|
||||||
private:
|
private:
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* \brief Load resource data into memory
|
* \brief Load resource data into memory
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static void LoadAllData() noexcept;
|
static void LoadAllData() noexcept;
|
||||||
|
|
||||||
static void LoadData(AssetID id) noexcept;
|
static SHAssetData* LoadData(SHAsset const& asset) noexcept;
|
||||||
|
|
||||||
/****************************************************************************
|
inline static void BuildAssetCollection() noexcept;
|
||||||
* \brief Retrieve all resource files and meta files from filesystem
|
|
||||||
****************************************************************************/
|
|
||||||
static void RetrieveAssets() noexcept;
|
|
||||||
|
|
||||||
static AssetID RetrieveAsset(char const* path) noexcept;
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* \param Full path of file
|
|
||||||
|
|
||||||
* \brief Extracts file name from path. Formats file name into readable
|
|
||||||
* with spaces and capitalises first letter of every word
|
|
||||||
****************************************************************************/
|
|
||||||
static AssetName GetNameFromPath(AssetPath) noexcept;
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* \param Path for meta data file
|
|
||||||
* \param Path for resource file
|
|
||||||
|
|
||||||
* \brief Links meta data to resource in registries. Meta data should
|
|
||||||
* already exist
|
|
||||||
****************************************************************************/
|
|
||||||
static void RegisterAsset(AssetPath const&, AssetPath const&) noexcept;
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* \param Path for resource file
|
|
||||||
|
|
||||||
* \brief Creates new meta data for new resource.
|
|
||||||
****************************************************************************/
|
|
||||||
static SHAsset RegisterAssetNew(AssetPath const&) noexcept;
|
|
||||||
|
|
||||||
static bool IsRecognised(char const*) noexcept;
|
static bool IsRecognised(char const*) noexcept;
|
||||||
|
|
||||||
|
static SHAsset CreateAssetFromPath(AssetPath path) noexcept;
|
||||||
|
|
||||||
// Specialised load calls
|
static void InitLoaders() noexcept;
|
||||||
static void LoadGLTF(SHAsset asset) noexcept;
|
|
||||||
static void LoadDDS(SHAsset asset) noexcept;
|
|
||||||
|
|
||||||
static FMOD::System* audioSystem;
|
static FMOD::System* audioSystem;
|
||||||
static std::unordered_map<AssetID,SHSound>* audioSoundList;
|
static std::unordered_map<AssetID,SHSound>* audioSoundList;
|
||||||
|
|
||||||
|
static std::vector<SHAssetLoader*> loaders;
|
||||||
|
|
||||||
// For all resources
|
// For all resources
|
||||||
static std::vector<SHAsset> assetCollection;
|
static std::vector<SHAsset> assetCollection;
|
||||||
static std::unordered_map<AssetID, SHAsset> assetRegistry;
|
static std::unordered_map<AssetID, SHAssetData * const> assetData;
|
||||||
|
|
||||||
static std::unordered_map<AssetID, SHMeshAsset> meshCollection;
|
|
||||||
static std::unordered_map<AssetID, SHTextureAsset> textureCollection;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "SHAssetManager.hpp"
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
|
||||||
|
#include "SHAssetManager.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
template<typename T>
|
||||||
|
std::enable_if_t<std::is_base_of_v<SHAssetData, T>, T const* const> SHAssetManager::GetData(AssetID id) noexcept
|
||||||
|
{
|
||||||
|
if (!assetData.contains(id))
|
||||||
|
{
|
||||||
|
for (auto const& asset : assetCollection)
|
||||||
|
{
|
||||||
|
if (asset.id == id)
|
||||||
|
{
|
||||||
|
assetData.emplace(id, LoadData(asset));
|
||||||
|
return dynamic_cast<T const* const>(assetData[id]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SHLOG_ERROR("Asset ID provided does not exist: {}", id);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dynamic_cast<T const* const>(assetData[id]);
|
||||||
|
}
|
||||||
|
}
|
|
@ -37,7 +37,7 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
for (int i{0}; i < EXTENSIONS->size(); ++i)
|
for (int i{0}; i < EXTENSIONS->size(); ++i)
|
||||||
{
|
{
|
||||||
if (ext == EXTENSIONS[i])
|
if (strcmp(ext.c_str(), EXTENSIONS[i].data()) == 0)
|
||||||
{
|
{
|
||||||
return static_cast<AssetType>(i);
|
return static_cast<AssetType>(i);
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ namespace SHADE
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
AssetExtension SHAssetMetaHandler::GetExtensionFromType(AssetType type) noexcept
|
AssetExtension SHAssetMetaHandler::GetExtensionFromType(AssetType type) noexcept
|
||||||
{
|
{
|
||||||
return EXTENSIONS[static_cast<size_t>(type)];
|
return AssetExtension(EXTENSIONS[static_cast<size_t>(type)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -124,16 +124,6 @@ namespace SHADE
|
||||||
metaFile << "ID: " << meta.id << "\n";
|
metaFile << "ID: " << meta.id << "\n";
|
||||||
metaFile << "Type: " << static_cast<AssetTypeMeta>(meta.type) << std::endl;
|
metaFile << "Type: " << static_cast<AssetTypeMeta>(meta.type) << std::endl;
|
||||||
|
|
||||||
////TODO Add in information that is specific to types like mesh
|
|
||||||
//switch(meta.type)
|
|
||||||
//{
|
|
||||||
//case AssetType::MESH:
|
|
||||||
// break;
|
|
||||||
|
|
||||||
//default:
|
|
||||||
// break;
|
|
||||||
//}
|
|
||||||
|
|
||||||
metaFile.close();
|
metaFile.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
#include "SHResourceManager.h"
|
#include "SHResourceManager.h"
|
||||||
// Project Includes
|
// Project Includes
|
||||||
#include "Assets/SHAssetManager.h"
|
#include "Assets/SHAssetManager.h"
|
||||||
|
#include "Assets/Asset Types/SHAssetIncludes.h"
|
||||||
#include "Graphics/MiddleEnd/Interface/SHGraphicsSystem.h"
|
#include "Graphics/MiddleEnd/Interface/SHGraphicsSystem.h"
|
||||||
#include "ECS_Base/Managers/SHSystemManager.h"
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
#include "Tools/SHLog.h"
|
#include "Tools/SHLog.h"
|
||||||
|
@ -48,7 +49,7 @@ namespace SHADE
|
||||||
throw std::runtime_error("[SHResourceManager] Attempted to load graphics resource without a SHGraphicsSystem installed.");
|
throw std::runtime_error("[SHResourceManager] Attempted to load graphics resource without a SHGraphicsSystem installed.");
|
||||||
|
|
||||||
// Load
|
// Load
|
||||||
const SHMeshAsset* assetData = SHAssetManager::GetMesh(assetId);
|
const SHMeshAsset* assetData = SHAssetManager::GetData<SHMeshAsset>(assetId);
|
||||||
if (assetData == nullptr)
|
if (assetData == nullptr)
|
||||||
{
|
{
|
||||||
SHLog::Warning("[SHResourceManager] Attempted to load an asset with an invalid Asset ID.");
|
SHLog::Warning("[SHResourceManager] Attempted to load an asset with an invalid Asset ID.");
|
||||||
|
@ -80,7 +81,7 @@ namespace SHADE
|
||||||
throw std::runtime_error("[SHResourceManager] Attempted to load graphics resource without a SHGraphicsSystem installed.");
|
throw std::runtime_error("[SHResourceManager] Attempted to load graphics resource without a SHGraphicsSystem installed.");
|
||||||
|
|
||||||
// Load
|
// Load
|
||||||
const SHTextureAsset* assetData = SHAssetManager::GetTexture(assetId);
|
const SHTextureAsset* assetData = SHAssetManager::GetData<SHTextureAsset>(assetId);
|
||||||
if (assetData == nullptr)
|
if (assetData == nullptr)
|
||||||
{
|
{
|
||||||
SHLog::Warning("[SHResourceManager] Attempted to load an asset with an invalid Asset ID.");
|
SHLog::Warning("[SHResourceManager] Attempted to load an asset with an invalid Asset ID.");
|
||||||
|
@ -133,7 +134,7 @@ namespace SHADE
|
||||||
/* Query Functions */
|
/* Query Functions */
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static std::optional<AssetID> SHResourceManager::GetAssetID(Handle<T> handle)
|
std::optional<AssetID> SHResourceManager::GetAssetID(Handle<T> handle)
|
||||||
{
|
{
|
||||||
const Handle GENERIC_HANDLE = Handle(handle);
|
const Handle GENERIC_HANDLE = Handle(handle);
|
||||||
auto [typedHandleMap, typedAssetIdMap] = getAssetHandleMap<T>();
|
auto [typedHandleMap, typedAssetIdMap] = getAssetHandleMap<T>();
|
||||||
|
|
Loading…
Reference in New Issue