1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
#pragma once
#if defined(WITH_IMGUI) || defined(DOXYGEN_GENERATING_OUTPUT)
#include "../../Main.h"
#include "../Base/HashMap.h"
#include "../Primitives/Matrix4x4.h"
#include <memory>
#include <imgui.h>
struct ImTextureData;
namespace nCine
{
class GLTexture;
class GLShaderProgram;
class GLShaderUniforms;
class GLBufferObject;
class RenderCommand;
class RenderQueue;
class IInputEventHandler;
/// Handles ImGui drawing
class ImGuiDrawing
{
public:
explicit ImGuiDrawing(bool withSceneGraph);
~ImGuiDrawing();
void NewFrame();
/// Renders ImGui with render commands
void EndFrame(RenderQueue& renderQueue);
/// Renders ImGui directly with OpenGL
void EndFrame();
private:
bool withSceneGraph_;
HashMap<GLTexture*, std::unique_ptr<GLTexture>> textures_;
#if defined(WITH_OPENGLES) || defined(DEATH_TARGET_EMSCRIPTEN)
SmallVector<char, 0> tempTexBuffer_;
#endif
std::unique_ptr<GLShaderProgram> imguiShaderProgram_;
std::unique_ptr<GLBufferObject> vbo_;
std::unique_ptr<GLBufferObject> ibo_;
static const std::int32_t UniformsBufferSize = 65;
std::uint8_t uniformsBuffer_[UniformsBufferSize];
std::unique_ptr<GLShaderUniforms> imguiShaderUniforms_;
IInputEventHandler* appInputHandler_;
std::int32_t lastFrameWidth_;
std::int32_t lastFrameHeight_;
Matrix4x4f projectionMatrix_;
std::uint16_t lastLayerValue_;
#if defined(IMGUI_HAS_VIEWPORT)
std::int32_t attribLocationTex_;
std::int32_t attribLocationProjMtx_;
std::uint32_t attribLocationVtxPos_;
std::uint32_t attribLocationVtxUV_;
std::uint32_t attribLocationVtxColor_;
std::uint32_t vboHandle_;
std::uint32_t elementsHandle_;
#endif
void DestroyTexture(ImTextureData* tex);
void UpdateTexture(ImTextureData* tex);
RenderCommand* RetrieveCommandFromPool();
void SetupRenderCommand(RenderCommand& cmd);
void Draw(RenderQueue& renderQueue);
void SetupBuffersAndShader();
void Draw();
#if defined(IMGUI_HAS_VIEWPORT)
void PrepareForViewports();
static void OnRenderPlatformWindow(ImGuiViewport* viewport, void*);
void DrawPlatformWindow(ImGuiViewport* viewport);
void SetupRenderStateForPlatformWindow(ImDrawData* drawData, std::int32_t fbWidth, std::int32_t fbHeight, std::uint32_t vertexArrayObject);
#endif
};
}
#endif
|