
PROGRAM m7_Draw;




CONST
green=32;
cyan=64;
blue=48;
magenta=76;
cyan=112;
red=16;
yellow=48;
white=1;


scr_w=800;
scr_h=600;
scr_cx=scr_w/2;
scr_cy=scr_h/2;


global

file0;

cam_id;
//----------------------------


struct cam
distance;
posX;
posY; height;
posZ;
depth;
angle;
vx; vy; vz;
cx;
cy;
h,
w,
END





//------------------------------------

BEGIN
set_fps(60,0);

set_mode(scr_w*1000+scr_h);
cam.posX=0;
cam.posY=100;
cam.posZ=2000;
cam.angle=0;
cam.cx=scr_cx;
cam.w=scr_w/2;
cam.h=scr_h/2;
cam.cy=scr_cy;
cam.depth=512;
cam.distance=512;

groundplane();
write_int(0,scr_w+150,scr_h-20,0,&fps);
cam_id=update_cam();

mode7_layer();




loop
 if(key(_esc))
 exit("exit",0);
 end
    frame;
end

END

//=======================================================================================================================================================


//--------------------------------------------------------------------

process marker(x,y,col)


begin

ctype=c_m7;
graph=new_map(11,11,5,5,col+7);
    loop
  draw_m7line(x,height-10,y,x,height+10,y,col+7);
        frame;
    end


end

//--------------------------------------------------------------------
process mode7_layer()
private
m7map;
df; dh; dd;
i;
begin
ctype=c_m7;

m7map=new_map(100,100,0,0,6);
start_mode7(0,0,m7map,0,0,cam.h);
m7.camera=id;
x=0;
z=0;


from i=-400 to 400 step 20;
marker(i,0,red);
marker(0,i,blue);

end

m7.distance=cam.distance;
m7.height=cam.height;
m7.focus=cam.depth;
m7.horizon=cam.cy;

loop
draw_m7line(0,0,0,0,400,0,blue);
angle=cam.angle+90000;
m7.distance+=(1+9*key(_space))*(key(_s)-key(_w));
m7.focus+=(1+9*key(_space))*(key(_2)-key(_1));
//m7.height+=(1+9*key(_space))*(key(_4)-key(_3));
m7.height=1600*cam.height/1000;
m7.focus=cam.depth;
m7.distance=cam.distance;

frame;
end
end


//--------------------------------------------------------------------

process update_cam()
begin
y=200;
ctype=c_m7;
cam.angle=-90000;
    draw(1,15,15,0,0,cam.cy,scr_w,cam.cy);
    loop
    cam.distance-=(1+9*key(_space))*(key(_up)-key(_down));
    angle-=1000*(key(_left)-key(_right));
    cam.posy+=(key(_pgup)-key(_pgdn));
    cam.height=cam.posy;
    cam.posx=get_disty(angle,cam.distance);
    cam.posz=get_distx(angle,cam.distance);
    cam.angle=-angle;

    cam.depth+=(1+9*key(_space))*(key(_f2)-key(_f1));
        frame;
    end
end
//---------------------------------------------------------------------------------------

PROCESS groundplane()
private
I;
BEGIN
i=100;
LOOP
draw_m7Line(0,0,100,0,0,0,14);
draw_m7Line(100,0,100,100,0,0,14);
draw_m7Line(0,0,100,100,0,100,14);
draw_m7Line(0,0,0,100,0,0,14);


FRAME;
END
END




//-----------------------------------------------------------------------------------
function screenTransVert(x0,y0,z0,sx,sy)
 private tmp;
 fx;
 fy;
  BEGIN

        x= x0-cam.posX;
        y= y0-cam.posy;
        Z= z0-cam.posZ;

        tmp=(cos(cam.angle)*x-sin(cam.angle)*z)/1000;
        z=(cos(cam.angle)*z+sin(cam.angle)*x)/1000;
        x=tmp;


        if(z==0) z=1; END
     // modev transformation
       // *sx=cam.cx-(x*cam.depth/z;
       // *sy=cam.cy+y*cam.depth/z;
     //mode7 transformations
        *sx=cam.cx-(x*cam.depth*scr_cx)/(z*160);
        *sy=cam.cy+y*cam.depth/z;


end
//--------------------------------------------------------------------------------




PROCESS draw_m7Line(x0,y0,z0,x1,y1,z1,col)
PRIVATE

k;

DS;
draw_edge;
px[1];
py[1];
pz[1];
draw_me;
struct cv[1]
x,y,z,
END;

sx[1];
sy[1];

tmp;
sx0; sy0;
sx1; sy1;
BEGIN
px[0]=x0; py[0]=y0; pz[0]=z0;
px[1]=x1; py[1]=y1; pz[1]=z1;

screenTransVert(x0,y0,z0,&sx0,&sy0);
screenTransVert(x1,y1,z1,&sx1,&sy1);
draw_edge=draw(1,col,15,0,sx0,sy0,sx1,sy1);

FRAME;




delete_draw(draw_edge);
END


//-----------------------------------------------------------------------------------------------------------

PROCESS draw_m7point(x0,y0,z0,col)
PRIVATE
sx;
sy;
draw_point;
BEGIN
screenTransVert(x0,y0,z0,&sx,&sy);
     draw_point=draw(2,col,15,0,sx-2,sy-2,sx+2,sy+2);

FRAME;
DELETE_DRAW(draw_point);

END


