Adds function for sceneObjects to report utilized assets

Add reporting of used assets to tsStatics and TerrData
When saving a Scene, it will write static object asset dependencies to it's levelAsset
Shifted level loader logic to pass up the levelAsset rather than full level path
Made it so when level is loading, the levelAsset loads its dependencies. When the level is ended, as part of cleanup, they are unloaded
Shifts defaultEditorLevel to be an actual asset and made the ToolsModule load assets
Fixes the Save As action to correctly save out to the new level asset
Fixed the autoLoadAssets logic to be cleaner and not manually check types
Removed extra, unused DefaultEditorFile file
This commit is contained in:
Areloch 2020-08-19 18:30:42 -05:00
parent f7dbfff42d
commit 40dd926873
21 changed files with 263 additions and 255 deletions

View file

@ -60,11 +60,11 @@ function Core_ClientServer::onDestroy( %this )
}
//-----------------------------------------------------------------------------
function StartGame( %mission, %hostingType )
function StartGame( %levelAsset, %hostingType )
{
if( %mission $= "" )
if( %levelAsset $= "" )
{
%mission = $selectedLevelFile;
%levelAsset = $selectedLevelAsset;
}
if (%hostingType !$= "")
@ -88,7 +88,7 @@ function StartGame( %mission, %hostingType )
Canvas.repaint();
}
createAndConnectToLocalServer( %serverType, %mission );
createAndConnectToLocalServer( %serverType, %levelAsset );
}
function JoinGame( %serverIndex )

View file

@ -33,22 +33,26 @@ $MissionLoadPause = 5000;
//-----------------------------------------------------------------------------
//This is the first call made by the server to kick the loading process off
function loadMission( %missionName, %isFirstMission )
function loadMission( %levelAsset, %isFirstMission )
{
endMission();
echo("*** LOADING MISSION: " @ %missionName);
$Server::LevelAsset = AssetDatabase.acquireAsset(%levelAsset);
echo("*** LOADING MISSION: " @ $Server::LevelAsset.LevelName);
echo("*** Stage 1 load");
// increment the mission sequence (used for ghost sequencing)
$missionSequence++;
$missionRunning = false;
$Server::MissionFile = %missionName;
$Server::MissionFile = $Server::LevelAsset.getLevelFile();
$Server::LoadFailMsg = "";
$Server::LevelAsset.loadDependencies();
// Extract mission info from the mission file,
// including the display name and stuff to send
// to the client.
buildLoadInfo( %missionName );
buildLoadInfo( $Server::MissionFile );
// Download mission info to the clients
%count = ClientGroup.getCount();
@ -163,6 +167,9 @@ function endMission()
getScene(0).delete();
MissionCleanup.delete();
if(isObject($Server::LevelAsset))
AssetDatabase.releaseAsset($Server::LevelAsset.getAssetId()); //cleanup
if ($Pref::Server::EnableDatablockCache)
resetDatablockCache();
DatablockFilesList.empty();

View file

@ -93,9 +93,9 @@ function portInit(%port)
/// create a local client connection to the server.
//
/// @return true if successful.
function createAndConnectToLocalServer( %serverType, %level )
function createAndConnectToLocalServer( %serverType, %levelAsset )
{
if( !createServer( %serverType, %level ) )
if( !createServer( %serverType, %levelAsset ) )
return false;
%conn = new GameConnection( ServerConnection );
@ -124,7 +124,7 @@ function createAndConnectToLocalServer( %serverType, %level )
/// Create a server with either a "SinglePlayer" or "MultiPlayer" type
/// Specify the level to load on the server
function createServer(%serverType, %level)
function createServer(%serverType, %levelAsset)
{
if($Game::firstTimeServerRun == true)
{
@ -135,7 +135,7 @@ function createServer(%serverType, %level)
// working with the server session we think we are.
$Server::Session++;
if (%level $= "")
if (%levelAsset $= "")
{
error("createServer(): level name unspecified");
return false;
@ -143,7 +143,7 @@ function createServer(%serverType, %level)
// Make sure our level name is relative so that it can send
// across the network correctly
%level = makeRelativePath(%level, getWorkingDirectory());
//%level = makeRelativePath(%level, getWorkingDirectory());
destroyServer();
@ -176,7 +176,7 @@ function createServer(%serverType, %level)
// the server has been created
onServerCreated();
loadMission(%level, true);
loadMission(%levelAsset, true);
$Game::running = true;

View file

@ -51,6 +51,9 @@ function ChooseLevelDlg::onWake( %this )
for(%i=0; %i < %count; %i++)
{
%assetId = %assetQuery.getAsset(%i);
if(AssetDatabase.getAssetModule(%assetId).ModuleId $= "ToolsModule")
continue;
%levelAsset = AssetDatabase.acquireAsset(%assetId);
@ -93,53 +96,6 @@ function ChooseLevelDlg::onWake( %this )
else
LevelSelectTitle.setText("CREATE SERVER");
/*for (%i = 0; %i < LevelList.rowCount(); %i++)
{
%preview = new GuiButtonCtrl() {
profile = "GuiMenuButtonProfile";
internalName = "SmallPreview" @ %i;
Extent = "368 35";
text = getField(CL_levelList.getRowText(%i), 0);
command = "ChooseLevelWindow.previewSelected(ChooseLevelWindow->SmallPreviews->SmallPreview" @ %i @ ");";
buttonType = "RadioButton";
};
ChooseLevelWindow->SmallPreviews.add(%preview);
%rowText = CL_levelList.getRowText(%i);
// Set the level index
%preview.levelIndex = %i;
// Get the name
%name = getField(CL_levelList.getRowText(%i), 0);
%preview.levelName = %name;
%file = getField(CL_levelList.getRowText(%i), 1);
// Find the preview image
%levelPreview = getField(CL_levelList.getRowText(%i), 3);
// Test against all of the different image formats
// This should probably be moved into an engine function
if (isFile(%levelPreview @ ".png") ||
isFile(%levelPreview @ ".jpg") ||
isFile(%levelPreview @ ".bmp") ||
isFile(%levelPreview @ ".gif") ||
isFile(%levelPreview @ ".jng") ||
isFile(%levelPreview @ ".mng") ||
isFile(%levelPreview @ ".tga"))
{
%preview.bitmap = %levelPreview;
}
// Get the description
%desc = getField(CL_levelList.getRowText(%i), 2);
%preview.levelDesc = %desc;
}*/
ChooseLevelButtonHolder.setActive();
}
@ -184,28 +140,7 @@ function ChooseLevelDlg::addMissionFile( %this, %file )
function ChooseLevelDlg::addLevelAsset( %this, %levelAsset )
{
%file = %levelAsset.getLevelFile();
/*%levelName = fileBase(%file);
%levelDesc = "A Torque level";
%LevelInfoObject = getLevelInfo(%file);
if (%LevelInfoObject != 0)
{
if(%LevelInfoObject.levelName !$= "")
%levelName = %LevelInfoObject.levelName;
else if(%LevelInfoObject.name !$= "")
%levelName = %LevelInfoObject.name;
if (%LevelInfoObject.desc0 !$= "")
%levelDesc = %LevelInfoObject.desc0;
if (%LevelInfoObject.preview !$= "")
%levelPreview = %LevelInfoObject.preview;
%LevelInfoObject.delete();
}*/
%file = %levelAsset.getAssetId();
%levelName = %levelAsset.LevelName;
%levelDesc = %levelAsset.description;
@ -224,7 +159,7 @@ function LevelList::onChange(%this)
ChooseLevelWindow->LevelName.text = getField(%levelEntry, 0);
// Get the level file
$selectedLevelFile = getField(%levelEntry, 1);
$selectedLevelAsset = getField(%levelEntry, 1);
// Find the preview image
%levelPreview = getField(%levelEntry, 3);

View file

@ -16,7 +16,7 @@ function ToolsModule::onCreate(%this)
// to find exactly which subsystems should be readied before kicking things off.
// ----------------------------------------------------------------------------
ModuleDatabase.LoadExplicit( "MainEditor" );
//ModuleDatabase.LoadExplicit( "MainEditor" );
//ModuleDatabase.LoadExplicit( "Tools_ObjectViewer" );
}

View file

@ -5,4 +5,10 @@
ScriptFile="Tools.cs"
CreateFunction="onCreate"
DestroyFunction="onDestroy"
Group="Tools"/>
Group="Tools">
<DeclaredAssets
canSave="true"
canSaveDynamicFields="true"
Extension="asset.taml"
Recurse="true" />
</ModuleDefinition>

View file

@ -1,141 +0,0 @@
//--- OBJECT WRITE BEGIN ---
new Scene(EditorTemplateLevel) {
canSave = "1";
canSaveDynamicFields = "1";
isSubScene = "0";
isEditing = "0";
isDirty = "0";
cdTrack = "2";
CTF_scoreLimit = "5";
Enabled = "1";
musicTrack = "lush";
new LevelInfo(theLevelInfo) {
nearClip = "0.1";
visibleDistance = "1000";
visibleGhostDistance = "0";
decalBias = "0.0015";
fogColor = "0.6 0.6 0.7 1";
fogDensity = "0";
fogDensityOffset = "700";
fogAtmosphereHeight = "0";
canvasClearColor = "0 0 0 255";
ambientLightBlendPhase = "1";
ambientLightBlendCurve = "0 0 -1 -1";
soundAmbience = "AudioAmbienceDefault";
soundDistanceModel = "Linear";
canSave = "1";
canSaveDynamicFields = "1";
advancedLightmapSupport = "0";
desc0 = "A blank room template that acts as a starting point.";
Enabled = "1";
LevelName = "Blank Room Template";
};
new SkyBox(theSky) {
Material = "BlankSkyMat";
drawBottom = "0";
fogBandHeight = "0";
dirtyGameObject = "0";
position = "0 0 0";
rotation = "1 0 0 0";
scale = "1 1 1";
canSave = "1";
canSaveDynamicFields = "1";
};
new Sun(theSun) {
azimuth = "230.396";
elevation = "45";
color = "0.968628 0.901961 0.901961 1";
ambient = "0.337255 0.533333 0.619608 1";
brightness = "1";
castShadows = "1";
staticRefreshFreq = "250";
dynamicRefreshFreq = "8";
coronaEnabled = "1";
coronaScale = "0.5";
coronaTint = "1 1 1 1";
coronaUseLightColor = "1";
flareScale = "1";
attenuationRatio = "0 1 1";
shadowType = "PSSM";
texSize = "2048";
overDarkFactor = "3000 1500 750 250";
shadowDistance = "200";
shadowSoftness = "0.25";
numSplits = "4";
logWeight = "0.9";
fadeStartDistance = "0";
lastSplitTerrainOnly = "0";
representedInLightmap = "0";
shadowDarkenColor = "0 0 0 -1";
includeLightmappedGeometryInShadow = "0";
dirtyGameObject = "0";
position = "0 0 0";
rotation = "1 0 0 0";
scale = "1 1 1";
canSave = "1";
canSaveDynamicFields = "1";
bias = "0.1";
Blur = "1";
Enabled = "1";
height = "1024";
lightBleedFactor = "0.8";
minVariance = "0";
pointShadowType = "PointShadowType_Paraboloid";
shadowBox = "-100 -100 -100 100 100 100";
splitFadeDistances = "1 1 1 1";
width = "3072";
};
new GroundPlane() {
squareSize = "128";
scaleU = "25";
scaleV = "25";
Material = "Grid_512_Grey";
dirtyGameObject = "0";
canSave = "1";
canSaveDynamicFields = "1";
Enabled = "1";
position = "0 0 0";
rotation = "1 0 0 0";
scale = "1 1 1";
};
new Skylight() {
Enabled = "1";
ReflectionMode = "Baked Cubemap";
dirtyGameObject = "0";
position = "1.37009 -5.23561 46.5817";
rotation = "1 0 0 0";
canSave = "1";
canSaveDynamicFields = "1";
persistentId = "d5eb3afb-dced-11e9-a423-bb0e346e3870";
reflectionPath = "tools/levels/BlankRoom/probes/";
};
new TSStatic() {
ShapeAsset = "pbr:material_ball";
playAmbient = "1";
meshCulling = "0";
originSort = "0";
overrideColor = "0 0 0 0";
collisionType = "Collision Mesh";
decalType = "Collision Mesh";
allowPlayerStep = "0";
alphaFadeEnable = "0";
alphaFadeStart = "100";
alphaFadeEnd = "150";
alphaFadeInverse = "0";
renderNormals = "0";
forceDetail = "-1";
ignoreZodiacs = "0";
useGradientRange = "0";
gradientRange = "0 180";
invertGradientRange = "0";
dirtyGameObject = "0";
position = "-0.000554562 -0.0734091 1.05277";
rotation = "1 0 0 0";
scale = "1 1 1";
canSave = "1";
canSaveDynamicFields = "1";
materialSlot0 = "base_material_ball";
};
};
//--- OBJECT WRITE END ---

View file

@ -0,0 +1,10 @@
<LevelAsset
canSave="true"
canSaveDynamicFields="true"
AssetName="DefaultEditorLevel"
LevelFile="@assetFile=DefaultEditorLevel.mis"
LevelName="DefaultEditorLevel"
isSubScene="false"
description="An empty room"
staticObjectAssetDependency0="@Asset=FPSGameplay:station01"
VersionId="1" />

View file

@ -272,7 +272,7 @@ function fastLoadWorldEdit(%val)
if( !$missionRunning )
{
EditorNewLevel("tools/levels/DefaultEditorLevel.mis");
EditorNewLevel("ToolsModule:DefaultEditorLevel");
}
else
{

View file

@ -199,7 +199,7 @@ function EditorOpenDeclarationInTorsion( %object )
EditorOpenFileInTorsion( makeFullPath( %fileName ), %object.getDeclarationLine() );
}
function EditorNewLevel( %file )
function EditorNewLevel( %level )
{
%saveFirst = false;
if ( EditorIsDirty() )
@ -219,18 +219,18 @@ function EditorNewLevel( %file )
Editor.getUndoManager().clearAll();
}
if( %file $= "" )
if( %level $= "" )
{
%file = "tools/levels/DefaultEditorLevel.mis";
%level = "ToolsModule:DefaultEditorLevel";
}
if( !$missionRunning )
{
activatePackage( "BootEditor" );
StartGame( %file );
StartGame( %level );
}
else
EditorOpenMission(%file);
EditorOpenMission(%level);
//EWorldEditor.isDirty = true;
//ETerrainEditor.isDirty = true;
@ -360,6 +360,15 @@ function EditorSaveMissionAs( %levelAsset )
if( fileExt( %missionName ) !$= ".mis" )
%missionName = %missionName @ ".mis";
//Update to be our active
$Server::MissionFile = %missionName;
%Server::LevelAsset = %levelAssetDef;
//Do the save
EditorSaveMission();
//TODO: doublecheck that we rename the scene properly
//Make sure we have a selected module so we can create our module
//if(AssetBrowser.selectedModule $= "")
// Canvas.pushDialog(