%attenzion

function plotcam(action)

global cams
global voxels
global latovoxel latox latoy latoz
%passo in ingresso un vettore con le etichette di tutte le telecamere di
%cui voglio fare il plot
if nargin<1
    action='start';
end
    
if strcmp(action,'start') | isnumeric(action)
    cams   = getappdata(0,'cams')
    voxels = getappdata(0,'voxels')
    space  = getappdata(0,'space')
    latovoxel = getappdata(0,'latovoxel')
    %cams=handles.cams;
    %voxels=handles.cams;
    %latovoxel=handles.latovoxel;
    latox=space(1);
    latoy=space(2);
    latoz=space(3);
    
    close all;
    figure(5);     %cambiare e creare un figura con nome figure(fig)
    clf;rotate3d on;
    %hold off;
    %axis vis3d;
    %axis tight;
    ax = axes('position',[.22 .1 .75 .85],'XLim',[-2 latox+2],...
              'YLim',[-2 latoy+2],...
              'ZLim',[-2 latoz+2])
    view(3)
    grid on;
    title('Visibilità della telecamera');  %num2str(label)   
    set(5,'color',[1 1 1]);
    view(50,20)
    
    if isnumeric(action)
        default=num2str(action);
    else
        %default=[1 2 3]
        %per default voglio fare il plot di tutte le telecamere
        default=[];
        for i=1:size(cams,2)
          default=[default i]
        end
    end
    set(0,'userdata',default)

    textE = uicontrol(figure(5),'Units','normalized','style','text','Pos',[.01 0.95  .17  .04],...
	'fontsize',8,'string','Inserire un vettore con le telcamere da rappresentare'...
	);
    showE = uicontrol(figure(5),'Units','normalized','style','edit','pos',[.01 0.90  .17  .04],...
    'fontsize',9,'string',num2str(get(0,'userdata')));
	runbutton = uicontrol(figure(5),'Units','normalized','style','push','pos',[.01 0.86  .08  .04],...
	'fontsize',9,'string','Run','callback','plotcam(''run'')'...
		);
    clearbutton = uicontrol(figure(5),'Units','normalized','style','push','pos',[.1 0.86  .08  .04],...
    'fontsize',9,'string','Clear','callback','plotcam(''clear'')'...
		);	
		
    
    h.cams = showE
    h.precedenti='[]'   %per tenere memoria dei run precedenti
    h.show  = [1 1 1 0 0];
    h.thefig= figure(5);
    h.theplot=ax
    h.view  = view
    set(0,'userdata',h);
    
    if isnumeric(action)
        plotcam('run')
    end
    
end

if strcmp(action,'clear');


	h = get(0,'userdata');
	delete(get(h.theplot,'children'));
    h.precedenti='[]';
    set(0,'userdata',h)

	
end;

if strcmp(action,'run');

    % parameters
    h     = get(0,'userdata');
    ed = str2num(get(h.cams,'string'));
    ed = sort(ed);
    prec  = str2num(h.precedenti);
    label=[];
    i=1;j=1;  
    while i<=size(prec,2) & j<=size(ed,2)
            if prec(i)< ed(j)
                label=[label prec(i)];
                i=i+1;
            elseif prec(i)== ed(j)
                label=[label ed(j)];
                i=i+1;
                j=j+1;
            else
                %N.B. se nella lista ho inserito una cemera che non esiste 
                %non la inserisco
                if ed(j)<=size(cams,2)
                    label=[label ed(j)];
                end
                j=j+1;            
            end
    end
    if i<=size(prec,2)
        label = [label prec(i:end)]
    end
    
    while j<=size(ed,2) & ed(j)<=size(cams,2)
        label = [label ed(j)]
        j=j+1;
    end
    
    h.precedenti= num2str(label);
    set(0,'userdata',h);
    %[a,b] = h.view;

for i=1:size(label,2)
    % comprensione
    Rx= makehgtform('xrotate',cams(label(i)).angles(1));
    Ry= makehgtform('yrotate',cams(label(i)).angles(2));
    Rz= makehgtform('zrotate',cams(label(i)).angles(3));
    R = Rx*Ry*Rz;
    %in uscita ho una matrice 4x4 perchè  makehgtform permette trasformazioni
    %anche nel tempo...quindi a noi interessa solo la sottomatrice 3x3
    R_cam=R(1:3,1:3);

    %altrimenti potrei uitlizzare:
    % Rx=rotionmat3D(cams(i).angles(1),[1,0,0])
    % Rz=rotionmat3D(cams(i).angles(2),[0,1,0])
    % Ry=rotionmat3D(cams(i).angles(3),[0,0,1])
    % R_cam=Rx*Ry*Rz


    % per ogni baricentro calcolo il valore che hanno i 4(6 se considero il tronco)
    % piano per le x,y (z?) del baricentro => trovo 2(4) intervallo 
    % => inserisco tutti i baricentri dei voxel inerni a tali intervalli
    % sarebbe più logico partire dal centro prospettico e muoversi lungo i
    % voxel dell'asse della piramide

    if isfield(cams,'angle_cam')
        angle_cam = cams(label(i)).angle_cam;
    else 
        angle_cam= pi/3  ;     %in realtà dovrei passarlo dalla edit text box
    end

    if isfield(cams,'dist')
        h_max = cams(label(i)).dist(1);         
        h_min = cams(label(i)).dist(2);
    else
        %inserisco i valori di default
        h_max = 5;          %5 metri
        h_min = 0.5;        %2 metri     
    end

    d_M       = h_max*(angle_cam/2);  %lato base maggiore tronco cono = fov_MAX
    d_m       = h_min*(angle_cam/2);  %lato base minore tronco cono = fov_min

    d_M       = h_max*(angle_cam/2);  %lato base maggiore tronco cono
    d_m       = h_min*(angle_cam/2);  %lato base minore tronco cono

    %vertici del tronco di piramide
    v =      [0 0 0;
             -d_m/2 -d_m/2 -h_min; 
             -d_m/2 +d_m/2 -h_min;
             +d_m/2 +d_m/2 -h_min; 
             +d_m/2 -d_m/2 -h_min;
             -d_M/2 -d_M/2 -h_max; 
             -d_M/2 +d_M/2 -h_max;
             +d_M/2 +d_M/2 -h_max; 
             +d_M/2 -d_M/2 -h_max;]';
    
    cube_cam=[-.1 .1 .1 -.1 -.1 .1 .1 -.1;
              -.1 -.1 .1 .1 -.1 -.1 .1 .1;
              -.1 -.1 -.1 -.1 .4 .4 .4 .4];


    %se conosco la matrice rotazione conosco anche come sono posti i versori
    versori =([ 0 1 0 0 0 0;
                0 0 0 1 0 0;
                0 0 0 0 0 1]);

    %i nuovi vertici della piramide ruotata sono:
    new_v = R_cam*v + cams(label(i)).position * ones(1,9);
    %vertici della scataola telecamera
    scatola=R_cam*cube_cam + cams(label(i)).position * ones(1,8);
    %mentre i nuovi versori sono dati da:
    newversori = R_cam*versori + cams(label(i)).position * ones(1,6);
    %%
     %%plot della piramide non visibile
      if  h.show(1) == 1  
        p1 = struct('vertices',new_v','faces',[1 2 3;1 3 4;1 4 5;1 5 2]);
        h1 = patch(p1);
        set(h1,'facecolor',[52 217 160]/255,'EdgeColor', 'b');
        p2 = struct('vertices',new_v','faces',[2 3 4 5]);
        h2 = patch(p2);
        set(h2,'facecolor','none','EdgeColor', 'b');
        p3 = struct('vertices',scatola','faces',[1 2 3 4;5 6 7 8;2 6 7 3;...
            1 5 8 4;1 2 6 5; 4 3 7 8]);
        h3 = patch(p3);
        set(h3,'facecolor','b','EdgeColor', 'k');
     end

    %%plot dei versori
     if h.show(2) == 1
        hold on;                      
        plot3(newversori(1,:),newversori(2,:),newversori(3,:),'m-','linewidth',1');
     end

    %%plot del tronco di piramide
     if h.show(3) == 1 
        p1 = struct('vertices',new_v','faces',[6 7 8 9]);
        h1 = patch(p1);
        set(h1,'facecolor','none','EdgeColor', 'r');
        p2 = struct('vertices',new_v','faces',[2 3 4 5; 3 7 6 2; 3 7 8 4;4 8 9 5; 2 6 9 5; ]);
        h2 = patch(p2);
        set(h2,'facecolor','none','EdgeColor', 'r');
     end

     %%plot dei voxels visibili dalla telecamera
      if h.show(4) == 1 & isfield(cams,'voxels')
        for j=1:size(cams(label(i)).voxels,2)
        voxel(cams(label(i)).voxels(:,j),[latovoxel latovoxel latovoxel],'g',1);  
        %N.B. non si confonda la funzione voxel che serveper il plot del 
        %cubo con la variabile 'voxels' di tipo struct                                              
        hold on
        end
      end

     %%plot tutti i voxels del campo di visuale
      if h.show(5) == 1
        for j=1:size(voxels,2)
         voxel(voxels(j).position,[latovoxel latovoxel latovoxel],'g',0);
         hold on
        end
      end
end

% ax = axes('XLim',[min(new_v(1,:))-1 max(new_v(1,:))+1],...
%           'YLim',[min(new_v(2,:))-1 max(new_v(2,:))+1],...
%           'ZLim',[min(new_v(3,:))-1 max(new_v(3,:))+1]);
% 

    if h.show(1)==1,
        h_switch1  = uicontrol('Parent',5,'Units','normalized','style',...
        'push','pos',[.01 0.82  .17  .04],'string','Remove camera',...
        'HandleVisibility','callback','fontsize',8,'Callback', ...
        'ud=get(0,''userdata''); delete(get(ud.theplot,''children''));ud.show(1)=0; set(0,''userdata'',ud); plotcam(''run'');');
		
        %'ud=get(0,''userdata''); set(0,''userdata'',[0 ud(2) ud(3) ud(4) ud(5) ud(6:end)]); plotcam(ud(6:end));');
		
        
        %h_switch1 = uicontrol('Parent',4,'Units','normalized', 'Callback','show_camera=0;plotcam();', 'Position',[1-.18 0.94  .17  .04],'String','Remove camera','fontsize',8,'fontname','clean','Tag','Pushbutton1');
    else
        %figure(h.thefig),
         h_switch1  = uicontrol('Parent',5,'Units','normalized','style',...
        'push','pos',[.01 0.82  .17  .04],'string','Add camera',...
        'HandleVisibility','callback','fontsize',8,'Callback',...
        'ud=get(0,''userdata''); delete(get(ud.theplot,''children''));ud.show(1)=1; set(0,''userdata'',ud);plotcam(''run'');');
         
        %'ud=get(0,''userdata''); set(0,''userdata'',[1 ud(2)  ud(3) ud(4) ud(5) ud(6:end)] );plotcam(ud(6:end));');
         
    end
end

    if h.show(2)==1,
        h_switch2 = uicontrol('Parent',5,'Units','normalized', 'style',...
            'push','pos',[.01 0.78  .17  .04],'string','Remove i versori',...
        'HandleVisibility','callback','fontsize',8,'Callback',...
        'ud=get(0,''userdata''); delete(get(ud.theplot,''children''));ud.show(2)=0; set(0,''userdata'',ud); plotcam(''run'');');
    else
        h_switch2 = uicontrol('Parent',5,'Units','normalized', 'style',...
            'push','pos',[.01 0.78  .17  .04],'string',' Add i versori',...
        'HandleVisibility','callback','fontsize',8,'Callback',...
        'ud=get(0,''userdata''); delete(get(ud.theplot,''children''));ud.show(2)=1; set(0,''userdata'',ud);plotcam(''run'');');
    end;
        
    if h.show(3)==1 
        h_switch3 = uicontrol('Parent',5,'Units','normalized', 'style',...
            'push','pos',[.01 0.74  .17  .04],'string','Remove il tronco di piramide',...
        'HandleVisibility','callback','fontsize',8,'Callback',...
        'ud=get(0,''userdata''); delete(get(ud.theplot,''children''));ud.show(3)=0; set(0,''userdata'',ud); plotcam(''run'');');
    else
        h_switch3 = uicontrol('Parent',5,'Units','normalized', 'style',...
            'push','pos',[.01 0.74  .17  .04],'string','Add il tronco di piramide',...
        'HandleVisibility','callback','fontsize',8,'Callback',...
        'ud=get(0,''userdata''); delete(get(ud.theplot,''children''));ud.show(3)=1; set(0,''userdata'',ud);plotcam(''run'');');
    end;
    
    if isfield(cams,'voxels')
        
    if h.show(4)==1,
        h_switch4 = uicontrol('Parent',5,'Units','normalized', 'style',...
            'push','pos',[.01 0.70  .17  .04],'string','Remove i voxels interni',...
        'HandleVisibility','callback','fontsize',8,'Callback',...
        'ud=get(0,''userdata''); delete(get(ud.theplot,''children''));ud.show(4)=0; set(0,''userdata'',ud); plotcam(''run'');');
    else
        h_switch4 = uicontrol('Parent',5,'Units','normalized', 'style',...
            'push','pos',[.01 0.70  .17  .04],'string','Add i voxels interni',...
        'HandleVisibility','callback','fontsize',8,'Callback',...
       'ud=get(0,''userdata''); delete(get(ud.theplot,''children''));ud.show(4)=1; set(0,''userdata'',ud);plotcam(''run'');');
     end;
    end
    
    if h.show(5)==1,
        h_switch5 = uicontrol('Parent',5,'Units','normalized', 'style',...
            'push','pos',[.01 0.66  .17  .04],'string','Remove i voxels del campo',...
        'HandleVisibility','callback','fontsize',8,'Callback',...
        'ud=get(0,''userdata''); delete(get(ud.theplot,''children''));ud.show(5)=0; set(0,''userdata'',ud); plotcam(''run'');');
    else
          h_switch5 = uicontrol('Parent',5,'Units','normalized', 'style',...
            'push','pos',[.01 0.66  .17  .04],'string','Add i voxels del campo',...
        'HandleVisibility','callback','fontsize',8,'Callback',...
        'ud=get(0,''userdata''); delete(get(ud.theplot,''children''));ud.show(5)=1; set(0,''userdata'',ud);plotcam(''run'');');
     end;
    %hold off
    
%     if h.show(6)==1,
%         h_switch5 = uicontrol('Parent',5,'Units','normalized', 'style',...
%             'push','pos',[.01 0.62  .17  .04],'string','Remove i marker visti',...
%         'HandleVisibility','callback','fontsize',8,'Callback',...
%         'ud=get(0,''userdata''); delete(get(ud.theplot,''children''));ud.show(5)=0; set(0,''userdata'',ud); plotcam(''run'');');
%     else
%           h_switch5 = uicontrol('Parent',5,'Units','normalized', 'style',...
%             'push','pos',[.01 0.62  .17  .04],'string','Add marker visti',...
%         'HandleVisibility','callback','fontsize',8,'Callback',...
%         'ud=get(0,''userdata''); delete(get(ud.theplot,''children''));ud.show(5)=1; set(0,''userdata'',ud);plotcam(''run'');');
%      end;
%     %hold off
    
    figure(5);
    rotate3d on;
    fig=figure(5)
    


    % if exist('h_switch6')==1,
    %     if ishandle(h_switch6),
    %         delete(h_switch6);
    %     end;
    % end;
    % if show_planes,
    %     h_switch6 = uicontrol('Parent',4,'Units','normalized', 'Callback','show_allvox=0;main6;', 'Position',[1-.30 0.02  .30  .04],'String','Remove i voxel interni','fontsize',8,'fontname','clean','Tag','Pushbutton1');
    % else
    %     h_switch6 = uicontrol('Parent',4,'Units','normalized', 'Callback','show_allvox=1;main6;', 'Position',[1-.30 0.02  .30  .04],'String','Add i voxel interni','fontsize',8,'fontname','clean','Tag','Pushbutton2');
    % end;
    % 
    % 
    % if exist('h_switch')==1,
    %     if ishandle(h_switch),
    %         delete(h_switch);
    %     end;
    % end;
    % 
    % if n_ima ~= 0,
    % h_switch = uicontrol('Parent',4,'Units','normalized', 'Callback','ext_calib2', 'Position',[1-.30 0  .30  .04],'String','Switch to world-centered view','fontsize',8,'fontname','clean','Tag','Pushbutton1');
    % end;
    %

