mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-22 13:44:44 +00:00
This makes some tweaks to the engine to support this, specifically, it tweaks the hardcoded shaderpaths to defer to a pref variable, so none of the shader paths are hardcoded. Also tweaks how post effects read in texture files, removing a bizzare filepath interpretation choice, where if the file path didn't start with "/" it forcefully appended the script's file path. This made it impossible to have images not in the same dir as the script file defining the post effect. This was changed and the existing template's post effects tweaked for now to just add "./" to those few paths impacted, as well as the perf vars to support the non-hardcoded shader paths in the engine.
346 lines
12 KiB
C#
346 lines
12 KiB
C#
//-----------------------------------------------------------------------------
|
|
// Copyright (c) 2012 GarageGames, LLC
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the "Software"), to
|
|
// deal in the Software without restriction, including without limitation the
|
|
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
// sell copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in
|
|
// all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
// IN THE SOFTWARE.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// What kind of "player" is spawned is either controlled directly by the
|
|
// SpawnSphere or it defaults back to the values set here. This also controls
|
|
// which SimGroups to attempt to select the spawn sphere's from by walking down
|
|
// the list of SpawnGroups till it finds a valid spawn object.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Leave $Game::defaultPlayerClass and $Game::defaultPlayerDataBlock as empty strings ("")
|
|
// to spawn a the $Game::defaultCameraClass as the control object.
|
|
$Game::DefaultPlayerClass = "Player";
|
|
$Game::DefaultPlayerDataBlock = "DefaultPlayerData";
|
|
$Game::DefaultPlayerSpawnGroups = "PlayerSpawnPoints";
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// What kind of "camera" is spawned is either controlled directly by the
|
|
// SpawnSphere or it defaults back to the values set here. This also controls
|
|
// which SimGroups to attempt to select the spawn sphere's from by walking down
|
|
// the list of SpawnGroups till it finds a valid spawn object.
|
|
//-----------------------------------------------------------------------------
|
|
$Game::DefaultCameraClass = "Camera";
|
|
$Game::DefaultCameraDataBlock = "Observer";
|
|
$Game::DefaultCameraSpawnGroups = "CameraSpawnPoints PlayerSpawnPoints";
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// pickCameraSpawnPoint() is responsible for finding a valid spawn point for a
|
|
// camera.
|
|
//-----------------------------------------------------------------------------
|
|
function pickCameraSpawnPoint(%spawnGroups)
|
|
{
|
|
// Walk through the groups until we find a valid object
|
|
for (%i = 0; %i < getWordCount(%spawnGroups); %i++)
|
|
{
|
|
%group = getWord(%spawnGroups, %i);
|
|
|
|
%count = getWordCount(%group);
|
|
|
|
if (isObject(%group))
|
|
%spawnPoint = %group.getRandom();
|
|
|
|
if (isObject(%spawnPoint))
|
|
return %spawnPoint;
|
|
}
|
|
|
|
// Didn't find a spawn point by looking for the groups
|
|
// so let's return the "default" SpawnSphere
|
|
// First create it if it doesn't already exist
|
|
if (!isObject(DefaultCameraSpawnSphere))
|
|
{
|
|
%spawn = new SpawnSphere(DefaultCameraSpawnSphere)
|
|
{
|
|
dataBlock = "SpawnSphereMarker";
|
|
spawnClass = $Game::DefaultCameraClass;
|
|
spawnDatablock = $Game::DefaultCameraDataBlock;
|
|
};
|
|
|
|
// Add it to the MissionCleanup group so that it
|
|
// doesn't get saved to the Mission (and gets cleaned
|
|
// up of course)
|
|
MissionCleanup.add(%spawn);
|
|
}
|
|
|
|
return DefaultCameraSpawnSphere;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// pickPlayerSpawnPoint() is responsible for finding a valid spawn point for a
|
|
// player.
|
|
//-----------------------------------------------------------------------------
|
|
function pickPlayerSpawnPoint(%spawnGroups)
|
|
{
|
|
// Walk through the groups until we find a valid object
|
|
for (%i = 0; %i < getWordCount(%spawnGroups); %i++)
|
|
{
|
|
%group = getWord(%spawnGroups, %i);
|
|
|
|
if (isObject(%group))
|
|
%spawnPoint = %group.getRandom();
|
|
|
|
if (isObject(%spawnPoint))
|
|
return %spawnPoint;
|
|
}
|
|
|
|
// Didn't find a spawn point by looking for the groups
|
|
// so let's return the "default" SpawnSphere
|
|
// First create it if it doesn't already exist
|
|
if (!isObject(DefaultPlayerSpawnSphere))
|
|
{
|
|
%spawn = new SpawnSphere(DefaultPlayerSpawnSphere)
|
|
{
|
|
dataBlock = "SpawnSphereMarker";
|
|
spawnClass = $Game::DefaultPlayerClass;
|
|
spawnDatablock = $Game::DefaultPlayerDataBlock;
|
|
};
|
|
|
|
// Add it to the MissionCleanup group so that it
|
|
// doesn't get saved to the Mission (and gets cleaned
|
|
// up of course)
|
|
MissionCleanup.add(%spawn);
|
|
}
|
|
|
|
return DefaultPlayerSpawnSphere;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// GameConnection::spawnCamera() is responsible for spawning a camera for a
|
|
// client
|
|
//-----------------------------------------------------------------------------
|
|
//function GameConnection::spawnCamera(%this, %spawnPoint)
|
|
//{
|
|
//// Set the control object to the default camera
|
|
//if (!isObject(%this.camera))
|
|
//{
|
|
//if (isDefined("$Game::DefaultCameraClass"))
|
|
//%this.camera = spawnObject($Game::DefaultCameraClass, $Game::DefaultCameraDataBlock);
|
|
//}
|
|
//
|
|
//if(!isObject(%this.PathCamera))
|
|
//{
|
|
//// Create path camera
|
|
//%this.PathCamera = spawnObject("PathCamera", "LoopingCam");
|
|
////%this.PathCamera = new PathCamera() {
|
|
////dataBlock = LoopingCam;
|
|
////position = "0 0 300 1 0 0 0";
|
|
////};
|
|
//}
|
|
//if(isObject(%this.PathCamera))
|
|
//{
|
|
//%this.PathCamera.setPosition("-54.0187 1.81237 5.14039");
|
|
//%this.PathCamera.followPath(MenuPath);
|
|
//MissionCleanup.add( %this.PathCamera);
|
|
//%this.PathCamera.scopeToClient(%this);
|
|
//%this.setControlObject(%this.PathCamera);
|
|
//}
|
|
//// If we have a camera then set up some properties
|
|
//if (isObject(%this.camera))
|
|
//{
|
|
//MissionCleanup.add( %this.camera );
|
|
//%this.camera.scopeToClient(%this);
|
|
//
|
|
////%this.setControlObject(%this.camera);
|
|
////%this.setControlObject(%this.PathCamera);
|
|
//
|
|
//if (isDefined("%spawnPoint"))
|
|
//{
|
|
//// Attempt to treat %spawnPoint as an object
|
|
//if (getWordCount(%spawnPoint) == 1 && isObject(%spawnPoint))
|
|
//{
|
|
//%this.camera.setTransform(%spawnPoint.getTransform());
|
|
//}
|
|
//else
|
|
//{
|
|
//// Treat %spawnPoint as an AxisAngle transform
|
|
//%this.camera.setTransform(%spawnPoint);
|
|
//}
|
|
//}
|
|
//}
|
|
//}
|
|
|
|
function GameConnection::spawnCamera(%this, %spawnPoint)
|
|
{
|
|
// Set the control object to the default camera
|
|
if (!isObject(%this.camera))
|
|
{
|
|
if (isDefined("$Game::DefaultCameraClass"))
|
|
%this.camera = spawnObject($Game::DefaultCameraClass, $Game::DefaultCameraDataBlock);
|
|
}
|
|
|
|
// If we have a camera then set up some properties
|
|
if (isObject(%this.camera))
|
|
{
|
|
MissionCleanup.add( %this.camera );
|
|
%this.camera.scopeToClient(%this);
|
|
|
|
%this.setControlObject(%this.camera);
|
|
|
|
if (isDefined("%spawnPoint"))
|
|
{
|
|
// Attempt to treat %spawnPoint as an object
|
|
if (getWordCount(%spawnPoint) == 1 && isObject(%spawnPoint))
|
|
{
|
|
%this.camera.setTransform(%spawnPoint.getTransform());
|
|
}
|
|
else
|
|
{
|
|
// Treat %spawnPoint as an AxisAngle transform
|
|
%this.camera.setTransform(%spawnPoint);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// GameConnection::spawnPlayer() is responsible for spawning a player for a
|
|
// client
|
|
//-----------------------------------------------------------------------------
|
|
function GameConnection::spawnPlayer(%this, %spawnPoint, %noControl)
|
|
{
|
|
if (isObject(%this.player))
|
|
{
|
|
// The client should not already have a player. Assigning
|
|
// a new one could result in an uncontrolled player object.
|
|
error("Attempting to create a player for a client that already has one!");
|
|
}
|
|
|
|
// Attempt to treat %spawnPoint as an object
|
|
if (getWordCount(%spawnPoint) == 1 && isObject(%spawnPoint))
|
|
{
|
|
// Defaults
|
|
%spawnClass = $Game::DefaultPlayerClass;
|
|
%spawnDataBlock = $Game::DefaultPlayerDataBlock;
|
|
|
|
// Overrides by the %spawnPoint
|
|
if (isDefined("%spawnPoint.spawnClass"))
|
|
{
|
|
%spawnClass = %spawnPoint.spawnClass;
|
|
%spawnDataBlock = %spawnPoint.spawnDatablock;
|
|
}
|
|
|
|
// This may seem redundant given the above but it allows
|
|
// the SpawnSphere to override the datablock without
|
|
// overriding the default player class
|
|
if (isDefined("%spawnPoint.spawnDatablock"))
|
|
%spawnDataBlock = %spawnPoint.spawnDatablock;
|
|
|
|
%spawnProperties = %spawnPoint.spawnProperties;
|
|
%spawnScript = %spawnPoint.spawnScript;
|
|
|
|
// Spawn with the engine's Sim::spawnObject() function
|
|
%player = spawnObject(%spawnClass, %spawnDatablock, "",
|
|
%spawnProperties, %spawnScript);
|
|
|
|
// If we have an object do some initial setup
|
|
if (isObject(%player))
|
|
{
|
|
// Set the transform to %spawnPoint's transform
|
|
%player.setTransform(%spawnPoint.getTransform());
|
|
}
|
|
else
|
|
{
|
|
// If we weren't able to create the player object then warn the user
|
|
if (isDefined("%spawnDatablock"))
|
|
{
|
|
MessageBoxOK("Spawn Player Failed",
|
|
"Unable to create a player with class " @ %spawnClass @
|
|
" and datablock " @ %spawnDatablock @ ".\n\nStarting as an Observer instead.",
|
|
%this @ ".spawnCamera();");
|
|
}
|
|
else
|
|
{
|
|
MessageBoxOK("Spawn Player Failed",
|
|
"Unable to create a player with class " @ %spawnClass @
|
|
".\n\nStarting as an Observer instead.",
|
|
%this @ ".spawnCamera();");
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Create a default player
|
|
%player = spawnObject($Game::DefaultPlayerClass, $Game::DefaultPlayerDataBlock);
|
|
|
|
if (!%player.isMemberOfClass("Player"))
|
|
warn("Trying to spawn a class that does not derive from Player.");
|
|
|
|
//Ensure we have a valid spawn point
|
|
if(%spawnPoint $= "")
|
|
{
|
|
%spawnPoint = pickPlayerSpawnPoint($Game::DefaultPlayerSpawnGroups).getTransform();
|
|
}
|
|
|
|
// Treat %spawnPoint as a transform
|
|
%player.setTransform(%spawnPoint);
|
|
}
|
|
|
|
// If we didn't actually create a player object then bail
|
|
if (!isObject(%player))
|
|
{
|
|
// Make sure we at least have a camera
|
|
%this.spawnCamera(%spawnPoint);
|
|
|
|
return;
|
|
}
|
|
|
|
// Update the default camera to start with the player
|
|
if (isObject(%this.camera))
|
|
{
|
|
if (%player.getClassname() $= "Player")
|
|
%this.camera.setTransform(%player.getEyeTransform());
|
|
else
|
|
%this.camera.setTransform(%player.getTransform());
|
|
}
|
|
|
|
// Add the player object to MissionCleanup so that it
|
|
// won't get saved into the level files and will get
|
|
// cleaned up properly
|
|
MissionCleanup.add(%player);
|
|
|
|
// Store the client object on the player object for
|
|
// future reference
|
|
%player.client = %this;
|
|
|
|
// Player setup...
|
|
if (%player.isMethod("setShapeName"))
|
|
%player.setShapeName(%this.playerName);
|
|
|
|
if (%player.isMethod("setEnergyLevel"))
|
|
%player.setEnergyLevel(%player.getDataBlock().maxEnergy);
|
|
|
|
// Give the client control of the player
|
|
%this.player = %player;
|
|
|
|
// Give the client control of the camera if in the editor
|
|
if( $startWorldEditor )
|
|
{
|
|
%control = %this.camera;
|
|
%control.mode = toggleCameraFly;
|
|
EditorGui.syncCameraGui();
|
|
}
|
|
else
|
|
%control = %player;
|
|
|
|
if(!isDefined("%noControl"))
|
|
%this.setControlObject(%control);
|
|
} |