* fix clone, clone-make-unique, select all of type, expand selection to entities/primitives for maps w/o worldspawn
This commit is contained in:
parent
5c48131eba
commit
cc997fd5a1
|
|
@ -1207,19 +1207,17 @@ void SelectFaceMode(){
|
|||
|
||||
class CloneSelected : public scene::Graph::Walker
|
||||
{
|
||||
bool doMakeUnique;
|
||||
NodeSmartReference worldspawn;
|
||||
const bool m_makeUnique;
|
||||
const scene::Node* m_world;
|
||||
public:
|
||||
CloneSelected( bool d ) : doMakeUnique( d ), worldspawn( Map_FindOrInsertWorldspawn( g_map ) ){
|
||||
CloneSelected( bool makeUnique ) : m_makeUnique( makeUnique ), m_world( Map_FindWorldspawn( g_map ) ){
|
||||
}
|
||||
bool pre( const scene::Path& path, scene::Instance& instance ) const {
|
||||
if ( path.size() == 1 ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// ignore worldspawn, but keep checking children
|
||||
NodeSmartReference me( path.top().get() );
|
||||
if ( me == worldspawn ) {
|
||||
if ( path.top().get_pointer() == m_world ) { // ignore worldspawn, but keep checking children
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -1229,7 +1227,7 @@ bool pre( const scene::Path& path, scene::Instance& instance ) const {
|
|||
&& selectable->isSelected() ) {
|
||||
return false;
|
||||
}
|
||||
if( doMakeUnique && instance.childSelected() ){
|
||||
if( m_makeUnique && instance.childSelected() ){
|
||||
NodeSmartReference clone( Node_Clone_Selected( path.top() ) );
|
||||
Map_gatherNamespaced( clone );
|
||||
Node_getTraversable( path.parent().get() )->insert( clone );
|
||||
|
|
@ -1244,9 +1242,7 @@ void post( const scene::Path& path, scene::Instance& instance ) const {
|
|||
return;
|
||||
}
|
||||
|
||||
// ignore worldspawn, but keep checking children
|
||||
NodeSmartReference me( path.top().get() );
|
||||
if ( me == worldspawn ) {
|
||||
if ( path.top().get_pointer() == m_world ) { // ignore worldspawn
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1255,7 +1251,7 @@ void post( const scene::Path& path, scene::Instance& instance ) const {
|
|||
if ( selectable != 0
|
||||
&& selectable->isSelected() ) {
|
||||
NodeSmartReference clone( Node_Clone( path.top() ) );
|
||||
if ( doMakeUnique ) {
|
||||
if ( m_makeUnique ) {
|
||||
Map_gatherNamespaced( clone );
|
||||
}
|
||||
Node_getTraversable( path.parent().get() )->insert( clone );
|
||||
|
|
@ -1264,8 +1260,8 @@ void post( const scene::Path& path, scene::Instance& instance ) const {
|
|||
}
|
||||
};
|
||||
|
||||
void Scene_Clone_Selected( scene::Graph& graph, bool doMakeUnique ){
|
||||
graph.traverse( CloneSelected( doMakeUnique ) );
|
||||
void Scene_Clone_Selected( scene::Graph& graph, bool makeUnique ){
|
||||
graph.traverse( CloneSelected( makeUnique ) );
|
||||
|
||||
Map_mergeClonedNames();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -333,19 +333,20 @@ void Select_Invert(){
|
|||
Scene_Invert_Selection( GlobalSceneGraph() );
|
||||
}
|
||||
|
||||
#if 0
|
||||
//interesting printings
|
||||
class ExpandSelectionToEntitiesWalker_dbg : public scene::Graph::Walker
|
||||
{
|
||||
mutable std::size_t m_depth;
|
||||
NodeSmartReference worldspawn;
|
||||
const scene::Node* m_world;
|
||||
public:
|
||||
ExpandSelectionToEntitiesWalker_dbg() : m_depth( 0 ), worldspawn( Map_FindOrInsertWorldspawn( g_map ) ){
|
||||
ExpandSelectionToEntitiesWalker_dbg() : m_depth( 0 ), m_world( Map_FindWorldspawn( g_map ) ){
|
||||
}
|
||||
bool pre( const scene::Path& path, scene::Instance& instance ) const {
|
||||
++m_depth;
|
||||
globalOutputStream() << "pre depth_" << m_depth;
|
||||
globalOutputStream() << " path.size()_" << path.size();
|
||||
if ( path.top().get() == worldspawn )
|
||||
if ( path.top().get_pointer() == m_world )
|
||||
globalOutputStream() << " worldspawn";
|
||||
if( path.top().get().isRoot() )
|
||||
globalOutputStream() << " path.top().get().isRoot()";
|
||||
|
|
@ -367,7 +368,7 @@ bool pre( const scene::Path& path, scene::Instance& instance ) const {
|
|||
void post( const scene::Path& path, scene::Instance& instance ) const {
|
||||
globalOutputStream() << "post depth_" << m_depth;
|
||||
globalOutputStream() << " path.size()_" << path.size();
|
||||
if ( path.top().get() == worldspawn )
|
||||
if ( path.top().get_pointer() == m_world )
|
||||
globalOutputStream() << " worldspawn";
|
||||
if( path.top().get().isRoot() )
|
||||
globalOutputStream() << " path.top().get().isRoot()";
|
||||
|
|
@ -383,13 +384,14 @@ void post( const scene::Path& path, scene::Instance& instance ) const {
|
|||
--m_depth;
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
class ExpandSelectionToPrimitivesWalker : public scene::Graph::Walker
|
||||
{
|
||||
mutable std::size_t m_depth;
|
||||
NodeSmartReference worldspawn;
|
||||
const scene::Node* m_world;
|
||||
public:
|
||||
ExpandSelectionToPrimitivesWalker() : m_depth( 0 ), worldspawn( Map_FindOrInsertWorldspawn( g_map ) ){
|
||||
ExpandSelectionToPrimitivesWalker() : m_depth( 0 ), m_world( Map_FindWorldspawn( g_map ) ){
|
||||
}
|
||||
bool pre( const scene::Path& path, scene::Instance& instance ) const {
|
||||
++m_depth;
|
||||
|
|
@ -397,11 +399,8 @@ bool pre( const scene::Path& path, scene::Instance& instance ) const {
|
|||
if( !path.top().get().visible() )
|
||||
return false;
|
||||
|
||||
// ignore worldspawn
|
||||
// NodeSmartReference me( path.top().get() );
|
||||
// if ( me == worldspawn ) {
|
||||
// if ( path.top().get_pointer() == m_world ) // ignore worldspawn
|
||||
// return false;
|
||||
// }
|
||||
|
||||
if ( m_depth == 2 ) { // entity depth
|
||||
// traverse and select children if any one is selected
|
||||
|
|
@ -431,9 +430,9 @@ void Scene_ExpandSelectionToPrimitives(){
|
|||
class ExpandSelectionToEntitiesWalker : public scene::Graph::Walker
|
||||
{
|
||||
mutable std::size_t m_depth;
|
||||
NodeSmartReference worldspawn;
|
||||
const scene::Node* m_world;
|
||||
public:
|
||||
ExpandSelectionToEntitiesWalker() : m_depth( 0 ), worldspawn( Map_FindOrInsertWorldspawn( g_map ) ){
|
||||
ExpandSelectionToEntitiesWalker() : m_depth( 0 ), m_world( Map_FindWorldspawn( g_map ) ){
|
||||
}
|
||||
bool pre( const scene::Path& path, scene::Instance& instance ) const {
|
||||
++m_depth;
|
||||
|
|
@ -441,18 +440,15 @@ bool pre( const scene::Path& path, scene::Instance& instance ) const {
|
|||
if( !path.top().get().visible() )
|
||||
return false;
|
||||
|
||||
// ignore worldspawn
|
||||
// NodeSmartReference me( path.top().get() );
|
||||
// if ( me == worldspawn ) {
|
||||
// if ( path.top().get_pointer() == m_world ) // ignore worldspawn
|
||||
// return false;
|
||||
// }
|
||||
|
||||
if ( m_depth == 2 ) { // entity depth
|
||||
// traverse and select children if any one is selected
|
||||
bool beselected = false;
|
||||
if ( instance.childSelected() || instance.isSelected() ) {
|
||||
beselected = true;
|
||||
if( path.top().get() != worldspawn ){
|
||||
if( path.top().get_pointer() != m_world ){ //avoid selecting world node
|
||||
Instance_setSelected( instance, true );
|
||||
}
|
||||
}
|
||||
|
|
@ -743,17 +739,17 @@ class EntityFindByPropertyValueWalker : public scene::Graph::Walker
|
|||
{
|
||||
const PropertyValues& m_propertyvalues;
|
||||
const char *m_prop;
|
||||
const NodeSmartReference worldspawn;
|
||||
const scene::Node* m_world;
|
||||
public:
|
||||
EntityFindByPropertyValueWalker( const char *prop, const PropertyValues& propertyvalues )
|
||||
: m_propertyvalues( propertyvalues ), m_prop( prop ), worldspawn( Map_FindOrInsertWorldspawn( g_map ) ){
|
||||
: m_propertyvalues( propertyvalues ), m_prop( prop ), m_world( Map_FindWorldspawn( g_map ) ){
|
||||
}
|
||||
bool pre( const scene::Path& path, scene::Instance& instance ) const {
|
||||
if( !path.top().get().visible() ){
|
||||
return false;
|
||||
}
|
||||
// ignore worldspawn
|
||||
if ( path.top().get() == worldspawn ) {
|
||||
if ( path.top().get_pointer() == m_world ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -782,15 +778,15 @@ class EntityGetSelectedPropertyValuesWalker : public scene::Graph::Walker
|
|||
{
|
||||
PropertyValues& m_propertyvalues;
|
||||
const char *m_prop;
|
||||
const NodeSmartReference worldspawn;
|
||||
const scene::Node* m_world;
|
||||
public:
|
||||
EntityGetSelectedPropertyValuesWalker( const char *prop, PropertyValues& propertyvalues )
|
||||
: m_propertyvalues( propertyvalues ), m_prop( prop ), worldspawn( Map_FindOrInsertWorldspawn( g_map ) ){
|
||||
: m_propertyvalues( propertyvalues ), m_prop( prop ), m_world( Map_FindWorldspawn( g_map ) ){
|
||||
}
|
||||
bool pre( const scene::Path& path, scene::Instance& instance ) const {
|
||||
Entity* entity = Node_getEntity( path.top() );
|
||||
if ( entity != 0 ){
|
||||
if( path.top().get() != worldspawn ){
|
||||
if( path.top().get_pointer() != m_world ){
|
||||
Selectable* selectable = Instance_getSelectable( instance );
|
||||
if ( ( selectable != 0 && selectable->isSelected() ) || instance.childSelected() ) {
|
||||
if ( !propertyvalues_contain( m_propertyvalues, entity->getKeyValue( m_prop ) ) ) {
|
||||
|
|
@ -809,10 +805,10 @@ class EntityGetSelectedPropertyValuesWalker : public scene::Graph::Walker
|
|||
PropertyValues& m_propertyvalues;
|
||||
const char *m_prop;
|
||||
mutable bool m_selected_children;
|
||||
const NodeSmartReference worldspawn;
|
||||
const scene::Node* m_world;
|
||||
public:
|
||||
EntityGetSelectedPropertyValuesWalker( const char *prop, PropertyValues& propertyvalues )
|
||||
: m_propertyvalues( propertyvalues ), m_prop( prop ), m_selected_children( false ), worldspawn( Map_FindOrInsertWorldspawn( g_map ) ){
|
||||
: m_propertyvalues( propertyvalues ), m_prop( prop ), m_selected_children( false ), m_world( Map_FindWorldspawn( g_map ) ){
|
||||
}
|
||||
bool pre( const scene::Path& path, scene::Instance& instance ) const {
|
||||
Selectable* selectable = Instance_getSelectable( instance );
|
||||
|
|
@ -835,7 +831,7 @@ void post( const scene::Path& path, scene::Instance& instance ) const {
|
|||
Entity* entity = Node_getEntity( path.top() );
|
||||
if( entity != 0 && m_selected_children ){
|
||||
m_selected_children = false;
|
||||
if( path.top().get() == worldspawn )
|
||||
if( path.top().get_pointer() == m_world )
|
||||
return;
|
||||
if ( !propertyvalues_contain( m_propertyvalues, entity->getKeyValue( m_prop ) ) ) {
|
||||
m_propertyvalues.push_back( entity->getKeyValue( m_prop ) );
|
||||
|
|
@ -1486,15 +1482,15 @@ class EntityGetSelectedPropertyValuesWalker_nonEmpty : public scene::Graph::Walk
|
|||
{
|
||||
PropertyValues& m_propertyvalues;
|
||||
const char *m_prop;
|
||||
const NodeSmartReference worldspawn;
|
||||
const scene::Node* m_world;
|
||||
public:
|
||||
EntityGetSelectedPropertyValuesWalker_nonEmpty( const char *prop, PropertyValues& propertyvalues )
|
||||
: m_propertyvalues( propertyvalues ), m_prop( prop ), worldspawn( Map_FindOrInsertWorldspawn( g_map ) ){
|
||||
: m_propertyvalues( propertyvalues ), m_prop( prop ), m_world( Map_FindWorldspawn( g_map ) ){
|
||||
}
|
||||
bool pre( const scene::Path& path, scene::Instance& instance ) const {
|
||||
Entity* entity = Node_getEntity( path.top() );
|
||||
if ( entity != 0 ){
|
||||
if( path.top().get() != worldspawn ){
|
||||
if( path.top().get_pointer() != m_world ){
|
||||
Selectable* selectable = Instance_getSelectable( instance );
|
||||
if ( ( selectable != 0 && selectable->isSelected() ) || instance.childSelected() ) {
|
||||
const char* keyvalue = entity->getKeyValue( m_prop );
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user