USD: more efficient mesh & curve writing

- The default value of USD attributes is now only set on the first sample.
  Previously this was done for every sample (so the final default was the
  last value, rather than the first value).
- More use of the sparse value writer, now also for UV coordinates, mesh
  normals, and curve points.
This commit is contained in:
Sybren A. Stüvel 2019-12-13 13:00:41 +01:00
parent 02f23ab685
commit f5e00f7351
2 changed files with 43 additions and 11 deletions

View File

@ -66,8 +66,14 @@ void USDHairWriter::do_write(HierarchyContext &context)
}
}
curves.CreatePointsAttr().Set(points, timecode);
curves.CreateCurveVertexCountsAttr().Set(curve_point_counts, timecode);
pxr::UsdAttribute attr_points = curves.CreatePointsAttr(pxr::VtValue(), true);
pxr::UsdAttribute attr_vertex_counts = curves.CreateCurveVertexCountsAttr(pxr::VtValue(), true);
if (!attr_points.HasValue()) {
attr_points.Set(points, pxr::UsdTimeCode::Default());
attr_vertex_counts.Set(curve_point_counts, pxr::UsdTimeCode::Default());
}
usd_value_writer_.SetAttribute(attr_points, pxr::VtValue(points), timecode);
usd_value_writer_.SetAttribute(attr_vertex_counts, pxr::VtValue(curve_point_counts), timecode);
if (psys->totpart > 0) {
pxr::VtArray<pxr::GfVec3f> colors;

View File

@ -153,13 +153,19 @@ void USDGenericMeshWriter::write_uv_maps(const Mesh *mesh, pxr::UsdGeomMesh usd_
for (int loop_idx = 0; loop_idx < mesh->totloop; loop_idx++) {
uv_coords.push_back(pxr::GfVec2f(mloopuv[loop_idx].uv));
}
uv_coords_primvar.Set(uv_coords, timecode);
if (!uv_coords_primvar.HasValue()) {
uv_coords_primvar.Set(uv_coords, pxr::UsdTimeCode::Default());
}
const pxr::UsdAttribute &uv_coords_attr = uv_coords_primvar.GetAttr();
usd_value_writer_.SetAttribute(uv_coords_attr, pxr::VtValue(uv_coords), timecode);
}
}
void USDGenericMeshWriter::write_mesh(HierarchyContext &context, Mesh *mesh)
{
pxr::UsdTimeCode timecode = get_export_time_code();
pxr::UsdTimeCode defaultTime = pxr::UsdTimeCode::Default();
pxr::UsdStageRefPtr stage = usd_export_context_.stage;
const pxr::SdfPath &usd_path = usd_export_context_.usd_path;
@ -194,9 +200,19 @@ void USDGenericMeshWriter::write_mesh(HierarchyContext &context, Mesh *mesh)
return;
}
pxr::UsdAttribute attr_points = usd_mesh.CreatePointsAttr();
pxr::UsdAttribute attr_face_vertex_counts = usd_mesh.CreateFaceVertexCountsAttr();
pxr::UsdAttribute attr_face_vertex_indices = usd_mesh.CreateFaceVertexIndicesAttr();
pxr::UsdAttribute attr_points = usd_mesh.CreatePointsAttr(pxr::VtValue(), true);
pxr::UsdAttribute attr_face_vertex_counts = usd_mesh.CreateFaceVertexCountsAttr(pxr::VtValue(),
true);
pxr::UsdAttribute attr_face_vertex_indices = usd_mesh.CreateFaceVertexIndicesAttr(pxr::VtValue(),
true);
if (!attr_points.HasValue()) {
// Provide the initial value as default. This makes USD write the value as constant if they
// don't change over time.
attr_points.Set(usd_mesh_data.points, defaultTime);
attr_face_vertex_counts.Set(usd_mesh_data.face_vertex_counts, defaultTime);
attr_face_vertex_indices.Set(usd_mesh_data.face_indices, defaultTime);
}
usd_value_writer_.SetAttribute(attr_points, pxr::VtValue(usd_mesh_data.points), timecode);
usd_value_writer_.SetAttribute(
@ -205,9 +221,16 @@ void USDGenericMeshWriter::write_mesh(HierarchyContext &context, Mesh *mesh)
attr_face_vertex_indices, pxr::VtValue(usd_mesh_data.face_indices), timecode);
if (!usd_mesh_data.crease_lengths.empty()) {
pxr::UsdAttribute attr_crease_lengths = usd_mesh.CreateCreaseLengthsAttr();
pxr::UsdAttribute attr_crease_indices = usd_mesh.CreateCreaseIndicesAttr();
pxr::UsdAttribute attr_crease_sharpness = usd_mesh.CreateCreaseSharpnessesAttr();
pxr::UsdAttribute attr_crease_lengths = usd_mesh.CreateCreaseLengthsAttr(pxr::VtValue(), true);
pxr::UsdAttribute attr_crease_indices = usd_mesh.CreateCreaseIndicesAttr(pxr::VtValue(), true);
pxr::UsdAttribute attr_crease_sharpness = usd_mesh.CreateCreaseSharpnessesAttr(pxr::VtValue(),
true);
if (!attr_crease_lengths.HasValue()) {
attr_crease_lengths.Set(usd_mesh_data.crease_lengths, defaultTime);
attr_crease_indices.Set(usd_mesh_data.crease_vertex_indices, defaultTime);
attr_crease_sharpness.Set(usd_mesh_data.crease_sharpnesses, defaultTime);
}
usd_value_writer_.SetAttribute(
attr_crease_lengths, pxr::VtValue(usd_mesh_data.crease_lengths), timecode);
@ -404,8 +427,11 @@ void USDGenericMeshWriter::write_normals(const Mesh *mesh, pxr::UsdGeomMesh usd_
}
}
pxr::UsdAttribute attr_normals = usd_mesh.CreateNormalsAttr(pxr::VtValue(loop_normals), true);
attr_normals.Set(loop_normals, timecode);
pxr::UsdAttribute attr_normals = usd_mesh.CreateNormalsAttr(pxr::VtValue(), true);
if (!attr_normals.HasValue()) {
attr_normals.Set(loop_normals, pxr::UsdTimeCode::Default());
}
usd_value_writer_.SetAttribute(attr_normals, pxr::VtValue(loop_normals), timecode);
usd_mesh.SetNormalsInterpolation(pxr::UsdGeomTokens->faceVarying);
}