|
using Unity.Burst; |
|
using Unity.Collections; |
|
using Unity.Entities; |
|
using Unity.Rendering; |
|
using UnityEngine; |
|
|
|
namespace Junk.Rendering.Hybrid |
|
{ |
|
//Short notes: requires internal access asmref trick |
|
public class GetSkinnedEntityAuthoring : MonoBehaviour |
|
{ |
|
public SkinnedMeshRenderer skinnedMeshRenderer; |
|
public class GetSkinnedEntityAuthoringBaker : Baker<GetSkinnedEntityAuthoring> |
|
{ |
|
public override void Bake(GetSkinnedEntityAuthoring authoring) |
|
{ |
|
var entity = GetEntity(TransformUsageFlags.Dynamic); |
|
|
|
var smrEntity = GetEntity(authoring.skinnedMeshRenderer, TransformUsageFlags.Dynamic); |
|
AddComponent(entity, new FindSkinnedEntityData |
|
{ |
|
SkinnedEntity = smrEntity |
|
}); |
|
} |
|
} |
|
} |
|
|
|
[TemporaryBakingType] |
|
public struct FindSkinnedEntityData : IComponentData |
|
{ |
|
public Entity SkinnedEntity; |
|
} |
|
|
|
[WorldSystemFilter(WorldSystemFilterFlags.BakingSystem)] |
|
public partial struct GetSkinnedEntitySystem : ISystem |
|
{ |
|
[BurstCompile] |
|
public void OnUpdate(ref SystemState state) |
|
{ |
|
var ecb = new EntityCommandBuffer(Allocator.Temp); |
|
|
|
foreach (var (findSkinnedEntityData, entity) in SystemAPI.Query<RefRO<FindSkinnedEntityData>>().WithEntityAccess()) |
|
{ |
|
var smrEntity = findSkinnedEntityData.ValueRO.SkinnedEntity; |
|
var skinnedEntityList = new NativeList<Entity>(Allocator.Temp); |
|
|
|
foreach (var (deformedEntity, skinnedEntity) in SystemAPI.Query<RefRO<DeformedEntity>>().WithEntityAccess()) |
|
{ |
|
if (deformedEntity.ValueRO.Value.Equals(smrEntity)) |
|
{ |
|
skinnedEntityList.Add(skinnedEntity); |
|
} |
|
} |
|
|
|
Debug.Log($"Found {skinnedEntityList.Length} skinned entities"); |
|
if (skinnedEntityList.Length > 0) |
|
{ |
|
var skinnedEntityBuffer = ecb.AddBuffer<SkinnedEntityData>(entity); |
|
foreach (var skinnedEntity in skinnedEntityList) |
|
{ |
|
skinnedEntityBuffer.Add(new SkinnedEntityData { Value = skinnedEntity }); |
|
} |
|
} |
|
} |
|
|
|
ecb.Playback(state.EntityManager); |
|
} |
|
} |
|
|
|
public struct SkinnedEntityData : IBufferElementData |
|
{ |
|
public Entity Value; |
|
} |
|
} |