IECore::RunTimeTypedPtr RenderableGadget::dragBegin( GadgetPtr gadget, const DragDropEvent &event ) { if( !m_scene ) { return 0; } std::string objectUnderMouse = objectAt( event.line ); if( objectUnderMouse == "" ) { // drag to select m_dragStartPosition = m_lastDragPosition = event.line.p0; m_dragSelecting = true; renderRequestSignal()( this ); return this; } else { if( m_selection.find( objectUnderMouse ) != m_selection.end() ) { // drag the selection somewhere IECore::StringVectorDataPtr dragData = new IECore::StringVectorData(); dragData->writable().insert( dragData->writable().end(), m_selection.begin(), m_selection.end() ); Pointer::setCurrent( "objects" ); return dragData; } } return 0; }
ImageStats::ImageStats( const std::string &name ) : ComputeNode( name ) { storeIndexOfNextChild( g_firstPlugIndex ); addChild( new ImagePlug( "in", Gaffer::Plug::In ) ); IECore::StringVectorDataPtr defaultChannelsData = new IECore::StringVectorData; vector<string> &defaultChannels = defaultChannelsData->writable(); defaultChannels.push_back( "R" ); defaultChannels.push_back( "G" ); defaultChannels.push_back( "B" ); defaultChannels.push_back( "A" ); addChild( new StringVectorDataPlug( "channels", Plug::In, defaultChannelsData ) ); addChild( new Box2iPlug( "area", Gaffer::Plug::In ) ); addChild( new Color4fPlug( "average", Gaffer::Plug::Out, Imath::Color4f( 0, 0, 0, 1 ) ) ); addChild( new Color4fPlug( "min", Gaffer::Plug::Out, Imath::Color4f( 0, 0, 0, 1 ) ) ); addChild( new Color4fPlug( "max", Gaffer::Plug::Out, Imath::Color4f( 0, 0, 0, 1 ) ) ); }
IECore::DataPtr convert( const MCommandResult &result ) { MStatus s; switch (result.resultType()) { case MCommandResult::kInvalid: { // No result return 0; } case MCommandResult::kInt: { int i; s = result.getResult(i); assert(s); IECore::IntDataPtr data = new IECore::IntData(); data->writable() = i; return data; } case MCommandResult::kIntArray: { MIntArray v; s = result.getResult(v); assert(s); unsigned sz = v.length(); IECore::IntVectorDataPtr data = new IECore::IntVectorData(); data->writable().resize(sz); for (unsigned i = 0; i < sz; i++) { (data->writable())[i] = v[i]; } return data; } case MCommandResult::kDouble: { double d; s = result.getResult(d); assert(s); IECore::FloatDataPtr data = new IECore::FloatData(); data->writable() = static_cast<float>(d); return data; } case MCommandResult::kDoubleArray: { MDoubleArray v; s = result.getResult(v); assert(s); unsigned sz = v.length(); IECore::DoubleVectorDataPtr data = new IECore::DoubleVectorData(); data->writable().resize(sz); for (unsigned i = 0; i < sz; i++) { data->writable()[i] = v[i]; } return data; } case MCommandResult::kString: { MString str; s = result.getResult(str); assert(s); IECore::StringDataPtr data = new IECore::StringData(); data->writable() = std::string(str.asChar()); return data; } case MCommandResult::kStringArray: { MStringArray v; s = result.getResult(v); assert(s); unsigned sz = v.length(); IECore::StringVectorDataPtr data = new IECore::StringVectorData(); data->writable().resize(sz); for (unsigned i = 0; i < sz; i++) { data->writable()[i] = std::string(v[i].asChar()); } return data; } case MCommandResult::kVector: { MVector v; s = result.getResult(v); assert(s); IECore::V3fDataPtr data = new IECore::V3fData(); data->writable() = Imath::V3f(v.x, v.y, v.z); return data; } case MCommandResult::kVectorArray: { MVectorArray v; s = result.getResult(v); assert(s); unsigned sz = v.length(); IECore::V3fVectorDataPtr data = new IECore::V3fVectorData(); data->writable().resize(sz); for (unsigned i = 0; i < sz; i++) { data->writable()[i] = Imath::V3f(v[i].x, v[i].y, v[i].z); } return data; } case MCommandResult::kMatrix: { MDoubleArray v; int numRows, numColumns; s = result.getResult(v, numRows, numColumns); assert(s); if (numRows > 4 || numColumns > 4) { throw IECoreMaya::StatusException( MS::kFailure ); } IECore::M44fDataPtr data = new IECore::M44fData(); for (int i = 0; i < numColumns; i++) { for (int j = 0; j < numRows; j++) { (data->writable())[i][j] = v[i*numRows+j]; } } return data; } case MCommandResult::kMatrixArray: { return 0; } default: assert( false ); return 0; } }
IECore::ObjectPtr FromMayaSkinClusterConverter::doConversion( const MObject &object, IECore::ConstCompoundObjectPtr operands ) const { MStatus stat; // our data storage objects IECore::StringVectorDataPtr influenceNamesData = new IECore::StringVectorData(); IECore::M44fVectorDataPtr influencePoseData = new IECore::M44fVectorData(); IECore::IntVectorDataPtr pointIndexOffsetsData = new IECore::IntVectorData(); IECore::IntVectorDataPtr pointInfluenceCountsData = new IECore::IntVectorData(); IECore::IntVectorDataPtr pointInfluenceIndicesData = new IECore::IntVectorData(); IECore::FloatVectorDataPtr pointInfluenceWeightsData = new IECore::FloatVectorData(); // get a skin cluster fn MFnSkinCluster skinClusterFn(object); MDagPathArray influencePaths; skinClusterFn.influenceObjects(influencePaths); // get the influence names int influencesCount = influencePaths.length(); influenceNamesData->writable().reserve( influencesCount ); InfluenceName in = (InfluenceName)m_influenceNameParameter->getNumericValue(); switch( in ) { case Partial : { for (int i=0; i < influencesCount; i++) { influenceNamesData->writable().push_back( influencePaths[i].partialPathName(&stat).asChar() ); } break; } case Full : { for (int i=0; i < influencesCount; i++) { influenceNamesData->writable().push_back( influencePaths[i].fullPathName(&stat).asChar() ); } break; } } // extract bind pose MFnDependencyNode skinClusterNodeFn( object ); MPlug bindPreMatrixArrayPlug = skinClusterNodeFn.findPlug( "bindPreMatrix", true, &stat ); for (int i=0; i < influencesCount; i++) { MPlug bindPreMatrixElementPlug = bindPreMatrixArrayPlug.elementByLogicalIndex( skinClusterFn.indexForInfluenceObject( influencePaths[i], NULL ), &stat); MObject matObj; bindPreMatrixElementPlug.getValue( matObj ); MFnMatrixData matFn( matObj, &stat ); MMatrix mat = matFn.matrix(); Imath::M44f cmat = IECore::convert<Imath::M44f>( mat ); influencePoseData->writable().push_back( cmat ); } // extract the skinning information // get the first input geometry to the skin cluster // TODO: if needed, extend this to retrieve more than one output geometry MObjectArray outputGeoObjs; stat = skinClusterFn.getOutputGeometry( outputGeoObjs ); if (! stat) { throw IECore::Exception( "FromMayaSkinClusterConverter: skinCluster node does not have any output geometry!" ); } // get the dag path to the first object MFnDagNode dagFn( outputGeoObjs[0] ); MDagPath geoPath; dagFn.getPath( geoPath ); // generate a geo iterator for the components MItGeometry geoIt( outputGeoObjs[0] ); int currentOffset = 0; // loop through all the points of the geometry to extract their bind information for ( ; !geoIt.isDone(); geoIt.next() ) { MObject pointObj = geoIt.currentItem( &stat ); MDoubleArray weights; unsigned int weightsCount; skinClusterFn.getWeights( geoPath, pointObj, weights, weightsCount ); int pointInfluencesCount = 0; for ( int influenceId = 0; influenceId < int( weightsCount ); influenceId++ ) { // ignore zero weights, we are generating a compressed (non-sparse) representation of the weights /// \todo: use a parameter to specify a threshold value rather than 0.0 if ( weights[influenceId] != 0.0 ) { pointInfluencesCount++; pointInfluenceWeightsData->writable().push_back( float( weights[influenceId] ) ); pointInfluenceIndicesData->writable().push_back( influenceId ); } } pointIndexOffsetsData->writable().push_back( currentOffset ); pointInfluenceCountsData->writable().push_back( pointInfluencesCount ); currentOffset += pointInfluencesCount; } // put all our results in a smooth skinning data object return new IECore::SmoothSkinningData( influenceNamesData, influencePoseData, pointIndexOffsetsData, pointInfluenceCountsData, pointInfluenceIndicesData, pointInfluenceWeightsData ); }