A little clean up

This commit is contained in:
Ilusha 2024-03-17 21:44:19 +03:00 committed by Ilya Shurupov
parent 3b389bdc17
commit 1155067b26
8 changed files with 234 additions and 407 deletions

View file

@ -15,113 +15,40 @@ namespace tp {
class Renderer;
class Project;
class Stroke;
class Brush;
class Stroke {
friend Renderer;
public:
struct Point {
Vec3F pos = { 0, 0, 0 };
halnf thickness = NULL;
};
Buffer<Point> mPoints;
RGBA mCol;
private:
struct GLHandles {
GLuint VertexArrayID = 0;
GLuint vertexbuffer = 0;
GLuint vbo_len = 0;
GLHandles();
void sendDataToGPU(Buffer<Point>* mPoints);
~GLHandles();
} mGl;
public:
Stroke();
void denoisePos(halni passes);
void denoiseThickness(halni passes);
void compress(halnf factor);
void subdiv(halnf precition, Camera* cam, halni passes = 1);
void updateGpuBuffers();
Buffer<Point>& buff();
struct StrokePoint {
Vec3F pos = { 0, 0, 0 };
halnf thickness = NULL;
};
class Brush {
public:
String mType = "equal";
Brush() {}
virtual void sample(Project* proj, Vec2F crs, halnf pressure) {}
virtual void draw(Renderer* render, Camera* camera) {}
virtual ~Brush() {}
};
class PencilBrush : public Brush {
halnf mPrecision = 0.001f;
halni mDenoisePassesPos = 1;
halni mDenoisePassesThick = 3;
halnf mCompressionFactor = 0.0001f;
halni mSubdivPasses = 3;
bool mEnableCompression = true;
halni mMaxPoints = 100;
Stroke* mStroke = NULL;
Stroke mShowStroke;
void unsureReady(Stroke* stroke, Camera* cam, bool debug = false);
public:
RGBA mCol = RGBA(1.0f);
halnf mSize = 0.01f;
PencilBrush();
virtual void sample(Project* proj, Vec2F crs, halnf pressure) override;
virtual void draw(Renderer* render, Camera* camera) override;
virtual ~PencilBrush();
};
struct EraserBrush : public Brush {
EraserBrush() { mType = "eraser"; }
virtual void sample(Project* proj, Vec2F crs, halnf pressure) override {}
virtual void draw(Renderer* render, Camera* camera) override {}
virtual ~EraserBrush() {}
};
class Project {
public:
struct Layer {
String name = "new layer";
List<Stroke*> strokes;
bool enabled = true;
~Layer();
};
Buffer<Layer*> mLayers;
halni mActiveLayer = -1;
Camera mCamera;
RGBA mBackgroundColor = { 0.22f, 0.22f, 0.25f, 1.f };
Map<String, Brush*> mBrushes;
String mActiveBrush;
Project();
~Project();
struct StrokeGPUHandles {
GLuint VertexArrayID = 0;
GLuint vertexbuffer = 0;
GLuint vbo_len = 0;
StrokeGPUHandles();
void sendDataToGPU(Buffer<StrokePoint>* mPoints);
~StrokeGPUHandles();
};
class Renderer {
public:
Renderer(Vec2F size); // max render size
~Renderer();
void renderToTexture(const Project* project, Vec2F size); // needed size
void renderBegin();
void setViewport(RectF viewport);
void drawStroke(const Stroke* str, const Camera* camera);
void renderEnd();
void setClearCol(RGBA col);
uhalni getTextudeId();
RenderBuffer* getBuff();
private:
RenderBuffer mBufferDowncast;
RenderBuffer mBuffer;
RenderShader mShader;
@ -133,96 +60,100 @@ namespace tp {
GLuint mTargetUniform = 0;
GLuint mBGColUniform = 0;
public:
Renderer(Vec2F size);
void renderBegin();
void setViewport(RectF viewport);
void drawStroke(Stroke* str, Camera* camera);
void renderEnd();
void setClearCol(RGBA col);
uhalni getTextudeId();
RenderBuffer* getBuff();
~Renderer();
Vec2F mMaxSize;
};
};
/*
void Project::save(File& file) {
file.write<Camera>(&mCamera);
file.write<rgba>(&mBackgroundColor);
file.write<halni>(&mActiveLayer);
class Stroke {
public:
Stroke();
void denoisePos(halni passes);
void denoiseThickness(halni passes);
void compress(halnf factor);
void subdiv(halnf precition, const Camera* cam, halni passes = 1);
void updateGpuBuffers();
Buffer<StrokePoint>& getPoints();
const Buffer<StrokePoint>& getPoints() const;
void setColor(const RGBA& col);
const RGBA& getColor() const;
alni lay_len = mLayers.length();
file.write<alni>(&lay_len);
for (auto layer : mLayers) {
layer.data()->name.save(&file);
private:
Buffer<StrokePoint> mPoints;
RGBA mColor;
file.write<bool>(&layer.data()->enabled);
friend Renderer;
StrokeGPUHandles mGPUHandles;
};
alni len = layer.data()->strokes.length();
file.write<alni>(&len);
for (auto stiter : layer.data()->strokes) {
stiter->save(file);
}
}
}
struct Layer {
Layer() = default;
~Layer();
void Project::load(File& file) {
file.read<Camera>(&mCamera);
file.read<rgba>(&mBackgroundColor);
file.read<halni>(&mActiveLayer);
String name = "new layer";
List<Stroke*> strokes; // TODO use vector
bool enabled = true;
};
alni layers_len;
file.read<alni>(&layers_len);
mLayers.reserve(layers_len);
class Project {
public:
Project();
~Project();
for (alni idx = 0; idx < layers_len; idx++) {
// pos from -1 to 1 (left ot right bottom to top)
void sample(halnf pressure, halnf cameraRatio, Vec2F relativeCameraPos);
string key; key.load(&file);
auto layer = new Layer();
layer->name = key;
mLayers[idx] = layer;
public:
Buffer<Layer*> mLayers;
halni mActiveLayer = -1;
file.read<bool>(&layer->enabled);
Camera mCamera;
RGBA mBackgroundColor = { 0.22f, 0.22f, 0.25f, 1.f };
alni len;
file.read<alni>(&len);
Map<String, Brush*> mBrushes;
String mActiveBrush;
};
for (alni str_idx = 0; str_idx < len; str_idx++) {
auto str = new Stroke();
layer->strokes.pushBack(str);
layer->strokes.last()->data->load(file);
}
}
}
*/
class Brush {
public:
String mType = "equal";
Brush() {}
virtual void sample(Project* proj, Vec2F crs, halnf pressure) {}
virtual void draw(Renderer* render, const Camera* camera) const {}
virtual ~Brush() {}
};
/*
void Stroke::save(File& file) {
file.write<rgba>(&mCol);
class PencilBrush : public Brush {
public:
PencilBrush();
virtual ~PencilBrush();
alni length = mPoints.length();
file.write<alni>(&length);
for (auto piter : mPoints) {
file.write<Point>(&piter.data());
}
}
virtual void sample(Project* proj, Vec2F crs, halnf pressure) override;
virtual void draw(Renderer* render, const Camera* camera) const override;
void Stroke::load(File& file) {
rgba color;
file.read<rgba>(&color);
private:
void ensureReady(Stroke* stroke, const Camera* cam, bool debug = false) const;
alni p_len;
file.read<alni>(&p_len);
public:
RGBA mCol = RGBA(1.0f);
halnf mSize = 0.01f;
mPoints.reserve(p_len);
for (auto piter : mPoints) {
file.read<Point>(&piter.data());
}
private:
halnf mPrecision = 0.001f;
updateGpuBuffers();
}
*/
halni mDenoisePassesPos = 1;
halni mDenoisePassesThick = 3;
halnf mCompressionFactor = 0.0001f;
halni mSubdivPasses = 3;
bool mEnableCompression = true;
halni mMaxPoints = 100;
Stroke* mStroke = NULL;
};
struct EraserBrush : public Brush {
EraserBrush() { mType = "eraser"; }
virtual void sample(Project* proj, Vec2F crs, halnf pressure) override {}
virtual void draw(Renderer* render, const Camera* camera) const override {}
virtual ~EraserBrush() {}
};
}

View file

@ -8,9 +8,6 @@ namespace tp {
template <typename Events, typename Canvas>
class Sketch3DWidget : public Widget<Events, Canvas> {
public:
Canvas* mCanvas = nullptr;
Sketch3DWidget(Canvas& canvas, Vec2F renderResolution) :
mRenderer(renderResolution) {
mImage = canvas.createImageFromTextId(mRenderer.getBuff()->texId(), mRenderer.getBuff()->getSize());
@ -27,54 +24,25 @@ namespace tp {
this->mVisible = area.isOverlap(areaParent);
if (!this->mVisible) return;
mProject.mCamera.setRatio(this->mArea.w / this->mArea.z);
// mProject.mBackgroundColor = col_obj_bg->mCol;
if (!this->mArea.isInside(events.getPos())) {
return;
}
halnf pressure = 0.f;
auto idx = mProject.mBrushes.presents(mProject.mActiveBrush);
if (idx) {
auto brush = mProject.mBrushes.getSlotVal(idx);
auto crs = (events.getPos() - this->mArea.pos);
crs.x /= this->mArea.z;
crs.y /= this->mArea.w;
crs = (crs - 0.5) * 2;
auto crs = (events.getPos() - this->mArea.pos);
crs.x /= this->mArea.z;
crs.y /= this->mArea.w;
crs = (crs - 0.5) * 2;
if (brush->mType == "pencil") {
((tp::PencilBrush*) brush)->mCol = RGBA(1.f);
}
mProject.sample(pressure, this->mArea.w / this->mArea.z, crs);
brush->sample(&mProject, crs, pressure);
}
// mProject.setBackGroundColor();
}
void draw(Canvas& canvas) override {
mRenderer.setViewport({ 0, 0, this->mArea.z, this->mArea.w });
mRenderer.setClearCol(mProject.mBackgroundColor);
mRenderer.renderBegin();
for (auto lay : mProject.mLayers) {
if (lay.data()->enabled) {
for (auto str : lay.data()->strokes) {
mRenderer.drawStroke(str.data(), &mProject.mCamera);
}
}
}
auto idx = mProject.mBrushes.presents(mProject.mActiveBrush);
if (idx) {
auto brush = mProject.mBrushes.getSlotVal(idx);
brush->draw(&mRenderer, &mProject.mCamera);
}
mRenderer.renderEnd();
if (!this->mVisible) return;
mRenderer.renderToTexture(&mProject, this->mArea.size);
canvas.drawImage(this->mArea, &mImage, 0, 1, 12);
}
@ -82,5 +50,6 @@ namespace tp {
Project mProject;
Renderer mRenderer;
Canvas::ImageHandle mImage;
Canvas* mCanvas = nullptr;
};
}