Przeglądaj źródła

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 10 lat temu
rodzic
commit
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"