您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

1405 行
64 KiB

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using System.Runtime.InteropServices;
using Unity.Assertions;
using Unity.Collections.LowLevel.Unsafe;
using Unity.Jobs;
using Unity.Jobs.LowLevel.Unsafe;
using UnityEngine.Scripting;
using ReadOnlyAttribute = Unity.Collections.ReadOnlyAttribute;
namespace Unity.Entities
{
//@TODO: What about change or add?
[AttributeUsage(AttributeTargets.Parameter)]
public class ChangedFilterAttribute : Attribute
{
}
[AttributeUsage(AttributeTargets.Struct)]
public class RequireComponentTagAttribute : Attribute
{
public Type[] TagComponents;
public RequireComponentTagAttribute(params Type[] tagComponents)
{
TagComponents = tagComponents;
}
}
[AttributeUsage(AttributeTargets.Struct)]
public class RequireSubtractiveComponentAttribute : Attribute
{
public Type[] SubtractiveComponents;
public RequireSubtractiveComponentAttribute(params Type[] subtractiveComponents)
{
SubtractiveComponents = subtractiveComponents;
}
}
//@TODO: It would be nice to get rid of these interfaces completely.
//Right now implementation needs it, but they pollute public API in annoying ways.
[EditorBrowsable(EditorBrowsableState.Never)]
public interface IBaseJobProcessComponentData
{
}
[EditorBrowsable(EditorBrowsableState.Never)]
public interface IBaseJobProcessComponentData_1 : IBaseJobProcessComponentData
{
}
[EditorBrowsable(EditorBrowsableState.Never)]
public interface IBaseJobProcessComponentData_2 : IBaseJobProcessComponentData
{
}
[EditorBrowsable(EditorBrowsableState.Never)]
public interface IBaseJobProcessComponentData_3 : IBaseJobProcessComponentData
{
}
[EditorBrowsable(EditorBrowsableState.Never)]
public interface IBaseJobProcessComponentData_4 : IBaseJobProcessComponentData
{
}
[EditorBrowsable(EditorBrowsableState.Never)]
public interface IBaseJobProcessComponentData_1_WE : IBaseJobProcessComponentData
{
}
[EditorBrowsable(EditorBrowsableState.Never)]
public interface IBaseJobProcessComponentData_2_WE : IBaseJobProcessComponentData
{
}
[EditorBrowsable(EditorBrowsableState.Never)]
public interface IBaseJobProcessComponentData_3_WE : IBaseJobProcessComponentData
{
}
[EditorBrowsable(EditorBrowsableState.Never)]
public interface IBaseJobProcessComponentData_4_WE : IBaseJobProcessComponentData
{
}
[JobProducerType(typeof(JobProcessComponentDataExtensions.JobStruct_Process1<,>))]
public interface IJobProcessComponentData<T0> : IBaseJobProcessComponentData_1
where T0 : struct, IComponentData
{
void Execute(ref T0 data);
}
[JobProducerType(typeof(JobProcessComponentDataExtensions.JobStruct_Process2<,,>))]
public interface IJobProcessComponentData<T0, T1> : IBaseJobProcessComponentData_2
where T0 : struct, IComponentData
where T1 : struct, IComponentData
{
void Execute(ref T0 data0, ref T1 data1);
}
[JobProducerType(typeof(JobProcessComponentDataExtensions.JobStruct_Process3<,,,>))]
public interface IJobProcessComponentData<T0, T1, T2> : IBaseJobProcessComponentData_3
where T0 : struct, IComponentData
where T1 : struct, IComponentData
where T2 : struct, IComponentData
{
void Execute(ref T0 data0, ref T1 data1, ref T2 data2);
}
[JobProducerType(typeof(JobProcessComponentDataExtensions.JobStruct_Process4<,,,,>))]
public interface IJobProcessComponentData<T0, T1, T2, T3> : IBaseJobProcessComponentData_4
where T0 : struct, IComponentData
where T1 : struct, IComponentData
where T2 : struct, IComponentData
where T3 : struct, IComponentData
{
void Execute(ref T0 data0, ref T1 data1, ref T2 data2, ref T3 data3);
}
[JobProducerType(typeof(JobProcessComponentDataExtensions.JobStruct_Process1_WE<,>))]
public interface IJobProcessComponentDataWithEntity<T0> : IBaseJobProcessComponentData_1_WE
where T0 : struct, IComponentData
{
void Execute(Entity entity, int index, ref T0 data);
}
[JobProducerType(typeof(JobProcessComponentDataExtensions.JobStruct_Process2_WE<,,>))]
public interface IJobProcessComponentDataWithEntity<T0, T1> : IBaseJobProcessComponentData_2_WE
where T0 : struct, IComponentData
where T1 : struct, IComponentData
{
void Execute(Entity entity, int index, ref T0 data0, ref T1 data1);
}
[JobProducerType(typeof(JobProcessComponentDataExtensions.JobStruct_Process3_WE<,,,>))]
public interface IJobProcessComponentDataWithEntity<T0, T1, T2> : IBaseJobProcessComponentData_3_WE
where T0 : struct, IComponentData
where T1 : struct, IComponentData
where T2 : struct, IComponentData
{
void Execute(Entity entity, int index, ref T0 data0, ref T1 data1, ref T2 data2);
}
[JobProducerType(typeof(JobProcessComponentDataExtensions.JobStruct_Process4_WE<,,,,>))]
public interface IJobProcessComponentDataWithEntity<T0, T1, T2, T3> : IBaseJobProcessComponentData_4_WE
where T0 : struct, IComponentData
where T1 : struct, IComponentData
where T2 : struct, IComponentData
where T3 : struct, IComponentData
{
void Execute(Entity entity, int index, ref T0 data0, ref T1 data1, ref T2 data2, ref T3 data3);
}
internal struct JobProcessComponentDataCache
{
public IntPtr JobReflectionData;
public IntPtr JobReflectionDataParallelFor;
public ComponentType[] Types;
public ComponentType[] FilterChanged;
public int ProcessTypesCount;
public ComponentGroup ComponentGroup;
public ComponentSystemBase ComponentSystem;
}
[NativeContainer]
[NativeContainerSupportsMinMaxWriteRestriction]
[StructLayout(LayoutKind.Sequential)]
internal struct ProcessIterationData
{
public ComponentChunkIterator Iterator;
public int IndexInGroup0;
public int IndexInGroup1;
public int IndexInGroup2;
public int IndexInGroup3;
public int IsReadOnly0;
public int IsReadOnly1;
public int IsReadOnly2;
public int IsReadOnly3;
public bool m_IsParallelFor;
public int m_Length;
#if ENABLE_UNITY_COLLECTIONS_CHECKS
public int m_MinIndex;
public int m_MaxIndex;
#pragma warning disable 414
public int m_SafetyReadOnlyCount;
public int m_SafetyReadWriteCount;
public AtomicSafetyHandle m_Safety0;
public AtomicSafetyHandle m_Safety1;
public AtomicSafetyHandle m_Safety2;
public AtomicSafetyHandle m_Safety3;
#pragma warning restore
#endif
}
internal static class IJobProcessComponentDataUtility
{
public static ComponentType[] GetComponentTypes(Type jobType)
{
var interfaceType = GetIJobProcessComponentDataInterface(jobType);
if (interfaceType != null)
{
int temp;
ComponentType[] temp2;
return GetComponentTypes(jobType, interfaceType, out temp, out temp2);
}
return null;
}
private static ComponentType[] GetComponentTypes(Type jobType, Type interfaceType, out int processCount,
out ComponentType[] changedFilter)
{
var genericArgs = interfaceType.GetGenericArguments();
var executeMethodParameters = jobType.GetMethod("Execute").GetParameters();
var componentTypes = new List<ComponentType>();
var changedFilterTypes = new List<ComponentType>();
// void Execute(Entity entity, int index, ref T0 data0, ref T1 data1, ref T2 data2);
// First two parameters are optional, depending on the interface name used.
var methodParameterOffset = genericArgs.Length != executeMethodParameters.Length ? 2 : 0;
for (var i = 0; i < genericArgs.Length; i++)
{
var isReadonly = executeMethodParameters[i + methodParameterOffset].GetCustomAttribute(typeof(ReadOnlyAttribute)) != null;
var type = new ComponentType(genericArgs[i],
isReadonly ? ComponentType.AccessMode.ReadOnly : ComponentType.AccessMode.ReadWrite);
componentTypes.Add(type);
var isChangedFilter = executeMethodParameters[i + methodParameterOffset].GetCustomAttribute(typeof(ChangedFilterAttribute)) != null;
if (isChangedFilter)
changedFilterTypes.Add(type);
}
var subtractive = jobType.GetCustomAttribute<RequireSubtractiveComponentAttribute>();
if (subtractive != null)
foreach (var type in subtractive.SubtractiveComponents)
componentTypes.Add(ComponentType.Subtractive(type));
var requiredTags = jobType.GetCustomAttribute<RequireComponentTagAttribute>();
if (requiredTags != null)
foreach (var type in requiredTags.TagComponents)
componentTypes.Add(ComponentType.ReadOnly(type));
processCount = genericArgs.Length;
changedFilter = changedFilterTypes.ToArray();
return componentTypes.ToArray();
}
private static IntPtr GetJobReflection(Type jobType, Type wrapperJobType, Type interfaceType,
bool isIJobParallelFor)
{
Assert.AreNotEqual(null, wrapperJobType);
Assert.AreNotEqual(null, interfaceType);
var genericArgs = interfaceType.GetGenericArguments();
var jobTypeAndGenericArgs = new List<Type>();
jobTypeAndGenericArgs.Add(jobType);
jobTypeAndGenericArgs.AddRange(genericArgs);
var resolvedWrapperJobType = wrapperJobType.MakeGenericType(jobTypeAndGenericArgs.ToArray());
object[] parameters = {isIJobParallelFor ? JobType.ParallelFor : JobType.Single};
var reflectionDataRes = resolvedWrapperJobType.GetMethod("Initialize").Invoke(null, parameters);
return (IntPtr) reflectionDataRes;
}
private static Type GetIJobProcessComponentDataInterface(Type jobType)
{
foreach (var iType in jobType.GetInterfaces())
if (iType.Assembly == typeof(IBaseJobProcessComponentData).Assembly &&
iType.Name.StartsWith("IJobProcessComponentData"))
return iType;
return null;
}
internal static void PrepareComponentGroup(ComponentSystemBase system, Type jobType)
{
var iType = GetIJobProcessComponentDataInterface(jobType);
ComponentType[] filterChanged;
int processTypesCount;
var types = GetComponentTypes(jobType, iType, out processTypesCount, out filterChanged);
system.GetComponentGroupInternal(types);
}
internal static unsafe void Initialize(ComponentSystemBase system, Type jobType, Type wrapperJobType,
bool isParallelFor, ref JobProcessComponentDataCache cache, out ProcessIterationData iterator)
{
if (isParallelFor && cache.JobReflectionDataParallelFor == IntPtr.Zero ||
!isParallelFor && cache.JobReflectionData == IntPtr.Zero)
{
var iType = GetIJobProcessComponentDataInterface(jobType);
if (cache.Types == null)
cache.Types = GetComponentTypes(jobType, iType, out cache.ProcessTypesCount,
out cache.FilterChanged);
var res = GetJobReflection(jobType, wrapperJobType, iType, isParallelFor);
if (isParallelFor)
cache.JobReflectionDataParallelFor = res;
else
cache.JobReflectionData = res;
}
if (cache.ComponentSystem != system)
{
cache.ComponentGroup = system.GetComponentGroupInternal(cache.Types);
if (cache.FilterChanged.Length != 0)
cache.ComponentGroup.SetFilterChanged(cache.FilterChanged);
else
cache.ComponentGroup.ResetFilter();
cache.ComponentSystem = system;
}
var group = cache.ComponentGroup;
// Readonly
iterator.IsReadOnly0 = iterator.IsReadOnly1 = iterator.IsReadOnly2 = iterator.IsReadOnly3 = 0;
fixed (int* isReadOnly = &iterator.IsReadOnly0)
{
for (var i = 0; i != cache.ProcessTypesCount; i++)
isReadOnly[i] = cache.Types[i].AccessModeType == ComponentType.AccessMode.ReadOnly ? 1 : 0;
}
// Iterator
group.GetComponentChunkIterator(out iterator.Iterator);
iterator.IndexInGroup0 = iterator.IndexInGroup1 = iterator.IndexInGroup2 = iterator.IndexInGroup3 = -1;
fixed (int* groupIndices = &iterator.IndexInGroup0)
{
for (var i = 0; i != cache.ProcessTypesCount; i++)
groupIndices[i] = group.GetIndexInComponentGroup(cache.Types[i].TypeIndex);
}
iterator.m_IsParallelFor = isParallelFor;
iterator.m_Length = group.CalculateNumberOfChunksWithoutFiltering();
#if ENABLE_UNITY_COLLECTIONS_CHECKS
iterator.m_MaxIndex = iterator.m_Length - 1;
iterator.m_MinIndex = 0;
// Safety
iterator.m_Safety0 = iterator.m_Safety1 = iterator.m_Safety2 = iterator.m_Safety3 = default(AtomicSafetyHandle);
iterator.m_SafetyReadOnlyCount = 0;
fixed (AtomicSafetyHandle* safety = &iterator.m_Safety0)
{
for (var i = 0; i != cache.ProcessTypesCount; i++)
if (cache.Types[i].AccessModeType == ComponentType.AccessMode.ReadOnly)
{
safety[iterator.m_SafetyReadOnlyCount] = group.GetSafetyHandle(group.GetIndexInComponentGroup(cache.Types[i].TypeIndex));
iterator.m_SafetyReadOnlyCount++;
}
}
iterator.m_SafetyReadWriteCount = 0;
fixed (AtomicSafetyHandle* safety = &iterator.m_Safety0)
{
for (var i = 0; i != cache.ProcessTypesCount; i++)
if (cache.Types[i].AccessModeType == ComponentType.AccessMode.ReadWrite)
{
safety[iterator.m_SafetyReadOnlyCount + iterator.m_SafetyReadWriteCount] = group.GetSafetyHandle(group.GetIndexInComponentGroup(cache.Types[i].TypeIndex));
iterator.m_SafetyReadWriteCount++;
}
}
Assert.AreEqual(cache.ProcessTypesCount, iterator.m_SafetyReadWriteCount + iterator.m_SafetyReadOnlyCount);
#endif
}
}
public static class JobProcessComponentDataExtensions
{
public static ComponentGroup GetComponentGroupForIJobProcessComponentData(this ComponentSystemBase system, Type jobType)
{
var types = IJobProcessComponentDataUtility.GetComponentTypes(jobType);
if (types != null)
return system.GetComponentGroupInternal(types);
else
return null;
}
//NOTE: It would be much better if C# could resolve the branch with generic resolving,
// but apparently the interface constraint is not enough..
public static void PrepareComponentGroup<T>(this T jobData, ComponentSystemBase system)
where T : struct, IBaseJobProcessComponentData
{
IJobProcessComponentDataUtility.PrepareComponentGroup(system, typeof(T));
}
public static JobHandle Schedule<T>(this T jobData, ComponentSystemBase system, JobHandle dependsOn = default(JobHandle))
where T : struct, IBaseJobProcessComponentData
{
var typeT = typeof(T);
if (typeof(IBaseJobProcessComponentData_1).IsAssignableFrom(typeT))
return ScheduleInternal_1(ref jobData, system, 1, dependsOn, ScheduleMode.Batched);
if (typeof(IBaseJobProcessComponentData_1_WE).IsAssignableFrom(typeT))
return ScheduleInternal_1_WE(ref jobData, system, 1, dependsOn, ScheduleMode.Batched);
if (typeof(IBaseJobProcessComponentData_2).IsAssignableFrom(typeT))
return ScheduleInternal_2(ref jobData, system, 1, dependsOn, ScheduleMode.Batched);
if (typeof(IBaseJobProcessComponentData_2_WE).IsAssignableFrom(typeT))
return ScheduleInternal_2_WE(ref jobData, system, 1, dependsOn, ScheduleMode.Batched);
if (typeof(IBaseJobProcessComponentData_3).IsAssignableFrom(typeT))
return ScheduleInternal_3(ref jobData, system, 1, dependsOn, ScheduleMode.Batched);
if (typeof(IBaseJobProcessComponentData_3_WE).IsAssignableFrom(typeT))
return ScheduleInternal_3_WE(ref jobData, system, 1, dependsOn, ScheduleMode.Batched);
if (typeof(IBaseJobProcessComponentData_4).IsAssignableFrom(typeT))
return ScheduleInternal_4(ref jobData, system, 1, dependsOn, ScheduleMode.Batched);
if (typeof(IBaseJobProcessComponentData_4_WE).IsAssignableFrom(typeT))
return ScheduleInternal_4_WE(ref jobData, system, 1, dependsOn, ScheduleMode.Batched);
throw new System.ArgumentException("Not supported");
}
public static JobHandle ScheduleSingle<T>(this T jobData, ComponentSystemBase system,
JobHandle dependsOn = default(JobHandle))
where T : struct, IBaseJobProcessComponentData
{
var typeT = typeof(T);
if (typeof(IBaseJobProcessComponentData_1).IsAssignableFrom(typeT))
return ScheduleInternal_1(ref jobData, system, -1, dependsOn, ScheduleMode.Batched);
if (typeof(IBaseJobProcessComponentData_1_WE).IsAssignableFrom(typeT))
return ScheduleInternal_1_WE(ref jobData, system, -1, dependsOn, ScheduleMode.Batched);
if (typeof(IBaseJobProcessComponentData_2).IsAssignableFrom(typeT))
return ScheduleInternal_2(ref jobData, system, -1, dependsOn, ScheduleMode.Batched);
if (typeof(IBaseJobProcessComponentData_2_WE).IsAssignableFrom(typeT))
return ScheduleInternal_2_WE(ref jobData, system, -1, dependsOn, ScheduleMode.Batched);
if (typeof(IBaseJobProcessComponentData_3).IsAssignableFrom(typeT))
return ScheduleInternal_3(ref jobData, system, -1, dependsOn, ScheduleMode.Batched);
if (typeof(IBaseJobProcessComponentData_3_WE).IsAssignableFrom(typeT))
return ScheduleInternal_3_WE(ref jobData, system, -1, dependsOn, ScheduleMode.Batched);
if (typeof(IBaseJobProcessComponentData_4).IsAssignableFrom(typeT))
return ScheduleInternal_4(ref jobData, system, -1, dependsOn, ScheduleMode.Batched);
if (typeof(IBaseJobProcessComponentData_4_WE).IsAssignableFrom(typeT))
return ScheduleInternal_4_WE(ref jobData, system, -1, dependsOn, ScheduleMode.Batched);
throw new System.ArgumentException("Not supported");
}
public static void Run<T>(this T jobData, ComponentSystemBase system)
where T : struct, IBaseJobProcessComponentData
{
var typeT = typeof(T);
if (typeof(IBaseJobProcessComponentData_1).IsAssignableFrom(typeT))
ScheduleInternal_1(ref jobData, system, -1, default(JobHandle), ScheduleMode.Run);
else if (typeof(IBaseJobProcessComponentData_1_WE).IsAssignableFrom(typeT))
ScheduleInternal_1_WE(ref jobData, system, -1, default(JobHandle), ScheduleMode.Run);
else if (typeof(IBaseJobProcessComponentData_2).IsAssignableFrom(typeT))
ScheduleInternal_2(ref jobData, system, -1, default(JobHandle), ScheduleMode.Run);
else if (typeof(IBaseJobProcessComponentData_2_WE).IsAssignableFrom(typeT))
ScheduleInternal_2_WE(ref jobData, system, -1, default(JobHandle), ScheduleMode.Run);
else if (typeof(IBaseJobProcessComponentData_3).IsAssignableFrom(typeT))
ScheduleInternal_3(ref jobData, system, -1, default(JobHandle), ScheduleMode.Run);
else if (typeof(IBaseJobProcessComponentData_3_WE).IsAssignableFrom(typeT))
ScheduleInternal_3_WE(ref jobData, system, -1, default(JobHandle), ScheduleMode.Run);
else if (typeof(IBaseJobProcessComponentData_4).IsAssignableFrom(typeT))
ScheduleInternal_4(ref jobData, system, -1, default(JobHandle), ScheduleMode.Run);
else if (typeof(IBaseJobProcessComponentData_4_WE).IsAssignableFrom(typeT))
ScheduleInternal_4_WE(ref jobData, system, -1, default(JobHandle), ScheduleMode.Run);
else
throw new System.ArgumentException("Not supported");
}
private static unsafe JobHandle Schedule(void* fullData, int length, int innerloopBatchCount,
bool isParallelFor, ref JobProcessComponentDataCache cache, JobHandle dependsOn, ScheduleMode mode)
{
if (isParallelFor)
{
var scheduleParams =
new JobsUtility.JobScheduleParameters(fullData, cache.JobReflectionDataParallelFor, dependsOn,
mode);
return JobsUtility.ScheduleParallelFor(ref scheduleParams, length, innerloopBatchCount);
}
else
{
var scheduleParams =
new JobsUtility.JobScheduleParameters(fullData, cache.JobReflectionData, dependsOn, mode);
return JobsUtility.Schedule(ref scheduleParams);
}
}
internal static unsafe JobHandle ScheduleInternal_1<T>(ref T jobData, ComponentSystemBase system,
int innerloopBatchCount,
JobHandle dependsOn, ScheduleMode mode)
where T : struct
{
JobStruct_ProcessInfer_1<T> fullData;
fullData.Data = jobData;
var isParallelFor = innerloopBatchCount != -1;
IJobProcessComponentDataUtility.Initialize(system, typeof(T), typeof(JobStruct_Process1<,>), isParallelFor,
ref JobStruct_ProcessInfer_1<T>.Cache, out fullData.Iterator);
return Schedule(UnsafeUtility.AddressOf(ref fullData), fullData.Iterator.m_Length, innerloopBatchCount,
isParallelFor, ref JobStruct_ProcessInfer_1<T>.Cache, dependsOn, mode);
}
internal static unsafe JobHandle ScheduleInternal_1_WE<T>(ref T jobData, ComponentSystemBase system,
int innerloopBatchCount,
JobHandle dependsOn, ScheduleMode mode)
where T : struct
{
JobStruct_ProcessInfer_1_WE<T> fullData;
fullData.Data = jobData;
var isParallelFor = innerloopBatchCount != -1;
IJobProcessComponentDataUtility.Initialize(system, typeof(T), typeof(JobStruct_Process1_WE<,>), isParallelFor,
ref JobStruct_ProcessInfer_1_WE<T>.Cache, out fullData.Iterator);
return Schedule(UnsafeUtility.AddressOf(ref fullData), fullData.Iterator.m_Length, innerloopBatchCount,
isParallelFor, ref JobStruct_ProcessInfer_1_WE<T>.Cache, dependsOn, mode);
}
internal static unsafe JobHandle ScheduleInternal_2<T>(ref T jobData, ComponentSystemBase system,
int innerloopBatchCount, JobHandle dependsOn, ScheduleMode mode)
where T : struct
{
JobStruct_ProcessInfer_2<T> fullData;
fullData.Data = jobData;
var isParallelFor = innerloopBatchCount != -1;
IJobProcessComponentDataUtility.Initialize(system, typeof(T), typeof(JobStruct_Process2<,,>), isParallelFor,
ref JobStruct_ProcessInfer_2<T>.Cache, out fullData.Iterator);
return Schedule(UnsafeUtility.AddressOf(ref fullData), fullData.Iterator.m_Length, innerloopBatchCount,
isParallelFor, ref JobStruct_ProcessInfer_2<T>.Cache, dependsOn, mode);
}
internal static unsafe JobHandle ScheduleInternal_2_WE<T>(ref T jobData, ComponentSystemBase system,
int innerloopBatchCount, JobHandle dependsOn, ScheduleMode mode)
where T : struct
{
JobStruct_ProcessInfer_2_WE<T> fullData;
fullData.Data = jobData;
var isParallelFor = innerloopBatchCount != -1;
IJobProcessComponentDataUtility.Initialize(system, typeof(T), typeof(JobStruct_Process2_WE<,,>), isParallelFor,
ref JobStruct_ProcessInfer_2_WE<T>.Cache, out fullData.Iterator);
return Schedule(UnsafeUtility.AddressOf(ref fullData), fullData.Iterator.m_Length, innerloopBatchCount,
isParallelFor, ref JobStruct_ProcessInfer_2_WE<T>.Cache, dependsOn, mode);
}
internal static unsafe JobHandle ScheduleInternal_3<T>(ref T jobData, ComponentSystemBase system,
int innerloopBatchCount, JobHandle dependsOn, ScheduleMode mode)
where T : struct
{
JobStruct_ProcessInfer_3<T> fullData;
fullData.Data = jobData;
var isParallelFor = innerloopBatchCount != -1;
IJobProcessComponentDataUtility.Initialize(system, typeof(T), typeof(JobStruct_Process3<,,,>),
isParallelFor, ref JobStruct_ProcessInfer_3<T>.Cache, out fullData.Iterator);
return Schedule(UnsafeUtility.AddressOf(ref fullData), fullData.Iterator.m_Length, innerloopBatchCount,
isParallelFor, ref JobStruct_ProcessInfer_3<T>.Cache, dependsOn, mode);
}
internal static unsafe JobHandle ScheduleInternal_3_WE<T>(ref T jobData, ComponentSystemBase system,
int innerloopBatchCount, JobHandle dependsOn, ScheduleMode mode)
where T : struct
{
JobStruct_ProcessInfer_3_WE<T> fullData;
fullData.Data = jobData;
var isParallelFor = innerloopBatchCount != -1;
IJobProcessComponentDataUtility.Initialize(system, typeof(T), typeof(JobStruct_Process3_WE<,,,>),
isParallelFor, ref JobStruct_ProcessInfer_3_WE<T>.Cache, out fullData.Iterator);
return Schedule(UnsafeUtility.AddressOf(ref fullData), fullData.Iterator.m_Length, innerloopBatchCount,
isParallelFor, ref JobStruct_ProcessInfer_3_WE<T>.Cache, dependsOn, mode);
}
internal static unsafe JobHandle ScheduleInternal_4<T>(ref T jobData, ComponentSystemBase system,
int innerloopBatchCount, JobHandle dependsOn, ScheduleMode mode)
where T : struct
{
JobStruct_ProcessInfer_4<T> fullData;
fullData.Data = jobData;
var isParallelFor = innerloopBatchCount != -1;
IJobProcessComponentDataUtility.Initialize(system, typeof(T), typeof(JobStruct_Process4<,,,,>),
isParallelFor, ref JobStruct_ProcessInfer_4<T>.Cache, out fullData.Iterator);
return Schedule(UnsafeUtility.AddressOf(ref fullData), fullData.Iterator.m_Length, innerloopBatchCount,
isParallelFor, ref JobStruct_ProcessInfer_4<T>.Cache, dependsOn, mode);
}
internal static unsafe JobHandle ScheduleInternal_4_WE<T>(ref T jobData, ComponentSystemBase system,
int innerloopBatchCount, JobHandle dependsOn, ScheduleMode mode)
where T : struct
{
JobStruct_ProcessInfer_4_WE<T> fullData;
fullData.Data = jobData;
var isParallelFor = innerloopBatchCount != -1;
IJobProcessComponentDataUtility.Initialize(system, typeof(T), typeof(JobStruct_Process4_WE<,,,,>),
isParallelFor, ref JobStruct_ProcessInfer_4_WE<T>.Cache, out fullData.Iterator);
return Schedule(UnsafeUtility.AddressOf(ref fullData), fullData.Iterator.m_Length, innerloopBatchCount,
isParallelFor, ref JobStruct_ProcessInfer_4_WE<T>.Cache, dependsOn, mode);
}
[StructLayout(LayoutKind.Sequential)]
private struct JobStruct_ProcessInfer_1<T> where T : struct
{
public static JobProcessComponentDataCache Cache;
public ProcessIterationData Iterator;
public T Data;
}
[StructLayout(LayoutKind.Sequential)]
internal struct JobStruct_Process1<T, U0>
where T : struct, IJobProcessComponentData<U0>
where U0 : struct, IComponentData
{
public ProcessIterationData Iterator;
public T Data;
[Preserve]
public static IntPtr Initialize(JobType jobType)
{
return JobsUtility.CreateJobReflectionData(typeof(JobStruct_Process1<T, U0>), typeof(T), jobType,
(ExecuteJobFunction) Execute);
}
private delegate void ExecuteJobFunction(ref JobStruct_Process1<T, U0> data, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex);
static unsafe void ExecuteChunk(ref JobStruct_Process1<T, U0> jobData, IntPtr bufferRangePatchData, int begin, int end)
{
ComponentChunkCache cache0;
for (var blockIndex = begin; blockIndex != end; ++blockIndex)
{
jobData.Iterator.Iterator.MoveToChunkWithoutFiltering(blockIndex);
var processBlock = jobData.Iterator.Iterator.MatchesFilter();
if (!processBlock)
continue;
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache0, jobData.Iterator.IsReadOnly0 == 0, jobData.Iterator.IndexInGroup0);
var ptr0 = UnsafeUtilityEx.RestrictNoAlias(cache0.CachedPtr);
#if ENABLE_UNITY_COLLECTIONS_CHECKS
JobsUtility.PatchBufferMinMaxRanges(bufferRangePatchData, UnsafeUtility.AddressOf(ref jobData), cache0.CachedBeginIndex, cache0.CachedEndIndex - cache0.CachedBeginIndex);
#endif
for (var i = cache0.CachedBeginIndex; i != cache0.CachedEndIndex; i++)
{
#if CSHARP_7_OR_LATER
ref var value0 = ref UnsafeUtilityEx.ArrayElementAsRef<U0>(ptr0, i);
jobData.Data.Execute(ref value0);
#else
var value0 = UnsafeUtility.ReadArrayElement<U0>(ptr0, i);
jobData.Data.Execute(ref value0);
if (jobData.Iterator.IsReadOnly0 == 0)
UnsafeUtility.WriteArrayElement(ptr0, i, value0);
#endif
}
}
}
public static unsafe void Execute(ref JobStruct_Process1<T, U0> jobData, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex)
{
if (jobData.Iterator.m_IsParallelFor)
{
int begin;
int end;
while (JobsUtility.GetWorkStealingRange(ref ranges, jobIndex, out begin, out end))
{
ExecuteChunk(ref jobData, bufferRangePatchData, begin, end);
}
}
else
{
ExecuteChunk(ref jobData, bufferRangePatchData, 0, jobData.Iterator.m_Length);
}
}
}
[StructLayout(LayoutKind.Sequential)]
private struct JobStruct_ProcessInfer_1_WE<T> where T : struct
{
public static JobProcessComponentDataCache Cache;
public ProcessIterationData Iterator;
public T Data;
}
[StructLayout(LayoutKind.Sequential)]
internal struct JobStruct_Process1_WE<T, U0>
where T : struct, IJobProcessComponentDataWithEntity<U0>
where U0 : struct, IComponentData
{
public ProcessIterationData Iterator;
public T Data;
[Preserve]
public static IntPtr Initialize(JobType jobType)
{
return JobsUtility.CreateJobReflectionData(typeof(JobStruct_Process1_WE<T, U0>), typeof(T), jobType,
(ExecuteJobFunction) Execute);
}
private delegate void ExecuteJobFunction(ref JobStruct_Process1_WE<T, U0> data, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex);
static unsafe void ExecuteChunk(ref JobStruct_Process1_WE<T, U0> jobData, IntPtr bufferRangePatchData, int begin, int end)
{
ComponentChunkCache cacheE;
ComponentChunkCache cache0;
for (var blockIndex = begin; blockIndex != end; ++blockIndex)
{
jobData.Iterator.Iterator.MoveToChunkWithoutFiltering(blockIndex);
var processBlock = jobData.Iterator.Iterator.MatchesFilter();
if (!processBlock)
continue;
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache0, jobData.Iterator.IsReadOnly0 == 0, jobData.Iterator.IndexInGroup0);
var ptr0 = UnsafeUtilityEx.RestrictNoAlias(cache0.CachedPtr);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cacheE, false, 0);
var ptrE = (Entity*)UnsafeUtilityEx.RestrictNoAlias(cacheE.CachedPtr);
#if ENABLE_UNITY_COLLECTIONS_CHECKS
JobsUtility.PatchBufferMinMaxRanges(bufferRangePatchData, UnsafeUtility.AddressOf(ref jobData), cache0.CachedBeginIndex, cache0.CachedEndIndex - cache0.CachedBeginIndex);
#endif
for (var i = cache0.CachedBeginIndex; i != cache0.CachedEndIndex; i++)
{
#if CSHARP_7_OR_LATER
ref var value0 = ref UnsafeUtilityEx.ArrayElementAsRef<U0>(ptr0, i);
jobData.Data.Execute(ptrE[i], i, ref value0);
#else
var value0 = UnsafeUtility.ReadArrayElement<U0>(ptr0, i);
jobData.Data.Execute(ptrE[i], i, ref value0);
if (jobData.Iterator.IsReadOnly0 == 0)
UnsafeUtility.WriteArrayElement(ptr0, i, value0);
#endif
}
}
}
public static unsafe void Execute(ref JobStruct_Process1_WE<T, U0> jobData, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex)
{
if (jobData.Iterator.m_IsParallelFor)
{
int begin;
int end;
while (JobsUtility.GetWorkStealingRange(ref ranges, jobIndex, out begin, out end))
{
ExecuteChunk(ref jobData, bufferRangePatchData, begin, end);
}
}
else
{
ExecuteChunk(ref jobData, bufferRangePatchData, 0, jobData.Iterator.m_Length);
}
}
}
[StructLayout(LayoutKind.Sequential)]
private struct JobStruct_ProcessInfer_2<T> where T : struct
{
public static JobProcessComponentDataCache Cache;
public ProcessIterationData Iterator;
public T Data;
}
[StructLayout(LayoutKind.Sequential)]
internal struct JobStruct_Process2<T, U0, U1>
where T : struct, IJobProcessComponentData<U0, U1>
where U0 : struct, IComponentData
where U1 : struct, IComponentData
{
public ProcessIterationData Iterator;
public T Data;
[Preserve]
public static IntPtr Initialize(JobType jobType)
{
return JobsUtility.CreateJobReflectionData(typeof(JobStruct_Process2<T, U0, U1>), typeof(T), jobType,
(ExecuteJobFunction) Execute);
}
private delegate void ExecuteJobFunction(ref JobStruct_Process2<T, U0, U1> data, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex);
static unsafe void ExecuteChunk(ref JobStruct_Process2<T, U0, U1> jobData, IntPtr bufferRangePatchData, int begin, int end)
{
ComponentChunkCache cache0;
ComponentChunkCache cache1;
for (var blockIndex = begin; blockIndex != end; ++blockIndex)
{
jobData.Iterator.Iterator.MoveToChunkWithoutFiltering(blockIndex);
var processBlock = jobData.Iterator.Iterator.MatchesFilter();
if (!processBlock)
continue;
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache0, jobData.Iterator.IsReadOnly0 == 0, jobData.Iterator.IndexInGroup0);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache1, jobData.Iterator.IsReadOnly1 == 0, jobData.Iterator.IndexInGroup1);
var ptr0 = UnsafeUtilityEx.RestrictNoAlias(cache0.CachedPtr);
var ptr1 = UnsafeUtilityEx.RestrictNoAlias(cache1.CachedPtr);
#if ENABLE_UNITY_COLLECTIONS_CHECKS
JobsUtility.PatchBufferMinMaxRanges(bufferRangePatchData, UnsafeUtility.AddressOf(ref jobData), cache0.CachedBeginIndex, cache0.CachedEndIndex - cache0.CachedBeginIndex);
#endif
for (var i = cache0.CachedBeginIndex; i != cache0.CachedEndIndex; i++)
{
#if CSHARP_7_OR_LATER
ref var value0 = ref UnsafeUtilityEx.ArrayElementAsRef<U0>(ptr0, i);
ref var value1 = ref UnsafeUtilityEx.ArrayElementAsRef<U1>(ptr1, i);
jobData.Data.Execute(ref value0, ref value1);
#else
var value0 = UnsafeUtility.ReadArrayElement<U0>(ptr0, i);
var value1 = UnsafeUtility.ReadArrayElement<U1>(ptr1, i);
jobData.Data.Execute(ref value0, ref value1);
if (jobData.Iterator.IsReadOnly0 == 0)
UnsafeUtility.WriteArrayElement(ptr0, i, value0);
if (jobData.Iterator.IsReadOnly1 == 0)
UnsafeUtility.WriteArrayElement(ptr1, i, value1);
#endif
}
}
}
public static unsafe void Execute(ref JobStruct_Process2<T, U0, U1> jobData, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex)
{
if (jobData.Iterator.m_IsParallelFor)
{
int begin;
int end;
while (JobsUtility.GetWorkStealingRange(ref ranges, jobIndex, out begin, out end))
{
ExecuteChunk(ref jobData, bufferRangePatchData, begin, end);
}
}
else
{
ExecuteChunk(ref jobData, bufferRangePatchData, 0, jobData.Iterator.m_Length);
}
}
}
[StructLayout(LayoutKind.Sequential)]
private struct JobStruct_ProcessInfer_2_WE<T> where T : struct
{
public static JobProcessComponentDataCache Cache;
public ProcessIterationData Iterator;
public T Data;
}
[StructLayout(LayoutKind.Sequential)]
internal struct JobStruct_Process2_WE<T, U0, U1>
where T : struct, IJobProcessComponentDataWithEntity<U0, U1>
where U0 : struct, IComponentData
where U1 : struct, IComponentData
{
public ProcessIterationData Iterator;
public T Data;
[Preserve]
public static IntPtr Initialize(JobType jobType)
{
return JobsUtility.CreateJobReflectionData(typeof(JobStruct_Process2_WE<T, U0, U1>), typeof(T), jobType,
(ExecuteJobFunction) Execute);
}
private delegate void ExecuteJobFunction(ref JobStruct_Process2_WE<T, U0, U1> data, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex);
static unsafe void ExecuteChunk(ref JobStruct_Process2_WE<T, U0, U1> jobData, IntPtr bufferRangePatchData, int begin, int end)
{
ComponentChunkCache cache0;
ComponentChunkCache cache1;
ComponentChunkCache cacheE;
for (var blockIndex = begin; blockIndex != end; ++blockIndex)
{
jobData.Iterator.Iterator.MoveToChunkWithoutFiltering(blockIndex);
var processBlock = jobData.Iterator.Iterator.MatchesFilter();
if (!processBlock)
continue;
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache0, jobData.Iterator.IsReadOnly0 == 0, jobData.Iterator.IndexInGroup0);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache1, jobData.Iterator.IsReadOnly1 == 0, jobData.Iterator.IndexInGroup1);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cacheE, false, 0);
var ptr0 = UnsafeUtilityEx.RestrictNoAlias(cache0.CachedPtr);
var ptr1 = UnsafeUtilityEx.RestrictNoAlias(cache1.CachedPtr);
var ptrE = (Entity*)UnsafeUtilityEx.RestrictNoAlias(cacheE.CachedPtr);
#if ENABLE_UNITY_COLLECTIONS_CHECKS
JobsUtility.PatchBufferMinMaxRanges(bufferRangePatchData, UnsafeUtility.AddressOf(ref jobData), cache0.CachedBeginIndex, cache0.CachedEndIndex - cache0.CachedBeginIndex);
#endif
for (var i = cache0.CachedBeginIndex; i != cache0.CachedEndIndex; i++)
{
#if CSHARP_7_OR_LATER
ref var value0 = ref UnsafeUtilityEx.ArrayElementAsRef<U0>(ptr0, i);
ref var value1 = ref UnsafeUtilityEx.ArrayElementAsRef<U1>(ptr1, i);
jobData.Data.Execute(ptrE[i], i, ref value0, ref value1);
#else
var value0 = UnsafeUtility.ReadArrayElement<U0>(ptr0, i);
var value1 = UnsafeUtility.ReadArrayElement<U1>(ptr1, i);
jobData.Data.Execute(ptrE[i], i, ref value0, ref value1);
if (jobData.Iterator.IsReadOnly0 == 0)
UnsafeUtility.WriteArrayElement(ptr0, i, value0);
if (jobData.Iterator.IsReadOnly1 == 0)
UnsafeUtility.WriteArrayElement(ptr1, i, value1);
#endif
}
}
}
public static unsafe void Execute(ref JobStruct_Process2_WE<T, U0, U1> jobData, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex)
{
if (jobData.Iterator.m_IsParallelFor)
{
int begin;
int end;
while (JobsUtility.GetWorkStealingRange(ref ranges, jobIndex, out begin, out end))
{
ExecuteChunk(ref jobData, bufferRangePatchData, begin, end);
}
}
else
{
ExecuteChunk(ref jobData, bufferRangePatchData, 0, jobData.Iterator.m_Length);
}
}
}
[StructLayout(LayoutKind.Sequential)]
private struct JobStruct_ProcessInfer_3<T> where T : struct
{
public static JobProcessComponentDataCache Cache;
public ProcessIterationData Iterator;
public T Data;
}
[StructLayout(LayoutKind.Sequential)]
internal struct JobStruct_Process3<T, U0, U1, U2>
where T : struct, IJobProcessComponentData<U0, U1, U2>
where U0 : struct, IComponentData
where U1 : struct, IComponentData
where U2 : struct, IComponentData
{
public ProcessIterationData Iterator;
public T Data;
[Preserve]
public static IntPtr Initialize(JobType jobType)
{
return JobsUtility.CreateJobReflectionData(typeof(JobStruct_Process3<T, U0, U1, U2>), typeof(T),
jobType, (ExecuteJobFunction) Execute);
}
private delegate void ExecuteJobFunction(ref JobStruct_Process3<T, U0, U1, U2> data, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex);
static unsafe void ExecuteChunk(ref JobStruct_Process3<T, U0, U1, U2> jobData, IntPtr bufferRangePatchData, int begin, int end)
{
ComponentChunkCache cache0;
ComponentChunkCache cache1;
ComponentChunkCache cache2;
for (var blockIndex = begin; blockIndex != end; ++blockIndex)
{
jobData.Iterator.Iterator.MoveToChunkWithoutFiltering(blockIndex);
var processBlock = jobData.Iterator.Iterator.MatchesFilter();
if (!processBlock)
continue;
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache0, jobData.Iterator.IsReadOnly0 == 0, jobData.Iterator.IndexInGroup0);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache1, jobData.Iterator.IsReadOnly1 == 0, jobData.Iterator.IndexInGroup1);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache2, jobData.Iterator.IsReadOnly2 == 0, jobData.Iterator.IndexInGroup2);
var ptr0 = UnsafeUtilityEx.RestrictNoAlias(cache0.CachedPtr);
var ptr1 = UnsafeUtilityEx.RestrictNoAlias(cache1.CachedPtr);
var ptr2 = UnsafeUtilityEx.RestrictNoAlias(cache2.CachedPtr);
#if ENABLE_UNITY_COLLECTIONS_CHECKS
JobsUtility.PatchBufferMinMaxRanges(bufferRangePatchData, UnsafeUtility.AddressOf(ref jobData), cache0.CachedBeginIndex, cache0.CachedEndIndex - cache0.CachedBeginIndex);
#endif
for (var i = cache0.CachedBeginIndex; i != cache0.CachedEndIndex; i++)
{
#if CSHARP_7_OR_LATER
ref var value0 = ref UnsafeUtilityEx.ArrayElementAsRef<U0>(ptr0, i);
ref var value1 = ref UnsafeUtilityEx.ArrayElementAsRef<U1>(ptr1, i);
ref var value2 = ref UnsafeUtilityEx.ArrayElementAsRef<U2>(ptr2, i);
jobData.Data.Execute(ref value0, ref value1, ref value2);
#else
var value0 = UnsafeUtility.ReadArrayElement<U0>(ptr0, i);
var value1 = UnsafeUtility.ReadArrayElement<U1>(ptr1, i);
var value2 = UnsafeUtility.ReadArrayElement<U2>(ptr2, i);
jobData.Data.Execute(ref value0, ref value1, ref value2);
if (jobData.Iterator.IsReadOnly0 == 0)
UnsafeUtility.WriteArrayElement(ptr0, i, value0);
if (jobData.Iterator.IsReadOnly1 == 0)
UnsafeUtility.WriteArrayElement(ptr1, i, value1);
if (jobData.Iterator.IsReadOnly2 == 0)
UnsafeUtility.WriteArrayElement(ptr2, i, value2);
#endif
}
}
}
public static unsafe void Execute(ref JobStruct_Process3<T, U0, U1, U2> jobData, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex)
{
if (jobData.Iterator.m_IsParallelFor)
{
int begin;
int end;
while (JobsUtility.GetWorkStealingRange(ref ranges, jobIndex, out begin, out end))
{
ExecuteChunk(ref jobData, bufferRangePatchData, begin, end);
}
}
else
{
ExecuteChunk(ref jobData, bufferRangePatchData, 0, jobData.Iterator.m_Length);
}
}
}
[StructLayout(LayoutKind.Sequential)]
private struct JobStruct_ProcessInfer_3_WE<T> where T : struct
{
public static JobProcessComponentDataCache Cache;
public ProcessIterationData Iterator;
public T Data;
}
[StructLayout(LayoutKind.Sequential)]
internal struct JobStruct_Process3_WE<T, U0, U1, U2>
where T : struct, IJobProcessComponentDataWithEntity<U0, U1, U2>
where U0 : struct, IComponentData
where U1 : struct, IComponentData
where U2 : struct, IComponentData
{
public ProcessIterationData Iterator;
public T Data;
[Preserve]
public static IntPtr Initialize(JobType jobType)
{
return JobsUtility.CreateJobReflectionData(typeof(JobStruct_Process3_WE<T, U0, U1, U2>), typeof(T),
jobType, (ExecuteJobFunction) Execute);
}
private delegate void ExecuteJobFunction(ref JobStruct_Process3_WE<T, U0, U1, U2> data, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex);
static unsafe void ExecuteChunk(ref JobStruct_Process3_WE<T, U0, U1, U2> jobData, IntPtr bufferRangePatchData, int begin, int end)
{
ComponentChunkCache cache0;
ComponentChunkCache cache1;
ComponentChunkCache cache2;
ComponentChunkCache cacheE;
for (var blockIndex = begin; blockIndex != end; ++blockIndex)
{
jobData.Iterator.Iterator.MoveToChunkWithoutFiltering(blockIndex);
var processBlock = jobData.Iterator.Iterator.MatchesFilter();
if (!processBlock)
continue;
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache0, jobData.Iterator.IsReadOnly0 == 0, jobData.Iterator.IndexInGroup0);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache1, jobData.Iterator.IsReadOnly1 == 0, jobData.Iterator.IndexInGroup1);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache2, jobData.Iterator.IsReadOnly2 == 0, jobData.Iterator.IndexInGroup2);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cacheE, false, 0);
var ptr0 = UnsafeUtilityEx.RestrictNoAlias(cache0.CachedPtr);
var ptr1 = UnsafeUtilityEx.RestrictNoAlias(cache1.CachedPtr);
var ptr2 = UnsafeUtilityEx.RestrictNoAlias(cache2.CachedPtr);
var ptrE = (Entity*)UnsafeUtilityEx.RestrictNoAlias(cacheE.CachedPtr);
#if ENABLE_UNITY_COLLECTIONS_CHECKS
JobsUtility.PatchBufferMinMaxRanges(bufferRangePatchData, UnsafeUtility.AddressOf(ref jobData), cache0.CachedBeginIndex, cache0.CachedEndIndex - cache0.CachedBeginIndex);
#endif
for (var i = cache0.CachedBeginIndex; i != cache0.CachedEndIndex; i++)
{
#if CSHARP_7_OR_LATER
ref var value0 = ref UnsafeUtilityEx.ArrayElementAsRef<U0>(ptr0, i);
ref var value1 = ref UnsafeUtilityEx.ArrayElementAsRef<U1>(ptr1, i);
ref var value2 = ref UnsafeUtilityEx.ArrayElementAsRef<U2>(ptr2, i);
jobData.Data.Execute(ptrE[i], i, ref value0, ref value1, ref value2);
#else
var value0 = UnsafeUtility.ReadArrayElement<U0>(ptr0, i);
var value1 = UnsafeUtility.ReadArrayElement<U1>(ptr1, i);
var value2 = UnsafeUtility.ReadArrayElement<U2>(ptr2, i);
jobData.Data.Execute(ptrE[i], i, ref value0, ref value1, ref value2);
if (jobData.Iterator.IsReadOnly0 == 0)
UnsafeUtility.WriteArrayElement(ptr0, i, value0);
if (jobData.Iterator.IsReadOnly1 == 0)
UnsafeUtility.WriteArrayElement(ptr1, i, value1);
if (jobData.Iterator.IsReadOnly2 == 0)
UnsafeUtility.WriteArrayElement(ptr2, i, value2);
#endif
}
}
}
public static unsafe void Execute(ref JobStruct_Process3_WE<T, U0, U1, U2> jobData, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex)
{
if (jobData.Iterator.m_IsParallelFor)
{
int begin;
int end;
while (JobsUtility.GetWorkStealingRange(ref ranges, jobIndex, out begin, out end))
{
ExecuteChunk(ref jobData, bufferRangePatchData, begin, end);
}
}
else
{
ExecuteChunk(ref jobData, bufferRangePatchData, 0, jobData.Iterator.m_Length);
}
}
}
[StructLayout(LayoutKind.Sequential)]
private struct JobStruct_ProcessInfer_4<T> where T : struct
{
public static JobProcessComponentDataCache Cache;
public ProcessIterationData Iterator;
public T Data;
}
[StructLayout(LayoutKind.Sequential)]
internal struct JobStruct_Process4<T, U0, U1, U2, U3>
where T : struct, IJobProcessComponentData<U0, U1, U2, U3>
where U0 : struct, IComponentData
where U1 : struct, IComponentData
where U2 : struct, IComponentData
where U3 : struct, IComponentData
{
public ProcessIterationData Iterator;
public T Data;
[Preserve]
public static IntPtr Initialize(JobType jobType)
{
return JobsUtility.CreateJobReflectionData(typeof(JobStruct_Process4<T, U0, U1, U2, U3>), typeof(T),
jobType, (ExecuteJobFunction) Execute);
}
private delegate void ExecuteJobFunction(ref JobStruct_Process4<T, U0, U1, U2, U3> data, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex);
static unsafe void ExecuteChunk(ref JobStruct_Process4<T, U0, U1, U2, U3> jobData, IntPtr bufferRangePatchData, int begin, int end)
{
ComponentChunkCache cache0;
ComponentChunkCache cache1;
ComponentChunkCache cache2;
ComponentChunkCache cache3;
for (var blockIndex = begin; blockIndex != end; ++blockIndex)
{
jobData.Iterator.Iterator.MoveToChunkWithoutFiltering(blockIndex);
var processBlock = jobData.Iterator.Iterator.MatchesFilter();
if (!processBlock)
continue;
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache0, jobData.Iterator.IsReadOnly0 == 0, jobData.Iterator.IndexInGroup0);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache1, jobData.Iterator.IsReadOnly1 == 0, jobData.Iterator.IndexInGroup1);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache2, jobData.Iterator.IsReadOnly2 == 0, jobData.Iterator.IndexInGroup2);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache3, jobData.Iterator.IsReadOnly3 == 0, jobData.Iterator.IndexInGroup3);
var ptr0 = UnsafeUtilityEx.RestrictNoAlias(cache0.CachedPtr);
var ptr1 = UnsafeUtilityEx.RestrictNoAlias(cache1.CachedPtr);
var ptr2 = UnsafeUtilityEx.RestrictNoAlias(cache2.CachedPtr);
var ptr3 = UnsafeUtilityEx.RestrictNoAlias(cache3.CachedPtr);
#if ENABLE_UNITY_COLLECTIONS_CHECKS
JobsUtility.PatchBufferMinMaxRanges(bufferRangePatchData, UnsafeUtility.AddressOf(ref jobData), cache0.CachedBeginIndex, cache0.CachedEndIndex - cache0.CachedBeginIndex);
#endif
for (var i = cache0.CachedBeginIndex; i != cache0.CachedEndIndex; i++)
{
#if CSHARP_7_OR_LATER
ref var value0 = ref UnsafeUtilityEx.ArrayElementAsRef<U0>(ptr0, i);
ref var value1 = ref UnsafeUtilityEx.ArrayElementAsRef<U1>(ptr1, i);
ref var value2 = ref UnsafeUtilityEx.ArrayElementAsRef<U2>(ptr2, i);
ref var value3 = ref UnsafeUtilityEx.ArrayElementAsRef<U3>(ptr3, i);
jobData.Data.Execute(ref value0, ref value1, ref value2, ref value3);
#else
var value0 = UnsafeUtility.ReadArrayElement<U0>(ptr0, i);
var value1 = UnsafeUtility.ReadArrayElement<U1>(ptr1, i);
var value2 = UnsafeUtility.ReadArrayElement<U2>(ptr2, i);
var value3 = UnsafeUtility.ReadArrayElement<U3>(ptr3, i);
jobData.Data.Execute(ref value0, ref value1, ref value2, ref value3);
if (jobData.Iterator.IsReadOnly0 == 0)
UnsafeUtility.WriteArrayElement(ptr0, i, value0);
if (jobData.Iterator.IsReadOnly1 == 0)
UnsafeUtility.WriteArrayElement(ptr1, i, value1);
if (jobData.Iterator.IsReadOnly2 == 0)
UnsafeUtility.WriteArrayElement(ptr2, i, value2);
if (jobData.Iterator.IsReadOnly3 == 0)
UnsafeUtility.WriteArrayElement(ptr3, i, value3);
#endif
}
}
}
public static unsafe void Execute(ref JobStruct_Process4<T, U0, U1, U2, U3> jobData, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex)
{
if (jobData.Iterator.m_IsParallelFor)
{
int begin;
int end;
while (JobsUtility.GetWorkStealingRange(ref ranges, jobIndex, out begin, out end))
{
ExecuteChunk(ref jobData, bufferRangePatchData, begin, end);
}
}
else
{
ExecuteChunk(ref jobData, bufferRangePatchData, 0, jobData.Iterator.m_Length);
}
}
}
[StructLayout(LayoutKind.Sequential)]
private struct JobStruct_ProcessInfer_4_WE<T> where T : struct
{
public static JobProcessComponentDataCache Cache;
public ProcessIterationData Iterator;
public T Data;
}
[StructLayout(LayoutKind.Sequential)]
internal struct JobStruct_Process4_WE<T, U0, U1, U2, U3>
where T : struct, IJobProcessComponentDataWithEntity<U0, U1, U2, U3>
where U0 : struct, IComponentData
where U1 : struct, IComponentData
where U2 : struct, IComponentData
where U3 : struct, IComponentData
{
public ProcessIterationData Iterator;
public T Data;
[Preserve]
public static IntPtr Initialize(JobType jobType)
{
return JobsUtility.CreateJobReflectionData(typeof(JobStruct_Process4_WE<T, U0, U1, U2, U3>), typeof(T),
jobType, (ExecuteJobFunction) Execute);
}
private delegate void ExecuteJobFunction(ref JobStruct_Process4_WE<T, U0, U1, U2, U3> data, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex);
static unsafe void ExecuteChunk(ref JobStruct_Process4_WE<T, U0, U1, U2, U3> jobData, IntPtr bufferRangePatchData, int begin, int end)
{
ComponentChunkCache cache0;
ComponentChunkCache cache1;
ComponentChunkCache cache2;
ComponentChunkCache cache3;
ComponentChunkCache cacheE;
for (var blockIndex = begin; blockIndex != end; ++blockIndex)
{
jobData.Iterator.Iterator.MoveToChunkWithoutFiltering(blockIndex);
var processBlock = jobData.Iterator.Iterator.MatchesFilter();
if (!processBlock)
continue;
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache0, jobData.Iterator.IsReadOnly0 == 0, jobData.Iterator.IndexInGroup0);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache1, jobData.Iterator.IsReadOnly1 == 0, jobData.Iterator.IndexInGroup1);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache2, jobData.Iterator.IsReadOnly2 == 0, jobData.Iterator.IndexInGroup2);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cache3, jobData.Iterator.IsReadOnly3 == 0, jobData.Iterator.IndexInGroup3);
jobData.Iterator.Iterator.UpdateCacheToCurrentChunk(out cacheE, false, 0);
var ptr0 = UnsafeUtilityEx.RestrictNoAlias(cache0.CachedPtr);
var ptr1 = UnsafeUtilityEx.RestrictNoAlias(cache1.CachedPtr);
var ptr2 = UnsafeUtilityEx.RestrictNoAlias(cache2.CachedPtr);
var ptr3 = UnsafeUtilityEx.RestrictNoAlias(cache3.CachedPtr);
var ptrE = (Entity*)UnsafeUtilityEx.RestrictNoAlias(cacheE.CachedPtr);
#if ENABLE_UNITY_COLLECTIONS_CHECKS
JobsUtility.PatchBufferMinMaxRanges(bufferRangePatchData, UnsafeUtility.AddressOf(ref jobData), cache0.CachedBeginIndex, cache0.CachedEndIndex - cache0.CachedBeginIndex);
#endif
for (var i = cache0.CachedBeginIndex; i != cache0.CachedEndIndex; i++)
{
#if CSHARP_7_OR_LATER
ref var value0 = ref UnsafeUtilityEx.ArrayElementAsRef<U0>(ptr0, i);
ref var value1 = ref UnsafeUtilityEx.ArrayElementAsRef<U1>(ptr1, i);
ref var value2 = ref UnsafeUtilityEx.ArrayElementAsRef<U2>(ptr2, i);
ref var value3 = ref UnsafeUtilityEx.ArrayElementAsRef<U3>(ptr3, i);
jobData.Data.Execute(ptrE[i], i, ref value0, ref value1, ref value2, ref value3);
#else
var value0 = UnsafeUtility.ReadArrayElement<U0>(ptr0, i);
var value1 = UnsafeUtility.ReadArrayElement<U1>(ptr1, i);
var value2 = UnsafeUtility.ReadArrayElement<U2>(ptr2, i);
var value3 = UnsafeUtility.ReadArrayElement<U3>(ptr3, i);
jobData.Data.Execute(ptrE[i], i, ref value0, ref value1, ref value2, ref value3);
if (jobData.Iterator.IsReadOnly0 == 0)
UnsafeUtility.WriteArrayElement(ptr0, i, value0);
if (jobData.Iterator.IsReadOnly1 == 0)
UnsafeUtility.WriteArrayElement(ptr1, i, value1);
if (jobData.Iterator.IsReadOnly2 == 0)
UnsafeUtility.WriteArrayElement(ptr2, i, value2);
if (jobData.Iterator.IsReadOnly3 == 0)
UnsafeUtility.WriteArrayElement(ptr3, i, value3);
#endif
}
}
}
public static unsafe void Execute(ref JobStruct_Process4_WE<T, U0, U1, U2, U3> jobData, IntPtr additionalPtr,
IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex)
{
if (jobData.Iterator.m_IsParallelFor)
{
int begin;
int end;
while (JobsUtility.GetWorkStealingRange(ref ranges, jobIndex, out begin, out end))
{
ExecuteChunk(ref jobData, bufferRangePatchData, begin, end);
}
}
else
{
ExecuteChunk(ref jobData, bufferRangePatchData, 0, jobData.Iterator.m_Length);
}
}
}
}
}