mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 03:17:02 +02:00
Do not pass in whole hfm::Model by reference to tangent calculation prep steps
This commit is contained in:
parent
fe60b8e69b
commit
64ef8b6919
5 changed files with 13 additions and 11 deletions
|
@ -25,7 +25,7 @@ namespace baker {
|
||||||
class GetModelPartsTask {
|
class GetModelPartsTask {
|
||||||
public:
|
public:
|
||||||
using Input = hfm::Model::Pointer;
|
using Input = hfm::Model::Pointer;
|
||||||
using Output = VaryingSet4<std::vector<hfm::Mesh>, hifi::URL, baker::MeshIndicesToModelNames, baker::BlendshapesPerMesh>;
|
using Output = VaryingSet5<std::vector<hfm::Mesh>, hifi::URL, baker::MeshIndicesToModelNames, baker::BlendshapesPerMesh, QHash<QString, hfm::Material>>;
|
||||||
using JobModel = Job::ModelIO<GetModelPartsTask, Input, Output>;
|
using JobModel = Job::ModelIO<GetModelPartsTask, Input, Output>;
|
||||||
|
|
||||||
void run(const BakeContextPointer& context, const Input& input, Output& output) {
|
void run(const BakeContextPointer& context, const Input& input, Output& output) {
|
||||||
|
@ -38,6 +38,7 @@ namespace baker {
|
||||||
for (int i = 0; i < hfmModelIn->meshes.size(); i++) {
|
for (int i = 0; i < hfmModelIn->meshes.size(); i++) {
|
||||||
blendshapesPerMesh.push_back(hfmModelIn->meshes[i].blendshapes.toStdVector());
|
blendshapesPerMesh.push_back(hfmModelIn->meshes[i].blendshapes.toStdVector());
|
||||||
}
|
}
|
||||||
|
output.edit4() = hfmModelIn->materials;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -121,15 +122,16 @@ namespace baker {
|
||||||
const auto url = modelPartsIn.getN<GetModelPartsTask::Output>(1);
|
const auto url = modelPartsIn.getN<GetModelPartsTask::Output>(1);
|
||||||
const auto meshIndicesToModelNames = modelPartsIn.getN<GetModelPartsTask::Output>(2);
|
const auto meshIndicesToModelNames = modelPartsIn.getN<GetModelPartsTask::Output>(2);
|
||||||
const auto blendshapesPerMeshIn = modelPartsIn.getN<GetModelPartsTask::Output>(3);
|
const auto blendshapesPerMeshIn = modelPartsIn.getN<GetModelPartsTask::Output>(3);
|
||||||
|
const auto materials = modelPartsIn.getN<GetModelPartsTask::Output>(4);
|
||||||
|
|
||||||
// Calculate normals and tangents for meshes and blendshapes if they do not exist
|
// Calculate normals and tangents for meshes and blendshapes if they do not exist
|
||||||
// Note: Normals are never calculated here for OBJ models. OBJ files optionally define normals on a per-face basis, so for consistency normals are calculated beforehand in OBJSerializer.
|
// Note: Normals are never calculated here for OBJ models. OBJ files optionally define normals on a per-face basis, so for consistency normals are calculated beforehand in OBJSerializer.
|
||||||
const auto normalsPerMesh = model.addJob<CalculateMeshNormalsTask>("CalculateMeshNormals", meshesIn);
|
const auto normalsPerMesh = model.addJob<CalculateMeshNormalsTask>("CalculateMeshNormals", meshesIn);
|
||||||
const auto calculateMeshTangentsInputs = CalculateMeshTangentsTask::Input(normalsPerMesh, meshesIn, hfmModelIn).asVarying();
|
const auto calculateMeshTangentsInputs = CalculateMeshTangentsTask::Input(normalsPerMesh, meshesIn, materials).asVarying();
|
||||||
const auto tangentsPerMesh = model.addJob<CalculateMeshTangentsTask>("CalculateMeshTangents", calculateMeshTangentsInputs);
|
const auto tangentsPerMesh = model.addJob<CalculateMeshTangentsTask>("CalculateMeshTangents", calculateMeshTangentsInputs);
|
||||||
const auto calculateBlendshapeNormalsInputs = CalculateBlendshapeNormalsTask::Input(blendshapesPerMeshIn, meshesIn).asVarying();
|
const auto calculateBlendshapeNormalsInputs = CalculateBlendshapeNormalsTask::Input(blendshapesPerMeshIn, meshesIn).asVarying();
|
||||||
const auto normalsPerBlendshapePerMesh = model.addJob<CalculateBlendshapeNormalsTask>("CalculateBlendshapeNormals", calculateBlendshapeNormalsInputs);
|
const auto normalsPerBlendshapePerMesh = model.addJob<CalculateBlendshapeNormalsTask>("CalculateBlendshapeNormals", calculateBlendshapeNormalsInputs);
|
||||||
const auto calculateBlendshapeTangentsInputs = CalculateBlendshapeTangentsTask::Input(normalsPerBlendshapePerMesh, blendshapesPerMeshIn, meshesIn, hfmModelIn).asVarying();
|
const auto calculateBlendshapeTangentsInputs = CalculateBlendshapeTangentsTask::Input(normalsPerBlendshapePerMesh, blendshapesPerMeshIn, meshesIn, materials).asVarying();
|
||||||
const auto tangentsPerBlendshapePerMesh = model.addJob<CalculateBlendshapeTangentsTask>("CalculateBlendshapeTangents", calculateBlendshapeTangentsInputs);
|
const auto tangentsPerBlendshapePerMesh = model.addJob<CalculateBlendshapeTangentsTask>("CalculateBlendshapeTangents", calculateBlendshapeTangentsInputs);
|
||||||
|
|
||||||
// Build the graphics::MeshPointer for each hfm::Mesh
|
// Build the graphics::MeshPointer for each hfm::Mesh
|
||||||
|
|
|
@ -19,7 +19,7 @@ void CalculateBlendshapeTangentsTask::run(const baker::BakeContextPointer& conte
|
||||||
const auto& normalsPerBlendshapePerMesh = input.get0();
|
const auto& normalsPerBlendshapePerMesh = input.get0();
|
||||||
const auto& blendshapesPerMesh = input.get1();
|
const auto& blendshapesPerMesh = input.get1();
|
||||||
const auto& meshes = input.get2();
|
const auto& meshes = input.get2();
|
||||||
const hfm::Model& model = *input.get3();
|
const auto& materials = input.get3();
|
||||||
auto& tangentsPerBlendshapePerMeshOut = output;
|
auto& tangentsPerBlendshapePerMeshOut = output;
|
||||||
|
|
||||||
tangentsPerBlendshapePerMeshOut.reserve(normalsPerBlendshapePerMesh.size());
|
tangentsPerBlendshapePerMeshOut.reserve(normalsPerBlendshapePerMesh.size());
|
||||||
|
@ -33,8 +33,8 @@ void CalculateBlendshapeTangentsTask::run(const baker::BakeContextPointer& conte
|
||||||
// Check if we actually need to calculate the tangents, or just append empty arrays
|
// Check if we actually need to calculate the tangents, or just append empty arrays
|
||||||
bool needTangents = false;
|
bool needTangents = false;
|
||||||
for (const auto& meshPart : mesh.parts) {
|
for (const auto& meshPart : mesh.parts) {
|
||||||
auto materialIt = model.materials.find(meshPart.materialID);
|
auto materialIt = materials.find(meshPart.materialID);
|
||||||
if (materialIt != model.materials.end() && (*materialIt).needTangentSpace()) {
|
if (materialIt != materials.end() && (*materialIt).needTangentSpace()) {
|
||||||
needTangents = true;
|
needTangents = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
// Calculate blendshape tangents if not already present in the blendshape
|
// Calculate blendshape tangents if not already present in the blendshape
|
||||||
class CalculateBlendshapeTangentsTask {
|
class CalculateBlendshapeTangentsTask {
|
||||||
public:
|
public:
|
||||||
using Input = baker::VaryingSet4<std::vector<baker::NormalsPerBlendshape>, baker::BlendshapesPerMesh, std::vector<hfm::Mesh>, hfm::Model::Pointer>;
|
using Input = baker::VaryingSet4<std::vector<baker::NormalsPerBlendshape>, baker::BlendshapesPerMesh, std::vector<hfm::Mesh>, QHash<QString, hfm::Material>>;
|
||||||
using Output = std::vector<baker::TangentsPerBlendshape>;
|
using Output = std::vector<baker::TangentsPerBlendshape>;
|
||||||
using JobModel = baker::Job::ModelIO<CalculateBlendshapeTangentsTask, Input, Output>;
|
using JobModel = baker::Job::ModelIO<CalculateBlendshapeTangentsTask, Input, Output>;
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
void CalculateMeshTangentsTask::run(const baker::BakeContextPointer& context, const Input& input, Output& output) {
|
void CalculateMeshTangentsTask::run(const baker::BakeContextPointer& context, const Input& input, Output& output) {
|
||||||
const auto& normalsPerMesh = input.get0();
|
const auto& normalsPerMesh = input.get0();
|
||||||
const std::vector<hfm::Mesh>& meshes = input.get1();
|
const std::vector<hfm::Mesh>& meshes = input.get1();
|
||||||
const hfm::Model& model = *input.get2();
|
const auto& materials = input.get2();
|
||||||
auto& tangentsPerMeshOut = output;
|
auto& tangentsPerMeshOut = output;
|
||||||
|
|
||||||
tangentsPerMeshOut.reserve(meshes.size());
|
tangentsPerMeshOut.reserve(meshes.size());
|
||||||
|
@ -42,8 +42,8 @@ void CalculateMeshTangentsTask::run(const baker::BakeContextPointer& context, co
|
||||||
// Check if we actually need to calculate the tangents
|
// Check if we actually need to calculate the tangents
|
||||||
bool needTangents = false;
|
bool needTangents = false;
|
||||||
for (const auto& meshPart : mesh.parts) {
|
for (const auto& meshPart : mesh.parts) {
|
||||||
auto materialIt = model.materials.find(meshPart.materialID);
|
auto materialIt = materials.find(meshPart.materialID);
|
||||||
if (materialIt != model.materials.end() && (*materialIt).needTangentSpace()) {
|
if (materialIt != materials.end() && (*materialIt).needTangentSpace()) {
|
||||||
needTangents = true;
|
needTangents = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ class CalculateMeshTangentsTask {
|
||||||
public:
|
public:
|
||||||
using NormalsPerMesh = std::vector<std::vector<glm::vec3>>;
|
using NormalsPerMesh = std::vector<std::vector<glm::vec3>>;
|
||||||
|
|
||||||
using Input = baker::VaryingSet3<baker::NormalsPerMesh, std::vector<hfm::Mesh>, hfm::Model::Pointer>;
|
using Input = baker::VaryingSet3<baker::NormalsPerMesh, std::vector<hfm::Mesh>, QHash<QString, hfm::Material>>;
|
||||||
using Output = baker::TangentsPerMesh;
|
using Output = baker::TangentsPerMesh;
|
||||||
using JobModel = baker::Job::ModelIO<CalculateMeshTangentsTask, Input, Output>;
|
using JobModel = baker::Job::ModelIO<CalculateMeshTangentsTask, Input, Output>;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue