Exemplo n.º 1
0
        /// <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);
                    }
                }
            }
        }
Exemplo n.º 2
0
        /// <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));
            }
        }