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

射击游戏

开发平台:

Visual C++

  1. // time_for_each_frame[1]= 200; //The second frame will be shown for one second
  2. // STATE_animation_set_times(my_animation, time_for_each_frame, 2);
  3. // 
  4. STATE_IMPORT int STATE_WINAPI STATE_animation_set_times(DWORD animation_handle, DWORD time_for_each_frame[], int size_of_array); 
  5. // time_for_each_frame: should be equal to STATE_animation_get_number_of_frames()
  6. // the time is in hundreds of seconds.
  7. // Returns OK or VR_ERROR
  8. // Example:
  9. // DWORD time_for_each_frame[10]
  10. // STATE_animation_set_times(my_animation, time_for_each_frame, 10);
  11. // 
  12. STATE_IMPORT int STATE_WINAPI STATE_animation_get_times(DWORD animation_handle, DWORD time_for_each_frame[], int size_of_array); 
  13. //Get the duration of the given frame. (in hundreds of seconds)
  14. // frame_index: 0 means the first frame
  15. //     1 means the second frame etc ...
  16. // to get the last frame frame_index should be equal to the numbers of frames minus one.
  17. //For Example:
  18. // time=STATE_animation_get_frame_time(my_anim,0); // This would return the time
  19. // // in hundreds of second that
  20. // // the first bitmap will be shown
  21. // // before it replaced by the second bitmap  frame.
  22. STATE_IMPORT DWORD STATE_WINAPI STATE_animation_get_frame_time(DWORD animation_handle, int frame_index); 
  23. // Set the duration of the given frame. (in hundreds of seconds)
  24. // returns OK or VR_ERROR
  25. // For Example:
  26. // STATE_animation_set_frame_time(my_anim,0,100); // This would set the duration 
  27. // // in hundreds of second (100== 1 second) of
  28. // // the first bitmap will be shown
  29. // // before it replaced by the second bitmap  frame.
  30. STATE_IMPORT int STATE_WINAPI STATE_animation_set_frame_time(DWORD animation_handle, int frame_index, DWORD time); 
  31. // Returns the animation name.
  32. // The function returns a pointer to the name which is stored internally inside the 3D Engine
  33. // Visual Basic users should use STATE_entity_get_name() instead.
  34. // See also STATE_entity_get_namel()
  35. STATE_IMPORT char * STATE_WINAPI STATE_animation_get_name(DWORD animation_handle); 
  36. //NOTE that if the name is already in use by another animation
  37. //the function would automatically add a number to the end of the name
  38. STATE_IMPORT void STATE_WINAPI STATE_animation_set_name(DWORD animation_handle, char *name); 
  39. // examples:
  40. // factor==10 would make the animation ten time slower
  41. // factor==0.1 would make the animation ten time faster
  42. //  only if all the numbers in the array are bigger then 10 
  43. // Say we have this times series 1, 2, 20
  44. // now if we call with factor 0.1 we get the series 1, 1, 2
  45. // Note !! If we call again with factor=10
  46. // we get back the series we started with 1,1,2 => 1,2,20
  47. // The mechanism is smart enough to deal with that.
  48. STATE_IMPORT void STATE_WINAPI STATE_animation_factor_speed(DWORD animation_handle, double factor);
  49. // speed==1 means restore normal speed
  50. // speed==2 means twice slower then normal speed
  51. // speed==0.5 means twice faster then normal speed
  52. // animation frames are never skipped. See
  53. // remarks on STATE_animation_factor_speed() to
  54. // understand the implication.
  55. STATE_IMPORT void STATE_WINAPI STATE_animation_set_speed(DWORD animation_handle, double speed);
  56. STATE_IMPORT void STATE_WINAPI STATE_animation_delete_all(void);
  57. //Note that you cant use the handle after it was deleted
  58. // A good practice will be like that:
  59. // STATE_animation_delete(my_animation);
  60. // my_animation=NULL;
  61. STATE_IMPORT void STATE_WINAPI STATE_animation_delete(DWORD animation_handle);
  62. // sending YES will write the given animation to file after call to STATE_engine_save() with SAVE_ONLY_WHATS_NEEDED 
  63. // Note that if STATE_engine_save() is called without SAVE_ONLY_WHATS_NEEDED, all the animations will be saved
  64. // Note ! If the animation is used directly by one of the polygons
  65. // in the saved group it will be saved no matter how the save_flag is set !
  66. // The need for this function is because though the engine can figure out itself
  67. // what animations are needed to the saved group it doesn't know what animation will
  68. // be needed in run time. Using this flag one can determine the animation resources
  69. // to use in run-time.
  70. STATE_IMPORT void STATE_WINAPI STATE_animation_set_save_flag(DWORD animation_handle, int yes_no_flag); 
  71. // returns YES or NO
  72. // see STATE_animation_set_save_flag() for more details
  73. STATE_IMPORT int STATE_WINAPI STATE_animation_get_save_flag(DWORD animation_handle); 
  74. //Returns the number of frames in the animation.
  75. // On Error returns 0
  76. // Example: Say we have an animation of a runner. The animation is combined
  77. // from 5 bitmaps series, the runner from the front,45 degrees, side, 135 degrees, and from the back
  78. // (look how it is defined in the wld file, FRONT, FRONT_SIDED, SIDE, BACK).
  79. // Every series must contain the same number of bitmaps.
  80. // calling this function will return the number of bitmap in each series.
  81. STATE_IMPORT int STATE_WINAPI STATE_animation_get_number_of_frames(DWORD animation_handle); 
  82. //Returns the number of bitmaps in the animation.
  83. // On Error returns 0
  84. // Example: Say we have an animation of a runner. The animation is combined
  85. // from 5 bitmaps series, the runner from the front,45 degrees, side, 135 degrees, and from the back
  86. // (look how it is defined in the wld file, FRONT, FRONT_SIDED, SIDE, BACK).
  87. // Every series must contain the same number of bitmaps.
  88. // calling this function will return the number of bitmap in each series multiply by the number
  89. // of series. 
  90. STATE_IMPORT int STATE_WINAPI STATE_animation_get_number_of_bitmaps(DWORD animation_handle); 
  91. // This function returns an array with the handle to all the 
  92. // bitmaps.
  93. // bitmaps_array[] is an array of DWORD. This array will be filled with handles to
  94. // all the bitmaps of the animation. 
  95. // NOTE: you must allocate memory for the array before calling this function
  96. // Example: 
  97. // int num_of_bitmaps=STATE_animation_get_number_of_bitmaps(animation_handle);
  98. // // allocating mem using new or malloc etc ...
  99. // DWORD *bitmaps_array=(DWORD *)malloc(num_of_bitmaps*sizeof(DWORD));
  100. // STATE_animation_get_all_bitmaps(animation_handle, bitmaps_array);
  101. //
  102. // Note that if a certain bitmaps is used twice by the animation, than its handle will
  103. // appear twice in the bitmaps_array.
  104. // handles 
  105. STATE_IMPORT void STATE_WINAPI STATE_animation_get_all_bitmaps(DWORD animation_handle, DWORD bitmaps_array[]); 
  106. // Returns YES if the last world that was loaded, using STATE_engine_load_world()
  107. // or STATE_engine_add_world().
  108. // Returns NO otherwise 
  109. STATE_IMPORT int STATE_WINAPI STATE_animation_is_part_of_the_last_world(DWORD animation_handle); 
  110. // Returns the number of polygons that are using the given bitmap
  111. STATE_IMPORT int STATE_WINAPI STATE_animation_get_number_of_polygons_with_animation(DWORD animation_handle);
  112. //Create a new animation that has the same bitmaps and timing as the given animation.
  113. // Returns the new animation. If an error occurred, it will return NULL.
  114. //
  115. // Here are some ideas for using this function.
  116. // You will need this function if you want to use the same animation but with different timing.
  117. // For example, let say that your animation is a tree blowing in the wind. You probably
  118. // have lots of trees and each of them use the same animation. Now if you dont want
  119. // all the trees to move as one then you can do one of the following:
  120. // 1) Use STATE_polygon_set_animation_frame() to give each tree a different frame
  121. // Or
  122. // 2) Use this function to duplicate an animation and then to give different timing.
  123. STATE_IMPORT DWORD STATE_WINAPI STATE_animation_duplicate(DWORD animation_handle, char *new_name);
  124. // This function can be used to replace the bitmap of a certain frame in the animation.
  125. // bitmap_list: is one of the five constants: BITMAP_LIST_FRONT, BITMAP_LIST_FRONT_SIDED, BITMAP_LIST_SIDE, BITMAP_LIST_BACK_SIDED, BITMAP_LIST_BACK
  126. // frame_index: 0 means the first frame. -1 has a special meaning, it means the last frame
  127. // bitmap_handle: A handle of the bitmap that will be set for the given frame.
  128. // See also STATE_animation_get_bitmap()
  129. // Return OK or VR_ERROR
  130. STATE_IMPORT int STATE_WINAPI STATE_animation_set_bitmap(DWORD animation_handle, int bitmap_list ,int frame_index, DWORD bitmap_handle);
  131. //The return value is The name of the bitmap without the extension 
  132. // the bitmap_name is the name+path relative to the path given in STATE_engine_load_world()
  133. //If a bitmap exists in the world file
  134. //but the engine couldnt find the bitmap file than it will still return its name.
  135. //This is used when loading a world from the Internet, at first only the world is loaded
  136. //and then we start streaming the bitmaps. We use this function to get the bitmap file name.
  137. //If you want to check if the bitmap is in used then use STATE_animation_get_handle()
  138. STATE_IMPORT char *STATE_WINAPI STATE_animation_get_frame_bitmap_name(DWORD animation_handle, int bitmap_list ,int frame_index);
  139. //This function is very similar to STATE_bitmap_get_transparent_index()
  140. //For info check STATE_bitmap_get_transparent_index()
  141. //This function is needed only in the rare cases that some of the
  142. //animation bitmaps could not be loaded when the world was loaded.
  143. //For example when loading a world from the Internet, at first only the world is loaded
  144. //and then we start streaming the bitmaps. We use this function to get the bitmap transparent index
  145. //If you want to check if the bitmap is in used then use STATE_animation_get_frame_bitmap_handle()
  146. STATE_IMPORT int STATE_WINAPI STATE_animation_get_frame_transparent_index(DWORD animation_handle, int bitmap_list ,int frame_index);
  147. //--------------------------------------------------------//
  148. //=========== T H E   B I T M A P   A P I ================//
  149. //--------------------------------------------------------//
  150. // This API deals with bitmaps and the way they are used by the Engine
  151. // Returns YES or NO.
  152. // YES , if the given handle is a bitmap handle. NO if not.
  153. // If it is not a bitmap handle , a message box will appear,
  154. // the title of this message box will be the parameter "function_asking"
  155. // if function_asking==NULL than no popup will be created.
  156. // See also IS_BITMAP()
  157. STATE_IMPORT int STATE_WINAPI STATE_bitmap_is_bitmap(DWORD bitmap_handle, char *function_asking);
  158. // Returns a handle to a previously  loaded bitmap (using the file name)
  159. // If the return value is NULL it means 
  160. // that no bitmap with the given name and the given transparent index was loaded to the engine.
  161. //Think of the transparent_index as part of the name 
  162. //there could be several bitmaps with the same name but each can have a different
  163. //transparent index. Note that the engine keeps a separate copy for each transparent index
  164. //Example:
  165. // STATE_bitmap_get_handle("bitmaps\people\man12.bmp",-1);
  166. STATE_IMPORT DWORD STATE_WINAPI STATE_bitmap_get_handle(char *file_name, int transparent_index);
  167. STATE_IMPORT DWORD STATE_WINAPI STATE_bitmap_get_first_bitmap(void); 
  168. STATE_IMPORT DWORD STATE_WINAPI STATE_bitmap_get_next(DWORD bitmap_handle); 
  169. // File name extension (if given) is ignored. The engine will search
  170. // for recognized extensions (jbm, bmp or jpg) and will load which ever
  171. // exists. If the engine finds more then one recognized extension 
  172. // (for example grass.bmp and grass.jpg) it will load the file
  173. // which was most recently modified 
  174. // If the specified bitmap was already loaded then it just retrieves
  175. // its handle (in that case it is exactly like STATE_bitmap_get_handle() )
  176. // transparent_index should be -1 for no transparent and 0 
  177. // for removing the most frequent color in the bitmap (usually
  178. // the most used color is the background)
  179. // transparent_index==1 means remove the second most used color etc ...
  180. // Note the difference between this command and STATE_utilities_load_bitmap_from_file()
  181. // This command loads a bitmap into the engine, while STATE_utilities_load_bitmap_from_file()
  182. // is just an extension to the Win32 API making it easy to load a bitmap from
  183. // the disk and to get its HBITMAP handle (a Win32 type)
  184. //
  185. // Important: 
  186. // Bitmaps that are not it the power of two dimensions will be automatically resampled (this is because 3D cards can only handle dimensions that are of the power of two !).
  187. // This is why it is best to have all your bitmaps in the power of two dimensions.
  188. // Numbers of the power of two are: 1,2,4,8,16,32,64,128,256,512,1024
  189. // A bitmaps in the size of 128x256 is OK
  190. // A bitmap in the size of 100x200 is not OK and there for will be automatically resampled by the engine (consuming more time )
  191. // Though the engine does a good job in resampling the bitmaps, Corel PhotoPaint or Adobe PhotoShop are probably better ...
  192. // Meaning that it is better if you resample you bitmaps your self and let the engine handle only bitmaps that are in the power of two
  193. //
  194. // Examples:
  195. // A-
  196. // note that we dont have to give the bitmap extension 
  197. // if we do it is simply ignored
  198. // STATE_bitmap_load("c:\bitmaps\my_bitmap",-1); 
  199. // B-
  200. // Load a bitmap and set the most used color as transparent
  201. // STATE_bitmap_load("c:\bitmaps\my_bitmap",0); 
  202. // C-
  203. // Load a bitmap and set the second most used color as transparent
  204. // STATE_bitmap_load("c:\bitmaps\my_bitmap",1); 
  205. //
  206. // NOTE this case !
  207. // D-
  208. // This example has some good news and some bad news.
  209. // The good news is that if c:\bitmaps\grass27
  210. // is exactly the same as c:\NEW_bitmaps\grass27
  211. // Then we shouldnt worry about wasting memory by loading two identical bitmaps
  212. // When we try to load the second bitmap the engine
  213. // will see that it already has a bitmap with that name and
  214. // it will return the handle to the first loaded bitmap without doing anything.
  215. // The bad news is that if the bitmaps are different, the engine
  216. // wont overwrite the old one. It will just return the handle to the already
  217. // loaded bitmap without doing anything else.
  218. // handle1=STATE_bitmap_load("c:\bitmaps\grass27",-1); 
  219. // handle2=STATE_bitmap_load("c:\NEW_bitmaps\grass27",-1); 
  220. // if(handle1!=handle2) error_message(); //Never happens
  221. //
  222. // A solution for this in case we want to overwrite the old bitmap
  223. // is to first delete the old bitmaps and then to load the new one.
  224. //
  225. // E-
  226. // If we have two bitmaps in the same directory one is called
  227. // my_bitmap.jpg and the other is called my_bitmap.bmp
  228. // handle=STATE_bitmap_load(my_bitmap.jpg,-1);
  229. // Note that the engine will load my_bitmap.bmp and not
  230. // my_bitmap.jpg. Thats because loading bitmaps in jpg format is much slower
  231. // And also because the jpg version of a bitmap is usually not as good as the original
  232. // (depending how much compression we used)
  233. //
  234. // see also STATE_bitmap_rgb_color_to_index()
  235. STATE_IMPORT DWORD STATE_WINAPI STATE_bitmap_load(char *file_name, int transparent_index);
  236. // Returns the an index to a color in the palette that is the closest color
  237. // to the given rgb. 
  238. //This function can be used together with STATE_bitmap_load() so the transparency color
  239. //is calculated according to the rgb ...
  240. STATE_IMPORT int STATE_WINAPI STATE_bitmap_rgb_color_to_index(DWORD bitmap_handle,BYTE red, BYTE green, BYTE blue);
  241. //Receive an index to a color in the palette and returns its RGB.
  242. //returns OK or VR_ERROR (returns VR_ERROR if the index is bigger (or equal) than the number of colors in the palette)
  243. //See also STATE_bitmap_get_memory()
  244. // Example: //Get the rgb of the most used color in the bitmap (palette index 0)
  245. // BYTE red,green,blue;
  246. // STATE_bitmap_index_to_rgb(my_bitmap, 0, &red, &green, &blue);
  247. STATE_IMPORT int STATE_WINAPI STATE_bitmap_index_to_rgb(DWORD bitmap_handle, BYTE index ,BYTE *red, BYTE *green, BYTE *blue);
  248. // returns OK or VR_ERROR. VR_ERROR if there is no transparent color for this bitmap.
  249. STATE_IMPORT int STATE_WINAPI STATE_bitmap_get_transparent_rgb(DWORD bitmap_handle, int *red, int *green, int *blue) ;
  250. // returns -1 if we transparent is not used for the given bitmap
  251. // else return the index to the transparent color, usually it
  252. // will be 0 which means that the most used color is the transparent color
  253. // if the return value is 1 it means that the second most popular
  254. // color is the transparent color etc ...
  255. STATE_IMPORT int STATE_WINAPI STATE_bitmap_get_transparent_index(DWORD bitmap_handle) ;
  256. //Create a new bitmap which is a resampled version of
  257. //the given bitmap. If new_width and new_height are
  258. // equal to the width and the height of the given
  259. // bitmap, it will just duplicate the bitmap ...
  260. STATE_IMPORT DWORD STATE_WINAPI STATE_bitmap_resample(DWORD source_bitmap_handle, int new_width, int new_height);
  261. // dont ever use the handle after the bitmap was unloaded
  262. STATE_IMPORT void STATE_WINAPI STATE_bitmap_unload(DWORD bitmap_handle);
  263. //Returns the name according to the bitmap file name (without the extension)
  264. // The function returns a pointer to the name which is stored internally inside the 3D Engine
  265. // Visual Basic users should use STATE_entity_get_name() instead.
  266. // See also STATE_entity_get_namel()
  267. STATE_IMPORT char *STATE_WINAPI STATE_bitmap_get_name(DWORD bitmap_handle);
  268. STATE_IMPORT int STATE_WINAPI STATE_bitmap_get_number_of_polygons_using_bitmap(DWORD bitmap_handle);
  269. STATE_IMPORT int STATE_WINAPI STATE_bitmap_get_width(DWORD bitmap_handle);
  270. STATE_IMPORT int STATE_WINAPI STATE_bitmap_get_height(DWORD bitmap_handle);
  271. //Using this function one can check and modify the actual pixels of the bitmap
  272. //Returns an array of pixel indexes in the size of width*height
  273. //see STATE_bitmap_get_height() and STATE_bitmap_get_width() to get the width and the height
  274. //An index 255 means that it is a transparent color. an index of 0 means that this is the most
  275. //frequently used color in the bitmap etc ...
  276. // Here are few examples:
  277. // BYTE *bmp_ptr=STATE_bitmap_get_memory(STATE_bitmap_handle);
  278. // int width=STATE_bitmap_get_width(STATE_bitmap_handle);
  279. // for(int i=0; i<width; i++) bmp_ptr[0]=0; //setting the first line in the texture to have the rgb of index 0 in the palette
  280. // bmp_ptr[width]=255; //Setting the first pixel in the second line to be transparent
  281. // //Note that this bitmap must be a transparent bitmap for this to work.
  282. //  BYTE last_pixel_index=bmp_ptr[width*height-1]; //examining the last pixel (bottom-down)
  283. // BYTE red,green,blue;
  284. //  // Lets get the color of that pixel
  285. // STATE_bitmap_index_to_rgb(STATE_bitmap_handle, last_pixel_index, &red,&green, &blue);
  286. STATE_IMPORT BYTE * STATE_WINAPI STATE_bitmap_get_memory(DWORD bitmap_handle);
  287. // the palette is an array of WORDs; each 16 bits represents a pixel
  288. // the most significant bits are red; the least significant are for blue (green in the middle)
  289. // the RGB bit count for each color is 5-5-5 (the most significant bit not used)
  290. // or 5-6-5. which one of them depends on the current graphics card you are using
  291. // Use STATE_utilities_rgb16_to_rgb24() to get the colors
  292. // Example:
  293. // WORD *pal=STATE_bitmap_get_palette(bm_handle);
  294. // BYTE red,green,blue;
  295. // STATE_utilities_rgb16_to_rgb24(pal[0],&red,&green,&blue); //Return the rgb of the first color in the palette
  296. //  //Note that this color is the most frequent used color.
  297. // See also STATE_bitmap_index_to_rgb() that can be used to get specific color from the palette
  298. STATE_IMPORT WORD * STATE_WINAPI STATE_bitmap_get_palette(DWORD bitmap_handle);
  299. //With this function you can change the colors of a bitmap.
  300. //For example:
  301. // The next line will set the most used color in my_bitmap (index 0 == the most used )to the color of red (red==255,0,0)
  302. // STATE_bitmap_set_palette_color(my_bitmap,0,   255,0,0 );
  303. //Note that the bitmap memory is not modified. Only the palette is modified.
  304. //For changing the bitmap itself see STATE_bitmap_get_memory()
  305. // Returns OK or VR_ERROR (returns VR_ERROR if the index is bigger (or equal) than the number of colors in the palette)
  306. STATE_IMPORT int STATE_WINAPI STATE_bitmap_set_palette_color(DWORD bitmap_handle, BYTE index_of_color_to_be_changed, BYTE red, BYTE green, BYTE blue);
  307. // returns the number of colors in the palette
  308. STATE_IMPORT int STATE_WINAPI STATE_bitmap_get_palette_size(DWORD bitmap_handle);
  309. // saves a bitmap on the disk.
  310. // The file format is according to the extension
  311. // ( Supported types by STATE.dll version 1.0 are windows bitmap (bmp) and jpeg (jpg) )
  312. // If full_path_name==NULL than the bitmap will be save in the current directory
  313. // in a windows bitmap file format.
  314. // Examples: 
  315. // A- STATE_bitmap_save( my_bitmap_handle, "c:\John\bitmaps\grass.bmp");
  316. //  B- STATE_bitmap_save( my_bitmap_handle, "grass.jpg");
  317. //  C- STATE_bitmap_save( my_bitmap_handle, NULL);
  318. //  D- STATE_bitmap_save( my_bitmap_handle, "..\grass.jbm");
  319. STATE_IMPORT void STATE_WINAPI STATE_bitmap_save(DWORD bitmap_handle, char *full_path_name);
  320. //Create a merged bitmap in max_width,max_height dimensions
  321. // i.e  if one bitmap is 32x128 and the second is 64x64 then the
  322. // created bitmap will have the size 64x128.
  323. // The created bitmap is not transparent.
  324. // In the areas where bitmap1 is transparent the merged bitmap
  325. // will have the transparent color of bitmap1.
  326. // bitmap1 handle can be the same as bitmap2 (for merging a bitmap with itself).
  327. //See also STATE_bitmap_resample(), STATE_polygon_merge_bitmaps()
  328. //
  329. // merge_function_type should be one of the following
  330. #define MERGE_FUNCTION_ADD 1 // new_pixel= f1*pixel + f2*pixel + C
  331. #define MERGE_FUNCTION_MUL 2 // new_pixel= f1*pixel*pixel/256 + C . Note that f2 is not used here !
  332. // C is a constant that depends on the bitmaps and on the max_brightness value.
  333. // The purpose of this constant is to make sure that (R+G+B)/3 <= max_brightness
  334. // will always be true and that there will always be at least one pixel that 
  335. // (R+G+B)/3 == max_brightness. R,G,B are the RGB values of the new bitmap.
  336. // This method is used to control the brightness level of the merged bitmap.
  337. // When using MERGE_FUNCTION_MUL the result bitmap will always be darker than the
  338. // two source bitmaps. If you didnt get any of it just give MERGE_IGNORE_MAX_BRIGHTNESS.
  339. // This will make C equal 0 ( C from the functions' formulas above).
  340. #define MERGE_IGNORE_MAX_BRIGHTNESS 0
  341. #define MERGE_AUTO_MAX_BRIGHTNESS -1 //Automatically controls the merge to achieve two goals:
  342.  // 1) The merged bitmap wont be saturated with light.
  343.  // 2) The level of brightness of the merged bitmap will be similar to the source bitmaps
  344. //Return value: Returns a handle to a new bitmap which is the outcome of meging the two given bitmaps.
  345. //Examples:
  346. //
  347. // A)
  348. // DWORD bmp1=STATE_bitmap_load("d:\floor_bitmap", -1);
  349. // DWORD bmp2=STATE_bitmap_load("d:\light_spot_bitmap", -1);
  350. // DWORD merge=STATE_bitmap_merge(bmp1, bmp1, MERGE_FUNCTION_MUL, 2,0,MERGE_IGNORE_MAX_BRIGHTNESS);
  351. // STATE_bitmap_save(merge, "d:\garbage3\bitmaps\merged_mul.bmp");
  352. //
  353. // B)
  354. // DWORD merge=STATE_bitmap_merge(bmp1, bmp1, MERGE_FUNCTION_ADD, 0.5, 0.5, MERGE_IGNORE_MAX_BRIGHTNESS);
  355. // STATE_bitmap_save(merge, "d:\garbage3\bitmaps\merged_add.bmp");
  356. //
  357. // Try both examples and see what happens.
  358. //
  359. STATE_IMPORT DWORD STATE_WINAPI STATE_bitmap_merge(DWORD bitmap1, DWORD bitmap2, int merge_function_type, double f1, double f2, int max_brightness);
  360. //-------------------------------------------------------//
  361. //======== T H E    S O U N D   A P I ===================//
  362. //-------------------------------------------------------//
  363. /*
  364. STATE sound engine is built using parts of FMod library. If This API is used for commercial 
  365. purposes then you must get a propre license from FMod. A ccording to FMod web-site
  366. as long as you dont genrate any revenues from their model you dont have to purchase a license.
  367. For updated information regarding the terms of use of the FMod library please contact www.fmod.org 
  368. In the future we will replace the FMod library with our own library.
  369. In order to be able to use the sound API you must do the following:
  370. 1) Add the fmod lib to your project. (For example users of Visual C should add the fmodvc.lib) 
  371. 2) Make sure to put the fmod.dll in the same directory as your executable.
  372. */
  373. #define SOUND_NO_LOOP 0
  374. #define SOUND_LOOP_NORMAL 1
  375. #define SOUND_PAUSED 1
  376. #define SOUND_RESUME_PLAYING 0
  377. //const double SOUND_DISTANCE_DEFAULT=1;
  378. #define SOUND_DISTANCE_DEFAULT 1.0
  379. //Load a sound file into the engine.
  380. //Parameters:
  381. // file_name: 
  382. // file to load
  383. //
  384. // entity:
  385. // A handle to a polygon or a group or an object
  386. // The entity parameter makes it very easy to create 3D sound that its volume is sensative
  387. // to the distance form the entity and the balance is automatically computed for each speaker according to the
  388. // location of the entity.
  389. // If entity handle is NULL then the sound is not attached
  390. // to any entity (polygon,object or group) and is treated as a background sound,
  391. // otherwise it is a 3D-sound positioned at the entity's location , volume and
  392. // balance are constantly changed according to the listener location.
  393. // Important: Make sure that if the sound is attached to an entity and the entity is deleted then
  394. //    this could cause a fatal error. Make sure to stop a sound or dettach it before deleteing
  395. //    the object it is associated with.
  396. //
  397. //  distance_reach
  398. // The third argument is the maximum distance reach of the sound, which can be SOUND_DISTANCE_DEFAULT,
  399. // or a distance reach that the user decides on. This argument will effect only if the entity handle
  400. // given is not NULL, meaning that the sound has a defined position.
  401. // Try giving different numbers and see the effect. for example: 300, 1000, 10000 etc ...
  402. //
  403. // Examples:
  404. //
  405. // A)
  406. // This will set the mp3 song as a background sound
  407. // DWORD madona STATE_sound_load("madona\like_a_virgin.mp3", NULL,SOUND_DISTANCE_DEFAULT);
  408. // STATE_sound_play(madona, SOUND_LOOP_NORMAL);
  409. //B)
  410. // When we will get closer or further away from the bird the engine will
  411. // automatically update the volume and the balance according to the camera relative
  412. // position towards the bird object.
  413. //
  414. // DWORD bird_sound=STATE_sound_load("voices\bird_sound.mp3", bird_object_handle,SOUND_DISTANCE_DEFAULT);
  415. // STATE_sound_play(bird_sound, SOUND_LOOP_NORMAL);
  416. ///With Wave files it is exactly the same, only with a wav sound file.
  417. // 
  418. //
  419. // C)
  420. // This will set the Wave song as a background sound
  421. // Note that it is much better to use mp3 as a background sound since the files
  422. // are a lot smaller.
  423. //
  424. // DWORD madona=STATE_sound_load("madona\like_a_virgin.wav", NULL, SOUND_DISTANCE_DEFAULT);
  425. // STATE_sound_play(madona, SOUND_LOOP_NORMAL);
  426. STATE_IMPORT DWORD STATE_WINAPI STATE_sound_load(char *file_name, DWORD entity_handle,double distance_reach);
  427.  
  428. // Will start playing the sound.
  429. // Note that to get a handle to the sound you must first call
  430. // STATE_sound_load()
  431. // Note that you can call this function again with the same sound file while the sound of the first
  432. // call is still playing (Canonically ). In this case you will hear both sounds played together.
  433. // The engine will treat the second call as if it is a new sound.
  434. //loop is SOUND_LOOP_NORMAL or SOUND_NO_LOOP
  435. // SOUND_LOOP_NORMAL will make the sound to be played from the beginning each time it ends.
  436. // Example:
  437. // DWORD madona STATE_sound_load("madona\like_a_virgin.mp3", NULL,SOUND_DISTANCE_DEFAULT);
  438. // STATE_sound_play(madona, SOUND_LOOP_NORMAL);
  439. //
  440. // Returns OK or VR_ERROR
  441. STATE_IMPORT int STATE_WINAPI STATE_sound_play(DWORD sound_handle,const int loop);
  442. //This function will attach in run-time an entity handle to the sound, thus changing the location
  443. //of the sound and accordingly the volume and balance.
  444. //If the sound is playing already, the change will take effect only after stopping and replaying the sound.
  445. //entity_handle can be a handle to one of the three: polygon handle, object handle or group handle.
  446. //if entity handle is NULL then the engine actually performs Detach meaning that the sound is treated
  447. //as a background sound that is not attached to any entity.
  448. //Important: Make sure that if the sound is attached to an entity and the entity is deleted then
  449. //      this could cause a fatal error. Make sure to stop a sound or dettach it before deleteing
  450. //  the object it is associated with.
  451. //Example:
  452. // DWORD sound_handle=STATE_sound_load("my_song",chair);
  453. //when playing this sound, it will be heard as coming from the chair.
  454. // STATE_sound_attach(sound_handle,table);
  455. //now, when playing the sound, it will be heard as coming from the table.
  456. //      STATE_sound_attach(sound_handle,NULL);
  457. //now, the sound is a background sound. 
  458. STATE_IMPORT int STATE_WINAPI STATE_sound_attach(DWORD sound_handle, DWORD entity_handle);
  459. //This function will start playing all the sounds that have been already loaded.
  460. //The volume and balance of each sound will be calculated automatically by the engine.
  461. //!!! this function plays all sounds without checking if a sound is already being played. 
  462. STATE_IMPORT void STATE_WINAPI STATE_sound_play_all_sounds();
  463. //This will stop playing the given sound
  464. //Returns OK or VR_ERROR
  465. STATE_IMPORT int STATE_WINAPI STATE_sound_stop(DWORD sound_handle);
  466. //This will stop playing all the sounds.
  467. STATE_IMPORT void STATE_WINAPI STATE_sound_stop_all_sounds();
  468. //Using this function togwether with STATE_sound_get_next()
  469. //makes it possible to go all over the sounds that were loaded into the engine.
  470. // Example:
  471. // for(DWORD sound=STATE_sound_get_first() ; sound!=NULL; sound=STATE_sound_get_next(sound) ) {
  472. // //do something for each sound
  473. // }
  474. STATE_IMPORT DWORD STATE_WINAPI STATE_sound_get_first();
  475. //use this function to change the distance reach of a sound that is attached to some entity.
  476. //the engine measures the distance between the entity that is attached to the sound and the
  477. //camera and updates the volume and balance accordingly.You can increase the volume of a sound 
  478. //by increasing the distance reach of the sound, or decreasing the objects' sound respectively.
  479. STATE_IMPORT int STATE_WINAPI STATE_sound_set_distance_reach(DWORD sound_handle,double distance_reach);
  480. //Using this function togwether with STATE_sound_get_next()
  481. //makes it possible to go all over the sounds that were loaded into the engine.
  482. // Example:
  483. // for(DWORD sound=STATE_sound_get_first() ; sound!=NULL; sound=STATE_sound_get_next(sound) ) {
  484. // //do something for each sound
  485. // }
  486. STATE_IMPORT DWORD STATE_WINAPI STATE_sound_get_next(DWORD sound_handle);
  487. //This function will set the volume of the given sound.
  488. //volume should be in the range of [0-1000] . 1000 is the maximum valume possible.
  489. //100 is the default volume.
  490. //See also STATE_sound_set_volume()
  491. //volume should be in the range of [0-1000] . 1000 is the maximum valume possible.
  492. //The difference between this function and STATE_sound_set_volume_realtime()
  493. //Is that this function works even if the sound is not being played.
  494. //If you intend to use a specific sound in a constant volume then
  495. //it is better to use STATE_sound_set_volume() then STATE_sound_set_volume_realtime().
  496. //Note that if the sound is attached to an entity (object, polygon or group)
  497. //then actual volume will be effected by the distance of the viewerlistener from the
  498. //sound source. Note also that you can use
  499. //STATE_sound_set_distance_reach() to effect the result calculated volume.
  500. //This is important because if the listener is located outside the distance reach
  501. //zone then no sound will be heard.
  502. STATE_IMPORT void STATE_WINAPI STATE_sound_set_volume(DWORD sound_handle,int volume);
  503. //This function will set the volume of the given sound.
  504. //See also STATE_sound_set_volume()
  505. //volume should be in the range of [0-1000] . 1000 is the maximum valume possible.
  506. //The difference between this function and STATE_sound_set_volume()
  507. //Is that this function works only while the sound is being played.
  508. //If you intend to use a specific sound in a constant volume then
  509. //it is better to use STATE_sound_set_volume().
  510. //Note that if the sound is attached to an entity (object, polygon or group)
  511. //then actual volume will be effected by the distance of the viewerlistener from the
  512. //sound source. Note also that you can use
  513. //STATE_sound_set_distance_reach() to effect the result calculated volume.
  514. //This is important because if the listener is located outside the distance reach
  515. //zone then no sound will be heard.
  516. STATE_IMPORT void STATE_WINAPI STATE_sound_set_volume_realtime(DWORD sound_handle,int volume);
  517. //You can call this function only if a sound is being played.
  518. //The return number will be in the range [0-1000].
  519. //500 is the default. 
  520. //1000 is the volume defined by the sound file itself.
  521. // The function will return -1 if the sound is not being played or some error has happened.
  522. // See also STATE_sound_set_volume(), STATE_sound_set_distance_reach()
  523. STATE_IMPORT int STATE_WINAPI STATE_sound_get_volume(DWORD sound_handle );
  524. //Will set the frequency of the sound. The range is [0-100000]
  525. //Default is 44100.
  526. //You can use this function for special effect. For example simulating
  527. //a racing car engine sound. Try adding 100 to the frequency each time that the speed
  528. //of the car increases.
  529. //See also STATE_sound_get_frequency()
  530. STATE_IMPORT void STATE_WINAPI STATE_sound_set_frequency(DWORD sound_handle, int frequency);
  531. //You can call this function only if the sound is playing.
  532. // See STATE_sound_set_frequency()
  533. STATE_IMPORT int STATE_WINAPI STATE_sound_get_frequency(DWORD sound_handle);
  534. //Returns YES or NO.
  535. STATE_IMPORT int STATE_WINAPI STATE_sound_is_sound_playing(DWORD sound_handle);
  536. //Set the name of the sound. The default is the name of the sound file that was
  537. //loaded without the path and the extension.. 
  538. //See also STATE_sound_get_handle_using_name(), STATE_sound_get_sound_name()
  539. STATE_IMPORT int STATE_WINAPI STATE_sound_set_sound_name(DWORD sound_handle, char *name);
  540. // Returns the name of the sound
  541. // The function returns a pointer to the name which is stored internally inside the 3D Engine
  542. // Visual Basic users should use STATE_entity_get_name() instead.
  543. // See also STATE_entity_get_namel(), STATE_sound_set_sound_name()
  544. STATE_IMPORT char * STATE_WINAPI STATE_sound_get_sound_name(DWORD sound_handle);
  545. //Returns a handle to the sound according to the given name.
  546. STATE_IMPORT DWORD STATE_WINAPI STATE_sound_get_handle_using_name(char *name);
  547. //Returns the sound that is attached to the given entity. entity_handle
  548. //can be a handle to one of the three: polygon handle, object handle or group handle.
  549. //If no sound is attached to the given entity it will return NULL.
  550. // Example:
  551. // sound_handle=STATE_sound_get_handle_using_entity(my_object);
  552. STATE_IMPORT DWORD STATE_WINAPI STATE_sound_get_handle_using_entity(DWORD entity_handle);
  553. //pause can be one of the two: SOUND_PAUSED or SOUND_RESUME_PLAYING
  554. //To pause a specific sound call this function with the SOUND_PAUSED constant.
  555. //To start playing it again call with the SOUND_RESUME_PLAYING constant
  556. //Example:
  557. // STATE_sound_set_pause_mode(my_sound, SOUND_PAUSED); //this will pause the sound
  558. // //your code here ....
  559. // STATE_sound_set_pause_mode(my_sound, SOUND_RESUME_PLAYING); //this will resume playing.
  560. STATE_IMPORT void STATE_WINAPI STATE_sound_set_pause_mode(DWORD sound_handle,BOOL pause);
  561. //Will start playing the CD ROM. The first track is 1
  562. //the last track is of course varied from one CD to another.
  563. //To get the number of tracks use STATE_sound_CD_get_num_of_tracks()
  564. STATE_IMPORT void STATE_WINAPI STATE_sound_CD_play(int track);
  565. //This will stop playing the CD ROM.
  566. STATE_IMPORT void STATE_WINAPI STATE_sound_CD_stop();
  567. //Returns the current played track.
  568. STATE_IMPORT int STATE_WINAPI STATE_sound_CD_get_track();
  569. //Returns the number of tracks on the CD.
  570. STATE_IMPORT int STATE_WINAPI STATE_sound_CD_get_num_of_tracks();
  571. //pause can be one of the two: PAUSED or RESUME_PLAYING
  572. //To pause a specific sound call this function with the PAUSED constant.
  573. //To start playing it again call with the RESUME_PLAYING constant
  574. //Example:
  575. // STATE_sound_CD_set_pause_mode(PAUSED); //this will pause the sound
  576. // //your code here ....
  577. // STATE_sound_CD_set_pause_mode(RESUME_PLAYING); //this will resume playing.
  578. STATE_IMPORT void STATE_WINAPI STATE_sound_CD_set_pause_mode(BOOL pause);
  579. //This will eject the CD.
  580. STATE_IMPORT void STATE_WINAPI STATE_sound_CD_eject();
  581. //--------------------------------------------------------//
  582. //======= T H E    M U L T I P L A Y E R    A P I ========//
  583. //--------------------------------------------------------//
  584. /*
  585. This API allows multiple users to run the same application using 
  586. the Internet or their local network (LAN) as a mean of communication.
  587. The API is focused on making it as simple as possible to write a multiplayer application.
  588. In the next version we will also 
  589. provide servers that game and other application developers
  590. can use as a lobby for potential users.
  591. Before reading the various functions of this API
  592. one should take a look at this "hello multiplayer" example.
  593. Please also note the samples in the SDK.
  594. Example:
  595. void main()
  596. {
  597. STATE_engine_load_world(....)
  598. //Usually one should ask the user wheter he wants to host the game  application
  599. //or to join an existing session.
  600.  int am_i_the_host=ask_user_if_he_wants_to_host_or_join();
  601. if(am_i_the_host==YES) {
  602. if(STATE_multiplayer_connect("game name", "Player name", NULL, TRUE)!=OK)
  603. exit(-1);
  604. }
  605. else {
  606. if(STATE_multiplayer_connect("game name","Player name", "domain_name_or_IP_of_hosting_computer", FALSE)!=OK)
  607. exit(-1);
  608. }
  609. while (escape key not pressed)
  610. {
  611. STATE_engine_render(NULL,NULL);
  612. //Sending a message  
  613. //Initialize a new message  
  614. STATE_multiplayer_message_create();
  615. double location[3];
  616. STATE_camera_get_location(NULL,&location[0],&location[1], &location[2]);
  617. //Write the location to the internal message buffer.  
  618. STATE_multiplayer_message_write_buffer(location,sizeof(double)*3);
  619. STATE_multiplayer_message_send();
  620. //receiving a message   
  621. char sender_name[256];
  622. double *opponent_location;
  623. int result=STATE_multiplayer_message_get(sender_name);
  624. if(result==STATE_MULTIPLAYER_USER_MESSAGE) {
  625. opponent_location=STATE_multiplayer_message_read_buffer();
  626. //process his location here... 
  627. double x=opponent_location[0];
  628. double y=opponent_location[1];
  629. double z=opponent_location[2];
  630. ...
  631. }
  632. }
  633. STATE_engine_close();
  634.   
  635. }
  636. */
  637. //This function initialize a multiplayer session.
  638. //This function must be called before any multiplayer communication can take place.
  639. //
  640. // Aruments:
  641. //----------
  642. // host:
  643. // If TRUE then this computer will become the host of the game.
  644. // Usually the application should ask the user whether he wants to join an existing session or
  645. // to start a new session on his computer.
  646. //
  647. // ip_address:
  648. // Should be null if host==TRUE.
  649. // If host==FALSE then this should be the IP or the domain name of the game  application we want to join.
  650. //
  651. // player_name:
  652. //  The name of the player. 
  653. //
  654. // Game_name:
  655. //  The name of the game. If there are several sessions running on the given host then 
  656. // only the session that matches this name will be chosen.
  657. // 
  658. //
  659. // Please also note that STATE_multiplayer_connect() can only connect to sessions that are based on STATE Engine. 
  660. //
  661. // Return value:
  662. // OK or VR_ERROR.
  663. STATE_IMPORT int STATE_WINAPI STATE_multiplayer_connect(char *game_name,char *player_name, char *ip_address,BOOL host);
  664. // Call this function to terminate the session.
  665. // If your computer is hosting the session (See STATE_multiplayer_connect() )
  666. // then calling this function will end the session completely. 
  667. // If you have joined a session running on a remote computer then calling this function
  668. // will disconnect your computer from the session. All the other users  computers
  669. // can continue their session. When closing the engine, this function is automatically called,
  670. // so you don't need to call it unless you need to manually disconnect before closing the engine.
  671. STATE_IMPORT void STATE_WINAPI STATE_multiplayer_close();
  672. //Calling this function tells the engine that you want now to start 
  673. //creating a new message and the previous message can be deleted.
  674. //The engine has an internal buffer that is used to store the message.
  675. //Calling STATE_multiplayer_message_create() simply reset this buffer.
  676. // Example:
  677. // STATE_multiplayer_message_create();
  678. STATE_IMPORT void STATE_WINAPI STATE_multiplayer_message_create();
  679. //The engine has an internal buffer that is used to store the message.
  680. //Calling STATE_multiplayer_message_create() simply reset this buffer.
  681. // Calling this function will add the given buffer to the internal message buffer.
  682. // Returns: OK or VR_ERROR.
  683. //
  684. // Examples
  685. //  A)
  686. // STATE_multiplayer_message_create();
  687. // double location[3]={100,200,300};
  688. // STATE_multiplayer_message_write_buffer(location, sizeof(double)*3);
  689. // STATE_multiplayer_message_send(); // three double numbers will be sent 100,200,300
  690. //
  691. //  B)
  692. // double location[3]={100,200,300};
  693. // STATE_multiplayer_message_write_buffer(location, sizeof(double)*3);
  694. // location[0]=400;
  695. // //Note that the second buffer is concatenated to the first one.
  696. // STATE_multiplayer_message_write_buffer(location, sizeof(double)*3);
  697. // STATE_multiplayer_message_send();// six double numbers will be sent 100,200,300, 400, 200, 300
  698. STATE_IMPORT int STATE_WINAPI STATE_multiplayer_message_write_buffer(void *buffer, DWORD buffer_size_in_bytes);
  699. //Sends a message to all the users who are connected to the current session.
  700. //The engine has an internal buffer that is used to store the message.
  701. //Calling STATE_multiplayer_message_create() simply reset this buffer.
  702. //To compose a message use STATE_multiplayer_message_write_buffer()
  703. STATE_IMPORT int STATE_WINAPI STATE_multiplayer_message_send();
  704. #define STATE_MULTIPLAYER_SYSTEM_MESSAGE 6
  705. #define STATE_MULTIPLAYER_USER_MESSAGE 7
  706. //When the other playersusers in this session send messages these messages are accumulated in
  707. //an internal queue inside the engine. This function removes the oldest message waiting
  708. // from the queue and copy it to an internal buffer used for reading messages.
  709. // In order to read the message content, use STATE_multiplayer_message_read_buffer()
  710. //Returns one of this four options:
  711. //1) STATE_MULTIPLAYER_USER_MESSAGE
  712. // This means that this is a message from another user  computer.
  713. //
  714. //2) STATE_MULTIPLAYER_SYSTEM_MESSAGE
  715. // This means that this is a system message.
  716. // A system message could be for example a notification that  
  717. // a new user has joined the session. See STATE_multiplayer_message_system_read()
  718. // to learn how to process system messages.
  719. //
  720. //3) THERE_ARE_NO_MESSAGES
  721. //  This means that the message queue is empty and that there are no messages waiting
  722. //  for you to read.
  723. //
  724. //4) VR_ERROR
  725. //  An error occurred.
  726. //
  727. // Example:
  728. //
  729. // char sender_name[256];
  730. // double *opponent_location;
  731. // int result=STATE_multiplayer_message_get(sender_name);
  732. // if(result==STATE_MULTIPLAYER_USER_MESSAGE) {
  733. // opponent_location=STATE_multiplayer_message_read_buffer();
  734. // //process his location here...
  735. // }
  736. //
  737. STATE_IMPORT int STATE_WINAPI STATE_multiplayer_message_get(char *name_of_sender);
  738. //Returns a pointer into the internal buffer that stores the message.
  739. //This function can not be used to process system messages. To read system messages
  740. // use STATE_multiplayer_message_system_read() instead.
  741. //
  742. // Example:
  743. // char sender_name[256];
  744. // double *opponent_location;
  745. // int result=STATE_multiplayer_message_get(sender_name);
  746. // if(result==STATE_MULTIPLAYER_USER_MESSAGE) {
  747. // opponent_location=STATE_multiplayer_message_read_buffer();
  748. // //process his location here...
  749. // }
  750. STATE_IMPORT void *STATE_WINAPI STATE_multiplayer_message_read_buffer();
  751. // A new player has been created in the session
  752. #define STATE_CREATEPLAYER   0x0003  
  753. //A player has been deleted from the session
  754. #define STATE_DESTROYPLAYER  0x0005  
  755. // The player has lost its connection with all the
  756.  //other players in the session.
  757. #define STATE_SESSIONLOST           0x0031
  758. #define THERE_ARE_NO_MESSAGES NO
  759. //When receiving a system message (i.e. STATE_multiplayer_message_get() returns
  760. //STATE_MULTIPLAYER_SYSTEM_MESSAGE ) use this function to
  761. //understand the type of the system message received.
  762. //This function returns a constant that can be one of the following:
  763. //
  764. // STATE_CREATEPLAYER 
  765. // A new player has joined the session
  766. //
  767. // STATE_DESTROYPLAYER 
  768. // A player has left the session
  769. //
  770. //STATE_SESSIONLOST 
  771. // Our computer has lost its connection with all the
  772. // other players in the session.
  773. //
  774. STATE_IMPORT unsigned int STATE_WINAPI STATE_multiplayer_message_system_read();
  775.   
  776. //Returns whether this computer serve as the host. 
  777. //The answer is according the the host argument given in STATE_multiplayer_connect().
  778. STATE_IMPORT int STATE_WINAPI STATE_multiplayer_is_host();
  779.   
  780. //Returns the IP address of the computer which is running the application.
  781. //Please note that this function should be called after the user computer is
  782. //connected to the Internet.
  783. //When using a dial-up connection (telephone modem) then the IP number will change
  784. //on each connection.
  785. // Q: Why do I need this function ?
  786. // A: In case that the user computer is hosting the game then all the other player
  787. //    should have his IP number so they can connect to the host.
  788. STATE_IMPORT char * STATE_WINAPI STATE_multiplayer_get_computer_ip();
  789. /*
  790. Writing and reading messages to/from the messages buffer is easily done using the functions:
  791. STATE_multiplayer_message_read_buffer()
  792. STATE_multiplayer_message_write_buffer()
  793. However, in some languages such as Visual Basic,
  794. one cannot pass a buffer as an argument to a function.
  795. Therefor, the functions below were written mainly for the Visual Basic programmers.
  796. (Although if a C programmer feels more comfortable with them he can use them as well)
  797. As you can see, for each type of entry we use a different function, if it is textual entry we use :
  798. STATE3dWorld1.Multiplayer_message_write_string("hello guys");
  799. If we want to send our location, which is a floating point variable we use
  800. STATE3dWorld1.Multiplayer_message_write_double (my_location.x);
  801. If it抯 some integer, we use 
  802. STATE3dWorld1.Multiplayer_message_write_long (123456789);
  803. And if we just need to send a byte (short) variable, we use
  804. STATE3dWorld1.Multiplayer_message_write_byte('A');
  805. *************************************************************************
  806. IMPORTANT!!!
  807. The entries are appended to the message buffer in the same order in which 
  808. they were inserted, so when a user receives that message he should extract
  809. the entries from the message in the same order in which they were written.
  810. ***************************************************************************
  811. For example :
  812. Writing ...
  813. STATE_multiplayer_write_string("John Smith");
  814. STATE_multiplayer_write_double(location[0]);
  815. STATE_multiplayer_write_double(location[1]);
  816. STATE_multiplayer_write_double(location[2]);
  817. Reading...
  818. char playerName[100];
  819. double location[3]={0,0,0};
  820. STATE_multiplayer_read_string(playerName);
  821. STATE_multiplayer_read_double(&location[0]);
  822. STATE_multiplayer_read_double(&location[1]);
  823. STATE_multiplayer_read_double(&location[2]);
  824. */
  825. STATE_IMPORT int STATE_WINAPI STATE_multiplayer_message_write_double(double value);
  826. //See function STATE_multiplayer_message_write_double()
  827. STATE_IMPORT int STATE_WINAPI STATE_multiplayer_message_read_double(double *value);
  828. //See function STATE_multiplayer_message_write_double()
  829. STATE_IMPORT int STATE_WINAPI STATE_multiplayer_message_read_long(long *value);
  830. //See function STATE_multiplayer_message_write_double()
  831. STATE_IMPORT int STATE_WINAPI STATE_multiplayer_message_write_long(long value);
  832. //See function STATE_multiplayer_message_write_double()
  833. STATE_IMPORT int STATE_WINAPI STATE_multiplayer_message_read_string(char *string);
  834. //See function STATE_multiplayer_message_write_double()
  835. STATE_IMPORT int STATE_WINAPI STATE_multiplayer_message_write_string(char *string);
  836. //See function STATE_multiplayer_message_write_double()
  837. STATE_IMPORT int STATE_WINAPI STATE_multiplayer_message_write_byte(BYTE value);
  838. //See function STATE_multiplayer_message_write_double()
  839. STATE_IMPORT int STATE_WINAPI STATE_multiplayer_message_read_byte(BYTE *value);
  840.   
  841. //-------------------------------------------------------//
  842. //======== T H E    T R A C K   A P I ===================//
  843. //-------------------------------------------------------//
  844. // Track is merely a sequence of points.
  845. // cameras and objects can move on tracks in various  ways
  846. // Returns YES or NO.
  847. // YES , if the given handle is a track handle. NO if not.
  848. // If it is not a track handle , a message box will appear,
  849. // the title of this message box will be the parameter "function_asking"
  850. // if function_asking==NULL than no popup will be created.
  851. // See also IS_TRACK()
  852. STATE_IMPORT int STATE_WINAPI STATE_track_is_track(DWORD track_handle, char *function_asking);
  853. STATE_IMPORT DWORD STATE_WINAPI STATE_track_get_using_name(char *name);
  854. // returns 1 if cyclic else returns 0
  855. STATE_IMPORT int STATE_WINAPI STATE_track_is_cyclic(DWORD track_handle);
  856. // Returns the name of the track.
  857. // The function returns a pointer to the name which is stored internally inside the 3D Engine
  858. // Visual Basic users should use STATE_entity_get_name() instead.
  859. // See also STATE_entity_get_namel()
  860. STATE_IMPORT char * STATE_WINAPI STATE_track_get_name(DWORD track_handle);
  861. STATE_IMPORT void STATE_WINAPI STATE_track_set_name(DWORD track_handle, char *name);
  862. STATE_IMPORT int STATE_WINAPI STATE_track_get_number_of_points(DWORD track_handle);
  863. STATE_IMPORT DWORD STATE_WINAPI STATE_track_get_first_track(void);
  864. STATE_IMPORT DWORD STATE_WINAPI STATE_track_get_next(DWORD track_handle);
  865. //returns the point in pt[]
  866. // returns VR_ERROR if the index is too big or negative
  867. // else returns OK
  868. STATE_IMPORT int STATE_WINAPI STATE_track_get_point(DWORD track_handle, int point_index, double pt[3]);
  869. //Use this function to change the location of a specific point on the track.
  870. //Parameters:
  871. // track_handle: The track handle
  872. //
  873. // point_index: A value between 0 to (STATE_track_get_number_of_points() -1 )
  874. //
  875. //  pt: The X,Y,Z values to set for the given point index.
  876. //
  877. // Return value:
  878. // VR_ERROR if the failed (our of range index)
  879. // OK otherwise.
  880. //
  881. STATE_IMPORT int STATE_WINAPI STATE_track_set_point(DWORD track_handle, int point_index, double pt[3]);
  882. // point element can be 0 or 1 or 2
  883. // 0 means get the x element. 1 ==> y. 2 ==>z
  884. // note that if the point_index or the element number
  885. // are out of range the function returns 0. there is no way 
  886. // to know if the 0 is because of error or no.
  887. STATE_IMPORT double STATE_WINAPI STATE_track_get_point_element(DWORD track_handle, int point_index,  int point_element);
  888. // Returns the array of points
  889. // You can then access the array your self for getting and setting points
  890. // Be careful not access the array with an out-of-range  index
  891. // This could cause your program to crash
  892. // indexes should be in the range 0,1,2 ... ,(number_of_points-1)*3+2
  893. // Access example:
  894. // points_array=STATE_track_get_points(track_handle);
  895. // x=points_array[point_index*3+0];
  896. // y=points_array[point_index*3+1];
  897. // z=points_array[point_index*3+2];
  898. //
  899. // The last index possible is 
  900. // array[(number_of_points-1)*3 +2] we have  (number_of_points-1)  because we start with 0
  901. // to get the number of points do:
  902. // number_of_points=STATE_track_get_number_of_points(track_handle);
  903. // The function will always return the same address (array) for a given track.
  904. STATE_IMPORT double *  STATE_WINAPI STATE_track_get_points(DWORD track_handle);
  905. // P is a point anywhere in space
  906. // returns the index to the point on the track that
  907. // is the closest.
  908. // NOTE that if an object or a camera has a track and the track_offset is
  909. // not (0,0,0) then you must do the following to get a correct result
  910. //
  911. // P[0]=P[0]-track_offset[0];
  912. // P[1]=P[1]-track_offset[1];
  913. // P[2]=P[2]-track_offset[2];
  914. // index=STATE_track_find_closest_point_on_track(track, P);
  915. // STATE_track_get_point(track, index, pt);
  916. // pt[0]=pt[0]+track_offset[0];
  917. // pt[1]=pt[1]+track_offset[1];
  918. // pt[2]=pt[2]+track_offset[2];
  919. //
  920. STATE_IMPORT int STATE_WINAPI STATE_track_find_closest_point_on_track(DWORD track_handle, double P[3]);
  921. // Creates a new track.
  922. //
  923. // Parameters:
  924. // points_buffer:
  925. // contains the x,y,z of the points (example: x1,y1,z1, x2,y2,z2, x3,y3,z3 ....)
  926. // note that if number_of_points==3 , we need array with 9 doubles (double points[9] )
  927. //
  928. // track_name:
  929. // The name of the track. Note that if track_name is not unique (there is already another track with the same name),
  930. // the name will be modified so it will be unique. If you use the track name
  931. // then it is a good practice to check the name after the track was created.
  932. // or to make sure in advance that the name is unique.
  933. //
  934. // Example:
  935. //
  936. // double points[9]={ 0,0,0,   100,0,0, 0,0,100};
  937. // DWORD trk=STATE_track_create("trk1", YES, points, 3);
  938. // int num=STATE_track_get_number_of_points(trk); //num should get the value 3
  939. // double pt[3];
  940. // for(int i=0; i<num; i++) {
  941. // STATE_track_get_point(trk, i, pt);
  942. //
  943. // //Do something with the point ...
  944. // }
  945. //
  946. STATE_IMPORT DWORD STATE_WINAPI STATE_track_create(char *track_name, int is_cyclic, double *points_buffer, int number_of_points);
  947. // It is the responsibility of the user that the points buffer is big enough for the number of points.
  948. // The given buffer will be copied inside the engine
  949. // points_buffer contains the x,y,z of the points (example: x1,y1,z1, x2,y2,z2, x3,y3,z3 ....)
  950. // note for example that if the number_of_points==3 then we will need an array with 9 doubles (double points[9] )
  951. STATE_IMPORT void STATE_WINAPI STATE_track_set_points_buffer(DWORD track_handle, double *points, int number_of_points);
  952. //It is the responsibility of the user that the points buffer is big enough.
  953. // if the set number of points is bigger than the room in the points buffer, the
  954. // program might crash.
  955. STATE_IMPORT void STATE_WINAPI STATE_track_set_number_of_points(DWORD track_handle, int number_of_points);
  956. // deletes a track
  957. // be carful not to use this handle after it was deleted
  958. // a good practice is to do like that:
  959. // STATE_track_delete(my_track);
  960. //  my_track=NULL;
  961. //
  962. STATE_IMPORT void STATE_WINAPI STATE_track_delete(DWORD track_handle);
  963. STATE_IMPORT void STATE_WINAPI STATE_track_delete_all(void);
  964. // sending YES will write the given track to file after call to STATE_engine_save() with SAVE_ONLY_WHATS_NEEDED 
  965. // Note that it if STATE_engine_save() is called without SAVE_ONLY_WHATS_NEEDED, all the tracks will be saved
  966. // sending NO will cause  STATE_engine_save() not to save this track (only if SAVE_ONLY_WHATS_NEEDED is used)
  967. // The default value is NO
  968. // see also STATE_animation_set_save_flag()
  969. STATE_IMPORT void STATE_WINAPI STATE_track_set_save_flag(DWORD track_handle, int yes_no_flag); 
  970. // returns YES or NO
  971. // The default value is NO
  972. // see STATE_track_set_save_flag() for more details
  973. STATE_IMPORT int STATE_WINAPI STATE_track_get_save_flag(DWORD track_handle); 
  974. //-------------------------------------------------------//
  975. //======== T H E    B A C K G R O U N D   A P I =============//
  976. //-------------------------------------------------------//
  977. // Background is the background on which the world is rendered.
  978. // The idea is that you give a bitmap and the engine automatically 
  979. // deals with it. For example when you turn around the engine shift the background
  980. // image so it is not noticeable that it isnt part of the world.
  981. // The engine also sees to it that you can turn 360 degrees without
  982. // seeing the background edges ...
  983.  
  984. // Returns YES or NO.
  985. // YES , if the given handle is a background handle. NO if not.
  986. // If it is not a background handle , a message box will appear,
  987. // the title of this message box will be the parameter "function_asking"
  988. // if function_asking==NULL than no popup will be created.
  989. // See also IS_BACKGROUND()
  990. STATE_IMPORT int STATE_WINAPI STATE_background_is_background(DWORD background_handle, char *function_asking);
  991. // The given name should be in capital letters
  992. // If the return value is 0 it means 
  993. // that there is no background with the given name.
  994. STATE_IMPORT DWORD STATE_WINAPI STATE_background_get_handle(char *background_name);
  995. STATE_IMPORT DWORD STATE_WINAPI STATE_background_get_first_background(void); 
  996. STATE_IMPORT DWORD STATE_WINAPI STATE_background_get_next(DWORD background_handle); 
  997. //creates a new background
  998. //Returns a handle to the new background
  999. //arguments:
  1000. // name: any string will do , example "my_sky"
  1001. // bitmap_handle: see STATE_bitmap_load() for getting the handle
  1002. // Note that you have to call STATE_background_use() so that the background will be shown
  1003. STATE_IMPORT DWORD STATE_WINAPI STATE_background_create(char *name, DWORD bitmap_handle);
  1004. STATE_IMPORT void STATE_WINAPI STATE_background_set_name(DWORD background_handle, char *name);
  1005. // Returns the name of the background.
  1006. // The function returns a pointer to the name which is stored internally inside the 3D Engine
  1007. // Visual Basic users should use STATE_entity_get_name() instead.
  1008. // See also STATE_entity_get_namel()
  1009. STATE_IMPORT char *STATE_WINAPI STATE_background_get_name(DWORD background_handle);
  1010. //The purpose of the distance value is to make the background act more realistic
  1011. //by moving up and down according to the camera movement
  1012. //The distance value:
  1013. //The bigger this number is, the more apparent are the 
  1014. //changes in the height  of the background, 
  1015. //when the height of the camera changes.  The  background moves 
  1016. //up and down according to the height of the camera, to  make it 
  1017. //look real (example: If you have a car going up or down a hill, the sky's
  1018. //height must change(the sky is the background).) 
  1019. // example: STATE_background_set_distance(bg_handle, 30000);
  1020. STATE_IMPORT void STATE_WINAPI STATE_background_set_distance(DWORD background_handle, double value); 
  1021. //The purpose of the distance value is to make the background act more realistic
  1022. //by moving up and down according to the camera movement
  1023. //The distance value:
  1024. //The bigger this number is, the more apparent are the 
  1025. //changes in the height  of the background, 
  1026. //when the height of the camera changes.  The  background moves 
  1027. //up and down according to the height of the camera, to  make it 
  1028. //look real (example: If you have a car going up or down a hill, the sky's
  1029. //height must change(the sky is the background).) 
  1030. STATE_IMPORT double STATE_WINAPI STATE_background_get_distance(DWORD background_handle); 
  1031. //The bigger this number is, the background image will start from a higher
  1032. //place. The default is 0
  1033. STATE_IMPORT void STATE_WINAPI STATE_background_set_bottom(DWORD background_handle, double value); 
  1034. STATE_IMPORT double STATE_WINAPI STATE_background_get_bottom(DWORD background_handle); 
  1035. //return OK on success else VR_ERROR
  1036. // a value of 100 means normal brightness at the bottom of the background
  1037. // a value of 50 means a color that is the average between the background
  1038. // and the atmosphere color.
  1039. // a value of 200 means twice as bright than the original hue.
  1040. // feel free to test with different values.
  1041. STATE_IMPORT int STATE_WINAPI STATE_background_set_bottom_intensity(DWORD background_handle, double value); 
  1042. STATE_IMPORT double STATE_WINAPI STATE_background_get_bottom_intensity(DWORD background_handle); 
  1043. //return OK on success else VR_ERROR
  1044. // the changes in the intensity for each scan line
  1045. // going from the bottom of the background up.
  1046. // 0 means no changes.
  1047. STATE_IMPORT int STATE_WINAPI STATE_background_set_intensity_step(DWORD background_handle, double value); 
  1048. STATE_IMPORT double STATE_WINAPI STATE_background_get_intensity_step(DWORD background_handle); 
  1049. STATE_IMPORT void STATE_WINAPI STATE_background_delete(DWORD background_handle);
  1050. STATE_IMPORT void STATE_WINAPI STATE_background_delete_all(void); 
  1051. // Tell the engine to use the given background.
  1052. // A NULL handle means that we dont want to use any background
  1053. STATE_IMPORT void STATE_WINAPI STATE_background_use(DWORD background_handle); 
  1054. //Returns the background handle that is currently in use
  1055. STATE_IMPORT DWORD STATE_WINAPI STATE_background_get_current_background(void); 
  1056. // sending YES will write the given background to file after call to STATE_engine_save() with SAVE_ONLY_WHATS_NEEDED 
  1057. // Note that it if STATE_engine_save() is called without SAVE_ONLY_WHATS_NEEDED, all the backgrounds will be saved
  1058. // sending NO will cause  STATE_engine_save() not to save this background
  1059. // The default value is NO 
  1060. // Note that if it is used it will be saved no matter what the flag is
  1061. // see also STATE_animation_set_save_flag()
  1062. STATE_IMPORT void STATE_WINAPI STATE_background_set_save_flag(DWORD background_handle, int yes_no_flag); 
  1063. // returns YES or NO
  1064. // The default value is NO 
  1065. // see STATE_background_set_save_flag() for more details
  1066. STATE_IMPORT int STATE_WINAPI STATE_background_get_save_flag(DWORD background_handle); 
  1067. //Replace the bitmap of the background with the given bitmap.
  1068. //See also STATE_bitmap_load()
  1069. STATE_IMPORT void STATE_WINAPI STATE_background_set_bitmap(DWORD background_handle, DWORD bitmap_handle); 
  1070. // Returns a handle to the bitmap that is in use by the given background.
  1071. STATE_IMPORT DWORD STATE_WINAPI STATE_background_get_bitmap(DWORD background_handle); 
  1072. // Returns the name of the bitmap. Note the difference between calling STATE_background_get_bitmap()
  1073. //and then getting the bitmap name using STATE_bitmap_get_name()
  1074. // The difference is that here we will get the name even if the bitmap was not loaded yet.
  1075. // For example when our world is on the Internet then we first download the world and only then 
  1076. // the bitmaps are downloaded. If we call this function we would still get the name even though the bitmap wasn't
  1077. // loaded to the engine yet. If you didnt understand this explanation then relax, it is not so important.
  1078. STATE_IMPORT char * STATE_WINAPI STATE_background_get_bitmap_name(DWORD background_handle); 
  1079. //-------------------------------------------------------//
  1080. //======== T H E     E N T I T Y      A P I =============//
  1081. //-------------------------------------------------------//
  1082. //This API contains functions that already exist in other STATE APIs.
  1083. //The idea is that one function can serve all API. For example the STATE_entity_get_name()
  1084. //can get the name of a camera, an object a group etc ... Some people use this API a lot and
  1085. //other dont use it at all. Both ways are fine.
  1086. //Gets the name of the entity.
  1087. //entity could be a handle to one of the following camera,group,object,track,background,bitmap
  1088. //The requested name is copied to the given buffer.
  1089. //buffer_size is the buffer size in bytes. If this value is shorter than the requested name
  1090. //then the name will be truncated.
  1091. //The return value is the length of the name
  1092. STATE_IMPORT int STATE_WINAPI STATE_entity_get_name(DWORD entity, char *buffer, int buffer_size);
  1093. //Entity could be a handle to a polygon an object or a group.
  1094. //Returns the number of bitmaps that were created and assigned to a polygon.
  1095. //For more details see STATE_polygon_create_lightmap(), STATE_group_create_light_map()
  1096. STATE_IMPORT int STATE_WINAPI STATE_entity_create_lightmap(DWORD entity, int max_bm_side, int min_lightmap_size, double sample_rate, int force_ray_tracing, int bitmap_number);
  1097. //-------------------------------------------------------//
  1098. //======== T H E    3 D  C A R D      A P I =============//
  1099. //-------------------------------------------------------//
  1100. // This API include specific functions for working with the 3D accelerator.
  1101. // We tried to make the existence of the card transparent to the programmer
  1102. // so that things should work exactly the same with card or without.
  1103. //Note that some of the function exist also in the engine API
  1104. //those function do exactly the same. It is preferred if you use just the function from this
  1105. //API.
  1106. // return YES or NO
  1107. STATE_IMPORT int STATE_WINAPI STATE_3D_card_check_hardware_support(void);
  1108. // Get YES or NO. Returns OK or VR_ERROR
  1109. // If gets YES, the function will look for a 3D card installed on the computer
  1110. // if it wont find, the function will return VR_ERROR.
  1111. // It is a good practice to call STATE_3D_card_use(NO);
  1112. // before you exit your application.
  1113. // The default is NO.
  1114. //
  1115. // Remarks:
  1116. // The software rendering works much faster at 16bit color depth.
  1117. // If your end users might not have a 3D Card you should consider
  1118. // to call STATE_engine_set_color_depth() at the beginning of the program to set 16bit mode color depth.
  1119. // When the program exits the engine will switch back to what ever mode was before
  1120. //
  1121. STATE_IMPORT int STATE_WINAPI STATE_3D_card_use(int YES_or_NO);
  1122. #define  CARD3D_SOFTWARE_EMULATION 1 //Use it to set DirectX software emulation.
  1123.  //This is usually a lot slower than STATE Software rendering.
  1124.  //The advantage is that it will look exactly like DirectX hardware rendering.
  1125. #define  CARD3D_NORMAL 2
  1126. #define  CARD3D_OFF 4//in this case it will use STATE software rendering
  1127.  //which is equivalent to STATE_3D_card_use(NO)
  1128. //This function gives more possibilities to the way the 3d card will operate.
  1129. //render_mode can be anyone of the options above (CARD3D_SOFTWARE_EMULATION, CARD3D_NORMAL, CARD3D_OFF)
  1130. //set_full_screen can be YES or NO.
  1131. //resolution_x, resolution_y, color_depth are only relevant if set_full_screen==YES
  1132. // color_depth could be 16 or 32 the default is 16.
  1133. //use_secondary_card can be YES or NO. In many computers there are more than one 3D card
  1134. // for example computers with VoodooII card have also another card. Usually the other
  1135. // card has some inferior 3D capabilities though. In those cases it is important to let the user choose
  1136. // if he wants to use his secondary or his primary card. Note that the primary card isn't necessarily the better 3D card.
  1137. //
  1138. // Examples:
  1139. // A) STATE_3D_card_use_detailed(CARD3D_NORMAL, NO, 0, 0, 0, NO);
  1140. // B) STATE_3D_card_use_detailed(CARD3D_NORMAL, YES, 800, 600, 16, NO);
  1141. //
  1142. // Remarks:
  1143. // The software rendering works much faster at 16bit color depth.
  1144. // If your end users might not have a 3D Card you should consider
  1145. // to call STATE_engine_set_color_depth() at the beginning of the program to set 16bit mode color depth.
  1146. // When the program exits the engine will switch back to what ever mode was before
  1147. //
  1148. STATE_IMPORT int STATE_WINAPI STATE_3D_card_use_detailed(int render_mode, int set_fullscreen, int resolution_x, int resolution_y, int color_depth, int use_secondary_card);
  1149. //Returns YES if a 3D accelerator card is in use.
  1150. //Returns NO if software rendering is used.
  1151. STATE_IMPORT int STATE_WINAPI STATE_3D_card_is_used(void);
  1152. //Set full screen mode and the desktop resolution
  1153. // Returns OK or VR_ERROR
  1154. // here are four Examples:
  1155. // STATE_3D_card_set_full_screen_mode(1024,768);
  1156. // STATE_3D_card_set_full_screen_mode(800,600);
  1157. // STATE_3D_card_set_full_screen_mode(640,480);
  1158. // STATE_3D_card_set_full_screen_mode(320,200);
  1159. STATE_IMPORT int STATE_WINAPI STATE_3D_card_set_full_screen_mode(int resolution_x, int resolution_y);
  1160. //Returns YES if the 3D card is programed to use fullscreen.
  1161. STATE_IMPORT int STATE_WINAPI STATE_3D_card_is_full_screen_mode(void);
  1162. //This is the default. Can be called instead, before or after STATE_3D_card_use(YES);
  1163. //returns OK or VR_ERROR
  1164. STATE_IMPORT int STATE_WINAPI STATE_3D_card_set_window_mode(void);
  1165. //Hides the driver selection popup
  1166. //The default is that this popup is visible.
  1167. // Example:
  1168. // STATE_3D_card_hide_driver_selection_window(YES);
  1169. STATE_IMPORT void STATE_WINAPI STATE_3D_card_hide_driver_selection_window(int YES_or_NO);
  1170. //Controls whether the driver selection popup will pop
  1171. //when the 3D card is put to work.
  1172. //Returns YES or NO.
  1173. // See also STATE_3D_card_hide_driver_selection_window()
  1174. STATE_IMPORT int STATE_WINAPI STATE_3D_card_is_driver_selection_window_visible(void);
  1175. //Calling this function with a YES allow the engine to use DirectX 
  1176. //software emulation when there is no 3D accellerator card.
  1177. //Use this function if you want to ensure a homogenous look to your
  1178. //application with or without a 3D card. The disadvantage of DirectX
  1179. //software emulation is that is is a lot slower then STATE software rendering (The default).
  1180. //In the case that your application uses a big 3D world then the DirectX
  1181. //emulation will probably be too slow. If it is just an object that
  1182. //is shown then using this function will probably give a good result.
  1183. //
  1184. //The default is NO.
  1185. //Example STATE_3D_card_allow_software_emulation(YES);
  1186. STATE_IMPORT void STATE_WINAPI STATE_3D_card_allow_software_emulation(int YES_or_NO);
  1187. #define BILINEAR_FOR_PRIMARY_TEXTURE_ONLY 8
  1188. #define BILINEAR_FOR_SECONDARY_TEXTURE_ONLY 16
  1189. #define BILINEAR_USE_3D_CARD_DEFAULTS 32
  1190. // Function level of importance = High.
  1191. //
  1192. // The function turns OFF or ON the bilinear filtering.
  1193. // The effect is visible only when the 3D card is on.
  1194. // Bilinear filtering is a technique for getting better looking textures. When bilinear 
  1195. // filtering is ON, it removes the pixelization effect from close textures.
  1196. // The default is ON. If preformance are very important you should consider
  1197. // shutting bilinear filltering off.
  1198. // Bilinear filtering could also be set separatelly for each polygon using
  1199. // STATE_polygon_set_bilinear_filtering() (this will overide any setting made by STATE_3D_card_set_bilinear_filtering() )
  1200. // parameters:
  1201. // bilinear_mode:
  1202. // ON  - The default. Turns on bilinear filtering.
  1203. // OFF - Turns off bilinear filtering
  1204. // BILINEAR_FOR_PRIMARY_TEXTURE_ONLY - Turns bilinear only for the primary texture (each polygon could have two textures, the primary and the secondary)
  1205. // BILINEAR_FOR_PRIMARY_SECONDARY_ONLY -   Turns bilinear only for the secondary texture (each polygon could have two textures, the primary and the secondary)
  1206. //Example:
  1207. // STATE_3D_card_set_bilinear_filtering(OFF);
  1208. //
  1209. // See also STATE_polygon_set_bilinear_filtering()
  1210. STATE_IMPORT void STATE_WINAPI STATE_3D_card_set_bilinear_filtering(int bilinear_mode);
  1211. //The following function gives direct access to the Direct3D  DirectDraw surfaces
  1212. //Advanced users who are familiar with DirectDraw and Direct3D can
  1213. //use this function to speed up 2D sprite drawing and other effects.
  1214. //or to add code that was written with DirectX to a STATE application.
  1215. //If you are not familiar with Direct3D then you better skip this function.
  1216. //Note that this function is very fast so there it is OK to call it several times for each render iteration.
  1217. //
  1218. // parameters:
  1219. //
  1220. // IDirectDraw4 *IDirectDraw4_object  
  1221. // THis is the DirectDraw object (of type pointer to IDirectDraw4)
  1222. // Through this parameters the Direct Draw interface could be accessed.
  1223. //
  1224. // IDirect3D3 *IDirect3D3_object
  1225. // This is the Direct3D object (of type pointer to IDirect3D3)
  1226. // Through this parameters the Direct3D interface could be accessed.
  1227. //
  1228. // IDirect3DDevice3 *D3D_device
  1229. // The Direct3D devices interface
  1230. //
  1231. //
  1232. // IDirectDrawSurface4 *IDirectDrawSurface4_primary_surface
  1233. // The primary surface
  1234. //
  1235. // IDirectDrawSurface4 *IDirectDrawSurface4_back_surface
  1236. // The secondary surface
  1237. //
  1238. // IDirectDrawSurface4 *IDirectDrawSurface4_zbuffer
  1239. // The surface used to store the ZBuffer
  1240. //
  1241. // IDirect3DViewport3 *IDirect3DViewport3_viewport
  1242. // The view port to which the rendering is done.
  1243. // 
  1244. //
  1245. //Example A:
  1246. //
  1247. // void *DD_void;
  1248. // void *D3D_void;
  1249. // void *D3D_device_void;
  1250. // void *primary_void;
  1251. // void *secondary_void;
  1252. // void *zbuffer_void;
  1253. // void *viewport_void;
  1254. //
  1255. // STATE_3D_card_get_directx_internals(&DD, &D3D, &D3D_device,&primary, &secondary, &zbuffer, &viewport);
  1256. //
  1257. // //Do some custing so we can use the varibles
  1258. // IDirectDraw4 *DD=(IDirectDraw4 *)DD_void;
  1259. // IDirect3D3  *D3D=(IDirect3D3 *)D3d_void;
  1260. // IDirect3DDevice3 *D3D_device=(IDirect3DDevice3 *)D3D_device_void;
  1261. // IDirectDrawSurface4  *primary=(IDirectDrawSurface4 *)primary_void;
  1262. // IDirectDrawSurface4  *secondary=(IDirectDrawSurface4 *)secondary_void;
  1263. // IDirectDrawSurface4  *zbuffer=(IDirectDrawSurface4 *)zbuffer_void;
  1264. // IDirect3DViewport3 *viewport=(IDirect3DViewport3 *)viewport_void;
  1265. //
  1266. //Example B
  1267. // Here is a small example for doing bitblt assuming the the arguments were already casted
  1268. //
  1269. // if( is_in_full_screen_mode )
  1270. // return (m_pddsFrontBuffer->Flip( NULL, DDFLIP_WAIT );
  1271. //
  1272. //
  1273. // // Else, we are in windowed mode, so perform a blit.
  1274. // return m_pddsFrontBuffer->Blt( &m_rcScreenRect, m_pddsBackBuffer,  &m_rcViewportRect, DDBLT_WAIT, NULL );
  1275. //
  1276. STATE_IMPORT void STATE_WINAPI STATE_3D_card_get_directx_internals(void **IDirectDraw4_object, void **IDirect3D3_object, void **IDirect3DDevice3_device, void **IDirectDrawSurface4_primary_surface, void **IDirectDrawSurface4_back_surface, void **IDirectDrawSurface4_zbuffer, void **IDirect3DViewport3_viewport);
  1277. //Returns YES or NO. YES is returned if multiple texture blending is supported by the 3D card
  1278. STATE_IMPORT int STATE_WINAPI STATE_3D_card_is_multiple_texture_blending_supported(void);
  1279. // General
  1280. // --------
  1281. // Set the antialiasing mode ON or OFF.
  1282. // This is an important function that can enhance graphic quality.
  1283. // Usually turning antialiasing ON will slow down rendering though modern
  1284. // 3D cards such as GeForce 4 (Ti or MX) and newer cards have good support
  1285. // for antialiasing.
  1286. //
  1287. // What is antialiasing ?
  1288. // ----------------------
  1289. // Reduction of jagged edges by the use of intermediate shades, smoothing of aliasing.
  1290. // 
  1291. //
  1292. // Usage:
  1293. // ------
  1294. // Could be call before using the 3D card or afterwords.
  1295. // Has no effect when using software rendering.
  1296. // The default is OFF.
  1297. //
  1298. // Example: 
  1299. // STATE_3D_card_set_antialiasing(ON);
  1300. //
  1301. STATE_IMPORT void STATE_WINAPI STATE_3D_card_set_antialiasing(int ON_or_OFF);
  1302. //Returns whether the 3D card supports antialiasing (SORTINDEPENDENT).
  1303. STATE_IMPORT int STATE_WINAPI STATE_3D_card_is_antialiasing_supported(void);
  1304. //-------------------------------------------------------//
  1305. //======== T H E    U T I L T I E S   A P I =============//
  1306. //-------------------------------------------------------//
  1307. // The function in this API have nothing to do with the 
  1308. // STATE VR_Engine ! You can think of them as an extension to the 
  1309. // WIN32 API.
  1310. // They are here because they are useful in many applications especially
  1311. // applications that use lots of graphics.
  1312. //Loads a file into memory.
  1313. //returns a pointer to the allocated memory and the size of the file
  1314. //If the file could not be loaded a NULL is returned
  1315. //This file can be also treated as a string (there will always be a terminating NULL ).
  1316. //Example:
  1317. // int file_size;
  1318. // char *buff=(char *)STATE_utilities_file_to_memory("help.txt", &file_size);
  1319. // MessageBox(NULL,buff,"Help", MB_OK);
  1320. // STATE_utilities_free_file_memory(buff);
  1321. STATE_IMPORT BYTE *STATE_WINAPI STATE_utilities_file_to_memory(char *file_name, int *file_size);
  1322. //Used together with STATE_utilities_file_to_memory() to free memory
  1323. //that we don't need any more.
  1324. //note that "void *mem_ptr" is a pointer to void which means
  1325. //that it will accept any type of pointer.
  1326. STATE_IMPORT void STATE_WINAPI STATE_utilities_free_file_memory(void *mem_ptr);
  1327. // stretch a bitmap on the given window
  1328. // border_to_leave is usually 0. We can give a
  1329. // different value if we want to keep the window
  1330. // frame lines visible.
  1331. // if border_to_leave==0 then all the window
  1332. // will be covered by the bitmap. if border_to_leave
  1333. // is equal to 2 (for example) then there will be 
  1334. // a border of two pixels left from each side.
  1335. STATE_IMPORT void  STATE_WINAPI STATE_utilities_paste_resource_bitmap(HWND hwnd, UINT bitmap_resource_id, int border);
  1336. // You can use STATE_utilities_load_bitmap_from_file() to get a handle to the bitmap and then to use this function
  1337. STATE_IMPORT void  STATE_WINAPI STATE_utilities_paste_bitmap(HWND hwnd, HBITMAP bitmap_handle, int border);
  1338. // This is a very useful function.
  1339. // It can be used for pasting 2D bitmaps on the rendered image
  1340. // For example an image denoting the health condition of the player
  1341. // or the existence of ammunition
  1342. // The function copies a bitmap on the given device context.
  1343. // Use STATE_utilities_load_bitmap_from_file() to get a handle to the bitmap (HBITMAP)
  1344. // Use STATE_engine_render_on_dc() to get the device context handle (HDC hdc)
  1345. //
  1346. // Parameters:
  1347. //
  1348. // hdc: a handle to the device context. usually you would obtain this
  1349. // handle from calling hdc=STATE_engine_render_on_dc()
  1350. //
  1351. // hbm: a HBITMAP handle of the bitmap. you can use 
  1352. // STATE_utilities_load_bitmap_from_file() to get
  1353. // the handle.
  1354. //
  1355. // x,y: the coordinate where the bitmap should be placed
  1356. //
  1357. // bm_stretch_width,
  1358. // bm_stretch_height: Using these params you can stretch the bitmap
  1359. // If you dont want to stretch the bitmap give -1
  1360. //
  1361. //
  1362. // Examples:
  1363. //
  1364. // A) 
  1365. // //Copy the bitmap to the top left corner of the window
  1366. // STATE_utilities_copy_bitmap_on_dc(hdc, hbm, 0,0, -1,-1);
  1367. //
  1368. // B) 
  1369. // //Copy the bitmap to the top left corner of the window
  1370. // //The bitmap will be stretched to a 100x100 square size (size in pixels)
  1371. // STATE_utilities_copy_bitmap_on_dc(hdc, hbm, 0,0, 100, 100);
  1372. //
  1373. STATE_IMPORT void  STATE_WINAPI STATE_utilities_copy_bitmap_on_dc(HDC hdc, HBITMAP hbm, int x, int y, int bm_stretch_width, int bm_stretch_height);
  1374. // This function has nothing to do with STATE graphics engine
  1375. // Think of it as an extension to the Win32 API.
  1376. //
  1377. //It is also possible to load a jpeg file (*.jpg).
  1378. // If bitmap_file_name ends with ".jpg" and there is no file with the same name only with a .bmp extension 
  1379. // in the same directory then the function will load the jpg file
  1380. //
  1381. // Note the difference between this command and STATE_bitmap_load()
  1382. // STATE_bitmap_load() command loads a bitmap into the engine, while STATE_utilities_load_bitmap_from_file()
  1383. // is just an extension to the Win32 API making it easy to load a bitmap from
  1384. // the disk and to get its HBITMAP handle (a Win32 type)
  1385. //
  1386. STATE_IMPORT HBITMAP  STATE_WINAPI STATE_utilities_load_bitmap_from_file(char *bitmap_file_name);
  1387. // This function has nothing to do with STATE graphics engine
  1388. // Think of it as an extension to the Win32 API.
  1389. //
  1390. // bitmap_file_name should have a bmp extension.
  1391. // The file is always saved in 8 bit color depth.
  1392. // To save in 24 bit color use STATE_utilities_save_bitmap24()
  1393. //returns OK or VR_ERROR
  1394. STATE_IMPORT int STATE_WINAPI STATE_utilities_save_bitmap(HBITMAP hbm, char *bitmap_file_name);
  1395. //Exactly like STATE_utilities_save_bitmap(), only that it saves in 24 bit per pixel color depth (rather than 8)
  1396. STATE_IMPORT int STATE_WINAPI STATE_utilities_save_bitmap24(HBITMAP hbm, char *bitmap_file_name);
  1397. //Creates a new bitmap file
  1398. //The new bitmap file is a resampled version of the source bitmap file
  1399. //The given bitmap file should be in 8 bit per pixel or 24 bit per pixel file format.
  1400. // The return value is OK or VR_ERROR
  1401. // Example:
  1402. // STATE_utilities_resample_bitmap("C:\STATE\logos\biglogo.bmp", "..\small_logo.bmp", 32,32);
  1403. // This would create a 32x32 bitmap file in the name small_logo.
  1404. STATE_IMPORT int  STATE_WINAPI STATE_utilities_resample_bitmap(char *source_bitmap_file, char *new_bitmap_file_name, int new_width, int new_height);
  1405. //convert a jpg files into 256 colors bitmap
  1406. // returns OK or VR_ERROR;
  1407. //example:
  1408. // rc=STATE_utilities_jpg2bmp("bitmapsjpeghorse.jpg");
  1409. // This will create a 256 colors bitmap with the name horse.bmp
  1410. // the bitmap will be created in the same directory of horse.jpg
  1411. STATE_IMPORT int  STATE_WINAPI STATE_utilities_jpg2bmp(char *jpg_file_name);
  1412. //Like STATE_utilities_jpg2bmp() only the other way around.
  1413. // Note that the bitmap should be 256 colors
  1414. STATE_IMPORT int  STATE_WINAPI STATE_utilities_bmp2jpg(char *bmp_file_name);
  1415. // The output format is determined according to the extension of the output file
  1416. // The same with the input file format.
  1417. // example STATE_utilities_convert_3d_formats("test.x", "test.mft", "", SAVE_BITMP_AS_JPG);
  1418. // Note that this function just do STATE_engine_load_world() and STATE_engine_save()
  1419. // and that means that any world that is currently in the engine will be unloaded
  1420. // and the input_file_name world will be.
  1421. STATE_IMPORT int  STATE_WINAPI STATE_utilities_convert_3d_formats(char *input_file_name, char *world_directory_path, char *bitmaps_directory_path, char *output_file_name, int save_flags);
  1422. //Convert a 16bit rgb color to 24bit rgb. The result is return through red,green and blue.
  1423. //See also STATE_bitmap_get_palette();
  1424. STATE_IMPORT void  STATE_WINAPI STATE_utilities_rgb16_to_rgb24(WORD rgb16, BYTE *red, BYTE *green, BYTE *blue);
  1425. //Returns YES or NO.
  1426. //Returns YES if the operating system is Windows 98 or above (i.e Windows me , windows 2000 etc ...)
  1427. STATE_IMPORT int  STATE_WINAPI STATE_utilities_is_windows98_or_later(void);
  1428. //Saves the content of the given window as a bitmap on the disk
  1429. // Returns OK or VR_ERROR
  1430. // One shouldn't use this function when using the 3D card to render.
  1431. // Instead use this combination.
  1432. // HBITMAP hbm=STATE_engine_render_on_bitmap(your_window_or_null, your_camera_or_null);
  1433. // STATE_utilities_save_bitmap(hbm, "d:\screenshots\shot.bmp");
  1434. //
  1435. // Example:
  1436. // 
  1437. // HWND hwnd=STATE_engine_get_default_rendering_window_hwnd()
  1438. // STATE_utilities_save_screenshot(hwnd, "d:\my_screenshots\flight_sim1.bmp");
  1439. //
  1440. // Note that the above example is the same as writing STATE_utilities_save_screenshot(NULL, "d:\my_screenshots\flight_sim1.bmp");
  1441. //
  1442. STATE_IMPORT int  STATE_WINAPI STATE_utilities_save_screenshot(HWND rend_win, char *file_name);
  1443. // gets an address and display its content
  1444. // size is the size of the given buffer in bytes.
  1445. // You can use this function for debugging if you have problems interfacing the dll.
  1446. STATE_IMPORT void  STATE_WINAPI STATE_utilities_test_address(BYTE *mem_address, int size);
  1447. //Test receiving a string. the string that is received is "Testing string transfer"
  1448. //Returns "Testing string transfer"
  1449. STATE_IMPORT char *STATE_WINAPI STATE_utilities_test_string(void);
  1450. //popup a dialog with the given string
  1451. STATE_IMPORT void  STATE_WINAPI STATE_utilities_test_LPSTR(LPSTR str);
  1452. //popup a dialog with the given string
  1453. STATE_IMPORT void  STATE_WINAPI STATE_utilities_test_LPCSTR(LPCSTR str);
  1454. //popup a dialog box with the given pointer and the value it points at
  1455. STATE_IMPORT void  STATE_WINAPI STATE_utilities_test_PDWORD(DWORD *ptr);
  1456. //popup a dialog box with the given pointers and the value they point at
  1457. STATE_IMPORT void  STATE_WINAPI STATE_utilities_test_2PDWORD(DWORD *ptr1, DWORD *ptr2);
  1458. // Divides a bitmap into smaller pieces (image cutter)
  1459. //
  1460. // Parameters:
  1461. //
  1462. // bitmap_to_cut: 
  1463. // a bmp file name
  1464. //
  1465. // fraction_width, fraction_width:
  1466. // The size of the each small fraction cut from the big bitmap
  1467. //
  1468. // name_to_save:
  1469. // The pathfilename where to save the fractions.
  1470. // example: "D:\my_folder\filename" this will create the bitmaps inside the folder "my_folder"
  1471. // and will name them filename1.bmp, filename2.bmp etc ...
  1472. //
  1473. // force_8bit_output
  1474. // The fractions are saved in 8bit format.
  1475. //
  1476. //
  1477. // Return value:
  1478. // Returns the number of bitmaps that were created.
  1479. //
  1480. //
  1481. // Example:
  1482. //
  1483. // //This will divide a big bitmap into 256x256 parts
  1484. // STATE_utilities_cut_image("big_bitmap.bmp", 256, 256, "part", NO);
  1485. //
  1486. // Remarks:
  1487. // Almost all 3d cards cant handle bitmaps larger than 1024x1024
  1488. // The Voodoo3 card can handle only 256x256 bitmaps (or smaller) !!!
  1489. //
  1490. // Many 3d cards achieves best performance when bitmaps are at the size of 256x256
  1491. // Though in some application 512x512 or 1024x1024 will get better results
  1492. // depending on the application developed (you should test it to get suitable size for your application)
  1493. //
  1494. STATE_IMPORT int  STATE_WINAPI STATE_utilities_cut_image(char *bitmap_to_cut, int fraction_width, int fraction_length, char *name_to_save, int force_8bit_output);
  1495. //-----------------------------------------------------//
  1496. //==+++====== T H E    M A T H   A P I ===========+++==//
  1497. //-----------------------------------------------------//
  1498. // The function in this API have nothing to do with the 
  1499. // STATE VR_Engine ! You can think of them as an extension to the 
  1500. // WIN32 API.
  1501. // They are here because they are useful in many applications especially
  1502. // applications that use 3D graphics.
  1503. // Constants for the math API
  1504. #define ON_PLANE  1//on the same plane
  1505. #define IN_BACK_OF_PLANE        2
  1506. #define IN_FRONT_OF_PLANE       3
  1507. #define CUTS_PLANE      4
  1508. #ifndef M_PI
  1509. #define M_PI        3.14159265358979323846
  1510. #endif
  1511. // returns the distance between two points in the power of two
  1512. // example: p1=(0,0,0) p2=(10,0,0)
  1513. // the distance is 10 so the return value will be 100 
  1514. // see also STATE_math_get_distance() which is the same only it
  1515. // calls sqrt() at the end.
  1516. STATE_IMPORT double  STATE_WINAPI STATE_math_get_square_distance(double p1[3], double p2[3]);
  1517. // returns the distance between two points
  1518. // example: p1=(0,0,0) p2=(10,0,0)
  1519. // the distance is 10 so the return value will be 10
  1520. // If speed is important it is better to use STATE_math_get_square_distance()
  1521. // which is much faster because it doesn't do the sqrt()
  1522. STATE_IMPORT double  STATE_WINAPI STATE_math_get_distance(double p1[3], double p2[3]);
  1523. // stores the result in "intersection_point" which is valid in all cases
  1524. // pt1 and pt2 are two points on a line
  1525. // return value:
  1526. // YES if pt1 and pt2 are in different sides of the plane
  1527. // in this case intersection_point will be the expected intersection point
  1528. // NO if pt1 and pt2 are on the same side of the plane
  1529. //  in this case intersection_point will be the intersection point if the infinite line that contains p1 and p2
  1530. //
  1531. // NO if the line is on the plane. 
  1532. // In this case the intersection point will be pt1
  1533. //
  1534. // YES, If one edge of the segment is on the plane (and the other one is not).
  1535. //
  1536. STATE_IMPORT int STATE_WINAPI STATE_math_does_segment_intersect_plane(double pln[4],double pt1[3], double pt2[3], double intersection_point[3]);
  1537. // Return the distance between point P and the line going through points A and B.
  1538. STATE_IMPORT double STATE_WINAPI STATE_math_get_distance_between_point_and_line(double P[3], double A[3], double B[3]);
  1539. // P is a point
  1540. // AB is a line
  1541. // The result is returned through closest_point_on_line
  1542. //  closest_point_on_line is the a point on the line defined by A and B that is closest to P
  1543. // Returns OK or VR_ERROR (error if point A is equal to point B)
  1544. // Example:
  1545. // P[0]=1; P[1]=2; P[2]=30;
  1546. // A[0]=10; A[1]=20; A[2]=30;
  1547. // B[0]=100; B[1]=200; B[2]=300;
  1548. // double  closest_point_on_line[3];
  1549. //  STATE_math_get_closest_point_on_line(P,A,B,closest_point_on_line);
  1550. STATE_IMPORT int STATE_WINAPI STATE_math_get_closest_point_on_line(double P[3], double A[3], double B[3], double closest_point_on_line[3]);
  1551. // return YES or NO
  1552. // Returns YES if point pt is on the given line segment 
  1553. STATE_IMPORT int STATE_WINAPI STATE_math_is_point_on_segment(double pt[3], double segment_start[3], double segment_end[3]);
  1554. // Get three points and calculate their plane equation (the plane equation: Ax+By+Cz+D=0 )
  1555. // Note that (pln[0],pln[1],pln[2]) are the normal of the plane.
  1556. // The direction of the normal (there are two possibilities) is determined according to
  1557. // the direction of the points. The Normal will point towards the side in which the points will be in clockwise order
  1558. // The return value is OK or VR_ERROR. note that we will get VR_ERROR if
  1559. // the points are on the same line or are all equal.
  1560. STATE_IMPORT int STATE_WINAPI STATE_math_points_to_plane(double pln[4], double p1[3], double p2[3], double p3[3]);
  1561. // Gets a plane equation (Ax+By+Cz+D=0 ) and a point
  1562. // and returns the following constants 
  1563. // ON_PLANE (if the point is on the plane)
  1564. // IN_BACK_OF_PLANE
  1565. // IN_FRONT_OF_PLANE
  1566. // The side which is called front is the side that the normal of the plane points towards)
  1567. // (the normal is: N=(pln[0], pln[1], pln[2]);
  1568. // the argument thickness is the thickness of the plane (actually half of the width of the plane).
  1569. // If for example thickness==6 than all the points that their distance from the plane
  1570. // is 6 or less will result a return value of ON_PLANE.
  1571. // Usually you will call this function with thickness==0
  1572. // But if you want to check whether a point is on the plane you
  1573. // should call this function with thickness bigger than 0 (for example 0.0001) 
  1574. // and thats to avoid floating point errors (if the plane was created using
  1575. // three points and you took only 6 decimal places after the decimal point then the
  1576. // plane equation wont be 100% accurate, there is also a limit to the accuracy
  1577. // of floating points numbers in a binary world)
  1578. // You can also call this function with a negative thickness though 
  1579. // it is not so useful, in this case the half of the space which is considered in front of the plane
  1580. // will get bigger ... In this case you will never get ON_PLANE)
  1581. // Note also that this function is extremely fast.
  1582. STATE_IMPORT int STATE_WINAPI STATE_math_get_plane_point_relations(double pln[4], double pt[3], double thickness);
  1583. // Takes three points and returns whether they are in clockwise order or not
  1584. // when looking from above (looking in direction 0,0,-1). If all the points
  1585. // have the same x or y values then one cant tell (when looking from above) if it is clockwise
  1586. // so in this case we look from front (looking in direction 0,0,-1) and if
  1587. // that doesn't succeed we look from the right side (looking in direction 0,-1,0)
  1588. // Returns YES or NO
  1589. // Note that the three points create a plane and from each side of the plane
  1590. // what is clockwise is exactly the other way around.
  1591. //
  1592. // If you want to check if the points are clockwise from a given point
  1593. // use STATE_math_get_plane_point_relations() like that
  1594. // create a plane from the three points and call the function when the point
  1595. // in which you look from is the given point.
  1596.  STATE_IMPORT int STATE_WINAPI STATE_math_is_clockwise(double p1[3], double p2[3], double p3[3]);
  1597. // return if points are in clockwise when
  1598. // looking on the three points from the given direction.
  1599. // The given direction doesn't have to be normalized.
  1600. // see also is_clockwise()
  1601. // Returns YES or NO.
  1602.  STATE_IMPORT int STATE_WINAPI STATE_math_is_clockwise_from_direction(double view_direction[3], double p1[3], double p2[3], double p3[3]);
  1603. // Calculates the ray that reflects from a surface according to the
  1604. // physic law: the hitting angle is equal to the reflected angle.
  1605. // Arguments:
  1606. // normal is the normal of the plane that the ray hits.
  1607. // hitting_ray is the ray that hits the plane
  1608. // the result is given in reflected_ray (the result is normalized)
  1609. // return value: OK, or VR_ERROR (in case of an error).
  1610. STATE_IMPORT int STATE_WINAPI STATE_math_get_reflected_direction(double normal[3], double hitting_ray[3], double reflecting_ray[3]);
  1611. //Returns the scalar product between two vectors.
  1612. //The return value is the length of the first vector multiply by
  1613. //the length of the second multiplied by the cosine of the angle between the
  1614. //two vectors.
  1615. //In a formula way it looks like that:
  1616. // return value= scalar_product= |vec1|*|vec2|*cos(alpha) . Alpha is the angle between the vectors
  1617. //For more information about scalar products see your math book (look for Linear Algebra and vectors)
  1618. STATE_IMPORT double STATE_WINAPI STATE_math_product(double vec1[3], double vec2[3]);
  1619. //Returns the cross product between vec1 and vec2.
  1620. //The result is returned in the argument "result"
  1621. //The returned vector is a vector that is perpendicular both to vec1 and vec2
  1622. //The length of the returned vector is equal to
  1623. //The length of vec1 multiplied by the length of vec2 multiplied by
  1624. //the sinus of the angle between the two vectors.
  1625. //For more information about scalar products see your math book (look for Linear Algebra and vectors)
  1626. STATE_IMPORT void STATE_WINAPI STATE_math_cross(double vec1[3], double vec2[3], double result[3]);
  1627. //returns OK or VR_ERROR
  1628. //normalize the vector. This means make it a unit vector.
  1629. //In other words the direction of the vector will stay the same
  1630. //but its length will become one
  1631. //example:
  1632. // double vec[3]={6,8,0} //length==10
  1633. // STATE_math_normalize_vec(vec);
  1634. // //Now the vec will be equal to { 0.6, 0.8, 0} (length==1)
  1635. STATE_IMPORT int STATE_WINAPI STATE_math_normalize_vector(double vec[3]);
  1636. //Returns the length (magnitude) of the vector
  1637. STATE_IMPORT double STATE_WINAPI STATE_math_get_vector_length(double vec[3]);
  1638. //This is a very powerful function. Beginners will probably never use this function. 
  1639. //It is used to interpolate values across a polygon. Please note that this function is used together with 
  1640. // STATE_math_get_interpolated_value_using_equation()
  1641. // With STATE_math_calculate_triangle_interpolation_equation() we build an equation
  1642. // and with STATE_math_get_interpolated_value_using_equation() we query for values using the equation we
  1643. // have already constructed.
  1644. // Return values.
  1645. // If an error occurred it returns VR_ERROR. On success it will return the type of the equation that 
  1646. // was created. We shouldn't care about this value though it is important that we keep it
  1647. // because later we will have to send it to STATE_math_get_interpolated_value_using_equation();
  1648. // This function also returns the resulted equation through the result_equation argument.
  1649. // Again we shouldnt care at all about what this means though we should save it for calling 
  1650. // STATE_math_get_interpolated_value_using_equation()
  1651. //
  1652. // Arguments:
  1653. // double xyz_of_3_points[3][3] - Three points of the polygon that will be used for interpolating. For example:
  1654. // xyz_of_3_points[0][0] X value of the first point
  1655. // xyz_of_3_points[0][1] Y value of the first point
  1656. // xyz_of_3_points[1][2] Z value of the SECOND point
  1657. //
  1658. // double value_to_interpolate[3]
  1659. // The values to be interpolated.
  1660. // value_to_interpolate[0] - The value from the first point (for example the point bitmap_x coord)
  1661. // value_to_interpolate[1] - The value from the second point
  1662. //
  1663. // double polygon_plane[4] - the polygon plane. Use STATE_polygon_get_plane() to get it.
  1664. //
  1665. // double result_equation[4] - Through this argument the computed equation is returned.
  1666. //
  1667. //Example, 
  1668. //Lets say that we have a polygon and a point x,y,z on the plane of the polygon. We want
  1669. //to know what should be the point bm_x,bm_y values.
  1670. //Using this function we can build an equation that given any x,y,z it will return the 
  1671. //appropriate bm_x of that point. To build the equation we need to take three points of the polygon
  1672. //and their bm_x values. 
  1673. // xyz_of_3_points[0][0]=1 ; //X value of first point
  1674. // xyz_of_3_points[0][1]=2; //Y value of first point
  1675. // xyz_of_3_points[0][2]=3; //Z value of first point
  1676. //
  1677. // xyz_of_3_points[1][0]=4 // X value of second point
  1678. // and so on for the three points....
  1679. //
  1680. // value_to_interpolate[0]=0 ; // bm_x value of the first point
  1681. // value_to_interpolate[1]=1 ; // bm_x value of the second point
  1682. // value_to_interpolate[2]=0 ; // bm_x value of the third point
  1683. //
  1684. // double polygon_plane[4];
  1685. // STATE_polygon_get_plane(my_polygon, polygon_plane); //getting the polygon plane
  1686. //
  1687. // double result_equation[4];
  1688. // int equation_type;
  1689. // equation_type=STATE_math_calculate_polygon_interpolation_equation(xyz_of_3_points, value_to_interpolate, polygon_plane, result_equation);
  1690. // 
  1691. // //We have now created an equation for interpolating the bitmap_x coordinate over our polygon.
  1692. // //The equation_type and the result_equation are like a black box for us.
  1693. //
  1694. // Now lets use the equation and calculate the bitmap_x coordinate in the point x,y,z (that should be on the polygon plane)
  1695. // double xyz[3]= {1,2,3}  //a point on the polygon's plane
  1696. // double bitmap_x=STATE_math_get_interpolated_value_using_equation(xyz, result_equation, equation_type);
  1697. // 
  1698. // Note that for getting the bitmap_y coord of the same point we need to build another equation for the bitmap_y values.
  1699. STATE_IMPORT int STATE_WINAPI STATE_math_calculate_polygon_interpolation_equation(double xyz_of_3_points[3][3], double value_to_interpolate[3], double polygon_plane[4], double result_equation[4]);
  1700. //Returns the interpolated value according to the given equation.
  1701. //Before using this function one must construct an equation for the polygon using STATE_math_calculate_polygon_interpolation_equation
  1702. // double xyz[3]
  1703. // A point on the polygon plane that we want get the interpolated value.
  1704. // double equation[4]
  1705. // The equation as was calculated by STATE_math_calculate_polygon_interpolation_equation()
  1706. // The meaning of this equation should not concern the user.
  1707. // int equation_type
  1708. // The equation_type as was returned by STATE_math_calculate_polygon_interpolation_equation()
  1709. // This is also used for internal purposes and should have no meaning for the user.
  1710. STATE_IMPORT double STATE_WINAPI STATE_math_get_interpolated_value_using_equation(double xyz[3], double equation[4], int equation_type);
  1711. //-----------------------------------------------------//
  1712. //======== T H E    P R O F I L E R   A P I =============//
  1713. //-----------------------------------------------------//
  1714. // One of the most important issue in many applications that use 3D graphics
  1715. // is Performances.
  1716. // This API makes it extremely easy to time any function (not just STATE's functions)
  1717. // using two macros.
  1718. // Here is an example of how to do it.
  1719. //
  1720. // STATE_START_TAKING_TIME("2d point to 3D"); //The text that is given here will appear in the log file profiling summary // any_function_that_you_would_like_to_time(...); //calling the function that we want to time // STATE_STOP_TAKING_TIME(); // // Note that the result of the profiling will be written automatically // to the log file (look for the file log.log in your executable working directory) // Note also that these macros will only work in C++, when writing in C // do this instead: // //   static int time_id=-1; // time_id=STATE_profiler_start_measuring(time_id,"some text"); // any_function_that_you_would_like_to_time(...); //calling the function that we want to time (you can any function not just functions of STATE) // STATE_profiler_end_measuring(time_id); STATE_IMPORT int STATE_WINAPI STATE_profiler_start_measuring(int time_id, char *name); STATE_IMPORT void STATE_WINAPI STATE_profiler_end_measuring(int time_id); #define STATE_START_TAKING_TIME(name) {   static int time_id=-1;   time_id=STATE_profiler_start_measuring(time_id, name); #define STATE_STOP_TAKING_TIME() STATE_profiler_end_measuring(time_id); } //-----------------------------------------------------// //========   H E L P   A P P E N D I C E S  ===========// //-----------------------------------------------------// // The *.flt file format // --------------------- /* example *.flt file: 255 255 0 4000 3  30000 3 20000 In the first line there is the RGB of the transparent color ( actually it is BGR the blue comes first then the green the the red). In the second line there is the  scope/interval of the transparent color in other words if we do distance=(r1-r2)^2 + (g1-g2)^2 + (b1-b2)^2 when ^2 means  the power two. r1,g1,b1 is the transparent color rgb (r2,g2,b2) is a color from the bitmap. we now define how close this  color can be to the transparent color In the third line and till the end there are 2 integers in each line; lets call them n and d after this program converts all the colors that are near the transparent. We make another round where we take all the colors that have n transparent neighbors and convert them to transparent this time we allowed a the distance to be up to d if there is no third line it is also OK (it wont do a second path) the next lines are similar to the third line each additional line will cause another filtering pass); */ #ifdef __cplusplus } #endif #endif STATE_H