Skip to content
Snippets Groups Projects
Commit ff9f2cb8 authored by Hong Li's avatar Hong Li
Browse files

Add support for texture coordinates runtime modification for surfaceMesh

parent da9cec11
No related branches found
No related tags found
No related merge requests found
......@@ -101,18 +101,7 @@ VTKSurfaceMeshRenderDelegate::VTKSurfaceMeshRenderDelegate(std::shared_ptr<Visua
// Map TCoords
if (m_geometry->getVertexTCoords() != nullptr)
{
m_mappedTCoordsArray = vtkFloatArray::SafeDownCast(GeometryUtils::coupleVtkDataArray(m_geometry->getVertexTCoords()));
m_mappedTCoordsArray->SetName(m_geometry->getActiveVertexTCoords().c_str());
m_polydata->GetPointData()->SetTCoords(m_mappedTCoordsArray);
// Map Tangents
if (m_geometry->getVertexTangents() == nullptr)
{
m_geometry->computeVertexTangents();
}
// These need to be float for PBR
m_mappedTangentArray = vtkFloatArray::SafeDownCast(GeometryUtils::coupleVtkDataArray(m_geometry->getVertexTangents()));
m_polydata->GetPointData()->SetTangents(m_mappedTangentArray);
setTextureCoordinateBuffer(m_geometry->getVertexTCoords());
}
// When geometry is modified, update data source, mostly for when an entirely new array/buffer was set
......@@ -220,6 +209,8 @@ VTKSurfaceMeshRenderDelegate::vertexDataModified(Event* imstkNotUsed(e))
m_geometry->computeVertexNormals();
setNormalBuffer(m_geometry->getVertexNormals());
}
setTextureCoordinateBuffer(m_geometry->getVertexTCoords());
}
void
......@@ -246,6 +237,12 @@ VTKSurfaceMeshRenderDelegate::cellScalarsModified(Event* imstkNotUsed(e))
setCellScalarBuffer(m_geometry->getCellScalars());
}
void
VTKSurfaceMeshRenderDelegate::textureCoordinatesModified(Event* imstkNotUsed(e))
{
setTextureCoordinateBuffer(m_geometry->getVertexTCoords());
}
void
VTKSurfaceMeshRenderDelegate::geometryModified(Event* imstkNotUsed(e))
{
......@@ -284,6 +281,11 @@ VTKSurfaceMeshRenderDelegate::geometryModified(Event* imstkNotUsed(e))
{
setCellScalarBuffer(m_geometry->getCellScalars());
}
if (m_textureCoordinates != m_geometry->getVertexTCoords())
{
setTextureCoordinateBuffer(m_geometry->getVertexTCoords());
}
}
void
......@@ -426,6 +428,41 @@ VTKSurfaceMeshRenderDelegate::setCellScalarBuffer(std::shared_ptr<AbstractDataAr
m_mappedCellScalarArray->Modified();
}
void
VTKSurfaceMeshRenderDelegate::setTextureCoordinateBuffer(std::shared_ptr<AbstractDataArray> textureCoordinates)
{
// If the buffer changed
if (m_textureCoordinates != textureCoordinates)
{
// If previous buffer exist
if (m_textureCoordinates != nullptr)
{
// stop observing its changes
disconnect(m_textureCoordinates, this, &AbstractDataArray::modified);
}
// Set new buffer and observe
m_textureCoordinates = textureCoordinates;
queueConnect<Event>(m_textureCoordinates, &AbstractDataArray::modified, this, &VTKSurfaceMeshRenderDelegate::textureCoordinatesModified);
m_mappedTCoordsArray = vtkFloatArray::SafeDownCast(GeometryUtils::coupleVtkDataArray(textureCoordinates));
m_mappedTCoordsArray->SetName(m_geometry->getActiveVertexTCoords().c_str());
m_polydata->GetPointData()->SetTCoords(m_mappedTCoordsArray);
}
m_mappedTCoordsArray->SetNumberOfComponents(m_textureCoordinates->getNumberOfComponents());
m_mappedTCoordsArray->SetVoidArray(m_textureCoordinates->getVoidPointer(), static_cast<vtkIdType>(m_textureCoordinates->size()), 1);
m_mappedTCoordsArray->Modified();
// Map Tangents
if (m_geometry->getVertexTangents() == nullptr)
{
m_geometry->computeVertexTangents();
}
// These need to be float for PBR
m_mappedTangentArray = vtkFloatArray::SafeDownCast(GeometryUtils::coupleVtkDataArray(m_geometry->getVertexTangents()));
m_polydata->GetPointData()->SetTangents(m_mappedTangentArray);
m_mappedTangentArray->Modified();
}
void
VTKSurfaceMeshRenderDelegate::initializeTextures()
{
......
......@@ -68,6 +68,7 @@ protected:
void normalDataModified(Event* e);
void vertexScalarsModified(Event* e);
void cellScalarsModified(Event* e);
void textureCoordinatesModified(Event* e);
///
/// \brief Callback for when geometry is modified
......@@ -85,6 +86,7 @@ protected:
void setIndexBuffer(std::shared_ptr<VecDataArray<int, 3>> indices);
void setVertexScalarBuffer(std::shared_ptr<AbstractDataArray> scalars);
void setCellScalarBuffer(std::shared_ptr<AbstractDataArray> scalars);
void setTextureCoordinateBuffer(std::shared_ptr<AbstractDataArray> textureCoordinates);
protected:
std::shared_ptr<SurfaceMesh> m_geometry;
......@@ -93,6 +95,7 @@ protected:
std::shared_ptr<VecDataArray<int, 3>> m_indices;
std::shared_ptr<AbstractDataArray> m_vertexScalars;
std::shared_ptr<AbstractDataArray> m_cellScalars;
std::shared_ptr<AbstractDataArray> m_textureCoordinates;
vtkSmartPointer<vtkPolyData> m_polydata;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment