smcPars.y 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. %{
  2. #include <Engine/StdH.h>
  3. #include <Engine/Ska/ModelInstance.h>
  4. #include <Engine/Ska/AnimSet.h>
  5. #include <Engine/Ska/StringTable.h>
  6. #include <Engine/Base/ErrorReporting.h>
  7. #include <Engine/Base/Shell.h>
  8. #include <Engine/Templates/DynamicContainer.cpp>
  9. #include "ParsingSmbs.h"
  10. extern BOOL bRememberSourceFN;
  11. BOOL bOffsetAllreadySet = FALSE;
  12. %}
  13. %{
  14. #define YYERROR_VERBOSE 0
  15. // if error occurs in parsing
  16. void syyerror(char *str)
  17. {
  18. // just report the string
  19. _pShell->ErrorF("%s", str);
  20. };
  21. %}
  22. /* BISON Declarations */
  23. %union {
  24. int i;
  25. float f;
  26. const char *str;
  27. CModelInstance *pmi;
  28. float f6[6];
  29. }
  30. %token <f> c_float
  31. %token <i> c_int
  32. %token <str> c_string
  33. %token <pmi> c_modelinstance
  34. %type <f> float_const
  35. %type <i> int_const
  36. %type <pmi> k_PARENTBONE
  37. %type <f6> offset_opt
  38. %type <f6> offset
  39. %token k_SE_SMC
  40. %token k_SE_END
  41. %token k_NAME
  42. %token k_TFNM
  43. %token k_MESH
  44. %token k_SKELETON
  45. %token k_ANIMSET
  46. %token K_ANIMATION
  47. %token k_TEXTURES
  48. %token k_PARENTBONE
  49. %token k_OFFSET
  50. %token k_COLISION
  51. %token k_ALLFRAMESBBOX
  52. %token k_ANIMSPEED
  53. %token k_COLOR
  54. %start parent_model
  55. %%
  56. /*/////////////////////////////////////////////////////////
  57. * Global structure of the source file.
  58. */
  59. parent_model
  60. : offset_opt k_NAME c_string ';'
  61. {
  62. if(_yy_mi==0) {
  63. yyerror("_yy_mi = NULL");
  64. }
  65. // create new model instance
  66. // _yy_mi = CreateModelInstance($3);
  67. _yy_mi->SetName($3);
  68. // set its offset
  69. _yy_mi->SetOffset($1);
  70. // mark offset as read
  71. bOffsetAllreadySet = FALSE;
  72. // check if flag to remember source file name is set
  73. if(bRememberSourceFN)
  74. {
  75. // remember source file name
  76. _yy_mi->mi_fnSourceFile = CTString(SMCGetBufferName());
  77. }
  78. }
  79. '{' components '}'
  80. ;
  81. components
  82. : /*null*/
  83. | component components
  84. ;
  85. component
  86. : mesh
  87. | skeleton
  88. | animset_header
  89. | animation_opt
  90. | child_model
  91. | colision_header
  92. | all_frames_bbox_opt
  93. | mdl_color_opt
  94. ;
  95. mdl_color_opt
  96. : /*null*/
  97. | mdl_color
  98. ;
  99. mdl_color
  100. : k_COLOR c_int ';'
  101. {
  102. COLOR c = $2;
  103. // _yy_mi->SetModelColor($2);
  104. }
  105. ;
  106. colision_header
  107. : k_COLISION '{' colision_opt '}'
  108. {
  109. }
  110. ;
  111. colision_opt
  112. :/*null*/
  113. | colision_array
  114. ;
  115. colision_array
  116. : colision
  117. | colision_array colision
  118. ;
  119. colision
  120. : c_string '{' float_const ',' float_const ',' float_const ',' float_const ',' float_const ',' float_const ';' '}'
  121. {
  122. FLOAT3D vMin = FLOAT3D($3, $5, $7);
  123. FLOAT3D vMax = FLOAT3D($9,$11,$13);
  124. // add new colision box to current model instance
  125. _yy_mi->AddColisionBox($1,vMin,vMax);
  126. }
  127. ;
  128. all_frames_bbox_opt
  129. :/*null*/
  130. | all_frames_bbox
  131. ;
  132. all_frames_bbox
  133. : k_ALLFRAMESBBOX float_const ',' float_const ',' float_const ',' float_const ',' float_const ',' float_const ';'
  134. {
  135. // add new colision box to current model instance
  136. _yy_mi->mi_cbAllFramesBBox.SetMin(FLOAT3D($2, $4, $6));
  137. _yy_mi->mi_cbAllFramesBBox.SetMax(FLOAT3D($8,$10,$12));
  138. }
  139. ;
  140. offset_opt
  141. :/*null*/
  142. {
  143. // set offset with default offset values
  144. $$[0] = 0;
  145. $$[1] = 0;
  146. $$[2] = 0;
  147. $$[3] = 0;
  148. $$[4] = 0;
  149. $$[5] = 0;
  150. }
  151. | offset offset_opt
  152. {
  153. // return new offset
  154. memcpy($$,$1,sizeof(float)*6);
  155. }
  156. ;
  157. offset
  158. : k_OFFSET float_const ',' float_const ',' float_const ',' float_const ',' float_const ',' float_const ';'
  159. {
  160. // if offset is not set
  161. if(!bOffsetAllreadySet)
  162. {
  163. // set offset
  164. $$[0] = $2;
  165. $$[1] = $4;
  166. $$[2] = $6;
  167. $$[3] = $8;
  168. $$[4] = $10;
  169. $$[5] = $12;
  170. // mark it as set now
  171. bOffsetAllreadySet = TRUE;
  172. }
  173. }
  174. ;
  175. child_model
  176. : k_PARENTBONE c_string ';' offset_opt k_NAME c_string ';'
  177. {
  178. // get parent ID
  179. int iParentBoneID = ska_FindStringInTable($2);
  180. if(iParentBoneID<0) iParentBoneID=0;
  181. // remember current model instance in parent bone token
  182. $1 = _yy_mi;
  183. // set _yy_mi as new child
  184. _yy_mi = CreateModelInstance($6);
  185. // add child to parent model instance
  186. $1->AddChild(_yy_mi);
  187. // add offset
  188. _yy_mi->SetOffset($4);
  189. // set its parent bone
  190. _yy_mi->SetParentBone(iParentBoneID);
  191. //
  192. bOffsetAllreadySet = FALSE;
  193. // if flag to remember source file is set
  194. if(bRememberSourceFN)
  195. {
  196. // remember source name
  197. _yy_mi->mi_fnSourceFile = CTString(SMCGetBufferName());
  198. }
  199. }
  200. // read child components
  201. '{' components '}'
  202. {
  203. // set parent model instance to _yy_mi again
  204. _yy_mi = $1;
  205. }
  206. ;
  207. mesh
  208. : k_MESH k_TFNM c_string ';'
  209. {
  210. // add mesh to current model instance
  211. _yy_mi->AddMesh_t((CTString)$3);
  212. }
  213. opt_textures
  214. ;
  215. skeleton
  216. : k_SKELETON k_TFNM c_string ';'
  217. {
  218. // add skeleton to current model instance
  219. _yy_mi->AddSkeleton_t((CTString)$3);
  220. }
  221. ;
  222. animset_header
  223. : k_ANIMSET animset
  224. | k_ANIMSET '{' animset_array '}'
  225. ;
  226. animset_array
  227. : animset
  228. | animset_array animset
  229. ;
  230. animset
  231. : k_TFNM c_string ';'
  232. {
  233. // add animset to curent model instnce
  234. _yy_mi->AddAnimSet_t((CTString)$2);
  235. }
  236. ;
  237. animation_opt
  238. :/*null*/
  239. | animation
  240. ;
  241. animation
  242. : K_ANIMATION c_string ';'
  243. {
  244. // set new clear state in model instance
  245. _yy_mi->NewClearState(1);
  246. // get anim ID
  247. INDEX iAnimID = ska_GetIDFromStringTable($2);
  248. // add animation to curent model instance
  249. _yy_mi->AddAnimation(iAnimID,AN_LOOPING,1,0);
  250. }
  251. ;
  252. opt_textures
  253. : /*null*/
  254. | opt_textures textures
  255. ;
  256. textures
  257. : k_TEXTURES '{' textures_array'}'
  258. ;
  259. textures_array
  260. : /*null*/
  261. | textures_array texture
  262. ;
  263. texture
  264. : c_string k_TFNM c_string ';'
  265. {
  266. // add texture to current model instance
  267. _yy_mi->AddTexture_t((CTString)$3,$1,NULL);
  268. }
  269. ;
  270. float_const
  271. : c_float
  272. {
  273. $$ = $1;
  274. }
  275. | c_int
  276. {
  277. $$ = (float)$1;
  278. }
  279. ;
  280. int_const
  281. : c_int
  282. {
  283. $$ = $1;
  284. }
  285. ;
  286. %%