private void PickingLastLineInLineLoop(out uint[] vertexIds, out vec3[] positions) { const int vertexCount = 2; VertexBuffer buffer = this.Renderer.PickingRenderUnit.PositionBuffer; var offsets = new int[vertexCount] { (buffer.VertexCount - 1) * buffer.Config.GetDataSize() * buffer.Config.GetDataTypeByteLength(), 0, }; vertexIds = new uint[vertexCount]; positions = new vec3[vertexCount]; buffer.Bind(); for (int i = 0; i < vertexCount; i++) { IntPtr pointer = buffer.MapBufferRange( offsets[i], 1 * buffer.Config.GetDataSize() * buffer.Config.GetDataTypeByteLength(), MapBufferRangeAccess.MapReadBit, false); unsafe { var array = (vec3 *)pointer.ToPointer(); positions[i] = array[0]; } buffer.UnmapBuffer(false); vertexIds[i] = (uint)offsets[i] / (uint)(buffer.Config.GetDataSize() * buffer.Config.GetDataTypeByteLength()); } buffer.Unbind(); }
protected vec3[] FillPickedGeometrysPosition(uint[] indexes) { var positions = new vec3[indexes.Length]; VertexBuffer buffer = this.Renderer.PositionBuffer; buffer.Bind(); for (int i = 0; i < indexes.Length; i++) { int offset = (int)(indexes[i] * buffer.Config.GetDataSize() * buffer.Config.GetDataTypeByteLength()); //IntPtr pointer = GL.MapBuffer(BufferTarget.ArrayBuffer, MapBufferAccess.ReadOnly); IntPtr pointer = buffer.MapBufferRange( offset, 1 * buffer.Config.GetDataSize() * buffer.Config.GetDataTypeByteLength(), MapBufferRangeAccess.MapReadBit, false); if (pointer.ToInt64() != 0) { unsafe { var array = (vec3 *)pointer.ToPointer(); positions[i] = array[0]; } } else { ErrorCode error = (ErrorCode)GL.Instance.GetError(); if (error != ErrorCode.NoError) { Debug.WriteLine(string.Format( "Error:[{0}] glMapBufferRange failed: buffer ID: [{1}]", error, buffer.BufferId.ToString())); } } buffer.UnmapBuffer(false); } buffer.Unbind(); return(positions); }