/*
 *
 * (c) 2019 Sollia 3
 */

PROGRAM texturemaps;
global
rgb;
    struct quad[2]
        x,y,s;
        struct point[3];
            x,y;  handle;
        end
    end
    quads = 1;

    struct texture[2]
    x,y,   s,
        map, w,h;
        struct coord[3]
            x,y;
        end
    end


w,h;

tx[3];
ty[3];
tl[3];
qx[3];
qy[3];
ql[3];

 vmx; vmy;  oldmx; oldmy;
local
i,j;
pressing;
private

texture_id[2];
begin


    set_mode(m1024x768);
    set_fps(60,0);
    write_int(0,10,700,0,&fps);
    rgb = load_fpg("rgb.fpg");
    mouse.graph = 4;
    mouse.x = 700;

    define_region(1,0,0,512,512);
    draw(3,114,15,1,0,0,512,512);

        draw(5,1,15,1,255-52,255-52,255+52,255+52);

    for(i = 255; i>24; i-=22)
        draw(4,1,15,1,255-i,255-i,255+i,255+i);
    end
        draw(5,114,15,1,255-11,255-11,255+11,255+11);
        draw(4,114,15,1,255-33,255-33,255+33,255+33);

    frame;
    texture.map = new_map(512,512,0,0,114);
    screen_copy(1,0,texture.map,0,0,512,512);
    delete_draw(all_drawing);

    put(rgb,texture.map,0,0);


    w = graphic_info(rgb,texture.map,g_wide);
    h = graphic_info(rgb,texture.map,g_height);



    for(i = 0; i<quads; i+=1)

    texture[i].s = 64;
    texture[i].x =32+64*i;
    texture[i].y =32;
    texture[i].w = texture.s;
    texture[i].h = texture.s;

    texture[i].coord[0].x = texture[i].x-texture[i].w/2; texture[i].coord[0].y = texture[i].y-texture[i].h/2;
    texture[i].coord[1].x = texture[i].x+texture[i].w/2; texture[i].coord[1].y = texture[i].y-texture[i].h/2;
    texture[i].coord[2].x = texture[i].x+texture[i].w/2; texture[i].coord[2].y = texture[i].y+texture[i].h/2;
    texture[i].coord[3].x = texture[i].x-texture[i].w/2; texture[i].coord[3].y = texture[i].y+texture[i].h/2;



    quad[i].x = 700+160*i;
    quad[i].y = 100;
    quad[i].s =32;
    quad[i].point[0].x = -quad[i].s; quad[i].point[0].y = -quad[i].s;
    quad[i].point[1].x = quad[i].s; quad[i].point[1].y = -quad[i].s;
    quad[i].point[2].x = quad[i].s; quad[i].point[2].y = quad[i].s;
    quad[i].point[3].x = -quad[i].s; quad[i].point[3].y = quad[i].s;


        for(j = 0; j<4; j+=1)
           quad[i].point[j].handle = handle(i,j);
        end
    end




    while(not key(_esc))
        // if(not pressing)
         texture.x+=4*(key(_right)-key(_left));
         if(texture.x<32) texture.x = w-32; end
         if(texture.x>w-32) texture.x = 32; end

         texture.y+=4*(key(_down)-key(_up));
         if(texture.y<32) texture.y = h-32; end
         if(texture.y>h-32) texture.y = 32; end


         //end
         pressing = key(_right) or key(_left) or key(_up) or key(_down);

    texture.coord[0].x = texture.x-texture.w/2; texture.coord[0].y = texture.y-texture.h/2;
    texture.coord[1].x = texture.x+texture.w/2; texture.coord[1].y = texture.y-texture.h/2;
    texture.coord[2].x = texture.x+texture.w/2; texture.coord[2].y = texture.y+texture.h/2;
    texture.coord[3].x = texture.x-texture.w/2; texture.coord[3].y = texture.y+texture.h/2;



        texture_id[0] = paintTexture(0);
       // texture_id[1] = paintTexture(1);
       // texture_id[2] = paintTexture(2);

        tex(0,texture_id);
       // tex(1,texture_id[1]);
       // tex(2,texture_id[2]);


        drawTextureArea(0);
        frame;
        unload_map(texture_id);
        unload_map(texture_id[1]);
        unload_map(texture_id[2]);
        delete_draw(all_drawing);
    vmx = mouse.x-oldmx;
    vmy = mouse.y-oldmy;

oldmx = mouse.x;
oldmy = mouse.y;

    end
    exit(0,0);
end

process tex(q,graph)
begin
x =quad[q].x;
y =quad[q].y;
xput(rgb,graph,quad[q].x,quad[q].y+200,0,200,0,0);
frame;

end


process handle(idq,idp)
private
got;
begin

 graph = 2 ;
z = -10;
  flags = 4;

loop


size = 100;
    x =quad[idq].x+quad[idq].point[idp].x;
    y =quad[idq].y+quad[idq].point[idp].y;

if(collision(type mouse))

    got = mouse.left;
end

    if(got)
                quad[idq].point[idp].x+=vmx;

                if(quad[idq].point[idp].x<-quad[idq].s) quad[idq].point[idp].x = -quad[idq].s; end
                if(quad[idq].point[idp].x>quad[idq].s) quad[idq].point[idp].x = quad[idq].s; end


                quad[idq].point[idp].y+=vmy;

                if(quad[idq].point[idp].y<-quad[idq].s) quad[idq].point[idp].y = -quad[idq].s; end
                if(quad[idq].point[idp].y>quad[idq].s) quad[idq].point[idp].y = quad[idq].s; end


    if (not mouse.left) got =0; end
    end
frame;


end
end



function paintTexture(t)
private
pix;   px,py;
rpx[2]; rpy[2];
image;
begin
    image =new_map(64,64,31,31,10);
    for(i = 0; i<4; i+=1)
       tx[i] =texture[t].coord[i].x;
       ty[i] =texture[t].coord[i].y;


       qx[i] =quad[t].point[i].x;
       qy[i] =quad[t].point[i].y;

    end

    for(i = 0; i<4; i+=1)

       tl[i] = fget_dist(tx[i],ty[i],tx[(i+1)%4],ty[(i+1)%4]);
       ql[i] = fget_dist(qx[i],qy[i],qx[(i+1)%4],qy[(i+1)%4]);

    end

    for(i = 0; i<texture[t].w; i+=1)
        rpx[1] = quad[t].point[0].x+(quad[t].point[1].x-quad[t].point[0].x)*i/texture[t].w;
        rpy[1] = quad[t].point[0].y+(quad[t].point[1].y-quad[t].point[0].y)*i/texture[t].w;
        rpx[2] = quad[t].point[3].x+(quad[t].point[2].x-quad[t].point[3].x)*i/texture[t].w;
        rpy[2] = quad[t].point[3].y+(quad[t].point[2].y-quad[t].point[3].y)*i/texture[t].w;

    for(j = 0; j<texture[t].h; j+=1)

        px = rpx[1]+(rpx[2]-rpx[1])*j/texture[t].h;
        py = rpy[1]+(rpy[2]-rpy[1])*j/texture[t].h;


        pix =map_get_pixel(rgb,texture.map,tx[0]+i,ty[0]+j);

        map_put_pixel(rgb,image,32+px,32+py,pix);
    end
    end
     return(image);
end




function drawTextureArea(t);
begin
   for(i=0; i<4; i+=1)

        j = draw(1,1,15,0,
        tx[i],ty[i],tx[(i+1)%4],ty[(i+1)%4]);


    end

    return(j);

end







