заказ розыгрышей im gui и sdl - PullRequest
0 голосов
/ 26 апреля 2020

некоторое время go Я следовал некоторому руководству по SDL, чтобы проколотить некоторые изображения, и у меня есть тестовая функция, которая проходит по вектору текстур SDL, и назначение реагирует, а затем вызывает следующую функцию, чтобы скопировать изображение в окно.

void SpriteSheets::draw(const Sprite* sprite, SDL_Rect* dest) {
    SDL_RenderCopy(renderer, sprite->texture, sprite->rect, dest);
    SDL_RenderPresent(renderer);
}

// this is probably not relevant but including the clear/calling the draw function
void SpriteSheets::clearScreen() {
    SDL_SetRenderDrawColor(renderer, 150, 0, 100, 0); // debug color
    SDL_RenderClear(renderer);
}

void GameContext::drawSprites() {
    const auto& sprites  = std::get<comp::sprite>(c.components);
    const auto& position = std::get<comp::position>(c.components);

    SpriteSheets::clearScreen();

    for ( size_t i = 0; i < sprites.size(); i++ ) {
        SDL_Rect dest;
        dest.h = 50;
        dest.w = 50;
        dest.x = position[i].x();
        dest.y = position[i].y();
        SpriteSheets::draw(&sprites[i], &dest);
    }
}

Все это «работает» в том смысле, что все «спрайты» отображаются отлично

Затем я установил im gui, что было хорошо (я переписал большую часть примера sdl / vulkan для используйте привязки vulkan c ++ вместо c api) 90% кода / структуры взяты из примера im gui https://github.com/ocornut/imgui/blob/master/examples/example_sdl_vulkan/main.cpp, причем каждая часть организована в отдельные функции.

// relevant gui clear...
// at some point clear color is set to this
    this->clear_color = ImVec4(0.0f, 1.0f, 0.5f, 0.00f); //gross color for debugging
// snip
void Gui::clear(bool should_clear) {
    ImGui::Render();
    if ( should_clear ) memcpy(&wd.ClearValue.color.float32[0], &clear_color, 4 * sizeof(float));
}
// snip

void GraphicContext::mainLoop(GameContext* game) {
    //Frame Setup
    gui.frameSetup(); //rebuild swapchain if needed and then call imgui begin frame

    // draw the "game" 
    // which is just a few static png's at different locations
    game->drawSprites(); //when surounded by imgui functions it is hidden and not displayed

    //draw the imgui menu overtop
    if ( gui.show_demo_window ) ImGui::ShowDemoWindow(&gui.show_demo_window);

    //End frame
    gui.clear(false); // has ImGui::Render(); and conditional copy clear color 
    gui.frameRender(); // put all the imgui commands into a command buffer
    gui.framePresent(); // submit Queue
}

Опять же, установка im gui «работает», и я успешно показываю демонстрационное окно. кроме того, я могу легко создать свой собственный windows и не иметь проблем с API.

Моя проблема в том, что я могу заставить эти две концепции работать отдельно. Если я удаляю очистить экран / скопировать очистить значение в clear_color, то цвет фона gui.clear(false); вместо gui.clear(true) для im gui, чистый цвет будет черным / он по-прежнему покрывает спрайты sdl. (То же самое с установкой значения clear для альфа-значения 0.) Я попытался упорядочить вызов drawSprites до и после фрейма im gui, но он всегда перезаписывает / закрывает его.

I Поймите, я не включаю минимальный воспроизводимый пример, и я не включаю все функции im gui, но его много шаблонного (vulkan делает функции setup / render / present 100+ строк и включает в себя настройку для контекстов нажимает что еще 600+ строк.)

Кто-нибудь знает, как запретить im gui очистку экрана (я уже очищаю экран в разделе sdl) (возможно, измените проход рендеринга?)

//relevant part of frameRender()
{
    VkRenderPassBeginInfo info{
        .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
        .pNext = NULL,
        .renderPass = wd.RenderPass,
        .framebuffer = fd->Framebuffer,
        //.renderArea = {{0,0}, {wd.Width, wd.Height}},
        .clearValueCount = 1,
        .pClearValues = &wd.ClearValue
    };
    // the initializer for this doesn't work and idk why.
    // when I set the second two zeros in the render area initalizer list to width and height 
    // it wants to be converted to uint32 but when I do that it crashes with a read acess violation.
    info.renderArea.extent.width = wd.Width;
    info.renderArea.extent.height = wd.Height;

    vkCmdBeginRenderPass(fd->CommandBuffer, &info, VK_SUBPASS_CONTENTS_INLINE);
}

Я попытался установить значение очистить count / pClearValue в NULL, но это просто делает структуру информации больше не действительной / cra sh (должно быть хотя бы 1 запись), и я перепроверил, что альфа была 0 для чистого цвета на этом этапе.

В качестве альтернативы, я мог бы попытаться объединить все sdl dr aws в буфер команд im gui (или заменить draw я использую sdl с чистым vulkan)

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

Мне, вероятно, придется переделывать весь учебник Vulkan, потому что прошел год с тех пор, как я его коснулся, и мои проблемы, вероятно, очевидны, но я надеялся потому что я использовал im gui и sdl, я мог сначала написать немного движка и вернуться обратно в бэкэнд рендеринга, чтобы позже оптимизировать вещи, если это необходимо.

...