From c95c97430a7d05e0d08bb49b04ee012e8ee5da4f Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 5 Nov 2024 15:50:23 +0300 Subject: [PATCH] extract ModelsGenerator::fromCustom --- src/graphics/render/ModelsGenerator.cpp | 109 +++++++++++++----------- src/graphics/render/ModelsGenerator.hpp | 9 ++ 2 files changed, 69 insertions(+), 49 deletions(-) diff --git a/src/graphics/render/ModelsGenerator.cpp b/src/graphics/render/ModelsGenerator.cpp index 705cabd3..7da57d24 100644 --- a/src/graphics/render/ModelsGenerator.cpp +++ b/src/graphics/render/ModelsGenerator.cpp @@ -48,6 +48,59 @@ static inline UVRegion get_region_for( return texreg.region; } +model::Model ModelsGenerator::fromCustom( + const Assets& assets, + const std::vector& modelBoxes, + const std::vector& modelTextures, + const std::vector& points, + bool lighting +) { + auto model = model::Model(); + for (size_t i = 0; i < modelBoxes.size(); i++) { + auto& mesh = model.addMesh("blocks:" + modelTextures[i * 6]); + mesh.lighting = lighting; + const UVRegion(&boxtexfaces)[6] = { + get_region_for(modelTextures[i * 6], assets), + get_region_for(modelTextures[i * 6 + 1], assets), + get_region_for(modelTextures[i * 6 + 2], assets), + get_region_for(modelTextures[i * 6 + 3], assets), + get_region_for(modelTextures[i * 6 + 4], assets), + get_region_for(modelTextures[i * 6 + 5], assets)}; + mesh.addBox( + modelBoxes[i].center(), modelBoxes[i].size() * 0.5f, boxtexfaces + ); + } + glm::vec3 poff = glm::vec3(0.0f, 0.0f, 1.0f); + glm::vec3 norm {0, 1, 0}; + for (size_t i = 0; i < points.size() / 4; i++) { + auto texture = "blocks:" + modelTextures[modelBoxes.size() * 6 + i]; + + auto& mesh = model.addMesh(texture); + mesh.lighting = lighting; + + auto reg = get_region_for(texture, assets); + mesh.vertices.push_back( + {points[i * 4 + 0] - poff, glm::vec2(reg.u1, reg.v1), norm} + ); + mesh.vertices.push_back( + {points[i * 4 + 1] - poff, glm::vec2(reg.u2, reg.v1), norm} + ); + mesh.vertices.push_back( + {points[i * 4 + 2] - poff, glm::vec2(reg.u2, reg.v2), norm} + ); + mesh.vertices.push_back( + {points[i * 4 + 3] - poff, glm::vec2(reg.u1, reg.v1), norm} + ); + mesh.vertices.push_back( + {points[i * 4 + 4] - poff, glm::vec2(reg.u2, reg.v2), norm} + ); + mesh.vertices.push_back( + {points[i * 4 + 0] - poff, glm::vec2(reg.u1, reg.v2), norm} + ); + } + return model; +} + model::Model ModelsGenerator::generate( const ItemDef& def, const Content& content, const Assets& assets ) { @@ -59,55 +112,13 @@ model::Model ModelsGenerator::generate( "blocks:" + blockDef.textureFaces.at(0), assets ); } else if (blockDef.model == BlockModel::custom) { - model = model::Model(); - for (size_t i = 0; i < blockDef.modelBoxes.size(); i++) { - auto& mesh = - model.addMesh("blocks:" + blockDef.modelTextures[i * 6]); - mesh.lighting = !blockDef.shadeless; - const UVRegion (&boxtexfaces)[6] = { - get_region_for(blockDef.modelTextures[i * 6], assets), - get_region_for(blockDef.modelTextures[i * 6 + 1], assets), - get_region_for(blockDef.modelTextures[i * 6 + 2], assets), - get_region_for(blockDef.modelTextures[i * 6 + 3], assets), - get_region_for(blockDef.modelTextures[i * 6 + 4], assets), - get_region_for(blockDef.modelTextures[i * 6 + 5], assets) - }; - mesh.addBox( - blockDef.modelBoxes[i].center(), - blockDef.modelBoxes[i].size()*0.5f, boxtexfaces - ); - } - const auto& points = blockDef.modelExtraPoints; - glm::vec3 poff = glm::vec3(0.0f, 0.0f, 1.0f); - glm::vec3 norm {0, 1, 0}; - for (size_t i = 0; i < blockDef.modelExtraPoints.size() / 4; i++) { - auto texture = - "blocks:" + - blockDef.modelTextures[blockDef.modelBoxes.size() * 6 + i]; - - auto& mesh = model.addMesh(texture); - mesh.lighting = !blockDef.shadeless; - - auto reg = get_region_for(texture, assets); - mesh.vertices.push_back( - {points[i * 4 + 0] - poff, glm::vec2(reg.u1, reg.v1), norm} - ); - mesh.vertices.push_back( - {points[i * 4 + 1] - poff, glm::vec2(reg.u2, reg.v1), norm} - ); - mesh.vertices.push_back( - {points[i * 4 + 2] - poff, glm::vec2(reg.u2, reg.v2), norm} - ); - mesh.vertices.push_back( - {points[i * 4 + 3] - poff, glm::vec2(reg.u1, reg.v1), norm} - ); - mesh.vertices.push_back( - {points[i * 4 + 4] - poff, glm::vec2(reg.u2, reg.v2), norm} - ); - mesh.vertices.push_back( - {points[i * 4 + 0] - poff, glm::vec2(reg.u1, reg.v2), norm} - ); - } + model = fromCustom( + assets, + blockDef.modelBoxes, + blockDef.modelTextures, + blockDef.modelExtraPoints, + !blockDef.shadeless + ); for (auto& mesh : model.meshes) { mesh.scale(glm::vec3(0.3f)); } diff --git a/src/graphics/render/ModelsGenerator.hpp b/src/graphics/render/ModelsGenerator.hpp index d0a2eb66..ee19c541 100644 --- a/src/graphics/render/ModelsGenerator.hpp +++ b/src/graphics/render/ModelsGenerator.hpp @@ -1,6 +1,7 @@ #pragma once #include "graphics/commons/Model.hpp" +#include "maths/aabb.hpp" struct ItemDef; class Assets; @@ -11,4 +12,12 @@ public: static model::Model generate( const ItemDef& def, const Content& content, const Assets& assets ); + + static model::Model fromCustom( + const Assets& assets, + const std::vector& modelBoxes, + const std::vector& modelTextures, + const std::vector& points, + bool lighting + ); };