Exemple #1
0
        //public abstract void OnButtonClick(T_button_id id);
        //public abstract void OnButtonDoubleClick(T_button_id id);

        public ButtonObserverConnector(IButtonObserver<T_button_id> impl)
        {
            __impl = impl;
            // Wir bauen uns das Interface im Speicher.
            // - 1 Pointer zur Virtual Method Table
            // - danach, weil ein Interface keine Member hat, gleich die Pointer
            //   auf unsere Delegates (1 VTBL + 2 Delegate = 3 Pointer)
            NativePointer = Marshal.AllocHGlobal(IntPtr.Size * 3);

            // Die VTBL zeigt auf die Adresse danach und wird an die erste
            // Stelle geschrieben.
            IntPtr vtblPtr = PtrHelper.Add(NativePointer, IntPtr.Size);
            Marshal.WriteIntPtr(NativePointer, vtblPtr);

            // Nun hintereinander weg die einzelnen Funktionen.
            _downCallBack = new OnButtonDownCallBack(OnButtonDown);
            Marshal.WriteIntPtr(vtblPtr,
                PtrHelper.GetFunctionPointerForDelegate<OnButtonDownCallBack>
                    (_downCallBack, out _onButtonDownBinder));

            _upCallBack = new OnButtonUpCallBack(OnButtonUp);
            Marshal.WriteIntPtr(PtrHelper.Add(vtblPtr, IntPtr.Size),
                PtrHelper.GetFunctionPointerForDelegate<OnButtonUpCallBack>
                    (_upCallBack, out _onButtonUpBinder));

            //_clickCallBack = new onButtonClickCallBack(onButtonClick);
            //Marshal.WriteIntPtr(PtrHelper.Add(vtblPtr, IntPtr.Size * 2),
            //	PtrHelper.GetFunctionPointerForDelegate<onButtonClickCallBack>
            //		(_clickCallBack, out _onButtonClickBinder));

            //_doubleClickCallBack = new onButtonDoubleClickCallBack(onButtonDoubleClick);
            //Marshal.WriteIntPtr(PtrHelper.Add(vtblPtr, IntPtr.Size * 3),
            //	PtrHelper.GetFunctionPointerForDelegate<onButtonDoubleClickCallBack>
            //		(_doubleClickCallBack, out _onButtonDoubleClickBinder));
        }
Exemple #2
0
        private IBuffer GetGlBuffer(ref IBuffer glBuffer, BufferTarget target, int offset)
        {
            if (!dirty)
            {
                return(glBuffer);
            }
            var nonDynamic        = rawDataResource.Volatility != ResourceVolatility.Volatile;
            var resourcePtr       = rawDataResource.Map();
            var resourceOffsetPtr = resourcePtr + offset;
            var glBufferSize      = rawDataResource.Size - offset;

            if (glBuffer == null || glBuffer.SizeInBytes != glBufferSize)
            {
                glBuffer?.Dispose();
                var usage = nonDynamic
                    ? BufferUsageHint.StaticDraw
                    : BufferUsageHint.DynamicDraw;
                // todo: target for index buffer
                glBuffer = infra.GlContext.Create.Buffer(target, glBufferSize, usage, resourceOffsetPtr);
            }
            else if (nonDynamic)
            {
                glBuffer.SetData(resourceOffsetPtr);
            }
            else
            {
                var bufferPtr = glBuffer.Map(0, glBufferSize, MapAccess.Write | MapAccess.InvalidateBuffer);
                PtrHelper.CopyBulk((byte *)bufferPtr, (byte *)resourceOffsetPtr, glBufferSize);
                glBuffer.Unmap();
            }
            rawDataResource.Unmap(false);
            dirty = false;
            return(glBuffer);
        }
Exemple #3
0
        public AvatarAdapterConnector(IAvatarAdapter impl)
        {
            _impl         = impl;
            NativePointer = Marshal.AllocHGlobal(IntPtr.Size * 5);

            IntPtr vtblPtr = PtrHelper.Add(NativePointer, IntPtr.Size);

            Marshal.WriteIntPtr(NativePointer, vtblPtr);

            _setTargetVelocityCallBack = new setTargetVelocityCallBack(setTargetVelocity);
            Marshal.WriteIntPtr(vtblPtr,
                                PtrHelper.GetFunctionPointerForDelegate <setTargetVelocityCallBack>
                                    (_setTargetVelocityCallBack, out _setTargetVelocityCallBackBinder));

            _setTargetTurnVelocityCallBack = new setTargetTurnVelocityCallBack(setTargetTurnVelocity);
            Marshal.WriteIntPtr(PtrHelper.Add(vtblPtr, IntPtr.Size),
                                PtrHelper.GetFunctionPointerForDelegate <setTargetTurnVelocityCallBack>
                                    (_setTargetTurnVelocityCallBack, out _setTargetTurnVelocityCallBackBinder));

            _getVelocityCallBack = new getVelocityCallBack(getVelocity);
            Marshal.WriteIntPtr(PtrHelper.Add(vtblPtr, IntPtr.Size * 2),
                                PtrHelper.GetFunctionPointerForDelegate <getVelocityCallBack>
                                    (_getVelocityCallBack, out _getVelocityCallBackBinder));

            _getTurnVelocityCallBack = new getTurnVelocityCallBack(getTurnVelocity);
            Marshal.WriteIntPtr(PtrHelper.Add(vtblPtr, IntPtr.Size * 3),
                                PtrHelper.GetFunctionPointerForDelegate <getTurnVelocityCallBack>
                                    (_getTurnVelocityCallBack, out _getTurnVelocityCallBackBinder));
        }
        public unsafe void SetData(T data)
        {
            var stackBuffer = stackalloc byte[buffer.SizeInBytes];

            PtrHelper.Write(stackBuffer, data);
            buffer.SetData((IntPtr)stackBuffer);
        }
Exemple #5
0
 public RawDataResource(ResourceVolatility volatility, IntPtr data, int size)
     : base(volatility)
 {
     Size           = size;
     permanentArray = new UnmanagedArray(size);
     PtrHelper.CopyBulk((byte *)permanentArray.Data, (byte *)data, size);
     getStream = () => new UnmanagedMemoryStream((byte *)permanentArray.Data, size);
 }
Exemple #6
0
            protected Error Convert(IList[] dataList, Func <IntPtr, Int32, Error> externCall)
            {
                var data  = PtrHelper.RefLists(dataList);
                var count = dataList.Sum(e => e.Count);

                var result = externCall(data, count);

                PtrHelper.FreeLists(data, dataList);

                return(result);
            }
        public unsafe IVertexArray GetVao()
        {
            if (!isDirty && NumPoints == lastPointCount)
            {
                return(vao);
            }

            if (aspect.VisualBorderCurve == null || aspect.VisualBorderCurve.Count == 0)
            {
                return(null);
            }

            if (vao == null)
            {
                vao = glContext.Create.VertexArray();
            }

            var newPointCount = NumPoints;

            if (vertexBuffer == null || bufferPointCapacity < newPointCount)
            {
                vertexBuffer?.Dispose();
                while (bufferPointCapacity < newPointCount)
                {
                    bufferPointCapacity *= 2;
                }
                vertexBuffer = glContext.Create.Buffer(BufferTarget.Array, bufferPointCapacity * sizeof(Vector4), BufferUsageHint.DynamicDraw);
                vao.SetVertexAttributeF(0, vertexBuffer, VertexAttributeDimension.Four, VertexAttribPointerType.Float, false, sizeof(Vector4), 0);
            }

            var rawData = aspect.BorderComplete
                ? aspect.VisualBorderCurve.Concat(aspect.VisualBorderCurve.First().EnumSelf()).Select(xy => new Vector4(xy, 0, 1)).ToArray()
                : aspect.VisualBorderCurve.Select(xy => new Vector4(xy, 0, 1)).ToArray();

            var sizeInBytes = rawData.Length * sizeof(Vector4);
            var dst         = vertexBuffer.Map(0, vertexBuffer.SizeInBytes, MapAccess.Write | MapAccess.InvalidateBuffer);

            fixed(Vector4 *src = rawData)
            PtrHelper.CopyBulk((byte *)dst, (byte *)src, sizeInBytes);

            vertexBuffer.Unmap();

            lastPointCount = newPointCount;
            isDirty        = false;
            return(vao);
        }
Exemple #8
0
        public AnalogObserverConnector(IAnalogObserver<T_analog_id, T_analog_data> impl)
        {
            _impl = impl;
            NativePointer = Marshal.AllocHGlobal(IntPtr.Size * 3);

            IntPtr vtblPtr = PtrHelper.Add(NativePointer, IntPtr.Size);
            Marshal.WriteIntPtr(NativePointer, vtblPtr);

            // Warum diese Methoden hier andersrum stehen als im C++-Interface
            // könnte mal jemand klären...
            _changedCallBack = new OnAnalogChangedCallBack(OnAnalogChanged);
            Marshal.WriteIntPtr(vtblPtr,
                PtrHelper.GetFunctionPointerForDelegate<OnAnalogChangedCallBack>
                    (_changedCallBack, out _onChangedBinder));

            _changedChannelCallBack = new OnAnalogChannelChangedCallBack(OnAnalogChannelChanged);
            Marshal.WriteIntPtr(PtrHelper.Add(vtblPtr, IntPtr.Size),
                PtrHelper.GetFunctionPointerForDelegate<OnAnalogChannelChangedCallBack>
                    (_changedChannelCallBack, out _onChannelChangedBinder));
        }
Exemple #9
0
        public void Draw()
        {
            var sketches        = sketchService.GetSketches();
            var totalPointCount = sketches.Sum(x => x.Count);

            if (totalPointCount == 0)
            {
                return;
            }

            if (data == null || totalPointCount > data.Length)
            {
                vertexBuffer?.Dispose();
                var size = data?.Length ?? 1024;
                while (size < totalPointCount)
                {
                    size *= 2;
                }

                data         = new Vector2[size];
                vertexBuffer = glContext.Create.Buffer(BufferTarget.Array, data.Length * sizeof(Vector2), BufferUsageHint.DynamicDraw);
                vao.SetVertexAttributeF(0, vertexBuffer, VertexAttributeDimension.Two, VertexAttribPointerType.Float, false, sizeof(Vector2), 0);
            }

            int offset = 0;

            foreach (var sketch in sketches)
            {
                foreach (var point in sketch)
                {
                    data[offset++] = point;
                }
            }

            var sketchSize = totalPointCount * sizeof(Vector2);
            var map        = vertexBuffer.Map(0, sketchSize, MapAccess.Write | MapAccess.InvalidateRange);

            fixed(Vector2 *pData = data)
            PtrHelper.CopyBulk((byte *)map, (byte *)pData, sketchSize);

            vertexBuffer.Unmap();

            glContext.Bindings.Program.Set(shaderProgram);
            glContext.Bindings.VertexArray.Set(vao);

            glContext.States.DepthStencil.DepthTestEnable.Set(false);
            glContext.States.DepthStencil.DepthMask.Set(false);

            OpenTK.Graphics.OpenGL4.GL.LineWidth(6f);

            offset = 0;
            foreach (var sketch in sketches)
            {
                glContext.Actions.Draw.Arrays(BeginMode.LineStrip, offset, sketch.Count);
                offset += sketch.Count;
            }

            OpenTK.Graphics.OpenGL4.GL.LineWidth(1f);

            glContext.States.DepthStencil.DepthTestEnable.Set(true);
            glContext.States.DepthStencil.DepthMask.Set(true);
        }
 public UniformBufferSugar(IContext glContext)
 {
     buffer = glContext.Create.Buffer(BufferTarget.Uniform, PtrHelper.SizeOf <T>(), BufferUsageHint.DynamicDraw);
 }