renderpip/include/pipeline.hpp
saarsena@gmail.com 5c7d1905a9 first commit
2026-04-02 03:41:50 -04:00

129 lines
3.7 KiB
C++

/**
* @file pipeline.hpp
* @brief Render pipeline visualization state and interface
*/
#pragma once
#include "math3d.hpp"
#include <SDL3/SDL.h>
struct GameContext;
constexpr int NUM_CUBE_VERTS = 8;
constexpr int NUM_CUBE_EDGES = 12;
constexpr int NUM_TRI_VERTS = 3;
constexpr int NUM_TRI_EDGES = 3;
struct PipelineState {
int current_stage = 0; // 0-5
int prev_stage = 0;
float transition_t = 1.0f; // 0→1 animation progress (1 = complete)
float fade_alpha = 1.0f; // for 3D↔2D mode transitions
// Interpolated vertices for rendering during transitions
Vec3 display_verts[NUM_CUBE_VERTS];
// Vertex selection
int selected_vertex = -1; // -1 = none, 0-7 = selected vertex index
bool pending_click = false;
float click_x = 0, click_y = 0;
// Object transform parameters (user-adjustable)
float obj_rot_y = 0.0f;
float obj_pos_x = 2.0f;
float obj_pos_y = 1.0f;
float obj_pos_z = -3.0f;
float obj_scale = 1.0f;
bool auto_rotate = false;
// Display camera (orbit around scene for visualization)
float cam_orbit_pitch = 25.0f; // degrees
float cam_orbit_yaw = -30.0f; // degrees
float cam_distance = 10.0f;
// Pipeline camera (the one being visualized in the pipeline)
float pipe_cam_x = 0.0f;
float pipe_cam_y = 2.0f;
float pipe_cam_z = 5.0f;
float pipe_cam_fov = 1.0f; // radians (~57 degrees)
float pipe_cam_near = 0.1f;
float pipe_cam_far = 100.0f;
// Mouse drag state
bool mouse_down = false;
float mouse_start_x = 0, mouse_start_y = 0;
float orbit_start_pitch = 0, orbit_start_yaw = 0;
// Slider drag state
int dragging_slider = -1; // -1 = none, 0+ = slider index
bool show_sliders = true;
// First-person camera view (picture-in-picture)
bool show_first_person = false;
// Matrix color breakdown
bool show_matrix_breakdown = false;
// Vertex shader simulation
bool shader_mode = false;
float shader_amplitude = 0.3f;
float shader_frequency = 2.0f;
float shader_time = 0.0f;
// Help overlay
bool show_help = false;
// Clipping visualizer
bool show_clipping = false;
struct ClippedFace {
static constexpr int MAX_VERTS = 24;
Vec4 verts[MAX_VERTS];
int count = 0;
bool was_clipped = false;
};
ClippedFace clipped_faces[6];
// Depth buffer / Z-fighting demo
bool show_depth_viz = false;
bool show_zfight_plane = false;
float zfight_plane_z = -3.0f;
static constexpr int NUM_PLANE_VERTS = 4;
Vec4 plane_world[4];
Vec3 plane_screen[4];
Vec3 plane_display[4];
// Input flags (set per event, cleared after processing)
bool key_left = false;
bool key_right = false;
bool key_space = false;
bool key_r = false;
bool key_num[6] = {};
// Computed transforms
Mat4 model_matrix;
Mat4 view_matrix;
Mat4 proj_matrix;
// Transformed vertices at each pipeline stage (cube)
Vec4 verts_object[NUM_CUBE_VERTS];
Vec4 verts_world[NUM_CUBE_VERTS];
Vec4 verts_view[NUM_CUBE_VERTS];
Vec4 verts_clip[NUM_CUBE_VERTS];
Vec3 verts_ndc[NUM_CUBE_VERTS];
Vec3 verts_screen[NUM_CUBE_VERTS];
// Second shape: triangle
bool show_triangle = false;
Vec4 tri_object[NUM_TRI_VERTS];
Vec4 tri_world[NUM_TRI_VERTS];
Vec4 tri_view[NUM_TRI_VERTS];
Vec4 tri_clip[NUM_TRI_VERTS];
Vec3 tri_ndc[NUM_TRI_VERTS];
Vec3 tri_screen[NUM_TRI_VERTS];
Vec3 tri_display[NUM_TRI_VERTS];
};
void pipeline_handle_event(PipelineState& ps, const SDL_Event& event);
void pipeline_update(PipelineState& ps, GameContext& ctx);
void pipeline_render(PipelineState& ps, GameContext& ctx);