Explorar o código

This adds limiting the ghost data to a specific area around the client.
By default it is not included in the build, you must #define GHOSTSCOPING in the torqueConfig.h to enable it.
The distance can be set via the mission file by adding

visibleGhostDistance = "1000";

Or if it is not set in the mission file it will default to what is defined in torqueConfig.h #defined as GHOSTSCOPING_DEFAULT_DISTANCE_IF_NOT_IN_MISSION

The mission default distance can be overridden on a per connection basis by using gameconnection:setVisibleGhostDistance and gameconnection:getVisibleGhostDistance

The logic for setting the scoping distance was moved from shapebase in the original design to SceneObject so that it will affect cameras, players, etc.

Vincent Gee %!s(int64=11) %!d(string=hai) anos
pai
achega
55bdfe5dc3

+ 11 - 0
Engine/source/T3D/gameBase/gameBase.cpp

@@ -388,7 +388,14 @@ F32 GameBase::getUpdatePriority(CameraScopeQuery *camInfo, U32 updateMask, S32 u
    // Weight by field of view, objects directly in front
    // will be weighted 1, objects behind will be 0
    F32 dot = mDot(pos,camInfo->orientation);
+
+#ifdef GHOSTSCOPING
+   bool inFov = dot > camInfo->cosFov*1.5f;
+#else
    bool inFov = dot > camInfo->cosFov;
+#endif
+
+
    F32 wFov = inFov? 1.0f: 0;
 
    // Weight by linear velocity parallel to the viewing plane
@@ -406,7 +413,11 @@ F32 GameBase::getUpdatePriority(CameraScopeQuery *camInfo, U32 updateMask, S32 u
 
    // Weight by interest.
    F32 wInterest;
+#ifdef GHOSTSCOPING
+   if (getTypeMask() & (PlayerObjectType || VehicleObjectType ))
+#else
    if (getTypeMask() & PlayerObjectType)
+#endif
       wInterest = 0.75f;
    else if (getTypeMask() & ProjectileObjectType)
    {

+ 8 - 0
Engine/source/T3D/gameBase/gameBase.h

@@ -36,6 +36,14 @@
 #include "console/dynamicTypes.h"
 #endif
 
+#include "torqueConfig.h"
+#ifdef GHOSTSCOPING
+#ifndef __SCENEMANAGER_H__  
+#include "scene/sceneManager.h"    
+#define __SCENEMANAGER_H__  
+#endif 
+#endif
+
 class NetConnection;
 class ProcessList;
 class GameBase;

+ 37 - 0
Engine/source/T3D/gameBase/gameConnection.cpp

@@ -226,6 +226,10 @@ GameConnection::GameConnection()
    mAddYawToAbsRot = false;
    mAddPitchToAbsRot = false;
 
+#ifdef GHOSTSCOPING
+   mConnectionVisibleDistance = 0.0f;
+#endif
+
    clearDisplayDevice();
 }
 
@@ -239,6 +243,16 @@ GameConnection::~GameConnection()
 }
 
 //----------------------------------------------------------------------------
+#ifdef GHOSTSCOPING
+void GameConnection::setVisibleGhostDistance(F32 dist)
+{
+	mConnectionVisibleDistance = dist;
+}
+F32 GameConnection::getVisibleGhostDistance()
+{
+	return mConnectionVisibleDistance;
+}
+#endif
 
 bool GameConnection::canRemoteCreate()
 {
@@ -2199,3 +2213,26 @@ DefineEngineMethod( GameConnection, getControlSchemeAbsoluteRotation, bool, (),,
 {
    return object->getControlSchemeAbsoluteRotation();
 }
+
+DefineEngineMethod( GameConnection, setVisibleGhostDistance, void, (F32 dist),,
+   "@brief Sets the distance that objects around it will be ghosted.\n\n"
+   "@dist - is the max distance\n\n"
+   )
+{
+#ifdef GHOSTSCOPING
+	object->setVisibleGhostDistance(dist);
+#endif
+}
+
+DefineEngineMethod( GameConnection, getVisibleGhostDistance, F32, (),,
+   "@brief Gets the distance that objects around the connection will be ghosted.\n\n"
+   
+   "@return S32 of distance.\n\n"
+   )
+{
+#ifdef GHOSTSCOPING
+	return object->getVisibleGhostDistance();
+#else
+	return 0;
+#endif
+}

+ 11 - 0
Engine/source/T3D/gameBase/gameConnection.h

@@ -39,6 +39,8 @@
 #include "core/bitVector.h"
 #endif
 
+#include "torqueConfig.h"
+
 enum GameConnectionConstants
 {
    MaxClients = 126,
@@ -72,6 +74,10 @@ private:
 
    U32  mMissionCRC;             // crc of the current mission file from the server
 
+#ifdef GHOSTSCOPING
+   F32 mConnectionVisibleDistance;
+#endif
+
 private:
    U32 mLastControlRequestTime;
    S32 mDataBlockModifiedKey;
@@ -155,6 +161,11 @@ public:
 
    bool canRemoteCreate();
 
+#ifdef GHOSTSCOPING
+   void setVisibleGhostDistance(F32 dist);
+   F32 getVisibleGhostDistance();
+#endif
+
 private:
    /// @name Connection State
    /// This data is set with setConnectArgs() and setJoinPassword(), and

+ 11 - 0
Engine/source/T3D/levelInfo.cpp

@@ -35,6 +35,8 @@
 #include "console/engineAPI.h"
 #include "math/mathIO.h"
 
+#include "torqueConfig.h"
+
 
 IMPLEMENT_CO_NETOBJECT_V1(LevelInfo);
 
@@ -77,6 +79,9 @@ static SFXAmbience sDefaultAmbience;
 LevelInfo::LevelInfo()
    :  mNearClip( 0.1f ),
       mVisibleDistance( 1000.0f ),
+#ifdef GHOSTSCOPING
+	  mVisibleGhostDistance (200.0f),
+#endif
       mDecalBias( 0.0015f ),
       mCanvasClearColor( 255, 0, 255, 255 ),
       mSoundAmbience( NULL ),
@@ -114,6 +119,9 @@ void LevelInfo::initPersistFields()
 
       addField( "nearClip", TypeF32, Offset( mNearClip, LevelInfo ), "Closest distance from the camera's position to render the world." );
       addField( "visibleDistance", TypeF32, Offset( mVisibleDistance, LevelInfo ), "Furthest distance fromt he camera's position to render the world." );
+#ifdef GHOSTSCOPING
+      addField( "visibleGhostDistance", TypeF32, Offset( mVisibleGhostDistance, LevelInfo ), "Furthest distance from the camera's position to render players." );  
+#endif
       addField( "decalBias", TypeF32, Offset( mDecalBias, LevelInfo ),
          "NearPlane bias used when rendering Decal and DecalRoad. This should be tuned to the visibleDistance in your level." );
 
@@ -300,6 +308,9 @@ void LevelInfo::_updateSceneGraph()
    
    scene->setNearClip( mNearClip );
    scene->setVisibleDistance( mVisibleDistance );
+#ifdef GHOSTSCOPING
+   scene->setVisibleGhostDistance( mVisibleGhostDistance );
+#endif
 
    gDecalBias = mDecalBias;
 

+ 4 - 0
Engine/source/T3D/levelInfo.h

@@ -36,6 +36,7 @@
    #include "sfx/sfxCommon.h"
 #endif
 
+#include "torqueConfig.h"
 
 class SFXAmbience;
 class SFXSoundscape;
@@ -55,6 +56,9 @@ class LevelInfo : public NetObject
 
       F32 mVisibleDistance;
 
+#ifdef GHOSTSCOPING
+	  F32 mVisibleGhostDistance;
+#endif
       F32 mDecalBias;
 
       ColorI mCanvasClearColor;

+ 3 - 1
Engine/source/scene/sceneManager.cpp

@@ -40,7 +40,6 @@
 // For player object bounds workaround.
 #include "T3D/player.h"
 
-
 extern bool gEditingMission;
 
 
@@ -113,6 +112,9 @@ SceneManager::SceneManager( bool isClient )
      mDisplayTargetResolution( 0, 0 ),
      mDefaultRenderPass( NULL ),
      mVisibleDistance( 500.f ),
+#ifdef GHOSTSCOPING
+     mVisibleGhostDistance(GHOSTSCOPING_DEFAULT_DISTANCE_IF_NOT_IN_MISSION),
+#endif
      mNearClip( 0.1f ),
      mAmbientLightColor( ColorF( 0.1f, 0.1f, 0.1f, 1.0f ) ),
      mZoneManager( NULL )

+ 9 - 0
Engine/source/scene/sceneManager.h

@@ -59,6 +59,8 @@
 #include "core/util/tSignal.h"
 #endif
 
+#include "torqueConfig.h"
+
 
 class LightManager;
 class SceneRootZone;
@@ -141,6 +143,9 @@ class SceneManager
 
       F32 mVisibleDistance;
 
+#ifdef GHOSTSCOPING
+      F32 mVisibleGhostDistance;
+#endif
       F32 mNearClip;
 
       FogData mFogData;
@@ -317,6 +322,10 @@ class SceneManager
       /// Returns the default visible distance for the scene.
       F32 getVisibleDistance() { return mVisibleDistance; }
 
+#ifdef GHOSTSCOPING
+      void setVisibleGhostDistance( F32 dist ) { mVisibleGhostDistance = dist; }
+      F32  getVisibleGhostDistance() { return mVisibleGhostDistance;}
+#endif
       /// Used by LevelInfo to set the default near clip plane 
       /// for rendering the scene.
       ///

+ 14 - 0
Engine/source/scene/sceneObject.cpp

@@ -43,6 +43,10 @@
 #include "math/mTransform.h"
 #include "T3D/gameBase/gameProcess.h"
 
+#ifdef GHOSTSCOPING
+#include "T3D/gameBase/gameConnection.h"
+#endif
+
 IMPLEMENT_CONOBJECT(SceneObject);
 
 ConsoleDocClass( SceneObject,
@@ -664,6 +668,16 @@ static void scopeCallback( SceneObject* obj, void* conPtr )
 
 void SceneObject::onCameraScopeQuery( NetConnection* connection, CameraScopeQuery* query )
 {
+
+#ifdef GHOSTSCOPING
+   SceneManager* scenemanager = getSceneManager();
+   GameConnection* conn  = dynamic_cast<GameConnection*> (connection);
+   if (conn->getVisibleGhostDistance() == 0.0f)
+       query->visibleDistance = scenemanager->getVisibleGhostDistance();
+   else
+	   query->visibleDistance = conn->getVisibleGhostDistance();
+#endif
+
    // Object itself is in scope.
 
    if( this->isScopeable() )

+ 1 - 0
Templates/Empty/game/levels/Empty Room.mis

@@ -5,6 +5,7 @@ new SimGroup(MissionGroup) {
 
    new LevelInfo(theLevelInfo) {
       visibleDistance = "1000";
+	  visibleGhostDistance = "1000";
       fogColor = "0.6 0.6 0.7 1";
       fogDensity = "0";
       fogDensityOffset = "700";

+ 13 - 0
Templates/Empty/source/torqueConfig.h

@@ -39,6 +39,19 @@
 /// Version number is major * 1000 + minor * 100 + revision * 10.
 #define TORQUE_APP_VERSION         1000
 
+//Ghost Scoping limits the number of objects being ghosted
+//to a gameConnection to the objects around it within X
+//distance.
+//This is particularly useful for reducing bandwidth usage
+//of games in which there are a lot of players and AI 
+//Basically, anything derived from SceneObject.
+//GHOSTSCOPING_DEFAULT_DISTANCE_IF_NOT_IN_MISSION is the default distance 
+//a game will use if the distance is not defined in the mission file.
+//DO NOT USE IF YOU ARE BUILDING A SIDE SCROLLER.
+//To enable ghost scoping define:
+//#define GHOSTSCOPING
+//#define GHOSTSCOPING_DEFAULT_DISTANCE_IF_NOT_IN_MISSION 200.0f
+
 /// Human readable application version string.
 #define TORQUE_APP_VERSION_STRING  "1.0"
 

+ 1 - 0
Templates/Full/game/levels/Empty Room.mis

@@ -5,6 +5,7 @@ new SimGroup(MissionGroup) {
 
    new LevelInfo(theLevelInfo) {
       visibleDistance = "1000";
+	  visibleGhostDistance = "1000";
       fogColor = "0.6 0.6 0.7 1";
       fogDensity = "0";
       fogDensityOffset = "700";

+ 1 - 0
Templates/Full/game/levels/Empty Terrain.mis

@@ -6,6 +6,7 @@ new SimGroup(MissionGroup) {
    new LevelInfo(theLevelInfo) {
       nearClip = "0.1";
       visibleDistance = "2000";
+	  visibleGhostDistance = "2000";
       decalBias = "0.0015";
       fogColor = "1 1 0.6 1";
       fogDensity = "0.001";

+ 1 - 0
Templates/Full/game/levels/Outpost.mis

@@ -7,6 +7,7 @@ new SimGroup(MissionGroup) {
    new LevelInfo(theLevelInfo) {
       nearClip = "0.1";
       visibleDistance = "2000";
+	  visibleGhostDistance = "2000";
       decalBias = "0.0015";
       fogColor = "0.462745 0.698039 0.729412 1";
       fogDensity = "0.005";

+ 13 - 0
Templates/Full/source/torqueConfig.h

@@ -39,6 +39,19 @@
 /// Version number is major * 1000 + minor * 100 + revision * 10.
 #define TORQUE_APP_VERSION         1000
 
+//Ghost Scoping limits the number of objects being ghosted
+//to a gameConnection to the objects around it within X
+//distance.
+//This is particularly useful for reducing bandwidth usage
+//of games in which there are a lot of players and AI 
+//Basically, anything derived from SceneObject.
+//GHOSTSCOPING_DEFAULT_DISTANCE_IF_NOT_IN_MISSION is the default distance 
+//a game will use if the distance is not defined in the mission file.
+//DO NOT USE IF YOU ARE BUILDING A SIDE SCROLLER.
+//To enable ghost scoping define:
+//#define GHOSTSCOPING
+//#define GHOSTSCOPING_DEFAULT_DISTANCE_IF_NOT_IN_MISSION 200.0f
+
 /// Human readable application version string.
 #define TORQUE_APP_VERSION_STRING  "1.0"