#include "test.h" #include "vectors.h" #include "vkvg_context_internal.h" vkvg_fill_rule_t fillrule = VKVG_FILL_RULE_NON_ZERO; static VkSampleCountFlags samples = VK_SAMPLE_COUNT_8_BIT; float lineWidth = 3.0f; vkvg_line_join_t lineJoin = VKVG_LINE_JOIN_MITER; vkvg_line_cap_t lineCap = VKVG_LINE_CAP_BUTT; bool isClosed = false; bool startWithArc = false, endWithArc = false; float angle = 0; float r; vec2 mouse; void draw (){ angle += 0.001f; VkvgContext ctx = vkvg_create(surf); vkvg_clear(ctx); float r = fabsf(test_width/2 - mouse.x)/zoom; vkvg_new_path(ctx); vkvg_set_source_rgba(ctx,1,0,0,1); vkvg_set_line_width (ctx,lineWidth/zoom); vkvg_translate(ctx, test_width/2, test_height/2); vkvg_scale(ctx, zoom, zoom); //vkvg_rotate (ctx, angle); vkvg_matrix_t mat; vkvg_get_matrix(ctx, &mat); float sx, sy; vkvg_matrix_get_scale(&mat, &sx, &sy); vkvg_arc (ctx,0,0,r, 0, M_PIF*2); vkvg_fill(ctx); float steps = _get_arc_step(ctx, r); vkvg_identity_matrix(ctx); vkvg_set_source_rgba(ctx,1,1,1,1); char txt[100]; sprintf(txt, "scale: %f, %f", sx, sy); vkvg_move_to(ctx,10,10); vkvg_show_text(ctx,txt); sprintf(txt, "angle: %f", angle); vkvg_move_to(ctx,10,25); vkvg_show_text(ctx,txt); sprintf(txt, "radius: %f", r); vkvg_move_to(ctx,10,40); vkvg_show_text(ctx,txt); sprintf(txt, "zoom: %f", zoom); vkvg_move_to(ctx,10,55); vkvg_show_text(ctx,txt); sprintf(txt, "arc step: %f", steps); vkvg_move_to(ctx,10,70); vkvg_show_text(ctx,txt); sprintf(txt, "steps: %d", (int)roundf(2.0f*M_PI / steps)); vkvg_move_to(ctx,10,85); vkvg_show_text(ctx,txt); vkvg_destroy(ctx); } static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { if (action != GLFW_PRESS) return; switch (key) { case GLFW_KEY_ESCAPE : glfwSetWindowShouldClose(window, GLFW_TRUE); break; case GLFW_KEY_KP_ADD : zoom *= 2.0f; break; case GLFW_KEY_KP_SUBTRACT : zoom *= 0.5f; break; #ifdef VKVG_WIRED_DEBUG case GLFW_KEY_F1: vkvg_wired_debug ^= (1U << 0); break; case GLFW_KEY_F2: vkvg_wired_debug ^= (1U << 1); break; case GLFW_KEY_F3: vkvg_wired_debug ^= (1U << 2); break; #endif } } static void mouse_move_callback(GLFWwindow* window, double x, double y){ if (mouseDown) { mouse = (vec2) {x, y}; } } static void scroll_callback(GLFWwindow* window, double x, double y){ if (y<0.f) zoom *= 0.5f; else zoom *= 2.0f; } static void mouse_button_callback(GLFWwindow* window, int but, int state, int modif){ if (but != GLFW_MOUSE_BUTTON_1) return; if (state == GLFW_TRUE) mouseDown = true; else mouseDown = false; } int main(int argc, char* argv[]) { _parse_args (argc, argv); VkEngine e; e = vkengine_create (VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_PRESENT_MODE_FIFO_KHR, test_width, test_height); VkhPresenter r = e->renderer; vkengine_set_key_callback (e, key_callback); vkengine_set_mouse_but_callback(e, mouse_button_callback); vkengine_set_cursor_pos_callback(e, mouse_move_callback); vkengine_set_scroll_callback(e, scroll_callback); bool deferredResolve = false; device = vkvg_device_create_from_vk_multisample(vkh_app_get_inst(e->app), r->dev->phy, r->dev->dev, r->qFam, 0, samples, deferredResolve); surf = vkvg_surface_create(device, test_width, test_height); vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf), test_width, test_height); mouse = (vec2){test_width*0.75,test_height*0.5f}; while (!vkengine_should_close (e)) { glfwPollEvents(); draw (); if (!vkh_presenter_draw (r)){ vkh_presenter_get_size (r, &test_width, &test_height); vkvg_surface_destroy (surf); surf = vkvg_surface_create(device, test_width, test_height); vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf), test_width, test_height); vkDeviceWaitIdle(r->dev->dev); continue; } } vkDeviceWaitIdle(e->dev->dev); vkvg_surface_destroy (surf); vkvg_device_destroy (device); vkengine_destroy (e); return 0; }