protected override void OnUpdate() { var entityLength = m_ComponentGroup.CalculateLength(); var worldToLocalArray = new NativeArray <float4x4>(entityLength, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var rootLocalToWorldArray = new NativeArray <float4x4>(entityLength, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var boundsArray = new NativeArray <Bounds>(entityLength, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var counter = 0; Entities.ForEach((Entity entity, SpriteSkin spriteSkin) => { if (spriteSkin.isValid && spriteSkin.spriteRenderer.enabled) { worldToLocalArray[counter] = spriteSkin.transform.worldToLocalMatrix; rootLocalToWorldArray[counter] = spriteSkin.rootBone.localToWorldMatrix; var unityBounds = spriteSkin.bounds; boundsArray[counter] = new Bounds() { center = new float4(unityBounds.center, 1), extents = new float4(unityBounds.extents, 0), }; } counter++; }); var jobHandle = new CalculateBoundsJob() { worldToLocalArray = worldToLocalArray, rootLocalToWorldArray = rootLocalToWorldArray, boundsArray = boundsArray }.Schedule(entityLength, 32); jobHandle.Complete(); counter = 0; Entities.With(m_ComponentGroup).ForEach((Entity entity, SpriteSkin spriteSkin) => { if (spriteSkin.isValid && spriteSkin.spriteRenderer.enabled) { var center = boundsArray[counter].center; var extents = boundsArray[counter].extents; var bounds = new UnityEngine.Bounds(); bounds.center = new Vector3(center.x, center.y, center.z); bounds.extents = new Vector3(extents.x, extents.y, extents.z); InternalEngineBridge.SetLocalAABB(spriteSkin.spriteRenderer, bounds); } counter++; }); boundsArray.Dispose(); return; }
protected override void OnUpdate() { List <SpriteSkin> spriteSkinComponents = new List <SpriteSkin>(); List <SpriteComponent> spriteComponents = new List <SpriteComponent>(); Entities.ForEach((SpriteSkin spriteSkin) => { spriteSkinComponents.Add(spriteSkin); }); Entities.ForEach((SpriteComponent sprite) => { spriteComponents.Add(sprite); }); var worldToLocalArray = new NativeArray <float4x4>(spriteSkinComponents.Count, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var rootLocalToWorldArray = new NativeArray <float4x4>(spriteSkinComponents.Count, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var boundsArray = new NativeArray <Bounds>(spriteSkinComponents.Count, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); for (var i = 0; i < spriteSkinComponents.Count; ++i) { var spriteSkin = spriteSkinComponents[i]; var sprite = spriteComponents[i].Value; if (spriteSkin == null || sprite == null) { continue; } worldToLocalArray[i] = spriteSkin.transform.worldToLocalMatrix; rootLocalToWorldArray[i] = spriteSkin.rootBone.localToWorldMatrix; var unityBounds = spriteSkin.bounds; boundsArray[i] = new Bounds() { center = new float4(unityBounds.center, 1), extents = new float4(unityBounds.extents, 0), }; } var jobHandle = new CalculateBoundsJob() { worldToLocalArray = worldToLocalArray, rootLocalToWorldArray = rootLocalToWorldArray, boundsArray = boundsArray }.Schedule(spriteSkinComponents.Count, 32); jobHandle.Complete(); for (var i = 0; i < spriteSkinComponents.Count; ++i) { var spriteSkin = spriteSkinComponents[i]; var sprite = spriteComponents[i].Value; if (spriteSkin == null || sprite == null) { continue; } var center = boundsArray[i].center; var extents = boundsArray[i].extents; var bounds = new UnityEngine.Bounds(); bounds.center = new Vector3(center.x, center.y, center.z); bounds.extents = new Vector3(extents.x, extents.y, extents.z); InternalEngineBridge.SetLocalAABB(spriteSkin.spriteRenderer, bounds); } boundsArray.Dispose(); return; }