summaryrefslogtreecommitdiff
path: root/src/editor/properties.cpp
diff options
context:
space:
mode:
authoraura <nw@moneybot.cc>2026-03-20 20:21:24 +0100
committeraura <nw@moneybot.cc>2026-03-20 20:21:24 +0100
commit8099c2a11fb4010542973bf85359935da19e2192 (patch)
tree13f05312aa19e87c9357faeec7f84f864166ab57 /src/editor/properties.cpp
parenta156bc15880e9e250c9c40f0dde431e077109dc1 (diff)
move multiple objects
Diffstat (limited to 'src/editor/properties.cpp')
-rw-r--r--src/editor/properties.cpp105
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 );
}
}