Update widgets module. Raster example initial.

This commit is contained in:
IlyaShurupov 2024-04-12 15:27:40 +03:00
parent 9e339defd6
commit 9cfae3fe3e
48 changed files with 1169 additions and 530 deletions

View file

@ -1,34 +0,0 @@
#pragma once
#include "Rect.hpp"
#include "Color.hpp"
namespace tp {
class RenderBuffer {
public:
RenderBuffer(const Vec2F& size);
RenderBuffer(const Vec2F& size, tp::uint1 samples);
~RenderBuffer();
void beginDraw();
void setViewport(const RectF& viewport);
void clear();
void endDraw();
uint4 texId() const;
uint4 buffId() const;
const Vec2F& getSize() const;
public:
RGBA mClearCol = 0.f;
private:
uint4 mFrameBufferID = 0; // regroups 0, 1, or more textures, and 0 or 1 depth buffer.
uint4 mTextureId = 0; // texture we're going to render to ( colour attachement #0 )
uint4 mDepthBufferID = 0;
uint4 mDrawBuffers[1];
Vec2F mSize;
};
};

View file

@ -1,19 +0,0 @@
#pragma once
#include "Environment.hpp"
#ifdef ENV_OS_ANDROID
#include <EGL/egl.h>
#include <GLES3/gl32.h>
#else
#include "GL/glew.h"
#endif
#ifdef ENV_OS_ANDROID
#define GLW_CONTEXT_DEPTH_BITS 16
#define GLW_CONTEXT_DEPTH_COMPONENT GL_DEPTH_COMPONENT16
#else
#define GLW_CONTEXT_DEPTH_BITS 32
#define GLW_CONTEXT_DEPTH_COMPONENT GL_DEPTH_COMPONENT32
#endif

View file

@ -1,31 +0,0 @@
#pragma once
namespace tp {
class RenderShader {
public:
RenderShader();
RenderShader(const char* vertid, const char* geomid, const char* fragid, bool paths = true);
~RenderShader();
void vert_bind_source(const char* vert_src);
void frag_bind_source(const char* frag_src);
void geom_bind_source(const char* geom_src);
void compile();
void bind();
uint4 getu(const char* uid);
void unbind();
private:
bool compile_shader(const char* ShaderCode, uint4 ShaderID);
void load(const char* vert, const char* geom, const char* frag, bool paths);
private:
uint4 programm;
uint4 VertexShaderID;
uint4 FragmentShaderID;
uint4 GeometryShaderID;
};
};

View file

@ -9,16 +9,14 @@ namespace tp {
class Sketch3DWidget : public Widget<Events, Canvas> {
public:
Sketch3DWidget(Canvas& canvas, Vec2F renderResolution) :
mRenderer(renderResolution) {
mRenderer(renderResolution) {
mImage = canvas.createImageFromTextId(mRenderer.getBuff()->texId(), mRenderer.getBuff()->getSize());
mCanvas = &canvas;
mProject.mBackgroundColor = { 0.13f, 0.13f, 0.13f, 1.f };
}
~Sketch3DWidget() {
mCanvas->deleteImageHandle(mImage);
}
~Sketch3DWidget() { mCanvas->deleteImageHandle(mImage); }
void proc(const Events& events, const RectF& areaParent, const RectF& area) override {
@ -51,20 +49,24 @@ namespace tp {
mProject.mCamera.setRatio(this->mArea.w / this->mArea.z);
switch (mMode) {
case Mode::MOVE: {
case Mode::MOVE:
{
if (mAction) mProject.mCamera.move(relativePos, relativePosPrev);
break;
}
case Mode::ZOOM: {
case Mode::ZOOM:
{
halnf factor = absolutePos.y / mActionPosAbsolutePrev.y;
if (mAction) mProject.mCamera.zoom(factor);
break;
}
case Mode::ROTATE: {
case Mode::ROTATE:
{
if (mAction) mProject.mCamera.rotate(-relativeDelta.x * halnf(PI), -relativeDelta.y * halnf(PI));
break;
}
case Mode::DRAW: {
case Mode::DRAW:
{
mProject.sample(events.getPointerPressure(), this->mArea.w / this->mArea.z, crs);
break;
}
@ -74,20 +76,15 @@ namespace tp {
mActionPosAbsolutePrev = absolutePos;
}
void draw(Canvas& canvas) override {
if (!this->mVisible) return;
void drawBody(Canvas& canvas) override {
mRenderer.renderToTexture(&mProject, this->mArea.size);
canvas.drawImage(this->mArea, &mImage, 0, 1, 12);
}
void setColor(const RGBA& color) {
((PencilBrush*) mProject.mBrushes.get("pencil"))->mCol = color;
}
void setColor(const RGBA& color) { ((PencilBrush*) mProject.mBrushes.get("pencil"))->mCol = color; }
public:
enum class Mode {
MOVE, ROTATE, ZOOM, DRAW, NONE
} mMode = Mode::NONE;
enum class Mode { MOVE, ROTATE, ZOOM, DRAW, NONE } mMode = Mode::NONE;
Vec2F mActionPosAbsolutePrev = { 0, 0 };
bool mAction = false;
@ -102,12 +99,8 @@ namespace tp {
template <typename Events, typename Canvas>
class Sketch3DGUI : public Widget<Events, Canvas> {
public:
Sketch3DGUI(Canvas& canvas, Vec2F renderResolution) : mViewport(canvas, renderResolution) {
this->createConfig("Sketch3D");
this->addColor("Background", "Background");
this->addValue("Rounding", "Rounding");
Sketch3DGUI(Canvas& canvas, Vec2F renderResolution) :
mViewport(canvas, renderResolution) {
mDrawButton = new ButtonWidget<Events, Canvas>("Draw", { 0, 0, 100, 30 });
mMoveButton = new ButtonWidget<Events, Canvas>("Pan View", { 0, 0, 100, 30 });
mRotateButton = new ButtonWidget<Events, Canvas>("Rotate view", { 0, 0, 100, 30 });
@ -119,26 +112,22 @@ namespace tp {
mOptions.mContents.append(mZoomButton);
// add color sliders
mRed = new NamedSliderWidget < Events, Canvas >("Red");
mGreen = new NamedSliderWidget < Events, Canvas >("Green");
mBlue = new NamedSliderWidget < Events, Canvas >("Blue");
mRed = new NamedSliderWidget<Events, Canvas>("Red");
mGreen = new NamedSliderWidget<Events, Canvas>("Green");
mBlue = new NamedSliderWidget<Events, Canvas>("Blue");
mOptions.mContents.append(mRed);
mOptions.mContents.append(mGreen);
mOptions.mContents.append(mBlue);
}
~Sketch3DGUI() {
~Sketch3DGUI() {
for (auto item : mOptions.mContents) {
delete item.data();
}
}
void proc(const Events& events, const RectF& areaParent, const RectF& area) override {
this->mArea = area;
this->mVisible = area.isOverlap(areaParent);
if (!this->mVisible) return;
void procBody(const Events& events) override {
mSplitView.proc(events, this->mArea, this->mArea);
mViewport.proc(events, this->mArea, mSplitView.getFirst());
mOptions.proc(events, this->mArea, mSplitView.getSecond());
@ -156,16 +145,25 @@ namespace tp {
mViewport.setColor(RGBA(mRed->mSlider.mFactor, mGreen->mSlider.mFactor, mBlue->mSlider.mFactor, 1.f));
}
void draw(Canvas& canvas) override {
if (!this->mVisible) return;
canvas.rect(this->mArea, this->getColor("Background"), this->getValue("Rounding"));
void drawBody(Canvas& canvas) override {
canvas.rect(this->mArea, mBackgroundColor, mRounding);
mSplitView.draw(canvas);
mViewport.draw(canvas);
mOptions.draw(canvas);
}
void updateConfigCache(WidgetManager& wm) override {
wm.setActiveId("Sketch3DGui");
mBackgroundColor = wm.getColor("Background", "Background");
mRounding = wm.getNumber("Rounding", "Rounding");
mSplitView.updateConfigCache(wm);
mOptions.updateConfigCache(wm);
mViewport.updateConfigCache(wm);
}
private:
Sketch3DWidget<Events, Canvas> mViewport;
SplitView<Events, Canvas> mSplitView;
@ -179,5 +177,8 @@ namespace tp {
NamedSliderWidget<Events, Canvas>* mRed = nullptr;
NamedSliderWidget<Events, Canvas>* mGreen = nullptr;
NamedSliderWidget<Events, Canvas>* mBlue = nullptr;
RGBA mBackgroundColor;
halnf mRounding = 0;
};
}

View file

@ -1,29 +0,0 @@
#pragma once
#include "Buffer2D.hpp"
#include "Color.hpp"
#include "Vec.hpp"
namespace tp {
class RenderTexture {
public:
RenderTexture();
~RenderTexture();
uint4 getid();
void update(const Buffer2D<RGBA>& buff);
void draw(const uint4& out = 0);
public:
static void init();
static void deinit();
static void draw_texture(uint4 out, uint4 in);
static uint4 get_tex(const char* TexId);
static void drawCurcle(Vec2F pos, double radius, RGBA col);
private:
uint4 id;
};
};