diff --git a/src/application/applicationstate.c b/src/application/applicationstate.c index 2cb8fd1..c45628c 100644 --- a/src/application/applicationstate.c +++ b/src/application/applicationstate.c @@ -42,11 +42,13 @@ static void canvas_onclick(GtkGestureClick* gesture, int n_press, double x, int canvas_w = state->canvas->width; int canvas_h = state->canvas->height; - double sx = canvas_w / (double)widget_w; - double sy = canvas_h / (double)widget_h; + V2 normalized_coords = + (V2){(2 * (x / widget_w)) - 1, 1 - (2 * (y / widget_h))}; - g_debug("<%f , %f>", x * sx, y * sy); - vektor_appstate_canvas_click(state, x * sx, y * sy); + g_debug("<%f , %f>", normalized_coords.x, normalized_coords.y); + 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) { @@ -95,7 +97,7 @@ void vektor_appstate_new(VektorWidgetState* wstate, VektorAppState* stateOut) { stateOut->frameBuffer = malloc(sizeof(VektorFramebuffer)); *stateOut->frameBuffer = vektor_framebuffer_new(400, 400); stateOut->canvas = malloc(sizeof(VektorCanvas)); - vektor_canvas_init(wstate, stateOut->canvas); + vektor_canvas_init(wstate, stateOut->canvas, stateOut->primitiveBuffer); // link all the buttons 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 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 GtkGesture* canvasClickGesture = gtk_gesture_click_new(); diff --git a/src/ui/vektorcanvas.c b/src/ui/vektorcanvas.c index 7ad8fac..a8cdbb0 100644 --- a/src/ui/vektorcanvas.c +++ b/src/ui/vektorcanvas.c @@ -29,6 +29,7 @@ char* read_file(const char* path) { static GLuint shader_program; static GLuint vao; +// VektorPrimitiveBuffer prims = {0}; VertexBuffer vb; static GLuint compile_shader(GLenum type, const char* src) { @@ -81,50 +82,45 @@ static void init_geometry(void) { // VertexBuffer vb = // (VertexBuffer){.count = 3, .capacity = 3, .vertices = &vs[0]}; - 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-right - vektor_polygon_add_point(&triangle, (V2){0.0f, 0.5f}); // top-center + // 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-right + // vektor_polygon_add_point(triangle, (V2){0.0f, 0.5f}); // top-center - VektorPrimitiveBuffer prims = {0}; - vektor_primitivebuffer_add_primitive( - &prims, - (VektorPrimitive){.kind = VEKTOR_POLYGON, .polygon = &triangle}); + // vektor_primitivebuffer_add_primitive( + // &prims, (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++) { printf("Vertex %zu: x=%f, y=%f\n", i, vb.vertices[i].x, 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, 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); GLuint uProjectionLoc = glGetUniformLocation(shader_program, "uProjection"); @@ -188,7 +184,8 @@ static void realize(GtkGLArea* area, gpointer user_data) { 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->width = VKTR_CANVAS_WIDTH; 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), NULL); g_signal_connect(canvasOut->canvasWidget, "render", G_CALLBACK(render), - NULL); + prims); // gtk_picture_set_paintable(canvasOut->canvasWidget, // GDK_PAINTABLE(canvasOut->canvasTexture)); // gtk_picture_set_content_fit(GTK_PICTURE(canvasOut->canvasWidget), diff --git a/src/ui/vektorcanvas.h b/src/ui/vektorcanvas.h index e66c369..3a959bb 100644 --- a/src/ui/vektorcanvas.h +++ b/src/ui/vektorcanvas.h @@ -18,7 +18,8 @@ typedef struct VektorCanvas { int height; } 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_fill(VektorCanvas* canvas, VektorColor color); void vektor_canvas_drawfrom(VektorFramebuffer* fb, VektorCanvas* canvas);