MStatus grabUVContext::doDrag ( MEvent & event, MHWRender::MUIDrawManager& drawMgr, const MHWRender::MFrameContext& context) { if (event.mouseButton() != MEvent::kLeftMouse || !event.isModifierNone() ) return MS::kFailure; MPxTexContext::doDrag(event, drawMgr, context); short x, y; event.getPosition( x, y ); fLastScreenPoint = fCurrentScreenPoint; fCurrentScreenPoint = MPoint( x, y ); double xView, yView; portToView(x, y, xView, yView); // pos at viewrect coordinate fLastPoint = fCurrentPoint; fCurrentPoint = MPoint( xView, yView, 0.0 ); if( fDragMode == kBrushSize ) { double dis = fCurrentScreenPoint.distanceTo( fLastScreenPoint ); if ( fCurrentScreenPoint[0] > fLastScreenPoint[0] ) setSize( size() + float(dis) ); else setSize( std::max( size() - float(dis), 0.01f ) ); } else { fBrushCenterScreenPoint = MPoint( x, y ); MFloatArray uUVsExported; MFloatArray vUVsExported; const MVector vec = fCurrentPoint - fLastPoint; if (!fCommand) { fCommand = (UVUpdateCommand *)(newToolCommand()); } if (fCommand) { MFnMesh mesh(fDagPath); MString currentUVSetName; mesh.getCurrentUVSetName(currentUVSetName); int nbUVs = mesh.numUVs(currentUVSetName); MDoubleArray pinData; MUintArray uvPinIds; MDoubleArray fullPinData; mesh.getPinUVs(uvPinIds, pinData, ¤tUVSetName); int len = pinData.length(); fullPinData.setLength(nbUVs); for (unsigned int i = 0; i < nbUVs; i++) { fullPinData[i] = 0.0; } while( len-- > 0 ) { fullPinData[uvPinIds[len]] = pinData[len]; } MFloatArray uValues; MFloatArray vValues; float pinWeight = 0; for (unsigned int i = 0; i < fCollectedUVs.length(); ++i) { float u, v; MStatus bGetUV = mesh.getUV(fCollectedUVs[i], u, v, ¤tUVSetName); if (bGetUV == MS::kSuccess) { pinWeight = fullPinData[fCollectedUVs[i]]; u += (float)vec[0]*(1-pinWeight); v += (float)vec[1]*(1-pinWeight); uValues.append( u ); vValues.append( v ); } } fCommand->setUVs( mesh.object(), fCollectedUVs, uValues, vValues, ¤tUVSetName ); } } return MS::kSuccess; }
MStatus grabUVContext::doPress ( MEvent & event, MHWRender::MUIDrawManager& drawMgr, const MHWRender::MFrameContext& context) { if ( event.mouseButton() != MEvent::kLeftMouse || !event.isModifierNone() ) return MS::kFailure; fInStroke = true; MPxTexContext::doPress(event, drawMgr, context); short x, y; event.getPosition( x, y ); fCurrentScreenPoint = MPoint( x, y ); fLastScreenPoint = MPoint( x, y ); fBrushCenterScreenPoint = MPoint( x, y ); double xView, yView; portToView(x, y, xView, yView); // pos at viewrect coordinate double portW, portH; portSize(portW, portH); double left, right, bottom, top; viewRect(left, right, bottom, top); double sizeInView = portW < 1e-5 ? 0.0 : ( fBrushConfig.size() * (right - left) / portW ); double sizeInViewSquare = sizeInView * sizeInView; if( fDragMode == kNormal ) { fCollectedUVs.clear(); MStatus *returnStatus = NULL; MSelectionMask mask = MSelectionMask::kSelectMeshUVs; const bool bPickSingle = false; MSelectionList selectionList; bool bSelect = MPxTexContext::getMarqueeSelection( x - fBrushConfig.size(), y - fBrushConfig.size(), x + fBrushConfig.size(), y + fBrushConfig.size(), mask, bPickSingle, true, selectionList ); if (bSelect) { MObject component; selectionList.getDagPath( 0, fDagPath, component ); fDagPath.extendToShape(); MFnMesh mesh(fDagPath); MString currentUVSetName; mesh.getCurrentUVSetName(currentUVSetName); MIntArray UVsToTest; if( component.apiType() == MFn::kMeshMapComponent ) { MFnSingleIndexedComponent compFn( component ); compFn.getElements( UVsToTest ); for (unsigned int i = 0; i < UVsToTest.length(); ++i) { float u, v; MStatus bGetUV = mesh.getUV(UVsToTest[i], u, v, ¤tUVSetName); if (bGetUV == MS::kSuccess) { float distSquare = ( u - xView ) * ( u - xView ) + ( v - yView ) * ( v - yView ); if ( distSquare < sizeInViewSquare ) fCollectedUVs.append(UVsToTest[i]); } } } // position in view(world) space. fLastPoint = MPoint( xView, yView, 0.0 ); fCurrentPoint = MPoint( xView, yView, 0.0 ); } } return MS::kSuccess; }