/// <summary> /// 指定の Block の要素サイズについての CubeSurfaceVertexSource を生成して登録します。 /// </summary> /// <param name="elementSize"></param> static void RegisterCubeSurfaceVertexSource(float elementSize) { cubeSurfaceVertexSourceMap[elementSize] = new CubeSurfaceVertexSource(elementSize); }
/// <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); } } }