diff --git a/ROADMAP.txt b/ROADMAP.txt index fb4aece..2e85c8c 100644 --- a/ROADMAP.txt +++ b/ROADMAP.txt @@ -1,17 +1,13 @@ ------------ Tyra's v2.0 roadmap to publish on GitHub ------------ -- [General] Znalezc problem w loaderze/ach -- [General] Assert czy ramki w obj maja taka sama ilosc danych -- [General] Clip glitch na tutorial01 -- [General] Rename builder2 - [Obj] soldier_000001 - [General] vec3/vec4/m4x4 functions from ms +- [General] wszystkie new M4x4 i = M4x4 na M4x4::Identity - [General] std::vector in mesh instead of array** - [General] Allow to edit all data from mesh/texture -- [General] odpalic de_dust2, doszlifowac guard band - [General] manycolor -> lightmap - [General] rename invertT -> invertY - [General] ładować ambient i wrzucać do material. Zmienic nazwe na ambient -- [General] wszystkie new M4x4 i = M4x4 na M4x4::Identity +- [General] odpalic de_dust2, doszlifowac guard band - [General] USB test - [General] Tyra version, render it on start diff --git a/engine/inc/loaders/3d/builder2/mesh_builder2_data.hpp b/engine/inc/loaders/3d/builder/mesh_builder_data.hpp similarity index 78% rename from engine/inc/loaders/3d/builder2/mesh_builder2_data.hpp rename to engine/inc/loaders/3d/builder/mesh_builder_data.hpp index 9888892..62fa3f3 100644 --- a/engine/inc/loaders/3d/builder2/mesh_builder2_data.hpp +++ b/engine/inc/loaders/3d/builder/mesh_builder_data.hpp @@ -12,7 +12,7 @@ #pragma once #include -#include "./mesh_builder2_material_data.hpp" +#include "./mesh_builder_material_data.hpp" namespace Tyra { @@ -21,12 +21,12 @@ namespace Tyra { * All dynamic data ownership is moved to mesh class, so * verts, coords.. are not deallocated! */ -class MeshBuilder2Data { +class MeshBuilderData { public: - MeshBuilder2Data(); - ~MeshBuilder2Data(); + MeshBuilderData(); + ~MeshBuilderData(); - std::vector materials; + std::vector materials; bool textureCoordsEnabled, normalsEnabled, lightMapEnabled; }; diff --git a/engine/inc/loaders/3d/builder2/mesh_builder2_material_data.hpp b/engine/inc/loaders/3d/builder/mesh_builder_material_data.hpp similarity index 70% rename from engine/inc/loaders/3d/builder2/mesh_builder2_material_data.hpp rename to engine/inc/loaders/3d/builder/mesh_builder_material_data.hpp index c9ff03a..85c2c74 100644 --- a/engine/inc/loaders/3d/builder2/mesh_builder2_material_data.hpp +++ b/engine/inc/loaders/3d/builder/mesh_builder_material_data.hpp @@ -13,17 +13,17 @@ #include #include -#include "./mesh_builder2_material_frame_data.hpp" +#include "./mesh_builder_material_frame_data.hpp" #include "renderer/models/color.hpp" namespace Tyra { -class MeshBuilder2MaterialData { +class MeshBuilderMaterialData { public: - MeshBuilder2MaterialData(); - ~MeshBuilder2MaterialData(); + MeshBuilderMaterialData(); + ~MeshBuilderMaterialData(); - std::vector frames; + std::vector frames; std::string name; Color ambient; }; diff --git a/engine/inc/loaders/3d/builder2/mesh_builder2_material_frame_data.hpp b/engine/inc/loaders/3d/builder/mesh_builder_material_frame_data.hpp similarity index 82% rename from engine/inc/loaders/3d/builder2/mesh_builder2_material_frame_data.hpp rename to engine/inc/loaders/3d/builder/mesh_builder_material_frame_data.hpp index 70257e0..680ecff 100644 --- a/engine/inc/loaders/3d/builder2/mesh_builder2_material_frame_data.hpp +++ b/engine/inc/loaders/3d/builder/mesh_builder_material_frame_data.hpp @@ -17,10 +17,10 @@ namespace Tyra { -class MeshBuilder2MaterialFrameData { +class MeshBuilderMaterialFrameData { public: - MeshBuilder2MaterialFrameData(); - ~MeshBuilder2MaterialFrameData(); + MeshBuilderMaterialFrameData(); + ~MeshBuilderMaterialFrameData(); u32 count; Vec4 *vertices, *textureCoords, *normals; diff --git a/engine/inc/loaders/3d/md2_loader/md2_loader.hpp b/engine/inc/loaders/3d/md2_loader/md2_loader.hpp index 01bc7a3..9478d66 100644 --- a/engine/inc/loaders/3d/md2_loader/md2_loader.hpp +++ b/engine/inc/loaders/3d/md2_loader/md2_loader.hpp @@ -11,7 +11,7 @@ #pragma once #include "../../loader.hpp" -#include "../builder2/mesh_builder2_data.hpp" +#include "../builder/mesh_builder_data.hpp" #include namespace Tyra { @@ -22,11 +22,11 @@ class MD2Loader : public Loader { MD2Loader(); ~MD2Loader(); - MeshBuilder2Data* load(const char* fullpath, const float& scale, - const bool& invertT); + MeshBuilderData* load(const char* fullpath, const float& scale, + const bool& invertT); - inline MeshBuilder2Data* load(const std::string& fullpath, const float& scale, - const bool& invertT) { + inline MeshBuilderData* load(const std::string& fullpath, const float& scale, + const bool& invertT) { return load(fullpath.c_str(), scale, invertT); } }; diff --git a/engine/inc/loaders/3d/obj_loader/obj_loader.hpp b/engine/inc/loaders/3d/obj_loader/obj_loader.hpp index 11a2ee9..05baf26 100644 --- a/engine/inc/loaders/3d/obj_loader/obj_loader.hpp +++ b/engine/inc/loaders/3d/obj_loader/obj_loader.hpp @@ -11,7 +11,7 @@ #pragma once #include "../../loader.hpp" -#include "../builder2/mesh_builder2_data.hpp" +#include "../builder/mesh_builder_data.hpp" #include #include "renderer/models/color.hpp" #include "loaders/3d/obj_loader/tiny_obj_loader.hpp" @@ -25,27 +25,27 @@ class ObjLoader : public Loader { ~ObjLoader(); /** Load multiple obj files (dynamic) */ - MeshBuilder2Data* load(const char* fullpath, const u16& count, - const float& scale, const bool& invertT); + MeshBuilderData* load(const char* fullpath, const u16& count, + const float& scale, const bool& invertT); - inline MeshBuilder2Data* load(const std::string& fullpath, const u16& count, - const float& scale, const bool& invertT) { + inline MeshBuilderData* load(const std::string& fullpath, const u16& count, + const float& scale, const bool& invertT) { return load(fullpath.c_str(), count, scale, invertT); } private: void addOutputMaterialsAndFrames( - MeshBuilder2Data* output, const tinyobj::attrib_t& attrib, + MeshBuilderData* output, const tinyobj::attrib_t& attrib, const std::vector& shapes, const std::vector& materials, const u16& framesCount); - void scan(MeshBuilder2Data* output, const tinyobj::attrib_t& attrib, + void scan(MeshBuilderData* output, const tinyobj::attrib_t& attrib, const std::vector& shapes, const std::vector& materials, const u16& frameIndex); - void importFrame(MeshBuilder2Data* output, const tinyobj::attrib_t& attrib, + void importFrame(MeshBuilderData* output, const tinyobj::attrib_t& attrib, const std::vector& shapes, const std::vector& materials, const u16& frameIndex, const float& scale, diff --git a/engine/inc/renderer/3d/mesh/dynamic/dynamic_mesh.hpp b/engine/inc/renderer/3d/mesh/dynamic/dynamic_mesh.hpp index ffa007b..a3baea4 100644 --- a/engine/inc/renderer/3d/mesh/dynamic/dynamic_mesh.hpp +++ b/engine/inc/renderer/3d/mesh/dynamic/dynamic_mesh.hpp @@ -19,7 +19,7 @@ namespace Tyra { class DynamicMesh : public Mesh { public: - explicit DynamicMesh(const MeshBuilder2Data& data); + explicit DynamicMesh(const MeshBuilderData& data); explicit DynamicMesh(const DynamicMesh& mesh); ~DynamicMesh(); diff --git a/engine/inc/renderer/3d/mesh/mesh.hpp b/engine/inc/renderer/3d/mesh/mesh.hpp index ab6a5a1..d90ace5 100644 --- a/engine/inc/renderer/3d/mesh/mesh.hpp +++ b/engine/inc/renderer/3d/mesh/mesh.hpp @@ -19,7 +19,7 @@ namespace Tyra { class Mesh { public: - explicit Mesh(const MeshBuilder2Data& data); + explicit Mesh(const MeshBuilderData& data); explicit Mesh(const Mesh& mesh); ~Mesh(); diff --git a/engine/inc/renderer/3d/mesh/mesh_frame.hpp b/engine/inc/renderer/3d/mesh/mesh_frame.hpp index 7bb5619..8bc7bcb 100644 --- a/engine/inc/renderer/3d/mesh/mesh_frame.hpp +++ b/engine/inc/renderer/3d/mesh/mesh_frame.hpp @@ -11,14 +11,14 @@ #pragma once #include "./mesh_material.hpp" -#include "loaders/3d/builder2/mesh_builder2_data.hpp" +#include "loaders/3d/builder/mesh_builder_data.hpp" #include "renderer/3d/bbox/bbox.hpp" namespace Tyra { class MeshFrame { public: - explicit MeshFrame(const MeshBuilder2Data& data, const u32& index); + explicit MeshFrame(const MeshBuilderData& data, const u32& index); explicit MeshFrame(const MeshFrame& frame); ~MeshFrame(); diff --git a/engine/inc/renderer/3d/mesh/mesh_material.hpp b/engine/inc/renderer/3d/mesh/mesh_material.hpp index feb0c0b..b871efd 100644 --- a/engine/inc/renderer/3d/mesh/mesh_material.hpp +++ b/engine/inc/renderer/3d/mesh/mesh_material.hpp @@ -12,13 +12,13 @@ #include "debug/debug.hpp" #include "./mesh_material_frame.hpp" -#include "loaders/3d/builder2/mesh_builder2_data.hpp" +#include "loaders/3d/builder/mesh_builder_data.hpp" namespace Tyra { class MeshMaterial { public: - explicit MeshMaterial(const MeshBuilder2Data& data, const u32& materialIndex); + explicit MeshMaterial(const MeshBuilderData& data, const u32& materialIndex); explicit MeshMaterial(const MeshMaterial& material); ~MeshMaterial(); diff --git a/engine/inc/renderer/3d/mesh/mesh_material_frame.hpp b/engine/inc/renderer/3d/mesh/mesh_material_frame.hpp index 63496fc..57895d3 100644 --- a/engine/inc/renderer/3d/mesh/mesh_material_frame.hpp +++ b/engine/inc/renderer/3d/mesh/mesh_material_frame.hpp @@ -10,15 +10,15 @@ #pragma once -#include "loaders/3d/builder2/mesh_builder2_data.hpp" +#include "loaders/3d/builder/mesh_builder_data.hpp" #include "./renderer/3d/bbox/bbox.hpp" namespace Tyra { class MeshMaterialFrame { public: - explicit MeshMaterialFrame(const MeshBuilder2Data& data, - const u32& frameIndex, const u32& materialIndex); + explicit MeshMaterialFrame(const MeshBuilderData& data, const u32& frameIndex, + const u32& materialIndex); explicit MeshMaterialFrame(const MeshMaterialFrame& frame); ~MeshMaterialFrame(); diff --git a/engine/inc/renderer/3d/mesh/static/static_mesh.hpp b/engine/inc/renderer/3d/mesh/static/static_mesh.hpp index 15d0bf5..3b5275d 100644 --- a/engine/inc/renderer/3d/mesh/static/static_mesh.hpp +++ b/engine/inc/renderer/3d/mesh/static/static_mesh.hpp @@ -18,7 +18,7 @@ namespace Tyra { class StaticMesh : public Mesh { public: - StaticMesh(const MeshBuilder2Data& data); + StaticMesh(const MeshBuilderData& data); StaticMesh(const StaticMesh& mesh); ~StaticMesh(); diff --git a/engine/src/loaders/3d/builder2/mesh_builder2_data.cpp b/engine/src/loaders/3d/builder/mesh_builder_data.cpp similarity index 78% rename from engine/src/loaders/3d/builder2/mesh_builder2_data.cpp rename to engine/src/loaders/3d/builder/mesh_builder_data.cpp index c0026f1..b88c50c 100644 --- a/engine/src/loaders/3d/builder2/mesh_builder2_data.cpp +++ b/engine/src/loaders/3d/builder/mesh_builder_data.cpp @@ -9,17 +9,17 @@ # Sandro Sobczyński */ -#include "loaders/3d/builder2/mesh_builder2_data.hpp" +#include "loaders/3d/builder/mesh_builder_data.hpp" namespace Tyra { -MeshBuilder2Data::MeshBuilder2Data() { +MeshBuilderData::MeshBuilderData() { textureCoordsEnabled = false; normalsEnabled = false; lightMapEnabled = false; } -MeshBuilder2Data::~MeshBuilder2Data() { +MeshBuilderData::~MeshBuilderData() { for (auto& material : materials) { delete material; } diff --git a/engine/src/loaders/3d/builder2/mesh_builder2_material_data.cpp b/engine/src/loaders/3d/builder/mesh_builder_material_data.cpp similarity index 72% rename from engine/src/loaders/3d/builder2/mesh_builder2_material_data.cpp rename to engine/src/loaders/3d/builder/mesh_builder_material_data.cpp index 6716a3a..9b2b472 100644 --- a/engine/src/loaders/3d/builder2/mesh_builder2_material_data.cpp +++ b/engine/src/loaders/3d/builder/mesh_builder_material_data.cpp @@ -9,14 +9,14 @@ # Sandro Sobczyński */ -#include "loaders/3d/builder2/mesh_builder2_material_data.hpp" +#include "loaders/3d/builder/mesh_builder_material_data.hpp" namespace Tyra { -MeshBuilder2MaterialData::MeshBuilder2MaterialData() { +MeshBuilderMaterialData::MeshBuilderMaterialData() { ambient.set(128.0F, 128.0F, 128.0F, 128.0F); } -MeshBuilder2MaterialData::~MeshBuilder2MaterialData() { +MeshBuilderMaterialData::~MeshBuilderMaterialData() { for (auto& frame : frames) { delete frame; } diff --git a/engine/src/loaders/3d/builder2/mesh_builder2_material_frame_data.cpp b/engine/src/loaders/3d/builder/mesh_builder_material_frame_data.cpp similarity index 68% rename from engine/src/loaders/3d/builder2/mesh_builder2_material_frame_data.cpp rename to engine/src/loaders/3d/builder/mesh_builder_material_frame_data.cpp index 1839784..61f0115 100644 --- a/engine/src/loaders/3d/builder2/mesh_builder2_material_frame_data.cpp +++ b/engine/src/loaders/3d/builder/mesh_builder_material_frame_data.cpp @@ -9,16 +9,16 @@ # Sandro Sobczyński */ -#include "loaders/3d/builder2/mesh_builder2_material_frame_data.hpp" +#include "loaders/3d/builder/mesh_builder_material_frame_data.hpp" namespace Tyra { -MeshBuilder2MaterialFrameData::MeshBuilder2MaterialFrameData() { +MeshBuilderMaterialFrameData::MeshBuilderMaterialFrameData() { vertices = nullptr; textureCoords = nullptr; normals = nullptr; colors = nullptr; } -MeshBuilder2MaterialFrameData::~MeshBuilder2MaterialFrameData() {} +MeshBuilderMaterialFrameData::~MeshBuilderMaterialFrameData() {} } // namespace Tyra diff --git a/engine/src/loaders/3d/md2_loader/md2_loader.cpp b/engine/src/loaders/3d/md2_loader/md2_loader.cpp index 0658941..8fddfbf 100644 --- a/engine/src/loaders/3d/md2_loader/md2_loader.cpp +++ b/engine/src/loaders/3d/md2_loader/md2_loader.cpp @@ -74,8 +74,8 @@ MD2Loader::MD2Loader() {} MD2Loader::~MD2Loader() {} -MeshBuilder2Data* MD2Loader::load(const char* fullpath, const float& scale, - const bool& invertT) { +MeshBuilderData* MD2Loader::load(const char* fullpath, const float& scale, + const bool& invertT) { std::string path = fullpath; TYRA_ASSERT(!path.empty(), "Provided path is empty!"); @@ -110,9 +110,9 @@ MeshBuilder2Data* MD2Loader::load(const char* fullpath, const float& scale, fclose(file); - auto result = new MeshBuilder2Data(); + auto result = new MeshBuilderData(); - auto* material = new MeshBuilder2MaterialData(); + auto* material = new MeshBuilderMaterialData(); material->name = getFilenameWithoutExtension(filename); result->materials.push_back(material); @@ -125,7 +125,7 @@ MeshBuilder2Data* MD2Loader::load(const char* fullpath, const float& scale, Vec4** tempTexCoords = new Vec4*[framesCount]; for (u32 i = 0; i < framesCount; i++) { - auto* outputFrame = new MeshBuilder2MaterialFrameData(); + auto* outputFrame = new MeshBuilderMaterialFrameData(); material->frames.push_back(outputFrame); tempVertices[i] = new Vec4[vertexCount]; diff --git a/engine/src/loaders/3d/obj_loader/obj_loader.cpp b/engine/src/loaders/3d/obj_loader/obj_loader.cpp index 48f7677..f59ce7d 100644 --- a/engine/src/loaders/3d/obj_loader/obj_loader.cpp +++ b/engine/src/loaders/3d/obj_loader/obj_loader.cpp @@ -28,8 +28,8 @@ ObjLoader::ObjLoader() {} ObjLoader::~ObjLoader() {} -MeshBuilder2Data* ObjLoader::load(const char* fullpath, const u16& count, - const float& scale, const bool& invertY) { +MeshBuilderData* ObjLoader::load(const char* fullpath, const u16& count, + const float& scale, const bool& invertY) { std::string path = fullpath; std::string basePath = getPathFromFilename(path); @@ -38,7 +38,7 @@ MeshBuilder2Data* ObjLoader::load(const char* fullpath, const u16& count, auto rawFilename = getFilenameWithoutExtension(path); auto extension = getExtensionOfFilename(path); - auto* result = new MeshBuilder2Data(); + auto* result = new MeshBuilderData(); tinyobj::ObjReaderConfig readerConfig; readerConfig.triangulate = count == 1; @@ -85,7 +85,7 @@ MeshBuilder2Data* ObjLoader::load(const char* fullpath, const u16& count, } void ObjLoader::addOutputMaterialsAndFrames( - MeshBuilder2Data* output, const tinyobj::attrib_t& attrib, + MeshBuilderData* output, const tinyobj::attrib_t& attrib, const std::vector& shapes, const std::vector& materials, const u16& framesCount) { if (attrib.texcoords.size()) output->textureCoordsEnabled = true; @@ -98,7 +98,7 @@ void ObjLoader::addOutputMaterialsAndFrames( "file"); for (size_t i = 0; i < materials.size(); i++) { - auto* material = new MeshBuilder2MaterialData(); + auto* material = new MeshBuilderMaterialData(); material->name = materials[i].name; @@ -107,7 +107,7 @@ void ObjLoader::addOutputMaterialsAndFrames( materials[i].ambient[2] * 255.0F, 128.0F); for (size_t j = 0; j < framesCount; j++) { - auto* frame = new MeshBuilder2MaterialFrameData(); + auto* frame = new MeshBuilderMaterialFrameData(); material->frames.push_back(frame); } @@ -115,7 +115,7 @@ void ObjLoader::addOutputMaterialsAndFrames( } } -void ObjLoader::scan(MeshBuilder2Data* output, const tinyobj::attrib_t& attrib, +void ObjLoader::scan(MeshBuilderData* output, const tinyobj::attrib_t& attrib, const std::vector& shapes, const std::vector& materials, const u16& frameIndex) { @@ -159,7 +159,7 @@ void ObjLoader::scan(MeshBuilder2Data* output, const tinyobj::attrib_t& attrib, } } -void ObjLoader::importFrame(MeshBuilder2Data* output, +void ObjLoader::importFrame(MeshBuilderData* output, const tinyobj::attrib_t& attrib, const std::vector& shapes, const std::vector& materials, diff --git a/engine/src/renderer/3d/mesh/dynamic/dynamic_mesh.cpp b/engine/src/renderer/3d/mesh/dynamic/dynamic_mesh.cpp index 00d4733..f1a1643 100644 --- a/engine/src/renderer/3d/mesh/dynamic/dynamic_mesh.cpp +++ b/engine/src/renderer/3d/mesh/dynamic/dynamic_mesh.cpp @@ -15,7 +15,7 @@ namespace Tyra { -DynamicMesh::DynamicMesh(const MeshBuilder2Data& data) : Mesh(data) { +DynamicMesh::DynamicMesh(const MeshBuilderData& data) : Mesh(data) { framesCount = data.materials[0]->frames.size(); if (framesCount == 1) { diff --git a/engine/src/renderer/3d/mesh/mesh.cpp b/engine/src/renderer/3d/mesh/mesh.cpp index 53758e7..a6df2e6 100644 --- a/engine/src/renderer/3d/mesh/mesh.cpp +++ b/engine/src/renderer/3d/mesh/mesh.cpp @@ -13,7 +13,7 @@ namespace Tyra { -Mesh::Mesh(const MeshBuilder2Data& data) { +Mesh::Mesh(const MeshBuilderData& data) { init(); TYRA_ASSERT(data.materials.size() > 0, diff --git a/engine/src/renderer/3d/mesh/mesh_frame.cpp b/engine/src/renderer/3d/mesh/mesh_frame.cpp index ed8a95f..6948dbe 100644 --- a/engine/src/renderer/3d/mesh/mesh_frame.cpp +++ b/engine/src/renderer/3d/mesh/mesh_frame.cpp @@ -19,7 +19,7 @@ namespace Tyra { -MeshFrame::MeshFrame(const MeshBuilder2Data& data, const u32& index) { +MeshFrame::MeshFrame(const MeshBuilderData& data, const u32& index) { id = rand() % 1000000; auto bboxes = new CoreBBox*[data.materials.size()]; diff --git a/engine/src/renderer/3d/mesh/mesh_material.cpp b/engine/src/renderer/3d/mesh/mesh_material.cpp index 5895342..a279758 100644 --- a/engine/src/renderer/3d/mesh/mesh_material.cpp +++ b/engine/src/renderer/3d/mesh/mesh_material.cpp @@ -17,7 +17,7 @@ namespace Tyra { -MeshMaterial::MeshMaterial(const MeshBuilder2Data& data, +MeshMaterial::MeshMaterial(const MeshBuilderData& data, const u32& materialIndex) { TYRA_ASSERT(materialIndex < data.materials.size(), "Provided index \"", materialIndex, "\" is out of range"); @@ -44,8 +44,17 @@ MeshMaterial::MeshMaterial(const MeshBuilder2Data& data, framesCount = material->frames.size(); frames = new MeshMaterialFrame*[framesCount]; + u32 lastVertexCount = 0; + for (u32 i = 0; i < framesCount; i++) { frames[i] = new MeshMaterialFrame(data, i, materialIndex); + + if (i > 0) { + TYRA_ASSERT(frames[i]->getVertexCount() == lastVertexCount, + "Vertex count must be the same for all frames"); + } + + lastVertexCount = frames[i]->getVertexCount(); } _isMother = true; diff --git a/engine/src/renderer/3d/mesh/mesh_material_frame.cpp b/engine/src/renderer/3d/mesh/mesh_material_frame.cpp index a085efd..5bf2f09 100644 --- a/engine/src/renderer/3d/mesh/mesh_material_frame.cpp +++ b/engine/src/renderer/3d/mesh/mesh_material_frame.cpp @@ -18,7 +18,7 @@ namespace Tyra { -MeshMaterialFrame::MeshMaterialFrame(const MeshBuilder2Data& data, +MeshMaterialFrame::MeshMaterialFrame(const MeshBuilderData& data, const u32& frameIndex, const u32& materialIndex) { TYRA_ASSERT(materialIndex < data.materials.size(), "Provided index \"", diff --git a/engine/src/renderer/3d/mesh/static/static_mesh.cpp b/engine/src/renderer/3d/mesh/static/static_mesh.cpp index c492d56..33516a2 100644 --- a/engine/src/renderer/3d/mesh/static/static_mesh.cpp +++ b/engine/src/renderer/3d/mesh/static/static_mesh.cpp @@ -13,7 +13,7 @@ namespace Tyra { -StaticMesh::StaticMesh(const MeshBuilder2Data& data) : Mesh(data) { +StaticMesh::StaticMesh(const MeshBuilderData& data) : Mesh(data) { if (data.materials[0]->frames.size() > 1) TYRA_WARN("Static meshes should have only one frame, but ", data.materials[0]->frames.size(), " frames were found");