mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-25 08:30:13 +00:00
Work on character rendering and frustrum culling etc
This commit is contained in:
parent
fc5294eb0f
commit
7dd1dada5f
16 changed files with 559 additions and 138 deletions
|
|
@ -1,5 +1,7 @@
|
|||
#include "ui/character_create_screen.hpp"
|
||||
#include "rendering/character_preview.hpp"
|
||||
#include "rendering/renderer.hpp"
|
||||
#include "core/application.hpp"
|
||||
#include "game/game_handler.hpp"
|
||||
#include "pipeline/asset_manager.hpp"
|
||||
#include "pipeline/dbc_layout.hpp"
|
||||
|
|
@ -128,7 +130,10 @@ void CharacterCreateScreen::initializePreview(pipeline::AssetManager* am) {
|
|||
assetManager_ = am;
|
||||
if (!preview_) {
|
||||
preview_ = std::make_unique<rendering::CharacterPreview>();
|
||||
preview_->initialize(am);
|
||||
if (preview_->initialize(am)) {
|
||||
auto* renderer = core::Application::getInstance().getRenderer();
|
||||
if (renderer) renderer->registerPreview(preview_.get());
|
||||
}
|
||||
}
|
||||
// Force model reload
|
||||
prevRaceIndex_ = -1;
|
||||
|
|
@ -332,6 +337,7 @@ void CharacterCreateScreen::render(game::GameHandler& /*gameHandler*/) {
|
|||
if (preview_) {
|
||||
updatePreviewIfNeeded();
|
||||
preview_->render();
|
||||
preview_->requestComposite();
|
||||
}
|
||||
|
||||
ImVec2 displaySize = ImGui::GetIO().DisplaySize;
|
||||
|
|
@ -363,13 +369,10 @@ void CharacterCreateScreen::render(game::GameHandler& /*gameHandler*/) {
|
|||
static_cast<float>(preview_->getHeight()));
|
||||
}
|
||||
|
||||
// TODO: Vulkan offscreen preview render target
|
||||
if (preview_->getTextureId()) {
|
||||
ImGui::Image(
|
||||
static_cast<ImTextureID>(0),
|
||||
ImVec2(imgW, imgH),
|
||||
ImVec2(0.0f, 1.0f),
|
||||
ImVec2(1.0f, 0.0f));
|
||||
reinterpret_cast<ImTextureID>(preview_->getTextureId()),
|
||||
ImVec2(imgW, imgH));
|
||||
}
|
||||
|
||||
// Mouse drag rotation on the preview image
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#include "ui/character_screen.hpp"
|
||||
#include "rendering/character_preview.hpp"
|
||||
#include "rendering/renderer.hpp"
|
||||
#include "pipeline/asset_manager.hpp"
|
||||
#include "core/application.hpp"
|
||||
#include "core/logger.hpp"
|
||||
|
|
@ -250,6 +251,9 @@ void CharacterScreen::render(game::GameHandler& gameHandler) {
|
|||
if (!previewInitialized_) {
|
||||
LOG_WARNING("CharacterScreen: failed to init CharacterPreview");
|
||||
preview_.reset();
|
||||
} else {
|
||||
auto* renderer = core::Application::getInstance().getRenderer();
|
||||
if (renderer) renderer->registerPreview(preview_.get());
|
||||
}
|
||||
}
|
||||
if (preview_) {
|
||||
|
|
@ -280,9 +284,10 @@ void CharacterScreen::render(game::GameHandler& gameHandler) {
|
|||
previewEquipHash_ = equipHash;
|
||||
}
|
||||
|
||||
// Drive preview animation and render to its FBO.
|
||||
// Drive preview animation and request composite for next beginFrame.
|
||||
preview_->update(ImGui::GetIO().DeltaTime);
|
||||
preview_->render();
|
||||
preview_->requestComposite();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -290,7 +295,7 @@ void CharacterScreen::render(game::GameHandler& gameHandler) {
|
|||
ImGui::BeginChild("CharDetails", ImVec2(detailPanelW, listH), true);
|
||||
|
||||
// 3D preview portrait
|
||||
if (preview_ && preview_->getTextureId() != 0) {
|
||||
if (preview_ && preview_->getTextureId()) {
|
||||
float imgW = ImGui::GetContentRegionAvail().x;
|
||||
float imgH = imgW * (static_cast<float>(preview_->getHeight()) /
|
||||
static_cast<float>(preview_->getWidth()));
|
||||
|
|
@ -301,14 +306,9 @@ void CharacterScreen::render(game::GameHandler& gameHandler) {
|
|||
imgW = imgH * (static_cast<float>(preview_->getWidth()) /
|
||||
static_cast<float>(preview_->getHeight()));
|
||||
}
|
||||
// TODO: Vulkan offscreen preview render target
|
||||
if (preview_->getTextureId()) {
|
||||
ImGui::Image(
|
||||
static_cast<ImTextureID>(0),
|
||||
ImVec2(imgW, imgH),
|
||||
ImVec2(0.0f, 1.0f),
|
||||
ImVec2(1.0f, 0.0f));
|
||||
}
|
||||
ImGui::Image(
|
||||
reinterpret_cast<ImTextureID>(preview_->getTextureId()),
|
||||
ImVec2(imgW, imgH));
|
||||
|
||||
if (ImGui::IsItemHovered() && ImGui::IsMouseDragging(ImGuiMouseButton_Left)) {
|
||||
preview_->rotate(ImGui::GetIO().MouseDelta.x * 0.2f);
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
#include "core/input.hpp"
|
||||
#include "rendering/character_preview.hpp"
|
||||
#include "rendering/character_renderer.hpp"
|
||||
#include "rendering/renderer.hpp"
|
||||
#include "pipeline/asset_manager.hpp"
|
||||
#include "pipeline/dbc_loader.hpp"
|
||||
#include "pipeline/blp_loader.hpp"
|
||||
|
|
@ -175,6 +176,8 @@ void InventoryScreen::initPreview() {
|
|||
charPreview_.reset();
|
||||
return;
|
||||
}
|
||||
auto* renderer = core::Application::getInstance().getRenderer();
|
||||
if (renderer) renderer->registerPreview(charPreview_.get());
|
||||
}
|
||||
|
||||
charPreview_->loadCharacter(playerRace_, playerGender_,
|
||||
|
|
@ -925,6 +928,7 @@ void InventoryScreen::renderCharacterScreen(game::GameHandler& gameHandler) {
|
|||
if (charPreview_ && previewInitialized_) {
|
||||
charPreview_->update(ImGui::GetIO().DeltaTime);
|
||||
charPreview_->render();
|
||||
charPreview_->requestComposite();
|
||||
}
|
||||
|
||||
ImGui::SetNextWindowPos(ImVec2(20.0f, 80.0f), ImGuiCond_FirstUseEver);
|
||||
|
|
@ -1120,9 +1124,8 @@ void InventoryScreen::renderEquipmentPanel(game::Inventory& inventory) {
|
|||
// Background for preview area
|
||||
drawList->AddRectFilled(pMin, pMax, IM_COL32(13, 13, 25, 255));
|
||||
drawList->AddImage(
|
||||
(ImTextureID)(uintptr_t)charPreview_->getTextureId(),
|
||||
pMin, pMax,
|
||||
ImVec2(0, 1), ImVec2(1, 0)); // flip Y for GL
|
||||
reinterpret_cast<ImTextureID>(charPreview_->getTextureId()),
|
||||
pMin, pMax);
|
||||
drawList->AddRect(pMin, pMax, IM_COL32(60, 60, 80, 200));
|
||||
|
||||
// Drag-to-rotate: detect mouse drag over the preview image
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue