cvkg-core 0.1.19

Cyber Viking Kvasir Graph (CVKG) - High-fidelity agentic UI framework
Documentation
/// Sub-traits for the Renderer, split by functional domain.
///
/// These traits group related renderer operations and provide default
/// (no-op or fallback) implementations. They are NOT required supertraits
/// of the main `Renderer` trait — instead, they serve two purposes:
///
/// 1. **Consumer bounds**: Code that only needs shape drawing can accept
///    `&mut dyn RendererShapes` instead of `&mut dyn Renderer`.
/// 2. **Documentation**: The groupings make it clear which methods are
///    related and what a backend needs to implement for each capability.
///
/// The main `Renderer` trait (defined in the parent module) retains all
/// methods for backward compatibility and object-safety.

use super::{ColorTheme, Event, Mesh, Rect, TelemetryData};
use std::sync::Arc;

// ── Core ────────────────────────────────────────────────────────────────────

/// Core renderer lifecycle: timing, redraw requests, telemetry.
/// Supertrait of all other renderer sub-traits.
pub trait RendererCore: Send {
    /// Returns the cumulative time since the renderer started in seconds.
    fn elapsed_time(&self) -> f32;
    /// Returns the time elapsed since the last frame in seconds.
    fn delta_time(&self) -> f32;
    /// Requests that the renderer redraws as soon as possible.
    fn request_redraw(&mut self) {}
    /// Returns true if the current frame is over the time budget.
    fn is_over_budget(&self) -> bool {
        false
    }
    /// Get real-time performance telemetry.
    fn get_telemetry(&self) -> TelemetryData {
        TelemetryData::default()
    }
    /// Get the current pointer (mouse/touch) position.
    fn get_pointer_position(&self) -> [f32; 2] {
        [0.0, 0.0]
    }
}

// ── Shapes ──────────────────────────────────────────────────────────────────

/// Filled and stroked shape drawing operations.
pub trait RendererShapes: RendererCore {
    fn fill_rect(&mut self, rect: Rect, color: [f32; 4]);
    fn fill_rounded_rect(&mut self, rect: Rect, radius: f32, color: [f32; 4]);
    fn fill_ellipse(&mut self, rect: Rect, color: [f32; 4]);
    fn stroke_rect(&mut self, rect: Rect, color: [f32; 4], stroke_width: f32);
    fn stroke_rounded_rect(&mut self, rect: Rect, radius: f32, color: [f32; 4], stroke_width: f32);
    fn stroke_ellipse(&mut self, rect: Rect, color: [f32; 4], stroke_width: f32);
    fn draw_line(&mut self, x1: f32, y1: f32, x2: f32, y2: f32, color: [f32; 4], stroke_width: f32);
    fn fill_polygon(&mut self, _vertices: &[[f32; 2]], _color: [f32; 4]) {}
    fn stroke_polygon(&mut self, _vertices: &[[f32; 2]], _color: [f32; 4], _stroke_width: f32) {}
}

// ── Text ────────────────────────────────────────────────────────────────────

/// Text measurement and drawing operations.
pub trait RendererText: RendererCore {
    fn draw_text(&mut self, text: &str, x: f32, y: f32, size: f32, color: [f32; 4]);
    fn measure_text(&mut self, text: &str, size: f32) -> (f32, f32);
}

// ── Images & Textures ───────────────────────────────────────────────────────

/// Image and texture management operations.
pub trait RendererImages: RendererCore {
    fn draw_texture(&mut self, _texture_id: u32, _rect: Rect) {}
    fn draw_image(&mut self, _image_name: &str, _rect: Rect) {}
    fn load_image(&mut self, _name: &str, _data: &[u8]) {}
    fn prewarm_vram(&mut self, _assets: Vec<(String, Vec<u8>)>) {}
}

// ── Clipping ────────────────────────────────────────────────────────────────

/// Clip rectangle stack operations.
pub trait RendererClipping: RendererCore {
    fn push_clip_rect(&mut self, _rect: Rect) {}
    fn pop_clip_rect(&mut self) {}
    fn current_clip_rect(&self) -> Rect {
        Rect::new(-10000.0, -10000.0, 20000.0, 20000.0)
    }
}

// ── Opacity ─────────────────────────────────────────────────────────────────

/// Opacity stack operations.
pub trait RendererOpacity: RendererCore {
    fn push_opacity(&mut self, _opacity: f32) {}
    fn pop_opacity(&mut self) {}
}

// ── Transforms ──────────────────────────────────────────────────────────────

/// 2D transform stack operations.
pub trait RendererTransforms: RendererCore {
    fn push_transform(&mut self, _translation: [f32; 2], _scale: [f32; 2], _rotation: f32) {}
    fn pop_transform(&mut self) {}
}

// ── Effects ─────────────────────────────────────────────────────────────────

/// Visual effects: gradients, shadows, cyberpunk effects.
pub trait RendererEffects: RendererCore {
    fn draw_linear_gradient(
        &mut self,
        _rect: Rect,
        _start_color: [f32; 4],
        _end_color: [f32; 4],
        _angle: f32,
    ) {
    }
    fn draw_radial_gradient(
        &mut self,
        _rect: Rect,
        _inner_color: [f32; 4],
        _outer_color: [f32; 4],
    ) {
    }
    fn draw_drop_shadow(
        &mut self,
        _rect: Rect,
        _radius: f32,
        _color: [f32; 4],
        _blur: f32,
        _spread: f32,
    ) {
    }
    fn stroke_dashed_rounded_rect(
        &mut self,
        _rect: Rect,
        _radius: f32,
        _color: [f32; 4],
        _width: f32,
        _dash: f32,
        _gap: f32,
    ) {
    }
    fn draw_9slice(
        &mut self,
        _image_name: &str,
        _rect: Rect,
        _left: f32,
        _top: f32,
        _right: f32,
        _bottom: f32,
    ) {
    }
    fn push_shadow(&mut self, _radius: f32, _color: [f32; 4], _offset: [f32; 2]) {}
    fn pop_shadow(&mut self) {}
    fn bifrost(&mut self, _rect: Rect, _blur: f32, _saturation: f32, _opacity: f32) {}
    fn gungnir(&mut self, _rect: Rect, _color: [f32; 4], _radius: f32, _intensity: f32) {}
    fn mani_glow(&mut self, _rect: Rect, _color: [f32; 4], _radius: f32) {}
    fn push_mjolnir_slice(&mut self, _angle: f32, _offset: f32) {}
    fn pop_mjolnir_slice(&mut self) {}
    fn mjolnir_shatter(&mut self, _rect: Rect, _pieces: u32, _force: f32, _color: [f32; 4]) {}
    fn mjolnir_fluid_shatter(&mut self, _rect: Rect, _pieces: u32, _force: f32, _color: [f32; 4]) {}
    fn draw_mjolnir_bolt(&mut self, _from: [f32; 2], _to: [f32; 2], _color: [f32; 4]) {}
}

// ── Berserker Pipeline ──────────────────────────────────────────────────────

/// Berserker pipeline state: theme, rage, mode, scene.
pub trait RendererBerserker: RendererCore {
    fn set_theme(&mut self, _theme: ColorTheme) {}
    fn set_rage(&mut self, _rage: f32) {}
    fn set_berserker_mode(&mut self, _state: super::BerserkerMode) {}
    fn trigger_shatter_event(&mut self, _origin: [f32; 2], _force: f32) {}
    fn set_scene(&mut self, _scene: &str) {}
    fn set_scene_preset(&mut self, _preset: u32) {}
}

// ── 3D ──────────────────────────────────────────────────────────────────────

/// 3D drawing operations.
pub trait Renderer3D: RendererCore {
    fn draw_3d_cube(&mut self, _rect: Rect, _color: [f32; 4], _rotation: [f32; 3]) {}
    fn draw_mesh(&mut self, _mesh: &Mesh, _color: [f32; 4], _transform: glam::Mat4) {}
}

// ── Data Visualization ──────────────────────────────────────────────────────

/// Data visualization operations.
pub trait RendererDataViz: RendererCore {
    fn upload_data_texture(&mut self, _id: &str, _data: &[f32], _width: u32, _height: u32) {}
    fn draw_heatmap(&mut self, _texture_id: &str, _rect: Rect, _palette: &str) {}
}

// ── Vector Graphics ─────────────────────────────────────────────────────────

/// SVG loading and drawing.
pub trait RendererVector: RendererCore {
    fn load_svg(&mut self, _name: &str, _svg_data: &[u8]) {}
    fn draw_svg(&mut self, _name: &str, _rect: Rect) {}
}

// ── Accessibility ───────────────────────────────────────────────────────────

/// Accessibility (ARIA) operations.
pub trait RendererAccessibility: RendererCore {
    fn set_aria_role(&mut self, _role: &str) {}
    fn set_aria_label(&mut self, _label: &str) {}
    fn register_shared_element(&mut self, _id: &str, _rect: Rect) {}
    fn set_key(&mut self, _key: &str) {}
}

// ── VDOM & Scene Graph ──────────────────────────────────────────────────────

/// VDOM node tracking and event handler registration.
pub trait RendererVdom: RendererCore {
    fn push_vnode(&mut self, _rect: Rect, _name: &'static str) {}
    fn pop_vnode(&mut self) {}
    fn register_handler(&mut self, _event_type: &str, _handler: Arc<dyn Fn(Event) + Send + Sync>) {}
}

// ── Z-Index ─────────────────────────────────────────────────────────────────

/// Z-index / depth sorting.
pub trait RendererZIndex: RendererCore {
    fn set_z_index(&mut self, _z: f32) {}
    fn get_z_index(&self) -> f32 {
        0.0
    }
}

// ── Export & Print ──────────────────────────────────────────────────────────

/// Frame capture and printing.
pub trait RendererExport: RendererCore {
    fn capture_png(&mut self) -> Vec<u8> {
        Vec::new()
    }
    fn print(&mut self) {}
}

// ── Memoization ─────────────────────────────────────────────────────────────

/// Render function memoization.
pub trait RendererMemo: RendererCore {
    fn memoize(&mut self, id: u64, data_hash: u64, render_fn: &dyn Fn(&mut dyn super::Renderer));
}

// ── Layout Debug ────────────────────────────────────────────────────────────

/// Layout debug overlay.
pub trait RendererLayoutDebug: RendererCore {
    fn query_layout(&self, _node_id: super::scene_graph::NodeId) -> Option<Rect> {
        None
    }
    fn set_debug_layout(&mut self, _enabled: bool) {}
    fn get_debug_layout(&self) -> bool {
        false
    }
}