mirror of
https://github.com/bailwillharr/engine.git
synced 2024-09-21 04:51:18 +00:00
Support glTF meshes without UVs
This commit is contained in:
parent
a686371339
commit
69802afb50
@ -136,26 +136,31 @@ static void CreateNodes(engine::Scene& app_scene, const tg::Scene& gl_scene, con
|
|||||||
const size_t norm_bytestride = norm_accessor.ByteStride(norm_bufferview);
|
const size_t norm_bytestride = norm_accessor.ByteStride(norm_bufferview);
|
||||||
const tg::Buffer& norm_buffer = gl_model.buffers.at(norm_bufferview.buffer);
|
const tg::Buffer& norm_buffer = gl_model.buffers.at(norm_bufferview.buffer);
|
||||||
|
|
||||||
const tg::Accessor& uv_accessor = gl_model.accessors.at(prim.attributes.at("TEXCOORD_0"));
|
std::vector<engine::Vertex> vertices(pos_accessor.count);
|
||||||
if (uv_accessor.componentType != TINYGLTF_COMPONENT_TYPE_FLOAT) throw std::runtime_error("UV att. must be float!");
|
|
||||||
if (uv_accessor.type != 2) throw std::runtime_error("UV att. dim. must be 2!");
|
if (prim.attributes.contains("TEXCOORD_0")) {
|
||||||
const tg::BufferView& uv_bufferview = gl_model.bufferViews.at(uv_accessor.bufferView);
|
const tg::Accessor& uv_accessor = gl_model.accessors.at(prim.attributes.at("TEXCOORD_0"));
|
||||||
const size_t uv_byteoffset = uv_accessor.byteOffset + uv_bufferview.byteOffset;
|
if (uv_accessor.componentType != TINYGLTF_COMPONENT_TYPE_FLOAT) throw std::runtime_error("UV att. must be float!");
|
||||||
const size_t uv_bytestride = uv_accessor.ByteStride(uv_bufferview);
|
if (uv_accessor.type != 2) throw std::runtime_error("UV att. dim. must be 2!");
|
||||||
const tg::Buffer& uv_buffer = gl_model.buffers.at(uv_bufferview.buffer);
|
const tg::BufferView& uv_bufferview = gl_model.bufferViews.at(uv_accessor.bufferView);
|
||||||
|
const size_t uv_byteoffset = uv_accessor.byteOffset + uv_bufferview.byteOffset;
|
||||||
|
const size_t uv_bytestride = uv_accessor.ByteStride(uv_bufferview);
|
||||||
|
const tg::Buffer& uv_buffer = gl_model.buffers.at(uv_bufferview.buffer);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < vertices.size(); ++i) {
|
||||||
|
vertices[i].uv = *reinterpret_cast<const glm::vec2*>(&uv_buffer.data[uv_byteoffset + uv_bytestride * i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool has_tangents = false;
|
bool has_tangents = false;
|
||||||
if (prim.attributes.contains("TANGENT")) {
|
if (prim.attributes.contains("TANGENT")) {
|
||||||
has_tangents = true;
|
has_tangents = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<engine::Vertex> vertices(pos_accessor.count);
|
// copy everything except tangents and uvs
|
||||||
|
|
||||||
// copy everything except tangents
|
|
||||||
for (size_t i = 0; i < vertices.size(); ++i) {
|
for (size_t i = 0; i < vertices.size(); ++i) {
|
||||||
vertices[i].pos = *reinterpret_cast<const glm::vec3*>(&pos_buffer.data[pos_byteoffset + pos_bytestride * i]);
|
vertices[i].pos = *reinterpret_cast<const glm::vec3*>(&pos_buffer.data[pos_byteoffset + pos_bytestride * i]);
|
||||||
vertices[i].norm = *reinterpret_cast<const glm::vec3*>(&norm_buffer.data[norm_byteoffset + norm_bytestride * i]);
|
vertices[i].norm = *reinterpret_cast<const glm::vec3*>(&norm_buffer.data[norm_byteoffset + norm_bytestride * i]);
|
||||||
vertices[i].uv = *reinterpret_cast<const glm::vec2*>(&uv_buffer.data[uv_byteoffset + uv_bytestride * i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (has_tangents) {
|
if (has_tangents) {
|
||||||
@ -176,12 +181,14 @@ static void CreateNodes(engine::Scene& app_scene, const tg::Scene& gl_scene, con
|
|||||||
engine::Vertex* vertices;
|
engine::Vertex* vertices;
|
||||||
const uint32_t* indices;
|
const uint32_t* indices;
|
||||||
size_t count;
|
size_t count;
|
||||||
|
std::vector<uint32_t> new_indices;
|
||||||
};
|
};
|
||||||
|
|
||||||
MeshData meshData{};
|
MeshData meshData{};
|
||||||
meshData.vertices = vertices.data();
|
meshData.vertices = vertices.data();
|
||||||
meshData.indices = indices->data();
|
meshData.indices = indices->data();
|
||||||
meshData.count = indices->size();
|
meshData.count = indices->size();
|
||||||
|
meshData.new_indices.reserve(meshData.count);
|
||||||
|
|
||||||
SMikkTSpaceInterface mts_interface{};
|
SMikkTSpaceInterface mts_interface{};
|
||||||
mts_interface.m_getNumFaces = [](const SMikkTSpaceContext* pContext) -> int {
|
mts_interface.m_getNumFaces = [](const SMikkTSpaceContext* pContext) -> int {
|
||||||
|
BIN
test/res/models/walls.glb
Normal file
BIN
test/res/models/walls.glb
Normal file
Binary file not shown.
@ -175,7 +175,7 @@ void PlayGame(GameSettings settings)
|
|||||||
engine::Entity wall2 = scene2->CreateEntity("wall2", pivot, glm::vec3{-50.0f, -50.0f, 0.0f});
|
engine::Entity wall2 = scene2->CreateEntity("wall2", pivot, glm::vec3{-50.0f, -50.0f, 0.0f});
|
||||||
auto wall_renderable = scene2->AddComponent<engine::MeshRenderableComponent>(wall2);
|
auto wall_renderable = scene2->AddComponent<engine::MeshRenderableComponent>(wall2);
|
||||||
wall_renderable->mesh = GenCuboidMesh(app.renderer()->GetDevice(), 100.0f, 100.0f, 0.1f, 100.0f);
|
wall_renderable->mesh = GenCuboidMesh(app.renderer()->GetDevice(), 100.0f, 100.0f, 0.1f, 100.0f);
|
||||||
wall_renderable->material = std::make_unique<engine::Material>(app.renderer(), app.GetResource<engine::Shader>("builtin.standard"));
|
wall_renderable->material = std::make_unique<engine::Material>(app.renderer(), app.GetResource<engine::Shader>("builtin.fancy"));
|
||||||
|
|
||||||
std::shared_ptr<engine::Texture> albedo_texture =
|
std::shared_ptr<engine::Texture> albedo_texture =
|
||||||
engine::LoadTextureFromFile(app.GetResourcePath("textures/brickwall_albedo.jpg"), engine::Texture::Filtering::kAnisotropic, app.renderer());
|
engine::LoadTextureFromFile(app.GetResourcePath("textures/brickwall_albedo.jpg"), engine::Texture::Filtering::kAnisotropic, app.renderer());
|
||||||
@ -198,8 +198,10 @@ void PlayGame(GameSettings settings)
|
|||||||
scene2->GetComponent<engine::TransformComponent>(teapot)->scale *= 10.0f;
|
scene2->GetComponent<engine::TransformComponent>(teapot)->scale *= 10.0f;
|
||||||
auto teapot2 = engine::util::LoadGLTF(*scene2, app.GetResourcePath("models/teapot.glb"));
|
auto teapot2 = engine::util::LoadGLTF(*scene2, app.GetResourcePath("models/teapot.glb"));
|
||||||
scene2->GetComponent<engine::TransformComponent>(teapot2)->scale *= 10.0f;
|
scene2->GetComponent<engine::TransformComponent>(teapot2)->scale *= 10.0f;
|
||||||
scene2->GetComponent<engine::TransformComponent>(teapot2)->position.y += 10.0f;
|
scene2->GetComponent<engine::TransformComponent>(teapot2)->position.y += 5.0f;
|
||||||
scene2->GetComponent<engine::TransformComponent>(teapot2)->rotation = glm::angleAxis(glm::half_pi<float>(), glm::vec3{1.0f, 0.0f, 0.0f});
|
scene2->GetComponent<engine::TransformComponent>(teapot2)->rotation = glm::angleAxis(glm::pi<float>(), glm::vec3{ 0.0f, 0.0f, 1.0f });
|
||||||
|
scene2->GetComponent<engine::TransformComponent>(teapot2)->rotation *= glm::angleAxis(glm::half_pi<float>(), glm::vec3{1.0f, 0.0f, 0.0f});
|
||||||
|
auto walls = engine::util::LoadGLTF(*scene2, app.GetResourcePath("models/walls.glb"));
|
||||||
}
|
}
|
||||||
|
|
||||||
my_scene->GetSystem<CameraControllerSystem>()->next_scene_ = scene2;
|
my_scene->GetSystem<CameraControllerSystem>()->next_scene_ = scene2;
|
||||||
|
Loading…
Reference in New Issue
Block a user