3DSTATE.H
上传用户:cncdtg88
上传日期:2013-03-14
资源大小:10474k
文件大小:516k
源码类别:

射击游戏

开发平台:

Visual C++

  1. //
  2. // }
  3. STATE_IMPORT DWORD STATE_WINAPI STATE_polygon_get_first_patch(DWORD polygon_handle);
  4. //Returns the next patch. patch_polygon_handle could also be a regular polygon
  5. //that is not a patch, in this case the function will return the first patch
  6. //which is attached to this polygon or NULL if there aren't any patches attached.
  7. //
  8. //Example:
  9. // //Here is how to go through all the patches of a given polygon
  10. // for(DWORD poly=STATE_polygon_get_first_patch(polygon_handle); poly!=NULL; poly=STATE_polygon_get_next_patch(poly) )
  11. // {
  12. // //do some processing for each patch
  13. // }
  14. STATE_IMPORT DWORD STATE_WINAPI STATE_polygon_get_next_patch(DWORD patch_polygon_handle);
  15. //Returns the polygon to which the given patch was added.
  16. //if patch_polygon_handle is not a patch (a regular polygon) then the function returns NULL
  17. STATE_IMPORT DWORD STATE_WINAPI STATE_polygon_get_patch_father(DWORD patch_polygon_handle);
  18. // Function level of importance = Medium.
  19. //
  20. // The function turns OFF or ON the bilinear filtering for the given polygon
  21. // The effect is visible only when the 3D card is on.
  22. // Bilinear filtering is a technique for getting better looking textures. When bilinear 
  23. // filtering is ON, it removes the pixelization effect from close textures.
  24. // By default the bilinear mode for all polygons is set according to the 3D card settings
  25. // Using this function one can overide the default settings for specific polygons.
  26. // Here are some reasons why one might consider turning off bilinear filtering for specific polygons
  27. // - Some 3D card add a counter line around transparent textures when bilinera is used
  28. //  - Give the polygon a different look.
  29. // - When bilinear filtering is turned off, rendering is slightly faster.
  30. //
  31. // To change the default bilinear setting for all the polygons use:
  32. // STATE_3D_card_set_bilinear_filtering() 
  33. // parameters:
  34. // bilinear_mode:
  35. // ON  - The default. Turns on bilinear filtering.
  36. // OFF - Turns off bilinear filtering
  37. // BILINEAR_FOR_PRIMARY_TEXTURE_ONLY - Turns bilinear only for the primary texture (each polygon could have two textures, the primary and the secondary)
  38. // BILINEAR_FOR_PRIMARY_SECONDARY_ONLY -   Turns bilinear only for the secondary texture (each polygon could have two textures, the primary and the secondary)
  39. // BILINEAR_USE_3D_CARD_DEFAULTS - Use the setting as defined by STATE_3D_card_set_bilinear_filtering. This is the default option.
  40. //Example:
  41. // STATE_3D_card_set_bilinear_filtering(OFF);
  42. //
  43. // See also STATE_3D_card_set_bilinear_filtering()
  44. STATE_IMPORT void STATE_WINAPI STATE_polygon_set_bilinear_filtering(DWORD polygon_handle, int bilinear_mode);
  45. //----------------------------------------------------//
  46. //=========== T H E    P O I N T   A P I =============//
  47. //----------------------------------------------------//
  48. // About this API:
  49. // Every polygon is built from points. This API deals with those points.
  50. // Returns YES or NO.
  51. // YES , if the given handle is a point handle. NO if not.
  52. // If it is not a point handle , a message box will appear,
  53. // the title of this message box will be the parameter "function_asking"
  54. // if function_asking==NULL than no popup will be created.
  55. // See also IS_POINT()
  56. STATE_IMPORT int STATE_WINAPI STATE_point_is_point(DWORD point_handle, char *function_asking);
  57. // Returns the next point
  58. // use STATE_polygon_get_first_point() to get the first point
  59. //
  60. //Example: 
  61. //
  62. // //Go over all the points of a polygon
  63. // for(DWORD point=STATE_polygon_get_first_point(polygon_handle); point!=NULL ; point=STATE_point_get_next_point(point) ) 
  64. // {
  65. //
  66. //
  67. // }
  68. //
  69. STATE_IMPORT DWORD STATE_WINAPI STATE_point_get_next_point(DWORD point_handle); 
  70. // Gets the point (x,y,z) coordinate.
  71. //Please note that if the point belongs to a dynamic object then the returned (x,y,z) will be in OBJECT_SPACE.
  72. // To get the point in WORLD_SPACE you should write the following code:
  73. //
  74. // double xyz[3];
  75. // STATE_point_get_xyz(my_point, xyz);
  76. // double xyz_world_space[3]
  77. // STATE_object_convert_point_to_world_space(my_object, xyz, xyz_world_space);
  78. STATE_IMPORT void STATE_WINAPI STATE_point_get_xyz(DWORD point_handle, double xyz[3]); 
  79. // Sets the point (x,y,z) coordinate.
  80. // After changing the points of a polygon dont forget to call STATE_polygon_is_valid()
  81. // This call is needed for recalculating internal data of the polygon (such as the polygon's normal)
  82. //
  83. // Example:
  84. //
  85. // double xyz[3]={100,200,300};
  86. // STATE_point_set_xyz(my_point, xyz); 
  87. // STATE_polygon_is_valid(); //Update the polygon data (call this function after you have finished manipulating the polygon's point
  88. //
  89. //
  90. // Please note that if the point belongs to a dynamic object then the (x,y,z) should be in OBJECT_SPACE.
  91. // To get a x,y,z coorinate in OBJECT_SPACE you should write the following code:
  92. //
  93. // double xyz[3];
  94. // xyz[0]=100; xyz[1]=200; xyz[2]=300;  //setting the coordinate (world space)
  95. // double xyz_object_space[3]
  96. // STATE_object_convert_point_to_object_space(my_object, xyz, xyz_object_space);
  97. // STATE_point_set_xyz(my_point, xyz);
  98. // STATE_polygon_is_valid(); //Update the polygon data (call this function after you have finished manipulating the polygon's point)
  99. //
  100. STATE_IMPORT void STATE_WINAPI STATE_point_set_xyz(DWORD point_handle, double xyz[3]); 
  101. #define FIND_COORDINATE_AUTOMATICALLY  -1
  102. //Set the bitmap coordinates of the given points.
  103. //Examples:
  104. // A) //Attach the polygon's bitmap top left corner to the given point.
  105. // double xy[2]={0,0}
  106. // STATE_point_set_bitmap_xy(pnt1,owner_polygon_handle, xy);
  107. //
  108. // B) //Attach the polygon's bitmap bottom right corner to the given point.
  109. // double xy[2]={1,1}
  110. // STATE_point_set_bitmap_xy(pnt1,owner_polygon_handle, xy);
  111. //
  112. // C) //This tells the engine to figure out on his own to witch part of the bitmap
  113. // //this point should be attached. This is very useful since sometimes the right bitmap coord
  114. // //could look like 0.5543222323 etc... For example if our polygon has a trapez shape or a pentagon shape
  115. // //Please note that in order for the engine to figure out on his own it must previously give it
  116. // //Three other coords. The actual calculation of all the missing coordinates is done when
  117. // //We call STATE_engine_add_polygon()
  118. // double xy[2]={FIND_COORDINATE_AUTOMATICALLY, FIND_COORDINATE_AUTOMATICALLY}
  119. // STATE_point_set_bitmap_xy(pnt1,owner_polygon_handle, xy);
  120. // D) // Like "C" only that one coordinate element  we give and one we ask the engine to find.
  121. // // In this example we ask to find the y bitmap coordinate. In order for the engine to find it on its own
  122. // // We must give him befroehand three other y values.
  123. // double xy[2]={0, FIND_COORDINATE_AUTOMATICALLY}
  124. // STATE_point_set_bitmap_xy(pnt1,owner_polygon_handle, xy);
  125. //
  126. // E) How to tile a bitmap over a polygon. Lets say we have
  127. // a square polygon and we want to tile a bitmap .In this example it will be tiled 5x5 .
  128. //
  129. // double xy[2]={0, 0}
  130. // STATE_point_get_bitmap_xy(pnt1, xy); //The top left
  131. // xy[0]=5;
  132. // STATE_point_set_bitmap_xy(pnt2,owner_polygon_handle, xy); //The top right
  133. // xy[1]=5;
  134. // STATE_point_set_bitmap_xy(pnt3,owner_polygon_handle, xy); //The bottom right. xy==[5,5]
  135. // xy[0]=FIND_COORDINATE_AUTOMATICALLY;
  136. // xy[1]=FIND_COORDINATE_AUTOMATICALLY;
  137. // STATE_point_set_bitmap_xy(pnt4,owner_polygon_handle, xy); //We have already three points so the engine
  138. //   //can figure out the rest on its own. In this case
  139. //   //If our polygon is a square it should calculate xy={0,5}
  140. //   //It is better to let the engine handle the forth point and above
  141. //   //to avoid mistakes.
  142. STATE_IMPORT void STATE_WINAPI STATE_point_set_bitmap_xy(DWORD point_handle, DWORD owner_polygon_handle ,double xy[2]); 
  143. STATE_IMPORT void STATE_WINAPI STATE_point_get_bitmap_xy(DWORD point_handle, double xy[2]); 
  144. //The same as STATE_point_set_bitmap_xy() just for the second bitmap.
  145. //See also STATE_polygon_set_second_bitmap()
  146. STATE_IMPORT void STATE_WINAPI STATE_point_set_second_bitmap_xy(DWORD point_handle, DWORD owner_polygon_handle ,double xy[2]); 
  147. STATE_IMPORT void STATE_WINAPI STATE_point_get_second_bitmap_xy(DWORD point_handle, double xy[2]); 
  148. // This function will return the rgb values of the point
  149. // Red will be returned in rgb[0] 
  150. // Green will be returned in rgb[1] 
  151. // Blue will be returned in rgb[2] 
  152. // Note that these values are only relevant with hardware rendering.
  153. // The default is (255,255,255).
  154. // By changing the rgb value we can create light and atmospheric effects.
  155. //
  156. // How the rgb values are combined with the texture color and the polygon color
  157. // to form the final color of each pixel:
  158. // ----------------------------------------------------------------------------
  159. // The final color of a pixel in a polygon is
  160. // an outcome of the rgb values of the vertexes and the polygon texture or color
  161. // The rgb of the vertexes is interpolated for every pixel of the polygon
  162. // The interpolated value is multiplied by the texture color of every pixel.
  163. // (If there is no texture then it is multiplied by the color of the polygon)
  164. // Before multiplying the rgb is converted to a 0 till 1 scale.
  165. // Example: Lets say we have a red polygon with its color set to (240,10,10)
  166. // Lets assume that this is a triangle and that the rgb value of the vertexes is 
  167. // (255,0,0 ) , (0,255,0) , (0,0,255). If we take a point in the center of the polygon
  168. // then the interpolated value from the three vertexes will be something like (83,83,83)
  169. // when 83 is converted from 0-255 scale to 0-1 scale we get that the interpolated value
  170. // is (0.33, 0.33, 0.33). Now let multiply this value with the color of the polygon
  171. // we get: (0.33, 0.33, 0.33) * (240, 10, 10) == (80, 3, 3)
  172. // The result pixel will be (80,3,3)
  173. //
  174. // Special cases.
  175. // --------------
  176. // 1) If the RGB value of all the vertexes is (255,255,255)
  177. // Then it wont have any effect since in scale of [0-1]
  178. // it will become (1,1,1) and then the multiplication wont change
  179. // the value of the pixel
  180. // 2) If the polygon has no bitmap and its color is white (255,255,255)
  181. // In this case the rgb values of the vertexes determine alone the color
  182. // of the final pixel. This is also known as Gouraud shading
  183. //
  184. STATE_IMPORT void STATE_WINAPI STATE_point_get_rgb(DWORD point_handle, BYTE rgb[3]);
  185. // This function will set the rgb values of the point
  186. // Red should be given in rgb[0] 
  187. // Green should be given in rgb[1] 
  188. // Blue should be given in rgb[2] 
  189. // Note that these values are only relevant with hardware rendering.
  190. // By changing the rgb value we can create light and atmospheric effects.
  191. // The light API is based on this function. Usually one would
  192. // use the light API function though sometimes it nice to have the direct control
  193. // for creating special effects.
  194. //
  195. // How the rgb values are combined with the texture color and the polygon color
  196. // to form the final color of each pixel:
  197. // ----------------------------------------------------------------------------
  198. // The final color of a pixel in a polygon is
  199. // an outcome of the rgb values of the vertexes and the polygon texture or color
  200. // The rgb of the vertexes is interpolated for every pixel of the polygon
  201. // The interpolated value is multiplied by the texture color of every pixel.
  202. // (If there is no texture then it is multiplied by the color of the polygon)
  203. // Before multiplying the rgb is converted to a 0 till 1 scale.
  204. // Example: Lets say we have a red polygon with its color set to (240,10,10)
  205. // Lets assume that this is a triangle and that the rgb value of the vertexes is 
  206. // (255,0,0 ) , (0,255,0) , (0,0,255). If we take a point in the center of the polygon
  207. // then the interpolated value from the three vertexes will be something like (83,83,83)
  208. // when 83 is converted from 0-255 scale to 0-1 scale we get that the interpolated value
  209. // is (0.33, 0.33, 0.33). Now let multiply this value with the color of the polygon
  210. // we get: (0.33, 0.33, 0.33) * (240, 10, 10) == (80, 3, 3)
  211. // The result pixel will be (80,3,3)
  212. //
  213. // Special cases.
  214. // --------------
  215. // 1) If the RGB value of all the vertexes is (255,255,255)
  216. // Then it wont have any effect since in scale of [0-1]
  217. // it will become (1,1,1) and then the multiplication wont change
  218. // the value of the pixel
  219. // 2) If the polygon has a bitmap and its color is white (255,255,255)
  220. // In this case the rgb values of the vertexes determine alone the color
  221. // of the final pixel. This is also known as Gouraud shading
  222. //
  223. // See also STATE_polygon_set_light()
  224. STATE_IMPORT void STATE_WINAPI STATE_point_set_rgb(DWORD point_handle, DWORD father_polygon, BYTE rgb[3]);
  225. // relevant only for bitmap fill
  226. // 100 means the same brightness as the original bitmap
  227. // 200 means twice as bright as the original bitmap
  228. // 50 is half bright as the original
  229. // see also:
  230. // STATE_polygon_get_brightness()
  231. // STATE_polygon_set_brightness()
  232. // STATE_polygon_is_uniform_brightness()
  233. // STATE_point_get_brightness()
  234. STATE_IMPORT double STATE_WINAPI STATE_point_get_brightness(DWORD point_handle); 
  235. // note that if not all the points have the same brightness value
  236. // the rendering of this polygon will be slower.
  237. // relevant only for bitmap fill
  238. // 100 means the same brightness as the original bitmap
  239. // 200 means twice as bright as the original bitmap
  240. // 50 is half bright as the original
  241. // see also:
  242. // STATE_polygon_get_brightness()
  243. // STATE_polygon_set_brightness()
  244. // STATE_polygon_is_uniform_brightness()
  245. // STATE_point_get_brightness()
  246. STATE_IMPORT void STATE_WINAPI STATE_point_set_brightness(DWORD point_handle, double value); 
  247. //The point's normal is relevant only when using light (through the STATE_light_ API)
  248. //The following are three cases where you might want to modify the points normal
  249. // 1) If it is needed to sharpen the contact lines of polygons (see example below)
  250. //   in order to get better illumination of objects such as rooms boxes etc. 
  251. // 2) If one is writing his own lighting module
  252. // 3) If one is writing a file format converter (from or to STATE).
  253. //
  254. //The normal of a point is set internally to the average of the normals of the adjacent surfaces.
  255. //For example, if we have model of a room (a cube) the normal of a point on the floor
  256. //will point to the center of the cube this is because the coordinates of a point on the floor
  257. //exists in three polygons. The floor polygon and two adjacent walls.
  258. //The average of the normals of these three polygons is a normal that points to the center of the cube.
  259. //Please note that inside the engine a cube is built from 6 polygons each contains
  260. //4 points, so a cube is built from 24 points (and NOT 8).
  261. //Because of the fact that the normal of each point is the average of the adjacent
  262. //it results that points that have the same coordinates will have the same adjacent polygons
  263. //and therefore the same point normal. In other words point that have the same X,Y,Z coordinates
  264. //will also have the same normal.
  265. //
  266. //Why do we need points to have a normal ? What is it good for.
  267. //-------------------------------------------------------------
  268. //The point normal helps a lot in making polygonal shapes to look more rounded
  269. //while lighting the model polygons. Since points with the same X,Y,Z coordinates but on
  270. //different polygons have the same point normal , they will also get the same color
  271. //while the object is lighted and this will hide the connecting line between
  272. //any two polygons.
  273. //
  274. //
  275. //When saving a world on the disk (using STATE_engine_save() or WorldBuilder()
  276. //The engine automatically calculates the polygons normal. This means that if you
  277. //use STATE_point_set_normal() to modify the normals you will then loose
  278. //your changes when the world is saved. To keep your changes
  279. //call STATE_engine_save() with the flag: SAVE_WITHOUT_CALCULATING_POINT_NORMALS
  280. //
  281. // Parameters:
  282. //
  283. // point_handle: a handle to a point.
  284. //
  285. // normal: a three values in the range of [-1  -  1] that corresponds with the
  286. // X,Y,Z values to be set (normal[0] is the X value)
  287. // Note that the normal is normalized internally so values such as Normal= {10,0, -20}
  288. // can also be used to set a normal
  289. //
  290. //  Note that internally the engine uses only 24 bits for the normal X,Y,Z values
  291. //  (for example, three double values would occupied 8*8*3=192 bits)
  292. //  This means that if one calls STATE_point_set_normal() with a normal_x == 0.123456789
  293. // then internally it will be rounded to something like 0.123
  294. //
  295. // Return Value: OK or VR_ERROR.
  296. //
  297. // Example:
  298. //
  299. // A) double normal[3]={1,0,0};
  300. // STATE_point_set_normal(point_handle, normal);
  301. //
  302. // B)
  303. // The following example will set all the points normal to the same value
  304. // of their respective polygon. This will make the edges of the polygon much sharper
  305. // This effect is good for lighting a room were there should be a visible difference
  306. // between the light that the floor and the wall receive. 
  307. //
  308. //     for(DWORD poly=STATE_polygon_get_first_polygon(); poly!=NULL; poly=STATE_polygon_get_next(poly) ) {
  309. //    double normal[4]; //The normal is the three first values
  310. //    STATE_polygon_get_plane(poly, normal);
  311. //    for(DWORD point=STATE_polygon_get_first_point(poly); point!=NULL ; point=STATE_point_get_next_point(point) ) {
  312. //    STATE_point_set_normal(point, normal);
  313. //    }
  314. //   
  315. //    }
  316. //
  317. // See also STATE_point_get_normal()
  318. STATE_IMPORT int STATE_WINAPI STATE_point_set_normal(DWORD point_handle, double normal[3]); 
  319. // For more information see STATE_point_set_normal()
  320. //
  321. // Return Value: OK or VR_ERROR.
  322. //
  323. // Example:
  324. //
  325. // double normal[3];
  326. // STATE_point_get_normal(point_handle, normal);
  327. STATE_IMPORT int STATE_WINAPI STATE_point_get_normal(DWORD point_handle, double normal[3]); 
  328. //-----------------------------------------------------//
  329. //======== T H E    G R O U P   A P I =================//
  330. //-----------------------------------------------------//
  331. // This API is used in editor mode to manipulate groups of polygons
  332. // See also the OBJECT API for manipulating things in viewer_mode mode.
  333. // With this API you can group polygons together. 
  334. // Example,
  335. // say we have a room with three tables inside. Each table has four legs
  336. // and each leg has 6 polygons. We will probably like to build it like that:
  337. // Group "leg" contains the six polygons
  338. // group "table" which will include the four "leg" groups and the table top polygons
  339. // group "room" which will include the three tables and the walls polygons
  340. // A general note for most of the functions in this API:
  341. // After a new group is created, polygons can be associated with this group
  342. // by calling STATE_polygon_set_group()
  343. // IMPORTANT: if the polygons that are associated with the group are not part of the
  344. //   world (after creating a new polygon, we can add it to the world by calling STATE_engine_add_polygon() )
  345. //   most of the function in the group API wont work for those polygons.
  346. // Returns YES or NO.
  347. // YES , if the given handle is a group handle. NO if not.
  348. // If it is not a group handle , a message box will appear,
  349. // the title of this message box will be the parameter "function_asking"
  350. // if function_asking==NULL than no popup will be created.
  351. // See also IS_GROUP()
  352. // NOTE, unlike all the other IS_xxx function this function consider a NULL
  353. // as a legal handle, since a NULL group means the whole world.
  354. STATE_IMPORT int STATE_WINAPI STATE_group_is_group(DWORD group_handle, char *function_asking);
  355. // returns a handle of the newly created group
  356. // After a new group is created, polygons can be associated with this group
  357. // by calling STATE_polygon_set_group()
  358. // IMPORTANT: if the polygons that are associated with the group are not part of the
  359. //   world (after creating a new polygon, we can add it to the world by calling STATE_engine_add_polygon() )
  360. //   most of the function in the group API wont work for those polygons.
  361. STATE_IMPORT DWORD STATE_WINAPI STATE_group_create(char *name);
  362. // Just runs on the list of all the existing groups
  363. STATE_IMPORT DWORD STATE_WINAPI STATE_group_get_first_group(void);
  364. STATE_IMPORT DWORD STATE_WINAPI STATE_group_get_next(DWORD group_handle);
  365. STATE_IMPORT DWORD STATE_WINAPI STATE_group_get_using_name(char *name);
  366. STATE_IMPORT DWORD STATE_WINAPI STATE_group_get_first_polygon(DWORD group_handle);
  367. STATE_IMPORT DWORD STATE_WINAPI STATE_group_get_next_polygon(DWORD group_handle, DWORD polygon_handle);
  368. STATE_IMPORT DWORD STATE_WINAPI STATE_group_get_father_group(DWORD group_handle);
  369. // We can call this function with father_group==NULL
  370. // This will mean that this group is at the top of the hierarchy and it doesnt belong to any other group.
  371. // If the function fails it is most likly that we tried to make a loop in hierarchy of the groups
  372. // (for example, groupA father is groupB. groupB father is groupC, and groupC father is groupA ...)
  373. // Returns OK or VR_ERROR.
  374. //
  375. // Example:
  376. // STATE_group_set_father_group(leg_of_a_chair_group, chair_group);
  377. STATE_IMPORT int STATE_WINAPI STATE_group_set_father_group(DWORD group_handle, DWORD father_group);
  378. // Returns whether groupA is included in groupB.
  379. // A NULL group_handle means the whole world
  380. // Return value: Returns YES or NO. 
  381. //
  382. // Note the following examples: 
  383. // 1) If groupA_handle==groupB_handle returns YES
  384. // 2) If groupB_handle==NULL returns YES
  385. //
  386. // Parameters:
  387. // groupA_handle, groupB_handle: checks wheter groupA belongs to groupB
  388. //
  389. // See also STATE_group_is_groupA_included_in_enabled_parts_of_groupB();
  390. // Version note:
  391. // In version 5.0 and before STATE_group_is_groupA_included_in_groupB() was identical to
  392. // STATE_group_is_groupA_included_in_enabled_parts_of_groupB(). In other words, in old version 
  393. // there was only one function which behaved exactly as STATE_group_is_groupA_included_in_enabled_parts_of_groupB()
  394. //
  395. STATE_IMPORT int STATE_WINAPI STATE_group_is_groupA_included_in_groupB(DWORD groupA_handle, DWORD groupB_handle);
  396. // Checks whether one group belongs to enabled parts of another group.
  397. // (disabled parts are subgroups that are disabled. See STATE_group_disable() )
  398. // A NULL group_handle means the whole world
  399. // Return value: Returns YES or NO. 
  400. // Note the following examples: 
  401. // 1) If groupA_handle==groupB_handle returns YES
  402. // 2) If groupB_handle==NULL it will return YES only if groupA does not belong to a disabled group.
  403. // 3) If groupA belongs to a disabled group that belongs to groupB then returns NO 
  404. //
  405. // Parameters:
  406. // groupA_handle, groupB_handle: checks wheter groupA belongs to groupB
  407. //
  408. // Example:
  409. // //check if a polygon belongs to a disabled group
  410. // DWORD my_group=STATE_polygon_get_group(my_polygon)
  411. // if(STATE_group_is_groupA_included_in_enabled_parts_of_groupB( my_group, NULL)==NO) {
  412. // //my_group belongs to a disabled group !!!
  413. // }
  414. //
  415. // See also STATE_group_is_groupA_included_in_groupB()
  416. //
  417. // Version note:
  418. // In version 5.0 and before STATE_group_is_groupA_included_in_groupB() was identical to
  419. // STATE_group_is_groupA_included_in_enabled_parts_of_groupB(). In other words, in old version 
  420. // there was only one function which behaved exactly as STATE_group_is_groupA_included_in_enabled_parts_of_groupB()
  421. //
  422. STATE_IMPORT int STATE_WINAPI STATE_group_is_groupA_included_in_enabled_parts_of_groupB(DWORD groupA_handle, DWORD groupB_handle);
  423. // Returns the name of the group.
  424. // The function returns a pointer to the name which is stored internally inside the 3D Engine
  425. // Visual Basic users should use STATE_entity_get_name() instead.
  426. // See also STATE_entity_get_namel()
  427. STATE_IMPORT char *STATE_WINAPI STATE_group_get_name(DWORD group_handle);
  428. // A NULL group_handle will get the rotation reference point of the whole world
  429. // This is the point that all the rotations will use as the center of rotation
  430. STATE_IMPORT void STATE_WINAPI STATE_group_get_rotate_reference_point(DWORD group_handle, double center[3]);
  431. // A NULL group_handle will get the rotation reference point of the whole world
  432. // This is the point that all the rotations will use as the center of rotation
  433. // see also STATE_object_set_rotation_center()
  434. STATE_IMPORT void STATE_WINAPI STATE_group_set_rotate_reference_point(DWORD group_handle, double center[3]);
  435. // A NULL group_handle will get the center of mass of all the world
  436. // The operations set_location and move are done according to the center of mass
  437. // This function calls STATE_group_get_bounding_box() and then
  438. // calculates the center of the box.
  439. STATE_IMPORT void STATE_WINAPI STATE_group_get_center_of_mass(DWORD group_handle, double center[3]);
  440. // box[0][0] is the minimum X
  441. // box[0][1] is the minimum Y
  442. // box[0][2] is the minimum Z
  443. // box[1][0] is the max X 
  444. // box[1][1] is the max Y
  445. // box[1][2] is the max Z
  446. // This function is not very speedy 
  447. // Unlike most of the get function which just return a value
  448. // this function makes all the calculation going over all the vertexes
  449. // in the group.
  450. STATE_IMPORT void STATE_WINAPI STATE_group_get_bounding_box(DWORD group_handle, double box[2][3]);
  451. STATE_IMPORT void STATE_WINAPI STATE_group_set_name(DWORD group_handle, char *name);
  452. // A NULL group_handle means the whole world
  453. //
  454. // Reamarks:
  455. // Polygons
  456. STATE_IMPORT int STATE_WINAPI STATE_group_get_number_of_polygons(DWORD group_handle);
  457. // Rotates a group around its rotation center. 
  458. // To set the rotation center call: STATE_group_set_rotate_reference_point()
  459. // Groups that include a rotated polygon (See STATE_polygon_is_rotated ) cannot
  460. // be rotated using this function (You can call this function but it will have no effect)
  461. //
  462. // Parameters:
  463. // group_handle:
  464. // A NULL group_handle means the whole world
  465. //
  466. // degrees: In how many degrees to rotate the group. 
  467. //
  468. // space_flag: CAMERA_SPACE, OBJECT_SPACE, WORLD_SPACE
  469. // axis_flag:  0 for the X axis. 1 for the Y axis. 2 for the Z axis
  470. //
  471. // see also STATE_group_is_rotation_enabled()
  472. // STATE_group_set_rotate_reference_point()
  473. // STATE_group_get_center_of_mass()
  474. STATE_IMPORT void STATE_WINAPI STATE_group_rotate(DWORD group_handle, double degrees, int space_flag, int axis_flag);
  475. // A NULL group_handle means the whole world
  476. STATE_IMPORT void STATE_WINAPI STATE_group_rotate_using_matrix(DWORD group_handle, double rotate_matrix[3][3]);
  477. STATE_IMPORT void STATE_WINAPI STATE_group_transform_using_matrix4x4(DWORD group_handle, double trans_matrix[4][4]);
  478. // A NULL group_handle means the whole world
  479. // moves the center of mass of the group to the given location
  480. // Note that there is no STATE_group_get_location(), instead use
  481. // STATE_group_get_center_of_mass().
  482. STATE_IMPORT void STATE_WINAPI STATE_group_set_location(DWORD group_handle, double location[3]);
  483. // ZZZ
  484. // I am about to cancel this function since it is the same as
  485. // STATE_group_get_center_of_mass().
  486. // mean while I leave it just so I can link to the executable
  487. STATE_IMPORT void STATE_WINAPI STATE_group_get_location(DWORD group_handle, double *X, double *Y, double *Z);
  488. // A NULL group_handle means the whole world
  489. // moves all the vertex belonging to the group. The result is that the
  490. // center of mass also moves with the given step 
  491. // space flag could be: CAMERA_SPACE, OBJECT_SPACE, WORLD_SPACE
  492. // Note that this function does not update the rotation center of the group
  493. // This means that if you use STATE_group_rotate() after moving the group 
  494. // the rotation center will stay as before. See also STATE_group_set_rotate_reference_point()
  495. // STATE_group_get_rotate_reference_point()
  496. STATE_IMPORT void STATE_WINAPI STATE_group_move(DWORD group_handle, double step[3], int space_flag);
  497. // A NULL group_handle means the whole world
  498. // space flag could be: CAMERA_SPACE, OBJECT_SPACE, WORLD_SPACE
  499. STATE_IMPORT void STATE_WINAPI STATE_group_scale(DWORD group_handle, int space_flag,double scale_x, double scale_y, double scale_z);
  500. //Get the width, height and depth of the group. Please note that
  501. //The dimensions will be returned inside the parameter "dimension"
  502. // dimension[0] will become the depth
  503. // dimension[1] will be the width
  504. //dimension[2] will be the height
  505. //the dimensions are according to the bottom and the front of the group.
  506. //To declarea polygon as being the bottom of the group see those function
  507. // STATE_polygon_set_orientation()
  508. //Returns OK or VR_ERROR;
  509. //Example:
  510. // double size[3];
  511. // STATE_group_get_dimensions(my_group, size);
  512. STATE_IMPORT int STATE_WINAPI STATE_group_get_dimensions(DWORD group_handle, double dimensions[3]);
  513. // deletes the group but not the polygon included
  514. // group handle cannot be NULL
  515. // Make sure you dont use the handle after it was ungrouped.
  516. // Example:
  517. // //The example shows how to go over all the polygons that belong to several group
  518. // //Note that if we would go over all the polygons of the first group 
  519. // //and then over all the polygons of the second group we might go over some polygon
  520. // //twice since it could be for example that groupA belongs to groupB
  521. // //and therefore by going over all the polygons of groupB will also go
  522. // //over all the polygons of groupA. The code below show how to do it right so we 
  523. // //go over each polygon only once. We do it by grouping several objects together and then ungroup them back
  524. //
  525. // DWORD top_group=STATE_group_creare("Top group");
  526. // STATE_group_set_father_group(grpA, top_group);
  527. // STATE_group_set_father_group(grpB, top_group);
  528. // STATE_group_set_father_group(grpC, top_group);
  529. // for( DWORD poly=STATE_group_get_first_polygon(top_group); poly!=NULL; poly=STATE_group_get_next_polygon(poly) ) {
  530. //
  531. // // Your code here ....
  532. // }
  533. //
  534. // STATE_group_ungroup(top_group); // We can now delete the top group if we want to.
  535. // my_group=NULL; //For safty since we cant use it anymore.
  536. STATE_IMPORT void STATE_WINAPI STATE_group_ungroup(DWORD group_handle);
  537. // deletes all the polygons that belong to this group
  538. // and all the groups that belong to this group
  539. // return the number of polygons that were deleted
  540. // A NULL group_handle will delete the whole world.
  541. STATE_IMPORT int STATE_WINAPI STATE_group_delete_members(DWORD group_handle);
  542. // Returns YES or NO.
  543. // The static/dynamic properties are relevant when we load the world
  544. // in viewer mode. Only objects that are declared dynamic (not static) in
  545. // editor mode will be able to move (using the object API)
  546. // see also STATE_group_set_static(), STATE_group_set_dynamic()
  547. STATE_IMPORT int STATE_WINAPI STATE_group_is_static(DWORD group_handle);
  548. // The static/dynamic properties are relevant when we will load the world
  549. // in viewer mode. Only objects that are declared dynamic (not static) in
  550. // editor mode will be able to move (using the object API)
  551. // see also STATE_group_is_static(), STATE_group_set_dynamic()
  552. STATE_IMPORT void STATE_WINAPI STATE_group_set_static(DWORD group_handle);
  553. // The static/dynamic properties are relevant when we will load the world
  554. // in viewer mode. Only objects that are declared dynamic (not static) in
  555. // editor mode will be able to move (using the object API)
  556. // see also STATE_group_set_static(), STATE_group_is_static()
  557. STATE_IMPORT void STATE_WINAPI STATE_group_set_dynamic(DWORD group_handle);
  558. //Usually when we build a world (using STATE World Builder for example)
  559. //we have many models which we want them to be disabled when the world
  560. //is loaded (in viewer mode) . For example, we could have few models of a bird that
  561. //are interchanged to form a 3D animation. If the movement is composed of
  562. // 3 models, then two of them will always be disabled, and one will be enabled.
  563. // Using this function you can decide who is going to be loaded as disabled and
  564. // who as an enabled object.
  565. //Note that this function is only relevant to groups that were set as dynamic
  566. //( using STATE_group_set_dynamic() ). 
  567. // The default is NO
  568. // See also STATE_object_disable()
  569. STATE_IMPORT void STATE_WINAPI STATE_group_load_as_disabled(DWORD group_handle, int YES_or_NO);
  570. //Returns YES or NO.
  571. //See also STATE_group_load_as_disabled(), STATE_object_disable();
  572. STATE_IMPORT int STATE_WINAPI STATE_group_get_load_as_disabled_status(DWORD group_handle);
  573. // returns a handle to the new group
  574. STATE_IMPORT DWORD STATE_WINAPI STATE_group_duplicate_tree(DWORD group_handle);
  575. // The function get three arguments.
  576. // group_handle: the group to rotate
  577. // polygon_in_the_group: a polygon that belongs to the group
  578. // reference_polygon: any polygon.
  579. // inverse_flag: YES or NO. If YES the Normal of the reference polygon is inversed (as if we took the back side of the reference polygon)
  580. // The function rotates the group so that "polygon_in_the_group" will
  581. // be parallel to "reference_polygon"
  582. // returns OK, VR_ERROR.
  583. // A NULL group handle means the whole world
  584. // Note this very nice trick:
  585. // If the reference polygon also belongs to the group we can call
  586. // this function several times consecutively.
  587. // example say we have a box and we call this function as follows:
  588. // STATE_group_rotate_to_match_polygon(grp, left_poly, front_poly);
  589. // after the first call the box will rotate in 90 degrees so the left
  590. // polygon is now were the front poly was. BUT the front poly is part of
  591. // the group ,so it was rotated too. consecutive calls to this function
  592. // will cause a 90 degrees rotation each time. like a dog trying to catch its tail.
  593. STATE_IMPORT int STATE_WINAPI STATE_group_rotate_to_match_polygon(DWORD group_handle, DWORD polygon_in_the_group, DWORD reference_polygon, int inverse_flag);
  594. // Similar to STATE_group_rotate_to_match_polygon()
  595. // with the difference that here we have an auxiliary line (going through points p1 and p2)
  596. // To make things clearer let's say we have a square polygon_in_the_group
  597. // and a square reference_polygon, there are four final position for the group
  598. // so that polygon_in_the_group points to the same direction as reference_polygon.
  599. // (each one of the four edges of one group polygon can be aligned with an edge of the
  600. // reference polygon). STATE_group_rotate_to_match_polygon() rotates so it will make
  601. // the minimal rotation. This is usually what we want. So usually we will use
  602. // STATE_group_rotate_to_match_polygon(). We will use this function when we want
  603. // to turn around a specific line. All the rest is exactly like in STATE_group_rotate_to_match_polygon()
  604. // Returns OK or VR_ERROR.
  605. STATE_IMPORT int STATE_WINAPI STATE_group_rotate_around_line_to_match_polygon(DWORD group_handle, DWORD polygon_in_the_group, DWORD reference_polygon, int inverse_flag, double p1[3], double p2[3]);
  606. // The same as STATE_group_rotate_to_match_polygon() only that uses a direction instead of a reference polygon.
  607. STATE_IMPORT int STATE_WINAPI STATE_group_rotate_to_match_direction(DWORD group_handle, DWORD polygon_in_the_group, double direction[3]);
  608. // The given group is moved so his given point will match
  609. // "point_to_match" (the third argument);
  610. // return OK or VR_ERROR.
  611. STATE_IMPORT void STATE_WINAPI STATE_group_move_to_match_point(DWORD group_handle, DWORD point_belongs_to_group, DWORD point_to_match);
  612. STATE_IMPORT int STATE_WINAPI STATE_group_is_bitmap_used(DWORD group_handle, DWORD bitmap_handle);
  613. // finds how many intersections between polygons of groupA (that dont belong to grpB)
  614. // and polygons of group B (that are not included in A)
  615. // groupA or groupB could be NULL (means the whole world) or any other group
  616. STATE_IMPORT int STATE_WINAPI STATE_group_count_intersections(DWORD groupA, DWORD groupB);
  617. // Returns a handle to a polygon.
  618. // The returned polygon is the first polygon that his orientation fits (according to the orientation field of the polygon)
  619. // See also STATE_polygon_set_orientation() and STATE_polygon_get_orientation()
  620. STATE_IMPORT DWORD STATE_WINAPI STATE_group_get_bottom_polygon(DWORD group_handle);
  621. STATE_IMPORT DWORD STATE_WINAPI STATE_group_get_top_polygon(DWORD group_handle);
  622. STATE_IMPORT DWORD STATE_WINAPI STATE_group_get_front_polygon(DWORD group_handle);
  623. STATE_IMPORT DWORD STATE_WINAPI STATE_group_get_back_polygon(DWORD group_handle);
  624. // What is orientation and why do we need it.
  625. // When we want to drop an objectgroup on the ground (another surface) we need to know
  626. // what surface of the objectgroup should be glued to the ground.
  627. // The computer of course doesnt know on his own that a piano should stand on its legs ...
  628. // With this flag the designer of the model can express his will that the piano should stand on its legs ...
  629. //
  630. // In order to fully define the orientation of a group, one polygon of the group should have ORIENTATION_BOTTOM or ORIENTATION_top
  631. // and a second polygon should have ORIENTATION_FRONT or ORIENTATION_BACK beside those two polygons all the rest
  632. // should have ORIENTATION_UNKNOWN. Nothing bad happens if they dont, it is just that it can cause contradiction.
  633. //
  634. // Going back to STATE_group_set_orientation(),
  635. // the orientation_value should be one of the five values ORIENTATION_UNKNOWN ,ORIENTATION_TOP ORIENTATION_BOTTOM, ORIENTATION_FRONT, ORIENTATION_BACK
  636. // if given ORIENTATION_UNKNOWN, then all the polygons of the group will be set with ORIENTATION_UNKNOWN.
  637. // In this case polygon_handle could be NULL
  638. // if given ORIENTATION_BOTTOM, then the given polygon will be set with ORIENTATION_BOTTOM, and all the other polygons of the group that had ORIENTATION_BOTTOM or ORIENTATION_TOP will be set with ORIENTATION_UNKNOWN
  639. // if given ORIENTATION_TOP, then the given polygon will be set with ORIENTATION_TOP, and all the other polygons of the group that had ORIENTATION_BOTTOM or ORIENTATION_TOP will be set with ORIENTATION_UNKNOWN
  640. // if given ORIENTATION_FRONT, then the given polygon will be set with ORIENTATION_FRONT, and all the other polygons of the group that had ORIENTATION_FRONT or ORIENTATION_BACK will be set with ORIENTATION_UNKNOWN
  641. // if given ORIENTATION_BACK, then the given polygon will be set with ORIENTATION_BACK, and all the other polygons of the group that had ORIENTATION_FRONT or ORIENTATION_BACK will be set with ORIENTATION_UNKNOWN
  642. // See also STATE_polygon_set_orientation()
  643. STATE_IMPORT void STATE_WINAPI STATE_group_set_orientation(DWORD group_handle, DWORD polygon_handle, int orientation_value);
  644. //Gets the group axis system according to the orientation of its polygons.
  645. //If there are more than one polygon with the same orientation
  646. // it will choose first, those polygons that belong directly to the group.
  647. // In order to define the group axis system we need to have
  648. // at least two polygons with the orientation flag given.
  649. // one polygon should have the orientation FRONT or BACK and
  650. // the other should be BOTTOM or TOP
  651. // If there is only one polygon with orientation, the function will complete
  652. // the rest according to the computer's understanding ....
  653. // If there is no polygon with a given orientation it will again try to build
  654. // the best system it can ...
  655. // Return value
  656. //--------------
  657. // OK or VR_ERROR. In any case the axis_system given is legal.
  658. // in case of error the axis system will be the same as the world axis system (1,0,0; 0,1,0; 0,0,1)
  659. STATE_IMPORT int STATE_WINAPI STATE_group_calculate_axis_system(DWORD group_handle, double x_axis[3], double y_axis[3], double z_axis[3]);
  660. /*
  661. // Set the object to chase after
  662. // the given argument should NOT be NULL
  663. // Note that if the group was previously chasing a camera or a group
  664. // , those chasing operation are canceled. (The group can chase only one thing at a time).
  665. STATE_IMPORT void STATE_WINAPI STATE_group_set_object_to_chase(DWORD group_handle, DWORD object_to_chase_handle);
  666. // If the return value is NULL it means no object is being chased
  667. STATE_IMPORT DWORD STATE_WINAPI STATE_group_get_chased_object(DWORD group_handle);
  668. // Set the camera to chase after
  669. // the given argument should NOT be NULL
  670. // Note that if the group was previously chasing another object or a group
  671. // , those chasing operation are canceled. (The object can chase only one thing at a time).
  672. STATE_IMPORT void STATE_WINAPI STATE_group_set_camera_to_chase(DWORD group_handle, DWORD camera_to_chase_handle);
  673. // If the return value is NULL it means no camera is being chased
  674. STATE_IMPORT DWORD STATE_WINAPI STATE_group_get_chased_camera(DWORD group_handle);
  675. // Set the group to chase after
  676. // the given argument should NOT be NULL
  677. // Note that if the group was previously chasing a camera or an object
  678. // , those chasing operation are canceled. (The object can chase only one thing at a time).
  679. STATE_IMPORT void STATE_WINAPI STATE_group_set_group_to_chase(DWORD group_handle, DWORD group_to_chase_handle);
  680. // If the return value is NULL it means no group is being chased
  681. STATE_IMPORT DWORD STATE_WINAPI STATE_group_get_chased_group(DWORD group_handle);
  682. */
  683. // name could be a name of a camera , object or a group.
  684. STATE_IMPORT void STATE_WINAPI STATE_group_set_name_to_chase(DWORD group_handle, char *name);
  685. // If the return value is NULL it means nothing is being chased
  686. STATE_IMPORT char * STATE_WINAPI STATE_group_get_chased_name(DWORD group_handle);
  687. // return OK or VR_ERROR
  688. // the offset is returned through argument "offset"
  689. STATE_IMPORT int STATE_WINAPI STATE_group_get_chase_offset(DWORD group_handle, double offset[3]);
  690. // return OK or VR_ERROR
  691. STATE_IMPORT int STATE_WINAPI STATE_group_set_chase_offset(DWORD group_handle, double offset[3]);
  692. // The returned number is between 0 and one
  693. // a number close to 0 means that the tracking is weak
  694. // 1 means that the tracking is very sharp.
  695. STATE_IMPORT double STATE_WINAPI STATE_group_get_chase_softness(DWORD group_handle);
  696. // The returned number is between 0 and one
  697. // a number close to 0 means that the tracking is weak
  698. // 1 means that the tracking is very sharp.
  699. // it the given number is bigger than one it is set as one
  700. // if it is smaller than 0 than it set as 0
  701. STATE_IMPORT void STATE_WINAPI STATE_group_set_chase_softness(DWORD group_handle, double softness);
  702. // look in the header file for possible values and their meanings
  703. // (look for NO_CHASE, CHASE_LOCATION and others ...)
  704. STATE_IMPORT char *STATE_WINAPI STATE_group_get_chase_type_name(DWORD group_handle);
  705. // Like STATE_group_get_chase_type_name() only that returns the equivalent constant
  706. STATE_IMPORT int STATE_WINAPI STATE_group_get_chase_type(DWORD group_handle);
  707. // look in the header file for possible values and their meanings
  708. // (look for NO_CHASE, CHASE_LOCATION and others ...)
  709. STATE_IMPORT void STATE_WINAPI STATE_group_set_chase_type(DWORD group_handle, int chase_type);
  710. STATE_IMPORT void STATE_WINAPI STATE_group_set_track_name(DWORD group_handle, char *track_name);
  711. STATE_IMPORT char * STATE_WINAPI STATE_group_get_track_name(DWORD group_handle);
  712. // the offset is return through argument "offset"
  713. STATE_IMPORT void STATE_WINAPI STATE_group_get_track_offset(DWORD group_handle, double offset[3]);
  714. STATE_IMPORT void STATE_WINAPI STATE_group_set_track_offset(DWORD group_handle, double offset[3]);
  715. // Calling this function will make the group fall down from
  716. // it's track till it reaches "height_above_ground" distance from the ground
  717. // fall_through_dynamic_objects could be YES or NO. the idea here is that if for example we have a runner (human being)
  718. // and the track is very high in the air then it might fall on the top of the airplanes so we would like it to fall through the planes on the ground
  719. // if on the other hand there are cars on the ground we would like it to fall on the top of the cars and not to pass through.
  720. STATE_IMPORT void STATE_WINAPI STATE_group_set_falling_from_track(DWORD group_handle, double height_above_ground, int fall_through_dynamic_objects);
  721. STATE_IMPORT void STATE_WINAPI STATE_group_unset_falling_from_track(DWORD group_handle);
  722. // Returns the current status in the three params: set_flag, height_above_ground, fall_through_dynamic_objects
  723. // set_flag could be YES or NO 
  724. // fall_through_dynamic_objects could be YES or NO . See STATE_group_set_falling_from_track() for more details
  725. STATE_IMPORT void STATE_WINAPI STATE_group_get_falling_from_track_params(DWORD group_handle, int *set_flag, double *height_above_ground, int *fall_through_dynamic_objects);
  726. STATE_IMPORT void STATE_WINAPI STATE_group_get_speed(DWORD group_handle, double speed[3]);
  727. STATE_IMPORT void STATE_WINAPI STATE_group_set_speed(DWORD group_handle, double speed[3]);
  728. STATE_IMPORT double STATE_WINAPI STATE_group_get_absolute_speed(DWORD group_handle);
  729. STATE_IMPORT void STATE_WINAPI STATE_group_set_absolute_speed(DWORD group_handle, double speed);
  730. // rotates the group so that the orientation of the group matches the given directions
  731. // The given directions dont have to be normalized.
  732. // one of the direction can be 0,0,0 in this case it is calculated automatically.
  733. // If the given axis are not orthogonal, the function 
  734. // handle it by building an orthogonal system that is close as possible
  735. // to the given axis.
  736. // see also STATE_group_calculate_axis_system()
  737. // Here are some examples, note that
  738. // all the examples give the same result.
  739. // Example A:
  740. // x_axis[0]=0; x_axis[1]=1; x_axis[2]=0; 
  741. // y_axis[0]=-1; y_axis[1]=0; y_axis[2]=0; 
  742. // z_axis[0]=0; z_axis[1]=0; z_axis[2]=1; 
  743. // STATE_group_rotate_to_match_axis_system(x_axis, y_axis, z_axis);
  744. //
  745. // Example B:
  746. // //Example B would give exactly the same result as example A
  747. // x_axis[0]=0; x_axis[1]=111; x_axis[2]=0; 
  748. // y_axis[0]=-17; y_axis[1]=0; y_axis[2]=0; 
  749. // z_axis[0]=0; z_axis[1]=0; z_axis[2]=12; 
  750. // STATE_group_rotate_to_match_axis_system(x_axis, y_axis, z_axis);
  751. //
  752. // Example C:
  753. // //Note that  z_axis=(0,0,0) and will be automatically 
  754. //  // calculated by the function
  755. // //Example C would give exactly the same result as example A and B
  756. // x_axis[0]=0; x_axis[1]=111; x_axis[2]=0; 
  757. // y_axis[0]=-17; y_axis[1]=0; y_axis[2]=0; 
  758. // z_axis[0]=0; z_axis[1]=0; z_axis[2]=0; 
  759. // STATE_group_rotate_to_match_axis_system(x_axis, y_axis, z_axis);
  760. //
  761. // Example D:
  762. //  // Note that z_axis=(0,0,0) and that the x_axis and the y_axis are not orthogonal to each other.
  763. //  //Note that we will get again the same result
  764. // x_axis[0]=0; x_axis[1]=1; x_axis[2]=0; 
  765. // y_axis[0]=-1; y_axis[1]=11; y_axis[2]=0; 
  766. // z_axis[0]=0; z_axis[1]=0; z_axis[2]=0; 
  767. // STATE_group_rotate_to_match_axis_system(x_axis, y_axis, z_axis);
  768. //
  769. // Example E:
  770. //  // Note that z_axis=(-1,0,0) which doesn't give a right hand system
  771. // // in this case the z_axis will be ignored and calculated by doing cross between the x_axis and the y_axis
  772. //  //Note that we will get again the same result
  773. // x_axis[0]=0; x_axis[1]=1; x_axis[2]=0; 
  774. // y_axis[0]=-1; y_axis[1]=0; y_axis[2]=0; 
  775. // z_axis[0]=0; z_axis[1]=0; z_axis[2]=-1; 
  776. // STATE_group_rotate_to_match_axis_system(x_axis, y_axis, z_axis);
  777. //
  778. // Returns OK or VR_ERROR.
  779. STATE_IMPORT int STATE_WINAPI STATE_group_rotate_to_match_axis_system(DWORD group_handle, double x_axis[3], double y_axis[3], double z_axis[3]);
  780. // Rotates the group around the given line.
  781. // Returns OK or VR_ERROR.
  782. STATE_IMPORT int STATE_WINAPI STATE_group_rotate_around_line(DWORD group_handle, double p1[3], double p2[3], double degrees);
  783. // Stretch a bitmap on all the polygons that belong to a group.
  784. // works best if the group is flat like floor or terrain.
  785. // If group_handle==NULL it will effect the whole world
  786. // If bitmap_handle==NULL it wont change the bitmap.
  787. // Note that if you want the bitmap to repeat more than once on the model (tile mode)
  788. // then the dimensions of the bitmap must be in the power of two (for example 32,64,128,256,512,1024,2048 etc ... 
  789. // all these numbers are powers of two).
  790. // returns OK or VR_ERROR
  791. STATE_IMPORT int STATE_WINAPI STATE_group_wrap_a_bitmap(DWORD group_handle, DWORD bitmap_handle, int repeat_x, int repeat_y);
  792. // Obsolete, use STATE_group_create_reduced_copy() instead
  793. // This function reduces the number of polygons by
  794. // eliminating redundant polygons and by joining several polygons
  795. // into one polygon. 
  796. // accuracy is used when we try to check whether two polygons
  797. // have the same plane (so we can unite them to one polygon). 
  798. // If this number for example is 0.1 and 
  799. // the X component if the normals are planeA[0]=1 and planeB[0]=0.9
  800. // then the join operation will take place.
  801. // can be done only in editor mode.
  802. // returns the number of polygons that were reduced.
  803. // Returns VR_ERROR on failure on success returns the number of polygons that were reduced
  804. STATE_IMPORT int STATE_WINAPI STATE_group_reduce_polygons_count(DWORD group_handle ,double accuracy);
  805. //This is a very powerfull function for doing polygon reduction.
  806. //optimization_level: a bigger number will give a stronger polygon reduction.
  807. //   one should play with this value to achieve the optimum result.
  808. //   tipical values are 0.1, 1, 10 , 100.
  809. //   a value of 1 for example will snap the model into a grid that
  810. //   its smallest unit is 1.
  811. //
  812. //returns a handle to the new group of polygons.
  813. STATE_IMPORT DWORD STATE_WINAPI STATE_group_create_reduced_copy(DWORD group_to_copy, double optimization_level) ;
  814. // similar to STATE_group_duplicate_tree() just that the new copy will be made of triangles only.
  815. // Returns a handle to the new copy
  816. STATE_IMPORT DWORD STATE_WINAPI STATE_group_create_copy_made_of_triangles(DWORD group_to_copy) ;
  817. // Returns YES or NO.
  818. // NO means that you cant use STATE_group_rotate() to rotate the group
  819. // The function will return NO, only if the group has at least one rotated polygon inside
  820. STATE_IMPORT int STATE_WINAPI STATE_group_is_rotation_enabled(DWORD group_handle);
  821. //Returns OK or VR_ERROR
  822. STATE_IMPORT int STATE_WINAPI STATE_group_convert_point_to_world_space(DWORD group_handle, double group_space_point[3], double result[3]);
  823. STATE_IMPORT int STATE_WINAPI STATE_group_convert_point_to_group_space(DWORD group_handle, double world_space_point[3], double result[3]);
  824. STATE_IMPORT void STATE_WINAPI STATE_group_set_chase_distance(DWORD group_handle, double chase_distance);
  825. STATE_IMPORT double STATE_WINAPI STATE_group_get_chase_distance(DWORD group_handle);
  826. //Exactly like STATE_polygon_delete_patches() only that it does it for the whole polygons of the group.
  827. STATE_IMPORT void STATE_WINAPI STATE_group_delete_patches(DWORD group_handle, int type_of_patches_to_delete_or_serial_number);
  828. //Set the color of all the patches in the group
  829. // values for red green and blue should be in the range [0-255]
  830. // patches_type should be one of the following: ALL_PATCHES, SHADOW_PATCHES, REGULAR_PATCHES
  831. // or the serial number that was given when the patches were created
  832. // Example A:
  833. // //Setting the color to all the patches of the given group
  834. // STATE_group_set_patches_color(my_room, ALL_PATCHES);
  835. //
  836. // Example B:
  837. // //Setting the color to all the patches that were created using the functions
  838. // //STATE_polygon_add_patch() and STATE_polygon_add_patch_easy()
  839. // STATE_group_set_patches_color(my_room, REGULAR_PATCHES);
  840. //  
  841. // Example C:
  842. // Setting the color to all the patches that were created using the function STATE_engine_create_shadow()
  843. // STATE_group_set_patches_color(my_room, SHADOW_PATCHES);
  844. //
  845. // Example D:
  846. // Delete patches that were created using the function STATE_engine_create_shadow() with a serial_number==220
  847. // STATE_group_set_patches_color(my_room, 39);
  848. //
  849. // See also: STATE_engine_create_shadow(), STATE_polygon_add_patch() ,STATE_polygon_add_patch_easy()
  850. //  STATE_polygon_delete_patches(), STATE_group_delete_patches()
  851. STATE_IMPORT void STATE_WINAPI STATE_group_set_patches_color(DWORD group_handle, int red, int green, int blue, int patches_type);
  852. STATE_IMPORT void STATE_WINAPI STATE_group_set_patches_bitmap(DWORD group_handle, DWORD bitmap_handle, int patches_type);
  853. STATE_IMPORT void STATE_WINAPI STATE_group_set_patches_translucent(DWORD group_handle, BYTE translucent_type, int patches_type);
  854. //The functions below are the equivalent of STATE_group_getset_physics_...
  855. //They will be useful for you only if you build some kind of World Editor (Such as STATE World Builder)
  856. //The functions wont show any change till we save the world and reload it in Viewer mode
  857. //and when the chase_type is set to CHASE_PHYSICS.
  858. //
  859. // Return value: The rotation space (WORLD_SPACE or OBJECT_SPACE)
  860. // through rotation_xyz[] the function returns the rotation angles
  861. // rotation_xyz[0] is the number of angles that the object will rotate 
  862. // around the X axis, each time STATE_engine_render() is called
  863. // see also STATE_object_set_physics_rotation()
  864. //Note that this is only relevant when applied to a dynamic group and that CHASE_PHYSICS is applied (only in viewer mode)
  865. STATE_IMPORT int STATE_WINAPI STATE_group_get_physics_rotation(DWORD group_handle, double rotation_xyz[3]);
  866. STATE_IMPORT void STATE_WINAPI STATE_group_set_physics_rotation(DWORD group_handle, int rotation_space ,double rotate_around_x_axis, double rotate_around_y_axis, double rotate_around_z_axis);
  867. // Set the force that will work on the object. For example to simulate gravity force
  868. // do like that:
  869. // double force[3];
  870. // force[0]=0;
  871. // force[1]=0;
  872. // force[2]= -10; //simulate gravity 10 in the direction of the -Z axis.
  873. // STATE_group_set_force(my_object,force);
  874. //
  875. //Note that this is only relevant when applied to a dynamic group and that CHASE_PHYSICS is applied (only in viewer mode)
  876. STATE_IMPORT void STATE_WINAPI STATE_group_set_physics_force(DWORD group_handle, double force[3]);
  877. //The force is returned through force argument.
  878. STATE_IMPORT void STATE_WINAPI STATE_group_get_physics_force(DWORD group_handle, double force[3]);
  879. //Friction is a value smaller or equal to 1
  880. // if friction==0 it means no friction
  881. // if friction==1 it means infinite friction nothing can move
  882. // if friction is smaller than 0, it act like pressing on the gas
  883. // The exact calculation.
  884. // Each render the absolute_speed is multiply with (1-friction).
  885. //
  886. // Note, a negative number can use for increasing the speed.
  887. // a friction of -1 will double the speed.
  888. // -2 will multiply the speed by three each rendering.
  889. // so choose number carefully.
  890. // typical numbers can be 0.03 or -0.03 etc ...
  891. //Note that this is only relevant when applied to a dynamic group and that CHASE_PHYSICS is applied (only in viewer mode)
  892. STATE_IMPORT double STATE_WINAPI STATE_group_get_physics_friction(DWORD group_handle);
  893. STATE_IMPORT void STATE_WINAPI STATE_group_set_physics_friction(DWORD group_handle, double friction);
  894. //This number is used when the object hits a polygon. 
  895. //A value of one will make the new speed (after collision)
  896. //equal to the old speed (effects only the absolute speed value and not the direction)
  897. //a value of 0.5 will cut speed by half. 
  898. //We can also give values greater than one.
  899. //For example a value of 2 will make the new speed twice as big
  900. //as before the collision.
  901. //Note that this is only relevant when applied to a dynamic group and that CHASE_PHYSICS is applied (only in viewer mode)
  902. STATE_IMPORT double STATE_WINAPI STATE_group_get_physics_elasticity(DWORD group_handle);
  903. STATE_IMPORT void STATE_WINAPI STATE_group_set_physics_elasticity(DWORD group_handle, double elasticity);
  904. //Limits the maximum possible speed of an object.
  905. //If there is no limit then by applying force on the object 
  906. //The speed could reach infinity (unless some friction is given too)
  907. //Note that this is only relevant when applied to a dynamic group and that CHASE_PHYSICS is applied (only in viewer mode)
  908. STATE_IMPORT double STATE_WINAPI STATE_group_get_physics_maxspeed(DWORD group_handle);
  909. STATE_IMPORT void STATE_WINAPI STATE_group_set_physics_maxspeed(DWORD group_handle, double max_speed);
  910. //This function is not so important ...
  911. //This function associates a number with the group
  912. //later (When the world is saved and load in viewer mode
  913. //we can get this number using STATE_object_get_control_type_number()
  914. //Note that the function does nothing it is just a set and get mechanism. 
  915. //The number that you give has no meaning to the Engine. 
  916. //The meaning is as given by the application that is using the engine.
  917. //parameters:
  918. // num: any integer that is equal or greater than 64
  919. // (the first 63 numbers are reserved for future use) 
  920. STATE_IMPORT void STATE_WINAPI STATE_group_set_control_number(DWORD group_handle, int num);
  921. STATE_IMPORT int STATE_WINAPI STATE_group_get_control_number(DWORD group_handle);
  922. // Similar to STATE_group_wrap_a_bitmap()
  923. // The difference is that STATE_group_wrap_a_bitmap() will
  924. // stretch the bitmap so that the top right corner of the bitmap
  925. // will fit to a corner of the group. This function
  926. // will fit the corner of the bitmap the given location in the world
  927. // locationXY_to_get_bitmap_top_left_corner[0], locationXY_to_get_bitmap_top_left_corner[1]
  928. // This is the (X,Y) coordinate in the world that the top left corner of the bitmap will
  929. // be associated with. 
  930. // This way the given group might only get a portion of the bitmap.
  931. // In the special case where locationXY_to_get_bitmap_top_left_corner, and locationXY_to_get_bitmap_bottom_right_corner
  932. // are the bounding box of the group then this function will do the same as
  933. // STATE_group_wrap_a_bitmap()
  934. // Returns OK or VR_ERROR
  935. STATE_IMPORT int STATE_WINAPI STATE_group_wrap_a_bitmap_fixed(DWORD group_handle, DWORD bitmap_handle, int repeat_x, int repeat_y, double locationXY_to_get_bitmap_top_left_corner[2], double locationXY_to_get_bitmap_bottom_right_corner[2]);
  936. // Obselete .(works only in software mode)
  937. // Set the brightness of each polygon of the group according to the intensity of the light source.
  938. // values for ambient and are in the range [0-400]
  939. // values for light_intensity light_intensity are in the range [0-400]
  940. // see STATE_polygon_set_brightness() for explanation of what those values mean
  941. // ambient is the minimum light intensity that is, if the light source has zero intensity or points
  942. // to the opposite direction , the polygon will have the ambient intensity. This is the light that reflects
  943. // from the surroundings.
  944. // Examples:
  945. // A) direction[0]=1; direction[1]=0; direction[2]=0;
  946. // STATE_group_light_group(grp, direction,20, 400) //A very strong source of light in a dark environment
  947. //
  948. // B) direction[0]=1; direction[1]=1; direction[2]=0; //The direction is diagonally
  949. // STATE_group_light_group(grp, direction, 100, 100) //An average source of light in an average lit environment
  950. //
  951. // Note that actually one can also try negative values for the ambient and the light_intensity.
  952. // note that the formula is final_intensity= ambient + angle_between_polygon_and_light_direction* light_intensity
  953. // where angle_between_polygon_and_light_direction is normalized to the range [0-1]
  954. // a negative light_intensity means that our light source gives darkness instead of light ! (a great new invention !)
  955. STATE_IMPORT void STATE_WINAPI STATE_group_light_group(DWORD group_handle, double direction[3], double ambient, double light_intensity);
  956. //Remove light from the group.
  957. //If the given group was lit using the STATE_light API then
  958. //this function could be used to restore the group normal appearance
  959. //If the given group handle is NULL then light will be removed from the whole world.
  960. //See also STATE_object_remove_light(), STATE_polygon_remove_light(), STATE_light_remove_light()
  961. STATE_IMPORT void STATE_WINAPI STATE_group_remove_light(DWORD group_handle);
  962. // Set the color of all the polygons that belong to the given group.
  963. // rgb[0] ==red
  964. // rgb[1]==green;
  965. // rgb[2]==blue
  966. //Example:
  967. // BYTE rgb[3]={255,0,0}; //red color
  968. //  STATE_group_set_color(NULL, rgb); //Set the whole world to red
  969. STATE_IMPORT void STATE_WINAPI STATE_group_set_color(DWORD group_handle, BYTE rgb[3]);
  970. //Calls STATE_polygon_set_light() for all the polygons in the group
  971. //For more details see STATE_polygon_set_light()
  972. STATE_IMPORT void STATE_WINAPI STATE_group_set_light(DWORD group_handle, BYTE rgb[3]);
  973. //Set the ambient light value to all the polygons contained in the given group
  974. //For more details see STATE_polygon_set_ambient()
  975. STATE_IMPORT void STATE_WINAPI STATE_group_set_ambient(DWORD group_handle, int value);
  976. //Set the diffuse light value to all the polygons contained in the given group
  977. //For more details see STATE_polygon_set_diffuse()
  978. STATE_IMPORT void STATE_WINAPI STATE_group_set_diffuse(DWORD group_handle, int value);
  979. //Set the specular light value to all the polygons contained in the given group
  980. //For more details see STATE_polygon_set_specular()
  981. STATE_IMPORT void STATE_WINAPI STATE_group_set_specular(DWORD group_handle, int value);
  982. //The same as STATE_polygon_create_lightmap() only that it creates lightmaps bitmaps for all
  983. //polygons of the given group.
  984. //Returns the number of bitmaps that were created and assigned to the group.
  985. //For more details see STATE_polygon_create_lightmap()
  986. STATE_IMPORT int STATE_WINAPI STATE_group_create_lightmap(DWORD group_handle, int max_bm_side, int min_lightmap_size, double sample_rate, int force_ray_tracing, int bitmap_number);
  987. //Disable or enabled a group.
  988. //A disabled group is not included in rendering and in collision detection.
  989. //This is a very important function for making large fast worlds using LOD (More details bellow)
  990. //This function can be used to disable parts of the world that are not seen
  991. //(This technique is done automatically when using the speed database)
  992. // Another important usage is doing LOD (level of details)
  993. // Each model in the world (building, mountain , a chair, etc ...) should be built
  994. // several times. Each version of the model should use less polygons (for example the higher
  995. // version should be built from 100 polygons, the second version from 50 polygons, the third from 20 polygons and
  996. // the lowest level from just one rotated polygon that has a bitmap of the treechairbuilding or whatever model we
  997. // are using).
  998. // Before calling STATE_engine_render() check the distance between the camera (the view point)
  999. // and each of the models that have LOD versions. Disable all the versions that should not be used
  1000. // and enable just the one that fits to the distance from the viewer
  1001. // The function is very fast (just set a flag and returns)
  1002. // Parameters:
  1003. // group_handle: the group to be disabled  enabled
  1004. // YES_or_NO: YES to disable. NO to enable
  1005. //
  1006. // Example:
  1007. // //disabling a group 
  1008. // STATE_group_disable(a_group_handle, YES);
  1009. STATE_IMPORT void STATE_WINAPI STATE_group_disable(DWORD group_handle, int YES_or_NO);
  1010. //Returns YES or NO. NO is return if the group is enabled.
  1011. //YES is returned if the group is disabled.
  1012. // See also STATE_group_disable();
  1013. STATE_IMPORT int STATE_WINAPI STATE_group_is_disable(DWORD group_handle);
  1014. //Set the given bitmap to all the polygon belonging to the given group.
  1015. // Parameters:
  1016. // group_handle: A handle to a group. NULL means the whole world.
  1017. // bitmap_handle: A handle to a bitmap to be set on all the polygons of the given group.
  1018. STATE_IMPORT void STATE_WINAPI STATE_group_set_bitmap(DWORD group_handle, DWORD bitmap_handle);
  1019. // Used to go over all the groups that belong to a certain group.
  1020. //
  1021. // Example:
  1022. // for(DWORD house_part=STATE_group_get_first_included_group(house_group); house_part!=NULL; house_part=STATE_group_get_next_included_group(house_group, house_part) ) {
  1023. // // Deal with the various house parts such as roof, windows, door etc ...
  1024. //
  1025. // }
  1026. //
  1027. // Note:
  1028. // Don't mix this function with STATE_group_get_first_group() and 
  1029. // STATE_group_get_next() which are used to go over ALL the existing groups.
  1030. //
  1031. // To go over all the groups the belong to a certain object use STATE_object_get_group_handle() as the top group handle
  1032. //
  1033. STATE_IMPORT DWORD STATE_WINAPI STATE_group_get_first_included_group(DWORD top_group_handle);
  1034. // Used to go over all the groups that belong to a certain group.
  1035. //
  1036. // Example:
  1037. // for(DWORD house_part=STATE_group_get_first_included_group(house_group); house_part!=NULL; house_part=STATE_group_get_next_included_group(house_group, house_part) ) {
  1038. // // Deal with the various house parts such as roof, windows, door etc ...
  1039. //
  1040. // }
  1041. //
  1042. // Note:
  1043. // Don't mix this function with STATE_group_get_first_group() and 
  1044. // STATE_group_get_next() which are used to go over ALL the existing groups
  1045. //
  1046. // To go over all the groups the belong to a certain object use STATE_object_get_group_handle() as the top group handle
  1047. //
  1048. STATE_IMPORT DWORD STATE_WINAPI STATE_group_get_next_included_group(DWORD top_group_handle, DWORD last_included_found);
  1049. //-----------------------------------------------------------//
  1050. //========= T H E   3 D _ A N I M A T I O N   A P I =========//
  1051. //-----------------------------------------------------------//
  1052. //This API deals with 3D model animation (mesh morphing)
  1053. //A 3D animation is a set of 3D models that are slightly different from one another
  1054. //Those 3D models are called 3D frames. For example a 3D animation of a man walking
  1055. //would contain several frames for completing a whole walking cycle.
  1056. //Usually the 3D character has several movements that it can perform.
  1057. //(For example, walk, jump, hit, fall down etc ...) each movement is combined
  1058. // of several frames and is called a 3D sequence.
  1059. // To summarize it: Each 3D animation is built from many 3D frames. The 3D frames are divided
  1060. // into separate 3D sequences. If it all sounds complicated then the following example will 
  1061. //clear things up. 
  1062. // my_obj=STATE_object_create_from_file("woman.md2"); //The md2 files contain a 3D animation. The 3D animation is automatically loaded to the engine
  1063. // my_3danim=STATE_object_get_3D_animation(my_obj);
  1064. // walk_sequence=STATE_3D_animation_get_sequence_using_name(my_3danim,"walk");
  1065. // standing_sequence=STATE_3D_animation_get_sequence_using_name(my_3danim,"stand");
  1066. // undressing_sequence=STATE_3D_animation_get_sequence_using_name(my_3danim,"undress");
  1067. // if(key_1_is_pressed) STATE_object_set_3D_sequence(my_obj,walk_sequence); 
  1068. // if(key_2_is_pressed) STATE_object_set_3D_sequence(my_obj,undressing_sequence); 
  1069. // and so on ...
  1070. //
  1071. //Please also note the 3D_sequence API which is used in conjunction with this API
  1072. // This function, together with STATE_3D_animation_get_next()
  1073. // are used for going over all the defined 3D animations
  1074. // Example
  1075. // for(DWORD anim3d=STATE_3D_animation_get_first(); anim3d!=NULL; anim3d=STATE_3D_animation_get_next(anim3d) {
  1076. // //Write here the code to do for each anim3d
  1077. // }
  1078. // Note that the function STATE_3D_animation_create() adds a new anim3d
  1079. // to top of the queue. So STATE_3D_animation_get_first()
  1080. // will always return the last anim3d that was created.
  1081. // The same rule is for all STATE_xxxx_get_first() functions.
  1082. STATE_IMPORT DWORD STATE_WINAPI STATE_3D_animation_get_first(void);
  1083. STATE_IMPORT DWORD STATE_WINAPI STATE_3D_animation_get_next(DWORD anim3d_handle);
  1084. //Deletes all the existing 3d animations
  1085. STATE_IMPORT void STATE_WINAPI STATE_3D_animation_delete_all(void);
  1086. //Deletes the given anim3d.
  1087. // Note not to use the handle after it the anim3d was deleted
  1088. // Example:
  1089. // STATE_3D_animation_delete(my_anim3d);
  1090. // my_anim3d=NULL;
  1091. STATE_IMPORT void STATE_WINAPI STATE_3D_animation_delete(DWORD anim3d_handle);
  1092. //Returns a handle to the anim3d according to the given name
  1093. STATE_IMPORT DWORD STATE_WINAPI STATE_3D_animation_get_using_name(char *anim3d_name);
  1094. // Returns the name of the animation
  1095. // The function returns a pointer to the name which is stored internally inside the 3D Engine
  1096. // Visual Basic users should use STATE_entity_get_name() instead.
  1097. // See also STATE_entity_get_namel()
  1098. STATE_IMPORT char *STATE_WINAPI STATE_3D_animation_get_name(DWORD anim3d_handle);
  1099. //Returns YES or NO. NO is returned if the given handle
  1100. //is not a handle of a 3D_animAtion. YES is returned otherwise
  1101. STATE_IMPORT int STATE_WINAPI STATE_3D_animation_is_3D_animation(DWORD anim3d_handle, char *function_asking);
  1102. // ===============================================================================
  1103. // === More 3D animation functions (beginners can skip this group of functions)===
  1104. // ===============================================================================
  1105. //
  1106. // Use the function below for the following purposes:
  1107. // 1) To change your 3d animation in real time
  1108. // For example your game character has been beaten severly
  1109. // you can now modify in real-time the points of the animation
  1110. // to create a swollen face  damaged body etc ...
  1111. // To modify the 3D animation polygons use STATE_3D_animation_set_triangle_xyz()
  1112. //
  1113. // 2) To create various effects. For example you can build the first frame as a duplication of a house
  1114. // the second frame can be a car. When the engine will interpolates between the frames it will
  1115. // create 3D morphing animating gradually from a house to a car.
  1116. // You could get the same effect by building an md2 animation
  1117. // (using one of the md2 editors available on the Internet) with two frames.
  1118. // and loading the aniamtion into the engine (for example STATE_object_create_from_file("woman.md2") )
  1119. //
  1120. // 3) To write converters from other 3d animation formats to STATE.
  1121. //    To do so simply, create an empty 3d animation using STATE_3D_animation_create_for_editing()
  1122. //    Set the points of all the polygons in each frame to their right value
  1123. //    according to the file format you want to import.
  1124. //    Use STATE_3D_animation_set_triangle_xyz() and STATE_3D_animation_set_triangle_bmp_uv()
  1125. //    to set the polygons. When finished call STATE_3D_animation_save()
  1126. // Example:
  1127. // //converting a 3D frames based animation from your favorite format to STATE anim3d format
  1128. // void main()
  1129. // {
  1130. // DWORD anim3d=STATE_3D_animation_create_for_editing("my_anim", 600, 20);
  1131. //
  1132. // int num_of_frames=STATE_3D_animation_get_number_of_frames(anim3d);
  1133. // int num_of_triangles=STATE_3D_animation_get_number_of_triangles(anim3d);
  1134. //
  1135. // for(int frame=0; frame< num_of_frames; frame++) {
  1136. // for(int tri=0; tri<num_of_triangles; tri++) {
  1137. // for(point=0; point<3; point++) {
  1138. // float xyz[3];
  1139. // get_the_point_from_your_favorite_format(frame, tri,point, xyz); //You should write your own implementation to this function
  1140. // float bmp_uv[2];
  1141. // get_the_point_texture_coords_from_your_favorite_format(frame, tri,point, xyz); //You should write your own implementation to this function
  1142. // STATE_3D_animation_set_triangle_xyz(anim3d, tri, i, frame, xyz);
  1143. // STATE_3D_animation_set_triangle_bmp_uv(anim3d, tri, i, frame, bmp_uv);
  1144. // }
  1145. // }
  1146. // }
  1147. //
  1148. // STATE_3D_animation_save(anim3d,"my_anim.anim3d");
  1149. // }
  1150. //Creates a new empty 3D animation that can be edited.
  1151. // Use the functions below to edit the 3D animation.
  1152. // Returns a handle to the newly created 3D Animation.
  1153. // After finishing editing call STATE_3D_animation_finished_editing()
  1154. // Only after calling STATE_3D_animation_finished_editing() one can use the 3D animation
  1155. // in functions such as STATE_object_set_3D_animation()
  1156. STATE_IMPORT DWORD STATE_WINAPI STATE_3D_animation_create_for_editing(char *name, int number_of_triangles, int number_of_frames);
  1157. //Rebuilds the animation sequances and make it ready for use.
  1158. //See also STATE_3D_animation_create_for_editing(), STATE_3D_animation_set_frame_name(),
  1159. //STATE_3D_animation_set_triangle_xyz()
  1160. STATE_IMPORT int STATE_WINAPI STATE_3D_animation_finished_editing(DWORD anim3d_handle);
  1161. //Note that when the different sequences are built (when STATE_3D_animation_finished_editing() is called)
  1162. //they are built according to the frames names. for example if we have 6 frames with the names
  1163. // walk1, walk2, walk3, run1, run2, run3
  1164. //then the engine will build 2 squences with the name Walk and Run.
  1165. //By setting the frames name you control later the names and number of the sequences.
  1166. STATE_IMPORT char *STATE_WINAPI STATE_3D_animation_get_frame_name(DWORD anim3d_handle, int frame_number);
  1167. STATE_IMPORT void STATE_WINAPI STATE_3D_animation_set_frame_name(DWORD anim3d_handle, int frame_number, char *name);
  1168. STATE_IMPORT int STATE_WINAPI STATE_3D_animation_get_number_of_triangles(DWORD anim3d_handle);
  1169. STATE_IMPORT int STATE_WINAPI STATE_3D_animation_get_number_of_frames(DWORD anim3d_handle);
  1170. //Returns a point of a given triangle in a given frame.
  1171. //The result is returned through xyzuv
  1172. // xyzuv[0] is the X value. xyzuv[1] is the Y value
  1173. //xyzuv[3] is the bitmap u coordinate of the requested point.
  1174. //xyzuv[4] is the bitmap v coordinate of the requested point.
  1175. //
  1176. // triangle_number
  1177. // The index of the triangle in the specified frame. 0 is the first triangle.
  1178. //
  1179. // frame_number
  1180. // The index of the animation frame . 0 is the first frame
  1181. //
  1182. // triangle_point
  1183. // can be 0,1,2. Determins the triangle point to retrieve information from.
  1184. //
  1185. // Returns OK or VR_ERROR.
  1186. STATE_IMPORT int STATE_WINAPI STATE_3D_animation_get_triangle_point(DWORD anim3d_handle, int triangle_number, int triangle_point, int frame_number, float xyzuv[5]);
  1187. //The same as STATE_3D_animation_get_triangle_point() only that it doesnt retrieve the bitmap coordinations
  1188. STATE_IMPORT int STATE_WINAPI STATE_3D_animation_get_triangle_xyz(DWORD anim3d_handle, int triangle_number, int triangle_point, int frame_number, float xyz[3]);
  1189. //Set a specific point of the animation
  1190. //See STATE_3D_animation_get_triangle_point() for more information
  1191. //
  1192. // Note 1
  1193. //--------
  1194. //Please remember to give a name to a frame before you change its point
  1195. //set the frame name using STATE_3D_animation_set_frame_name()
  1196. //The name should start with letters and end with digits. For example
  1197. //walk02. After calling STATE_3D_animation_finished_editing() all consequtive frames that have the same letters
  1198. //will be grouped into one sequence. For example walk01, walk02, walk03 will be grouped to sequence walk.
  1199. //
  1200. // Note 2
  1201. //--------
  1202. //Please note that modifying points of the animation doesnt work very well with the md2 file format
  1203. //This is because the md2 file format represent each point with three BYTES (Thats right, only one byte for X, one for Y and one for Z !!!)
  1204. //In order to modify an md2 animation in realtime it is best to convert it first to the anim3d format.
  1205. //To convert from md2 to the anim3d format simply do a short program that looks like this
  1206. //
  1207. //  void main()
  1208. // {
  1209. // DWORD obj=STATE_object_create_from_file("woman.md2");
  1210. // DWORD anim3d=STATE_object_get_3D_animation(obj);
  1211. // STATE_3D_animation_save(anim3d,"woman.anim3d");
  1212. // }
  1213. //
  1214. // Note that the anim3d format is a lot better for manipulating frames in realtime
  1215. // though the file created is a lot bigger. This means that it will use more memory
  1216. // and thus is less recommended to use if you have many models and you are concern
  1217. // with the speed of your application.
  1218. //
  1219. STATE_IMPORT int STATE_WINAPI STATE_3D_animation_set_triangle_xyz(DWORD anim3d_handle, int triangle_number, int triangle_point, int frame_number, float xyz[3]);
  1220. //Set the bitmap coord of a specific animation
  1221. //See STATE_3D_animation_get_triangle_point() for more information
  1222. STATE_IMPORT int STATE_WINAPI STATE_3D_animation_set_triangle_bmp_uv(DWORD anim3d_handle, int triangle_number, int triangle_point, int frame_number, float bmp_uv[2]);
  1223. //Save the animation in STATE 3D animation file format.
  1224. //The saved file can be later loaded using STATE_object_create_from_file();
  1225. // One of the uses for this function could be if you are writing a converter
  1226. // from your own 3D animation file format to STATE.
  1227. STATE_IMPORT int STATE_WINAPI STATE_3D_animation_save(DWORD anim3d_handle, char *anim3d_file_name);
  1228. //-----------------------------------------------------------//
  1229. //========= T H E    3 D _ S E Q U E N C E    A P I =========//
  1230. //-----------------------------------------------------------//
  1231. //This API deals with 3D animation sequence (mesh morphing)
  1232. // Each 3D animation is built from many 3D frames. The 3D frames are divided
  1233. // into separate 3D sequences. For example there could be a "walking sequence"
  1234. // which is made of several frames that animate a full walking cycle.
  1235. //See also the STATE_3D_animation API,
  1236. // STATE_object_set_3D_sequence(), STATE_object_get_3D_sequence()
  1237. // STATE_object_replace_3D_sequence_when_finished(), STATE_object_create_from_file()
  1238. // This function, together with STATE_3D_sequence_get_next()
  1239. // are used for going over all the defined 3D sequences
  1240. // Example
  1241. // for(DWORD seq3d=STATE_3D_sequence_get_first(); seq3d!=NULL; seq3d=STATE_3D_sequence_get_next(seq3d) {
  1242. // //Write here the code to do for each seq3d
  1243. // }
  1244. // Note that the function STATE_3D_sequence_create() adds a new seq3d
  1245. // to top of the queue. So STATE_3D_sequence_get_first()
  1246. // will always return the last seq3d that was created.
  1247. // The same rule is for all STATE_xxxx_get_first() functions.
  1248. STATE_IMPORT DWORD STATE_WINAPI STATE_3D_sequence_get_first(DWORD animation3D_handle);
  1249. STATE_IMPORT DWORD STATE_WINAPI STATE_3D_sequence_get_next(DWORD sequence3d_handle);
  1250. //Returns a handle to the seq3d according to the given name
  1251. STATE_IMPORT DWORD STATE_WINAPI STATE_3D_sequence_get_using_name(DWORD animation3D_handle, char *sequence3d_name);
  1252. // Returns the 3D sequence name.
  1253. // The function returns a pointer to the name which is stored internally inside the 3D Engine
  1254. // Visual Basic users should use STATE_entity_get_name() instead.
  1255. // See also STATE_entity_get_namel()
  1256. STATE_IMPORT char *STATE_WINAPI STATE_3D_sequence_get_name(DWORD sequence3d_handle);
  1257. //Deletes all the existing 3d sequences
  1258. STATE_IMPORT void STATE_WINAPI STATE_3D_sequence_delete_all(DWORD animation3D_handle);
  1259. //Deletes the given seq3d.
  1260. // Note not to use the handle after it the seq3d was deleted
  1261. // Example:
  1262. // STATE_3D_sequence_delete(my_seq3d);
  1263. // my_seq3d=NULL;
  1264. STATE_IMPORT void STATE_WINAPI STATE_3D_sequence_delete(DWORD animation3D_handle,DWORD sequence3d_handle);
  1265. //Returns YES or NO. NO is returned if the given handle
  1266. //is not a handle of a 3D_sequence. YES is returned otherwise
  1267. STATE_IMPORT int STATE_WINAPI STATE_3D_sequence_is_3D_sequence(DWORD sequence3d_handle, char *function_asking);
  1268. //The default speed is 1. A speed of 2 means twice slower. A speed of 0.5 means twice as fast.
  1269. //The default duration between to consecutive frames is 1 tenth of a second.
  1270. // See also STATE_3D_sequence_set_frame_duration()
  1271. // Example:
  1272. // Lets assume that the frame duration wasn't changed from it default (you can change it using STATE_3D_sequence_set_frame_duration() )
  1273. //That means 1 tenth of a second between two frames.
  1274. //So if the speed is equal to two then the duration between consecutive frames will be 2 tenth of a second
  1275. STATE_IMPORT void STATE_WINAPI STATE_3D_sequence_set_speed(DWORD sequence3d_handle, double speed);
  1276. STATE_IMPORT double STATE_WINAPI STATE_3D_sequence_get_speed(DWORD sequence3d_handle);
  1277. //Returns the number of frames that belongs to the given sequence.
  1278. STATE_IMPORT int STATE_WINAPI STATE_3D_sequence_get_number_of_frames(DWORD sequence3d_handle);
  1279. //The time is in mili of seconds
  1280. //0 is the first frame of the sequence and (number_of_sequence_frames-1) is the last
  1281. //returns -1 if an error occurred.
  1282. STATE_IMPORT int STATE_WINAPI STATE_3D_sequence_get_frame_duration(DWORD sequence3d_handle, int frame_number);
  1283. //returns OK or VR_ERROR
  1284. STATE_IMPORT int STATE_WINAPI STATE_3D_sequence_set_frame_duration(DWORD sequence3d_handle, int frame_number, int duration);
  1285. //Returns YES or NO
  1286. //A cyclic sequence means that when the last frame is reached is starts all over again
  1287. // A non cyclic sequence will stop animating when the sequencs reaches the last frame.
  1288. STATE_IMPORT int STATE_WINAPI STATE_3D_sequence_is_cyclic(DWORD sequence3d_handle);
  1289. STATE_IMPORT void STATE_WINAPI STATE_3D_sequence_set_cyclic(DWORD sequence3d_handle, int YES_or_NO);
  1290. //Move the sequence to a specific position.
  1291. //current_frame should be in the range [0 - number_of_frames_in_sequence]
  1292. //Note that current_frame is double. Values like 3.76 are allowed
  1293. //In this case frames 3 and frame 4 will be interpolated to represent the given frame number
  1294. STATE_IMPORT void STATE_WINAPI STATE_3D_sequence_set_current_frame(DWORD sequence3d_handle, double current_frame);
  1295. //Note that current_frame is double. Values like 3.76 mean
  1296. //that frames 3 and frame 4 are interpolated in the correct proportions
  1297. //
  1298. STATE_IMPORT double STATE_WINAPI STATE_3D_sequence_get_current_frame(DWORD sequence3d_handle);
  1299. //Will stop the animation (model morphing)
  1300. STATE_IMPORT void STATE_WINAPI STATE_3D_sequence_pause(DWORD sequence3d_handle);
  1301. //This function will continue playing the animation after it was paused.
  1302. STATE_IMPORT void STATE_WINAPI STATE_3D_sequence_play(DWORD sequence3d_handle);
  1303. //Return YES or NO
  1304. STATE_IMPORT int STATE_WINAPI STATE_3D_sequence_is_paused(DWORD sequence3d_handle);
  1305. //Change the direction of the 3D sequence. For example
  1306. //If our character walks then one we will walk backwards we will want to change
  1307. //the order of the sequence.
  1308. STATE_IMPORT void STATE_WINAPI STATE_3D_sequence_backwards_play(DWORD sequence3d_handle, int YES_or_NO);
  1309. STATE_IMPORT int STATE_WINAPI STATE_3D_sequence_is_backwards(DWORD sequence3d_handle);
  1310. //Returns the number of times that we have passed the last frame in the sequence
  1311. //If the sequence is not cyclic then this function will return 0 or 1.
  1312. //This function can be used to check if the sequence was finished.
  1313. STATE_IMPORT int STATE_WINAPI STATE_3D_sequence_get_number_of_laps(DWORD sequence3d_handle);
  1314. //This function is very useful and is often used
  1315. // together with STATE_object_set_3D_sequence()
  1316. //This function creates a copy of the given sequence and add it
  1317. //to the 3D_sequence list of the given 3D_animation. 
  1318. //Usually the given animation3D_handle is the 3D animation that
  1319. // sequence_to_duplicate belongs too.
  1320. // Using this function we can create for each object
  1321. // its own copy of the 3D_sequence thus when we will change the sequence
  1322. // properties it will effect only this object.
  1323. // name is the name to be given to the duplicated copy.
  1324. //Return value: The function returns a handle to the new sequence that was created.
  1325. //See also STATE_object_set_3D_sequence() (very recommended)
  1326. // Example:
  1327. // STATE_3D_sequence_duplicate(robot_animation, walk_sequence,"robot1_walk");
  1328. STATE_IMPORT DWORD STATE_WINAPI STATE_3D_sequence_duplicate(DWORD animation3D_handle, DWORD sequence_to_duplicate, char *name);
  1329. //----------------------------------------------//
  1330. //========= T H E    L I G H T   A P I =========//
  1331. //----------------------------------------------//
  1332. //This API deals with making light. It supports dynamic colored Gouraud shading light !
  1333. // Please also notice this powerful function: STATE_engine_create_shadow()
  1334. // STATE_engine_create_shadow() uses projection method techniques for creating light
  1335. // while the light API is using Gouraud shading technique. Both methods
  1336. // could be mixed together to create great effects.
  1337. // Please also note that Gouraud shading is using vertex lighting.
  1338. // This means that the effects will be much better if there are more vertexes (that means more polygons)
  1339. //Use this function to create a new light.
  1340. // light_name is the name you want to call this light (give what ever name you want)
  1341. // The location is the x,y,z coordinates of the light location
  1342. // The location can be moved later using the function STATE_light_set_location()
  1343. // Example:
  1344. // double position[3]={10,20,30} ; //x=10, y=20, z=30
  1345. // DWORD light=STATE_light_create("my_light",position);
  1346. STATE_IMPORT DWORD STATE_WINAPI STATE_light_create(char *light_name, double location[3]);
  1347. #define LIGHT_SET 0
  1348. #define LIGHT_ADD 1
  1349. #define LIGHT_SUBTRACT 2
  1350. // This function is the function that actually creates the light !
  1351. // You wont see any light till you call this function.
  1352. // For dynamic lighting this function should be call over and over
  1353. // each time there is some change (for example the lit object changed position)
  1354. // For faster lighting in viewer mode use the function 
  1355. // STATE_light_set_entity_to_light(my_light,my_object);
  1356. // to light every object in the world separately.
  1357. // The light operation could be any one of the following
  1358. // LIGHT_SET, LIGHT_ADD, LIGHT_SUBTRACT
  1359. // Here is what each one will do:
  1360. // LIGHT_ADD:
  1361. // The calculated light will be added to the existing light.
  1362. // Each call will make the illuminated entity brighter
  1363. // LIGHT_SUBTRACT:
  1364. // This will cause the light source to create darkness !!!
  1365. // In the real world we dont have an equivalent for that.
  1366. // Subsequent calls will make the illuminated entity becomes darker on each call 
  1367. // LIGHT_SET:
  1368. // The entity will be illuminated while ignoring previous illuminations.
  1369. // Normally you will use this option.
  1370. // Subsequent calls wont make any different unless 
  1371. // The location, direction or other properties of the light have changed between calls or
  1372. // that we are illuminating a dynamic objects that has change it position
  1373. // (and thats why we have to recalculate its illumination)
  1374. // Example:
  1375. // STATE_light_activate(my_light, LIGHT_SET);
  1376. //
  1377. // The light is created with the following defaults:
  1378. // * A non-directional light ( use STATE_light_set_type_of_light() to change it and then use STATE_light_set_direction() to set the direction).
  1379. // * Infinite distance. The light could reach an infinite distance without getting less intense . Use STATE_light_set_distance_reach() to change it.
  1380. // * The whole world is illuminated. Use STATE_light_set_entity_to_light() to change it. This will make this function much faster.
  1381. // * White color. The default color is white (255,255,255) Use STATE_light_set_color() to change it.
  1382. STATE_IMPORT void STATE_WINAPI STATE_light_activate(DWORD light_handle, int light_operation);
  1383. //Returns a handle to the light according to the given name
  1384. STATE_IMPORT DWORD STATE_WINAPI STATE_light_get_using_name(char *light_name);
  1385. // This function, together with STATE_light_get_next_light()
  1386. // are used for going over all the defined lights
  1387. // Example
  1388. // for(DWORD light=STATE_light_get_first_light(); light!=NULL; light=STATE_light_get_next_light(light) {
  1389. // //Write here the code to do for each light
  1390. // }
  1391. // Note that the function STATE_light_create() adds a new light
  1392. // to top of the queue. So STATE_light_get_first_light()
  1393. // will always return the last light that was created.
  1394. // The same rule is for all STATE_xxxx_get_first_xxxx() functions.
  1395. STATE_IMPORT DWORD STATE_WINAPI STATE_light_get_first_light(void);
  1396. STATE_IMPORT DWORD STATE_WINAPI STATE_light_get_next_light(DWORD light_handle);
  1397. //Sets the location of the light.
  1398. // Example
  1399. // double location[3]={10,20,30} //setting the X,Y,Z coordinates
  1400. // STATE_light_set_location(my_light,location);
  1401. STATE_IMPORT void STATE_WINAPI STATE_light_set_location(DWORD light_handle, double location[3]);
  1402. STATE_IMPORT void STATE_WINAPI STATE_light_get_location(DWORD light_handle, double location[3]);
  1403. // Sets the direction of the light. The direction of the light is relevant only if the 
  1404. // light type is set to be directional.
  1405. // The direction is set by giving a point in the world towards which the light should be pointed
  1406. // See also STATE_light_set_direction()
  1407. // Example:
  1408. // double location[3]={0,0,10000}; //we make a sun so let put it up in the sky
  1409. // DWORD my_light=STATE_light_create("the sun", location);
  1410. // double point={0,0,0}; //The sun should be pointing down
  1411. // STATE_light_point_at(my_light, point);
  1412. // STATE_light_set_type_of_light(my_light, LIGHT_DEFAULT_POINTED_LIGHT); //by default the light is not directional.
  1413. // STATE_light_activate(my_light, LIGHT_SET); //let there be light ...
  1414. STATE_IMPORT void STATE_WINAPI STATE_light_point_at(DWORD light_handle, double point[3]);
  1415. //Sets the direction of the light. The direction of the light is relevant only if the 
  1416. // light type is set to be directional.
  1417. // Note that a direction of {1,1,1} is exactly the same as {2,2,2}
  1418. // Example:
  1419. // double location[3]={0,0,0}
  1420. // DWORD my_light=STATE_light_create("my_light", location);
  1421. // double direction={1,1,0};
  1422. // STATE_light_set_direction(my_light, direction);
  1423. // STATE_light_set_type_of_light(my_light, LIGHT_DEFAULT_POINTED_LIGHT); //by default the light is not directional.
  1424. // STATE_light_activate(my_light, LIGHT_SET); //let there be light ...
  1425. STATE_IMPORT void STATE_WINAPI STATE_light_set_direction(DWORD light_handle, double direction[3]);
  1426. STATE_IMPORT void STATE_WINAPI STATE_light_get_direction(DWORD light_handle, double direction[3]);
  1427. //Set the color of the light. The default is {255,255,255} which is white.
  1428. STATE_IMPORT void STATE_WINAPI STATE_light_set_color(DWORD light_handle, BYTE color[3]);
  1429. STATE_IMPORT void STATE_WINAPI STATE_light_get_color(DWORD light_handle, BYTE color[3]);
  1430. //Remove light from the entity that is associated with the light source.
  1431. //Use STATE_light_set_entity_to_light() for choosing the entity that
  1432. //the light will be removed from.
  1433. //Note !! The function does not delete the light itself
  1434. //for deleting the light use STATE_light_delete()
  1435. //See also STATE_polygon_remove_light(), STATE_object_remove_light(), STATE_group_remove_light()
  1436. STATE_IMPORT void STATE_WINAPI STATE_light_remove_light(DWORD light_handle);
  1437. // Constant values for type_of_light (The values could be ored together e.g LIGHT_DIRECTIONAL | LIGHT_AMBIENT
  1438. #define LIGHT_DIRECTIONAL 1
  1439. #define LIGHT_EFFECTED_BY_DISTANCE_LINEAR 2
  1440. #define LIGHT_EFFECTED_BY_DISTANCE_SQUARE 4
  1441. #define LIGHT_AMBIENT 8
  1442. #define LIGHT_DIFFUSE 16
  1443. #define LIGHT_SPECULAR 32
  1444. //In most cases you will probably use one of the two combinations below
  1445. #define LIGHT_DEFAULT (LIGHT_EFFECTED_BY_DISTANCE_LINEAR | LIGHT_AMBIENT |LIGHT_DIFFUSE | LIGHT_SPECULAR)
  1446. #define LIGHT_DEFAULT_POINTED_LIGHT (LIGHT_DIRECTIONAL | LIGHT_EFFECTED_BY_DISTANCE_LINEAR | LIGHT_AMBIENT |LIGHT_DIFFUSE | LIGHT_SPECULAR)
  1447. #define LIGHT_DEFAULT_FAST (LIGHT_EFFECTED_BY_DISTANCE_LINEAR | LIGHT_AMBIENT |LIGHT_DIFFUSE )
  1448. #define LIGHT_DEFAULT_SUPER_FAST (LIGHT_EFFECTED_BY_DISTANCE_LINEAR | LIGHT_AMBIENT)
  1449. // The type of light can be combined from the following options 
  1450. // LIGHT_DIRECTIONAL
  1451. // Denote that the light is directional. The direction could be set by STATE_light_get_direction()
  1452. // LIGHT_EFFECTED_BY_DISTANCE_LINEAR 
  1453. // The light is reduced according to the distance from the light source location
  1454. // The reduction is linear
  1455. // This flag is included in the default light type though
  1456. // NOTE that in order to feel its effect you have first to define the light source
  1457. // maximum reach. Do that with STATE_light_set_distance_reach()
  1458. // LIGHT_EFFECTED_BY_DISTANCE_SQUARE 
  1459. // The effect is that the light reduction is small near the light sourse and very strong
  1460. // near the end of the light reach area
  1461. // LIGHT_AMBIENT 8
  1462. // If this flag is not set then the ambient light component will not be used
  1463. // LIGHT_DIFFUSE 16
  1464. // If this flag is not set then the diffuse light component will not be used
  1465. // LIGHT_SPECULAR 32
  1466. // If this flag is not set then the ambient light component will not be used
  1467. //In most cases you will probably use one of the two combinations below
  1468. // LIGHT_DEFAULT (LIGHT_EFFECTED_BY_DISTANCE_LINEAR | LIGHT_AMBIENT |LIGHT_DIFFUSE | LIGHT_SPECULAR)
  1469. // LIGHT_DEFAULT_POINTED_LIGHT (LIGHT_DIRECTIONAL | LIGHT_EFFECTED_BY_DISTANCE_LINEAR | LIGHT_AMBIENT |LIGHT_DIFFUSE | LIGHT_SPECULAR)
  1470. //
  1471. // The default light type is LIGHT_DEFAULT
  1472. // Example A:
  1473. // //Setting a directional light
  1474. // STATE_light_set_type_of_light(my_light,LIGHT_DEFAULT_POINTED_LIGHT);
  1475. // Example B:
  1476. // //using LIGHT_EFFECTED_BY_DISTANCE_SQUARE
  1477. // STATE_light_set_type_of_light(my_light, LIGHT_DIRECTIONAL | LIGHT_EFFECTED_BY_DISTANCE_SQUARE | LIGHT_AMBIENT |LIGHT_DIFFUSE | LIGHT_SPECULAR);
  1478. STATE_IMPORT void STATE_WINAPI STATE_light_set_type_of_light(DWORD light_handle, int type_of_light);
  1479. STATE_IMPORT int STATE_WINAPI STATE_light_get_type_of_light(DWORD light_handle);
  1480. //Gives much more accurate lighting that takes into account obstacles between
  1481. // the lit surface and the source of light.
  1482. // The disadvantage is that lighting is much more slower when it is on.
  1483. // Dont use it for lighting every render.
  1484. // The default is NO (not activated)
  1485. // Example:
  1486. // STATE_light_set_ray_tracing(my_light, YES);
  1487. STATE_IMPORT void STATE_WINAPI STATE_light_set_ray_tracing(DWORD light_handle, int YES_or_NO);
  1488. STATE_IMPORT int STATE_WINAPI STATE_light_is_ray_tracing(DWORD light_handle);
  1489. //Set the distance that the light source can reach. The strength of the light is 
  1490. // decreasing as it gets further away from the light source. 
  1491. // A distance reach of -1 has a special meaning. It means an infinite reach.
  1492. // This is the default (infinite reach) so in order to see the effect of the distance
  1493. // one needs to call this function first with a value different than -1.
  1494. // Returns OK or VR_ERROR.
  1495. // Example:
  1496. // STATE_light_set_distance_reach(my_light, 100000);
  1497. STATE_IMPORT void STATE_WINAPI STATE_light_set_distance_reach(DWORD light_handle, double distance_reach);
  1498. STATE_IMPORT double STATE_WINAPI STATE_light_get_distance_reach(DWORD light_handle);
  1499. //Set the target object that will be lit by our light.
  1500. // entity_to_light could be a handle to a group an object or a polygon.
  1501. // The default entity is the whole world
  1502. // To make the function STATE_light_activate() you should change it to illuminate just the 
  1503. // the entity that needs lighting.
  1504. // Examples:
  1505. // A)
  1506. // STATE_light_set_entity_to_light(my_light, polyogn_handle);
  1507. // In this case when the light will be activated it will only influence
  1508. // the given polygon.
  1509. // B)
  1510. // STATE_light_set_entity_to_light(my_light, NULL);
  1511. // NULL is a valid group_handle. It means the whole world
  1512. // In this case when the light will be activated it will influence
  1513. // the whole world.
  1514. // C)
  1515. // STATE_light_set_entity_to_light(my_light, chair_group_handle);
  1516. // When the light will be activated it will only light the chair
  1517. // This is a nice way to paint a specific item in the world.
  1518. //
  1519. // Returns OK or VR_ERROR
  1520. STATE_IMPORT int STATE_WINAPI STATE_light_set_entity_to_light(DWORD light_handle, DWORD entity_to_light);
  1521. STATE_IMPORT DWORD STATE_WINAPI STATE_light_get_entity_to_light(DWORD light_handle);
  1522. // Activates the light automatically before each render.
  1523. // The usage of this function is for dynamic lighting.
  1524. // If the light source moves every render (or other property of the light is changed)
  1525. // then the light has to be updated as well
  1526. // If however the light source properties do not change between every render then you
  1527. // should not use this method (it will waste CPU time).
  1528. // Another use for this method is for lighting dynamic objects.
  1529. // Again use it only if the dynamic object moves or rotates every render
  1530. // otherwise it is better to call STATE_light_activate() explicitly after
  1531. // each time that the object changes its position.
  1532. //
  1533. // Parameters:
  1534. //
  1535. // light_operation:
  1536. // Determines how the light is going to be activated every render.
  1537. // possible values are: LIGHT_ADD, LIGHT_SUBTRACT and LIGHT_SET
  1538. // Normally you would give LIGHT_SET. The other two options can be 
  1539. // used for creating special effects like gradually darkening the world
  1540. // or a "get killed" effect when the screen turns into red (using a red colored light)
  1541. // The light_operation argument is only relevant if YES_or_NO==YES
  1542. //
  1543. // YES_or_NO:
  1544. // YES to enable. Give No to stop activating the light before each render. The default is NO
  1545. //
  1546. //
  1547. //
  1548. // Important:
  1549. // Dynamic lighting can be very slow if not done correctly. Note the following points:
  1550. // 1) Never light the whole world every render. Instead light only the moving objects that need to be re-lighted
  1551. // 2) Don't use ray tracing for dynamic lighting.
  1552. // See example "C" below.
  1553. //
  1554. //Examples:
  1555. // A)
  1556. // STATE_light_activate_before_each_render(my_light, YES, LIGHT_SET);
  1557. // B)
  1558. // //Disable dynamic lighting.
  1559. // STATE_light_activate_before_each_render(my_light, NO, 0); //doesnt matter what number is given (for the light operation)
  1560. //
  1561. // C)   //Creating fast dynamic lighting.
  1562. // //In this example to light sources are used to illuminate to dynmaic (moving) objects.
  1563. //
  1564. // STATE_light_set_entity_to_light(light1, object1);
  1565. // STATE_light_set_entity_to_light(light2, object2);
  1566. //
  1567. // STATE_light_set_type_of_light(light1, LIGHT_DEFAULT_FAST);
  1568. // STATE_light_set_type_of_light(light1, LIGHT_DEFAULT_FAST);
  1569. // STATE_light_activate_before_each_render(light1, YES, LIGHT_SET);
  1570. // STATE_light_activate_before_each_render(light2, YES, LIGHT_SET);
  1571. STATE_IMPORT void STATE_WINAPI STATE_light_activate_before_each_render(DWORD light_handle, int YES_or_NO, int light_operation);
  1572. //The function also returns in the light_operation param the type of operation.
  1573. // Example:
  1574. // int light_operation;
  1575. // STATE_light_is_activated_before_render(my_light, &light_operation);
  1576. STATE_IMPORT int STATE_WINAPI STATE_light_is_activated_before_render(DWORD light_handle, int *light_operation);
  1577. // Each source of light is combined of three different channels, they are
  1578. // called Ambient, Diffuse and specular. 
  1579. // Ambient light:
  1580. // Ambient light is light that doesn't come from any particular direction
  1581. // Objects illuminated by ambient light are evenly lit on all surfaces.
  1582. // For example if we create a room with a few light sources then even
  1583. // if all the light sources are turned off we will still have some light in the room.
  1584. // The ambient channel used to simulate this non-directional environment light
  1585. // Diffuse light:
  1586. // Diffuse light comes from a particular direction but is reflected evenly of the surface
  1587. // A good example of a diffuse light source is fluorescent lighting.
  1588. //
  1589. // Every source light is actually a combination of the three type of lights
  1590. // Feel free to play with these values till you get the desired results.
  1591. // The rule is that if it looks good then it is correct..
  1592. // The resulted lighting is a combination of the material characteristic and the type of light
  1593. // For controlling the material light properties see STATE_polygon_set_ambient(), STATE_group_set_ambient(), STATE_object_set_ambient()
  1594. //
  1595. // The given value should be a positive number or zero.
  1596. // The default is one. Common values are in the range of 0 to 10 
  1597. // Examples:
  1598. // A)
  1599. // STATE_light_set_ambient(my_light, 1); //the default
  1600. // B)
  1601. // STATE_light_set_ambient(my_light, 2.8); //A very strong ambient lighting.
  1602. // C)
  1603. // STATE_light_set_ambient(my_light, 0); //Shutting off the ambient channel
  1604. //    //It is better by not including the ambient light
  1605. //    //flag when calling STATE_light_set_type_of_light()
  1606. //
  1607. // The same goes for the diffuse and specular lighting.
  1608. STATE_IMPORT void STATE_WINAPI STATE_light_set_ambient(DWORD light_handle, double value);
  1609. STATE_IMPORT void STATE_WINAPI STATE_light_set_diffuse(DWORD light_handle, double value);
  1610. STATE_IMPORT void STATE_WINAPI STATE_light_set_specular(DWORD light_handle, double value);
  1611. STATE_IMPORT double STATE_WINAPI STATE_light_get_ambient(DWORD light_handle);
  1612. STATE_IMPORT double STATE_WINAPI STATE_light_get_diffuse(DWORD light_handle);
  1613. STATE_IMPORT double STATE_WINAPI STATE_light_get_specular(DWORD light_handle);
  1614. // Use this function to control the size of the light spot that
  1615. // the specular lighting is creating.
  1616. // The default value is 1.
  1617. // The smaller the number is the bigger the light spot is.
  1618. // Values should be any positive number or zero.
  1619. // Normally values would be in the range of 0 to 10
  1620. STATE_IMPORT void STATE_WINAPI STATE_light_set_specular_shining(DWORD light_handle, double value);
  1621. STATE_IMPORT double STATE_WINAPI STATE_light_get_specular_shining(DWORD light_handle);
  1622. //Returns YES or NO. NO is returned if the given handle
  1623. //is not a handle of a light. YES is returned otherwise
  1624. STATE_IMPORT int STATE_WINAPI STATE_light_is_light(DWORD light_handle, char *function_asking);
  1625. //Deletes all the existing lights
  1626. STATE_IMPORT void STATE_WINAPI STATE_light_delete_all(void);
  1627. //Deletes the given light.
  1628. // Note that the object in the world will stay litted even after the light was deleted
  1629. // To remove the light effect from the objects use STATE_light_remove_light()
  1630. // or STATE_group_remove_light()
  1631. // Note not to use the handle after it the light was deleted
  1632. // Example:
  1633. // STATE_light_delete(my_light);
  1634. // my_light=NULL;
  1635. STATE_IMPORT void STATE_WINAPI STATE_light_delete(DWORD light_handle);
  1636. //Returns the light source name
  1637. // The function returns a pointer to the name which is stored internally inside the 3D Engine
  1638. // Visual Basic users should use STATE_entity_get_name() instead.
  1639. // See also STATE_entity_get_namel()
  1640. STATE_IMPORT char *STATE_WINAPI STATE_light_get_name(DWORD light_handle);
  1641. STATE_IMPORT void STATE_WINAPI STATE_light_set_name(DWORD light_handle, char *name);
  1642. //Disables or enables a light source.
  1643. //This function is used before creating a light map (STATE_polygon_create_lightmap() )
  1644. //A light source that is disabled wont be included in the process of generating a lightmap
  1645. // See also STATE_light_is_disabled()
  1646. //
  1647. // Example:
  1648. // STATE_light_disable(my_light, YES);
  1649. STATE_IMPORT void STATE_WINAPI STATE_light_disable(DWORD light_handle, int YES_or_NO);
  1650. STATE_IMPORT int STATE_WINAPI STATE_light_is_disabled(DWORD light_handle);
  1651. //Calling this function with NO will omit the given light source when saving the world.
  1652. // The default is YES.
  1653. //Example: STATE_light_set_save_flag(my_light, NO);
  1654. STATE_IMPORT void STATE_WINAPI STATE_light_set_save_flag(DWORD light_handle, int YES_or_NO);
  1655. //--------------------------------------------------------//
  1656. //=========== T H E    A N I M A T I O N   A P I =========//
  1657. //--------------------------------------------------------//
  1658. // animation is a set of bitmaps that replaces itself according
  1659. // to a given time sequence.
  1660. // A polygon can have a regular bitmap or it can have an animation.
  1661. // The idea is that one can just give a list of bitmaps with time sequence
  1662. // and the engine deals with all the rest.
  1663. // Animations are very useful when used on a rotated polygons.
  1664. // You can then define animation  sequences from 8 sides
  1665. // and the graphic engine sees that the right bitmap is
  1666. // shown each time.
  1667. // Each animation can include up to 8 different bitmap sequences
  1668. // This is used for representing a rotated polygon from 8 different sides.
  1669. // actually there are only 5 bitmaps sequences (the rest are figured automatically
  1670. // by the engine by mirroring some bitmaps)
  1671. // Here are the 5 constants that represent the 5 different list
  1672. #define  BITMAP_LIST_FRONT 1  //a list of bitmaps representing the view from the front
  1673. #define  BITMAP_LIST_FRONT_SIDED 2  //a list of bitmaps representing the view from the front-side (45 degrees) angle
  1674. #define  BITMAP_LIST_SIDE 3  //a list of bitmaps representing the view from the side
  1675. #define  BITMAP_LIST_BACK_SIDED 4  //a list of bitmaps representing the view from the back-side (135 degrees) angle
  1676. #define  BITMAP_LIST_BACK 5  //a list of bitmaps representing the view from the back
  1677. //
  1678. // To understand animation better, just look at one of the sample worlds
  1679. // that contain an animation. Try playing with the list of bitmaps and the other params.
  1680. // Returns YES or NO.
  1681. // YES , if the given handle is an animation handle. NO if not.
  1682. // If it is not an animation handle , a message box will appear,
  1683. // the title of this message box will be the parameter "function_asking"
  1684. // if function_asking==NULL than no popup will be created.
  1685. // See also IS_ANIMATION()
  1686. STATE_IMPORT int STATE_WINAPI STATE_animation_is_animation(DWORD animation_handle, char *function_asking);
  1687. // The given name should be in capital letters
  1688. // If the return value is 0 it means 
  1689. // that there is no animation with the given name.
  1690. STATE_IMPORT DWORD STATE_WINAPI STATE_animation_get_handle(char *animation_name);
  1691. STATE_IMPORT DWORD STATE_WINAPI STATE_animation_get_first_animation(void); 
  1692. STATE_IMPORT DWORD STATE_WINAPI STATE_animation_get_next(DWORD animation_handle); 
  1693. //Creates an empty animation 
  1694. //name: give any name you want. 
  1695. // NOTE that if the name is already in use by another animation
  1696. // the function would automatically add a number to the end of the name
  1697. // After creating the animation use STATE_animation_add_bitmap() to add bitmaps
  1698. STATE_IMPORT DWORD STATE_WINAPI STATE_animation_create(char *name); 
  1699. // bitmap_list: is one of the five constants: BITMAP_LIST_FRONT, BITMAP_LIST_FRONT_SIDED, BITMAP_LIST_SIDE, BITMAP_LIST_BACK_SIDED, BITMAP_LIST_BACK
  1700. // bitmap_handle: is the frame to add
  1701. // bitmap_position_index: 0 means put this frame as the first frame
  1702. //   1 means that we want to insert the bitmap after the first bitmap
  1703. // (our bitmap will become the second bitmap)
  1704. //   n means that we want to insert the bitmap AFTER the n bitmap
  1705. //   -1 has a special meaning it will put the frame as the last one
  1706. //   If the given index is too big than the frame will be set as the last frame.
  1707. //
  1708. // The return value: returns the location of the added bitmap in the given list.
  1709. // usually this value is equal to the given "bitmap_position_index" argument (unless
  1710. // bitmap_position_index==-1 or is too big)
  1711. STATE_IMPORT int STATE_WINAPI STATE_animation_add_bitmap(DWORD animation_handle, int bitmap_list ,DWORD bitmap_handle, int bitmap_position_index); 
  1712. // removes a bitmap from the given list
  1713. // bitmap_list: is one of the five constants: BITMAP_LIST_FRONT, BITMAP_LIST_FRONT_SIDED, BITMAP_LIST_SIDE, BITMAP_LIST_BACK_SIDED, BITMAP_LIST_BACK
  1714. // bitmap_position_index: 0 means remove the first frame
  1715. //   1 means remove the second frame etc ...
  1716. //   -1 has a special meaning it will remove the frame at the end of the list
  1717. //   If the given index is too big than the last frame will be removed.
  1718. //
  1719. STATE_IMPORT int STATE_WINAPI STATE_animation_remove_bitmap(DWORD animation_handle, int bitmap_list ,int bitmap_position_index); 
  1720. // Returns a handle to the bitmap in the specified list and index
  1721. // bitmap_list: is one of the five constants: BITMAP_LIST_FRONT, BITMAP_LIST_FRONT_SIDED, BITMAP_LIST_SIDE, BITMAP_LIST_BACK_SIDED, BITMAP_LIST_BACK
  1722. // bitmap_position_index: 0 will return the first bitmap
  1723. //   1 the second bitmap etc ...
  1724. STATE_IMPORT DWORD STATE_WINAPI STATE_animation_get_bitmap(DWORD animation_handle, int bitmap_list ,int bitmap_position_index); 
  1725. // time_for_each_frame: should be equal to STATE_animation_get_number_of_frames()
  1726. // before calling this function you should initialize the array ( DWORD time_for_each_frame[])
  1727. // the time is in hundreds of seconds.
  1728. // Returns OK or VR_ERROR
  1729. // Example:
  1730. // time_for_each_frame[0]= 100; //The first frame will be shown for one second