Made Triangle.cpp ASM-accurate
It's really starting to look more and more like Pixel really did write in C90... just look at the declarations I have to shove at the start of the functions.
This commit is contained in:
parent
293dbd4e03
commit
e3549f8703
2 changed files with 70 additions and 51 deletions
123
src/Triangle.cpp
123
src/Triangle.cpp
|
@ -8,19 +8,19 @@ int16_t gTan[0x21];
|
||||||
|
|
||||||
void InitTriangleTable()
|
void InitTriangleTable()
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
//Sine
|
//Sine
|
||||||
for (int i = 0; i < 0x100; ++i )
|
for (i = 0; i < 0x100; ++i)
|
||||||
{
|
{
|
||||||
float v0 = i * 6.2831998 / 256.0;
|
gSin[i] = (int)(sin(i * 6.2831998 / 256.0) * 512.0);
|
||||||
gSin[i] = (int)(sinf(v0) * 512.0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Tangent
|
//Tangent
|
||||||
for (int i = 0; i < 0x21; ++i )
|
for (i = 0; i < 0x21; ++i)
|
||||||
{
|
{
|
||||||
float a = i * 6.2831855 / 256.0;
|
float a = i * 6.2831855 / 256.0;
|
||||||
float v2 = sinf(a);
|
float b = sinf(a) / cosf(a);
|
||||||
float b = v2 / cosf(a);
|
|
||||||
gTan[i] = (int16_t)(b * 8192.0);
|
gTan[i] = (int16_t)(b * 8192.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,70 +32,89 @@ int GetSin(uint8_t deg)
|
||||||
|
|
||||||
int GetCos(uint8_t deg)
|
int GetCos(uint8_t deg)
|
||||||
{
|
{
|
||||||
return gSin[(uint8_t)(deg + 0x40)];
|
deg += 0x40;
|
||||||
|
return gSin[deg];
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetArktan(int x, int y)
|
uint8_t GetArktan(int x, int y)
|
||||||
{
|
{
|
||||||
int xa = -x;
|
x *= -1;
|
||||||
int ya = -y;
|
y *= -1;
|
||||||
uint8_t a = 0;
|
uint8_t a = 0;
|
||||||
|
int16_t k;
|
||||||
|
|
||||||
if (xa <= 0)
|
if (x > 0)
|
||||||
{
|
{
|
||||||
if (ya <= 0)
|
if (y > 0)
|
||||||
{
|
{
|
||||||
if (-xa <= -ya)
|
if (x > y)
|
||||||
{
|
{
|
||||||
while (gTan[a] < (int16_t)(-0x2000 * xa / -ya))
|
k = (y * 0x2000) / x;
|
||||||
|
while (k > gTan[a])
|
||||||
++a;
|
++a;
|
||||||
a = -0x40 - a;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while (gTan[a] < (int16_t)(-0x2000 * ya / -xa))
|
k = (x * 0x2000) / y;
|
||||||
++a;
|
while (k > gTan[a])
|
||||||
a += -0x80;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (-xa <= ya)
|
|
||||||
{
|
|
||||||
while (gTan[a] < (int16_t)(-0x2000 * xa / ya))
|
|
||||||
++a;
|
|
||||||
a += 0x40;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
while (gTan[a] < (int16_t)((ya << 13) / -xa))
|
|
||||||
++a;
|
|
||||||
a = -0x80 - a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (ya <= 0)
|
|
||||||
{
|
|
||||||
if (-ya >= xa)
|
|
||||||
{
|
|
||||||
while (gTan[a] < (int16_t)((xa << 13) / -ya))
|
|
||||||
++a;
|
|
||||||
a -= 0x40;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
while (gTan[a] < (int16_t)(-0x2000 * ya / xa))
|
|
||||||
++a;
|
|
||||||
a = -a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (xa <= ya)
|
|
||||||
{
|
|
||||||
while (gTan[a] < (int16_t)((xa << 13) / ya))
|
|
||||||
++a;
|
++a;
|
||||||
a = 0x40 - a;
|
a = 0x40 - a;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while (gTan[a] < (int16_t)((ya << 13) / xa))
|
if (-y < x)
|
||||||
|
{
|
||||||
|
k = (-y * 0x2000) / x;
|
||||||
|
while (k > gTan[a])
|
||||||
++a;
|
++a;
|
||||||
|
a = 0x100 - a;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
k = (x * 0x2000) / -y;
|
||||||
|
while (k > gTan[a])
|
||||||
|
++a;
|
||||||
|
a = 0x100 - 0x40 + a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (y > 0)
|
||||||
|
{
|
||||||
|
if (-x > y)
|
||||||
|
{
|
||||||
|
k = (y * 0x2000) / -x;
|
||||||
|
while (k > gTan[a])
|
||||||
|
++a;
|
||||||
|
a = 0x80 - a;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
k = (-x * 0x2000) / y;
|
||||||
|
while (k > gTan[a])
|
||||||
|
++a;
|
||||||
|
a = 0x40 + a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (-x > -y)
|
||||||
|
{
|
||||||
|
k = (-y * 0x2000) / -x;
|
||||||
|
while (k > gTan[a])
|
||||||
|
++a;
|
||||||
|
a = 0x80 + a;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
k = (-x * 0x2000) / -y;
|
||||||
|
while (k > gTan[a])
|
||||||
|
++a;
|
||||||
|
a = 0x100 - 0x40 - a;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return a;
|
return a;
|
||||||
|
|
|
@ -5,4 +5,4 @@
|
||||||
void InitTriangleTable();
|
void InitTriangleTable();
|
||||||
int GetSin(uint8_t deg);
|
int GetSin(uint8_t deg);
|
||||||
int GetCos(uint8_t deg);
|
int GetCos(uint8_t deg);
|
||||||
int GetArktan(int x, int y);
|
uint8_t GetArktan(int x, int y);
|
||||||
|
|
Loading…
Add table
Reference in a new issue