it's kind of finished
This commit is contained in:
107
src/preview.cpp
107
src/preview.cpp
@@ -1,7 +1,7 @@
|
||||
#include "preview.h"
|
||||
|
||||
static void _preview_axis_set(Preview* self);
|
||||
static void _preview_grid_set(Preview* self);
|
||||
static s32 _preview_grid_set(Preview* self);
|
||||
|
||||
static void
|
||||
_preview_axis_set(Preview* self)
|
||||
@@ -16,13 +16,14 @@ _preview_axis_set(Preview* self)
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
|
||||
static void
|
||||
/* Sets and returns the grid's vertices */
|
||||
static s32
|
||||
_preview_grid_set(Preview* self)
|
||||
{
|
||||
std::vector<f32> vertices;
|
||||
|
||||
s32 verticalLineCount = PREVIEW_SIZE.x / MIN(self->settings->previewGridSizeX, PREVIEW_GRID_MIN);
|
||||
s32 horizontalLineCount = PREVIEW_SIZE.y / MIN(self->settings->previewGridSizeY, PREVIEW_GRID_MIN);
|
||||
s32 verticalLineCount = (s32)(PREVIEW_SIZE.x / MIN(self->settings->previewGridSizeX, PREVIEW_GRID_MIN));
|
||||
s32 horizontalLineCount = (s32)(PREVIEW_SIZE.y / MIN(self->settings->previewGridSizeY, PREVIEW_GRID_MIN));
|
||||
|
||||
/* Vertical */
|
||||
for (s32 i = 0; i <= verticalLineCount; i++)
|
||||
@@ -48,22 +49,23 @@ _preview_grid_set(Preview* self)
|
||||
vertices.push_back(normY);
|
||||
}
|
||||
|
||||
self->gridVertexCount = (s32)vertices.size();
|
||||
|
||||
glBindVertexArray(self->gridVAO);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, self->gridVBO);
|
||||
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(f32), vertices.data(), GL_DYNAMIC_DRAW);
|
||||
|
||||
glEnableVertexAttribArray(0);
|
||||
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(f32), (void*)0);
|
||||
|
||||
return (s32)vertices.size();
|
||||
}
|
||||
|
||||
void
|
||||
preview_init(Preview* self, Anm2* anm2, Resources* resources, Input* input, Settings* settings)
|
||||
preview_init(Preview* self, Anm2* anm2, Anm2Reference* reference, s32* animationID, Resources* resources, Settings* settings)
|
||||
{
|
||||
self->anm2 = anm2;
|
||||
self->reference = reference;
|
||||
self->animationID = animationID;
|
||||
self->resources = resources;
|
||||
self->input = input;
|
||||
self->settings = settings;
|
||||
|
||||
/* Framebuffer + texture */
|
||||
@@ -137,14 +139,11 @@ void
|
||||
preview_tick(Preview* self)
|
||||
{
|
||||
self->settings->previewZoom = CLAMP(self->settings->previewZoom, PREVIEW_ZOOM_MIN, PREVIEW_ZOOM_MAX);
|
||||
|
||||
self->oldGridSize = glm::vec2(self->settings->previewGridSizeX, self->settings->previewGridSizeY);
|
||||
self->oldGridOffset = glm::vec2(self->settings->previewGridOffsetX, self->settings->previewGridOffsetY);
|
||||
|
||||
Anm2Animation* animation = anm2_animation_from_id(self->anm2, *self->animationID);
|
||||
|
||||
if (self->animationID > -1)
|
||||
if (animation)
|
||||
{
|
||||
Anm2Animation* animation = &self->anm2->animations[self->animationID];
|
||||
|
||||
if (self->isPlaying)
|
||||
{
|
||||
self->time += (f32)self->anm2->fps / TICK_RATE;
|
||||
@@ -162,7 +161,7 @@ preview_draw(Preview* self)
|
||||
{
|
||||
GLuint shaderLine = self->resources->shaders[SHADER_LINE];
|
||||
GLuint shaderTexture = self->resources->shaders[SHADER_TEXTURE];
|
||||
|
||||
|
||||
f32 zoomFactor = self->settings->previewZoom / 100.0f;
|
||||
glm::vec2 ndcPan = glm::vec2(-self->settings->previewPanX / (PREVIEW_SIZE.x / 2.0f), -self->settings->previewPanY / (PREVIEW_SIZE.y / 2.0f));
|
||||
glm::mat4 previewTransform = glm::translate(glm::mat4(1.0f), glm::vec3(ndcPan, 0.0f));
|
||||
@@ -183,12 +182,18 @@ preview_draw(Preview* self)
|
||||
/* Grid */
|
||||
if (self->settings->previewIsGrid)
|
||||
{
|
||||
if
|
||||
(
|
||||
(ivec2(self->settings->previewGridSizeX, self->settings->previewGridSizeY) != self->oldGridSize) ||
|
||||
(ivec2(self->settings->previewGridOffsetX, self->settings->previewGridOffsetY) != self->oldGridOffset)
|
||||
)
|
||||
_preview_grid_set(self);
|
||||
static ivec2 previousGridSize = {-1, -1};
|
||||
static ivec2 previousGridOffset = {-1, -1};
|
||||
static s32 gridVertexCount = -1;
|
||||
ivec2 gridSize = ivec2(self->settings->previewGridSizeX, self->settings->previewGridSizeY);
|
||||
ivec2 gridOffset = ivec2(self->settings->previewGridOffsetX, self->settings->previewGridOffsetY);
|
||||
|
||||
if (previousGridSize != gridSize || previousGridOffset != gridOffset)
|
||||
{
|
||||
gridVertexCount = _preview_grid_set(self);
|
||||
previousGridSize = gridSize;
|
||||
previousGridOffset = gridOffset;
|
||||
}
|
||||
|
||||
glUseProgram(shaderLine);
|
||||
glBindVertexArray(self->gridVAO);
|
||||
@@ -200,7 +205,7 @@ preview_draw(Preview* self)
|
||||
self->settings->previewGridColorR, self->settings->previewGridColorG, self->settings->previewGridColorB, self->settings->previewGridColorA
|
||||
);
|
||||
|
||||
glDrawArrays(GL_LINES, 0, self->gridVertexCount);
|
||||
glDrawArrays(GL_LINES, 0, gridVertexCount);
|
||||
|
||||
glBindVertexArray(0);
|
||||
glUseProgram(0);
|
||||
@@ -230,33 +235,32 @@ preview_draw(Preview* self)
|
||||
|
||||
glDrawArrays(GL_LINES, 2, 2);
|
||||
|
||||
|
||||
glBindVertexArray(0);
|
||||
glUseProgram(0);
|
||||
}
|
||||
|
||||
Anm2Animation* animation = anm2_animation_from_id(self->anm2, *self->animationID);
|
||||
|
||||
/* Animation */
|
||||
if (self->animationID > -1)
|
||||
if (animation)
|
||||
{
|
||||
Anm2Frame rootFrame = Anm2Frame{};
|
||||
Anm2Animation* animation = &self->anm2->animations[self->animationID];
|
||||
bool isRootFrame = anm2_frame_from_time(self->anm2, animation, &rootFrame, ANM2_ROOT_ANIMATION, 0, self->time);
|
||||
Anm2Frame rootFrame;
|
||||
anm2_frame_from_time(self->anm2, &rootFrame, Anm2Reference{ANM2_ROOT, 0, 0}, *self->animationID, self->time);
|
||||
|
||||
/* Layers (Reversed) */
|
||||
/* Layers */
|
||||
for (auto & [id, layerAnimation] : animation->layerAnimations)
|
||||
{
|
||||
if (!layerAnimation.isVisible || layerAnimation.frames.size() <= 0)
|
||||
continue;
|
||||
|
||||
Anm2Layer* layer = &self->anm2->layers[id];
|
||||
Anm2Frame frame = layerAnimation.frames[0];
|
||||
Anm2Frame frame;
|
||||
|
||||
anm2_frame_from_time(self->anm2, animation, &frame, ANM2_LAYER_ANIMATION, id, self->time);
|
||||
anm2_frame_from_time(self->anm2, &frame, Anm2Reference{ANM2_LAYER, id, 0}, *self->animationID, self->time);
|
||||
|
||||
if (!frame.isVisible)
|
||||
continue;
|
||||
|
||||
Texture* texture = &self->resources->textures[layer->spritesheetID];
|
||||
Texture* texture = &self->resources->textures[self->anm2->layers[id].spritesheetID];
|
||||
|
||||
if (texture->isInvalid)
|
||||
continue;
|
||||
@@ -264,7 +268,7 @@ preview_draw(Preview* self)
|
||||
glm::mat4 layerTransform = previewTransform;
|
||||
|
||||
glm::vec2 position = self->settings->previewIsRootTransform ? (frame.position + rootFrame.position) : frame.position;
|
||||
glm::vec2 scale = self->settings->previewIsRootTransform ? (frame.scale / 100.0f) * (rootFrame.scale / 100.0f) : (frame.scale / 100.0f);
|
||||
glm::vec2 scale = frame.scale / 100.0f;
|
||||
glm::vec2 ndcPos = position / (PREVIEW_SIZE / 2.0f);
|
||||
glm::vec2 ndcPivotOffset = (frame.pivot * scale) / (PREVIEW_SIZE / 2.0f);
|
||||
glm::vec2 ndcScale = (frame.size * scale) / (PREVIEW_SIZE / 2.0f);
|
||||
@@ -276,7 +280,6 @@ preview_draw(Preview* self)
|
||||
layerTransform = glm::translate(layerTransform, glm::vec3(-ndcPivotOffset, 0.0f));
|
||||
layerTransform = glm::scale(layerTransform, glm::vec3(ndcScale, 1.0f));
|
||||
|
||||
|
||||
glm::vec2 uvMin = frame.crop / glm::vec2(texture->size);
|
||||
glm::vec2 uvMax = (frame.crop + frame.size) / glm::vec2(texture->size);
|
||||
|
||||
@@ -305,17 +308,13 @@ preview_draw(Preview* self)
|
||||
glUseProgram(0);
|
||||
}
|
||||
|
||||
/* Root */
|
||||
if
|
||||
(isRootFrame && animation->rootAnimation.isVisible && rootFrame.isVisible)
|
||||
if (animation->rootAnimation.isVisible && rootFrame.isVisible)
|
||||
{
|
||||
glm::mat4 rootTransform = previewTransform;
|
||||
glm::vec2 ndcPos = (rootFrame.position - (ATLAS_SIZES[TEXTURE_TARGET] / 2.0f)) / (PREVIEW_SIZE / 2.0f);
|
||||
glm::vec2 ndcScale = ATLAS_SIZES[TEXTURE_TARGET] / (PREVIEW_SIZE / 2.0f);
|
||||
glm::vec2 ndcPivot = (-ATLAS_SIZES[TEXTURE_TARGET] / 2.0f) / (PREVIEW_SIZE / 2.0f);
|
||||
glm::vec2 ndcPos = (rootFrame.position - (PREVIEW_TARGET_SIZE / 2.0f)) / (PREVIEW_SIZE / 2.0f);
|
||||
glm::vec2 ndcScale = PREVIEW_TARGET_SIZE / (PREVIEW_SIZE / 2.0f);
|
||||
|
||||
rootTransform = glm::translate(rootTransform, glm::vec3(ndcPos, 0.0f));
|
||||
rootTransform = glm::rotate(rootTransform, glm::radians(rootFrame.rotation), glm::vec3(0, 0, 1));
|
||||
rootTransform = glm::scale(rootTransform, glm::vec3(ndcScale, 1.0f));
|
||||
|
||||
f32 vertices[] = ATLAS_UV_VERTICES(TEXTURE_TARGET);
|
||||
@@ -346,17 +345,15 @@ preview_draw(Preview* self)
|
||||
/* Pivots */
|
||||
if (self->settings->previewIsShowPivot)
|
||||
{
|
||||
for (auto it = animation->layerAnimations.rbegin(); it != animation->layerAnimations.rend(); it++)
|
||||
/* Layers (Reversed) */
|
||||
for (auto & [id, layerAnimation] : animation->layerAnimations)
|
||||
{
|
||||
s32 id = it->first;
|
||||
Anm2LayerAnimation layerAnimation = it->second;
|
||||
|
||||
if (!layerAnimation.isVisible || layerAnimation.frames.size() <= 0)
|
||||
continue;
|
||||
|
||||
Anm2Frame frame = layerAnimation.frames[0];
|
||||
Anm2Frame frame;
|
||||
|
||||
anm2_frame_from_time(self->anm2, animation, &frame, ANM2_LAYER_ANIMATION, id, self->time);
|
||||
anm2_frame_from_time(self->anm2, &frame, Anm2Reference{ANM2_LAYER, id, 0}, *self->animationID, self->time);
|
||||
|
||||
if (!frame.isVisible)
|
||||
continue;
|
||||
@@ -365,8 +362,8 @@ preview_draw(Preview* self)
|
||||
|
||||
glm::vec2 position = self->settings->previewIsRootTransform ? (frame.position + rootFrame.position) : frame.position;
|
||||
|
||||
glm::vec2 ndcPos = (position - (ATLAS_SIZES[TEXTURE_PIVOT] / 2.0f)) / (PREVIEW_SIZE / 2.0f);
|
||||
glm::vec2 ndcScale = ATLAS_SIZES[TEXTURE_PIVOT] / (PREVIEW_SIZE / 2.0f);
|
||||
glm::vec2 ndcPos = (position - (PREVIEW_PIVOT_SIZE / 2.0f)) / (PREVIEW_SIZE / 2.0f);
|
||||
glm::vec2 ndcScale = PREVIEW_PIVOT_SIZE / (PREVIEW_SIZE / 2.0f);
|
||||
|
||||
pivotTransform = glm::translate(pivotTransform, glm::vec3(ndcPos, 0.0f));
|
||||
pivotTransform = glm::scale(pivotTransform, glm::vec3(ndcScale, 1.0f));
|
||||
@@ -403,21 +400,19 @@ preview_draw(Preview* self)
|
||||
if (!nullAnimation.isVisible || nullAnimation.frames.size() <= 0)
|
||||
continue;
|
||||
|
||||
Anm2Frame frame = nullAnimation.frames[0];
|
||||
Anm2Frame frame;
|
||||
|
||||
anm2_frame_from_time(self->anm2, animation, &frame, ANM2_NULL_ANIMATION, id, self->time);
|
||||
anm2_frame_from_time(self->anm2, &frame, Anm2Reference{ANM2_NULL, id, 0}, *self->animationID, self->time);
|
||||
|
||||
if (!frame.isVisible)
|
||||
continue;
|
||||
|
||||
Anm2Null* null = NULL;
|
||||
|
||||
null = &self->anm2->nulls[id];
|
||||
Anm2Null* null = &self->anm2->nulls[id];
|
||||
|
||||
glm::mat4 nullTransform = previewTransform;
|
||||
|
||||
TextureType textureType = null->isShowRect ? TEXTURE_SQUARE : TEXTURE_TARGET;
|
||||
glm::vec2 size = null->isShowRect ? PREVIEW_POINT_SIZE : ATLAS_SIZES[TEXTURE_TARGET];
|
||||
glm::vec2 size = null->isShowRect ? PREVIEW_POINT_SIZE : PREVIEW_TARGET_SIZE;
|
||||
glm::vec2 pos = self->settings->previewIsRootTransform ? frame.position + (rootFrame.position) - (size / 2.0f) : frame.position - (size / 2.0f);
|
||||
|
||||
glm::vec2 ndcPos = pos / (PREVIEW_SIZE / 2.0f);
|
||||
@@ -477,8 +472,6 @@ preview_draw(Preview* self)
|
||||
}
|
||||
}
|
||||
|
||||
glUseProgram(0);
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user