function[uv, hidden, distance]=camera_simulation(R,T,pt,K,f,heigth,width)
% camera_simulation: simulatore di una telecamera pin-hole
% [uv, hidden, distance]=camera_simulation(R,T,pt,K,f,heigth,width)
% 
% INPUT:
% -R matrice di rotazione della telecamera rispetto al riferimento-ambiente
% -T vettore di traslazione della telecamera rispetto al
%       riferimento-ambiente
% -pt matrice dei punti dello spazio reale da proiettare (no coordinate
%       omogenee)
% -K parametri intrinseci telecamera
% -f distanza focale
% -heigth,width dimensioni in pixel del piano immagine.
% OUTPUT:
% - uv matrice dei punti dell' immagine,
% - hidden vettore booleano che indica quali dei punti iniziali non sono
%       visibili (0=visibile, 1=invisibile)
% - distance vettore indicante la distanza del punto dall'origine del
%       sistema telecamera (utile ad esempio per determinare la dimensione
%       apparente del marker o se considerarlo invisibile o sfocato a causa
%       della distanza 

% Inizializzazione parametri opzionali

if (nargin < 3)  % mancano dei parametri obbligatori
    disp('è necessario inserire almeno i parametri')
    disp('R, matrice di rotazione')
    disp('T, vettore di traslazione')
    disp('pt, matrice di punti tridimensionali')
end
if (nargin < 4) 
    K = eye(3); % larghezza e altezza dei pixel uguale, nessuna traslaz del piano immagine
end
if (nargin < 5)
    f = 1; %fuoco a distanza "1"
end
if (nargin < 7) % Se non viene specificato altrimenti, supponiamo di avere 
                % un piano immagine infinito.
    limited = 0;
else
    limited = 1;
end
 
%trasformo i punti in coordinate omogenee
[bhoo,j]=size(pt);

pt_old=pt; %-------------------prova
pt=[pt; ones(1,j)];


% Creo la matrice di proiezione
P_p=[f 0 0 0 ; 0 f 0 0 ; 0 0 1 0];

% Esprimo le coordinate dei punti nel riferimento della telecamera
%disp('pt_cam')
% pt_cam = [R T ; zeros(1,3) 1]*pt;
pt_cam = [R' -R'*T ; zeros(1,3) 1]*pt; %-------------------prova
%modifica qui sopra per esprimere la traslazione in fuzione del sistema
%camera


% Calcolo la distanza dalla telecamera (per i gruppi che devono considerare
% non visibili punti troppo vicini o distanti)
distance = sqrt(  pt_cam(1,:).^2 + pt_cam(2,:).^2 + pt_cam(3,:).^2   );

% Marco nel vettore hidden i punti dietro al piano immagine
disp('dietro');
hidden = ( pt_cam(3,:) < f );
%pt_cam(3,:)

% Proietto i punti sul piano immagine e riscalo i valori nelle dim dei
% pixel
% uvs=K*P_p*[R T ; zeros(1,3) 1]*pt;
uvs=K * P_p * pt_cam;
uv=[uvs(1,:)./uvs(3,:); uvs(2,:)./uvs(3,:)];

if (limited)
% Marco i punti che giacciono fuori dal piano immagine:
%   cancello i punti a con ascissa < oX
%     disp('fuori a sinistra')
    mask = ( uv(1,:) < 0 );
    hidden = mask | hidden;
    
%   Marco i punti a con ordinata < oY
    disp('fuori sotto')
    mask = ( uv(2,:) < 0 );
    hidden = mask | hidden;
    
%   Marco i punti a con ascissa > pixX
%     disp('fuori a destra')
    mask = ( uv(1,:) > width );
    hidden = mask | hidden;
    
%   Marco i punti a con ordinata > pixY
%     disp('fuori sopra')
    mask = ( uv(2,:) >  heigth );
    hidden = mask | hidden;
    
    %hidden = zeros(length(mask)); %========================================
    %=====================================================================
    %=============== DEBUG, TOGLIERE QUESTA LINEA!!!!!!!!!!
end


end
