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;
                }
            }
Exemplo n.º 2
0
            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");
 *              }
 */
            }