Mirai's Miscellaneous Misadventures

M32 / core / video.c

// copyright 2022 zamfofex
// license: AGPLv3 or later

#include <mimimi/video.h>
#include <mimimi/animations.h>
#include <mimimi/engines.h>
#include <mimimi/allocators.h>
#include <mimimi/appearances.h>
#include <mimimi/assets.h>

void mimimi_video(struct mimimi_video *video, struct mimimi_animation *animation, struct mimimi_engine *engine)
{
	for (int i = 0 ; i < video->count ; i++)
		video->textures[i] = (*engine->texture)(engine->data, animation->images + i);
}

void mimimi_invalidate_video(struct mimimi_video *video, struct mimimi_engine *engine)
{
	for (int i = 0 ; i < video->count ; i++)
		(*engine->invalidate)(engine->data, video->textures[i]);
}

static void mimimi_allocate_video(struct mimimi_video *video, struct mimimi_animation *animation, struct mimimi_engine *engine, struct mimimi_allocator *allocator)
{
	video->count = animation->count;
	video->textures = mimimi_allocate(allocator, video->count * sizeof *video->textures);
	mimimi_video(video, animation, engine);
}

static void mimimi_video_set(struct mimimi_video_set *videos, struct mimimi_animation_set *animations, struct mimimi_engine *engine, struct mimimi_allocator *allocator)
{
	videos->standing_video_count = animations->standing_animation_count;
	videos->standing = mimimi_allocate(allocator, videos->standing_video_count * sizeof *videos->standing);
	videos->knocked = mimimi_allocate(allocator, sizeof *videos->knocked);
	videos->falling = mimimi_allocate(allocator, sizeof *videos->falling);
	videos->jumping = mimimi_allocate(allocator, sizeof *videos->jumping);
	
	for (int i = 0 ; i < videos->standing_video_count ; i++)
		mimimi_allocate_video(videos->standing + i, animations->standing + i, engine, allocator);
	mimimi_allocate_video(videos->knocked, animations->knocked, engine, allocator);
	mimimi_allocate_video(videos->falling, animations->falling, engine, allocator);
	mimimi_allocate_video(videos->jumping, animations->jumping, engine, allocator);
}

static void mimimi_invalidate_video_set(struct mimimi_video_set *videos, struct mimimi_engine *engine)
{
	for (int i = 0 ; i < videos->standing_video_count ; i++)
		mimimi_invalidate_video(videos->standing + i, engine);
	mimimi_invalidate_video(videos->knocked, engine);
	mimimi_invalidate_video(videos->falling, engine);
	mimimi_invalidate_video(videos->jumping, engine);
}

static void mimimi_deallocate_video_set(struct mimimi_video_set *videos, struct mimimi_allocator *allocator)
{
	mimimi_deallocate(allocator, videos->standing->textures);
	mimimi_deallocate(allocator, videos->knocked->textures);
	mimimi_deallocate(allocator, videos->falling->textures);
	mimimi_deallocate(allocator, videos->jumping->textures);
	
	mimimi_deallocate(allocator, videos->standing);
	mimimi_deallocate(allocator, videos->knocked);
	mimimi_deallocate(allocator, videos->falling);
	mimimi_deallocate(allocator, videos->jumping);
}

void mimimi_video_appearance(struct mimimi_video_appearance *video_appearance, struct mimimi_appearance *appearance, struct mimimi_engine *engine, struct mimimi_allocator *allocator)
{
	mimimi_video_set(&video_appearance->left, &appearance->left, engine, allocator);
	mimimi_video_set(&video_appearance->right, &appearance->right, engine, allocator);
}

void mimimi_invalidate_video_appearance(struct mimimi_video_appearance *appearance, struct mimimi_engine *engine)
{
	mimimi_invalidate_video_set(&appearance->left, engine);
	mimimi_invalidate_video_set(&appearance->right, engine);
}

void mimimi_deallocate_video_appearance(struct mimimi_video_appearance *appearance, struct mimimi_allocator *allocator)
{
	mimimi_deallocate_video_set(&appearance->left, allocator);
	mimimi_deallocate_video_set(&appearance->right, allocator);
}

void mimimi_finish_video_appearance(struct mimimi_video_appearance *appearance, struct mimimi_engine *engine, struct mimimi_allocator *allocator)
{
	mimimi_invalidate_video_appearance(appearance, engine);
	mimimi_deallocate_video_appearance(appearance, allocator);
}