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

#include <exec/types.h>

#include "EE_precalc.h"


WORD *RotateTable;
ULONG *PerspectiveTable;
LONG *ArcSineTable;


BOOL PrecalcRotateTable(LONG AnglesNumber, LONG ValuesNumber)
{
LONG TotalAngles, Size, MinValue, MaxValue;
DOUBLE AngleStep, tmpSine;
LONG i, j;

	TotalAngles = AnglesNumber+(AnglesNumber/4);
	Size = TotalAngles * ValuesNumber;

	if((RotateTable = calloc(Size, sizeof(WORD))) == NULL)
		return FALSE;

	AngleStep = (DOUBLE)(2.0 * PI) / (DOUBLE)AnglesNumber;
	MinValue = -ValuesNumber/2;
	MaxValue = -MinValue-1;

	for(i=0; i<TotalAngles; i++)
	{
		tmpSine = sin((DOUBLE)i*AngleStep);
		for(j=MinValue; j<=MaxValue; j++)
			RotateTable[i*ValuesNumber+j-MinValue] = (WORD)(tmpSine*(DOUBLE)j);
	}

	return TRUE;
}


VOID FreeRotateTable(VOID)
{

	if(RotateTable)
	{
		free(RotateTable);
		RotateTable = NULL;
	}
}


BOOL PrecalcPerspectiveTable(ULONG CameraDist, ULONG MaxZ)
{
ULONG i;
ULONG tmp;

	if((PerspectiveTable = calloc(MaxZ, sizeof(ULONG))) == NULL)
		return FALSE;

	for(i=1; i<=MaxZ; i++)
	{
		tmp = (CameraDist<<16)/i;
		if(tmp > 0x00150000)
			tmp = 0x00150000;

		PerspectiveTable[i-1] = tmp;
	}

	return TRUE;
}


VOID FreePerspectiveTable(VOID)
{

	if(PerspectiveTable)
	{
		free(PerspectiveTable);
		PerspectiveTable = NULL;
	}
}


BOOL PrecalcArcSineTable(VOID)
{
LONG i;

	if((ArcSineTable = calloc(256, sizeof(LONG))) == NULL)
		return FALSE;

	for(i=0; i<256; i++)
		ArcSineTable[i] = (LONG)((asin((DOUBLE)(127-i)/128.0)+PID2)*256.0/PI);

	return TRUE;
}


VOID FreeArcSineTable(VOID)
{

	if(ArcSineTable)
	{
		free(ArcSineTable);
		ArcSineTable = NULL;
	}
}
