feat: hook up canvas input to renderer
This commit is contained in:
@@ -42,11 +42,13 @@ static void canvas_onclick(GtkGestureClick* gesture, int n_press, double x,
|
|||||||
int canvas_w = state->canvas->width;
|
int canvas_w = state->canvas->width;
|
||||||
int canvas_h = state->canvas->height;
|
int canvas_h = state->canvas->height;
|
||||||
|
|
||||||
double sx = canvas_w / (double)widget_w;
|
V2 normalized_coords =
|
||||||
double sy = canvas_h / (double)widget_h;
|
(V2){(2 * (x / widget_w)) - 1, 1 - (2 * (y / widget_h))};
|
||||||
|
|
||||||
g_debug("<%f , %f>", x * sx, y * sy);
|
g_debug("<%f , %f>", normalized_coords.x, normalized_coords.y);
|
||||||
vektor_appstate_canvas_click(state, x * sx, y * sy);
|
vektor_appstate_canvas_click(state, normalized_coords.x,
|
||||||
|
normalized_coords.y);
|
||||||
|
gtk_gl_area_queue_render(GTK_GL_AREA(widget));
|
||||||
}
|
}
|
||||||
|
|
||||||
void vektor_appstate_canvas_click(VektorAppState* state, double x, double y) {
|
void vektor_appstate_canvas_click(VektorAppState* state, double x, double y) {
|
||||||
@@ -95,7 +97,7 @@ void vektor_appstate_new(VektorWidgetState* wstate, VektorAppState* stateOut) {
|
|||||||
stateOut->frameBuffer = malloc(sizeof(VektorFramebuffer));
|
stateOut->frameBuffer = malloc(sizeof(VektorFramebuffer));
|
||||||
*stateOut->frameBuffer = vektor_framebuffer_new(400, 400);
|
*stateOut->frameBuffer = vektor_framebuffer_new(400, 400);
|
||||||
stateOut->canvas = malloc(sizeof(VektorCanvas));
|
stateOut->canvas = malloc(sizeof(VektorCanvas));
|
||||||
vektor_canvas_init(wstate, stateOut->canvas);
|
vektor_canvas_init(wstate, stateOut->canvas, stateOut->primitiveBuffer);
|
||||||
|
|
||||||
// link all the buttons
|
// link all the buttons
|
||||||
g_signal_connect(G_OBJECT(wstate->workspaceButtonLinetool), "clicked",
|
g_signal_connect(G_OBJECT(wstate->workspaceButtonLinetool), "clicked",
|
||||||
@@ -107,7 +109,8 @@ void vektor_appstate_new(VektorWidgetState* wstate, VektorAppState* stateOut) {
|
|||||||
|
|
||||||
// hook subtool revealers to their master buttons
|
// hook subtool revealers to their master buttons
|
||||||
g_signal_connect(G_OBJECT(wstate->workspaceButtonMasterShapes), "clicked",
|
g_signal_connect(G_OBJECT(wstate->workspaceButtonMasterShapes), "clicked",
|
||||||
G_CALLBACK(appstate_reveal_subtools), wstate->workspaceRevealerShapes);
|
G_CALLBACK(appstate_reveal_subtools),
|
||||||
|
wstate->workspaceRevealerShapes);
|
||||||
|
|
||||||
// Add click gesture to canvas
|
// Add click gesture to canvas
|
||||||
GtkGesture* canvasClickGesture = gtk_gesture_click_new();
|
GtkGesture* canvasClickGesture = gtk_gesture_click_new();
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ char* read_file(const char* path) {
|
|||||||
|
|
||||||
static GLuint shader_program;
|
static GLuint shader_program;
|
||||||
static GLuint vao;
|
static GLuint vao;
|
||||||
|
// VektorPrimitiveBuffer prims = {0};
|
||||||
VertexBuffer vb;
|
VertexBuffer vb;
|
||||||
|
|
||||||
static GLuint compile_shader(GLenum type, const char* src) {
|
static GLuint compile_shader(GLenum type, const char* src) {
|
||||||
@@ -81,50 +82,45 @@ static void init_geometry(void) {
|
|||||||
// VertexBuffer vb =
|
// VertexBuffer vb =
|
||||||
// (VertexBuffer){.count = 3, .capacity = 3, .vertices = &vs[0]};
|
// (VertexBuffer){.count = 3, .capacity = 3, .vertices = &vs[0]};
|
||||||
|
|
||||||
VektorPolygon triangle = *vektor_polygon_new();
|
// VektorPolygon* triangle = vektor_polygon_new();
|
||||||
vektor_polygon_add_point(&triangle, (V2){-0.5f, -0.5f}); // bottom-left
|
// vektor_polygon_add_point(triangle, (V2){-0.5f, -0.5f}); // bottom-left
|
||||||
vektor_polygon_add_point(&triangle, (V2){0.5f, -0.5f}); // bottom-right
|
// vektor_polygon_add_point(triangle, (V2){0.5f, -0.5f}); // bottom-right
|
||||||
vektor_polygon_add_point(&triangle, (V2){0.0f, 0.5f}); // top-center
|
// vektor_polygon_add_point(triangle, (V2){0.0f, 0.5f}); // top-center
|
||||||
|
|
||||||
VektorPrimitiveBuffer prims = {0};
|
// vektor_primitivebuffer_add_primitive(
|
||||||
vektor_primitivebuffer_add_primitive(
|
// &prims, (VektorPrimitive){.kind = VEKTOR_POLYGON, .polygon =
|
||||||
&prims,
|
// triangle});
|
||||||
(VektorPrimitive){.kind = VEKTOR_POLYGON, .polygon = &triangle});
|
|
||||||
|
|
||||||
vb = vektor_rasterize(&prims);
|
// for (size_t i = 0; i < vb.count; i++) {
|
||||||
|
// printf("Vertex %zu: x=%f, y=%f\n", i, vb.vertices[i].x,
|
||||||
|
// vb.vertices[i].y);
|
||||||
|
// }
|
||||||
|
|
||||||
|
GLuint vbo;
|
||||||
|
|
||||||
|
glGenVertexArrays(1, &vao);
|
||||||
|
glBindVertexArray(vao);
|
||||||
|
|
||||||
|
glGenBuffers(1, &vbo);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||||
|
|
||||||
|
glEnableVertexAttribArray(0);
|
||||||
|
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(V2), (void*)0);
|
||||||
|
glBindVertexArray(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean render(GtkGLArea* area, GdkGLContext* context,
|
||||||
|
VektorPrimitiveBuffer* prims) {
|
||||||
|
vb = vektor_rasterize(prims);
|
||||||
|
|
||||||
for (size_t i = 0; i < vb.count; i++) {
|
for (size_t i = 0; i < vb.count; i++) {
|
||||||
printf("Vertex %zu: x=%f, y=%f\n", i, vb.vertices[i].x,
|
printf("Vertex %zu: x=%f, y=%f\n", i, vb.vertices[i].x,
|
||||||
vb.vertices[i].y);
|
vb.vertices[i].y);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLuint vbo;
|
|
||||||
|
|
||||||
// 1. Create VAO
|
|
||||||
glGenVertexArrays(1, &vao);
|
|
||||||
glBindVertexArray(vao);
|
|
||||||
|
|
||||||
// 2. Create VBO
|
|
||||||
glGenBuffers(1, &vbo);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
|
||||||
|
|
||||||
// 3. Upload your vertices (V2 = 2 floats per vertex)
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, vb.count * sizeof(V2), vb.vertices,
|
glBufferData(GL_ARRAY_BUFFER, vb.count * sizeof(V2), vb.vertices,
|
||||||
GL_STATIC_DRAW);
|
GL_STATIC_DRAW);
|
||||||
|
|
||||||
// 4. Tell GL about the vertex layout
|
|
||||||
glEnableVertexAttribArray(0);
|
|
||||||
glVertexAttribPointer(0, // layout location 0 in shader
|
|
||||||
2, // 2 components per vertex (x, y)
|
|
||||||
GL_FLOAT, // type
|
|
||||||
GL_FALSE, // do not normalize
|
|
||||||
sizeof(V2), // stride (size of one vertex)
|
|
||||||
(void*)0 // offset
|
|
||||||
);
|
|
||||||
glBindVertexArray(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean render(GtkGLArea* area, GdkGLContext* context) {
|
|
||||||
glUseProgram(shader_program);
|
glUseProgram(shader_program);
|
||||||
|
|
||||||
GLuint uProjectionLoc = glGetUniformLocation(shader_program, "uProjection");
|
GLuint uProjectionLoc = glGetUniformLocation(shader_program, "uProjection");
|
||||||
@@ -188,7 +184,8 @@ static void realize(GtkGLArea* area, gpointer user_data) {
|
|||||||
init_geometry();
|
init_geometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
void vektor_canvas_init(VektorWidgetState* state, VektorCanvas* canvasOut) {
|
void vektor_canvas_init(VektorWidgetState* state, VektorCanvas* canvasOut,
|
||||||
|
VektorPrimitiveBuffer* prims) {
|
||||||
canvasOut->canvasWidget = state->workspaceCanvas;
|
canvasOut->canvasWidget = state->workspaceCanvas;
|
||||||
canvasOut->width = VKTR_CANVAS_WIDTH;
|
canvasOut->width = VKTR_CANVAS_WIDTH;
|
||||||
canvasOut->height = VKTR_CANVAS_HEIGHT;
|
canvasOut->height = VKTR_CANVAS_HEIGHT;
|
||||||
@@ -203,7 +200,7 @@ void vektor_canvas_init(VektorWidgetState* state, VektorCanvas* canvasOut) {
|
|||||||
g_signal_connect(canvasOut->canvasWidget, "realize", G_CALLBACK(realize),
|
g_signal_connect(canvasOut->canvasWidget, "realize", G_CALLBACK(realize),
|
||||||
NULL);
|
NULL);
|
||||||
g_signal_connect(canvasOut->canvasWidget, "render", G_CALLBACK(render),
|
g_signal_connect(canvasOut->canvasWidget, "render", G_CALLBACK(render),
|
||||||
NULL);
|
prims);
|
||||||
// gtk_picture_set_paintable(canvasOut->canvasWidget,
|
// gtk_picture_set_paintable(canvasOut->canvasWidget,
|
||||||
// GDK_PAINTABLE(canvasOut->canvasTexture));
|
// GDK_PAINTABLE(canvasOut->canvasTexture));
|
||||||
// gtk_picture_set_content_fit(GTK_PICTURE(canvasOut->canvasWidget),
|
// gtk_picture_set_content_fit(GTK_PICTURE(canvasOut->canvasWidget),
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ typedef struct VektorCanvas {
|
|||||||
int height;
|
int height;
|
||||||
} VektorCanvas;
|
} VektorCanvas;
|
||||||
|
|
||||||
void vektor_canvas_init(VektorWidgetState* state, VektorCanvas* canvasOut);
|
void vektor_canvas_init(VektorWidgetState* state, VektorCanvas* canvasOut,
|
||||||
|
VektorPrimitiveBuffer* prims);
|
||||||
void vektor_canvas_update(VektorCanvas* canvas);
|
void vektor_canvas_update(VektorCanvas* canvas);
|
||||||
void vektor_canvas_fill(VektorCanvas* canvas, VektorColor color);
|
void vektor_canvas_fill(VektorCanvas* canvas, VektorColor color);
|
||||||
void vektor_canvas_drawfrom(VektorFramebuffer* fb, VektorCanvas* canvas);
|
void vektor_canvas_drawfrom(VektorFramebuffer* fb, VektorCanvas* canvas);
|
||||||
|
|||||||
Reference in New Issue
Block a user