#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <exec/types.h>
#include <graphics/modeid.h>
#include <devices/timer.h>
#include <proto/dos.h>

#include "/Shared/EE_precalc.h"
#include "/Shared/EE_view.h"
#include "/Shared/EE_timer.h"
#include "/Shared/EE_sequence.h"
#include "/Shared/EE_fx.h"
#include "EM_structures.h"
#include "EM_render.h"
#include "EM_animation.h"
#include "EM_sequence.h"
#include "EM_reader.h"

UBYTE *EM_TextureAdr = NULL;
FACE **EM_DepthBuffer;
UBYTE *EM_Back=NULL;

#define FLARE_SIZE 30

#include "incbiny.h"

extern DVIEW *DView;

LONG EM_RenderFrame(DVIEW *DView, SCENE *Scene)
{
FACE *tmpFace;
LONG VisibleFacesNumber;
LONG i;

	EM_TransformScene(Scene);
	VisibleFacesNumber = EM_CreateDepthBuffer(Scene, EM_DepthBuffer);
	EM_SortDepthBuffer(EM_DepthBuffer, VisibleFacesNumber);

     EM_ClearBack(EM_Back,DView->Chunky);

	for(i=0; i<VisibleFacesNumber; i++)
	{
		tmpFace = EM_DepthBuffer[i];

		if(tmpFace->Flags != FF_CLIP)
			EM_RenderFace(tmpFace);
		else
			EM_RenderClipFace(tmpFace);
	}

	SafeRender(DView);
	DView->C2P(DView);

	FrameEvent();
	SwitchView(DView);

	return IAL_OK;
}


LONG EM_Sequence(UBYTE *Obj,ANIM_COMMAND *AnimLista,UBYTE *Texture,UBYTE *Back,LONG ObjN)
{
SCENE *Scene;
LONG i;
	
	Scene = EM_RelocScene(Obj,ObjN);
     EM_TextureAdr=Texture;
     EM_Back=Back;

	if((EM_DepthBuffer = calloc(Scene->FNumber+1, sizeof(FACE *))) == NULL)
	{
		return SEQ_MEMORY_PROBLEM;
	}

	for(i=0; i<Scene->ONumber; i++)
		Scene->Objects[i].Flags |= OF_NEWPOS | OF_DISPLAY;

	EM_DoAnim(DView, Scene, AnimLista, EM_RenderFrame);

	free(EM_DepthBuffer);
	EM_FreeScene(Scene);

	return SEQ_OK;
}

VOID EM_TransformScene(SCENE *Scene)
{
LONG i;
OBJECT *Objects;

	Objects = Scene->Objects;

	for(i=0; i<Scene->ONumber; i++)
		if(Objects[i].Flags & OF_NEWPOS)
		{
			EM_TransformObject(&Objects[i]);
			Objects[i].Flags &= (~OF_NEWPOS);
		}
}
