1 /* 2 Copyright (c) 2005-2021 Intel Corporation 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 #include "oneapi/tbb/global_control.h" 18 19 #include "seismic_video.hpp" 20 #include "universe.hpp" 21 22 const char *const SeismicVideo::titles[2] = { "Seismic Simulation: Serial", 23 "Seismic Simulation: Parallel" }; 24 void SeismicVideo::on_mouse(int x, int y, int key) { 25 if (key == 1) { 26 u_.TryPutNewPulseSource(x, y); 27 } 28 } 29 30 void SeismicVideo::on_key(int key) { 31 key &= 0xff; 32 if (char(key) == ' ') 33 initIsParallel = !initIsParallel; 34 else if (char(key) == 'p') 35 initIsParallel = true; 36 else if (char(key) == 's') 37 initIsParallel = false; 38 else if (char(key) == 'e') 39 updating = true; 40 else if (char(key) == 'd') 41 updating = false; 42 else if (key == 27) 43 running = false; 44 title = titles[initIsParallel ? 1 : 0]; 45 } 46 47 void SeismicVideo::on_process() { 48 oneapi::tbb::global_control c(oneapi::tbb::global_control::max_allowed_parallelism, 49 threadsHigh); 50 for (int frames = 0; numberOfFrames_ == 0 || frames < numberOfFrames_; ++frames) { 51 if (initIsParallel) 52 u_.ParallelUpdateUniverse(); 53 else 54 u_.SerialUpdateUniverse(); 55 if (!next_frame()) 56 break; 57 } 58 } 59 60 #if defined(_WINDOWS) && !defined(_CONSOLE) 61 #include "resource.hpp" 62 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 63 SeismicVideo *gVideo = nullptr; 64 #endif 65 66 SeismicVideo::SeismicVideo(Universe &u, 67 int number_of_frames, 68 int threads_high, 69 bool init_is_parallel) 70 : numberOfFrames_(number_of_frames), 71 initIsParallel(init_is_parallel), 72 u_(u), 73 threadsHigh(threads_high) { 74 title = titles[initIsParallel ? 1 : 0]; 75 #if defined(_WINDOWS) && !defined(_CONSOLE) 76 gVideo = this; 77 LoadStringA(video::win_hInstance, IDC_SEISMICSIMULATION, szWindowClass, MAX_LOADSTRING); 78 memset(&wcex, 0, sizeof(wcex)); 79 wcex.lpfnWndProc = (WNDPROC)WndProc; 80 wcex.hIcon = LoadIcon(video::win_hInstance, MAKEINTRESOURCE(IDI_SEISMICSIMULATION)); 81 wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); 82 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 83 wcex.lpszMenuName = LPCTSTR(IDC_SEISMICSIMULATION); 84 wcex.lpszClassName = szWindowClass; 85 wcex.hIconSm = LoadIcon(video::win_hInstance, MAKEINTRESOURCE(IDI_SMALL)); 86 win_set_class(wcex); // ascii convention here 87 win_load_accelerators(IDC_SEISMICSIMULATION); 88 #endif 89 } 90 91 #if defined(_WINDOWS) && !defined(_CONSOLE) 92 93 // FUNCTION: WndProc(HWND, unsigned, WORD, LONG) 94 95 // PURPOSE: Processes messages for the main window. 96 97 // WM_COMMAND - process the application menu 98 // WM_PAINT - Paint the main window 99 // WM_DESTROY - post a quit message and return 100 101 LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { 102 switch (message) { 103 case WM_INITDIALOG: return TRUE; 104 case WM_COMMAND: 105 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { 106 EndDialog(hDlg, LOWORD(wParam)); 107 return TRUE; 108 } 109 break; 110 } 111 return FALSE; 112 } 113 114 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { 115 int wmId; 116 switch (message) { 117 case WM_COMMAND: 118 wmId = LOWORD(wParam); 119 // Parse the menu selections: 120 switch (wmId) { 121 case IDM_ABOUT: 122 DialogBox( 123 video::win_hInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)About); 124 break; 125 case IDM_EXIT: PostQuitMessage(0); break; 126 case ID_FILE_PARALLEL: gVideo->on_key('p'); break; 127 case ID_FILE_SERIAL: gVideo->on_key('s'); break; 128 case ID_FILE_ENABLEGUI: gVideo->on_key('e'); break; 129 case ID_FILE_DISABLEGUI: gVideo->on_key('d'); break; 130 default: return DefWindowProc(hWnd, message, wParam, lParam); 131 } 132 break; 133 default: return DefWindowProc(hWnd, message, wParam, lParam); 134 } 135 return 0; 136 } 137 138 #endif 139