int server(void) { int s = mseminit(SEM0, 0600, 2, 0, 1); if (s == -1) { perror("mseminit"); return 1; } int cnt = 1; for (int i = 0; i < 5; ++i) { if (mP(s, 1, 0) != 0) { if (errno == EINTR) { /* interrupted by syscall, try again */ continue; } perror("mP(0)"); break; } printf("s%d", cnt); cnt += 2; fflush(stdout); if (mV(s, 1, 1) != 0) { perror("mV(1)"); break; } } /* clean up semaphores */ if (msemrm(s) != 0) { perror("msemrm"); } return 0; }
void VrmlGame::Draw3D( const GLWindow2 &glWindow, Map &map, SE3<> se3CfromW, GLuint fboId, GLenum *buffers, ATANCamera &mCamera, int statusFlag) { if(!mbInitialised) { Init(); } GetMatrixMP(map); GLfloat temp_trans[] = {mP(0,0), mP(0,1), mP(0,2), mP(0,3), mP(1,0), mP(1,1), mP(1,2), mP(1,3), mP(2,0), mP(2,1), mP(2,2), mP(2,3), mP(3,0), mP(3,1), mP(3,2), mP(3,3)}; //add at 2.23 //读取阴影明暗变量 std::string filename = "variable.txt"; std::ifstream variableFile; float shadowvariable; int light_count; variableFile.open(filename.c_str()); if (!variableFile) { cout << "can't open the variable file" <<endl; } variableFile>>shadowvariable; variableFile>>light_count; if (statusFlag != 2 ) { //shadow glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboShadowId); CheckFramebufferStatus(); glUseProgramObjectARB(0); glViewport(0,0,RENDER_WIDTH*SHADOW_WAP_RATIO,RENDER_HEIGHT*SHADOW_WAP_RATIO); glClear(GL_DEPTH_BUFFER_BIT); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); //setup matrices glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45,RENDER_WIDTH/RENDER_HEIGHT,3,40000); glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_NORMALIZE); glEnable(GL_COLOR_MATERIAL); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 10.0, 0.0, -10.0, -100.0, 0.0, 0.0, 1.0, 0.0); //消除自我阴影 glEnable(GL_CULL_FACE); //之前没有加这句话,所以Front没有被剔除 glCullFace(GL_FRONT); DrawMediatorAndObject(statusFlag); //需要设置texture7 SetTextureMatrix(); //设置texture7 } //add 12.8 draw virtual object glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,fboId); //ATTACHMENT0---TEX_BUFF1 CheckFramebufferStatus(); glViewport(0,0,RENDER_WIDTH,RENDER_HEIGHT); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); // glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //glDisable(GL_CULL_FACE); //glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); // Set up 3D projection glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMultMatrix(mCamera.MakeUFBLinearFrustumMatrix(0.005, 100)); glMultMatrix(se3CfromW); //opengl staff glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_NORMALIZE); glEnable(GL_COLOR_MATERIAL); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMultMatrix(SE3<>()); glMultMatrixf(temp_trans); phongShadow.UseShader(true); glEnable(GL_TEXTURE_2D); //if (statusFlag != 2 ) //{ //phongShadow.SetUniVar("xPixelOffset", 1.0f/ (640.0f* 2)); //phongShadow.SetUniVar("yPixelOffset", 1.0f/ (480.0f* 2)); phongShadow.SetSampler("ShadowMap",7); glActiveTexture(GL_TEXTURE7); glBindTexture(GL_TEXTURE_2D, depthTextureId); //} glEnable(GL_CULL_FACE); glCullFace(GL_BACK); DrawMediatorAndObject(statusFlag); //if (statusFlag != 2 ) //{ glActiveTexture(GL_TEXTURE7); glBindTexture(GL_TEXTURE_2D, 0); //} glDisable(GL_TEXTURE_2D); glDisable(GL_CULL_FACE); phongShadow.UseShader(false); ////test shadow mapping //貌似这段程序没法画出深度图,不过印象中之前可以的啊 ---2.23 /*glUseProgramObjectARB(0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-RENDER_WIDTH/2,RENDER_WIDTH/2,-RENDER_HEIGHT/2,RENDER_HEIGHT/2,1,20); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glColor4f(1,1,1,1); glActiveTextureARB(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,depthTextureId); glEnable(GL_TEXTURE_2D); glTranslated(0,0,-1); glBegin(GL_QUADS); glTexCoord2d(0,0);glVertex3f(0,0,0); glTexCoord2d(1,0);glVertex3f(RENDER_WIDTH/2,0,0); glTexCoord2d(1,1);glVertex3f(RENDER_WIDTH/2,RENDER_HEIGHT/2,0); glTexCoord2d(0,1);glVertex3f(0,RENDER_HEIGHT/2,0); glEnd(); glDisable(GL_TEXTURE_2D);*/ glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); }
//识别“标”,得到旋转平移矩阵 void VrmlGame::GetMatrixMP(Map &map) { if (!isInitMap) { std::cout<<"find mark...."<<std::endl; mpMap = ↦ std::vector<std::vector<Wml::Vector2d> > all_points_2d; detect_corners(std::string("./absolute.txt"),all_points_2d); std::vector<Wml::Matrix4d> all_cameras; std::vector<Wml::Matrix3d> all_Ks; vector<KeyFrame *>::iterator kf; int count = 1; for( kf = mpMap->vpKeyFrames.begin(); kf != mpMap->vpKeyFrames.end(); kf++ ) { int width = (*kf)->Camera.ImageSize()[0]; int height = (*kf)->Camera.ImageSize()[1]; TooN::Vector<5> params = (*kf)->Camera.GetParams(); Wml::Matrix3d K; K(0,0) = width * params[0]; K(0,1) = 0; K(0,2) = width * params[2]; K(1,0) = 0; K(1,1) = height * params[1]; K(1,2) = height * params[3]; K(2,0) = 0; K(2,1) = 0; K(2,2) = 1; if(count==1) { std::cout<<K(0,0)<<","<<K(1,1)<<","<<K(0,2)<<","<<K(1,2)<<std::endl; } all_Ks.push_back(K); Wml::Matrix4d P; P(0,3) = (*kf)->se3CfromW.get_translation()[0]; P(1,3) = (*kf)->se3CfromW.get_translation()[1]; P(2,3) = (*kf)->se3CfromW.get_translation()[2]; P(0,0) = (*kf)->se3CfromW.get_rotation().get_matrix()[0][0]; P(0,1) = (*kf)->se3CfromW.get_rotation().get_matrix()[0][1]; P(0,2) = (*kf)->se3CfromW.get_rotation().get_matrix()[0][2]; P(1,0) = (*kf)->se3CfromW.get_rotation().get_matrix()[1][0]; P(1,1) = (*kf)->se3CfromW.get_rotation().get_matrix()[1][1]; P(1,2) = (*kf)->se3CfromW.get_rotation().get_matrix()[1][2]; P(2,0) = (*kf)->se3CfromW.get_rotation().get_matrix()[2][0]; P(2,1) = (*kf)->se3CfromW.get_rotation().get_matrix()[2][1]; P(2,2) = (*kf)->se3CfromW.get_rotation().get_matrix()[2][2]; if(count==1) { std::cout<<P(0,3)<<","<<P(1,3)<<","<<P(2,3)<<","<<P(0,0)<<","<<P(0,1)<<","<<P(0,2)<<","<<P(1,0)<<","<<P(1,1)<<","<<P(1,2)<<","<<P(2,0)<<","<<P(2,1)<<","<<P(2,2)<<std::endl; } P(3,0) = 0; P(3,1) = 0; P(3,2) = 0; P(3,3) = 1; all_cameras.push_back(P); count++; } std::vector<Wml::Vector3d> corners; CRobust3DRecovery r3dr; for (int i = 0; i < 4; ++ i) { std::vector<Wml::Vector2d> points_2d; std::vector<Wml::Matrix4d> key_cameras; std::vector<Wml::Matrix3d> key_Ks; for (int f = 0; f < all_points_2d.size(); ++ f) { if (all_points_2d[f].size() > i) { points_2d.push_back(all_points_2d[f][i]); key_cameras.push_back(all_cameras[f]); key_Ks.push_back(all_Ks[f]); } } if (points_2d.size() > 2) { Wml::Vector3d point_3d(0, 0, 0); r3dr.generate(points_2d, key_cameras, key_Ks, point_3d, 3, 10.0, 10); std::cout<<"3dpoint"<<i<<" = ["<<point_3d[0] << ", "<<point_3d[1] << ", "<<point_3d[2] << "]\n"; corners.push_back(point_3d); } } if (corners.size() == 4) { Wml::Vector3d center(0.0, 0.0, 0.0); for (int i = 0; i < corners.size(); ++ i) { center += corners[i]; } center /= corners.size(); std::cout<<"center = ["<<center[0]<<", "<<center[1]<<", "<<center[2]<<","<<center[3]<<"]"<<std::endl; ////////////////////////////////////////////////////////////////////////// Wml::Vector3d xaxis = corners[3] - corners[0]; Wml::Vector3d zaxis = corners[1] - corners[0]; Wml::Vector3d axis12 = corners[1] - corners[2]; Wml::Vector3d axis32 = corners[3] - corners[2]; // 坐标系尺度。 //double scale = 4.0/(xaxis.Length() + zaxis.Length() + axis12.Length() + axis32.Length()); double scale = (xaxis.Length() + zaxis.Length() + axis12.Length() + axis32.Length())/4.0; //新坐标 Wml::Vector3d yaxis = zaxis.Cross(xaxis); zaxis = xaxis.Cross(yaxis); xaxis.Normalize(); yaxis.Normalize(); zaxis.Normalize(); //注意要scale的,不知道为什么,但是如果scale是用1代替的话,就会出现PTAMM地图大得话,导入的modle就会很大 //反之则会很小 Wml::Vector3d u(scale,0,0); Wml::Vector3d v(0,scale,0); Wml::Vector3d n(0,0,scale); mP(0,0) = xaxis.Dot(u); mP(0,1) = xaxis.Dot(v); mP(0,2) = xaxis.Dot(n); mP(1,0) = yaxis.Dot(u); mP(1,1) = yaxis.Dot(v); mP(1,2) = yaxis.Dot(n); mP(2,0) = zaxis.Dot(u); mP(2,1) = zaxis.Dot(v); mP(2,2) = zaxis.Dot(n); mP(0,3) = center[0]; mP(1,3) = center[1]; mP(2,3) = center[2]; mP(3,0) = 0; mP(3,1) = 0; mP(3,2) = 0; mP(3,3) = 1; } isInitMap = true; } }
/** * verbraucht einen Rohstoff einer Mine oder eines Brunnens * an einer (umliegenden) Stelle. * * @author OLiver */ bool nofBuildingWorker::GetResources(unsigned char type) { //this makes granite mines work everywhere if (type == 0 && GAMECLIENT.GetGGS().isEnabled(ADDON_INEXHAUSTIBLE_GRANITEMINES)) return true; // in Map-Resource-Koordinaten konvertieren type = RESOURCES_MINE_TO_MAP[type]; MapPoint mP(0, 0); bool found = false; // Alle Punkte durchgehen, bis man einen findet, wo man graben kann if(GetResourcesOfNode(pos, type)) { mP = pos; found = true; } for(MapCoord tx = gwg->GetXA(pos, 0), r = 1; !found && r <= MINER_RADIUS; tx = gwg->GetXA(tx, pos.y, 0), ++r) { MapPoint t2(tx, pos.y); for(unsigned int i = 2; !found && i < 8; ++i) { for(MapCoord r2 = 0; !found && r2 < r; t2 = gwg->GetNeighbour(t2, i % 6), ++r2) { if(GetResourcesOfNode(t2, type)) { mP = t2; found = true; } } } } if(found) { // Minen / Brunnen unerschöpflich? if( (type == 4 && GAMECLIENT.GetGGS().isEnabled(ADDON_EXHAUSTIBLE_WELLS)) || (type != 4 && !GAMECLIENT.GetGGS().isEnabled(ADDON_INEXHAUSTIBLE_MINES)) ) --gwg->GetNode(mP).resources; return true; } // Hoffe das passt auch, Post verschicken, keine Rohstoffe mehr da if (!OutOfRessourcesMsgSent) { if(GAMECLIENT.GetPlayerID() == this->player) { std::string error = _("This mine is exhausted"); if(workplace->GetBuildingType() == BLD_WELL) error = _("This well is dried out"); GAMECLIENT.SendPostMessage( new ImagePostMsgWithLocation(_(error), PMC_GENERAL, pos, workplace->GetBuildingType(), workplace->GetNation()) ); } OutOfRessourcesMsgSent = true; // Produktivitätsanzeige auf 0 setzen workplace->SetProductivityToZero(); // KI-Event erzeugen GAMECLIENT.SendAIEvent(new AIEvent::Building(AIEvent::NoMoreResourcesReachable, workplace->GetPos(), workplace->GetBuildingType()), player); } // Hoffe das passt... return false; }
bool LineElement::drawMapElement(QPainter* targetP) { // Reset screen bounding box sbBox = QRect(); // If the element-type should not be drawn in the actual scale, or if the // element is not visible, return. if( ! glConfig->isBorder(typeID) || ! isVisible()) { return false; } // Do check load and drawing options GeneralConfig *conf = GeneralConfig::instance(); switch( typeID ) { case BaseMapElement::Forest: if( conf->getMapLoadForests() == false ) { return false; } break; case BaseMapElement::Motorway: if( conf->getMapLoadMotorways() == false ) { return false; } break; case BaseMapElement::Railway: if( conf->getMapLoadRailways() == false ) { return false; } break; case BaseMapElement::Road: if( conf->getMapLoadRoads() == false ) { return false; } break; case BaseMapElement::River: if( conf->getMapLoadWaterways() == false ) { return false; } break; case BaseMapElement::City: if( conf->getMapLoadCities() == false ) { return false; } break; default: break; } QPolygon mP( glMapMatrix->map(projPolygon) ); // Save screen bounding box sbBox = mP.boundingRect(); if(typeID == BaseMapElement::City) { // We do not draw the outline of the city directly, because otherwise // we will get into trouble with cities lying at the edge of a // map-section. // @AP: Not clear what is meant. targetP->setPen(glConfig->getDrawPen(typeID)); targetP->setBrush(glConfig->getDrawBrush(typeID)); targetP->drawPolygon(mP); return true; } const QPen& drawP(glConfig->getDrawPen(typeID)); targetP->setPen(drawP); if(closed) { // Lakes do not have a brush, because they are divided into normal // sections and we do not want to see section borders in a lake ... targetP->setBrush(glConfig->getDrawBrush(typeID)); targetP->drawPolygon(mP); return true; } targetP->drawPolyline(mP); if(typeID == BaseMapElement::Motorway && drawP.width() > 4) { // draw the white line in the middle targetP->setPen( QPen(Qt::white, Layout::getIntScaledDensity()) ); targetP->drawPolyline(mP); } return true; }
double hyperd(N, K, n, k) { static mpq_t num, num2, den, q; static mpq_t p2, t; static mpf_t f; static int first = 1; double d; double p; if (first) { mpq_init(num); mpq_init(num2); mpq_init(den); mpq_init(q); mpf_init(f); mpq_init(p2); mpq_init(t); first = 0; } switch (hyperd_mode) { case 0: mP(&num, K, k); mP(&p2, N - K, n - k); mpq_mul(num2, num, p2); mH(&p2, k + 1, n - k); mpq_mul(num, num2, p2); mP(&den, N, n); mpq_div(q, num, den); mpf_set_q(f, q); d = mpf_get_d(f); break; case 1: xx: mC(&num2, K, k); mC(&p2, N - K, n - k); mpq_mul(num, num2, p2); mC(&den, N, n); mpq_div(q, num, den); mpf_set_q(f, q); d = mpf_get_d(f); break; case 2: if (k == K || n - k == N - K || n == N) { goto xx; } if (k == 0 || n - k == 0 || n == 0) { goto xx; } p = (double)n / N; d = dB(K, p, k) * dB(N - K, p, n - k) / dB(N, p, n); if (d < 3e-14) { goto xx; } break; default: fprintf(stderr, "internal error\n"); exit(1); /* NOTREACHED */ } return d; }
MStatus CVstAimCmd::redoIt() { MStatus mStatus; if ( !mStatus ) { setResult( MString( "Cannot parse command line" ) + mStatus.errorString() ); return MS::kFailure; } if ( m_mArgDatabase->isFlagSet( kHelp ) ) { PrintHelp(); } else { // See if there are two object specified MDagPath mDagPath; MSelectionList optSelectionList; // Validate specified items to whole dag nodes { MSelectionList tmpSelectionList; m_mArgDatabase->getObjects( tmpSelectionList ); for ( MItSelectionList sIt( tmpSelectionList, MFn::kDagNode ); !sIt.isDone(); sIt.next() ) { if ( sIt.getDagPath( mDagPath ) ) { optSelectionList.add( mDagPath, MObject::kNullObj, true ); } } } if ( m_mArgDatabase->isFlagSet( "create" ) || optSelectionList.length() >= 2 && m_mArgDatabase->numberOfFlagsUsed() == 0 ) { // Error if there aren't at least two if ( optSelectionList.length() < 2 ) { displayError( GetName() + " needs at least two objects specified or selected when -create is used" ); return MS::kFailure; } // Get name command line arg MString optName; if ( m_mArgDatabase->isFlagSet( "name" ) ) { m_mArgDatabase->getFlagArgument( "name", 0, optName ); } m_undoable = true; m_mDagModifier = new MDagModifier; MObject vstAimObj( m_mDagModifier->MDGModifier::createNode( GetName() ) ); if ( m_mDagModifier->doIt() != MS::kSuccess ) { displayError( MString( "Couldn't create " ) + GetName() + " node" ); m_mDagModifier->undoIt(); delete m_mDagModifier; m_mDagModifier = NULL; m_undoable = false; return MS::kFailure; } m_mDagModifier->renameNode( vstAimObj, optName.length() ? optName : GetName() ); if ( m_mDagModifier->doIt() != MS::kSuccess ) { if ( optName.length() ) { displayWarning( MString( "Couldn't rename newly created vstNode \"" ) + optName + "\"" ); } } // Set options on the newly create vstAim node MFnDependencyNode vstAimFn( vstAimObj ); MPlug sP; MPlug dP; if ( m_mArgDatabase->isFlagSet( kAim ) ) { MVector aim; m_mArgDatabase->getFlagArgument( kAim, 0, aim.x ); m_mArgDatabase->getFlagArgument( kAim, 1, aim.y ); m_mArgDatabase->getFlagArgument( kAim, 2, aim.z ); sP = vstAimFn.findPlug( "aimX" ); sP.setValue( aim.x ); sP = vstAimFn.findPlug( "aimY" ); sP.setValue( aim.y ); sP = vstAimFn.findPlug( "aimZ" ); sP.setValue( aim.z ); } if ( m_mArgDatabase->isFlagSet( kUp ) ) { MVector up; m_mArgDatabase->getFlagArgument( kUp, 0, up.x ); m_mArgDatabase->getFlagArgument( kUp, 1, up.y ); m_mArgDatabase->getFlagArgument( kUp, 2, up.z ); sP = vstAimFn.findPlug( "upX" ); sP.setValue( up.x ); sP = vstAimFn.findPlug( "upY" ); sP.setValue( up.y ); sP = vstAimFn.findPlug( "upZ" ); sP.setValue( up.z ); } // Now connect up the newly created vstAim node MDagPath toAim; optSelectionList.getDagPath( 1, toAim ); const MFnDagNode toAimFn( toAim ); if ( toAim.hasFn( MFn::kJoint ) ) { MPlug joP( toAimFn.findPlug( "jointOrient" ) ); if ( !joP.isNull() ) { MAngle jox, joy, joz; joP.child( 0 ).getValue( jox ); joP.child( 1 ).getValue( joy ); joP.child( 2 ).getValue( joz ); if ( abs( jox.value() ) > FLT_EPSILON || abs( joy.value() ) > FLT_EPSILON || abs( joz.value() ) > FLT_EPSILON ) { mwarn << "Joint orient on node being constrained is non-zero ( " << jox.asDegrees() << " " << joy.asDegrees() << " " << joz.asDegrees() << " ), setting to 0" << std::endl; joP.child( 0 ).setValue( MAngle( 0.0 ) ); joP.child( 1 ).setValue( MAngle( 0.0 ) ); joP.child( 2 ).setValue( MAngle( 0.0 ) ); } } } if ( toAim.hasFn( MFn::kTransform ) ) { MPlug mP( toAimFn.findPlug( "rotateAxis" ) ); if ( !mP.isNull() ) { MAngle rx, ry, rz; mP.child( 0 ).getValue( rx ); mP.child( 1 ).getValue( ry ); mP.child( 2 ).getValue( rz ); if ( abs( rx.value() ) > FLT_EPSILON || abs( ry.value() ) > FLT_EPSILON || abs( rz.value() ) > FLT_EPSILON ) { mwarn << "Rotate Axis on node being constrained is non-zero ( " << rx.asDegrees() << " " << ry.asDegrees() << " " << rz.asDegrees() << " ), setting to 0" << std::endl; mP.child( 0 ).setValue( MAngle( 0.0 ) ); mP.child( 1 ).setValue( MAngle( 0.0 ) ); mP.child( 2 ).setValue( MAngle( 0.0 ) ); } } } MDagPath aimAt; optSelectionList.getDagPath( 0, aimAt ); const MFnDagNode aimAtFn( aimAt ); // toAim.rotateOrder -> vstAim.rotateOrder sP = toAimFn.findPlug( "rotateOrder" ); dP = vstAimFn.findPlug( "rotateOrder" ); m_mDagModifier->connect( sP, dP ); // toAim.translate -> vstAim.translate sP = toAimFn.findPlug( "translate" ); dP = vstAimFn.findPlug( "translate" ); m_mDagModifier->connect( sP, dP ); // toAim.parentMatrix[ instance ] -> vstAim.parentSpace sP = toAimFn.findPlug( "parentMatrix" ); sP = sP.elementByLogicalIndex( toAim.instanceNumber() ); dP = vstAimFn.findPlug( "parentSpace" ); m_mDagModifier->connect( sP, dP ); // aimAt.worldMatrix[ instance ] -> vstAim.aimSpace sP = aimAtFn.findPlug( "worldMatrix" ); sP = sP.elementByLogicalIndex( aimAt.instanceNumber() ); dP = vstAimFn.findPlug( "aimSpace" ); m_mDagModifier->connect( sP, dP ); // vstAim.rotation -> toAim.rotation // These have to be connected individually because Maya plays stupid tricks // with rotateOrder if they aren't sP = vstAimFn.findPlug( "rotateX" ); dP = toAimFn.findPlug( "rotateX" ); m_mDagModifier->connect( sP, dP ); sP = vstAimFn.findPlug( "rotateY" ); dP = toAimFn.findPlug( "rotateY" ); m_mDagModifier->connect( sP, dP ); sP = vstAimFn.findPlug( "rotateZ" ); dP = toAimFn.findPlug( "rotateZ" ); m_mDagModifier->connect( sP, dP ); if ( m_mDagModifier->doIt() != MS::kSuccess ) { displayWarning( MString( GetName() ) + ": Couldn't connect everything when creating" ); } // Save the current selection just in case we want to undo stuff MGlobal::getActiveSelectionList( m_mSelectionList ); MGlobal::select( vstAimObj, MGlobal::kReplaceList ); setResult( vstAimFn.name() ); } else if ( m_mArgDatabase->isFlagSet( "select" ) ) { MSelectionList mSelectionList; MDagPath mDagPath; for ( MItDag dagIt; !dagIt.isDone(); dagIt.next() ) { if ( MFnDependencyNode( dagIt.item() ).typeName() == GetName() ) { dagIt.getPath( mDagPath ); mSelectionList.add( mDagPath, MObject::kNullObj, true ); } } if ( mSelectionList.length() ) { m_undoable = true; // Save the current selection just in case we want to undo stuff MGlobal::getActiveSelectionList( m_mSelectionList ); MGlobal::setActiveSelectionList( mSelectionList, MGlobal::kReplaceList ); } } else { displayError( GetName() + ": No valid operation specified via command line arguments\n" ); } } return MS::kSuccess; }
int Pseudoinverse( size_t m, size_t n, const doublecomplex *A, size_t lda, doublecomplex *P, size_t ldp ){ integer info; CMat Acopy(Eigen::Map<const CMat,Eigen::Unaligned,Eigen::OuterStride<> >(A, m, n, Eigen::OuterStride<>(lda))); Eigen::Map<CMat,Eigen::Unaligned,Eigen::OuterStride<> > mP(P, n, m, Eigen::OuterStride<>(ldp)); if(m >= n){ // tall case RVec S(n); CMat VH(n,n); doublecomplex dum; integer lwork = -1; RVec rwork(5*n); zgesvd_( "O","A", m,n, Acopy.data(), Acopy.outerStride(), S.data(), NULL, m, VH.data(), VH.outerStride(), &dum, lwork, rwork.data(), &info ); lwork = (integer)dum.real(); CVec work(lwork); zgesvd_( "O","A", m,n, Acopy.data(), Acopy.outerStride(), S.data(), NULL, m, VH.data(), VH.outerStride(), work.data(), lwork, rwork.data(), &info ); mP = Acopy.adjoint(); { double threshold = 2 * std::numeric_limits<double>::epsilon() * S[0]; for(size_t i = 0; i < n; ++i){ if(S[i] < threshold){ break; } S[i] = 1./S[i]; } } mP = VH.adjoint() * S.asDiagonal() * mP; }else{ // wide case RVec S(m); CMat U(m,m); doublecomplex dum; integer lwork = -1; RVec rwork(5*m); zgesvd_( "A","O", m,n, Acopy.data(), Acopy.outerStride(), S.data(), U.data(), U.outerStride(), NULL, m, &dum, lwork, rwork.data(), &info ); lwork = (integer)dum.real(); CVec work(lwork); zgesvd_( "A","O", m,n, Acopy.data(), Acopy.outerStride(), S.data(), U.data(), U.outerStride(), NULL, m, work.data(), lwork, rwork.data(), &info ); mP = Acopy.adjoint(); { double threshold = 2 * std::numeric_limits<double>::epsilon() * S[0]; for(size_t i = 0; i < m; ++i){ if(S[i] < threshold){ break; } S[i] = 1./S[i]; } } mP = mP * S.asDiagonal() * U.adjoint(); } return info; }