57 lines
2.2 KiB
C++
57 lines
2.2 KiB
C++
#include "generate_preview.h"
|
|
|
|
void generate_preview_init(GeneratePreview* self, Anm2* anm2, Anm2Reference* reference, Resources* resources, Settings* settings)
|
|
{
|
|
self->anm2 = anm2;
|
|
self->reference = reference;
|
|
self->resources = resources;
|
|
self->settings = settings;
|
|
|
|
canvas_init(&self->canvas, GENERATE_PREVIEW_SIZE);
|
|
}
|
|
|
|
void generate_preview_draw(GeneratePreview* self)
|
|
{
|
|
static auto& columns = self->settings->generateColumns;
|
|
static auto& count = self->settings->generateCount;
|
|
static GLuint& shaderTexture = self->resources->shaders[SHADER_TEXTURE];
|
|
const mat4 transform = canvas_transform_get(&self->canvas, {}, CANVAS_ZOOM_DEFAULT, ORIGIN_CENTER);
|
|
|
|
vec2 startPosition = {self->settings->generateStartPosition.x, self->settings->generateStartPosition.y};
|
|
vec2 size = {self->settings->generateSize.x, self->settings->generateSize.y};
|
|
vec2 pivot = {self->settings->generatePivot.x, self->settings->generatePivot.y};
|
|
|
|
canvas_bind(&self->canvas);
|
|
canvas_viewport_set(&self->canvas);
|
|
canvas_clear(self->settings->previewBackgroundColor);
|
|
|
|
Anm2Item* item = anm2_item_from_reference(self->anm2, self->reference);
|
|
|
|
if (item)
|
|
{
|
|
if (Anm2Spritesheet* spritesheet = map_find(self->anm2->spritesheets, self->anm2->layers[self->reference->itemID].spritesheetID))
|
|
{
|
|
Texture& texture = spritesheet->texture;
|
|
|
|
const s32 index = std::clamp((s32)(self->time * count), 0, count);
|
|
const s32 row = index / columns;
|
|
const s32 column = index % columns;
|
|
vec2 crop = startPosition + vec2(size.x * column, size.y * row);
|
|
|
|
vec2 textureSize = vec2(texture.size);
|
|
vec2 uvMin = (crop + vec2(0.5f)) / textureSize;
|
|
vec2 uvMax = (crop + size - vec2(0.5f)) / textureSize;
|
|
f32 vertices[] = UV_VERTICES(uvMin, uvMax);
|
|
|
|
mat4 generateTransform = transform * quad_model_get(size, {}, pivot);
|
|
canvas_texture_draw(&self->canvas, shaderTexture, texture.id, generateTransform, vertices, COLOR_OPAQUE, COLOR_OFFSET_NONE);
|
|
}
|
|
}
|
|
|
|
canvas_unbind();
|
|
}
|
|
|
|
void generate_preview_free(GeneratePreview* self)
|
|
{
|
|
canvas_free(&self->canvas);
|
|
} |