MStatus geometrySurfaceConstraint::initialize() { MFnNumericAttribute nAttr; MStatus status; // constraint attributes { // Geometry: mesh, readable, not writable, delete on disconnect MFnTypedAttribute typedAttrNotWritable; geometrySurfaceConstraint::constraintGeometry = typedAttrNotWritable.create( "constraintGeometry", "cg", MFnData::kMesh, &status ); if (!status) { status.perror("typedAttrNotWritable.create:cgeom"); return status;} status = typedAttrNotWritable.setReadable(true); if (!status) { status.perror("typedAttrNotWritable.setReadable:cgeom"); return status;} status = typedAttrNotWritable.setWritable(false); if (!status) { status.perror("typedAttrNotWritable.setWritable:cgeom"); return status;} status = typedAttrNotWritable.setDisconnectBehavior(MFnAttribute::kDelete); if (!status) { status.perror("typedAttrNotWritable.setDisconnectBehavior:cgeom"); return status;} } // Parent inverse matrix: delete on disconnect MFnTypedAttribute typedAttr; geometrySurfaceConstraint::constraintParentInverseMatrix = typedAttr.create( "constraintPim", "ci", MFnData::kMatrix, &status ); if (!status) { status.perror("typedAttr.create:matrix"); return status;} status = typedAttr.setDisconnectBehavior(MFnAttribute::kDelete); if (!status) { status.perror("typedAttr.setDisconnectBehavior:cgeom"); return status;} // Target geometry: mesh, delete on disconnect geometrySurfaceConstraint::targetGeometry = typedAttr.create( "targetGeometry", "tg", MFnData::kMesh, &status ); if (!status) { status.perror("typedAttr.create:tgeom"); return status;} status = typedAttr.setDisconnectBehavior(MFnAttribute::kDelete); if (!status) { status.perror("typedAttr.setDisconnectBehavior:cgeom"); return status;} targetTransform = typedAttr.create( "targetTransform", "ttm", MFnData::kMatrix, &status ); if (!status) { status.perror("typedAttr.create:targetTransform"); return status;} status = typedAttr.setDisconnectBehavior(MFnAttribute::kDelete); if (!status) { status.perror("typedAttr.setDisconnectBehavior:targetTransform"); return status;} // Target weight: double, min 0, default 1.0, keyable, delete on disconnect MFnNumericAttribute typedAttrKeyable; geometrySurfaceConstraint::targetWeight = typedAttrKeyable.create( "weight", "wt", MFnNumericData::kDouble, 1.0, &status ); if (!status) { status.perror("typedAttrKeyable.create:weight"); return status;} status = typedAttrKeyable.setMin( (double) 0 ); if (!status) { status.perror("typedAttrKeyable.setMin"); return status;} status = typedAttrKeyable.setKeyable( true ); if (!status) { status.perror("typedAttrKeyable.setKeyable"); return status;} status = typedAttrKeyable.setDisconnectBehavior(MFnAttribute::kDelete); if (!status) { status.perror("typedAttrKeyable.setDisconnectBehavior:cgeom"); return status;} { // Compound target(geometry,weight): array, delete on disconnect MFnCompoundAttribute compoundAttr; geometrySurfaceConstraint::compoundTarget = compoundAttr.create( "target", "tgt",&status ); if (!status) { status.perror("compoundAttr.create"); return status;} status = compoundAttr.addChild( geometrySurfaceConstraint::targetTransform ); if (!status) { status.perror("compoundAttr.addChild targetTransform"); return status;} status = compoundAttr.addChild( geometrySurfaceConstraint::targetGeometry ); if (!status) { status.perror("compoundAttr.addChild"); return status;} status = compoundAttr.addChild( geometrySurfaceConstraint::targetWeight ); if (!status) { status.perror("compoundAttr.addChild"); return status;} status = compoundAttr.setArray( true ); if (!status) { status.perror("compoundAttr.setArray"); return status;} status = compoundAttr.setDisconnectBehavior(MFnAttribute::kDelete); if (!status) { status.perror("typedAttrKeyable.setDisconnectBehavior:cgeom"); return status;} } MFnNumericAttribute numAttr; constraintTranslateX = numAttr.create( "constraintTranslateX", "ctx", MFnNumericData::kDouble, 0.0, &status ); if(!status) { MGlobal::displayInfo("failed to create attrib constraintTranslateX"); return status; } numAttr.setReadable(true); numAttr.setWritable(false); addAttribute(constraintTranslateX); constraintTranslateY = numAttr.create( "constraintTranslateY", "cty", MFnNumericData::kDouble, 0.0, &status ); if(!status) { MGlobal::displayInfo("failed to create attrib constraintTranslateY"); return status; } numAttr.setReadable(true); numAttr.setWritable(false); addAttribute(constraintTranslateY); constraintTranslateZ = numAttr.create( "constraintTranslateZ", "ctz", MFnNumericData::kDouble, 0.0, &status ); if(!status) { MGlobal::displayInfo("failed to create attrib constraintTranslateY"); return status; } numAttr.setReadable(true); numAttr.setWritable(false); addAttribute(constraintTranslateZ); constraintTargetX = numAttr.create( "constraintTargetX", "ttx", MFnNumericData::kDouble, 0.0, &status ); if(!status) { MGlobal::displayInfo("failed to create attrib constraintTargetX"); return status; } addAttribute(constraintTargetX); constraintTargetY = numAttr.create( "constraintTargetY", "tty", MFnNumericData::kDouble, 0.0, &status ); if(!status) { MGlobal::displayInfo("failed to create attrib constraintTargetY"); return status; } addAttribute(constraintTargetY); constraintTargetZ = numAttr.create( "constraintTargetZ", "ttz", MFnNumericData::kDouble, 0.0, &status ); if(!status) { MGlobal::displayInfo("failed to create attrib constraintTargetZ"); return status; } addAttribute(constraintTargetZ); constraintObjectX = numAttr.create( "constraintObjectX", "otx", MFnNumericData::kDouble, 0.0, &status ); if(!status) { MGlobal::displayInfo("failed to create attrib constraintObjectX"); return status; } addAttribute(constraintObjectX); constraintObjectY = numAttr.create( "constraintObjectY", "oty", MFnNumericData::kDouble, 0.0, &status ); if(!status) { MGlobal::displayInfo("failed to create attrib constraintObjectY"); return status; } addAttribute(constraintObjectY); constraintObjectZ = numAttr.create( "constraintObjectZ", "otz", MFnNumericData::kDouble, 0.0, &status ); if(!status) { MGlobal::displayInfo("failed to create attrib constraintObjectZ"); return status; } addAttribute(constraintObjectZ); targetOffset = numAttr.create("targetOffset", "tgo", MFnNumericData::k3Double, 0.0, &status); if (!status) { status.perror("addAttribute targetOffset"); return status;} addAttribute(targetOffset); targetRestP = numAttr.create("targetRestAt", "tgrt", MFnNumericData::k3Double, 0.0, &status); if (!status) { status.perror("addAttribute targetRestAt"); return status;} addAttribute(targetRestP); status = addAttribute( geometrySurfaceConstraint::constraintParentInverseMatrix ); if (!status) { status.perror("addAttribute"); return status;} status = addAttribute( geometrySurfaceConstraint::constraintGeometry ); if (!status) { status.perror("addAttribute"); return status;} status = addAttribute( geometrySurfaceConstraint::compoundTarget ); if (!status) { status.perror("addAttribute"); return status;} status = attributeAffects( compoundTarget, constraintGeometry ); if (!status) { status.perror("attributeAffects"); return status;} status = attributeAffects( targetTransform, constraintGeometry ); if (!status) { status.perror("attributeAffects"); return status;} status = attributeAffects( targetGeometry, constraintGeometry ); if (!status) { status.perror("attributeAffects"); return status;} status = attributeAffects( targetWeight, constraintGeometry ); if (!status) { status.perror("attributeAffects"); return status;} status = attributeAffects( constraintParentInverseMatrix, constraintGeometry ); if (!status) { status.perror("attributeAffects"); return status;} attributeAffects(targetTransform, constraintTranslateX); attributeAffects(targetTransform, constraintTranslateY); attributeAffects(targetTransform, constraintTranslateZ); return MS::kSuccess; }
MStatus geometrySurfaceConstraint::initialize() { MFnNumericAttribute nAttr; MStatus status; // constraint attributes { // Geometry: mesh, readable, not writable, delete on disconnect MFnTypedAttribute typedAttrNotWritable; geometrySurfaceConstraint::constraintGeometry = typedAttrNotWritable.create( "constraintGeometry", "cg", MFnData::kMesh, &status ); if (!status) { status.perror("typedAttrNotWritable.create:cgeom"); return status;} status = typedAttrNotWritable.setReadable(true); if (!status) { status.perror("typedAttrNotWritable.setReadable:cgeom"); return status;} status = typedAttrNotWritable.setWritable(false); if (!status) { status.perror("typedAttrNotWritable.setWritable:cgeom"); return status;} status = typedAttrNotWritable.setDisconnectBehavior(MFnAttribute::kDelete); if (!status) { status.perror("typedAttrNotWritable.setDisconnectBehavior:cgeom"); return status;} } { // Parent inverse matrix: delete on disconnect MFnTypedAttribute typedAttr; geometrySurfaceConstraint::constraintParentInverseMatrix = typedAttr.create( "constraintPim", "ci", MFnData::kMatrix, &status ); if (!status) { status.perror("typedAttr.create:matrix"); return status;} status = typedAttr.setDisconnectBehavior(MFnAttribute::kDelete); if (!status) { status.perror("typedAttr.setDisconnectBehavior:cgeom"); return status;} // Target geometry: mesh, delete on disconnect geometrySurfaceConstraint::targetGeometry = typedAttr.create( "targetGeometry", "tg", MFnData::kMesh, &status ); if (!status) { status.perror("typedAttr.create:tgeom"); return status;} status = typedAttr.setDisconnectBehavior(MFnAttribute::kDelete); if (!status) { status.perror("typedAttr.setDisconnectBehavior:cgeom"); return status;} } { // Target weight: double, min 0, default 1.0, keyable, delete on disconnect MFnNumericAttribute typedAttrKeyable; geometrySurfaceConstraint::targetWeight = typedAttrKeyable.create( "weight", "wt", MFnNumericData::kDouble, 1.0, &status ); if (!status) { status.perror("typedAttrKeyable.create:weight"); return status;} status = typedAttrKeyable.setMin( (double) 0 ); if (!status) { status.perror("typedAttrKeyable.setMin"); return status;} status = typedAttrKeyable.setKeyable( true ); if (!status) { status.perror("typedAttrKeyable.setKeyable"); return status;} status = typedAttrKeyable.setDisconnectBehavior(MFnAttribute::kDelete); if (!status) { status.perror("typedAttrKeyable.setDisconnectBehavior:cgeom"); return status;} } { // Compound target(geometry,weight): array, delete on disconnect MFnCompoundAttribute compoundAttr; geometrySurfaceConstraint::compoundTarget = compoundAttr.create( "target", "tgt",&status ); if (!status) { status.perror("compoundAttr.create"); return status;} status = compoundAttr.addChild( geometrySurfaceConstraint::targetGeometry ); if (!status) { status.perror("compoundAttr.addChild"); return status;} status = compoundAttr.addChild( geometrySurfaceConstraint::targetWeight ); if (!status) { status.perror("compoundAttr.addChild"); return status;} status = compoundAttr.setArray( true ); if (!status) { status.perror("compoundAttr.setArray"); return status;} status = compoundAttr.setDisconnectBehavior(MFnAttribute::kDelete); if (!status) { status.perror("typedAttrKeyable.setDisconnectBehavior:cgeom"); return status;} } status = addAttribute( geometrySurfaceConstraint::constraintParentInverseMatrix ); if (!status) { status.perror("addAttribute"); return status;} status = addAttribute( geometrySurfaceConstraint::constraintGeometry ); if (!status) { status.perror("addAttribute"); return status;} status = addAttribute( geometrySurfaceConstraint::compoundTarget ); if (!status) { status.perror("addAttribute"); return status;} status = attributeAffects( compoundTarget, constraintGeometry ); if (!status) { status.perror("attributeAffects"); return status;} status = attributeAffects( targetGeometry, constraintGeometry ); if (!status) { status.perror("attributeAffects"); return status;} status = attributeAffects( targetWeight, constraintGeometry ); if (!status) { status.perror("attributeAffects"); return status;} status = attributeAffects( constraintParentInverseMatrix, constraintGeometry ); if (!status) { status.perror("attributeAffects"); return status;} return MS::kSuccess; }