コード例 #1
0
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;
}
コード例 #2
0
ファイル: VrmlGame.cpp プロジェクト: shihongzhi/PTAMM
	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);
	}
コード例 #3
0
ファイル: VrmlGame.cpp プロジェクト: shihongzhi/PTAMM
	//识别“标”,得到旋转平移矩阵
	void VrmlGame::GetMatrixMP(Map &map)
	{
		if (!isInitMap)
		{
			std::cout<<"find mark...."<<std::endl;
			mpMap = &map;
			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;
		}
	}
コード例 #4
0
ファイル: nofBuildingWorker.cpp プロジェクト: uqs/s25client
/**
 *  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;
}
コード例 #5
0
ファイル: lineelement.cpp プロジェクト: Exadios/Cumulus
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;
}
コード例 #6
0
ファイル: hd.c プロジェクト: hsenju/Kardrobe
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;
}
コード例 #7
0
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;
}
コード例 #8
0
ファイル: Pseudoinverse.cpp プロジェクト: DHfly/S4
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;
}