public void Execute(ArchetypeChunk chunk, int chunkIndex, int firstEntityIndex) { var lodRequirement = chunk.GetNativeArray(LodRequirement); var rootLodRequirement = chunk.GetNativeArray(RootLodRequirement); var meshLods = chunk.GetNativeArray(MeshLODComponent); var instanceCount = chunk.Count; for (int i = 0; i < instanceCount; i++) { var meshLod = meshLods[i]; var lodGroupEntity = meshLod.Group; var lodMask = meshLod.LODMask; var lodGroup = MeshLODGroupComponent[lodGroupEntity]; // Cannot take LocalToWorld from the instances, because they might not all share the same pivot lodRequirement[i] = new LodRequirement(lodGroup, LocalToWorldLookup[lodGroupEntity], lodMask); } for (int i = 0; i < instanceCount; i++) { var meshLod = meshLods[i]; var lodGroupEntity = meshLod.Group; var lodGroup = MeshLODGroupComponent[lodGroupEntity]; var parentMask = lodGroup.ParentMask; var parentGroupEntity = lodGroup.ParentGroup; RootLodRequirement rootLod; if (parentGroupEntity == Entity.Null) { rootLod.LOD.WorldReferencePosition = new float3(0, 0, 0); rootLod.LOD.MinDist = 0; rootLod.LOD.MaxDist = 1048576.0f; } else { var parentLodGroup = MeshLODGroupComponent[parentGroupEntity]; rootLod.LOD = new LodRequirement(parentLodGroup, LocalToWorldLookup[parentGroupEntity], parentMask); if (parentLodGroup.ParentGroup != Entity.Null) { throw new System.NotImplementedException("Deep HLOD is not supported yet"); } } rootLodRequirement[i] = rootLod; } }
public void Execute(ArchetypeChunk chunk, int chunkIndex, int firstEntityIndex) { var lodRequirement = chunk.GetNativeArray(LodRequirement); var rootLodRequirement = chunk.GetNativeArray(RootLodRequirement); var meshLods = chunk.GetNativeArray(MeshLODComponent); var instanceCount = chunk.Count; for (int i = 0; i < instanceCount; i++) { var meshLod = meshLods[i]; var lodGroupEntity = meshLod.Group; var lodMask = meshLod.LODMask; var lodGroup = MeshLODGroupComponent[lodGroupEntity]; // Cannot take LocalToWorld from the instances, because they might not all share the same pivot lodRequirement[i] = new LodRequirement(lodGroup, LocalToWorldLookup[lodGroupEntity], lodMask); } var rootLodIndex = -1; var lastLodRootMask = 0; var lastLodRootGroupEntity = Entity.Null; for (int i = 0; i < instanceCount; i++) { var meshLod = meshLods[i]; var lodGroupEntity = meshLod.Group; var lodGroup = MeshLODGroupComponent[lodGroupEntity]; var parentMask = lodGroup.ParentMask; var parentGroupEntity = lodGroup.ParentGroup; //@TODO: Bring this optimization back //var changedRoot = parentGroupEntity != lastLodRootGroupEntity || parentMask != lastLodRootMask || i == 0; var changedRoot = true; if (changedRoot) { rootLodIndex++; RootLodRequirement rootLod; rootLod.InstanceCount = 1; if (parentGroupEntity == Entity.Null) { rootLod.LOD.WorldReferencePosition = new float3(0, 0, 0); rootLod.LOD.MinDist = 0; rootLod.LOD.MaxDist = 64000.0f; } else { var parentLodGroup = MeshLODGroupComponent[parentGroupEntity]; rootLod.LOD = new LodRequirement(parentLodGroup, LocalToWorldLookup[parentGroupEntity], parentMask); rootLod.InstanceCount = 1; if (parentLodGroup.ParentGroup != Entity.Null) { throw new System.NotImplementedException("Deep HLOD is not supported yet"); } } rootLodRequirement[rootLodIndex] = rootLod; lastLodRootGroupEntity = parentGroupEntity; lastLodRootMask = parentMask; } else { var lastRoot = rootLodRequirement[rootLodIndex]; lastRoot.InstanceCount++; rootLodRequirement[rootLodIndex] = lastRoot; } } /* * var foundRootInstanceCount = 0; * for (int i = 0; i < rootLodIndex + 1; i++) * { * var lastRoot = rootLodRequirement[i]; * foundRootInstanceCount += lastRoot.InstanceCount; * } * * if (chunk.Count != foundRootInstanceCount) * { * throw new System.ArgumentException("Out of bounds"); * } */ }
public void Execute(int index) { var chunk = Chunks[index]; //@TODO: Delta change... var lodRequirement = chunk.GetNativeArray(LodRequirement); var rootLodRequirement = chunk.GetNativeArray(RootLodRequirement); var meshLods = chunk.GetNativeArray(MeshLODComponent); var localToWorlds = chunk.GetNativeArray(LocalToWorld); var instanceCount = chunk.Count; // var requirementCount = 0; // var lastLodGroupEntity = Entity.Null; // var lastLodGroupMask = 0; // var uniqueLodCount = 0; for (int i = 0; i < instanceCount; i++) { var meshLod = meshLods[i]; var localToWorld = localToWorlds[i]; var lodGroupEntity = meshLod.Group; var lodMask = meshLod.LODMask; var lodGroup = MeshLODGroupComponent[lodGroupEntity]; /* * var sameAsLast = (lodGroupEntity == lastLodGroupEntity) && (lastLodGroupMask == lodMask); * if (!sameAsLast) * { * uniqueLodCount++; * lastLodGroupEntity = lodGroupEntity; * lastLodGroupMask = lodMask; * } */ lodRequirement[i] = new LodRequirement(lodGroup, localToWorld, lodMask); } var rootLodIndex = -1; var lastLodRootMask = 0; var lastLodRootGroupEntity = Entity.Null; for (int i = 0; i < instanceCount; i++) { var meshLod = meshLods[i]; var lodGroupEntity = meshLod.Group; var lodGroup = MeshLODGroupComponent[lodGroupEntity]; var parentMask = lodGroup.ParentMask; var parentGroupEntity = lodGroup.ParentGroup; var changedRoot = parentGroupEntity != lastLodRootGroupEntity || parentMask != lastLodRootMask || i == 0; if (changedRoot) { rootLodIndex++; RootLodRequirement rootLod; rootLod.InstanceCount = 1; if (parentGroupEntity == Entity.Null) { rootLod.LOD.WorldReferencePosition = new float3(0, 0, 0); rootLod.LOD.MinDist = 0; rootLod.LOD.MaxDist = 64000.0f; } else { var parentLodGroup = MeshLODGroupComponent[parentGroupEntity]; rootLod.LOD = new LodRequirement(parentLodGroup, LocalToWorldLookup[parentGroupEntity], parentMask); rootLod.InstanceCount = 1; if (parentLodGroup.ParentGroup != Entity.Null) { throw new System.NotImplementedException("Deep HLOD is not supported yet"); } } rootLodRequirement[rootLodIndex] = rootLod; lastLodRootGroupEntity = parentGroupEntity; lastLodRootMask = parentMask; } else { var lastRoot = rootLodRequirement[rootLodIndex]; lastRoot.InstanceCount++; rootLodRequirement[rootLodIndex] = lastRoot; } } /* * var foundRootInstanceCount = 0; * for (int i = 0; i < rootLodIndex + 1; i++) * { * var lastRoot = rootLodRequirement[i]; * foundRootInstanceCount += lastRoot.InstanceCount; * } * * if (chunk.Count != foundRootInstanceCount) * { * throw new System.ArgumentException("Out of bounds"); * } */ }