identical-mesh-consistency#

Code

VG.024

Validator

Manual

Compatibility

core usd

Tags

Summary#

Repeated occurrences of identically shaped objects should have identical mesh connectivity

Description#

When identically shaped and parameterized objects appear multiple times in an asset, all occurrences should have identical mesh connectivity - point positions and connections / edges between the vertices. This enables proper memory de-duplication optimizations and primvar usage (texture coordinates, normals, etc.)

../../../_images/identical-meshes.jpg

The locks on this toolbox are identical and should have identical mesh connectivity.#

Why is it required?#

  • Enables efficient memory de-duplication of identical meshes

  • Ensures consistent behavior across different instances of the same mesh, for example when applying a textured material or applying mesh decimation operations

  • Reduces file size and memory usage

Examples#

#usda 1.0

# Valid: Identical meshes with same point positions
def Xform "Chair1" (
    prepend apiSchemas = ["GeomXformCommonAPI"]
)
{
    float3 xformOp:translate = (0, 0, 0)
    uniform token[] xformOpOrder = ["xformOp:translate"]
    
    def Mesh "ChairMesh" {
        point3f[] points = [(-1, 0, -1), (1, 0, -1), (1, 2, -1), (-1, 2, -1),
                           (-1, 0, 1), (1, 0, 1), (1, 2, 1), (-1, 2, 1)]
        int[] faceVertexCounts = [4, 4, 4, 4, 4, 4]
        int[] faceVertexIndices = [0,1,2,3, 4,7,6,5, 0,4,5,1, 1,5,6,2, 2,6,7,3, 3,7,4,0]
    }
}

def Xform "Chair2" (
    prepend apiSchemas = ["GeomXformCommonAPI"]
)
{
    float3 xformOp:translate = (3, 0, 0)
    uniform token[] xformOpOrder = ["xformOp:translate"]
    
    def Mesh "ChairMesh" {
        point3f[] points = [(-1, 0, -1), (1, 0, -1), (1, 2, -1), (-1, 2, -1),
                           (-1, 0, 1), (1, 0, 1), (1, 2, 1), (-1, 2, 1)]
        int[] faceVertexCounts = [4, 4, 4, 4, 4, 4]
        int[] faceVertexIndices = [0,1,2,3, 4,7,6,5, 0,4,5,1, 1,5,6,2, 2,6,7,3, 3,7,4,0]
        # Identical point positions as Chair1
    }
}

# Invalid: Similar meshes with different point positions
def Xform "Chair3" (
    prepend apiSchemas = ["GeomXformCommonAPI"]
)
{
    float3 xformOp:translate = (6, 0, 0)
    uniform token[] xformOpOrder = ["xformOp:translate"]
    
    def Mesh "ChairMesh" {
        point3f[] points = [(2, 0, -1), (4, 0, -1), (4, 2, -1), (2, 2, -1),
                           (2, 0, 1), (4, 0, 1), (4, 2, 1), (2, 2, 1)]
        # Different point positions - transformation baked into geometry
    }
}

How to comply#

  • When splitting a previously merged mesh into multiple separate meshes, de-duplicate/replace any resulting geometry that should be identical with other geometry. For example bolts and screws or wheels in a vehicle.

  • When positioning duplicated geometry, don’t do so by moving the points / vertices directly. Instead, apply transformation (xform ops) to the geometry to position it.

  • Use identical mesh data for geometrically identical objects

  • Consider using USD’s instancing capabilities for repeated geometry

For more information#