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; }
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; }
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 ); }
//-------------------------------------------------------------------------- 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; }