removing fixed arithmetic

This commit is contained in:
Cuptain
2024-09-01 01:00:42 +10:00
parent 10ed515e86
commit f8afea55c2
3 changed files with 1505 additions and 58 deletions

View File

@ -1,11 +1,15 @@
#include <genesis.h>
#include "sinTable.h"
#include "cosTable.h"
#define TABLE_LENGTH 720
#define SPEED 5
#define FRAC_BITS 8
Line l;
s16 angle = 0;
s16 x, y;
const u8 map[10][10] = {{1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,0,0,1,1,1,1},
@ -25,40 +29,38 @@ void castRay(s16 angle){
if(angle >= 360) angle = angle - 360;
if(angle < 0) angle = 360 + angle;
u16 r,mx,my,mp,dof;
fix16 rx,ry,ra,xo,yo;
s16 ind = (int)((float)angle/360.0f*1024.0f);
fix16 dy = sinFix16(ind);
fix16 dx = cosFix16(ind);
fix16 tan = FIX16(0);
if(dx != 0) tan = fix16Div(dy, dx);
fix16 aTan = FIX16(0);
if(tan != 0) aTan = fix16Div(FIX16(-1), tan);
s16 tanInt = fix16ToInt(fix16Mul(aTan, FIX16(100)));
s16 rx,ry,ra,xo,yo;
s16 dy = sinTable[angle << 1];
s16 dx = cosTable[angle << 1];
s16 tan = 0;
if(dx != 0) tan = (dy << FRAC_BITS)/dx;
s16 aTan = 0;
if(tan != 0) aTan = -(1 << (FRAC_BITS*2))/tan;
dof = 0;
fix16 distH = FIX16(500);
fix16 hx = FIX16(l.pt1.x);
fix16 hy = FIX16(l.pt1.y);
s16 distH = 500;
s16 hx = l.pt1.x << FRAC_BITS;
s16 hy = l.pt1.y << FRAC_BITS;
if(dy == 0){
rx = FIX16(l.pt1.x);
ry = FIX16(l.pt1.y);
rx = l.pt1.x << FRAC_BITS;
ry = l.pt1.y << FRAC_BITS;
dof = 8;
}else {
if(angle > 180) {
ry = FIX16(l.pt1.y / 10 * 10)-FIX16(1);
rx = fix16Mul(FIX16(l.pt1.y) - ry,aTan) + FIX16(l.pt1.x);
yo = FIX16(-10);
xo = fix16Mul(0-yo,aTan);
ry = ((l.pt1.y / 10 * 10)-1) << FRAC_BITS;
rx = (((l.pt1.y - (ry >> FRAC_BITS))*aTan)) + (l.pt1.x << FRAC_BITS);
yo = -(10 << FRAC_BITS);
xo = ((-yo >> FRAC_BITS)*aTan);
}
if(angle < 180) {
ry = FIX16((l.pt1.y / 10 * 10)+10);
rx = fix16Mul(FIX16(l.pt1.y) - ry,aTan) + FIX16(l.pt1.x);
yo = FIX16(10);
xo = fix16Mul(0-yo,aTan);
ry = ((l.pt1.y / 10 * 10)+10) << FRAC_BITS;
rx = (((l.pt1.y - (ry >> FRAC_BITS))*aTan)) + (l.pt1.x << FRAC_BITS);
yo = 10 << FRAC_BITS;
xo = (-(yo >> FRAC_BITS)*aTan);
}
}
while(dof<8){
mx = fix16ToInt(rx) / 10;
my = fix16ToInt(ry) / 10;
mx = (rx >> FRAC_BITS) / 10;
my = (ry >> FRAC_BITS) / 10;
if(rx < 0 || ry < 0){
dof = 8;
continue;
@ -67,7 +69,7 @@ void castRay(s16 angle){
dof = 8;
hx = rx;
hy = ry;
distH = dist(l.pt1.x, l.pt1.y, fix16ToInt(rx), fix16ToInt(ry));
distH = dist(l.pt1.x, l.pt1.y, rx >> FRAC_BITS, ry >> FRAC_BITS);
}else{
rx = rx + xo;
ry = ry + yo;
@ -76,38 +78,39 @@ void castRay(s16 angle){
}
dof = 0;
fix16 distV = FIX16(500);
fix16 vx = FIX16(l.pt1.x);
fix16 vy = FIX16(l.pt1.y);
fix16 nTan = 0-tan;
if(fix16ToInt(nTan) > 51){
nTan = FIX16(51);
}
if(fix16ToInt(nTan) < -51){
nTan = FIX16(-51);
}
s16 distV = 500;
s16 vx = l.pt1.x << FRAC_BITS;
s16 vy = l.pt1.y << FRAC_BITS;
s16 nTan = -tan;
//s16 threshold = (51 << FRAC_BITS);
//if(nTan > threshold){
// nTan = threshold;
//}
//if(nTan < -threshold){
// nTan = -threshold;
//}
if(angle > 90 && r < 270) {
rx = FIX16(l.pt1.x / 10 * 10)-FIX16(1);
ry = fix16Mul(FIX16(l.pt1.x) - rx,nTan) + FIX16(l.pt1.y);
xo = FIX16(-10);
yo = fix16Mul(0-xo,nTan);
rx = ((l.pt1.x / 10 * 10)-1) << FRAC_BITS;
ry = ((l.pt1.x) - (rx >> FRAC_BITS)*nTan) + (l.pt1.y << FRAC_BITS);
xo = -(10 << FRAC_BITS);
yo = ((-xo >> FRAC_BITS)*nTan);
}
if(angle < 90 || angle > 270) {
rx = FIX16((l.pt1.x / 10 * 10)+10);
ry = fix16Mul(FIX16(l.pt1.x) - rx,nTan) + FIX16(l.pt1.y);
xo = FIX16(10);
yo = fix16Mul(0-xo,nTan);
rx = ((l.pt1.x / 10 * 10)+10) << FRAC_BITS;
ry = ((l.pt1.x) - (rx >> FRAC_BITS)*nTan) + (l.pt1.y << FRAC_BITS);
xo = 10 << FRAC_BITS;
yo = -(xo >> FRAC_BITS)*nTan;
}
if(dx == 0){
rx = FIX16(l.pt1.x);
ry = FIX16(l.pt1.y);
xo = FIX16(0);
yo = FIX16(0);
rx = l.pt1.x << FRAC_BITS;
ry = l.pt1.y << FRAC_BITS;
xo = 0;
yo = 0;
dof = 8;
}
while(dof<8){
mx = fix16ToInt(rx) / 10;
my = fix16ToInt(ry) / 10;
mx = (rx >> FRAC_BITS) / 10;
my = (ry >> FRAC_BITS) / 10;
if(rx < 0 || ry < 0){
dof = 8;
continue;
@ -116,20 +119,20 @@ void castRay(s16 angle){
dof = 8;
vx = rx;
vy = ry;
distV = dist(l.pt1.x, l.pt1.y, fix16ToInt(rx), fix16ToInt(ry));
distV = dist(l.pt1.x, l.pt1.y, rx >> FRAC_BITS, ry >> FRAC_BITS);
}else{
rx = rx + xo;
ry = ry + yo;
dof += 1;
}
}
if(distV < distH){
l.pt2.x = fix16ToInt(vx);
l.pt2.y = fix16ToInt(vy);
}else {
l.pt2.x = fix16ToInt(hx);
l.pt2.y = fix16ToInt(hy);
}
//if(distV < distH){
l.pt2.x = vx >> FRAC_BITS;
l.pt2.y = vy >> FRAC_BITS;
//}else {
//l.pt2.x = hx >> FRAC_BITS;
//l.pt2.y = hy >> FRAC_BITS;
//}
}