diff options
Diffstat (limited to 'src/editor/properties.cpp')
| -rw-r--r-- | src/editor/properties.cpp | 105 |
1 files changed, 75 insertions, 30 deletions
diff --git a/src/editor/properties.cpp b/src/editor/properties.cpp index 0cc0e56..a9835e4 100644 --- a/src/editor/properties.cpp +++ b/src/editor/properties.cpp @@ -71,6 +71,28 @@ void gui_editor_propview_select( GUI_EDITOR_PROPVIEW* view, void* what, U8 selty sel.seltype = EDITOR_SELECT_WALL; } + if( seltype == EDITOR_SELECT_PVERTEX ) { + for( auto& it : view->curselect ) { + if( it.seltype == EDITOR_SELECT_POLY ) { + MAP_POLYGON* p = (MAP_POLYGON*)it.obj; + I32 i = p->vertices.idx_where( fn( MAP_VERTEX* v ) { return v == sel.obj; } ); + if( i != -1 ) + return; + } + } + } + + if( seltype == EDITOR_SELECT_POLY ) { + MAP_POLYGON* p = (MAP_POLYGON*)sel.obj; + for( auto& it : view->curselect ) { + if( it.seltype == EDITOR_SELECT_PVERTEX ) { + I32 i = p->vertices.idx_where( fn( MAP_VERTEX* v ) { return v == sel.obj; } ); + if( i != -1 ) + view->curselect.erase( i ); + } + } + } + if( view->curselect.idx_where( fn( PROPSELECT* p ) { return p->obj == sel.obj; } ) != -1 ) return; @@ -144,9 +166,9 @@ struct TEXBTN_CB { GL_TEX2D** texp; }; -void gui_editor_propview_create_eobj_prop_ro( GUI_EDITOR_PROPVIEW* view, EDITOR_PROP* prop, I32* x, I32* y, I32 w, I32 space ); +void gui_editor_propview_create_eobj_prop_ro( GUI_EDITOR_PROPVIEW* view, EDITOR_PROP* prop, I32* x, I32* y, I32 w, I32 space, U8 val = 1 ); void gui_editor_propview_create_eobj_props( GUI_EDITOR_PROPVIEW* view, EOBJECT* e, I32* x, I32* y, I32 w ); -void gui_editor_propview_create_eobj_prop( GUI_EDITOR_PROPVIEW* view, EDITOR_PROP* prop, I32* x, I32* y, I32 w, I32 space ) { +void gui_editor_propview_create_eobj_prop( GUI_EDITOR_PROPVIEW* view, EDITOR_PROP* prop, I32* x, I32* y, I32 w, I32 s, U8 val = 1 ) { F32 action_x = propview_action_x( view ); I32 action2_x = propview_action2_x( view ); const char* n = prop->displayname; @@ -159,32 +181,34 @@ void gui_editor_propview_create_eobj_prop( GUI_EDITOR_PROPVIEW* view, EDITOR_PRO switch( prop->type ) { case EPROP_F32: { GUI_FLOATINPUT* in = gui_floatinput( *x, *y, w, n, (F32*)eprop_ptr( prop ), min, max, step ); + in->drawval = val; in->cb = pfn( void* ptr ) { GUI_FLOATINPUT* fin = (GUI_FLOATINPUT*)ptr; gui_editor_propview_sync_props_fdiff( editor->gui.props, (EDITOR_PROP*)fin->cbextra, &fin->lastchange, 1 ); }; in->cbextra = prop; - *y += (space+18); + *y += (s+18); } break; case EPROP_VEC2: case EPROP_VEC3: case EPROP_VEC4: { U32 c = prop->type - EPROP_VEC2 + 2; - GUI_VECTORINPUT* in = gui_vectorinput( *x, *y, w, n, (F32*)eprop_ptr( prop ), c, min, max, step, "xyzw", c == 2 ? "%.03f" : "%0.02f" ); + GUI_VECTORINPUT* in = gui_vectorinput( *x, *y, w, n, (F32*)eprop_ptr( prop ), c, min, max, step, "xyzw", c == 2 ? "%.03f" : "%0.02f", val ); in->cb = pfn( void* ptr ) { GUI_VECTORINPUT* vin = (GUI_VECTORINPUT*)ptr; gui_editor_propview_sync_props_fdiff( editor->gui.props, (EDITOR_PROP*)vin->cbextra, vin->lastchange.data, vin->inputs.size ); }; in->cbextra = prop; - *y += (space+18); + *y += (s+18); } break; case EPROP_CLR: { GUI_COLORINPUT* cin = gui_colorinput( *x, *y, w, n, (CLR*)eprop_ptr( prop ) ); cin->cb = pfn( void* ptr ) { GUI_COLORINPUT* cin = (GUI_COLORINPUT*)ptr; gui_editor_propview_sync_props_fdiff( editor->gui.props, (EDITOR_PROP*)cin->cbextra, cin->lastchange.data, cin->inputs.size ); }; cin->cbextra = prop; - *y += (space+18); + *y += (s+18); }break; case EPROP_MAPPROP: { MAP_PROPREF* ref = (MAP_PROPREF*)eprop_ptr( prop ); SURF_PROPS* props = map_get_props( editor->map, *ref ); - gui_label( *x, *y, "prop id: %d", *ref ); + if( val ) gui_label( *x, *y, "prop id: %d", *ref ); + else gui_label( *x, *y, "prop id: *" ); GUI_BUTTON* newprop = gui_button( action2_x, *y, 20, 20, "+", pfn( void* ptr ) { GUI_BUTTON* btn = (GUI_BUTTON*)ptr; @@ -199,17 +223,19 @@ void gui_editor_propview_create_eobj_prop( GUI_EDITOR_PROPVIEW* view, EDITOR_PRO gui_editor_propview_update( editor->gui.props ); } ); newprop->extra = prop; - GUI_BUTTON* goprop = gui_button( action_x, *y, 20, 20, "\x1A", pfn( void* ptr ) { - GUI_BUTTON* btn = (GUI_BUTTON*)ptr; - gui_editor_propview_select( editor->gui.props, btn->extra, EDITOR_SELECT_SURFPROPS ); - } ); goprop->extra = props; *y += space; - + if( val ) { + GUI_BUTTON* goprop = gui_button( action_x, *y, 20, 20, "\x1A", pfn( void* ptr ) { + GUI_BUTTON* btn = (GUI_BUTTON*)ptr; + gui_editor_propview_select( editor->gui.props, btn->extra, EDITOR_SELECT_SURFPROPS ); + } ); goprop->extra = props; + } *y += s; *x += 10; gui_editor_propview_create_eobj_props( view, props, x, y, w - 10 ); *x -= 10; } break; case EPROP_TEXTURE: { GL_TEX2D** tex = (GL_TEX2D**)eprop_ptr( prop ); - if( *tex ) gui_label( *x, *y, "%s: %s", n, (*tex)->name ); - else gui_label( *x, *y, "%s: none", n ); + if( val && *tex ) gui_label( *x, *y, "%s: %s", n, (*tex)->name ); + else if( !val ) gui_label( *x, *y, "%s: *", n ); + else gui_label( *x, *y, "%s: none", n ); GUI_BUTTON* btn = gui_button( action_x, *y, 20, 20, "\x1A", cfn( void* ptr ) { GUI_BUTTON* btn = (GUI_BUTTON*)ptr; GL_TEX2D** ptex = (GL_TEX2D**)btn->extra; @@ -219,30 +245,33 @@ void gui_editor_propview_create_eobj_prop( GUI_EDITOR_PROPVIEW* view, EDITOR_PRO gui_editor_propview_sync_props_value( editor->gui.props, (EDITOR_PROP*)picker->cbextra ); gui_editor_propview_update( editor->gui.props ); }; picker->cbextra = prop; - } ); btn->extra = tex; *y += space; + } ); btn->extra = tex; *y += s; } break; case EPROP_VERTEX_LIST: { LIST<MAP_VERTEX>* list = ( LIST<MAP_VERTEX>* )eprop_ptr( prop ); - gui_label( *x, *y, "%s : %d", n, list->size ); *y += space; - for( U32 i = 0; i < list->size; ++i ) { - MAP_VERTEX* v = &list->data[i]; - gui_label( (*x) + 10, *y, "[%d] -> [%s]", i, to_str( v->pos ).data ); - GUI_BUTTON* btn = gui_button( action_x, *y, 20, 20, "\x1A", pfn( void* ptr ) { - GUI_BUTTON* btn = (GUI_BUTTON*)ptr; - gui_editor_propview_select( editor->gui.props, btn->extra, EDITOR_SELECT_PVERTEX ); - } ); btn->extra = v; *y += space; - } + if( val ) { + gui_label( *x, *y, "%s : %d", n, list->size ); *y += s; + for( U32 i = 0; i < list->size; ++i ) { + MAP_VERTEX* v = &list->data[i]; + gui_label( (*x) + 10, *y, "[%d] -> [%s]", i, to_str( v->pos ).data ); + GUI_BUTTON* btn = gui_button( action_x, *y, 20, 20, "\x1A", pfn( void* ptr ) { + GUI_BUTTON* btn = (GUI_BUTTON*)ptr; + gui_editor_propview_select( editor->gui.props, btn->extra, EDITOR_SELECT_PVERTEX ); + } ); btn->extra = v; *y += s; + } + } else gui_label( *x, *y, "%s : *", n ); *y += s; } break; - default: return gui_editor_propview_create_eobj_prop_ro( view, prop, x, y, w, space ); break; + default: return gui_editor_propview_create_eobj_prop_ro( view, prop, x, y, w, s, val ); } } -void gui_editor_propview_create_eobj_prop_ro( GUI_EDITOR_PROPVIEW* view, EDITOR_PROP* prop, I32* x, I32* y, I32 w, I32 space ) { +void gui_editor_propview_create_eobj_prop_ro( GUI_EDITOR_PROPVIEW* view, EDITOR_PROP* prop, I32* x, I32* y, I32 w, I32 s, U8 val ) { STR str = prop->displayname; str += " : ["; void* ptr = eprop_ptr( prop ); - switch( prop->type ) { + if( !val ) str += "*"; + else switch( prop->type ) { case EPROP_F32: str += to_str( *(F32*)ptr ); break; case EPROP_VEC2: str += to_str( *(VEC2*)ptr ); break; case EPROP_VEC3: str += to_str( *(VEC3*)ptr ); break; @@ -258,7 +287,7 @@ void gui_editor_propview_create_eobj_prop_ro( GUI_EDITOR_PROPVIEW* view, EDITOR_ str += "]"; gui_label( *x, *y, str.data ); - *y += space; + *y += s; } void gui_editor_propview_create_eobj_props( GUI_EDITOR_PROPVIEW* view, EOBJECT* e, I32* x, I32* y, I32 w ) { @@ -266,6 +295,7 @@ void gui_editor_propview_create_eobj_props( GUI_EDITOR_PROPVIEW* view, EOBJECT* for( auto& it : e->eprops ) { EDITOR_PROP* eprop = eprop_from_ref( e, it ); + if( eprop->readonly ) gui_editor_propview_create_eobj_prop_ro( view, eprop, x, y, w, space ); else @@ -447,10 +477,25 @@ void gui_editor_propview_create_groupprops( GUI_EDITOR_PROPVIEW* view ) { U32 space = 20; for( auto& it : view->curprops ) { + U8 val = 1; + for( auto& sel : view->curselect ) { + EDITOR_PROP* it2 = eprop_from_name( (EOBJECT*)sel.obj, it->displayname ); + if( !it2 ) + continue; + + void* d1 = eprop_ptr( it ); + void* d2 = eprop_ptr( it2 ); + + if( !!memcmp( d1, d2, it->size ) ) { + val = 0; + break; + } + } + if( it->readonly ) - gui_editor_propview_create_eobj_prop_ro( view, it, &x, &y, w, space ); + gui_editor_propview_create_eobj_prop_ro( view, it, &x, &y, w, space, val ); else - gui_editor_propview_create_eobj_prop( view, it, &x, &y, w, space ); + gui_editor_propview_create_eobj_prop( view, it, &x, &y, w, space, val ); } } |
