// Copyright (c) 2023 Alex Diener. All rights reserved.

#ifndef __RoomTransition_H__
#define __RoomTransition_H__

typedef struct RoomTransition RoomTransition;
#define RoomTransition_superclass StemObject

#include "gamemath/Interpolation.h"
#include "gamemath/Vector2f.h"
#include "stemobject/StemObject.h"
#include "PROJECT_NAME/RoomVisual.h"

#define RoomTransition_ivars \
	StemObject_ivars \
	\
	RoomVisual * oldRoomVisual; \
	RoomVisual * newRoomVisual; \
	Vector2f offsetFromOldToNew; \
	Vector2f oldRoomCameraPosition; \
	Vector2f newRoomCameraPosition; \
	struct interpolationContext interpolation; \
	float speedMultiplier;

#define RoomTransition_vtable(self_type) \
	StemObject_vtable(self_type)

stemobject_declare(RoomTransition)

// Takes ownership of oldRoomVisual
RoomTransition * RoomTransition_create(RoomVisual * oldRoomVisual, RoomVisual * newRoomVisual, Vector2f offsetFromOldToNew, Vector2f oldRoomCameraPosition, Vector2f newRoomCameraPosition, float interpolationStart);
bool RoomTransition_init(RoomTransition * self, RoomVisual * oldRoomVisual, RoomVisual * newRoomVisual, Vector2f offsetFromOldToNew, Vector2f oldRoomCameraPosition, Vector2f newRoomCameraPosition, float interpolationStart);
void RoomTransition_dispose(RoomTransition * self);

Vector2f RoomTransition_getCameraOffset(RoomTransition * self);
Vector2f RoomTransition_getInverseCameraOffset(RoomTransition * self);
void RoomTransition_advance(RoomTransition * self, double deltaTime);
void RoomTransition_draw(RoomTransition * self, Vector2f offset, VertexIO * vertexIO);
bool RoomTransition_allowMovement(RoomTransition * self);
bool RoomTransition_isDone(RoomTransition * self);

#endif
