public void StartCrossfade(SnapshotMeshFrameData fromFrame, SnapshotMeshFrameData toFrame) { Reset(false); isReset = false; this.fromFrame = fromFrame; this.toFrame = toFrame; int vertexLength = fromFrame.verts.Length; if (positionJobs == null) { positionJobs = AllocatedArray <LerpVector3Job> .Get(framesNeeded); } if (boundsJobs == null) { boundsJobs = AllocatedArray <CalculateBoundsJob> .Get(framesNeeded); } if (positionJobHandles == null) { positionJobHandles = AllocatedArray <JobHandle> .Get(framesNeeded); } if (boundsJobHandles == null) { boundsJobHandles = AllocatedArray <JobHandle> .Get(framesNeeded); } if (output == null) { output = AllocatedArray <NativeArray <Vector3> > .Get(framesNeeded); } from = new NativeArray <Vector3>(vertexLength, Allocator.Persistent); to = new NativeArray <Vector3>(vertexLength, Allocator.Persistent); from.CopyFrom(fromFrame.verts); to.CopyFrom(toFrame.verts); for (int i = 0; i < framesNeeded; i++) { output[i] = new NativeArray <Vector3>(vertexLength, Allocator.Persistent); float delta = i / (float)framesNeeded; var lerpJob = new LerpVector3Job() { from = from, to = to, output = output[i], delta = delta }; positionJobs[i] = lerpJob; positionJobHandles[i] = lerpJob.Schedule(vertexLength, 64); var boundsJob = new CalculateBoundsJob() { positions = output[i] }; boundsJobs[i] = boundsJob; boundsJobHandles[i] = boundsJob.Schedule(positionJobHandles[i]); } }
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; }