Пример #1
0
 public void Write(AssetWriter writer)
 {
     Renderers.Write(writer);
     if (IsAlign(writer.Version))
     {
         writer.AlignStream();
     }
     Systems.Write(writer);
     if (IsAlign(writer.Version))
     {
         writer.AlignStream();
     }
     if (HasProbesets(writer.Version))
     {
         Probesets.Write(writer);
         writer.AlignStream();
     }
     SystemAtlases.Write(writer);
     if (IsAlign(writer.Version))
     {
         writer.AlignStream();
     }
     if (HasTerrainChunks(writer.Version))
     {
         TerrainChunks.Write(writer);
         if (IsAlign(writer.Version))
         {
             writer.AlignStream();
         }
     }
 }
Пример #2
0
        public YAMLNode ExportYAML(IExportContainer container)
        {
            YAMLMappingNode node = new YAMLMappingNode();

            node.Add("m_Renderers", Renderers.ExportYAML(container));
            node.Add("m_Systems", Systems.ExportYAML(container));
            node.Add("m_Probesets", Probesets.ExportYAML(container));
            node.Add("m_SystemAtlases", SystemAtlases.ExportYAML(container));
            node.Add("m_TerrainChunks", TerrainChunks.ExportYAML(container));
            return(node);
        }
Пример #3
0
        public YAMLNode ExportYAML(IExportContainer container)
        {
            YAMLMappingNode node = new YAMLMappingNode();

            node.Add(RenderersName, Renderers.ExportYAML(container));
            node.Add(SystemsName, Systems.ExportYAML(container));
            node.Add(ProbesetsName, Probesets.ExportYAML(container));
            node.Add(SystemAtlasesName, SystemAtlases.ExportYAML(container));
            node.Add(TerrainChunksName, TerrainChunks.ExportYAML(container));
            return(node);
        }
Пример #4
0
        public void Update(Vector3 cameraPosition)
        {
            // Dispose of chunks which are out of range
            for (int i = TerrainChunks.Count - 1; i >= 0; i--)
            {
                TerrainChunk terrainChunk = TerrainChunks.ElementAt(i);

                if (new Vector2(cameraPosition.X - terrainChunk.GridCoordinates.X * TerrainChunk.EdgeLength, cameraPosition.Z - terrainChunk.GridCoordinates.Y * TerrainChunk.EdgeLength).Length() > ChunkRenderDistance)
                {
                    TerrainChunks.RemoveAt(i);
                    terrainChunk.Dispose();
                }
            }

            // Absorb and create new chunks if background thread isn't busy
            if (_chunkCreationThread == null || !_chunkCreationThread.IsAlive)
            {
                TerrainChunks.AddRange(_newTerrainChunks);

                List <Vector2> newTerrainChunkGridCoordinates = new List <Vector2>();
                for (int gridCoordinateZ = (int)Math.Ceiling((cameraPosition.Z - ChunkRenderDistance) / TerrainChunk.EdgeLength); gridCoordinateZ <= (int)Math.Floor((cameraPosition.Z + ChunkRenderDistance) / TerrainChunk.EdgeLength); gridCoordinateZ++)
                {
                    for (int gridCoordinateX = (int)Math.Ceiling((cameraPosition.X - ChunkRenderDistance) / TerrainChunk.EdgeLength); gridCoordinateX <= (int)Math.Floor((cameraPosition.X + ChunkRenderDistance) / TerrainChunk.EdgeLength); gridCoordinateX++)
                    {
                        Vector2 gridCoordinates = new Vector2(gridCoordinateX, gridCoordinateZ);

                        if (new Vector2(cameraPosition.X - gridCoordinates.X * TerrainChunk.EdgeLength, cameraPosition.Z - gridCoordinates.Y * TerrainChunk.EdgeLength).Length() <= ChunkRenderDistance && !TerrainChunks.Any(c => c.GridCoordinates == gridCoordinates))
                        {
                            newTerrainChunkGridCoordinates.Add(gridCoordinates);
                        }
                    }
                }

                _chunkCreationThread = new Thread(CreateNewTerrainChunks);
                _chunkCreationThread.Start(newTerrainChunkGridCoordinates);
            }
        }