saveas.m 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. function saveas(this,filename,format)
  2. % Save GIfTI object in external file format
  3. % FORMAT saveas(this,filename,format)
  4. % this - GIfTI object
  5. % filename - name of file to be created [Default: 'untitled.vtk']
  6. % format - optional argument to specify encoding format, among
  7. % VTK (.vtk,.vtp), Collada (.dae), IDTF (.idtf), Wavefront OBJ
  8. % (.obj), JavaScript (.js), JSON (.json), FreeSurfer
  9. % (.surf,.curv), MZ3 (.mz3) [Default: VTK]
  10. %__________________________________________________________________________
  11. % Copyright (C) 2008 Wellcome Trust Centre for Neuroimaging
  12. % Guillaume Flandin
  13. % $Id: saveas.m 7470 2018-11-01 17:40:18Z guillaume $
  14. % Check filename and file format
  15. %--------------------------------------------------------------------------
  16. ext = '.vtk';
  17. if nargin == 1
  18. filename = ['untitled' ext];
  19. else
  20. if nargin == 3 && strcmpi(format,'js')
  21. ext = '.js';
  22. end
  23. if nargin == 3 && strcmpi(format,'json')
  24. ext = '.json';
  25. end
  26. if nargin == 3 && strcmpi(format,'collada')
  27. ext = '.dae';
  28. end
  29. if nargin == 3 && strcmpi(format,'idtf')
  30. ext = '.idtf';
  31. end
  32. if nargin == 3 && strncmpi(format,'vtk',3)
  33. format = lower(format(5:end));
  34. ext = '.vtk';
  35. end
  36. if nargin == 3 && strcmpi(format,'obj')
  37. ext = '.obj';
  38. end
  39. if nargin == 3 && strcmpi(format,'curv')
  40. ext = '.curv';
  41. end
  42. if nargin == 3 && strcmpi(format,'surf')
  43. ext = '.surf';
  44. end
  45. if nargin == 3 && strcmpi(format,'mz3')
  46. ext = '.mz3';
  47. end
  48. [p,f,e] = fileparts(filename);
  49. if strcmpi(e,'.gii')
  50. warning('Use save instead of saveas.');
  51. save(this,filename);
  52. return;
  53. end
  54. if ~ismember(lower(e),{ext})
  55. warning('Changing file extension from %s to %s.',e,ext);
  56. e = ext;
  57. end
  58. filename = fullfile(p,[f e]);
  59. end
  60. % Write file
  61. %--------------------------------------------------------------------------
  62. s = struct(this);
  63. switch ext
  64. case {'.js','.json'}
  65. save_js(s,filename);
  66. case '.dae'
  67. save_dae(s,filename);
  68. case '.idtf'
  69. save_idtf(s,filename);
  70. case {'.vtk','.vtp'}
  71. if nargin < 3, format = 'legacy-ascii'; end
  72. mvtk_write(s,filename,format);
  73. case '.obj'
  74. save_obj(s,filename);
  75. case {'.curv','.surf'}
  76. write_freesurfer_file(s,filename,format);
  77. case '.mz3'
  78. mz3_write(s,filename,true);
  79. otherwise
  80. error('Unknown file format.');
  81. end
  82. %==========================================================================
  83. % function save_js(s,filename)
  84. %==========================================================================
  85. function save_js(s,filename)
  86. % Vertices & faces
  87. %--------------------------------------------------------------------------
  88. trace = struct(...
  89. 'type','mesh3d',...
  90. 'x',s.vertices(:,1),...
  91. 'y',s.vertices(:,2),...
  92. 'z',s.vertices(:,3),...
  93. 'i',s.faces(:,1)-1,...
  94. 'j',s.faces(:,2)-1,...
  95. 'k',s.faces(:,3)-1);
  96. if isfield(s,'cdata') && ~isempty(s.cdata)
  97. if size(s.cdata,2) == 1
  98. trace.intensity = s.cdata(:,1);
  99. elseif size(s.cdata,2) == 3
  100. trace.vertexcolor = cell(1,size(trace.x,1));
  101. for i=1:numel(trace.vertexcolor)
  102. trace.vertexcolor{i} = sprintf('rgb(%d,%d,%d)',floor(s.cdata(i,:)*255));
  103. end
  104. end
  105. end
  106. data = {trace};
  107. %-Save as JS variable or JSON file
  108. %--------------------------------------------------------------------------
  109. if filename(end) == 's' % JS
  110. if exist('jsonencode','builtin')
  111. data = jsonencode(data);
  112. else
  113. data = spm_jsonwrite(data);
  114. end
  115. fid = fopen(filename,'wt');
  116. if fid == -1
  117. error('Unable to write file %s: permission denied.',filename);
  118. end
  119. fprintf(fid,'/*\n * JavaScript file saved by %s\n */\n\n','SPM'); % spm('Version')
  120. fprintf(fid,'/*\n <!DOCTYPE html><html><head><meta charset="utf-8"/>\n');
  121. fprintf(fid,' <script src="%s"></script>\n','https://cdn.plot.ly/plotly-latest.min.js');
  122. fprintf(fid,' </head><body>\n');
  123. fprintf(fid,' <div id="%s" style="height: %dpx;width: %dpx;"></div>\n','plotly',650,800);
  124. fprintf(fid,' <script type="text/javascript">\n*/\n');
  125. fprintf(fid,'var data=%s;\n',data);
  126. fprintf(fid,'/*\n </script>\n');
  127. fprintf(fid,' <script type="text/javascript">Plotly.plot("%s", data, {}, {});</script>\n','plotly');
  128. fprintf(fid,' </body></html>\n*/\n');
  129. fclose(fid);
  130. else % JSON
  131. if exist('jsonencode','builtin')
  132. fid = fopen(filename,'wt');
  133. if fid == -1
  134. error('Unable to write file %s: permission denied.',filename);
  135. end
  136. fprintf(fid,'%s',jsonencode(struct('data',{data},'layout',struct())));
  137. fclose(fid);
  138. else
  139. spm_jsonwrite(filename,struct('data',{data},'layout',struct()),struct('indent',' '));
  140. end
  141. end
  142. %==========================================================================
  143. % function save_dae(s,filename)
  144. %==========================================================================
  145. function save_dae(s,filename)
  146. o = @(x) blanks(x*3);
  147. % Split the mesh into connected components
  148. %--------------------------------------------------------------------------
  149. try
  150. C = spm_mesh_label(s.faces);
  151. d = [];
  152. for i=1:numel(unique(C))
  153. d(i).faces = s.faces(C==i,:);
  154. u = unique(d(i).faces);
  155. d(i).vertices = s.vertices(u,:);
  156. a = 1:max(d(i).faces(:));
  157. a(u) = 1:size(d(i).vertices,1);
  158. %a = sparse(1,double(u),1:1:size(d(i).vertices,1));
  159. d(i).faces = a(d(i).faces);
  160. end
  161. s = d;
  162. end
  163. % Open file for writing
  164. %--------------------------------------------------------------------------
  165. fid = fopen(filename,'wt');
  166. if fid == -1
  167. error('Unable to write file %s: permission denied.',filename);
  168. end
  169. % Prolog & root of the Collada XML file
  170. %--------------------------------------------------------------------------
  171. fprintf(fid,'<?xml version="1.0"?>\n');
  172. fprintf(fid,'<COLLADA xmlns="http://www.collada.org/2008/03/COLLADASchema" version="1.5.0">\n');
  173. % Assets
  174. %--------------------------------------------------------------------------
  175. fprintf(fid,'%s<asset>\n',o(1));
  176. fprintf(fid,'%s<contributor>\n',o(2));
  177. fprintf(fid,'%s<author_website>%s</author_website>\n',o(3),...
  178. 'http://www.fil.ion.ucl.ac.uk/spm/');
  179. fprintf(fid,'%s<authoring_tool>%s</authoring_tool>\n',o(3),'SPM');
  180. fprintf(fid,'%s</contributor>\n',o(2));
  181. fprintf(fid,'%s<created>%s</created>\n',o(2),datestr(now,'yyyy-mm-ddTHH:MM:SSZ'));
  182. fprintf(fid,'%s<modified>%s</modified>\n',o(2),datestr(now,'yyyy-mm-ddTHH:MM:SSZ'));
  183. fprintf(fid,'%s<unit name="millimeter" meter="0.001"/>\n',o(2));
  184. fprintf(fid,'%s<up_axis>Z_UP</up_axis>\n',o(2));
  185. fprintf(fid,'%s</asset>\n',o(1));
  186. % Image, Materials, Effects
  187. %--------------------------------------------------------------------------
  188. %fprintf(fid,'%s<library_images/>\n',o(1));
  189. fprintf(fid,'%s<library_materials>\n',o(1));
  190. for i=1:numel(s)
  191. fprintf(fid,'%s<material id="material%d" name="material%d">\n',o(2),i,i);
  192. fprintf(fid,'%s<instance_effect url="#material%d-effect"/>\n',o(3),i);
  193. fprintf(fid,'%s</material>\n',o(2));
  194. end
  195. fprintf(fid,'%s</library_materials>\n',o(1));
  196. fprintf(fid,'%s<library_effects>\n',o(1));
  197. for i=1:numel(s)
  198. fprintf(fid,'%s<effect id="material%d-effect" name="material%d-effect">\n',o(2),i,i);
  199. fprintf(fid,'%s<profile_COMMON>\n',o(3));
  200. fprintf(fid,'%s<technique sid="COMMON">\n',o(4));
  201. fprintf(fid,'%s<lambert>\n',o(5));
  202. fprintf(fid,'%s<emission>\n',o(6));
  203. fprintf(fid,'%s<color>%f %f %f %d</color>\n',o(7),[0 0 0 1]);
  204. fprintf(fid,'%s</emission>\n',o(6));
  205. fprintf(fid,'%s<ambient>\n',o(6));
  206. fprintf(fid,'%s<color>%f %f %f %d</color>\n',o(7),[0 0 0 1]);
  207. fprintf(fid,'%s</ambient>\n',o(6));
  208. fprintf(fid,'%s<diffuse>\n',o(6));
  209. fprintf(fid,'%s<color>%f %f %f %d</color>\n',o(7),[0.5 0.5 0.5 1]);
  210. fprintf(fid,'%s</diffuse>\n',o(6));
  211. fprintf(fid,'%s<transparent>\n',o(6));
  212. fprintf(fid,'%s<color>%d %d %d %d</color>\n',o(7),[1 1 1 1]);
  213. fprintf(fid,'%s</transparent>\n',o(6));
  214. fprintf(fid,'%s<transparency>\n',o(6));
  215. fprintf(fid,'%s<float>%f</float>\n',o(7),0);
  216. fprintf(fid,'%s</transparency>\n',o(6));
  217. fprintf(fid,'%s</lambert>\n',o(5));
  218. fprintf(fid,'%s</technique>\n',o(4));
  219. fprintf(fid,'%s</profile_COMMON>\n',o(3));
  220. fprintf(fid,'%s</effect>\n',o(2));
  221. end
  222. fprintf(fid,'%s</library_effects>\n',o(1));
  223. % Geometry
  224. %--------------------------------------------------------------------------
  225. fprintf(fid,'%s<library_geometries>\n',o(1));
  226. for i=1:numel(s)
  227. fprintf(fid,'%s<geometry id="shape%d" name="shape%d">\n',o(2),i,i);
  228. fprintf(fid,'%s<mesh>\n',o(3));
  229. fprintf(fid,'%s<source id="shape%d-positions">\n',o(4),i);
  230. fprintf(fid,'%s<float_array id="shape%d-positions-array" count="%d">',o(5),i,numel(s(i).vertices));
  231. fprintf(fid,'%f ',reshape(s(i).vertices',1,[]));
  232. fprintf(fid,'</float_array>\n');
  233. fprintf(fid,'%s<technique_common>\n',o(5));
  234. fprintf(fid,'%s<accessor count="%d" offset="0" source="#shape%d-positions-array" stride="3">\n',o(6),size(s(i).vertices,1),i);
  235. fprintf(fid,'%s<param name="X" type="float" />\n',o(7));
  236. fprintf(fid,'%s<param name="Y" type="float" />\n',o(7));
  237. fprintf(fid,'%s<param name="Z" type="float" />\n',o(7));
  238. fprintf(fid,'%s</accessor>\n',o(6));
  239. fprintf(fid,'%s</technique_common>\n',o(5));
  240. fprintf(fid,'%s</source>\n',o(4));
  241. fprintf(fid,'%s<vertices id="shape%d-vertices">\n',o(4),i);
  242. fprintf(fid,'%s<input semantic="POSITION" source="#shape%d-positions"/>\n',o(5),i);
  243. fprintf(fid,'%s</vertices>\n',o(4));
  244. fprintf(fid,'%s<triangles material="material%d" count="%d">\n',o(4),i,size(s(i).faces,1));
  245. fprintf(fid,'%s<input semantic="VERTEX" source="#shape%d-vertices" offset="0"/>\n',o(5),i);
  246. fprintf(fid,'%s<p>',o(5));
  247. fprintf(fid,'%d ',reshape(s(i).faces',1,[])-1);
  248. fprintf(fid,'</p>\n');
  249. fprintf(fid,'%s</triangles>\n',o(4));
  250. fprintf(fid,'%s</mesh>\n',o(3));
  251. fprintf(fid,'%s</geometry>\n',o(2));
  252. end
  253. fprintf(fid,'%s</library_geometries>\n',o(1));
  254. % Scene
  255. %--------------------------------------------------------------------------
  256. fprintf(fid,'%s<library_visual_scenes>\n',o(1));
  257. fprintf(fid,'%s<visual_scene id="VisualSceneNode" name="SceneNode">\n',o(2));
  258. for i=1:numel(s)
  259. fprintf(fid,'%s<node id="node%d">\n',o(3),i);
  260. fprintf(fid,'%s<instance_geometry url="#shape%d">\n',o(4),i);
  261. fprintf(fid,'%s<bind_material>\n',o(5));
  262. fprintf(fid,'%s<technique_common>\n',o(6));
  263. fprintf(fid,'%s<instance_material symbol="material%d" target="#material%d"/>\n',o(7),i,i);
  264. fprintf(fid,'%s</technique_common>\n',o(6));
  265. fprintf(fid,'%s</bind_material>\n',o(5));
  266. fprintf(fid,'%s</instance_geometry>\n',o(4));
  267. fprintf(fid,'%s</node>\n',o(3));
  268. end
  269. fprintf(fid,'%s</visual_scene>\n',o(2));
  270. fprintf(fid,'%s</library_visual_scenes>\n',o(1));
  271. fprintf(fid,'%s<scene>\n',o(1));
  272. fprintf(fid,'%s<instance_visual_scene url="#VisualSceneNode" />\n',o(2));
  273. fprintf(fid,'%s</scene>\n',o(1));
  274. % End of XML
  275. %--------------------------------------------------------------------------
  276. fprintf(fid,'</COLLADA>\n');
  277. % Close file
  278. %--------------------------------------------------------------------------
  279. fclose(fid);
  280. %==========================================================================
  281. % function save_idtf(s,filename)
  282. %==========================================================================
  283. function save_idtf(s,filename)
  284. o = @(x) blanks(x*3);
  285. % Compute normals
  286. %--------------------------------------------------------------------------
  287. if ~isfield(s,'normals')
  288. try
  289. s.normals = spm_mesh_normals(...
  290. struct('vertices',s.vertices,'faces',s.faces),true);
  291. catch
  292. s.normals = [];
  293. end
  294. end
  295. % Split the mesh into connected components
  296. %--------------------------------------------------------------------------
  297. try
  298. C = spm_mesh_label(s.faces);
  299. d = [];
  300. try
  301. if size(s.cdata,2) == 1 && (any(s.cdata>1) || any(s.cdata<0))
  302. mi = min(s.cdata); ma = max(s.cdata);
  303. s.cdata = (s.cdata-mi)/ (ma-mi);
  304. else
  305. end
  306. end
  307. for i=1:numel(unique(C))
  308. d(i).faces = s.faces(C==i,:);
  309. u = unique(d(i).faces);
  310. d(i).vertices = s.vertices(u,:);
  311. d(i).normals = s.normals(u,:);
  312. a = 1:max(d(i).faces(:));
  313. a(u) = 1:size(d(i).vertices,1);
  314. %a = sparse(1,double(u),1:1:size(d(i).vertices,1));
  315. d(i).faces = a(d(i).faces);
  316. d(i).mat = s.mat;
  317. try
  318. d(i).cdata = s.cdata(u,:);
  319. if size(d(i).cdata,2) == 1
  320. d(i).cdata = repmat(d(i).cdata,1,3);
  321. end
  322. end
  323. end
  324. s = d;
  325. end
  326. % Open file for writing
  327. %--------------------------------------------------------------------------
  328. fid = fopen(filename,'wt');
  329. if fid == -1
  330. error('Unable to write file %s: permission denied.',filename);
  331. end
  332. % FILE_HEADER
  333. %--------------------------------------------------------------------------
  334. fprintf(fid,'FILE_FORMAT "IDTF"\n');
  335. fprintf(fid,'FORMAT_VERSION 100\n\n');
  336. % NODES
  337. %--------------------------------------------------------------------------
  338. for i=1:numel(s)
  339. fprintf(fid,'NODE "MODEL" {\n');
  340. fprintf(fid,'%sNODE_NAME "%s"\n',o(1),sprintf('Mesh%04d',i));
  341. fprintf(fid,'%sPARENT_LIST {\n',o(1));
  342. fprintf(fid,'%sPARENT_COUNT %d\n',o(2),1);
  343. fprintf(fid,'%sPARENT %d {\n',o(2),0);
  344. fprintf(fid,'%sPARENT_NAME "%s"\n',o(3),'<NULL>');
  345. fprintf(fid,'%sPARENT_TM {\n',o(3));
  346. I = s(i).mat; % eye(4);
  347. for j=1:size(I,2)
  348. fprintf(fid,'%s',o(4)); fprintf(fid,'%f ',I(:,j)'); fprintf(fid,'\n');
  349. end
  350. fprintf(fid,'%s}\n',o(3));
  351. fprintf(fid,'%s}\n',o(2));
  352. fprintf(fid,'%s}\n',o(1));
  353. fprintf(fid,'%sRESOURCE_NAME "%s"\n',o(1),sprintf('Mesh%04d',i));
  354. %fprintf(fid,'%sMODEL_VISIBILITY "BOTH"\n',o(1));
  355. fprintf(fid,'}\n\n');
  356. end
  357. % NODE_RESOURCES
  358. %--------------------------------------------------------------------------
  359. for i=1:numel(s)
  360. fprintf(fid,'RESOURCE_LIST "MODEL" {\n');
  361. fprintf(fid,'%sRESOURCE_COUNT %d\n',o(1),1);
  362. fprintf(fid,'%sRESOURCE %d {\n',o(1),0);
  363. fprintf(fid,'%sRESOURCE_NAME "%s"\n',o(2),sprintf('Mesh%04d',i));
  364. fprintf(fid,'%sMODEL_TYPE "MESH"\n',o(2));
  365. fprintf(fid,'%sMESH {\n',o(2));
  366. fprintf(fid,'%sFACE_COUNT %d\n',o(3),size(s(i).faces,1));
  367. fprintf(fid,'%sMODEL_POSITION_COUNT %d\n',o(3),size(s(i).vertices,1));
  368. fprintf(fid,'%sMODEL_NORMAL_COUNT %d\n',o(3),size(s(i).normals,1));
  369. if ~isfield(s(i),'cdata') || isempty(s(i).cdata)
  370. c = 0;
  371. else
  372. c = size(s(i).cdata,1);
  373. end
  374. fprintf(fid,'%sMODEL_DIFFUSE_COLOR_COUNT %d\n',o(3),c);
  375. fprintf(fid,'%sMODEL_SPECULAR_COLOR_COUNT %d\n',o(3),0);
  376. fprintf(fid,'%sMODEL_TEXTURE_COORD_COUNT %d\n',o(3),0);
  377. fprintf(fid,'%sMODEL_BONE_COUNT %d\n',o(3),0);
  378. fprintf(fid,'%sMODEL_SHADING_COUNT %d\n',o(3),1);
  379. fprintf(fid,'%sMODEL_SHADING_DESCRIPTION_LIST {\n',o(3));
  380. fprintf(fid,'%sSHADING_DESCRIPTION %d {\n',o(4),0);
  381. fprintf(fid,'%sTEXTURE_LAYER_COUNT %d\n',o(5),0);
  382. fprintf(fid,'%sSHADER_ID %d\n',o(5),0);
  383. fprintf(fid,'%s}\n',o(4));
  384. fprintf(fid,'%s}\n',o(3));
  385. fprintf(fid,'%sMESH_FACE_POSITION_LIST {\n',o(3));
  386. fprintf(fid,'%d %d %d\n',s(i).faces'-1);
  387. fprintf(fid,'%s}\n',o(3));
  388. fprintf(fid,'%sMESH_FACE_NORMAL_LIST {\n',o(3));
  389. fprintf(fid,'%d %d %d\n',s(i).faces'-1);
  390. fprintf(fid,'%s}\n',o(3));
  391. fprintf(fid,'%sMESH_FACE_SHADING_LIST {\n',o(3));
  392. fprintf(fid,'%d\n',zeros(size(s(i).faces,1),1));
  393. fprintf(fid,'%s}\n',o(3));
  394. if c
  395. fprintf(fid,'%sMESH_FACE_DIFFUSE_COLOR_LIST {\n',o(3));
  396. fprintf(fid,'%d %d %d\n',s(i).faces'-1);
  397. fprintf(fid,'%s}\n',o(3));
  398. end
  399. fprintf(fid,'%sMODEL_POSITION_LIST {\n',o(3));
  400. fprintf(fid,'%f %f %f\n',s(i).vertices');
  401. fprintf(fid,'%s}\n',o(3));
  402. fprintf(fid,'%sMODEL_NORMAL_LIST {\n',o(3));
  403. fprintf(fid,'%f %f %f\n',s(i).normals');
  404. fprintf(fid,'%s}\n',o(3));
  405. if c
  406. fprintf(fid,'%sMODEL_DIFFUSE_COLOR_LIST {\n',o(3));
  407. fprintf(fid,'%f %f %f\n',s(i).cdata');
  408. fprintf(fid,'%s}\n',o(3));
  409. end
  410. fprintf(fid,'%s}\n',o(2));
  411. fprintf(fid,'%s}\n',o(1));
  412. fprintf(fid,'}\n');
  413. end
  414. % Close file
  415. %--------------------------------------------------------------------------
  416. fclose(fid);
  417. %==========================================================================
  418. % function save_obj(s,filename)
  419. %==========================================================================
  420. function save_obj(s,filename)
  421. % Open file for writing
  422. %--------------------------------------------------------------------------
  423. fid = fopen(filename,'wt');
  424. if fid == -1
  425. error('Unable to write file %s: permission denied.',filename);
  426. end
  427. % Vertices & faces
  428. %--------------------------------------------------------------------------
  429. fprintf(fid,'# Wavefront OBJ file saved by %s\n','SPM'); % spm('Version')
  430. fprintf(fid,'v %f %f %f\n',s.vertices');
  431. fprintf(fid,'f %d %d %d\n',s.faces');
  432. % Close file
  433. %--------------------------------------------------------------------------
  434. fclose(fid);
  435. %==========================================================================
  436. % function write_freesurfer_file(s,filename,format)
  437. %==========================================================================
  438. function write_freesurfer_file(s,filename,format)
  439. switch lower(format)
  440. case 'surf'
  441. fid = fopen(filename,'wb','ieee-be');
  442. if fid == -1, error('Cannot open "%s".',filename); end
  443. fwrite(fid,[255 255 254],'uchar');
  444. fprintf(fid,'created by @gifti on %s\n\n',...
  445. datestr(now,'ddd mmm dd HH:MM:SS yyyy'));
  446. fwrite(fid,size(s.vertices,1),'int32'); % nv
  447. fwrite(fid,size(s.faces,1),'int32'); % nf
  448. fwrite(fid,s.vertices','float32');
  449. fwrite(fid,s.faces'-1,'int32');
  450. fclose(fid);
  451. case 'curv'
  452. fid = fopen(filename,'wb','ieee-be');
  453. if fid == -1, error('Cannot open "%s".',filename); end
  454. fwrite(fid,[255 255 255],'uchar');
  455. fwrite(fid,size(s.cdata,1),'int32'); % nv
  456. if isfield(s,'faces')
  457. nf = size(s.faces,1);
  458. else
  459. nf = 0;
  460. end
  461. fwrite(fid,nf,'int32'); % nf
  462. fwrite(fid,size(s.cdata,2),'int32'); % n
  463. fwrite(fid,s.cdata','float32');
  464. fclose(fid);
  465. otherwise
  466. error('File format not supported.');
  467. end