#pragma once #include #include #include #include #include #include #include "rendering/vk_texture.hpp" namespace wowee { namespace pipeline { class AssetManager; } namespace rendering { class Camera; class VkContext; /** * Renders quest markers as billboarded sprites above NPCs * Uses BLP textures from Interface\GossipFrame\ */ class QuestMarkerRenderer { public: QuestMarkerRenderer(); ~QuestMarkerRenderer(); bool initialize(VkContext* ctx, VkDescriptorSetLayout perFrameLayout, pipeline::AssetManager* assetManager); void shutdown(); /** * Add or update a quest marker at a position * @param guid NPC GUID * @param position World position (NPC base position) * @param markerType 0=available(!), 1=turnin(?), 2=incomplete(?) * @param boundingHeight NPC bounding height (optional, default 2.0f) */ void setMarker(uint64_t guid, const glm::vec3& position, int markerType, float boundingHeight = 2.0f); /** * Remove a quest marker */ void removeMarker(uint64_t guid); /** * Clear all markers */ void clear(); /** * Render all quest markers (call after world rendering, before UI) * @param cmd Command buffer to record into * @param perFrameSet Per-frame descriptor set (set 0, contains camera UBO) * @param camera Camera for billboard calculation (CPU-side view matrix) */ void render(VkCommandBuffer cmd, VkDescriptorSet perFrameSet, const Camera& camera); private: struct Marker { glm::vec3 position; int type; // 0=available, 1=turnin, 2=incomplete float boundingHeight = 2.0f; }; std::unordered_map markers_; // Vulkan context VkContext* vkCtx_ = nullptr; // Pipeline VkPipeline pipeline_ = VK_NULL_HANDLE; VkPipelineLayout pipelineLayout_ = VK_NULL_HANDLE; // Descriptor resources for per-material texture (set 1) VkDescriptorSetLayout materialSetLayout_ = VK_NULL_HANDLE; VkDescriptorPool descriptorPool_ = VK_NULL_HANDLE; VkDescriptorSet texDescSets_[3] = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE}; // Textures: available, turnin, incomplete VkTexture textures_[3]; // Quad vertex buffer VkBuffer quadVB_ = VK_NULL_HANDLE; VmaAllocation quadVBAlloc_ = VK_NULL_HANDLE; void createQuad(); void loadTextures(pipeline::AssetManager* assetManager); void createDescriptorResources(); }; } // namespace rendering } // namespace wowee