function [ver,tri,data,nor]=loadMesh(name)
  %[ver,tri,data,nor]=loadMesh(name)
  %-INPUT : 
  %   name: *.tri file name
  %-OUTPUT: 
  %    ver: list of vertices
  %    tri: list of triangles
  %   data: list of data items if available
  %    nor: list of normals per vertex
  fd=fopen(name,'r','ieee-le');
  byteOrder=fread(fd,1,'short');
  if byteOrder==hex2dec('4c45') | byteOrder==hex2dec('4245')
    fclose(fd);
    fd=fopen(name,'r','ieee-be');
    byteOrder=fread(fd,1,'short');
    %disp 'found big-endian mesh'
  else
    %disp 'found little-endian mesh'
  end

  numVertex=fread(fd,1,'int');
  numFaces=fread(fd,1,'int');
  tmp=fread(fd,1,'int');
  ver=fread(fd,[3,numVertex],'float')';
  tri=fread(fd,[3,numFaces],'int')'+1;
  nData=fread(fd,1,'int');
  
  if isempty(nData)
    nData=0;
  end
  
  if nargout < 3
    fclose(fd);
    return;
  end

  if nargout == 4
    nor=computeNormals(ver,tri);
  else
    nor=[];
  end
  
  
  data=cell(nData,1);
  for i=1:nData
    tmpstruct.title=char(fread(fd,64,'uint8')');
    tmpstruct.min=fread(fd,1,'float32');
    tmpstruct.max=fread(fd,1,'float32');
    tmpstruct.length=fread(fd,1,'int32');
    tmpstruct.data=fread(fd,tmpstruct.length,'float32');
    data{i}=tmpstruct;
  end
  fclose(fd);

function nor=computeNormals(ver,tri)
  v1=ver(tri(:,2),:)-ver(tri(:,1),:);
  v2=ver(tri(:,3),:)-ver(tri(:,1),:);
  nf(:,1)=v1(:,2).*v2(:,3)-v1(:,3).*v2(:,2);
  nf(:,2)=v1(:,3).*v2(:,1)-v1(:,1).*v2(:,3);
  nf(:,3)=v1(:,1).*v2(:,2)-v1(:,2).*v2(:,1);
  nor(:,1)=full(sparse(tri(:),ones(prod(size(tri)),1),repmat(nf(:,1),3,1)));
  nor(:,2)=full(sparse(tri(:),ones(prod(size(tri)),1),repmat(nf(:,2),3,1)));
  nor(:,3)=full(sparse(tri(:),ones(prod(size(tri)),1),repmat(nf(:,3),3,1)));
  temp=sqrt(sum(nor.^2,2));
  nor=nor./repmat(temp,1,3);
