@ -26,38 +26,43 @@ public class GameState
{
Destroy ( ) ;
// DEBUG - we'll want to instantiate prefabs for each submodel and assign materials from a preset collection
worldGameObject = new GameObject ( worldModel . Name ) ;
//for (int i = 0; i < worldModel.SubModelCount; ++i)
for ( int i = 0 ; i < 1 ; + + i )
// The first sub-model contains all of the static geometry
var subModel = worldModel . GetSubModel ( 0 ) ;
var subModelGO = CreateWorldGameObject ( subModel ) ;
subModelGO . transform . SetParent ( worldGameObject . transform ) ;
}
private GameObject CreateWorldGameObject ( BrushModel . SubModel subModel )
{
var subModelGO = new GameObject ( subModel . Name ) ;
// DEBUG - we'll want to instantiate prefabs for each sub-model and assign materials from a preset collection
foreach ( var surfaceMesh in subModel . SurfaceMeshes )
{
var subModel = worldModel . GetSubModel ( i ) ;
var subModelGO = new GameObject ( $"SubModel_{i}" ) ;
subModelGO . transform . SetParent ( worldGameObject . transform ) ;
var meshGO = new GameObject ( surfaceMesh . Mesh . name ) ;
meshGO . transform . SetParent ( subModelGO . transform ) ;
foreach ( var surfaceMesh in subModel . SurfaceMeshes )
var mf = meshGO . AddComponent < MeshFilter > ( ) ;
mf . sharedMesh = surfaceMesh . Mesh ;
var material = new Material ( Shader . Find ( "Universal Render Pipeline/Simple Lit" ) ) ;
uint texNum = surfaceMesh . Texture . TextureNum ;
if ( uq . GameAssets . TryGetTexture ( texNum , out var texture ) )
{
var meshGO = new GameObject ( surfaceMesh . Mesh . name ) ;
meshGO . transform . SetParent ( subModelGO . transform ) ;
var mf = meshGO . AddComponent < MeshFilter > ( ) ;
mf . sharedMesh = surfaceMesh . Mesh ;
var material = new Material ( Shader . Find ( "Universal Render Pipeline/Simple Lit" ) ) ;
uint texNum = surfaceMesh . Texture . TextureNum ;
if ( uq . GameAssets . TryGetTexture ( texNum , out var texture ) )
{
material . mainTexture = texture ;
}
var mr = meshGO . AddComponent < MeshRenderer > ( ) ;
mr . sharedMaterial = material ;
mr . shadowCastingMode = ShadowCastingMode . Off ;
mr . receiveShadows = false ;
mr . lightProbeUsage = LightProbeUsage . Off ;
mr . reflectionProbeUsage = ReflectionProbeUsage . Off ;
material . mainTexture = texture ;
}
var mr = meshGO . AddComponent < MeshRenderer > ( ) ;
mr . sharedMaterial = material ;
mr . shadowCastingMode = ShadowCastingMode . Off ;
mr . receiveShadows = false ;
mr . lightProbeUsage = LightProbeUsage . Off ;
mr . reflectionProbeUsage = ReflectionProbeUsage . Off ;
}
return subModelGO ;
}
private void DestroyWorld ( )
@ -75,7 +80,7 @@ public class GameState
return entity ;
}
public void SetEntityAliasModel ( int entityNum , string modelName )
private Entity GetOrCreateEntity ( int entityNum )
{
if ( ! entities . TryGetValue ( entityNum , out var entity ) )
{
@ -83,6 +88,13 @@ public class GameState
entities . Add ( entityNum , entity ) ;
}
return entity ;
}
public void SetEntityAliasModel ( int entityNum , string modelName )
{
var entity = GetOrCreateEntity ( entityNum ) ;
if ( ! uq . GameAssets . TryGetAliasModel ( modelName , out var aliasModel ) )
{
Debug . LogWarning ( $"Unknown alias model name: {modelName}" ) ;
@ -94,7 +106,19 @@ public class GameState
public void SetEntityWorldModel ( int entityNum , int subModelNum )
{
// TODO: obtain Mesh from brush submodel and assign it to MeshRenderer
var entity = GetOrCreateEntity ( entityNum ) ;
if ( ! uq . GameAssets . TryGetWorldSubModel ( subModelNum , out var subModel ) )
{
Debug . LogWarning ( $"Invalid world sub-model number: {subModelNum}" ) ;
return ;
}
// TODO: these relatively complex world game objects are going to get destroyed and re-created all the time
// as the player moves through the map and moves in and out of range of these entities. This can and should
// be done more efficiently by creating the game objects only once and enabling/disabling them on demand.
var worldModelGO = CreateWorldGameObject ( subModel ) ;
entity . SetWorldModel ( worldModelGO ) ;
}
public void RemoveEntity ( int entityNum )