예제 #1
0
        private static D3D11PrimitiveTopology GetPrimitiveTopology(SdkMeshPrimitiveType primitiveType)
        {
            switch (primitiveType)
            {
            case SdkMeshPrimitiveType.TriangleList:
                return(D3D11PrimitiveTopology.TriangleList);

            case SdkMeshPrimitiveType.TriangleStrip:
                return(D3D11PrimitiveTopology.TriangleStrip);

            case SdkMeshPrimitiveType.LineList:
                return(D3D11PrimitiveTopology.LineList);

            case SdkMeshPrimitiveType.LineStrip:
                return(D3D11PrimitiveTopology.LineStrip);

            case SdkMeshPrimitiveType.PointList:
                return(D3D11PrimitiveTopology.PointList);

            case SdkMeshPrimitiveType.TriangleListAdj:
                return(D3D11PrimitiveTopology.TriangleListAdj);

            case SdkMeshPrimitiveType.TriangleStripAdj:
                return(D3D11PrimitiveTopology.TriangleStripAdj);

            case SdkMeshPrimitiveType.LineListAdj:
                return(D3D11PrimitiveTopology.LineListAdj);

            case SdkMeshPrimitiveType.LineStripAdj:
                return(D3D11PrimitiveTopology.LineStripAdj);

            case SdkMeshPrimitiveType.QuadPatchList:
                return(D3D11PrimitiveTopology.TriangleList);

            case SdkMeshPrimitiveType.TrianglePatchList:
                return(D3D11PrimitiveTopology.TriangleList);

            default:
                return(D3D11PrimitiveTopology.TriangleList);
            }
        }
        private void ComputeBoundingBox(SdkMeshRawFile rawFile, SdkMeshRawMesh rawMesh)
        {
            //this.BoundingBoxCenter = rawMesh.BoundingBoxCenter;
            //this.BoundingBoxExtents = rawMesh.BoundingBoxExtents;

            XMVector lower = XMVector.Replicate(float.MaxValue);
            XMVector upper = XMVector.Replicate(float.MinValue);

            int indsize;

            if (rawFile.IndexBufferHeaders[rawMesh.IndexBuffer].IndexType == SdkMeshIndexType.IndexType32Bit)
            {
                indsize = 4;
            }
            else
            {
                indsize = 2;
            }

            for (int subset = 0; subset < rawMesh.NumSubsets; subset++)
            {
                SdkMeshRawSubset pSubset = rawFile.Subsets[rawMesh.SubsetsIndices[subset]];

                SdkMeshPrimitiveType primType = pSubset.PrimitiveType;
                Debug.Assert(primType == SdkMeshPrimitiveType.TriangleList, "Only triangle lists are handled.");

                if (primType != SdkMeshPrimitiveType.TriangleList)
                {
                    continue;
                }

                int    indexCount = (int)pSubset.IndexCount;
                int    indexStart = (int)pSubset.IndexStart;
                byte[] ind        = rawFile.IndexBufferBytes[rawMesh.IndexBuffer];
                byte[] verts      = rawFile.VertexBufferBytes[rawMesh.VertexBuffers[0]];
                int    stride     = (int)rawFile.VertexBufferHeaders[rawMesh.VertexBuffers[0]].StrideBytes;

                for (int vertind = indexStart; vertind < indexStart + indexCount; vertind++)
                {
                    int current_ind;

                    if (indsize == 2)
                    {
                        current_ind = BitConverter.ToInt16(ind, vertind * 2);
                    }
                    else
                    {
                        current_ind = BitConverter.ToInt32(ind, vertind * 4);
                    }

                    float x = BitConverter.ToSingle(verts, stride * current_ind);
                    float y = BitConverter.ToSingle(verts, stride * current_ind + 4);
                    float z = BitConverter.ToSingle(verts, stride * current_ind + 8);

                    lower = XMVector.Min(new XMVector(x, y, z, 1.0f), lower);
                    upper = XMVector.Max(new XMVector(x, y, z, 1.0f), upper);
                }
            }

            XMVector half = upper - lower;

            half *= 0.5f;

            this.BoundingBoxCenter  = lower + half;
            this.BoundingBoxExtents = half;
        }