MStatus nailConstraintNode::initialize() { MStatus status; MFnMessageAttribute fnMsgAttr; MFnNumericAttribute fnNumericAttr; MFnMatrixAttribute fnMatrixAttr; ia_rigidBody = fnMsgAttr.create("inRigidBody", "inrb", &status); MCHECKSTATUS(status, "creating inRigidBody attribute") status = addAttribute(ia_rigidBody); MCHECKSTATUS(status, "adding inRigidBody attribute") ia_damping = fnNumericAttr.create("damping", "dmp", MFnNumericData::kDouble, 1.0, &status); MCHECKSTATUS(status, "creating damping attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_damping); MCHECKSTATUS(status, "adding damping attribute") ca_constraint = fnNumericAttr.create("ca_constraint", "caco", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_constraint attribute") fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_constraint); MCHECKSTATUS(status, "adding ca_constraint attribute") ca_constraintParam = fnNumericAttr.create("ca_constraintParam", "cacop", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_constraintParam attribute") fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_constraintParam); MCHECKSTATUS(status, "adding ca_constraintParam attribute") status = attributeAffects(ia_rigidBody, ca_constraint); MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBody, ca_constraint)") status = attributeAffects(ia_rigidBody, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBody, ca_constraintParam)") status = attributeAffects(ia_damping, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_damping, ca_constraintParam)") return MS::kSuccess; }
MStatus uninitializePlugin( MObject obj ) { MStatus status; MFnPlugin plugin( obj ); status = plugin.deregisterCommand(dNailConstraintCmd::typeName); MCHECKSTATUS(status, "deregistering dNailConstraintCmd") status = plugin.deregisterCommand(dRigidBodyArrayCmd::typeName); MCHECKSTATUS(status, "deregistering dRigidBodyArrayCmd") status = plugin.deregisterCommand(dRigidBodyCmd::typeName); MCHECKSTATUS(status, "deregistering dRigidBodyCmd") status = plugin.deregisterCommand(dSolverCmd::typeName); MCHECKSTATUS(status, "deregistering dSolverGlobalsCmd") status = plugin.deregisterNode(dSolverNode::typeId); MCHECKSTATUS(status, "deregistering dSolverNode") status = plugin.deregisterNode(nailConstraintNode::typeId); MCHECKSTATUS(status, "deregistering nailConstraintNode") status = plugin.deregisterNode(collisionShapeNode::typeId); MCHECKSTATUS(status, "deregistering collisionShapeNode") status = plugin.deregisterNode(rigidBodyArrayNode::typeId); MCHECKSTATUS(status, "deregistering rigidBodyArrayNode") status = plugin.deregisterNode(rigidBodyNode::typeId); MCHECKSTATUS(status, "deregistering rigidBodyNode") status = plugin.deregisterFileTranslator( "COLLADA Physics export" ); MCHECKSTATUS(status,"deregistering COLLADA Physics export" ) solver_t::cleanup(); return status; }
MStatus sixdofConstraintNode::initialize() { MStatus status; MFnMessageAttribute fnMsgAttr; MFnNumericAttribute fnNumericAttr; MFnMatrixAttribute fnMatrixAttr; ia_rigidBodyA = fnMsgAttr.create("inRigidBodyA", "inrbA", &status); MCHECKSTATUS(status, "creating inRigidBodyA attribute") status = addAttribute(ia_rigidBodyA); MCHECKSTATUS(status, "adding inRigidBody attribute") ia_rigidBodyB = fnMsgAttr.create("inRigidBodyB", "inrbB", &status); MCHECKSTATUS(status, "creating inRigidBodyB attribute") status = addAttribute(ia_rigidBodyB); MCHECKSTATUS(status, "adding inRigidBodyB attribute") ia_damping = fnNumericAttr.create("damping", "dmp", MFnNumericData::kDouble, 1.0, &status); MCHECKSTATUS(status, "creating damping attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_damping); MCHECKSTATUS(status, "adding damping attribute") ia_breakThreshold = fnNumericAttr.create("breakThreshold", "brkThrsh", MFnNumericData::kDouble, 100.0, &status); MCHECKSTATUS(status, "creating breakThreshold attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_breakThreshold); MCHECKSTATUS(status, "adding breakThreshold attribute") ia_disableCollide = fnNumericAttr.create("disableCollide", "dsblColl", MFnNumericData::kBoolean, true, &status); MCHECKSTATUS(status, "creating disableCollide attribute") fnNumericAttr.setHidden(true); fnNumericAttr.setKeyable(true); status = addAttribute(ia_disableCollide); MCHECKSTATUS(status, "adding disableCollide attribute") ia_lowerLinLimit = fnNumericAttr.createPoint("lowerLinLimit", "lllt", &status); MCHECKSTATUS(status, "creating lower linear limit attribute") status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); fnNumericAttr.setKeyable(true); status = addAttribute(ia_lowerLinLimit); MCHECKSTATUS(status, "adding lower linear limit attribute") ia_upperLinLimit = fnNumericAttr.createPoint("upperLinLimit", "ullt", &status); MCHECKSTATUS(status, "creating upper linear limit attribute") status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); fnNumericAttr.setKeyable(true); status = addAttribute(ia_upperLinLimit); MCHECKSTATUS(status, "adding upper linear limit attribute") ia_lowerAngLimit = fnNumericAttr.createPoint("lowerAngLimit", "lalt", &status); MCHECKSTATUS(status, "creating lower angular limit attribute") status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); fnNumericAttr.setKeyable(true); status = addAttribute(ia_lowerAngLimit); MCHECKSTATUS(status, "adding lower angular limit attribute") ia_upperAngLimit = fnNumericAttr.createPoint("upperAngLimit", "ualt", &status); MCHECKSTATUS(status, "creating upper angular limit attribute") status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); fnNumericAttr.setKeyable(true); status = addAttribute(ia_upperAngLimit); MCHECKSTATUS(status, "adding upper angular limit attribute") ca_constraint = fnNumericAttr.create("ca_constraint", "caco", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_constraint attribute") fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_constraint); MCHECKSTATUS(status, "adding ca_constraint attribute") ca_constraintParam = fnNumericAttr.create("ca_constraintParam", "cacop", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_constraintParam attribute") fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_constraintParam); MCHECKSTATUS(status, "adding ca_constraintParam attribute") ia_rotationInA = fnNumericAttr.createPoint("rotationInA", "hgRotA", &status); status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); MCHECKSTATUS(status, "creating rotationInA attribute") status = addAttribute(ia_rotationInA); MCHECKSTATUS(status, "adding rotationInA attribute") ia_rotationInB = fnNumericAttr.createPoint("rotationInB", "hgRotB", &status); status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); MCHECKSTATUS(status, "creating rotationInB attribute") status = addAttribute(ia_rotationInB); MCHECKSTATUS(status, "adding rotationInB attribute") ia_pivotInA = fnNumericAttr.createPoint("pivotInA", "pivinA", &status); status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); MCHECKSTATUS(status, "creating pivotInA attribute") status = addAttribute(ia_pivotInA); MCHECKSTATUS(status, "adding pivotInA attribute") ia_pivotInB = fnNumericAttr.createPoint("pivotInB", "pivinB", &status); status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 0.0); MCHECKSTATUS(status, "creating pivotInB attribute") status = addAttribute(ia_pivotInB); MCHECKSTATUS(status, "adding pivotInB attribute") status = attributeAffects(ia_rigidBodyA, ca_constraint); MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraint)") status = attributeAffects(ia_rigidBodyA, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraintParam)") status = attributeAffects(ia_rigidBodyB, ca_constraint); MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraint)") status = attributeAffects(ia_rigidBodyB, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraintParam)") status = attributeAffects(ia_damping, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_damping, ca_constraintParam)") status = attributeAffects(ia_breakThreshold, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_breakThreshold, ca_constraintParam)") status = attributeAffects(ia_disableCollide, ca_constraint); MCHECKSTATUS(status, "adding attributeAffects(ia_disableCollide, ca_constraint)") status = attributeAffects(ia_lowerLinLimit, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_lowerLinLimit, ca_constraintParam)") status = attributeAffects(ia_upperLinLimit, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_upperLinLimit, ca_constraintParam)") status = attributeAffects(ia_lowerAngLimit, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_lowerAngLimit, ca_constraintParam)") status = attributeAffects(ia_upperAngLimit, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_upperAngLimit, ca_constraintParam)") status = attributeAffects(ia_rotationInA, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_rotationInA, ca_constraintParam)") status = attributeAffects(ia_rotationInB, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_rotationInB, ca_constraintParam)") status = attributeAffects(ia_pivotInA, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_pivotInA, ca_constraintParam)") status = attributeAffects(ia_pivotInB, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_pivotInB, ca_constraintParam)") return MS::kSuccess; }
MStatus collisionShapeNode::initialize() { MStatus status; MFnMessageAttribute fnMsgAttr; MFnNumericAttribute fnNumericAttr; MFnEnumAttribute fnEnumAttr; ia_type = fnEnumAttr.create("type", "tp", 7, &status); MCHECKSTATUS(status, "creating type attribute") fnEnumAttr.addField("Convex Hull", 0); fnEnumAttr.addField("Mesh", 1); fnEnumAttr.addField("Cylinder", 2); fnEnumAttr.addField("Capsule", 3); fnEnumAttr.addField("Box", 4); fnEnumAttr.addField("Sphere", 5); fnEnumAttr.addField("Plane", 6); fnEnumAttr.addField("BvhMesh", 7); fnEnumAttr.addField("HACD", 8); fnEnumAttr.setKeyable(true); status = addAttribute(ia_type); MCHECKSTATUS(status, "adding type attribute") ia_scale = fnNumericAttr.createPoint("scale", "sc", &status); MCHECKSTATUS(status, "creating ia_scale attribute") fnNumericAttr.setDefault(1.0, 1.0, 1.0); fnNumericAttr.setKeyable(true); status = addAttribute(ia_scale); MCHECKSTATUS(status, "adding ia_scale attribute") oa_collisionShape = fnMsgAttr.create("outCollisionShape", "oucs", &status); MCHECKSTATUS(status, "creating outCollisionShape attribute") status = addAttribute(oa_collisionShape); MCHECKSTATUS(status, "adding outCollisionShape attribute") ia_shape = fnMsgAttr.create("inShape", "insh", &status); MCHECKSTATUS(status, "creating inShape attribute") status = addAttribute(ia_shape); MCHECKSTATUS(status, "adding inShape attribute") ca_collisionShape = fnNumericAttr.create("ca_collisionShape", "ccs", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_collisionShape attribute") fnNumericAttr.setWorldSpace(true); fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_collisionShape); MCHECKSTATUS(status, "adding ca_collisionShape attribute") ca_collisionShapeParam = fnNumericAttr.create("collisionShapeParam", "cspm", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_collisionShapeParam attribute") fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_collisionShapeParam); MCHECKSTATUS(status, "adding ca_collisionShapeParam attribute") // status = attributeAffects(ia_shape, oa_collisionShape); MCHECKSTATUS(status, "adding attributeAffects(ia_shape, oa_collisionShape)") status = attributeAffects(ia_type, oa_collisionShape); MCHECKSTATUS(status, "adding attributeAffects(ia_type, oa_collisionShape)") status = attributeAffects(ia_scale, oa_collisionShape); MCHECKSTATUS(status, "adding attributeAffects(ia_scale, oa_collisionShape)") // status = attributeAffects(ia_shape, ca_collisionShape); MCHECKSTATUS(status, "adding attributeAffects(ia_shape, ca_collisionShape)") status = attributeAffects(ia_type, ca_collisionShape); MCHECKSTATUS(status, "adding attributeAffects(ia_shape, ca_collisionShape)") // status = attributeAffects(ia_shape, ca_collisionShapeParam); MCHECKSTATUS(status, "adding attributeAffects(ia_shape, oa_collisionShapeParam)") status = attributeAffects(ia_scale, ca_collisionShapeParam); MCHECKSTATUS(status, "adding attributeAffects(ia_scale, oa_collisionShapeParam)") status = attributeAffects(ia_type, ca_collisionShapeParam); MCHECKSTATUS(status, "adding attributeAffects(ia_type, oa_collisionShapeParam)") return MS::kSuccess; }
MStatus hingeConstraintNode::initialize() { MStatus status; MFnMessageAttribute fnMsgAttr; MFnNumericAttribute fnNumericAttr; MFnMatrixAttribute fnMatrixAttr; ia_rigidBody = fnMsgAttr.create("inRigidBody", "inrb", &status); MCHECKSTATUS(status, "creating inRigidBody attribute") status = addAttribute(ia_rigidBody); MCHECKSTATUS(status, "adding inRigidBody attribute") ia_damping = fnNumericAttr.create("damping", "dmp", MFnNumericData::kDouble, 1.0, &status); MCHECKSTATUS(status, "creating damping attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_damping); MCHECKSTATUS(status, "adding damping attribute") ia_lowerLimit = fnNumericAttr.create("lowerLimit", "llmt", MFnNumericData::kDouble, -1.57, &status); MCHECKSTATUS(status, "creating lower limit attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_lowerLimit); MCHECKSTATUS(status, "adding lower limit attribute") ia_upperLimit = fnNumericAttr.create("upperLimit", "ulmt", MFnNumericData::kDouble, 1.57, &status); MCHECKSTATUS(status, "creating upper limit attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_upperLimit); MCHECKSTATUS(status, "adding upper limit attribute") ia_limitSoftness = fnNumericAttr.create("limitSoftness", "lmSo", MFnNumericData::kDouble, 0.9, &status); MCHECKSTATUS(status, "creating limitSoftness attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_limitSoftness); MCHECKSTATUS(status, "adding limitSoftness attribute") ia_biasFactor = fnNumericAttr.create("biasFactor", "biFa", MFnNumericData::kDouble, 0.3, &status); MCHECKSTATUS(status, "creating biasFactor attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_biasFactor); MCHECKSTATUS(status, "adding biasFactor attribute") ia_relaxationFactor = fnNumericAttr.create("relaxationFactor", "reFa", MFnNumericData::kDouble, 1.0, &status); MCHECKSTATUS(status, "creating relaxationFactor attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_relaxationFactor); MCHECKSTATUS(status, "adding relaxationFactor attribute") ia_hingeAxis = fnNumericAttr.createPoint("hingeAxis", "hgAx", &status); status = fnNumericAttr.setDefault((double) 0.0, (double) 0.0, (double) 1.0); MCHECKSTATUS(status, "creating hingeAxis attribute") status = addAttribute(ia_hingeAxis); MCHECKSTATUS(status, "adding hingeAxis attribute") //------------------------------------------------------------------------------ ia_enableAngularMotor = fnNumericAttr.create("enableAngularMotor", "enAM", MFnNumericData::kBoolean, false, &status); MCHECKSTATUS(status, "creating enableAngularMotor attribute") status = addAttribute(ia_enableAngularMotor); MCHECKSTATUS(status, "adding enableAngularMotor attribute") ia_motorTargetVelocity = fnNumericAttr.create("motorTargetVelocity", "mTV", MFnNumericData::kDouble, 1, &status); MCHECKSTATUS(status, "creating motorTargetVelocity attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_motorTargetVelocity); MCHECKSTATUS(status, "adding motorTargetVelocity attribute") ia_maxMotorImpulse = fnNumericAttr.create("maxMotorImpulse", "mMI", MFnNumericData::kDouble, 1, &status); MCHECKSTATUS(status, "creating maxMotorImpulse attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_maxMotorImpulse); MCHECKSTATUS(status, "adding maxMotorImpulse attribute") //------------------------------------------------------------------------------ ca_constraint = fnNumericAttr.create("ca_constraint", "caco", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_constraint attribute") fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_constraint); MCHECKSTATUS(status, "adding ca_constraint attribute") ca_constraintParam = fnNumericAttr.create("ca_constraintParam", "cacop", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_constraintParam attribute") fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_constraintParam); MCHECKSTATUS(status, "adding ca_constraintParam attribute") status = attributeAffects(ia_rigidBody, ca_constraint); MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBody, ca_constraint)") status = attributeAffects(ia_rigidBody, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBody, ca_constraintParam)") status = attributeAffects(ia_damping, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_damping, ca_constraintParam)") status = attributeAffects(ia_lowerLimit, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_lowerLimit, ca_constraintParam)") status = attributeAffects(ia_upperLimit, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_upperLimit, ca_constraintParam)") status = attributeAffects(ia_limitSoftness, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_limitSoftness, ca_constraintParam)") status = attributeAffects(ia_biasFactor, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_biasFactor, ca_constraintParam)") status = attributeAffects(ia_relaxationFactor, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_relaxationFactor, ca_constraintParam)") status = attributeAffects(ia_hingeAxis, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_hingeAxis, ca_constraintParam)") status = attributeAffects(ia_enableAngularMotor, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_enableAngularMotor, ca_constraintParam)") status = attributeAffects(ia_motorTargetVelocity, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_motorTargetVelocity, ca_constraintParam)") status = attributeAffects(ia_maxMotorImpulse, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_maxMotorImpulse, ca_constraintParam)") return MS::kSuccess; }
MStatus SoftBodyNode::initialize() { MFnMessageAttribute fnMsgAttr; MStatus status = MStatus::kSuccess; ia_solver = fnMsgAttr.create("solver", "solv", &status); MCHECKSTATUS(status, "creating solver attribute") status = addAttribute(ia_solver); MCHECKSTATUS(status, "adding solver attribute") MFnNumericAttribute fnNumericAttr; ca_solver = fnNumericAttr.create("ca_solver", "caso", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_solver attribute") fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_solver); MCHECKSTATUS(status, "adding ca_solver attribute") ca_softBody = fnNumericAttr.create("ca_softBody", "casb", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_softBody attribute") fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_softBody); MCHECKSTATUS(status, "adding ca_softBody attribute") inputMesh = fnMsgAttr.create("inMesh", "inmsh", &status); MCHECKSTATUS(status, "creating inMesh attribute") status = addAttribute(inputMesh); MCHECKSTATUS(status, "adding inMesh attribute") outputMesh = fnMsgAttr.create("outMesh", "outmsh", &status); MCHECKSTATUS(status, "creating outMesh attribute") status = addAttribute(outputMesh); MCHECKSTATUS(status, "adding outMesh attribute") /* Note that these initial* attributes are not in use for soft bodies at the moment */ ia_initialPosition = fnNumericAttr.createPoint("initialPosition", "inpo", &status); MCHECKSTATUS(status, "creating initialPosition attribute") status = addAttribute(ia_initialPosition); MCHECKSTATUS(status, "adding initialPosition attribute") ia_initialRotation = fnNumericAttr.createPoint("initialRotation", "inro", &status); MCHECKSTATUS(status, "creating initialRotation attribute") status = addAttribute(ia_initialRotation); MCHECKSTATUS(status, "adding initialRotation attribute") ia_initialVelocity = fnNumericAttr.createPoint("initialVelocity", "inve", &status); MCHECKSTATUS(status, "creating initialVelocity attribute") status = addAttribute(ia_initialVelocity); MCHECKSTATUS(status, "adding initialVelocity attribute") ia_initialSpin = fnNumericAttr.createPoint("initialSpin", "insp", &status); MCHECKSTATUS(status, "creating initialSpin attribute") status = addAttribute(ia_initialSpin); MCHECKSTATUS(status, "adding initialSpin attribute") // total soft body mass ia_mass = fnNumericAttr.create("mass", "ma", MFnNumericData::kDouble, DEFAULT_MASS, &status); MCHECKSTATUS(status, "creating mass attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_mass); MCHECKSTATUS(status, "adding mass attribute") // create dynamic friction coefficient attribute ia_dynamicFrictionCoeff = fnNumericAttr.create("dynamicfrictioncoeff", "dfc", MFnNumericData::kDouble, DEFAULT_DFC, &status); MCHECKSTATUS(status, "creating dynamicfrictioncoeff attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_dynamicFrictionCoeff); MCHECKSTATUS(status, "adding dynamicfrictioncoeff attribute") // create collision margin attribute ia_collisionMargin = fnNumericAttr.create("collisionmargin", "cmargin", MFnNumericData::kFloat, DEFAULT_CMARGIN, &status); MCHECKSTATUS(status, "creating collisionmargin attribute") fnNumericAttr.setKeyable(false); status = addAttribute(ia_collisionMargin); MCHECKSTATUS(status, "adding collision attribute") // collision clusters attribute ia_numClusters = fnNumericAttr.create("numclusters", "nclust", MFnNumericData::kInt, DEFAULT_CLUSTERS, &status); MCHECKSTATUS(status, "creating numclusters attribute") fnNumericAttr.setKeyable(false); status = addAttribute(ia_numClusters); MCHECKSTATUS(status, "adding numclusters attribute") ca_softBodyParam = fnNumericAttr.create("ca_softBodyParam", "casbp", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_softBodyParam attribute") fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_softBodyParam); MCHECKSTATUS(status, "adding ca_softBodyParam attribute") status = attributeAffects(inputMesh, ca_softBody); MCHECKSTATUS(status, "adding attributeAffects(inputMesh, ca_softBody)") status = attributeAffects(ia_solver, ca_solver); MCHECKSTATUS(status, "adding attributeAffects(ia_solver, ca_solver)") // connect soft body parameters to ca_softBodyParam connection status = attributeAffects(ia_mass, ca_softBodyParam); MCHECKSTATUS(status, "adding attributeAffects(ia_mass, ca_softBodyParam)") status = attributeAffects(ia_dynamicFrictionCoeff, ca_softBodyParam); MCHECKSTATUS(status, "adding attributeAffects(ia_dynamicFrictionCoeff, ca_softBodyParam)") status = attributeAffects(ia_collisionMargin, ca_softBodyParam); MCHECKSTATUS(status, "adding attributeAffects(ia_collisionMargin, ca_softBodyParam)") status = attributeAffects(ia_numClusters, ca_softBodyParam); MCHECKSTATUS(status, "adding attributeAffects(ia_numClusters, ca_softBodyParam)") return status; }
MStatus rigidBodyNode::initialize() { MStatus status; MFnMessageAttribute fnMsgAttr; MFnNumericAttribute fnNumericAttr; MFnMatrixAttribute fnMatrixAttr; MFnTypedAttribute typedAttr; ia_collisionShape = fnMsgAttr.create("inCollisionShape", "incs", &status); MCHECKSTATUS(status, "creating inCollisionShape attribute") status = addAttribute(ia_collisionShape); MCHECKSTATUS(status, "adding inCollisionShape attribute") ia_solver = fnMsgAttr.create("solver", "solv", &status); MCHECKSTATUS(status, "creating solver attribute") status = addAttribute(ia_solver); MCHECKSTATUS(status, "adding solver attribute") ia_mass = fnNumericAttr.create("mass", "ma", MFnNumericData::kDouble, 1.0, &status); MCHECKSTATUS(status, "creating mass attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_mass); MCHECKSTATUS(status, "adding mass attribute") ia_restitution = fnNumericAttr.create("restitution", "rst", MFnNumericData::kDouble, 0.1, &status); MCHECKSTATUS(status, "creating restitution attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_restitution); MCHECKSTATUS(status, "adding restitution attribute") ia_friction = fnNumericAttr.create("friction", "fc", MFnNumericData::kDouble, 0.5, &status); MCHECKSTATUS(status, "creating friction attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_friction); MCHECKSTATUS(status, "adding friction attribute") ia_linearDamping = fnNumericAttr.create("linearDamping", "ld", MFnNumericData::kDouble, 0.3, &status); MCHECKSTATUS(status, "creating linearDamping attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_linearDamping); MCHECKSTATUS(status, "adding linearDamping attribute") ia_angularDamping = fnNumericAttr.create("angularDamping", "ad", MFnNumericData::kDouble, 0.3, &status); MCHECKSTATUS(status, "creating angularDamping attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_angularDamping); MCHECKSTATUS(status, "adding angularDamping attribute") ia_initialPosition = fnNumericAttr.createPoint("initialPosition", "inpo", &status); MCHECKSTATUS(status, "creating initialPosition attribute") status = addAttribute(ia_initialPosition); MCHECKSTATUS(status, "adding initialPosition attribute") ia_initialRotation = fnNumericAttr.createPoint("initialRotation", "inro", &status); MCHECKSTATUS(status, "creating initialRotation attribute") status = addAttribute(ia_initialRotation); MCHECKSTATUS(status, "adding initialRotation attribute") ia_initialVelocity = fnNumericAttr.createPoint("initialVelocity", "inve", &status); MCHECKSTATUS(status, "creating initialVelocity attribute") status = addAttribute(ia_initialVelocity); MCHECKSTATUS(status, "adding initialVelocity attribute") ia_initialSpin = fnNumericAttr.createPoint("initialSpin", "insp", &status); MCHECKSTATUS(status, "creating initialSpin attribute") status = addAttribute(ia_initialSpin); MCHECKSTATUS(status, "adding initialSpin attribute") ia_externalForce = fnNumericAttr.createPoint("externalForce", "exfo", &status); MCHECKSTATUS(status, "creating externalForce attribute") status = addAttribute(ia_externalForce); MCHECKSTATUS(status, "adding externalForce attribute") ia_externalTorque = fnNumericAttr.createPoint("externalTorque", "exto", &status); MCHECKSTATUS(status, "creating externalTorque attribute") status = addAttribute(ia_externalTorque); MCHECKSTATUS(status, "adding externalTorque attribute") ca_rigidBody = fnNumericAttr.create("ca_rigidBody", "carb", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_rigidBody attribute") fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_rigidBody); MCHECKSTATUS(status, "adding ca_rigidBody attribute") ca_rigidBodyParam = fnNumericAttr.create("ca_rigidBodyParam", "carbp", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_rigidBodyParam attribute") fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_rigidBodyParam); MCHECKSTATUS(status, "adding ca_rigidBodyParam attribute") ca_solver = fnNumericAttr.create("ca_solver", "caso", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_solver attribute") fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_solver); MCHECKSTATUS(status, "adding ca_solver attribute") oa_contactCount = fnNumericAttr.create("contactCount", "contactCount", MFnNumericData::kInt, 0, &status); MCHECKSTATUS(status, "creating oa_contactCount attribute") fnNumericAttr.setConnectable(true); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(oa_contactCount); MCHECKSTATUS(status, "adding oa_contactCount attribute"); MFnStringArrayData stringArrayData; oa_contactName = typedAttr.create("contactName", "contactName", MFnData::kStringArray, stringArrayData.create(), &status); MCHECKSTATUS(status, "creating oa_contactName attribute") typedAttr.setHidden(true); status = addAttribute(oa_contactName); MCHECKSTATUS(status, "adding oa_contactName attribute"); oa_contactPosition = typedAttr.create("contactPosition", "contactPosition", MFnVectorArrayData::kVectorArray, &status); MCHECKSTATUS(status, "creating oa_contactPosition attribute") typedAttr.setHidden(true); status = addAttribute(oa_contactPosition); MCHECKSTATUS(status, "adding oa_contactPosition attribute"); status = attributeAffects(ia_mass, ca_rigidBody); MCHECKSTATUS(status, "adding attributeAffects(ia_mass, ca_rigidBodyParam)") status = attributeAffects(ia_collisionShape, ca_rigidBody); MCHECKSTATUS(status, "adding attributeAffects(ia_collisionShape, ca_rigidBody)") status = attributeAffects(ia_collisionShape, ca_rigidBodyParam); MCHECKSTATUS(status, "adding attributeAffects(ia_collisionShape, ca_rigidBodyParam)") status = attributeAffects(ia_mass, ca_rigidBodyParam); MCHECKSTATUS(status, "adding attributeAffects(ia_mass, ca_rigidBodyParam)") status = attributeAffects(ia_restitution, ca_rigidBodyParam); MCHECKSTATUS(status, "adding attributeAffects(ia_restitution, ca_rigidBodyParam)") status = attributeAffects(ia_friction, ca_rigidBodyParam); MCHECKSTATUS(status, "adding attributeAffects(ia_friction, ca_rigidBodyParam)") status = attributeAffects(ia_linearDamping, ca_rigidBodyParam); MCHECKSTATUS(status, "adding attributeAffects(ia_linearDamping, ca_rigidBodyParam)") status = attributeAffects(ia_angularDamping, ca_rigidBodyParam); MCHECKSTATUS(status, "adding attributeAffects(ia_angularDamping, ca_rigidBodyParam)") status = attributeAffects(ia_initialPosition, ca_rigidBodyParam); MCHECKSTATUS(status, "adding attributeAffects(ia_initialPosition, ca_rigidBodyParam)") status = attributeAffects(ia_solver, ca_solver); MCHECKSTATUS(status, "adding attributeAffects(ia_solver, ca_solver)") return MS::kSuccess; }
MStatus sixdofConstraintNode::initialize() { MStatus status; MFnMessageAttribute fnMsgAttr; MFnNumericAttribute fnNumericAttr; MFnMatrixAttribute fnMatrixAttr; ia_rigidBodyA = fnMsgAttr.create("inRigidBodyA", "inrbA", &status); MCHECKSTATUS(status, "creating inRigidBodyA attribute") status = addAttribute(ia_rigidBodyA); MCHECKSTATUS(status, "adding inRigidBody attribute") ia_rigidBodyB = fnMsgAttr.create("inRigidBodyB", "inrbB", &status); MCHECKSTATUS(status, "creating inRigidBodyB attribute") status = addAttribute(ia_rigidBodyB); MCHECKSTATUS(status, "adding inRigidBodyB attribute") ia_damping = fnNumericAttr.create("damping", "dmp", MFnNumericData::kDouble, 1.0, &status); MCHECKSTATUS(status, "creating damping attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_damping); MCHECKSTATUS(status, "adding damping attribute") ia_lowerLinLimit = fnNumericAttr.create("lowerLinLimit", "lllt", MFnNumericData::kDouble, 1, &status); MCHECKSTATUS(status, "creating lower linear limit attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_lowerLinLimit); MCHECKSTATUS(status, "adding lower linear limit attribute") ia_upperLinLimit = fnNumericAttr.create("upperLinLimit", "ullt", MFnNumericData::kDouble, -1, &status); MCHECKSTATUS(status, "creating upper linear limit attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_upperLinLimit); MCHECKSTATUS(status, "adding upper linear limit attribute") ia_lowerAngLimit = fnNumericAttr.create("lowerAngLimit", "lalt", MFnNumericData::kDouble, 0, &status); MCHECKSTATUS(status, "creating lower angular limit attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_lowerAngLimit); MCHECKSTATUS(status, "adding lower angular limit attribute") ia_upperAngLimit = fnNumericAttr.create("upperAngLimit", "ualt", MFnNumericData::kDouble, 0, &status); MCHECKSTATUS(status, "creating upper angular limit attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_upperAngLimit); MCHECKSTATUS(status, "adding upper angular limit attribute") ca_constraint = fnNumericAttr.create("ca_constraint", "caco", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_constraint attribute") fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_constraint); MCHECKSTATUS(status, "adding ca_constraint attribute") ca_constraintParam = fnNumericAttr.create("ca_constraintParam", "cacop", MFnNumericData::kBoolean, 0, &status); MCHECKSTATUS(status, "creating ca_constraintParam attribute") fnNumericAttr.setConnectable(false); fnNumericAttr.setHidden(true); fnNumericAttr.setStorable(false); fnNumericAttr.setKeyable(false); status = addAttribute(ca_constraintParam); MCHECKSTATUS(status, "adding ca_constraintParam attribute") status = attributeAffects(ia_rigidBodyA, ca_constraint); MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraint)") status = attributeAffects(ia_rigidBodyA, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraintParam)") status = attributeAffects(ia_rigidBodyB, ca_constraint); MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraint)") status = attributeAffects(ia_rigidBodyB, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraintParam)") status = attributeAffects(ia_damping, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_damping, ca_constraintParam)") status = attributeAffects(ia_lowerLinLimit, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_lowerLinLimit, ca_constraintParam)") status = attributeAffects(ia_upperLinLimit, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_upperLinLimit, ca_constraintParam)") status = attributeAffects(ia_lowerAngLimit, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_lowerAngLimit, ca_constraintParam)") status = attributeAffects(ia_upperAngLimit, ca_constraintParam); MCHECKSTATUS(status, "adding attributeAffects(ia_upperAngLimit, ca_constraintParam)") return MS::kSuccess; }
MStatus initializePlugin( MObject obj ) { MStatus status; MFnPlugin plugin( obj, "Walt Disney Feature Animation", "1.0", "Any"); solver_t::initialize(); // Register the translator with the system status = plugin.registerFileTranslator( "COLLADA Physics export", "none", ObjTranslator::creator, (char *)colladaOptionScript, (char *)colladaDefaultOptions ); MCHECKSTATUS(status,"registerFileTranslator COLLADA Physics export") // status = plugin.registerNode( rigidBodyNode::typeName, rigidBodyNode::typeId, rigidBodyNode::creator, rigidBodyNode::initialize, MPxNode::kLocatorNode ); MCHECKSTATUS(status, "registering rigidBodyNode") MDGMessage::addNodeRemovedCallback(rigidBodyNode::nodeRemoved, rigidBodyNode::typeName); // status = plugin.registerNode( rigidBodyArrayNode::typeName, rigidBodyArrayNode::typeId, rigidBodyArrayNode::creator, rigidBodyArrayNode::initialize, MPxNode::kLocatorNode ); MCHECKSTATUS(status, "registering rigidBodyArrayNode") MDGMessage::addNodeRemovedCallback(rigidBodyArrayNode::nodeRemoved, rigidBodyArrayNode::typeName); // status = plugin.registerNode( collisionShapeNode::typeName, collisionShapeNode::typeId, collisionShapeNode::creator, collisionShapeNode::initialize, MPxNode::kDependNode ); MCHECKSTATUS(status, "registering collisionShapeNode") // status = plugin.registerNode( nailConstraintNode::typeName, nailConstraintNode::typeId, nailConstraintNode::creator, nailConstraintNode::initialize, MPxNode::kLocatorNode ); MCHECKSTATUS(status, "registering nailConstraintNode") MDGMessage::addNodeRemovedCallback(nailConstraintNode::nodeRemoved, nailConstraintNode::typeName); // status = plugin.registerNode( dSolverNode::typeName, dSolverNode::typeId, dSolverNode::creator, dSolverNode::initialize, MPxNode::kDependNode ); MCHECKSTATUS(status, "registering dSolverNode") status = plugin.registerCommand( dSolverCmd::typeName, dSolverCmd::creator, dSolverCmd::syntax); MCHECKSTATUS(status, "registering dSolverCmd") status = plugin.registerCommand( dRigidBodyCmd::typeName, dRigidBodyCmd::creator, dRigidBodyCmd::syntax); MCHECKSTATUS(status, "registering dRigidBodyCmd") status = plugin.registerCommand( dRigidBodyArrayCmd::typeName, dRigidBodyArrayCmd::creator, dRigidBodyArrayCmd::syntax); MCHECKSTATUS(status, "registering dRigidBodyArrayCmd") status = plugin.registerCommand( dNailConstraintCmd::typeName, dNailConstraintCmd::creator, dNailConstraintCmd::syntax); MCHECKSTATUS(status, "registering dNailConstraintCmd") MGlobal::executeCommand( "source dynamicaUI.mel" ); MGlobal::executeCommand( "dynamicaUI_initialize" ); return status; }
MStatus dSolverNode::initialize() { MStatus status; MFnEnumAttribute fnEnumAttr; MFnMessageAttribute fnMsgAttr; MFnUnitAttribute fnUnitAttr; MFnNumericAttribute fnNumericAttr; // ssSolverType = fnEnumAttr.create( "ssSolverType", "ssst", 0, &status ); MCHECKSTATUS(status, "creating ssSolverType attribute") fnEnumAttr.addField( "Bullet Physics", 0 ); fnEnumAttr.addField( "Ageia PhysX", 1 ); fnEnumAttr.addField( "Stanford PhysBAM", 2 ); status = addAttribute(ssSolverType); MCHECKSTATUS(status, "adding ssSolverType attribute") // ia_time = fnUnitAttr.create( "inTime", "it", MFnUnitAttribute::kTime, 0.0, &status ); MCHECKSTATUS(status, "creating ia_time attribute") fnUnitAttr.setHidden(true); status = addAttribute(ia_time); MCHECKSTATUS(status, "adding ia_time attribute") ia_startTime = fnUnitAttr.create( "startTime", "stm", MFnUnitAttribute::kTime, 1.0, &status ); MCHECKSTATUS(status, "creating ia_startTime attribute") status = addAttribute(ia_startTime); MCHECKSTATUS(status, "adding ia_startTime attribute") oa_rigidBodies = fnMsgAttr.create("rigidBodies", "rbds", &status); MCHECKSTATUS(status, "creating oa_rigidBodies attribute") status = addAttribute(oa_rigidBodies); MCHECKSTATUS(status, "adding oa_rigidBodies attribute") ia_gravity = fnNumericAttr.createPoint("gravity", "grvt", &status); MCHECKSTATUS(status, "creating gravity attribute") fnNumericAttr.setDefault(0.0, -9.81, 0.0); fnNumericAttr.setKeyable(true); status = addAttribute(ia_gravity); MCHECKSTATUS(status, "adding ia_gravity attribute") ia_substeps = fnNumericAttr.create("substeps", "sbs", MFnNumericData::kInt, 1, &status); MCHECKSTATUS(status, "creating substeps attribute") fnNumericAttr.setKeyable(true); status = addAttribute(ia_substeps); MCHECKSTATUS(status, "adding ia_substeps attribute") ia_enabled = fnNumericAttr.create("enabled", "enbl", MFnNumericData::kBoolean, true, &status); MCHECKSTATUS(status, "creating enabled attribute") status = addAttribute(ia_enabled); MCHECKSTATUS(status, "adding ia_enabled attribute") ia_splitImpulse = fnNumericAttr.create("splitImpulse", "spli", MFnNumericData::kBoolean, false, &status); MCHECKSTATUS(status, "creating splitImpulse attribute") status = addAttribute(ia_splitImpulse); MCHECKSTATUS(status, "adding ia_splitImpulse attribute") status = attributeAffects(ia_time, oa_rigidBodies); MCHECKSTATUS(status, "adding attributeAffects(ia_time, oa_rigidBodies)") status = attributeAffects(ia_enabled, oa_rigidBodies); MCHECKSTATUS(status, "adding attributeAffects(ia_enabled, oa_rigidBodies)") return MS::kSuccess; }