M3Datei.cpp 6.7 KB

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