unit upulpit;

interface

uses globjects,glvectorfileobjects,gltexture,glfile3ds,tga,vectorlists,sysutils,StdCtrls,umklogger,
vectorgeometry,vectortypes;

type tpulpitobj=class
constructor create;
procedure init;
public
pos:array[0..3] of tglfreeform;
matlib:tglmateriallibrary;
end;

type twskazowka=class
constructor create;
procedure rusz;
public poz:real;
mesh:tglfreeform;
baza:tgldummycube;

end;

type tpulpit=class
pul:tglfreeform;
constructor create;
procedure wczytaj(_fname:string;x,y,z:real);
function znazwy(s:string):integer;
procedure init;
procedure przenies(gdzie:tglfreeform; co:string);
procedure ustaw(nrbu,nrpos:integer);
procedure pwskazowka(gdzie:twskazowka; co:string);
procedure zrob;
procedure rusz;
public
mem:tmemo;
baza,zaczep:tgldummycube;
bu:array[1..40] of tpulpitobj;
ws:array[1..2] of twskazowka;
matlib:tglmateriallibrary;
status:array[1..30] of boolean;
log:tmklogger;
end;

implementation

constructor twskazowka.create;
begin;
end;

procedure twskazowka.rusz;
begin;
if mesh<>nil then mesh.TurnAngle:=poz;
end;

constructor tpulpitobj.create;
begin;

end;

procedure tpulpit.pwskazowka(gdzie:twskazowka; co:string);
var  lObj:TMeshObject;
  t1, n1 : TAffineVectorList;
  i,imax1,imax2,imax3:integer;
  odl:real;
  max:real;
  ve:tvector3f;
  function sprawdzodl(a,b:TAffineVector):real;
  begin
        sprawdzodl:=sqrt(sqr(a[0]-b[0])+sqr(a[1]-b[1])+sqr(a[2]-b[2]));
  end;

begin
//log.wriln('!'+co);
        gdzie.baza:=tgldummycube.Create(zaczep);
        gdzie.baza.Parent:=zaczep;
      //  gdzie.baza.VisibleAtRunTime:=true;
      //  gdzie.baza.ShowAxes:=true;
        gdzie.mesh:=tglfreeform.Create(nil);
        gdzie.mesh.Parent:=gdzie.baza;
     //   gdzie.mesh.Parent:=zaczep;
        gdzie.mesh.materiallibrary:=pul.materiallibrary;
     ///*

        log.wriln(inttostr(znazwy(co)));
        log.wriln('pul.MeshObjects[znazwy(co)].FaceGroups[0].materialname :'+pul.MeshObjects[znazwy(co)].FaceGroups[0].materialname);
        try
        gdzie.mesh.material:=pul.MaterialLibrary.LibMaterialByName(pul.MeshObjects[znazwy(co)].FaceGroups[0].materialname).material;
        except
        on e: exception do log.wriln('cla- '+e.ClassName+' -WYJ- '+e.Message);
        end;
        lObj := TMeshObject.CreateOwned(gdzie.mesh.MeshObjects);
        t1   := TAffineVectorList.create;
        n1   := TAffineVectorList.create;
        lObj.Vertices:= pul.MeshObjects[znazwy(co)].ExtractTriangles(t1,n1);
        lobj.Normals:=n1;
        lobj.TexCoords:=t1;
        pul.MeshObjects[znazwy(co)].Free;
        max:=0;
        //sprawdzamy ktore dwa wierzcholki sa najbardziej oddalone
        for i:=0 to gdzie.mesh.MeshObjects[0].trianglecount-1 do
        begin
                odl:=sprawdzodl(gdzie.mesh.meshobjects[0].vertices[i*3],gdzie.mesh.meshobjects[0].vertices[i*3+1]);
                if odl>max then begin max:=odl; imax1:=i*3; imax2:=i*3+1; imax3:=i*3+2 end;
                odl:=sprawdzodl(gdzie.mesh.meshobjects[0].vertices[i*3+1],gdzie.mesh.meshobjects[0].vertices[i*3+2]);
                if odl>max then begin max:=odl; imax1:=i*3+1; imax2:=i*3+2; imax3:=i*3 end;
                odl:=sprawdzodl(gdzie.mesh.meshobjects[0].vertices[i*3+2],gdzie.mesh.meshobjects[0].vertices[i*3]);
                if odl>max then begin max:=odl; imax1:=i*3+2; imax2:=i*3; imax3:=i*3+1 end;
        end;
 //       log.wriln('maxodl '+floattostr(max)+' imax '+inttostr(imax1));
        gdzie.baza.Position.X:=gdzie.mesh.MeshObjects[0].Vertices[imax1][0];
        gdzie.baza.Position.y:=gdzie.mesh.MeshObjects[0].Vertices[imax1][1];
        gdzie.baza.Position.z:=gdzie.mesh.MeshObjects[0].Vertices[imax1][2];


        gdzie.baza.Up.X:=gdzie.mesh.MeshObjects[0].Vertices[imax2][0]-gdzie.mesh.MeshObjects[0].Vertices[imax1][0];
        gdzie.baza.Up.y:=gdzie.mesh.MeshObjects[0].Vertices[imax2][1]-gdzie.mesh.MeshObjects[0].Vertices[imax1][1];
        gdzie.baza.Up.z:=gdzie.mesh.MeshObjects[0].Vertices[imax2][2]-gdzie.mesh.MeshObjects[0].Vertices[imax1][2];

        ve[0]:=-gdzie.mesh.MeshObjects[0].Vertices[imax1][0];
        ve[1]:=-gdzie.mesh.MeshObjects[0].Vertices[imax1][1];
        ve[2]:=-gdzie.mesh.MeshObjects[0].Vertices[imax1][2];

        gdzie.mesh.MeshObjects[0].Vertices.Translate(ve);
  {
        try
        gdzie.mesh.MeshObjects[0].Vertices.delete( imax1 ) ;
        except
        on e: exception do log.wriln('cla- '+e.ClassName+' -WYJ- '+e.Message);
        end;

        try
        gdzie.mesh.MeshObjects[0].Vertices.delete( imax2 );
        except
        on e: exception do log.wriln('cla- '+e.ClassName+' -WYJ- '+e.Message);
        end;

        try
        gdzie.mesh.MeshObjects[0].Vertices.delete( imax3 );
        except
        on e: exception do log.wriln('cla- '+e.ClassName+' -WYJ- '+e.Message);
        end;
         }
    //    log.wriln('meshcnt '+inttostr(gdzie.mesh.MeshObjects[0].TriangleCount));
    //    log.wriln('meshcnt '+inttostr(gdzie.mesh.MeshObjects[0].Vertices.count));
//        log.wriln('meshcnt '+inttostr(gdzie.mesh.MeshObjects[0].       ));

end;

procedure tpulpitobj.init;
begin

end;

function tpulpit.znazwy(s:string):integer;
var i,ret:integer;
begin
ret:=-1;
   //     log.wriln('znazwy '+s);
        for i:=0 to pul.meshobjects.count-1 do begin
      //          log.wriln(pul.MeshObjects[i].Name);
                if pul.meshobjects[i].name=s then begin ret:=i; {log.wriln('*');} end;
                end;
        znazwy:=ret;
end;

constructor tpulpit.create;
begin

end;

procedure tpulpit.init;
begin
matlib:=tglmateriallibrary.Create(nil);
zaczep:=tgldummycube.create(baza);
zaczep.parent:=baza;
end;

procedure tpulpit.przenies(gdzie:tglfreeform; co:string);
var  lObj:TMeshObject;
  t1, n1 : TAffineVectorList;
begin
        log.wriln('k-przenies '+co);
        gdzie.materiallibrary:=pul.materiallibrary;
        try
        gdzie.material:=pul.MaterialLibrary.LibMaterialByName(pul.MeshObjects[znazwy(co)].FaceGroups[0].materialname).material;
        except
        on e: exception do log.wriln('cla- '+e.ClassName+' -WYJ- '+e.Message);
        end;
        lObj := TMeshObject.CreateOwned(gdzie.MeshObjects);
        t1   := TAffineVectorList.create;
        n1   := TAffineVectorList.create;
        lObj.Vertices:= pul.MeshObjects[znazwy(co)].ExtractTriangles(t1,n1);
        lobj.Normals:=n1;
        lobj.TexCoords:=t1;
//        log.wriln('!');
        pul.MeshObjects[znazwy(co)].Free;
//        log.wriln('#');

end;

procedure tpulpit.wczytaj(_fname:string;x,y,z:real);
begin
zaczep.Position.x:=x;
zaczep.Position.Y:=y;
zaczep.Position.Z:=z;
pul:=tglfreeform.Create(zaczep);
pul.Parent:=zaczep;
pul.UseMeshMaterials:=true;
pul.MaterialLibrary:=matlib;
matlib.TexturePaths:=extractfilepath(_fname);
pul.LoadFromFile(_fname);
end;

procedure tpulpit.ustaw(nrbu,nrpos:integer);
var i:integer;
begin
      //  log.wriln(inttostr(nrbu)+' '+inttostr(nrpos));
        for i:=0 to 2 do
                if i=nrpos then bu[nrbu].pos[i].Visible:=true else bu[nrbu].pos[i].Visible:=false;
end;

procedure tpulpit.zrob;
var i,j:integer;
s:string;
begin
for i:=1 to 40 do begin
        bu[i]:=tpulpitobj.create;
        for j:=0 to 3 do begin
                bu[i].pos[j]:=tglfreeform.create(nil);
                bu[i].pos[j].Parent:=tglfreeform(zaczep);
                bu[i].pos[j].Parent:=zaczep;
        end;
end;
for i:=1 to 2 do ws[i]:=twskazowka.create;
                s:=format('but_0%d_%d',[i,j]); //mem.Lines.add(s);

//drzwi
if znazwy('A1')>=0 then begin przenies(bu[1].pos[0],'A1'); end;
if znazwy('A2')>=0 then begin przenies(bu[1].pos[1],'A2'); end;
if znazwy('A3')>=0 then begin przenies(bu[1].pos[2],'A3'); end;
ustaw(1,1);

if znazwy('B1')>=0 then begin przenies(bu[2].pos[0],'B1'); end;
if znazwy('B2')>=0 then begin przenies(bu[2].pos[1],'B2'); end;
if znazwy('B3')>=0 then begin przenies(bu[2].pos[2],'B3'); end;
ustaw(2,1);

if znazwy('C1')>=0 then begin przenies(bu[3].pos[0],'C1'); end;
if znazwy('C2')>=0 then begin przenies(bu[3].pos[1],'C2'); end;
if znazwy('C3')>=0 then begin przenies(bu[3].pos[2],'C3'); end;
ustaw(3,1);

if znazwy('D1')>=0 then begin przenies(bu[4].pos[0],'D1'); end;
if znazwy('D2')>=0 then begin przenies(bu[4].pos[1],'D2'); end;
if znazwy('D3')>=0 then begin przenies(bu[4].pos[2],'D3'); end;
ustaw(4,1);

if znazwy('a1')>=0 then begin przenies(bu[7].pos[0],'a1'); end;
if znazwy('a2')>=0 then begin przenies(bu[7].pos[1],'a2'); end;
ustaw(7,1);

if znazwy('b1')>=0 then begin przenies(bu[8].pos[0],'b1'); end;
if znazwy('b2')>=0 then begin przenies(bu[8].pos[1],'b2'); end;
ustaw(8,1);

if znazwy('c1')>=0 then begin przenies(bu[9].pos[0],'c1'); end;
if znazwy('c2')>=0 then begin przenies(bu[9].pos[1],'c2'); end;
ustaw(9,1);

if znazwy('d1')>=0 then begin przenies(bu[10].pos[0],'d1'); end;
if znazwy('d2')>=0 then begin przenies(bu[10].pos[1],'d2'); end;
ustaw(10,1);



//awaryjne
if znazwy('P1')>=0 then begin przenies(bu[12].pos[0],'P1'); end;
if znazwy('P2')>=0 then begin przenies(bu[12].pos[1],'P2'); end;
ustaw(12,1);


//stop
if znazwy('ST_0')>=0 then begin przenies(bu[13].pos[0],'ST_0'); end;
if znazwy('ST_1')>=0 then begin przenies(bu[13].pos[1],'ST_1'); end;
ustaw(13,1);

//kierunki
if znazwy('kon1_0')>=0 then begin przenies(bu[14].pos[0],'kon1_0'); end;
if znazwy('kon1_1')>=0 then begin przenies(bu[14].pos[1],'kon1_1'); end;
ustaw(14,1);

//swiatla
if znazwy('kon3_0')>=0 then begin przenies(bu[15].pos[0],'kon3_0'); end;
if znazwy('kon3_1')>=0 then begin przenies(bu[15].pos[1],'kon3_1'); end;
ustaw(15,1);

//silnik - rozruch
if znazwy('L1')>=0 then begin przenies(bu[16].pos[0],'L1'); end;
if znazwy('L2')>=0 then begin przenies(bu[16].pos[1],'L2'); end;
ustaw(16,1);

//silnik - wylacz
if znazwy('H1')>=0 then begin przenies(bu[17].pos[0],'H1'); end;
if znazwy('H2')>=0 then begin przenies(bu[17].pos[1],'H2'); end;
ustaw(17,1);


//swiatla -pstryczki
if znazwy('n1')>=0 then begin przenies(bu[18].pos[0],'n1'); end;
if znazwy('n2')>=0 then begin przenies(bu[18].pos[1],'n2'); end;
ustaw(18,1);

 log.wriln('wsk_0');
//wskazowki
if znazwy('wsk_0')>=0 then begin pwskazowka(ws[1],'wsk_0'); end;
 log.wriln('wsk_1');
if znazwy('wsk_1')>=0 then begin pwskazowka(ws[2],'wsk_1'); end;

//migacze
if znazwy('dzw1_1')>=0 then begin przenies(bu[19].pos[0],'dzw1_1'); end;
if znazwy('dzw1_2')>=0 then begin przenies(bu[19].pos[1],'dzw1_2'); end;
if znazwy('dzw1_3')>=0 then begin przenies(bu[19].pos[2],'dzw1_3'); end;
ustaw(19,1);

//deska siemens
//przyciski drzwiowe
if znazwy('aA1')>=0 then begin przenies(bu[20].pos[0],'aA1'); end;
if znazwy('aA2')>=0 then begin przenies(bu[20].pos[1],'aA2'); end;
if znazwy('aA3')>=0 then begin przenies(bu[20].pos[2],'aA3'); end;
ustaw(20,1);

if znazwy('bB1')>=0 then begin przenies(bu[21].pos[0],'bB1'); end;
if znazwy('bB2')>=0 then begin przenies(bu[21].pos[1],'bB2'); end;
if znazwy('bB3')>=0 then begin przenies(bu[21].pos[2],'bB3'); end;
ustaw(21,1);

if znazwy('cC1')>=0 then begin przenies(bu[22].pos[0],'cC1'); end;
if znazwy('cC2')>=0 then begin przenies(bu[22].pos[1],'cC2'); end;
if znazwy('cC3')>=0 then begin przenies(bu[22].pos[2],'cC3'); end;
ustaw(22,1);

//pstryczek drzwi kierowcy
if znazwy('DK0')>=0 then begin przenies(bu[24].pos[0],'DK0'); end;
if znazwy('DK1')>=0 then begin przenies(bu[24].pos[1],'DK1'); end;
ustaw(24,1);

//bieg D
if znazwy('saD_1')>=0 then begin przenies(bu[25].pos[0],'saD_1'); end;
if znazwy('saD_2')>=0 then begin przenies(bu[25].pos[1],'saD_2'); end;

//bieg N
if znazwy('saN_1')>=0 then begin przenies(bu[26].pos[0],'saN_1'); end;
if znazwy('saN_2')>=0 then begin przenies(bu[26].pos[1],'saN_2'); end;

//bieg R
if znazwy('saR_1')>=0 then begin przenies(bu[27].pos[0],'saR_1'); end;
if znazwy('saR_2')>=0 then begin przenies(bu[27].pos[1],'saR_2'); end;

if znazwy('K1_0')>=0 then begin przenies(bu[28].pos[0],'K1_0'); end;
if znazwy('K1_1')>=0 then begin przenies(bu[28].pos[1],'K1_1'); end;
if znazwy('K2_0')>=0 then begin przenies(bu[29].pos[0],'K2_0'); end;
if znazwy('K2_1')>=0 then begin przenies(bu[29].pos[1],'K2_1'); end;
if znazwy('K3_0')>=0 then begin przenies(bu[30].pos[0],'K3_0'); end;
if znazwy('K3_1')>=0 then begin przenies(bu[30].pos[1],'K3_1'); end;
if znazwy('K4_0')>=0 then begin przenies(bu[31].pos[0],'K4_0'); end;
if znazwy('K4_1')>=0 then begin przenies(bu[31].pos[1],'K4_1'); end;



end;

procedure tpulpit.rusz;
var i:integer;
begin
 //     if not status[4] then ustaw (4,1);

        if status[12] then ustaw (12,0);
        if not status[12] then ustaw (12,1);

        if (not status[6]) and (not status[1]) then begin ustaw(1,1); ustaw(7,1); ustaw(20,0);ustaw(28,0);end;
        if      status[6]  and (not status[1]) then begin ustaw(1,0); ustaw(7,1); ustaw(28,0);end;
        if      status[6]  and      status[1]  then begin ustaw(1,2); ustaw(7,0); ustaw(28,1);end;
        if (not status[6]) and      status[1]  then begin ustaw(1,2); ustaw(7,1); ustaw(20,2);ustaw(28,1);end;

        if (not status[7]) and (not status[2]) then begin ustaw(2,1); ustaw(8,1); ustaw(21,0); ustaw(29,0); end;
        if      status[7]  and (not status[2]) then begin ustaw(2,0); ustaw(8,1); ustaw(29,0);end;
        if      status[7]  and      status[2]  then begin ustaw(2,2); ustaw(8,0); ustaw(29,1);end;
        if (not status[7]) and      status[2]  then begin ustaw(2,2); ustaw(8,1); ustaw(21,2); ustaw(29,1); end;

        if (not status[8]) and (not status[3]) then begin ustaw(3,1); ustaw(9,1); ustaw(22,0); ustaw(30,0); end;
        if      status[8]  and (not status[3]) then begin ustaw(3,0); ustaw(9,1); ustaw(30,0);end;
        if      status[8]  and      status[3]  then begin ustaw(3,2); ustaw(9,0); ustaw(30,1);end;
        if (not status[8]) and      status[3]  then begin ustaw(3,2); ustaw(9,1); ustaw(22,2); ustaw(30,1); end;

        if (not status[9]) and (not status[4]) then begin ustaw(4,1); ustaw(10,1); end;
        if      status[9]  and (not status[4]) then begin ustaw(4,0); ustaw(10,1); end;
        if      status[9]  and      status[4]  then begin ustaw(4,2); ustaw(10,0); end;
        if (not status[9]) and      status[4]  then begin ustaw(4,2); ustaw(10,1); end;

        if status[13] then ustaw(13,1) else ustaw(13,0);
        if status[14] then ustaw(14,1) else ustaw(14,0);
        if status[15] then begin ustaw(15,1); ustaw(18,1) end else begin ustaw(15,0); ustaw(18,0); end;

        if (not status[16]) and (not status[17]) then begin ustaw(16,0); ustaw(17,1); end;
        if      status[16]  and (not status[17]) then begin ustaw(16,0); ustaw(17,1); end;
        if      status[16]  and      status[17]  then begin ustaw(16,1); ustaw(17,1); end;
        if (not status[16]) and      status[17]  then begin ustaw(16,0); ustaw(17,0); end;

        if status[18] then ustaw(19,2);
        if status[19] then ustaw(19,0);
        if (not status[18]) and (not status[19]) then ustaw(19,1);

        if status[6] then begin ustaw(20,1);   end;
        if status[7] then begin ustaw(21,1);   end;
        if status[8] then begin ustaw(22,1);   end;

        if status[20] then ustaw(24,1) else ustaw(24,0);

        if status[21] then ustaw(25,1) else ustaw(25,0);
        if status[22] then ustaw(26,1) else ustaw(26,0);
        if status[23] then ustaw(27,1) else ustaw(27,0);

        for i:=1 to 2 do ws[i].rusz;
end;

end.
