Exemplo n.º 1
0
bool TSStatic::buildPolyList(PolyListContext context, AbstractPolyList* polyList, const Box3F &box, const SphereF &)
{
   if ( !mShapeInstance )
      return false;

   // This is safe to set even if we're not outputing 
   polyList->setTransform( &mObjToWorld, mObjScale );
   polyList->setObject( this );

   if ( context == PLC_Export )
   {
      // Use highest detail level
      S32 dl = 0;

      // Try to call on the client so we can export materials
      if ( isServerObject() && getClientObject() )
         dynamic_cast<TSStatic*>(getClientObject())->mShapeInstance->buildPolyList( polyList, dl );
      else
          mShapeInstance->buildPolyList( polyList, dl );
   }
   else if ( context == PLC_Selection )
   {
      // Use the last rendered detail level
      S32 dl = mShapeInstance->getCurrentDetail();
      mShapeInstance->buildPolyListOpcode( dl, polyList, box );
   }
   else
   {
      // Figure out the mesh type we're looking for.
      MeshType meshType = ( context == PLC_Decal ) ? mDecalType : mCollisionType;

      if ( meshType == None )
         return false;
      else if ( meshType == Bounds )
         polyList->addBox( mObjBox );
      else if ( meshType == VisibleMesh )
          mShapeInstance->buildPolyList( polyList, 0 );
      else
      {
         // Everything else is done from the collision meshes
         // which may be built from either the visual mesh or
         // special collision geometry.
         for ( U32 i = 0; i < mCollisionDetails.size(); i++ )
            mShapeInstance->buildPolyListOpcode( mCollisionDetails[i], polyList, box );
      }
   }

   return true;
}
Exemplo n.º 2
0
bool DecalRoad::containsPoint( const Point3F &worldPos, U32 *nodeIdx ) const
{
   // This is just for making selections in the editor, we use the 
   // client-side road because it has the proper edge's.
   if ( isServerObject() && getClientObject() )
      return ((DecalRoad*)getClientObject())->containsPoint( worldPos, nodeIdx );

   // If point isn't in the world box, 
   // it's definitely not in the road.
   //if ( !getWorldBox().isContained( worldPos ) )
   //   return false;

   if ( mEdges.size() < 2 )
      return false;

   Point2F testPt(   worldPos.x, 
                     worldPos.y );
   Point2F poly[4];

   // Look through all edges, does the polygon
   // formed from adjacent edge's contain the worldPos?
   for ( U32 i = 0; i < mEdges.size() - 1; i++ )
   {
      const RoadEdge &edge0 = mEdges[i];
      const RoadEdge &edge1 = mEdges[i+1];

      poly[0].set( edge0.p0.x, edge0.p0.y );
      poly[1].set( edge0.p2.x, edge0.p2.y );
      poly[2].set( edge1.p2.x, edge1.p2.y );
      poly[3].set( edge1.p0.x, edge1.p0.y );

      if ( MathUtils::pointInPolygon( poly, 4, testPt ) )
      {
         if ( nodeIdx )
            *nodeIdx = edge0.parentNodeIdx;

         return true;
      }

   }

   return false;
}
Exemplo n.º 3
0
void ConvexShape::_export( OptimizedPolyList *plist, const Box3F &box, const SphereF &sphere )
{
   BaseMatInstance *matInst = mMaterialInst;
   if ( isServerObject() && getClientObject() )
      matInst = dynamic_cast<ConvexShape*>(getClientObject())->mMaterialInst;
   
   MatrixF saveMat;
   Point3F saveScale;
   plist->getTransform( &saveMat, &saveScale );

   plist->setTransform( &mObjToWorld, mObjScale );
   plist->setObject( this );   

   const Vector< ConvexShape::Face > faceList = mGeometry.faces;
   const Vector< Point3F > &pointList = mGeometry.points;

   for ( S32 i = 0; i < faceList.size(); i++ )
   {
      const ConvexShape::Face &face = faceList[i];		

      plist->begin( matInst, i, OptimizedPolyList::TriangleList );

      plist->plane( PlaneF( face.centroid, face.normal ) );

      for ( S32 j = 0; j < face.triangles.size(); j++ )
      {                  
         for ( S32 k = 0; k < 3; k++ )         
         {
            U32 vertId = face.triangles[j][k];
            plist->vertex( pointList[ face.points[ vertId ] ], face.normal, face.texcoords[ vertId ] );         
         }
      }      

      plist->end();
   }

   plist->setTransform( &saveMat, saveScale );
}
Exemplo n.º 4
0
	//--------------------------------------------------------------------------
	Bool ClientManager::addClientObject( Str16 clanName,I32 netIdInFrontServer,I32 frontServerNetId,U64 accountId )
	{
		// 先查找客户端对象
		ClientObject* clientObj = getClientObject(clanName);
		if (clientObj)
		//存在时修改数据
		{
			//DYNAMIC_ASSERT(false);
			clientObj->frontServerNetId = frontServerNetId;
			clientObj->netIdInFrontServer = netIdInFrontServer;
			clientObj->accountId = accountId;
			return false;
		}
		// 不存在 
		// 添加数据到hash表
		clientObj = MG_POOL_NEW(mClientObjectPool,ClientObject,(netIdInFrontServer, frontServerNetId,accountId));
		mClientObjectHashMap.element[clanName] = clientObj;

		// 添加数据到分类表
		if (mClientObjectClassSet.element.empty())
		{
			ClientHashMap tempSet;
			tempSet.element[clanName] = clientObj;
			mClientObjectClassSet.element[clientObj->frontServerNetId] = tempSet;
		}
		else
		{
			ClientClassMapIt classit = mClientObjectClassSet.element.find(clientObj->frontServerNetId);
			if (classit != mClientObjectClassSet.element.end())
			{
				classit->second.element[clanName] = clientObj;	
			}
			else
			{
				ClientHashMap tempSet;
				tempSet.element[clanName] = clientObj;
				mClientObjectClassSet.element[clientObj->frontServerNetId] = tempSet;
			}
			
		}
		return true;
	}