public void SetMesh(int segmentX, int segmentY, int segmentZ, bool translucence, ChunkMesh mesh) { ChunkMesh oldMesh; if (translucence) { oldMesh = translucentMeshes[segmentX, segmentY, segmentZ]; translucentMeshes[segmentX, segmentY, segmentZ] = mesh; } else { oldMesh = opaqueMeshes[segmentX, segmentY, segmentZ]; opaqueMeshes[segmentX, segmentY, segmentZ] = mesh; } if (oldMesh != null) { DetachMesh(oldMesh); } if (mesh != null) { AttachMesh(mesh); } }
void DetachMesh(ChunkMesh mesh) { // ノードから削除。 Node.Objects.Remove(mesh); // マネージャへ削除要求。 chunkManager.DisposeMesh(mesh); }
internal void DisposeMesh(ChunkMesh chunkMesh) { TotalVertexCount -= chunkMesh.VertexCount; TotalIndexCount -= chunkMesh.IndexCount; chunkMesh.Dispose(); MeshCount--; }
/// <summary> /// チャンク メッシュを生成します。 /// </summary> /// <param name="effect">チャンクのエフェクト。</param> /// <param name="translucent"> /// true (半透明の場合)、false (それ以外の場合)。 /// </param> /// <returns>チャンク メッシュ。</returns> ChunkMesh CreateMesh(ChunkEffect effect, bool translucent, int segmentX, int segmentY, int segmentZ) { meshNameBuilder.Length = 0; meshNameBuilder.Append((translucent) ? "TranslucentMesh" : "OpaqueMesh"); meshNameBuilder.Append('_').AppendNumber(segmentX); meshNameBuilder.Append('_').AppendNumber(segmentY); meshNameBuilder.Append('_').AppendNumber(segmentZ); var name = meshNameBuilder.ToString(); var mesh = new ChunkMesh(name, effect); mesh.Translucent = translucent; MeshCount++; return(mesh); }
/// <summary> /// チャンク メッシュへ頂点およびインデックス情報を設定します。 /// </summary> /// <param name="mesh">チャンク メッシュ。</param> public void Populate(ChunkMesh mesh) { if (mesh == null) { throw new ArgumentNullException("mesh"); } // メッシュの BoundingBox。 var transform = mesh.World; Vector3.Transform(ref box.Min, ref transform, out mesh.BoxWorld.Min); Vector3.Transform(ref box.Max, ref transform, out mesh.BoxWorld.Max); // メッシュの BoundingSphere。 mesh.BoxWorld.GetCorners(corners); mesh.SphereWorld = BoundingSphere.CreateFromPoints(corners); mesh.SetVertices(vertices, VertexCount); mesh.SetIndices(indices, IndexCount); }
/// <summary> /// チャンク メッシュを破棄します。 /// </summary> /// <param name="chunkMesh">チャンク メッシュ。</param> internal void DisposeMesh(ChunkMesh chunkMesh) { meshManager.DisposeMesh(chunkMesh); }
/// <summary> /// チャンク メッシュへ頂点およびインデックス情報を設定します。 /// </summary> /// <param name="mesh">チャンク メッシュ。</param> public void Populate(ChunkMesh mesh) { if (mesh == null) throw new ArgumentNullException("mesh"); // メッシュの BoundingBox。 var transform = mesh.World; Vector3.Transform(ref box.Min, ref transform, out mesh.BoxWorld.Min); Vector3.Transform(ref box.Max, ref transform, out mesh.BoxWorld.Max); // メッシュの BoundingSphere。 mesh.BoxWorld.GetCorners(corners); mesh.SphereWorld = BoundingSphere.CreateFromPoints(corners); mesh.SetVertices(vertices, VertexCount); mesh.SetIndices(indices, IndexCount); }
/// <summary> /// チャンク メッシュを破棄します。 /// </summary> /// <param name="chunkMesh">チャンク メッシュ。</param> internal void DisposeMesh(ChunkMesh chunkMesh) { meshManager.DisposeMesh(chunkMesh); }
void AttachMesh(ChunkMesh mesh) { // ノードへ追加。 Node.Objects.Add(mesh); }
void DetachMesh(ChunkMesh mesh) { // ノードから削除。 Node.Objects.Remove(mesh); // マネージャへ削除要求。 chunkManager.DisposeMesh(mesh); }
void AttachMesh(ChunkMesh mesh) { // ノードへ追加。 Node.Objects.Add(mesh); }
public void SetMesh(int segmentX, int segmentY, int segmentZ, bool translucence, ChunkMesh mesh) { ChunkMesh oldMesh; if (translucence) { oldMesh = translucentMeshes[segmentX, segmentY, segmentZ]; translucentMeshes[segmentX, segmentY, segmentZ] = mesh; } else { oldMesh = opaqueMeshes[segmentX, segmentY, segmentZ]; opaqueMeshes[segmentX, segmentY, segmentZ] = mesh; } if (oldMesh != null) DetachMesh(oldMesh); if (mesh != null) AttachMesh(mesh); }