public void Render(OpenGL gl, RenderMode renderMode)
        {
            ColorTemplate colorTemplate = this.colorTemplate;

            if (colorTemplate == null)
            {
                return;
            }

            IRenderContextProvider rc = gl.RenderContextProvider;

            Debug.Assert(rc != null);

            int width  = 0;
            int height = 0;

            if (rc != null)
            {
                width  = rc.Width;
                height = rc.Height;
            }
            else
            {
                int[] viewport = new int[4];
                gl.GetInteger(OpenGL.GL_VIEWPORT, viewport);
                width  = viewport[2];
                height = viewport[3];
            }

            if (graphics == null && viewControl != null)
            {
                graphics = viewControl.CreateGraphics();
            }

            int blockWidth = (width - colorTemplate.Margin.Left - colorTemplate.Margin.Right) / (colorTemplate.Colors.Length - 1);

            //draw numbers
            for (int i = 0; i < colorTemplate.Colors.Length; i++)
            {
                string value = (minValue * (double)(colorTemplate.Colors.Length - 1 - i) / (colorTemplate.Colors.Length - 1)
                                + maxValue * (double)i / (colorTemplate.Colors.Length - 1)).ToString();
                float valueLength = 0f;
                if (graphics != null)
                {
                    valueLength = graphics.MeasureString(value, font).Width;
                }
                float x = colorTemplate.Margin.Left + i * blockWidth - valueLength / 2;
                int   y = colorTemplate.Margin.Bottom - 20;
                gl.DrawText((int)x, (int)y, 1, 1, 1, "Courier New", 12.0f, value);
            }
        }
示例#2
0
        public override void Push(OpenGL gl, SceneElement parentElement)
        {
            IRenderContextProvider rc = gl.RenderContextProvider;

            Debug.Assert(rc != null);

            int width  = 0;;
            int height = 0;

            if (rc != null)
            {
                width  = rc.Width;
                height = rc.Height;
            }
            else
            {
                int[] viewport = new int[4];
                gl.GetInteger(OpenGL.GL_VIEWPORT, viewport);
                width  = viewport[2];
                height = viewport[3];
            }

            gl.MatrixMode(SharpGL.Enumerations.MatrixMode.Projection);
            gl.PushMatrix();
            gl.LoadIdentity();
            gl.Ortho(-CenterX, width - CenterX, -CenterY, height - CenterY, zNear, zFar);
            LookAtCamera camera = this.Camera;

            if (camera == null)
            {
                gl.LookAt(0, 0, 1, 0, 0, 0, 0, 1, 0);
                //throw new Exception("Camera not set!");
            }
            else
            {
                Vertex position = camera.Position - camera.Target;
                position.Normalize();
                gl.LookAt(position.X, position.Y, position.Z,
                          0, 0, 0,
                          camera.UpVector.X, camera.UpVector.Y, camera.UpVector.Z);
            }

            gl.MatrixMode(SharpGL.Enumerations.MatrixMode.Modelview);
            gl.PushMatrix();
            //gl.LoadIdentity();
            arcBall.TransformMatrix(gl);
        }
示例#3
0
        private static bool TryGetHandleToBitmap(IRenderContextProvider renderContextProvider, out IntPtr handleToBitmap)
        {
            var dibSectionRenderContextProvider = renderContextProvider as DIBSectionRenderContextProvider;

            if (dibSectionRenderContextProvider != null)
            {
                handleToBitmap = dibSectionRenderContextProvider.DIBSection.HBitmap;
                return(true);
            }
            var fboRenderContextProvider = renderContextProvider as FBORenderContextProvider;

            if (fboRenderContextProvider != null)
            {
                handleToBitmap = fboRenderContextProvider.InternalDIBSection.HBitmap;
                return(true);
            }
            handleToBitmap = IntPtr.Zero;
            return(false);
        }
        protected void CalculateViewport(OpenGL gl, SimpleUIRectArgs args)
        {
            IRenderContextProvider rcp = gl.RenderContextProvider;

            Debug.Assert(rcp != null, "The gl.RenderContextProvider is null!");

            if (rcp != null)
            {
                args.viewWidth  = rcp.Width;
                args.viewHeight = rcp.Height;
            }
            else
            {
                int[] viewport = new int[4];
                gl.GetInteger(OpenGL.GL_VIEWPORT, viewport);
                args.viewWidth  = viewport[2];
                args.viewHeight = viewport[3];
            }
        }
示例#5
0
        /// <summary>
        /// Creates the OpenGL instance using an external, existing render context.
        /// </summary>
        /// <param name="openGLVersion">The OpenGL version requested.</param>
        /// <param name="width">The width.</param>
        /// <param name="height">The height.</param>
        /// <param name="bitDepth">The bit depth.</param>
        /// <param name="windowHandle">The window handle.</param>
        /// <param name="renderContextHandle">The render context handle.</param>
        /// <param name="deviceContextHandle">The device context handle.</param>
        /// <returns>
        /// True on success
        /// </returns>
        public virtual bool CreateFromExternalContext(OpenGLVersion openGLVersion, int width, int height, int bitDepth, IntPtr windowHandle, IntPtr renderContextHandle, IntPtr deviceContextHandle)
        {
            // Return if we don't have a sensible width or height.
            if (width == 0 || height == 0 || bitDepth == 0)
            {
                return false;
            }

            renderContextProvider = new ExternalRenderContextProvider(windowHandle, renderContextHandle, deviceContextHandle);
            renderContextProvider.Create(openGLVersion, this, width, height, bitDepth, null);

            return true;
        }
示例#6
0
        /// <summary>
        /// Creates the OpenGL instance.
        /// </summary>
        /// <param name="openGLVersion">The OpenGL version requested.</param>
        /// <param name="renderContextType">Type of the render context.</param>
        /// <param name="width">The drawing context width.</param>
        /// <param name="height">The drawing context height.</param>
        /// <param name="bitDepth">The bit depth.</param>
        /// <param name="parameter">The parameter.</param>
        /// <returns></returns>
        public virtual bool Create(OpenGLVersion openGLVersion, RenderContextType renderContextType, int width, int height, int bitDepth, object parameter)
        {
            //  Return if we don't have a sensible width or height.
            if(width == 0 || height == 0 || bitDepth == 0)
                return false;

            // TODO: [RS] I suggest to replace the switch-case statement with a RenderContextProviderFactory.

            //	Create an instance of the render context provider.
            switch (renderContextType)
            {
                case RenderContextType.DIBSection:
                    renderContextProvider = new DIBSectionRenderContextProvider();
                    break;
                case RenderContextType.NativeWindow:
                    renderContextProvider = new NativeWindowRenderContextProvider();
                    break;
                case RenderContextType.HiddenWindow:
                    renderContextProvider = new HiddenWindowRenderContextProvider();
                    break;
                case RenderContextType.FBO:
                    renderContextProvider = new FBORenderContextProvider();
                    break;
            }

            //	Create the render context.
            renderContextProvider.Create(openGLVersion, this, width, height, bitDepth, parameter);

            return true;
        }
示例#7
0
        public override void Push(OpenGL gl, SceneElement parentElement)
        {
            IRenderContextProvider rc = gl.RenderContextProvider;

            Debug.Assert(rc != null);

            int width  = 0;
            int height = 0;

            if (rc != null)
            {
                width  = rc.Width;
                height = rc.Height;
            }
            else
            {
                int[] viewport = new int[4];
                gl.GetInteger(OpenGL.GL_VIEWPORT, viewport);
                width  = viewport[2];
                height = viewport[3];
            }

            gl.MatrixMode(SharpGL.Enumerations.MatrixMode.Projection);
            gl.PushMatrix();
            gl.LoadIdentity();
            System.Windows.Forms.Padding margin = colorTemplate.Margin;
            int targetOrthoBarWidth             = width - colorTemplate.Margin.Left - colorTemplate.Margin.Right;

            if (targetOrthoBarWidth <= 0)
            {
                targetOrthoBarWidth = 1;
            }
            int scaledWidth = width * colorTemplate.Width / targetOrthoBarWidth;
            int scaledLeft  = -colorTemplate.Margin.Left * colorTemplate.Width / targetOrthoBarWidth;
            int scaledRight = scaledLeft + scaledWidth;

            if (scaledLeft >= scaledRight)
            {
                scaledRight = scaledLeft + 1;
            }
            gl.Ortho(scaledLeft, scaledRight,
                     -colorTemplate.Margin.Bottom, height - colorTemplate.Margin.Bottom,
                     zNear, zFar);

            LookAtCamera camera = null;// this.Camera;

            if (camera == null)
            {
                gl.LookAt(0, 0, 1, 0, 0, 0, 0, 1, 0);
                //throw new Exception("Camera not set!");
            }
            else
            {
                Vertex position = camera.Position - camera.Target;
                position.Normalize();
                gl.LookAt(position.X, position.Y, position.Z,
                          0, 0, 0,
                          camera.UpVector.X, camera.UpVector.Y, camera.UpVector.Z);
            }

            gl.MatrixMode(SharpGL.Enumerations.MatrixMode.Modelview);
            gl.PushMatrix();
            //gl.LoadIdentity();
        }