Skip to content

vtkF3DMetaImporter: Fix coloring for skinning, morphing, and such #2172

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Apr 26, 2025
16 changes: 14 additions & 2 deletions application/testing/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,15 @@ f3d_test(NAME TestConfigOrder DATA suzanne.ply ARGS CONFIG ${F3D_SOURCE_DIR}/tes
f3d_test(NAME TestOutputStream DATA suzanne.ply ARGS --verbose=quiet --output=- REGEXP "^.PNG" NO_BASELINE NO_OUTPUT)
f3d_test(NAME TestOutputStreamInfo DATA suzanne.ply ARGS --verbose=info --output=- REGEXP "redirected to stderr" NO_BASELINE NO_OUTPUT)
f3d_test(NAME TestInvalidAntiAliasingMode DATA suzanne.ply ARGS -a --anti-aliasing-mode=foo REGEXP "foo is an invalid antialiasing mode" NO_BASELINE)
f3d_test(NAME TestUserMatrixColoring DATA InterpolationTest.glb ARGS --scalar-coloring --coloring-array=TEXCOORD_0)
f3d_test(NAME TestSkinColoring DATA SimpleSkin.gltf ARGS --scalar-coloring --coloring-array=WEIGHTS_0)
f3d_test(NAME TestMorphColoring DATA SimpleMorph.gltf ARGS --scalar-coloring)
f3d_test(NAME TestAnimationUserMatrixColoring DATA InterpolationTest.glb ARGS --scalar-coloring --coloring-array=TEXCOORD_0 --animation-time=0.5)
f3d_test(NAME TestAnimationSkinColoring DATA SimpleSkin.gltf ARGS --scalar-coloring --coloring-array=WEIGHTS_0 --animation-time=2)
f3d_test(NAME TestAnimationMorphColoring DATA SimpleMorph.gltf ARGS --scalar-coloring --animation-time=0.5)
f3d_test(NAME TestAnimationInputChangeColoring DATA v_rock2.mdl ARGS --scalar-coloring --animation-time=0.01 --animation-index=1)
f3d_test(NAME TestAnimationUserMatrixPointSprites DATA BoxAnimated.gltf ARGS --point-sprites --point-sprites-size=50 --animation-time=2)
f3d_test(NAME TestAnimationInputChangePointSprites DATA v_rock2.mdl ARGS --point-sprites --point-sprites-size=50 --animation-time=0.01 --animation-index=1)

# Color map files testing
f3d_test(NAME TestColorMapFileFullPath DATA dragon.vtu ARGS --colormap-file=${F3D_SOURCE_DIR}/testing/data/viridis8.png --scalar-coloring --coloring-component=1)
Expand Down Expand Up @@ -721,14 +730,17 @@ if(F3D_PLUGIN_BUILD_EXODUS)
# Test animation with generic importer and coloring
f3d_test(NAME TestAnimationGenericImporter DATA small.ex2 ARGS -sb --load-plugins=exodus --animation-time=0.003 --animation-progress)

# Test animation with generic importer, coloring and point sprites
f3d_test(NAME TestAnimationGenericImporterPointSprites DATA small.ex2 ARGS -sbo --load-plugins=exodus --animation-time=0.003 --animation-progress)

# Test animation with generic importer, coloring and a custom scalar range
f3d_test(NAME TestAnimationGenericImporterScalarRange DATA small.ex2 ARGS -sb --load-plugins=exodus --animation-time=0.003 --animation-progress --coloring-range=0,1e7)

# Test Generic Importer Verbose animation with a single frame.
f3d_test(NAME TestVerboseAnimationSingleTimestep DATA single_timestep.e ARGS --load-plugins=exodus --verbose NO_BASELINE REGEXP "0, 0")

# Test no render animation time. Regex contains a part of the range of the ACCL field.
f3d_test(NAME TestNoRenderAnimation DATA small.ex2 ARGS --load-plugins=exodus --animation-time=0.003 REGEXP "-521950, 6.57485" NO_RENDER)
# Test no render animation time. Regex contains a part of the range of the VEL_ field.
f3d_test(NAME TestNoRenderAnimation DATA small.ex2 ARGS --load-plugins=exodus --animation-time=0.003 REGEXP "-994.473, 33.9259" NO_RENDER)

# Test animation time clamping
f3d_test(NAME TestAnimationTimeLimitsHigh DATA small.ex2 ARGS ARGS --load-plugins=exodus --animation-time=10)
Expand Down
4 changes: 2 additions & 2 deletions testing/baselines/TestAnimationGenericImporter.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions testing/baselines/TestAnimationGenericImporterScalarRange.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions testing/baselines/TestAnimationInputChangeColoring.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions testing/baselines/TestAnimationInputChangePointSprites.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions testing/baselines/TestAnimationMorphColoring.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions testing/baselines/TestAnimationSkinColoring.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions testing/baselines/TestAnimationTimeLimitsHigh.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions testing/baselines/TestAnimationTimeLimitsLow.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions testing/baselines/TestAnimationUserMatrixColoring.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions testing/baselines/TestAnimationUserMatrixPointSprites.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions testing/baselines/TestMorphColoring.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions testing/baselines/TestSkinColoring.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions testing/baselines/TestUserMatrixColoring.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions testing/data/small.ex2
Git LFS file not shown
27 changes: 26 additions & 1 deletion vtkext/private/module/vtkF3DMetaImporter.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <numeric>
#include <vector>

//----------------------------------------------------------------------------
struct vtkF3DMetaImporter::Internals
{
// Actors related vectors
Expand All @@ -44,6 +45,7 @@ struct vtkF3DMetaImporter::Internals
#endif
};

//----------------------------------------------------------------------------
vtkStandardNewMacro(vtkF3DMetaImporter);

//----------------------------------------------------------------------------
Expand Down Expand Up @@ -250,7 +252,7 @@ bool vtkF3DMetaImporter::Update()

// Create and configure point sprites actors
this->Pimpl->PointSpritesActorsAndMappers.emplace_back(
vtkF3DMetaImporter::PointSpritesStruct());
vtkF3DMetaImporter::PointSpritesStruct(actor, importer));
vtkF3DMetaImporter::PointSpritesStruct& pss =
this->Pimpl->PointSpritesActorsAndMappers.back();

Expand Down Expand Up @@ -502,6 +504,29 @@ bool vtkF3DMetaImporter::UpdateAtTimeValue(double timeValue)
importerPair.Importer->UpdateTimeStep(timeValue);
#endif
}

// Update coloring and point sprites
for (auto& cs : this->Pimpl->ColoringActorsAndMappers)
{
cs.Mapper->SetInputData(
vtkPolyDataMapper::SafeDownCast(cs.OriginalActor->GetMapper())->GetInput());

bool visi = cs.Actor->GetVisibility();
cs.Actor->vtkProp3D::ShallowCopy(cs.OriginalActor);
cs.Actor->SetVisibility(visi);
}
for (auto& pss : this->Pimpl->PointSpritesActorsAndMappers)
{
if (!vtkF3DGenericImporter::SafeDownCast(pss.Importer))
{
pss.Mapper->SetInputData(
vtkPolyDataMapper::SafeDownCast(pss.OriginalActor->GetMapper())->GetInput());
bool visi = pss.Actor->GetVisibility();
pss.Actor->vtkProp3D::ShallowCopy(pss.OriginalActor);
pss.Actor->SetVisibility(visi);
}
}

this->Pimpl->UpdateTime.Modified();
return ret;
}
Expand Down
8 changes: 7 additions & 1 deletion vtkext/private/module/vtkF3DMetaImporter.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,18 @@ class vtkF3DMetaImporter : public vtkF3DImporter

struct PointSpritesStruct
{
PointSpritesStruct()
explicit PointSpritesStruct(vtkActor* originalActor, vtkImporter* importer)
: OriginalActor(originalActor)
, Importer(importer)
{
this->Actor->vtkProp3D::ShallowCopy(originalActor);
this->Actor->SetMapper(this->Mapper);
}

vtkNew<vtkActor> Actor;
vtkNew<vtkPointGaussianMapper> Mapper;
vtkActor* OriginalActor;
vtkImporter* Importer;
};

struct ColoringStruct
Expand All @@ -67,6 +72,7 @@ class vtkF3DMetaImporter : public vtkF3DImporter
this->Actor->GetProperty()->SetLineWidth(1.0);
this->Actor->GetProperty()->SetRoughness(0.3);
this->Actor->GetProperty()->SetInterpolationToPBR();
this->Actor->vtkProp3D::ShallowCopy(originalActor);
this->Actor->SetMapper(this->Mapper);
this->Mapper->InterpolateScalarsBeforeMappingOn();
}
Expand Down
8 changes: 5 additions & 3 deletions vtkext/private/module/vtkF3DRenderer.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -2104,7 +2104,7 @@ void vtkF3DRenderer::ConfigureActorsProperties()
}
}

for ([[maybe_unused]] const auto& [actor, mapper] :
for ([[maybe_unused]] const auto& [actor, mapper, originalActor, importer] :
this->Importer->GetPointSpritesActorsAndMappers())
{
if (surfaceColor)
Expand Down Expand Up @@ -2146,7 +2146,8 @@ void vtkF3DRenderer::SetPointSpritesProperties(SplatType type, double pointSprit
scaleFactor = pointSpritesSize * bbox.GetDiagonalLength() * 0.001;
}

for (const auto& [actor, mapper] : this->Importer->GetPointSpritesActorsAndMappers())
for (const auto& [actor, mapper, originalActor, importer] :
this->Importer->GetPointSpritesActorsAndMappers())
{

mapper->EmissiveOff();
Expand Down Expand Up @@ -2412,7 +2413,8 @@ void vtkF3DRenderer::ConfigureColoring()

// Handle point sprites
bool pointSpritesVisible = !this->UseRaytracing && !this->UseVolume && this->UsePointSprites;
for (const auto& [actor, mapper] : this->Importer->GetPointSpritesActorsAndMappers())
for (const auto& [actor, mapper, originalActor, importer] :
this->Importer->GetPointSpritesActorsAndMappers())
{
actor->SetVisibility(pointSpritesVisible);
if (pointSpritesVisible)
Expand Down