MStatus swissArmyLocatorManip::connectToDependNode(const MObject &node) { MStatus stat; // Get the DAG path // MFnDagNode dagNodeFn(node); dagNodeFn.getPath(fNodePath); MObject parentNode = dagNodeFn.parent(0); MFnDagNode parentNodeFn(parentNode); // Connect the plugs // MFnDependencyNode nodeFn; nodeFn.setObject(node); // FreePointTriadManip // MFnFreePointTriadManip freePointTriadManipFn(fFreePointTriadManip); MPlug translationPlug = parentNodeFn.findPlug("t", &stat); if (MStatus::kFailure != stat) { freePointTriadManipFn.connectToPointPlug(translationPlug); } // DirectionManip // MFnDirectionManip directionManipFn; directionManipFn.setObject(fDirectionManip); MPlug directionPlug = nodeFn.findPlug("arrow2Direction", &stat); if (MStatus::kFailure != stat) { directionManipFn.connectToDirectionPlug(directionPlug); unsigned startPointIndex = directionManipFn.startPointIndex(); addPlugToManipConversionCallback(startPointIndex, (plugToManipConversionCallback) &swissArmyLocatorManip::startPointCallback); } // DistanceManip // MFnDistanceManip distanceManipFn; distanceManipFn.setObject(fDistanceManip); MPlug sizePlug = nodeFn.findPlug("size", &stat); if (MStatus::kFailure != stat) { distanceManipFn.connectToDistancePlug(sizePlug); unsigned startPointIndex = distanceManipFn.startPointIndex(); addPlugToManipConversionCallback(startPointIndex, (plugToManipConversionCallback) &swissArmyLocatorManip::startPointCallback); } // CircleSweepManip // MFnCircleSweepManip circleSweepManipFn(fCircleSweepManip); MPlug arrow1AnglePlug = nodeFn.findPlug("arrow1Angle", &stat); if (MStatus::kFailure != stat) { circleSweepManipFn.connectToAnglePlug(arrow1AnglePlug); unsigned centerIndex = circleSweepManipFn.centerIndex(); addPlugToManipConversionCallback(centerIndex, (plugToManipConversionCallback) &swissArmyLocatorManip::startPointCallback); } // DiscManip // MFnDiscManip discManipFn(fDiscManip); MPlug arrow3AnglePlug = nodeFn.findPlug("arrow3Angle", &stat); if (MStatus::kFailure != stat) { discManipFn.connectToAnglePlug(arrow3AnglePlug); unsigned centerIndex = discManipFn.centerIndex(); addPlugToManipConversionCallback(centerIndex, (plugToManipConversionCallback) &swissArmyLocatorManip::startPointCallback); } // StateManip // MFnStateManip stateManipFn(fStateManip); MPlug statePlug = nodeFn.findPlug("state", &stat); if (MStatus::kFailure != stat) { stateManipFn.connectToStatePlug(statePlug); unsigned positionIndex = stateManipFn.positionIndex(); addPlugToManipConversionCallback(positionIndex, (plugToManipConversionCallback) &swissArmyLocatorManip::startPointCallback); } // ToggleManip // MFnToggleManip toggleManipFn(fToggleManip); MPlug togglePlug = nodeFn.findPlug("toggle", &stat); if (MStatus::kFailure != stat) { toggleManipFn.connectToTogglePlug(togglePlug); unsigned startPointIndex = toggleManipFn.startPointIndex(); addPlugToManipConversionCallback(startPointIndex, (plugToManipConversionCallback) &swissArmyLocatorManip::startPointCallback); } // Determine the transform node for the locator // MDagPath transformPath(fNodePath); transformPath.pop(); MFnTransform transformNode(transformPath); // RotateManip // MFnRotateManip rotateManipFn(fRotateManip); MPlug rotatePlug = transformNode.findPlug("rotate", &stat); if (MStatus::kFailure != stat) { rotateManipFn.connectToRotationPlug(rotatePlug); rotateManipFn.displayWithNode(node); } // ScaleManip // MFnScaleManip scaleManipFn(fScaleManip); MPlug scalePlug = transformNode.findPlug("scale", &stat); if (MStatus::kFailure != stat) { scaleManipFn.connectToScalePlug(scalePlug); scaleManipFn.displayWithNode(node); } finishAddingManips(); MPxManipContainer::connectToDependNode(node); return stat; }
Real LongstaffSchwartzMultiPathPricer::operator()( const MultiPath& multiPath) const { PathInfo path = transformPath(multiPath); if (calibrationPhase_) { // store paths for the calibration // only the relevant part paths_.push_back(path); // result doesn't matter return 0.0; } // exercise at time t, cancels all payment AFTER t const Size len = path.pathLength(); Real price = 0.0; // this is the last event date { const Real payoff = path.payments[len - 1]; const Real exercise = path.exercises[len - 1]; const Array & states = path.states[len - 1]; const bool canExercise = !states.empty(); // at the end the continuation value is 0.0 if (canExercise && exercise > 0.0) price += exercise; price += payoff; } for (Integer i = len - 2; i >= 0; --i) { price *= dF_[i + 1] / dF_[i]; const Real exercise = path.exercises[i]; /* coeff_[i].size() - 0 => never exercise - v_.size() => use estimated continuation value (if > lowerBounds_[i]) - v_.size() + 1 => always exercise In any case if states is empty, no exercise is allowed. */ const Array & states = path.states[i]; const bool canExercise = !states.empty(); if (canExercise) { if (coeff_[i].size() == v_.size() + 1) { // special value always exercise price = exercise; } else { if (!coeff_[i].empty() && exercise > lowerBounds_[i]) { Real continuationValue = 0.0; for (Size l = 0; l < v_.size(); ++l) { continuationValue += coeff_[i][l] * v_[l](states); } if (continuationValue < exercise) { price = exercise; } } } } const Real payoff = path.payments[i]; price += payoff; } return price * dF_[0]; }