/// <summary> /// InterBlockMeshPart のための VertexSource を作成します。 /// </summary> /// <param name="meshPartVS">InterBlockMeshPart のための VertexSource。</param> /// <param name="part">Part。</param> /// <param name="cubeSurfaceVS">立方体の面の頂点データを提供する VertexSource。</param> /// <param name="elementSize">Element のサイズ。</param> static void MakeMeshPartVertexSource( MeshPartVertexSource meshPartVS, Part part, CubeSurfaceVertexSource cubeSurfaceVS, float elementSize) { // Block は最小位置を原点とするモデルであり、一方、立方体の VertexSource は立方体の中心が原点にあるため、 // 立方体の最小位置を原点とするための移動行列を作成し、立方体の頂点データの変換に利用します。 Matrix elementOriginTranslation = Matrix.CreateTranslation(new Vector3(elementSize * 0.5f)); for (int i = 0; i < part.ResolvedElements.Count; i++) { var resolvedElement = part.ResolvedElements[i]; // グリッド内位置へ移動させるための移動行列を作成します。 var gridPosition = resolvedElement.Element.Position.ToVector3() * elementSize; Matrix gridTranslation = Matrix.CreateTranslation(gridPosition); // 立方体の最終的な移動行列を作成します。 Matrix finalTranslation; Matrix.Multiply(ref elementOriginTranslation, ref gridTranslation, out finalTranslation); // 表示すべき面の頂点データを VertexSource へ設定します。 for (int surfaceIndex = 0; surfaceIndex < 6; surfaceIndex++) { if (resolvedElement.SurfaceVisible[surfaceIndex]) { AddSurfaceVertices( meshPartVS, cubeSurfaceVS.Surfaces[surfaceIndex], ref finalTranslation); } } } }
/// <summary> /// 面の頂点データを InterBlockMeshPart の頂点データへ設定します。 /// </summary> /// <param name="meshPartVS"> /// InterBlockMeshPart の頂点データを保持する VertexSource。 /// </param> /// <param name="surfaceVS"> /// 面の頂点データを提供する VertexSource。 /// </param> /// <param name="transform"> /// 頂点の設定前に適用する変換行列。 /// </param> static void AddSurfaceVertices(MeshPartVertexSource meshPartVS, SurfaceVertexSource surfaceVS, ref Matrix transform) { var startIndex = meshPartVS.Vertices.Count; var vertexSource = surfaceVS; foreach (var index in vertexSource.Indices) { meshPartVS.Indices.Add((ushort)(startIndex + index)); } for (int i = 0; i < vertexSource.Vertices.Count; i++) { var cubeVertex = vertexSource.Vertices[i]; Vector3 transformedVertexPosition; Vector3.Transform(ref cubeVertex.Position, ref transform, out transformedVertexPosition); meshPartVS.Vertices.Add(new VertexPositionNormal(transformedVertexPosition, cubeVertex.Normal)); } }