@ -6,7 +6,10 @@ public class Entity
private readonly int entityNum ;
private GameObject gameObject ;
private SkinnedMeshRenderer meshRenderer ;
private MeshFilter meshFilter ;
private MeshRenderer meshRenderer ;
private SkinnedMeshRenderer skinnedMeshRenderer ;
private AliasModel aliasModel ;
private GameObject worldModel ;
@ -20,14 +23,6 @@ public class Entity
private void CreateGameObject ( )
{
gameObject = new GameObject ( $"Entity_{entityNum}" ) ;
// DEBUG - we'll want to instantiate a prefab and assign materials from a preset collection
meshRenderer = gameObject . AddComponent < SkinnedMeshRenderer > ( ) ;
meshRenderer . material = new Material ( Shader . Find ( "Universal Render Pipeline/Simple Lit" ) ) ;
meshRenderer . shadowCastingMode = ShadowCastingMode . Off ;
meshRenderer . receiveShadows = false ;
meshRenderer . lightProbeUsage = LightProbeUsage . Off ;
meshRenderer . reflectionProbeUsage = ReflectionProbeUsage . Off ;
}
public void Destroy ( )
@ -38,12 +33,20 @@ public class Entity
public void ClearModel ( )
{
aliasModel = null ;
meshRenderer . sharedMesh = null ;
Object . Destroy ( meshFilter ) ;
Object . Destroy ( meshRenderer ) ;
Object . Destroy ( skinnedMeshRenderer ) ;
// TODO: not sure if this is the right way to unlink world sub-models
gameObject . transform . DetachChildren ( ) ;
}
public void SetAliasModel ( AliasModel model )
{
ClearModel ( ) ;
aliasModel = model ;
AssignMeshRenderer ( ) ;
// Set a default pose based on the first animation frame
UpdateAnimation ( 0 ) ;
@ -51,6 +54,7 @@ public class Entity
public void SetWorldModel ( GameObject worldModelGO )
{
ClearModel ( ) ;
worldModel = worldModelGO ;
worldModel . transform . SetParent ( gameObject . transform ) ;
}
@ -60,10 +64,17 @@ public class Entity
if ( aliasModel ! = null )
{
aliasModel . Animate ( frameNum , out Mesh mesh , out float blendWeight ) ;
meshRenderer . sharedMesh = mesh ;
if ( skinnedMeshRenderer ! = null )
{
skinnedMeshRenderer . sharedMesh = mesh ;
if ( mesh ! = null & & mesh . blendShapeCount > 0 )
meshRenderer . SetBlendShapeWeight ( 0 , blendWeight ) ;
skinnedMeshRenderer . SetBlendShapeWeight ( 0 , blendWeight ) ;
}
else if ( meshFilter ! = null )
{
meshFilter . sharedMesh = mesh ;
}
}
if ( worldModel ! = null )
@ -77,4 +88,30 @@ public class Entity
gameObject . transform . position = position ;
gameObject . transform . rotation = rotation ;
}
private void AssignMeshRenderer ( )
{
// DEBUG - we'll want to instantiate a prefab and assign materials from a preset collection
var material = new Material ( Shader . Find ( "Universal Render Pipeline/Simple Lit" ) ) ;
if ( aliasModel . IsAnimated )
{
skinnedMeshRenderer = gameObject . AddComponent < SkinnedMeshRenderer > ( ) ;
skinnedMeshRenderer . material = material ;
skinnedMeshRenderer . shadowCastingMode = ShadowCastingMode . Off ;
skinnedMeshRenderer . receiveShadows = false ;
skinnedMeshRenderer . lightProbeUsage = LightProbeUsage . Off ;
skinnedMeshRenderer . reflectionProbeUsage = ReflectionProbeUsage . Off ;
}
else
{
meshFilter = gameObject . AddComponent < MeshFilter > ( ) ;
meshRenderer = gameObject . AddComponent < MeshRenderer > ( ) ;
meshRenderer . material = material ;
meshRenderer . shadowCastingMode = ShadowCastingMode . Off ;
meshRenderer . receiveShadows = false ;
meshRenderer . lightProbeUsage = LightProbeUsage . Off ;
meshRenderer . reflectionProbeUsage = ReflectionProbeUsage . Off ;
}
}
}