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

射击游戏

开发平台:

Visual C++

  1. /*
  2.                                                                                                                                 
  3.                                               3D                                                                                
  4.       STATE3DS      TATE3DSTATE3D         STATE3DSTAT    E3DSTATE3DSTATE3D      STATE      3DSTATE3DSTATE3DS  TATE3DSTATE3DST   
  5.     ATE3DSTATE3     DSTATE3DSTATE3D      STATE3DSTATE3   DSTATE3DSTATE3DST     ATE3DST     ATE3DSTATE3DSTATE  3DSTATE3DSTATE3   
  6.     DSTAT  E3DST    ATE3D   STATE3DS    TATE3     DSTAT        E3DSTA         TE3DSTATE         3DSTATE       3DSTA             
  7.      TE     3DST    ATE3D      STATE3   DSTAT      E3DS        TATE3          DSTATE3DS          TATE3        DSTA              
  8.           TE3DST    ATE3D       STATE   3DSTATE3D              STATE         3DSTA TE3DS         TATE3        DSTAT             
  9.         E3DSTA      TE3DS        TATE    3DSTATE3DSTA          TE3DS        TATE3  DSTAT         E3DST        ATE3DSTATE3DSTA   
  10.         TE3DSTAT    E3DST        ATE3D     STATE3DSTATE        3DSTA        TE3DS   TATE3        DSTAT        E3DSTATE3DSTATE   
  11.             3DSTA   TE3DS       TATE3          DSTATE3DS       TATE3       DSTATE3DSTATE3D       STATE        3DSTA             
  12.              TE3D   STATE       3DSTA   TE3D       STATE       3DSTA       TE3DSTATE3DSTATE      3DSTA        TE3D              
  13.    STATE    3DSTA   TE3DS      TATE3D   STATE      3DSTA       TE3DS      TATE3DSTATE3DSTAT      E3DST        ATE3              
  14.     DSTATE3DSTATE   3DSTATE3DSTATE3D    STATE3DSTATE3DST       ATE3D      STATE        3DSTA     TE3DS        TATE3DSTATE3DSTA  
  15.      TE3DSTATE3     DSTATE3DSTATE3       DSTATE3DSTATE         3DSTA     TE3DS         TATE3D    STATE        3DSTATE3DSTATE3D  
  16.        STATE3       DSTATE3DSTAT           E3DSTATE3D          DSTAT     E3DS           TATE3    DSTAT        TE3DSTATE3DSTATE  
  17.                                                                                                                                 
  18. 3DSTATE.h
  19. STATE 3D engine API
  20. Version 5.7
  21. NOTE: There are many functions in this API. You will probably need
  22.   only a few of them. You can write a great game using only about 20
  23.   functions from this API. We suggest that you first look at some
  24.   sample code and only when you feel comfortable, take a deeper 
  25.   look at this API.
  26.   
  27.   
  28. The main idea
  29. -------------
  30. With one command you load a three dimensional world model
  31. into the engine. With one command you create a camera
  32. for taking pictures from inside the world. 
  33. Now all you have to do is call this function
  34. STATE_engine_render(HWND hwnd, DWORD camera)
  35. and voila !!! you have the picture taken using the camera
  36. pasted on the given window !!!!
  37. now if you modify the camera location or direction
  38. and call the rendering function again you get movement !!!
  39. Naming convention.
  40. 1- All the functions of this API start with STATE_
  41. example: STATE_camera_create(char *camera_name);
  42. 2- The second word is the name of the group of function.
  43. examples:
  44. STATE_camera_set_location(x,y,x);
  45. STATE_engine_increase_atmospheric_effect();
  46. There are several groups off API commands
  47. 1- the engine API
  48. all function starting with STATE_engine_
  49. controls things like picture quality, atmospheric effect etc ...
  50. 2- the camera API
  51. all function starting with STATE_camera_
  52. controls properties of the camera like
  53. zoom location direction etc...
  54. 3- The object API
  55. all function starting with STATE_object_
  56. In your world you can define objects like an airplane,
  57. a boy, a runner, a bird etc ...
  58. this api allows you to control their behavior.
  59. The Other APIs are:
  60. The Polygon API, the Point API, the group API,
  61. the Track API, the Bitmap API, the Math API, the Utilities API,
  62. the Animation API, the profiler API, the background API.
  63. You can find more information at the beginning of each API.
  64. Speed and performances
  65. -----------------------
  66. Once you are more familiar with the STATE API you might want to 
  67. increase your application performances. Here are some tips:
  68. 1) Read the performance tip documentation (at www.3DSTATE.com - documentations)
  69. 2) Tips for software rendering:
  70. Do some of the following calls
  71. STATE_engine_set_perspective_correction_accuracy(0);
  72. STATE_engine_use_zbuffer(NO);
  73. STATE_engine_set_automatic_quality_control();
  74. Each of the above functions has its advantages and disadvantages
  75. but they will all make your application run faster, read their 'help'
  76. for more details.
  77. */
  78. #ifndef STATE_H
  79. #define STATE_H
  80. #include <windows.h>
  81. #ifdef __cplusplus
  82. extern "C" {
  83. #endif
  84. /*
  85. #if defined(__BORLANDC__)
  86. #define STATE_WINAPI WINAPI
  87. #else
  88. #define STATE_WINAPI 
  89. #endif
  90. */
  91. #ifdef STATE_STATIC_LINK
  92. #define STATE_WINAPI
  93. #else
  94. #define STATE_WINAPI WINAPI
  95. #endif
  96. #define OK              0
  97. #define VR_ERROR -1
  98. //Note that YES/NO ON/OFF and TRUE/FALSE are all the same.
  99. #define YES 1  
  100. #define NO 0
  101. #define ON 1
  102. #define OFF 0
  103. #define WORLD_SPACE 0
  104. #define OBJECT_SPACE (WORLD_SPACE+1)
  105. #ifndef CAMERA_SPACE
  106. #define CAMERA_SPACE (WORLD_SPACE+2)
  107. #endif
  108. #define PLAYER_CONTROL 1
  109. #define COMPUTER_CONTROL 2
  110. // used for STATE_camera_save()
  111. #define CAMERA_DESCRIPTOR_SIZE 53  //Number of DWORDs (212 bytes)
  112. #define FORBID_DIRECTX
  113. #define EDGE_NOT_SEEN 1
  114. #define EDGE_FULLY_SEEN 2
  115. #define EDGE_PARTIALLY_SEEN 3
  116. // Automatic movement constants == "Chasing"
  117. // --------------------------
  118. // In the wld file we have the following lines that are relevant
  119. // to the Automatic movement.
  120. // TRACK: track_name track_offset //chase name could be NO_TRACK if ...
  121. // SPEED: track_speed    // track speed is also used in CHASE_PRECISE and CHASE_FLEXIBLE
  122.  // in those cases it is the distance behind the chased object
  123. // CHASE: dynamic_object_to_chase  chase_offset
  124. // CHASE_TYPE: chase_type tracking_softness  //tracking_softness is a number between 0 and 1.
  125. // Below are the values that could appear in chase_type.
  126. // relevant fields: none
  127. // The NO_CHASE Const Must be 0.
  128. #define NO_CHASE 0 // doesn't move at all. Control is through software
  129. // relevant fields: dynamic_object_to_chase, chase_offset
  130. #define CHASE_LOCATION 2 // trace only location. Only the line "CHASE: object_to_chase x y z " is relevant
  131.   // The three numbers are the offset from the object being chased
  132. // relevant fields: dynamic_object_to_chase, chase_offset, chase_distance
  133. #define CHASE_PRECISE     3 //  trace location and cord system. The track is ignored
  134. // relevant fields: dynamic_object_to_chase, chase_offset, chase_distance, tracking_softness
  135. #define CHASE_FLEXIBLE    4 // trace location and direction with a delay
  136. // not available yet
  137. #define CHASE_ON_TRACK    (5+CHASE_TRACK_FAMILY) // chase the object to be chased but doesn't go out of the track line
  138. // not available yet
  139. #define CHASE_INSIDE_TRACK_BOUNDING_BOX 6 // chase the object to be chased but doesn't go out from the track bounding box
  140. // relevant fields: track_name, track_offset, speed, tracking_softness
  141. #define CHASE_TRACK    (7+CHASE_TRACK_FAMILY) // just advance on the track according to the speed with out chasing anyone
  142. // relevant fields: track_name, track_offset, speed, tracking_softness
  143. #define CHASE_TRACK_AIRPLANE (8+CHASE_TRACK_FAMILY) // like CHASE_TRACK just with an airplane movements
  144. //Not a chase type but a chase family
  145. //Makes it possible to do things like if(chase_type & CHASE_TRACK_FAMILY) ...
  146. #define CHASE_TRACK_FAMILY 128
  147. #define CHASE_PHYSICS 9 //Moves the object according to the physics params (that is
  148. // speed,friction, elasticity, max_speed)
  149. // Orientation values
  150. #define ORIENTATION_UNKNOWN 0
  151. #define ORIENTATION_TOP 1
  152. #define ORIENTATION_BOTTOM 2
  153. #define ORIENTATION_FRONT 4
  154. #define ORIENTATION_BACK 8
  155. #define NO_TRACK 0
  156. #ifdef STATE_EXPORTS
  157. #define STATE_IMPORT __declspec(dllexport)
  158. #else
  159. #define STATE_IMPORT __declspec(dllimport)
  160. #endif
  161. #ifdef STATE_STATIC_LINK
  162. #define STATE_IMPORT 
  163. #endif 
  164. #ifdef STATE_STATIC_LINK
  165. #define STATE_stdcall
  166. #else
  167. #define STATE_stdcall WINAPI
  168. #endif
  169. //--------------------------------------------------------//
  170. //=========== T H E    E N G I N E   A P I ===============//
  171. //--------------------------------------------------------//
  172. // This API controls things like picture quality, atmospheric effect etc ...
  173. // world_mode options (for function STATE_engine_load_world() )
  174. #define USER_DEFINED_BEHAVIOR 0
  175. #define AUTO_BEHAVIOR01 1   //JAPPLIC_ID
  176. #define AUTO_BEHAVIOR02 2 //CORE_APPLIC // NOTE AUTO_BEHAVIOR02 is obsolete
  177. #define EDITOR_MODE 4
  178. #define DONT_USE_ZBUFFER 8 //This option doesn't  works together with  EDITOR_MODE. When zbuffer is off
  179. // rendering will be faster but less accurate (things that are supposed to be hidden will sometime appear
  180. // depending on the structure of the used world). If zbuffer is on the rendering will
  181. // be accurate though slower. We suggest that you try both possibilities and choose what's best
  182. // The default is zbuffer ON.
  183. ////The resample flags cause every bitmap that is loaded to be automatically resampled to a power of two dimensions
  184. //Note that since version 3.0 all the bitmaps that are not in the power of two are automatically resampled (with RESAMPLE_CLOSEST).
  185. #define RESAMPLE_UP 16 //The new width and height will always be bigger than or equal than the original dimension of the bitmap
  186. #define RESAMPLE_CLOSEST 32 //The new dimensions will be the closest power of two numbers to the original dimensions
  187. #define RESAMPLE_DOWN 64 //The new width and height will always be smaller than or equal than the original dimension of the bitmap
  188. #define MIPMAP_DISABLE 0 //The default
  189. #define MIPMAP_STABLE 128 //Bitmaps will look more stable (The pixels wont "swim")
  190. //though the resolution will be a little bit lower
  191. #define MIPMAP_RESOLUTION 512 //This option prefers better resolution upon stable bitmaps
  192. #define MIPMAP_NORMAL 1024//An average between MIPMAP_STABLE and MIPMAP_RESOLUTION    
  193. #define ENABLE_BRIGHT_LIGHT 2048 //Relevant only when 3D card is used.
  194. #define ENABLE_VERY_BRIGHT_LIGHT 4096
  195. #define CREATE_BSP_FOR_DYNAMIC_OBJECTS 8192
  196. #define NO_BSP_FOR_STATIC_WORLD 16384
  197. #define DONT_CREATE_ADDITIONAL_BITMAPS 32768
  198. #define DONT_LOAD_BITMAPS 65536
  199. #define OUTPUT_RENDER_LOCATIONS 131072 //The location from where render is done (the location of the camera)
  200.   //Will be output to a file named visited_points.txt
  201.   //This file is used with STATE_engine_create_speed_database()
  202. #define BUILD_BSP_FAST 262144//Usually builds the BSP faster. You should check the log file to
  203. //if you get more polygons added or maybe less.
  204. #define BUILD_BSP_WITH_LESS_POLYGONS  524288//Usually adds less polygons tyo the world in the buildup of the bsp tree 
  205.  //though this is not always the case. Usually it will also take more time to create.
  206. #define BUILD_BSP_WITH_MINIMUM_POLYGONS 786432//Beware, using this parameter will increase the duration of the BSP Tree
  207. //construction significantly. If your world is big then it
  208. //might take several hours. So run your program with this parameter
  209. //and pray that by the time you get beack to work on the day after, the computer
  210. //will finish loading the world
  211. // For checking if a handle is legal (for example a camera handle) you can do one of the two:
  212. // 1- call the function STATE_camera_is_camera(handle, "my_test");
  213. // 2- Use the macro IS_CAMERA. The advantage of the macro is that you can 
  214. // replace it with an empty macro on your release program.
  215. // See more details next to the declaration of function STATE_camera_is_camera()
  216. #define         IS_CAMERA(camera_handle,function_name) STATE_camera_is_camera(camera_handle,function_name)
  217. #define         IS_OBJECT(object_handle,function_name) STATE_object_is_object(object_handle,function_name)
  218. #define         IS_GROUP(group_handle,function_name) STATE_group_is_group(group_handle,function_name)
  219. #define         IS_TRACK(track_handle,function_name) STATE_track_is_track(track_handle,function_name)
  220. #define         IS_POLYGON(polygon_handle,function_name) STATE_polygon_is_polygon(polygon_handle,function_name)
  221. #define         IS_LIGHT(light_handle,function_name) STATE_light_is_light(light_handle,function_name)
  222. #define         IS_POINT(point_handle,function_name) STATE_point_is_point(point_handle,function_name)
  223. #define         IS_BITMAP(bitmap_handle,function_name) STATE_bitmap_is_bitmap(bitmap_handle,function_name)
  224. #define         IS_ANIMATION(animation_handle,function_name) STATE_animation_is_animation(animation_handle,function_name)
  225. #define         IS_BACKGROUND(background_handle,function_name) STATE_background_is_background(background_handle,function_name)
  226. #define         IS_3D_ANIMATION(animation3d_handle,function_name) STATE_3D_animation_is_3D_animation(animation3d_handle,function_name)
  227. #define         IS_3D_SEQUENCE(sequence3d_handle,function_name) STATE_3D_sequence_is_3D_sequence(sequence3d_handle,function_name)
  228. // This function puts the image seen from the camera on the given window
  229. // The rendering operation is not automatic after every API function
  230. // This way we can save lots of CPU time by calling a group of API function
  231. // followed by only one call to STATE_engine_render(). (This function takes lots of
  232. // CPU time while all the other are very fast to execute)
  233. STATE_IMPORT int  STATE_WINAPI STATE_engine_render(HWND hwnd, DWORD camera);
  234. //exactly like STATE_engine_render() only easier to use
  235. // if you are working with MFC
  236. //STATE_IMPORT void  STATE_WINAPI STATE_engine_render_on_cwnd(void *pointer_to_CWnd_object, void *camera);
  237. // returns (OK / VR_ERROR)
  238. // It is important to check the return value
  239. // Arguments:
  240. // world_file_name: the name of the file to be loaded 
  241. // examples: "my_world.wld" , "my_world.raw" , "C:\worlds\my_world.x"
  242. // world_directory_path: relevant only if  INCLUDE_FILE is used
  243. //  (INCLUDE_FILE is used in the world file if our world consist of several files)
  244. //   using a different world_directory_path we can load the same
  245. // world with different models library
  246. // or we can use one models library for several worlds
  247. // examples: "", "C:\models\chaires\plastic", "C:\models\chaires\plastic"
  248. // bitmaps_directory_path:
  249. // using a different bitmaps_directory_path we can load the same
  250. // world with different bitmaps library
  251. // or we can use one bitmap library for several worlds
  252. // examples: "", "C:\bitmaps1", "C:\bitmaps2", "bitmaps"
  253. // world_mode options: 
  254. // USER_DEFINED_BEHAVIOR 
  255. // AUTO_BEHAVIOR01 Automatically moves the camera or an object according the arrows key
  256. // AUTO_BEHAVIOR02 Obsolete
  257. // EDITOR_MODE Dont move objects automatically. make it possible to use all the group API
  258. //
  259. // DONT_USE_ZBUFFER 
  260. // This option doesn't  work together with  EDITOR_MODE. When zbuffer is off, the
  261. // rendering will be faster but could be less accurate (things that are supposed to be hidden will sometime appear
  262. // depending on the structure of the used world). If zbuffer is on, the rendering will sometime
  263. // more accurate though slower. We suggest that you try both possibilities and choose what's best
  264. // The default is zbuffer ON. The changes in speed are not so relevant when using a 3D card (harware rendering)
  265. //
  266. // The resample flags cause every bitmap that is loaded to be automatically resampled to a power of two dimensions
  267. // RESAMPLE_UP  The new width and height will always be bigger than or equal than the original dimension of the bitmap
  268. // RESAMPLE_CLOSEST  The new dimensions will be the closest power of two numbers to the original dimensions
  269. // RESAMPLE_DOWN  The new width and height will always be smaller than or equal than the original dimension of the bitmap
  270. //
  271. // ENABLE_BRIGHT_LIGHT Relevant only when 3D card is used. Makes it possible to create brighter lighting on textures
  272. // ENABLE_VERY_BRIGHT_LIGHT 
  273. // DONT_CREATE_ADDITIONAL_BITMAPS When a bitmap is in jpg format the engine convert it into a bitmap and leave the bitmap on the disk so that the next
  274. // time that this world is loaded will be faster. This flag will tell the engine not to create additional bitmaps.
  275. // Instead of using this flag one can simply delete all the unneeded bitmaps before 
  276. // releasing the application.
  277. //
  278. // DONT_LOAD_BITMAPS If this flag is given then the world will be loaded without its bitmaps.
  279. // Bitmaps can be loaded later using STATE_bitmap_load(). To retrieve the names of the bitmaps use STATE_polygon_get_bitmap_name()
  280. //
  281. // Constants for BSP data structure creation
  282. // ----------------------------------------
  283. //Some background about BSP Trees
  284. //---------------------------------
  285. //The BSP (Binary Space Partition) is an internal data structure inside the engine
  286. //that is used in Viewer Mode (the default mode) in the process of rendering the world and for collision detection.
  287. //There is nothing that you need to know about this internal data structure. Its existence and operation are 
  288. //hide inside the engine. Your only encounter with the BSP tree is when you wait for the engine to create it
  289. //while you load your world in the first time. When the world is loaded at the first time 
  290. //the engine creates a file called world_name.bsp . When you release the world you should include
  291. //this file to save the engine from regenerating it. Feel free to omit this file from
  292. // your release version if the creation process is fast (less than 1 second)
  293. //New parameters to control the bsp construction speed and number of add polygons 
  294. //------------------------------------------------------------------------------
  295. //In the past the construction of a bsp tree was a very long process 
  296. //(it could even reach 12 hours and more !!!) though now it should be very fast
  297. //about one second. If however this process takes too long (you can see the duration in the log file)
  298. //or it creates too many polygons in the way then you could try and load the world with the constants
  299. //below. You should try all the three constants because sometimes the one that supposed to give fewer polygons
  300. //gives more and vice versa. PLEASE NOTE THAT YOU MUST DELETE THE BSP FILE (IF EXSITS) OTHERWISE THE BUILD_BSP CONSTANTS
  301. //WILL HAVE NO EFFECT (because if the bsp file exists the engine takes it instead of building a new one).
  302. //You can read in the log file how well the constants affected the construction of the bsp tree.
  303. //Tips on how to minimize the number of polygons that are added when the bsp tree is constructed
  304. //------------------------------------------------------------------------------------------------
  305. //1) When building your world (using World Builder or other programs)
  306. // Dont make polygons intersect one each other. For example, if you put a tree on the ground
  307. // and the bottom of the tree polygons intersect the ground then it will force the engine to split
  308. //the tree into two polygons. In order to avoid this, don't put the tree on the ground manually, instead
  309. //use World Builder tools for doing dropping an object on the ground.
  310. //
  311. //2) If you have implemented tip "1" and tried to load your world with each one of the three parameters above 
  312. //  and still you too many polygons are added in the process then
  313. //  you should try to call STATE_engine_set_bsp_precision() before loading the world.
  314. // BUILD_BSP_FAST //Usually builds the BSP faster. You should check the log file to
  315. // //if you get more polygons added or maybe less.
  316. // BUILD_BSP_WITH_LESS_POLYGONS //Usually adds less polygons tyo the world in the buildup of the bsp tree 
  317. // //though this is not always the case. Usually it will also take more time to create.
  318. //
  319. // BUILD_BSP_WITH_MINIMUM_POLYGONS //Beware, using this parameter will increase the duration of the BSP Tree
  320. //construction significantly. If your world is big then it
  321. //might take several hours. So run your program with this parameter
  322. //and pray that by the time you get beack to work on the day after the computer
  323. //will finish loading the world
  324. //
  325. // CREATE_BSP_FOR_DYNAMIC_OBJECTS This used to be the default. The default was changed since a BSP tree might add polygons to the world
  326. // NO_BSP_FOR_STATIC_WORLD The world might have less polygons but collision detection will be slower. Usually it is not recommended to use this flag.
  327. // Use the OR operation to combine several options ,for example STATE_engine_load_world("my_world.3dstate", NULL, "Bitmaps", USER_DEFINED_BEHAVIOR | EDITOR_MODE); //this will load the world in editor mode
  328. //
  329. //Example:
  330. //
  331. // A)
  332. // int rc=STATE_engine_load_world("my_world.3dstate", NULL, "Bitmaps", USER_DEFINED_BEHAVIOR);
  333. // if(rc!=OK) {
  334. // MessageBox("Failed loading world");
  335. // //lets exit the program
  336. // STATE_engine_close();
  337. // exit(-1);
  338. // }
  339. //
  340. // B)
  341. // //starting the engine with an empty world
  342. // STATE_engine_load_world(NULL, NULL, NULL, USER_DEFINED_BEHAVIOR);
  343. STATE_IMPORT int STATE_WINAPI STATE_engine_load_world(char *world_file_name, char *world_directory_path, char *bitmaps_directory_path, int world_mode);
  344. // The loaded world will be add to the existing world
  345. // the given position indicates where the origin (note that the origin is 0,0,0 and not the center of the world) 
  346. // of the added world will be located
  347. // returns a handle to the group that encapsulates the added world
  348. // if an error occurred it will return NULL
  349. // It is important to check the return value
  350. // Note that usually you will call STATE_group_set_location(added_world_grp, center_position);
  351. // after calling STATE_engine_add_world() to move the center of the added world
  352. // to its place. Not calling STATE_group_set_location() will put the origin
  353. // of the added world in the location as given by the position argument. Note that this is different from  moving the center of the world to 
  354. // the given position
  355. //
  356. // The function is relevant only for EDITOR_MODE. For VIEWER_MODE (the default mode)
  357. // use STATE_object_create_from_file() instead.
  358. STATE_IMPORT DWORD STATE_WINAPI STATE_engine_add_world(char *world_file_name, char *world_directory_path, char *bitmaps_directory_path, double position[3]);
  359. //The same as STATE_engine_add_world() the only difference
  360. //is that using this command the engine will also load general settings as the fog color and intensity.
  361. DWORD STATE_WINAPI STATE_engine_add_world_with_settings(char *world_file_name, char *world_directory_path, char *bitmaps_directory_path, double position[3]);
  362. // returns YES if no world is loaded into the engine
  363. // otherwise returns NO
  364. STATE_IMPORT int STATE_WINAPI STATE_engine_is_engine_empty(void);
  365. STATE_IMPORT int STATE_WINAPI STATE_engine_is_editor_mode(void);
  366. // change the resolution of the screen.
  367. // bits_per_pixel is 8 or 16 or 24
  368. // returns OK or VR_ERROR
  369. STATE_IMPORT int STATE_WINAPI STATE_engine_set_resolution(int width, int height, int bits_per_pixel);
  370. // returns the resolution of the screen in the three arguments.
  371. // returns OK or VR_ERROR
  372. STATE_IMPORT int STATE_WINAPI STATE_engine_get_resolution(int *width, int *height, int *bits_per_pixel);
  373. // Changes the screen graphics mode.
  374. // The resolution is not modified (only the color depth).
  375. //
  376. // Important:
  377. // The software rendering works much faster at 16bit color depth.
  378. // If your end users might not have a 3D Card you should consider
  379. // to call STATE_engine_set_color_depth() at the beginning of the program to set 16bit mode color depth.
  380. // When the program exits the engine will switch back to what ever mode was before
  381. //
  382. // Parameters:
  383. // bits_per_pixel is 8 or 16 or 24
  384. //
  385. // Return Value:
  386. // Returns OK or VR_ERROR
  387. STATE_IMPORT int STATE_WINAPI STATE_engine_set_color_depth(int bits_per_pixel);
  388. //The log window is the small window with the progress bar that appears 
  389. //while the engine is loading. The reason it is called the Log Window (and not 
  390. //the progress window for example ...) is that in the first versions of the engine this window
  391. //was a lot bigger and it included some of the engine log as now appear in the STATE.log file
  392. //
  393. // Hides the log window
  394. STATE_IMPORT void  STATE_WINAPI STATE_engine_hide_log_window(void);
  395. //Makes the log window visible (The default)
  396. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_log_window_visible(void);
  397. //Returns YES or NO. YES if the log window is visible. 
  398. STATE_IMPORT int   STATE_WINAPI STATE_engine_is_log_window_visible(void);
  399. // On the log window there are two fields that has to do with the progress bar
  400. // one field represent the current progress and the other the target number
  401. // that the progress should reach.
  402. STATE_IMPORT int   STATE_WINAPI STATE_engine_get_log_window_progress(void);
  403. STATE_IMPORT int   STATE_WINAPI STATE_engine_get_log_window_target(void);
  404. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_log_window_progress(int value);
  405. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_log_window_target(int value);
  406. STATE_IMPORT void  STATE_WINAPI STATE_engine_log_window_minimize(void);
  407. //Add text to the log window
  408. STATE_IMPORT void  STATE_WINAPI STATE_engine_log_window_output(char *text);
  409. //Delete the old text and put the new text instead.
  410. STATE_IMPORT void  STATE_WINAPI STATE_engine_log_window_set_text(char *new_text);
  411. //Set the title of the log window
  412. STATE_IMPORT void  STATE_WINAPI STATE_engine_log_window_set_title(char *new_caption);
  413. //Obsolete
  414. STATE_IMPORT HWND  STATE_WINAPI STATE_engine_log_window_get_hwnd(void);
  415. // Delete all the text in 3DSTATE log files
  416. // There are two log files. 3dstate.log and error.log.
  417. STATE_IMPORT void  STATE_WINAPI STATE_engine_clear_STATE_log_files(void);
  418. //Write the given text into the 3dstate.log file. 
  419. STATE_IMPORT void  STATE_WINAPI STATE_engine_write_to_log_file(char *text);
  420. // (x,y) is a point in the rendering window
  421. // usually we get this point from the events like OnLButtonDown()
  422. // returns OK if a polygon was marked
  423. // returns VR_ERROR if there is no polygon in that spot
  424. STATE_IMPORT int  STATE_WINAPI STATE_engine_mark_polygon_at_point(int x, int y);
  425. // Gets a two dimensional point (x,y) which is a point in the rendered window
  426. // Usually we get this point from events like OnLButtonDown()
  427. // The function returns the corresponding three dimensional point
  428. // in the 3D world. Note that if the 2D point that is given is located where there is no 
  429. // polygon then the function will return VR_ERROR. This is because the point
  430. // in 3D is in infinity ... in that case the 3d point retrieved (result[] )
  431. // will hold a point in that direction that is one million units away
  432. // from the camera.
  433. //
  434. // Arguments:
  435. // x,y   -  A two dimensional point in the rendered window
  436. //  result - a point x,y,z in the 3D world which corresponds to the given 2D point.
  437. //  When calling the function to content of this argument is not relevant.
  438. //  The function calculate the 3D point and returns it through this argument.
  439. //
  440. //  selected_object_handle - If the pixel X,Y (the 2D point) on the rendered window is taken from
  441. //  a dynamic object then this argument will hold the handle to this object.
  442. //  
  443. //
  444. //  selected_polygon_handle - a handle to a polygon that corresponds with the given 2D point.
  445. // Return Value: OK or VR_ERROR
  446. //
  447. // See also STATE_engine_2D_point_to_3D_point_on_plane()
  448. //
  449. //
  450. // Remark:
  451. // Note that this function doesn't take a camera handle as one of its parameters.
  452. // Note also that the result of the operation is dependent on the current camera that is used.
  453. // The engine will use the current camera (The camera that was used in the last render)
  454. // In most of the cases this is the right thing to do. In the case when you want
  455. // to use a different camera for the calculation then use STATE_camera_set_current()
  456. // Before calling this function.
  457. //
  458. // Example:
  459. // int x=10, y=20;
  460. // double result[3];
  461. // DWORD selected_object_handle;
  462. // DWORD selected_polygon_handle;
  463. // int return_code;
  464. // return_code=STATE_engine_2D_point_to_3D(x,y,result, &selected_object_handle, &selected_polygon_handle);
  465. STATE_IMPORT int  STATE_WINAPI STATE_engine_2D_point_to_3D(int x, int y, double result[3], DWORD *selected_object_handle, DWORD *selected_polygon_handle);
  466. // The function associates a 2D point on the rendered window and a plane in the 3D world.
  467. // This function is useful for example when dragging an object with the mouse.
  468. // Once we click on the object we can get the polygon that was clicked using STATE_engine_2D_point_to_3D()
  469. // Now when dragging the object the mouse could move outside the object and then we wouldn't be able to use
  470. // STATE_engine_2D_point_to_3D(). By using this function we tell the engine that the 2D point
  471. // is related to a specific polygon even if the 2d coords are outside this polygon.
  472. // Detailes:
  473. // Gets a two dimensional point (x,y) which is a point in the rendered window
  474. // Usually we get this point from events like OnLButtonDown()
  475. // The function returns the corresponding three dimensional point
  476. // in the 3D world that is on the given plane. 
  477. //
  478. // Arguments:
  479. // x,y   -  A two dimensional point in the rendered window
  480. //  p3D - a point x,y,z in the 3D world which corresponds to the given 2D point and is located on the given plane.
  481. //  When calling the function to content of this argument is not relevant.
  482. //  The function calculate the 3D point and returns it through this argument.
  483. //
  484. //  polygons_plane - A plane in the 3D World (doesnt have to be a plane of any specific polygon)
  485. //  The result p3D point will always be on this plane.
  486. //
  487. // Return Value: OK or VR_ERROR
  488. //
  489. // See also STATE_engine_2D_point_to_3D_point(), STATE_polygon_get_plane()
  490. //
  491. // Example:
  492. // int x=10, y=20;
  493. // double result[3];
  494. // the_plane[0]=10; //This is a random plane. Instead we could have used STATE_polygon_get_plane()
  495. // the_plane[1]=11;
  496. // the_plane[2]=12;
  497. // the_plane[3]=14;
  498. // int return_code;
  499. // return_code=STATE_engine_2D_point_to_3D(x,y, the_plane ,result);
  500. STATE_IMPORT int  STATE_WINAPI STATE_engine_2D_point_to_3D_point_on_plane(int x, int y, double polygons_plane[4],double p3d[3]);
  501. // Gets a point in the world and returns the 
  502. // matching point on the screen.
  503. // Arguments:
  504. // p2D
  505. // On call p2D[2] has no meaning
  506. // on exit it will contain the 2D point.
  507. //
  508. // p3D
  509. // on call p3D[3] should be the 3D point in the world.
  510. //
  511. // Return value:
  512. // returns -1 if an error occurred. p2D contains 0,0
  513. // returns 0 if every thing is OK. p2D contains a valid result
  514. // returns 1 if the point is out of the window. p2D contains a valid result.
  515. // returns 2 if the point is behind the camera. p2D contains a valid result though  not accurate
  516. // returns 3 if both: behind the camera and out of the window. p2D contains a valid result though  not accurate
  517. //
  518. // Remark:
  519. // Note that this function doesn't take a camera handle as one of its parameters.
  520. // Note also that the result of the operation is dependent on the current camera that is used.
  521. // The engine will use the current camera (The camera that was used in the last render)
  522. // In most of the cases this is the right thing to do. In the case when you want
  523. // to use a different camera for the calculation then use STATE_camera_set_current()
  524. // Before calling this function.
  525. //
  526. STATE_IMPORT int  STATE_WINAPI STATE_engine_3D_point_to_2D(double p3D[3], int p2D[2]);
  527. // Note that picture quality that is set by the following
  528. // functions is related to the current camera only (the camera that was
  529. // last used by STATE_engine_render(). 
  530. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_picture_quality(int quality);
  531. STATE_IMPORT int   STATE_WINAPI STATE_engine_get_picture_quality(void);
  532. STATE_IMPORT void  STATE_WINAPI STATE_engine_increase_picture_quality(void);
  533. STATE_IMPORT void  STATE_WINAPI STATE_engine_decrease_picture_quality(void);
  534. // This function deals with fine tuning the engine performances
  535. // This function checks if it is possible to increase the quality without
  536. // slowing down rendering time. The return value is YES or NO.
  537. // Returns NO if couldn't increase quality without hurting performances.
  538. // Returns YES if succeeded to do so.
  539. // Usually this function will return NO. If it return YES
  540. // then it is better if we dont change the graphics quality our selves by calling STATE_engine_set_picture_quality() 
  541. // Note that this function is very slow (about one third of a second !)
  542. // Usually you would like to call it before the first render
  543. // for calibration-optimization. Call this function with the same parameters you
  544. // call STATE_engine_render();
  545. // Arguments:
  546. // hwnd: The window that is used when calling STATE_engine_render()
  547. //   NULL could be used if rendering is performed on the default rendering window
  548. //  camera: The camera that is used in STATE_engine_render(). 
  549. STATE_IMPORT int STATE_WINAPI STATE_engine_set_automatic_quality_control(HWND hwnd, DWORD camera_handle);
  550. //The engine will not use bitmaps. All the polygon will be drawn using color fill.
  551. //This rendering mode does not have any effect when using hardware rendering.
  552. //Using this function will make rendering a lot faster.
  553. // On the whole this function is not very useful
  554. //See also STATE_engine_set_color_fill_rendering_mode(), STATE_engine_set_normal_rendering_mode()
  555. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_color_fill_rendering_mode(void);
  556. //The engine will not use bitmaps. Only the wire frame of the polygons will be drawn.
  557. //This rendering mode does not have any effect when using hardware rendering.
  558. //Using this function will make rendering a lot faster.
  559. // On the whole this function is not very useful
  560. //See also STATE_engine_set_color_fill_rendering_mode(), STATE_engine_set_normal_rendering_mode()
  561. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_wire_frame_rendering_mode(void);
  562. //Reset the engine to its normal way of rendering (the default)
  563. //See also STATE_engine_set_wire_frame_rendering_mode(), STATE_engine_set_color_fill_rendering_mode()
  564. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_normal_rendering_mode(void);
  565. //Obsolete
  566. //STATE_IMPORT void  STATE_WINAPI STATE_engine_toggle_rendering_mode(void);
  567. //Obsolete
  568. //STATE_IMPORT void  STATE_WINAPI STATE_engine_toggle_wire_frame_flag(void);
  569. //About the brightness functions
  570. //--------------------------------
  571. //
  572. //We dont recommend using these functions any more since they work differently in software 
  573. //and hardware rendering.
  574. //Use the brightness demo in the SDK to see how the change in brightness effect
  575. //the rendered image. Note that the effect is different when using hardware
  576. //rendering. We recommend to use these functions only if your application
  577. //is not planed to run with hardware rendering.
  578. //Obsolete
  579. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_default_brightness(void);
  580. //Obsolete
  581. STATE_IMPORT void  STATE_WINAPI STATE_engine_increase_brightness(void);
  582. //Obsolete
  583. STATE_IMPORT void  STATE_WINAPI STATE_engine_decrease_brightness(void);
  584. //Obsolete
  585. // Zero means according to what is set in the input world file.
  586. // a positive number means make brighter. a negative number means darker
  587. // values should be in the range -64 till +64
  588. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_brightness(int value);
  589. //Obsolete
  590. STATE_IMPORT int  STATE_WINAPI STATE_engine_get_brightness(void);
  591. //Increases the fog effect.
  592. STATE_IMPORT void  STATE_WINAPI STATE_engine_increase_atmospheric_effect_intensity(void);
  593. //Decreases the fog effect.
  594. STATE_IMPORT void  STATE_WINAPI STATE_engine_decrease_atmospheric_effect_intensity(void);
  595. //Set the fog intensity to the engine default.
  596. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_default_atmospheric_effect_intensity(void);
  597. //Returns the current fog intensity.
  598. // 1 means according to what is set in the input world file.
  599. // 2 means the atmospheric effect intensity is doubled.
  600. // 0.5 means atmospheric effect intensity is half.
  601. // 0 means that atmospheric effect is off.
  602. STATE_IMPORT double  STATE_WINAPI STATE_engine_get_atmospheric_effect_intensity(void);
  603. // Set the fog intensity. 
  604. // Using fog is one of the easiest ways to increase your game speed.
  605. // The more intensed fog, the higher FPS (frames per seconds) you should expect.
  606. // Note however that if you do not use fog at all or use an unnoticeable intensity of fog
  607. // then it is better to shut off fog entirely (by calling STATE_engine_set_atmospheric_effect_intensity(0) )
  608. //
  609. // Parameters:
  610. //
  611. // fog_intensity
  612. // 1 means according to what is set in the input world file.
  613. // 2 means the atmospheric effect intensity is doubled.
  614. // 0.5 means atmospheric effect intensity is half.
  615. // 0 means that atmospheric effect is off.
  616. //
  617. // Note that if you test this function and suddenly you don't anything in your world that
  618. // usually means that you are using a too strong fog intensity. Try calling with a smaller value
  619. // till you get the desired effect.
  620. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_atmospheric_effect_intensity(double fog_intensity);
  621. //Changes the color of the fog between some pre selected values.
  622. STATE_IMPORT void  STATE_WINAPI STATE_engine_toggle_atmospheric_effect(void);
  623. // Set the color of the fog.
  624. // Even if you don't use fog, you might want to use this function
  625. // to reduce visible cracks seen between adjacent polygons. For that matter one should use a color that is as close as possible
  626. // to the dominate world in the world
  627. //
  628. // This function also set automatically the background color to the fog color (see STATE_engine_set_background_color() )
  629. //
  630. // Here are some tips for getting natural results:
  631. // 1) Choose a color that is very close to the dominant color in your world.
  632. //   for example if your world is a desert then your fog color (atmosphere color) should
  633. //   lean towards the color of sand.
  634. //
  635. // 2) Choose colors where the red==green==blue .Shades of gray look best
  636. //   even if you want to have a blue fog color then don't use 0,0,255 
  637. //   this will be very unnatural ... Colors such as (180,200,220) where the blue is a little bit
  638. //   higher than the rest, will give a much better effect.
  639. //   Always try:
  640. //   Black - (0,0,0)
  641. //   Gray - (128,128,128)  or any shade of gray
  642. //
  643. // See also STATE_engine_set_background_color()
  644. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_atmospheric_effect(int red, int green, int blue);
  645. //Returns the current fog color
  646. STATE_IMPORT void  STATE_WINAPI STATE_engine_get_atmospheric_effect(int *red, int *green, int *blue);
  647. //Sets the color of the background. The background is the color of the window on which
  648. //the rendering is done. If the rendered image does not cover the whole window then the 
  649. //background color will be seen in the area where there are no polygons.
  650. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_background_color(int red, int green, int blue);
  651. //Returns the current background color. For more information see STATE_engine_set_background_color()
  652. STATE_IMPORT void  STATE_WINAPI STATE_engine_get_background_color(int *red, int *green, int *blue);
  653. //This function will not influance hardware rendering
  654. // Toggles between automatic perspective correction and
  655. // no perspective correction(fastest).
  656. STATE_IMPORT void  STATE_WINAPI STATE_engine_toggle_automatic_perspective_correction(void);
  657. //This function will not effect hardware rendering
  658. // Cancels automatic mode and toggle between several accuracy modes.
  659. STATE_IMPORT void  STATE_WINAPI STATE_engine_toggle_perspective_correction_accuracy(void);
  660. //The following functions (color accuracy) are not extremely useful, they can be used to
  661. //speed up software rendering and has little effect when doing hardware rendering.
  662. //The engine has the capability to render far object using color fill instead of using
  663. //the polygon bitmap. This can speed up software rendering. When using color fill instead
  664. //of bitmap it will reduce the "color accuracy"
  665. //
  666. //Set the distance from the viewer that is needed so that the engine will use
  667. //color fill instead of using the bitmap of the polygon to its default value.
  668. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_default_far_objects_color_accuracy(void);
  669. //Increase the distance from the viewer that is needed so that the engine will use
  670. //color fill instead of using the bitmap of the polygon.
  671. //See also STATE_engine_set_default_far_objects_color_accuracy()
  672. STATE_IMPORT void  STATE_WINAPI STATE_engine_increase_far_objects_color_accuracy(void);
  673. //Decrease the distance from the viewer that is needed so that the engine will use
  674. //color fill instead of using the bitmap of the polygon.
  675. //See also STATE_engine_set_default_far_objects_color_accuracy()
  676. STATE_IMPORT void  STATE_WINAPI STATE_engine_decrease_far_objects_color_accuracy(void);
  677. // Returns a number in the range [0, 31]
  678. //See also STATE_engine_set_default_far_objects_color_accuracy()
  679. STATE_IMPORT int  STATE_WINAPI STATE_engine_get_far_objects_color_accuracy(void);
  680. //The value should be in the range [0, 31].
  681. //For more information please see STATE_engine_set_default_far_objects_color_accuracy()
  682. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_far_objects_color_accuracy(int value);
  683. //The engine can ignore polygons that are far away in order to speed up rendering.
  684. //For example if our character in a game enters a building we could use
  685. //this function to tell the engine that it doesnt have to work on far polygons
  686. //that are outside the building ...
  687. //When using fog the engine automatically ignores polygon that are totaly inside the
  688. //fog.
  689. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_default_culling_depth(void);
  690. //Increases the distance from the viewer in which the engine ignores polygons.
  691. STATE_IMPORT void  STATE_WINAPI STATE_engine_increase_culling_depth(void);
  692. //Decreases the distance from the viewer in which the engine ignores polygons.
  693. STATE_IMPORT void  STATE_WINAPI STATE_engine_decrease_culling_depth(void);
  694. //Returns a number that represent the distance from the viwer in which 
  695. //the engine starts to ignore polygons.
  696. //The given value is in the range 0-31
  697. STATE_IMPORT int  STATE_WINAPI STATE_engine_get_culling_depth(void);
  698. // The given value should be in the range [0 - Infinity ]
  699. // Tipical values are 15, 20 ,30
  700. STATE_IMPORT void  STATE_WINAPI STATE_engine_set_culling_depth(int value);
  701. //This function is very important. It checks whether it is possible to move 
  702. // between one point to another in the 3D world without intersecting any polygon.
  703. // If the movement is possible it returns YES else returns NO
  704. // If movement is not possible it returns the blocking polygon 
  705. // and the intersection point.
  706. // Note that the normal of the blocking surface is N=( plane[0], plane[1], plane[2])
  707. // If the return value is NO and blocking_object==NULL
  708. // it means that what blocks us is the static part of the world
  709. // Note that the function will be faster if the distance between the start_location and the end_location is smaller
  710. // Important NOTE:
  711. // Polygons have only one side. 
  712. // So there is a question what to do when we want to
  713. // go through a polygon that is not visible to the camera
  714. // (the camera sees only its back )
  715. // The solution that we chose is that: (can be changed using STATE_engine_ignore_back_faced_polygons_for_collision_detection() )
  716. // In Viewer (STATE_load_world() without EDITOR_MODE) mode we dont care if you see the polygon or not
  717. // you can never go through it !
  718. // In Editor mode we apply the following.
  719. // If the current camera sees the polygon then it is like
  720. // a solid wall (nothing can go through the wall and nothing can come from the wall)
  721. // If the current camera doesn't see the polygon then it is as if
  722. // the polygon doesn't exist at all.
  723. // If you didnt get it, we will try again.
  724. // say A is a point in space in the front of a polygon and B is a point on the back side 
  725. // of that polygon (The front is the side of the normal where you see the vertex in counterclockwise order)
  726. // then if the location of the camera is in the side of A then
  727. // one cant move not from A to B nor form B to A.
  728. // if the current camera is in the side of B
  729. // then it is possible to move both from A to B and from
  730. // B to A.
  731. // Note that the result is insensitive to the direction
  732. // of movement ( start_point to end_point or the other way around)
  733. // IMPORTANT:
  734. // If you want to move the camera from A to B. Lets say there is a one sided polygon
  735. // on the way that doesn't allow the movement. Now watch this one, there is a big
  736. // difference between the following options
  737. // I- moving the camera to B and then asking STATE_engine_is_movement_possible()
  738. // II- asking STATE_engine_is_movement_possible() while we are in A
  739. // In the first case we would get YES (error)
  740. // In the second case we would get the correct answer - NO
  741. // The reason for that is that if the camera is at point B then from point
  742. // B the polygon is not seen (we see only its back side which is invisible)
  743. // and if the obstacle is not seen then the movement is allowed !
  744. //
  745. // Arguments:
  746. //
  747. // start_location:
  748. // The x,y,z coordinate if the starting point
  749. //
  750. // end_location:
  751. // The x,y,z coordinate if the end point
  752. //
  753. //  intersected_polygon: If the line starting from start_point intersects a polygon in the world then
  754. //  the handle to this polygon will be returned through this argument
  755. //
  756. //  intersection: The x,y,z  coordinate of the intersection point.
  757. //
  758. //  blocking_object: If the intersected_polygon belongs to a dynamic object (see the STATE_object API) then
  759. //  the handle to this object will be returned through this argument.
  760. //
  761. //
  762. // Remark:
  763. // Note that this function doesn't take a camera handle as one of its parameters.
  764. // Note also that the result of the operation is dependent on the current camera that is used.
  765. // The engine will use the current camera (The camera that was used in the last render)
  766. // In most of the cases this is the right thing to do. In the case when you want
  767. // to use a different camera for the calculation then use STATE_camera_set_current()
  768. // Before calling this function.
  769. //
  770. //
  771. //
  772. // Example:
  773. // double start_location[3]={10,0,0};
  774. // double end_location[3]={10,0,1000};
  775. // double intersection[3];
  776. // DWORD intersected_polygon;
  777. // DWORD blocking_object;
  778. // int rc;
  779. // rc=STATE_engine_is_movement_possible(start_location, end_location, &intersected_polygon, intersection, &blocking_object);
  780. // if(rc==NO) .... //Collision
  781. //     else ....   //no collision
  782. //
  783. // See also: STATE_engine_ignore_back_faced_polygons_for_collision_detection(),
  784. //  STATE_engine_ignore_dynamic_objects_for_collision_detection()
  785. //
  786. STATE_IMPORT int STATE_WINAPI STATE_engine_is_movement_possible(double start_location[3], double end_location[3], DWORD *intersected_polygon, double intersection[3], DWORD *blocking_object);
  787. // This function is only relevant for the way collision detection functions work (mainly STATE_engine_is_movement_possible() ). 
  788. // By default STATE_engine_is_movement_possible() acts as follows: 
  789. // VIEWER_MODE (the default mode): does not ignore polygons that are back-facing the camera (if a polygon is back facing the camera it could still cause collision and become the blocking polygon when calling STATE_engine_is_movement_possible() )
  790. // EDITOR_MODE : Polygons back facing the camera are ignored and do not participate in the collision detection.
  791. // To change these defaults one can use this function.
  792. //
  793. // Among the collision detection functions that are influenced by STATE_engine_ignore_dynamic_objects_for_collision_detection() are: 
  794. // STATE_engineobject_is_movement_possible(), STATE_engine_2D_point_to_3D(), STATE_engine_get_object_at_point_2D().
  795. // STATE_engine_get_polygon_at_point_2D(), STATE_object_drop_down() and other functions that is sensing the shape of the world
  796. // and that its result is dependent on the shape of the world
  797. //
  798. // Example:
  799. //
  800. // //In editor mode this will change the default setting and will cause STATE_engine_is_movement_possible() to
  801. // //consider all the polygons for collision purposes. This might be useful if you are writing a game in EDITOR_MODE
  802. // STATE_engine_ignore_back_faced_polygons_for_collision_detection(NO);
  803. //
  804. // See also: STATE_engine_ignore_dynamic_objects_for_collision_detection()
  805. STATE_IMPORT void STATE_WINAPI STATE_engine_ignore_back_faced_polygons_for_collision_detection(int YES_or_NO);
  806. // This function is only relevant for the way collision detection functions work. 
  807. // The function is used for making collision detection checks that exclude all dynamic objects
  808. // For example, we might use STATE_engine_is_movement_possible() to measure the altitude of an aeroplane to the ground
  809. // (We take the plane location and the same point just with a very low Z value to be used as a point below the plane
  810. // then we call STATE_engine_is_movement_possible() and check collision between those two points)
  811. // For the matter of this check we do not care for the dynamic objects in the world and above all we don't want 
  812. // to get wrong altitude measurment if there is any dynamic object between the our plane and the ground)
  813. // Calling STATE_engineobject_is_movement_possible() after calling STATE_engine_ignore_dynamic_objects_for_collision_detection(YES)
  814. // Will have the same effect as the following commands
  815. //
  816. // disable_all_objects_that_are_not_currently_disabled()
  817. // STATE_engine_is_movement_possible()
  818. // enable_objects_that_were_disabled() //restore the enabled objects
  819. //
  820. // The default is NO, which means that all the non-disabled objects are included in collision detection tests
  821. //
  822. // Among the collision detection functions that are influenced by STATE_engine_ignore_dynamic_objects_for_collision_detection() are: 
  823. // STATE_engineobject_is_movement_possible(), STATE_engine_2D_point_to_3D(), STATE_engine_get_object_at_point_2D().
  824. // STATE_engine_get_polygon_at_point_2D(), STATE_object_drop_down() and other functions that is sensing the shape of the world
  825. // and that its result is dependent on the shape of the world
  826. //
  827. //
  828. // Example:
  829. //
  830. // STATE_engine_ignore_dynamic_objects_for_collision_detection(YES);
  831. //
  832. STATE_IMPORT void STATE_WINAPI STATE_engine_ignore_dynamic_objects_for_collision_detection(int YES_or_NO);
  833. // if movement possible returns YES else returns NO
  834. // If movement is not possible it returns the plane equation Ax+By+Cz+D=0
  835. // and the intersection point.
  836. // Note that the normal of the blocking surface is N=( plane[0], plane[1], plane[2])
  837. // If the return value is NO and blocking_object==NULL
  838. // it means that what blocks us is the static part of the world
  839. // see also remarks on STATE_engine_is_movement_possible()
  840. //
  841. // Remark:
  842. // Note that this function doesn't take a camera handle as one of its parameters.
  843. // Note also that the result of the operation is dependent on the current camera that is used.
  844. // The engine will use the current camera (The camera that was used in the last render)
  845. // In most of the cases this is the right thing to do. In the case when you want
  846. // to use a different camera for the calculation then use STATE_camera_set_current()
  847. // Before calling this function.
  848. //
  849. //
  850. STATE_IMPORT int STATE_WINAPI STATE_engine_is_movement_possible_camera_space(double start_location[3], double end_location[3], DWORD *intersected_polygon, double intersection[3], DWORD *blocking_object);
  851. //Counts how many polygons we will cross going from point1 to point2
  852. //in addition it calculates the average normal of all the polygons between the two points
  853. //
  854. // Parameters:
  855. //
  856. // point1,point2: A line (actually a segment) starting at point1 and ending at point2
  857. //
  858. // combined_normal: The combined normal of all the intersected polygons.
  859. //  if for example we try to move through the corner of a room.
  860. //  The corner point is created from three intersectiong planes
  861. //  The combined normal will be the avareage of the three normals.
  862. //
  863. // Return value: The number of polygons that are intersected when going from point1 to point2
  864. //
  865. // Example:
  866. // double point1[3]={10,0,0};
  867. // double point2[3]={100,200,300};
  868. // double combined_normal[3];
  869. // int num_of_collisions;
  870. // num_of_collisions=STATE_engine_get_number_of_collisions(point1, point2, combined_normal);
  871. STATE_IMPORT int STATE_WINAPI STATE_engine_get_number_of_collisions(double point1[3], double point2[3], double combined_normal[3]);
  872. // Gets a two dimensional point (x,y) which is a point on the rendered window
  873. // (Usually we get this point from events like OnLButtonDown() )
  874. // If there is a dynamic object at this location (on the rendered image) then this function
  875. // will return the object handle
  876. // See also STATE_engine_2D_point_to_3D() and the STATE_object_ API.
  877. STATE_IMPORT DWORD STATE_WINAPI STATE_engine_get_object_at_point_2D(int x,int y);
  878. // Gets a two dimensional point (x,y) which is a point on the rendered window
  879. // (Usually we get this point from events like OnLButtonDown() )
  880. // If there is a polygon at this location (on the rendered image) then this function
  881. // will return the polygon handle
  882. // See also STATE_engine_2D_point_to_3D()
  883. STATE_IMPORT DWORD STATE_WINAPI STATE_engine_get_polygon_at_point_2D(int x,int y);
  884. //The default rendering window is the window on which the engine render
  885. //when we call STATE_engine_render() with a NULL window
  886. //(example: STATE_engine_render(NULL,camera))
  887. //If the return value is NULL it means that the function failed
  888. //One can use this handle with many of the win32 api function
  889. //that deals with windows
  890. STATE_IMPORT HWND STATE_WINAPI STATE_engine_get_default_rendering_window_hwnd(void);
  891. //The default rendering window is the window on which the engine render
  892. //when we call STATE_engine_render() with a NULL window
  893. //(example: STATE_engine_render(NULL,camera))
  894. STATE_IMPORT void STATE_WINAPI STATE_engine_maximize_default_rendering_window(void);
  895. //The default rendering window is the window on which the engine render
  896. //when we call STATE_engine_render() with a NULL window
  897. //(example: STATE_engine_render(NULL,camera))
  898. STATE_IMPORT void STATE_WINAPI STATE_engine_minimize_default_rendering_window(void);
  899. //The default rendering window is the window on which the engine render
  900. //when we call STATE_engine_render() with a NULL window
  901. //(example: STATE_engine_render(NULL,camera))
  902. STATE_IMPORT void STATE_WINAPI STATE_engine_set_default_rendering_window_title(char *text);
  903. //The default rendering window is the window on which the engine renders
  904. //when STATE_engine_render() is called with a NULL window
  905. //(example: STATE_engine_render(NULL,camera))
  906. //Arguments: 
  907. // left_x, top_y : the top left corner of the window
  908. // width, height: the dimension of the window
  909. STATE_IMPORT void STATE_WINAPI STATE_engine_set_default_rendering_window_size(int left_x, int top_y, int width, int height);
  910. // Obsolete, use STATE_group_create_reduced_copy() instead
  911. // accuracy is used when we try to check whether two polygons
  912. // have the same plane (so we can unite them to one polygon). 
  913. // If this number for example is 0.1 and 
  914. // the X component if the normals are planeA[0]=1 and planeB[0]=0.9
  915. // then the join operation will take place.
  916. // can be done only in editor mode.
  917. // returns the number of polygons that were reduced.
  918. STATE_IMPORT int STATE_WINAPI STATE_engine_reduce_polygons_count(double accuracy);
  919. // Add a polygon to the world. A polygon can be created and manipulated
  920. // but it is not drawn until we call this function.
  921. //
  922. // This function also calls STATE_polygon_is_valid() to check the validity of the added polygon.
  923. // If STATE_polygon_is_valid() returns NO (not valid) then it will try to
  924. // fix the polygon. If the attempt to fix the polygon will fail the
  925. // function will return VR_ERROR.
  926. //
  927. // This function works only in EDITOR_MODE.
  928. // To add a polygon in Viewer Mode (The default mode) use the
  929. // function STATE_object_add_polygon(). Even when using STATE_object_add_polygon()
  930. // (in viewer mode) it is only possible to add polygons to the dynamic part of the world.
  931. //
  932. // Returns OK or VR_ERROR.
  933. STATE_IMPORT int STATE_WINAPI STATE_engine_add_polygon(DWORD polygon_handle);
  934. // Save the 3D world as a file.
  935. //
  936. // Arguments:
  937. // file_name:
  938. // The file name should have the extension .wld (for text format) 
  939. // or .STATE (for binary format) or should be without 
  940. // an extension at all (.wld will be added automatically)
  941. // if a relative path is provided it will be relative to
  942. // the directory of the executable.
  943. //
  944. //  group_to_save: The group to save. Give NULL if you would like to save the whole world.
  945. //    If a group handle that is not NULL is used then only the given group will be saved.
  946. //
  947. // save_flags: See below.
  948. //
  949. // returns OK or VR_ERROR
  950. //
  951. // Example: 
  952. // //Save the whole world including the bitmaps that will be saved in bmp format
  953. // STATE_engine_save("World1.STATE", NULL, SAVE_FLAT_BITMAP_PATH | SAVE_BITMAP_AS_BMP);
  954. //
  955. // possible flags: (note that we can do an OR operation between them)
  956. #define SAVE_DEFAULT 0
  957. #define SAVE_ONLY_WHATS_NEEDED 1 //does NOT save extra resources that are not needed to the saved group. it will save only animations that are needed for the polygons in the models. Cameras backgrounds and tracks will NOT be saved
  958. // see also SAVE_MODELS_ONLY
  959. #define SAVE_FLAT_BITMAP_PATH 2 //Recomended. STATE World Builder always uses this flag. For every polygon the name of its bitmap wont include the path just the name. the same for animations. this is very convenient if we want to keep all the bitmap in one directory.
  960. // If we also save bitmaps then the save will be done with flat bitmap path no matter the value of this flag.
  961. // The following options will save the world as a complete projects including the bitmaps file
  962. // The function will make a directory called bitmap bellow the given path, and there it will put all the bitmaps
  963. // The idea here that the world becomes a "stand alone" it can be send through e-mail, put on a diskette etc ...
  964. // Note that when you try to load the world
  965. // after it was saved the engine would first look for jbm files
  966. // then for bmp and then for jpg, so if a bitmap was changed and saved as bmp
  967. // but the jbm file wasnt deleted then the engine will load the old bitmap in the jbm format.
  968. // using one of the bitmaps flag will cause the save to be done with flat bitmap path no matter the value of this flag.
  969. // using different kind of bitmaps type is allowed. it will create all of them on the disk.
  970. #define SAVE_BITMAP_AS_JPG 4  //The bitmaps are saved in a JPG format. This should be done when optimizing for space. The down side is that it would take more time to load the world. and
  971. // the quality of some bitmaps might suffer. If transparent bitmap have spots or that some parts are missing one can modify by hand
  972. // The *.flt file for that bitmap.
  973.     //for more information about the flt files see at the bottom of this file
  974.     // in the help appendixes
  975. #define SAVE_BITMAP_AS_BMP 8  //The bitmaps are saved in a BMP format. This should be done when we want the ability to modify the bitmaps
  976. // using bitmaps editors like PhtoPaint, Photoshop, Paintbrush etc ... Remember to delete the jbm file each time you modify the bitmap.
  977. #define SAVE_BITMAP_AS_JBM 16 //The bitmaps are saved in a JBM format. This is the engine internal format. This should be done when we want the loading time of the world to be as short as possible.
  978. //see also the flag SAVE_BITMAP_OPTIMIZE below
  979. #define SAVE_IN_MULTIPLE_FILES 32 // Instead of putting all the models in one file, it saves each model
  980. // in a separate file. This way is easier to change the world
  981. // by hand. In this method it is also very easy to replace components (now each one is
  982. // separate file
  983. #define SAVE_ONLY_MODELS 64 //Save the model and its bitmaps and only the animations that are currently used by
  984. // the model. This is the same as to call with SAVE_ONLY_WHATS_NEEDED when all the save flags are set to NO
  985. // ( see STATE_camera_set_save_flag() , STATE_animation_set_save_flag(0 etc ...)
  986. #define SAVE_RELEASE 128 //1- All the polygons will be put inside module main
  987.  // this makes a faster save and a faster load afterwards
  988.  // When we load a world that was save using SAVE_RELEASE we
  989.  // will lose all group affiliations.
  990.  //2- polygons that have their release_save flag set to NO wont be saved
  991.  // for example some models have polygons that are used only as a bottom
  992.  // (applications like STATE World Builder need a bottom polygon so when
  993.  // we drop an objects on a floor it will know how to put it, in some models
  994.  // a bottom polygon is part of the model and in others (like trees) it is just an extra polygon)
  995.  // the release_save_flag can be set by STATE_polygon_set_release_save_flag() or
  996.  // by specifying NOYES in the RELEASE_SAVE field in the world text file
  997. #define SAVE_BITMAP_OPTIMIZED 512 //This option overrides the following flags SAVE_BITMAP_AS_JPG, SAVE_BITMAP_AS_BMP, and SAVE_BITMAP_AS_JBM
  998.   //with this option all the bitmaps will be saved in jpg format
  999.   //except those that are being used with a transparency, those will be saved
  1000.   //in BMP format. This flag is used when we want to save in jpg format
  1001.   //but we dont want the jpg format to ruin the transparency bitmaps.
  1002.   //The problem is that jpg images are not identical to the original and
  1003.   //this makes a big problem with the transparent color because instead of one background color
  1004.   //for example 255,255,255 we get several like 254,255,255 and 255,254,254 etc ...
  1005.   //the engine will only eliminate one transparent color leaving all the other nuances
  1006.   //If you didnt understand, just try to save a world using the flag SAVE_BITMAP_AS_JPG
  1007.   //and then load the saved world and look at polygons that use a transparent bitmap.
  1008.   //another way to deal with this problem is using the flt file that is saved together with each jpg bitmap
  1009.   //for more information about the flt files see at the bottom of this file
  1010.   // in the help appendixes
  1011. #define SAVE_WITHOUT_GROUPS  1024 //This flag is only valid when saving in the binary format (to save in binary format give a file name that has a "3dstate"  "morfit" name extension instead of "wld")
  1012.   //In many application in viewer mode, the STATE_group_ API is not used at all
  1013.   //In this case you might want to use this flag in order to decrease the size of the saved file.
  1014. #define SAVE_WITH_BSP_TREE_INFORMATION 2048 //The use of this flag is not recommended.
  1015. //This flag is only valid when saving in the binary format (to save in binary format give a file name that has a "3dstate"  "morfit" name extension instead of "wld")
  1016. //The bsp information is needed only when the world is loaded in VIEWER_MODE (the drfault mode)
  1017. //If a world will be loaded in viewer mode without the bsp information then the
  1018. //engine will create this information on its own. Creating the bsp tree is a lengthy operation
  1019. //so it is better if it is done at save time rather then in load time. To conclude you should use this flag in
  1020. //the following situation:
  1021. //The world is meant to be used in VIEWER_MODE and this is the release version.
  1022. //Dont use this flag if you still have to do some editing to the world in World Builder.
  1023. //Very Important ! In many cases a world that was saved with this flag will be unusable in editor mode
  1024. //(because in the process of creating the bsp tree many polygons have to be cut into smaller fractions)
  1025. //so because of that you should also save another version without using this flag in case you might want in the future to
  1026. //edit this world.
  1027. #define SAVE_WITHOUT_CALCULATING_POINT_NORMALS 4096 //When saving the world the engine calculates the normal of all the points
  1028. //Use this flag if you have modify the points normal and you dont want the engine
  1029. //to overwrite your point normal calculations. Another reason you might want to use this flag is to speed-up
  1030. //the time it takes to save a world. Using this flag one can reduce some significant time
  1031. //since the normal calculations are quite a time consuming process. We don't recommend
  1032. //using this flag for speeding the saving function because if the points normal are not calculated
  1033. //and the world is lit then the lighting result will be inaccurate.
  1034. //See STATE_point_get_normal() for more information. 
  1035. STATE_IMPORT int STATE_WINAPI STATE_engine_save(char *file_name, DWORD group_to_save, int save_flags);
  1036. //Use STATE_engine_save() with a .x extension ...
  1037. //STATE_IMPORT int STATE_WINAPI STATE_engine_save_in_directx_format(char *file_name);
  1038. // Redraw on the window the last rendered image
  1039. // Usually used together with STATE_engine_render_on_dc()
  1040. // Note that this function also releases the dc the was obtained
  1041. // when calling STATE_engine_render_on_dc() this means that
  1042. // all the function that use the returned dc (from dc=STATE_engine_render_on_dc() )
  1043. // must be called before calling STATE_engine_copy_image_from_dc_to_screen().
  1044. // 
  1045. //See STATE_engine_render_on_dc() for more information.
  1046. STATE_IMPORT void  STATE_WINAPI STATE_engine_copy_image_from_dc_to_screen(void);
  1047. //obsolete. Completely identical (Physically the same) to STATE_engine_copy_image_from_dc_to_screen()
  1048. STATE_IMPORT void  STATE_WINAPI STATE_engine_bitblt(void);
  1049. //Like STATE_engine_render() only that it renders on a HBITMAP
  1050. //A HBITMAP is a WIN32 type (nothing to do with STATE) for more information
  1051. //about HBITMAP check your compiler help.
  1052. //The size of the created bitmap will match the size of the window that
  1053. //was last used for regular rendering.
  1054. //Note that there is no need to free the HBITMAP that is created. The engine will automatically
  1055. //delete the old HBITMAP when calling STATE_engine_render_on_bitmap() again.
  1056. // Return value: on failure returns NULL. On success returns an HBITMAP
  1057. // 
  1058. //
  1059. //Example A: Taking a screenshot
  1060. //
  1061. // HBITMAP hbm=STATE_engine_render_on_bitmap(your_window_or_null, your_camera_or_null);
  1062. // STATE_utilities_save_bitmap(hbm, "d:\screenshots\shot.bmp");
  1063. //
  1064. // Example B: Using the rendered image as a regular bitmap that
  1065. //   can be put on a polygon.
  1066. //
  1067. // HBITMAP hbm=STATE_engine_render_on_bitmap(NULL, NULL);
  1068. // STATE_utilities_save_bitmap(hbm, "d:\screenshots\shot.bmp");
  1069. // DWORD STATE_bmp=STATE_bitmap_load("d:\screenshots\shot.bmp", -1);
  1070. // DWORD test_poly=STATE_polygon_get_first_polygon();
  1071. // STATE_polygon_set_bitmap_fill(test_poly, STATE_bmp);
  1072. //
  1073. // Please note that Example B uses the harddisk to do the conversion between 
  1074. // a HBITMAP and a bitmap that can be used with STATE_bitmap API.
  1075. // Currently there is no other way to do this. This is not as bad as it sounds
  1076. // Since the operating system will use its buffers so when we will do
  1077. // STATE_bitmap_load() it doesnt wait for the file to be written to the disk
  1078. // it takes the file immediately from the operation system buffers.
  1079. //
  1080. // See also STATE_utilities_save_bitmap(), STATE_engine_render_on_dc()
  1081. STATE_IMPORT HBITMAP  STATE_WINAPI STATE_engine_render_on_bitmap(HWND hwnd, DWORD camera_handle);
  1082. //This function is very important. It allows painting and writing over the rendered image
  1083. //The function is exactly like STATE_engine_render() only that it doesnt write the
  1084. //rendered image into the screen, instead the image is left on the device context ( dc )
  1085. //If you dont know what is a Device Context then dont bother about it
  1086. //just think of it as a handle that many WIN32 graphic functions get.
  1087. //The beauty of this technique that one can use all the many Windows function
  1088. // (GDI functions). Please be aware that Windows graphics function are
  1089. // some time quite slow.
  1090. // After finishing painting on top of the rendered image 
  1091. // use STATE_engine_copy_image_from_dc_to_screen() to draw the finished image on the
  1092. // window
  1093. //
  1094. //Here is a sample how to use STATE_engine_render_on_dc()
  1095. //
  1096. // HDC dc=STATE_engine_render_on_dc(NULL,camera);
  1097. //
  1098. //     //paints a circle on the device context. 
  1099. // //Note that ELlipse() is a Windows function (WIN32 API)
  1100. // //Look in you compiler help for information about that function.
  1101. // //There are many other function that you can use for writing text, changing
  1102. //      //colors, changing the fill pattern etc ...
  1103. // Ellipse(dc, 100,100,200,200);
  1104. // //paint another circle
  1105. // Ellipse(dc, 220,220,320,320);
  1106. //
  1107. // //Get the picture on the screen. Without calling this function you
  1108. //      //wont see anything.
  1109. // STATE_engine_copy_image_from_dc_to_screen();
  1110. //
  1111. // //Note that STATE_engine_copy_image_from_dc_to_screen()
  1112. // //releases dc (the device context) so
  1113. // //after calling it one cant use dc any more.
  1114. // //a new valid dc will be obtain when we repeat it in a loop
  1115. // // dc=STATE_engine_render_on_dc();
  1116. //
  1117. // For drawing a wire frame lines around polygons note the function STATE_engine_3D_edge_to_2D()
  1118. //
  1119. STATE_IMPORT HDC STATE_WINAPI STATE_engine_render_on_dc(HWND hwnd, DWORD camera_handle);
  1120. // This function is similar to STATE_engine_render_on_dc()
  1121. // 
  1122. // The differences are only when doing hardware rendering:
  1123. // Here are the differences:
  1124. // 1) This function is slower.
  1125. // 2) This function doesnt lock the target surface (DirectX surface ...)
  1126. //   This way you can do your own bitblt to the screen and not use
  1127. //   STATE_engine_copy_image_from_dc_to_screen()
  1128. //
  1129. // In short, in almost any case it is better to use STATE_engine_render_on_dc()
  1130. STATE_IMPORT HDC STATE_WINAPI STATE_engine_render_on_memCDC(HWND hwnd, DWORD camera_handle);
  1131. //This function converts a given line in the 3D world to its projection on the rendered window.
  1132. //This could be very useful when drawing a wire frame to a polygon.
  1133. //
  1134. // Parameters:
  1135. // p1, p2 : A line (a segment) in the 3D world
  1136. // p1_2D, p2_2D : The equivalent line on the rendered window.
  1137. //
  1138. // Return value:
  1139. // returns one of the four:
  1140. // EDGE_NOT_SEEN if the edge is outside the rendering window
  1141. // in this case p1_2D and p2_2D are not valid
  1142. // EDGE_FULLY_SEEN if the edge is fully inside the rendering window
  1143. // in this case p1_2D and p2_2D are the desired result
  1144. // EDGE_PARTIALLY_SEEN if some of the edge is inside the window
  1145. // in this case p1_2D and p2_2D are the portion that inside the rendering area
  1146. // VR_ERROR an error occurred 
  1147. // in this case p1_2D and p2_2D are not valid
  1148. //
  1149. // Example:
  1150. // double p1[3]={10,20,30};
  1151. // double p2[3]={100,200,300};
  1152. // double p1_2d[3], p2_2d[3];
  1153. // inr rc;
  1154. // rc=STATE_engine_3D_edge_to_2D(p1,p2, p1_2d, p2_2d);
  1155. //
  1156. STATE_IMPORT int STATE_WINAPI STATE_engine_3D_edge_to_2D(double p1[3], double p2[3], int p1_2D[2], int p2_2D[2]);
  1157. // returns one of the four
  1158. // EDGE_NOT_SEEN if the edge is outside the rendering window
  1159. // in this case p1,p2 == clipped_p1,clipped_p2
  1160. // EDGE_FULLY_SEEN if the edge is fully inside the rendering window
  1161. // in this case p1,p2 == clipped_p1,clipped_p2
  1162. // EDGE_PARTIALLY_SEEN if some of the edge is inside the window
  1163. // in this case clipped_p1,clipped_p2 is the seen part
  1164. // VR_ERROR an error occurred 
  1165. // in this case clipped_p1,clipped_p2 are not valid
  1166. STATE_IMPORT int STATE_WINAPI STATE_engine_clip_edge(double p1[3], double p2[3], double clipped_p1[3], double clipped_p2[3]);
  1167. // Calling this function will eliminate the render to the given group
  1168. // Polygons that are not included in this group wont be rendered
  1169. // If a NULL is given then all the polygons will be rendered (the default)
  1170. // Arguments: 
  1171. // grp_to_render_handle: The group to render
  1172. STATE_IMPORT void STATE_WINAPI STATE_engine_set_group_to_render(DWORD grp_to_render_handle);
  1173. // -- bitmaps stuff
  1174. //Returns the number of bitmaps that are currently loaded into the engine.
  1175. STATE_IMPORT int STATE_WINAPI STATE_engine_get_number_of_loaded_bitmaps(void);
  1176. //Calling this function will free all the bitmaps that are not used at this moment.
  1177. //Not used means that there is no polygon or animation that uses them.
  1178. // Returns the number of bitmaps that were unloaded
  1179. STATE_IMPORT int STATE_WINAPI STATE_engine_unload_unused_bitmaps(void);
  1180. //This function is not very useful
  1181. //Unload all the bitmaps from the engine.
  1182. STATE_IMPORT void STATE_WINAPI STATE_engine_unload_all_bitmaps(void);
  1183. //Obsolete. Please use STATE_engine_translate_movement_on_screen_to_world()
  1184. STATE_IMPORT int STATE_WINAPI STATE_engine_translate_movement_on_screen_to_movement_in_world(double p3D[3], double result_p3D[3], int delta_x, int delta_y);
  1185. // This function is used to solve the following problem:
  1186. // An object inside our world is dragged with the mouse delta_x,delta_y pixels.
  1187. // Where should we put the object now so that it will reflect the correct move.
  1188. // Arguments:
  1189. // p3D -
  1190. // p3D is a point in the world.
  1191. //
  1192. // delta_x,delta_y
  1193. // delta_x, delta_y is the desired change in the location on
  1194. // the screen of the projection of p3D.
  1195. //
  1196. //  result_p3D
  1197. // result_p3D is a location that if p3D will move to this location
  1198. // its projection on the render image will move delta_x pixels right
  1199. // and delta_y pixels down (negative gives an opposite direction)
  1200. //
  1201. // returns OK or VR_ERROR and the reslut x,y,z point in result_p3D.
  1202. STATE_IMPORT int STATE_WINAPI STATE_engine_translate_movement_on_screen_to_world(double p3D[3], double result_p3D[3], int delta_x, int delta_y);
  1203. // The function returns the color depth (of the graphic mode) that was before
  1204. // STATE.dll was loaded. 
  1205. //When the dll is being loaded it changes the color depth of the desktop to 16 bit (if not 16 bit already).
  1206. // Possible return values are:
  1207. //  0  When DirectX is not installed it will always return 0
  1208. // this means that the color depth wasnt changed by the STATE dll.
  1209. // 4 (for 16 color mode)
  1210. //  8 (for 256 color mode)
  1211. //  16 (16bit color mode == 65536 colors)
  1212. //  24 ( RGB 8-8-8 mode )
  1213. //  32 (32bit color mode )
  1214. //
  1215. // Note also that the dll will change the color to 16bit rgb automatically only if DirectX was installed on the computer
  1216. // or if the OS is Windows98 or above
  1217. STATE_IMPORT int STATE_WINAPI STATE_engine_get_original_color_depth(void);
  1218. // gets YES or NO. YES will move the objects automatically each
  1219. // time we do STATE_engine_render(). The movement is according
  1220. // to the instructions in the wld file (CHASE ... ) or as was set in real-time.
  1221. // The default is YES.
  1222. // See also STATE_camera_advance_all()
  1223. // and STATE_object_advance_all()
  1224. // Note works only in viewer mode (viewer mode is the default mode)
  1225. STATE_IMPORT void STATE_WINAPI STATE_engine_advance_objects_automatically(int yes_no_flag);
  1226. // gets YES or NO. YES will move the cameras automatically each
  1227. // time we do STATE_engine_render(). The movement is according
  1228. // to the instructions in the wld file (CHASE ... ) or as was set in real-time.
  1229. // The default is YES.
  1230. // See also STATE_camera_advance_all()
  1231. // and STATE_object_advance_all()
  1232. STATE_IMPORT void STATE_WINAPI STATE_engine_advance_cameras_automatically(int yes_no_flag);
  1233. //This function doesn't  work in editor mode. When zbuffer is off
  1234. // get YES or NO. zbuffer is the name of the algorithm that is often used to solve
  1235. // the hidden surface removal problem. If NO is given the engine will use
  1236. // BSP algorithms (binary space partitions) the BSP algorithms are faster
  1237. // and more accurate most of the time. There are some cases where BSP algorithms will
  1238. // be less accurate. Try testing both methods and see which is better for your world.
  1239. // Note that using this function is equivalent to calling STATE_engine_load_world()
  1240. // with (or without) the DONT_USE_ZBUFFER flag. Using this function makes it possible to change
  1241. // methods at run-time.
  1242. //The return value is OK or VR_ERROR (error if we try to do it in editor_mode)
  1243. // The default is zbuffer ON.
  1244. // example: STATE_engine_use_zbuffer(YES);
  1245. STATE_IMPORT int STATE_WINAPI STATE_engine_use_zbuffer(int yes_no_flag);
  1246. // returns YES or NO. YES if the zbuffer algorithm is used.
  1247. // see STATE_engine_use_zbuffer() for more details.
  1248. STATE_IMPORT int  STATE_WINAPI STATE_engine_is_zbuffer(void);
  1249. // Returns an array of all the extensions supported by the engine.
  1250. // returns also in number_of_supported_formats the number of extensions supported.
  1251. // these are the extensions that can be used with STATE_engine_load_world()
  1252. // and with STATE_engine_save()
  1253. // Example of usage:
  1254. // int num;
  1255. // table=STATE_engine_get_supported_extensions_array(&num);
  1256. // for(int i=0; i<num; i++) MessageBox(table[i]);
  1257. //
  1258. // The strings that we will get are "3dstate"=="STATE" "wld", "morfit","mft", "raw", "x" and more depending  on the
  1259. // version of STATE dll.
  1260. STATE_IMPORT char ** STATE_WINAPI STATE_engine_get_supported_formats_extensions_array(int *number_of_supported_formats);
  1261. // Usage is exactly like STATE_engine_get_supported_formats_extensions_array()
  1262. // The string that we will get is similar  to "STATE's 3D worlds file format" for example.
  1263. STATE_IMPORT char ** STATE_WINAPI STATE_engine_get_supported_formats_names_array(int *number_of_supported_formats);
  1264. // a value of 0 will make rendering as fast as possible but 
  1265. // perspective correction will be at its lowest level (try it out and see if the lake of accuracy influence your world)
  1266. // a value of one is the default. values less than one will make rendering faster (but less accurate)
  1267. // values bigger than one will make rendering slower but more accurate.
  1268. // normally you wouldnt find values bigger than 3 useful.
  1269. // the value 1000 has a special meaning it will make perspective correction
  1270. // 100% correct. This of course will make rendering very very slow,
  1271. // use this value for pause mode or for screen capturing or when ever speed
  1272. // is not important at all.
  1273. STATE_IMPORT void STATE_WINAPI STATE_engine_set_perspective_correction_accuracy(double value);
  1274. // see STATE_engine_set_perspective_correction_accuracy() for more details
  1275. STATE_IMPORT double STATE_WINAPI STATE_engine_get_perspective_correction_accuracy(void);
  1276. // === Performances Querying  ====== //
  1277. // Measure the time between two consecutive calls to render.
  1278. // returns the time in milliseconds.
  1279. // STATE_engine_render() must be called at least twice before this
  1280. // function can be used (if not it will return 0) 
  1281. // The function calculate the average time starting with the first render to the last render
  1282. // See also STATE_engine_get_computer_speed_factor() which returns the average of the last 50 program cycles
  1283. STATE_IMPORT DWORD STATE_WINAPI STATE_engine_get_average_program_cycle_time(void);
  1284. // Measure the time between two consecutive calls to render.
  1285. // returns the time in milliseconds.
  1286. // STATE_engine_render() must be called at least twice before this
  1287. // function can be use (if not it will return 0) 
  1288. // See also STATE_engine_get_computer_speed_factor() which returns the average of the last 50 program cycles
  1289. STATE_IMPORT DWORD STATE_WINAPI STATE_engine_get_last_program_cycle_time(void);
  1290. // Returns the execution time (in milliseconds) of the last call to STATE_engine_render().
  1291. // Through this number one can calculate the current fps (frames per second)
  1292. // t=STATE_engine_get_last_render_execution_time()
  1293. // if (t==0) return(0); //STATE_engine_render() wasnt called even once. protect against division by zero
  1294. // fps=1000/t;
  1295. // see also STATE_engine_get_average_render_execution_time()
  1296. STATE_IMPORT DWORD STATE_WINAPI STATE_engine_get_last_render_execution_time(void);
  1297. // Returns the average execution time (in milliseconds) of STATE_engine_render().
  1298. // Through this number one can calculate the average fps (frames per second)
  1299. // t=STATE_engine_get_average_render_execution_time()
  1300. // if (t==0) return(0); //STATE_engine_render() wasnt called even once. protect against division by zero
  1301. // fps=1000/t;
  1302. STATE_IMPORT DWORD STATE_WINAPI STATE_engine_get_average_render_execution_time(void);
  1303. // Obsolete. Use the 3D_card API instead (STATE_3D_card....)
  1304. // return YES or NO
  1305. STATE_IMPORT int STATE_WINAPI STATE_engine_check_3d_hardware_support(void);
  1306. // Obsolete. Use the 3D_card API instead (STATE_3D_card....)
  1307. // Get YES or NO. Returns OK or VR_ERROR
  1308. // If gets YES, the function will look for a 3D card installed on the computer
  1309. // if it wont find, the function will return VR_ERROR.
  1310. // It is a good practice to call STATE_engine_use_3D_accelerator_card(NO);
  1311. //before you exit your application.
  1312. // The default is NO.
  1313. STATE_IMPORT int STATE_WINAPI STATE_engine_use_3D_accelerator_card(int YES_or_NO);
  1314. // Obsolete. Use the 3D_card API instead (STATE_3D_card....)
  1315. //Returns the current setting for the 3D accelerator card.
  1316. //example:
  1317. // int res_x, res_y;
  1318. // STATE_engine_get_3D_accelerator_resolution(&res_x,&res_y);
  1319. // output_message("The current resolution setting for 3D hardware is %d X %d n",res_x,res_y);
  1320. STATE_IMPORT void STATE_WINAPI STATE_engine_get_3D_accelerator_resolution(int *width, int *height);
  1321. // Obsolete. Use the 3D_card API instead (STATE_3D_card....)
  1322. //Returns YES if a 3D accelerator card is in use.
  1323. //Returns NO if software rendering is used.
  1324. STATE_IMPORT int STATE_WINAPI STATE_engine_is_3D_accelerator_card_used(void);
  1325. // Using this function one can build an application that
  1326. // scan a map from the atlas and build a 3D world from it
  1327. // the 3D world can be 100% accurate (but never more accurate than
  1328. // the map itself ...)
  1329. // The function takes a regular windows bitmap (in 256 color format or 24bit per pixel RGB format)
  1330. // painted with gray scales and convert it into a 3d model. The 3d model is built according
  1331. // to the colors of the bitmap the more white it is the higher it is.
  1332. // (the peaks of the mountains will be much brighter than the valleys in the bitmap)
  1333. //Input params:
  1334. // bitmap_file_name:
  1335. // The name of the bitmap that according to its colors the model is built
  1336. // The bitmap must be in 24 bit rgb format or 8 bit per pixel format (256 colors).
  1337. // The colors of the bitmap should be in gray scale (not a must) since
  1338. // the function calculates height according to their brightness (sqrt (red^2 + green^2 + blue^2)  Never mind if you dont understand the calculation)
  1339. // The bitmap could be in any size.
  1340. // examples: "my_bitmap.bmp" ; "c:\gs_maps\France.bmp" ; "..\rgb24maps\Jerusalem.map" etc ...
  1341. //
  1342. // level_of_optimization:
  1343. // This number is responsible to the polygon reduction level.
  1344. // A number in the range [0 - 3000]
  1345. // The bigger the number is the stronger the optimization
  1346. // 0 means that there is no optimization so the number of polygon in the output file
  1347. // will be as set by the argument max_number_of_polygons
  1348. // 3000 will make such a strong optimization that the model
  1349. // will be simplified to one flat polygon no matter what source bitmap we had !
  1350. // common numbers that you might try are
  1351. // 0.1 , 1, 10 ,100 ,200 ,400
  1352. // Use a big numbers if it is important to reduce as many as possible polygons
  1353. // Use small number if the terrain model must be very detailed.
  1354. //
  1355. //  max_number_of_polygons:
  1356. // A big number makes a very detailed object
  1357. // a small number makes a model with less polygons
  1358. // so it can be rendered fast in real-time
  1359. // Try 2000 to begin with and if you need more details increase this number
  1360. // if on the other hand you need more speed when rendering, use a smaller number
  1361. //
  1362. //  bitmap_to_wrap_over_handle:
  1363. // This is a handle to the bitmap that will be used to paint the created model
  1364. // for example this bitmap could be a texture of rocks, sand snow , grass etc ...
  1365. // If a NULL is given, then the model will be painted according to the given legend.
  1366. // You get the handle for the bitmap using STATE_bitmap_load()
  1367. // Note that if you want the bitmap to repeat more than once on the model (tile mode)
  1368. // then the dimensions of the bitmap must be in the power of two (for example 32,64,128,256,512,1024,2048 etc ... 
  1369. // all these numbers are powers of two).
  1370. // see also STATE_group_wrap_a_bitmap()
  1371. //
  1372. //  tile_x, tile_y:
  1373. // The numbers of time that the tile of the bitmap is to repeat itself
  1374. // These numbers are only relevant if bitmap_to_wrap_over_handle
  1375. // is not NULL.
  1376. // examples: 1,1 (no tile) ; 4,4 (bitmap will repeat 16 times) ; 7,3 ; 712,1095 etc ...
  1377. //
  1378. // legend, number_of_colors_in_legend:
  1379. // If bitmap_to_wrap_over_handle is NULL, then
  1380. // The created model is painted according to the given legend.
  1381. // legend is an array of RGB colors. If for example we give
  1382. // three colors then the first color will be the color of the bottom
  1383. // third of the model. The second color will be the middle color.
  1384. // the last color will be the color of the top third.
  1385. // If NULL is given (instead of the legend array) then the
  1386. // model is colored according to the default legend.
  1387. // number_of_colors_in_legend is of course the number of colors that
  1388. // the given legend array contains.
  1389. // example: 
  1390. // BYTE my_legend[2][3]={0,255,0,  255,255,255};
  1391. // Here we define two colors. 0,255,0 is green.
  1392. // 255,255,255 is white. This would cause the bottom half
  1393. // to be painted with green colors and the top half with white hues
  1394. //
  1395. // dimensions:
  1396. // The created model is built so its center is in the origin ( point 0,0,0 )
  1397. // and its width is dimension[0], its length is dimension[1] and its height is dimension[2]
  1398. // Note that if for example dimension[2]==100 (the height of the model)
  1399. // then the model will be built from -50 to +50 (remember that the center is in the origin ...)
  1400. // Chose the number according to the source map.
  1401. // If for example it was a map of Israel then you should give the following dimensions
  1402. // dimension[0]=60 (The width of Israel is 60 Km) (quit small isn't it ?)
  1403. // dimension[1]=300 (The length of Israel is 300 Km)
  1404. // dimension[2]=2 (The difference between the tallest mountain to the lowest place is 2 Km)
  1405. //
  1406. // number_of_polygons_in_group:
  1407. // This value is set by the function so it doesn't have to be initialized.
  1408. // When the function returns it contains the number of polygons in the created model
  1409. // This parameter is updated during the time that the function runs and can be
  1410. // accessed by a different process to get an idea on the the function progress
  1411. // This parameter can be used to estimate how much time the function would take
  1412. // If it is not one of your concerns just give NULL.
  1413. // This function can take a lot of time (if we have a huge max_number_of_polygons for example 100000)
  1414. // so you might like to run it in a different process ,while showing
  1415. // a progress bar. Send a pointer to a global variable
  1416. // so that you can read its value outside the process.
  1417. // Though it is not known in advance how much time it takes, this number give some ideas
  1418. // at first this number will be equal to max_number_of_polygons and it will go down by one when ever
  1419. // a polygon is reduced. Till what number it gets to depends on level_of_optimization and
  1420. // the source bitmap itself (If the map is flatter it will be possible to reduce more polygons and vice versa)
  1421. //
  1422. // Return Value:
  1423. // On failure returns NULL
  1424. // On success returns a handle to the created group
  1425. //
  1426. // Example: 
  1427. // double dimensions[3]={20000,20000,6000};
  1428. // DWORD terrain_group=STATE_engine_create_terrain_from_bitmap("map.bmp", 100, 3200, NULL,1,1,NULL, 0,dimensions,NULL);
  1429. // double step[3]={0,0,-3500};
  1430. // STATE_group_move(terrain_group, step, WORLD_SPACE);
  1431. // STATE_camera_set_location(STATE_camera_get_default_camera(),0,0,0);
  1432. // STATE_camera_set_direction(STATE_camera_get_default_camera(),-1,0,0);
  1433. //
  1434. STATE_IMPORT DWORD STATE_WINAPI STATE_engine_create_terrain_from_bitmap(char *bitmap_file_name, double level_of_optimization, int max_number_of_polygons, DWORD bitmap_to_wrap_over_handle, int tile_x, int tile_y, BYTE legend [][3], int number_of_colors_in_legend,double dimensions[3], int *number_of_polygons_in_group);
  1435. //If one of STATE's functions fails, then one can use this
  1436. //function to retrieve a string describing the error
  1437. //This is the same string that appears in the STATE.log file
  1438. STATE_IMPORT char *STATE_WINAPI STATE_engine_get_last_error(void);
  1439. // This function is intended to help in writing a program that:
  1440. // 1- Keep the same speed all the time even if the frames per second rate changes. This means that when the player in your program  game
  1441. //    move from one room to another he will continue to have the same speed even if one room
  1442. //    has many more polygons than the other. In other words: it helps to keep the same speed
  1443. //    even if the frames per second rate changes.
  1444. //
  1445. // 2- Make your program run equally on all computers.
  1446. //
  1447. // Usage:
  1448. // ------
  1449. //
  1450. //  Example: Lets say we want to move an object by 100 units each second
  1451. //  In this case we should write something similar to the following:
  1452. //
  1453. // factor=STATE_engine_get_computer_speed_factor();
  1454. // corrected_number= 100*factor;
  1455. // move_my_object(corrected_number);
  1456. //
  1457. // Important notes:
  1458. //
  1459. // 1- Since the program cycle duration is the time from the beginning of one render to the next render,
  1460. //   one has to do two renders before getting a non-zero returned value.
  1461. //   This should not a problem. Here is Why: Consider the usage example above. A returned value of 0 will
  1462. //   cause a call to move_my_object(0) which results that nothing will move before the third render which means
  1463. //   that at the first tenth of a second of your gameapplication (approximately one tenth) there wont be any movement.
  1464. //   
  1465. //
  1466. // 2- The return value of this function is constantly changing to reflect
  1467. //   changes in the CPU load. This means you have to call the function each
  1468. //   time before you use it (dont call it once and then use the same value over and over ...). 
  1469. //
  1470. // 3- This function is extremely fast. Like most of STATE functions it only retrieves an internal value
  1471. //   This means that there is no penalty in frequent calling.
  1472. //  
  1473. // Return Value:
  1474. // The factor returned is actually the average duration of the last 50 rendering cycles (from the beginning of one render to the beginning of the next render)
  1475. // The time is given in tenth of a second (for example if the returned value is 3.2 it means that the last render cycle took 0.32 seconds)
  1476. // The return value will be 0 till there are at least two renders done.
  1477. //
  1478. //
  1479. //
  1480. //
  1481. //  Remarks:
  1482. //
  1483. // Here is how to calculate the FPS (Frames Per Second) achived by your program using the STATE_engine_get_computer_speed_factor()
  1484. //
  1485. // double average_program_cycle_duration_is_seconds=STATE_engine_get_computer_speed_factor()/10; //The average durection of the last 50 cycles
  1486. // if(average_program_cycle_duration_is_seconds==0) return; //protect against division by zero ...
  1487. // double FPS=1/average_program_cycle_duration_is_seconds;
  1488. // output_text("The current frames per second rate is %lf", FPS);
  1489. //
  1490. //
  1491. STATE_IMPORT double STATE_WINAPI STATE_engine_get_computer_speed_factor(void);
  1492. //When the engine detects an error it makes a beep using the PC loudspeaker
  1493. //and writes some words about it to the STATE.log file (also to error.log)
  1494. //Usually you should take care of all the errors and the warnings if
  1495. //you didnt, you can use this function to shut down the noise from the speaker.
  1496. //Note that the error messages will still be outputted to the STATE.log and error.lof files
  1497. //The default value is YES
  1498. //Example: STATE_engine_set_speaker_mode(NO);
  1499. STATE_IMPORT void STATE_WINAPI STATE_engine_set_speaker_mode(int yes_no_flag);
  1500. // This function is everything you'll need to create lighs and shadows
  1501. // The function creates and adds new polygons which are the shadow of "entity_creating_shadow"
  1502. // on "entity_receiving_shadow" according to the given light source location. 
  1503. // Those new added polygons are called patches. 
  1504. // entity_receiving_shadow and entity_creating_shadow could be handles to any one of the following
  1505. // types POLYGON, OBJECT or GROUP. If a NULL is given the function would treat it as a handle to group
  1506. // a(note that a NULL group means the whole world)
  1507. // Note that the new added polygons get the same properties
  1508. // of the "entity_creating_shadow" (i.e. the same bitmap, the same translucent etc ...)
  1509. // Usually you would like to change those properties. For example:
  1510. // 
  1511. // double light[3]={0,0,200}
  1512. // STATE_engine_create_shadow(room_group, chair_group, light, 255);
  1513. // //setting the color of the shadows. Note that by changing the color
  1514. // //you can simulate changes in light intensity
  1515. // STATE_group_set_patches_color(room_group, 70,70,70, ALL_PATCHES); 
  1516. //
  1517. // If we dont call STATE_group_set_patches_color() we wont get a dark shadow on the room floor
  1518. // instead we will get the shape of the shadow but with the colors and bitmaps of the chair.
  1519. // Note that the last argument in the call to STATE_engine_create_shadow() is called serial_number
  1520. // serial_number is a number in the range [10 - 255]
  1521. // The number is relevant only if we will call 
  1522. // STATE_group_set_patches_color(..., serial_number)
  1523. // and the function STATE_group_set_patches_bitmap(..., serial_number)
  1524. // This will allow us to have a room with several shadows and to change only one of them.
  1525. // 
  1526. // Use STATE_polygon_delete_patches() to remove the shadow
  1527. // For example: STATE_polygon_delete_patches(room_handle, ALL_PATCHES) will
  1528. // delete all the shadows in the room while STATE_polygon_delete_patches(room_handle, 255) will
  1529. // delete just the shadows that were created with serial number 255.
  1530. //
  1531. // Performance note:
  1532. // If you create the shadow in real time and you want it to be fast
  1533. // then call this function with polygon handles. for example
  1534. // STATE_engine_create_shadow(polygon_to_get_shadow, polygon_obscaring_light, light, 255);
  1535. //
  1536. // Note that function like STATE_polygon_add_patch_easy() are also creating patches though for
  1537. // different purposes.
  1538. //
  1539. // Examples:
  1540. // A)
  1541. // double light[3]={100,200,300}
  1542. // STATE_engine_create_shadow(wall_polygon, blocking_polygon, light, 255);
  1543. // 
  1544. //
  1545. // Example B:
  1546. // while(user did not press ESC) {
  1547. // STATE_polygon_delete_patches(wall_polygon, ALL_PATCHES);
  1548. // light[0]+=10; //move the light source
  1549. // STATE_engine_create_shadow(wall_polygon, blocking_polygon, light, 255);
  1550. // STATE_polygon_set_bitmap_fill(shadow_polygon_handle, flare_bitmap);
  1551. // STATE_polygon_set_translucent(shadow_polygon_handle, NORMAL_GLASS);
  1552. // }
  1553. //
  1554. // See also: STATE_engine_set_patches_offset(),
  1555. // STATE_engine_create_dynamic_shadow(),
  1556. // STATE_polygon_delete_patches(), 
  1557. // STATE_polygon_delete_patches(),
  1558. // STATE_group_delete_patches(), STATE_group_set_patches_translucent(), 
  1559. // STATE_group_set_color(), STATE_group_set_patches_bitmap()
  1560. // STATE_polygon_add_patch_easy().
  1561. STATE_IMPORT void STATE_WINAPI STATE_engine_create_shadow(DWORD entity_receiving_shadow, DWORD entity_creating_shadow, double light_src[3], BYTE serial_number);
  1562. // Exactly like STATE_engine_create_shadow() only that it is faster
  1563. // The disadvantage is that dynamic shadows can only be deleted with
  1564. // STATE_engine_delete_dynamic_shadows() which delete all the existing dynamic shadow.
  1565. // (STATE_group_delete_patches() wont work here)
  1566. // We suggest that you use this function to create shadows that can be changed from
  1567. // one render to another. For example in our world we might have several source
  1568. // of lights some of them will be moving and some are fixed. We could also have some moving objects
  1569. // in our world (so their shadow is moving too). The shadow that is created
  1570. // from the fixed light sources and by the fixed object can be created only once at the beginning of
  1571. // the program. To create the fixed shadows use STATE_engine_create_shadow()
  1572. // The shadows that are created by the moving light sources or from the moving objects will have to be
  1573. // deleted and recreated for each render cycle. Use STATE_engine_create_dynamic_shadow()
  1574. // to create them. To delete them use STATE_engine_delete_dynamic_shadows().
  1575. // Here is an example:
  1576. // 
  1577. // //creating the static shadow. Create the shadow that the trees project on the ground 
  1578. // double sun[3]={10000, 10000, 30000};
  1579. // STATE_engine_create_shadow(ground, trees, sun, 255);
  1580. // while(Escape key is not pressed) {
  1581. // STATE_engine_delete_dynamic_shadows();
  1582. // move_our_ball(ball);
  1583. // STATE_engine_create_dynamic_shadow(ground, ball, light_source);
  1584. // STATE_engine_render(NULL, camera);
  1585. // }
  1586. //
  1587. // See also STATE_engine_set_patches_offset()
  1588. STATE_IMPORT void STATE_WINAPI STATE_engine_create_dynamic_shadow(DWORD entity_receiving_shadow, DWORD entity_creating_shadow, double light_src[3], BYTE serial_number);
  1589. // Deletes all the existing dynamic shadow. Dynamic shadow is created using
  1590. // the function STATE_engine_create_dynamic_shadow()
  1591. STATE_IMPORT void STATE_WINAPI STATE_engine_delete_dynamic_shadows(void);
  1592. //When rendering takes more than the specified time then the rendering function will exit automatically
  1593. //This is very useful when rendering indoor worlds. The engine renders front to back
  1594. // so it is usually enough to stop rendering after finishing with the current room.
  1595. // Try playing with different values and see the result.
  1596. //The default is 1000000 (which is about 17 minutes which is similar to "take all the time in the world to finish every rendering")
  1597. //Typical values would be 200,100,50
  1598. // Note that this function is only relevant in Viewer Mode (Viewer Mode is the the default mode)
  1599. //Example: STATE_engine_set_maximum_rendering_time(100); //Set minimum frames per seconds to 10
  1600. STATE_IMPORT void STATE_WINAPI STATE_engine_set_maximum_rendering_time(int max_duration_in_mili_seconds);
  1601. STATE_IMPORT int STATE_WINAPI STATE_engine_get_maximum_rendering_time(void);
  1602. //Sets a minimum time for each render. If STATE_engine_render() take less time
  1603. //than the specified time then the engine will wait (Doing Sleep() ) till it reaches the given
  1604. // duration.
  1605. // Why should you use this function ? Sometimes when you get to the end of your world
  1606. // The engine has only few polygons to render in this case it can get to 1000 frames per seconds and more !!!
  1607. // If you are moving a car by X units every render then your car is going to become
  1608. // a rocket when you reach the end of the world ...
  1609. // The default is 2. This permits a maximum of 500 frames per seconds
  1610. // Note also the function STATE_engine_get_computer_speed_factor()
  1611. //Example: STATE_engine_set_minimum_rendering_time(0);
  1612. STATE_IMPORT void STATE_WINAPI STATE_engine_set_minimum_rendering_time(int min_duration_in_mili_seconds);
  1613. STATE_IMPORT int STATE_WINAPI STATE_engine_get_minimum_rendering_time(void);
  1614. //Controls the amount of CPU time that the rendering process gets.
  1615. //Usually you would like to have the fastest graphics possible
  1616. //though sometime when a few application are working in conjunction
  1617. //there is need to release some CPU time for the benefit of the others.
  1618. // parameters:
  1619. // thread_priority: (For more details please see the win32 function SetThreadPriority() )
  1620. //
  1621. // THREAD_PRIORITY_ABOVE_NORMAL 
  1622. // Indicates 1 point above normal priority for the priority class. 
  1623. // THREAD_PRIORITY_BELOW_NORMAL Indicates 
  1624. // 1 point below normal priority for the priority class. 
  1625. // THREAD_PRIORITY_HIGHEST 
  1626. // Indicates 2 points above normal priority for the priority class. 
  1627. // THREAD_PRIORITY_IDLE 
  1628. // Indicates a base priority level of 1 for IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, or HIGH_PRIORITY_CLASS processes, and a base priority level of 16 for REALTIME_PRIORITY_CLASS processes. 
  1629. // THREAD_PRIORITY_LOWEST 
  1630. // Indicates 2 points below normal priority for the priority class. 
  1631. // THREAD_PRIORITY_NORMAL 
  1632. // Indicates normal priority for the priority class. 
  1633. // THREAD_PRIORITY_TIME_CRITICAL 
  1634. // Indicates a base priority level of 15 for IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, or HIGH_PRIORITY_CLASS processes, and a base priority level of 31 for REALTIME_PRIORITY_CLASS processes. 
  1635. //
  1636. // Class priorities: ( For more details please see the win32 function SetPriorityClass() )
  1637. //
  1638. // HIGH_PRIORITY_CLASS 
  1639. // Specify this class for a process that performs time-critical tasks that must be executed immediately. The threads of the process preempt the threads of normal or idle priority class processes. An example is the Task List, which must respond quickly when called by the user, regardless of the load on the operating system. Use extreme care when using the high-priority class, because a high-priority class application can use nearly all available CPU time. 
  1640. // IDLE_PRIORITY_CLASS 
  1641. // Specify this class for a process whose threads run only when the system is idle. The threads of the process are preempted by the threads of any process running in a higher priority class. An example is a screen saver. The idle-priority class is inherited by child processes. 
  1642. // NORMAL_PRIORITY_CLASS 
  1643. // Specify this class for a process with no special scheduling needs. 
  1644. // REALTIME_PRIORITY_CLASS 
  1645. // Specify this class for a process that has the highest possible priority. The threads of the process preempt the threads of all other processes, including operating system processes performing important tasks. For example, a real-time process that executes for more than a very brief interval can cause disk caches not to flush or cause the mouse to be unresponsive. 
  1646. //Examples:
  1647. // A)
  1648. // Setting High priority (The default)
  1649. // STATE_engine_set_thread_priority(THREAD_PRIORITY_HIGHEST, HIGH_PRIORITY_CLASS);
  1650. //
  1651. // B)
  1652. // Setting the fastest rendering possible
  1653. // STATE_engine_set_thread_priority(THREAD_PRIORITY_TIME_CRITICAL, REALTIME_PRIORITY_CLASS);
  1654. //
  1655. // For more details please see the win32 functions SetPriorityClass() and SetThreadPriority()
  1656. STATE_IMPORT void STATE_WINAPI STATE_engine_set_thread_priority(int thread_priority, DWORD class_priority);
  1657. //This function must be called before your program exits.
  1658. //Not calling this function at the end of your program might 
  1659. //cause your program not to exit cleanly (Crashing at the end)
  1660. //This function should not be called from inside a destructor
  1661. //No STATE function can be called after calling STATE_engine_close()
  1662. STATE_IMPORT void STATE_WINAPI STATE_engine_close(void);
  1663. //Returns STATE's logo
  1664. STATE_IMPORT HBITMAP STATE_WINAPI STATE_engine_get_logo(void);
  1665. //Show the frames per second rate at the top left of the rendered window.
  1666. //by default it is activated.
  1667. //Example:
  1668. //STATE_engine_show_frames_per_second_rate(NO); 
  1669. STATE_IMPORT void STATE_WINAPI STATE_engine_show_frames_per_second_rate(int YES_or_NO);
  1670. //The default is NO, which means that each render will
  1671. //clear the result of the previous rendering before painting the new picture.
  1672. //There are two cases in which one should consider calling this function
  1673. //with the argument YES
  1674. // 1) When our world is an indoor world. In this case clearing the screen is simply not needed.
  1675. //   (by not clearing the previous screen we could improve a bit the speed of each render)
  1676. // 2) When we want to create special effects.
  1677. //
  1678. // To understand the effect of this function simply call it and see what you get.
  1679. // Example: STATE_engine_render_on_top_of_previous_rendering(YES);
  1680. STATE_IMPORT void STATE_WINAPI STATE_engine_render_on_top_of_previous_rendering(int YES_or_NO);
  1681. // Use this function only with the commercial version of STATE 3D Engine.
  1682. // This function should be the first STATE function that is called .
  1683. // If this function is not called then a popup message will appear.
  1684. // Note: It is better to call this function after you have created the main window
  1685. // of your application, otherwise when launching your application your main window
  1686. // might be behind the engine windows (there is nothing wrong with that, it is simply not as nice as)
  1687. // Arguments:
  1688. // Enter the argument exactly as they appear on the license that you got from STATE.
  1689. // Failing to do so will prompt a popup window with a warning.
  1690. // 
  1691. // Return value:
  1692. // Returns OK if the registration was successful.
  1693. // Returns VR_ERROR if one of the arguments was wrong.
  1694. // If you receive VR_ERROR then please check that you type everything
  1695. // exactly as they appear on the license that you got from STATE.
  1696. // 
  1697. //
  1698. // Example:
  1699. // STATE_register_license("XXXXXX", "John Smith", "johnsmith124@ibm.com", "IBM", "OS2 Wrap",1234567890.987654321);
  1700. int STATE_register_license(char *decleration_text, char *your_full_name, char *password ,char *company, char *product_name ,double registration_number);
  1701. //This function could be very important for performance if you find in STATE.log that
  1702. // a significant number of polygons were added to your world while loading it.
  1703. // Background:
  1704. // When the world is loaded in Viewer Mode (the default) the engine needs to build a BSP data structure (Never mind if you
  1705. // dont have any idea what BSP is. Keep reading) it then looks to see if such file exist in the same folder of the world.
  1706. // (in binary format this file is sometime inside the world file so there is no sparate file) If such a file does not exists
  1707. // then the engine start building its own file (a very lengthy process. When the world is big it could even take 30 minutes !)
  1708. // During this process many polygons are cut into smaller pieces. For example if a tree is stuck into the ground in a way
  1709. // that the ground intersect one of the polygons of the tree then this polygon or the polygon of the ground will be cut into two pieces,
  1710. // adding to the number of total polygons in the world. To avoid that it is recommended that polygons in your world should not
  1711. // intersect with each other. Nevertheless even if no polygon intersects others the engine might need to split some of the polygons.
  1712. // (If you really want to know why, you can search the Internet for articles about BSP trees == Binary Space Partition Trees)
  1713. //
  1714. // This function controls the numbers of polygons that the engine will add in the process of forming
  1715. // the bsp tree. The bigger this number is the less polygons will be added. The default is 1.
  1716. // Possible numbers are anything bigger then 0.
  1717. // Examples: 0.01, 0.1, 1, 10, 50, 100, 1e20
  1718. //
  1719. // Calling this function with a bigger number helps in reducing the number of added polygons but reduces the accuracy of the BSP
  1720. // structure. This could cause the world to appear incorrectly. Surfaces that should be in front
  1721. // of other surfaces will be behind. We suggest that you keep this number as low as possible as long as it doesnt increase significantly.
  1722. // the number of polygons in your world. Note that in the log file (STATE.log) you can find how many polygons were added 
  1723. // during the process of creating the BSP data structure.
  1724. //
  1725. // STATE_engine_set_bsp_precision() should be called before loading the world.
  1726. // Each time that the precision variable is changed a new bsp tree will be created.
  1727. STATE_IMPORT void STATE_WINAPI STATE_engine_set_bsp_precision(double precision);
  1728. STATE_IMPORT double STATE_WINAPI STATE_engine_get_bsp_precision(void);
  1729. //This is a very important function.
  1730. //The Speed database is used to speed up rendering. 
  1731. //One of the most time consuming test for the engine is to determine in real-time which
  1732. //of the polygons in the world are seen and which are totally hidden by other polygons.
  1733. //The information in the Speed database will reduce the amount of calculations that are needed in real-time
  1734. //in order to determine from each location in the world the polygons that are seen and those that are hidden. 
  1735. //The Speed database contains information for every possible area in the world. The information tells the engine which 
  1736. //polygons in the world are seen from this area. In order to keep the size of the Speed  database reasonable it is needed to supply
  1737. //to the engine a list of points that we would like to speed the rendering in the vicinity of the given points.
  1738. //In order to create the Speed database it is first needed STATE_engine_load_world() with the flag OUTPUT_RENDER_LOCATIONS
  1739. //Here is a summary of how to speed up the rendering
  1740. // 1) Call STATE_engine_load_world() with the OUTPUT_RENDER_LOCATIONS flag and walk trough your world. This will create the visited_points.txt
  1741. //    Try to visit every possible area inside your world. The direction in which a certain location is approached does not matter
  1742. //    All that mater is the visited location themselves. Areas that wont be visited wont benefit from the Speed database
  1743. // 2) Call STATE_engine_create_speed_database() Sit back and relax while the engine will create the Speed database.
  1744. //    Use the visited_points.txt you have created in step "1". The speed.pvs file that is created is the Speed database that will
  1745. //    speed rendering in real-time.
  1746. // 3) Run your application. Make sure that the speed.pvs file is located in your application working directory (the folder where you have your exe file).
  1747. //    If you encounter areas in the world that do not enjoy any speed up, it is usually because those areas were not
  1748. //    visited in step "1". In order to fix this there is no need to redo the whole process. Here are two ways you can edit the speed.pvs database.
  1749. //    A) Do step "1" again but visit only the locations where the speed optimization didn't take place.
  1750. //   Do step "2" but now call STATE_engine_create_speed_database() with reset_database set to NO.
  1751. //   The new information will be added to the original speed.pvs file.
  1752. //    
  1753. //    OR
  1754. //
  1755. //    B) Add locations manually to the visited_points.txt file and then repeat step "2"
  1756. //
  1757. //
  1758. //Please note the following facts:
  1759. //1) The bigger your world is the more impact you will gain by using the Speed database. 
  1760. //  On very small worlds you might not even notice the effect.
  1761. //2) To increase the speed up by this process build your world in a way that a minimum number of polygon is visible
  1762. //  from every location in the world. The most perfect world for this kind of optimization is 
  1763. //  an indoor world where one cant see from one room to another because the door leads to a corridor.
  1764. //   Here is an example of such structure:
  1765. //