bool WorldEditorSelection::objInSet( SimObject* obj ) { if( !mIsResolvingPIDs ) resolvePIDs(); lock(); bool result = false; for( iterator iter = begin(); iter != end(); ++ iter ) { if( obj == *iter ) { result = true; break; } WorldEditorSelection* set = dynamic_cast< WorldEditorSelection* >( *iter ); if( set && set->objInSet( obj ) ) { result = true; break; } } unlock(); return result; }
void WorldEditorSelection::updateCentroid() { if( mCentroidValid ) return; resolvePIDs(); mCentroidValid = true; mCentroid.set(0,0,0); mBoxCentroid = mCentroid; mBoxBounds.minExtents.set(1e10, 1e10, 1e10); mBoxBounds.maxExtents.set(-1e10, -1e10, -1e10); mContainsGlobalBounds = false; if( empty() ) return; // for( SimSet::iterator iter = begin(); iter != end(); ++ iter ) { SceneObject* obj = dynamic_cast<SceneObject*>( *iter ); if( !obj ) continue; const MatrixF & mat = obj->getTransform(); Point3F wPos; mat.getColumn(3, &wPos); // mCentroid += wPos; // const Box3F& bounds = obj->getWorldBox(); mBoxBounds.minExtents.setMin(bounds.minExtents); mBoxBounds.maxExtents.setMax(bounds.maxExtents); if(obj->isGlobalBounds()) mContainsGlobalBounds = true; } mCentroid /= (F32) size(); mBoxCentroid = mBoxBounds.getCenter(); }
void SimPersistSet::write( Stream& stream, U32 tabStop, U32 flags ) { if( ( flags & SelectedOnly ) && !isSelected() ) return; // If the selection is transient, we cannot really save it. // Just invoke the default SimObject::write and return. if( !getCanSave() ) { Con::errorf( "SimPersistSet::write - transient set being saved: %d:%s (%s)", getId(), getClassName(), getName() ); Parent::write( stream, tabStop, flags ); return; } // If there are unresolved PIDs, give resolving them one last // chance before writing out the set. if( !mUnresolvedPIDs.empty() ) resolvePIDs(); // Write the set out. stream.writeTabs( tabStop ); StringBuilder buffer; buffer.format( "new %s(%s", getClassName(), getName() ? getName() : "" ); // Write the persistent IDs of all child objects into the set's // object constructor so we see them passed back to us through // processArguments when the object gets read in. const U32 numChildren = size(); for( U32 i = 0; i < numChildren; ++ i ) { SimObject* child = at( i ); SimPersistID* pid = child->getPersistentId(); AssertWarn( pid != NULL, "SimPersistSet::write - object without pid in persistent selection!" ); if( !pid ) continue; buffer.append( ',' ); buffer.append( '"' ); buffer.append( pid->getUUID().toString() ); buffer.append( '"' ); } buffer.append( ") {\r\n" ); stream.write( buffer.length(), buffer.data() ); // Write our object fields. writeFields( stream, tabStop + 1 ); // Close our object definition. stream.writeTabs( tabStop ); stream.write( 4, "};\r\n" ); }