103 lines
3.8 KiB
C
103 lines
3.8 KiB
C
#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, "./Shaders/vert.spv");
|
|
kitty_set_fragment_shader(trig->kitty, "./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, "./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}));
|
|
}
|
|
}
|