diff --git a/Engine/source/T3D/gameBase/gameBase.cpp b/Engine/source/T3D/gameBase/gameBase.cpp index c0e4ee704..3b0b429b9 100644 --- a/Engine/source/T3D/gameBase/gameBase.cpp +++ b/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) { diff --git a/Engine/source/T3D/gameBase/gameBase.h b/Engine/source/T3D/gameBase/gameBase.h index 4cb069c62..3509f20b1 100644 --- a/Engine/source/T3D/gameBase/gameBase.h +++ b/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; diff --git a/Engine/source/T3D/gameBase/gameConnection.cpp b/Engine/source/T3D/gameBase/gameConnection.cpp index 5888ec218..f06d1f1d4 100644 --- a/Engine/source/T3D/gameBase/gameConnection.cpp +++ b/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 +} \ No newline at end of file diff --git a/Engine/source/T3D/gameBase/gameConnection.h b/Engine/source/T3D/gameBase/gameConnection.h index 803fda271..218ccc0e8 100644 --- a/Engine/source/T3D/gameBase/gameConnection.h +++ b/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 diff --git a/Engine/source/T3D/levelInfo.cpp b/Engine/source/T3D/levelInfo.cpp index 16cdf8be1..6e442f2a5 100644 --- a/Engine/source/T3D/levelInfo.cpp +++ b/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; diff --git a/Engine/source/T3D/levelInfo.h b/Engine/source/T3D/levelInfo.h index 425ba6f03..43a80a7b8 100644 --- a/Engine/source/T3D/levelInfo.h +++ b/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; diff --git a/Engine/source/scene/sceneManager.cpp b/Engine/source/scene/sceneManager.cpp index d07e9fb9a..99e505d56 100644 --- a/Engine/source/scene/sceneManager.cpp +++ b/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 ) diff --git a/Engine/source/scene/sceneManager.h b/Engine/source/scene/sceneManager.h index 00eb3bd10..c02908ef5 100644 --- a/Engine/source/scene/sceneManager.h +++ b/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. /// diff --git a/Engine/source/scene/sceneObject.cpp b/Engine/source/scene/sceneObject.cpp index 3162df2ec..9e862da13 100644 --- a/Engine/source/scene/sceneObject.cpp +++ b/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 (connection); + if (conn->getVisibleGhostDistance() == 0.0f) + query->visibleDistance = scenemanager->getVisibleGhostDistance(); + else + query->visibleDistance = conn->getVisibleGhostDistance(); +#endif + // Object itself is in scope. if( this->isScopeable() ) diff --git a/Templates/Empty/game/levels/Empty Room.mis b/Templates/Empty/game/levels/Empty Room.mis index c3ba059a4..c9b2cd8fa 100644 --- a/Templates/Empty/game/levels/Empty Room.mis +++ b/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"; diff --git a/Templates/Empty/source/torqueConfig.h b/Templates/Empty/source/torqueConfig.h index d9de1b1d1..1cd8ed885 100644 --- a/Templates/Empty/source/torqueConfig.h +++ b/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" diff --git a/Templates/Full/game/levels/Empty Room.mis b/Templates/Full/game/levels/Empty Room.mis index c3ba059a4..c9b2cd8fa 100644 --- a/Templates/Full/game/levels/Empty Room.mis +++ b/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"; diff --git a/Templates/Full/game/levels/Empty Terrain.mis b/Templates/Full/game/levels/Empty Terrain.mis index 0428ece36..546f18976 100644 --- a/Templates/Full/game/levels/Empty Terrain.mis +++ b/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"; diff --git a/Templates/Full/game/levels/Outpost.mis b/Templates/Full/game/levels/Outpost.mis index df29dd7ec..6483228ae 100644 --- a/Templates/Full/game/levels/Outpost.mis +++ b/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"; diff --git a/Templates/Full/source/torqueConfig.h b/Templates/Full/source/torqueConfig.h index 4d8f124f2..c960199f7 100644 --- a/Templates/Full/source/torqueConfig.h +++ b/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"