Skip to content

Instantly share code, notes, and snippets.

@thelebaron
Last active October 10, 2024 05:48
Show Gist options
  • Save thelebaron/94cfa5fc5f2e740c7c0bd1c26d055f03 to your computer and use it in GitHub Desktop.
Save thelebaron/94cfa5fc5f2e740c7c0bd1c26d055f03 to your computer and use it in GitHub Desktop.
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;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment