#include <vectrex.h>
/*
Test of a silly effect. May not be too useful in any actual games as current
implementation is too expensive computationally. Still, lots of room for optimisations.
*/
#define set_scale(s) do { VIA_t1_cnt_lo = s; } while (0)
int horizontal = 1;
void Move(long x, long y) {
if (horizontal) {
Moveto_d((int)((y*3L)>>2L), (int)((x)));
} else {
Moveto_d( (int)((x*7L)>>3L), (int)((y)));
}
}
void Line(long dx, long dy) {
if (horizontal) {
Draw_Line_d((int)((dy*3L)>>2L), (int)(dx));
} else {
Draw_Line_d((int)((dx*7L)>>3L), (int)(dy));
}
}
int draw_quad(long p0x, long p0y, long p1x, long p1y,
long p2x, long p2y, long p3x, long p3y) {
if (p0x < -128) return 0;
// if (p1x >= 128) return 0;
Reset0Ref();
Move(p0x, p0y);
Line((p1x-p0x), (p1y-p0y));
Line((p3x-p1x), (p3y-p1y));
Line((p2x-p3x), (p2y-p3y));
Line((p0x-p2x), (p0y-p2y)/*+2*/);
return 1;
}
int draw_building(long x, long y, long wth, long hgt, int pass) {
int fix = 4;
int drawn = 1;
if (pass == 2) {
drawn = draw_quad(((x-wth)*hgt)>>fix, ((y+wth)*hgt)>>fix, ((x+wth)*hgt)>>fix, ((y+wth)*hgt)>>fix,
((x-wth)*hgt)>>fix, ((y-wth)*hgt)>>fix, ((x+wth)*hgt)>>fix, ((y-wth)*hgt)>>fix);
} else {
if (x < -wth) {
draw_quad(((x+wth)*hgt)>>fix, ((y+wth)*hgt)>>fix, x+wth, y+wth,
((x+wth)*hgt)>>fix, ((y-wth)*hgt)>>fix, x+wth, y-wth);
}
if (y < -wth) {
draw_quad(((x-wth)*hgt)>>fix, ((y+wth)*hgt)>>fix, ((x+wth)*hgt)>>fix, ((y+wth)*hgt)>>fix,
x-wth, y+wth, x+wth, y+wth);
} else if (y > wth) {
draw_quad(((x-wth)*hgt)>>fix, ((y-wth)*hgt)>>fix, ((x+wth)*hgt)>>fix, ((y-wth)*hgt)>>fix,
x-wth, y-wth, x+wth, y-wth);
}
if (x > wth) {
draw_quad(x-wth, y+wth, ((x-wth)*hgt)>>fix, ((y+wth)*hgt)>>fix,
x-wth, y-wth, ((x-wth)*hgt)>>fix, ((y-wth)*hgt)>>fix);
}
}
return drawn;
}
int main(void)
{
int drawn;
int tmr = 0;
for (;;) {
Wait_Recal(); Reset0Ref(); Intensity_7F(); set_scale(0x80);
drawn = draw_building(tmr, -tmr, 20, 19, 2);
if (drawn) draw_building(tmr, -tmr, 20, 19, 1);
drawn = draw_building(0, tmr, 17, 17, 2);
if (drawn) draw_building(0, tmr, 17, 17, 1);
drawn = draw_building((tmr<<2)+90, -64, 15, 18, 2);
if (drawn) draw_building((tmr<<2)+90, -64, 15, 18, 1);
tmr -= 1;
};
return 0;
}
// ***************************************************************************
// end of file
// ***************************************************************************