void RequestUpdateBuffer(ChunkVertexBuilder vertexBuilder, ChunkMeshUpdatePriority priority) { for (int z = 0; z < MeshSegments.Z; z++) { for (int y = 0; y < MeshSegments.Y; y++) { for (int x = 0; x < MeshSegments.X; x++) { var opaqueRequest = new UpdateBufferRequest { VertexBuilder = vertexBuilder, Segment = new IntVector3(x, y, z), Translucece = false, Priority = priority, RequestTime = TimeSpan.FromTicks(Environment.TickCount) }; updateBufferRequests.Enqueue(opaqueRequest); var translucentRequest = new UpdateBufferRequest { VertexBuilder = vertexBuilder, Segment = new IntVector3(x, y, z), Translucece = true, Priority = priority, RequestTime = TimeSpan.FromTicks(Environment.TickCount) }; updateBufferRequests.Enqueue(translucentRequest); } } } }
internal void Clear() { Chunk = null; VertexBuilder = null; }
bool UpdateMeshSegmentBuffer(ChunkVertexBuilder verticesBuilder, int segmentX, int segmentY, int segmentZ, bool translucence) { var chunk = verticesBuilder.Chunk; // メッシュに設定するワールド座標。 // メッシュの中心をメッシュの位置とする。 var position = new Vector3 { X = chunk.Position.X * chunkManager.PartitionSize.X + segmentX * MeshSize.X + MeshOffset.X, Y = chunk.Position.Y * chunkManager.PartitionSize.Y + segmentY * MeshSize.Y + MeshOffset.Y, Z = chunk.Position.Z * chunkManager.PartitionSize.Z + segmentZ * MeshSize.Z + MeshOffset.Z }; // メッシュに設定するワールド行列。 Matrix world; Matrix.CreateTranslation(ref position, out world); // メッシュに設定するエフェクト。 var effect = chunk.Region.ChunkEffect; var vertices = verticesBuilder.GetVertices(segmentX, segmentY, segmentZ, translucence); var mesh = chunk.GetMesh(segmentX, segmentY, segmentZ, translucence); if (mesh != null) { TotalVertexCount -= mesh.VertexCount; TotalIndexCount -= mesh.IndexCount; } bool updated; if (vertices.VertexCount == 0 || vertices.IndexCount == 0) { if (mesh != null) { chunk.SetMesh(segmentX, segmentY, segmentZ, translucence, null); updated = true; } else { // 更新不要。 updated = false; } } else { if (mesh == null) { mesh = CreateMesh(effect, false, segmentX, segmentY, segmentZ); chunk.SetMesh(segmentX, segmentY, segmentZ, translucence, mesh); } mesh.PositionWorld = position; mesh.World = world; vertices.Populate(mesh); TotalVertexCount += mesh.VertexCount; TotalIndexCount += mesh.IndexCount; MaxVertexCount = Math.Max(MaxVertexCount, mesh.VertexCount); MaxIndexCount = Math.Max(MaxIndexCount, mesh.IndexCount); updated = true; } return(updated); }
internal void AttachVertexBuilder(ChunkVertexBuilder vertexBuilder) { VertexBuilder = vertexBuilder; }