RayTracing.cpp
上传用户:lhwx1029
上传日期:2013-03-07
资源大小:1173k
文件大小:7k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. #include "RayTracing.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <stdarg.h>                         /* var arg stuff */
  5. #include "Trace.h"
  6. #include "Colour.h"
  7. #include "Graphics.h"
  8. #include "data.h"
  9. #include "Vector.h"
  10. #include <string.h>
  11. //extern int main(int n,char **o);            /* real main (well...) */
  12. int HW_cmd_show;
  13. HINSTANCE HW_instance;
  14. char HW_class_name[] = "RayTracing windows";
  15. HWND HW_wnd;                                /* window */
  16. HPALETTE HW_palette;                        /* the palette headers */
  17. HDC HW_mem;
  18. HBITMAP HW_bmp;
  19. RECT HW_rect;
  20. #if defined(_RGB_)                          /* paths to data sets */
  21.  #if defined(_32BPP_)
  22. char path[128]="";
  23.  #endif
  24. #endif
  25. struct TR_world *w;
  26. void HWI_null_function(void) {}
  27. void (*HW_application_main)(void) = HWI_null_function;
  28. void (*HW_application_key_handler)(int key_code);
  29. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
  30. /**********************************************************
  31.  * Quiting with a message.                                *
  32. **********************************************************/
  33. #define HW_MAX_ERROR_MESSAGE 256
  34. void HW_error(char *s,...)
  35. {
  36. char str[HW_MAX_ERROR_MESSAGE];
  37. va_list lst;
  38. va_start(lst,s);
  39. vsprintf(str,s,lst);                       /* forming the message */
  40. va_end(lst);
  41. MessageBox(NULL,str,"3D RayTracing",MB_OK|MB_ICONSTOP|MB_SYSTEMMODAL);
  42. HW_close_event_loop();
  43. exit(0);                                   /* above might not be enough */
  44. }
  45. /**********************************************************
  46.  * Quitting the event loop.                               *
  47. **********************************************************/
  48. void HW_close_event_loop(void)
  49. {
  50.  PostMessage(HW_wnd,WM_CLOSE,0,0L);         /* telling ourselves to quit */
  51. }
  52. /**********************************************************
  53.  * Implementations for fast memory fill.                  *
  54. **********************************************************/
  55. void HW_set_int(int *d,long l,int v)
  56. {
  57.  long i;
  58.  for(i=0;i<l;i++) *d++=v;
  59. }
  60. ///////////////////////////////////////////////////////////////////////////////
  61. ///////////////////////////////////////////////////////////////////////////////
  62. #define HW_MAX_CLINE_OPTIONS 20
  63. int WINAPI WinMain(HINSTANCE hInstance, 
  64.    HINSTANCE hPrevInstance,
  65.    LPSTR lpCmdLine, 
  66.    int nShowCmd )
  67. {
  68. WNDCLASS w;
  69. int n;
  70. char *start,*end;
  71. char *o[HW_MAX_CLINE_OPTIONS];
  72. HW_cmd_show = nShowCmd;
  73. if ((HW_instance = hPrevInstance) == NULL) 
  74. {
  75. w.style = CS_HREDRAW|CS_VREDRAW;
  76. w.lpfnWndProc = WndProc;
  77. w.cbClsExtra = 0;
  78. w.cbWndExtra = 0;
  79. w.hInstance = hInstance;
  80. w.hIcon = NULL;
  81. w.hCursor = NULL;
  82. w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  83. w.lpszMenuName = NULL;
  84. w.lpszClassName = HW_class_name;
  85. if (!RegisterClass(&w)) 
  86. {
  87. return FALSE;
  88. }
  89. }
  90. n = 0;
  91. o[n++] = "";
  92. start = lpCmdLine;
  93. while ((end = strchr(start, ' ')) != NULL) 
  94. {
  95. if (n >= HW_MAX_CLINE_OPTIONS)
  96. {
  97. HW_error("(RayTracing windows) Way too many command line options.n");
  98. }
  99. if (end != start)
  100. {
  101. o[n++] = start;
  102. }
  103. *end = 0;
  104. start = end + 1;
  105. }
  106. if (strlen(start) > 0)
  107. {
  108. o[n++] = start;
  109. }
  110. return(main(n,0));
  111. }
  112. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  113. {
  114. switch(message) 
  115. {
  116. case WM_PAINT: 
  117. HW_application_main();
  118. break;
  119. case WM_ERASEBKGND:
  120. return(1L); 
  121. break;
  122. case WM_DESTROY:
  123. PostQuitMessage(0);
  124. break;
  125. case WM_KEYDOWN:
  126. HW_application_key_handler(wParam);
  127. break;
  128. default:
  129. return(DefWindowProc(hWnd,message,wParam,lParam));
  130. }
  131. return(0L);
  132. }
  133. /**********************************************************
  134.  * Creating a window.                                     *
  135. **********************************************************/
  136. #if defined(_RGB_)
  137. void HW_init_screen(char *display_name,
  138.                     char *screen_name
  139.                    )
  140. #endif
  141. {
  142. PAINTSTRUCT ps;
  143. int i,remap;
  144. HW_wnd = CreateWindow(HW_class_name,
  145. screen_name,
  146. WS_SYSMENU,
  147. CW_USEDEFAULT,
  148. CW_USEDEFAULT,
  149. HW_SCREEN_X_SIZE,
  150. HW_SCREEN_Y_SIZE+GetSystemMetrics(SM_CYCAPTION),
  151. NULL,
  152. NULL,
  153. HW_instance,
  154. NULL);
  155. HW_mem=CreateCompatibleDC(BeginPaint(HW_wnd,&ps));
  156. if(((GetDeviceCaps(ps.hdc,PLANES))!=1)||
  157. ((GetDeviceCaps(ps.hdc,BITSPIXEL))!=sizeof(HW_pixel)*8)
  158. )
  159. //HW_error("%d",(GetDeviceCaps(ps.hdc,BITSPIXEL)));
  160. HW_error("(Hardware) I'd rather have %d bit screen.",
  161.    sizeof(HW_pixel)*8
  162.   );
  163. HW_bmp=CreateCompatibleBitmap(ps.hdc,HW_SCREEN_X_SIZE,HW_SCREEN_Y_SIZE);
  164. SelectObject(HW_mem,HW_bmp);
  165. EndPaint(HW_wnd,&ps);
  166. HW_rect.left=HW_rect.top=0;
  167. //窗口的大小
  168. HW_rect.right=HW_SCREEN_X_SIZE;
  169. HW_rect.bottom=HW_SCREEN_Y_SIZE;
  170. ShowWindow(HW_wnd,HW_cmd_show);            /* generate messages */
  171. UpdateWindow(HW_wnd);
  172. }
  173. //////////////////////////////////////////////////////////////////////////////////
  174. /**********************************************************
  175.  * Rendering the bitmap into the window.                  *
  176. **********************************************************/
  177. //复制图像位图到物理设备存储器
  178. void HW_blit(void)
  179. {
  180. PAINTSTRUCT ps;
  181. //
  182. BeginPaint(HW_wnd,&ps);
  183. SelectPalette(ps.hdc,HW_palette,FALSE);
  184. RealizePalette(ps.hdc);
  185. SetMapMode(ps.hdc,MM_TEXT);
  186. SetBitmapBits(HW_bmp,G_c_buffer_size*sizeof(HW_pixel),G_c_buffer);
  187. BitBlt(ps.hdc,0,0,HW_SCREEN_X_SIZE,HW_SCREEN_Y_SIZE,HW_mem,0,0,SRCCOPY);
  188. EndPaint(HW_wnd,&ps);
  189. }
  190. void app_main(void)                         /* rendering loop */
  191. {
  192. //光线跟踪场景中设置摄像机
  193. TR_set_camera(0,0,500, 0,0,0, 1,0,0, 0,1,0);
  194. //TR_set_camera(0,0,900, 0,0,0, 1,0,0, 0,1,0);
  195. //关键中的关键,光线跟踪窗口中的pixel
  196. TR_trace_world(w,10);
  197. G_text(10,10,"<enter-exit>",
  198. CL_colour(CL_COLOUR_LEVELS-1,CL_COLOUR_LEVELS-1,CL_COLOUR_LEVELS-1),
  199. CL_LIGHT_LEVELS-1,CL_LIGHT_LEVELS-1,CL_LIGHT_LEVELS-1);
  200. HW_blit();
  201. }
  202. void app_handler(int kk)                    /* event handler */
  203. {
  204. HW_close_event_loop();
  205. }
  206. void HW_close_screen(void)
  207. {
  208. DeleteDC(HW_mem);
  209. DeleteObject(HW_bmp);
  210. }
  211. int main(int n, char **o)
  212. {
  213. char *display;
  214. if (n == 2) 
  215. display = o[1];
  216. else
  217. display = NULL;
  218. strcat(path,"tracer.dat");
  219. w = (struct TR_world *)D_data(path);
  220. CL_init_colour();
  221. TR_init_rendering(TR_SPECULAR|TR_SHADOW|TR_REFLECT);
  222. TR_init_world(w);
  223. G_init_graphics();
  224. HW_init_screen(display,"3D RayTracing");
  225. HW_init_event_loop(app_main,app_handler);
  226. HW_close_screen();
  227. return(1);
  228. }
  229. /**********************************************************
  230.  * Running the event loop.                                *
  231. **********************************************************/
  232. //事件循环函数,第一个函数指针被不停执行,第二个响应外部时间
  233. void HW_init_event_loop(void (*application_main)(void),
  234.                         void (*application_key_handler)(int key_code)
  235.                        )
  236. {
  237. MSG msg;
  238. HW_application_main=application_main;
  239. HW_application_key_handler=application_key_handler;
  240. while(1)
  241. {
  242. if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))  /* this IS sensitive part! */
  243. {
  244. if(msg.message == WM_QUIT) break;
  245. TranslateMessage(&msg);
  246. DispatchMessage(&msg);
  247. }
  248. else
  249. {
  250. InvalidateRect(HW_wnd,&HW_rect,TRUE);
  251. UpdateWindow(HW_wnd);
  252. }
  253. }
  254. }