388 lines
7.3 KiB
HolyC
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);
|
|
}
|
|
}
|