Задать вопрос
  • Как правильно организовать обновление пар JWT + RT в API для нескольких клиентов?

    NimuraF
    @NimuraF Автор вопроса
    VolgaVolga, для rt - вполне неплохой срок, разве нет? Я бы даже сказал, что маловато, ибо порой реально можно на сайт вернуться через 20 дней и странно было бы снова логиниться. А ротация обоих токенов ведь так и так каждые 30 минут происходит.
  • Как правильно организовать обновление пар JWT + RT в API для нескольких клиентов?

    NimuraF
    @NimuraF Автор вопроса
    Примерно такое же решение с флагами и предполагал, правда мне почему-то казалось, что есть какое-то оптимальное решение сугубо с серверной стороны, чтобы вообще не мучаться на клиенте. Что-то из разряда амортизирующих RT-токенов и такого подхода. Благодарю за ответ :)
  • Как получать и обрабатывать координаты мыши в окне OpenGL?

    NimuraF
    @NimuraF Автор вопроса
    Благодарю за ответ, схему в целом понял, однако у вас случаем не завалялось какого-нибудь примерчика? А то не уверен, что правильно понял именно процесс непосредственной конвертации (как я понял, там всё завязано на матричных вычислениях, а в них я смыслю крайне опосредованно).
  • Как получать и обрабатывать координаты мыши в окне OpenGL?

    NimuraF
    @NimuraF Автор вопроса
    Евгений Шатунов, доброго времени суток, давненько не виделись :D С пониманием линейной алгебры в целом слабенько, удалось освежить память по большей части базовых задач, в том числе операции с векторами и матрицами, но не сказал бы, что осилю их без вспомогательных гайдов под рукой (до сих пор в шоке с матрицы вращения, которая помогает дольше избегать шарнирного замка). Однако если это надо для преобразования координат, то тут уж без вариантов, а пространство всё так же 2D, правда я сейчас хочу некое подобие плеера прикрутить (где можно будет выбирать для проигрывания различные анимации или сцены), а для этого как раз хочу реализовать меню с кнопками и чекбоксами.
  • Как правильно организовать соприкосновения поверхностей при инстансинге?

    NimuraF
    @NimuraF Автор вопроса
    Евгений Шатунов, как же жалею, что прогуливал в университете пары по линалу, а потому мне многие термины даже в гайдах непонятны...

    Сори, если сейчас постановка вопроса прозвучит крайне глупо :D

    Вот допустим у меня есть шейдерная программа, которая и отвечает за инстансинг:
    glUseProgram(shaderProgramForRaindrops);
    
            glm::mat4 transformic;
            transformic = glm::translate(transformic, glm::vec3(0.0f, (GLfloat)raindropY, 0.0f));
    
            if (raindropY <= 7 * floor[4] + 0.05) {
                raindropY = -(float)0.1f;
            }
    
            GLint transformLocRainDrops = glGetUniformLocation(shaderProgramForRaindrops, "raindropsdown");
            glUniformMatrix4fv(transformLocRainDrops, 1, GL_FALSE, glm::value_ptr(transformic));
    
            glBindVertexArray(VAOs[2]);
            glDrawArraysInstanced(GL_LINES, 0, 2, 200);
            glBindVertexArray(0);
    
            raindropY = raindropY - 0.003;


    В ней я, по сути, создаю матрицу трансформации с постоянно растущим коэффициентом Y, а после достижения определённого рубежа, который высчитал методом тыка, обновляю этот коэффициент к стартовому (я таким образом хотел сделать бесконечный дождь). И по сути одна эта матрица применяется к каждой капле, а уже внутри шейдера я проверяю как раз, нужна ли мне для неё какая-то особая позиция.

    Теперь же, как я понимаю, мне нужно сделать следующее: не только передавать непосредственно в шейдер значение этой матрицы, но и повесить дополнительный обработчик, который будет срабатывать, если значение transformic (как раз моей матрицы сдвига) будет удовлетворять тем самым условиям, которые описаны в инстансинге, ну то есть пересекаться с поверхностью визуально, но каким образом мне удалять непосредственно ту каплю, которая удовлетворяет условиям? Я вот просто никак не могу уложить эту идею в голове, всё так или иначе в моём понимании упирается в наличие дополнительного буфера на все 200 капель, в котором будет тот же самый коэффициент (пусть 0 или 1), который будет по сути являться доп. условием, на основе которого и будет работать инстансинг :/ Т. е. даже если мой объект попал под условия, как мне удалить из буфера именно его?
  • Как правильно организовать соприкосновения поверхностей при инстансинге?

    NimuraF
    @NimuraF Автор вопроса
    Евгений Шатунов, вот с перемещением за видимую область как раз проблемы возникают, так как я при перемещении одной точки за видимую область делаю это до того, как мне нужно обработать вторую вершину, и по сути вторая вершина капли, которая ещё не успела долететь до земли, соединяется с вершиной за пределами видимой области и вызывает появление таких линий. По всей видимости я просто изначально выбрал не совсем правильный подход, когда начал рисовать капли на основе двух вершин, но иного способа я вообще не нашёл в гугле :/
  • Как правильно организовать соприкосновения поверхностей при инстансинге?

    NimuraF
    @NimuraF Автор вопроса
    Ну вот например в самом простом случае единственное решение, которое приходит мне в голову, это сделать uniform-массив такого же размера, сколько будет капель, после чего загрузить в него единичные матрицы и уже внутри шейдера оперировать непосредственно матрицей для каждого представление через gl_InstanceID. По сути это ведь даст честный расчёт для каждой капли и благодаря расчётам на стороне шейдера позволит выиграть в скорости, но я ведь столкнусь ровно с той же проблемой, если речь идёт об объекте (не точке) место соприкосновения будет разным, и мне, по сути, придётся как-то фиксить проблему с тем, что первая вершина, которая пересечёт нужное мне условие, сразу сместится или удалится, что создаст вот эти самые непонятные палки, а как это исправить я понятия не имею.

    Теорию я по большей части понял, но как это реализовать в реалиях OpenGL? Проверять условие внутри шейдера и что-то делать в нём? Или заморочиться и вытаскивать значение из шейдера, после чего проверять его на CPU и уже на основе этого делать отрисовку?

    По своей сути вся моя задача сводится к тому, что я просто не могу понять, каким образом мне перестать отрисовывать сразу две вершины при исполнении тех или иных условий, ведь это уже решит 90% задачи, разве нет? Опять же, в голове я примерно могу представить способы подобного решения, что-то вроде доп. индекса, который будет срабатывать только после соприкосновения с поверхностью второй точки и так далее, но я уверен, что есть какой-то более адекватный метод решения, или это всё же не так?
  • Почему не срабатывает смещение при инстансинге?

    NimuraF
    @NimuraF Автор вопроса
    Евгений Шатунов, прошу прощения, что поблагодарить за помощь смог только сегодня :) В общем-то с отрисовкой при помощи инстансинга разобрался, осталось теперь разобраться, как для каждого представления обрабатывать условия существования)
  • Почему не срабатывает смещение при инстансинге?

    NimuraF
    @NimuraF Автор вопроса
    Только сейчас удалось прочитать :)

    Честно говоря, не совсем понимаю, что из себя представляет этот самый массив из вектор с n=2, загруженный в буфер, ну, т. е., это вообще что за объект такой? Вот на примере того же квадрата, я загружаю в VBO 6 вершин, указываю шаг в 3 элемента (3 координаты) и на основе этого opengl отрисовывает мне пресловутый квадрат. В юниформах я непосредственно брал массив, который и представлял как обычный массив в понимании программирования, а от того и становилось понятно, что та самая особенность будет браться на основе переменной gl_InstanceID. Здесь же я, по сути, делаю то же самое, только aOffset - это какой-то длинный пак данных, в котором я просто указываю шаг через glVertexAttribDivisor(1, 6)?

    Так же небольшой нюанс возник с VAO, вот, допустим, я передаю те самые 2 (0 и 1) атрибута, т.е. мой VAO будет выглядеть следующим образом:
    glBindVertexArray(VAOs[2]);
    
            glBindBuffer(GL_ARRAY_BUFFER, VBOs[2]);
            glBufferData(GL_ARRAY_BUFFER, sizeof(raindrops), raindrops, GL_STATIC_DRAW);
    
            glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
            glEnableVertexAttribArray(0);
    
            glBindBuffer(GL_ARRAY_BUFFER, VBOs[3]);
            glBufferData(GL_ARRAY_BUFFER, sizeof(translations), translations, GL_STATIC_DRAW);
    
            glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(glm::vec2), (GLvoid*)0);
            glVertexAttribDivisor(1, 6);
            glEnableVertexAttribArray(1);
    
        glBindVertexArray(0);


    Так же я немного не понял вот эту строчку в шейдере:
    gl_Position = vec4(aPos + aOffset, 0.0, 1.0);
    Разве это не приведёт к ошибкам из-за разницы в размерности векторов? Или это уже я плыву и совсем туплю?

    И немного ещё не разобрался с вызовом, для подобной схемы вызов тех самых инстансов может производиться следующим образом?
    glUseProgram(shaderProgramForRaindrops);
            glBindVertexArray(VAOs[2]);
            glDrawArraysInstanced(GL_TRIANGLES, 0, 6, 100);
            glBindVertexArray(0);


    А насчёт RenderDoc, я, в общем-то, его поставил и вроде как с базовыми механиками подразобрался, но у меня возникло небольшое недопонимание с анализом самого кадра.63500920e1995198337653.png

    Я вижу, что срабатывает отрисовка фигуры, которая и связана с тем самым VAO, который мне нужен и где я бы хотел работать с инстансингом, но при этом отображаются как раз только эти 6 вершин, а сама фигура отрисовывается всего 1 раз по базовым координатам. В чём может быть проблема?

    Вершинный шейдер:
    //В коде обозначен как const GLchar* vertexRainDrops
    #version 460 core\n
    
    layout (location = 0) in vec3 aPos;
    layout (location = 1) in vec2 aOffset;
    
    void main()
    {
        gl_Position = vec4(aPos + aOffset, 0.0, 1.0);
    }


    Фрагментный шейдер:
    #version 460 core
    out vec4 color;
    void main()
    {
        color = vec4(0.0f, 0.0f, 0.65f, 1.0f);
    };


    Основной код:
    GLuint vertexraindrops = glCreateShader(GL_VERTEX_SHADER);
    GLuint fragmentshaderBlue = glCreateShader(GL_FRAGMENT_SHADER);
    
    GLuint shaderProgramForRaindrops = glCreateProgram();
    
    glShaderSource(vertexraindrops, 1, &vertexRainDrops, NULL);
    glCompileShader(vertexraindrops);
    
    glShaderSource(fragmentshaderBlue, 1, &fragmentShaderBlue, NULL);
    glCompileShader(fragmentshaderBlue);
    
    glAttachShader(shaderProgramForRaindrops, vertexraindrops);
    glAttachShader(shaderProgramForRaindrops, fragmentshaderBlue);
    glLinkProgram(shaderProgramForRaindrops);
    
        glm::vec2 translations[100];
        int index = 0;
        float offset = 0.1f;
        for (int y = -10; y < 10; y += 2)
        {
            for (int x = -10; x < 10; x += 2)
            {
                glm::vec2 translation;
                translation.x = (float)x / 10.0f + offset;
                translation.y = (float)y / 10.0f + offset;
                translations[index++] = translation;
            }
        }
    
        GLfloat raindrops[] = {
            -0.05f, 1.0f, 0.0f,
            -0.05f, 0.95f, 0.0f,
             0.05f, 1.0f, 0.0f,
    
             0.05f, 1.0f, 0.0f,
             0.05f, 0.95f, 0.0f,
             -0.05f,  1.0f, 0.0f,
        };
    
        GLuint VBOs[4],
            VAOs[3],
            EBOs[2];
    
        glGenBuffers(4, VBOs);
        glGenVertexArrays(3, VAOs);
        glGenBuffers(2, EBOs);
    
    /* Здесь объявления VAOs[0] и Vaos[1] */
    
        glBindVertexArray(VAOs[2]);
    
            glBindBuffer(GL_ARRAY_BUFFER, VBOs[2]);
            glBufferData(GL_ARRAY_BUFFER, sizeof(raindrops), raindrops, GL_STATIC_DRAW);
    
            glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
            glEnableVertexAttribArray(0);
    
            glBindBuffer(GL_ARRAY_BUFFER, VBOs[3]);
            glBufferData(GL_ARRAY_BUFFER, sizeof(translations), translations, GL_STATIC_DRAW);
    
            glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(glm::vec2), (GLvoid*)0);
            glVertexAttribDivisor(1, 6);
            glEnableVertexAttribArray(1);
    
        glBindVertexArray(0);
    
    /* Вызов в игровом цикле*/
            /* Третья программа */
            glUseProgram(shaderProgramForRaindrops);
            glBindVertexArray(VAOs[2]);
            glDrawArraysInstanced(GL_TRIANGLES, 0, 6, 100);
            glBindVertexArray(0);
  • Почему не срабатывает смещение при инстансинге?

    NimuraF
    @NimuraF Автор вопроса
    Евгений Шатунов, насчёт кода, понял, я в графике фулл новичок, мне казалось, что на небольших шейдерах так наоборот будет проще анализировать код.

    Буду премного благодарен за помощь, особенно интересует как правильно загружать массивы :)
  • Почему не срабатывает смещение при инстансинге?

    NimuraF
    @NimuraF Автор вопроса
    Евгений Шатунов, там 5 строчек всего :/

    Вершинный:
    #version 460 core
    
    layout (location = 0) in vec3 aPos;
    
    uniform vec2 offsets[100];
    
    void main()
    {
       vec3 offset = offsets[gl_InstanceID];
       gl_Position = vec4(aPos + offset, 0.0, 1.0);
    }


    Фрагментный:
    #version 460 core
    
    out vec4 color;
    
    void main()
    {
    color = vec4(1.0f, 1.0f, 0.0f, 1.0f);
    }
  • Как корректно обрабатывать массив параметров-url в laravel?

    NimuraF
    @NimuraF Автор вопроса
    Второй раз выручаете, благодарю, пытался сделать через whereIn и постоянно ловил ошибку из-за промежуточного параметра '='))
  • Отношение M:M в Laravel на основе строковых полей?

    NimuraF
    @NimuraF Автор вопроса
    Дмитрий, теперь поймал, я так понимаю, первый нейм - родительский ключ указанной таблицы, второй - к которой присоединяемся, так? А про их переопределение в доках особо инфы не видел, видимо, проглядел.

    P.S. Ответ увидел, буду знать, большое спасибо за помощь :)

    62c9afb25b2d0651368238.png
  • Отношение M:M в Laravel на основе строковых полей?

    NimuraF
    @NimuraF Автор вопроса
    Дмитрий,

    Я вижу, что сравнение идёт с id, меня это и смущает.

    ^ array:3 [
      0 => array:3 [
        "query" => "select count(*) as aggregate from `games`"
        "bindings" => []
        "time" => 1.51
      ]
      1 => array:3 [
        "query" => "select * from `games` limit 10 offset 0"
        "bindings" => []
        "time" => 0.21
      ]
      2 => array:3 [
        "query" => "select `game_genres`.*, `games_games_genres`.`game_name` as `pivot_game_name`, `games_games_genres`.`genre_name` as `pivot_genre_name` from `game_genres` inner join `games_games_genres` on `game_genres`.`id` = `games_games_genres`.`genre_name` where `games_games_genres`.`game_name` in (42, 43, 44, 45, 46, 47)"
        "bindings" => []
        "time" => 0.31
      ]
    ]
  • Отношение M:M в Laravel на основе строковых полей?

    NimuraF
    @NimuraF Автор вопроса
    Дмитрий, хочу - получить список жанров для каждой игры в виде массива, так как дальше дата энкриптится в json, таким образом было бы намного удобнее отображать его на фронте. В моём же случае он попросту пустой, хотя, как я уже сказал, записи присутствуют.

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

    62c9abe2ac180227570964.png
  • В чем может быть ошибка при подключении MySQL к VS 2017?

    NimuraF
    @NimuraF Автор вопроса
    evgeniy_matveev, Из того, что мне удалось выяснить на испанских форумах, эта проблема возникает слишком рандомно и даже целым паком шарпистов мы решить ее не смогли. Либо проблема в самом билде винды (что возможно, но маловероятно, я тестировал и на чистой десятке, как говорилось выше, но результат тот же). Либо в инсталляторе MySQL (сутки мы убили и тыкали все версии, архивные и тд. танцевали как могли), но ничего. Либо эта ошибка, которая хотя бы указывает на существование соединения и то, что система к нему коннектится, либо совсем другие ошибки, которые никак не связаны с ключевой проблемой. Что забавно, через код напрямую все вообще прекрасно работает)
  • В чем может быть ошибка при подключении MySQL к VS 2017?

    NimuraF
    @NimuraF Автор вопроса
    evgeniy_matveev, BasiC2k, Ничего не помогло ;P Этот косяк не решаем в том понимании, котором я хотел. Возможно, вам помогут танцы с бубном и перестановкой дров, однако это маловероятно. Так и так это была проблема слишком узкая и среди масс не особо распространяется. Подключайтесь напрямую через код, соответственно, как делал я.
  • В чем может быть ошибка при подключении MySQL к VS 2017?

    NimuraF
    @NimuraF Автор вопроса
    BasiC2k, еще забыл добавить, пробовал поставить на 7 SP1, не без танцев с бубном, но все тот же итог.
    Ниже повешу скрин Heidi.
    1. Отображение таблицы.
    2. Отображение работоспособности запросов.

    5ced56b146977542469302.png5ced56b95ac36068238409.png
  • В чем может быть ошибка при подключении MySQL к VS 2017?

    NimuraF
    @NimuraF Автор вопроса
    BasiC2k, через Hedi уже пробовал, вcе нормально коннектиться, никаких проблем, дрова для MYSQL были переставлены по 20 раз уже, битность драйверов (ODBC, NET, Mysql for VS 2017 - x86)
    Ниже привязал скрины всех этапов и ошибок, ОС была поставлена чистая, десятка, просто ради тестов.
    5ced544904824926681161.png5ced547fcd746006332785.png5ced54f12eef7882025486.png5ced54fc9beb7526099091.png5ced551a79819724108303.png