Exemplo n.º 1
0
        public static void UpdateIndexBuffer(SharpDXInfo info, IEnumerable <int> rawIndices)
        {
            if (rawIndices == null)
            {
                return;
            }

            // 頂点数が既存のデータと違ってたらインデックスバッファを作り直す
            if (rawIndices.Count() != info.rawIndices.Length)
            {
                if (!indexBufferPool.ContainsKey(rawIndices.Count()))
                {
                    indexBufferPool[rawIndices.Count()] = CreateBuffer <int>(info.Device, BindFlags.IndexBuffer, rawIndices.Count());
                }
                Buffer buffer = indexBufferPool[rawIndices.Count()];
                info.UpdateBuffers(indexBuffer: buffer);
                var binding = new VertexBufferBinding(info.IndexBuffer, Utilities.SizeOf <int>(), 0);
                info.Device.ImmediateContext.InputAssembler.SetIndexBuffer(buffer, Format.R32_UInt, 0);
                info.rawIndices = rawIndices.ToArray();
            }

            // インデックスバッファの値を更新
            var box = info.Device.ImmediateContext.MapSubresource(info.IndexBuffer, 0, MapMode.WriteDiscard, MapFlags.None);

            for (int i = 0; i < rawIndices.Count(); i++)
            {
                System.Runtime.InteropServices.Marshal.StructureToPtr(rawIndices.ElementAt(i), box.DataPointer + Utilities.SizeOf <int>() * i, false);
                info.rawIndices[i] = rawIndices.ElementAt(i);
            }
            info.Device.ImmediateContext.UnmapSubresource(info.IndexBuffer, 0);
        }