#include "src/kitty.h" #include "src/matrix.h" #include "src/paw_allocator.h" #include "src/paw_log.h" #include "src/paw_object.h" #include "src/types.h" #include "src/util.h" #define INSTANCE_COUNT 1000 struct Trig { struct Kitty *kitty; struct Vec2 vel[INSTANCE_COUNT]; struct Vec2 pos[INSTANCE_COUNT]; float rot[INSTANCE_COUNT]; }; #define TRIG_VERTEX_COUNT 6 struct Vertex trig_vertices[TRIG_VERTEX_COUNT] = { (struct Vertex){(struct Vec2){.x = -0.5f, .y = -0.5f}, (struct Vec3){1.0f, 0.0f, 1.0f}}, (struct Vertex){(struct Vec2){.x = 0.5f, .y = -0.5f}, (struct Vec3){1.0f, 0.0f, 0.0f}}, (struct Vertex){(struct Vec2){.x = 0.5f, .y = 0.5f}, (struct Vec3){1.0f, 0.0f, 1.0f}}, (struct Vertex){(struct Vec2){.x = -0.5f, .y = -0.5f}, (struct Vec3){1.0f, 0.0f, 1.0f}}, (struct Vertex){(struct Vec2){.x = 0.5f, .y = 0.5f}, (struct Vec3){1.0f, 0.0f, 1.0f}}, (struct Vertex){(struct Vec2){.x = -0.5f, .y = 0.5f}, (struct Vec3){0.0f, 0.0f, 1.0f}}, }; struct TrigUBO { struct mat3x3 view; struct mat3x3 proj; }; struct Trig *trig_make_args(struct PawScene *scene) { struct Trig *trig = paw_memmalloc(scene->mem, sizeof(struct Trig)); trig->kitty = kitty_make(scene->mem); kitty_set_vertex_shader(trig->kitty, "./res/shaders/vert.spv"); kitty_set_fragment_shader(trig->kitty, "./res/shaders/frag.spv"); kitty_set_vertex_buffer(trig->kitty, trig_vertices, TRIG_VERTEX_COUNT, sizeof(struct Vertex)); kitty_add_vertex_buffer_format(trig->kitty, VK_FORMAT_R32G32_SFLOAT); kitty_add_vertex_buffer_format(trig->kitty, VK_FORMAT_R32G32B32_SFLOAT); kitty_attatch_ubo(trig->kitty, sizeof(struct TrigUBO)); kitty_attatch_ubo(trig->kitty, sizeof(struct mat3x3) * INSTANCE_COUNT); kitty_attatch_image(trig->kitty, "./res/neocat.png"); uint32_t instance_buffer[INSTANCE_COUNT] = {0}; for (int i = 0; i < INSTANCE_COUNT; i++) { instance_buffer[i] = i; trig->rot[i] = randf() * 2.0f * PI; trig->pos[i] = (struct Vec2){randf(), randf()}; trig->vel[i] = vec2_mul( vec2_normalize((struct Vec2){randf() - 0.5f, randf() - 0.5f}), 0.2f); /* trig->vel[i] = (struct Vec2){1.0f, 0.0f}; */ } kitty_add_instance_buffer(trig->kitty, instance_buffer, INSTANCE_COUNT, sizeof(uint32_t)); kitty_add_instance_buffer_format(trig->kitty, VK_FORMAT_R32_UINT); kitty_finalise(scene->vk, trig->kitty); return trig; } struct Trig *make_trig(struct PawScene *scene, char *_data, int _len) { return trig_make_args(scene); } void free_trig(struct PawScene *scene, struct Trig *trig) { kitty_free(scene->vk, trig->kitty); paw_memfree(scene->mem, trig); } void trig_tick(struct PawScene *scene, struct Trig *trig) { struct TrigUBO ubo = {0}; ubo.view = multiply3x3(translate3x3((struct Vec2){-1.5f, -0.5f}), scale3x3((struct Vec2){1.0f, 1.0f})); ubo.proj = scale3x3( (struct Vec2){1.f, (float)scene->vk->width / (float)scene->vk->heigh}); kitty_set_next_ubo(scene->vk, trig->kitty, 0, &ubo); struct mat3x3 *model = kitty_get_next_ubo_pointer(scene->vk, trig->kitty, 1); for (int i = 0; i < INSTANCE_COUNT; i++) { trig->pos[i] = vec2_add(trig->pos[i], vec2_mul(trig->vel[i], scene->delta_secs)); trig->rot[i] += scene->delta_secs; if (trig->pos[i].x < 0 || trig->pos[i].x > 2.5) { trig->vel[i].x = -trig->vel[i].x; } if (trig->pos[i].y < -0.5 || trig->pos[i].y > 2) { trig->vel[i].y = -trig->vel[i].y; } model[i] = IDENT3x3; model[i] = multiply3x3(model[i], translate3x3(trig->pos[i])); model[i] = multiply3x3(model[i], rotate3x3(trig->rot[i])); model[i] = multiply3x3(model[i], scale3x3((struct Vec2){0.1f, 0.1f})); } }