// EngWind.cpp // Guy Simmons, 27th July 1998. #include #include #include #include #include #include "resource.h" #include "fmatrix.h" #include "inline.h" #include "gi.h" #include "MapView.h" #include "Mission.h" #include "WayWind.h" //--------------------------------------------------------------- extern int waypoint_colour, waypoint_group; extern volatile BOOL ShellActive; extern CBYTE *GEDIT_engine_name; extern UBYTE button_colours[][3]; extern HCURSOR GEDIT_arrow; extern HICON GEDIT_app_icon; extern HINSTANCE GEDIT_hinstance; extern HMENU GEDIT_main_menu; extern HWND GEDIT_client_wnd, GEDIT_edit_wnd, GEDIT_engine_wnd, GEDIT_frame_wnd; extern WNDCLASSEX GEDIT_class_engine; //void GI_init(); //SLONG GI_load_map(CBYTE *name); //--------------------------------------------------------------- void calc_camera_pos(void) { FMATRIX_calc( cam_matrix, cam_yaw, cam_pitch, 0 ); cam_x = cam_focus_x; cam_y = 0x100; // PAP_calc_height_at(LEDIT_cam_focus_x, LEDIT_cam_focus_z) + 0x100; cam_z = cam_focus_z; cam_x -= MUL64(cam_matrix[6], cam_focus_dist); cam_y -= MUL64(cam_matrix[7], cam_focus_dist); cam_z -= MUL64(cam_matrix[8], cam_focus_dist); FMATRIX_vector ( cam_forward, cam_yaw, 0 ); FMATRIX_vector ( cam_left, (cam_yaw + 512) & 2047, 0 ); } /* //--------------------------------------------------------------- // WindProc for engine window. LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK engine_proc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { SLONG colour; EventPoint *new_event; HDC hdc; HRESULT result; PAINTSTRUCT ps; POINT client_pos; RECT dst, src; static HWND hclient_wnd, hframe_wnd; switch(message) { case WM_CREATE: // Default setup for map view. cam_focus_x = 64 << 8; cam_focus_z = 64 << 8; cam_focus_dist = 14 << 8; cam_pitch = 1700; cam_yaw = 0; calc_camera_pos(); GI_render_view_into_backbuffer ( cam_x, cam_y, cam_z, cam_yaw, cam_pitch, 0 ); // Save important window handles. hclient_wnd = GetParent(hWnd); hframe_wnd = GetParent(hclient_wnd); return 0; case WM_KEYDOWN: case WM_KEYUP: KeyboardProc(message,wParam,lParam); return 0; case WM_PAINT: hdc = BeginPaint(hWnd,&ps); client_pos.x = 0; client_pos.y = 0; ClientToScreen(hWnd,&client_pos); GetClientRect(hWnd,&src); dst = src; OffsetRect(&dst,client_pos.x,client_pos.y); // Set the clipper. result = the_display.lp_DD_Clipper->SetHWnd(0,hWnd); // Blit the engine. result = the_display.lp_DD_FrontSurface->Blt(&dst,the_display.lp_DD_BackSurface,&src,DDBLT_WAIT,0); EndPaint(hWnd,&ps); return 0; case WM_LBUTTONDOWN: if(map_valid && mouse_valid) { colour = (button_colours[waypoint_colour][0]<<16) | (button_colours[waypoint_colour][1]<<8) | (button_colours[waypoint_colour][2]); new_event = MISSION_create_eventpoint(); if(new_event) { new_event->X = mouse_world_x; new_event->Y = mouse_world_y; new_event->Z = mouse_world_z; new_event->Colour = waypoint_colour; new_event->Group = waypoint_group; } } return 0; } return DefMDIChildProc(hWnd,message,wParam,lParam); } //--------------------------------------------------------------- BOOL init_ewind(void) { DWORD style, style_ex; RECT engine_rect; // Sneakily pretend that this was the window created by SetupHost! // hDDLibWindow = GEDIT_frame_wnd; hDDLibWindow = GEDIT_edit_wnd; ShellActive = TRUE; // Open this display using our engine window. if(OpenDisplay(640,480,16,FLAGS_USE_3D) != 0) return FALSE; // Couldn't open the display. // Create engine window class. GEDIT_class_engine.cbSize = sizeof(WNDCLASSEX); GEDIT_class_engine.style = CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW; GEDIT_class_engine.lpfnWndProc = engine_proc; GEDIT_class_engine.cbClsExtra = 0; GEDIT_class_engine.cbWndExtra = sizeof(HANDLE); GEDIT_class_engine.hInstance = GEDIT_hinstance; GEDIT_class_engine.hIcon = GEDIT_app_icon; GEDIT_class_engine.hCursor = GEDIT_arrow; GEDIT_class_engine.hbrBackground = GetStockObject(LTGRAY_BRUSH); GEDIT_class_engine.lpszMenuName = NULL; GEDIT_class_engine.lpszClassName = GEDIT_engine_name; GEDIT_class_engine.hIconSm = GEDIT_app_icon; if(!RegisterClassEx(&GEDIT_class_engine)) return FALSE; // Couldn't register the class. return TRUE; } //--------------------------------------------------------------- void fini_ewind(void) { GI_fini(); // CloseDisplay(); DestroyWindow(GEDIT_engine_wnd); UnregisterClass(GEDIT_engine_name, GEDIT_hinstance); } //--------------------------------------------------------------- BOOL open_map(MDICREATESTRUCT *mdi_create) { CBYTE w_name[_MAX_PATH]; DWORD style; RECT engine_rect; // Do a bodge load of the map. GI_init(); map_valid = GI_load_map(map_name); if(map_valid) { // The standard styles for an MDI child window. style = WS_CHILD |WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX; // Set the client rect size. SetRect(&engine_rect,0,0,640,480); AdjustWindowRect( &engine_rect, style, FALSE ); // The window name. sprintf(w_name,"Map - %s",map_name); // Set up the MDI Create structure. mdi_create->szClass = GEDIT_engine_name; mdi_create->szTitle = map_name; mdi_create->hOwner = GEDIT_hinstance; mdi_create->x = CW_DEFAULT; mdi_create->y = CW_DEFAULT; mdi_create->cx = engine_rect.right - engine_rect.left; mdi_create->cy = engine_rect.bottom - engine_rect.top; mdi_create->style = 0; mdi_create->lParam = 0; return TRUE; } return FALSE; } //--------------------------------------------------------------- #define SCROLL_RATE 4 #define ZOOM_RATE 4 #define YAW_RATE 1 #define PITCH_RATE 1 void process_ewind(void) { ULONG colour; SLONG df,dl,dy,dp,dd, dist,dx,dz; EventPoint *current_epoint; POINT mouse; RECT client_rect; if(map_valid) { calc_camera_pos(); df = 0; dl = 0; dd = 0; dy = 0; dp = 0; if(Keys[KB_LEFT ]) {dl += SCROLL_RATE; } if(Keys[KB_RIGHT]) {dl -= SCROLL_RATE; } if(Keys[KB_UP ]) {df += SCROLL_RATE; } if(Keys[KB_DOWN ]) {df -= SCROLL_RATE; } if(Keys[KB_HOME ]) {dd -= ZOOM_RATE; } if(Keys[KB_END ]) {dd += ZOOM_RATE; } if(Keys[KB_DEL ]) {dy -= YAW_RATE; } if(Keys[KB_PGDN ]) {dy += YAW_RATE; } if(Keys[KB_INS ]) {dp -= PITCH_RATE; } if(Keys[KB_PGUP ]) {dp += PITCH_RATE; } // Are we moving? if(ShiftFlag) { dl <<= 2; df <<= 2; dd <<= 2; dy <<= 2; dp <<= 2; } // Update position. cam_focus_x += df * cam_forward[0] >> 12; cam_focus_z += df * cam_forward[2] >> 12; cam_focus_x += dl * cam_left[0] >> 12; cam_focus_z += dl * cam_left[2] >> 12; cam_focus_dist += dd * 16; cam_yaw += dy * 16; cam_pitch += dp * 16; cam_yaw &= 2047; cam_pitch &= 2047; calc_camera_pos(); // Draw the engine. GI_render_view_into_backbuffer ( cam_x, cam_y, cam_z, cam_yaw, cam_pitch, 0 ); // Get mouse position relative to engine window. GetCursorPos(&mouse); ScreenToClient(GEDIT_engine_wnd,&mouse); GetClientRect(GEDIT_engine_wnd,&client_rect); // Draw all waypoints within a certain distance of the camera. current_epoint = used_epoints; while(current_epoint) { dx = current_epoint->X - cam_x; dz = current_epoint->Z - cam_z; dist = QDIST2(abs(dx),abs(dz)); if(dist < (20 << 8)) { // Draw it. colour = (button_colours[current_epoint->Colour][0]<<16) | (button_colours[current_epoint->Colour][1]<<8) | (button_colours[current_epoint->Colour][2]); GI_waypoint_draw ( mouse.x, mouse.y, current_epoint->X, current_epoint->Y + 0x100, current_epoint->Z, colour, 0 ); } current_epoint = current_epoint->Next; } // Is the mouse in the engine window? if(PtInRect(&client_rect,mouse)) { mouse_over = 0; mouse_valid = GI_get_pixel_world_pos ( mouse.x, mouse.y, &mouse_world_x, &mouse_world_y, &mouse_world_z ); } else { mouse_valid = 0; } if(mouse_valid) { colour = (button_colours[waypoint_colour][0]<<16) | (button_colours[waypoint_colour][1]<<8) | (button_colours[waypoint_colour][2]); GI_waypoint_draw ( mouse.x, mouse.y, mouse_world_x, mouse_world_y + 0x100, mouse_world_z, colour, 0 ); } InvalidateRect(GEDIT_engine_wnd, NULL, FALSE); } } //--------------------------------------------------------------- */