bool Hd_SmoothNormalsComputation::Resolve() { // dependency check first if (_adjacencyBuilder) { if (!_adjacencyBuilder->IsResolved()) return false; } if (_points) { if (!_points->IsResolved()) return false; } if (!_TryLock()) return false; HD_TRACE_FUNCTION(); HF_MALLOC_TAG_FUNCTION(); if (!TF_VERIFY(_adjacency)) return true; int numPoints = _points->GetNumElements(); HdBufferSourceSharedPtr normals; switch (_points->GetGLElementDataType()) { case GL_FLOAT_VEC3: if (_packed) { normals = HdBufferSourceSharedPtr( new HdVtBufferSource( _dstName, VtValue( _adjacency->ComputeSmoothNormalsPacked( numPoints, static_cast<const GfVec3f*>(_points->GetData()))))); } else { normals = HdBufferSourceSharedPtr( new HdVtBufferSource( _dstName, VtValue( _adjacency->ComputeSmoothNormals( numPoints, static_cast<const GfVec3f*>(_points->GetData()))))); } break; case GL_DOUBLE_VEC3: if (_packed) { normals = HdBufferSourceSharedPtr( new HdVtBufferSource( _dstName, VtValue( _adjacency->ComputeSmoothNormalsPacked( numPoints, static_cast<const GfVec3d*>(_points->GetData()))))); } else { normals = HdBufferSourceSharedPtr( new HdVtBufferSource( _dstName, VtValue( _adjacency->ComputeSmoothNormals( numPoints, static_cast<const GfVec3d*>(_points->GetData()))))); } break; default: TF_CODING_ERROR("Unsupported points type for computing smooth normals"); break; } _SetResult(normals); // call base class to mark as resolved. _SetResolved(); return true; }
virtual bool Resolve() { if (not _TryLock()) return false; _SetResolved(); return true; }