예제 #1
0
        private void SetupIndexBuffer()
        {
            triangleCount = subDivX * subDivY * 2;
            var indices = new ushort[triangleCount * 3];
            int offset  = 0;

            for (int i = 0; i < triangleCount / 2; i++)
            {
                indices[i * 6]     = (ushort)(i + offset + 1);
                indices[i * 6 + 1] = (ushort)(i + offset + (subDivX + 1) + 1);
                indices[i * 6 + 2] = (ushort)(i + offset + (subDivX + 1));

                indices[i * 6 + 3] = (ushort)(i + offset);
                indices[i * 6 + 4] = (ushort)(i + offset + 1);
                indices[i * 6 + 5] = (ushort)(i + offset + (subDivX + 1));

                if ((i + 1) % subDivX == 0)
                {
                    offset++;
                }
            }

            indexBuffer?.Dispose();
            indexBuffer = null;

            indexBuffer = new IndexBuffer(GameMain.Instance.GraphicsDevice, IndexElementSize.SixteenBits, indices.Length, BufferUsage.None);
            indexBuffer.SetData(indices);

            Deform(new Vector2[, ]
            {
                { Vector2.Zero, Vector2.Zero },
                { Vector2.Zero, Vector2.Zero }
            });
        }
예제 #2
0
 private void CreateIndexBuffer()
 {
     _indexBuffer?.Dispose();
     _indexBuffer = IndexBuffer.Create <ushort>(RenderContext,
                                                _indexBufferSize,
                                                BufferUsageHint.StreamDraw,
                                                true);
     _indexBuffer.Label = "SpriteBatch IndexBuffer";
 }
예제 #3
0
        public void Clear()
        {
            _usedBlocks = 0;
            _vertices   = new VertexPositionColor[_blocksCapacity * 4];
            _indices    = new uint[_blocksCapacity * 6];

            _vertexBuffer?.Dispose();
            _indexBuffer?.Dispose();

            _vertexBuffer = null;
            _indexBuffer  = null;
        }
예제 #4
0
 public override void Dispose()
 {
     instanceBuffer?.Dispose();
     vertexBuffer?.Dispose();
     indexBuffer?.Dispose();
     ArrayPool<InstanceData>.Shared.Return(instanceData);
 }
예제 #5
0
 private void ShutDownBuffers()
 {
     IndexBuffer?.Dispose();
     IndexBuffer = null;
     VertexBuffer?.Dispose();
     VertexBuffer = null;
 }
예제 #6
0
 public void Dispose()
 {
     VertexBuffer?.Dispose();
     VertexBuffer = null;
     IndexBuffer?.Dispose();
     IndexBuffer = null;
 }
예제 #7
0
        public void Update <T>(IEnumerable <T> vertices, IEnumerable <uint> indices) where T : struct
        {
            var verts = vertices.ToArray();
            var index = indices.ToArray();

            if (verts.Length == 0 || index.Length == 0)
            {
                return;
            }

            var vsize = (uint)(verts.Length * Unsafe.SizeOf <T>());
            var isize = (uint)index.Length * sizeof(uint);

            if (VertexBuffer == null || VertexBuffer.SizeInBytes < vsize)
            {
                VertexBuffer?.Dispose();
                VertexBuffer = _device.ResourceFactory.CreateBuffer(new BufferDescription(vsize, BufferUsage.VertexBuffer | BufferUsage.Dynamic));
            }
            if (IndexBuffer == null || IndexBuffer.SizeInBytes < isize)
            {
                IndexBuffer?.Dispose();
                IndexBuffer = _device.ResourceFactory.CreateBuffer(new BufferDescription(isize, BufferUsage.IndexBuffer | BufferUsage.Dynamic));
            }

            _created = true;

            _device.UpdateBuffer(VertexBuffer, 0, verts);
            _device.UpdateBuffer(IndexBuffer, 0, index);

            VertexCount = verts.Length;
            IndexCount  = index.Length;
        }
예제 #8
0
        protected void FinalizeBuffers(bool force = false)
        {
            if (force || NeedToRecreateVertBuffer)
            {
                VertBuffer?.Dispose();
                VertBuffer = null;
                if (Vertices.Length > 0)
                {
                    VertBuffer = new VertexBuffer(GFX.Device,
                                                  typeof(VertexPositionColorNormal), Vertices.Length, BufferUsage.WriteOnly);
                    VertBuffer.SetData(Vertices);
                }
                NeedToRecreateVertBuffer = false;
            }

            if (force || NeedToRecreateIndexBuffer)
            {
                IndexBuffer?.Dispose();
                IndexBuffer = null;
                if (Indices.Length > 0)
                {
                    IndexBuffer = new IndexBuffer(GFX.Device, IndexElementSize.ThirtyTwoBits, Indices.Length, BufferUsage.WriteOnly);
                    IndexBuffer.SetData(Indices);
                }
                NeedToRecreateIndexBuffer = false;
            }
        }
예제 #9
0
 protected virtual void Dispose(bool disposing)
 {
     if (disposing)
     {
         VertexBuffer.Dispose();
         IndexBuffer?.Dispose();
     }
 }
예제 #10
0
 public void Dispose()
 {
     _vertexBuffer?.Dispose();
     _indexBufferCage?.Dispose();
     _indexBufferCube?.Dispose();
     _decalShader?.Dispose();
     _decalBlend?.Dispose();
 }
예제 #11
0
 public void SetOnly <VType>(VType[] vertices, int[] indices) where VType : struct
 {
     VertexBuffer?.Dispose( );
     IndexBuffer?.Dispose( );
     VertexBuffer = Buffer11.Create <VType>(Device.Device, BindFlags.VertexBuffer, vertices);
     IndexBuffer  = Buffer11.Create(Device.Device, BindFlags.IndexBuffer, indices);
     VertexSize   = SharpDX.Utilities.SizeOf <VType>();
 }
예제 #12
0
 /// <summary>
 /// Frees resources used by this object.
 /// </summary>
 protected virtual void Dispose(bool disposing)
 {
     if (disposing)
     {
         _vertexBuffer?.Dispose();
         _indexBuffer?.Dispose();
     }
 }
예제 #13
0
 /// <inheritdoc />
 /// <summary>
 /// </summary>
 public void Dispose()
 {
     ImGui.DestroyContext(Context);
     Effect?.Dispose();
     RasterizerState?.Dispose();
     VertexBuffer?.Dispose();
     IndexBuffer?.Dispose();
 }
예제 #14
0
 protected override void DisposeBuffers()
 {
     if (!KeepBuffersAlive)
     {
         VertBuffer?.Dispose();
         IndexBuffer?.Dispose();
     }
 }
예제 #15
0
 public void Dispose()
 {
     vertexBuffer?.Dispose();
     indexBuffer?.Dispose();
     texture?.Dispose();
     graphicsDevice?.Dispose();
     effect?.Dispose();
 }
 public override void Dispose()
 {
     vertexBuffer?.Dispose();
     vertexBuffer = null;
     indexBuffer?.Dispose();
     indexBuffer = null;
     TileBufferCount--;
     disposed = true;
 }
예제 #17
0
 public void Dispose()
 {
     _vb?.Dispose();
     _ib?.Dispose();
     _material?.Dispose();
     _texture?.Dispose();
     _textureBinding?.Dispose();
     _wireframeState?.Dispose();
 }
 private void ReleaseBuffers()
 {
     // Release the index buffer.
     IndexBuffer?.Dispose();
     IndexBuffer = null;
     // Release the vertex buffer.
     VertexBuffer?.Dispose();
     VertexBuffer = null;
 }
 private void ShutdownBuffers()
 {
     // Return the index buffer.
     IndexBuffer?.Dispose();
     IndexBuffer = null;
     // Release the vertex buffer.
     VertexBuffer?.Dispose();
     VertexBuffer = null;
 }
예제 #20
0
        public void Render(Camera cam)
        {
            if (!ReadyToRender)
            {
                return;
            }
            var gfxDevice = GameMain.Instance.GraphicsDevice;

            BasicEffect ??= new BasicEffect(gfxDevice);
            BasicEffect.Projection         = Matrix.CreateOrthographicOffCenter(new Rectangle(0, 0, cam.Resolution.X, cam.Resolution.Y), -1f, 1f);
            BasicEffect.View               = cam.Transform;
            BasicEffect.World              = Matrix.Identity;
            BasicEffect.TextureEnabled     = true;
            BasicEffect.VertexColorEnabled = true;
            BasicEffect.Alpha              = 1f;

            int requiredIndexCount = maxSpriteCount * 6;

            if (requiredIndexCount > 0 && (indexBuffer == null || indexBuffer.IndexCount < requiredIndexCount))
            {
                indexBuffer?.Dispose();
                indexBuffer = new IndexBuffer(gfxDevice, IndexElementSize.SixteenBits, requiredIndexCount * 2, BufferUsage.WriteOnly);
                ushort[] indices = new ushort[requiredIndexCount * 2];
                for (int i = 0; i < indices.Length; i += 6)
                {
                    indices[i + 0] = (ushort)((i / 6) * 4 + 1);
                    indices[i + 1] = (ushort)((i / 6) * 4 + 0);
                    indices[i + 2] = (ushort)((i / 6) * 4 + 2);
                    indices[i + 3] = (ushort)((i / 6) * 4 + 1);
                    indices[i + 4] = (ushort)((i / 6) * 4 + 2);
                    indices[i + 5] = (ushort)((i / 6) * 4 + 3);
                }
                indexBuffer.SetData(indices);
            }

            gfxDevice.Indices = indexBuffer;
            for (int i = 0; i < recordedBuffers.Count; i++)
            {
                gfxDevice.SetVertexBuffer(recordedBuffers[i].VertexBuffer);
                BasicEffect.Texture = recordedBuffers[i].Texture;
                BasicEffect.CurrentTechnique.Passes[0].Apply();
                gfxDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, recordedBuffers[i].PolyCount);
            }
        }
예제 #21
0
        public void RebuildBuffer(SharpDX.Direct3D11.Device Device)
        {
            // Dispose all the old stuff
            VertexBuffer?.Dispose();
            IndexBuffer?.Dispose();
            if (Triangles.Count == 0 || Vertices.Count == 0)
            {
                return;                                              // Why build and empty buffer?
            }
            // Reset the AABB
            if (Vertices.Count == 0)
            {
                AABBMin = Vector3.Zero;
                AABBMax = Vector3.Zero;
            }
            else
            {
                AABBMin = Vertices[0].Position;
                AABBMax = Vertices[0].Position;
            }

            // Update the AABB
            float minx = AABBMin.X;
            float miny = AABBMin.Y;
            float minz = AABBMin.Z;
            float maxx = AABBMax.X;
            float maxy = AABBMax.Y;
            float maxz = AABBMax.Z;

            foreach (Vertex 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;
            }
            AABBMin = new Vector3(minx, miny, minz);
            AABBMax = new Vector3(maxx, maxy, maxz);

            // Build the list of floats for the vertex buffer
            List <float> vertexdata = new List <float>();

            foreach (Vertex v in Vertices)
            {
                foreach (float f in v.ToFloats())
                {
                    vertexdata.Add(f);
                }
            }

            // Create and populate the vertex and index buffers
            VertexBuffer = SharpDX.Direct3D11.Buffer.Create <float>(Device, BindFlags.VertexBuffer, vertexdata.ToArray());
            IndexBuffer  = SharpDX.Direct3D11.Buffer.Create <Triangle>(Device, BindFlags.IndexBuffer, Triangles.ToArray());
        }
예제 #22
0
        public void Reset()
        {
            VertBuffer?.Dispose();
            IndBuffer?.Dispose();
            VertBuffer = null;
            IndBuffer  = null;

            Vertices.Clear();
            Indices.Clear();
        }
 /// <summary>
 ///     Frees resources used by this object.
 /// </summary>
 protected virtual void Dispose(bool disposing)
 {
     if (!disposing)
     {
         return;
     }
     VertexBuffer?.Dispose();
     IndexBuffer?.Dispose();
     Effect?.Dispose();
 }
예제 #24
0
        protected virtual void Dispose(bool disposing)
        {
            if (!disposing)
            {
                return;
            }

            _vertexBuffer?.Dispose();

            _indexBuffer?.Dispose();
        }
예제 #25
0
        /// <summary>
        /// Release the memory from the VRAM.
        /// </summary>
        public void ReleaseMemory()
        {
            StagingBuffer?.Dispose();
            StagingBuffer = null;

            IndexBuffer?.Dispose();
            IndexBuffer = null;

            StagingVRAM?.Free();
            VertexVRAM?.Free();
        }
예제 #26
0
파일: FSOF.cs 프로젝트: terrynoya/FreeSO
 public void Dispose()
 {
     FloorTexture?.Dispose();
     WallTexture?.Dispose();
     NightFloorTexture?.Dispose();
     NightWallTexture?.Dispose();
     FloorVGPU?.Dispose();
     FloorIGPU?.Dispose();
     WallVGPU?.Dispose();
     WallIGPU?.Dispose();
 }
예제 #27
0
        public void SComplete(GraphicsDevice gd)
        {
            Rendered = true;
            Verts?.Dispose();
            Indices?.Dispose();

            PrimCount = SIndices.Count / 3;
            if (PrimCount > 0)
            {
                Verts = new VertexBuffer(gd, typeof(DGRP3DVert), SVerts.Count, BufferUsage.None);
                Verts.SetData(SVerts.ToArray());
                Indices = new IndexBuffer(gd, IndexElementSize.ThirtyTwoBits, SIndices.Count, BufferUsage.None);
                Indices.SetData(SIndices.ToArray());
            }

            if (!IffFile.RETAIN_CHUNK_DATA)
            {
                SVerts   = null;
                SIndices = null;
            }
        }
 void IDisposable.Dispose()
 {
     effectInstance?.Dispose(); effectInstance = null;
     if (linesBuffer != indexLinesBuffer && linesBuffer != indexPointsBuffer)
     {
         linesBuffer?.Dispose();
     }
     linesBuffer = null; linesCount = 0;
     triangleBuffer?.Dispose(); triangleBuffer = null; triangleCount = 0;
     vertexFormat?.Dispose();   vertexFormat   = null;
     vertexBuffer?.Dispose();   vertexBuffer   = null; vertexCount = 0;
 }
예제 #29
0
 /// <inheritdoc/>
 protected override void OnDispose()
 {
     try
     {
         _vb?.Dispose();
         _ib?.Dispose();
     }
     finally
     {
         base.OnDispose();
     }
 }
예제 #30
0
		unsafe void UpdateBuffers(ImDrawDataPtr drawData)
		{
			if (drawData.TotalVtxCount == 0)
			{
				return;
			}

			// Expand buffers if we need more room
			if (drawData.TotalVtxCount > _vertexBufferSize)
			{
				_vertexBuffer?.Dispose();

				_vertexBufferSize = (int) (drawData.TotalVtxCount * 1.5f);
				_vertexBuffer = new VertexBuffer(Core.GraphicsDevice, _vertexDeclaration, _vertexBufferSize,
					BufferUsage.None);
				_vertexData = new byte[_vertexBufferSize * _vertexDeclarationSize];
			}

			if (drawData.TotalIdxCount > _indexBufferSize)
			{
				_indexBuffer?.Dispose();

				_indexBufferSize = (int) (drawData.TotalIdxCount * 1.5f);
				_indexBuffer = new IndexBuffer(Core.GraphicsDevice, IndexElementSize.SixteenBits, _indexBufferSize,
					BufferUsage.None);
				_indexData = new byte[_indexBufferSize * sizeof(ushort)];
			}

			// Copy ImGui's vertices and indices to a set of managed byte arrays
			int vtxOffset = 0;
			int idxOffset = 0;

			for (var n = 0; n < drawData.CmdListsCount; n++)
			{
				var cmdList = drawData.CmdListsRange[n];

				fixed (void* vtxDstPtr = &_vertexData[vtxOffset * _vertexDeclarationSize])
				fixed (void* idxDstPtr = &_indexData[idxOffset * sizeof(ushort)])
				{
					Buffer.MemoryCopy((void*) cmdList.VtxBuffer.Data, vtxDstPtr, _vertexData.Length,
						cmdList.VtxBuffer.Size * _vertexDeclarationSize);
					Buffer.MemoryCopy((void*) cmdList.IdxBuffer.Data, idxDstPtr, _indexData.Length,
						cmdList.IdxBuffer.Size * sizeof(ushort));
				}

				vtxOffset += cmdList.VtxBuffer.Size;
				idxOffset += cmdList.IdxBuffer.Size;
			}

			// Copy the managed byte arrays to the gpu vertex- and index buffers
			_vertexBuffer.SetData(_vertexData, 0, drawData.TotalVtxCount * _vertexDeclarationSize);
			_indexBuffer.SetData(_indexData, 0, drawData.TotalIdxCount * sizeof(ushort));
		}
예제 #31
0
        public IndexBuffer ExtractSubset(Device device, short[] triList)
        {
            int numTris = triList.Length;
            IndexBuffer result = null;
            try
            {
                result = new IndexBuffer(device, numTris * 6, Usage.WriteOnly, Pool.Managed, true);
                try
                {
                    var str = result.Lock(0, 0, LockFlags.None);
                    for (var i = 0; i < numTris; i++)
                    {
                        int triNum = triList[i];
                        int offset = triNum * 3;

                        str.Write(this.indices[offset]);
                        str.Write(this.indices[offset+1]);
                        str.Write(this.indices[offset+2]);

                        if (!used[triNum])
                        {
                            used[triNum] = true;
                            UsedCount += 3; // 3 indices used
                        }
                    }
                }
                finally
                {
                    result.Unlock();
                }
                return result;
            }
            catch
            {
                if (result != null) { result.Dispose(); }
                throw;
            }
        }
예제 #32
0
        private void Rebuild(string fIn, string fOut)
        {
            // Check Args
            FileInfo fiIn = new FileInfo(fIn);
            if(!fiIn.Exists) {
                Console.WriteLine("File Does Not Exist");
                return;
            }
            FileInfo fiOut = new FileInfo(fOut);
            if(!fiOut.Directory.Exists) {
                Console.WriteLine("Output Directory Does Not Exist");
                return;
            }

            // Read Model
            Stream s = File.OpenRead(fiIn.FullName);
            VertexPositionNormalTexture[] verts;
            int[] inds;
            if(!ObjParser.TryParse(s, out verts, out inds, ParsingFlags.ConversionOpenGL)) {
                s.Dispose();
                Console.WriteLine("Could Not Read Model");
                return;
            }
            s.Dispose();

            // Compute The AABB Of The Terrain
            BoundingBox aabb = ComputeAABB(verts);
            Vector3 mid = aabb.Max + aabb.Min;
            Vector3 dif = aabb.Max - aabb.Min;
            Vector3 top = new Vector3(mid.X, aabb.Max.Y, mid.Z);
            mid *= 0.5f;
            fx.FogStart = 1f;
            fx.FogEnd = aabb.Max.Y - aabb.Min.Y + 1f;
            fx.World = Matrix.Identity;
            fx.View = Matrix.CreateLookAt(top + Vector3.UnitY, mid, -Vector3.UnitZ);
            fx.Projection = Matrix.CreateOrthographic(dif.X, dif.Z, 0, dif.Y + 2f);

            // Append A Plane At The Bottom
            int vc = verts.Length, ic = inds.Length;
            Array.Resize(ref verts, verts.Length + 4);
            Array.Resize(ref inds, inds.Length + 6);
            inds[ic++] = vc + 0;
            inds[ic++] = vc + 1;
            inds[ic++] = vc + 2;
            inds[ic++] = vc + 2;
            inds[ic++] = vc + 1;
            inds[ic++] = vc + 3;
            verts[vc++] = new VertexPositionNormalTexture(
                new Vector3(aabb.Min.X, aabb.Min.Y, aabb.Min.Z),
                Vector3.UnitY, Vector2.Zero
                );
            verts[vc++] = new VertexPositionNormalTexture(
                new Vector3(aabb.Max.X, aabb.Min.Y, aabb.Min.Z),
                Vector3.UnitY, Vector2.UnitX
                );
            verts[vc++] = new VertexPositionNormalTexture(
                new Vector3(aabb.Min.X, aabb.Min.Y, aabb.Max.Z),
                Vector3.UnitY, Vector2.UnitY
                );
            verts[vc++] = new VertexPositionNormalTexture(
                new Vector3(aabb.Max.X, aabb.Min.Y, aabb.Max.Z),
                Vector3.UnitY, Vector2.One
                );

            // Create Model
            VertexBuffer vb = new VertexBuffer(G, VertexPositionNormalTexture.VertexDeclaration, verts.Length, BufferUsage.WriteOnly);
            vb.SetData(verts);
            IndexBuffer ib = new IndexBuffer(G, IndexElementSize.ThirtyTwoBits, inds.Length, BufferUsage.WriteOnly);
            ib.SetData(inds);

            // Render The Height
            if(rtHeight != null)
                rtHeight.Dispose();
            rtHeight = new RenderTarget2D(G, 4096, 4096, false, SurfaceFormat.Color, DepthFormat.Depth24);
            G.SetRenderTarget(rtHeight);
            G.SetVertexBuffer(vb);
            G.Indices = ib;
            fx.CurrentTechnique.Passes[0].Apply();
            G.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vb.VertexCount, 0, ib.IndexCount / 3);

            // Dispose Of Buffers
            G.SetRenderTarget(null);
            G.Clear(Color.Black);
            G.SetVertexBuffer(null);
            G.Indices = null;
            vb.Dispose();
            ib.Dispose();

            // Save The Image
            using(Stream os = File.Create(fiOut.FullName)) {
                rtHeight.SaveAsPng(os, rtHeight.Width, rtHeight.Height);
            }

            ShouldRebuild = false;
        }
예제 #33
0
		private void DrawFurcationTriangle(float tipx,float tipy,bool pointUp,Matrix lineMat,int furcationValue) {
			const float triSideLenMM=2f;
			float sign=pointUp?1:-1;
			Color color=GetFurcationColor(furcationValue);
			List<Vector3> triPoints=new List<Vector3>();
			//We form an equilateral triangle.
			triPoints.Add(new Vector3(tipx+triSideLenMM/2f,tipy+sign*((float)(triSideLenMM*Math.Sqrt(3)/2f)),0));
			triPoints.Add(new Vector3(tipx,tipy,0));
			triPoints.Add(new Vector3(tipx-triSideLenMM/2f,tipy+sign*((float)(triSideLenMM*Math.Sqrt(3)/2f)),0));
			if(furcationValue==1) {
				DrawExtended3dLine(new Vector3[] { triPoints[0],triPoints[1],triPoints[2] },0.1f,false,color,2f,lineMat);
			} else if(furcationValue==2) {
				DrawExtended3dLine(new Vector3[] { triPoints[0],triPoints[1],triPoints[2],triPoints[0] },0.1f,true,color,2f,lineMat);
			} else if(furcationValue==3) {
				DrawExtended3dLine(new Vector3[] { triPoints[0],triPoints[1],triPoints[2],triPoints[0] },0.1f,true,color,2f,lineMat);
				VertexBuffer triVb=null;
				IndexBuffer triIb=null;
				try{
					CustomVertex.PositionColored[] solidTriVerts=new CustomVertex.PositionColored[] {
									new CustomVertex.PositionColored(triPoints[0],color.ToArgb()),
									new CustomVertex.PositionColored(triPoints[1],color.ToArgb()),
									new CustomVertex.PositionColored(triPoints[2],color.ToArgb()),
								};
					triVb=new VertexBuffer(typeof(CustomVertex.PositionColored),
						CustomVertex.PositionColored.StrideSize*solidTriVerts.Length,
						device,Usage.WriteOnly,CustomVertex.PositionColored.Format,Pool.Managed);
					triVb.SetData(solidTriVerts,0,LockFlags.None);
					int[] triIndicies=new int[] { 0,1,2 };
					triIb=new IndexBuffer(typeof(int),triIndicies.Length,device,Usage.None,Pool.Managed);
					triIb.SetData(triIndicies,0,LockFlags.None);
					device.VertexFormat=CustomVertex.PositionColored.Format;
					device.SetStreamSource(0,triVb,0);
					device.Indices=triIb;
					device.DrawIndexedPrimitives(PrimitiveType.TriangleList,0,0,solidTriVerts.Length,0,triIndicies.Length/3);
				}finally{
					if(triVb!=null){
						triVb.Dispose();
						triVb=null;
					}
					if(triIb!=null){
						triIb.Dispose();
					}
				}
			} else {
				//invalid value. assume no furcation.
			}
		}
예제 #34
0
 /// <summary>
 /// Dispose
 /// </summary>
 /// <param name="someObject">Some object</param>
 public static void Dispose(ref IndexBuffer someObject)
 {
     if (someObject != null)
         someObject.Dispose();
     someObject = null;
 }
예제 #35
0
파일: QuadTree.cs 프로젝트: jwvdiermen/LD28
        private void CollectGeometry(bool enabled, ref VertexBuffer vertexBuffer, ref IndexBuffer indexBuffer)
        {
            // Clear the buffers first.
            if (vertexBuffer != null)
            {
                vertexBuffer.Dispose();
                vertexBuffer = null;
            }
            if (indexBuffer != null)
            {
                indexBuffer.Dispose();
                indexBuffer = null;
            }

            // Collect the vertices and indices.
            var vertices = new List<Vector2>();
            var indices = new List<ushort>();

            Root.CollectGeometry(vertices, indices, enabled);

            // Create the hardware resources.
            if (vertices.Count > 0 && indices.Count > 0)
            {
                vertexBuffer = new VertexBuffer(_graphics, VertexPositionColorTexture.VertexDeclaration, vertices.Count, BufferUsage.None);
                vertexBuffer.SetData(vertices.Select(e => new VertexPositionColorTexture
                {
                    Position = new Vector3(e, 0.0f),
                    Color = Color.White,
                    TextureCoordinate = e / _size

                }).ToArray());

                indexBuffer = new IndexBuffer(_graphics, IndexElementSize.SixteenBits, indices.Count, BufferUsage.None);
                indexBuffer.SetData(indices.ToArray());
            }
        }
예제 #36
0
		public static void DrawColoredRectangle(Device dev,RectangleF rect,Color color){
			VertexBuffer vb=null;
			IndexBuffer ib=null;
			try{
				int colorArgb=color.ToArgb();
				CustomVertex.PositionColored[] quadVerts=new CustomVertex.PositionColored[] {
						new CustomVertex.PositionColored(rect.Left,rect.Bottom,0,colorArgb),
						new CustomVertex.PositionColored(rect.Left,rect.Top,0,colorArgb),
						new CustomVertex.PositionColored(rect.Right,rect.Top,0,colorArgb),
						new CustomVertex.PositionColored(rect.Right,rect.Bottom,0,colorArgb),
					};
				vb=new VertexBuffer(typeof(CustomVertex.PositionColored),
					CustomVertex.PositionColored.StrideSize*quadVerts.Length,
					dev,Usage.WriteOnly,CustomVertex.PositionColored.Format,Pool.Managed);
				vb.SetData(quadVerts,0,LockFlags.None);
				int[] indicies=new int[] { 0,1,2,0,2,3 };
				ib=new IndexBuffer(typeof(int),indicies.Length,dev,Usage.None,Pool.Managed);
				ib.SetData(indicies,0,LockFlags.None);
				dev.VertexFormat=CustomVertex.PositionColored.Format;
				dev.SetStreamSource(0,vb,0);
				dev.Indices=ib;
				dev.DrawIndexedPrimitives(PrimitiveType.TriangleList,0,0,quadVerts.Length,0,indicies.Length/3);
			}finally{
				if(vb!=null){
					vb.Dispose();
					vb=null;
				}
				if(ib!=null){
					ib.Dispose();
					ib=null;
				}
			}
		}
예제 #37
0
		private void DrawDroplet(float x,float y,Color dropletColor){
			int dropletColorArgb=dropletColor.ToArgb();
			List<PointF> dropletVertsP=TcData.GetDropletVertices();
			List<CustomVertex.PositionColored> dropletVertsV=new List<CustomVertex.PositionColored>();
			for(int p=0;p<dropletVertsP.Count;p++) {
				dropletVertsV.Add(new CustomVertex.PositionColored(
					x+dropletVertsP[p].X,y+dropletVertsP[p].Y,0,dropletColorArgb));
			}
			//This point is implied and is the last point.
			dropletVertsV.Add(new CustomVertex.PositionColored(x,y,0,dropletColorArgb));
			VertexBuffer vb=new VertexBuffer(typeof(CustomVertex.PositionColored),
				CustomVertex.PositionColored.StrideSize*dropletVertsV.Count,
				device,Usage.WriteOnly,CustomVertex.PositionColored.Format,Pool.Managed);
			vb.SetData(dropletVertsV.ToArray(),0,LockFlags.None);
			List<int> indiciesL=new List<int>();
			for(int v=0;v<dropletVertsV.Count-2;v++) {
				indiciesL.Add(0);
				indiciesL.Add(v+1);
				indiciesL.Add(v+2);
			}
			int[] indicies=indiciesL.ToArray();
			IndexBuffer ib=new IndexBuffer(typeof(int),indicies.Length,device,Usage.None,Pool.Managed);
			ib.SetData(indicies,0,LockFlags.None);
			device.VertexFormat=CustomVertex.PositionColored.Format;
			device.SetStreamSource(0,vb,0);
			device.Indices=ib;
			device.DrawIndexedPrimitives(PrimitiveType.TriangleList,0,0,dropletVertsV.Count,0,indicies.Length/3);
			ib.Dispose();
			vb.Dispose();
		}
예제 #38
0
        public IndexBuffer BuildRemainder(Device device)
        {
            if (UsedCount == indices.Length) { return null; }

            int numIndices = indices.Length - UsedCount;
            IndexBuffer result = null;
            try
            {
                result = new IndexBuffer(device, numIndices * 2, Usage.WriteOnly, Pool.Managed, true);

                try
                {
                    var str = result.Lock(0, 0, LockFlags.None);
                    int numTris = used.Length;
                    for (var i = 0; i < numTris; i++)
                    {
                        if (used[i]) { continue; }

                        int offset = i * 3;

                        str.Write(this.indices[offset]);
                        str.Write(this.indices[offset + 1]);
                        str.Write(this.indices[offset + 2]);
                    }
                }
                finally
                {
                    result.Unlock();
                }
                return result;
            }
            catch
            {
                if (result != null) { result.Dispose(); }
                throw;
            }
        }
예제 #39
0
		///<summary>Draws the number and the small rectangle behind it.  Draws in the appropriate color.  isFullRedraw means that all of the toothnumbers are being redrawn.  This helps with a few optimizations and with not painting blank rectangles when not needed.</summary>
		private void DrawNumber(string tooth_id,bool isSelected,float offsetY) {
			if(!Tooth.IsValidDB(tooth_id)) {
				return;
			}
			if(TcData.ListToothGraphics[tooth_id].HideNumber) {//if this is a "hidden" number
				return;//skip
			}
			//primary, but not set to show primary letters
			if(Tooth.IsPrimary(tooth_id) && !TcData.ListToothGraphics[Tooth.PriToPerm(tooth_id)].ShowPrimaryLetter){
				return;
			}
			device.RenderState.Lighting=false;
			device.RenderState.ZBufferEnable=false;
			device.Transform.World=Matrix.Identity;
			string displayNum=Tooth.GetToothLabelGraphic(tooth_id,TcData.ToothNumberingNomenclature);
			SizeF labelSize=MeasureStringMm(displayNum);
			RectangleF recMm=TcData.GetNumberRecMm(tooth_id,labelSize);
			recMm.Y+=offsetY;
			Color foreColor=TcData.ColorText;
			if(isSelected) {
				foreColor=TcData.ColorTextHighlight;
				//Draw the background rectangle only if the text is selected.
				int backColorARGB=TcData.ColorBackHighlight.ToArgb();
				CustomVertex.PositionColored[] quadVerts=new CustomVertex.PositionColored[] {
			    new CustomVertex.PositionColored(recMm.X,recMm.Y,0,backColorARGB),//LL
			    new CustomVertex.PositionColored(recMm.X,recMm.Y+recMm.Height,0,backColorARGB),//UL
			    new CustomVertex.PositionColored(recMm.X+recMm.Width,recMm.Y+recMm.Height,0,backColorARGB),//UR
			    new CustomVertex.PositionColored(recMm.X+recMm.Width,recMm.Y,0,backColorARGB),//LR
			  };
				VertexBuffer vb=new VertexBuffer(typeof(CustomVertex.PositionColored),CustomVertex.PositionColored.StrideSize*quadVerts.Length,
					device,Usage.WriteOnly,CustomVertex.PositionColored.Format,Pool.Managed);
				vb.SetData(quadVerts,0,LockFlags.None);
				int[] indicies=new int[] { 0,1,2,0,2,3 };
				IndexBuffer ib=new IndexBuffer(typeof(int),indicies.Length,device,Usage.None,Pool.Managed);
				ib.SetData(indicies,0,LockFlags.None);
				device.VertexFormat=CustomVertex.PositionColored.Format;
				device.SetStreamSource(0,vb,0);
				device.Indices=ib;
				device.DrawIndexedPrimitives(PrimitiveType.TriangleList,0,0,quadVerts.Length,0,indicies.Length/3);
				ib.Dispose();
				vb.Dispose();
			}
			//Offsets the text by 10% of the rectangle width to ensure that there is at least on pixel of space on
			//the left for the background rectangle.
			PrintString(displayNum,recMm.X+recMm.Width*0.1f,recMm.Y+recMm.Height,0,foreColor,xfont);
		}
예제 #40
0
		private void DrawProbingBar(int intTooth,PerioSurf perioSurf){
			const float barWidthMM=0.6f;
			Color colorBar;
			LineSimple barPoints=TcData.GetProbingLine(intTooth,perioSurf,out colorBar);
			if(barPoints==null){
				return;
			}
			CustomVertex.PositionColored[] quadVerts=new CustomVertex.PositionColored[] {
			    new CustomVertex.PositionColored(barPoints.Vertices[0].X-barWidthMM/2f,barPoints.Vertices[0].Y,0,colorBar.ToArgb()),
			    new CustomVertex.PositionColored(barPoints.Vertices[0].X-barWidthMM/2f,barPoints.Vertices[1].Y,0,colorBar.ToArgb()),
			    new CustomVertex.PositionColored(barPoints.Vertices[0].X+barWidthMM/2f,barPoints.Vertices[1].Y,0,colorBar.ToArgb()),
			    new CustomVertex.PositionColored(barPoints.Vertices[0].X+barWidthMM/2f,barPoints.Vertices[0].Y,0,colorBar.ToArgb()),
			  };
			VertexBuffer vb=new VertexBuffer(typeof(CustomVertex.PositionColored),
				CustomVertex.PositionColored.StrideSize*quadVerts.Length,
			  device,Usage.WriteOnly,CustomVertex.PositionColored.Format,Pool.Managed);
			vb.SetData(quadVerts,0,LockFlags.None);
			int[] indicies=new int[] { 0,1,2,0,2,3 };
			IndexBuffer ib=new IndexBuffer(typeof(int),indicies.Length,device,Usage.None,Pool.Managed);
			ib.SetData(indicies,0,LockFlags.None);
			device.VertexFormat=CustomVertex.PositionColored.Format;
			device.SetStreamSource(0,vb,0);
			device.Indices=ib;
			device.DrawIndexedPrimitives(PrimitiveType.TriangleList,0,0,quadVerts.Length,0,indicies.Length/3);
			ib.Dispose();
			vb.Dispose();
		}