void SOP_SceneCacheSource::transformObject( IECore::Object *object, const Imath::M44d &transform, bool &hasAnimatedTopology, bool &hasAnimatedPrimVars, std::vector<InternedString> &animatedPrimVars ) { Primitive *primitive = IECore::runTimeCast<Primitive>( object ); if ( primitive ) { TransformOpPtr transformer = new TransformOp(); transformer->inputParameter()->setValue( primitive ); transformer->copyParameter()->setTypedValue( false ); transformer->matrixParameter()->setValue( new M44dData( transform ) ); transformer->operate(); std::vector<std::string> &primVars = transformer->primVarsParameter()->getTypedValue(); for ( std::vector<std::string>::iterator it = primVars.begin(); it != primVars.end(); ++it ) { if ( std::find( animatedPrimVars.begin(), animatedPrimVars.end(), *it ) == animatedPrimVars.end() ) { animatedPrimVars.push_back( *it ); hasAnimatedPrimVars = true; } } return; } Group *group = IECore::runTimeCast<Group>( object ); if ( group ) { MatrixTransformPtr matTransform = matrixTransform( transform ); matTransform->matrix *= group->getTransform()->transform(); group->setTransform( matTransform ); return; } CoordinateSystem *coord = IECore::runTimeCast<CoordinateSystem>( object ); if ( coord ) { MatrixTransformPtr matTransform = matrixTransform( transform ); matTransform->matrix *= coord->getTransform()->transform(); coord->setTransform( matTransform ); return; } }
ConstObjectPtr SOP_SceneCacheSource::transformObject( const IECore::Object *object, const Imath::M44d &transform, bool &hasAnimatedTopology, bool &hasAnimatedPrimVars, std::vector<InternedString> &animatedPrimVars ) { if ( const Primitive *primitive = IECore::runTimeCast<const Primitive>( object ) ) { TransformOpPtr transformer = new TransformOp(); transformer->inputParameter()->setValue( const_cast<Primitive*>( primitive ) ); // safe because we set the copy parameter transformer->copyParameter()->setTypedValue( true ); transformer->matrixParameter()->setValue( new M44dData( transform ) ); ObjectPtr result = transformer->operate(); std::vector<std::string> &primVars = transformer->primVarsParameter()->getTypedValue(); for ( std::vector<std::string>::iterator it = primVars.begin(); it != primVars.end(); ++it ) { if ( std::find( animatedPrimVars.begin(), animatedPrimVars.end(), *it ) == animatedPrimVars.end() ) { animatedPrimVars.push_back( *it ); hasAnimatedPrimVars = true; } } return result; } else if ( const Group *group = IECore::runTimeCast<const Group>( object ) ) { GroupPtr result = group->copy(); MatrixTransformPtr matTransform = matrixTransform( transform ); matTransform->matrix *= group->getTransform()->transform(); result->setTransform( matTransform ); return result; } else if ( const CoordinateSystem *coord = IECore::runTimeCast<const CoordinateSystem>( object ) ) { CoordinateSystemPtr result = coord->copy(); MatrixTransformPtr matTransform = matrixTransform( transform ); matTransform->matrix *= coord->getTransform()->transform(); result->setTransform( matTransform ); return result; } return object; }
bool ToHoudiniGroupConverter::doConversion( const VisibleRenderable *renderable, GU_Detail *geo ) const { const Group *group = IECore::runTimeCast<const Group>( renderable ); if ( !group ) { return false; } Imath::M44f transform = ( runTimeCast<const M44fData>( m_transformParameter->getValue() ) )->readable(); const Transform *groupTransform = group->getTransform(); if ( groupTransform ) { transform = transform * groupTransform->transform(); } TransformOpPtr transformOp = new TransformOp(); M44fDataPtr transformData = new M44fData( transform ); transformOp->matrixParameter()->setValue( transformData ); std::string groupName = nameParameter()->getTypedValue(); if ( groupName == "" ) { // backwards compatibility with older data if ( const StringData *groupNameData = group->blindData()->member<StringData>( "name" ) ) { groupName = groupNameData->readable(); } } const std::string &attribFilter = attributeFilterParameter()->getTypedValue(); bool convertStandardAttributes = convertStandardAttributesParameter()->getTypedValue(); size_t i = 0; const Group::ChildContainer &children = group->children(); for ( Group::ChildContainer::const_iterator it=children.begin(); it != children.end(); ++it, ++i ) { ConstVisibleRenderablePtr child = *it; ConstPrimitivePtr primitive = runTimeCast<const Primitive>( child ); if ( primitive ) { transformOp->inputParameter()->setValue( constPointerCast<Primitive>( primitive ) ); child = staticPointerCast<VisibleRenderable>( transformOp->operate() ); } ToHoudiniGeometryConverterPtr converter = ToHoudiniGeometryConverter::create( child ); if ( !converter ) { continue; } std::string name = groupName; if ( const StringData *childNameData = child->blindData()->member<StringData>( "name" ) ) { const std::string &childName = childNameData->readable(); if ( childName != "" ) { if ( groupName != "" ) { name += "/"; } name += childName; } } converter->nameParameter()->setTypedValue( name ); converter->attributeFilterParameter()->setTypedValue( attribFilter ); converter->convertStandardAttributesParameter()->setTypedValue( convertStandardAttributes ); ToHoudiniGroupConverter *groupConverter = runTimeCast<ToHoudiniGroupConverter>( converter ); if ( groupConverter ) { groupConverter->transformParameter()->setValue( transformData ); } GU_DetailHandle handle; handle.allocateAndSet( geo, false ); if ( !converter->convert( handle ) ) { continue; } } return true; }
ConstObjectPtr SOP_SceneCacheSource::transformObject( const IECore::Object *object, const Imath::M44d &transform, Parameters ¶ms ) { if ( const Primitive *primitive = IECore::runTimeCast<const Primitive>( object ) ) { TransformOpPtr transformer = new TransformOp(); transformer->inputParameter()->setValue( const_cast<Primitive*>( primitive ) ); // safe because we set the copy parameter transformer->copyParameter()->setTypedValue( true ); transformer->matrixParameter()->setValue( new M44dData( transform ) ); // add all Point and Normal prim vars to the transformation list, except for rest/Pref const PrimitiveVariableMap &variables = primitive->variables; std::vector<std::string> &primVars = transformer->primVarsParameter()->getTypedValue(); primVars.clear(); for ( PrimitiveVariableMap::const_iterator it = variables.begin(); it != variables.end(); ++it ) { if ( despatchTypedData<TransformGeometricData, IECore::TypeTraits::IsGeometricTypedData, DespatchTypedDataIgnoreError>( it->second.data.get() ) ) { // we don't want to alter rest/Pref because Houdini excepts these to be non-transforming prim vars if ( it->first == "rest" || it->first == "Pref" ) { continue; } primVars.push_back( it->first ); // add the transforming prim vars to the animated list if ( std::find( params.animatedPrimVars.begin(), params.animatedPrimVars.end(), it->first ) == params.animatedPrimVars.end() ) { params.animatedPrimVars.push_back( it->first ); params.hasAnimatedPrimVars = true; } } } return transformer->operate(); } else if ( const Group *group = IECore::runTimeCast<const Group>( object ) ) { GroupPtr result = group->copy(); MatrixTransformPtr matTransform = matrixTransform( transform ); if ( const Transform *transform = group->getTransform() ) { matTransform->matrix *= transform->transform(); } result->setTransform( matTransform ); return result; } else if ( const CoordinateSystem *coord = IECore::runTimeCast<const CoordinateSystem>( object ) ) { CoordinateSystemPtr result = coord->copy(); MatrixTransformPtr matTransform = matrixTransform( transform ); if ( const Transform *transform = coord->getTransform() ) { matTransform->matrix *= transform->transform(); } result->setTransform( matTransform ); return result; } return object; }