ObsidianDragon - DragonX ImGui Wallet
Full-node GUI wallet for DragonX cryptocurrency. Built with Dear ImGui, SDL3, and OpenGL3/DX11. Features: - Send/receive shielded and transparent transactions - Autoshield with merged transaction display - Built-in CPU mining (xmrig) - Peer management and network monitoring - Wallet encryption with PIN lock - QR code generation for receive addresses - Transaction history with pagination - Console for direct RPC commands - Cross-platform (Linux, Windows)
This commit is contained in:
193
src/ui/effects/framebuffer.h
Normal file
193
src/ui/effects/framebuffer.h
Normal file
@@ -0,0 +1,193 @@
|
||||
// DragonX Wallet - ImGui Edition
|
||||
// Copyright 2024-2026 The Hush Developers
|
||||
// Released under the GPLv3
|
||||
|
||||
#pragma once
|
||||
|
||||
// GL type definitions needed by class declarations.
|
||||
// If GLAD was already included, these types are already defined.
|
||||
#ifndef GLAD_GL_H_
|
||||
typedef unsigned int GLuint;
|
||||
typedef int GLint;
|
||||
typedef unsigned int GLenum;
|
||||
typedef int GLsizei;
|
||||
#endif
|
||||
#include <cstdint>
|
||||
|
||||
namespace dragonx {
|
||||
namespace ui {
|
||||
namespace effects {
|
||||
|
||||
/**
|
||||
* @brief OpenGL Framebuffer Object manager for off-screen rendering
|
||||
*
|
||||
* Used for capturing screen content to use as blur source for acrylic effects.
|
||||
*/
|
||||
class Framebuffer {
|
||||
public:
|
||||
Framebuffer();
|
||||
~Framebuffer();
|
||||
|
||||
// Non-copyable
|
||||
Framebuffer(const Framebuffer&) = delete;
|
||||
Framebuffer& operator=(const Framebuffer&) = delete;
|
||||
|
||||
// Move constructors
|
||||
Framebuffer(Framebuffer&& other) noexcept;
|
||||
Framebuffer& operator=(Framebuffer&& other) noexcept;
|
||||
|
||||
/**
|
||||
* @brief Initialize framebuffer with given dimensions
|
||||
* @param width Width in pixels
|
||||
* @param height Height in pixels
|
||||
* @param useFloat16 Use RGBA16F format for higher precision (reduces banding)
|
||||
* @return true if successful
|
||||
*/
|
||||
bool init(int width, int height, bool useFloat16 = false);
|
||||
|
||||
/**
|
||||
* @brief Resize framebuffer (recreates internal textures)
|
||||
* @param width New width
|
||||
* @param height New height
|
||||
* @return true if successful
|
||||
*/
|
||||
bool resize(int width, int height);
|
||||
|
||||
/**
|
||||
* @brief Release all OpenGL resources
|
||||
*/
|
||||
void destroy();
|
||||
|
||||
/**
|
||||
* @brief Bind this framebuffer for rendering
|
||||
*/
|
||||
void bind();
|
||||
|
||||
/**
|
||||
* @brief Unbind (return to default framebuffer)
|
||||
*/
|
||||
void unbind();
|
||||
|
||||
/**
|
||||
* @brief Clear the framebuffer
|
||||
* @param r Red component (0-1)
|
||||
* @param g Green component (0-1)
|
||||
* @param b Blue component (0-1)
|
||||
* @param a Alpha component (0-1)
|
||||
*/
|
||||
void clear(float r = 0.0f, float g = 0.0f, float b = 0.0f, float a = 1.0f);
|
||||
|
||||
/**
|
||||
* @brief Get the color texture attached to this framebuffer
|
||||
* @return OpenGL texture ID
|
||||
*/
|
||||
GLuint getColorTexture() const { return colorTexture_; }
|
||||
|
||||
/**
|
||||
* @brief Get the underlying framebuffer object ID
|
||||
* @return OpenGL FBO ID
|
||||
*/
|
||||
GLuint getFbo() const { return fbo_; }
|
||||
|
||||
/**
|
||||
* @brief Get framebuffer dimensions
|
||||
*/
|
||||
int getWidth() const { return width_; }
|
||||
int getHeight() const { return height_; }
|
||||
|
||||
/**
|
||||
* @brief Check if framebuffer is valid and complete
|
||||
*/
|
||||
bool isValid() const { return fbo_ != 0 && isComplete_; }
|
||||
|
||||
/**
|
||||
* @brief Copy a region from the current framebuffer to this one
|
||||
* @param srcX Source X position
|
||||
* @param srcY Source Y position
|
||||
* @param srcWidth Source width
|
||||
* @param srcHeight Source height
|
||||
* @param dstX Destination X position
|
||||
* @param dstY Destination Y position
|
||||
*/
|
||||
void blitFrom(GLuint srcFbo, int srcX, int srcY, int srcWidth, int srcHeight,
|
||||
int dstX = 0, int dstY = 0);
|
||||
|
||||
/**
|
||||
* @brief Copy entire default framebuffer to this one
|
||||
* @param viewportWidth Current viewport width
|
||||
* @param viewportHeight Current viewport height
|
||||
*/
|
||||
void captureScreen(int viewportWidth, int viewportHeight);
|
||||
|
||||
private:
|
||||
void cleanup();
|
||||
bool checkComplete();
|
||||
|
||||
GLuint fbo_ = 0;
|
||||
GLuint colorTexture_ = 0;
|
||||
GLuint depthRbo_ = 0; // Renderbuffer for depth (optional)
|
||||
|
||||
int width_ = 0;
|
||||
int height_ = 0;
|
||||
bool useFloat16_ = false; // RGBA16F for blur precision
|
||||
bool isComplete_ = false;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Manages multiple framebuffers for ping-pong blur operations
|
||||
*/
|
||||
class FramebufferPingPong {
|
||||
public:
|
||||
FramebufferPingPong() = default;
|
||||
~FramebufferPingPong() = default;
|
||||
|
||||
/**
|
||||
* @brief Initialize both framebuffers
|
||||
*/
|
||||
bool init(int width, int height, bool useFloat16 = false);
|
||||
|
||||
/**
|
||||
* @brief Resize both framebuffers
|
||||
*/
|
||||
bool resize(int width, int height);
|
||||
|
||||
/**
|
||||
* @brief Destroy both framebuffers
|
||||
*/
|
||||
void destroy();
|
||||
|
||||
/**
|
||||
* @brief Swap which buffer is source/destination
|
||||
*/
|
||||
void swap();
|
||||
|
||||
/**
|
||||
* @brief Get current source framebuffer
|
||||
*/
|
||||
Framebuffer& getSource() { return buffers_[currentSource_]; }
|
||||
|
||||
/**
|
||||
* @brief Get current destination framebuffer
|
||||
*/
|
||||
Framebuffer& getDest() { return buffers_[1 - currentSource_]; }
|
||||
|
||||
/**
|
||||
* @brief Get source texture for reading
|
||||
*/
|
||||
GLuint getSourceTexture() const { return buffers_[currentSource_].getColorTexture(); }
|
||||
|
||||
/**
|
||||
* @brief Get destination texture
|
||||
*/
|
||||
GLuint getDestTexture() const { return buffers_[1 - currentSource_].getColorTexture(); }
|
||||
|
||||
bool isValid() const { return buffers_[0].isValid() && buffers_[1].isValid(); }
|
||||
|
||||
private:
|
||||
Framebuffer buffers_[2];
|
||||
int currentSource_ = 0;
|
||||
};
|
||||
|
||||
} // namespace effects
|
||||
} // namespace ui
|
||||
} // namespace dragonx
|
||||
Reference in New Issue
Block a user