Commit 6fb4609c authored by Jonathan Kunstwald's avatar Jonathan Kunstwald

Fix importer indentation

parent 74d2d2e9
......@@ -24,16 +24,16 @@ glow::assimp::Importer::Importer() {}
glow::SharedVertexArray glow::assimp::Importer::load(const std::string& filename)
{
GLOW_ACTION();
GLOW_ACTION();
using namespace assimp;
using namespace assimp;
if (!std::ifstream(filename).good())
{
error() << "Error loading `" << filename << "' with Assimp.";
error() << " File not found/not readable";
return nullptr;
}
if (!std::ifstream(filename).good())
{
error() << "Error loading `" << filename << "' with Assimp.";
error() << " File not found/not readable";
return nullptr;
}
uint32_t flags = aiProcess_SortByPType;
......@@ -47,187 +47,187 @@ glow::SharedVertexArray glow::assimp::Importer::load(const std::string& filename
flags |= aiProcess_GenUVCoords;
if (mPreTransformVertices)
flags |= aiProcess_PreTransformVertices;
if (mFlipUVCoords)
flags |= aiProcess_FlipUVs;
if (mFlipUVCoords)
flags |= aiProcess_FlipUVs;
return LoadAndCreateMesh(filename, flags);
return LoadAndCreateMesh(filename, flags);
}
glow::SharedVertexArray glow::assimp::Importer::LoadAndCreateMesh(std::string const & filename, uint32_t flags)
{
MeshData data = LoadData(filename, flags);
return CreateMeshFromData(data);
MeshData data = LoadData(filename, flags);
return CreateMeshFromData(data);
}
glow::SharedVertexArray glow::assimp::Importer::CreateMeshFromData(const MeshData & data)
{
std::vector<SharedArrayBuffer> abs;
if (!data.positions.empty())
{
auto ab = ArrayBuffer::create();
ab->defineAttribute<glm::vec3>("aPosition");
ab->bind().setData(data.positions);
abs.push_back(ab);
}
if (!data.normals.empty())
{
auto ab = ArrayBuffer::create();
ab->defineAttribute<glm::vec3>("aNormal");
ab->bind().setData(data.normals);
abs.push_back(ab);
}
if (!data.tangents.empty())
{
auto ab = ArrayBuffer::create();
ab->defineAttribute<glm::vec3>("aTangent");
ab->bind().setData(data.tangents);
abs.push_back(ab);
}
for (auto i = 0u; i < data.colors.size(); ++i)
{
auto ab = ArrayBuffer::create();
if (i == 0)
ab->defineAttribute<glm::vec4>("aColor");
else
ab->defineAttribute<glm::vec4>("aColor" + std::to_string(i + 1));
ab->bind().setData(data.colors[i]);
abs.push_back(ab);
}
for (auto i = 0u; i < data.texCoords.size(); ++i)
{
auto ab = ArrayBuffer::create();
if (i == 0)
ab->defineAttribute<glm::vec2>("aTexCoord");
else
ab->defineAttribute<glm::vec2>("aTexCoord" + std::to_string(i + 1));
ab->bind().setData(data.texCoords[i]);
abs.push_back(ab);
}
for (auto const& ab : abs)
ab->setObjectLabel(ab->getAttributes()[0].name + " of " + data.filename);
auto eab = ElementArrayBuffer::create(data.indices);
eab->setObjectLabel(data.filename);
auto va = VertexArray::create(abs, eab, GL_TRIANGLES);
va->setObjectLabel(data.filename);
return va;
std::vector<SharedArrayBuffer> abs;
if (!data.positions.empty())
{
auto ab = ArrayBuffer::create();
ab->defineAttribute<glm::vec3>("aPosition");
ab->bind().setData(data.positions);
abs.push_back(ab);
}
if (!data.normals.empty())
{
auto ab = ArrayBuffer::create();
ab->defineAttribute<glm::vec3>("aNormal");
ab->bind().setData(data.normals);
abs.push_back(ab);
}
if (!data.tangents.empty())
{
auto ab = ArrayBuffer::create();
ab->defineAttribute<glm::vec3>("aTangent");
ab->bind().setData(data.tangents);
abs.push_back(ab);
}
for (auto i = 0u; i < data.colors.size(); ++i)
{
auto ab = ArrayBuffer::create();
if (i == 0)
ab->defineAttribute<glm::vec4>("aColor");
else
ab->defineAttribute<glm::vec4>("aColor" + std::to_string(i + 1));
ab->bind().setData(data.colors[i]);
abs.push_back(ab);
}
for (auto i = 0u; i < data.texCoords.size(); ++i)
{
auto ab = ArrayBuffer::create();
if (i == 0)
ab->defineAttribute<glm::vec2>("aTexCoord");
else
ab->defineAttribute<glm::vec2>("aTexCoord" + std::to_string(i + 1));
ab->bind().setData(data.texCoords[i]);
abs.push_back(ab);
}
for (auto const& ab : abs)
ab->setObjectLabel(ab->getAttributes()[0].name + " of " + data.filename);
auto eab = ElementArrayBuffer::create(data.indices);
eab->setObjectLabel(data.filename);
auto va = VertexArray::create(abs, eab, GL_TRIANGLES);
va->setObjectLabel(data.filename);
return va;
}
glow::assimp::Importer::MeshData glow::assimp::Importer::loadDataCustom(std::string const & filename)
{
uint32_t flags = aiProcess_SortByPType;
if (mTriangulate)
flags |= aiProcess_Triangulate;
if (mCalculateTangents)
flags |= aiProcess_CalcTangentSpace;
if (mGenerateSmoothNormal)
flags |= aiProcess_GenSmoothNormals;
if (mGenerateUVCoords)
flags |= aiProcess_GenUVCoords;
if (mPreTransformVertices)
flags |= aiProcess_PreTransformVertices;
if (mFlipUVCoords)
flags |= aiProcess_FlipUVs;
return LoadData(filename, flags);
uint32_t flags = aiProcess_SortByPType;
if (mTriangulate)
flags |= aiProcess_Triangulate;
if (mCalculateTangents)
flags |= aiProcess_CalcTangentSpace;
if (mGenerateSmoothNormal)
flags |= aiProcess_GenSmoothNormals;
if (mGenerateUVCoords)
flags |= aiProcess_GenUVCoords;
if (mPreTransformVertices)
flags |= aiProcess_PreTransformVertices;
if (mFlipUVCoords)
flags |= aiProcess_FlipUVs;
return LoadData(filename, flags);
}
glow::assimp::Importer::MeshData glow::assimp::Importer::LoadData(std::string const & filename, uint32_t flags)
{
MeshData data;
GLOW_ACTION();
using namespace assimp;
if (!std::ifstream(filename).good())
{
error() << "Error loading `" << filename << "' with Assimp.";
error() << " File not found/not readable";
return data;
}
Assimp::Importer importer;
auto scene = importer.ReadFile(filename, flags);
if (!scene)
{
error() << "Error loading `" << filename << "' with Assimp.";
error() << " " << importer.GetErrorString();
return data;
}
if (!scene->HasMeshes())
{
error() << "File `" << filename << "' has no meshes.";
return data;
}
auto baseIdx = 0u;
for (auto i = 0u; i < scene->mNumMeshes; ++i)
{
auto const& mesh = scene->mMeshes[i];
auto colorsCnt = mesh->GetNumColorChannels();
auto texCoordsCnt = mesh->GetNumUVChannels();
if (data.texCoords.empty())
data.texCoords.resize(texCoordsCnt);
else if (data.texCoords.size() != texCoordsCnt)
{
error() << "File `" << filename << "':";
error() << " contains inconsistent texture coordinate counts";
return data;
}
if (data.colors.empty())
data.colors.resize(colorsCnt);
else if (data.colors.size() != colorsCnt)
{
error() << "File `" << filename << "':";
error() << " contains inconsistent vertex color counts";
return data;
}
// add faces
auto fCnt = mesh->mNumFaces;
for (auto f = 0u; f < fCnt; ++f)
{
auto const& face = mesh->mFaces[f];
if (face.mNumIndices != 3)
{
error() << "File `" << filename << "':.";
error() << " non-3 faces not implemented/supported";
return data;
}
for (auto fi = 0u; fi < face.mNumIndices; ++fi)
{
data.indices.push_back(baseIdx + face.mIndices[fi]);
}
}
// add vertices
auto vCnt = mesh->mNumVertices;
for (auto v = 0u; v < vCnt; ++v)
{
data.positions.push_back(aiCast(mesh->mVertices[v]));
if (mesh->HasNormals())
data.normals.push_back(aiCast(mesh->mNormals[v]));
if (mesh->HasTangentsAndBitangents())
data.tangents.push_back(aiCast(mesh->mTangents[v]));
for (auto t = 0u; t < texCoordsCnt; ++t)
data.texCoords[t].push_back((glm::vec2)aiCast(mesh->mTextureCoords[t][v]));
for (auto t = 0u; t < colorsCnt; ++t)
data.colors[t].push_back(aiCast(mesh->mColors[t][v]));
}
baseIdx = data.positions.size();
}
data.filename = filename;
return data;
MeshData data;
GLOW_ACTION();
using namespace assimp;
if (!std::ifstream(filename).good())
{
error() << "Error loading `" << filename << "' with Assimp.";
error() << " File not found/not readable";
return data;
}
Assimp::Importer importer;
auto scene = importer.ReadFile(filename, flags);
if (!scene)
{
error() << "Error loading `" << filename << "' with Assimp.";
error() << " " << importer.GetErrorString();
return data;
}
if (!scene->HasMeshes())
{
error() << "File `" << filename << "' has no meshes.";
return data;
}
auto baseIdx = 0u;
for (auto i = 0u; i < scene->mNumMeshes; ++i)
{
auto const& mesh = scene->mMeshes[i];
auto colorsCnt = mesh->GetNumColorChannels();
auto texCoordsCnt = mesh->GetNumUVChannels();
if (data.texCoords.empty())
data.texCoords.resize(texCoordsCnt);
else if (data.texCoords.size() != texCoordsCnt)
{
error() << "File `" << filename << "':";
error() << " contains inconsistent texture coordinate counts";
return data;
}
if (data.colors.empty())
data.colors.resize(colorsCnt);
else if (data.colors.size() != colorsCnt)
{
error() << "File `" << filename << "':";
error() << " contains inconsistent vertex color counts";
return data;
}
// add faces
auto fCnt = mesh->mNumFaces;
for (auto f = 0u; f < fCnt; ++f)
{
auto const& face = mesh->mFaces[f];
if (face.mNumIndices != 3)
{
error() << "File `" << filename << "':.";
error() << " non-3 faces not implemented/supported";
return data;
}
for (auto fi = 0u; fi < face.mNumIndices; ++fi)
{
data.indices.push_back(baseIdx + face.mIndices[fi]);
}
}
// add vertices
auto vCnt = mesh->mNumVertices;
for (auto v = 0u; v < vCnt; ++v)
{
data.positions.push_back(aiCast(mesh->mVertices[v]));
if (mesh->HasNormals())
data.normals.push_back(aiCast(mesh->mNormals[v]));
if (mesh->HasTangentsAndBitangents())
data.tangents.push_back(aiCast(mesh->mTangents[v]));
for (auto t = 0u; t < texCoordsCnt; ++t)
data.texCoords[t].push_back((glm::vec2)aiCast(mesh->mTextureCoords[t][v]));
for (auto t = 0u; t < colorsCnt; ++t)
data.colors[t].push_back(aiCast(mesh->mColors[t][v]));
}
baseIdx = data.positions.size();
}
data.filename = filename;
return data;
}
......@@ -18,12 +18,12 @@ namespace assimp
{
constexpr uint32_t importDefaultFlags =
aiProcess_SortByPType |
aiProcess_Triangulate |
aiProcess_CalcTangentSpace |
aiProcess_GenSmoothNormals |
aiProcess_GenUVCoords |
aiProcess_PreTransformVertices;
aiProcess_SortByPType |
aiProcess_Triangulate |
aiProcess_CalcTangentSpace |
aiProcess_GenSmoothNormals |
aiProcess_GenUVCoords |
aiProcess_PreTransformVertices;
constexpr uint32_t importFlipUVFlags = importDefaultFlags | aiProcess_FlipUVs;
......@@ -66,7 +66,7 @@ private: // settings
/// vec2 aTexCoord is available (hopefully)
bool mGenerateUVCoords = true;
bool mFlipUVCoords = false;
bool mFlipUVCoords = false;
public:
GLOW_PROPERTY(CalculateTangents);
......@@ -78,91 +78,91 @@ public:
public:
struct MeshData
{
std::vector<glm::vec3> positions;
std::vector<glm::vec3> normals;
std::vector<glm::vec3> tangents;
std::vector<std::vector<glm::vec2>> texCoords;
std::vector<std::vector<glm::vec4>> colors;
std::vector<uint32_t> indices;
std::string filename;
};
struct MeshData
{
std::vector<glm::vec3> positions;
std::vector<glm::vec3> normals;
std::vector<glm::vec3> tangents;
std::vector<std::vector<glm::vec2>> texCoords;
std::vector<std::vector<glm::vec4>> colors;
std::vector<uint32_t> indices;
std::string filename;
};
Importer();
/// Importer instance version of LoadAndCreateMesh
/// Importer instance version of LoadAndCreateMesh
SharedVertexArray load(std::string const& filename);
/// Importer instance version of LoadData
MeshData loadDataCustom(std::string const& filename);
/// Importer instance version of LoadData
MeshData loadDataCustom(std::string const& filename);
public:
/// Loads and creates a VA from a given filename
/// Supported file formats at time of writing this are:
///
/// COMMON INTERCHANGE FORMATS
/// Autodesk ( .fbx )
/// Collada ( .dae )
/// glTF ( .gltf, .glb )
/// Blender 3D ( .blend )
/// 3ds Max 3DS ( .3ds )
/// 3ds Max ASE ( .ase )
/// Wavefront Object ( .obj )
/// Industry Foundation Classes (IFC/Step) ( .ifc )
/// XGL ( .xgl,.zgl )
/// Stanford Polygon Library ( .ply )
/// *AutoCAD DXF ( .dxf )
/// LightWave ( .lwo )
/// LightWave Scene ( .lws )
/// Modo ( .lxo )
/// Stereolithography ( .stl )
/// DirectX X ( .x )
/// AC3D ( .ac )
/// Milkshape 3D ( .ms3d )
/// * TrueSpace ( .cob,.scn )
///
/// MOTION CAPTURE FORMATS
/// Biovision BVH ( .bvh )
/// * CharacterStudio Motion ( .csm )
/// GRAPHICS ENGINE FORMATS
/// Ogre XML ( .xml )
/// Irrlicht Mesh ( .irrmesh )
/// * Irrlicht Scene ( .irr )
/// GAME FILE FORMATS
/// Quake I ( .mdl )
/// Quake II ( .md2 )
/// Quake III Mesh ( .md3 )
/// Quake III Map/BSP ( .pk3 )
/// * Return to Castle Wolfenstein ( .mdc )
/// Doom 3 ( .md5* )
/// *Valve Model ( .smd,.vta )
/// *Open Game Engine Exchange ( .ogex )
/// *Unreal ( .3d )
///
/// OTHER FILE FORMATS
/// BlitzBasic 3D ( .b3d )
/// Quick3D ( .q3d,.q3s )
/// Neutral File Format ( .nff )
/// Sense8 WorldToolKit ( .nff )
/// Object File Format ( .off )
/// PovRAY Raw ( .raw )
/// Terragen Terrain ( .ter )
/// 3D GameStudio (3DGS) ( .mdl )
/// 3D GameStudio (3DGS) Terrain ( .hmp )
/// Izware Nendo ( .ndo )
///
/// Each attribute gets their own buffer.
static SharedVertexArray LoadAndCreateMesh(std::string const& filename, uint32_t flags = importDefaultFlags);
/// Creates a VA from MeshData
/// Requires OGL context and initialized GLOW on the same thread
static SharedVertexArray CreateMeshFromData(const MeshData& data);
/// Loads MeshData from a given filename with the given importer flags
/// Can be run on any thread
static MeshData LoadData(std::string const& filename, uint32_t flags = importDefaultFlags);
/// Loads and creates a VA from a given filename
/// Supported file formats at time of writing this are:
///
/// COMMON INTERCHANGE FORMATS
/// Autodesk ( .fbx )
/// Collada ( .dae )
/// glTF ( .gltf, .glb )
/// Blender 3D ( .blend )
/// 3ds Max 3DS ( .3ds )
/// 3ds Max ASE ( .ase )
/// Wavefront Object ( .obj )
/// Industry Foundation Classes (IFC/Step) ( .ifc )
/// XGL ( .xgl,.zgl )
/// Stanford Polygon Library ( .ply )
/// *AutoCAD DXF ( .dxf )
/// LightWave ( .lwo )
/// LightWave Scene ( .lws )
/// Modo ( .lxo )
/// Stereolithography ( .stl )
/// DirectX X ( .x )
/// AC3D ( .ac )
/// Milkshape 3D ( .ms3d )
/// * TrueSpace ( .cob,.scn )
///
/// MOTION CAPTURE FORMATS
/// Biovision BVH ( .bvh )
/// * CharacterStudio Motion ( .csm )
/// GRAPHICS ENGINE FORMATS
/// Ogre XML ( .xml )
/// Irrlicht Mesh ( .irrmesh )
/// * Irrlicht Scene ( .irr )
/// GAME FILE FORMATS
/// Quake I ( .mdl )
/// Quake II ( .md2 )
/// Quake III Mesh ( .md3 )
/// Quake III Map/BSP ( .pk3 )
/// * Return to Castle Wolfenstein ( .mdc )
/// Doom 3 ( .md5* )
/// *Valve Model ( .smd,.vta )
/// *Open Game Engine Exchange ( .ogex )
/// *Unreal ( .3d )
///
/// OTHER FILE FORMATS
/// BlitzBasic 3D ( .b3d )
/// Quick3D ( .q3d,.q3s )
/// Neutral File Format ( .nff )
/// Sense8 WorldToolKit ( .nff )
/// Object File Format ( .off )
/// PovRAY Raw ( .raw )
/// Terragen Terrain ( .ter )
/// 3D GameStudio (3DGS) ( .mdl )
/// 3D GameStudio (3DGS) Terrain ( .hmp )
/// Izware Nendo ( .ndo )
///
/// Each attribute gets their own buffer.
static SharedVertexArray LoadAndCreateMesh(std::string const& filename, uint32_t flags = importDefaultFlags);
/// Creates a VA from MeshData
/// Requires OGL context and initialized GLOW on the same thread
static SharedVertexArray CreateMeshFromData(const MeshData& data);
/// Loads MeshData from a given filename with the given importer flags
/// Can be run on any thread
static MeshData LoadData(std::string const& filename, uint32_t flags = importDefaultFlags);
};
}
};
\ No newline at end of file
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment