#include "editor.h" #include "../render/gl_2d_font.h" #include "../game/objlist.h" #include "../game/world/draw.h" #include "../game/world/bsp_draw.h" #include "../game.h" const I32 EDITORVIEW_TITLE_OFFSET = 15; const I32 EDITORVIEW_TOOLBAR_OFFSET = 20; void gui_editor_3dview_draw_showpos( GUI_EDITOR_3DVIEW* view ) { I32 x = gui_relx( view ); I32 y = gui_rely( view ) + EDITORVIEW_TITLE_OFFSET; VEC3 pos = objl->pl->pos; F32 speed = vec_len( objl->pl->velocity ); STR posstr = STR( "pos: %.02f %.02f %.02f (%.02f)", pos.x, pos.y, pos.z, speed ); STR rotstr = STR( "rot: %.02f %.02f", objl->pl->rot.y, objl->pl->rot.x ); VEC2 posdim = gl_font_dim( _gui.fonts.jpn12.glfnt, posstr ); VEC2 rotdim = gl_font_dim( _gui.fonts.jpn12.glfnt, rotstr ); gl_font_draw( _gui.fonts.jpn12.glfnt, _gui.batch->shader, VEC2( x + view->w - 2 - posdim.x, y + 2 ), posstr, ui_clr.txt ); gl_font_draw( _gui.fonts.jpn12.glfnt, _gui.batch->shader, VEC2( x + view->w - 2 - rotdim.x, y + 18 ), rotstr, ui_clr.txt ); if( input.mouselock ) { gl_font_draw( _gui.fonts.jpn12.glfnt, _gui.batch->shader, VEC2( x + 2, y + 2 ), "[capturing mouse]", ui_clr.txt ); } } struct WORLD_DRAW_CB_DATA { VEC2 wnd; VEC2 winsize; GUI_EDITOR_3DVIEW* view; }; void gui_editor_3dview_draw_fn( void* ptr ) { GUI_EDITOR_3DVIEW* view = (GUI_EDITOR_3DVIEW*)ptr; if( !editor || !editor->map || !objl->pl ) return; I32 x = gui_relx( view ); I32 y = gui_rely( view ); gui_draw_str( x, y, ALIGN_L, FNT_JPN12, ui_clr.txt, "3d view" ); y += EDITORVIEW_TITLE_OFFSET; VEC2 wnd = { (F32)x, (F32)y }; VEC2 winsize = { (F32)view->w, (F32)view->h }; static WORLD_DRAW_CB_DATA data; data = { wnd, winsize, view }; CLR col = gui_is_fg_window( view )? ui_clr.border : ui_clr.border_inactive; gui_draw_frect( x-1, y-1, view->w+2, view->h+2, col ); gui_draw_frect( x, y, view->w, view->h, CLR::BLACK() ); if( editor->drawbsp && editor->map->bsp ) { gui_push_callback( &data, fn( void* data ) { WORLD_DRAW_CB_DATA* d = (WORLD_DRAW_CB_DATA*)data; bsp_draw( editor->map->bsp, editor->game, d->wnd, d->winsize ); gui_editor_3dview_draw_showpos( d->view); } ); } else { gui_push_callback( &data, fn( void* data ) { WORLD_DRAW_CB_DATA* d = (WORLD_DRAW_CB_DATA*)data; world_draw( editor->game, objl->world, d->wnd, d->winsize ); gui_editor_3dview_draw_showpos( d->view ); } ); } gui_draw_push_clip( x, y, view->w, view->h ); view->children.each( fn( GUI_BASE** childptr ) { GUI_BASE* child = *childptr; if( !child->enabled ) return; if( child->draw_fn ) child->draw_fn( child ); else dlog( "gui_view_draw_fn(): child %p no draw_fn\n", child ); } ); gui_draw_pop_clip(); } void gui_editor_3dview_input_fn( void* ptr ) { GUI_EDITOR_3DVIEW* view = (GUI_EDITOR_3DVIEW*)ptr; if( !editor || !editor->map ) return; if( !input.mouselock ) gui_base_input_fn( view ); if( !objl->pl ) return; if( input.mouse.left ) { I32 view_x = gui_relx( view ); I32 view_y = gui_rely( view ) + EDITORVIEW_TITLE_OFFSET; if( input.mouse.pos.x >= view_x && input.mouse.pos.x < view_x + view->w && input.mouse.pos.y >= view_y && input.mouse.pos.y < view_y + view->h - EDITORVIEW_TOOLBAR_OFFSET ) { if( !input.mouselock && !view->heldoutbounds ) input_capture_mouse( 1 ); } else { view->heldoutbounds = 1; } } else view->heldoutbounds = 0; game_on_tick( editor->game ); } void gui_editor_3dview_create_toolbar( GUI_EDITOR_3DVIEW* view ) { GAME_EDITOR* e = editor; I32 x = 1, y = view->h - 4; gui_button( x, y, 90, 18, "compile bsp", pfn( void* b ) { if( !editor || !editor->map ) return; if( editor->map->bsp ) bsp_free( editor->map->bsp ); bsp_build_map( editor->map ); } ); x += 100; gui_checkbox( x, y, "draw bsp", &e->drawbsp ); } GUI_EDITOR_3DVIEW* gui_editor_3dview( I32 x, I32 y, I32 w, I32 h ) { GUI_EDITOR_3DVIEW* view = new GUI_EDITOR_3DVIEW; view->x = x; view->y = y; view->xbound = view->w = w; view->h = h; view->ybound = h + EDITORVIEW_TITLE_OFFSET; view->draw_fn = gui_editor_3dview_draw_fn; view->input_fn = gui_editor_3dview_input_fn; strcpy( view->name, "EDITOR_3D_VIEW" ); GUI_BASE* parent = gui_get_view(); if( !parent ) parent = gui_get_window(); parent->children.push( view ); view->parent = parent; gui_set_view( view ); gui_editor_3dview_create_toolbar( view ); gui_set_view( (GUI_VIEW*)parent ); return view; }