Files
CrunkLord420 9403d64739 init
2022-08-11 04:02:45 -07:00

388 lines
7.3 KiB
HolyC

// This trash is broken and doesn't work but I saved it anyways for no reason
public U0 PxBlotShear(CDC *dc, PxData *data, I32 x, I32 y, F64 rot) {
I32 iy, ix;
for (iy=0; iy<data->height; iy++) {
F64 skew = rot * (iy + 0.5);
F64 skewi = Floor(skew);
F64 skewf = skew - skewi;
F64 oleft;
for (ix=0; ix<data->width; ix++) {
}
}
}
public U0 PxBlotM3(CDC *dc, PxData *data, I64 x1,I64 y1,I64 z1) {
I64 color,reg i,j,w=data->width,h=data->height,
x2,y2,z2,x3,y3,z3,
dw,reg dh,
last_x,last_y;
x2=x1+w; y2=y1; z2=z1;
x3=x1; y3=y1+h; z3=z1;
I64 x4=x1+w;
I64 y4=y1+h;
I64 z4=z1;
(*dc->transform)(dc,&x1,&y1,&z1);
(*dc->transform)(dc,&x2,&y2,&z2);
(*dc->transform)(dc,&x3,&y3,&z3);
(*dc->transform)(dc,&x4,&y4,&z4); // TMP?
I64 tx, ty, lx, ly, rx, ry, bx, by;
CD2I32 tt, lt, rt, bt;
tx=x1;
ty=y1;
rx=x2;
ry=y2;
lx=x3;
ly=y3;
bx=x4;
by=y4;
tt.x =0;
tt.y =0;
lt.x =0;
lt.y =1;
rt.x =1;
rt.y =0;
bt.x =1;
bt.y =1;
if (ty > y2) {
ty = y2;
tx = x2;
tt.x = 1;
tt.y = 0;
}
if (ty > y3) {
ty = y3;
tx = x3;
tt.x = 0;
tt.y = 1;
}
if (ty > y4) {
ty = y4;
tx = x4;
tt.x = 1;
tt.y = 1;
}
if (rx < x1) {
rx = x1;
ry = y1;
rt.x = 0;
rt.y = 0;
}
if (rx < x3) {
rx = x3;
ry = y3;
rt.x = 0;
rt.y = 1;
}
if (rx < x4) {
rx = x4;
ry = y4;
rt.x = 1;
rt.y = 1;
}
if (lx > x1) {
lx = x1;
ly = y1;
lt.x = 0;
lt.y = 0;
}
if (lx > x2) {
lx = x2;
ly = y2;
lt.x = 1;
lt.y = 0;
}
if (lx > x4) {
lx = x4;
ly = y4;
lt.x = 1;
lt.y = 1;
}
if (by < y1) {
by = y1;
bx = x1;
bt.x = 0;
bt.y = 0;
}
if (by < y2) {
by = y2;
bx = x2;
bt.x = 1;
bt.y = 0;
}
if (by < y3) {
by = y3;
bx = x3;
bt.x = 0;
bt.y = 1;
}
I64 sy1, sy2;
if (ly < ry) {
sy1 = ly;
sy2 = ry;
} else {
sy1 = ry;
sy2 = ly;
}
F64 dlx1 = lx-tx;
F64 drx1 = rx-tx;
F64 dly1 = ly-ty;
// F64 dly1 = ty-ly;
F64 dry1 = ry-ty;
// F64 dlx2 = lx-bx;
// F64 drx2 = rx-bx;
F64 dlx2 = bx-lx;
F64 drx2 = bx-rx;
F64 dly2 = by-ly;
F64 dry2 = by-ry;
I64 yy1, yy2, yy3, xx1, xx2, xx3, ssx;
F64 xl2, xr2, yl2, yr2, tlx2, tly2;
if (dly1 < dry1) {
yy1 = dly1;
yy2 = dry1;
yy3 = dly2;
xl2 = dlx2;
yl2 = dly2;
yr2 = dry1;
xr2 = drx1;
if (lx < tx)
ssx = lx;
else
ssx = tx;
} else {
yy1 = dry1;
yy2 = dly1;
yy3 = dry2;
xl2 = dlx1;
yl2 = dly1;
// xl2 = dlx1;
// yl2 = dry2;
// xl2 = drx2;
// yl2 = dry2;
// xl2 = dlx2;
// xr2 = drx2;
xr2 = drx2;
yr2 = dry2;
if (tx > bx)
ssx = bx;
else
ssx = tx;
}
U8 *fb = dc->body;
U8 *px = data->body;
I64 xe, sx, ex;
F64 dl=1;
if (dly1)
dl = dlx1/dly1;
F64 dr=1;
if (dry1)
dr = drx1/dry1;
#ifdef DEBUG
//CommPrint("dl:%f dr:%f yy1:%d\n", dl, dr, yy1);
//CommPrint("dlx1:%f drx1:%f yy1:%d dly1:%f dry1:%f ly:%d ry:%d ty:%d\n", dlx1, drx1, yy1, dly1, dry1, ly, ry, ty);
#endif
I64 y, x, ey;
y=MaxI64(ty+PIX_TOP, PIX_TOP);
ey=MinI64(ty+yy1+PIX_TOP, SCR_H);
xe=0;
#ifdef DEBUG
//CommPrint("y:%d ey:%d\n",y,ey);
#endif
for (i=1; y<ey; y++, i++) {
sx = dl*i;
ex = dr*i;
xe = ex-sx;
//xe = Abs(dlx1)*(i+1) + Abs(drx1)*(i+1);
#ifdef DEBUG
//CommPrint("sx:%d ex:%d xe:%d\n", sx, ex, xe);
#endif
for (j=0; j<xe; j++) {
F64 tty = ToF64(j)/xe*data->width;
fb[j + tx + sx + y*SCR_W] = 14;
// color = px[tty];
// if (color != TRANSPARENT)
// fb[j + tx + sx + y*SCR_W] = px[tty];
}
}
dl=1;
if (yl2)
dl = xl2/yl2;
dr=1;
if (yr2)
dr = xr2/yr2;
#ifdef DEBUG
CommPrint("dl:%f dr:%f xr2:%f, yr2:%f y:%d, ty:%d\n", dl, dr, xr2, yr2, y, ty);
CommPrint("xl2:%f yl2:%f xr2:%f yr2:%f\n",xl2,yl2,xr2,yr2);
#endif
I64 last_ey=ey;
I64 last_xe=xe;
ey=MinI64(ty+yy2+PIX_TOP, SCR_H);
for (i=1; y<ey; y++, i++) {
sx = Floor(dl*i);
ex = Ceil(dr*i)+last_xe;
xe = ex-sx;
//xe = Abs(dlx1)*(i+1) + Abs(drx1)*(i+1);
#ifdef DEBUG
CommPrint("y:%d sx:%d ex:%d xe:%d\n", y, sx, ex, xe);
#endif
for (j=0; j<xe; j++) {
//I64 xs = dlx1*i + xe;// + tx;
// F64 xt = i/ey
fb[j + ssx + sx + y*SCR_W] = 8;
}
}
dc->color = BLUE;
GrCircle(dc, x1, y1, 2);
dc->color = WHITE;
GrCircle(dc, x2, y2, 2);
dc->color = GREEN;
GrCircle(dc, x3, y3, 2);
dc->color = PURPLE;
GrCircle(dc, x4, y4, 2);
}
public U0 PxBlotM2(CDC *dc, PxData *data, I64 x1,I64 y1,I64 z1) {
I64 color,reg i,j,w=data->width,h=data->height,
d1,dx1,dy1,dz1,
reg d2,dx2,dy2,dz2,
adx1,ady1,adz1,
adx2,ady2,adz2,
x2,y2,z2,x3,y3,z3,
dw,reg dh,x,y,
last_x,last_y;
Bool first;
x2=x1+w; y2=y1; z2=z1;
x3=x1; y3=y1+h; z3=z1;
(*dc->transform)(dc,&x1,&y1,&z1);
(*dc->transform)(dc,&x2,&y2,&z2);
(*dc->transform)(dc,&x3,&y3,&z3);
dx1=x2-x1; dy1=y2-y1; dz1=z2-z1;
dx2=x3-x1; dy2=y3-y1; dz2=z3-z1;
adx1=AbsI64(dx1); ady1=AbsI64(dy1); adz1=AbsI64(dz1);
adx2=AbsI64(dx2); ady2=AbsI64(dy2); adz2=AbsI64(dz2);
if (adx1>=ady1) {
if (adx1>=adz1)
d1=adx1;
else
d1=adz1;
} else {
if (ady1>=adz1)
d1=ady1;
else
d1=adz1;
}
if (adx2>=ady2) {
if (adx2>=adz2)
d2=adx2;
else
d2=adz2;
} else {
if (ady2>=adz2)
d2=ady2;
else
d2=adz2;
}
if (AbsI64(d1)!=w ||AbsI64(d2)!=h) {
d1<<=1;
d2<<=1;
}
if (d1) {
dx1=dx1<<32/d1;
dy1=dy1<<32/d1;
} else
goto gr_done;
if (d2) {
dx2=dx2<<32/d2;
dy2=dy2<<32/d2;
} else
goto gr_done;
x=0;y=0;
dw=w<<32/d1;
dh=h<<32/d2;
first=TRUE;
x1<<=32; y1<<=32;
last_x = U64_MAX;
last_y = U64_MAX;
U64 len = w*h;
U8 *fb = dc->body;
U8 *px = data->body;
#ifdef DEBUG
//CommPrint("Blot1: %d x %d\n", dx1>>31, dy1>>31);
//CommPrint("Blot2: %d x %d\n", dx2>>31, dy2>>31);
#endif
for (j=0;j<=d1;j++) {
x2=x1; y2=y1;
y=0;
for (i=0;i<=d2;i++) {
// if (x2.i32[1]!=last_x || y2.i32[1]!=last_y || first) {
if (x2.i32[1]!=last_x || y2.i32[1]!=last_y) {
U64 idx;
if (x2.i32[1] >= 0 && x2.i32[1] < SCR_W && y2.i32[1] >= 0 && y2.i32[1] < FB_H &&
(idx=x.i32[1]+y.i32[1]*w) < len && (color=px[idx]) != TRANSPARENT) {
fb[(y2.i32[1]+PIX_TOP)*SCR_W + x2.i32[1]] = color;
}
}
// first=FALSE;
last_x=x2.i32[1]; last_y=y2.i32[1];
x2+=dx2; y2+=dy2;
y+=dh;
}
x1+=dx1; y1+=dy1;
x+=dw;
}
gr_done:
}
public U0 DrawBulletsRot(CDC *dc, Bullet *bullets, I64 cnt) {
I64 i, m[16];
dc->r = m;
F64 t= tS;
for (i=0; i<cnt; i++, bullets++) {
Mat4x4IdentEqu(m);
// Mat4x4RotZ(m, -pi/2.3);
Mat4x4RotZ(m, t);
#ifdef DEBUG
CommPrint("t:%.2f\n", t%pi);
#endif
// Mat4x4Scale(m, 4);
// Mat4x4TranslationEqu(m,ToI64(bullets->pos.x)+bullets->pxOffX, ToI64(bullets->pos.y)+bullets->pxOffY, 0);
Mat4x4TranslationEqu(m,bullets->pos.x, bullets->pos.y, 0);
PxBlotM2(dc, bullets->px, bullets->pxOffX, bullets->pxOffY, 0);
PxBlotM3(dc, bullets->px, bullets->pxOffX, bullets->pxOffY, 0);
Mat4x4IdentEqu(m);
Mat4x4RotZ(m, 2.645);
Mat4x4TranslationEqu(m,bullets->pos.x+32, bullets->pos.y, 0);
PxBlotM3(dc, bullets->px, bullets->pxOffX, bullets->pxOffY, 0);
}
}