M3Datei.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. #include "M3Datei.h"
  2. #include "Datei.h"
  3. using namespace Framework;
  4. // Inhalt der M3Datei Klasse
  5. // Konstruktor
  6. M3Datei::M3Datei()
  7. {
  8. modelName = 0;
  9. modelPos = 0;
  10. }
  11. // Konstruktor
  12. // pfad: Der Pfad zur Datei
  13. M3Datei::M3Datei( const char *pfad )
  14. : M3Datei()
  15. {
  16. this->pfad = pfad;
  17. }
  18. // Konstruktor
  19. // pfad: Der Pfad zur Datei
  20. M3Datei::M3Datei( Text *pfad )
  21. : M3Datei( pfad->getText() )
  22. {
  23. pfad->release();
  24. }
  25. // Destruktor
  26. M3Datei::~M3Datei()
  27. {
  28. if( modelName )
  29. modelName->release();
  30. if( modelPos )
  31. modelPos->release();
  32. }
  33. // Setzt den Pfad zur Datei
  34. // pfad: Pfad zur Datei
  35. void M3Datei::setPfad( const char *pfad )
  36. {
  37. this->pfad = pfad;
  38. if( modelName )
  39. modelName = modelName->release();
  40. if( modelPos )
  41. modelPos = modelPos->release();
  42. }
  43. // Ließt grundlegende Informationen aus der Datei, die für ihre Verwendung benötigt werden
  44. void M3Datei::leseDaten()
  45. {
  46. if( modelName )
  47. modelName = modelName->release();
  48. if( modelPos )
  49. modelPos = modelPos->release();
  50. modelName = new RCArray< Text >();
  51. modelPos = new Array< __int64 >();
  52. Datei d;
  53. d.setDatei( pfad );
  54. if( !d.open( Datei::Style::lesen ) )
  55. return;
  56. unsigned char anz = 0;
  57. d.lese( (char*)&anz, 1 );
  58. for( int i = 0; i < anz; i++ )
  59. {
  60. char len = 0;
  61. d.lese( &len, 1 );
  62. char *n = new char[ len + 1 ];
  63. n[ (int)len ] = 0;
  64. d.lese( n, len );
  65. modelName->add( new Text( n ) );
  66. delete[] n;
  67. __int64 p = 0;
  68. d.lese( (char*)&p, 8 );
  69. modelPos->add( p );
  70. }
  71. d.close();
  72. }
  73. // Speichert 3D Modell Daten in der Datei
  74. // zMdr: Ein Zeiger auf die zu speichernden Daten ohne erhöhtem Reference Counter
  75. // name: Der Name, unter dem die Daten in der Datei gespeichert werden sollen
  76. // return: 1, falls das Modell gespeichert wurde. 0, falls ein fehler beim speichern auftrat
  77. bool M3Datei::saveModel( Model3DData *zMdr, Text *name )
  78. {
  79. bool ret = saveModel( zMdr, name->getText() );
  80. name->release();
  81. return ret;
  82. }
  83. // Speichert 3D Modell Daten in der Datei
  84. // zMdr: Ein Zeiger auf die zu speichernden Daten ohne erhöhtem Reference Counter
  85. // name: Der Name, unter dem die Daten in der Datei gespeichert werden sollen
  86. // return: 1, falls das Modell gespeichert wurde. 0, falls ein fehler beim speichern auftrat
  87. bool M3Datei::saveModel( Model3DData *zMdr, const char *name )
  88. {
  89. if( !modelName || !pfad.getLength() )
  90. return 0;
  91. if( hatModel( name ) && !removeModel( name ) )
  92. return 0;
  93. int anz = modelName->getEintragAnzahl();
  94. anz = modelName->getEintragAnzahl();
  95. Datei d;
  96. d.setDatei( pfad );
  97. if( !d.open( Datei::Style::lesen ) )
  98. return 0;
  99. Datei neu;
  100. neu.setDatei( pfad );
  101. neu.zPfad()->append( "0" );
  102. while( neu.existiert() )
  103. neu.zPfad()->append( "0" );
  104. if( !neu.open( Datei::Style::schreiben ) )
  105. {
  106. if( d.istOffen() )
  107. d.close();
  108. return 0;
  109. }
  110. modelName->add( new Text( name ) );
  111. int offs = textLength( name ) + 9;
  112. for( int i = 0; i < anz; i++ )
  113. modelPos->set( modelPos->get( i ) + offs, i );
  114. if( d.getSize() < 0 )
  115. modelPos->add( offs + 1 );
  116. else
  117. modelPos->add( d.getSize() + offs );
  118. anz++;
  119. char tmp = (char)anz;
  120. neu.schreibe( &tmp, 1 );
  121. for( int i = 0; i < anz; i++ )
  122. {
  123. char len = (char)modelName->z( i )->getLength();
  124. neu.schreibe( &len, 1 );
  125. neu.schreibe( modelName->z( i )->getText(), len );
  126. __int64 pos = modelPos->get( i );
  127. neu.schreibe( (char*)&pos, 8 );
  128. }
  129. if( d.existiert() )
  130. {
  131. d.setLPosition( modelPos->get( 0 ) - offs, 0 );
  132. __int64 dl = d.getSize() - d.getLPosition();
  133. char bytes[ 2048 ];
  134. while( dl )
  135. {
  136. int l = dl > 2048 ? 2048 : (int)dl;
  137. d.lese( bytes, l );
  138. neu.schreibe( bytes, l );
  139. dl -= l;
  140. }
  141. }
  142. d.close();
  143. /*char pAnz = zMdr->polygons->getEintragAnzahl();
  144. neu.schreibe( &pAnz, 1 );
  145. for( int p = 0; p < pAnz; p++ )
  146. {
  147. int vAnz = zMdr->polygons->get( p ).vertex->getEintragAnzahl();
  148. char textur = 1;
  149. for( int i = 0; i < vAnz; i++ )
  150. textur &= (char)zMdr->polygons->get( p ).tKordinaten->hat( i );
  151. neu.schreibe( &textur, 1 );
  152. neu.schreibe( (char*)&vAnz, 4 );
  153. for( int i = 0; i < vAnz; i++ )
  154. {
  155. float v = zMdr->polygons->get( p ).vertex->get( i ).x;
  156. neu.schreibe( (char*)&v, 4 );
  157. v = zMdr->polygons->get( p ).vertex->get( i ).y;
  158. neu.schreibe( (char*)&v, 4 );
  159. if( textur )
  160. {
  161. int t = zMdr->polygons->get( p ).tKordinaten->get( i ).x;
  162. neu.schreibe( (char*)&t, 4 );
  163. t = zMdr->polygons->get( p ).tKordinaten->get( i ).y;
  164. neu.schreibe( (char*)&t, 4 );
  165. }
  166. }
  167. }*/
  168. d.remove();
  169. neu.close();
  170. neu.umbenennen( pfad );
  171. leseDaten();
  172. return 1;
  173. }
  174. // Löscht ein 3D Modell aus der Datei
  175. // name: Der Name des Modells
  176. // return: 1, wenn das Modell gelöscht wurde. 0, wenn das Modell nicht gefunden wurde, oder ein fehler beim speichern auftrat
  177. bool M3Datei::removeModel( Text *name )
  178. {
  179. return 0;
  180. }
  181. // Löscht ein 3D Modell aus der Datei
  182. // name: Der Name des Modells
  183. // return: 1, wenn das Modell gelöscht wurde. 0, wenn das Modell nicht gefunden wurde, oder ein fehler beim speichern auftrat
  184. bool M3Datei::removeModel( const char *name )
  185. {
  186. return 0;
  187. }
  188. // Lähd ein 3D Modell aus der Datei
  189. // name: Der name des zu ladenden Modells
  190. // return: Die geladenen Daten
  191. Model3DData *M3Datei::ladeModel( Text *name ) const
  192. {
  193. return 0;
  194. }
  195. // Lähd ein 3D Modell aus der Datei
  196. // name: Der name des zu ladenden Modells
  197. // return: Die geladenen Daten
  198. Model3DData *M3Datei::ladeModel( const char *name ) const
  199. {
  200. return 0;
  201. }
  202. // überprft, ob ein bestimmtes 3D Modell in der Datei existiert
  203. // name: Der Name des zu suchenden 3D Modells
  204. // return: 1, wenn das Modell gefunden wurde. 0 sonst
  205. bool M3Datei::hatModel( const char *name ) const
  206. {
  207. return 0;
  208. }
  209. // ügibt die Anzahl der gespeicherten Modelle zurück
  210. int M3Datei::getModelAnzahl() const
  211. {
  212. return 0;
  213. }
  214. // Gibt den Namen eines Bestimmten Modells zurück
  215. // i: Der Index des Modells
  216. // return: Ein Zeiger aud den Namen des Modells ohne erhöhten Reference Counter
  217. Text *M3Datei::zModelName( int i ) const
  218. {
  219. return 0;
  220. }
  221. // Erhöht den Reference Counting Zähler.
  222. // return: this.
  223. M3Datei *M3Datei::getThis()
  224. {
  225. return 0;
  226. }
  227. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  228. // return: 0.
  229. M3Datei *M3Datei::release()
  230. {
  231. return 0;
  232. }