// create attributes MStatus probeDeformerARAPNode::initialize(){ MFnTypedAttribute tAttr; MFnNumericAttribute nAttr; MFnEnumAttribute eAttr; MFnMatrixAttribute mAttr; MRampAttribute rAttr; // this attr will be dirtied when ARAP recomputation is needed aARAP = nAttr.create( "arap", "arap", MFnNumericData::kBoolean, true ); nAttr.setStorable(false); nAttr.setKeyable(false); nAttr.setHidden(true); addAttribute( aARAP ); // this attr will be dirtied when weight recomputation is needed aComputeWeight = nAttr.create( "computeWeight", "computeWeight", MFnNumericData::kBoolean, true ); nAttr.setStorable(false); nAttr.setKeyable(false); nAttr.setHidden(true); addAttribute( aComputeWeight ); aMatrix = mAttr.create("probeMatrix", "pm"); mAttr.setStorable(false); mAttr.setHidden(true); mAttr.setArray(true); mAttr.setUsesArrayDataBuilder(true); mAttr.setDisconnectBehavior(MFnMatrixAttribute::kDelete); addAttribute(aMatrix); attributeAffects( aMatrix, outputGeom ); aInitMatrix = mAttr.create("initProbeMatrix", "ipm"); mAttr.setHidden(true); mAttr.setArray(true); mAttr.setStorable(true); mAttr.setUsesArrayDataBuilder(true); addAttribute(aInitMatrix); attributeAffects( aInitMatrix, outputGeom ); aBlendMode = eAttr.create( "blendMode", "bm", BM_SRL ); eAttr.addField( "expSO+expSym", BM_SRL ); eAttr.addField( "expSE+expSym", BM_SSE ); eAttr.addField( "logmatrix3", BM_LOG3 ); eAttr.addField( "logmatrix4", BM_LOG4 ); eAttr.addField( "quat+linear", BM_SQL ); eAttr.addField( "linear", BM_AFF ); eAttr.addField( "off", BM_OFF ); eAttr.setStorable(true); eAttr.setKeyable(false); addAttribute( aBlendMode ); attributeAffects( aBlendMode, outputGeom ); aRotationConsistency = nAttr.create( "rotationConsistency", "rc", MFnNumericData::kBoolean, false ); nAttr.setKeyable(false); nAttr.setStorable(true); addAttribute( aRotationConsistency ); attributeAffects( aRotationConsistency, outputGeom ); aFrechetSum = nAttr.create( "frechetSum", "fs", MFnNumericData::kBoolean, false ); nAttr.setKeyable(false); nAttr.setStorable(true); addAttribute( aFrechetSum ); attributeAffects( aFrechetSum, outputGeom ); aNormaliseWeight = eAttr.create( "normaliseWeight", "nw", NM_LINEAR ); eAttr.addField( "NONE", NM_NONE ); eAttr.addField( "Linear", NM_LINEAR ); eAttr.addField( "Softmax", NM_SOFTMAX ); eAttr.setStorable(true); addAttribute( aNormaliseWeight ); attributeAffects( aNormaliseWeight, outputGeom ); attributeAffects( aNormaliseWeight, aComputeWeight ); aWeightMode = eAttr.create( "weightMode", "wtm", WM_HARMONIC_COTAN ); eAttr.addField( "inverse", WM_INV_DISTANCE ); eAttr.addField( "cut-off", WM_CUTOFF_DISTANCE ); eAttr.addField( "draw", WM_DRAW ); // eAttr.addField( "harmonic-arap", WM_HARMONIC_ARAP); eAttr.addField( "harmonic-cotan", WM_HARMONIC_COTAN); eAttr.setStorable(true); eAttr.setKeyable(false); addAttribute( aWeightMode ); attributeAffects( aWeightMode, outputGeom ); attributeAffects( aWeightMode, aComputeWeight ); aConstraintMode = eAttr.create( "constraintMode", "ctm", CONSTRAINT_CLOSEST ); eAttr.addField( "neighbour", CONSTRAINT_NEIGHBOUR); eAttr.addField( "closestFace", CONSTRAINT_CLOSEST ); eAttr.setStorable(true); eAttr.setKeyable(false); addAttribute( aConstraintMode ); attributeAffects( aConstraintMode, outputGeom ); attributeAffects( aConstraintMode, aARAP); aTetMode = eAttr.create( "tetMode", "tm", TM_FACE ); eAttr.addField( "face", TM_FACE ); eAttr.addField( "edge", TM_EDGE ); eAttr.addField( "vertex", TM_VERTEX ); eAttr.addField( "vface", TM_VFACE ); eAttr.setStorable(true); eAttr.setKeyable(false); addAttribute( aTetMode ); attributeAffects( aTetMode, outputGeom ); attributeAffects( aTetMode, aARAP ); attributeAffects( aTetMode, aComputeWeight ); aWorldMode = nAttr.create( "worldMode", "wrldmd", MFnNumericData::kBoolean, true ); nAttr.setStorable(true); nAttr.setKeyable(false); addAttribute( aWorldMode ); attributeAffects( aWorldMode, outputGeom ); attributeAffects( aWorldMode, aARAP ); aEffectRadius = nAttr.create("effectRadius", "er", MFnNumericData::kDouble, 8.0); nAttr.setMin( EPSILON ); nAttr.setStorable(true); addAttribute( aEffectRadius ); attributeAffects( aEffectRadius, outputGeom ); attributeAffects( aEffectRadius, aComputeWeight ); aTransWeight = nAttr.create("translationWeight", "tw", MFnNumericData::kDouble, 1e-20); nAttr.setStorable(true); addAttribute( aTransWeight ); attributeAffects( aTransWeight, outputGeom ); attributeAffects( aTransWeight, aARAP ); aAreaWeighted = nAttr.create( "areaWeighted", "aw", MFnNumericData::kBoolean, false ); nAttr.setStorable(true); addAttribute( aAreaWeighted ); attributeAffects( aAreaWeighted, outputGeom ); attributeAffects( aAreaWeighted, aARAP ); aNeighbourWeighting = nAttr.create( "neighbourWeighting", "nghbrw", MFnNumericData::kBoolean, false ); nAttr.setStorable(true); addAttribute( aNeighbourWeighting ); attributeAffects( aNeighbourWeighting, outputGeom ); attributeAffects( aNeighbourWeighting, aComputeWeight ); attributeAffects( aNeighbourWeighting, aARAP ); aConstraintWeight = nAttr.create("constraintWeight", "cw", MFnNumericData::kDouble, 1.0); nAttr.setStorable(true); addAttribute( aConstraintWeight ); attributeAffects( aConstraintWeight, outputGeom ); attributeAffects( aConstraintWeight, aARAP ); aNormExponent = nAttr.create("normExponent", "ne", MFnNumericData::kDouble, 1.0); nAttr.setStorable(true); addAttribute( aNormExponent ); attributeAffects( aNormExponent, outputGeom ); attributeAffects( aNormExponent, aARAP ); attributeAffects( aNormExponent, aComputeWeight ); aIteration = nAttr.create("iteration", "it", MFnNumericData::kShort, 1); nAttr.setStorable(true); addAttribute(aIteration); attributeAffects(aIteration, outputGeom); aConstraintRadius = nAttr.create("constraintRadius", "cr", MFnNumericData::kDouble, 1.0); nAttr.setStorable(true); addAttribute( aConstraintRadius ); attributeAffects( aConstraintRadius, outputGeom ); attributeAffects( aConstraintRadius, aARAP ); aVisualisationMode = eAttr.create( "visualisationMode", "vm", VM_OFF ); eAttr.addField( "off", VM_OFF ); eAttr.addField( "energy", VM_ENERGY ); eAttr.addField( "effect", VM_EFFECT ); eAttr.addField( "constraint", VM_CONSTRAINT ); eAttr.addField( "stiffness", VM_STIFFNESS ); eAttr.setStorable(true); addAttribute( aVisualisationMode ); attributeAffects( aVisualisationMode, outputGeom ); aVisualisationMultiplier = nAttr.create("visualisationMultiplier", "vmp", MFnNumericData::kDouble, 1.0); nAttr.setStorable(true); addAttribute( aVisualisationMultiplier ); attributeAffects( aVisualisationMultiplier, outputGeom ); aStiffness = eAttr.create( "stiffnessMode", "stfm", SM_NONE ); eAttr.addField( "off", SM_NONE ); eAttr.addField( "painted weight", SM_PAINT ); eAttr.addField( "learn", SM_LEARN ); eAttr.setStorable(true); addAttribute( aStiffness ); attributeAffects( aStiffness, outputGeom ); attributeAffects( aStiffness, aARAP ); aSupervisedMesh = tAttr.create("supervisedMesh", "svmesh", MFnData::kMesh); tAttr.setStorable(true); tAttr.setArray(true); tAttr.setUsesArrayDataBuilder(true); addAttribute(aSupervisedMesh); attributeAffects( aSupervisedMesh, outputGeom ); attributeAffects( aSupervisedMesh, aARAP ); aProbeWeight = nAttr.create("probeWeight", "prw", MFnNumericData::kDouble, 1.0); nAttr.setArray(true); nAttr.setStorable(true); nAttr.setUsesArrayDataBuilder(true); addAttribute(aProbeWeight); attributeAffects( aProbeWeight, outputGeom ); attributeAffects( aProbeWeight, aComputeWeight ); aProbeConstraintRadius = nAttr.create("probeConstraintRadius", "prcr", MFnNumericData::kDouble, 1.0); nAttr.setArray(true); nAttr.setStorable(true); nAttr.setUsesArrayDataBuilder(true); addAttribute(aProbeConstraintRadius); attributeAffects( aProbeConstraintRadius, outputGeom ); attributeAffects( aProbeConstraintRadius, aARAP ); //ramp aWeightCurveR = rAttr.createCurveRamp( "weightCurveRotation", "wcr" ); addAttribute( aWeightCurveR ); attributeAffects( aWeightCurveR, outputGeom ); attributeAffects( aWeightCurveR, aComputeWeight ); aWeightCurveS = rAttr.createCurveRamp( "weightCurveShear", "wcs" ); addAttribute( aWeightCurveS ); attributeAffects( aWeightCurveS, outputGeom ); attributeAffects( aWeightCurveS, aComputeWeight ); aWeightCurveL = rAttr.createCurveRamp( "weightCurveTranslation", "wcl" ); addAttribute( aWeightCurveL ); attributeAffects( aWeightCurveL, outputGeom ); attributeAffects( aWeightCurveL, aComputeWeight ); // Make the deformer weights paintable MGlobal::executeCommand( "makePaintable -attrType multiFloat -sm deformer probeDeformerARAP weights;" ); return MS::kSuccess; }
MStatus ropeGenerator::initialize() { MStatus stat; MFnTypedAttribute tAttr; MFnNumericAttribute nAttr; MRampAttribute rAttr; inCurve = tAttr.create( "inCurve", "inCurve", MFnData::kNurbsCurve ); tAttr.setHidden( true); divisions = nAttr.create( "divisions", "divisions", MFnNumericData::kInt, 15 ); nAttr.setMin( 2 ); nAttr.setSoftMax( 100 ); nAttr.setWritable( true ); nAttr.setKeyable( true ); nAttr.setStorable( true ); createRope = nAttr.create( "createRope", "createRope", MFnNumericData::kBoolean, false ); nAttr.setWritable( true ); nAttr.setStorable( true ); nAttr.setKeyable( true ); ropesCount = nAttr.create( "ropesCount", "ropesCount", MFnNumericData::kInt, 5 ); nAttr.setMin( 3 ); nAttr.setSoftMax( 10 ); nAttr.setWritable( true ); nAttr.setKeyable( true ); nAttr.setStorable( true ); pointsPerRope = nAttr.create( "pointsPerRope", "pointsPerRope", MFnNumericData::kInt, 6 ); nAttr.setMin( 3 ); nAttr.setSoftMax( 15 ); nAttr.setWritable( true ); nAttr.setKeyable( true ); nAttr.setStorable( true ); ropesStrength = nAttr.create( "ropesStrength", "ropesStrength", MFnNumericData::kFloat, 1.0f ); nAttr.setMin( 0.0 ); nAttr.setMax( 1.0 ); nAttr.setWritable( true ); nAttr.setStorable( true ); nAttr.setKeyable( true ); pointsCount = nAttr.create( "pointsCount", "pointsCount", MFnNumericData::kInt, 5 ); nAttr.setMin(3); nAttr.setSoftMax( 20 ); nAttr.setWritable( true ); nAttr.setKeyable( true ); nAttr.setStorable( true ); radius = nAttr.create( "radius", "radius", MFnNumericData::kFloat, 1.0f ); nAttr.setMin( 0.0 ); nAttr.setSoftMax( 30.0 ); nAttr.setKeyable( true ); nAttr.setWritable( true ); nAttr.setStorable( true ); taperRamp = rAttr.createCurveRamp( "tapper", "tapper" ); twist = nAttr.create( "twist", "twist", MFnNumericData::kFloat, 0.0f ); nAttr.setSoftMin( -3600.0 ); nAttr.setSoftMax( 3600.0 ); nAttr.setWritable( true ); nAttr.setKeyable( true ); nAttr.setStorable( true ); twistRamp = rAttr.createCurveRamp( "twistRamp", "twistRamp" ); uvWidth = nAttr.create( "uvWidth", "uvWidth", MFnNumericData::kFloat, 1.0f ); nAttr.setWritable( true ); nAttr.setKeyable( true ); nAttr.setStorable( true ); uvHeight = nAttr.create( "uvHeight", "uvHeight", MFnNumericData::kFloat, 1.0f ); nAttr.setWritable( true ); nAttr.setKeyable( true ); nAttr.setStorable( true ); uvCapSize = nAttr.create( "uvCapSize", "uvCapSize", MFnNumericData::kFloat, 1.0f ); nAttr.setWritable( true ); nAttr.setKeyable( true ); nAttr.setStorable( true ); outMesh = tAttr.create( "outMesh", "outMesh", MFnData::kMesh ); tAttr.setWritable( false ); tAttr.setStorable( false ); stat = addAttribute( inCurve ); if (!stat) { stat.perror("addAttribute inCurve"); return stat;} stat = addAttribute( divisions ); if (!stat) { stat.perror("addAttribute divisions"); return stat;} stat = addAttribute( createRope ); if (!stat) { stat.perror("addAttribute createRope"); return stat;} stat = addAttribute( ropesCount ); if (!stat) { stat.perror("addAttribute ropesCount"); return stat;} stat = addAttribute( pointsPerRope ); if (!stat) { stat.perror("addAttribute pointsPerRope"); return stat;} stat = addAttribute( ropesStrength ); if (!stat) { stat.perror("addAttribute ropesStrength"); return stat;} stat = addAttribute( pointsCount ); if (!stat) { stat.perror("addAttribute pointsCount"); return stat;} stat = addAttribute( radius ); if (!stat) { stat.perror("addAttribute radius"); return stat;} stat = addAttribute( taperRamp ); if (!stat) { stat.perror("addAttribute taperRamp"); return stat;} stat = addAttribute( twist ); if (!stat) { stat.perror("addAttribute twist"); return stat;} stat = addAttribute( twistRamp ); if (!stat) { stat.perror("addAttribute twistRamp"); return stat;} stat = addAttribute( uvWidth ); if (!stat) { stat.perror("addAttribute uvWidth"); return stat;} stat = addAttribute( uvHeight ); if (!stat) { stat.perror("addAttribute uvHeight"); return stat;} stat = addAttribute( uvCapSize ); if (!stat) { stat.perror("addAttribute uvCapSize"); return stat;} stat = addAttribute( outMesh ); if (!stat) { stat.perror("addAttribute outMesh"); return stat;} stat = attributeAffects( inCurve, outMesh ); if (!stat) { stat.perror("attributeAffects"); return stat;} stat = attributeAffects( divisions, outMesh ); if (!stat) { stat.perror("attributeAffects"); return stat;} stat = attributeAffects( createRope, outMesh ); if (!stat) { stat.perror("attributeAffects"); return stat;} stat = attributeAffects( ropesCount, outMesh ); if (!stat) { stat.perror("attributeAffects"); return stat;} stat = attributeAffects( pointsPerRope, outMesh ); if (!stat) { stat.perror("attributeAffects"); return stat;} stat = attributeAffects( ropesStrength, outMesh ); if (!stat) { stat.perror("attributeAffects"); return stat;} stat = attributeAffects( pointsCount, outMesh ); if (!stat) { stat.perror("attributeAffects"); return stat;} stat = attributeAffects( radius, outMesh ); if (!stat) { stat.perror("attributeAffects"); return stat;} stat = attributeAffects( taperRamp, outMesh ); if (!stat) { stat.perror("attributeAffects"); return stat;} stat = attributeAffects( twist, outMesh ); if (!stat) { stat.perror("attributeAffects"); return stat;} stat = attributeAffects( twistRamp, outMesh ); if (!stat) { stat.perror("attributeAffects"); return stat;} stat = attributeAffects( uvWidth, outMesh ); if (!stat) { stat.perror("attributeAffects"); return stat;} stat = attributeAffects( uvHeight, outMesh ); if (!stat) { stat.perror("attributeAffects"); return stat;} stat = attributeAffects( uvCapSize, outMesh ); if (!stat) { stat.perror("attributeAffects"); return stat;} return MS::kSuccess; }