c# winform sharpgl, get modelview matrix and openglControl doesen't drawing

325 Views Asked by At

I have an interresting thing. I want to get the rendered objects window coordinates. When i use this in OpenGLDraw event:

        var modelview = new double[16];            
        gl.GetDouble(OpenGL.GL_MODELVIEW_MATRIX, modelview);

Drawing doenes't work. Environment: VS 2019 community edition, SharpGL.WinForms 3.1.1., c# winform project, framework 4.6.1

OpenGLControl events: Init, I need only 2D space.

    private void RenderPanel_OpenGLInitialized(object sender, EventArgs e)
{
    gl = RenderPanel.OpenGL;
    gl.Disable(OpenGL.GL_DEPTH_TEST);
    gl.Enable(OpenGL.GL_BLEND);
    gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_ONE_MINUS_SRC_ALPHA);

    gl.LoadIdentity();
    gl.MatrixMode(OpenGL.GL_PROJECTION);
    gl.LoadIdentity();
    gl.Viewport(0, 0, RenderPanel.Width, RenderPanel.Height);
    gl.Ortho(0, RenderPanel.Width, RenderPanel.Height, 0, 1, -1);
    gl.MatrixMode(OpenGL.GL_MODELVIEW);
    gl.LoadIdentity();
}

Draw: It's works fine, drawing objects

        private void RenderPanel_OpenGLDraw(object sender, RenderEventArgs args)
    {
        gl.ClearColor(1, 1, 1, 1);
        gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
        gl.LoadIdentity();
        glColor(Color.White);
        gl.Enable(OpenGL.GL_TEXTURE_2D);
        foreach (ImageItem img in ImageItems.Items)
        {
            img.Draw();
        }
    }

I want use this in foreach loop, after the img.Draw() (part of code)

    var modelview = new double[16];
    var projection = new double[16];
    var viewport = new int[4];
    var winx = new double[1];
    var winy = new double[1];
    var winz = new double[1];
    gl.GetDouble(OpenGL.GL_MODELVIEW_MATRIX, modelview);
    gl.GetDouble(OpenGL.GL_PROJECTION_MATRIX, projection);
    gl.GetInteger(OpenGL.GL_VIEWPORT, viewport);
    gl.Project(0, 0, 0, modelview, projection, viewport, winx, winy, winz);

try to debug, comment row by row. I see when use gl.GetDouble() drawing gone. I get a correct window coordinates just last object disappear. .Draw() is simple

    gl.BindTexture(OpenGL.GL_TEXTURE_2D, TextureID);
    gl.LoadIdentity();
    gl.Color(1f, 1f, 1f, pos.a);
    gl.Translate(pos.x, pos.y, 0);
    gl.Rotate(pos.r, 0, 0);
    OpenGLDraw.DrawQuad(pos.w, pos.h);
1

There are 1 best solutions below

0
On

It's a bug. I planted this 2 rows to some sample projects and drawing method borken(some objects disappear). I try to lots of thing. Finally changed renderContextType and the last object appear. I think so not a good solution but works.