Files
panopainter/engine/brush.h

80 lines
1.5 KiB
C++

#pragma once
#include "rtt.h"
#include "shader.h"
NS_START
class Brush
{
public:
int id;
std::string m_name;
uint16_t m_tex_id;
glm::vec4 m_tip_color;
float m_tip_size;
float m_tip_spacing;
float m_tip_flow;
float m_tip_opacity;
float m_tip_angle;
float m_jitter_scale;
float m_jitter_angle;
float m_jitter_spread;
float m_jitter_flow;
};
struct StrokeSample
{
glm::vec2 pos;
float size;
float flow;
float angle;
};
class BrushMesh
{
public:
ui::Shader shader;
GLuint buffers[3]{ 0 };
GLuint vao{ 0 };
struct vertex_t { glm::vec4 pos; glm::vec2 uvs; };
struct instance_t { glm::mat4 mvp; float flow; };
int loc_flow;
int loc_mvp;
bool create();
void draw(const std::vector<StrokeSample>& samples, const glm::mat4& proj);
};
class Stroke
{
public:
struct Keypoint
{
glm::vec2 pos;
float pressure;
float dist;
};
struct Camera
{
glm::vec2 rot;
float fov;
};
int m_layer;
float m_dist;
float m_step;
Camera m_camera;
ui::Brush m_brush;
std::vector<Keypoint> m_keypoints;
std::vector<StrokeSample> m_samples;
int m_last_kp;
std::minstd_rand prng;
void start(const ui::Brush& brush);
void add_point(glm::vec2 pos, float pressure);
void reset(bool clear_keypoints = false);
bool has_sample();
std::vector<StrokeSample> compute_samples();
StrokeSample randomize_sample(const glm::vec2& pos, float pressure);
};
NS_END