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

射击游戏

开发平台:

Visual C++

  1. // --------
  2. // | Room |
  3. // |   A  |
  4. // |    |
  5. // | ------
  6. // ------ |
  7. // |Room  |
  8. // |B     |
  9. // |------|
  10. //
  11. // Note that from Room A it is not possible to see room B and the other way around
  12. // Many games (like Quake ...) use this technique extensively.
  13. // Parameters:
  14. //
  15. // visited_points_file_name: A file that holds a list of x,y,z points. This file is created automatically
  16. //   when calling STATE_engine_load_world() with the OUTPUT_RENDER_LOCATIONS.
  17. //
  18. // reset_database: should be YES or NO. If NO then the function will use the previously created speed.pvs file and will
  19. // add to it new information derived from the given visited_points_file_name
  20. //
  21. //
  22. //  make_compact_database: YES or NO. If YES the database will be significantly smaller. In some worlds the compact database
  23. // will give a much smaller rendering speed up. In other worlds it will give better results then the 
  24. // detailed database (none compact). One has to check both methods on the final world.
  25. // The best performance will be achieved when make_compact_database==NO and the points
  26. // in the visited_points_file_name are selected cafully so that there are not too many but 
  27. // there are enough to represent all the location that deffer by the polygon visible from these locations.
  28. // for example, if there are two ajacent points that when the camera is located in each one of them 
  29. // there are xxx visible polygons. So if from both location there are the same polygons visible
  30. // so one of these points might be ommited.
  31. STATE_IMPORT int STATE_WINAPI STATE_engine_create_speed_database(char *visited_points_file_name, int reset_database, int make_compact_database);
  32. //Determines the distance that the engine will set for all created patches from the polygon
  33. //the patches are put on. (To learn about patches and what they are used for please see
  34. //STATE_polygon_add_patch_easy() or STATE_engine_create_shadow() )
  35. //
  36. // Q: Why do we need this function ?
  37. //
  38. // A: When putting a patch over a polygon we get two polygons one on top of the other
  39. //   Some 3D cards can not handle this situation cleanly because of small floating point
  40. //    glitches when zbuffer is done. The artifact is stripes on the patch (coming from the polygon behind)
  41. //    This function can be used to solve this problem so that patches look better.
  42. //
  43. //The default distance is 2. This function was introduced with version 5.4 of the engine.
  44. //previous versions of the engine made patches with 0 distance.
  45. //
  46. // Parameters:
  47. // offset_size: The distance is explained above.
  48. //  Use the smallest number that makes the patches look good
  49. //  example of possible values: 0, 0.4, 1, 10, 40
  50. //  A too big number would make shadows created with STATE_engine_create_shadow()
  51. //  to be inaccurate
  52. //
  53. // See also:
  54. // STATE_engine_get_patches_offset(), STATE_polygon_add_patch_easy() 
  55. // STATE_polygon_add_patch(), STATE_polygon_add_shadow_patch(), STATE_engine_create_shadow()
  56. STATE_IMPORT void STATE_WINAPI STATE_engine_set_patches_offset(double offset_size);
  57. //For more details please see STATE_engine_set_patches_offset()
  58. //Returns the distance that is used by the engine when creating patches
  59. // (The distance from the created patch and the polygon that the patch is put on)
  60. STATE_IMPORT double STATE_WINAPI STATE_engine_get_patches_offset(void);
  61. // Why do we need this function
  62. //------------------------------
  63. //This function is used to group together many small bitmaps into several bigger bitmaps.
  64. //This is very useful in improving rendering frames per second and shortening loading
  65. //time of the world. One of the techniques used in today's leading games is to create
  66. //small lightmaps (second bitmaps) to every polygon in the world (This can be done using STATE 3D WebmakerWorldBuilder)
  67. //This technique can drastically improve the graphics quality of the world though they create a huge number of small bitmaps
  68. //For example in one of Half-Life worlds there are about 4000 lightmaps each one at the average size of 5*9 pixels.
  69. //Loading 4000 bitmaps can take quite sometime. Using STATE_engine_reduce_number_of_bitmaps()
  70. //one can group those small bitmaps into bigger ones. For example 4000 5x9 bitmaps can be grouped to only 3 bitmaps of 256x256 !!!
  71. //
  72. // Please note that bitmap that are transparent or that are used by a STATE 2D animation or that are tiled will not be grouped together.
  73. //
  74. // How to use this function
  75. // -------------------------
  76. // Load your world in editor mode (Give the EDITOR_MODE flag when calling STATE_engine_load_world() )
  77. // Call STATE_engine_reduce_number_of_bitmaps()
  78. // Call STATE_engine_save()
  79. //
  80. // This will save a new copy of your world with the small bitmaps grouped in big bitmaps.
  81. // Note that not always we would like to  group all the small bitmaps in big bitmaps
  82. // For example if we have a bitmap that we use as a shooting mark (to put on walls after shooting at them)
  83. // then we would like this bitmap to stay separate in its own file so that we could easily
  84. // call STATE_polygon_set_bitmap_fill()
  85. // the include_filter and exclude_filter parameters are used in order to give 
  86. //  the programmer the freedom to group together only the bitmaps that he wants to
  87. //
  88. //  Example:
  89. // ---------
  90. // //The following example will group together all the bitmaps that are equal or smaller than 32x32 bitmap into bitmaps in the size of 256x256
  91. //  STATE_engine_reduce_number_of_bitmaps(32, 256, "..\bitmaps", NULL, NULL, YES);
  92. //
  93. // Return Value
  94. // -------------
  95. // Returns the number of bitmaps that were replaced and group together in bigger bitmaps
  96. //
  97. //
  98. // Parameters:
  99. // replace_below_equal_this_width:
  100. // Only bitmaps equal or smaller than this size will be replaced
  101. // Here are some common values to use 32, 20 and so on.
  102. // a value of 32 means that only bitmaps that are smaller then a 32x32 bitmap will be included
  103. // a bitmap of 33x2 is not consider smaller since it does not fit in inside the 32x32 square.
  104. //
  105. // big_bitmaps_width
  106. // The size of the bitmaps that will be created and will be filled with the small bitmaps
  107. // Values must be in the power of to (i.e 256, 512, 1024, 2048, 4096 etc.)
  108. // For example giving 256 means that the engine will use 256x256 bitmaps.
  109. // This bitmap is always square.
  110. // By giving a big value (such as 1024 or 2048) you can group all the bitmaps in your world into
  111. // one big bitmap !
  112. // So what is the right value to use ? We recommend using 256 since
  113. // there are some 3D card that can not display bitmaps larger than 256x256
  114. // One can test different values and check how it effect the rendering speed.
  115. //
  116. // bitmaps_folder
  117. // The directory where the bitmaps can be found. Bitmaps that are not in this folder are not going to be grouped 
  118. // inside big bitmaps.
  119. //
  120. // include_filter
  121. // Only bitmaps with name that contains the "include filter" string will be groupedreplaced
  122. // If this parameter is NULL then all the bitmaps in the given folder will be included
  123. // Example: If the include_filter is "xx"  then the following bitmaps will be included xx.bmp xx12345.bmp 123xx.bmp but not x123x.bmp
  124. //
  125. // exclude_filter
  126. // Bitmaps with name that contains the "Exclude filter" string will NOT be groupedreplaced
  127. //
  128. //
  129. // create_8bit_bitmaps
  130. // Whether the group bitmaps are in 8 bit or 24 bit format.
  131. // Could be YES or NO. YES is recommended for faster loading time.
  132. // In some cases NO could give better graphics quality.
  133. //
  134. STATE_IMPORT int STATE_WINAPI STATE_engine_reduce_number_of_bitmaps(int replace_below_equal_this_width, int big_bitmaps_width, char *bitmaps_folder, char *include_filter, char *exclude_filter, int create_8bit_bitmaps);
  135. #define STEREOSCOPIC_OFF 0
  136. #define STEREOSCOPIC_CYAN_RED 1 //The left lenseye is cyan. The right lenseye is red.
  137. #define STEREOSCOPIC_RED_CYAN 2 //The right lenseye is cyan. The left lenseye is red.
  138. #define STEREOSCOPIC_BLUE_RED 3 //The right lenseye is red. The left lenseye is blue
  139. #define STEREOSCOPIC_RED_BLUE 4 //The left lenseye is red. The right lenseye is blue
  140. #define STEREOSCOPIC_GREEN_RED 5 //The right lenseye is red. The left lenseye is green
  141. #define STEREOSCOPIC_RED_GREEN 6 //The left lenseye is red. The right lenseye is green
  142. #define STEREOSCOPIC_NUMBER_OF_MODES 7
  143. // If you have a pair of 3D paper glasses (Anaglyphic glasses) 
  144. // then this function can do amazing things for you.
  145. // Once this function is called, the engine will render
  146. // your scene in a way that will match your 3D glasses.
  147. // The result is a real 3D rendering with a real sense of depth.
  148. // If you don't have  3D paper glasses then you should quickly get a pair.  
  149. // 3D paper glasses should not cost more than 1 dollar.
  150. // There are some Web Sites which even give them for free.
  151. // Note that Cyan is the color that one gets 
  152. // when adding green to blue (CYAN RGB= 0,255,255).
  153. // www.rainbowsymphonystore.com is a good place to buy 3D Glasses.
  154. // 3D glasses are very cheap ( $0.4 for a pair)
  155. // Check out http://www.rainbowsymphonystore.com/3dglasses.html
  156. // www.d3.com is another option.
  157. // Any other place is probably just as good.
  158. // We recommend the glasses sold by www.d3.com though
  159. // any other suitable product from other companies can do the work.
  160. //
  161. // If your company is using a type of 3D glasses or any type of 3D virtual reality head set that
  162. // is not supported by the engine then you can write to us and we will
  163. // try to add support for this equipment.
  164. // 
  165. // Parameters:
  166. // stereoscopic_mode:
  167. // set the mode of work
  168. //
  169. // distance_between_eyes:
  170. // Any number starting from 0.
  171. // A bigger number will increase the 3D effect
  172. // 0 will result in no 3D effect.
  173. // The 3D effect is created using a combination of two images
  174. // taken from adjacent locations. This mimics the way it is done
  175. // in nature. In nature our brain receives two images, one from each eye.
  176. //
  177. // Note that getting an anaglyphic image is not without a price.
  178. // In this mode the rendering operation will be about 40 percent slower.
  179. //
  180. // Examples:
  181. // 1)
  182. // //Initializing anaglyphic mode. You can call this function anytime
  183. // //after the world is loaded.
  184. // //Try different numbers for distance_between_eyes till you get the best effect
  185. // STATE_engine_set_stereoscopic_mode(STEREOSCOPIC_RED_CYAN, 100);
  186. //
  187. //  2)
  188. // //Canceling the anaglyphic mode. 
  189. //  STATE_engine_set_stereoscopic_mode(STEREOSCOPIC_OFF, 100);
  190. STATE_IMPORT void STATE_WINAPI STATE_engine_set_stereoscopic_mode(int stereoscopic_mode, double distance_between_eyes);
  191. STATE_IMPORT char *STATE_WINAPI STATE_engine_get_stereoscopic_mode_name(void);
  192. //Switch between the different stereoscopic modes.
  193. //See also STATE_engine_get_stereoscopic_mode_name()
  194. //returns the new mode number
  195. STATE_IMPORT int STATE_WINAPI STATE_engine_switch_stereoscopic_mode(void);
  196. //Returns the current stereoscopic mode
  197. //For more information see STATE_engine_set_stereoscopic_mode()
  198. STATE_IMPORT int STATE_WINAPI STATE_engine_get_stereoscopic_mode(void);
  199. // A very useful and easy to use function.
  200. // Layers are polygons that appear on top of the rendered world.
  201. // Think of layers as the 2D mechanism of the engine.
  202. // One can use layers for displaying information such as the
  203. // player health, a cross hair, simulate looking through binocular etc.
  204. // The function returns a handle to a polygon which is the created layer.
  205. // While doing software rendering the function has no effect.
  206. // Using this function is a lot faster and powerful than using Windows GDI
  207. // functions. ( In other words using layer is better than calling STATE_engine_render_on_dc() for
  208. // obtaining the Device Context handle and then to use Windows functions for drawing on the DC. See STATE_engine_render_on_dc() 
  209. // for more information)
  210. //
  211. // Using STATE_engine_add_layer() one can easily create a square polygon
  212. // with a bitmap on it. The first four parameters define the layer size and position.
  213. // No matter what is the size of the window which you render on the
  214. // top left corner is always 0,0 and the bottom right corner is 100,100
  215. // For example if the four numbers 0,0,50,100 are given as the first 4 parameters
  216. // then the layer will occupied the half left of the rendered screen
  217. // If there are two or more polygon layers that overlap then the one which was 
  218. // first created will be on top.
  219. //
  220. // Return value
  221. // The function returns a handle to a polygon which is used for the layer.
  222. // One can use all the polygon functions in order to modify the created layer
  223. // A few of the functions you might probably want to use are:
  224. // STATE_polygon_disable(), STATE_polygon_enable(), STATE_polygon_set_bitmap_fill()
  225. // STATE_polygon_set_light(), STATE_polygon_set_translucent(). STATE_polygon_move() 
  226. // STATE_polygon_shift_bitmap() 
  227. //
  228. //
  229. // Parameters:
  230. // left_x, top_y:
  231. // The top left corner of the created layer.
  232. // Any number in range [0-100]. (0,0) is the top left corner
  233. // while (100,100) is the bottom right corner
  234. //
  235. // right_x, bottom_y:
  236. // The bottom right corner of the created layer.
  237. // Any number in range [0-100]. (0,0) is the top left corner
  238. // while (100,100) is the bottom right corner
  239. //
  240. //
  241. // Note that after the a layer is created it is possible
  242. // to changemove the points using the Polygon and Point APIs
  243. //
  244. //
  245. // bitmap_handle: A handle to a bitmap that will be used.
  246. // Give NULL if your layer will use color fill.
  247. // Note that after the layer is created, one can use STATE_polygon_set_bitmap_fill()
  248. // to change the bitmap.
  249. //
  250. // glass_type:
  251. // Using this parameter one can determine if the layer will be
  252. // opaque or translucent. Use any of the values possible with
  253. // the STATE_polygon_set_translucent() function.
  254. // To precisely control the level of translucency 
  255. // call STATE_polygon_set_light(layer_handle, translucent_level_rgb);
  256. //
  257. //
  258. // Remarks:
  259. // --------
  260. //
  261. // A very convenient way to work with layer polygons is
  262. // to create them all at the beginning of the program and then to disable those
  263. // which should not be visible right away.
  264. // Then during the program run to enable layer polygons according to the need.
  265. // There is no time penalty for having many layer polygons which are disabled
  266. // Only those which are drawn consume time. Layers are very fast to draw since
  267. // they exploit the 3D card hardware. The time it takes to draw a layer
  268. // depends on its size. If the layer covers the whole rendering windowfullscreen
  269. // then the slowdown in FPS might be measurable.
  270. //
  271. // Examples:
  272. //
  273. // Example 1:
  274. // //Creating a layer on the whole window
  275. // DWORD my_bitmap=STATE_bitmap_load("binocular", -1);
  276. // if(my_bitmap==NULL) return(VR_ERROR);
  277. // DWORD layer_polygon=STATE_engine_add_layer(0,0, 100, 100, my_bitmap, FILTER_GLASS);
  278. // //After the next render the layer will be shown on the screen
  279. //
  280. // Example 2:
  281. // //A more advanced example which show how to make a message
  282. // //appearing on the screen and then fading away and disappearing.
  283. // //This message could be something like "1000 points bonus"
  284. // //"Extra life" etc. This example is quite important since once
  285. // //you will understand it you will be able to create many more nice effects
  286. // //that have nothing to do with layers. 
  287. // //The following example is comprised of 3 functions that together
  288. // //create the mechanism.
  289. //
  290. // //Call this function at the beginning of the program
  291. // DWORD create_message_layer(void)
  292. // {
  293. // DWORD my_bitmap=STATE_bitmap_load("ExtraLife", -1);
  294. // if(my_bitmap==NULL) return(NULL);
  295. //
  296. // //Note that we have chosen LIGHT_SOURCE_GLASS below since
  297. // //this type of blending will do 'add' between the layer_message polygon and the
  298. // //rendered world below (new_pixel=src+dest). We need this adding for
  299. // //doing the fade away effect. We will make the message_layer_polygon
  300. // //darker and darker till it wont be seen (new_pixel= 0 + dest == dest)
  301. //
  302. // DWORD message_layer_polygon=STATE_engine_add_layer(20,15, 80,30, my_bitmap, LIGHT_SOURCE_GLASS);
  303. // if(message_layer_polygon==NULL) return(NULL);
  304. // //disable the polygon since we dont want it to be seen now
  305. // STATE_polygon_disable(message_layer_polygon);
  306. // m_is_message_visible=NO; //remember the status of the message in a globalclass member variable. 
  307. // return(message_layer_polygon);
  308. // }
  309. // 
  310. // //Call this function when the message should be seen
  311. // void make_message_visible(DWORD message_polygon)
  312. // {
  313. // STATE_polygon_enable(message_polygon);
  314. // BYTE rgb[3]={255,255,255);
  315. // //Show the message in full visibility
  316. // STATE_polygon_set_light(message_polygon, rgb); //Set the rgb of all the points to 255,255,255
  317. // m_is_message_visible=YES;
  318. // }
  319. //
  320. //
  321. // //Call this function before each render
  322. // void make_message_fade_away(DWORD message_polygon)
  323. // {
  324. // if(m_is_message_visible==NO) return; //If the message is not visible then there is nothing to do
  325. // //All the points have the same rgb so lets check the first one
  326. // DWORD point=STATE_polygon_get_first_point(message_polygon);
  327. // BYTE rgb[3];
  328. // STATE_point_get_rgb(point, rgb);
  329. // if(rgb[0]==0) {
  330. // STATE_polygon_disable(message_layer_polygon);
  331. // m_is_message_visible=NO;
  332. // return;
  333. // }
  334. // //Reducing the rgb will make the message darker and because we use LIGHT_SOURCE_GLASS 
  335. // //The result will be fading away
  336. // rgb[0]--;
  337. // rgb[1]--;
  338. // rgb[2]--;
  339. // STATE_polygon_set_light(message_layer_polygon, rgb); //Set the rgb of all the points of the polygon
  340. //
  341. // }
  342. //
  343. //
  344. STATE_IMPORT DWORD STATE_WINAPI STATE_engine_add_layer(double left_x, double top_y, double right_x, double bottom_y, DWORD bitmap_handle, BYTE glass_type);
  345. // Return a handle to the layer (a polygon handle) which the given 2D point is inside
  346. // The 2D point is a point inside the rendering window client area.
  347. // For example 0,0 is the top left point of the window.
  348. // The functions ignore disabled layers. If the given point is not inside any of the 
  349. // enabled layers, the function will return NULL.
  350. //
  351. STATE_IMPORT DWORD STATE_WINAPI STATE_engine_get_layer_at_2D_point(int x, int y);
  352. // Who needs this function ?
  353. // -----------------------------
  354. // This function is not very important. 99% of all users will never have to use it.
  355. // Users who import code from other engines might need this function.
  356. // This function is also useful if your code is built to support only triangles.
  357. // Using this function one can limit the engine to use only triangles.
  358. // What does it do ?
  359. // -------------------
  360. // Limits the number of points that are permitted per polygon.
  361. // This function can be called at any time, before or after loading the world.
  362. // This function will split polygons that have more points than what is permitted into smaller polygons.
  363. // The engine is smart enough to isolate the internally created polygon fractions from
  364. // the software API. For example if we limit the number of permitted points per polygon to 3
  365. // in this case polygons with 10 points will be split to 8 triangles.
  366. // When we use functions such as STATE_polygon_set_bitmap_fill() on one of the
  367. // newly created fractions (triangles) the engine will be smart enough to set the given
  368. // bitmap to all the fractions as if it is still one polygon.
  369. //
  370. // Remarks:
  371. // -----------
  372. // 
  373. // IMPORTANT: Please note that polygons that have more than the permitted number of points will
  374. // deleted ! This means that one should consider all polygon handles as not legal
  375. // after calling this function.
  376. // Example:
  377. // DWORD floor_handle=STATE_polygon_get_handle_using_name("floor");
  378. // STATE_engine_set_max_num_of_points_per_polygon(4);
  379. // // If the polygon "floor" had more than 4 point, it was deleted. In this case we cannot use its handle any more
  380. // //Repeat the call to be sure that we get a valid handle
  381. // DWORD floor_handle=STATE_polygon_get_handle_using_name("floor");
  382. // //We now have a valid fraction of the floor (or the whole floor if it was not deleted)
  383. // API functions that are executed on the floor fraction will be carried out on all the fractions
  384. // that make the floor.
  385. //
  386. //
  387. // Example:
  388. // STATE_engine_set_max_num_of_points_per_polygon(3);
  389. //
  390. // See also STATE_engine_get_max_num_of_points_per_polygon()
  391. STATE_IMPORT void STATE_WINAPI STATE_engine_set_max_num_of_points_per_polygon(int max_number);
  392. // Returns the maximum permited number of points per polygon
  393. // for more details please see STATE_engine_set_max_num_of_points_per_polygon().
  394. STATE_IMPORT int STATE_WINAPI STATE_engine_get_max_num_of_points_per_polygon(void);
  395. STATE_IMPORT void STATE_WINAPI STATE_engine_set_turbo_mode(int ON_or_OFF);
  396. //--------------------------------------------------------//
  397. //=========== T H E    C A M E R A   A P I ===============//
  398. //--------------------------------------------------------//
  399. // This API controls properties of the camera like
  400. // zoom location direction etc...
  401. // returns a handle to a camera.
  402. // Used in conjunction with STATE_camera_get_next_camera()
  403. // to traverse all the existing cameras
  404. // example:
  405. // for(handle=STATE_camera_get_first_camera() ; handle!=NULL ; handle=STATE_camera_get_next_camera(handle) )
  406. // {
  407. // ... 
  408. //
  409. // }
  410. STATE_IMPORT DWORD STATE_WINAPI STATE_camera_get_first_camera(void);
  411. STATE_IMPORT DWORD STATE_WINAPI STATE_camera_get_next_camera(DWORD camera_handle);
  412. //Checks whether the given camera handle is legal and represents a handle to a camera.
  413. //If the handle is not a legal camera handle then a popup window will pop out (only if popup_title!=NULL).
  414. //This function is used mainly for debugging (similar to the C++ function assert() )
  415. //Return value: YES or NO.
  416. //Arguments:
  417. // camera_handle: The handle of the camera to be examined.
  418. //  popup_title: The title of the popup that will pop-out in case the given handle does not represent
  419. // a legal camera handle. If popup_title==NULL then there wont be any popup
  420. // The best is to give the function name so if you get the error you know
  421. // what function should be fixed.
  422. STATE_IMPORT int STATE_WINAPI STATE_camera_is_camera(DWORD camera_handle, char *function_name);
  423. // insensitive to upper / lower case  (it doesn't make a difference if it is a or A)
  424. STATE_IMPORT DWORD STATE_WINAPI STATE_camera_get_using_name(char *camera_name);
  425. // Returns a pointer to camera name which is stored internally inside the 3D Engine.
  426. // Visual Basic users should use STATE_entity_get_name() instead.
  427. // See also STATE_entity_get_namel(), STATE_camera_set_name();
  428. STATE_IMPORT char *STATE_WINAPI STATE_camera_get_name(DWORD camera_handle);
  429. STATE_IMPORT void STATE_WINAPI STATE_camera_set_name(DWORD camera_handle, char *name);
  430. // Function level of importance = High.
  431. //
  432. // The human eye can not see clearly objects that are too near the eye.
  433. // Try reading a newspaper when your eye is one centimeter a way from the page ...
  434. // The camera object (see the STATE_camera_ API ) which is the computer eye for rendering, act 
  435. // similarly to the human eye. This function determines the closest distance in which the camera
  436. // is able to see objects. The parts of objects that are closer than this number will not be seen.
  437. // Calling this function with a number too small has its price.
  438. // The bigger this number is the more accurate the rendering of the objects will be
  439. // On the other hand a number too big will hide objects that are near
  440. // the camera. Typical values are 1, 4, 10, 20 100.
  441. // Try to make this number as big as you can. Stop increasing this number
  442. // when near objects are not drawn.
  443. //
  444. // Important :
  445. // In some cases increasing the number can improve the rendering speed dramatically.
  446. //
  447. // return OK or VR_ERROR
  448. STATE_IMPORT void STATE_WINAPI STATE_camera_set_distance_from_eye(DWORD camera_handle, double distance);
  449. //See STATE_camera_set_distance_from_eye()
  450. STATE_IMPORT double STATE_WINAPI STATE_camera_get_distance_from_eye(DWORD camera_handle);
  451. // Creates a camera and returns a handle to that camera
  452. // Note that the values for the camera setting (location, direction , field view etc ...)
  453. // are given default values. In probably all cases you
  454. // would like to set those values yourself before you
  455. // You use the camera specially the location and the direction
  456. // given parameters
  457. //----------------- 
  458. // camera_name: a string that identifies the camera. Usually this
  459. // string wont be in use since it is more efficient to
  460. // retrieve a camera using the handle (the return value of this
  461. // function).
  462. // see also STATE_camera_recreate() STATE_camera_save()
  463. STATE_IMPORT DWORD STATE_WINAPI STATE_camera_create(char *camera_name);
  464. // returns the last camera that was used with STATE_engine_render();
  465. STATE_IMPORT DWORD STATE_WINAPI STATE_camera_get_current(void);
  466. // The current camera is the camera that was used in the last render.
  467. // Many functions such as STATE_engine_3D_point_to_2D(), STATE_engine_2D_point_to_3D, is_movement_possible() and more,  dont take
  468. // a camera_handle as one of their parameters instead they do
  469. // STATE_camera_get_current() ( note that the result of functions such as STATE_engine_2D_point_to_3D() depends on the camera that is used)
  470. // This assumption is usually correct though in some occasions you might want to call STATE_engine_2D_point_to_3D() (or similar functions )for a camera
  471. // other then the one that was used in the last render. For these occasions you will need 
  472. // to call STATE_camera_set_current().
  473. // If you are rendering on more than one window then you are most likely to use STATE_camera_set_current()
  474. // (for example, if you render on 3 different windows with three different camera and then you do STATE_engine_3D_point_to_2D() 
  475. //  How will the engine know with which windowcamera you want this calculation to be done).
  476. // STATE_camera_set_current() takes little time to execute so if you are in doubt, there is no harm in calling this function.
  477. //
  478. // If your program doesn't call STATE_engine_render() at all then you will need to call STATE_camera_set_current()
  479. // in order that the engine will know what camera to use for calculations done in functions such as STATE_engine_2D_point_to_3D()
  480. //
  481. // hwnd is the window that we are using the camera with
  482. // ( If you are using MFC you can do CWnd->m_hWnd )
  483. STATE_IMPORT int  STATE_WINAPI STATE_camera_set_current(DWORD camera_handle, HWND hwnd);
  484. //STATE_IMPORT int  STATE_WINAPI STATE_camera_set_current(DWORD camera_handle);
  485. // Returns a handle to the first camera that was created.
  486. STATE_IMPORT DWORD STATE_WINAPI STATE_camera_get_default_camera(void);
  487. //save the current status of the given camera to the given buffer
  488. // later a camera with the same status (location, direction, field_of_view etc ...)
  489. // can be created using the given buffer.
  490. STATE_IMPORT void  STATE_WINAPI STATE_camera_save(DWORD camera_handle, DWORD save_buffer[CAMERA_DESCRIPTOR_SIZE]);
  491. // creates a new camera and returns the handle to that camera
  492. // The new camera status (location, direction, field_of_view etc ...) is
  493. // set according to the data in restore_buffer.
  494. // this buffer should be filled before calling this function
  495. // using STATE_camera_save(). This mechanism could be used to
  496. // duplicate cameras. Another usage could be to send the buffer across
  497. // the internet so that the same camera could be created on
  498. // the far computer. see also STATE_camera_create()
  499. STATE_IMPORT DWORD STATE_WINAPI STATE_camera_recreate(char *camera_name, DWORD restore_buffer[CAMERA_DESCRIPTOR_SIZE]);
  500. // The new camera status (location, direction, field_of_view etc ...) is
  501. // set according to the data in "values_data" buffer.
  502. // this buffer should be filled before calling this function
  503. // using STATE_camera_save().
  504. STATE_IMPORT void STATE_WINAPI STATE_camera_set_values(DWORD camera_handle, DWORD values_data[CAMERA_DESCRIPTOR_SIZE]);
  505. // return the width of the core image created on the camera film
  506. // this value multiplied by the value return from STATE_camera_get_height()
  507. // indicates the quality of the picture that will be created
  508. // you can modify the picture quality by using the following functions
  509. // 1- STATE_engine_set_picture_quality(int quality);
  510. // 2- STATE_engine_increase_picture_quality(void);
  511. // 3- STATE_engine_decrease_picture_quality(void);
  512. STATE_IMPORT int STATE_WINAPI STATE_camera_get_width(DWORD camera_handle);
  513. STATE_IMPORT int STATE_WINAPI STATE_camera_get_height(DWORD camera_handle);
  514. // Set the direction towards which the camera will point .
  515. //
  516. // Example:
  517. //
  518. // DWORD camera=STATE_camera_get_default_camera();
  519. // //Make the camera points towards the positive Y axis (pointing right)
  520. // STATE_camera_set_direction(camera, 0,1,0);
  521. //
  522. // Remarks:
  523. // Note that STATE_camera_set_direction(camera, 10,20,30);
  524. // has exactly the same result as STATE_camera_set_direction(camera, 1,2,3);
  525. //
  526. // For more information about coordination systems and setting directions see the book (download the book free from www.3dstate.com )
  527. //
  528. // See also: STATE_camera_set_direction1()
  529. //
  530. STATE_IMPORT void STATE_WINAPI STATE_camera_set_direction(DWORD camera_handle, double x, double y, double z);
  531. // Set the direction towards which the camera will point. Exactly the same as the function STATE_camera_set_direction()
  532. // only that here we use just 1 parameter.
  533. //
  534. // Example:
  535. //
  536. // double xyz[3]={10,20,30}; //Note that setting 10,20,30 is the same as 1,2,3 (the engine normalizes the vector (make it a unit vector) )
  537. // DWORD camera=STATE_camera_get_default_camera();
  538. // STATE_camera_set_direction1(camera, xyz);
  539. //
  540. // Remarks:
  541. //
  542. // For more information about coordination systems and setting directions see the book (download the book free from www.3dstate.com )
  543. // 
  544. // See also STATE_camera_set_direction()
  545. //
  546. STATE_IMPORT void STATE_WINAPI STATE_camera_set_direction1(DWORD camera_handle, double xyz[3]);
  547. // Returns the direction towards which the camera points.
  548. //
  549. //
  550. // Example A:
  551. //
  552. // double x,y,z;
  553. // DWORD camera=STATE_camera_get_default_camera();
  554. // STATE_camera_get_direction(camera, &x, &y, &z);
  555. //
  556. // Example B:
  557. //
  558. // //Note that instead of doing it as shown below, it is easier to use the function STATE_camera_get_direction1() instead
  559. // double xyz[3];
  560. // DWORD camera=STATE_camera_get_default_camera();
  561. // STATE_camera_get_direction(camera, &xyz[0], &xyz[1], &xyz[2]);
  562. //
  563. //
  564. //
  565. // See also STATE_camera_get_direction1()
  566. //
  567. //
  568. // Remarks:
  569. //
  570. // The returned direction is normalized (meaning it is a unit vector)
  571. // For more information about coordination systems and setting directions see the book (download the book free from www.3dstate.com )
  572. //
  573. STATE_IMPORT void STATE_WINAPI STATE_camera_get_direction(DWORD camera_handle, double *x, double *y, double *z);
  574. // Returns the direction towards which the camera points. Exactly the same as the function STATE_camera_get_direction()
  575. // only that here we use just 1 parameter.
  576. //
  577. // Example:
  578. //
  579. // double xyz[3];
  580. // DWORD camera=STATE_camera_get_default_camera();
  581. // STATE_camera_get_direction1(camera, xyz);
  582. //
  583. //
  584. //
  585. // See also STATE_camera_get_direction()
  586. //
  587. //
  588. // Remarks:
  589. //
  590. // The returned direction is normalized (meaning it is a unit vector)
  591. // For more information about coordination systems and setting directions see the book (download the book free from www.3dstate.com )
  592. //
  593. STATE_IMPORT void STATE_WINAPI STATE_camera_get_direction1(DWORD camera_handle, double xyz[3]);
  594. //Gets a pointlocation in the world and make the camera point at this location
  595. // See also STATE_camera_point_at_2D(), STATE_engine_2D_point_to_3D()
  596. STATE_IMPORT void STATE_WINAPI STATE_camera_point_at(DWORD camera_handle, double x, double y, double z);
  597. // Gets a two dimensional point=> (x,y) is a point in the rendered window
  598. // Usually we get this point from events like OnLButtonDown()
  599. // The function calculates the corresponding three dimensional point
  600. // in the world and sets the camera to point towards this point.
  601. // If there is no corresponding 3D point then it returns VR_ERROR
  602. // (happens when we point to an empty place in the rendered image.
  603. // see also STATE_camera_point_at() and STATE_engine_2D_point_to_3D();
  604. STATE_IMPORT int STATE_WINAPI STATE_camera_point_at_2D(DWORD camera_handle, int x, int y);
  605. // Set the location of the camera
  606. //
  607. // Example A:
  608. //
  609. // DWORD camera=STATE_camera_get_default_camera();
  610. // STATE_camera_set_location(camera, 10, 20, 30);
  611. //
  612. // Example B:
  613. //
  614. // double x=10,y=20,z=30;
  615. // DWORD camera=STATE_camera_get_default_camera();
  616. // STATE_camera_set_location(camera, x, y, z);
  617. //
  618. // Example C:
  619. //
  620. // //Note that instead of doing it as shown below, it is easier to use the function STATE_camera_set_location1() instead
  621. // double xyz[3]={10,20,30};
  622. // DWORD camera=STATE_camera_get_default_camera();
  623. // STATE_camera_set_location(camera, xyz[0], xyz[1], xyz[2]);
  624. //
  625. // See also STATE_camera_set_location1()
  626. //
  627. STATE_IMPORT void STATE_WINAPI STATE_camera_set_location(DWORD camera_handle, double x, double y, double z);
  628. // Set the location of the camera. Exactly the same as the function STATE_camera_set_location()
  629. // only that here we use just 1 parameter.
  630. //
  631. // Example:
  632. //
  633. // double xyz[3]={10,20,30};
  634. // DWORD camera=STATE_camera_get_default_camera();
  635. // STATE_camera_set_location1(camera, xyz);
  636. //
  637. // See also STATE_camera_set_location()
  638. //
  639. STATE_IMPORT void STATE_WINAPI STATE_camera_set_location1(DWORD camera_handle, double xyz[3]);
  640. //Returns the location of the camera.
  641. //
  642. // Example A:
  643. //
  644. // double x,y,z;
  645. // DWORD camera=STATE_camera_get_default_camera();
  646. // STATE_camera_get_location(camera, &x, &y, &z);
  647. //
  648. // Example B:
  649. //
  650. // //Note that instead of doing it as shown below, it is easier to use the function STATE_camera_get_location1() instead
  651. // double xyz[3];
  652. // DWORD camera=STATE_camera_get_default_camera();
  653. // STATE_camera_get_location(camera, &xyz[0], &xyz[1], &xyz[2]);
  654. //
  655. //
  656. //
  657. // See also STATE_camera_get_location1()
  658. //
  659. STATE_IMPORT void STATE_WINAPI STATE_camera_get_location(DWORD camera_handle, double *x, double *y, double *z);
  660. // Returns the location of the camera. Exactly the same as the function STATE_camera_get_location()
  661. // only that here we use just 1 parameter.
  662. //
  663. // Example:
  664. //
  665. // double xyz[3];
  666. // DWORD camera=STATE_camera_get_default_camera();
  667. // STATE_camera_get_location(camera, xyz);
  668. //
  669. // See also STATE_camera_get_location()
  670. //
  671. STATE_IMPORT void STATE_WINAPI STATE_camera_get_location1(DWORD camera_handle, double xyz[3]);
  672. //Sets the axis system of the camera explicitly.
  673. // X,Y,Z are three unit vectors that defines the view space. -X is the direction
  674. // of viewing.
  675. // One of the useful usage of this function together with STATE_camera_get_axis_system() and getset location
  676. // is to save the camera exact position.
  677. //The function works exactly like STATE_object_set_axis_system()
  678. //See STATE_object_set_axis_system() for more information.
  679. // Returns OK or VR_ERROR
  680. STATE_IMPORT int STATE_WINAPI  STATE_camera_set_axis_system(DWORD camera_handle, double X[3], double Y[3], double Z[3]);
  681. //Gets the axis system of the camera..
  682. // X,Y,Z are three unit vectors that defines the view space. -X is the direction
  683. // of viewing.
  684. // One of the useful usage of this function together with STATE_camera_set_axis_system() and getset location
  685. // is to save the camera exact position.
  686. // See also STATE_camera_set_axis_system()
  687. STATE_IMPORT void STATE_WINAPI STATE_camera_get_axis_system(DWORD camera_handle, double X[3], double Y[3], double Z[3]);
  688. // Returns the new tilt angle
  689. // examples:
  690. // tilt 0 mean looking straight.
  691. // tilt 90 looking up
  692. // tilt -90 means looking down
  693. STATE_IMPORT double STATE_WINAPI STATE_camera_set_tilt(DWORD camera_handle, double angle);
  694. // Returns the new tilt angle
  695. // examples:
  696. // tilt 0 mean looking straight.
  697. // tilt 90 looking up
  698. // tilt -90 means looking down
  699. STATE_IMPORT double STATE_WINAPI STATE_camera_get_tilt(DWORD camera_handle);
  700. // Returns the new tilt angle
  701. // examples:
  702. // 90 means rotate camera 90 degrees up
  703. // -90 means rotate camera 90 degrees down
  704. // The rotation is done in world cords (rather then in object cords)
  705. STATE_IMPORT double STATE_WINAPI STATE_camera_modify_tilt(DWORD camera_handle, double change);
  706. //Changes the location of the camera by the given X,Y,Z offset
  707. // New_location=old_location + (X,Y,Z)
  708. // space_flag could be WORLD_SPACE or CAMERA_SPACE
  709. // space_flag determines if the step is according to the camera's
  710. // coordinate system or the world coordinate  system.
  711. // For example if space_flag==CAMERA_SPACE and step==(-1,0,0)
  712. // This means that the camera will advance forward.
  713. // Try both options and see what happens.
  714. STATE_IMPORT void STATE_WINAPI STATE_camera_move(DWORD camera_handle, int space_flag, double x, double y, double z);
  715. //This is an important function. It helps in moving the camera nicely
  716. //so it doesn't go through polygons.
  717. //The function tries to move the camera to the given wanted location.
  718. //If it is impossible because of collision, it tries to move as close as it can
  719. //In every respected game, when the player moves towards a wall, his movement won't be stopped
  720. //when he hits the wall. Instead the player will move smoothly along the wall.
  721. //Using this function one can achieve this effect automatically. 
  722. //
  723. // Parameters:
  724. //
  725. // DWORD camera, 
  726. // The camera that we want to move
  727. //
  728. // double wanted_location[3], 
  729. // The location in world space coordinates where we want to move the camera
  730. //
  731. // double camera_physical_width
  732. // The physical camera is actually a point though in order to 
  733. // simulate real life the engine apply real dimensions to the camera
  734. // The size of the camera is calculated as a square with the dimension 
  735. // camera_physical_width x camera_physical_width
  736. // The smaller this number is the more we will be able to get nearer to the walls in the world.
  737. //
  738. //Return value
  739. // Returns YES or NO. YES is returned if the camera was moved. NO is returned
  740. // if the function could not move the camera at all
  741. // 
  742. STATE_IMPORT int STATE_WINAPI STATE_camera_move_with_collision_detection(DWORD camera, double wanted_location[3], double camera_physical_width);
  743. //Move the camera up or down so its height above the ground
  744. //is according to the given parameters.
  745. //This function is quite useful, usually one calls it before moving the camera.
  746. //Imagine for example that we have stairs to climb. If calling this function
  747. // and then moving the camera forward the result will be a very natural stairs climbing.
  748. // Note that this function is very simple inside. Some people might not use this function and
  749. // would rather write their own code.
  750. //
  751. // Return Value.
  752. // Returns a handle to the polygon bellow.
  753. // If there is nothing below it will return NULL
  754. // Parameters:
  755. // camera_handle: the camera to be dropped.
  756. //
  757. // double height_above_ground : set this argument to the desire height above the ground.
  758. //
  759. // gravity : The maximum fall that the camera is allowed to make for each call of the function.
  760. //   For example if the camera falls down from a building. The bigger this number is
  761. //   the fewer calls (to this function) it will take till the camera reaches the ground.
  762. //   In other words if the camera height above the ground is 100 and the camera is moving forward
  763. //   on the top of a building, once it falls from the building the camera height from the floor will suddenly be
  764. //   quite a big number, lets say 10000. If the gravity is 50 then after calling this function the camera will be set
  765. //   at a height of 10000-50 above the ground.
  766. //   If you didn't get all of this it doesn't matter, try different values till you reach the desired effect.
  767. //   
  768. //
  769. // point_on_the_ground : The function returns through this parameter a point on the ground that is exactly
  770. //   bellow the camera. If there is no polygon bellow the camera then this parameter will hold (0,0,0)
  771. //
  772. //
  773. // Example
  774. // double point_on_the_ground[3];
  775. //  DWORD floor_polygon=STATE_camera_set_height_above_ground(my_camera, 100, 40,point_on_the_ground);
  776. //  if(floor_polygon==NULL)
  777. // error_message("We are walking on air !!!);
  778. //
  779. //
  780. STATE_IMPORT DWORD STATE_WINAPI STATE_camera_set_height_above_ground(DWORD camera_handle, double height_above_ground, double gravity ,double point_on_the_ground[3]);
  781. //The function is not in use
  782. // Returns the new focus distance
  783. STATE_IMPORT double STATE_WINAPI STATE_camera_set_focus(DWORD camera_handle, double focus_distance);
  784. //The function is not in use
  785. // Returns the new focus distance
  786. STATE_IMPORT double STATE_WINAPI STATE_camera_modify_focus(DWORD camera_handle, double change_in_focus_distance);
  787. // Returns the new field of view angle
  788. // the field of view could be anything between 1 to 179 degrees
  789. // field of view == 1 means a very strong zoom in 
  790. // field of view == 179 means a very strong zoom out
  791. STATE_IMPORT double STATE_WINAPI STATE_camera_set_zoom(DWORD camera_handle, double field_of_view_angle);
  792. STATE_IMPORT double STATE_WINAPI STATE_camera_get_zoom(DWORD camera_handle);
  793. //Changes the current field of view
  794. // New_vield_of_view = old_field_of_view + field_of_view_change
  795. // field_of_view_change could be positive or negative.
  796. // Returns the new field of view angle
  797. STATE_IMPORT double STATE_WINAPI STATE_camera_modify_zoom(DWORD camera_handle, double field_of_view_change);
  798. // Sets the new head angle (also the return value)
  799. // examples:
  800. // 0 means look forward into the screen
  801. // 90 means look left
  802. // -90 or 270 means look right
  803. // 180 means camera looking from the screen out
  804. // if we add or subtract 360*n to the angle it
  805. // will be the same
  806. STATE_IMPORT double STATE_WINAPI STATE_camera_set_head_angle(DWORD camera_handle, double head_angle);
  807. // Returns the new head angle
  808. // Could be use the determine absolute direction (North, Soth , West, East ...)
  809. // examples:
  810. // 0 means look forward into the screen (in the opposite direction of the world X axis)
  811. // 90 means look left (in the opposite direction of the world Y axis)
  812. // -90 or 270 means look right (in the direction of the world Y axis)
  813. // 180 means camera looking from the screen out (in the direction of the world X axis)
  814. // Adding or subtracting 360*n to the angle has no influence on the result
  815. STATE_IMPORT double STATE_WINAPI STATE_camera_get_head_angle(DWORD camera_handle);
  816. // Returns the new head angle
  817. // examples:
  818. // 0 do nothing (can be use as get_current_head_angle() ...)
  819. // 90 means turn 90 degrees counterclockwise
  820. // 90 means turn 90 degrees clockwise.
  821. // 180 means camera turns half a circle
  822. STATE_IMPORT double STATE_WINAPI STATE_camera_modify_head_angle(DWORD camera_handle, double head_angle);
  823. // Returns the new bank angle
  824. // the angle is given in degrees from the horizon
  825. // examples:
  826. // 0 means looking straight.
  827. // 90 means turned 90 degrees clockwise
  828. // -90 means turned 90 degrees clockwise
  829. // giving alpha +360*k (k= ... -5,-4 , .... 0, 1 ,2 ...)
  830. // is the same as giving alpha
  831. STATE_IMPORT double STATE_WINAPI STATE_camera_set_bank(DWORD camera_handle, double angle);
  832. // Returns the new bank angle
  833. // the angle is given in degrees from the horizon
  834. // examples:
  835. // 0 means looking straight.
  836. // 90 means turned 90 degrees clockwise
  837. // -90 means turned 90 degrees clockwise
  838. // The return value is in the range -90 - 270
  839. STATE_IMPORT double STATE_WINAPI STATE_camera_get_bank(DWORD camera_handle);
  840. // Returns the new bank angle
  841. // the angle is given in degrees from the horizon
  842. // examples:
  843. // 0 means looking straight.
  844. // 90 means turned 90 degrees clockwise
  845. // -90 means turned 90 degrees clockwise
  846. STATE_IMPORT double STATE_WINAPI STATE_camera_modify_bank(DWORD camera_handle, double change);
  847. // Rotates the camera in the given angle.
  848. // space_flag can be OBJECT_SPACE or  WORLD_SPACE
  849. // space_flag determines if the step is according to the camera's
  850. // coordinate system or the world coordinate  system.
  851. // For example if space_flag==CAMERA_SPACE and step==(-1,0,0)
  852. // This means that the camera will advance forward.
  853. // Try both options and see what happens.
  854. STATE_IMPORT void STATE_WINAPI STATE_camera_rotate_x(DWORD camera_handle, double degrees, int space_flag);
  855. STATE_IMPORT void STATE_WINAPI STATE_camera_rotate_y(DWORD camera_handle, double degrees, int space_flag);
  856. STATE_IMPORT void STATE_WINAPI STATE_camera_rotate_z(DWORD camera_handle, double degrees, int space_flag);
  857. // The same just with radians.
  858. // space flag can be OBJECT_SPACE or  WORLD_SPACE
  859. STATE_IMPORT void STATE_WINAPI STATE_camera_rotate_x_radians(DWORD camera_handle, double radians, int space_flag);
  860. STATE_IMPORT void STATE_WINAPI STATE_camera_rotate_y_radians(DWORD camera_handle, double radians, int space_flag);
  861. STATE_IMPORT void STATE_WINAPI STATE_camera_rotate_z_radians(DWORD camera_handle, double radians, int space_flag);
  862. //Converts a point in camera space to a point in world space.
  863. // Returns OK or VR_ERROR if failed
  864. //Here are some examples:
  865. // The location of the camera (world space) will always translate to (0,0,0) in camera space
  866. // (-1,0,0) in camera space is one unit in front of the camera this is equal to
  867. // the camera location plus the camera direction (a unit vector) in camera space.
  868. // (1,0,0) in camera space is one unit in the back of the camera
  869. // (0,1,0) in camera space is always one unit to the right of the camera.
  870. // (0,-1,0) in camera space is always one unit to the left of the camera.
  871. // (0,0,1) in camera space is always one unit up above the camera.
  872. //See also STATE_camera_convert_point_to_camera_space()
  873. STATE_IMPORT int STATE_WINAPI STATE_camera_convert_point_to_world_space(DWORD camera_handle, double camera_space_point[3], double result[3]);
  874. //Converts a point in world space to a point in camera space.
  875. // Returns OK or VR_ERROR if failed
  876. //Here are some examples:
  877. // The point (0,0,0) in camera space will always translate to the location of the camera in world space
  878. // (-1,0,0) in camera space is one unit in front of the camera this is equal to
  879. // the camera location plus the camera direction (a unit vector) in camera space.
  880. // (1,0,0) in camera space is one unit in the back of the camera
  881. // (0,1,0) in camera space is always one unit to the right of the camera.
  882. // (0,-1,0) in camera space is always one unit to the left of the camera.
  883. // (0,0,1) in camera space is always one unit up above the camera.
  884. //See also STATE_camera_convert_point_to_world_space()
  885. STATE_IMPORT int STATE_WINAPI STATE_camera_convert_point_to_camera_space(DWORD camera_handle, double world_space_point[3], double result[3]);
  886. // deletes a camera.
  887. // remember not to use any handle after the instance was deleted
  888. // doing:
  889. // STATE_camera_delete(my_camera);
  890. // my_camera=NULL;
  891. // is good practice.
  892. // returns OK or VR_ERROR 
  893. // VR_ERROR could be receive if there is no more camera with this handle
  894. // (if we already deleted the camera before)
  895. STATE_IMPORT int STATE_WINAPI STATE_camera_delete(DWORD camera_handle);
  896. STATE_IMPORT void STATE_WINAPI STATE_camera_delete_all(void);
  897. // *************************
  898. //Returns the name of the track that the camera is associated with.
  899. //See also STATE_camera_set_track()
  900. STATE_IMPORT char * STATE_WINAPI  STATE_camera_get_track_name(DWORD camera_handle);
  901. STATE_IMPORT DWORD STATE_WINAPI STATE_camera_get_track_handle(DWORD camera_handle);
  902. // Returns VR_ERROR, OK
  903. // if track_handle ==NULL it doesn't cancel the chase type so
  904. // for canceling chasing use STATE_camera_set_chase_type(NO_CHASE);
  905. // Automatically set the closest point on the track (closest to the object)
  906. // as the next point to go towards (to override this setting use STATE_camera_set_next_point_on_track() )
  907. STATE_IMPORT int STATE_WINAPI STATE_camera_set_track(DWORD camera_handle, DWORD track_handle);
  908. // return OK or VR_ERROR
  909. // the offset is return through argument "offset"
  910. STATE_IMPORT int STATE_WINAPI STATE_camera_get_track_offset(DWORD camera_handle, double offset[3]);
  911. // return OK or VR_ERROR
  912. STATE_IMPORT int STATE_WINAPI STATE_camera_set_track_offset(DWORD camera_handle, double offset[3]);
  913. // Returns an index to a point on the track. This point is the point that the camera is moving towards
  914. // The exact cords of the point can be retrieved through STATE_track_get_point()
  915. // 0 is the first point and number_of_points-1 is the last index (use STATE_track_get_number_of_points() to get this number
  916. STATE_IMPORT int STATE_WINAPI STATE_camera_get_next_point_on_track(DWORD camera_handle);
  917. // returns the point on the track that the camera is moving towards
  918. // 0 is the first point and number_of_points-1 is the last index (use STATE_track_get_number_of_points() to get this number
  919. // if point_index<0 then it set it to 0
  920. // if point_index is bigger than the maximum index then it is set to the maximum allowed. In those cases it returns VR_ERROR 
  921. // to notify the change from the given value.
  922. // If there is no track associated with the camera it returns VR_ERROR without setting the value
  923. STATE_IMPORT int STATE_WINAPI STATE_camera_set_next_point_on_track(DWORD camera_handle, int point_index);
  924. // Set the object to chase after
  925. // the given arguments should NOT be NULL
  926. // Note that if the camera was previously chasing a camera or a group
  927. // , those chasing operation are canceled. (The camera can chase only one thing at a time).
  928. STATE_IMPORT void STATE_WINAPI STATE_camera_set_object_to_chase(DWORD camera_handle, DWORD object_to_chase_handle);
  929. // If the return value is NULL it means no object is being chased
  930. STATE_IMPORT DWORD STATE_WINAPI STATE_camera_get_chased_object(DWORD camera_handle);
  931. // Set the camera to chase after
  932. // the given argument should NOT be NULL
  933. // Note that if the camera was previously chasing an object or a group
  934. // , those chasing operation are canceled. (The camera can chase only one thing at a time).
  935. STATE_IMPORT void STATE_WINAPI STATE_camera_set_camera_to_chase(DWORD camera_handle, DWORD camera_to_chase_handle);
  936. // If the return value is NULL it means no camera is being chased
  937. STATE_IMPORT DWORD STATE_WINAPI STATE_camera_get_chased_camera(DWORD camera_handle);
  938. // Set the group to chase after
  939. // the given argument should NOT be NULL
  940. // Note that if the camera was previously chasing a camera or an object
  941. // , those chasing operation are canceled. (The camera can chase only one thing at a time).
  942. STATE_IMPORT void STATE_WINAPI STATE_camera_set_group_to_chase(DWORD camera_handle, DWORD group_to_chase_handle);
  943. // If the return value is NULL it means no group is being chased
  944. STATE_IMPORT DWORD STATE_WINAPI STATE_camera_get_chased_group(DWORD camera_handle);
  945. // return OK or VR_ERROR
  946. // the offset is return through argument "offset"
  947. STATE_IMPORT int STATE_WINAPI STATE_camera_get_chase_offset(DWORD camera_handle, double offset[3]);
  948. // return OK or VR_ERROR
  949. STATE_IMPORT int STATE_WINAPI STATE_camera_set_chase_offset(DWORD camera_handle, double offset[3]);
  950. // The returned number is between 0 and one.
  951. // A number close to 0 means that the tracking is weak
  952. // 1 means that the tracking is very sharp.
  953. STATE_IMPORT double STATE_WINAPI STATE_camera_get_chase_softness(DWORD camera_handle);
  954. // The returned number is between 0 and one
  955. // a number close to 0 means that the tracking is weak
  956. // 1 means that the tracking is very sharp.
  957. // it the given number is bigger than one it is set as one
  958. // if it is smaller than 0 than it set as 0
  959. STATE_IMPORT void STATE_WINAPI STATE_camera_set_chase_softness(DWORD camera_handle, double softness);
  960. // look in the header file for possible values and their meanings
  961. // (look for NO_CHASE, CHASE_LOCATION and others ...)
  962. STATE_IMPORT int STATE_WINAPI STATE_camera_get_chase_type(DWORD camera_handle);
  963. // look in the header file for possible values and their meanings
  964. // (look for NO_CHASE, CHASE_LOCATION and others ...)
  965. STATE_IMPORT void STATE_WINAPI STATE_camera_set_chase_type(DWORD camera_handle, int chase_type);
  966. STATE_IMPORT void STATE_WINAPI STATE_camera_set_chase_distance(DWORD camera_handle, double chase_distance);
  967. STATE_IMPORT double STATE_WINAPI STATE_camera_get_chase_distance(DWORD camera_handle);
  968. // ************************
  969. // Advance the object on the track according to its
  970. // track, track_speed, track_offset, chase_offset, target_point_on_track and chasing softness
  971. // Use STATE_camera_advance() instead (set the right chase type before calling ...)
  972. // XXXX STATE_IMPORT void STATE_WINAPI STATE_camera_advance_on_track(DWORD camera_handle);
  973. // Advance the camera according to its chase_type
  974. STATE_IMPORT void STATE_WINAPI STATE_camera_advance(DWORD camera_handle);
  975. //Relevant only when CHASE_PHYSICS is used.
  976. //Set the speed of the camera.
  977. // Example
  978. // //Give the camera speed of 10 in the positive direction of the Y axis
  979. // STATE_camera_set_speed(camera, 0,10,0);
  980. //
  981. // See also STATE_object_set_speed_units()
  982. //
  983. STATE_IMPORT void STATE_WINAPI STATE_camera_set_speed(DWORD camera_handle, double speed[3]);
  984. STATE_IMPORT void STATE_WINAPI STATE_camera_get_speed(DWORD camera_handle, double speed[3]);
  985. //Returns the size of the speed.
  986. //Using this function we can only retrieve the magnitude of the speed but not its direction.
  987. //For example if the function returns 10, it means that the speed of the camera is 10.
  988. //Q: "speed of ten" to which direction ?
  989. //A: To know the direction of the speed call STATE_camera_get_speed()
  990. //
  991. STATE_IMPORT double STATE_WINAPI STATE_camera_get_absolute_speed(DWORD camera_handle);
  992. //Relevant only when CHASE_PHYSICS or CHASE_TRACK is used.
  993. //Set the size of the speed.
  994. //
  995. // Read the example below to learn how it all works. 
  996. //
  997. // Example:
  998. // STATE_camera_set_speed(camera, 0,10,0);
  999. // speed_size=STATE_camera_get_absolute_speed(camera);
  1000. // //speed_size is now 10
  1001. //
  1002. // STATE_camera_set_absolute_speed(camera, 100);
  1003. //
  1004. // double speed[3];
  1005. // STATE_camera_get_speed(camera, speed);
  1006. // //speed is now { 0, 100, 0}
  1007. //
  1008. //
  1009. // Advanced:
  1010. // In physics speed is a vector it has a size and a direction
  1011. // Q: If the speed vector is 6,8,0 ( STATE_camera_set_speed(camera, 6,8,0) );
  1012. //    what is the size of the speed (what will STATE_camera_get_absolute_speed(camera) return ?)
  1013. //
  1014. //
  1015. // A: Let calculate the vector size according to Pythagoras Theorem
  1016. // speed size=  Square root of ( A*A+ B*B+ C*C ) = square root of ( 6*6 + 8*8 + 0*0) = Square root of (100) == 10
  1017. //
  1018. //
  1019. STATE_IMPORT void STATE_WINAPI STATE_camera_set_absolute_speed(DWORD camera_handle, double speed);
  1020. // Set the force that will work on the camera. For example to simulate gravity force
  1021. // do like that:
  1022. // double force[3];
  1023. // force[0]=0;
  1024. // force[1]=0;
  1025. // force[2]= -10; //simulate gravity 10 in the direction of the -Z axis.
  1026. // STATE_camera_set_force(my_camera,force);
  1027. //
  1028. // Note that this will only relevant when CHASE_PHYSICS is applyed
  1029. STATE_IMPORT void STATE_WINAPI STATE_camera_get_force(DWORD camera_handle, double force[3]);
  1030. STATE_IMPORT void STATE_WINAPI STATE_camera_set_force(DWORD camera_handle, double force[3]);
  1031. //Limits the maximum possible speed of a camera
  1032. //If there is no limit then by applying force on the camera
  1033. //The speed could reach infinity (unless some friction is given too)
  1034. //Note that this will only relevant when CHASE_PHYSICS is applyed
  1035. STATE_IMPORT void STATE_WINAPI STATE_camera_set_max_speed(DWORD camera_handle, double value);
  1036. STATE_IMPORT double STATE_WINAPI STATE_camera_get_max_speed(DWORD camera_handle);
  1037. //Friction is a value smaller or equal to 1
  1038. // if friction==0 it means no friction
  1039. // if friction==1 it means infinite friction nothing can move
  1040. // if friction is smaller than 0, it acts like pressing on the gas
  1041. // The exact calculation.
  1042. // Each render the absolute_speed is multiply with (1-friction).
  1043. //
  1044. // Note, a negative number can used for increasing the speed.
  1045. // a friction of -1 will double the speed.
  1046. // -2 will multiply the speed by three each rendering.
  1047. // so choose number carefully.
  1048. // typical numbers can be 0.03 or -0.03 etc ...
  1049. STATE_IMPORT void STATE_WINAPI STATE_camera_set_friction(DWORD camera_handle, double value);
  1050. STATE_IMPORT double STATE_WINAPI STATE_camera_get_friction(DWORD camera_handle);
  1051. //This number is used when the camera hits a polygon. 
  1052. //A value of one will make the new speed (after collision)
  1053. //equal to the old speed (effects only the absolute speed value and not the direction)
  1054. //a value of 0.5 will cut speed by half. 
  1055. //We can also give values greater than one.
  1056. //For example a value of 2 will make the new speed twice as big
  1057. //as before the collision.
  1058. STATE_IMPORT void STATE_WINAPI STATE_camera_set_elasticity(DWORD camera_handle, double value);
  1059. STATE_IMPORT double STATE_WINAPI STATE_camera_get_elasticity(DWORD camera_handle);
  1060. // (left_x, top_y) and (right_x ,bottom_y) are points on the window that
  1061. // was used to render an image using the given camera.
  1062. // The function returns through new_location a location that if we would
  1063. // do STATE_camera_set_location() the rectangle area will fill our screen
  1064. // returns OK or VR_ERROR
  1065. STATE_IMPORT int STATE_WINAPI STATE_camera_get_location_to_fit_rectangle(DWORD camera_handle, int left_x, int top_y, int right_x, int bottom_y, double new_location[3]);
  1066. // x,y are points on the window
  1067. // usually we get this point from events like OnLButtonDown()
  1068. // The function moves the camera towards the point (or far from the point depending 
  1069. // on the given value, factor).
  1070. // Note that the direction of the camera doesn't change. (Use STATE_camera_point_at() to make the target point at the center)
  1071. // returns OK, VR_ERRORR.
  1072. // factor can be any number. Here are some examples:
  1073. // factor== -2 , the camera will triple its distance from the given point
  1074. // factor== -1 , the camera will double its distance from the given point
  1075. // factor==0 means, the camera wont move
  1076. // factor==0.5 the camera will move half way to the point
  1077. // factor==1 the camera will move to the given point x,y
  1078. // factor==2 the camera will pass the point (will be in the same distance but on the other side of the line that connects the point and the line).
  1079. STATE_IMPORT int STATE_WINAPI STATE_camera_move_toward_point_2D(DWORD camera_handle, int x, int y, double factor);
  1080. // advance all the cameras. If STATE_engine_advance_cameras_automatically(YES) is called
  1081. // then this function will be called automatically each time we do render
  1082. STATE_IMPORT void STATE_WINAPI STATE_camera_advance_all();
  1083. STATE_IMPORT void STATE_WINAPI STATE_camera_set_name_to_chase(DWORD camera_handle, char *name_to_chase);
  1084. STATE_IMPORT char * STATE_WINAPI STATE_camera_get_name_to_chase(DWORD camera_handle);
  1085. // sending YES will write the given camera to file after call to STATE_engine_save() with SAVE_ONLY_WHATS_NEEDED 
  1086. // Note that it if STATE_engine_save() is called without SAVE_ONLY_WHATS_NEEDED, all the cameras will be saved
  1087. // sending NO will cause  STATE_engine_save() not to save this camera (only if SAVE_ONLY_WHATS_NEEDED is used)
  1088. // The default value is NO
  1089. // see also STATE_animation_set_save_flag()
  1090. STATE_IMPORT void STATE_WINAPI STATE_camera_set_save_flag(DWORD camera_handle, int yes_no_flag); 
  1091. // returns YES or NO
  1092. // The default value is NO
  1093. // see STATE_camera_set_save_flag() for more details
  1094. STATE_IMPORT int STATE_WINAPI STATE_camera_get_save_flag(DWORD camera_handle); 
  1095. // Some words about parallel and perspective projection:
  1096. // Though we have a 3D world eventually when we create an image
  1097. // of that world it is a 2D image. In order to get this image the engine
  1098. // projects the 3D world onto a projection plane. There are two main methods to do this projection
  1099. // They are called parallel projection and perspective projection.
  1100. // Perspective projection (the default ) is similar to the way the human
  1101. // eye sees things. Far away objects look smaller while closer objects look bigger.
  1102. // Parallel projection is the same as orthographic projection.
  1103. // The depth dimension is not shown on the result image.
  1104. // If you never heard of projection method simply try both method
  1105. // and see what happens. For the vast majority of applications
  1106. // you will use only perspective projection (the default)
  1107. // Parallel projection should interest you only if your application is in fields such as
  1108. // Architecture design, 3D modeling etc ...
  1109. // Parallel projection has little use in games if at all.
  1110. STATE_IMPORT void STATE_WINAPI STATE_camera_set_perspective_projection(DWORD camera_handle); 
  1111. STATE_IMPORT void STATE_WINAPI STATE_camera_set_parallel_projection(DWORD camera_handle, int width, int heigh); 
  1112. STATE_IMPORT int STATE_WINAPI STATE_camera_is_perspective_projection(DWORD camera_handle); 
  1113. STATE_IMPORT int STATE_WINAPI STATE_camera_get_parallel_projection_width(DWORD camera_handle);
  1114. STATE_IMPORT int STATE_WINAPI STATE_camera_get_parallel_projection_height(DWORD camera_handle);
  1115. //Drops the camera down.
  1116. //In other words: Move the camera down till it is height_above_ground above the polygon below the camera
  1117. //If there is nothing below the camera then the location of the camera will not be changed.
  1118. //In many times the function STATE_engine_ignore_dynamic_objects_for_collision_detection(YES);
  1119. // will be called before dropping down the camera. This will make the camera fall through dynamic objects
  1120. // 
  1121. // Return value: 
  1122. // returns a handle to the polygon below the camera
  1123. //
  1124. // parameters:
  1125. // object_handle: the camera to be dropped
  1126. //
  1127. // height_above_ground: the height above the polygon below the camera in which the camera should be positioned.
  1128. //
  1129. //
  1130. // Examples: 
  1131. // A) //drop the camera down
  1132. // STATE_camera_drop_down(my_camera, 100); //put the camera 100 units above the ground 
  1133. //
  1134. // B)  //drop the camera through objects
  1135. // STATE_engine_ignore_dynamic_objects_for_collision_detection(YES);
  1136. // STATE_camera_drop_down(my_camera, 100); //put the camera 100 units above the ground 
  1137. // STATE_engine_ignore_dynamic_objects_for_collision_detection(NO); //restore regular collision detection
  1138. STATE_IMPORT DWORD STATE_WINAPI STATE_camera_drop_down(DWORD camera_handle, double height_above_ground);
  1139. // Who needs this function ?
  1140. // --------------------------
  1141. // Users that are porting code from other 3D engines might want to use this function.
  1142. // All the rest can skip this function
  1143. //
  1144. // General background
  1145. // ------------------
  1146. // Please note that when moving or rotating the camera all that the engine does is change
  1147. // the camera's matrix which is a quick and fast to do.
  1148. //
  1149. //
  1150. // What is this matrix ?
  1151. // ---------------------
  1152. // To learn more about transformation matrixes you should read a computer graphics math book.
  1153. //  This is just if you are interested in the subject. One of the great things about the STATE engine
  1154. // is that it makes it completely unnecessary to learn these subjects.
  1155. // Anyhow, since you are still reading it means that you want to know more, so here it is:
  1156. // the first top 9 cells of the matrix are the rotation matrix
  1157. // The bottom row is the translation values.
  1158. // The diagnal is the scale values
  1159. //
  1160. // S R R 0
  1161. // R S R 0
  1162. // R R S 0
  1163. // T T T 1
  1164. //
  1165. // Above is the matrix. T stands for translation. S for scale. R for rotation.
  1166. // If you don't know what we are talking about then you should read a book in the subject
  1167. //
  1168. // By taking a point in camera space and multiplying it by the inverse_matrix we get the point in World Space.
  1169. // for example the point (0,0,0) in camera space is the location of the camera.
  1170. // when multiplying (0,0,0) by the inverse_matrix we get (T T T) which means that
  1171. // (T,T,T) is the camera location
  1172. // The code below shows how to multiply a point (vec) by the matrix (mat).
  1173. // The result is saved in dst.
  1174. //
  1175. // void  mul_vec_mat(vector dst, vector vec, matrix mat) //does dst=vec*mat
  1176. // {
  1177. //   double res[4];
  1178. //   double one_over_res3;
  1179. //
  1180. //
  1181. // res[0]=vec[0]*mat[0][0] + vec[1]*mat[1][0] + vec[2]*mat[2][0] + mat[3][0];
  1182. // res[1]=vec[0]*mat[0][1] + vec[1]*mat[1][1] + vec[2]*mat[2][1] + mat[3][1];
  1183. // res[2]=vec[0]*mat[0][2] + vec[1]*mat[1][2] + vec[2]*mat[2][2] + mat[3][2];
  1184. // res[3]=vec[0]*mat[0][3] + vec[1]*mat[1][3] + vec[2]*mat[2][3] + mat[3][3];
  1185. //
  1186. // if(res[3]<1e-20 && res[3]>-1e-20) { //protect agains floating point errors.
  1187. // ERROR_MSG(SCREEN,"mul_vec_mat: devision by zeron");
  1188. //
  1189. // dst[0]=res[0];
  1190. // dst[1]=res[1];
  1191. // dst[2]=res[2];
  1192. // return;
  1193. // }
  1194. //
  1195. // one_over_res3=1/res[3];
  1196. //
  1197. // dst[0]=res[0]*one_over_res3;
  1198. // dst[1]=res[1]*one_over_res3;
  1199. // dst[2]=res[2]*one_over_res3;
  1200. //
  1201. // }
  1202. //
  1203. //
  1204. // Parametar:
  1205. // ----------
  1206. //
  1207. // camera_handle: the camera handle
  1208. //
  1209. // camera_matrix: The camera matrix. Note that multiplying a point in world space by this matrix will result
  1210. //    a point in camera space.
  1211. //
  1212. // inverse_matrix: The inverse of camera_matrix. Multiplying a point in camera space by this matrix will
  1213. // result a point in world space.
  1214. //
  1215. //
  1216. // Example:
  1217. //
  1218. // double matrix[4][4], int_matrix[4][4];
  1219. // STATE_camera_get_transformation_matrix(my_camera, matrix);
  1220. //
  1221. STATE_IMPORT void STATE_WINAPI STATE_camera_get_transformation_matrix(DWORD camera_handle, double camera_matrix[4][4], double inverse_matrix[4][4]);
  1222. //-----------------------------------------------------//
  1223. //======== T H E    O B J E C T    A P I ==============//
  1224. //-----------------------------------------------------//
  1225. // This API is used in viewer_mode to manipulate moving objects (also referredcalled dynamic objects)
  1226. //
  1227. // See also the GROUP API for manipulating things in EDITOR mode.
  1228. // Note that some of group API are also working in viewer mode
  1229. // (those that do not move polygons or change them) but not the other way around.
  1230. // Returns YES or NO.
  1231. // YES , if the given handle is an object handle. NO if not.
  1232. // If it is not an object handle , a message box will appear,
  1233. // the title of this message box will be the parameter "function_asking"
  1234. // if function_asking==NULL than no popup will be created.
  1235. // See also IS_OBJECT()
  1236. STATE_IMPORT int STATE_WINAPI STATE_object_is_object(DWORD object_handle, char *function_asking);
  1237. // Checks whether a given object can move from one point to another inside the world
  1238. // Return value: YES or NO.
  1239. // If movement is possible the function will return YES else returns NO
  1240. //
  1241. // If movement is not possible it returns the plane equation Ax+By+Cz+D=0
  1242. // and the intersection point.
  1243. // Note that the normal of the blocking surface is N=( plane[0], plane[1], plane[2])
  1244. // on return blocking_object is the object that make movement impossible
  1245. // if the return value is NO and blocking_object==NULL it means
  1246. // that what blocks us is the static part of the world.
  1247. // the difference between this function end STATE_engine_is_movement_possible()
  1248. // is that here we also give the handle to the dynamic object that wants to move.
  1249. // This handle is needed so that the function can eliminate the object itself
  1250. // from being  the obstacle that makes the movement impossible.
  1251. // see also remarks on STATE_engine_is_movement_possible()
  1252. //
  1253. // Arguments:
  1254. // object_handle: The object that we want to move. The engine will disable this object
  1255. // for doing the collision detection as explained in the remarks above.
  1256. //
  1257. // start_point, end_point: The function will check collision between the world and a line going from start_point to end_point
  1258. //
  1259. // intersected_polygon:  If there is a collision going from the start point to the end point then the function will return
  1260. //   the blocking polygon using this argument. 
  1261. //
  1262. // intersection: an x,y,x point on the intersected_polygon where the line from start_point to end_point intersects
  1263. //
  1264. // blocking_object: If the intersection is caused because of another dynamic object that the blocking object will be returned
  1265. // using this argument.
  1266. //
  1267. //
  1268. //
  1269. // Remark:
  1270. // Note that this function doesn't take a camera handle as one of its parameters.
  1271. // Note also that the result of the operation is dependent on the current camera that is used.
  1272. // The engine will use the current camera (The camera that was used in the last render)
  1273. // In most of the cases this is the right thing to do. In the case when you want
  1274. // to use a different camera for the calculation then use STATE_camera_set_current()
  1275. // Before calling this function.
  1276. //
  1277. //
  1278. // Example:
  1279. // double start_point[3]={1,2,3};
  1280. // double end_point[3]={100,200,300};
  1281. // DWORD intersected_polygon;
  1282. // double intersection[3];
  1283. // DWORD blocking_object[3];
  1284. // STATE_object_is_movement_possible(my_object ,start_location, end_location, &intersected_polygon, intersection, &blocking_object);
  1285. //
  1286. STATE_IMPORT int STATE_WINAPI STATE_object_is_movement_possible(DWORD object_handle ,double start_location[3], double end_location[3], DWORD *intersected_polygon, double intersection[3], DWORD *blocking_object);
  1287. //Searches for an object with this name.
  1288. // If no object has this name then it
  1289. // returns a NULL
  1290. // If there are several objects with the same name then 
  1291. // it returns the first one. 
  1292. STATE_IMPORT DWORD STATE_WINAPI STATE_object_get_object_using_name(char *object_name);
  1293. // Returns the name of the given object
  1294. // The function returns a pointer to the name which is stored internally inside the 3D Engine
  1295. // Visual Basic users should use STATE_entity_get_name() instead.
  1296. // See also STATE_entity_get_namel()
  1297. STATE_IMPORT char *STATE_WINAPI STATE_object_get_name(DWORD object_handle);
  1298. STATE_IMPORT char *STATE_WINAPI STATE_object_get_type_name(DWORD object_handle);
  1299. // Returns OK if was successful else VR_ERROR;
  1300. // Arguments:
  1301. // new_name: the name to set for this object
  1302. //See also STATE_object_get_name(), STATE_object_get_object_using_name()
  1303. STATE_IMPORT int STATE_WINAPI STATE_object_set_name(DWORD object_handle, char *new_name);
  1304. // Returns OK if was successful else VR_ERROR;
  1305. STATE_IMPORT int STATE_WINAPI STATE_object_set_type_name(DWORD object_handle, char *new_name);
  1306. STATE_IMPORT int  STATE_WINAPI STATE_object_get_object_type_number(DWORD object_handle);
  1307. STATE_IMPORT void STATE_WINAPI STATE_object_set_object_type_number(DWORD object_handle, int object_type_number);
  1308. STATE_IMPORT int  STATE_WINAPI STATE_object_get_control_type_number(DWORD object_handle);
  1309. STATE_IMPORT void STATE_WINAPI STATE_object_set_control_type_number(DWORD object_handle, int control_type_number);
  1310. STATE_IMPORT char *STATE_WINAPI STATE_object_get_track_name(DWORD object_handle);
  1311. STATE_IMPORT DWORD STATE_WINAPI STATE_object_get_track_handle(DWORD object_handle);
  1312. // returns a handle to an object.
  1313. // Used in conjunction with STATE_object_get_next_object()
  1314. // to traverse all the existing objects
  1315. // example:
  1316. // for(handle=STATE_object_get_first_object() ; handle!=NULL ; handle=STATE_object_get_next_object(handle) )
  1317. // {
  1318. // ... 
  1319. //
  1320. // }
  1321. STATE_IMPORT DWORD STATE_WINAPI STATE_object_get_first_object(void);
  1322. STATE_IMPORT DWORD STATE_WINAPI STATE_object_get_next_object(DWORD object_handle);
  1323. // Set the location of the object
  1324. //
  1325. // Example A:
  1326. //
  1327. // DWORD object=STATE_object_get_first_object();
  1328. // STATE_object_set_location(object, 10, 20, 30);
  1329. //
  1330. // Example B:
  1331. //
  1332. // double x=10,y=20,z=30;
  1333. // DWORD object=STATE_object_get_first_object();
  1334. // STATE_object_set_location(object, x, y, z);
  1335. //
  1336. // Example C:
  1337. //
  1338. // //Note that instead of doing it as shown below, it is easier to use the function STATE_object_set_location1() instead
  1339. // double xyz[3]={10,20,30};
  1340. // DWORD object=STATE_object_get_first_object();
  1341. // STATE_object_set_location(object, xyz[0], xyz[1], xyz[2]);
  1342. //
  1343. // See also STATE_object_set_location1()
  1344. //
  1345. STATE_IMPORT void STATE_WINAPI STATE_object_set_location(DWORD object_handle, double x, double y, double z);
  1346. // Set the location of the object. Exactly the same as the function STATE_object_set_location()
  1347. // only that here we use just 1 parameter.
  1348. //
  1349. // Example:
  1350. //
  1351. // double xyz[3]={10,20,30};
  1352. // DWORD object=STATE_object_get_first_object();
  1353. // STATE_object_set_location1(object, xyz);
  1354. //
  1355. // See also STATE_object_set_location()
  1356. //
  1357. STATE_IMPORT void STATE_WINAPI STATE_object_set_location1(DWORD object_handle, double xyz[3]);
  1358. //Returns the location of the object.
  1359. //
  1360. // Example A:
  1361. //
  1362. // double x,y,z;
  1363. // DWORD object=STATE_object_get_first_object();
  1364. // STATE_object_get_location(object, &x, &y, &z);
  1365. //
  1366. // Example B:
  1367. //
  1368. // //Note that instead of doing it as shown below, it is easier to use the function STATE_object_get_location1() instead
  1369. // double xyz[3];
  1370. // DWORD object=STATE_object_get_first_object();
  1371. // STATE_object_get_location(object, &xyz[0], &xyz[1], &xyz[2]);
  1372. //
  1373. //
  1374. //
  1375. // See also STATE_object_get_location1()
  1376. //
  1377. STATE_IMPORT void STATE_WINAPI STATE_object_get_location(DWORD object_handle, double *x, double *y, double *z);
  1378. // Returns the location of the object. Exactly the same as the function STATE_object_get_location()
  1379. // only that here we use just 1 parameter.
  1380. //
  1381. // Example:
  1382. //
  1383. // double xyz[3];
  1384. // DWORD object=STATE_object_get_first_object();
  1385. // STATE_object_get_location(object, xyz);
  1386. //
  1387. // See also STATE_object_get_location()
  1388. //
  1389. STATE_IMPORT void STATE_WINAPI STATE_object_get_location1(DWORD object_handle, double xyz[3]);
  1390. // Advance the object (move relative)
  1391. // 
  1392. // Parameters:
  1393. // space_flag: could be WORLD_SPACE or OBJECT_SPACE or CAMERA_SPACE
  1394. // space_flag determines if the step is according to the objects
  1395. // coordinate system or the world coordinate  system etc ...
  1396. // For example if space_flag==OBJECT_SPACE and step==(-1,0,0)
  1397. // This means that the object will advance forward (If it is a car than
  1398. // forward is the direction of the front window).
  1399. // Try both options and see what happens.
  1400. //
  1401. STATE_IMPORT void STATE_WINAPI STATE_object_move(DWORD object_handle, int space_flag, double x, double y, double z);
  1402. // Set the direction towards which the object will point .
  1403. //
  1404. // Example:
  1405. //
  1406. // DWORD object=STATE_object_get_first_object();
  1407. // //Make the object points towards the positive Y axis (pointing right)
  1408. // STATE_object_set_direction(object, 0,1,0);
  1409. //
  1410. // Remarks:
  1411. // Note that STATE_object_set_direction(object, 10,20,30);
  1412. // has exactly the same result as STATE_object_set_direction(object, 1,2,3);
  1413. //
  1414. // For more information about coordination systems and setting directions see the book (download the book free from www.3dstate.com )
  1415. //
  1416. // See also STATE_object_set_direction1()
  1417. //
  1418. STATE_IMPORT void STATE_WINAPI STATE_object_set_direction(DWORD object_handle, double x, double y, double z);
  1419. // Set the direction towards which the object will point. Exactly the same as the function STATE_object_set_direction()
  1420. // only that here we use just 1 parameter.
  1421. //
  1422. // Example:
  1423. //
  1424. // double xyz[3]={10,20,30}; //Note that setting 10,20,30 is the same as 1,2,3 (the engine normalizes the vector (make it a unit vector) )
  1425. // DWORD object=STATE_object_get_first_object();
  1426. // STATE_object_set_direction1(object, xyz);
  1427. //
  1428. // Remarks:
  1429. //
  1430. // For more information about coordination systems and setting directions see the book (download the book free from www.3dstate.com )
  1431. // 
  1432. // See also STATE_object_set_direction()
  1433. //
  1434. STATE_IMPORT void STATE_WINAPI STATE_object_set_direction1(DWORD object_handle, double xyz[3]);
  1435. // Returns the direction towards which the object points.
  1436. //
  1437. //
  1438. // Example A:
  1439. //
  1440. // double x,y,z;
  1441. // DWORD object=STATE_object_get_first_object();
  1442. // STATE_object_get_direction(object, &x, &y, &z);
  1443. //
  1444. // Example B:
  1445. //
  1446. // //Note that instead of doing it as shown below, it is easier to use the function STATE_object_get_direction1() instead
  1447. // double xyz[3];
  1448. // DWORD object=STATE_object_get_first_object();
  1449. // STATE_object_get_direction(object, &xyz[0], &xyz[1], &xyz[2]);
  1450. //
  1451. //
  1452. //
  1453. // See also STATE_object_get_direction1()
  1454. //
  1455. //
  1456. // Remarks:
  1457. //
  1458. // The returned direction is normalized (meaning it is a unit vector)
  1459. // For more information about coordination systems and setting directions see the book (download the book free from www.3dstate.com )
  1460. //
  1461. STATE_IMPORT void STATE_WINAPI STATE_object_get_direction(DWORD object_handle, double *x, double *y, double *z);
  1462. // Returns the direction towards which the object points. Exactly the same as the function STATE_object_get_direction()
  1463. // only that here we use just 1 parameter.
  1464. //
  1465. // Example:
  1466. //
  1467. // double xyz[3];
  1468. // DWORD object=STATE_object_get_first_object();
  1469. // STATE_object_get_direction1(object, xyz);
  1470. //
  1471. //
  1472. //
  1473. // See also STATE_object_get_direction()
  1474. //
  1475. //
  1476. // Remarks:
  1477. //
  1478. // The returned direction is normalized (meaning it is a unit vector)
  1479. // For more information about coordination systems and setting directions see the book (download the book free from www.3dstate.com )
  1480. //
  1481. STATE_IMPORT void STATE_WINAPI STATE_object_get_direction1(DWORD object_handle, double xyz[3]);
  1482. // Rotates the object so that the orientation of the object matches the given directions
  1483. // returns OK or VR_ERROR
  1484. // One of the useful usage of this function together with STATE_object_get_axis_system() and getset location
  1485. // is to save the objact exact position.
  1486. // For more explaniton see inside the book "3D programming for windows using STATE"
  1487. // One of the given axises could be 0,0,0 in this case this axis is calculated automatically(derived from the other two axises).
  1488. // If the given axises are not orthogonal, the function 
  1489. // handle it by building an orthogonal system that is close as possible
  1490. // to the given axis.
  1491. //
  1492. // Arguments:
  1493. //
  1494. // double x[3], double y[3], double z[3];
  1495. // The X Axis, the Y axis and the Z axis.
  1496. // The given axises do not have to be a unit vector. and one of the axises
  1497. // could be left for the function to calculate by giving(0,0,0)
  1498. //
  1499. //
  1500. // Here are some examples, note that
  1501. // all the examples give the same result.
  1502. // Example A:
  1503. // x_axis[0]=0; x_axis[1]=1; x_axis[2]=0; 
  1504. // y_axis[0]=-1; y_axis[1]=0; y_axis[2]=0; 
  1505. // z_axis[0]=0; z_axis[1]=0; z_axis[2]=1; 
  1506. // STATE_object_set_axis_system(x_axis, y_axis, z_axis);
  1507. //
  1508. // Example B:
  1509. // //Example B would give exactly the same result as example A
  1510. // x_axis[0]=0; x_axis[1]=111; x_axis[2]=0; 
  1511. // y_axis[0]=-17; y_axis[1]=0; y_axis[2]=0; 
  1512. // z_axis[0]=0; z_axis[1]=0; z_axis[2]=12; 
  1513. // STATE_object_set_axis_system(x_axis, y_axis, z_axis);
  1514. //
  1515. // Example C:
  1516. // //Note that  z_axis=(0,0,0) and will be automatically 
  1517. //  // calculated by the function
  1518. // //Example C would give exactly the same result as example A and B
  1519. // x_axis[0]=0; x_axis[1]=111; x_axis[2]=0; 
  1520. // y_axis[0]=-17; y_axis[1]=0; y_axis[2]=0; 
  1521. // z_axis[0]=0; z_axis[1]=0; z_axis[2]=0; 
  1522. // STATE_object_set_axis_system(x_axis, y_axis, z_axis);
  1523. //
  1524. // Example D:
  1525. //  // Note that z_axis=(0,0,0) and that the x_axis and the y_axis are not orthogonal to each other.
  1526. //  //Note that we will get again the same result
  1527. // x_axis[0]=0; x_axis[1]=1; x_axis[2]=0; 
  1528. // y_axis[0]=-1; y_axis[1]=11; y_axis[2]=0; 
  1529. // z_axis[0]=0; z_axis[1]=0; z_axis[2]=0; 
  1530. // STATE_object_set_axis_system(x_axis, y_axis, z_axis);
  1531. //
  1532. // Example E:
  1533. //  // Note that z_axis=(-1,0,0) which doesn't give a right hand system
  1534. // // in this case the z_axis will be ignored and calculated by doing cross between the x_axis and the y_axis
  1535. //  //Note that we will get again the same result
  1536. // x_axis[0]=0; x_axis[1]=1; x_axis[2]=0; 
  1537. // y_axis[0]=-1; y_axis[1]=0; y_axis[2]=0; 
  1538. // z_axis[0]=0; z_axis[1]=0; z_axis[2]=-1; 
  1539. // STATE_object_set_axis_system(x_axis, y_axis, z_axis);
  1540. STATE_IMPORT int STATE_WINAPI STATE_object_set_axis_system(DWORD object_handle, double x[3], double y[3], double z[3]);
  1541. // One of the useful usage of this function together with STATE_object_set_axis_system() and getset location
  1542. // is to save the objact exact position.
  1543. //Returns the axis system of the object. For more details please see STATE_object_set_axis_system()
  1544. STATE_IMPORT void STATE_WINAPI STATE_object_get_axis_system(DWORD object_handle, double x[3], double y[3], double z[3]);
  1545. //Retrieves the X axis of the object. Note the following:   x_axis * -1 == the object direction
  1546. //For more details see STATE_object_set_axis_system
  1547. STATE_IMPORT void STATE_WINAPI STATE_object_get_x_axis(DWORD object_handle, double x_axis[3]);
  1548. //Retrieves the Y axis of the object. 
  1549. //For more details see STATE_object_set_axis_system
  1550. STATE_IMPORT void STATE_WINAPI STATE_object_get_y_axis(DWORD object_handle, double y_axis[3]);
  1551. //Retrieves the Z axis of the object. 
  1552. //For more details see STATE_object_set_axis_system
  1553. STATE_IMPORT void STATE_WINAPI STATE_object_get_z_axis(DWORD object_handle, double z_axis[3]);
  1554. #ifndef WORLD_SPACE
  1555. #define WORLD_SPACE 0
  1556. #endif
  1557. #define OBJECT_SPACE (WORLD_SPACE+1)
  1558. // space flag can be OBJECT_SPACE or  WORLD_SPACE
  1559. STATE_IMPORT void STATE_WINAPI STATE_object_rotate_x(DWORD object_handle, double degrees, int space_flag);
  1560. STATE_IMPORT void STATE_WINAPI STATE_object_rotate_y(DWORD object_handle, double degrees, int space_flag);
  1561. STATE_IMPORT void STATE_WINAPI STATE_object_rotate_z(DWORD object_handle, double degrees, int space_flag);
  1562. // The same just with radians.
  1563. // space flag can be OBJECT_SPACE or  WORLD_SPACE
  1564. STATE_IMPORT void STATE_WINAPI STATE_object_rotate_x_radians(DWORD object_handle, double radians, int space_flag);
  1565. STATE_IMPORT void STATE_WINAPI STATE_object_rotate_y_radians(DWORD object_handle, double radians, int space_flag);
  1566. STATE_IMPORT void STATE_WINAPI STATE_object_rotate_z_radians(DWORD object_handle, double radians, int space_flag);
  1567. // The return value is in [-1  -   1] according to the
  1568. // angle between the object direction and the world Z axis
  1569. // 1 means we are looking up . -1 means down.
  1570. // For example if we have an airplane we can use this function to test
  1571. // whether the plane is diving, going up or strait (strait would return 0)
  1572. STATE_IMPORT double  STATE_WINAPI STATE_object_get_cos_pitch(DWORD object_handle);
  1573. // The return value is in [-1  -   1] according to the
  1574. // angle between the object Y axis and the world Z axis
  1575. // If our object is a plane then this function will return the
  1576. // cos() of the angle between the plane wing and the world Z axis
  1577. // 0 means the object is strait. 
  1578. // 1 means one wing is pointing up to the sky and the other wing into the ground.
  1579. // -1 means that the other wing is pointing up to the sky and the first wing into the ground.
  1580. STATE_IMPORT double STATE_WINAPI STATE_object_get_cos_bank(DWORD object_handle);
  1581. // Used to check if the object is heading North
  1582. // south east west etc ...
  1583. STATE_IMPORT double  STATE_WINAPI STATE_object_get_cos_head(DWORD object_handle);
  1584. //obsolete. Use STATE_object_get_transformation_matrix() instead.
  1585. STATE_IMPORT void STATE_WINAPI STATE_object_get_total_move_mat(DWORD object_handle, double object_matrix[4][4]);
  1586. // Who needs this function ?
  1587. // --------------------------
  1588. // Users that are porting code from other 3D engines might want to use this function.
  1589. // All the rest can skip this function
  1590. //
  1591. // General background
  1592. // ------------------
  1593. // Please note that the STATE engine never modify the X,Y,Z values of the points of the polygons of a dynamic object.
  1594. // When the object is rotated scaled or moved, the engine only modify the object matrix.
  1595. // Not modifing all the object points save a lot of time.
  1596. //
  1597. // What is this matrix ?
  1598. // ---------------------
  1599. // To learn more about transformation matrixes you should read a computer graphics math book.
  1600. //  This is just if you are interested in the subject. One of the great things about the STATE engine
  1601. // is that it makes it completely unnecessary to learn these subjects.
  1602. // Anyhow, since you are still reading it means that you want to know more, so here it is:
  1603. // the first top 9 cells of the matrix are the rotation matrix
  1604. // The bottom row is the translation values.
  1605. // The diagnal is the scale values
  1606. //
  1607. // S R R 0
  1608. // R S R 0
  1609. // R R S 0
  1610. // T T T 1
  1611. //
  1612. // Above is the matrix. T stands for translation. S for scale. R for rotation.
  1613. // If you don't know what we are talking about then you should read a book in the subject
  1614. //
  1615. // By taking a point in object space and multiplying it by the matrix we get the point in World Space.
  1616. // for example the point (0,0,0) in object space is the center of the object.
  1617. // when multiplying (0,0,0) by the matrix we get (T T T) which means that
  1618. // (T,T,T) is the object location
  1619. // The code below shows how to multiply a point (vec) by the matrix (mat).
  1620. // The result is saved in dst.
  1621. //
  1622. // void  mul_vec_mat(vector dst, vector vec, matrix mat) //does dst=vec*mat
  1623. // {
  1624. //   double res[4];
  1625. //   double one_over_res3;
  1626. //
  1627. //
  1628. // res[0]=vec[0]*mat[0][0] + vec[1]*mat[1][0] + vec[2]*mat[2][0] + mat[3][0];
  1629. // res[1]=vec[0]*mat[0][1] + vec[1]*mat[1][1] + vec[2]*mat[2][1] + mat[3][1];
  1630. // res[2]=vec[0]*mat[0][2] + vec[1]*mat[1][2] + vec[2]*mat[2][2] + mat[3][2];
  1631. // res[3]=vec[0]*mat[0][3] + vec[1]*mat[1][3] + vec[2]*mat[2][3] + mat[3][3];
  1632. //
  1633. // if(res[3]<1e-20 && res[3]>-1e-20) { //protect agains floating point errors.
  1634. // ERROR_MSG(SCREEN,"mul_vec_mat: devision by zeron");
  1635. //
  1636. // dst[0]=res[0];
  1637. // dst[1]=res[1];
  1638. // dst[2]=res[2];
  1639. // return;
  1640. // }
  1641. //
  1642. // one_over_res3=1/res[3];
  1643. //
  1644. // dst[0]=res[0]*one_over_res3;
  1645. // dst[1]=res[1]*one_over_res3;
  1646. // dst[2]=res[2]*one_over_res3;
  1647. //
  1648. // }
  1649. //
  1650. // Example:
  1651. //
  1652. // double matrix[4][4];
  1653. // STATE_object_get_transformation_matrix(my_object, matrix);
  1654. //
  1655. STATE_IMPORT void STATE_WINAPI STATE_object_get_transformation_matrix(DWORD object_handle, double object_matrix[4][4]);
  1656. // returns a handle to the an animation that belongs to the object
  1657. // If the object has no animations or it has more then one the function
  1658. // returns NULL
  1659. STATE_IMPORT DWORD STATE_WINAPI STATE_object_get_animation(DWORD object_handle);
  1660. // Returns OK or VR_ERROR
  1661. // The function search the given object for a polygon that has an animation with the name old_animation_name
  1662. // The function then replaces the animation for this specifc polygon. 
  1663. // This polygon is set with an animation that has the name new_animation_name
  1664. // If the given object has more than one polygon with the animation old_animation_name
  1665. // then the function will return VR_ERROR
  1666. // See also STATE_object_replace_animation()
  1667. // 
  1668. // Arguments:
  1669. // object_handle  
  1670. // The object handle.
  1671. // old_animation_name
  1672. // The name of the animation to be replaced.
  1673. // new_animation_name
  1674. // The name of the animation to to be set instead of old_animation_name.
  1675. //
  1676. STATE_IMPORT int STATE_WINAPI STATE_object_replace_animation_using_names(DWORD object_handle, char *old_animation_name ,char *new_animation_name);
  1677. // Returns OK or VR_ERROR
  1678. // Exactly like STATE_object_replace_animation_using_names() only that instead of getting the names of the animation
  1679. // it receives the handles (faster)
  1680. // For more details see STATE_object_replace_animation_using_names()
  1681. // Arguments:
  1682. // object_handle  
  1683. // The object handle.
  1684. // old_animation_handle
  1685. // The handle to the animation to be replaced.
  1686. // new_animation_handle
  1687. // The handle to the animation to to be set instead of old_animation_name.
  1688. //
  1689. //
  1690. STATE_IMPORT int STATE_WINAPI STATE_object_replace_animation(DWORD object_handle, DWORD old_animation_handle ,DWORD new_animation_handle);
  1691. //Converts a point in object space to a point in world space.
  1692. // Returns OK or VR_ERROR if failed
  1693. //Here are some examples:
  1694. // The location of the object (world space) will always translate to (0,0,0) in object space
  1695. // (-1,0,0) in object space is one unit in front of the object this is equal to
  1696. // the object location plus the object direction (a unit vector) in object space.
  1697. // (1,0,0) in object space is one unit in the back of the object
  1698. // (0,1,0) in object space is always one unit to the right of the object.
  1699. // (0,-1,0) in object space is always one unit to the left of the object.
  1700. // (0,0,1) in object space is always one unit up above the object.
  1701. //See also STATE_object_convert_point_to_object_space()
  1702. STATE_IMPORT int STATE_WINAPI STATE_object_convert_point_to_world_space(DWORD object_handle, double object_space_point[3], double result[3]);
  1703. //Converts a point in world space to a point in object space.
  1704. // Returns OK or VR_ERROR if failed
  1705. //Here are some examples:
  1706. // The point (0,0,0) in object space will always translate to the location of the object in world space
  1707. // (-1,0,0) in object space is one unit in front of the object this is equal to
  1708. // the object location plus the object direction (a unit vector) in object space.
  1709. // (1,0,0) in object space is one unit in the back of the object
  1710. // (0,1,0) in object space is always one unit to the right of the object.
  1711. // (0,-1,0) in object space is always one unit to the left of the object.
  1712. // (0,0,1) in object space is always one unit up above the object.
  1713. //See also STATE_object_convert_point_to_world_space()
  1714. STATE_IMPORT int STATE_WINAPI STATE_object_convert_point_to_object_space(DWORD object_handle, double world_space_point[3], double result[3]);
  1715. // **************************
  1716. // returns VR_ERROR, OK
  1717. // if track_handle ==NULL it doesn't cancel the chase type so
  1718. // for canceling chasing use STATE_object_set_chase_type(NO_CHASE);
  1719. // Automatically set the closest point on the track (closest to the object)
  1720. // as the next point to go towards
  1721. // (to override this setting use STATE_object_set_next_point_on_track() )
  1722. STATE_IMPORT int STATE_WINAPI STATE_object_set_track(DWORD object_handle, DWORD track_handle);
  1723. // return OK or VR_ERROR
  1724. // the offset is return through argument "offset"
  1725. STATE_IMPORT int STATE_WINAPI STATE_object_get_track_offset(DWORD object_handle, double offset[3]);
  1726. // return OK or VR_ERROR
  1727. STATE_IMPORT int STATE_WINAPI STATE_object_set_track_offset(DWORD object_handle, double offset[3]);
  1728. // returns an index to a point on the track. This point is the point that the object is moving towards
  1729. // The exact cords of the point can be retrieved through STATE_track_get_point()
  1730. // 0 is the first point and number_of_points-1 is the last index (use STATE_track_get_number_of_points() to get this number
  1731. STATE_IMPORT int STATE_WINAPI STATE_object_get_next_point_on_track(DWORD object_handle);
  1732. // returns the point on the track that the object is moving towards
  1733. // 0 is the first point and number_of_points-1 is the last index (use STATE_track_get_number_of_points() to get this number
  1734. // if point_index<0 then it set it to 0
  1735. // if point_index is bigger than the maximum index then it is set to the maximum allowed. In those cases it returns VR_ERROR 
  1736. // to notify the change from the given value.
  1737. // If there is no track associated with the object it returns VR_ERROR without setting the value
  1738. STATE_IMPORT int STATE_WINAPI STATE_object_set_next_point_on_track(DWORD object_handle, int point_index);
  1739. // Set the object to chase after
  1740. // the given argument should NOT be NULL
  1741. // Note that if the object was previously chasing a camera or a group
  1742. // , those chasing operation are canceled. (The object can chase only one thing at a time).
  1743. STATE_IMPORT void STATE_WINAPI STATE_object_set_object_to_chase(DWORD object_handle, DWORD object_to_chase_handle);
  1744. // If the return value is NULL it means no object is being chased
  1745. STATE_IMPORT DWORD STATE_WINAPI STATE_object_get_chased_object(DWORD object_handle);
  1746. // Set the camera to chase after
  1747. // the given argument should NOT be NULL
  1748. // Note that if the object was previously chasing another object or a group
  1749. // , those chasing operation are canceled. (The object can chase only one thing at a time).
  1750. STATE_IMPORT void STATE_WINAPI STATE_object_set_camera_to_chase(DWORD object_handle, DWORD camera_to_chase_handle);
  1751. // If the return value is NULL it means no camera is being chased
  1752. STATE_IMPORT DWORD STATE_WINAPI STATE_object_get_chased_camera(DWORD object_handle);
  1753. // Set the group to chase after
  1754. // the given argument should NOT be NULL
  1755. // Note that if the object was previously chasing a camera or an object
  1756. // , those chasing operation are canceled. (The object can chase only one thing at a time).
  1757. STATE_IMPORT void STATE_WINAPI STATE_object_set_group_to_chase(DWORD object_handle, DWORD group_to_chase_handle);
  1758. // If the return value is NULL it means no group is being chased
  1759. STATE_IMPORT DWORD STATE_WINAPI STATE_object_get_chased_group(DWORD object_handle);
  1760. // return OK or VR_ERROR
  1761. // the offset is return through argument "offset"
  1762. STATE_IMPORT int STATE_WINAPI STATE_object_get_chase_offset(DWORD object_handle, double offset[3]);
  1763. // return OK or VR_ERROR
  1764. STATE_IMPORT int STATE_WINAPI STATE_object_set_chase_offset(DWORD object_handle, double offset[3]);
  1765. // The returned number is between 0 and one
  1766. // a number close to 0 means that the tracking is weak
  1767. // 1 means that the tracking is very sharp.
  1768. STATE_IMPORT double STATE_WINAPI STATE_object_get_chase_softness(DWORD object_handle);
  1769. // The returned number is between 0 and one
  1770. // a number close to 0 means that the tracking is weak
  1771. // 1 means that the tracking is very sharp.
  1772. // it the given number is bigger than one it is set as one
  1773. // if it is smaller than 0 than it set as 0
  1774. STATE_IMPORT void STATE_WINAPI STATE_object_set_chase_softness(DWORD object_handle, double softness);
  1775. // look in the header file for possible values and their meanings
  1776. // (look for NO_CHASE, CHASE_LOCATION and others ...)
  1777. STATE_IMPORT int STATE_WINAPI STATE_object_get_chase_type(DWORD object_handle);
  1778. // look at the top of the header file for possible values and their meanings
  1779. // (look for NO_CHASE, CHASE_LOCATION and others ...)
  1780. STATE_IMPORT void STATE_WINAPI STATE_object_set_chase_type(DWORD object_handle, int chase_type);
  1781. /*
  1782. Function for automatic falling from a track.
  1783. --------------------------------------------
  1784. Example of usage:
  1785. Say we have a track for a runner on a road, if the track is not 100 percent precise
  1786. meaning that some time the runner will be in the air and some times inside the ground.
  1787. With these functions we can solve that problem.
  1788. We give an offset for the track in the Z axis 
  1789. so the track will be above the road. Now if "falling"
  1790. is ON, the object will fall down till it reaches the
  1791. the track.
  1792. Another example:
  1793. If we want to move the object on a terrain model
  1794. very close to the ground. It will be very difficult to 
  1795. calculate the exact track. Now we can define a very simple
  1796. track like a basic square and "falling" will do the rest.