Ejemplo n.º 1
0
bool Turret::isTargetable (Player *player, float *minDist, float useRange)
{
	if (player && player->getTeam () != getTeam() && player->getVisibleToTeam (getTeam()) && !player->isDead())
		{
			if (const char* script = scriptName("verifyTarget")) {
            const char* pRet = Console->evaluatef("%s(%d);", script, player->getId());
            if (pRet[0] == 'F' || pRet[0] == 'f')
               return false;
         }

			Point3F playerPos = player->getLeadCenter();
			float dist = m_distf (getBoxCenter(), playerPos);

			if (dist < useRange)
				targetsTracked++;

			if (dist < *minDist)
				{
					TMat3F invMat;
					getNodeOffset (&invMat, "dummy muzzle", gunNode);
					invMat.inverse();
					m_mul (Point3F (playerPos.x, playerPos.y, playerPos.z), invMat, &playerPos);

					float ele = elevation (playerPos.x, playerPos.y, playerPos.z);
					float rotz = rotation (-playerPos.x, -playerPos.y);

					if (!inDeadZone (rotz, ele))
						{
					      SimContainerQuery collisionQuery;
					      collisionQuery.id = getId();
					      collisionQuery.type   = -1;
					      collisionQuery.mask   = SimTerrainObjectType | SimInteriorObjectType;
					      collisionQuery.detail = SimContainerQuery::DefaultDetail;
					      collisionQuery.box.fMin = getBoxCenter();
					      collisionQuery.box.fMax = player->getLeadCenter();

					      SimCollisionInfo collisionInfo;
							SimContainer* root = findObject(manager,SimRootContainerId,root);
					      root->findLOS(collisionQuery, &collisionInfo);
							if (!collisionInfo.object || collisionInfo.object == player)
								{
									*minDist = dist;
									return true;
								}
						}
				}
		}

	return false;
}
Ejemplo n.º 2
0
Point3F Player::getLeadCenter (void)
{
	if (mount)
		return mount->getLinearPosition ();
	else
		return getBoxCenter ();
}
Ejemplo n.º 3
0
bool Turret::detectItem(GameBase *object)
{
	Point3F forward,objectVec = object->getBoxCenter() - getBoxCenter();
	objectVec.normalize();
	getEyeTransform().getRow(1,&forward);
	float dot = m_dot (forward, objectVec);
	if (dot >= data->FOV)
		return Parent::detectItem (object);
	return false;
}
Ejemplo n.º 4
0
void Player::getThrowVector(Point3F* pos,Point3F* vec)
{
	RMat3F view,mat;
	// Add a small upward component to the pitch to
	// throw the item up a little.
	float offset = 0.5 * cos(viewPitch);
	view.set(EulerF(viewPitch + offset,0.0f,0.0f));
	m_mul(view,(RMat3F&)getTransform(),&mat);

	Point3F vv(0,1,0);
	m_mul(vv,mat,vec);
	*pos = getBoxCenter();
}
Ejemplo n.º 5
0
	Point3D getCenter(){
		Point3D center= getBoxCenter();
		/*
		center.x = 0;
		center.y = 0;
		center.z = 0;
		for (int i=0;i<vertex.size();++i){
			center.x += vertex[i].x;
			center.y += vertex[i].y;
			center.z += vertex[i].z;
		}
		if (vertex.size()>0){		
			center.x /= float(vertex.size());
			center.y /= float(vertex.size());
			center.z /= float(vertex.size());
		}
		*/
		return center;
	};
Ejemplo n.º 6
0
void Item::registerLights(LightManager * lightManager, bool lightingScene)
{
   if(lightingScene)
      return;

   if(mDataBlock->lightOnlyStatic && !mStatic)
      return;

   F32 intensity;
   switch(mDataBlock->lightType)
   {
      case ConstantLight:
         intensity = mFadeVal;
         break;

      case PulsingLight:
      {
         S32 delta = Sim::getCurrentTime() - mDropTime;
         intensity = 0.5f + 0.5f * mSin(M_PI_F * F32(delta) / F32(mDataBlock->lightTime));
         intensity = 0.15f + intensity * 0.85f;
         intensity *= mFadeVal;  // fade out light on flags
         break;
      }

      default:
         return;
   }

   // Create a light if needed
   if (!mLight)
   {
      mLight = lightManager->createLightInfo();
   }   
   mLight->setColor( mDataBlock->lightColor * intensity );
   mLight->setType( LightInfo::Point );
   mLight->setRange( mDataBlock->lightRadius );
   mLight->setPosition( getBoxCenter() );

   lightManager->registerGlobalLight( mLight, this );
}
Ejemplo n.º 7
0
void SFXEmitter::_renderObject( ObjectRenderInst* ri, SceneRenderState* state, BaseMatInstance* overrideMat )
{   
   // Check to see if the emitter is in range and playing
   // and assign a proper color depending on this.

   ColorI color;
   if( _getPlaybackStatus() == SFXStatusPlaying )
   {
      if( isInRange() )
         color = smRenderColorPlayingInRange;
      else
         color = smRenderColorPlayingOutOfRange;
   }
   else
   {
      if( isInRange() )
         color = smRenderColorStoppedInRange;
      else
         color = smRenderColorStoppedOutOfRange;
   }

   // Draw the cube.
   
   GFXStateBlockDesc desc;
   desc.setZReadWrite( true, false );
   desc.setBlend( true );
   desc.setCullMode( GFXCullNone );

   GFXDrawUtil *drawer = GFX->getDrawUtil();
   drawer->drawCube( desc,  Point3F( 0.5f, 0.5f, 0.5f ), getBoxCenter(), color );
   
   // Render visual feedback for 3D sounds.
   
   if( ( smRenderEmitters || isSelected() ) && is3D() )
      _render3DVisualFeedback();
}
Ejemplo n.º 8
0
void Turret::trackAndFire (Player *closePlayer, float interval)
{
   if (data->isSustained == false) {
	   Vector3F rot = getAngulerPosition();
	   int aimed = 0;
	   float old_rot = turretRotation;
	   float increment = data->speed * interval;
	   float des_z;
	   Point3F playerPos;

	   float dist = m_distf (getBoxCenter(), closePlayer->getLeadCenter());
	   leadPosition (closePlayer->getLeadCenter(), closePlayer->getLeadVelocity(), dist, &playerPos);

	   TMat3F invMat;
	   getNodeOffset (&invMat, "dummy muzzle", gunNode);
	   invMat.inverse();
	   m_mul (Point3F (playerPos.x, playerPos.y, playerPos.z), invMat, &playerPos);

	   des_z = rotation (-playerPos.x, -playerPos.y);
	   	
	   while (des_z < 0)
	   	des_z += (float)M_2PI;
	   	
	   while (des_z > M_2PI)
	   	des_z -= (float)M_2PI;
	   	
	   float diff = des_z - turretRotation;
	
	   if (diff > M_PI || diff < -M_PI)
	   	increment = -increment;
	   	
	   if (diff < increment && diff > -increment)
	   	{
	   		turretRotation = des_z;
	   		aimed += 1;
	   	}
	   else
	   	if (diff < 0)
	   		turretRotation -= increment;
	   	else
	   		turretRotation += increment;
	   		
	   wrapRotation ();
	   		
	   if (turretRotation != old_rot)
	   	setMaskBits (TRotationMask);
	
	   float old_elevation = turretElevation;
	   float des_y;
	
	   increment = data->speed * interval;
	   des_y = elevation (playerPos.x, playerPos.y, playerPos.z);
	   diff = des_y - turretElevation;
	
	   if (diff > M_PI || diff < -M_PI)
	   	increment = -increment;
	
	   if (diff < increment && diff > -increment)
	   	{
	   		turretElevation = des_y;
	   		aimed += 1;
	   	}
	   else
	   	if (diff < 0)
	   		turretElevation -= increment;
	   	else
	   		turretElevation += increment;
	   		
	   wrapElevation ();
	   		
	   if (old_elevation != turretElevation)
	   	setMaskBits (ElevationMask);
	
	   if (closePlayer && aimed >= 2 && waitTime <= manager->getCurrentTime())
	   	shoot (false, closePlayer);
   } else {
      Vector3F rot = getAngulerPosition();
      int aimed = 0;
      float old_rot = turretRotation;
      float increment = data->speed * interval;
      float des_z;
      Point3F playerPos;

      float dist = m_distf (getBoxCenter(), closePlayer->getLeadCenter());
      leadPosition (closePlayer->getLeadCenter(), closePlayer->getLeadVelocity(), dist, &playerPos);

      TMat3F invMat;
      getNodeOffset (&invMat, "dummy muzzle", gunNode);
      invMat.inverse();
      m_mul (Point3F (playerPos.x, playerPos.y, playerPos.z), invMat, &playerPos);

      des_z = rotation (-playerPos.x, -playerPos.y);
         
      while (des_z < 0)
         des_z += (float)M_2PI;
         
      while (des_z > M_2PI)
         des_z -= (float)M_2PI;
         
      float diff = des_z - turretRotation;
   
      if (diff > M_PI || diff < -M_PI)
         increment = -increment;
         
      if (diff < increment && diff > -increment)
         {
            turretRotation = des_z;
            aimed += 1;
         }
      else
         if (diff < 0)
            turretRotation -= increment;
         else
            turretRotation += increment;
            
      wrapRotation ();
            
      if (turretRotation != old_rot)
         setMaskBits (TRotationMask);
   
      float old_elevation = turretElevation;
      float des_y;
   
      increment = data->speed * interval;
      des_y = elevation (playerPos.x, playerPos.y, playerPos.z);
      diff = des_y - turretElevation;
   
      if (diff > M_PI || diff < -M_PI)
         increment = -increment;
   
      if (diff < increment && diff > -increment)
         {
            turretElevation = des_y;
            aimed += 1;
         }
      else
         if (diff < 0)
            turretElevation -= increment;
         else
            turretElevation += increment;
            
      wrapElevation ();
            
      if (old_elevation != turretElevation)
         setMaskBits (ElevationMask);
   
      if (closePlayer && aimed >= 2 && waitTime <= manager->getCurrentTime()) {
         shoot (false, closePlayer);
      }
   }
}
Ejemplo n.º 9
0
void
Turret::serverProcessFiring(DWORD in_currTime)
{
   if (!getControlClient() && getState () == StaticBase::Enabled && isActive()) {
      AssertFatal(m_pProjectile != NULL, "Must have projectile");

      if (m_pTarget == NULL) {
         // Lost our target, or player mount just ended...
         unshoot();
         return;
      }

      if (in_currTime >= m_beganState + data->firingTime) {
         // If the firing time runs out, we switch to reloading...
         unshoot();
         return;
      }
   
      float useRange = data->gunRange == -1 ? data->iRange : data->gunRange;
      float minDist  = useRange;
      if (isTargetable(m_pTarget, &minDist, useRange) == false) {
         unshoot();
         return;
      }

      // Guess we're still good, track the player...
      float interval = 0.032;
	   Vector3F rot = getAngulerPosition();
	   int aimed = 0;
	   float old_rot = turretRotation;
	   float increment = data->speed * interval;
	   float des_z;
	   Point3F playerPos;

	   float dist = m_distf (getBoxCenter(), m_pTarget->getLeadCenter());
	   leadPosition (m_pTarget->getLeadCenter(), m_pTarget->getLeadVelocity(), dist, &playerPos);

	   TMat3F invMat;
	   getNodeOffset (&invMat, "dummy muzzle", gunNode);
	   invMat.inverse();
	   m_mul (Point3F (playerPos.x, playerPos.y, playerPos.z), invMat, &playerPos);

	   des_z = rotation (-playerPos.x, -playerPos.y);
	   	
	   while (des_z < 0)
	   	des_z += (float)M_2PI;
	   	
	   while (des_z > M_2PI)
	   	des_z -= (float)M_2PI;
	   	
	   float diff = des_z - turretRotation;
	
	   if (diff > M_PI || diff < -M_PI)
	   	increment = -increment;
	   	
	   if (diff < increment && diff > -increment)
	   	{
	   		turretRotation = des_z;
	   		aimed += 1;
	   	}
	   else
	   	if (diff < 0)
	   		turretRotation -= increment;
	   	else
	   		turretRotation += increment;
	   		
	   wrapRotation ();
	   		
	   if (turretRotation != old_rot)
	   	setMaskBits (TRotationMask);
	
	   float old_elevation = turretElevation;
	   float des_y;
	
	   increment = data->speed * interval;
	   des_y = elevation (playerPos.x, playerPos.y, playerPos.z);
	   diff = des_y - turretElevation;
	
	   if (diff > M_PI || diff < -M_PI)
	   	increment = -increment;
	
	   if (diff < increment && diff > -increment)
	   	{
	   		turretElevation = des_y;
	   		aimed += 1;
	   	}
	   else
	   	if (diff < 0)
	   		turretElevation -= increment;
	   	else
	   		turretElevation += increment;
	   		
	   wrapElevation ();
	   		
	   if (old_elevation != turretElevation)
	   	setMaskBits (ElevationMask);
   }

   if (m_pProjectile)
      m_pProjectile->updateImageTransform(getEyeTransform());
}
Ejemplo n.º 10
0
bool Player::onSimRenderQueryImage (SimRenderQueryImage* query)
{
	// Update our drawShape flag.
   // If we're first person and mounted on something:
   bool drawShape = true;
	if (query->viewportObject) {
		// Check to see if we are mounted by the current camera
		SimGui::TSControl* vp = dynamic_cast<SimGui::TSControl*>
			(query->viewportObject);
      GameBase *co = cg.psc->getControlObject();
		if (vp && vp->getObject() == cg.psc) {
         if(cg.psc->isFirstPerson()) {
//            if(mount && (cg.psc->getControlObject() == mount || !mount->mountRender()))
            if(mount && co == mount && mountPoint == 1)
               return false;
            if(cg.psc->getControlObject() == this)
               drawShape = false;
         }
      }
      if(co) {
         ObserverCamera *oc = dynamic_cast<ObserverCamera *>(co);
         if(oc && oc->isEyesView(this))
            drawShape = false;
      }
   }

	// Some mounted vehicles don't render the player
	if (mount && !mount->mountRender() && mountPoint == 1)
		return false;
	
	// Get the image from the base class, this also checks to 
	// see if the player is within the viewcone.
	if (!Parent::onSimRenderQueryImage(query))
		return false;
   image.drawShape = drawShape;
	if (mount)
		image.castShadow = false;

	// Animate the player
	clearAnimTransform();
	image.shape->animate();

	// Player fading
   float fadeFactor = 1.0f;
   if (m_fading != NotFading) {
      float factor = float(wg->currentTime - m_fadeStarted) / float(csm_fadeLength);
      // Bail if we're _really faded...
      if (factor > 1.0)
         factor = 1.0;
      fadeFactor = 1.0 - factor;
   }

	// Shadow fading and swing down
	image.alphaLevel = 0.8f * fadeFactor;
	if (image.castShadow) {
	   SimContainer* pContainer = getContainer();
	   while (pContainer != NULL) {
	      if ((pContainer->getType() & SimInteriorObjectType) != 0)
	         break;
	      else
	         pContainer = pContainer->getContainer();
	   }
	   if (pContainer != NULL) {
	      InteriorShape* pItr = dynamic_cast<InteriorShape*>(pContainer);
	      AssertFatal(pItr != NULL, "Not an interiorshape?  Shouldn't happen");

	      if (pItr->getInstance()->isLinked() == true) {
	         image.alphaLevel = 0.0f;
	      } else {
	         // find the closest bbox face...
	         const Box3F& itrBox = pItr->getBoundingBox();
	         Point3F myCenter    = getBoxCenter();
	   
	         ITRGeometry* pGeom = pItr->getInstance()->getHighestGeometry();
	         AssertFatal(pGeom != NULL, "This doesn't seem possible");
		      int leafIndex;
		      if ((leafIndex = pGeom->externalLeaf(myCenter)) == 0) {
		      	leafIndex = pGeom->findLeaf(myCenter);
	         }
	         ITRGeometry::BSPLeafWrap leafWrap(pGeom, leafIndex);
		      int outsideBits = pGeom->getOutsideBits(leafWrap);
	         if ((outsideBits & ITRGeometry::OutsideMask) == 0) {
	            image.alphaLevel = 0.0f;
	         } else {
	            float minDist = itrBox.fMax.x - myCenter.x;
	            AssertFatal(minDist > 0.0f, "Um, that's not possible if I'm contained");

	            if ((itrBox.fMax.y - myCenter.y) < minDist)
	               minDist = itrBox.fMax.y - myCenter.y;
	            if ((itrBox.fMax.z - myCenter.z) < minDist)
	               minDist = itrBox.fMax.z - myCenter.z;
	            if ((myCenter.x - itrBox.fMin.x) < minDist)
	               minDist = myCenter.x - itrBox.fMin.x;
	            if ((myCenter.y - itrBox.fMin.y) < minDist)
	               minDist = myCenter.y - itrBox.fMin.y;
	            if ((myCenter.z - itrBox.fMin.z) < minDist)
	               minDist = myCenter.z - itrBox.fMin.z;
	            if (minDist < 0.0) {
	               AssertWarn(0, "That shouldn't happen, minDist < 0");
	               minDist = 0.0f;
	            }

	            if (minDist < 3.0f) {
	               image.alphaLevel = 0.8f * fadeFactor;
	               image.swingDown  = 0.0f;
	            } else if (minDist > 15.0f) {
	               image.alphaLevel = 0.3 * fadeFactor;
	               image.swingDown  = 1.0f;
	            } else {
	               image.alphaLevel = 0.3f + 0.5f * (1.0f - ((minDist - 3.0f) / 12.0f)) * fadeFactor;
	               image.swingDown  = (minDist - 3.0f) / 12.0f;
	            }
	         }
	      }
	   }
	}

	// Shade based on surface
   float sunAttenuation;
   ColorF positionalColor;
   bool overrideSun = getPositionalColor(positionalColor, sunAttenuation);
   updateSunOverride(overrideSun, sunAttenuation, positionalColor);
   m_lastSunUpdated = wg->currentTime;

	// Mounted items
   int i;
	for (i = 0; i < MaxItemImages; i++)
		if (SimRenderImage* pImage = getImage(i,query->renderContext)) {
			query->image[query->count++] = pImage;
         
         FearRenderImage* pFRI  = dynamic_cast<FearRenderImage*>(pImage);
         if (pFRI != NULL) {
            pFRI->shape->setAlphaAlways(image.shape->getAlwaysAlpha(),
                                        image.shape->getAlwaysAlphaValue());
            if (image.shape->getAlwaysAlpha()) {
               pFRI->sortValue = image.sortValue + 0.01;
               pFRI->itype = SimRenderImage::Translucent;
            }
         }
      }

	// Jet Image
	if (image.drawShape) {
      if (jetting && flameImage.shape) {
         getMountTransform(JetExhaust,&flameImage.transform);
   		// Return the image
         flameImage.sortValue = image.sortValue + 0.01;
   		query->image[query->count++] = &flameImage;
      }
      
      // Set detail scale for player shapes.  Higher for others, here
      //    take halfway to full - need separate value?  
      image.shape->setDetailScale( hasFocus ? prefShapeDetail  :
                              ((prefShapeDetail + 1.0) / 2.0)   );
	}

	// Haze everything
	for(i = 1; i < query->count; i++)
      query->image[i]->hazeValue = query->image[0]->hazeValue;

	return true;
}