Model3DList.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "Model3DList.h"
  2. #include "Model3D.h"
  3. #include "Text.h"
  4. using namespace Framework;
  5. int Model3DList::id = 0;
  6. CRITICAL_SECTION Model3DList::cs;
  7. const char *Standart3DTypes::cube = "f_würfel";
  8. // Inhalt der Model3DList Klasse
  9. // Konstruktor
  10. Model3DList::Model3DList()
  11. {
  12. models = new RCArray< Model3DData >();
  13. names = new RCArray< Text >();
  14. ref = 1;
  15. }
  16. // Destruktor
  17. Model3DList::~Model3DList()
  18. {
  19. models->release();
  20. names->release();
  21. }
  22. // Fügt der Liste ein Model Hinzu
  23. // mdl: Das Model
  24. // name: Der name, unter dem das Model in der Liste gespeichert wird
  25. bool Model3DList::addModel( Model3DData *mdl, const char *name )
  26. {
  27. EnterCriticalSection( &cs );
  28. for( auto i = names->getArray(); i.set; i++ )
  29. {
  30. if( i.var->istGleich( name ) )
  31. {
  32. mdl->release();
  33. LeaveCriticalSection( &cs );
  34. return 0;
  35. }
  36. }
  37. mdl->id = id++;
  38. models->add( mdl );
  39. names->add( new Text( name ) );
  40. LeaveCriticalSection( &cs );
  41. return 1;
  42. }
  43. // Entfernt ein Model aus der Liste
  44. // name: Der Name des Models
  45. void Model3DList::removeModel( const char *name )
  46. {
  47. EnterCriticalSection( &cs );
  48. int index = 0;
  49. for( auto i = names->getArray(); i.set; i++ )
  50. {
  51. if( i.var->istGleich( name ) )
  52. {
  53. names->remove( index );
  54. models->remove( index );
  55. LeaveCriticalSection( &cs );
  56. return;
  57. }
  58. index++;
  59. }
  60. LeaveCriticalSection( &cs );
  61. }
  62. // Überprüft, ob unter einem bestimmten Namen ein Model abgespeichert wurde
  63. // name: Der Name
  64. // return: true, wenn ein Model mit dem Namen existiert
  65. bool Model3DList::hatModel( const char *name ) const
  66. {
  67. EnterCriticalSection( &cs );
  68. for( auto i = names->getArray(); i.set; i++ )
  69. {
  70. if( i.var->istGleich( name ) )
  71. {
  72. LeaveCriticalSection( &cs );
  73. return 1;
  74. }
  75. }
  76. LeaveCriticalSection( &cs );
  77. return 0;
  78. }
  79. // Gibt ein bestimmtes Model zurück
  80. // name: Der Name des Models
  81. Model3DData *Model3DList::getModel( const char *name ) const
  82. {
  83. EnterCriticalSection( &cs );
  84. int index = 0;
  85. for( auto i = names->getArray(); i.set; i++ )
  86. {
  87. if( i.var->istGleich( name ) )
  88. {
  89. LeaveCriticalSection( &cs );
  90. return models->get( index );
  91. }
  92. index++;
  93. }
  94. LeaveCriticalSection( &cs );
  95. return 0;
  96. }
  97. // Gibt ein bestimmtes Model ohne erhöhten Reference Counter zurück
  98. // name: Der Name des Models
  99. Model3DData *Model3DList::zModel( const char *name ) const
  100. {
  101. EnterCriticalSection( &cs );
  102. int index = 0;
  103. for( auto i = names->getArray(); i.set; i++ )
  104. {
  105. if( i.var->istGleich( name ) )
  106. {
  107. LeaveCriticalSection( &cs );
  108. return models->z( index );
  109. }
  110. index++;
  111. }
  112. LeaveCriticalSection( &cs );
  113. return 0;
  114. }
  115. // Erhöht den Reference Counting Zähler.
  116. // return: this.
  117. Model3DList *Model3DList::getThis()
  118. {
  119. ref++;
  120. return this;
  121. }
  122. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  123. // return: 0.
  124. Model3DList *Model3DList::release()
  125. {
  126. ref--;
  127. if( !ref )
  128. delete this;
  129. return 0;
  130. }
  131. // statische Funktionen
  132. // Initialisiert statische private member. Wird vom Framework automatisch aufgerufen.
  133. void Model3DList::init()
  134. {
  135. id = 0;
  136. InitializeCriticalSection( &cs );
  137. }
  138. // Löscht statische private member. Wird vom Framework automatisch aufgerufen.
  139. void Model3DList::destroy()
  140. {
  141. DeleteCriticalSection( &cs );
  142. }