Merge pull request #123 from SHADE-DP/SP3-13-Assets-Manager
Asset Manager restructure Better distinction between loaders and compilers Added shader compile and load Temporary interface to compile shader based on file
This commit is contained in:
commit
1e95c9f7ba
|
@ -1,3 +1,3 @@
|
||||||
Name: Cube.003
|
Name: Cube.003
|
||||||
ID: 110152941
|
ID: 71245919
|
||||||
Type: 6
|
Type: 4
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
Name: Cube.012
|
Name: Cube.012
|
||||||
ID: 107348815
|
ID: 80365422
|
||||||
Type: 6
|
Type: 4
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,3 @@
|
||||||
|
Name: RaccoonBag_Color_Ver4
|
||||||
|
ID: 58303057
|
||||||
|
Type: 3
|
|
@ -1,3 +1,3 @@
|
||||||
Name: RaccoonPreTexturedVer1_Base9
|
Name: RaccoonPreTexturedVer1_Base9
|
||||||
ID: 91918845
|
ID: 64651793
|
||||||
Type: 4
|
Type: 3
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,3 @@
|
||||||
|
Name: Kirsch_CS
|
||||||
|
ID: 19931255
|
||||||
|
Type: 2
|
Binary file not shown.
|
@ -0,0 +1,3 @@
|
||||||
|
Name: PureCopy_CS
|
||||||
|
ID: 29659779
|
||||||
|
Type: 2
|
Binary file not shown.
|
@ -0,0 +1,3 @@
|
||||||
|
Name: TestCube_FS
|
||||||
|
ID: 18415057
|
||||||
|
Type: 2
|
Binary file not shown.
|
@ -0,0 +1,3 @@
|
||||||
|
Name: TestCube_VS
|
||||||
|
ID: 29315909
|
||||||
|
Type: 2
|
Binary file not shown.
|
@ -0,0 +1,3 @@
|
||||||
|
Name: TD_Checker_Base_Color
|
||||||
|
ID: 51995224
|
||||||
|
Type: 3
|
|
@ -110,14 +110,7 @@ namespace Sandbox
|
||||||
SHComponentManager::CreateComponentSparseSet<SHRenderable>();
|
SHComponentManager::CreateComponentSparseSet<SHRenderable>();
|
||||||
SHComponentManager::CreateComponentSparseSet<SHCameraComponent>();
|
SHComponentManager::CreateComponentSparseSet<SHCameraComponent>();
|
||||||
|
|
||||||
//TODO: REMOVE AFTER PRESENTATION
|
SHAssetManager::Load();
|
||||||
//SHAssetManager::LoadDataTemp("../../Assets/racoon.gltf");
|
|
||||||
//SHAssetManager::LoadDataTemp("../../Assets/Cube.012.shmesh");
|
|
||||||
//SHAssetManager::LoadDataTemp("../../Assets/RaccoonBag_Color_Ver4.dds");
|
|
||||||
//SHAssetManager::LoadDataTemp("../../Assets/RaccoonPreTexturedVer1_Base9.dds");
|
|
||||||
//SHAssetManager::LoadDataTemp("../../Assets/RaccoonPreTexturedVer1_Base9.shtex");
|
|
||||||
//TODO: REMOVE AFTER PRESENTATION
|
|
||||||
|
|
||||||
|
|
||||||
auto id = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
auto id = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
||||||
auto id2 = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
auto id2 = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
||||||
|
@ -133,8 +126,6 @@ namespace Sandbox
|
||||||
SHSceneManager::InitSceneManager<SBTestScene>("TestScene");
|
SHSceneManager::InitSceneManager<SBTestScene>("TestScene");
|
||||||
|
|
||||||
SHFrameRateController::UpdateFRC();
|
SHFrameRateController::UpdateFRC();
|
||||||
|
|
||||||
SHAssetManager::Load();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SBApplication::Update(void)
|
void SBApplication::Update(void)
|
||||||
|
|
|
@ -53,7 +53,8 @@ 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::IMAGE:
|
case AssetType::TEXTURE:
|
||||||
|
if (asset.name == "RaccoonPreTexturedVer1_Base9")
|
||||||
texHandles.emplace_back(SHResourceManager::LoadOrGet<SHTexture>(asset.id));
|
texHandles.emplace_back(SHResourceManager::LoadOrGet<SHTexture>(asset.id));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHShaderAsset.cpp
|
||||||
|
* \author Brandon Mak
|
||||||
|
* \date 24 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 "SHShaderAsset.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
SHShaderAsset::SHShaderAsset() noexcept
|
||||||
|
: spirvBinary{},
|
||||||
|
shaderType{SH_SHADER_TYPE::VERTEX},
|
||||||
|
name{}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
SHShaderAsset::SHShaderAsset(SHShaderAsset const& rhs) noexcept
|
||||||
|
: spirvBinary{rhs.spirvBinary},
|
||||||
|
shaderType{ rhs.shaderType },
|
||||||
|
name{rhs.name}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
SHShaderAsset::SHShaderAsset(SHShaderAsset&& rhs) noexcept
|
||||||
|
: spirvBinary{ std::move(rhs.spirvBinary) },
|
||||||
|
shaderType{ std::move(rhs.shaderType) },
|
||||||
|
name{ std::move(rhs.name) }
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
SHShaderAsset& SHShaderAsset::operator=(SHShaderAsset&& rhs) noexcept
|
||||||
|
{
|
||||||
|
if (this == &rhs)
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
spirvBinary = std::move(rhs.spirvBinary);
|
||||||
|
shaderType = std::move(rhs.shaderType);
|
||||||
|
name = std::move(rhs.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
SHShaderAsset& SHShaderAsset::operator=(SHShaderAsset const& rhs) noexcept
|
||||||
|
{
|
||||||
|
if (this == &rhs)
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
spirvBinary = rhs.spirvBinary;
|
||||||
|
shaderType = rhs.shaderType;
|
||||||
|
name = rhs.name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHShaderAsset.h
|
||||||
|
* \author Brandon Mak
|
||||||
|
* \date 24 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 "SHAssetData.h"
|
||||||
|
#include "SH_API.h"
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
enum class SH_SHADER_TYPE : uint8_t
|
||||||
|
{
|
||||||
|
VERTEX,
|
||||||
|
FRAGMENT,
|
||||||
|
COMPUTE,
|
||||||
|
INAVLID_TYPE
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SH_API SHShaderAsset : SHAssetData
|
||||||
|
{
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
/* MEMBER VARIABLES */
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
//! container storing the spirv binary
|
||||||
|
std::vector<uint32_t> spirvBinary;
|
||||||
|
|
||||||
|
//! For the compilation of the shader. Vulkan backend will use it too
|
||||||
|
SH_SHADER_TYPE shaderType;
|
||||||
|
|
||||||
|
//! Name of the shader file (without parent path)
|
||||||
|
std::string name;
|
||||||
|
|
||||||
|
SHShaderAsset() noexcept;
|
||||||
|
SHShaderAsset(SHShaderAsset const& rhs) noexcept;
|
||||||
|
SHShaderAsset(SHShaderAsset&& rhs) noexcept;
|
||||||
|
SHShaderAsset& operator= (SHShaderAsset&& rhs) noexcept;
|
||||||
|
SHShaderAsset& operator= (SHShaderAsset const& rhs) noexcept;
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,24 +1,30 @@
|
||||||
/*************************************************************************//**
|
/*************************************************************************//**
|
||||||
* \file SHAssimpLibrary.cpp
|
* \file SHMeshCompiler.cpp
|
||||||
* \author Loh Xiao Qi
|
* \author Loh Xiao Qi
|
||||||
* \date October 2022
|
* \date 30 September 2022
|
||||||
* \brief
|
* \brief Library to write data in SHMeshAsset into binary file for faster
|
||||||
|
* loading in the future
|
||||||
|
*
|
||||||
*
|
*
|
||||||
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
* disclosure of this file or its contents without the prior written consent
|
* disclosure of this file or its contents without the prior written consent
|
||||||
* of DigiPen Institute of Technology is prohibited.
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#include "SHpch.h"
|
#include "SHpch.h"
|
||||||
#include "SHAssimpLibrary.h"
|
#include "SHMeshCompiler.h"
|
||||||
|
#include "Graphics/MiddleEnd/Meshes/SHMeshData.h"
|
||||||
#include <assimp/postprocess.h>
|
#include <assimp/postprocess.h>
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
Assimp::Importer SHAssimpLibrary::aiImporter;
|
|
||||||
|
|
||||||
void SHAssimpLibrary::ProcessNode(aiNode const& node, aiScene const& scene, MeshVectorRef meshes) noexcept
|
Assimp::Importer SHMeshCompiler::aiImporter;
|
||||||
{
|
|
||||||
for (size_t i {0}; i < node.mNumMeshes; ++i)
|
void SHMeshCompiler::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]];
|
aiMesh* mesh = scene.mMeshes[node.mMeshes[i]];
|
||||||
meshes.push_back(ProcessMesh(*mesh));
|
meshes.push_back(ProcessMesh(*mesh));
|
||||||
|
@ -28,16 +34,16 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
ProcessNode(*node.mChildren[i], scene, meshes);
|
ProcessNode(*node.mChildren[i], scene, meshes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHAssimpLibrary::ExtractAnimations(aiScene const& scene, AnimVectorRef anims) noexcept
|
void SHMeshCompiler::ExtractAnimations(aiScene const& scene, AnimVectorRef anims) noexcept
|
||||||
{
|
{
|
||||||
if (scene.HasAnimations())
|
if (scene.HasAnimations())
|
||||||
{
|
{
|
||||||
std::vector<SHAnimationAsset> anims(scene.mNumAnimations);
|
std::vector<SHAnimationAsset> anims(scene.mNumAnimations);
|
||||||
for (auto i{0}; i < scene.mNumAnimations; ++i)
|
for (auto i{ 0 }; i < scene.mNumAnimations; ++i)
|
||||||
{
|
{
|
||||||
auto const& anim {*scene.mAnimations[i]};
|
auto const& anim{ *scene.mAnimations[i] };
|
||||||
|
|
||||||
anims[i].name = anim.mName.C_Str();
|
anims[i].name = anim.mName.C_Str();
|
||||||
|
|
||||||
|
@ -47,17 +53,17 @@ namespace SHADE
|
||||||
std::copy_n(anim.mChannels, anim.mNumChannels, anims[i].nodeChannels.data());
|
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.mMeshChannels, anim.mNumMeshChannels, anims[i].meshChannels.data());
|
||||||
std::copy_n(anim.mMorphMeshChannels, anim.mNumMorphMeshChannels, anims[i].morphMeshChannels.data());
|
std::copy_n(anim.mMorphMeshChannels, anim.mNumMorphMeshChannels, anims[i].morphMeshChannels.data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SHMeshAsset* SHAssimpLibrary::ProcessMesh(aiMesh const& mesh) noexcept
|
SHMeshAsset* SHMeshCompiler::ProcessMesh(aiMesh const& mesh) noexcept
|
||||||
{
|
{
|
||||||
SHMeshAsset* result = new SHMeshAsset();
|
SHMeshAsset* result = new SHMeshAsset();
|
||||||
result->compiled = false;
|
result->compiled = false;
|
||||||
result->changed = false;
|
result->changed = false;
|
||||||
|
|
||||||
for (size_t i{0}; i < mesh.mNumVertices; ++i)
|
for (size_t i{ 0 }; i < mesh.mNumVertices; ++i)
|
||||||
{
|
{
|
||||||
// Vertex position
|
// Vertex position
|
||||||
SHVec3 vertex;
|
SHVec3 vertex;
|
||||||
|
@ -67,7 +73,7 @@ namespace SHADE
|
||||||
result->vertexPosition.push_back(vertex);
|
result->vertexPosition.push_back(vertex);
|
||||||
|
|
||||||
// Tex coords
|
// Tex coords
|
||||||
SHVec2 texCoord{0.f, 0.f};
|
SHVec2 texCoord{ 0.f, 0.f };
|
||||||
if (mesh.mTextureCoords[0])
|
if (mesh.mTextureCoords[0])
|
||||||
{
|
{
|
||||||
texCoord.x = mesh.mTextureCoords[0][i].x;
|
texCoord.x = mesh.mTextureCoords[0][i].x;
|
||||||
|
@ -76,7 +82,7 @@ namespace SHADE
|
||||||
result->texCoords.push_back(texCoord);
|
result->texCoords.push_back(texCoord);
|
||||||
|
|
||||||
// Normals
|
// Normals
|
||||||
SHVec3 normal{0.f, 0.f, 0.f};
|
SHVec3 normal{ 0.f, 0.f, 0.f };
|
||||||
if (mesh.mNormals)
|
if (mesh.mNormals)
|
||||||
{
|
{
|
||||||
normal.x = mesh.mNormals[i].x;
|
normal.x = mesh.mNormals[i].x;
|
||||||
|
@ -86,7 +92,7 @@ namespace SHADE
|
||||||
result->vertexNormal.push_back(normal);
|
result->vertexNormal.push_back(normal);
|
||||||
|
|
||||||
// Tangent
|
// Tangent
|
||||||
SHVec3 tangent{0.f, 0.f, 0.f};
|
SHVec3 tangent{ 0.f, 0.f, 0.f };
|
||||||
if (mesh.mTangents)
|
if (mesh.mTangents)
|
||||||
{
|
{
|
||||||
tangent.x = mesh.mTangents[i].x;
|
tangent.x = mesh.mTangents[i].x;
|
||||||
|
@ -96,10 +102,10 @@ namespace SHADE
|
||||||
result->vertexTangent.push_back(tangent);
|
result->vertexTangent.push_back(tangent);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i {0}; i < mesh.mNumFaces; ++i)
|
for (size_t i{ 0 }; i < mesh.mNumFaces; ++i)
|
||||||
{
|
{
|
||||||
aiFace face = mesh.mFaces[i];
|
aiFace face = mesh.mFaces[i];
|
||||||
for (size_t j{0}; j < face.mNumIndices; ++j)
|
for (size_t j{ 0 }; j < face.mNumIndices; ++j)
|
||||||
{
|
{
|
||||||
result->indices.push_back(face.mIndices[j]);
|
result->indices.push_back(face.mIndices[j]);
|
||||||
}
|
}
|
||||||
|
@ -110,10 +116,10 @@ namespace SHADE
|
||||||
result->header.name = mesh.mName.C_Str();
|
result->header.name = mesh.mName.C_Str();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHAssimpLibrary::LoadFromFile(AssetPath path, MeshVectorRef meshes, AnimVectorRef anims) noexcept
|
void SHMeshCompiler::LoadFromFile(AssetPath path, MeshVectorRef meshes, AnimVectorRef anims) noexcept
|
||||||
{
|
{
|
||||||
const aiScene* scene = aiImporter.ReadFile(path.string().c_str(),
|
const aiScene* scene = aiImporter.ReadFile(path.string().c_str(),
|
||||||
aiProcess_Triangulate // Make sure we get triangles rather than nvert polygons
|
aiProcess_Triangulate // Make sure we get triangles rather than nvert polygons
|
||||||
| aiProcess_GenUVCoords // Convert any type of mapping to uv mapping
|
| aiProcess_GenUVCoords // Convert any type of mapping to uv mapping
|
||||||
|
@ -132,10 +138,64 @@ namespace SHADE
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ExtractAnimations(*scene, anims);
|
//ExtractAnimations(*scene, anims);
|
||||||
|
|
||||||
ProcessNode(*scene->mRootNode, *scene, meshes);
|
ProcessNode(*scene->mRootNode, *scene, meshes);
|
||||||
|
|
||||||
aiImporter.FreeScene();
|
aiImporter.FreeScene();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<AssetPath> SHMeshCompiler::CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept
|
||||||
|
{
|
||||||
|
std::string newPath{ path.parent_path().string() + '/' };
|
||||||
|
newPath += asset.header.name + MESH_EXTENSION.data();
|
||||||
|
|
||||||
|
std::ofstream file{ newPath, std::ios::out | std::ios::binary | std::ios::trunc };
|
||||||
|
if (!file.is_open())
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Unable to open file for writing mesh file: {}", path.string());
|
||||||
|
}
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(&(asset.header.vertexCount)),
|
||||||
|
sizeof(uint32_t)
|
||||||
|
);
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<const char*>(&(asset.header.indexCount)),
|
||||||
|
sizeof(uint32_t)
|
||||||
|
);
|
||||||
|
|
||||||
|
auto const vertexVec3Byte{ sizeof(SHVec3) * asset.header.vertexCount };
|
||||||
|
auto const vertexVec2Byte{ sizeof(SHVec2) * asset.header.vertexCount };
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(asset.vertexPosition.data()),
|
||||||
|
vertexVec3Byte
|
||||||
|
);
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(asset.vertexTangent.data()),
|
||||||
|
vertexVec3Byte
|
||||||
|
);
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(asset.vertexNormal.data()),
|
||||||
|
vertexVec3Byte
|
||||||
|
);
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(asset.texCoords.data()),
|
||||||
|
vertexVec2Byte
|
||||||
|
);
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(asset.indices.data()),
|
||||||
|
sizeof(uint32_t) * asset.header.indexCount
|
||||||
|
);
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
return newPath;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHMeshCompiler.h
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date 30 September 2022
|
||||||
|
* \brief Library to write data in SHMeshAsset into binary file for faster
|
||||||
|
* loading in the future
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 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 "Assets/Asset Types/SHAnimationAsset.h"
|
||||||
|
#include "Assets/Asset Types/SHMeshAsset.h"
|
||||||
|
#include "Assets/SHAssetMacros.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
class SHMeshCompiler
|
||||||
|
{
|
||||||
|
|
||||||
|
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;
|
||||||
|
static std::optional<AssetPath> CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,162 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHShaderSourceCompiler.cpp
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date 23 10 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 "SHShaderSourceCompiler.h"
|
||||||
|
#include "shaderc/shaderc.hpp"
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
std::string SHShaderSourceCompiler::CompileShaderSourceToBinary(AssetPath path, SHShaderAsset const& data) noexcept
|
||||||
|
{
|
||||||
|
std::string newPath{ path.string() };
|
||||||
|
newPath = newPath.substr(0, newPath.find_last_of('.'));
|
||||||
|
newPath += SHADER_BUILT_IN_EXTENSION.data();
|
||||||
|
|
||||||
|
std::ofstream file{ newPath, std::ios::binary | std::ios::out | std::ios::trunc };
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(& data.shaderType), sizeof(uint8_t)
|
||||||
|
);
|
||||||
|
|
||||||
|
size_t const byteCount = sizeof(uint32_t) * data.spirvBinary.size();
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(&byteCount), sizeof(size_t)
|
||||||
|
);
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(data.spirvBinary.data()), byteCount
|
||||||
|
);
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
return newPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHShaderAsset const* SHShaderSourceCompiler::CompileShaderSourceToMemory(std::string const& data, std::string const& name, SH_SHADER_TYPE type) noexcept
|
||||||
|
{
|
||||||
|
// shaderc compiler
|
||||||
|
shaderc::Compiler compiler;
|
||||||
|
shaderc::CompileOptions options;
|
||||||
|
|
||||||
|
options.AddMacroDefinition("MY_DEFINE", "1");
|
||||||
|
|
||||||
|
//TODO: Check if we need optimisation levels when compiling into spirv
|
||||||
|
// Set optimization levels
|
||||||
|
//if (opLevel != shaderc_optimization_level_zero)
|
||||||
|
// options.SetOptimizationLevel(opLevel);
|
||||||
|
|
||||||
|
// Attempt to get the shaderc equivalent shader stage
|
||||||
|
shaderc_shader_kind shaderKind;
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case SH_SHADER_TYPE::VERTEX:
|
||||||
|
shaderKind = shaderc_shader_kind::shaderc_glsl_vertex_shader;
|
||||||
|
break;
|
||||||
|
case SH_SHADER_TYPE::FRAGMENT:
|
||||||
|
shaderKind = shaderc_shader_kind::shaderc_glsl_fragment_shader;
|
||||||
|
break;
|
||||||
|
case SH_SHADER_TYPE::COMPUTE:
|
||||||
|
shaderKind = shaderc_shader_kind::shaderc_glsl_compute_shader;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
shaderKind = shaderc_shader_kind::shaderc_glsl_vertex_shader;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compile the shader and get the result
|
||||||
|
shaderc::SpvCompilationResult compileResult = compiler.CompileGlslToSpv(data, shaderKind, name.c_str(), options);
|
||||||
|
|
||||||
|
if (compileResult.GetCompilationStatus() != shaderc_compilation_status_success)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Shaderc failed to compile GLSL shader to binary | " + compileResult.GetErrorMessage());
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto result = new SHShaderAsset();
|
||||||
|
result->spirvBinary.resize(compileResult.end() - compileResult.begin());
|
||||||
|
|
||||||
|
std::ranges::copy(compileResult.begin(), compileResult.end(), result->spirvBinary.data());
|
||||||
|
|
||||||
|
result->name = name;
|
||||||
|
result->shaderType = type;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
SH_SHADER_TYPE SHShaderSourceCompiler::GetShaderTypeFromFilename(std::string name) noexcept
|
||||||
|
{
|
||||||
|
for (auto i { 0}; i < SHADER_TYPE_MAX_COUNT; ++i)
|
||||||
|
{
|
||||||
|
if (name.find(SHADER_IDENTIFIERS[i].data()) != std::string::npos)
|
||||||
|
{
|
||||||
|
return static_cast<SH_SHADER_TYPE>(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return SH_SHADER_TYPE::INAVLID_TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<AssetPath> SHShaderSourceCompiler::LoadAndCompileShader(AssetPath path) noexcept
|
||||||
|
{
|
||||||
|
auto type = GetShaderTypeFromFilename(path.filename().string());
|
||||||
|
|
||||||
|
if (type == SH_SHADER_TYPE::INAVLID_TYPE)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Invalid filename for shaders, follow suffix in SHAssetMacros.h: {}", path.string());
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
path.make_preferred();
|
||||||
|
|
||||||
|
std::ifstream file{ path.string(), std::ios::in };
|
||||||
|
|
||||||
|
if (file.is_open())
|
||||||
|
{
|
||||||
|
std::stringstream stream;
|
||||||
|
|
||||||
|
stream << file.rdbuf();
|
||||||
|
|
||||||
|
std::string const content = stream.str();
|
||||||
|
|
||||||
|
auto data = CompileShaderSourceToMemory(content, path.filename().string(), type);
|
||||||
|
|
||||||
|
if (data == nullptr)
|
||||||
|
{
|
||||||
|
return{};
|
||||||
|
}
|
||||||
|
|
||||||
|
return CompileShaderSourceToBinary(path, *data);
|
||||||
|
}
|
||||||
|
|
||||||
|
SHLOG_ERROR("Unable to open shader file: {}", path.string());
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<AssetPath> SHShaderSourceCompiler::CompileShaderFromString
|
||||||
|
(std::string const& string, AssetPath path, SH_SHADER_TYPE type) noexcept
|
||||||
|
{
|
||||||
|
auto const data = CompileShaderSourceToMemory(string, path.filename().string(), type);
|
||||||
|
|
||||||
|
if (data == nullptr)
|
||||||
|
{
|
||||||
|
return{};
|
||||||
|
}
|
||||||
|
|
||||||
|
return CompileShaderSourceToBinary(path, *data);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHShaderSourceCompiler.h
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date 23 10 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/SHAssetMacros.h"
|
||||||
|
#include "Assets/Asset Types/SHShaderAsset.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
class SHShaderSourceCompiler
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
static std::string CompileShaderSourceToBinary(AssetPath path, SHShaderAsset const& data) noexcept;
|
||||||
|
static SHShaderAsset const* CompileShaderSourceToMemory(std::string const& data, std::string const& name, SH_SHADER_TYPE type) noexcept;
|
||||||
|
|
||||||
|
static SH_SHADER_TYPE GetShaderTypeFromFilename(std::string name) noexcept;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static std::optional<AssetPath> LoadAndCompileShader(AssetPath path) noexcept;
|
||||||
|
static std::optional<AssetPath> CompileShaderFromString
|
||||||
|
(std::string const& string, AssetPath path, SH_SHADER_TYPE type) noexcept;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,171 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHTextureCompiler.cpp
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date 30 September 2022
|
||||||
|
* \brief Library to write data in SHTextureAsset into binary file for
|
||||||
|
* faster loading in the future
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 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 "SHTextureCompiler.h"
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
|
||||||
|
std::string SHTextureCompiler::TinyDDSResultToString(tinyddsloader::Result value)
|
||||||
|
{
|
||||||
|
switch (value)
|
||||||
|
{
|
||||||
|
case tinyddsloader::Result::ErrorFileOpen:
|
||||||
|
return "File open err";
|
||||||
|
case tinyddsloader::Result::ErrorRead:
|
||||||
|
return "File read err";
|
||||||
|
case tinyddsloader::Result::ErrorMagicWord:
|
||||||
|
return "File header magic word err";
|
||||||
|
case tinyddsloader::Result::ErrorSize:
|
||||||
|
return "File size err";
|
||||||
|
case tinyddsloader::Result::ErrorVerify:
|
||||||
|
return "Pixel format err";
|
||||||
|
case tinyddsloader::Result::ErrorNotSupported:
|
||||||
|
return "Unsupported format";
|
||||||
|
case tinyddsloader::Result::ErrorInvalidData:
|
||||||
|
return "Invalid data";
|
||||||
|
default:
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vk::Format SHTextureCompiler::ddsLoaderToVkFormat(tinyddsloader::DDSFile::DXGIFormat format, bool isLinear)
|
||||||
|
{
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
case tinyddsloader::DDSFile::DXGIFormat::BC1_UNorm:
|
||||||
|
case tinyddsloader::DDSFile::DXGIFormat::BC1_UNorm_SRGB:
|
||||||
|
return isLinear ? vk::Format::eBc1RgbaUnormBlock : vk::Format::eBc1RgbaSrgbBlock;
|
||||||
|
case tinyddsloader::DDSFile::DXGIFormat::BC2_UNorm:
|
||||||
|
case tinyddsloader::DDSFile::DXGIFormat::BC2_UNorm_SRGB:
|
||||||
|
return isLinear ? vk::Format::eBc2UnormBlock : vk::Format::eBc2SrgbBlock;
|
||||||
|
case tinyddsloader::DDSFile::DXGIFormat::BC3_UNorm:
|
||||||
|
case tinyddsloader::DDSFile::DXGIFormat::BC3_UNorm_SRGB:
|
||||||
|
return isLinear ? vk::Format::eBc3UnormBlock : vk::Format::eBc3SrgbBlock;
|
||||||
|
case tinyddsloader::DDSFile::DXGIFormat::BC5_UNorm:
|
||||||
|
case tinyddsloader::DDSFile::DXGIFormat::BC5_SNorm:
|
||||||
|
return isLinear ? vk::Format::eBc5UnormBlock : vk::Format::eBc5SnormBlock;
|
||||||
|
case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_UNorm:
|
||||||
|
case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_UNorm_SRGB:
|
||||||
|
return isLinear ? vk::Format::eR8G8B8A8Unorm : vk::Format::eR8G8B8A8Srgb;
|
||||||
|
case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_SNorm:
|
||||||
|
return vk::Format::eR8G8B8A8Snorm;
|
||||||
|
case tinyddsloader::DDSFile::DXGIFormat::B8G8R8A8_UNorm:
|
||||||
|
case tinyddsloader::DDSFile::DXGIFormat::B8G8R8A8_UNorm_SRGB:
|
||||||
|
return isLinear ? vk::Format::eB8G8R8A8Unorm : vk::Format::eB8G8R8A8Srgb;
|
||||||
|
case tinyddsloader::DDSFile::DXGIFormat::B8G8R8X8_UNorm:
|
||||||
|
case tinyddsloader::DDSFile::DXGIFormat::B8G8R8X8_UNorm_SRGB:
|
||||||
|
return isLinear ? vk::Format::eB8G8R8A8Unorm : vk::Format::eB8G8R8Srgb;
|
||||||
|
default:
|
||||||
|
throw std::runtime_error("Unsupported DDS format.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHTextureCompiler::LoadTinyDDS(AssetPath path, SHTextureAsset& asset) noexcept
|
||||||
|
{
|
||||||
|
tinyddsloader::Result loadResult = tinyddsloader::Result::Success;
|
||||||
|
tinyddsloader::DDSFile file;
|
||||||
|
loadResult = file.Load(path.string().c_str());
|
||||||
|
if (loadResult != tinyddsloader::Result::Success)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Unable to load Texture file: {} at {}", TinyDDSResultToString(loadResult), path.string());
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t totalBytes{ 0 };
|
||||||
|
|
||||||
|
std::vector<uint32_t> mipOff(file.GetMipCount());
|
||||||
|
|
||||||
|
for (size_t i{ 0 }; i < file.GetMipCount(); ++i)
|
||||||
|
{
|
||||||
|
mipOff[i] = static_cast<uint32_t>(totalBytes);
|
||||||
|
totalBytes += file.GetImageData(static_cast<uint32_t>(i), 0)->m_memSlicePitch;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHTexture::PixelChannel* pixel = new SHTexture::PixelChannel[totalBytes];
|
||||||
|
std::memcpy(pixel, file.GetImageData()->m_mem, totalBytes);
|
||||||
|
//pixel = std::move(reinterpret_cast<SHTexture::PixelChannel const*>(file.GetDDSData()));
|
||||||
|
|
||||||
|
asset.name = path.stem().string();
|
||||||
|
asset.compiled = false;
|
||||||
|
asset.numBytes = static_cast<uint32_t>(totalBytes);
|
||||||
|
asset.width = file.GetWidth();
|
||||||
|
asset.height = file.GetHeight();
|
||||||
|
asset.format = ddsLoaderToVkFormat(file.GetFormat(), true);
|
||||||
|
asset.mipOffsets = std::move(mipOff);
|
||||||
|
asset.pixelData = std::move(pixel);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string SHTextureCompiler::WriteToFile(SHTextureAsset const& asset, AssetPath path) noexcept
|
||||||
|
{
|
||||||
|
std::string newPath{ path.string() };
|
||||||
|
newPath = newPath.substr(0, newPath.find_last_of('.'));
|
||||||
|
newPath += TEXTURE_EXTENSION;
|
||||||
|
|
||||||
|
std::ofstream file{ newPath, std::ios::out | std::ios::binary };
|
||||||
|
if (!file.is_open())
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Unable to open file for writing texture file: {}", path.string());
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr auto intBytes{ sizeof(uint32_t) };
|
||||||
|
|
||||||
|
uint32_t const mipOffsetCount{ static_cast<uint32_t>(asset.mipOffsets.size()) };
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(&asset.numBytes),
|
||||||
|
intBytes
|
||||||
|
);
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(&asset.width),
|
||||||
|
intBytes
|
||||||
|
);
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(&asset.height),
|
||||||
|
intBytes
|
||||||
|
);
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(&asset.format),
|
||||||
|
sizeof(SHTexture::TextureFormat)
|
||||||
|
);
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(&mipOffsetCount),
|
||||||
|
intBytes
|
||||||
|
);
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(asset.mipOffsets.data()),
|
||||||
|
intBytes * asset.mipOffsets.size()
|
||||||
|
);
|
||||||
|
|
||||||
|
file.write(
|
||||||
|
reinterpret_cast<char const*>(asset.pixelData),
|
||||||
|
asset.numBytes
|
||||||
|
);
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
return newPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<AssetPath> SHTextureCompiler::CompileTextureAsset(AssetPath path)
|
||||||
|
{
|
||||||
|
auto data = new SHTextureAsset();
|
||||||
|
LoadTinyDDS(path, *data);
|
||||||
|
return WriteToFile(*data, path);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHTextureCompiler.h
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date 30 September 2022
|
||||||
|
* \brief Library to write data in SHTextureAsset into binary file for
|
||||||
|
* faster loading in the future
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
#define TINYDDSLOADER_IMPLEMENTATION
|
||||||
|
|
||||||
|
#include "Assets/Asset Types/SHTextureAsset.h"
|
||||||
|
#include "Assets/SHAssetMacros.h"
|
||||||
|
#include "tinyddsloader.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
class SHTextureCompiler
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
static std::string TinyDDSResultToString(tinyddsloader::Result value);
|
||||||
|
static vk::Format ddsLoaderToVkFormat(tinyddsloader::DDSFile::DXGIFormat format, bool isLinear);
|
||||||
|
static void LoadTinyDDS(AssetPath path, SHTextureAsset& asset) noexcept;
|
||||||
|
|
||||||
|
static std::string WriteToFile(SHTextureAsset const& asset, AssetPath path) noexcept;
|
||||||
|
public:
|
||||||
|
static std::optional<AssetPath> CompileTextureAsset(AssetPath path);
|
||||||
|
};
|
||||||
|
}
|
|
@ -10,6 +10,7 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "Assets/SHAssetMacros.h"
|
||||||
#include "Assets/Asset Types/SHAssetData.h"
|
#include "Assets/Asset Types/SHAssetData.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
|
@ -10,13 +10,13 @@
|
||||||
* of DigiPen Institute of Technology is prohibited.
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "../SHAssetMacros.h"
|
#include "Assets/SHAssetMacros.h"
|
||||||
#include "../Asset Types/SHMeshAsset.h"
|
#include "Assets/Asset Types/SHMeshAsset.h"
|
||||||
#include "SHAssetLoader.h"
|
#include "SHAssetLoader.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
struct SHMeshLoader : public SHAssetLoader
|
struct SHMeshLoader : SHAssetLoader
|
||||||
{
|
{
|
||||||
void LoadSHMesh(AssetPath path, SHMeshAsset& meshes) noexcept;
|
void LoadSHMesh(AssetPath path, SHMeshAsset& meshes) noexcept;
|
||||||
SHAssetData* Load(AssetPath path) override;
|
SHAssetData* Load(AssetPath path) override;
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHShaderSourceLoader.cpp
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date 23 10 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 "SHShaderSourceLoader.h"
|
||||||
|
#include "Assets/Asset Types/SHShaderAsset.h"
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
SHAssetData* SHShaderSourceLoader::Load(AssetPath path)
|
||||||
|
{
|
||||||
|
auto result = new SHShaderAsset();
|
||||||
|
|
||||||
|
result->name = path.stem().stem().string();
|
||||||
|
|
||||||
|
std::ifstream file{ path.string(), std::ios::in | std::ios::binary };
|
||||||
|
if (!file.is_open())
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Unable to open compiled shader file: {}", path.string());
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t byteCount = 0;
|
||||||
|
|
||||||
|
file.read(reinterpret_cast<char*>(&result->shaderType), sizeof(uint8_t));
|
||||||
|
file.read(reinterpret_cast<char*>(&byteCount), sizeof(size_t));
|
||||||
|
|
||||||
|
result->spirvBinary.resize(byteCount / sizeof(uint32_t));
|
||||||
|
|
||||||
|
file.read(reinterpret_cast<char*>(result->spirvBinary.data()), byteCount);
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
/*************************************************************************//**
|
/*************************************************************************//**
|
||||||
* \file SHAnimationAsset.h
|
* \file SHShaderSourceLoader.h
|
||||||
* \author Loh Xiao Qi
|
* \author Loh Xiao Qi
|
||||||
* \date October 2022
|
* \date 23 10 2022
|
||||||
* \brief
|
* \brief
|
||||||
*
|
*
|
||||||
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
@ -10,21 +10,13 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <vector>
|
#include "Assets/Libraries/Loaders/SHAssetLoader.h"
|
||||||
#include <assimp/anim.h>
|
#include "Assets/SHAssetMacros.h"
|
||||||
#include "SH_API.power h"
|
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
struct SH_API SHAnimationAsset
|
struct SHShaderSourceLoader : SHAssetLoader
|
||||||
{
|
{
|
||||||
std::string name;
|
SHAssetData* Load(AssetPath path) override;
|
||||||
|
|
||||||
std::vector<aiNodeAnim*> nodeChannels;
|
|
||||||
std::vector<aiMeshAnim*> meshChannels;
|
|
||||||
std::vector<aiMeshMorphAnim*> morphMeshChannels;
|
|
||||||
|
|
||||||
double duration;
|
|
||||||
double ticksPerSecond;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHTextureLoader.cpp
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date 30 September 2022
|
||||||
|
* \brief Library to load dds textures and custom binary format
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 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 "SHTextureLoader.h"
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
|
||||||
|
void SHTextureLoader::LoadSHTexture(AssetPath path, SHTextureAsset& asset) noexcept
|
||||||
|
{
|
||||||
|
std::ifstream file{ path.string(), std::ios::in | std::ios::binary };
|
||||||
|
if (!file.is_open())
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Error opening SHTexture file: {}", path.string());
|
||||||
|
}
|
||||||
|
|
||||||
|
auto const intBytes{ sizeof(uint32_t) };
|
||||||
|
uint32_t mipCount;
|
||||||
|
|
||||||
|
file.read(reinterpret_cast<char*>(&asset.numBytes), intBytes);
|
||||||
|
file.read(reinterpret_cast<char*>(&asset.width), intBytes);
|
||||||
|
file.read(reinterpret_cast<char*>(&asset.height), intBytes);
|
||||||
|
file.read(reinterpret_cast<char*>(&asset.format), sizeof(SHTexture::TextureFormat));
|
||||||
|
|
||||||
|
file.read(reinterpret_cast<char*>(&mipCount), intBytes);
|
||||||
|
std::vector<uint32_t> mips(mipCount);
|
||||||
|
file.read(reinterpret_cast<char*>(mips.data()), intBytes * mipCount);
|
||||||
|
|
||||||
|
auto pixel = new SHTexture::PixelChannel[asset.numBytes];
|
||||||
|
file.read(reinterpret_cast<char*>(pixel), asset.numBytes);
|
||||||
|
|
||||||
|
asset.mipOffsets = std::move(mips);
|
||||||
|
asset.pixelData = std::move(pixel);
|
||||||
|
|
||||||
|
asset.compiled = true;
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
SHAssetData* SHTextureLoader::Load(AssetPath path)
|
||||||
|
{
|
||||||
|
auto result = new SHTextureAsset();
|
||||||
|
|
||||||
|
LoadSHTexture(path, *result);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,8 @@
|
||||||
/*************************************************************************//**
|
/*************************************************************************//**
|
||||||
* \file SHTextureCompiler.h
|
* \file SHTextureLoader.h
|
||||||
* \author Loh Xiao Qi
|
* \author Loh Xiao Qi
|
||||||
* \date 30 September 2022
|
* \date 30 September 2022
|
||||||
* \brief Library to write data in SHTextureAsset into binary file for
|
* \brief Library to load dds textures and custom binary format
|
||||||
* faster loading in the future
|
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
@ -12,13 +11,15 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Assets/Asset Types/SHTextureAsset.h"
|
|
||||||
#include "Assets/SHAssetMacros.h"
|
#include "Assets/SHAssetMacros.h"
|
||||||
|
#include "Assets/Asset Types/SHTextureAsset.h"
|
||||||
|
#include "SHAssetLoader.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
struct SHTextureCompiler
|
class SHTextureLoader : public SHAssetLoader
|
||||||
{
|
{
|
||||||
static std::string CompileTextureBinary(SHTextureAsset const& asset, AssetPath path);
|
void LoadSHTexture(AssetPath path, SHTextureAsset& asset) noexcept;
|
||||||
|
SHAssetData* Load(AssetPath path) override;
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -1,36 +0,0 @@
|
||||||
/*************************************************************************//**
|
|
||||||
* \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;
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,72 +0,0 @@
|
||||||
/*************************************************************************//**
|
|
||||||
* \file SHMeshCompiler.cpp
|
|
||||||
* \author Loh Xiao Qi
|
|
||||||
* \date 30 September 2022
|
|
||||||
* \brief Library to write data in SHMeshAsset into binary file for faster
|
|
||||||
* loading in the future
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* 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 "SHMeshCompiler.h"
|
|
||||||
#include "Graphics/MiddleEnd/Meshes/SHMeshData.h"
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
std::string SHADE::SHMeshCompiler::CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept
|
|
||||||
{
|
|
||||||
std::string newPath{ path.string() };
|
|
||||||
newPath = newPath.substr(0, newPath.find_last_of('/') + 1);
|
|
||||||
newPath += asset.header.name + MESH_EXTENSION.data();
|
|
||||||
|
|
||||||
std::ofstream file{ newPath, std::ios::out | std::ios::binary | std::ios::trunc };
|
|
||||||
if (!file.is_open())
|
|
||||||
{
|
|
||||||
SHLOG_ERROR("Unable to open file for writing mesh file: {}", path.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(&(asset.header.vertexCount)),
|
|
||||||
sizeof(uint32_t)
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<const char*>(&(asset.header.indexCount)),
|
|
||||||
sizeof(uint32_t)
|
|
||||||
);
|
|
||||||
|
|
||||||
auto const vertexVec3Byte {sizeof(SHVec3) * asset.header.vertexCount};
|
|
||||||
auto const vertexVec2Byte {sizeof(SHVec2) * asset.header.vertexCount};
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.vertexPosition.data()),
|
|
||||||
vertexVec3Byte
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.vertexTangent.data()),
|
|
||||||
vertexVec3Byte
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.vertexNormal.data()),
|
|
||||||
vertexVec3Byte
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.texCoords.data()),
|
|
||||||
vertexVec2Byte
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.indices.data()),
|
|
||||||
sizeof(uint32_t) * asset.header.indexCount
|
|
||||||
);
|
|
||||||
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
return newPath;
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
/*************************************************************************//**
|
|
||||||
* \file SHMeshCompiler.h
|
|
||||||
* \author Loh Xiao Qi
|
|
||||||
* \date 30 September 2022
|
|
||||||
* \brief Library to write data in SHMeshAsset into binary file for faster
|
|
||||||
* loading in the future
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* 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 "../Asset Types/SHMeshAsset.h"
|
|
||||||
#include "../SHAssetMacros.h"
|
|
||||||
|
|
||||||
namespace SHADE
|
|
||||||
{
|
|
||||||
class SHMeshCompiler
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
public:
|
|
||||||
static std::string CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept;
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,75 +0,0 @@
|
||||||
/*************************************************************************//**
|
|
||||||
* \file SHTextureCompiler.cpp
|
|
||||||
* \author Loh Xiao Qi
|
|
||||||
* \date 30 September 2022
|
|
||||||
* \brief Library to write data in SHTextureAsset into binary file for
|
|
||||||
* faster loading in the future
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* 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 "SHTextureCompiler.h"
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
namespace SHADE
|
|
||||||
{
|
|
||||||
std::string SHTextureCompiler::CompileTextureBinary(SHTextureAsset const& asset, AssetPath path)
|
|
||||||
{
|
|
||||||
std::string newPath{ path.string() };
|
|
||||||
newPath = newPath.substr(0, newPath.find_last_of('.'));
|
|
||||||
newPath += TEXTURE_EXTENSION;
|
|
||||||
|
|
||||||
std::ofstream file{ newPath, std::ios::out | std::ios::binary };
|
|
||||||
if (!file.is_open())
|
|
||||||
{
|
|
||||||
SHLOG_ERROR("Unable to open file for writing texture file: {}", path.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
auto const intBytes{sizeof(uint32_t)};
|
|
||||||
|
|
||||||
uint32_t mipOffsetCount{ static_cast<uint32_t>(asset.mipOffsets.size()) };
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(&asset.numBytes),
|
|
||||||
intBytes
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(&asset.width),
|
|
||||||
intBytes
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(&asset.height),
|
|
||||||
intBytes
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(&asset.format),
|
|
||||||
sizeof(SHTexture::TextureFormat)
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(&mipOffsetCount),
|
|
||||||
intBytes
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.mipOffsets.data()),
|
|
||||||
intBytes * asset.mipOffsets.size()
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.pixelData),
|
|
||||||
asset.numBytes
|
|
||||||
);
|
|
||||||
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
return newPath;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,156 +0,0 @@
|
||||||
/*************************************************************************//**
|
|
||||||
* \file SHTextureLoader.cpp
|
|
||||||
* \author Loh Xiao Qi
|
|
||||||
* \date 30 September 2022
|
|
||||||
* \brief Library to load dds textures and custom binary format
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* 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 "SHTextureLoader.h"
|
|
||||||
|
|
||||||
namespace SHADE
|
|
||||||
{
|
|
||||||
std::string SHTextureLoader::TinyDDSResultToString(tinyddsloader::Result value)
|
|
||||||
{
|
|
||||||
switch (value)
|
|
||||||
{
|
|
||||||
case tinyddsloader::Result::ErrorFileOpen:
|
|
||||||
return "File open err";
|
|
||||||
case tinyddsloader::Result::ErrorRead:
|
|
||||||
return "File read err";
|
|
||||||
case tinyddsloader::Result::ErrorMagicWord:
|
|
||||||
return "File header magic word err";
|
|
||||||
case tinyddsloader::Result::ErrorSize:
|
|
||||||
return "File size err";
|
|
||||||
case tinyddsloader::Result::ErrorVerify:
|
|
||||||
return "Pixel format err";
|
|
||||||
case tinyddsloader::Result::ErrorNotSupported:
|
|
||||||
return "Unsupported format";
|
|
||||||
case tinyddsloader::Result::ErrorInvalidData:
|
|
||||||
return "Invalid data";
|
|
||||||
default:
|
|
||||||
return "Unknown";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vk::Format SHTextureLoader::ddsLoaderToVkFormat(tinyddsloader::DDSFile::DXGIFormat format, bool isLinear)
|
|
||||||
{
|
|
||||||
switch (format)
|
|
||||||
{
|
|
||||||
case tinyddsloader::DDSFile::DXGIFormat::BC1_UNorm:
|
|
||||||
case tinyddsloader::DDSFile::DXGIFormat::BC1_UNorm_SRGB:
|
|
||||||
return isLinear ? vk::Format::eBc1RgbaUnormBlock : vk::Format::eBc1RgbaSrgbBlock;
|
|
||||||
case tinyddsloader::DDSFile::DXGIFormat::BC2_UNorm:
|
|
||||||
case tinyddsloader::DDSFile::DXGIFormat::BC2_UNorm_SRGB:
|
|
||||||
return isLinear ? vk::Format::eBc2UnormBlock : vk::Format::eBc2SrgbBlock;
|
|
||||||
case tinyddsloader::DDSFile::DXGIFormat::BC3_UNorm:
|
|
||||||
case tinyddsloader::DDSFile::DXGIFormat::BC3_UNorm_SRGB:
|
|
||||||
return isLinear ? vk::Format::eBc3UnormBlock : vk::Format::eBc3SrgbBlock;
|
|
||||||
case tinyddsloader::DDSFile::DXGIFormat::BC5_UNorm:
|
|
||||||
case tinyddsloader::DDSFile::DXGIFormat::BC5_SNorm:
|
|
||||||
return isLinear ? vk::Format::eBc5UnormBlock : vk::Format::eBc5SnormBlock;
|
|
||||||
case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_UNorm:
|
|
||||||
case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_UNorm_SRGB:
|
|
||||||
return isLinear ? vk::Format::eR8G8B8A8Unorm : vk::Format::eR8G8B8A8Srgb;
|
|
||||||
case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_SNorm:
|
|
||||||
return vk::Format::eR8G8B8A8Snorm;
|
|
||||||
case tinyddsloader::DDSFile::DXGIFormat::B8G8R8A8_UNorm:
|
|
||||||
case tinyddsloader::DDSFile::DXGIFormat::B8G8R8A8_UNorm_SRGB:
|
|
||||||
return isLinear ? vk::Format::eB8G8R8A8Unorm : vk::Format::eB8G8R8A8Srgb;
|
|
||||||
case tinyddsloader::DDSFile::DXGIFormat::B8G8R8X8_UNorm:
|
|
||||||
case tinyddsloader::DDSFile::DXGIFormat::B8G8R8X8_UNorm_SRGB:
|
|
||||||
return isLinear ? vk::Format::eB8G8R8A8Unorm : vk::Format::eB8G8R8Srgb;
|
|
||||||
default:
|
|
||||||
throw std::runtime_error("Unsupported DDS format.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SHTextureLoader::LoadTinyDDS(AssetPath path, SHTextureAsset& asset) noexcept
|
|
||||||
{
|
|
||||||
tinyddsloader::Result loadResult = tinyddsloader::Result::Success;
|
|
||||||
tinyddsloader::DDSFile file;
|
|
||||||
loadResult = file.Load(path.string().c_str());
|
|
||||||
if (loadResult != tinyddsloader::Result::Success)
|
|
||||||
{
|
|
||||||
SHLOG_ERROR("Unable to load Texture file: {} at {}", TinyDDSResultToString(loadResult), path.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t totalBytes{ 0 };
|
|
||||||
|
|
||||||
std::vector<uint32_t> mipOff(file.GetMipCount());
|
|
||||||
|
|
||||||
for (size_t i{0}; i < file.GetMipCount(); ++i)
|
|
||||||
{
|
|
||||||
mipOff[i] = static_cast<uint32_t>(totalBytes);
|
|
||||||
totalBytes += file.GetImageData(static_cast<uint32_t>(i), 0)->m_memSlicePitch;
|
|
||||||
}
|
|
||||||
|
|
||||||
SHTexture::PixelChannel* pixel = new SHTexture::PixelChannel[totalBytes];
|
|
||||||
std::memcpy(pixel, file.GetImageData()->m_mem, totalBytes);
|
|
||||||
//pixel = std::move(reinterpret_cast<SHTexture::PixelChannel const*>(file.GetDDSData()));
|
|
||||||
|
|
||||||
asset.name = path.stem().string();
|
|
||||||
asset.compiled = false;
|
|
||||||
asset.numBytes = static_cast<uint32_t>(totalBytes);
|
|
||||||
asset.width = file.GetWidth();
|
|
||||||
asset.height = file.GetHeight();
|
|
||||||
asset.format = ddsLoaderToVkFormat(file.GetFormat(), true);
|
|
||||||
asset.mipOffsets = std::move(mipOff);
|
|
||||||
asset.pixelData = std::move(pixel);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SHTextureLoader::LoadSHTexture(AssetPath path, SHTextureAsset& asset) noexcept
|
|
||||||
{
|
|
||||||
std::ifstream file{path.string(), std::ios::in | std::ios::binary};
|
|
||||||
if (!file.is_open())
|
|
||||||
{
|
|
||||||
SHLOG_ERROR("Error opening SHTexture file: {}", path.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
auto const intBytes{ sizeof(uint32_t) };
|
|
||||||
uint32_t mipCount;
|
|
||||||
|
|
||||||
file.read(reinterpret_cast<char*>(&asset.numBytes), intBytes);
|
|
||||||
file.read(reinterpret_cast<char*>(&asset.width), intBytes);
|
|
||||||
file.read(reinterpret_cast<char*>(&asset.height), intBytes);
|
|
||||||
file.read(reinterpret_cast<char*>(&asset.format), sizeof(SHTexture::TextureFormat));
|
|
||||||
|
|
||||||
file.read(reinterpret_cast<char*>(&mipCount), intBytes);
|
|
||||||
std::vector<uint32_t> mips(mipCount);
|
|
||||||
file.read(reinterpret_cast<char*>(mips.data()), intBytes * mipCount);
|
|
||||||
|
|
||||||
auto pixel = new SHTexture::PixelChannel[asset.numBytes];
|
|
||||||
file.read(reinterpret_cast<char*>(pixel), asset.numBytes);
|
|
||||||
|
|
||||||
asset.mipOffsets = std::move(mips);
|
|
||||||
asset.pixelData = std::move( pixel );
|
|
||||||
|
|
||||||
asset.compiled = true;
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
SHAssetData* SHTextureLoader::Load(AssetPath path)
|
|
||||||
{
|
|
||||||
auto result = new SHTextureAsset();
|
|
||||||
|
|
||||||
LoadImageAsset(path, *result);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SHTextureLoader::LoadImageAsset(AssetPath path, SHTextureAsset& asset)
|
|
||||||
{
|
|
||||||
if (path.extension().string() == DDS_EXTENSION)
|
|
||||||
{
|
|
||||||
LoadTinyDDS(path, asset);
|
|
||||||
}
|
|
||||||
else if (path.extension().string() == TEXTURE_EXTENSION)
|
|
||||||
{
|
|
||||||
LoadSHTexture(path, asset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
/*************************************************************************//**
|
|
||||||
* \file SHTextureLoader.h
|
|
||||||
* \author Loh Xiao Qi
|
|
||||||
* \date 30 September 2022
|
|
||||||
* \brief Library to load dds textures and custom binary format
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
#define TINYDDSLOADER_IMPLEMENTATION
|
|
||||||
|
|
||||||
#include "../SHAssetMacros.h"
|
|
||||||
#include "../Asset Types/SHTextureAsset.h"
|
|
||||||
#include "tinyddsloader.h"
|
|
||||||
#include "SHAssetLoader.h"
|
|
||||||
|
|
||||||
namespace SHADE
|
|
||||||
{
|
|
||||||
class SHTextureLoader : public SHAssetLoader
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
std::string TinyDDSResultToString(tinyddsloader::Result value);
|
|
||||||
vk::Format ddsLoaderToVkFormat(tinyddsloader::DDSFile::DXGIFormat format, bool isLinear);
|
|
||||||
|
|
||||||
void LoadTinyDDS(AssetPath path, SHTextureAsset& asset) noexcept;
|
|
||||||
public:
|
|
||||||
void LoadImageAsset(AssetPath paths, SHTextureAsset& image);
|
|
||||||
void LoadSHTexture(AssetPath path, SHTextureAsset& asset) noexcept;
|
|
||||||
SHAssetData* Load(AssetPath path) override;
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -42,20 +42,14 @@ constexpr std::string_view ASSET_META_VER { "1.0" };
|
||||||
// Asset type enum
|
// Asset type enum
|
||||||
enum class AssetType : AssetTypeMeta
|
enum class AssetType : AssetTypeMeta
|
||||||
{
|
{
|
||||||
INVALID = 0,
|
INVALID,
|
||||||
AUDIO = 1,
|
|
||||||
SHADER,
|
SHADER,
|
||||||
MATERIAL,
|
SHADER_BUILT_IN,
|
||||||
IMAGE,
|
TEXTURE,
|
||||||
TEXTURE,
|
MESH,
|
||||||
MESH,
|
|
||||||
SCRIPT,
|
|
||||||
SCENE,
|
|
||||||
PREFAB,
|
|
||||||
AUDIO_WAV,
|
|
||||||
DDS,
|
|
||||||
MAX_COUNT
|
MAX_COUNT
|
||||||
};
|
};
|
||||||
|
constexpr size_t TYPE_COUNT{ static_cast<size_t>(AssetType::MAX_COUNT) };
|
||||||
|
|
||||||
//Directory
|
//Directory
|
||||||
#ifdef _PUBLISH
|
#ifdef _PUBLISH
|
||||||
|
@ -67,37 +61,55 @@ constexpr std::string_view ASSET_ROOT {"../../Assets"};
|
||||||
|
|
||||||
// ASSET EXTENSIONS
|
// ASSET EXTENSIONS
|
||||||
constexpr std::string_view META_EXTENSION {".shmeta"};
|
constexpr std::string_view META_EXTENSION {".shmeta"};
|
||||||
constexpr std::string_view IMAGE_EXTENSION {".png"};
|
|
||||||
constexpr std::string_view AUDIO_EXTENSION {".ogg"};
|
constexpr std::string_view AUDIO_EXTENSION {".ogg"};
|
||||||
constexpr std::string_view AUDIO_WAV_EXTENSION {".wav"};
|
constexpr std::string_view AUDIO_WAV_EXTENSION {".wav"};
|
||||||
constexpr std::string_view SHADER_EXTENSION {".glsl"};
|
constexpr std::string_view SHADER_EXTENSION{ ".shshader" };
|
||||||
|
constexpr std::string_view SHADER_BUILT_IN_EXTENSION{".shshaderb"};
|
||||||
constexpr std::string_view SCRIPT_EXTENSION {".cs"};
|
constexpr std::string_view SCRIPT_EXTENSION {".cs"};
|
||||||
constexpr std::string_view SCENE_EXTENSION {".SHADE"};
|
constexpr std::string_view SCENE_EXTENSION {".shade"};
|
||||||
constexpr std::string_view PREFAB_EXTENSION {".SHPrefab"};
|
constexpr std::string_view PREFAB_EXTENSION {".shprefab"};
|
||||||
constexpr std::string_view MATERIAL_EXTENSION {".SHMat"};
|
constexpr std::string_view MATERIAL_EXTENSION {".shmat"};
|
||||||
constexpr std::string_view TEXTURE_EXTENSION {".shtex"};
|
constexpr std::string_view TEXTURE_EXTENSION {".shtex"};
|
||||||
constexpr std::string_view DDS_EXTENSION {".dds"};
|
|
||||||
constexpr std::string_view FBX_EXTENSION {".fbx"};
|
|
||||||
constexpr std::string_view GLTF_EXTENSION {".gltf"};
|
|
||||||
constexpr std::string_view MESH_EXTENSION {".shmesh"};
|
constexpr std::string_view MESH_EXTENSION {".shmesh"};
|
||||||
|
|
||||||
constexpr std::string_view EXTENSIONS[] = {
|
constexpr std::string_view EXTENSIONS[] = {
|
||||||
AUDIO_EXTENSION,
|
AUDIO_EXTENSION,
|
||||||
SHADER_EXTENSION,
|
SHADER_EXTENSION,
|
||||||
|
SHADER_BUILT_IN_EXTENSION,
|
||||||
MATERIAL_EXTENSION,
|
MATERIAL_EXTENSION,
|
||||||
IMAGE_EXTENSION,
|
|
||||||
TEXTURE_EXTENSION,
|
TEXTURE_EXTENSION,
|
||||||
DDS_EXTENSION,
|
|
||||||
MESH_EXTENSION,
|
MESH_EXTENSION,
|
||||||
SCRIPT_EXTENSION,
|
SCRIPT_EXTENSION,
|
||||||
SCENE_EXTENSION,
|
SCENE_EXTENSION,
|
||||||
PREFAB_EXTENSION,
|
PREFAB_EXTENSION,
|
||||||
AUDIO_WAV_EXTENSION,
|
AUDIO_WAV_EXTENSION,
|
||||||
|
};
|
||||||
|
|
||||||
|
// EXTERNAL EXTENSIONS
|
||||||
|
constexpr std::string_view GLSL_EXTENSION{ ".glsl" };
|
||||||
|
constexpr std::string_view DDS_EXTENSION{ ".dds" };
|
||||||
|
constexpr std::string_view FBX_EXTENSION{ ".fbx" };
|
||||||
|
constexpr std::string_view GLTF_EXTENSION{ ".gltf" };
|
||||||
|
|
||||||
|
constexpr std::string_view EXTERNALS[] = {
|
||||||
|
GLSL_EXTENSION,
|
||||||
|
DDS_EXTENSION,
|
||||||
FBX_EXTENSION,
|
FBX_EXTENSION,
|
||||||
GLTF_EXTENSION
|
GLTF_EXTENSION
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr size_t TYPE_COUNT {static_cast<size_t>(AssetType::MAX_COUNT) };
|
// SHADER IDENTIFIERS
|
||||||
|
constexpr std::string_view VERTEX_SHADER{ "_VS" };
|
||||||
|
constexpr std::string_view FRAGMENT_SHADER{ "_FS" };
|
||||||
|
constexpr std::string_view COMPUTER_SHADER{ "_CS" };
|
||||||
|
|
||||||
|
constexpr std::string_view SHADER_IDENTIFIERS[] = {
|
||||||
|
VERTEX_SHADER,
|
||||||
|
FRAGMENT_SHADER,
|
||||||
|
COMPUTER_SHADER
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr size_t SHADER_TYPE_MAX_COUNT{ 3 };
|
||||||
|
|
||||||
// Error flags
|
// Error flags
|
||||||
constexpr std::string_view FILE_NOT_FOUND_ERR {"FILE NOT FOUND"};
|
constexpr std::string_view FILE_NOT_FOUND_ERR {"FILE NOT FOUND"};
|
||||||
|
|
|
@ -14,12 +14,13 @@
|
||||||
#include "SHAssetMetaHandler.h"
|
#include "SHAssetMetaHandler.h"
|
||||||
#include "Filesystem/SHFileSystem.h"
|
#include "Filesystem/SHFileSystem.h"
|
||||||
|
|
||||||
#include "Libraries/SHAssimpLibrary.h"
|
#include "Libraries/Loaders/SHMeshLoader.h"
|
||||||
#include "Libraries/SHMeshLoader.h"
|
#include "Libraries/Loaders/SHTextureLoader.h"
|
||||||
#include "Libraries/SHTextureLoader.h"
|
#include "Libraries/Loaders/SHShaderSourceLoader.h"
|
||||||
|
|
||||||
#include "Libraries/SHMeshCompiler.h"
|
#include "Libraries/Compilers/SHMeshCompiler.h"
|
||||||
#include "Libraries/SHTextureCompiler.h"
|
#include "Libraries/Compilers/SHTextureCompiler.h"
|
||||||
|
#include "Libraries/Compilers/SHShaderSourceCompiler.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -44,7 +45,13 @@ namespace SHADE
|
||||||
|
|
||||||
result |= unique;
|
result |= unique;
|
||||||
|
|
||||||
while (result == 0)
|
while (result == 0 ||
|
||||||
|
std::ranges::any_of(
|
||||||
|
assetCollection.begin(),
|
||||||
|
assetCollection.end(),
|
||||||
|
[result](SHAsset const& asset) { return asset.id == result; }
|
||||||
|
)
|
||||||
|
)
|
||||||
{
|
{
|
||||||
result = GenerateAssetID(type);
|
result = GenerateAssetID(type);
|
||||||
}
|
}
|
||||||
|
@ -64,7 +71,20 @@ namespace SHADE
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
AssetPath SHAssetManager::GenerateLocalPath(AssetPath path) noexcept
|
void SHAssetManager::Exit() noexcept
|
||||||
|
{
|
||||||
|
for (auto const& loader : loaders)
|
||||||
|
{
|
||||||
|
delete loader;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto const& data : assetData)
|
||||||
|
{
|
||||||
|
delete data.second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AssetPath SHAssetManager::GenerateLocalPath(AssetPath path) noexcept
|
||||||
{
|
{
|
||||||
if (!IsRecognised(path.extension().string().c_str()))
|
if (!IsRecognised(path.extension().string().c_str()))
|
||||||
{
|
{
|
||||||
|
@ -91,17 +111,10 @@ namespace SHADE
|
||||||
|
|
||||||
switch(type)
|
switch(type)
|
||||||
{
|
{
|
||||||
case AssetType::SCENE:
|
case AssetType::SHADER:
|
||||||
folder = "scenes/";
|
case AssetType::SHADER_BUILT_IN:
|
||||||
break;
|
folder = "Shaders/";
|
||||||
|
break;
|
||||||
case AssetType::PREFAB:
|
|
||||||
folder = "prefabs/";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AssetType::MATERIAL:
|
|
||||||
folder = "materials/";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
folder = "/";
|
folder = "/";
|
||||||
|
@ -206,7 +219,56 @@ namespace SHADE
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SHAssetManager::IsRecognised(char const* ext) noexcept
|
std::vector<SHAssetData const*> SHAssetManager::GetAllDataOfType(AssetType type) noexcept
|
||||||
|
{
|
||||||
|
auto const toRetrieve = GetAllRecordOfType(type);
|
||||||
|
std::vector<SHAssetData const*> result;
|
||||||
|
result.reserve(toRetrieve.size());
|
||||||
|
for (auto const& get : toRetrieve)
|
||||||
|
{
|
||||||
|
result.push_back(LoadData(get));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<SHAsset> SHAssetManager::GetAllRecordOfType(AssetType type) noexcept
|
||||||
|
{
|
||||||
|
std::vector<SHAsset> result;
|
||||||
|
for (auto const& asset : assetCollection)
|
||||||
|
{
|
||||||
|
if (asset.type == type)
|
||||||
|
{
|
||||||
|
result.push_back(asset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
AssetID SHAssetManager::CompileAsset(AssetPath path) noexcept
|
||||||
|
{
|
||||||
|
SHAsset newAsset
|
||||||
|
{
|
||||||
|
.name = path.stem().string(),
|
||||||
|
.location = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
auto const ext{ path.extension().string() };
|
||||||
|
if (ext == GLSL_EXTENSION.data())
|
||||||
|
{
|
||||||
|
newAsset.path = SHShaderSourceCompiler::LoadAndCompileShader(path).value();
|
||||||
|
newAsset.id = GenerateAssetID(AssetType::SHADER_BUILT_IN);
|
||||||
|
newAsset.type = AssetType::SHADER_BUILT_IN;
|
||||||
|
}
|
||||||
|
|
||||||
|
assetCollection.push_back(newAsset);
|
||||||
|
SHAssetMetaHandler::WriteMetaData(newAsset);
|
||||||
|
|
||||||
|
return newAsset.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SHAssetManager::IsRecognised(char const* ext) noexcept
|
||||||
{
|
{
|
||||||
for (auto const& e : EXTENSIONS)
|
for (auto const& e : EXTENSIONS)
|
||||||
{
|
{
|
||||||
|
@ -227,23 +289,82 @@ namespace SHADE
|
||||||
result.type = SHAssetMetaHandler::GetTypeFromExtension(path.extension().string());
|
result.type = SHAssetMetaHandler::GetTypeFromExtension(path.extension().string());
|
||||||
result.id = GenerateAssetID(result.type);
|
result.id = GenerateAssetID(result.type);
|
||||||
result.path = path;
|
result.path = path;
|
||||||
|
result.location = 0;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHAssetManager::InitLoaders() noexcept
|
void SHAssetManager::CompileAll() noexcept
|
||||||
|
{
|
||||||
|
std::vector<AssetPath> paths;
|
||||||
|
|
||||||
|
for (auto const& dir : std::filesystem::recursive_directory_iterator{ ASSET_ROOT })
|
||||||
|
{
|
||||||
|
if (dir.is_regular_file())
|
||||||
|
{
|
||||||
|
for (auto const& ext : EXTERNALS)
|
||||||
|
{
|
||||||
|
if (dir.path().extension().string() == ext.data())
|
||||||
|
{
|
||||||
|
paths.push_back(dir.path());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto const& path : paths)
|
||||||
|
{
|
||||||
|
SHAsset newAsset
|
||||||
|
{
|
||||||
|
.name = path.stem().string(),
|
||||||
|
.location = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
auto const ext{ path.extension().string() };
|
||||||
|
if (ext == GLSL_EXTENSION.data())
|
||||||
|
{
|
||||||
|
newAsset.path = SHShaderSourceCompiler::LoadAndCompileShader(path).value();
|
||||||
|
newAsset.id = GenerateAssetID(AssetType::SHADER_BUILT_IN);
|
||||||
|
newAsset.type = AssetType::SHADER_BUILT_IN;
|
||||||
|
}
|
||||||
|
else if (ext == DDS_EXTENSION.data())
|
||||||
|
{
|
||||||
|
newAsset.path = SHTextureCompiler::CompileTextureAsset(path).value();
|
||||||
|
newAsset.id = GenerateAssetID(AssetType::TEXTURE);
|
||||||
|
newAsset.type = AssetType::TEXTURE;
|
||||||
|
}
|
||||||
|
else if (ext == GLTF_EXTENSION.data() || ext == FBX_EXTENSION.data())
|
||||||
|
{
|
||||||
|
std::vector<SHMeshAsset*> meshes;
|
||||||
|
std::vector<SHAnimationAsset*> anims;
|
||||||
|
SHMeshCompiler::LoadFromFile(path, meshes, anims);
|
||||||
|
|
||||||
|
for (auto const& mesh : meshes)
|
||||||
|
{
|
||||||
|
SHAsset meshAsset{
|
||||||
|
.name = mesh->header.name,
|
||||||
|
.location = 0
|
||||||
|
};
|
||||||
|
meshAsset.path = SHMeshCompiler::CompileMeshBinary(*mesh, path).value();
|
||||||
|
meshAsset.id = GenerateAssetID(AssetType::MESH);
|
||||||
|
meshAsset.type = AssetType::MESH;
|
||||||
|
assetCollection.push_back(meshAsset);
|
||||||
|
SHAssetMetaHandler::WriteMetaData(meshAsset);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
assetCollection.push_back(newAsset);
|
||||||
|
SHAssetMetaHandler::WriteMetaData(newAsset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHAssetManager::InitLoaders() noexcept
|
||||||
{
|
{
|
||||||
loaders[static_cast<size_t>(AssetType::AUDIO)] = nullptr;
|
loaders[static_cast<size_t>(AssetType::SHADER)] = dynamic_cast<SHAssetLoader*>(new SHShaderSourceLoader());
|
||||||
loaders[static_cast<size_t>(AssetType::SHADER)] = nullptr;
|
loaders[static_cast<size_t>(AssetType::SHADER_BUILT_IN)] = loaders[static_cast<size_t>(AssetType::SHADER)];
|
||||||
loaders[static_cast<size_t>(AssetType::MATERIAL)] = nullptr;
|
loaders[static_cast<size_t>(AssetType::TEXTURE)] = dynamic_cast<SHAssetLoader*>(new SHTextureLoader());
|
||||||
loaders[static_cast<size_t>(AssetType::IMAGE)] = dynamic_cast<SHAssetLoader*>(new SHTextureLoader());
|
loaders[static_cast<size_t>(AssetType::MESH)] = dynamic_cast<SHAssetLoader*>(new SHMeshLoader());
|
||||||
loaders[static_cast<size_t>(AssetType::TEXTURE)] = nullptr;
|
|
||||||
loaders[static_cast<size_t>(AssetType::MESH)] = dynamic_cast<SHAssetLoader*>(new SHMeshLoader());
|
|
||||||
loaders[static_cast<size_t>(AssetType::SCRIPT)] = nullptr;
|
|
||||||
loaders[static_cast<size_t>(AssetType::SCENE)] = nullptr;
|
|
||||||
loaders[static_cast<size_t>(AssetType::PREFAB)] = nullptr;
|
|
||||||
loaders[static_cast<size_t>(AssetType::AUDIO_WAV)] = nullptr;
|
|
||||||
loaders[static_cast<size_t>(AssetType::DDS)] = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -251,6 +372,7 @@ namespace SHADE
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
void SHAssetManager::Load() noexcept
|
void SHAssetManager::Load() noexcept
|
||||||
{
|
{
|
||||||
|
//CompileAll();
|
||||||
InitLoaders();
|
InitLoaders();
|
||||||
BuildAssetCollection();
|
BuildAssetCollection();
|
||||||
//LoadAllData();
|
//LoadAllData();
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
#include "tinyddsloader.h"
|
#include "tinyddsloader.h"
|
||||||
#include "SHAsset.h"
|
#include "SHAsset.h"
|
||||||
#include "Asset Types/SHAssetData.h"
|
#include "Asset Types/SHAssetData.h"
|
||||||
#include "Libraries/SHAssetLoader.h"
|
#include "Assets/Libraries/Loaders/SHAssetLoader.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "SH_API.h"
|
#include "SH_API.h"
|
||||||
|
@ -37,6 +37,8 @@ namespace SHADE
|
||||||
static void Unload() noexcept;
|
static void Unload() noexcept;
|
||||||
static void Unload(AssetID assetId) noexcept;
|
static void Unload(AssetID assetId) noexcept;
|
||||||
|
|
||||||
|
static void Exit() noexcept;
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* \brief Load all resources that are in the folder
|
* \brief Load all resources that are in the folder
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
@ -77,21 +79,24 @@ namespace SHADE
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static std::enable_if_t<std::is_base_of_v<SHAssetData, T>, T const* const> GetData(AssetID id) noexcept;
|
static std::enable_if_t<std::is_base_of_v<SHAssetData, T>, T const* const> GetData(AssetID id) noexcept;
|
||||||
|
|
||||||
|
static std::vector<SHAssetData const*> GetAllDataOfType(AssetType type) noexcept;
|
||||||
|
static std::vector<SHAsset> GetAllRecordOfType(AssetType type) noexcept;
|
||||||
|
|
||||||
|
static AssetID CompileAsset(AssetPath path) noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/****************************************************************************
|
|
||||||
* \brief Load resource data into memory
|
static void InitLoaders() noexcept;
|
||||||
****************************************************************************/
|
|
||||||
static void LoadAllData() noexcept;
|
static void LoadAllData() noexcept;
|
||||||
|
|
||||||
static SHAssetData* LoadData(SHAsset const& asset) noexcept;
|
static SHAssetData* LoadData(SHAsset const& asset) noexcept;
|
||||||
|
|
||||||
inline static void BuildAssetCollection() noexcept;
|
inline static void BuildAssetCollection() noexcept;
|
||||||
|
|
||||||
static bool IsRecognised(char const*) noexcept;
|
static bool IsRecognised(char const*) noexcept;
|
||||||
|
|
||||||
static SHAsset CreateAssetFromPath(AssetPath path) noexcept;
|
static SHAsset CreateAssetFromPath(AssetPath path) noexcept;
|
||||||
|
|
||||||
static void InitLoaders() noexcept;
|
static void CompileAll() noexcept;
|
||||||
|
|
||||||
static FMOD::System* audioSystem;
|
static FMOD::System* audioSystem;
|
||||||
static std::unordered_map<AssetID,SHSound>* audioSoundList;
|
static std::unordered_map<AssetID,SHSound>* audioSoundList;
|
||||||
|
|
|
@ -118,24 +118,8 @@ namespace SHADE
|
||||||
graphicsTexCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
graphicsTexCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
||||||
|
|
||||||
|
|
||||||
// TODO: This is VERY temporarily here until a more solid resource management system is implemented
|
shaderModuleLibrary.ImportAllShaderSource(device);
|
||||||
shaderSourceLibrary.Init("../../TempShaderFolder/");
|
shaderModuleLibrary.ReflectAllShaderModules();
|
||||||
|
|
||||||
shaderSourceLibrary.LoadShader(0, "TestCubeVs.glsl", SH_SHADER_TYPE::VERTEX, true);
|
|
||||||
shaderSourceLibrary.LoadShader(1, "TestCubeFs.glsl", SH_SHADER_TYPE::FRAGMENT, true);
|
|
||||||
|
|
||||||
shaderSourceLibrary.LoadShader(2, "KirschCs.glsl", SH_SHADER_TYPE::COMPUTE, true);
|
|
||||||
shaderSourceLibrary.LoadShader(3, "PureCopyCs.glsl", SH_SHADER_TYPE::COMPUTE, true);
|
|
||||||
|
|
||||||
shaderModuleLibrary.ImportFromSourceLibrary(device, shaderSourceLibrary);
|
|
||||||
auto cubeVS = shaderModuleLibrary.GetShaderModule("TestCubeVs.glsl");
|
|
||||||
auto cubeFS = shaderModuleLibrary.GetShaderModule("TestCubeFs.glsl");
|
|
||||||
auto greyscale = shaderModuleLibrary.GetShaderModule("KirschCs.glsl");
|
|
||||||
auto pureCopy = shaderModuleLibrary.GetShaderModule("PureCopyCs.glsl");
|
|
||||||
cubeVS->Reflect();
|
|
||||||
cubeFS->Reflect();
|
|
||||||
greyscale->Reflect();
|
|
||||||
pureCopy->Reflect();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHGraphicsSystem::InitSceneRenderGraph(void) noexcept
|
void SHGraphicsSystem::InitSceneRenderGraph(void) noexcept
|
||||||
|
@ -190,11 +174,11 @@ namespace SHADE
|
||||||
gBufferSubpass->AddDepthOutput("Depth Buffer", SH_ATT_DESC_TYPE_FLAGS::DEPTH_STENCIL);
|
gBufferSubpass->AddDepthOutput("Depth Buffer", SH_ATT_DESC_TYPE_FLAGS::DEPTH_STENCIL);
|
||||||
|
|
||||||
//// kirsch
|
//// kirsch
|
||||||
//auto kirschShader = shaderModuleLibrary.GetShaderModule("KirschCs.glsl");
|
//auto kirschShader = shaderModuleLibrary.GetShaderModule("KirschCs");
|
||||||
//gBufferNode->AddNodeCompute(kirschShader, { "Scene Pre-Process", "Scene" });
|
//gBufferNode->AddNodeCompute(kirschShader, { "Scene Pre-Process", "Scene" });
|
||||||
|
|
||||||
// copy
|
// copy
|
||||||
auto pureCopyShader = shaderModuleLibrary.GetShaderModule("PureCopyCs.glsl");
|
auto pureCopyShader = shaderModuleLibrary.GetBuiltInShaderModule("PureCopy_CS");
|
||||||
gBufferNode->AddNodeCompute(pureCopyShader, { "Scene Pre-Process", "Scene" });
|
gBufferNode->AddNodeCompute(pureCopyShader, { "Scene Pre-Process", "Scene" });
|
||||||
|
|
||||||
|
|
||||||
|
@ -212,8 +196,8 @@ namespace SHADE
|
||||||
|
|
||||||
worldRenderer->SetCameraDirector(cameraSystem->CreateDirector());
|
worldRenderer->SetCameraDirector(cameraSystem->CreateDirector());
|
||||||
|
|
||||||
auto cubeVS = shaderModuleLibrary.GetShaderModule("TestCubeVs.glsl");
|
auto cubeVS = shaderModuleLibrary.GetBuiltInShaderModule("TestCube_VS");
|
||||||
auto cubeFS = shaderModuleLibrary.GetShaderModule("TestCubeFs.glsl");
|
auto cubeFS = shaderModuleLibrary.GetBuiltInShaderModule("TestCube_FS");
|
||||||
|
|
||||||
defaultMaterial = AddMaterial(cubeVS, cubeFS, gBufferSubpass);
|
defaultMaterial = AddMaterial(cubeVS, cubeFS, gBufferSubpass);
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
#include "ECS_Base/System/SHSystemRoutine.h"
|
#include "ECS_Base/System/SHSystemRoutine.h"
|
||||||
#include "Graphics/Descriptors/SHVkDescriptorPool.h"
|
#include "Graphics/Descriptors/SHVkDescriptorPool.h"
|
||||||
#include "Graphics/RenderGraph/SHRenderGraph.h"
|
#include "Graphics/RenderGraph/SHRenderGraph.h"
|
||||||
#include "Graphics/MiddleEnd/Shaders/SHShaderSourceLibrary.h"
|
|
||||||
#include "Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h"
|
#include "Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h"
|
||||||
#include "SHMeshLibrary.h"
|
#include "SHMeshLibrary.h"
|
||||||
#include "Graphics/MiddleEnd/Materials/SHMaterialInstanceCache.h"
|
#include "Graphics/MiddleEnd/Materials/SHMaterialInstanceCache.h"
|
||||||
|
@ -339,9 +338,7 @@ namespace SHADE
|
||||||
// Temp Cameras
|
// Temp Cameras
|
||||||
Handle<SHCamera> worldCamera;
|
Handle<SHCamera> worldCamera;
|
||||||
Handle<SHCamera> screenCamera;
|
Handle<SHCamera> screenCamera;
|
||||||
|
|
||||||
// TODO: Temporary only until resource library from Xiao Qi is implemented
|
|
||||||
SHShaderSourceLibrary shaderSourceLibrary;
|
|
||||||
SHShaderModuleLibrary shaderModuleLibrary;
|
SHShaderModuleLibrary shaderModuleLibrary;
|
||||||
|
|
||||||
// Temp Materials
|
// Temp Materials
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "SHPch.h"
|
#include "SHPch.h"
|
||||||
#include "SHShaderModuleLibrary.h"
|
#include "SHShaderModuleLibrary.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
|
#include "Assets/SHAssetManager.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -18,33 +19,33 @@ namespace SHADE
|
||||||
|
|
||||||
*/
|
*/
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
void SHShaderModuleLibrary::ImportFromSourceLibrary(Handle<SHVkLogicalDevice>& logicalDeviceHdl, SHShaderSourceLibrary const& sourceLib) noexcept
|
//void SHShaderModuleLibrary::ImportFromSourceLibrary(Handle<SHVkLogicalDevice>& logicalDeviceHdl, SHShaderSourceLibrary const& sourceLib) noexcept
|
||||||
{
|
//{
|
||||||
auto const& sources = sourceLib.GetSourceLibrary();
|
// auto const& sources = sourceLib.GetSourceLibrary();
|
||||||
for (auto const& source : sources)
|
// for (auto const& source : sources)
|
||||||
{
|
// {
|
||||||
vk::ShaderStageFlagBits shaderType{};
|
// vk::ShaderStageFlagBits shaderType{};
|
||||||
switch (source.shaderType)
|
// switch (source.shaderType)
|
||||||
{
|
// {
|
||||||
case SH_SHADER_TYPE::VERTEX:
|
// case SH_SHADER_TYPE::VERTEX:
|
||||||
shaderType = vk::ShaderStageFlagBits::eVertex;
|
// shaderType = vk::ShaderStageFlagBits::eVertex;
|
||||||
break;
|
// break;
|
||||||
case SH_SHADER_TYPE::FRAGMENT:
|
// case SH_SHADER_TYPE::FRAGMENT:
|
||||||
shaderType = vk::ShaderStageFlagBits::eFragment;
|
// shaderType = vk::ShaderStageFlagBits::eFragment;
|
||||||
break;
|
// break;
|
||||||
case SH_SHADER_TYPE::COMPUTE:
|
// case SH_SHADER_TYPE::COMPUTE:
|
||||||
shaderType = vk::ShaderStageFlagBits::eCompute;
|
// shaderType = vk::ShaderStageFlagBits::eCompute;
|
||||||
break;
|
// break;
|
||||||
default:
|
// default:
|
||||||
shaderType = vk::ShaderStageFlagBits::eVertex;
|
// shaderType = vk::ShaderStageFlagBits::eVertex;
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
|
|
||||||
Handle<SHVkShaderModule> newShaderModule = logicalDeviceHdl->CreateShaderModule(source.spirvBinary, "main", shaderType, source.name);
|
// Handle<SHVkShaderModule> newShaderModule = logicalDeviceHdl->CreateShaderModule(source.spirvBinary, "main", shaderType, source.name);
|
||||||
shaderModules.emplace(source.id, newShaderModule);
|
// shaderModules.emplace(source.id, newShaderModule);
|
||||||
stringToID.emplace(source.name, source.id);
|
// stringToID.emplace(source.name, source.id);
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
|
@ -58,12 +59,81 @@ namespace SHADE
|
||||||
|
|
||||||
*/
|
*/
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
Handle<SHVkShaderModule> SHShaderModuleLibrary::GetShaderModule(std::string shaderName) const noexcept
|
//Handle<SHVkShaderModule> SHShaderModuleLibrary::GetShaderModule(std::string shaderName) const noexcept
|
||||||
|
//{
|
||||||
|
// if (stringToID.contains(shaderName))
|
||||||
|
// return shaderModules.at(stringToID.at(shaderName));
|
||||||
|
// else
|
||||||
|
// return {};
|
||||||
|
//}
|
||||||
|
|
||||||
|
vk::ShaderStageFlagBits SHShaderModuleLibrary::GetVkShaderFlag(SH_SHADER_TYPE type) noexcept
|
||||||
{
|
{
|
||||||
if (stringToID.contains(shaderName))
|
vk::ShaderStageFlagBits shaderType{};
|
||||||
return shaderModules.at(stringToID.at(shaderName));
|
switch (type)
|
||||||
else
|
{
|
||||||
return {};
|
case SH_SHADER_TYPE::VERTEX:
|
||||||
|
shaderType = vk::ShaderStageFlagBits::eVertex;
|
||||||
|
break;
|
||||||
|
case SH_SHADER_TYPE::FRAGMENT:
|
||||||
|
shaderType = vk::ShaderStageFlagBits::eFragment;
|
||||||
|
break;
|
||||||
|
case SH_SHADER_TYPE::COMPUTE:
|
||||||
|
shaderType = vk::ShaderStageFlagBits::eCompute;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
shaderType = vk::ShaderStageFlagBits::eVertex;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return shaderType;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
Handle<SHVkShaderModule> SHShaderModuleLibrary::GetBuiltInShaderModule(std::string shaderName) const noexcept
|
||||||
|
{
|
||||||
|
if (builtInShaderModules.contains(shaderName))
|
||||||
|
return builtInShaderModules.at(shaderName);
|
||||||
|
else
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHShaderModuleLibrary::ImportAllShaderSource(Handle<SHVkLogicalDevice>& logicalDeviceHdl) noexcept
|
||||||
|
{
|
||||||
|
uint32_t idCounter{ 0 };
|
||||||
|
|
||||||
|
auto const data = SHAssetManager::GetAllDataOfType(AssetType::SHADER);
|
||||||
|
for (auto const& dataPtr : data)
|
||||||
|
{
|
||||||
|
auto const shader = dynamic_cast<SHShaderAsset const*>(dataPtr);
|
||||||
|
|
||||||
|
Handle<SHVkShaderModule> newShaderModule =
|
||||||
|
logicalDeviceHdl->CreateShaderModule(shader->spirvBinary, "main", GetVkShaderFlag(shader->shaderType), shader->name);
|
||||||
|
|
||||||
|
shaderModules.emplace(idCounter++, newShaderModule);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto const builtIn = SHAssetManager::GetAllDataOfType(AssetType::SHADER_BUILT_IN);
|
||||||
|
for (auto const& dataPtr : builtIn)
|
||||||
|
{
|
||||||
|
auto const shader = dynamic_cast<SHShaderAsset const*>(dataPtr);
|
||||||
|
|
||||||
|
Handle<SHVkShaderModule> newShaderModule =
|
||||||
|
logicalDeviceHdl->CreateShaderModule(shader->spirvBinary, "main", GetVkShaderFlag(shader->shaderType), shader->name);
|
||||||
|
|
||||||
|
builtInShaderModules.emplace(shader->name, newShaderModule);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHShaderModuleLibrary::ReflectAllShaderModules() noexcept
|
||||||
|
{
|
||||||
|
for (auto& module : shaderModules)
|
||||||
|
{
|
||||||
|
module.second->Reflect();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& module : builtInShaderModules)
|
||||||
|
{
|
||||||
|
module.second->Reflect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -2,8 +2,7 @@
|
||||||
#define SH_SHADER_MODULE_LIBRARY_H
|
#define SH_SHADER_MODULE_LIBRARY_H
|
||||||
|
|
||||||
#include "Graphics/Shaders/SHVkShaderModule.h"
|
#include "Graphics/Shaders/SHVkShaderModule.h"
|
||||||
#include "SHShaderSourceLibrary.h"
|
#include "Assets/Asset Types/SHShaderAsset.h"
|
||||||
#include <map>
|
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -22,20 +21,23 @@ namespace SHADE
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
//! Stored shader modules
|
//! Stored shader modules
|
||||||
std::unordered_map<uint32_t, Handle<SHVkShaderModule>> shaderModules;
|
std::unordered_map<uint32_t, Handle<SHVkShaderModule>> shaderModules;
|
||||||
|
std::unordered_map<std::string, Handle<SHVkShaderModule>> builtInShaderModules;
|
||||||
|
|
||||||
//! We want some sort of interface with strings, instead of ints
|
inline vk::ShaderStageFlagBits GetVkShaderFlag(SH_SHADER_TYPE type) noexcept;
|
||||||
std::map<std::string, uint32_t> stringToID;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* PUBLIC MEMBER FUNCTIONS */
|
/* PUBLIC MEMBER FUNCTIONS */
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
void ImportFromSourceLibrary(Handle<SHVkLogicalDevice>& logicalDeviceHdl, SHShaderSourceLibrary const& sourceLib) noexcept;
|
//void ImportFromSourceLibrary(Handle<SHVkLogicalDevice>& logicalDeviceHdl, SHShaderSourceLibrary const& sourceLib) noexcept;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* SETTERS AND GETTERS */
|
/* SETTERS AND GETTERS */
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
Handle<SHVkShaderModule> GetShaderModule(std::string shaderName) const noexcept;
|
Handle<SHVkShaderModule> GetBuiltInShaderModule(std::string shaderName) const noexcept;
|
||||||
|
|
||||||
|
void ImportAllShaderSource(Handle<SHVkLogicalDevice>& logicalDeviceHdl) noexcept;
|
||||||
|
void ReflectAllShaderModules() noexcept;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,308 +0,0 @@
|
||||||
#include "SHPch.h"
|
|
||||||
#include <filesystem>
|
|
||||||
#include <fstream>
|
|
||||||
#include "SHShaderSourceLibrary.h"
|
|
||||||
#include "Tools/SHLogger.h"
|
|
||||||
|
|
||||||
namespace SHADE
|
|
||||||
{
|
|
||||||
/***************************************************************************/
|
|
||||||
/*!
|
|
||||||
|
|
||||||
\brief
|
|
||||||
Initializes the directory to take assets from. TODO: Only temporary until
|
|
||||||
the resource manager is implemented.
|
|
||||||
|
|
||||||
\param directory
|
|
||||||
|
|
||||||
\return
|
|
||||||
|
|
||||||
*/
|
|
||||||
/***************************************************************************/
|
|
||||||
void SHShaderSourceLibrary::Init (std::string directory) noexcept
|
|
||||||
{
|
|
||||||
shaderDirectory = directory;
|
|
||||||
if (shaderDirectory.back() != '/')
|
|
||||||
{
|
|
||||||
shaderDirectory += '/';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/***************************************************************************/
|
|
||||||
/*!
|
|
||||||
|
|
||||||
\brief
|
|
||||||
Private member function to compile a shader STRING source to binary and
|
|
||||||
returns a vector of 4 bytes.
|
|
||||||
|
|
||||||
\param glslSource
|
|
||||||
The GLSL string source.
|
|
||||||
|
|
||||||
\param type
|
|
||||||
Type of the shader: vertex, fragment, compute, etc.
|
|
||||||
|
|
||||||
\param opLevel
|
|
||||||
Optimization level.
|
|
||||||
|
|
||||||
\return
|
|
||||||
Returns a vector of the binary data.
|
|
||||||
|
|
||||||
*/
|
|
||||||
/***************************************************************************/
|
|
||||||
std::vector<uint32_t> SHShaderSourceLibrary::CompileToBinary(std::string const& glslSource, char const* const spirvFilename, SH_SHADER_TYPE type, shaderc_optimization_level opLevel /*= shaderc_optimization_level_zero*/)
|
|
||||||
{
|
|
||||||
// shaderc compiler
|
|
||||||
shaderc::Compiler compiler;
|
|
||||||
shaderc::CompileOptions options;
|
|
||||||
|
|
||||||
options.AddMacroDefinition("MY_DEFINE", "1");
|
|
||||||
|
|
||||||
// Set optimization levels
|
|
||||||
if (opLevel != shaderc_optimization_level_zero)
|
|
||||||
options.SetOptimizationLevel(opLevel);
|
|
||||||
|
|
||||||
// Attempt to get the shaderc equivalent shader stage
|
|
||||||
shaderc_shader_kind shaderKind;
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case SH_SHADER_TYPE::VERTEX:
|
|
||||||
shaderKind = shaderc_shader_kind::shaderc_glsl_vertex_shader;
|
|
||||||
break;
|
|
||||||
case SH_SHADER_TYPE::FRAGMENT:
|
|
||||||
shaderKind = shaderc_shader_kind::shaderc_glsl_fragment_shader;
|
|
||||||
break;
|
|
||||||
case SH_SHADER_TYPE::COMPUTE:
|
|
||||||
shaderKind = shaderc_shader_kind::shaderc_glsl_compute_shader;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
shaderKind = shaderc_shader_kind::shaderc_glsl_vertex_shader;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compile the shader and get the result
|
|
||||||
shaderc::SpvCompilationResult compileResult = compiler.CompileGlslToSpv(glslSource, shaderKind, spirvFilename, options);
|
|
||||||
|
|
||||||
if (compileResult.GetCompilationStatus() != shaderc_compilation_status_success)
|
|
||||||
{
|
|
||||||
SHLOG_ERROR("Shaderc failed to compile GLSL shader to binary | " + compileResult.GetErrorMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
return { compileResult.begin(), compileResult.end() };
|
|
||||||
}
|
|
||||||
|
|
||||||
/***************************************************************************/
|
|
||||||
/*!
|
|
||||||
|
|
||||||
\brief
|
|
||||||
TODO: Delete after file IO is implemented. Loads a shader from disk.
|
|
||||||
|
|
||||||
\param filePath
|
|
||||||
file path to the shader in the asset directory.
|
|
||||||
|
|
||||||
\return
|
|
||||||
Returns the data in the file in string form.
|
|
||||||
|
|
||||||
*/
|
|
||||||
/***************************************************************************/
|
|
||||||
std::string SHShaderSourceLibrary::GetStringFromFile(char const* filePath) noexcept
|
|
||||||
{
|
|
||||||
// Retrieve contents from filePath
|
|
||||||
// Ensure ifstream objects can throw exceptions
|
|
||||||
std::ifstream iFile;
|
|
||||||
iFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
|
||||||
std::string fileContent = "";
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Open file
|
|
||||||
// Read file's buffer contents into streams
|
|
||||||
iFile.open(filePath);
|
|
||||||
std::stringstream fileStream;
|
|
||||||
fileStream << iFile.rdbuf();
|
|
||||||
|
|
||||||
fileContent = fileStream.str();
|
|
||||||
|
|
||||||
// Close file handler
|
|
||||||
iFile.close();
|
|
||||||
}
|
|
||||||
catch (std::ifstream::failure e)
|
|
||||||
{
|
|
||||||
std::cerr << "File was not successfully read" << filePath << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
return fileContent;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/***************************************************************************/
|
|
||||||
/*!
|
|
||||||
|
|
||||||
\brief
|
|
||||||
Load a shader into the library.
|
|
||||||
|
|
||||||
\param filePath
|
|
||||||
file path to the shader in the asset directory.
|
|
||||||
|
|
||||||
*/
|
|
||||||
/***************************************************************************/
|
|
||||||
bool SHShaderSourceLibrary::LoadShader (uint32_t id, std::string glslFile, SH_SHADER_TYPE type, bool checkSpirvOutdated/* = true*/, bool recompileAnyway /*= false*/) noexcept
|
|
||||||
{
|
|
||||||
//if (sourceLibrary.contains(id))
|
|
||||||
//{
|
|
||||||
// SHLOG_ERROR("Shader with ID passed in already exists. Use a different ID");
|
|
||||||
// return false;
|
|
||||||
//}
|
|
||||||
|
|
||||||
std::string fullGLSLPath = shaderDirectory + glslFile;
|
|
||||||
auto path = std::filesystem::path(fullGLSLPath);
|
|
||||||
|
|
||||||
if (path.extension() != ".glsl")
|
|
||||||
{
|
|
||||||
SHLOG_ERROR("Shader is not GLSL file, failed to load shader. ");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string spirvFilepath = path.replace_extension("spv").string();
|
|
||||||
|
|
||||||
SHShaderData newShaderData{};
|
|
||||||
newShaderData.shaderType = type;
|
|
||||||
|
|
||||||
// spirv file
|
|
||||||
std::ifstream spirvFile(spirvFilepath, std::ios::ate | std::ios::binary);
|
|
||||||
|
|
||||||
// If we disable spirv validation, file is not checked
|
|
||||||
if (!recompileAnyway &&
|
|
||||||
spirvFile.is_open() &&
|
|
||||||
(checkSpirvOutdated ? (std::filesystem::last_write_time(spirvFilepath) > std::filesystem::last_write_time(fullGLSLPath)) : true))
|
|
||||||
{
|
|
||||||
// Get file size of binary
|
|
||||||
uint32_t fileSize = static_cast<uint32_t>(spirvFile.tellg());
|
|
||||||
|
|
||||||
// resize container to store binary
|
|
||||||
newShaderData.spirvBinary.resize(fileSize / sizeof(uint32_t));
|
|
||||||
|
|
||||||
// Read data from binary file to container
|
|
||||||
spirvFile.seekg(0);
|
|
||||||
spirvFile.read(reinterpret_cast<char*>(newShaderData.spirvBinary.data()), fileSize);
|
|
||||||
|
|
||||||
// close file
|
|
||||||
spirvFile.close();
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Use glslc to generate spirv file
|
|
||||||
newShaderData.spirvBinary = CompileToBinary(GetStringFromFile(fullGLSLPath.c_str()), spirvFilepath.c_str(), type);
|
|
||||||
|
|
||||||
std::ofstream binaryFile(spirvFilepath, std::ios::binary);
|
|
||||||
|
|
||||||
if (binaryFile.is_open())
|
|
||||||
{
|
|
||||||
// write all data to binary file
|
|
||||||
binaryFile.write(reinterpret_cast<const char*>(newShaderData.spirvBinary.data()), newShaderData.spirvBinary.size() * sizeof(uint32_t));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SHLOG_ERROR("Failed to modify spirv file. ");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
newShaderData.name = glslFile;
|
|
||||||
newShaderData.id = id;
|
|
||||||
|
|
||||||
sourceLibrary.emplace_back(std::move (newShaderData));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***************************************************************************/
|
|
||||||
/*!
|
|
||||||
|
|
||||||
\brief
|
|
||||||
Gets the entire source library.
|
|
||||||
|
|
||||||
\return
|
|
||||||
The container of binary data.
|
|
||||||
|
|
||||||
*/
|
|
||||||
/***************************************************************************/
|
|
||||||
std::vector<SHShaderData> const& SHShaderSourceLibrary::GetSourceLibrary(void) const noexcept
|
|
||||||
{
|
|
||||||
return sourceLibrary;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***************************************************************************/
|
|
||||||
/*!
|
|
||||||
|
|
||||||
\brief
|
|
||||||
Move ctor for shader data.
|
|
||||||
|
|
||||||
\param rhs
|
|
||||||
The other shader data
|
|
||||||
|
|
||||||
*/
|
|
||||||
/***************************************************************************/
|
|
||||||
SHShaderData::SHShaderData(SHShaderData&& rhs) noexcept
|
|
||||||
: spirvBinary{ std::move (rhs.spirvBinary)}
|
|
||||||
, shaderType{std::move (rhs.shaderType)}
|
|
||||||
, name{ std::move (rhs.name)}
|
|
||||||
, id {std::move (rhs.id)}
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/***************************************************************************/
|
|
||||||
/*!
|
|
||||||
|
|
||||||
\brief
|
|
||||||
Default ctor for shader data. Does nothing.
|
|
||||||
|
|
||||||
*/
|
|
||||||
/***************************************************************************/
|
|
||||||
SHShaderData::SHShaderData(void) noexcept
|
|
||||||
: spirvBinary{}
|
|
||||||
, shaderType{SH_SHADER_TYPE::VERTEX}
|
|
||||||
, name{ }
|
|
||||||
, id{ }
|
|
||||||
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
SHShaderData::SHShaderData(SHShaderData const& rhs) noexcept
|
|
||||||
: spirvBinary{rhs.spirvBinary}
|
|
||||||
, shaderType{ rhs.shaderType}
|
|
||||||
, name{rhs.name }
|
|
||||||
, id{rhs.id }
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
SHShaderData& SHShaderData::operator=(SHShaderData const& rhs) noexcept
|
|
||||||
{
|
|
||||||
if (this == &rhs)
|
|
||||||
return *this;
|
|
||||||
|
|
||||||
spirvBinary = rhs.spirvBinary;
|
|
||||||
shaderType = rhs.shaderType;
|
|
||||||
name = rhs.name;
|
|
||||||
id = rhs.id;
|
|
||||||
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
SHShaderData& SHShaderData::operator=(SHShaderData&& rhs) noexcept
|
|
||||||
{
|
|
||||||
if (this == &rhs)
|
|
||||||
return *this;
|
|
||||||
|
|
||||||
spirvBinary = std::move(rhs.spirvBinary);
|
|
||||||
shaderType = std::move (rhs.shaderType);
|
|
||||||
name = std::move (rhs.name);
|
|
||||||
id = std::move (rhs.id);
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,70 +0,0 @@
|
||||||
#ifndef SH_SHADER_SOURCE_LIBRARY_H
|
|
||||||
#define SH_SHADER_SOURCE_LIBRARY_H
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include "SHShaderType.h"
|
|
||||||
#include "shaderc/shaderc.hpp"
|
|
||||||
|
|
||||||
namespace SHADE
|
|
||||||
{
|
|
||||||
struct SHShaderData
|
|
||||||
{
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
/* MEMBER VARIABLES */
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
//! container storing the spirv binary
|
|
||||||
std::vector<uint32_t> spirvBinary;
|
|
||||||
|
|
||||||
//! For the compilation of the shader. Vulkan backend will use it too
|
|
||||||
SH_SHADER_TYPE shaderType;
|
|
||||||
|
|
||||||
//! Name of the shader file (without parent path)
|
|
||||||
std::string name;
|
|
||||||
|
|
||||||
//! id of the shader
|
|
||||||
uint32_t id;
|
|
||||||
|
|
||||||
SHShaderData(void) noexcept;
|
|
||||||
SHShaderData(SHShaderData const& rhs) noexcept;
|
|
||||||
SHShaderData(SHShaderData&& rhs) noexcept;
|
|
||||||
SHShaderData& operator= (SHShaderData&& rhs) noexcept;
|
|
||||||
SHShaderData& operator= (SHShaderData const& rhs) noexcept;
|
|
||||||
};
|
|
||||||
|
|
||||||
// TODO: This class is purely temporary and will be converted/changed when XQ implements his resource manager
|
|
||||||
class SHShaderSourceLibrary
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
/* PRIVATE MEMBER VARIABLES */
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
//! Stores all the source data. Take note that the source here is GLSL source and NOT binary data.
|
|
||||||
//! Binary data gets passed to the backend to convert to spirv.
|
|
||||||
std::vector<SHShaderData> sourceLibrary;
|
|
||||||
|
|
||||||
//! The directory where the shaders are located.
|
|
||||||
std::string shaderDirectory;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
/* PRIVATE MEMBER FUNCTIONS */
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
std::vector<uint32_t> CompileToBinary(std::string const& glslSource, char const* const spirvFilename, SH_SHADER_TYPE type, shaderc_optimization_level opLevel = shaderc_optimization_level_zero);
|
|
||||||
|
|
||||||
// TODO: Delete after file IO is implemented
|
|
||||||
std::string GetStringFromFile(char const* filePath) noexcept;
|
|
||||||
|
|
||||||
public:
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
/* PUBLIC MEMBER FUNCTIONS */
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
void Init (std::string directory) noexcept;
|
|
||||||
bool LoadShader (uint32_t id, std::string glslFile, SH_SHADER_TYPE type, bool checkSpirvOutdated = true, bool recompileAnyway = false) noexcept;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
/* SETTERS AND GETTERS */
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
std::vector<SHShaderData> const& GetSourceLibrary(void) const noexcept;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,14 +0,0 @@
|
||||||
#ifndef SH_SHADER_TYPE_H
|
|
||||||
#define SH_SHADER_TYPE_H
|
|
||||||
|
|
||||||
namespace SHADE
|
|
||||||
{
|
|
||||||
enum class SH_SHADER_TYPE
|
|
||||||
{
|
|
||||||
VERTEX,
|
|
||||||
FRAGMENT,
|
|
||||||
COMPUTE
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,11 +0,0 @@
|
||||||
#define SET_STATIC_GLOBALS 0
|
|
||||||
#define SET_DYNAMIC_GLOBALS 1
|
|
||||||
#define SET_HIGH_FREQUENCY_GLOBALS 2
|
|
||||||
|
|
||||||
#define BINDING_GENERIC_DATA 0
|
|
||||||
#define BINDING_IMAGE_AND_SAMPLERS_DATA 1
|
|
||||||
#define BINDING_LIGHTS_DATA 0
|
|
||||||
#define BINDING_CAMERA_DATA 0
|
|
||||||
#define BINDING_BATCHED_PER_INST_DATA 0
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue