изменение размера окна без влияния на содержимое - PullRequest
1 голос
/ 19 марта 2019

Я пытаюсь добавить возможность изменять размер окна приложения, не вызывая растягивание содержимого окна одновременно. я попытался изменить операторы if и попробовал другие вычисления отношения без каких-либо последствий

protected override void OnResize(EventArgs e)
    {
        base.OnResize(e);

        if (mShader != null)
        {
            int uProjectionLocation = GL.GetUniformLocation(mShader.ShaderProgramID, "uProjection");
            int windowHeight = ClientRectangle.Height;
            int windowWidth = ClientRectangle.Width;
            if (windowHeight > windowWidth)
            {
                if (windowWidth < 1)
                {
                    windowWidth = 1;
                }
                float ratio = windowWidth / windowHeight;
                Matrix4 projection = Matrix4.CreateOrthographic(ratio * 10, ratio * 10, -1, 1);
                GL.UniformMatrix4(uProjectionLocation, true, ref projection);
            }
            else if(windowHeight < windowWidth)
            {
                if (windowHeight < 1)
                {
                    windowHeight = 1;
                }
                float ratio = windowWidth / windowHeight;
                Matrix4 projection = Matrix4.CreateOrthographic(ratio * 10, ratio * 10, -1, 1);
                GL.UniformMatrix4(uProjectionLocation, true, ref projection);
            }
        }

        GL.Viewport(this.ClientRectangle);
    }

1 Ответ

2 голосов
/ 19 марта 2019

В первую очередь,

float ratio = windowWidth / windowHeight;

Скорее всего, не делает то, что вы имели в виду при написании этого кода. windowWidth и windowHeight имеют тип int, поэтому / выполнит целочисленное деление до преобразования результата в float. В результате ratio будет проводить большую часть своего времени ровно в 1. А иногда может быть 0 (если высота> ширина). И иногда может быть 2 (на некоторых широкоэкранных установках). Скорее всего, что вы хотите, это что-то вроде этого:

float ratio = (float)windowWidth / (float)windowHeight;

Однако даже тогда, когда вы вычисляете свою матрицу

Matrix4 projection = Matrix4.CreateOrthographic(ratio * 10, ratio * 10, -1, 1);

вы масштабируете ширину и высоту с помощью ratio, что означает, что независимо от того, какое соотношение получится в итоге, вы снова получите матрицу для квадратного видового экрана (поскольку ширина и высота одинаковы). Скорее всего, вы хотите, например, масштабировать только ширину с соотношением сторон

Matrix4 projection = Matrix4.CreateOrthographic(ratio * 10, 10, -1, 1);

Помимо всего этого, обратите внимание, как большая часть реальной функциональности дублируется в обеих ветвях вашего оператора if. Также обратите внимание, что вы просто пропускаете случай, когда ширина и высота равны. Вы можете переписать всю эту группу, например, так:

float ratio = (float)ClientRectangle.Width / (float)Math.Max(ClientRectangle.Height, 1);
Matrix4 projection = Matrix4.CreateOrthographic(ratio * 10, 10, -1, 1);
GL.UniformMatrix4(uProjectionLocation, true, ref projection);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...