Files
EVEngine/test/model3d_gltf_uv.cpp

52 lines
2.5 KiB
C++

#include <assimp/material.h>
#include <assimp/scene.h>
#include <cmath>
#include <filesystem>
#include "graphics/Graphics.h"
#include "graphics/Material.h"
#include "graphics/RenderSystem3D.h"
#include "medialoader/model/ModelLoader.h"
#include "model3d/ModelData.h"
#include "model3d/ModelRenderer.h"
#include "zeroerr/assert.h"
#include "zeroerr/unittest.h"
TEST_CASE("model3d.gltfUvOriginAndTransformSurviveLoader") {
auto* gfx = eve::graphics::Graphics::create();
gfx->initHeadless(128, 128);
const auto source = std::filesystem::path(__FILE__).parent_path() / "fixtures/model3d/uv-origin.gltf";
medialoader::ModelLoader loader;
medialoader::LoadOptions options;
options.joinIdenticalVertices = false;
options.improveCacheLocality = false;
for (bool flip : {false, true}) {
options.flipUVs = flip;
auto scene = loader.loadFromPath(source.string().c_str(), options);
eve::model3d::ModelData model(std::move(scene), "", flip);
auto* entity = eve::model3d::buildRenderable(*gfx, &model, 0);
REQUIRE(entity != nullptr);
const auto uv = entity->getMesh()->texcoordSet(0);
REQUIRE_EQ(uv.size(), size_t(6));
REQUIRE(std::abs(uv[1] - .2f) < .00001f);
const auto binding = entity->getMaterial()->pbrSurface().textures[0];
REQUIRE(std::abs(binding.rotation - .6f) < .00001f);
REQUIRE(std::abs(binding.offset[0] - .13f) < .00001f);
REQUIRE(std::abs(binding.offset[1] - .27f) < .00001f);
}
}
TEST_CASE("model3d.missingPreviewTextureRetainsMaterialFactors") {
auto* gfx = eve::graphics::Graphics::create();
gfx->initHeadless(128, 128);
const auto source = std::filesystem::path(__FILE__).parent_path() / "fixtures/model3d/uv-origin.gltf";
medialoader::ModelLoader loader;
auto scene = loader.loadFromPath(source.string().c_str(), {});
eve::model3d::ModelData model(std::move(scene));
auto* material = model.getScene()->mMaterials[0];
aiString missing("missing-preview-texture.png");
material->AddProperty(&missing, AI_MATKEY_TEXTURE(aiTextureType_BASE_COLOR, 0));
material->AddProperty(&missing, AI_MATKEY_TEXTURE(aiTextureType_DIFFUSE, 0));
auto* entity = eve::model3d::buildRenderable(*gfx, &model, 0);
REQUIRE(entity != nullptr);
REQUIRE(entity->getMaterial()->pbrSurface().textures[0].texture == nullptr);
}