Merge topic 'anari_attribute_names'

14deacbdd add attribute names via USD extension

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Kenneth Moreland <morelandkd@ornl.gov>
Merge-request: !3205
This commit is contained in:
Jefferson Amstutz 2024-03-05 14:00:03 +00:00 committed by Kitware Robot
commit 3b598ff884
4 changed files with 111 additions and 0 deletions

@ -80,6 +80,20 @@ static PointsFieldArrays UnpackFields(FieldSet fields)
retval.Field3 = makeFieldArray(fields[2], retval.NumberOfField3Components);
retval.Field4 = makeFieldArray(fields[3], retval.NumberOfField4Components);
auto isFieldEmpty = [](const vtkm::cont::Field& f) -> bool {
return f.GetNumberOfValues() == 0 || f.GetData().GetNumberOfComponentsFlat() != 1 ||
!f.GetData().CanConvert<AttributeHandleT>();
};
if (!isFieldEmpty(fields[0]))
retval.Field1Name = fields[0].GetName();
if (!isFieldEmpty(fields[1]))
retval.Field2Name = fields[1].GetName();
if (!isFieldEmpty(fields[2]))
retval.Field3Name = fields[2].GetName();
if (!isFieldEmpty(fields[3]))
retval.Field4Name = fields[3].GetName();
return retval;
}
@ -300,6 +314,11 @@ void ANARIMapperPoints::ConstructArrays(bool regenerate)
this->Handles->Parameters.Vertex.Attribute[3] =
createANARIArray(d, fieldArrays.Field4, fieldArrays.Token);
this->Handles->Parameters.Vertex.AttributeName[0] = fieldArrays.Field1Name;
this->Handles->Parameters.Vertex.AttributeName[1] = fieldArrays.Field2Name;
this->Handles->Parameters.Vertex.AttributeName[2] = fieldArrays.Field3Name;
this->Handles->Parameters.Vertex.AttributeName[3] = fieldArrays.Field4Name;
this->UpdateGeometry();
this->UpdateMaterial();
@ -323,6 +342,10 @@ void ANARIMapperPoints::UpdateGeometry()
anari_cpp::unsetParameter(d, this->Handles->Geometry, "vertex.attribute1");
anari_cpp::unsetParameter(d, this->Handles->Geometry, "vertex.attribute2");
anari_cpp::unsetParameter(d, this->Handles->Geometry, "vertex.attribute3");
anari_cpp::unsetParameter(d, this->Handles->Geometry, "usd::attribute0.name");
anari_cpp::unsetParameter(d, this->Handles->Geometry, "usd::attribute1.name");
anari_cpp::unsetParameter(d, this->Handles->Geometry, "usd::attribute2.name");
anari_cpp::unsetParameter(d, this->Handles->Geometry, "usd::attribute3.name");
anari_cpp::setParameter(d, this->Handles->Geometry, "name", this->MakeObjectName("geometry"));
@ -334,6 +357,8 @@ void ANARIMapperPoints::UpdateGeometry()
d, this->Handles->Geometry, "vertex.radius", this->Handles->Parameters.Vertex.Radius);
if (this->GetMapFieldAsAttribute())
{
// Attributes //
anari_cpp::setParameter(d,
this->Handles->Geometry,
"vertex.attribute0",
@ -350,6 +375,37 @@ void ANARIMapperPoints::UpdateGeometry()
this->Handles->Geometry,
"vertex.attribute3",
this->Handles->Parameters.Vertex.Attribute[3]);
// Attribute names for USD //
if (!this->Handles->Parameters.Vertex.AttributeName[0].empty())
{
anari_cpp::setParameter(d,
this->Handles->Geometry,
"usd::attribute0.name",
this->Handles->Parameters.Vertex.AttributeName[0]);
}
if (!this->Handles->Parameters.Vertex.AttributeName[1].empty())
{
anari_cpp::setParameter(d,
this->Handles->Geometry,
"usd::attribute1.name",
this->Handles->Parameters.Vertex.AttributeName[1]);
}
if (!this->Handles->Parameters.Vertex.AttributeName[2].empty())
{
anari_cpp::setParameter(d,
this->Handles->Geometry,
"usd::attribute2.name",
this->Handles->Parameters.Vertex.AttributeName[2]);
}
if (!this->Handles->Parameters.Vertex.AttributeName[3].empty())
{
anari_cpp::setParameter(d,
this->Handles->Geometry,
"usd::attribute3.name",
this->Handles->Parameters.Vertex.AttributeName[3]);
}
}
}

@ -30,6 +30,7 @@ struct PointsParameters
anari_cpp::Array1D Position{ nullptr };
anari_cpp::Array1D Radius{ nullptr };
std::array<anari_cpp::Array1D, 4> Attribute;
std::array<std::string, 4> AttributeName;
} Vertex{};
unsigned int NumPrimitives{ 0 };
@ -50,12 +51,16 @@ struct PointsFieldArrays
{
vtkm::cont::ArrayHandleRuntimeVec<vtkm::Float32> Field1;
int NumberOfField1Components{ 1 };
std::string Field1Name;
vtkm::cont::ArrayHandleRuntimeVec<vtkm::Float32> Field2;
int NumberOfField2Components{ 1 };
std::string Field2Name;
vtkm::cont::ArrayHandleRuntimeVec<vtkm::Float32> Field3;
int NumberOfField3Components{ 1 };
std::string Field3Name;
vtkm::cont::ArrayHandleRuntimeVec<vtkm::Float32> Field4;
int NumberOfField4Components{ 1 };
std::string Field4Name;
std::shared_ptr<vtkm::cont::Token> Token{ new vtkm::cont::Token };
};

@ -214,18 +214,22 @@ static TriangleFieldArrays UnpackFields(vtkm::cont::ArrayHandle<vtkm::Id4> tris,
if (!emptyField1)
{
retval.Field1.Allocate(numTris * 3);
retval.Field1Name = fields[0].GetName();
}
if (!emptyField2)
{
retval.Field2.Allocate(numTris * 3);
retval.Field2Name = fields[1].GetName();
}
if (!emptyField3)
{
retval.Field3.Allocate(numTris * 3);
retval.Field3Name = fields[2].GetName();
}
if (!emptyField4)
{
retval.Field4.Allocate(numTris * 3);
retval.Field4Name = fields[3].GetName();
}
ExtractTriangleFields fieldsWorklet(emptyField1,
@ -459,24 +463,28 @@ void ANARIMapperTriangles::ConstructArrays(bool regenerate)
auto* a = (float*)fieldArrays.Field1.GetBuffers()[0].ReadPointerHost(*fieldArrays.Token);
this->Handles->Parameters.Vertex.Attribute[0] =
anari_cpp::newArray1D(d, a, NoopANARIDeleter, nullptr, numVerts);
this->Handles->Parameters.Vertex.AttributeName[0] = fieldArrays.Field1Name;
}
if (fieldArrays.Field2.GetNumberOfValues() != 0)
{
auto* a = (float*)fieldArrays.Field2.GetBuffers()[0].ReadPointerHost(*fieldArrays.Token);
this->Handles->Parameters.Vertex.Attribute[1] =
anari_cpp::newArray1D(d, a, NoopANARIDeleter, nullptr, numVerts);
this->Handles->Parameters.Vertex.AttributeName[1] = fieldArrays.Field2Name;
}
if (fieldArrays.Field3.GetNumberOfValues() != 0)
{
auto* a = (float*)fieldArrays.Field3.GetBuffers()[0].ReadPointerHost(*fieldArrays.Token);
this->Handles->Parameters.Vertex.Attribute[2] =
anari_cpp::newArray1D(d, a, NoopANARIDeleter, nullptr, numVerts);
this->Handles->Parameters.Vertex.AttributeName[2] = fieldArrays.Field3Name;
}
if (fieldArrays.Field4.GetNumberOfValues() != 0)
{
auto* a = (float*)fieldArrays.Field4.GetBuffers()[0].ReadPointerHost(*fieldArrays.Token);
this->Handles->Parameters.Vertex.Attribute[3] =
anari_cpp::newArray1D(d, a, NoopANARIDeleter, nullptr, numVerts);
this->Handles->Parameters.Vertex.AttributeName[3] = fieldArrays.Field4Name;
}
if (this->CalculateNormals)
{
@ -519,6 +527,10 @@ void ANARIMapperTriangles::UpdateGeometry()
anari_cpp::unsetParameter(d, this->Handles->Geometry, "vertex.attribute3");
anari_cpp::unsetParameter(d, this->Handles->Geometry, "vertex.normal");
anari_cpp::unsetParameter(d, this->Handles->Geometry, "primitive.index");
anari_cpp::unsetParameter(d, this->Handles->Geometry, "usd::attribute0.name");
anari_cpp::unsetParameter(d, this->Handles->Geometry, "usd::attribute1.name");
anari_cpp::unsetParameter(d, this->Handles->Geometry, "usd::attribute2.name");
anari_cpp::unsetParameter(d, this->Handles->Geometry, "usd::attribute3.name");
anari_cpp::setParameter(d, this->Handles->Geometry, "name", this->MakeObjectName("geometry"));
@ -528,6 +540,8 @@ void ANARIMapperTriangles::UpdateGeometry()
d, this->Handles->Geometry, "vertex.position", this->Handles->Parameters.Vertex.Position);
if (this->GetMapFieldAsAttribute())
{
// Attributes //
anari_cpp::setParameter(d,
this->Handles->Geometry,
"vertex.attribute0",
@ -544,6 +558,37 @@ void ANARIMapperTriangles::UpdateGeometry()
this->Handles->Geometry,
"vertex.attribute3",
this->Handles->Parameters.Vertex.Attribute[3]);
// Attribute names for USD //
if (!this->Handles->Parameters.Vertex.AttributeName[0].empty())
{
anari_cpp::setParameter(d,
this->Handles->Geometry,
"usd::attribute0.name",
this->Handles->Parameters.Vertex.AttributeName[0]);
}
if (!this->Handles->Parameters.Vertex.AttributeName[1].empty())
{
anari_cpp::setParameter(d,
this->Handles->Geometry,
"usd::attribute1.name",
this->Handles->Parameters.Vertex.AttributeName[1]);
}
if (!this->Handles->Parameters.Vertex.AttributeName[2].empty())
{
anari_cpp::setParameter(d,
this->Handles->Geometry,
"usd::attribute2.name",
this->Handles->Parameters.Vertex.AttributeName[2]);
}
if (!this->Handles->Parameters.Vertex.AttributeName[3].empty())
{
anari_cpp::setParameter(d,
this->Handles->Geometry,
"usd::attribute3.name",
this->Handles->Parameters.Vertex.AttributeName[3]);
}
}
if (CalculateNormals)

@ -29,6 +29,7 @@ struct TrianglesParameters
anari_cpp::Array1D Position{ nullptr };
anari_cpp::Array1D Normal{ nullptr };
std::array<anari_cpp::Array1D, 4> Attribute;
std::array<std::string, 4> AttributeName;
} Vertex{};
struct PrimitiveData
@ -53,9 +54,13 @@ struct TriangleArrays
struct TriangleFieldArrays
{
vtkm::cont::ArrayHandle<vtkm::Float32> Field1;
std::string Field1Name;
vtkm::cont::ArrayHandle<vtkm::Float32> Field2;
std::string Field2Name;
vtkm::cont::ArrayHandle<vtkm::Float32> Field3;
std::string Field3Name;
vtkm::cont::ArrayHandle<vtkm::Float32> Field4;
std::string Field4Name;
std::shared_ptr<vtkm::cont::Token> Token{ new vtkm::cont::Token };
};