#pragma once #include #include #include #include #include #include #include #include #include "shared/UtilsFPS.h" #include #include #include #include #include #include using glm::mat3; using glm::mat4; using glm::vec2; using glm::vec3; using glm::vec4; using DrawFrameFunc = std::function; struct GLTFMaterialIntro { std::string name; uint32_t materialMask; uint32_t currentMaterialMask; bool modified = false; }; struct GLTFIntrospective { std::vector cameras; uint32_t activeCamera = ~0u; std::vector animations; std::vector activeAnim; std::vector extensions; std::vector activeExtension; std::vector materials; std::vector modifiedMaterial; float blend = 0.5f; bool showAnimations = false; bool showAnimationBlend = false; bool showCameras = false; bool showMaterials = true; }; struct VulkanAppConfig { vec3 initialCameraPos = vec3(0.0f, 0.0f, -2.5f); vec3 initialCameraTarget = vec3(0.0f, 0.0f, 0.0f); bool showGLTFInspector = false; }; class VulkanApp { public: explicit VulkanApp(const VulkanAppConfig& cfg = {}); virtual ~VulkanApp(); virtual void run(DrawFrameFunc drawFrame); virtual void drawGrid( lvk::ICommandBuffer& buf, const mat4& proj, const vec3& origin = vec3(0.0f), uint32_t numSamples = 1, lvk::Format colorFormat = lvk::Format_Invalid); virtual void drawGrid( lvk::ICommandBuffer& buf, const mat4& mvp, const vec3& origin, const vec3& camPos, uint32_t numSamples = 1, lvk::Format colorFormat = lvk::Format_Invalid); virtual void drawFPS(); virtual void drawMemo(); virtual void drawGTFInspector(GLTFIntrospective& intro); virtual void drawGTFInspector_Animations(GLTFIntrospective& intro); virtual void drawGTFInspector_Materials(GLTFIntrospective& intro); virtual void drawGTFInspector_Cameras(GLTFIntrospective& intro); lvk::Format getDepthFormat() const; lvk::TextureHandle getDepthTexture() const { return depthTexture_; } void addMouseButtonCallback(GLFWmousebuttonfun cb) { callbacksMouseButton.push_back(cb); } void addKeyCallback(GLFWkeyfun cb) { callbacksKey.push_back(cb); } public: GLFWwindow* window_ = nullptr; std::unique_ptr ctx_; lvk::Holder depthTexture_; FramesPerSecondCounter fpsCounter_ = FramesPerSecondCounter(0.5f); std::unique_ptr imgui_; ImPlotContext* implotCtx_ = nullptr; const VulkanAppConfig cfg_ = {}; CameraPositioner_FirstPerson positioner_ = { cfg_.initialCameraPos, cfg_.initialCameraTarget, vec3(0.0f, 1.0f, 0.0f) }; Camera camera_ = Camera(positioner_); struct MouseState { vec2 pos = vec2(0.0f); bool pressedLeft = false; } mouseState_; protected: lvk::Holder gridVert = {}; lvk::Holder gridFrag = {}; lvk::Holder gridPipeline = {}; uint32_t pipelineSamples = 1; std::vector callbacksMouseButton; std::vector callbacksKey; };