@ -31,11 +31,11 @@ public class GameState
// The first sub-model contains all of the static geometry
var subModel = worldModel . GetSubModel ( 0 ) ;
var subModelGO = CreateBrushGame Object ( subModel ) ;
var subModelGO = CreateWorld BrushObject ( subModel ) ;
subModelGO . transform . SetParent ( worldGameObject . transform ) ;
}
private GameObject CreateBrushGame Object ( BrushModel . SubModel subModel )
private GameObject CreateWorld BrushObject ( BrushModel . SubModel subModel )
{
var subModelGO = new GameObject ( subModel . Name ) { layer = ( int ) uq . GameLayer } ;
@ -44,13 +44,12 @@ public class GameState
var meshGO = new GameObject ( surfaceMesh . Mesh . name ) { layer = ( int ) uq . GameLayer } ;
meshGO . transform . SetParent ( subModelGO . transform ) ;
var mf = meshGO . AddComponent < MeshFilter > ( ) ;
var mr = meshGO . AddComponent < MeshRenderer > ( ) ;
mf . sharedMesh = surfaceMesh . Mesh ;
var meshFilter = meshGO . AddComponent < MeshFilter > ( ) ;
meshFilter . sharedMesh = surfaceMesh . Mesh ;
// TODO FIXME This is wrong for brush model entities
uq . CurrentStyle . SetupWorldRenderer ( mr ) ;
mr . material = uq . CurrentStyle . CreateWorldMaterial ( surfaceMesh . Flags ) ; // TODO FIXME this currently leaks Materials
var meshRenderer = meshGO . AddComponent < MeshRenderer > ( ) ;
uq . CurrentStyle . SetupWorldRenderer ( meshRendere r ) ;
meshRendere r . material = uq . CurrentStyle . CreateWorldMaterial ( surfaceMesh . Flags ) ; // TODO FIXME this currently leaks Materials
uint texNum = surfaceMesh . TextureNum ;
if ( uq . GameAssets . TryGetTexture ( texNum , out var texture ) )
@ -59,7 +58,36 @@ public class GameState
uq . GameAssets . TryGetTexture ( fbNum , out var fullBright ) ;
uq . GameAssets . TryGetLightmap ( surfaceMesh . Lightmap , out var lightmap ) ;
uq . CurrentStyle . SetWorldTextures ( mr . material , texture , fullBright , lightmap ) ;
uq . CurrentStyle . SetWorldTextures ( meshRenderer . material , texture , fullBright , lightmap ) ;
}
}
return subModelGO ;
}
private GameObject CreateEntityBrushObject ( BrushModel . SubModel subModel )
{
var subModelGO = new GameObject ( subModel . Name ) { layer = ( int ) uq . GameLayer } ;
foreach ( var surfaceMesh in subModel . SurfaceMeshes )
{
var meshGO = new GameObject ( surfaceMesh . Mesh . name ) { layer = ( int ) uq . GameLayer } ;
meshGO . transform . SetParent ( subModelGO . transform ) ;
var meshFilter = meshGO . AddComponent < MeshFilter > ( ) ;
meshFilter . sharedMesh = surfaceMesh . Mesh ;
var meshRenderer = meshGO . AddComponent < MeshRenderer > ( ) ;
uq . CurrentStyle . SetupEntityRenderer ( meshRenderer ) ;
meshRenderer . material = uq . CurrentStyle . CreateEntityMaterial ( false ) ; // TODO FIXME this currently leaks Materials
uint texNum = surfaceMesh . TextureNum ;
if ( uq . GameAssets . TryGetTexture ( texNum , out var texture ) )
{
uint fbNum = surfaceMesh . FullBrightNum ;
uq . GameAssets . TryGetTexture ( fbNum , out var fullBright ) ;
uq . CurrentStyle . SetEntityTextures ( meshRenderer . material , texture , fullBright ) ;
}
}
@ -112,7 +140,7 @@ public class GameState
var brushModelGO = new GameObject ( brushModel . Name ) { layer = ( int ) Layers . Game1 } ;
for ( int i = 0 ; i < brushModel . SubModelCount ; + + i )
{
var subModelGO = CreateBrushGame Object ( brushModel . GetSubModel ( i ) ) ;
var subModelGO = CreateEntity BrushObject ( brushModel . GetSubModel ( i ) ) ;
subModelGO . transform . SetParent ( brushModelGO . transform ) ;
}
@ -132,7 +160,7 @@ public class GameState
// 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 = CreateBrushGame Object ( subModel ) ;
var worldModelGO = CreateWorld BrushObject ( subModel ) ;
entity . SetWorldModel ( worldModelGO ) ;
}