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:
2026-02-26 02:31:52 -06:00
commit 3aee55b49c
306 changed files with 177789 additions and 0 deletions

View File

@@ -0,0 +1,282 @@
// DragonX Wallet - ImGui Edition
// Copyright 2024-2026 The Hush Developers
// Released under the GPLv3
#include "blur_shader.h"
#ifdef DRAGONX_HAS_GLAD
#include <glad/gl.h>
#include <cstdio>
#include <vector>
#include "../../util/logger.h"
namespace dragonx {
namespace ui {
namespace effects {
// ============================================================================
// BlurShader Implementation (GLEW Available)
// ============================================================================
BlurShader::BlurShader() = default;
BlurShader::~BlurShader()
{
destroy();
}
bool BlurShader::init()
{
// Create shaders
vertexShader_ = glCreateShader(GL_VERTEX_SHADER);
fragmentShader_ = glCreateShader(GL_FRAGMENT_SHADER);
if (!compileShader(vertexShader_, ShaderSource::BLUR_VERTEX)) {
DEBUG_LOGF("BlurShader: Failed to compile vertex shader\n");
destroy();
return false;
}
if (!compileShader(fragmentShader_, ShaderSource::BLUR_FRAGMENT)) {
DEBUG_LOGF("BlurShader: Failed to compile fragment shader\n");
destroy();
return false;
}
// Create program
program_ = glCreateProgram();
glAttachShader(program_, vertexShader_);
glAttachShader(program_, fragmentShader_);
if (!linkProgram()) {
DEBUG_LOGF("BlurShader: Failed to link program\n");
destroy();
return false;
}
// Get uniform locations
uTexture_ = glGetUniformLocation(program_, "uTexture");
uDirection_ = glGetUniformLocation(program_, "uDirection");
uResolution_ = glGetUniformLocation(program_, "uResolution");
uRadius_ = glGetUniformLocation(program_, "uRadius");
DEBUG_LOGF("BlurShader: Initialized successfully\n");
DEBUG_LOGF(" Uniforms: uTexture=%d, uDirection=%d, uResolution=%d, uRadius=%d\n",
uTexture_, uDirection_, uResolution_, uRadius_);
return true;
}
void BlurShader::destroy()
{
if (program_) {
glDeleteProgram(program_);
program_ = 0;
}
if (vertexShader_) {
glDeleteShader(vertexShader_);
vertexShader_ = 0;
}
if (fragmentShader_) {
glDeleteShader(fragmentShader_);
fragmentShader_ = 0;
}
uTexture_ = -1;
uDirection_ = -1;
uResolution_ = -1;
uRadius_ = -1;
}
bool BlurShader::compileShader(unsigned int shader, const char* source)
{
glShaderSource(shader, 1, &source, nullptr);
glCompileShader(shader);
GLint success;
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) {
GLint logLength;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
std::vector<char> log(logLength + 1);
glGetShaderInfoLog(shader, logLength, nullptr, log.data());
DEBUG_LOGF("Shader compile error:\n%s\n", log.data());
return false;
}
return true;
}
bool BlurShader::linkProgram()
{
glLinkProgram(program_);
GLint success;
glGetProgramiv(program_, GL_LINK_STATUS, &success);
if (!success) {
GLint logLength;
glGetProgramiv(program_, GL_INFO_LOG_LENGTH, &logLength);
std::vector<char> log(logLength + 1);
glGetProgramInfoLog(program_, logLength, nullptr, log.data());
DEBUG_LOGF("Program link error:\n%s\n", log.data());
return false;
}
return true;
}
void BlurShader::bind()
{
glUseProgram(program_);
}
void BlurShader::unbind()
{
glUseProgram(0);
}
void BlurShader::setDirection(bool horizontal)
{
if (uDirection_ >= 0) {
if (horizontal) {
glUniform2f(uDirection_, 1.0f, 0.0f);
} else {
glUniform2f(uDirection_, 0.0f, 1.0f);
}
}
}
void BlurShader::setRadius(float radius)
{
if (uRadius_ >= 0) {
glUniform1f(uRadius_, radius);
}
}
void BlurShader::setResolution(int width, int height)
{
if (uResolution_ >= 0) {
glUniform2f(uResolution_, static_cast<float>(width), static_cast<float>(height));
}
}
void BlurShader::setTexture(int unit)
{
if (uTexture_ >= 0) {
glUniform1i(uTexture_, unit);
}
}
// ============================================================================
// FullscreenQuad Implementation
// ============================================================================
FullscreenQuad::FullscreenQuad() = default;
FullscreenQuad::~FullscreenQuad()
{
destroy();
}
bool FullscreenQuad::init()
{
// Fullscreen quad vertices: position (x,y) and texcoord (u,v)
// NDC coordinates: -1 to 1
static const float vertices[] = {
// Position // TexCoord
-1.0f, 1.0f, 0.0f, 1.0f, // Top-left
-1.0f, -1.0f, 0.0f, 0.0f, // Bottom-left
1.0f, -1.0f, 1.0f, 0.0f, // Bottom-right
-1.0f, 1.0f, 0.0f, 1.0f, // Top-left
1.0f, -1.0f, 1.0f, 0.0f, // Bottom-right
1.0f, 1.0f, 1.0f, 1.0f // Top-right
};
glGenVertexArrays(1, &vao_);
glGenBuffers(1, &vbo_);
glBindVertexArray(vao_);
glBindBuffer(GL_ARRAY_BUFFER, vbo_);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// Position attribute (location = 0)
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
// TexCoord attribute (location = 1)
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));
glEnableVertexAttribArray(1);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
return vao_ != 0;
}
void FullscreenQuad::destroy()
{
if (vbo_) {
glDeleteBuffers(1, &vbo_);
vbo_ = 0;
}
if (vao_) {
glDeleteVertexArrays(1, &vao_);
vao_ = 0;
}
}
void FullscreenQuad::draw()
{
glBindVertexArray(vao_);
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);
}
} // namespace effects
} // namespace ui
} // namespace dragonx
#else // !DRAGONX_HAS_GLAD
// ============================================================================
// Stub Implementation (No GLAD - Acrylic effects disabled)
// ============================================================================
namespace dragonx {
namespace ui {
namespace effects {
BlurShader::BlurShader() = default;
BlurShader::~BlurShader() = default;
bool BlurShader::init() { return false; }
void BlurShader::destroy() {}
bool BlurShader::compileShader(unsigned int, const char*) { return false; }
bool BlurShader::linkProgram() { return false; }
void BlurShader::bind() {}
void BlurShader::unbind() {}
void BlurShader::setDirection(bool) {}
void BlurShader::setRadius(float) {}
void BlurShader::setResolution(int, int) {}
void BlurShader::setTexture(int) {}
FullscreenQuad::FullscreenQuad() = default;
FullscreenQuad::~FullscreenQuad() = default;
bool FullscreenQuad::init() { return false; }
void FullscreenQuad::destroy() {}
void FullscreenQuad::draw() {}
} // namespace effects
} // namespace ui
} // namespace dragonx
#endif // DRAGONX_HAS_GLAD