예제 #1
0
        public override void BufferData(IntPtr buffer, int sizeInBytes, AudioFormat format)
        {
            _dataStream?.Dispose();
            _dataStream = new DataStream(sizeInBytes, true, true);

            _dataStream.WriteRange(buffer, sizeInBytes);
            _dataStream.Position = 0;

            _format                 = format;
            SizeInBytes             = sizeInBytes;
            Buffer.AudioDataPointer = _dataStream.PositionPointer;
            Buffer.AudioBytes       = SizeInBytes;
        }
예제 #2
0
        public override unsafe void BufferData <T>(T[] buffer, AudioFormat format)
        {
            int sizeInBytes = sizeof(T) * buffer.Length;

            _dataStream?.Dispose();
            _dataStream = new DataStream(sizeInBytes, true, true);
            _dataStream.WriteRange(buffer, 0, buffer.Length);
            _dataStream.Position = 0;

            _format     = format;
            SizeInBytes = sizeInBytes;
            _buffer.AudioDataPointer = _dataStream.PositionPointer;
            _buffer.AudioBytes       = SizeInBytes;
        }
예제 #3
0
        public void CreateFromSectionPathDoesNotAllowToExpand()
        {
            string tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());

            int        beforeCount  = DataStream.ActiveStreams;
            FileStream createStream = null;
            DataStream writeStream  = null;

            try {
                createStream = new FileStream(tempFile, FileMode.CreateNew);
                createStream.WriteByte(0xCA);
                createStream.WriteByte(0xFE);
                createStream.WriteByte(0xAA);
                createStream.Dispose();
                createStream = null; // prevent two disposes

                writeStream          = DataStreamFactory.FromFile(tempFile, FileOpenMode.Write, 1, 2);
                writeStream.Position = 2;
                Assert.That(() => writeStream.WriteByte(0xB4), Throws.InvalidOperationException);
            } finally {
                createStream?.Dispose();
                writeStream?.Dispose();
                File.Delete(tempFile);
            }

            Assert.AreEqual(beforeCount, DataStream.ActiveStreams);
        }
예제 #4
0
        public void CreateFromPathWritesFile()
        {
            string tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());

            Assert.That(File.Exists(tempFile), Is.False);

            int        beforeCount = DataStream.ActiveStreams;
            DataStream writeStream = null;
            FileStream readStream  = null;

            try {
                writeStream = DataStreamFactory.FromFile(tempFile, FileOpenMode.Write);
                Assert.AreEqual(0x0, writeStream.Offset);
                Assert.AreEqual(0x0, writeStream.Length);
                Assert.AreEqual(0x0, writeStream.Position);
                writeStream.WriteByte(0xCA);
                writeStream.Dispose();
                writeStream = null; // prevent two dispose

                Assert.That(File.Exists(tempFile), Is.True);
                readStream = new FileStream(tempFile, FileMode.Open);
                Assert.AreEqual(0x1, readStream.Length);
                Assert.AreEqual(0xCA, readStream.ReadByte());
            } finally {
                writeStream?.Dispose();
                readStream?.Dispose();
                File.Delete(tempFile);
            }

            Assert.AreEqual(beforeCount, DataStream.ActiveStreams);
        }
예제 #5
0
        public static Texture2D TextureFromBitmap(Bitmap image)
        {
            BitmapData data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height),
                                             ImageLockMode.ReadWrite, image.PixelFormat);
            int bytes = data.Stride*image.Height;
            DataStream stream = new DataStream(bytes, true, true);
            stream.WriteRange(data.Scan0, bytes);
            stream.Position = 0;
            DataRectangle dRect = new DataRectangle(data.Stride, stream);

            Texture2DDescription texDesc = new Texture2DDescription
                                               {
                                                   ArraySize = 1,
                                                   MipLevels = 1,
                                                   SampleDescription = new SampleDescription(1, 0),
                                                   Format = Format.B8G8R8A8_UNorm,
                                                   CpuAccessFlags = CpuAccessFlags.None,
                                                   BindFlags = BindFlags.ShaderResource,
                                                   Usage = ResourceUsage.Immutable,
                                                   Height = image.Height,
                                                   Width = image.Width
                                               };

            image.UnlockBits(data);
            image.Dispose();
            Texture2D texture = new Texture2D(Game.Context.Device, texDesc, dRect);
            stream.Dispose();
            return texture;
        }
예제 #6
0
        public void CreateFromSectionPathReadsFile()
        {
            string tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());

            Assert.That(File.Exists(tempFile), Is.False);

            int        beforeCount = DataStream.ActiveStreams;
            FileStream writeStream = null;
            DataStream readStream  = null;

            try {
                writeStream = new FileStream(tempFile, FileMode.CreateNew);
                writeStream.WriteByte(0xCA);
                writeStream.WriteByte(0xFE);
                writeStream.WriteByte(0xAA);
                writeStream.Dispose();
                writeStream = null; // prevent two disposes

                readStream = DataStreamFactory.FromFile(tempFile, FileOpenMode.Read, 1, 2);
                Assert.IsNull(readStream.ParentDataStream);
                Assert.AreEqual(0x1, readStream.Offset);
                Assert.AreEqual(0x2, readStream.Length);
                Assert.AreEqual(0x0, readStream.Position);
                Assert.AreEqual(0xFE, readStream.ReadByte());
            } finally {
                writeStream?.Dispose();
                readStream?.Dispose();
                File.Delete(tempFile);
            }

            Assert.AreEqual(beforeCount, DataStream.ActiveStreams);
        }
예제 #7
0
 /// <inheritdoc />
 public void Dispose()
 {
     if (!leaveStreamOpen)
     {
         DataStream?.Dispose();
     }
 }
예제 #8
0
        private static DX11Effect LoadByteCode(byte[] bytecode)
        {
            DX11Effect shader = new DX11Effect();
            try
            {
                DataStream ds = new DataStream(bytecode.Length, true, true);
                ds.Write(bytecode, 0, bytecode.Length);
                shader.ByteCode = new ShaderBytecode(ds);

                //fs.Close();
                ds.Dispose();

                shader.IsCompiled = true;
                shader.ErrorMessage = "";

                shader.Preprocess();

            }
            catch (Exception ex)
            {
                shader.IsCompiled = false;
                shader.ErrorMessage = ex.Message;
                shader.DefaultEffect = null;
            }
            return shader;
        }
 public void Dispose()
 {
     if (DisposeStream)
     {
         DataStream?.Dispose();
     }
 }
예제 #10
0
        public Quad(int startX,int endX, int startZ, int endZ, Base.Content.Terrain.Terrain terrain, RenderManager renderer)
        {
            _bounds = new QuadBounds
            {
                MinX = startX / terrain.PointsPerMeter,
                MaxX = endX / terrain.PointsPerMeter,
                MinZ = startZ / terrain.PointsPerMeter,
                MaxZ = endZ / terrain.PointsPerMeter,
                MinY = terrain.Height[0],
                MaxY = terrain.Height[0]
            };
            HorizontalCenter = new Vector2(Bounds.MinX + (Bounds.MaxX - Bounds.MinX) / 2, Bounds.MinZ + (Bounds.MaxZ - Bounds.MinZ) / 2);

            int verticesX = endX - startX + 1;
            int verticesZ = endZ - startZ + 1;

            var dataStream = new DataStream(32 * verticesX * verticesZ, true, true);

            for (int i = 0; i < verticesX; i++)
            {
                for (int j = 0; j < verticesZ; j++)
                {
                    //Position
                    int xindex = Math.Min(i + startX, terrain.PointsX - 1);//Clamp to arraybounds if neccessary
                    int zindex = Math.Min(j + startZ, terrain.PointsZ - 1);//(Quadsize needs to be consistent for sharing IndexBuffers)
                    float x = xindex / terrain.PointsPerMeter;
                    float z = zindex / terrain.PointsPerMeter;
                    float y = terrain.Height[xindex * terrain.PointsZ + zindex];
                    dataStream.Write(new Vector3(x, y, z));

                    //Normal
                    float deltax = (terrain.Height[(xindex < terrain.PointsX - 1 ? xindex + 1 : xindex) * terrain.PointsZ + zindex]
                        - terrain.Height[(xindex != 0 ? xindex - 1 : xindex) * terrain.PointsZ + zindex]);

                    float deltaz = (terrain.Height[xindex * terrain.PointsZ + (zindex < terrain.PointsZ - 1 ? zindex + 1 : zindex)]
                        - terrain.Height[xindex * terrain.PointsZ + (zindex != 0 ? zindex - 1 : zindex)]);
                    if (xindex == 0 || xindex == terrain.PointsX - 1)
                        deltax *= 2;
                    if (zindex == 0 || zindex == terrain.PointsZ - 1)
                        deltaz *= 2;
                    var normal = new Vector3(-deltax, 2 / terrain.PointsPerMeter, deltaz);
                    normal.Normalize();
                    dataStream.Write(normal);

                    //TextureCoordinates
                    dataStream.Write(new Vector2(x / terrain.PointsX, z / terrain.PointsZ));

                    //Boundingbox-Params
                    if (y < _bounds.MinY)
                        _bounds.MinY = y;
                    if (y > _bounds.MaxY)
                        _bounds.MaxY = y;
                }
            }

            dataStream.Position = 0;
            VBuffer = new Buffer(renderer.D3DDevice, dataStream, 32 * verticesX * verticesZ, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
            VertexBuffer = new VertexBufferBinding(VBuffer, 32, 0);
            dataStream.Dispose();
        }
예제 #11
0
        public DX11IndexBuffer(DX11RenderContext context, DataStream initial,bool dynamic, bool dispose)
        {
            this.context = context;
            format = SlimDX.DXGI.Format.R32_UInt;

            BindFlags flags = BindFlags.IndexBuffer;

            if (context.IsFeatureLevel11) { flags |= BindFlags.ShaderResource; }

            BufferDescription bd = new BufferDescription()
            {
                BindFlags = flags,
                CpuAccessFlags = dynamic ? CpuAccessFlags.Write : CpuAccessFlags.None,
                OptionFlags = context.IsFeatureLevel11 ? ResourceOptionFlags.RawBuffer : ResourceOptionFlags.None,
                SizeInBytes = (int)initial.Length,
                Usage = dynamic ? ResourceUsage.Dynamic : ResourceUsage.Default,
            };

            initial.Position = 0;
            this.IndicesCount = (int)initial.Length / 4;
            this.Buffer = new SlimDX.Direct3D11.Buffer(context.Device, initial, bd);

            this.CreateSRV();

            if (dispose) { initial.Dispose(); }
        }
예제 #12
0
        /// <summary>
        /// 指定したインデックス番号のインデックス データを設定する。
        /// </summary>
        /// <param name="immediateContext"></param>
        /// <param name="no">インデックス番号</param>
        public void IASetIndexBuffer(DeviceContext immediateContext, int no)
        {
            var t = m_vaIndexBuffer[no];

            m_mappedResourceTmp?.Dispose();
            m_mappedResourceTmp = null;
            immediateContext.InputAssembler.SetIndexBuffer(t.indexBuffer, t.info.format, 0);
        }
예제 #13
0
 public void Dispose()
 {
     DataStream?.Close();
     DataStream?.Dispose();
     ControlStream?.Close();
     ControlStream?.Dispose();
     IsAlive = false;
 }
예제 #14
0
        public override void BufferData <T>(T[] buffer, BufferAudioFormat format, int sizeInBytes, int frequency)
        {
            DataStream?.Dispose();
            DataStream = new DataStream(sizeInBytes, true, true);
            DataStream.WriteRange(buffer, 0, buffer.Length);
            DataStream.Position = 0;

            Format      = format;
            Frequency   = frequency;
            SizeInBytes = sizeInBytes;
        }
예제 #15
0
        public DX11VertexGeometry LineStrip3d(List<Vector3> points, bool loop)
        {
            DX11VertexGeometry geom = new DX11VertexGeometry(context);

            int vcount = loop ? points.Count + 1 : points.Count;

            Pos3Tex2Vertex[] verts = new Pos3Tex2Vertex[vcount];

            float inc = loop ? 1.0f / (float)vcount : 1.0f / ((float)vcount + 1.0f);

            float curr = 0.0f;
            
                
            for (int i = 0; i < points.Count; i++)
            {
                verts[i].Position = points[i];
                verts[i].TexCoords.X = curr;
                curr += inc;
            }

            if (loop)
            {
                verts[points.Count].Position = points[0];
                verts[points.Count].TexCoords.X = 1.0f;
            }


            DataStream ds = new DataStream(vcount * Pos3Tex2Vertex.VertexSize, true, true);
            ds.Position = 0;
            ds.WriteRange(verts);
            ds.Position = 0;

            var vbuffer = new SlimDX.Direct3D11.Buffer(context.Device, ds, new BufferDescription()
            {
                BindFlags = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags = ResourceOptionFlags.None,
                SizeInBytes = (int)ds.Length,
                Usage = ResourceUsage.Default
            });

            ds.Dispose();

            geom.VertexBuffer = vbuffer;
            geom.InputLayout = Pos3Tex2Vertex.Layout;
            geom.Topology = PrimitiveTopology.LineStrip;
            geom.VerticesCount = vcount;
            geom.VertexSize = Pos3Tex2Vertex.VertexSize;

            geom.HasBoundingBox = false;

            return geom;
        }
예제 #16
0
        public DXTreeSkeleton(CS_Tree tree, CS_Params csParams)
        {
            InitShaders();

            DXTreeSkeleton_TreeTraversal traversal = new DXTreeSkeleton_TreeTraversal(csParams);
            tree.traverseTree(traversal);
            BBox = traversal.BBox;

            for (int i = 0; i < 5; i++)
            {
                if (traversal.Vertices2[i].Count != 0)
                {

                    var stream = new DataStream(traversal.Vertices2[i].Count * Marshal.SizeOf(typeof(DXSKV)), true, true);

                    stream.WriteRange(traversal.Vertices2[i].ToArray());
                    stream.Position = 0;
                    _vertexBuffer2[i] = new Buffer(DXDevice, stream, new BufferDescription()
                    {
                        BindFlags = BindFlags.VertexBuffer,
                        CpuAccessFlags = CpuAccessFlags.None,
                        OptionFlags = ResourceOptionFlags.None,
                        SizeInBytes = traversal.Vertices2[i].Count * Marshal.SizeOf(typeof(DXSKV)),
                        Usage = ResourceUsage.Default
                    });
                    stream.Dispose();

                    List<UInt32> indices = new List<UInt32>();
                    for (int k = 0; k < traversal.Vertices2[i].Count; k++) { indices.Add((UInt32)k); }

                    stream = new DataStream(indices.Count * sizeof(UInt32), true, true);
                    stream.WriteRange(indices.ToArray());

                    stream.Position = 0;

                    _indexBuffer2[i] = new Buffer(DXDevice, stream, new BufferDescription()
                    {
                        BindFlags = BindFlags.IndexBuffer,
                        CpuAccessFlags = CpuAccessFlags.None,
                        OptionFlags = ResourceOptionFlags.None,
                        SizeInBytes = indices.Count * sizeof(UInt32),
                        Usage = ResourceUsage.Default
                    });
                    stream.Dispose();

                    IndexCount2[i] = indices.Count;
                }
            }
        }
예제 #17
0
 /// <summary>	
 /// Get data from the GPU asynchronously.	
 /// </summary>	
 /// <remarks>	
 /// GetData retrieves the data collected between calls to <see cref="SharpDX.Direct3D10.Asynchronous.Begin"/> and <see cref="SharpDX.Direct3D10.Asynchronous.End"/>.  Certain queries only require a call to ID3D10Asynchronous::End in which case the data returned by GetData is accurate up to the last call to ID3D10Asynchronous::End (See <see cref="SharpDX.Direct3D10.Query"/>). If DataSize is 0, GetData is only used to check status where a return value of S_OK indicates that data is available to give to an application, and a return value of S_FALSE indicates data is not yet available. It is invalid to invoke this function on a predicate created with the flag D3D10_QUERY_MISCFLAG_PREDICATEHINT. If the asynchronous interface that calls this function is <see cref="SharpDX.Direct3D10.Query"/>, then the following table applies.  Query TypeOutput Data TypeSupports Begin Method EVENTBOOLNO OCCLUSIONUINT64YES TIMESTAMPUINT64NO TIMESTAMP_DISJOINTQUERYDATA_TIMESTAMP_DISJOINTYES PIPELINE_STATISTICSQUERYDATA_PIPELINE_STATISTICSYES OCCLUSION_PREDICATEBOOLYES SO_STATISTICSQUERYDATA_SO_STATISTICSYES SO_OVERFLOW_PREDICATEBOOLYES  ? If the asynchronous interface that calls this API is <see cref="SharpDX.Direct3D10.Counter"/>, then the following applies.  Counter TypeOutput Data TypeUnits GPU_IDLEFLOAT32fraction of time VERTEX_PROCESSINGFLOAT32fraction of time GEOMETRY_PROCESSINGFLOAT32fraction of time PIXEL_PROCESSINGFLOAT32fraction of time OTHER_GPU_PROCESSINGFLOAT32fraction of time HOST_ADAPTER_BANDWIDTH_UTILIZATIONFLOAT32fraction of theoretical maximum LOCAL_VIDMEM_BANDWIDTH_UTILIZATIONFLOAT32fraction of theoretical maximum VERTEX_THROUGHPUT_UTILIZATIONFLOAT32fraction of theoretical maximum TRISETUP_THROUGHPUT_UTILIZATIONFLOAT32fraction of theoretical maximum FILLRATE_THROUGHPUT_UTILIZATIONFLOAT32fraction of theoretical maximum VERTEXSHADER_MEMORY_LIMITEDFLOAT32fraction of time VERTEXSHADER_COMPUTATION_LIMITEDFLOAT32fraction of time GEOMETRYSHADER_MEMORY_LIMITEDFLOAT32fraction of time GEOMETRYSHADER_COMPUTATION_LIMITEDFLOAT32fraction of time PIXELSHADER_MEMORY_LIMITEDFLOAT32fraction of time PIXELSHADER_COMPUTATION_LIMITEDFLOAT32fraction of time POST_TRANSFORM_CACHE_HIT_RATEFLOAT32fraction TEXTURE_CACHE_HIT_RATEFLOAT32fraction  ? The value returned by a GPU_IDLE, VERTEX_PROCESSING, GEOMETRY_PROCESSING, PIXEL_PROCESSING, or OTHER_GPU_PROCESSING counter may be different depending on the number of parallel counters that exist on a video card, and those values can be interpreted with the following equation:  ?  Equation to interpret the number of parallel counters ? The number of parallel counters that a video card has is available from NumDetectableParallelUnits in <see cref="CounterMetadata"/>, and it can be retrieved by calling <see cref="Device.CheckCounter"/>. 	
 /// </remarks>	
 /// <param name="flags">Optional flags. Can be 0 or any combination of the flags enumerated by <see cref="SharpDX.Direct3D10.AsynchronousFlags"/>. </param>
 /// <returns>If this function succeeds, returns a <see cref="SharpDX.DataStream"/> containing the asynchronous data sent from the GPU. </returns>
 /// <unmanaged>HRESULT ID3D10Asynchronous::GetData([Out, Buffer, Optional] void* pData,[In] int DataSize,[In] int GetDataFlags)</unmanaged>
 public DataStream GetData(AsynchronousFlags flags)
 {
     int dataSize = GetDataSize();
     DataStream dataStream = new DataStream(dataSize, true, true);
     try
     {
         GetData(dataStream.DataPointer, dataSize, (int)flags);
     }
     catch (Exception)
     {
         dataStream.Dispose();
         throw;
     }
     return dataStream;
 }
예제 #18
0
        public void Dispose()
        {
            if (Disposed)
            {
                return;
            }

            Disposed = true;

            SendResult?.TrySetCanceled();
            DataStreamResponse?.Dispose();
            DataStream?.Dispose();
            ReceiveWaiter.Set();

            DataStreamResponse = null;
            DataStream         = null;
        }
예제 #19
0
        public void CreateFromPathAllowsToExpand()
        {
            string tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());

            int        beforeCount = DataStream.ActiveStreams;
            DataStream writeStream = null;

            try {
                writeStream = DataStreamFactory.FromFile(tempFile, FileOpenMode.Write);
                Assert.That(() => writeStream.WriteByte(0xCA), Throws.Nothing);
            } finally {
                writeStream?.Dispose();
                File.Delete(tempFile);
            }

            Assert.AreEqual(beforeCount, DataStream.ActiveStreams);
        }
예제 #20
0
        public static Buffer CreateDynamicVertexBuffer(DX11RenderContext context, DataStream ds, bool dispose = false)
        {
            ds.Position = 0;
            var vertices = new SlimDX.Direct3D11.Buffer(context.Device, ds, new BufferDescription()
            {
                BindFlags = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.Write,
                OptionFlags = ResourceOptionFlags.None,
                SizeInBytes = (int)ds.Length,
                Usage = ResourceUsage.Dynamic
            });

            if (dispose)
            {
                ds.Dispose();
            }

            return vertices;
        }
예제 #21
0
        public GSSprite(Device device, DVector3 Position)
        {
            //float3 Position //12
            //half2 Size //16
            //half4 AABBTexCoord //24
            //half4 AditiveColor //32
            InputElement[] elements = new[] {
                new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0),
                new InputElement("TEXCOORD", 0, Format.R16G16_Float, 12, 0),
                new InputElement("TEXCOORD", 1, Format.R16G16B16A16_Float, 16, 0),
                new InputElement("TEXCOORD", 2, Format.R16G16B16A16_Float, 24, 0),
            };

            BytesPerVertex = 32;
            VertexsCount = 1;

            var vertices = new DataStream(BytesPerVertex * VertexsCount, true, true);

            vertices.Write(Conversion.ToVector3(Position));
            vertices.Write(new Half2(10, 10));
            vertices.Write(new Half4(0, 0, 1, 1));
            vertices.Write(new Half4(1, 0, 0, 1));
            vertices.Position = 0;

            Vertexs = new Buffer(device, vertices, BytesPerVertex * VertexsCount, ResourceUsage.Dynamic, BindFlags.VertexBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0);
            binding = new VertexBufferBinding(Vertexs, BytesPerVertex, 0);
            vertices.Dispose();

            this.Position = Position;
            EEEM = ContentManager.LoadEffect("Content/Shaders/GSSprite", elements);
            TexCont = ContentManager.LoadTexture2D("Content/Textures/Particl");
            // Подготовка константного буффера
            BufferDescription bd = new BufferDescription();
            bd.SizeInBytes = Marshal.SizeOf(typeof(ShaderConstants));
            bd.Usage = ResourceUsage.Dynamic;
            bd.BindFlags = BindFlags.ConstantBuffer;
            bd.CpuAccessFlags = CpuAccessFlags.Write;
            bd.OptionFlags = ResourceOptionFlags.None;
            bd.StructureByteStride = 0;

            constantsBuffer = new Buffer(device, bd);
            constants = new ShaderConstants();
        }
예제 #22
0
        public DX11VertexBuffer(DX11RenderContext context, DataStream initial,int verticescount,int vertexsize, bool dynamic, bool dispose)
        {
            this.context = context;

            BufferDescription bd = new BufferDescription()
            {
                BindFlags = BindFlags.VertexBuffer,
                CpuAccessFlags = dynamic ? CpuAccessFlags.Write : CpuAccessFlags.None,
                OptionFlags = ResourceOptionFlags.None,
                SizeInBytes = (int)initial.Length,
                Usage = dynamic ? ResourceUsage.Dynamic : ResourceUsage.Immutable,
            };

            initial.Position = 0;
            this.Buffer = new SlimDX.Direct3D11.Buffer(context.Device, initial, bd);
            this.VertexSize = vertexsize;
            this.VerticesCount = verticescount;

            if (dispose) { initial.Dispose(); }
        }
예제 #23
0
파일: DXWPFExt.cs 프로젝트: KFlaga/Cam3D
        public static unsafe WriteableBitmap GetBitmap(this SharpDX.Direct3D11.Texture2D tex)
        {
            DataRectangle db;
            DataStream data = new DataStream(tex.Description.Height * tex.Description.Width * 4, true, true);
            using(var copy = tex.GetCopy())
            using (var surface = copy.QueryInterface<SharpDX.DXGI.Surface>())
            {
                db = surface.Map(SharpDX.DXGI.MapFlags.Read, out data);
                // can't destroy the surface now with WARP driver

                int w = tex.Description.Width;
                int h = tex.Description.Height;
                var wb = new WriteableBitmap(w, h, 96.0, 96.0, PixelFormats.Bgra32, null);
                wb.Lock();
                try
                {
                    uint* wbb = (uint*)wb.BackBuffer;

                    data.Position = 0;
                    for (int y = 0; y < h; y++)
                    {
                        data.Position = y * db.Pitch;
                        for (int x = 0; x < w; x++)
                        {
                            var c = data.Read<uint>();
                            wbb[y * w + x] = c;
                        }
                    }
                }
                finally
                {
                    wb.AddDirtyRect(new Int32Rect(0, 0, w, h));
                    wb.Unlock();
                    data.Dispose();

                }
                return wb;
            }
        }
예제 #24
0
        public SlimDX.Direct3D11.Buffer GetVertexBuffer()
        {
            // dynamically create buffer
            if (m_DeviceBuffer == null)
            {
                ResourceUsage resourceUsage = ResourceUsage.Default;
                CpuAccessFlags cpuAccessFlags = CpuAccessFlags.None;

                if(m_Usage == Type.DYNAMIC )
                {
                    resourceUsage = ResourceUsage.Dynamic;
                    cpuAccessFlags = CpuAccessFlags.Write;
                }

                BufferDescription desc = new BufferDescription()
                {
                    BindFlags = BindFlags.VertexBuffer,
                    CpuAccessFlags = cpuAccessFlags,
                    OptionFlags = ResourceOptionFlags.None,
                    SizeInBytes = (int)m_RawData.Length,
                    Usage = resourceUsage
                };

                if (m_Usage == Type.DYNAMIC)
                {
                    m_DeviceBuffer = new SlimDX.Direct3D11.Buffer(m_D3dDevice, desc);
                }
                else
                {
                    DataStream dataStream = new DataStream(m_RawData.ToArray(), true, true);
                    m_DeviceBuffer = new SlimDX.Direct3D11.Buffer(m_D3dDevice, dataStream, desc);
                    dataStream.Dispose();
                }
            }

            return m_DeviceBuffer;
        }
예제 #25
0
        // Called when all resource must be reloaded
        public void ReloadResource()
        {
            foreach (KeyValuePair <int, SurfaceBufferSet> set in sets)
            {
                // Rebuild vertex buffers
                for (int i = 0; i < set.Value.buffersizes.Count; i++)
                {
                    // Make the new buffer!
                    VertexBuffer b = new VertexBuffer(General.Map.Graphics.Device, FlatVertex.Stride * set.Value.buffersizes[i],
                                                      Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);

                    // Start refilling the buffer with sector geometry
                    int        vertexoffset = 0;
                    DataStream bstream      = b.Lock(0, FlatVertex.Stride * set.Value.buffersizes[i], LockFlags.Discard);
                    foreach (SurfaceEntry e in set.Value.entries)
                    {
                        if (e.bufferindex == i)
                        {
                            // Fill buffer
                            bstream.Seek(e.vertexoffset * FlatVertex.Stride, SeekOrigin.Begin);
                            bstream.WriteRange(e.floorvertices);
                            bstream.WriteRange(e.ceilvertices);
                        }
                    }

                    // Unlock buffer
                    b.Unlock();
                    bstream.Dispose();

                    // Add to list
                    set.Value.buffers[i] = b;
                }
            }

            resourcesunloaded = false;
        }
예제 #26
0
        public void ImportPO(string poFileName)
        {
            DataStream   inputPO    = new DataStream(poFileName, FileOpenMode.Read);
            BinaryFormat binaryFile = new BinaryFormat(inputPO);
            Po           newPO      = binaryFile.ConvertTo <Po>();

            inputPO.Dispose();

            this.newText     = new Queue <string>();
            this.newPointers = new Queue <int>();

            int longCounter = 0;

            foreach (var entry in newPO.Entries)
            {
                string sentence = string.IsNullOrEmpty(entry.Translated) ?
                                  entry.Original : entry.Translated;

                if (sentence == "<!empty>")
                {
                    sentence = string.Empty;
                }

                if (this.CheckCorrectLong(sentence))
                {
                    sentence     = this.ReplaceSpecialChars(sentence);
                    longCounter += sentence.Length + 1; // byte \0
                    this.newText.Enqueue(sentence);
                    this.newPointers.Enqueue(longCounter);
                }
                else
                {
                    Console.WriteLine("Tamaño de frase excedido, máximo 36 caracteres: " + sentence);
                }
            }
        }
예제 #27
0
        /// <summary>
        ///     Renders the vertex buffer
        /// </summary>
        private void _RenderVertexBuffer()
        {
            if (_Vertices.Count <= 0)
            {
                return;
            }
            //The vertex buffer locks are slow actions, its better to lock once per frame and write all vertices to the buffer at once
            DataStream stream = _VertexBuffer.Lock(0, _Vertices.Count * Marshal.SizeOf(typeof(STexturedColoredVertex)), LockFlags.Discard);

            stream.WriteRange(_Vertices.ToArray());
            _VertexBuffer.Unlock();
            stream.Dispose();

            for (int i = 0; i < _Vertices.Count; i += 4)
            {
                //Apply rotation
                if (_Device.SetTransform(TransformState.World, _VerticesRotationMatrices.Dequeue()).IsFailure)
                {
                    CLog.LogError("Failed to set world transformation");
                }
                //Apply texture
                if (_Device.SetTexture(0, _VerticesTextures.Dequeue()).IsFailure)
                {
                    CLog.LogError("Failed to set texture");
                }
                //Draw 2 triangles from vertexbuffer
                if (_Device.DrawIndexedPrimitives(PrimitiveType.TriangleList, i, 0, 4, 0, 2).IsFailure)
                {
                    CLog.LogError("Failed to draw quad");
                }
            }
            //Clear the queues for the next frame
            _Vertices.Clear();
            _VerticesTextures.Clear();
            _VerticesRotationMatrices.Clear();
        }
        public Texture2D LoadTexture(System.Drawing.Bitmap b)
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            b.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            ms.Seek(0, System.IO.SeekOrigin.Begin);

            SharpDX.WIC.BitmapDecoder   decoder   = new SharpDX.WIC.BitmapDecoder(ImageFactory, ms, SharpDX.WIC.DecodeOptions.CacheOnDemand);
            SharpDX.WIC.FormatConverter converter = new SharpDX.WIC.FormatConverter(ImageFactory);
            converter.Initialize(decoder.GetFrame(0), SharpDX.WIC.PixelFormat.Format32bppPRGBA, SharpDX.WIC.BitmapDitherType.None, null, 0.0, SharpDX.WIC.BitmapPaletteType.Custom);
            SharpDX.WIC.BitmapSource bitmap = converter;
            int        stride = bitmap.Size.Width * 4;
            DataStream buffer = new DataStream(bitmap.Size.Height * stride, true, true);

            bitmap.CopyPixels(stride, buffer);
            Texture2D texture = new Texture2D(Device, new Texture2DDescription()
            {
                Width = bitmap.Size.Width, Height = bitmap.Size.Height, ArraySize = 1, BindFlags = BindFlags.ShaderResource, Usage = ResourceUsage.Immutable, CpuAccessFlags = CpuAccessFlags.None, Format = Format.R8G8B8A8_UNorm, MipLevels = 1, OptionFlags = ResourceOptionFlags.None, SampleDescription = new SampleDescription(1, 0)
            }, new DataRectangle(buffer.DataPointer, stride));

            bitmap.Dispose();
            buffer.Dispose();
            ms.Dispose();
            return(texture);
        }
예제 #29
0
        static void Main(string[] args)
        {
            {
                Console.WriteLine("TEXT2PO 1.2 - A simple converter for the text from the games Lord of Magna and Rune Factory 4 by Darkmet98.");
                Console.WriteLine("Massive thanks to Pleonex, Leeg and Megaflan for all.");
                if (args.Length != 3 && args.Length != 2)
                {
                    System.Console.WriteLine("Usage: TEXT2PO <mode> <file1> <file2>");
                    System.Console.WriteLine("Mode for Rune Factory 4: -exportrune (export to po)/-importrune (import po)/-transrune(import the translation from another file)/-exportrunefix(export and fix bad newlines from another programs)");
                    System.Console.WriteLine("Mode for Lord Of Magna Maiden Heaven: -exportlord (export to po)/-importlord (import po)/-translord(import the translation from another file)/-exportlordfix(export and fix bad newlines from another programs)");
                    System.Console.WriteLine("");
                    System.Console.WriteLine("Example 1: TEXT2PO.exe -exportlord msg.nxtxt");
                    System.Console.WriteLine("Example 2: TEXT2PO.exe -importlord msg.nxtxt.po");
                    System.Console.WriteLine("Example 3: TEXT2PO.exe -translord msg.nxtxt.po msgESP.nxtxt");
                    System.Console.WriteLine("Example 4: TEXT2PO.exe -exportlordfix msgESP.nxtxt");
                    return;
                }
                List <String> Filestrings     = new List <String>();
                List <String> Postrings       = new List <String>();
                List <int>    stringsizes     = new List <int>();
                List <int>    stringpositions = new List <int>();
                string        result          = "";
                Int32         magic;
                Int32         count;
                Int32         size;
                Int32         position;
                Int32         textsize;
                int           i = 0;
                switch (args[0])
                {
                case "-exportlord":
                    using (BinaryReader reader = new BinaryReader(File.Open(args[1], FileMode.Open)))
                    {
                        Po poexport = new Po
                        {
                            Header = new PoHeader("Lord Of Magna Maiden Heaven", "*****@*****.**", "es")
                            {
                                LanguageTeam = "Glowtranslations",
                            }
                        };
                        magic = reader.ReadInt32();
                        count = reader.ReadInt32();
                        Console.WriteLine("Exporting...");
                        for (i = 0; i < count; i++)
                        {
                            size     = reader.ReadInt32();
                            position = reader.ReadInt32();
                            stringsizes.Add(size);
                            stringpositions.Add(position);
                        }
                        for (i = 0; i < count; i++)
                        {
                            reader.BaseStream.Position = stringpositions[i];     //El puto flan
                            byte[] array = reader.ReadBytes(stringsizes[i]);
                            result = Encoding.Unicode.GetString(array);
                            if (string.IsNullOrEmpty(result))
                            {
                                result = "<!empty>";
                            }
                            poexport.Add(new PoEntry(result)
                            {
                                Context = i.ToString()
                            });
                        }
                        poexport.ConvertTo <BinaryFormat>().Stream.WriteTo(args[1] + ".po");
                        Console.WriteLine("The file is exported.");
                    }
                    break;

                case "-exportlordfix":
                    using (BinaryReader reader = new BinaryReader(File.Open(args[1], FileMode.Open)))
                    {
                        Po poexport = new Po
                        {
                            Header = new PoHeader("Lord Of Magna Maiden Heaven", "*****@*****.**", "es")
                            {
                                LanguageTeam = "Glowtranslations",
                            }
                        };
                        magic = reader.ReadInt32();
                        count = reader.ReadInt32();
                        Console.WriteLine("Exporting...");
                        for (i = 0; i < count; i++)
                        {
                            size     = reader.ReadInt32();
                            position = reader.ReadInt32();
                            stringsizes.Add(size);
                            stringpositions.Add(position);
                        }
                        for (i = 0; i < count; i++)
                        {
                            reader.BaseStream.Position = stringpositions[i];     //El puto flan
                            byte[] array = reader.ReadBytes(stringsizes[i]);
                            result = Encoding.Unicode.GetString(array);
                            result = result.Replace("\r", "");
                            if (string.IsNullOrEmpty(result))
                            {
                                result = "<!empty>";
                            }
                            poexport.Add(new PoEntry(result)
                            {
                                Context = i.ToString()
                            });
                        }
                        poexport.ConvertTo <BinaryFormat>().Stream.WriteTo(args[1] + ".po");
                        Console.WriteLine("The file is exported.");
                    }
                    break;

                case "-exportrune":
                    using (BinaryReader reader = new BinaryReader(File.Open(args[1], FileMode.Open)))
                    {
                        Po poexport = new Po
                        {
                            Header = new PoHeader("Rune Factory 4", "*****@*****.**", "es")
                            {
                                LanguageTeam = "Glowtranslations",
                            }
                        };
                        magic = reader.ReadInt32();
                        count = reader.ReadInt32();
                        Console.WriteLine("Exporting...");
                        for (i = 0; i < count; i++)
                        {
                            size     = reader.ReadInt32();
                            position = reader.ReadInt32();
                            stringsizes.Add(size);
                            stringpositions.Add(position);
                        }
                        for (i = 0; i < count; i++)
                        {
                            reader.BaseStream.Position = stringpositions[i];     //El puto flan
                            byte[] array = reader.ReadBytes(stringsizes[i]);
                            result = Encoding.UTF8.GetString(array);
                            if (string.IsNullOrEmpty(result))
                            {
                                result = "<!empty>";
                            }
                            poexport.Add(new PoEntry(result)
                            {
                                Context = i.ToString()
                            });
                        }
                        poexport.ConvertTo <BinaryFormat>().Stream.WriteTo(args[1] + ".po");
                        Console.WriteLine("The file is exported.");
                    }
                    break;

                case "-exportrunefix":
                    using (BinaryReader reader = new BinaryReader(File.Open(args[1], FileMode.Open)))
                    {
                        Po poexport = new Po
                        {
                            Header = new PoHeader("Rune Factory 4", "*****@*****.**", "es")
                            {
                                LanguageTeam = "Glowtranslations",
                            }
                        };
                        magic = reader.ReadInt32();
                        count = reader.ReadInt32();
                        Console.WriteLine("Exporting...");
                        for (i = 0; i < count; i++)
                        {
                            size     = reader.ReadInt32();
                            position = reader.ReadInt32();
                            stringsizes.Add(size);
                            stringpositions.Add(position);
                        }
                        for (i = 0; i < count; i++)
                        {
                            reader.BaseStream.Position = stringpositions[i];     //El puto flan
                            byte[] array = reader.ReadBytes(stringsizes[i]);
                            result = Encoding.UTF8.GetString(array);
                            result = result.Replace("\r", "");
                            if (string.IsNullOrEmpty(result))
                            {
                                result = "<!empty>";
                            }
                            poexport.Add(new PoEntry(result)
                            {
                                Context = i.ToString()
                            });
                        }
                        poexport.ConvertTo <BinaryFormat>().Stream.WriteTo(args[1] + ".po");
                        Console.WriteLine("The file is exported.");
                    }
                    break;

                case "-importlord":
                    DataStream   inputLord  = new DataStream(args[1], FileOpenMode.Read);
                    BinaryFormat binaryLord = new BinaryFormat(inputLord);
                    Po           poLord     = binaryLord.ConvertTo <Po>();
                    inputLord.Dispose();
                    Console.WriteLine("Importing...");
                    using (BinaryWriter writer = new BinaryWriter(File.Open(args[1] + ".exported", FileMode.Create)))
                    {
                        writer.Write(0x54584554);
                        writer.Write(poLord.Entries.Count);
                        for (i = 0; i < poLord.Entries.Count * 2; i++)
                        {
                            writer.Write(0x00000000);
                        }
                        foreach (var entry in poLord.Entries)
                        {
                            string potext = string.IsNullOrEmpty(entry.Translated) ?
                                            entry.Original : entry.Translated;
                            if (potext == "<!empty>")
                            {
                                potext = string.Empty;
                            }
                            stringpositions.Add((int)writer.BaseStream.Position);
                            byte[] stringtext = Encoding.Unicode.GetBytes(potext += "\0");
                            textsize = stringtext.Length;
                            stringsizes.Add(textsize);
                            writer.Write(stringtext);
                        }
                        writer.BaseStream.Position = 0x8;
                        int countposition = 0x8 * poLord.Entries.Count + 1;
                        for (i = 0; i < poLord.Entries.Count; i++)
                        {
                            writer.Write(stringsizes[i] - 2);
                            writer.Write(stringpositions[i]);
                        }
                        Console.WriteLine("The file is imported.");
                    }
                    break;

                case "-importrune":
                    Console.WriteLine("Importing...");
                    DataStream   input  = new DataStream(args[1], FileOpenMode.Read);
                    BinaryFormat binary = new BinaryFormat(input);
                    Po           po     = binary.ConvertTo <Po>();
                    input.Dispose();
                    using (BinaryWriter writer = new BinaryWriter(File.Open(args[1] + ".exported", FileMode.Create)))
                    {
                        writer.Write(0x54584554);
                        writer.Write(po.Entries.Count);
                        for (i = 0; i < po.Entries.Count * 2; i++)
                        {
                            writer.Write(0x00000000);
                        }
                        foreach (var entry in po.Entries)
                        {
                            string potext = string.IsNullOrEmpty(entry.Translated) ?
                                            entry.Original : entry.Translated;
                            if (potext == "<!empty>")
                            {
                                potext = string.Empty;
                            }
                            stringpositions.Add((int)writer.BaseStream.Position);
                            byte[] stringtext = Encoding.UTF8.GetBytes(potext += "\0");
                            textsize = stringtext.Length;
                            stringsizes.Add(textsize);
                            writer.Write(stringtext);
                        }
                        writer.BaseStream.Position = 0x8;
                        int countposition = 0x8 * po.Entries.Count + 1;
                        for (i = 0; i < po.Entries.Count; i++)
                        {
                            writer.Write(stringsizes[i] - 1);
                            writer.Write(stringpositions[i]);
                        }
                        Console.WriteLine("The file is imported.");
                    }
                    break;

                case "-transrune":
                    using (BinaryReader reader = new BinaryReader(File.Open(args[2], FileMode.Open)))
                    {
                        Console.WriteLine("Importing old translation...");
                        magic = reader.ReadInt32();
                        count = reader.ReadInt32();
                        for (i = 0; i < count; i++)
                        {
                            size     = reader.ReadInt32();
                            position = reader.ReadInt32();
                            stringsizes.Add(size);
                            stringpositions.Add(position);
                        }
                        for (i = 0; i < count; i++)
                        {
                            reader.BaseStream.Position = stringpositions[i];     //El puto flan
                            byte[] array = reader.ReadBytes(stringsizes[i]);
                            result = Encoding.UTF8.GetString(array);
                            Filestrings.Add(result);
                        }
                    }
                    Console.WriteLine("Old translation preloaded.");
                    DataStream   inputimp  = new DataStream(args[1], FileOpenMode.Read);
                    BinaryFormat binaryimp = new BinaryFormat(inputimp);
                    Po           poimp     = binaryimp.ConvertTo <Po>();
                    inputimp.Dispose();
                    Console.WriteLine("Importing original translation...");
                    foreach (var entry in poimp.Entries)
                    {
                        Postrings.Add(entry.Original);
                    }
                    Console.WriteLine("Original text preloaded.");
                    Po poexport1 = new Po
                    {
                        Header = new PoHeader("Rune Factory 4", "*****@*****.**", "es")
                        {
                            LanguageTeam = "Glowtranslations",
                        }
                    };
                    for (i = 0; i < count; i++)
                    {
                        PoEntry entry = new PoEntry();
                        Console.WriteLine("Checking and comparing line " + i + " from " + count + " lines");
                        if (string.IsNullOrEmpty(Filestrings[i]))
                        {
                            Filestrings[i] = "<!empty>";
                        }
                        if (Filestrings[i] == Postrings[i])
                        {
                            entry.Context  = i.ToString();
                            entry.Original = Postrings[i];
                        }
                        else
                        {
                            entry.Context    = i.ToString();
                            entry.Translated = Filestrings[i];
                            entry.Original   = Postrings[i];
                        }
                        poexport1.Add(entry);
                        //poexport1.ConvertTo<BinaryFormat>().Stream.WriteTo(args[1] + "(exported)" + ".po"); //Pasta code
                    }
                    using (var poStream = poexport1.ConvertTo <BinaryFormat>())
                        poStream.Stream.WriteTo(args[1] + "(exported).po");     //Thanks pleonex
                    Console.WriteLine("Finished.");
                    break;

                case "-translord":
                    using (BinaryReader reader = new BinaryReader(File.Open(args[2], FileMode.Open)))
                    {
                        Console.WriteLine("Importing old translation...");
                        magic = reader.ReadInt32();
                        count = reader.ReadInt32();
                        for (i = 0; i < count; i++)
                        {
                            size     = reader.ReadInt32();
                            position = reader.ReadInt32();
                            stringsizes.Add(size);
                            stringpositions.Add(position);
                        }
                        for (i = 0; i < count; i++)
                        {
                            reader.BaseStream.Position = stringpositions[i];     //El puto flan
                            byte[] array = reader.ReadBytes(stringsizes[i]);
                            result = Encoding.Unicode.GetString(array);
                            Filestrings.Add(result);
                        }
                    }
                    Console.WriteLine("Old translation preloaded.");
                    DataStream   inputimp1  = new DataStream(args[1], FileOpenMode.Read);
                    BinaryFormat binaryimp1 = new BinaryFormat(inputimp1);
                    Po           poimp1     = binaryimp1.ConvertTo <Po>();
                    inputimp1.Dispose();
                    Console.WriteLine("Importing original translation...");
                    foreach (var entry in poimp1.Entries)
                    {
                        Postrings.Add(entry.Original);
                    }
                    Console.WriteLine("Original text preloaded.");
                    Po poexport2 = new Po
                    {
                        Header = new PoHeader("Rune Factory 4", "*****@*****.**", "es")
                        {
                            LanguageTeam = "Glowtranslations",
                        }
                    };
                    for (i = 0; i < count; i++)
                    {
                        PoEntry entrada = new PoEntry();
                        Console.WriteLine("Checking and comparing line " + i + " from " + count + " lines");
                        if (string.IsNullOrEmpty(Filestrings[i]))
                        {
                            Filestrings[i] = "<!empty>";
                        }
                        if (Filestrings[i] == Postrings[i])
                        {
                            entrada.Context  = i.ToString();
                            entrada.Original = Postrings[i];
                        }
                        else
                        {
                            entrada.Context    = i.ToString();
                            entrada.Translated = Filestrings[i];
                            entrada.Original   = Postrings[i];
                        }
                        poexport2.Add(entrada);
                    }
                    //poexport2.ConvertTo<BinaryFormat>().Stream.WriteTo(args[1] + "(exported)" + ".po"); //Pasta code
                    using (var poStream = poexport2.ConvertTo <BinaryFormat>())
                        poStream.Stream.WriteTo(args[1] + "(exported).po");     //Thanks pleonex
                    Console.WriteLine("Finished.");
                    break;
                }
            }
        }
예제 #30
0
        public FrustumShader(Device device)
        {
            // create single vertex buffer
            var stream = new DataStream(24 * VertexPosition.SizeInBytes, true, true);
            stream.Write(new Vector4(-1, -1, 0, 1));
            stream.Write(new Vector4( 1, -1, 0, 1));
            stream.Write(new Vector4( 1, -1, 0, 1));
            stream.Write(new Vector4( 1,  1, 0, 1));
            stream.Write(new Vector4( 1,  1, 0, 1));
            stream.Write(new Vector4(-1,  1, 0, 1));
            stream.Write(new Vector4(-1,  1, 0, 1));
            stream.Write(new Vector4(-1, -1, 0, 1));

            stream.Write(new Vector4(-1, -1, maxZ, 1));
            stream.Write(new Vector4( 1, -1, maxZ, 1));
            stream.Write(new Vector4( 1, -1, maxZ, 1));
            stream.Write(new Vector4( 1,  1, maxZ, 1));
            stream.Write(new Vector4( 1,  1, maxZ, 1));
            stream.Write(new Vector4(-1,  1, maxZ, 1));
            stream.Write(new Vector4(-1,  1, maxZ, 1));
            stream.Write(new Vector4(-1, -1, maxZ, 1));

            stream.Write(new Vector4(-1, -1, 0, 1));
            stream.Write(new Vector4(-1, -1, maxZ, 1));
            stream.Write(new Vector4( 1, -1, 0, 1));
            stream.Write(new Vector4( 1, -1, maxZ, 1));
            stream.Write(new Vector4( 1,  1, 0, 1));
            stream.Write(new Vector4( 1,  1, maxZ, 1));
            stream.Write(new Vector4(-1,  1, 0, 1));
            stream.Write(new Vector4(-1,  1, maxZ, 1));
            stream.Position = 0;

            var vertexBufferDesc = new BufferDescription()
            {
                BindFlags = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                Usage = ResourceUsage.Default,
                SizeInBytes = 24 * VertexPosition.SizeInBytes,
            };
            vertexBuffer = new SharpDX.Direct3D11.Buffer(device, stream, vertexBufferDesc);

            stream.Dispose();

            vertexBufferBinding = new VertexBufferBinding(vertexBuffer, VertexPosition.SizeInBytes, 0);

            shaderByteCode = new ShaderBytecode(File.ReadAllBytes("Content/frustumVS.cso"));
            frustumVS = new VertexShader(device, shaderByteCode);
            frustumPS = new PixelShader(device, new ShaderBytecode(File.ReadAllBytes("Content/frustumPS.cso")));

            // depth stencil state
            var depthStencilStateDesc = new DepthStencilStateDescription()
            {
                IsDepthEnabled = true,
                DepthWriteMask = DepthWriteMask.All,
                DepthComparison = Comparison.LessEqual,
                IsStencilEnabled = false,
            };
            depthStencilState = new DepthStencilState(device, depthStencilStateDesc);

            // rasterizer state
            var rasterizerStateDesc = new RasterizerStateDescription()
            {
                CullMode = CullMode.None,
                FillMode = FillMode.Wireframe,
                IsDepthClipEnabled = true,
                IsFrontCounterClockwise = true,
                IsMultisampleEnabled = true,
            };
            rasterizerState = new RasterizerState(device, rasterizerStateDesc);

            // constant buffer
            var VSConstantBufferDesc = new BufferDescription()
            {
                Usage = ResourceUsage.Dynamic,
                BindFlags = BindFlags.ConstantBuffer,
                SizeInBytes = VSConstantBuffer.size,
                CpuAccessFlags = CpuAccessFlags.Write,
                StructureByteStride = 0,
                OptionFlags = 0,
            };
            vertexShaderConstantBuffer = new SharpDX.Direct3D11.Buffer(device, VSConstantBufferDesc);

            // Pixel shader constant buffer
            var PSConstantBufferDesc = new BufferDescription()
            {
                Usage = ResourceUsage.Dynamic,
                BindFlags = BindFlags.ConstantBuffer,
                SizeInBytes = PSConstantBuffer.size,
                CpuAccessFlags = CpuAccessFlags.Write,
                StructureByteStride = 0,
                OptionFlags = 0,
            };
            pixelShaderConstantBuffer = new SharpDX.Direct3D11.Buffer(device, PSConstantBufferDesc);

            vertexInputLayout = new InputLayout(device, shaderByteCode.Data, new[]
            {
                new InputElement("SV_POSITION", 0, Format.R32G32B32A32_Float, 0, 0),
            });
        }
예제 #31
0
        public DX11IndexedGeometry Grid(Vector2 size, int resX, int resY)
        {
            DX11IndexedGeometry geom = new DX11IndexedGeometry(context);

            DataStream ds = new DataStream(resX * resY * Pos4Norm3Tex2Vertex.VertexSize, true, true);
            ds.Position = 0;

            float sx = 0.5f * size.X;
            float sy = 0.5f * size.Y;

            float ix = (sx / Convert.ToSingle(resX - 1)) * 2.0f;
            float iy = (sy / Convert.ToSingle(resY - 1)) * 2.0f;

            float y = -sy;

            Pos4Norm3Tex2Vertex v = new Pos4Norm3Tex2Vertex();
            v.Normals = new Vector3(0, 0, -1.0f);

            for (int i = 0; i < resY; i++)
            {
                float x = -sx;
                for (int j = 0; j < resX; j++)
                {
                    v.Position = new Vector4(x, y, 0.0f, 1.0f);
                    v.TexCoords.X = Convert.ToSingle(Map((float)j, 0.0f, resX - 1, 0.0f, 1.0f));
                    v.TexCoords.Y = Convert.ToSingle(Map((float)i, 0.0f, resY - 1, 1.0f, 0.0f));
                    x += ix;

                    ds.Write<Pos4Norm3Tex2Vertex>(v);
                }
                y += iy;
            }

            ds.Position = 0;

            var vertices = new SlimDX.Direct3D11.Buffer(context.Device, ds, new BufferDescription()
            {
                BindFlags = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags = ResourceOptionFlags.None,
                SizeInBytes = (int)ds.Length,
                Usage = ResourceUsage.Default
            });

            ds.Dispose();

            List<int> indlist = new List<int>();
            for (int j = 0; j < resY - 1; j++)
            {
                int rowlow = (j * resX);
                int rowup = ((j + 1) * resX);
                for (int i = 0; i < resX - 1; i++)
                {

                    int col = i * (resX - 1);

                    indlist.Add(0 + rowlow + i);
                    indlist.Add(0 + rowup + i);
                    indlist.Add(1 + rowlow + i);

                    indlist.Add(1 + rowlow + i);
                    indlist.Add(0 + rowup + i);
                    indlist.Add(1 + rowup + i);
                }
            }

            var indexstream = new DataStream(indlist.Count * 4, true, true);
            indexstream.WriteRange(indlist.ToArray());
            indexstream.Position = 0;

            geom.VertexBuffer = vertices;
            geom.IndexBuffer = new DX11IndexBuffer(context, indexstream, false, true);
            geom.InputLayout = Pos4Norm3Tex2Vertex.Layout;
            geom.Topology = PrimitiveTopology.TriangleList;
            geom.VerticesCount = resX * resY;
            geom.VertexSize = Pos4Norm3Tex2Vertex.VertexSize;

            geom.HasBoundingBox = true;
            geom.BoundingBox = new BoundingBox(new Vector3(-sx, -sy, 0.0f), new Vector3(sx, sy, 0.0f));

            return geom;
        }
예제 #32
0
 public void Dispose()
 {
     DataStream?.Dispose();
 }
        public static SharpDX.Direct3D11.Buffer CreateVertexBuffer(Device device, RoomAliveToolkit.Kinect2Calibration kinect2Calibration)
        {
            // generate depthFrameToCameraSpace table
            var depthFrameToCameraSpaceTable = kinect2Calibration.ComputeDepthFrameToCameraSpaceTable(Kinect2Calibration.depthImageWidth, Kinect2Calibration.depthImageHeight);

            int numVertices = 6 * (Kinect2Calibration.depthImageWidth - 1) * (Kinect2Calibration.depthImageHeight - 1);
            var vertices = new VertexPosition[numVertices];

            Int3[] quadOffsets = new Int3[]
            {
                new Int3(0, 0, 0),
                new Int3(1, 0, 0),
                new Int3(0, 1, 0),
                new Int3(1, 0, 0),
                new Int3(1, 1, 0),
                new Int3(0, 1, 0),
            };

            int vertexIndex = 0;
            for (int y = 0; y < Kinect2Calibration.depthImageHeight - 1; y++)
                for (int x = 0; x < Kinect2Calibration.depthImageWidth - 1; x++)
                    for (int i = 0; i < 6; i++)
                    {
                        int vertexX = x + quadOffsets[i].X;
                        int vertexY = y + quadOffsets[i].Y;

                        var point = depthFrameToCameraSpaceTable[Kinect2Calibration.depthImageWidth * vertexY + vertexX];

                        var vertex = new VertexPosition();
                        vertex.position = new SharpDX.Vector4(point.X, point.Y, vertexX, vertexY);
                        vertices[vertexIndex++] = vertex;
                    }

            var stream = new DataStream(numVertices * VertexPosition.SizeInBytes, true, true);
            stream.WriteRange(vertices);
            stream.Position = 0;

            var vertexBufferDesc = new BufferDescription()
            {
                BindFlags = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                Usage = ResourceUsage.Default,
                SizeInBytes = numVertices * VertexPosition.SizeInBytes,
            };
            var vertexBuffer = new SharpDX.Direct3D11.Buffer(device, stream, vertexBufferDesc);

            stream.Dispose();

            return vertexBuffer;
        }
예제 #34
0
        public void TestDirectX11SpecaterCamera()
        {
            var keyboard = new SlimDXTWKeyboard();
            var dev      = new SlimDX.DirectInput.DirectInput();
            var kb       = new SlimDX.DirectInput.Keyboard(dev);

            kb.Acquire();

            var mouse = new TWMouse();
            var m     = new SlimDX.DirectInput.Mouse(dev);

            m.Acquire();



            var game = new DX11Form();

            game.InitDirectX();
            var device    = game.Device;
            var bytecode  = ShaderBytecode.CompileFromFile("../../Common.Core/Shaders/MiniTri.fx", "fx_5_0", ShaderFlags.None, EffectFlags.None);
            var effect    = new Effect(device, bytecode);
            var technique = effect.GetTechniqueByName("RenderTransform");
            var pass      = technique.GetPassByIndex(0);
            var layout    = new InputLayout(device, pass.Description.Signature,
                                            new[] {
                new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0),
                new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0),
                new InputElement("TEXCOORD", 0, Format.R32G32_Float, 32, 0)
            });

            var vertexStride = (16 + 16 + 8);
            var stream       = new DataStream(3 * vertexStride, true, true);

            stream.WriteRange(new[] {
                new VertexCustom(new Vector4(-1.0f, 0, 0, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), new Vector2(0.5f, 0)),
                new VertexCustom(new Vector4(0f, 1f, 0, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), new Vector2(0f, 1f)),
                new VertexCustom(new Vector4(1f, 0f, 0, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), new Vector2(1f, 1f))
            });
            stream.Position = 0;



            var vertices = new SlimDX.Direct3D11.Buffer(device, stream, new BufferDescription()
            {
                BindFlags      = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags    = ResourceOptionFlags.None,
                SizeInBytes    = 3 * vertexStride,
                Usage          = ResourceUsage.Default
            });

            stream.Dispose();

            //var world = Matrix.Translation(MathHelper.Forward);

            /*var viewProjection = Matrix.LookAtRH(Vector3.UnitZ * 5, -Vector3.UnitZ, MathHelper.Up)
             * Matrix.PerspectiveFovRH(MathHelper.PiOver4, 4f / 3f, 0.1f, 1000f);*/


            var diffuseShaderVariable = effect.GetVariableByName("txDiffuse").AsResource();
            var worldParam            = effect.GetVariableByName("world").AsMatrix();
            //worldParam.AsMatrix().SetMatrix(world);


            var viewProjParam = effect.GetVariableBySemantic("viewprojection").AsMatrix();

            /*viewProjParam.SetMatrix(
             *  viewProjection);*/

            //worldParam.SetMatrix(Matrix.Identity);
            //effect.GetVariableBySemantic("viewprojection").AsMatrix().SetMatrix(Matrix.Identity);

            var texturePath = Wallpaper001_png;

            var diffuseTexture = Texture2D.FromFile(device, texturePath);

            var diffuseTextureRv = new ShaderResourceView(device, diffuseTexture);


            diffuseShaderVariable.SetResource(diffuseTextureRv);


            var rasterizerState = RasterizerState.FromDescription(device, new RasterizerStateDescription()
            {
                CullMode = CullMode.None,
                FillMode = FillMode.Solid
            });

            device.ImmediateContext.Rasterizer.State = rasterizerState;


            var cam = new SpectaterCamera();

            game.GameLoopEvent += delegate
            {
                mouse.UpdateMouseState(m.GetCurrentState());
                keyboard.UpdateKeyboardState(kb.GetCurrentState());
                cam.Update(0.001f, keyboard, mouse);

                device.ImmediateContext.InputAssembler.InputLayout       = layout;
                device.ImmediateContext.InputAssembler.PrimitiveTopology =
                    PrimitiveTopology.TriangleList;
                device.ImmediateContext.InputAssembler.SetVertexBuffers(0,
                                                                        new VertexBufferBinding
                                                                            (vertices,
                                                                            vertexStride, 0));

                for (int i = 0; i < technique.Description.PassCount; ++i)
                {
                    pass.Apply(device.ImmediateContext);
                    device.ImmediateContext.Draw(3, 0);
                }

                viewProjParam.SetMatrix(cam.ViewProjection);
                worldParam.SetMatrix(Matrix.Identity);
                if (keyboard.IsKeyDown(Key.Escape))
                {
                    game.Exit();
                }
            };

            game.Run();

            bytecode.Dispose();
            effect.Dispose();
            layout.Dispose();
            vertices.Dispose();
            diffuseTexture.Dispose();
            diffuseTextureRv.Dispose();
            rasterizerState.Dispose();
            kb.Dispose();
            m.Dispose();
            dev.Dispose();
        }
예제 #35
0
파일: DXScene.cs 프로젝트: KFlaga/Cam3D
        void RenderNode(DeviceContext device, DXSceneNode node, Matrix derivedTrnasform)
        {
            Matrix transform = node.TransformationMatrix * derivedTrnasform;

            if(node.AttachedObjects.Count > 0)
            {
                transform.Transpose();

                DataStream stream;
                var dataBox = device.MapSubresource(_transformBuffer, 0, MapMode.WriteDiscard, MapFlags.None);
                stream = new DataStream(dataBox.DataPointer, _transformBuffer.Description.SizeInBytes, true, true);
                stream.Write(transform);
                device.UnmapSubresource(_transformBuffer, 0); //to update the data on GPU
                stream.Dispose();

                transform.Transpose();

                device.VertexShader.SetConstantBuffer((int)ConstantBufferSlots.WorldViewProjMatrix, _transformBuffer);

                foreach(var model in node.AttachedObjects)
                {
                    model.Shader.RenderFirstPass(device);
                    model.Render(device);

                    for(int i = 1; i < model.Shader.Passes.Count; ++i)
                    {
                        model.Shader.RenderPass(device, i);
                        model.Render(device);
                    }
                }
            }

            foreach(var childNode in node.Children)
            {
                RenderNode(device, childNode, transform);
            }
        }
예제 #36
0
        /// <summary>
        /// Renders the bounding box for debugging purposes.
        /// </summary>
        /// <param name="box">The box to render.</param>
        /// <param name="graphicsDevice">The graphics device to use when rendering.</param>
        /// <param name="view">The current view matrix.</param>
        /// <param name="projection">The current projection matrix.</param>
        /// <param name="color">The color to use for drawing the lines of the box.</param>
        public static void Render(
            BoundingBox box,
            Device graphicsDevice,
            Matrix world,
            Matrix view,
            Matrix projection,
            Color4 color)
        {
            if (effect == null)
            {
                effect = Ressources.EffectCache.Get("Shaders\\basic_effect.fx");
                vertexBuffer = new Buffer(Scene.GetGraphicsDevice(), 8 * sizeof(float) * 4, ResourceUsage.Dynamic, BindFlags.VertexBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0);
                /*
                 *
            vBuffer = new SlimDX.Direct3D11.Buffer(Scene.GetGraphicsDevice(), vBuffStream, new BufferDescription()
            {
                BindFlags = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags = ResourceOptionFlags.None,
                SizeInBytes = (int)vBuffStream.Length,
                Usage = ResourceUsage.Default
            });*/

                DataStream stream = new DataStream(sizeof(int) * indices.Length, false, true);
                stream.WriteRange<int>(indices);
                stream.Position = 0;
                indexBuffer = new SlimDX.Direct3D11.Buffer(Scene.GetGraphicsDevice(), stream, new BufferDescription()
                {
                    BindFlags = BindFlags.IndexBuffer,
                    CpuAccessFlags = CpuAccessFlags.None,
                    OptionFlags = ResourceOptionFlags.None,
                    SizeInBytes = (int)stream.Length,
                    Usage = ResourceUsage.Default
                });
                stream.Dispose();
                var sign = effect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature;
                inLayout = new InputLayout(
                    Scene.GetGraphicsDevice(),
                    effect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature,
                    new InputElement[] {
                        new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0)
                    });
            }
            effect.GetVariableByName("xColor").AsVector().Set(color);

            Vector3[] corners = box.GetCorners();

            for (int i = 0; i < 8; i++)
            {
                verts[i] = new Vector4(corners[i], 1.0f);
            }

            var data = Scene.GetGraphicsDevice().ImmediateContext.MapSubresource(vertexBuffer, 0,  MapMode.WriteDiscard, SlimDX.Direct3D11.MapFlags.None);
            data.Data.WriteRange(verts);
            Scene.GetGraphicsDevice().ImmediateContext.UnmapSubresource(vertexBuffer, 0);

            Scene.GetGraphicsDevice().ImmediateContext.InputAssembler.InputLayout = inLayout;
            Scene.GetGraphicsDevice().ImmediateContext.InputAssembler.SetIndexBuffer(indexBuffer, Format.R32_UInt, 0);
            Scene.GetGraphicsDevice().ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertexBuffer, 16, 0));
            Scene.GetGraphicsDevice().ImmediateContext.InputAssembler.PrimitiveTopology = (PrimitiveTopology.LineList);

            effect.GetVariableByName("World").AsMatrix().SetMatrix(world);
            effect.GetVariableByName("View").AsMatrix().SetMatrix(view);
            effect.GetVariableByName("Projection").AsMatrix().SetMatrix(projection);

            for (int i = 0; i < effect.GetTechniqueByIndex(0).Description.PassCount; i++)
            {
                effect.GetTechniqueByIndex(0).GetPassByIndex(i).Apply(Scene.GetGraphicsDevice().ImmediateContext);
                Scene.GetGraphicsDevice().ImmediateContext.DrawIndexed(indexBuffer.Description.SizeInBytes / sizeof(int), 0, 0);
            }
        }
        public DX11IndexedGeometry RoundRect(Vector2 inner, float outer, int ires)
        {
            DX11IndexedGeometry geom = new DX11IndexedGeometry(context);
            List<Pos4Norm3Tex2Vertex> vl = new List<Pos4Norm3Tex2Vertex>();
            List<int> il = new List<int>();

            int idx = 0;

            float ucy = Convert.ToSingle(inner.Y + outer);
            float ucx = Convert.ToSingle(inner.X + outer);

            float mx = ucx * 2.0f;
            float my = ucy * 2.0f;

            //Need 1 quad for center
            idx = SetQuad(vl, il, 0.0f, 0.0f, inner.X, inner.Y, idx, mx, my);

            //Need 2 quads up/down
            idx = SetQuad(vl, il, 0.0f, ucy, inner.X, (float)outer, idx, mx, my);
            idx = SetQuad(vl, il, 0.0f, -ucy, inner.X, (float)outer, idx, mx, my);

            //Need 2 quads left/right
            idx = SetQuad(vl, il, -ucx, 0.0f, (float)outer, inner.Y, idx, mx, my);
            idx = SetQuad(vl, il, ucx, 0.0f, (float)outer, inner.Y, idx, mx, my);

            float radius = (float)outer * 2.0f;

            //Add the 4 corners
            idx = SetSegment(vl, il, inner.X, inner.Y, 0.0f, radius, ires, idx, mx, my);
            idx = SetSegment(vl, il, -inner.X, inner.Y, 0.25f, radius, ires, idx, mx, my);
            idx = SetSegment(vl, il, -inner.X, -inner.Y, 0.5f, radius, ires, idx, mx, my);
            idx = SetSegment(vl, il, inner.X, -inner.Y, 0.75f, radius, ires, idx, mx, my);

            DataStream ds = new DataStream(vl.Count * Pos4Norm3Tex2Vertex.VertexSize, true, true);
            ds.Position = 0;
            ds.WriteRange(vl.ToArray());
            ds.Position = 0;

            var vbuffer = new SlimDX.Direct3D11.Buffer(context.Device, ds, new BufferDescription()
            {
                BindFlags = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags = ResourceOptionFlags.None,
                SizeInBytes = (int)ds.Length,
                Usage = ResourceUsage.Default
            });

            ds.Dispose();

            var indexstream = new DataStream(il.Count * 4, true, true);
            indexstream.WriteRange(il.ToArray());
            indexstream.Position = 0;

            geom.VertexBuffer = vbuffer;
            geom.IndexBuffer = new DX11IndexBuffer(context, indexstream, false, true);
            geom.InputLayout = Pos4Norm3Tex2Vertex.Layout;
            geom.Topology = PrimitiveTopology.TriangleList;
            geom.VerticesCount = vl.Count;
            geom.VertexSize = Pos4Norm3Tex2Vertex.VertexSize;

            geom.HasBoundingBox = false;

            return geom;
        }
예제 #38
0
        public void Render(Device device, EEDCamera Camera, ShaderResourceView DepthMap)
        {
            var vertices = new DataStream(BytesPerVertex * VertexsCount, true, true);

            vertices.Write(Conversion.ToVector3(Position - Camera.position));
            vertices.Write(new Half2(50, 50));
            vertices.Write(new Half4(0, 0, 1, 1));
            vertices.Write(new Half4(0, 0, 1, 1));
            vertices.Position = 0;

            DataStream stream;
            device.ImmediateContext.MapSubresource(Vertexs, MapMode.WriteDiscard, SharpDX.Direct3D11.MapFlags.None, out stream);
            stream.Position = 0;
            stream.WriteRange(vertices.DataPointer, vertices.Length);
            device.ImmediateContext.UnmapSubresource(Vertexs, 0);
            stream.Dispose();
            vertices.Dispose();
            binding = new VertexBufferBinding(Vertexs, BytesPerVertex, 0);

            constants.FarPlane = new Vector4(Camera.farClip,0,0,0);
            constants.VP = Matrix.Transpose(Camera.viewProjectionMatrix);
            var dataBox = ModelViewer.Program.device.ImmediateContext.MapSubresource(constantsBuffer, 0, MapMode.WriteDiscard, SharpDX.Direct3D11.MapFlags.None);
            Utilities.Write(dataBox.DataPointer, ref constants);
            ModelViewer.Program.device.ImmediateContext.UnmapSubresource(constantsBuffer, 0);

            device.ImmediateContext.InputAssembler.InputLayout = EEEM.layout;
            device.ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.PointList;
            device.ImmediateContext.InputAssembler.SetVertexBuffers(0, binding);

            EEEM.renderTechniques[0].GetPassByIndex(0).Apply(device.ImmediateContext);

            device.ImmediateContext.PixelShader.SetShaderResource(0, TexCont.TextureResource);
            device.ImmediateContext.PixelShader.SetSampler(0, DrawHelper.SamplAnsWrapMip);

            //device.ImmediateContext.PixelShader.SetShaderResource(1, DepthMap);
            device.ImmediateContext.VertexShader.SetShaderResource(1, DepthMap);

            //Константный буффер передается шейдерам
            device.ImmediateContext.VertexShader.SetConstantBuffer(0, constantsBuffer);
            //device.ImmediateContext.PixelShader.SetConstantBuffer(0, constantsBuffer);

            device.ImmediateContext.Draw(VertexsCount, 0);
        }
예제 #39
0
        public ShaderResourceView ToTexture3D(Device graphicsDevice, Format format)
        {
            int sizeInBytes = sizeof(float) * width * height * depth;

            DataStream stream = new DataStream(sizeInBytes, true, true);
            for (int x = 0; x < width; x++)
                for (int y = 0; y < height; y++)
                    for (int z = 0; z < depth; z++)
                        stream.Write(values[x, y, z]);
            stream.Position = 0;

            DataBox dataBox = new DataBox(sizeof(float) * width, sizeof(float) * width * height, stream);
            Texture3DDescription description = new Texture3DDescription()
            {
                BindFlags = BindFlags.ShaderResource,
                CpuAccessFlags = CpuAccessFlags.None,
                Depth = depth,
                Format = format,
                Height = height,
                MipLevels = 1,
                OptionFlags = ResourceOptionFlags.None,
                Usage = ResourceUsage.Default,
                Width = width
            };
            Texture3D texture = new Texture3D(graphicsDevice, description, dataBox);

            stream.Dispose();

            return new ShaderResourceView(graphicsDevice, texture);
        }
예제 #40
0
        protected void InitOnce()
        {
            var shaderdeffile = Manager.Files.Get(@"Shaders\DeferredRendering.hlsl", false);
            var bbuffer = new byte[shaderdeffile.Length];
            shaderdeffile.Read(bbuffer,0, bbuffer.Length);
            shaderdeffile.Dispose();
            var bytecode = ShaderBytecode.Compile(bbuffer, "fx_5_0");
            bbuffer = null;
            _effect = new Effect(D3DDevice, bytecode);
            bytecode.Dispose();

            _composeTechnique = _effect.GetTechniqueByName("Compose");
            _composePass = _composeTechnique.GetPassByIndex(0);

            var vertices = new DataStream(20 * 4, true, true);
            vertices.Write(new Vector3(-1f, -1f, -1f));
            vertices.Write(new Vector2(0f,1f));
            vertices.Write(new Vector3(-1f, 1f, -1f));
            vertices.Write(new Vector2(0f, 0f));
            vertices.Write(new Vector3(1f, -1f, -1f));
            vertices.Write(new Vector2(1f, 1f));
            vertices.Write(new Vector3(1f, 1f, -1f));
            vertices.Write(new Vector2(1f, 0f));
            vertices.Position = 0;
            _composeVertices = new Buffer(D3DDevice, vertices, 20 * 4, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
            _composeVerticesBB = new VertexBufferBinding(_composeVertices, 20, 0);
            vertices.Dispose();
            _composeLayout = new InputLayout(D3DDevice, _composePass.Description.Signature, new[] { new InputElement("POSITION", 0, Format.R32G32B32_Float, 0), new InputElement("TEXCOORD", 0, Format.R32G32_Float, 0) });
            var sampleMode = SamplerState.FromDescription(D3DDevice, new SamplerDescription()
            {
                AddressU = TextureAddressMode.Clamp,
                AddressV = TextureAddressMode.Clamp,
                AddressW = TextureAddressMode.Clamp,
                BorderColor = new Color4(0, 0, 0, 0),
                Filter = Filter.MinLinearMagMipPoint,
                ComparisonFunction = Comparison.Always,
                MipLodBias = 0f,
                MaximumAnisotropy = 8,
                MinimumLod = 0f,
                MaximumLod = float.MaxValue
            });
            _effect.GetVariableByName("composeSampler").AsSampler().SetSamplerState(0, sampleMode);
            sampleMode.Dispose();
            _effect.GetVariableByName("composeFlags").AsScalar().Set(
                Manager.Opts.Get<bool>("rndr_rawGBufferView")?0x1:0
                );

            NotifyHandlers.Add(Manager.Opts.RegisterChangeNotification("rndr_rawGBufferView", delegate(string key, object value)
            {
                Output.BeginInvoke((Action)delegate
                {
                    if ((bool)value)
                        _effect.GetVariableByName("composeFlags").AsScalar().Set(_effect.GetVariableByName("composeFlags").AsScalar().GetInt() | 0x1);
                    else
                        _effect.GetVariableByName("composeFlags").AsScalar().Set(_effect.GetVariableByName("composeFlags").AsScalar().GetInt() & (int.MaxValue - 0x1));
                });
            }));

            NotifyHandlers.Add(Manager.Opts.RegisterChangeNotification("rndr_nearPlane", delegate {
                Output.BeginInvoke((Action)ResetDevice);
            }));
            NotifyHandlers.Add(Manager.Opts.RegisterChangeNotification("rndr_farPlane", delegate {
                Output.BeginInvoke((Action)ResetDevice);
            }));

            SceneRasterizer = RasterizerState.FromDescription(D3DDevice, new RasterizerStateDescription()
                                                                                      {
                                                                                          FillMode = (Manager.Opts.Get<bool>("rndr_wireframe") ? FillMode.Wireframe : FillMode.Solid),
                                                                                          CullMode = (Manager.Opts.Get<bool>("rndr_cull") ? CullMode.Back : CullMode.None)
                                                                                      });
            _composeRasterizer = RasterizerState.FromDescription(D3DDevice, new RasterizerStateDescription()
            {
                FillMode = FillMode.Solid,
                CullMode = CullMode.Back
            });

            var bsd = new BlendStateDescription();
            bsd.RenderTargets[0].BlendEnable = true;

            bsd.RenderTargets[0].SourceBlend = BlendOption.SourceAlpha;
            bsd.RenderTargets[0].DestinationBlend = BlendOption.InverseSourceAlpha;
            bsd.RenderTargets[0].BlendOperation = BlendOperation.Add;

            bsd.RenderTargets[0].SourceBlendAlpha = BlendOption.One;
            bsd.RenderTargets[0].DestinationBlendAlpha = BlendOption.Zero;
            bsd.RenderTargets[0].BlendOperationAlpha = BlendOperation.Add;
            bsd.RenderTargets[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;

            Context.OutputMerger.BlendState = BlendState.FromDescription(D3DDevice, bsd);

            NotifyHandlers.Add(Manager.Opts.RegisterChangeNotification("rndr_wireframe", delegate(string key, object value)
            {
                Output.BeginInvoke((Action)delegate {
                    var oldcullmode = CullMode.Back;
                    if (SceneRasterizer != null)
                    {
                        oldcullmode = SceneRasterizer.Description.CullMode;
                        SceneRasterizer.Dispose();
                    }
                    SceneRasterizer = RasterizerState.FromDescription(D3DDevice, new RasterizerStateDescription()
                    {
                        FillMode = (((bool)value) ? FillMode.Wireframe : FillMode.Solid),
                        CullMode = oldcullmode
                    });
                });
            }));
            NotifyHandlers.Add(Manager.Opts.RegisterChangeNotification("rndr_cull", delegate(string key, object value)
            {
                Output.BeginInvoke((Action)delegate
                {
                    var oldfillmode = FillMode.Solid;
                    if (SceneRasterizer != null)
                    {
                        oldfillmode = SceneRasterizer.Description.FillMode;
                        SceneRasterizer.Dispose();
                    }
                    SceneRasterizer = RasterizerState.FromDescription(D3DDevice, new RasterizerStateDescription()
                    {
                        FillMode =  oldfillmode,
                        CullMode = (((bool)value) ? CullMode.Back : CullMode.None)
                    });
                });
            }));

            Context.OutputMerger.DepthStencilState = DepthStencilState.FromDescription(D3DDevice, new DepthStencilStateDescription()
                                                                                                      {
                                                                                                          IsDepthEnabled = true,
                                                                                                          DepthWriteMask = DepthWriteMask.All,
                                                                                                          DepthComparison = Comparison.Less,
                                                                                                          IsStencilEnabled = false,
                                                                                                      });
            _camIncorporeal = Manager.Opts.Get<bool>("rndr_incorporeal");
            NotifyHandlers.Add(Manager.Opts.RegisterChangeNotification("rndr_incorporeal", delegate(string key, object value) { _camIncorporeal = (bool)value; }));

            ViewerLocation = new Vector3(-1, 1, -1);
            ViewerLookAt = new Vector3(0, 0, 0);
            ViewerUpVector = Vector3.UnitY;
            _camLocationIncorporeal = new Vector3(-1, 1, -1);
            _camLookAtIncorporeal = new Vector3(0, 0, 0);
            _camUpVectorIncorporeal = Vector3.UnitY;
            ViewerFrustum = new Frustum();
            _fpsTimer = new HTimer();
            _fpsRingbuffer = new double[60];
            _fpsRingbufferIndex = 0;
        }
예제 #41
0
 internal void Unmap()
 {
     context.UnmapSubresource(buffer, 0);
     stream.Dispose();
 }
예제 #42
0
        public DX11IndexedGeometry SegmentZ(SegmentZ settings)
        {
            int res = settings.Resolution;
            float cycles = settings.Cycles;
            float phase = settings.Phase;
            float inner = settings.InnerRadius;
            float z = settings.Z;

            DX11IndexedGeometry geom = new DX11IndexedGeometry(context);
            geom.Tag = settings;
            geom.PrimitiveType = settings.PrimitiveType;

            int vcount = res * 2;
            int icount = (res - 1) * 6;

            float inc = Convert.ToSingle((Math.PI * 2.0 * cycles) / (res - 1.0));
            float phi = Convert.ToSingle(phase * (Math.PI * 2.0));

            List<Pos4Norm3Tex2Vertex> vlist = new List<Pos4Norm3Tex2Vertex>();
            List<int> ilist = new List<int>();

            Pos4Norm3Tex2Vertex innerv = new Pos4Norm3Tex2Vertex();
            innerv.Normals = new Vector3(0.0f, 0.0f, 1.0f);

            Pos4Norm3Tex2Vertex outerv = new Pos4Norm3Tex2Vertex();
            outerv.Normals = new Vector3(0.0f, 0.0f, 1.0f);

            Pos4Norm3Tex2Vertex[] vertices = new Pos4Norm3Tex2Vertex[res * 2];

            #region Append front face
            for (int i = 0; i < res; i++)
            {
                float x = Convert.ToSingle(0.5 * inner * Math.Cos(phi));
                float y = Convert.ToSingle(0.5 * inner * Math.Sin(phi));

                innerv.Position = new Vector4(x, y, z, 1.0f);

                x = Convert.ToSingle(0.5 * Math.Cos(phi));
                y = Convert.ToSingle(0.5 * Math.Sin(phi));

                outerv.Position = new Vector4(x, y, z, 1.0f);

                vertices[i] = innerv;
                vertices[i + res] = outerv;
                phi += inc;
            }

            int indstep = 0;
            int[] indices = new int[icount];
            for (int i = 0; i < res - 1; i++)
            {
                //Triangle from low to high
                indices[indstep] = i;
                indices[indstep + 1] = res + i;
                indices[indstep + 2] = i + 1;


                //Triangle from high to low
                indices[indstep + 3] = i + 1;
                indices[indstep + 4] = res + i;
                indices[indstep + 5] = res + i + 1;

                indstep += 6;
            }

            vlist.AddRange(vertices);
            ilist.AddRange(indices);
            #endregion

            #region Append Back Face
            //Second layer just has Z inverted
            for (int i = 0; i < res * 2; i++)
            {
                vertices[i].Position.Z = -vertices[i].Position.Z;
                vertices[i].Normals.Z = -vertices[i].Normals.Z;
                phi += inc;
            }

            //Here we also flip triangles for cull
            indstep = 0;
            int offset = res * 2;
            for (int i = offset; i < offset + res - 1; i++)
            {
                //Triangle from low to high
                indices[indstep] = i;
                indices[indstep + 2] = res + i;
                indices[indstep + 1] = i + 1;


                //Triangle from high to low
                indices[indstep + 3] = i + 1;
                indices[indstep + 5] = res + i;
                indices[indstep + 4] = res + i + 1;

                indstep += 6;
            }

            vlist.AddRange(vertices);
            ilist.AddRange(indices);
            #endregion


            //We need to append new set of indices, as we want nice normals
            #region Append Outer
            phi = Convert.ToSingle(phase * (Math.PI * 2.0));
            for (int i = 0; i < res; i++)
            {
                float x = Convert.ToSingle(0.5 * Math.Cos(phi));
                float y = Convert.ToSingle(0.5 * Math.Sin(phi));

                innerv.Position = new Vector4(x, y, z, 1.0f);
                outerv.Position = new Vector4(x, y, -z, 1.0f);
                innerv.Normals = Vector3.Normalize(new Vector3(innerv.Position.X, innerv.Position.Y, 0.0f));
                outerv.Normals = Vector3.Normalize(new Vector3(innerv.Position.X, innerv.Position.Y, 0.0f));

                vertices[i] = innerv;
                vertices[i + res] = outerv;
                phi += inc;
            }

            indstep = 0;
            offset += (res * 2);
            for (int i = offset; i < offset + res - 1; i++)
            {
                //Triangle from low to high
                indices[indstep] = i;
                indices[indstep + 1] = res + i;
                indices[indstep + 2] = i + 1;


                //Triangle from high to low
                indices[indstep + 3] = i + 1;
                indices[indstep + 4] = res + i;
                indices[indstep + 5] = res + i + 1;

                indstep += 6;
            }

            vlist.AddRange(vertices);
            ilist.AddRange(indices);
            #endregion

            #region Append Inner
            phi = Convert.ToSingle(phase * (Math.PI * 2.0));
            for (int i = 0; i < res; i++)
            {
                float x = Convert.ToSingle(0.5 * inner * Math.Cos(phi));
                float y = Convert.ToSingle(0.5 * inner * Math.Sin(phi));

                innerv.Position = new Vector4(x, y, z, 1.0f);
                outerv.Position = new Vector4(x, y, -z, 1.0f);
                innerv.Normals = -Vector3.Normalize(new Vector3(innerv.Position.X, innerv.Position.Y, 0.0f));
                outerv.Normals = -Vector3.Normalize(new Vector3(innerv.Position.X, innerv.Position.Y, 0.0f));

                vertices[i] = innerv;
                vertices[i + res] = outerv;
                phi += inc;
            }

            indstep = 0;
            offset += (res * 2);
            for (int i = offset; i < offset + res - 1; i++)
            {
                //Triangle from low to high
                indices[indstep] = i;
                indices[indstep + 2] = res + i;
                indices[indstep + 1] = i + 1;


                //Triangle from high to low
                indices[indstep + 3] = i + 1;
                indices[indstep + 5] = res + i;
                indices[indstep + 4] = res + i + 1;

                indstep += 6;
            }

            vlist.AddRange(vertices);
            ilist.AddRange(indices);
            #endregion

            #region Append Border

            //Append border low (quad)
            phi = Convert.ToSingle(phase * (Math.PI * 2.0));
            float x2 = Convert.ToSingle(0.5 * inner * Math.Cos(phi));
            float y2 = Convert.ToSingle(0.5 * inner * Math.Sin(phi));

            float x3 = Convert.ToSingle(0.5 * Math.Cos(phi));
            float y3 = Convert.ToSingle(0.5 * Math.Sin(phi));

            Pos4Norm3Tex2Vertex q1 = new Pos4Norm3Tex2Vertex();
            Pos4Norm3Tex2Vertex q2 = new Pos4Norm3Tex2Vertex();
            Pos4Norm3Tex2Vertex q3 = new Pos4Norm3Tex2Vertex();
            Pos4Norm3Tex2Vertex q4 = new Pos4Norm3Tex2Vertex();

            q1.Position = new Vector4(x2, y2, z, 1.0f);
            q2.Position = new Vector4(x2, y2, -z, 1.0f);
            q3.Position = new Vector4(x3, y3, z, 1.0f);
            q4.Position = new Vector4(x3, y3, -z, 1.0f);

            Vector3 e1 = new Vector3(q2.Position.X - q1.Position.X,
                q2.Position.Y - q1.Position.Y,
                q2.Position.Z - q1.Position.Z);

            Vector3 e2 = new Vector3(q3.Position.X - q2.Position.X,
                q3.Position.Y - q2.Position.Y,
                q3.Position.Z - q2.Position.Z);

            Vector3 n = Vector3.Cross(e1, e2);
            q1.Normals = n;
            q2.Normals = n;
            q3.Normals = n;
            q4.Normals = n;

            vlist.Add(q1); vlist.Add(q2); vlist.Add(q3); vlist.Add(q4);

            offset += (res * 2);
            ilist.Add(offset); ilist.Add(offset + 1); ilist.Add(offset + 2);
            ilist.Add(offset + 2); ilist.Add(offset + 1); ilist.Add(offset + 3);


            offset += 4;

            //Totally crapply unoptimized, but phi can be negative
            phi = Convert.ToSingle(phase * (Math.PI * 2.0));
            for (int i = 0; i < res - 1; i++)
            {
                phi += inc;
            }

            x2 = Convert.ToSingle(0.5 * inner * Math.Cos(phi));
            y2 = Convert.ToSingle(0.5 * inner * Math.Sin(phi));

            x3 = Convert.ToSingle(0.5 * Math.Cos(phi));
            y3 = Convert.ToSingle(0.5 * Math.Sin(phi));

            q1.Position = new Vector4(x2, y2, z, 1.0f);
            q2.Position = new Vector4(x2, y2, -z, 1.0f);
            q3.Position = new Vector4(x3, y3, z, 1.0f);
            q4.Position = new Vector4(x3, y3, -z, 1.0f);

            e1 = new Vector3(q2.Position.X - q1.Position.X,
                q2.Position.Y - q1.Position.Y,
                q2.Position.Z - q1.Position.Z);

            e2 = new Vector3(q3.Position.X - q2.Position.X,
                q3.Position.Y - q2.Position.Y,
                q3.Position.Z - q2.Position.Z);

            n = Vector3.Cross(e2, e1);
            q1.Normals = n;
            q2.Normals = n;
            q3.Normals = n;
            q4.Normals = n;

            vlist.Add(q1); vlist.Add(q2); vlist.Add(q3); vlist.Add(q4);

            ilist.Add(offset); ilist.Add(offset + 2); ilist.Add(offset + 1);
            ilist.Add(offset + 2); ilist.Add(offset + 3); ilist.Add(offset + 1);



            #endregion

            float minx = float.MaxValue, miny = float.MaxValue, minz = float.MaxValue;
            float maxx = float.MinValue, maxy = float.MinValue, maxz = float.MinValue;

            foreach (Pos4Norm3Tex2Vertex v in vlist)
            {
                minx = v.Position.X < minx ? v.Position.X : minx;
                miny = v.Position.Y < miny ? v.Position.Y : miny;
                minz = v.Position.Z < minz ? v.Position.Z : minz;

                maxx = v.Position.X > maxx ? v.Position.X : maxx;
                maxy = v.Position.Y > maxy ? v.Position.Y : maxy;
                maxz = v.Position.Z > maxz ? v.Position.Z : maxz;
            }

            DataStream ds = new DataStream(vlist.Count * Pos4Norm3Tex2Vertex.VertexSize, true, true);
            ds.Position = 0;
            ds.WriteRange(vlist.ToArray());
            ds.Position = 0;

            var vbuffer = new SlimDX.Direct3D11.Buffer(context.Device, ds, new BufferDescription()
            {
                BindFlags = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags = ResourceOptionFlags.None,
                SizeInBytes = (int)ds.Length,
                Usage = ResourceUsage.Default
            });

            ds.Dispose();

            var indexstream = new DataStream(ilist.Count * 4, true, true);
            indexstream.WriteRange(ilist.ToArray());
            indexstream.Position = 0;

            geom.VertexBuffer = vbuffer;
            geom.IndexBuffer = new DX11IndexBuffer(context, indexstream, false, true);
            geom.InputLayout = Pos4Norm3Tex2Vertex.Layout;
            geom.Topology = PrimitiveTopology.TriangleList;
            geom.VerticesCount = vlist.Count;
            geom.VertexSize = Pos4Norm3Tex2Vertex.VertexSize;

            geom.HasBoundingBox = true;
            geom.BoundingBox = new BoundingBox(new Vector3(minx, miny, minz), new Vector3(maxx, maxy, maxz));

            return geom;
        }
예제 #43
0
        /// <summary>
        /// Setting up the vertex buffer. Vertex size and number has to be known.
        /// </summary>
        /// <param name="origin"></param>
        /// <param name="xAxis"></param>
        /// <param name="yAxis"></param>
        /// <param name="scale"></param>
        protected void GenerateGeometry(Plane plane, PointSet<Point> points)
        {
            // Write poition and UV-map data.
            var stream = new DataStream(_numVertices * _vertexSizeBytes, true, true);
            Vector3 zAxis = plane.ZAxis;
            foreach(Point point in points.Points)
            {
                var test = new Vector4(plane.Origin + (plane.XAxis * point.Position[0] + plane.YAxis * point.Position[1] + zAxis * point.Position[2]), 1.0f);
                stream.Write(new Vector4(plane.Origin + (plane.XAxis * point.Position[0] + plane.YAxis * point.Position[1] + zAxis * point.Position[2]), 1.0f));
                stream.Write(point.Color);
                stream.Write(point.Radius * plane.PointSize);
            }
            stream.Position = 0;

            // Create and fill buffer.
            _vertices = new Buffer(Renderable._device, stream, new BufferDescription()
            {
                BindFlags = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags = ResourceOptionFlags.None,
                SizeInBytes = _numVertices * _vertexSizeBytes,
                Usage = ResourceUsage.Default
            });
            stream.Dispose();
        }
예제 #44
0
파일: Mesh.cs 프로젝트: Nezz/SharpDX
        /// <summary>	
        /// Generates a new mesh with reordered faces and vertices to optimize drawing performance.	
        /// </summary>	
        /// <remarks>	
        /// This method generates a new mesh. Before running Optimize, an application must generate an adjacency buffer by calling <see cref="SharpDX.Direct3D10.Mesh.GenerateAdjacencyAndPointRepresentation"/>. The adjacency buffer contains adjacency data, such as a list of edges and the faces that are adjacent to each other. This method is very similar to the <see cref="SharpDX.Direct3D10.Mesh.CloneMesh"/> method, except that it can perform optimization while generating the new clone of the mesh. The output mesh inherits all of the creation parameters of the input mesh. 	
        /// </remarks>	
        /// <param name="flags">Specifies the type of optimization to perform. This parameter can be set to a combination of one or more flags from D3DXMESHOPT and D3DXMESH (except D3DXMESH_32BIT, D3DXMESH_IB_WRITEONLY, and D3DXMESH_WRITEONLY). </param>
        /// <param name="faceRemap">An array of UINTs, one per face, that identifies the original mesh face that corresponds to each face in the optimized mesh.</param>
        /// <param name="vertexRemap">An array of index for each vertex that specifies how the new vertices map to the old vertices. This remap is useful if you need to alter external data based on the new vertex mapping. </param>
        /// <returns>The return value is one of the values listed in {{Direct3D 10 Return Codes}}. </returns>
        /// <unmanaged>HRESULT ID3DX10Mesh::Optimize([None] int Flags,[Out, Buffer, Optional] int* pFaceRemap,[In] LPD3D10BLOB* ppVertexRemap)</unmanaged>
        public void Optimize(MeshOptimizeFlags flags, out int[] faceRemap, out int[] vertexRemap)
        {

            IntPtr blobPtr;
            DataStream dataStream = null;
            unsafe
            {
                try
                {
                    faceRemap = new int[FaceCount];
                    Optimize((int)flags, faceRemap, new IntPtr(&blobPtr));
                    dataStream = new DataStream(new Blob(blobPtr));
                    vertexRemap = dataStream.ReadRange<int>(VertexCount);
                    dataStream.Dispose();
                }
                catch (Exception)
                {
                    faceRemap = null;
                    vertexRemap = null;
                    if (dataStream!=null)
                        dataStream.Dispose();
                    throw;
                }
            }
        }
예제 #45
0
        public void TestDirectX11SimpleShader()
        {
            var game = new DX11Form();

            game.InitDirectX();
            var device    = game.Device;
            var bytecode  = ShaderBytecode.CompileFromFile("../../Common.Core/Shaders/MiniTri.fx", "fx_5_0", ShaderFlags.None, EffectFlags.None);
            var effect    = new Effect(device, bytecode);
            var technique = effect.GetTechniqueByName("Render");
            var pass      = technique.GetPassByIndex(0);
            var layout    = new InputLayout(device, pass.Description.Signature,
                                            new[] {
                new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0),
                new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0),
                new InputElement("TEXCOORD", 0, Format.R32G32_Float, 32, 0)
            });

            var vertexStride = (16 + 16 + 8);
            var stream       = new DataStream(3 * vertexStride, true, true);

            stream.WriteRange(new[] {
                new VertexCustom(new Vector4(0.0f, 0.5f, 0.5f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), new Vector2(0.5f, 0)),
                new VertexCustom(new Vector4(0.5f, -0.5f, 0.5f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), new Vector2(0f, 1f)),
                new VertexCustom(new Vector4(-0.5f, -0.5f, 0.5f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), new Vector2(1f, 1f))
            });
            stream.Position = 0;

            var vertices = new SlimDX.Direct3D11.Buffer(device, stream, new BufferDescription()
            {
                BindFlags      = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags    = ResourceOptionFlags.None,
                SizeInBytes    = 3 * vertexStride,
                Usage          = ResourceUsage.Default
            });

            stream.Dispose();


            var diffuseShaderVariable = effect.GetVariableByName("txDiffuse").AsResource();

            var texturePath = Wallpaper001_png;

            var diffuseTexture = Texture2D.FromFile(device, texturePath);

            var diffuseTextureRv = new ShaderResourceView(device, diffuseTexture);


            diffuseShaderVariable.SetResource(diffuseTextureRv);


            game.GameLoopEvent += delegate
            {
                device.ImmediateContext.InputAssembler.InputLayout       = layout;
                device.ImmediateContext.InputAssembler.PrimitiveTopology =
                    PrimitiveTopology.TriangleList;
                device.ImmediateContext.InputAssembler.SetVertexBuffers(0,
                                                                        new VertexBufferBinding
                                                                            (vertices,
                                                                            vertexStride, 0));

                for (int i = 0; i < technique.Description.PassCount; ++i)
                {
                    pass.Apply(device.ImmediateContext);
                    device.ImmediateContext.Draw(3, 0);
                }
            };

            game.Run();


            bytecode.Dispose();
            effect.Dispose();
            layout.Dispose();
            vertices.Dispose();
            diffuseTexture.Dispose();
            diffuseTextureRv.Dispose();
        }
예제 #46
0
파일: Form1.cs 프로젝트: Broams/holography
        void CreateGeometry()
        {
            float[] vertices = new[]
                                    {
                                        -1.0f, -1.0f, 0f, 0f, 1.0f,
                                        1.0f, -1.0f, 0f, 1.0f, 1.0f,
                                        1.0f, 1.0f, 0f, 1.0f, 0.0f,
                                        -1.0f, 1.0f, 0f, 0.0f, 0.0f,

                                    };

            short[] faces = new[]
                                {
                                        (short)0, (short)1, (short)2,
                                        (short)0, (short)2, (short)3
                                };

            // Creating vertex buffer
            var stream = new DataStream(4 * vertexSize, true, true);
            stream.WriteRange(vertices);
            stream.Position = 0;

            var vertexBuffer = new Buffer(device11, stream, new BufferDescription
            {
                BindFlags = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags = ResourceOptionFlags.None,
                SizeInBytes = (int)stream.Length,
                Usage = ResourceUsage.Default
            });
            stream.Dispose();

            // Index buffer
            stream = new DataStream(6 * 2, true, true);
            stream.WriteRange(faces);
            stream.Position = 0;

            var indices = new Buffer(device11, stream, new BufferDescription
            {
                BindFlags = BindFlags.IndexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags = ResourceOptionFlags.None,
                SizeInBytes = (int)stream.Length,
                Usage = ResourceUsage.Default
            });
            stream.Dispose();

            // Uploading to the device
            device11.ImmediateContext.InputAssembler.InputLayout = layout;
            device11.ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            device11.ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertexBuffer, vertexSize, 0));
            device11.ImmediateContext.InputAssembler.SetIndexBuffer(indices, Format.R16_UInt, 0);
        }
예제 #47
0
        static void Main()
        {
            var form = new RenderForm("SlimDX - MiniTri Direct3D 11 Sample");
            var desc = new SwapChainDescription()
            {
                BufferCount       = 1,
                ModeDescription   = new ModeDescription(form.ClientSize.Width, form.ClientSize.Height, new Rational(60, 1), Format.R8G8B8A8_UNorm),
                IsWindowed        = true,
                OutputHandle      = form.Handle,
                SampleDescription = new SampleDescription(1, 0),
                SwapEffect        = SwapEffect.Discard,
                Usage             = Usage.RenderTargetOutput
            };

            Device    device;
            SwapChain swapChain;

            Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.Debug, desc, out device, out swapChain);

            Factory factory = swapChain.GetParent <Factory>();

            factory.SetWindowAssociation(form.Handle, WindowAssociationFlags.IgnoreAll);

            Texture2D backBuffer = Texture2D.FromSwapChain <Texture2D>(swapChain, 0);
            var       renderView = new RenderTargetView(device, backBuffer);
            var       bytecode   = ShaderBytecode.CompileFromFile("MiniTri.fx", "fx_5_0", ShaderFlags.None, EffectFlags.None);
            var       effect     = new Effect(device, bytecode);
            var       technique  = effect.GetTechniqueByIndex(0);
            var       pass       = technique.GetPassByIndex(0);
            var       layout     = new InputLayout(device, pass.Description.Signature, new[] {
                new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0),
                new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0)
            });

            var stream = new DataStream(3 * 32, true, true);

            stream.WriteRange(new[] {
                new Vector4(0.0f, 0.5f, 0.5f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
                new Vector4(0.5f, -0.5f, 0.5f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
                new Vector4(-0.5f, -0.5f, 0.5f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f)
            });
            stream.Position = 0;

            var vertices = new SlimDX.Direct3D11.Buffer(device, stream, new BufferDescription()
            {
                BindFlags      = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags    = ResourceOptionFlags.None,
                SizeInBytes    = 3 * 32,
                Usage          = ResourceUsage.Default
            });

            stream.Dispose();

            device.ImmediateContext.OutputMerger.SetTargets(renderView);
            device.ImmediateContext.Rasterizer.SetViewports(new Viewport(0, 0, form.ClientSize.Width, form.ClientSize.Height, 0.0f, 1.0f));

            MessagePump.Run(form, () =>
            {
                device.ImmediateContext.ClearRenderTargetView(renderView, Color.Black);

                device.ImmediateContext.InputAssembler.InputLayout       = layout;
                device.ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
                device.ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertices, 32, 0));

                for (int i = 0; i < technique.Description.PassCount; ++i)
                {
                    pass.Apply(device.ImmediateContext);
                    device.ImmediateContext.Draw(3, 0);
                }

                swapChain.Present(0, PresentFlags.None);
            });

            bytecode.Dispose();
            vertices.Dispose();
            layout.Dispose();
            effect.Dispose();
            renderView.Dispose();
            backBuffer.Dispose();
            device.Dispose();
            swapChain.Dispose();
        }
예제 #48
0
 public void Dispose()
 {
     _deviceManager.Context.UnmapSubresource(_resource, 0);
     _stream.Dispose();
 }
예제 #49
0
 public void Dispose()
 {
     DataStream?.Dispose();
     Texture.Device.ImmediateContext.UnmapSubresource(Texture, 0);
 }
예제 #50
0
 /// <summary>
 ///
 /// </summary>
 public void Dispose()
 {
     _dataStream.Dispose();
     isDisposed = true;
 }
예제 #51
0
            // encapsulates d3d resources for a camera
            public CameraDeviceResource(SharpDX.Direct3D11.Device device, ProjectorCameraEnsemble.Camera camera, Object renderLock, string directory)
            {
                this.device     = device;
                this.camera     = camera;
                this.renderLock = renderLock;

                // Kinect depth image
                var depthImageTextureDesc = new Texture2DDescription()
                {
                    Width             = Kinect2Calibration.depthImageWidth,
                    Height            = Kinect2Calibration.depthImageHeight,
                    MipLevels         = 1,
                    ArraySize         = 1,
                    Format            = SharpDX.DXGI.Format.R16_UInt,
                    SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
                    Usage             = ResourceUsage.Dynamic,
                    BindFlags         = BindFlags.ShaderResource,
                    CpuAccessFlags    = CpuAccessFlags.Write,
                };

                depthImageTexture   = new Texture2D(device, depthImageTextureDesc);
                depthImageTextureRV = new ShaderResourceView(device, depthImageTexture);

                var floatDepthImageTextureDesc = new Texture2DDescription()
                {
                    Width             = Kinect2Calibration.depthImageWidth,
                    Height            = Kinect2Calibration.depthImageHeight,
                    MipLevels         = 1,
                    ArraySize         = 1,
                    Format            = SharpDX.DXGI.Format.R32_Float,
                    SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
                    Usage             = ResourceUsage.Default,
                    BindFlags         = BindFlags.RenderTarget | BindFlags.ShaderResource,
                    CpuAccessFlags    = CpuAccessFlags.None,
                };

                floatDepthImageTexture          = new Texture2D(device, floatDepthImageTextureDesc);
                floatDepthImageRV               = new ShaderResourceView(device, floatDepthImageTexture);
                floatDepthImageRenderTargetView = new RenderTargetView(device, floatDepthImageTexture);

                floatDepthImageTexture2          = new Texture2D(device, floatDepthImageTextureDesc);
                floatDepthImageRV2               = new ShaderResourceView(device, floatDepthImageTexture2);
                floatDepthImageRenderTargetView2 = new RenderTargetView(device, floatDepthImageTexture2);

                // Kinect color image
                var colorImageStagingTextureDesc = new Texture2DDescription()
                {
                    Width             = Kinect2Calibration.colorImageWidth,
                    Height            = Kinect2Calibration.colorImageHeight,
                    MipLevels         = 1,
                    ArraySize         = 1,
                    Format            = SharpDX.DXGI.Format.B8G8R8A8_UNorm,
                    SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
                    Usage             = ResourceUsage.Dynamic,
                    BindFlags         = BindFlags.ShaderResource,
                    CpuAccessFlags    = CpuAccessFlags.Write
                };

                colorImageStagingTexture = new Texture2D(device, colorImageStagingTextureDesc);

                var colorImageTextureDesc = new Texture2DDescription()
                {
                    Width             = Kinect2Calibration.colorImageWidth,
                    Height            = Kinect2Calibration.colorImageHeight,
                    MipLevels         = 0,
                    ArraySize         = 1,
                    Format            = SharpDX.DXGI.Format.B8G8R8A8_UNorm,
                    SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
                    Usage             = ResourceUsage.Default,
                    BindFlags         = BindFlags.ShaderResource | BindFlags.RenderTarget,
                    CpuAccessFlags    = CpuAccessFlags.None,
                    OptionFlags       = ResourceOptionFlags.GenerateMipMaps
                };

                colorImageTexture   = new Texture2D(device, colorImageTextureDesc);
                colorImageTextureRV = new ShaderResourceView(device, colorImageTexture);

                // vertex buffer
                var table       = camera.calibration.ComputeDepthFrameToCameraSpaceTable();
                int numVertices = 6 * (Kinect2Calibration.depthImageWidth - 1) * (Kinect2Calibration.depthImageHeight - 1);
                var vertices    = new VertexPosition[numVertices];

                Int3[] quadOffsets = new Int3[]
                {
                    new Int3(0, 0, 0),
                    new Int3(1, 0, 0),
                    new Int3(0, 1, 0),
                    new Int3(1, 0, 0),
                    new Int3(1, 1, 0),
                    new Int3(0, 1, 0),
                };

                int vertexIndex = 0;

                for (int y = 0; y < Kinect2Calibration.depthImageHeight - 1; y++)
                {
                    for (int x = 0; x < Kinect2Calibration.depthImageWidth - 1; x++)
                    {
                        for (int i = 0; i < 6; i++)
                        {
                            int vertexX = x + quadOffsets[i].X;
                            int vertexY = y + quadOffsets[i].Y;

                            var point = table[Kinect2Calibration.depthImageWidth * vertexY + vertexX];

                            var vertex = new VertexPosition();
                            vertex.position         = new SharpDX.Vector4(point.X, point.Y, vertexX, vertexY);
                            vertices[vertexIndex++] = vertex;
                        }
                    }
                }

                var stream = new DataStream(numVertices * VertexPosition.SizeInBytes, true, true);

                stream.WriteRange(vertices);
                stream.Position = 0;

                var vertexBufferDesc = new BufferDescription()
                {
                    BindFlags      = BindFlags.VertexBuffer,
                    CpuAccessFlags = CpuAccessFlags.None,
                    Usage          = ResourceUsage.Default,
                    SizeInBytes    = numVertices * VertexPosition.SizeInBytes,
                };

                vertexBuffer = new SharpDX.Direct3D11.Buffer(device, stream, vertexBufferDesc);

                vertexBufferBinding = new VertexBufferBinding(vertexBuffer, VertexPosition.SizeInBytes, 0);

                stream.Dispose();

                var colorImage = new RoomAliveToolkit.ARGBImage(Kinect2Calibration.colorImageWidth, Kinect2Calibration.colorImageHeight);

                ProjectorCameraEnsemble.LoadFromTiff(imagingFactory, colorImage, directory + "/camera" + camera.name + "/color.tiff");

                var depthImage = new RoomAliveToolkit.ShortImage(Kinect2Calibration.depthImageWidth, Kinect2Calibration.depthImageHeight);

                ProjectorCameraEnsemble.LoadFromTiff(imagingFactory, depthImage, directory + "/camera" + camera.name + "/mean.tiff");

                lock (renderLock) // necessary?
                {
                    UpdateColorImage(device.ImmediateContext, colorImage.DataIntPtr);
                    UpdateDepthImage(device.ImmediateContext, depthImage.DataIntPtr);
                }

                colorImage.Dispose();
                depthImage.Dispose();
            }
예제 #52
0
파일: DXScene.cs 프로젝트: KFlaga/Cam3D
        //public void UpdateScene()
        //{
        //    // Prepares all models for render :
        //    // for each node:
        //    // - check if any model should be / not be rendered (rather check scene node AABB with camera frustum)
        //    // - check if any model have no render group assigned
        //    // - check if any model should have group changed
        //    // - update buffers for model
        //    // repeat for children
        //    // For now clear all render-groups, later may re-use dictinary and just invalidate entries
        //    RenderGroups.Clear();
        //    PrepareNodeForRender(_rootNode);
        //}
        //protected void PrepareNodeForRender(DXSceneNode node)
        //{
        //    // 1) node.GlobalAABBDerived; check if AABB is within camera frustum
        //    //      If is within:
        //    // 2) Prepare each attached model (do not check culling -> it will be per scene node)
        //    foreach(var model in node.AttachedObjects)
        //    {
        //        PrepareModelForRender(model);
        //    }
        //    // 3) Do same for all children
        //    foreach(var child in node.Children)
        //    {
        //        PrepareNodeForRender(child);
        //    }
        //}
        //protected void PrepareModelForRender(IModel model)
        //{
        //    // Check if model contains any sub-models
        //    if(model.SubModels != null)
        //    {
        //        // We have compund model -> just prepare each sub-model
        //        foreach(var submodel in model.SubModels)
        //        {
        //            PrepareModelForRender(submodel);
        //        }
        //    }
        //    else
        //    {
        //        // We have final render-model
        //        DXShader shader = model.Shader;
        //        if(shader != null)
        //        {
        //            // Add to render group with this shader
        //            RenderGroup rgroup;
        //            bool rgroupCreated = RenderGroups.TryGetValue(shader, out rgroup);
        //            if(!rgroupCreated)
        //            {
        //                rgroup = new RenderGroup();
        //                rgroup.Shader = shader;
        //                RenderGroups.Add(shader, rgroup);
        //            }
        //            rgroup.Models.Add(model);
        //        }
        //    }
        //}
        public void Render(DeviceContext device)
        {
            CurrentCamera.UpdateViewMatrix();
            CurrentCamera.UpdateProjectionMatrix();
            TransformMatrix = WorldMatrix * CurrentCamera.ViewMat * CurrentCamera.ProjMat;
            // finalTransform.Transpose();

            DataStream stream;
            var dataBox = device.MapSubresource(_globalLightsBuffer, 0,
                MapMode.WriteDiscard, MapFlags.None);
            stream = new DataStream(dataBox.DataPointer, _globalLightsBuffer.Description.SizeInBytes, true, true);
            stream.Write(_globalLights);
            device.UnmapSubresource(_globalLightsBuffer, 0); //to update the data on GPU
            stream.Dispose();

            // device.VertexShader.SetConstantBuffer((int)ConstantBufferSlots.WorldViewProjMatrix, _transformBuffer);
            device.PixelShader.SetConstantBuffer((int)ConstantBufferSlots.GlobalLights, _globalLightsBuffer);

            RenderNode(device, _rootNode, TransformMatrix);

            //UpdateScene();
            //foreach (var rgroup in RenderGroups)
            //{
            //    rgroup.Value.Render(device, this);
            //}
        }
예제 #53
0
        public async ReusableTask <int> ReceiveAsync(ByteBuffer buffer, int offset, int count)
        {
            // This is a little tricky, so let's spell it out in comments...
            if (Disposed)
            {
                throw new OperationCanceledException();
            }

            // If this is the first time ReceiveAsync is invoked, then we should get the first PieceMessage from the queue
            if (CurrentRequest == null)
            {
                // When we call 'SendAsync' with request piece messages, we add them to the list and then toggle the handle.
                // When this returns it means we have requests ready to go!
                await Task.Run(() => ReceiveWaiter.WaitOne());

                if (Disposed)
                {
                    throw new OperationCanceledException();
                }

                // Grab the request. We know the 'SendAsync' call won't return until we process all the queued requests, so
                // this is threadsafe now.
                CurrentRequest = new HttpRequestData(RequestMessages[0]);
                RequestMessages.RemoveAt(0);
            }

            // If we have not sent the length header for this message, send it now
            if (!CurrentRequest.SentLength)
            {
                // The message length counts as the first four bytes
                CurrentRequest.SentLength     = true;
                CurrentRequest.TotalReceived += 4;
                Message.Write(buffer.Data, offset, CurrentRequest.TotalToReceive - CurrentRequest.TotalReceived);
                return(4);
            }

            // Once we've sent the length header, the next thing we need to send is the metadata for the 'Piece' message
            int written = 0;

            if (!CurrentRequest.SentHeader)
            {
                CurrentRequest.SentHeader = true;

                // We have *only* written the messageLength to the stream
                // Now we need to write the rest of the PieceMessage header
                written += Message.Write(buffer.Data, offset + written, PieceMessage.MessageId);
                written += Message.Write(buffer.Data, offset + written, CurrentRequest.Request.PieceIndex);
                written += Message.Write(buffer.Data, offset + written, CurrentRequest.Request.StartOffset);
                count   -= written;
                offset  += written;
                CurrentRequest.TotalReceived += written;
            }

            // Once we have sent the message length, and the metadata, we now need to add the actual data from the HTTP server.
            // If we have already connected to the server then DataStream will be non-null and we can just read the next bunch
            // of data from it.
            if (DataStream != null)
            {
                int result = await DataStream.ReadAsync(buffer.Data, offset, count);

                DataStreamCount -= result;
                // If result is zero it means we've read the last data from the stream.
                if (result == 0)
                {
                    using (DataStreamResponse)
                        DataStream.Dispose();

                    DataStreamResponse = null;
                    DataStream         = null;

                    // If we requested more data (via the range header) than we were actually given, then it's a truncated
                    // stream and we can give up immediately.
                    if (DataStreamCount > 0)
                    {
                        throw new WebException("Unexpected end of stream");
                    }
                }
                else
                {
                    // Otherwise if we have received non-zero data we can accumulate that!
                    CurrentRequest.TotalReceived += result;
                    // If the request is complete we should dequeue the next RequestMessage so we can process
                    // that the next ReceiveAsync is invoked. Otherwise, if we have processed all the queued
                    // messages we can mark the 'SendAsync' as complete and we can wait for the piece picker
                    // to add more requests for us to process.
                    if (CurrentRequest.Complete)
                    {
                        if (RequestMessages.Count > 0)
                        {
                            CurrentRequest = new HttpRequestData(RequestMessages[0]);
                            RequestMessages.RemoveAt(0);
                        }
                        else
                        {
                            using (DataStreamResponse)
                                DataStream.Dispose();

                            DataStreamResponse = null;
                            DataStream         = null;

                            CurrentRequest = null;

                            SendResult.TrySetResult(null);
                        }
                    }
                    return(result + written);
                }
            }

            // Finally, if we have had no datastream what we need to do is execute the next web request in our list,
            // and then begin reading data from that stream.
            while (WebRequests.Count > 0)
            {
                KeyValuePair <WebRequest, int> r = WebRequests.Dequeue();
                using var cts = new CancellationTokenSource(ConnectionTimeout);
                using (cts.Token.Register(() => r.Key.Abort())) {
                    DataStreamResponse = await r.Key.GetResponseAsync();

                    DataStream      = DataStreamResponse.GetResponseStream();
                    DataStreamCount = r.Value;
                    return(await ReceiveAsync(buffer, offset, count) + written);
                }
            }

            // If we reach this point it means that we processed all webrequests and still ended up receiving *less* data than we required,
            // and we did not throw an unexpected end of stream exception.
            throw new WebException("Unable to download the required data from the server");
        }
예제 #54
0
        public DX11IndexedGeometry Segment(Segment settings)
        {
            float phase = settings.Phase;
            float cycles = settings.Cycles; 
            float inner = settings.InnerRadius; 
            int res = settings.Resolution;
            bool flat = settings.Flat;

            DX11IndexedGeometry geom = new DX11IndexedGeometry(context);
            geom.Tag = settings;
            geom.PrimitiveType = settings.PrimitiveType;
            int vcount = res * 2;
            int icount = (res - 1) * 6;

            DataStream ds = new DataStream(vcount * Pos4Norm3Tex2Vertex.VertexSize, true, true);
            ds.Position = 0;

            float inc = Convert.ToSingle((Math.PI * 2.0 * cycles) / (res - 1.0));
            float phi = Convert.ToSingle(phase * (Math.PI * 2.0));

            Pos4Norm3Tex2Vertex innerv = new Pos4Norm3Tex2Vertex();
            innerv.Normals = new Vector3(0.0f, 0.0f, 1.0f);

            Pos4Norm3Tex2Vertex outerv = new Pos4Norm3Tex2Vertex();
            outerv.Normals = new Vector3(0.0f, 0.0f, 1.0f);

            Pos4Norm3Tex2Vertex[] vertices = new Pos4Norm3Tex2Vertex[res * 2];

            for (int i = 0; i < res; i++)
            {
                float x = Convert.ToSingle(0.5 * inner * Math.Cos(phi));
                float y = Convert.ToSingle(0.5 * inner * Math.Sin(phi));

                innerv.Position = new Vector4(x, y, 0.0f, 1.0f);

                if (flat)
                {
                    innerv.TexCoords = new Vector2(0.5f - x, 0.5f - y);
                }
                else
                {
                    innerv.TexCoords = new Vector2((1.0f * (float)i) / ((float)res - 1.0f), 0.0f);
                }

                x = Convert.ToSingle(0.5 * Math.Cos(phi));
                y = Convert.ToSingle(0.5 * Math.Sin(phi));

                outerv.Position = new Vector4(x, y, 0.0f, 1.0f);

                if (flat)
                {
                    outerv.TexCoords = new Vector2(0.5f - x, 0.5f - y);
                }
                else
                {
                    outerv.TexCoords = new Vector2((1.0f * (float)i) / ((float)res - 1.0f), 1.0f);
                }

                vertices[i] = innerv;
                vertices[i + res] = outerv;
                phi += inc;
            }

            float minx = float.MaxValue, miny = float.MaxValue, minz = float.MaxValue;
            float maxx = float.MinValue, maxy = float.MinValue, maxz = float.MinValue;

            foreach (Pos4Norm3Tex2Vertex v in vertices)
            {
                minx = v.Position.X < minx ? v.Position.X : minx;
                miny = v.Position.Y < miny ? v.Position.Y : miny;
                minz = v.Position.Z < minz ? v.Position.Z : minz;

                maxx = v.Position.X > maxx ? v.Position.X : maxx;
                maxy = v.Position.Y > maxy ? v.Position.Y : maxy;
                maxz = v.Position.Z > maxz ? v.Position.Z : maxz;
            }

            ds.WriteRange(vertices);

            ds.Position = 0;

            var vbuffer = new SlimDX.Direct3D11.Buffer(context.Device, ds, new BufferDescription()
            {
                BindFlags = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags = ResourceOptionFlags.None,
                SizeInBytes = (int)ds.Length,
                Usage = ResourceUsage.Default
            });

            ds.Dispose();

            int indstep = 0;
            int[] indices = new int[icount];
            for (int i = 0; i < res - 1; i++)
            {
                //Triangle from low to high
                indices[indstep] = i;
                indices[indstep + 2] = res + i;
                indices[indstep + 1] = i + 1;
                

                //Triangle from high to low
                indices[indstep + 3] = i + 1;
                indices[indstep + 5] = res + i;
                indices[indstep + 4] = res + i + 1;

                indstep += 6;
            }

            var indexstream = new DataStream(icount * 4, true, true);
            indexstream.WriteRange(indices);
            indexstream.Position = 0;

            geom.VertexBuffer = vbuffer;
            geom.IndexBuffer = new DX11IndexBuffer(context, indexstream, false, true);
            geom.InputLayout = Pos4Norm3Tex2Vertex.Layout;
            geom.Topology = PrimitiveTopology.TriangleList;
            geom.VerticesCount = vcount;
            geom.VertexSize = Pos4Norm3Tex2Vertex.VertexSize;

            geom.BoundingBox = new BoundingBox(new Vector3(minx, miny, minz), new Vector3(maxx, maxy, maxz));
            geom.HasBoundingBox = true;

            return geom;
        }
예제 #55
0
파일: Program.cs 프로젝트: zhandb/slimdx
        static void Main()
        {
            var form = new RenderForm("SlimDX - MiniTri Direct3D 10 Sample");
            var desc = new SwapChainDescription()
            {
                BufferCount = 1,
                ModeDescription = new ModeDescription(form.ClientSize.Width, form.ClientSize.Height, new Rational(60, 1), Format.R8G8B8A8_UNorm),
                IsWindowed = true,
                OutputHandle = form.Handle,
                SampleDescription = new SampleDescription(1, 0),
                SwapEffect = SwapEffect.Discard,
                Usage = Usage.RenderTargetOutput
            };

            Device device;
            SwapChain swapChain;
            Device.CreateWithSwapChain(null, DriverType.Hardware, DeviceCreationFlags.Debug, desc, out device, out swapChain);

            //Stops Alt+enter from causing fullscreen skrewiness.
            device.Factory.SetWindowAssociation(form.Handle, WindowAssociationFlags.IgnoreAll);

            Texture2D backBuffer = Texture2D.FromSwapChain<Texture2D>(swapChain, 0);
            var renderView = new RenderTargetView(device, backBuffer);
            var effect = Effect.FromFile(device, "MiniTri.fx", "fx_4_0");
            var technique = effect.GetTechniqueByIndex(0);
            var pass = technique.GetPassByIndex(0);
            var layout = new InputLayout(device, pass.Description.Signature, new[] {
                new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0),
                new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0) 
            });

            var stream = new DataStream(3 * 32, true, true);
            stream.WriteRange(new[] {
                new Vector4(0.0f, 0.5f, 0.5f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
                new Vector4(0.5f, -0.5f, 0.5f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
                new Vector4(-0.5f, -0.5f, 0.5f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f)
            });
            stream.Position = 0;

            var vertices = new SlimDX.Direct3D10.Buffer(device, stream, new BufferDescription()
            {
                BindFlags = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags = ResourceOptionFlags.None,
                SizeInBytes = 3 * 32,
                Usage = ResourceUsage.Default
            });
            stream.Dispose();

            device.OutputMerger.SetTargets(renderView);
            device.Rasterizer.SetViewports(new Viewport(0, 0, form.ClientSize.Width, form.ClientSize.Height, 0.0f, 1.0f));

            MessagePump.Run(form, () =>
            {
                device.ClearRenderTargetView(renderView, Color.Black);

                device.InputAssembler.SetInputLayout(layout);
                device.InputAssembler.SetPrimitiveTopology(PrimitiveTopology.TriangleList);
                device.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertices, 32, 0));

                for (int i = 0; i < technique.Description.PassCount; ++i)
                {
                    pass.Apply();
                    device.Draw(3, 0);
                }

                swapChain.Present(0, PresentFlags.None);
            });

            vertices.Dispose();
            layout.Dispose();
            effect.Dispose();
            renderView.Dispose();
            backBuffer.Dispose();
            device.Dispose();
            swapChain.Dispose();
            //foreach (var item in ObjectTable.Objects)
            //    item.Dispose();
        }
예제 #56
0
 public void Dispose()
 {
     Marshal.FreeHGlobal(Pointer);
     Data.Dispose();
 }
예제 #57
0
        public FrustumShader(Device device)
        {
            // create single vertex buffer
            var stream = new DataStream(24 * VertexPosition.SizeInBytes, true, true);

            stream.Write(new Vector4(-1, -1, 0, 1));
            stream.Write(new Vector4(1, -1, 0, 1));
            stream.Write(new Vector4(1, -1, 0, 1));
            stream.Write(new Vector4(1, 1, 0, 1));
            stream.Write(new Vector4(1, 1, 0, 1));
            stream.Write(new Vector4(-1, 1, 0, 1));
            stream.Write(new Vector4(-1, 1, 0, 1));
            stream.Write(new Vector4(-1, -1, 0, 1));

            stream.Write(new Vector4(-1, -1, maxZ, 1));
            stream.Write(new Vector4(1, -1, maxZ, 1));
            stream.Write(new Vector4(1, -1, maxZ, 1));
            stream.Write(new Vector4(1, 1, maxZ, 1));
            stream.Write(new Vector4(1, 1, maxZ, 1));
            stream.Write(new Vector4(-1, 1, maxZ, 1));
            stream.Write(new Vector4(-1, 1, maxZ, 1));
            stream.Write(new Vector4(-1, -1, maxZ, 1));

            stream.Write(new Vector4(-1, -1, 0, 1));
            stream.Write(new Vector4(-1, -1, maxZ, 1));
            stream.Write(new Vector4(1, -1, 0, 1));
            stream.Write(new Vector4(1, -1, maxZ, 1));
            stream.Write(new Vector4(1, 1, 0, 1));
            stream.Write(new Vector4(1, 1, maxZ, 1));
            stream.Write(new Vector4(-1, 1, 0, 1));
            stream.Write(new Vector4(-1, 1, maxZ, 1));
            stream.Position = 0;

            var vertexBufferDesc = new BufferDescription()
            {
                BindFlags      = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                Usage          = ResourceUsage.Default,
                SizeInBytes    = 24 * VertexPosition.SizeInBytes,
            };

            vertexBuffer = new SharpDX.Direct3D11.Buffer(device, stream, vertexBufferDesc);

            stream.Dispose();

            vertexBufferBinding = new VertexBufferBinding(vertexBuffer, VertexPosition.SizeInBytes, 0);


            shaderByteCode = new ShaderBytecode(File.ReadAllBytes("Content/frustumVS.cso"));
            frustumVS      = new VertexShader(device, shaderByteCode);
            frustumPS      = new PixelShader(device, new ShaderBytecode(File.ReadAllBytes("Content/frustumPS.cso")));

            // depth stencil state
            var depthStencilStateDesc = new DepthStencilStateDescription()
            {
                IsDepthEnabled   = true,
                DepthWriteMask   = DepthWriteMask.All,
                DepthComparison  = Comparison.LessEqual,
                IsStencilEnabled = false,
            };

            depthStencilState = new DepthStencilState(device, depthStencilStateDesc);

            // rasterizer state
            var rasterizerStateDesc = new RasterizerStateDescription()
            {
                CullMode                = CullMode.None,
                FillMode                = FillMode.Wireframe,
                IsDepthClipEnabled      = true,
                IsFrontCounterClockwise = true,
                IsMultisampleEnabled    = true,
            };

            rasterizerState = new RasterizerState(device, rasterizerStateDesc);

            // constant buffer
            var VSConstantBufferDesc = new BufferDescription()
            {
                Usage               = ResourceUsage.Dynamic,
                BindFlags           = BindFlags.ConstantBuffer,
                SizeInBytes         = VSConstantBuffer.size,
                CpuAccessFlags      = CpuAccessFlags.Write,
                StructureByteStride = 0,
                OptionFlags         = 0,
            };

            vertexShaderConstantBuffer = new SharpDX.Direct3D11.Buffer(device, VSConstantBufferDesc);

            // Pixel shader constant buffer
            var PSConstantBufferDesc = new BufferDescription()
            {
                Usage               = ResourceUsage.Dynamic,
                BindFlags           = BindFlags.ConstantBuffer,
                SizeInBytes         = PSConstantBuffer.size,
                CpuAccessFlags      = CpuAccessFlags.Write,
                StructureByteStride = 0,
                OptionFlags         = 0,
            };

            pixelShaderConstantBuffer = new SharpDX.Direct3D11.Buffer(device, PSConstantBufferDesc);

            vertexInputLayout = new InputLayout(device, shaderByteCode.Data, new[]
            {
                new InputElement("SV_POSITION", 0, Format.R32G32B32A32_Float, 0, 0),
            });
        }
예제 #58
0
        private static void Update(Device device, EEDCamera Cam)
        {
            LineList.AddRange(L);
            DrawLineCount = 0;
            if (LineList.Count > 0)
            {
                var vertices = new DataStream(BytesPerVertex * LineList.Count * 2, true, true);

                for (int i = 0; i < LineList.Count; i++)
                {
                    if (LineList[i] != null)
                    {
                        vertices.Write(Conversion.ToVector3(LineList[i].Start - Cam.position));
                        vertices.Write(LineList[i].Color);
                        vertices.Write(Conversion.ToVector3(LineList[i].Stop - Cam.position));
                        vertices.Write(LineList[i].Color);
                        DrawLineCount++;
                    }
                }
                vertices.Position = 0;

                if (DrawLineCount > CurrentBufferSize)
                {
                    //Resize
                    //TODO удваивать буффер
                    Vertexs.Dispose();
                    Vertexs = new Buffer(device, BytesPerVertex * DrawLineCount * 2, ResourceUsage.Dynamic, BindFlags.VertexBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0);
                }

                DataStream stream;
                device.ImmediateContext.MapSubresource(Vertexs, MapMode.WriteDiscard, SharpDX.Direct3D11.MapFlags.None, out stream);

                stream.Position = 0;
                stream.WriteRange(vertices.DataPointer, vertices.Length);

                device.ImmediateContext.UnmapSubresource(Vertexs, 0);

                stream.Dispose();
                vertices.Dispose();

                binding = new VertexBufferBinding(Vertexs, BytesPerVertex, 0);
            }
        }
예제 #59
0
        // This updates the visual thing
        public virtual void Update()
        {
            // Do we need to update the geometry buffer?
            if (updategeo)
            {
                //mxd. Trash geometry buffers
                if (geobuffers != null)
                {
                    foreach (VertexBuffer geobuffer in geobuffers)
                    {
                        geobuffer.Dispose();
                    }
                }

                // Any vertics?
                if (vertices.Length > 0)
                {
                    geobuffers = new VertexBuffer[vertices.Length];
                    for (int i = 0; i < vertices.Length; i++)
                    {
                        // Make a new buffer
                        geobuffers[i] = new VertexBuffer(General.Map.Graphics.Device, WorldVertex.Stride * vertices[i].Length,
                                                         Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);

                        // Fill the buffer
                        DataStream bufferstream = geobuffers[i].Lock(0, WorldVertex.Stride * vertices[i].Length, LockFlags.Discard);
                        bufferstream.WriteRange(vertices[i]);
                        geobuffers[i].Unlock();
                        bufferstream.Dispose();
                    }
                }

                //mxd. Check if thing is light
                CheckLightState();

                // Done
                updategeo = false;
            }

            //mxd. Need to update thing cage?
            if (updatecage)
            {
                // Trash cage buffer
                if (cagebuffer != null)
                {
                    cagebuffer.Dispose();
                }
                cagebuffer = null;

                // Make a new cage
                List <WorldVertex> cageverts;
                if (sizeless)
                {
                    WorldVertex v0 = new WorldVertex(-thing.Size + position_v3.X, -thing.Size + position_v3.Y, position_v3.Z);
                    WorldVertex v1 = new WorldVertex(thing.Size + position_v3.X, thing.Size + position_v3.Y, position_v3.Z);
                    WorldVertex v2 = new WorldVertex(thing.Size + position_v3.X, -thing.Size + position_v3.Y, position_v3.Z);
                    WorldVertex v3 = new WorldVertex(-thing.Size + position_v3.X, thing.Size + position_v3.Y, position_v3.Z);
                    WorldVertex v4 = new WorldVertex(position_v3.X, position_v3.Y, thing.Size + position_v3.Z);
                    WorldVertex v5 = new WorldVertex(position_v3.X, position_v3.Y, -thing.Size + position_v3.Z);

                    cageverts = new List <WorldVertex>(new[] { v0, v1, v2, v3, v4, v5 });
                }
                else
                {
                    float top    = position_v3.Z + thing.Height;
                    float bottom = position_v3.Z;

                    WorldVertex v0 = new WorldVertex(-thing.Size + position_v3.X, -thing.Size + position_v3.Y, bottom);
                    WorldVertex v1 = new WorldVertex(-thing.Size + position_v3.X, thing.Size + position_v3.Y, bottom);
                    WorldVertex v2 = new WorldVertex(thing.Size + position_v3.X, thing.Size + position_v3.Y, bottom);
                    WorldVertex v3 = new WorldVertex(thing.Size + position_v3.X, -thing.Size + position_v3.Y, bottom);

                    WorldVertex v4 = new WorldVertex(-thing.Size + position_v3.X, -thing.Size + position_v3.Y, top);
                    WorldVertex v5 = new WorldVertex(-thing.Size + position_v3.X, thing.Size + position_v3.Y, top);
                    WorldVertex v6 = new WorldVertex(thing.Size + position_v3.X, thing.Size + position_v3.Y, top);
                    WorldVertex v7 = new WorldVertex(thing.Size + position_v3.X, -thing.Size + position_v3.Y, top);

                    cageverts = new List <WorldVertex>(new[] { v0, v1,
                                                               v1, v2,
                                                               v2, v3,
                                                               v3, v0,
                                                               v4, v5,
                                                               v5, v6,
                                                               v6, v7,
                                                               v7, v4,
                                                               v0, v4,
                                                               v1, v5,
                                                               v2, v6,
                                                               v3, v7 });
                }

                // Make new arrow
                if (Thing.IsDirectional)
                {
                    Matrix transform = Matrix.Scaling(thing.Size, thing.Size, thing.Size)
                                       * (Matrix.RotationY(-Thing.RollRad) * Matrix.RotationX(-Thing.PitchRad) * Matrix.RotationZ(Thing.Angle))
                                       * (sizeless ? position : position * Matrix.Translation(0.0f, 0.0f, thingheight / 2f));

                    WorldVertex a0 = new WorldVertex(Vector3D.Transform(0.0f, 0.0f, 0.0f, transform));                     //start
                    WorldVertex a1 = new WorldVertex(Vector3D.Transform(0.0f, -1.5f, 0.0f, transform));                    //end
                    WorldVertex a2 = new WorldVertex(Vector3D.Transform(0.2f, -1.1f, 0.2f, transform));
                    WorldVertex a3 = new WorldVertex(Vector3D.Transform(-0.2f, -1.1f, 0.2f, transform));
                    WorldVertex a4 = new WorldVertex(Vector3D.Transform(0.2f, -1.1f, -0.2f, transform));
                    WorldVertex a5 = new WorldVertex(Vector3D.Transform(-0.2f, -1.1f, -0.2f, transform));

                    cageverts.AddRange(new[] { a0, a1,
                                               a1, a2,
                                               a1, a3,
                                               a1, a4,
                                               a1, a5 });
                }

                // Create buffer
                WorldVertex[] cv = cageverts.ToArray();
                cagelength = cv.Length / 2;
                cagebuffer = new VertexBuffer(General.Map.Graphics.Device, WorldVertex.Stride * cv.Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
                cagebuffer.Lock(0, WorldVertex.Stride * cv.Length, LockFlags.None).WriteRange(cv);
                cagebuffer.Unlock();

                // Done
                updatecage = false;
            }
        }
예제 #60
0
        public DX11IndexedGeometry Cylinder(Cylinder settings)
        {
            float radius1 = settings.Radius1;
            float radius2 = settings.Radius2;
            float cycles = settings.Cycles;
            float length = settings.Length;
            int resX = settings.ResolutionX;
            int resY = settings.ResolutionY;
            bool caps = settings.Caps;

            DX11IndexedGeometry geom = new DX11IndexedGeometry(context);
            geom.Tag = settings;
            geom.PrimitiveType = settings.PrimitiveType;

            int vcount = resX * (resY + 1);
            int icount = vcount * 6;

            if (caps)
            {
                //Add vertices (+1 for center)
                vcount += (resX + 1 * 2);

                //Add Triangles (on each side
                icount += (resX * 6);
            }

            float lenstart = -length * 0.5f; //Start at half bottom
            float lenstep = (float)length / (float)resY;

            float y = lenstart;

            List<Pos4Norm3Tex2Vertex> verts = new List<Pos4Norm3Tex2Vertex>();
            List<int> inds = new List<int>();

            float phi = 0.0f;
            float inc = Convert.ToSingle((Math.PI * 2.0 * cycles) / (double)resX);

            float fres = Convert.ToSingle(resY);

            #region Add Vertices tube
            for (int i = 0; i < resY + 1; i++)
            {

                float ystep = (float)i / fres;

                float radius = Map(ystep, 0, 1, radius1, radius2);

                for (int j = 0; j < resX; j++)
                {
                    float x = Convert.ToSingle(radius1 * Math.Cos(phi)) * radius;
                    float z = Convert.ToSingle(radius1 * Math.Sin(phi)) * radius;

                    Pos4Norm3Tex2Vertex v = new Pos4Norm3Tex2Vertex();
                    v.Position = new Vector4(x, y, z, 1.0f);
                    v.Normals = new Vector3(x, 0.0f, z);
                    v.Normals.Normalize();

                    verts.Add(v);

                    phi += inc;
                }
                y += lenstep;
                phi = 0.0f;
            }
            #endregion

            #region Add Indices Tube
            int indstart;
            for (int i = 0; i < resY; i++)
            {
                indstart = resX * i;
                int j;
                for (j = 0; j < resX - 1; j++)
                {
                    inds.Add(indstart + j);
                    inds.Add(indstart + resX + j);
                    inds.Add(indstart + j + 1);


                    inds.Add(indstart + j + 1);
                    inds.Add(indstart + j + resX);
                    inds.Add(indstart + j + resX + 1);

                }

                inds.Add(indstart + j);
                inds.Add(indstart + resX + j);
                inds.Add(indstart);

                inds.Add(indstart + j + resX);
                inds.Add(indstart + resX);
                inds.Add(indstart);
            }

            if (caps)
            {
                indstart = verts.Count;
                y = -length * 0.5f;

                Pos4Norm3Tex2Vertex v = new Pos4Norm3Tex2Vertex();
                v.Position = new Vector4(0, y, 0, 1.0f);
                v.Normals = new Vector3(0.0f, -1.0f, 0.0f);
                v.Normals.Normalize();
                verts.Add(v);

                phi = 0.0f;

                for (int j = 0; j < resX; j++)
                {
                    float x = Convert.ToSingle(radius1 * Math.Cos(phi)) * radius1;
                    float z = Convert.ToSingle(radius1 * Math.Sin(phi)) * radius1;

                    v.Position = new Vector4(x, y, z, 1.0f);
                    verts.Add(v);

                    phi += inc;
                }

                for (int j = 1; j < resX + 1; j++)
                {
                    inds.Add(indstart);
                    inds.Add(indstart + j);

                    if (j == resX)
                    {
                        inds.Add(indstart + 1);
                    }
                    else
                    {
                        inds.Add(indstart + j + 1);
                    }
                }

                indstart += (resX + 1);
                y = length * 0.5f;

                v = new Pos4Norm3Tex2Vertex();
                v.Position = new Vector4(0, y, 0, 1.0f);
                v.Normals = new Vector3(0.0f, 1.0f, 0.0f);
                v.Normals.Normalize();
                verts.Add(v);

                phi = 0.0f;

                for (int j = 0; j < resX; j++)
                {
                    float x = Convert.ToSingle(radius1 * Math.Cos(phi)) * radius2;
                    float z = Convert.ToSingle(radius1 * Math.Sin(phi)) * radius2;

                    v.Position = new Vector4(x, y, z, 1.0f);
                    verts.Add(v);

                    phi += inc;
                }

                for (int j = 1; j < resX + 1; j++)
                {
                    inds.Add(indstart + j);
                    inds.Add(indstart);


                    if (j == resX)
                    {
                        inds.Add(indstart + 1);
                    }
                    else
                    {
                        inds.Add(indstart + j + 1);
                    }
                }
            }
            #endregion

            DataStream ds = new DataStream(verts.Count * Pos4Norm3Tex2Vertex.VertexSize, true, true);
            ds.Position = 0;
            ds.WriteRange(verts.ToArray());
            ds.Position = 0;


            var vbuffer = new SlimDX.Direct3D11.Buffer(context.Device, ds, new BufferDescription()
            {
                BindFlags = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags = ResourceOptionFlags.None,
                SizeInBytes = (int)ds.Length,
                Usage = ResourceUsage.Default
            });

            ds.Dispose();

            var indexstream = new DataStream(inds.Count * 4, true, true);
            indexstream.WriteRange(inds.ToArray());
            indexstream.Position = 0;

            geom.VertexBuffer = vbuffer;
            geom.IndexBuffer = new DX11IndexBuffer(context, indexstream, false, true);
            geom.InputLayout = Pos4Norm3Tex2Vertex.Layout;
            geom.Topology = PrimitiveTopology.TriangleList;
            geom.VerticesCount = vcount;
            geom.VertexSize = Pos4Norm3Tex2Vertex.VertexSize;

            //Since cylinder can be a cone, max box is max of radius
            float maxrad = radius1 > radius2 ? radius1 : radius2;

            geom.HasBoundingBox = true;
            geom.BoundingBox = new BoundingBox(new Vector3(-maxrad, -lenstart, -maxrad), new Vector3(maxrad, lenstart, maxrad));

            return geom;
        }