PROGRAM Vphys;


CONST

RES=1000;
global
GRAV=100;

mouse_busy;
lines_max=10;
lines=0;


    STRUCT line[10]
       STRUCT p[1]
             got;
             id2;
       END
      j_type;
      bod_id;
      lenR;

    END

    d[10];
    dv[4];
LOCAL
i;j; k;
STRING s="ON";
BEGIN
  set_mode(800600);

     write(0,400,50,1,"SIMPLE PHYSICS DEMO");
     write(0,400,70,1,"Grab the vertices using <MOUSE.LEFT>");
     write(0,600,560,0,"Don't be too rough");
     write(0,100,580,0,"Gravity <SPACEKEY> ");

   /*  IF (GRAV>0)
     write(0,100,580,2,"ON");
     ELSE
     write(0,100,580,2,"OFF");
     END
     write(0,150,580,0,"   <SPACEKEY>");
     */

    mouse.graph=new_map(4,4,2,2,15);


       addbox(0,400,300);

    FOR(i=0; i<lines; i+=1)
         line[i].lenR=fget_dist(line[i].p[0].id2.x,line[i].p[0].id2.y,line[i].p[1].id2.x,line[i].p[1].id2.y);
         d[i]=draw(1,15,15,0,line[i].p[0].id2.x,line[i].p[0].id2.y,line[i].p[1].id2.x,line[i].p[1].id2.y);
    END


         dv[0]=draw(2,15,15,0,line[1].p[0].id2.x/RES-2,line[1].p[0].id2.y/RES-2,line[1].p[0].id2.x/RES+2,line[1].p[0].id2.y/RES+2);
    FOR(i=1; i<5; i+=1)
         dv[i]=draw(2,15,15,0,0,0,0,0);
    END
                   write(0,240,580,0,s);
    LOOP

                   if (scan_code==_space)   GRAV=100-GRAV;
                   if(GRAV==0) s="OFF"; else s="ON"; END

                   END



                    FOR(i=1; i<5; i+=1)

                               IF(abs(mouse.x-line[i].p[1].id2.x/RES)<4 and abs(mouse.y-line[i].p[1].id2.y/RES)<4)
                                  IF(line[i].p[1].got==0) line[i].p[1].got=2; end mouse_busy=True;
                                 ELSE
                           IF(line[i].p[1].got==2); line[i].p[1].got=0; end

                                 END
                                 IF(abs(mouse.x-line[i].p[0].id2.x/RES)<4 and abs(mouse.y-line[i].p[0].id2.y/RES)<4)
                                  IF(line[i].p[0].got==0) line[i].p[0].got=2; end mouse_busy=True;

                                ELSE
                            IF(line[i].p[0].got==2) line[i].p[0].got=0;   end


                                END




                           if (mouse.left)
                            FROM j=0 TO 1;
                                if(line[i].p[j].got==2) line[i].p[j].got=1; END
                                IF(line[i].p[j].got==1)
                                line[i].p[j].id2.x=mouse.x*RES;
                                line[i].p[j].id2.y=mouse.y*RES;
                                END
                            END
                          ELSE

                           mouse_busy=false;
                           FROM j=0 TO 1;
                            if(line[i].p[j].got==1) line[i].p[j].got=0;  END
                           END


                          END


                    END

    from i= 1 to 4;
    move_draw(dv[i],28+line[i].p[1].got*30,15,line[i].p[1].id2.x/RES-4,line[i].p[1].id2.y/RES-4,line[i].p[1].id2.x/RES+4,line[i].p[1].id2.y/RES+4);
                              END
    move_draw(dv[0],28+line[1].p[0].got*30,15,line[1].p[0].id2.x/RES-4,line[1].p[0].id2.y/RES-4,line[1].p[0].id2.x/RES+4,line[1].p[0].id2.y/RES+4);

              update();
              FRAME;


    END
END


//=============================================================================================================
PROCESS update()

BEGIN

FOR(i=0; i<lines; i+=1)
relax_joint(line[i].p[0].id2,line[i].p[1].id2,line[i].lenR);
END
draw_lines();

END

//------------------------------------------------------------------------------
PROCESS addbox(b,x,y)
PRIVATE
id_v[4];

BEGIN

id_v[0]= vert(x+0,y+0);
id_v[1]= vert(x-20,y-20);
id_v[2]= vert(x+20,y-20);
id_v[3]= vert(x+20,y+20);
id_v[4]= vert(x-20,y+20);


line[0].p[0].id2=id_v[1];
line[0].p[1].id2=id_v[3];

for(i=1; i<=4; i+=1)
lines+=1;
line[lines].p[0].id2=id_v[0];
line[lines].p[1].id2=id_v[i];

END

for(i=1; i<=4; i+=1)
lines+=1;
line[lines].p[0].id2=id_v[i];
line[lines].p[1].id2=id_v[((i+1) mod 5)+((i+1) / 5)];
END
line[lines].p[1].id2=id_v[1];
lines+=1;

line[lines].p[0].id2=id_v[2];
line[lines].p[1].id2=id_v[4];
lines+=1;

END


//------------------------------------------------------------------------------
PROCESS draw_lines();
BEGIN
FOR(i=0; i<lines; i+=1)
move_draw(d[i],15,15,line[i].p[0].id2.x/RES,line[i].p[0].id2.y/RES,line[i].p[1].id2.x/RES,line[i].p[1].id2.y/RES);
END
FRAME;

END

  //-------------------------------------------------------------------------------------

PROCESS vert(x,y)
private
X0; y0;
dx=0; dy=0;
 fix;

BEGIN
resolution=RES;
x=x*RES;
y=y*RES;
x0=x;
y0=y;

fix=1000;
LOOP
y+=GRAV;
if(y>580*resolution) y=580*resolution; END
if(y<20*resolution)  y=20*resolution; END
if(x>780*resolution) x=780*resolution; END
if(x<20*resolution) x=20*resolution; END


dy=(fix-10)*(y-y0)/fix;
dx=(fix-10)*(x-x0)/fix;
x0=x;
y0=y;
x+=dx;
y+=dy;

FRAME;

END
END

//--------------------------------------------------------------------------------

PROCESS relax_joint(v1,v2,lenR)
PRIVATE
dr;
col;
len;
Dlen;
text;
inc=1;
fix=100;
BEGIN
x=(v2.x+v1.x)/2  ; y=(v2.y+v1.y)/2 ;


len=fget_dist(v2.x,v2.y,v1.x,v1.y);
Dlen=lenR-len;
v2.x+=(fix-1)*get_distx(get_angle(v2),Dlen/2)/fix;
v2.y+=(fix-1)*get_disty(get_angle(v2),Dlen/2)/fix;
v1.x+=(fix-1)*get_distx(get_angle(v1),Dlen/2)/fix;
v1.y+=(fix-1)*get_disty(get_angle(v1),Dlen/2)/fix;

FRAME;
END
//============================
