Home > SurfStat > SurfStatReadSurf1.m

SurfStatReadSurf1

PURPOSE ^

Reads coordinates and triangles from a single .obj or FreeSurfer file.

SYNOPSIS ^

function [ surf, ab ] = SurfStatReadSurf1( filename, ab, numfields );

DESCRIPTION ^

Reads coordinates and triangles from a single .obj or FreeSurfer file. 

 Usage: [ surf, ab ] = SurfStatReadSurf1( filename [,ab [,numfields ]] );

 filename  = .obj or FreeSurfer file name.
 ab        = 'a' for ASCII or 'b' for binary. If it doesn't work it
              will try the other. Default is 'a'. Ignored if FS file.
 numfields = number of fields to read, in the order below, default 4.

 surf.coord  = 3 x v matrix of coordinates, v=#vertices.
 surf.normal = 3 x v matrix of surface normals, only .obj files.
 surf.colr   = 4 x 1 vector of colours for the whole surface,
               or 4 x v matrix of colours for each vertex, either 
               uint8 in [0 255], or float in [0 1], only .obj files.
 surf.tri    = t x 3 matrix of triangle indices, 1-based, t=#triangles.
 ab          = whichever was successful.

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [ surf, ab ] = SurfStatReadSurf1( filename, ab, numfields );
0002 
0003 %Reads coordinates and triangles from a single .obj or FreeSurfer file.
0004 %
0005 % Usage: [ surf, ab ] = SurfStatReadSurf1( filename [,ab [,numfields ]] );
0006 %
0007 % filename  = .obj or FreeSurfer file name.
0008 % ab        = 'a' for ASCII or 'b' for binary. If it doesn't work it
0009 %              will try the other. Default is 'a'. Ignored if FS file.
0010 % numfields = number of fields to read, in the order below, default 4.
0011 %
0012 % surf.coord  = 3 x v matrix of coordinates, v=#vertices.
0013 % surf.normal = 3 x v matrix of surface normals, only .obj files.
0014 % surf.colr   = 4 x 1 vector of colours for the whole surface,
0015 %               or 4 x v matrix of colours for each vertex, either
0016 %               uint8 in [0 255], or float in [0 1], only .obj files.
0017 % surf.tri    = t x 3 matrix of triangle indices, 1-based, t=#triangles.
0018 % ab          = whichever was successful.
0019 
0020 if nargin<2
0021     ab='a';
0022 end
0023 if nargin<3
0024     numfields=4;
0025 end
0026 
0027 [pathstr,name,ext] = fileparts(filename);
0028 if strcmp(ext,'.obj')
0029     % It's a .obj file
0030     if ab(1)=='a'
0031         fid=fopen(filename);
0032         FirstChar=fscanf(fid,'%1s',1);
0033         if FirstChar=='P' % ASCII
0034             fscanf(fid,'%f',5);
0035             v=fscanf(fid,'%f',1);
0036             surf.coord=fscanf(fid,'%f',[3,v]);
0037             if numfields>=2
0038                 surf.normal=fscanf(fid,'%f',[3,v]);
0039                 if numfields>=3
0040                     ntri=fscanf(fid,'%f',1);
0041                     ind=fscanf(fid,'%f',1);
0042                     if ind==0
0043                         surf.colr=fscanf(fid,'%f',4);
0044                     else
0045                         surf.colr=fscanf(fid,'%f',[4,v]);
0046                     end
0047                     if numfields>=4
0048                         fscanf(fid,'%f',ntri);
0049                         surf.tri=fscanf(fid,'%f',[3,ntri])'+1;
0050                     end
0051                 end
0052             end
0053             fclose(fid);
0054         else
0055             fclose(fid);
0056             fid=fopen(filename,'r','b');
0057             FirstChar=fread(fid,1);
0058             if FirstChar==uint8(112) % binary
0059                 fread(fid,5,'float');
0060                 v=fread(fid,1,'int');
0061                 surf.coord=fread(fid,[3,v],'float');
0062                 if numfields>=2
0063                     surf.normal=fread(fid,[3,v],'float');
0064                     if numfields>=3
0065                         ntri=fread(fid,1,'int');
0066                         ind=fread(fid,1,'int');
0067                         if ind==0
0068                             surf.colr=uint8(fread(fid,4,'uint8'));
0069                         else
0070                             surf.colr=uint8(fread(fid,[4,v],'uint8'));
0071                         end
0072                         if numfields>=4
0073                             fread(fid,ntri,'int');
0074                             surf.tri=fread(fid,[3,ntri],'int')'+1;
0075                         end
0076                     end
0077                 end
0078                 fclose(fid);
0079                 ab='b';
0080             else
0081                 fprintf(1,'%s\n',['Unable to read ' filename ', first character ' char(FirstChar)]);
0082             end
0083         end
0084     else
0085         fid=fopen(filename,'r','b');
0086         FirstChar=fread(fid,1);
0087         if FirstChar==uint8(112) % binary
0088             fread(fid,5,'float');
0089             v=fread(fid,1,'int');
0090             surf.coord=fread(fid,[3,v],'float');
0091             if numfields>=2
0092                 surf.normal=fread(fid,[3,v],'float');
0093                 if numfields>=3
0094                     ntri=fread(fid,1,'int');
0095                     ind=fread(fid,1,'int');
0096                     if ind==0
0097                         surf.colr=uint8(fread(fid,4,'uint8'));
0098                     else
0099                         surf.colr=uint8(fread(fid,[4,v],'uint8'));
0100                     end
0101                     if numfields>=4
0102                         fread(fid,ntri,'int');
0103                         surf.tri=fread(fid,[3,ntri],'int')'+1;
0104                     end
0105                 end
0106             end
0107             fclose(fid);
0108         else
0109             fclose(fid);
0110             fid=fopen(filename);
0111             FirstChar=fscanf(fid,'%1s',1);
0112             if FirstChar=='P' %ASCII
0113                 fscanf(fid,'%f',5);
0114                 v=fscanf(fid,'%f',1);
0115                 surf.coord=fscanf(fid,'%f',[3,v]);
0116                 if numfields>=2
0117                     surf.normal=fscanf(fid,'%f',[3,v]);
0118                     if numfields>=3
0119                         ntri=fscanf(fid,'%f',1);
0120                         ind=fscanf(fid,'%f',1);
0121                         if ind==0
0122                             surf.colr=fscanf(fid,'%f',4);
0123                         else
0124                             surf.colr=fscanf(fid,'%f',[4,v]);
0125                         end
0126                         if numfields>=4
0127                             fscanf(fid,'%f',ntri);
0128                             surf.tri=fscanf(fid,'%f',[3,ntri])'+1;
0129                         end
0130                     end
0131                 end
0132                 fclose(fid);
0133                 ab='a';
0134             else
0135                 fprintf(1,'%s\n',['Unable to read ' filename ', first character ' char(FirstChar)]);
0136             end
0137         end
0138     end
0139 else
0140     % Assume it's a FreeSurfer file
0141     fid = fopen(filename, 'rb', 'b') ;
0142     b1 = fread(fid, 1, 'uchar') ;
0143     b2 = fread(fid, 1, 'uchar') ;
0144     b3 = fread(fid, 1, 'uchar') ;
0145     magic = bitshift(b1, 16) + bitshift(b2,8) + b3 ;
0146     if magic==16777214
0147         fgets(fid);
0148         fgets(fid);
0149         v = fread(fid, 1, 'int32') ;
0150         t = fread(fid, 1, 'int32') ;
0151         surf.coord = fread(fid, [3 v], 'float32') ;
0152         if numfields==4
0153             surf.tri = fread(fid, [3 t], 'int32')' + 1 ;
0154         end
0155         fclose(fid) ;
0156     else
0157         fprintf(1,'%s\n',['Unable to read ' filename ', magic = ' num2str(magic)]);
0158     end
0159     ab='b';
0160 end
0161 
0162 return
0163 end
0164

Generated on Fri 26-Sep-2008 14:05:29 by m2html © 2003