![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /****************************************************************************** 00002 ** Copyright (c) 2011 MAK Technologies, Inc. 00003 ** All rights reserved. 00004 ******************************************************************************/ 00005 /****************************************************************************** 00006 ** $RCSfile: DtVrfObjectManipulationManager.h,v $ $Revision: 1.4 $ $State: Exp $ 00007 ******************************************************************************/ 00008 00011 00013 00014 #pragma once 00015 00016 #include <vrfGuiCore/vrfGuiCore.h> 00017 #include <vrfGuiCore/DtEnvironmentState.h> 00018 #include <vrfGuiCore/DtOrderedEntityTypeList.h> 00019 #include <vrfGuiCore/DtVrfObjectManipulationHandlerBaseClass.h> 00020 #include <vrvUtil/DtVirtualBaseClass.h> 00021 #include <vrvCore/DtUniqueID.h> 00022 #include <vrvCore/DtSelectionManager.h> 00023 #include <vrvCore/DtElementEntry.h> 00024 00025 #include <boost/signal.hpp> 00026 00027 namespace makVrv 00028 { 00029 class DtDe; 00030 class DtInputDriver; 00031 class DtMouseEvent; 00032 class DtChannel; 00033 class DtKeyEvent; 00034 class DtObserver; 00035 } 00036 00037 namespace makVrf 00038 { 00039 class DtVrfObjectManipulationHandlerBaseClass; 00040 class DtVrfEditManagerEventProcessor; 00041 00043 class DT_DLL_VRFGUICORE DtVrfObjectManipulationManager : public makVrv::DtVirtualBaseClass 00044 { 00045 protected: 00046 typedef DtOrderedEntityTypeList<DtVrfObjectManipulationHandlerCreatorInterface*> VrfObjectManipulationCreators; 00047 typedef boost::function< void ( DtEnvironmentStateView* )> ProcessEnvStateFunction; 00048 00049 public: 00050 enum DtEditingType 00051 { 00052 Mouse = 0, 00053 Context, 00054 MousePositionOrigin 00055 }; 00056 00057 public: 00058 00060 DtVrfObjectManipulationManager(makVrv::DtDe&); 00061 00063 virtual ~DtVrfObjectManipulationManager(); 00064 00066 bool creatingObject() const; 00067 00069 DtVrfObjectManipulationHandlerBaseClass* currentObjectManipulationHandler(); 00070 00071 public: 00072 00074 static DtVrfObjectManipulationManager& instance(makVrv::DtDe& de); 00075 00078 virtual void addObjectManipulationHandler(const DtEntityType&, DtVrfObjectManipulationHandlerCreatorInterface*); 00079 virtual void removeObjectManipulationHandler(const DtEntityType&); 00080 00082 virtual makVrv::DtElementEntry::ElementType mapKindToType(int) const; 00083 00085 virtual void addKindToTypeMapping(int, const makVrv::DtElementEntry::ElementType&); 00086 00088 virtual bool hasTypeToKindMapping(const makVrv::DtElementEntry::ElementType&) const; 00089 00092 virtual void addObjectManipulationHandler(const makVrv::DtElementEntry::ElementType&, DtVrfObjectManipulationHandlerCreatorInterface*); 00093 virtual void removeObjectManipulationHandler(const makVrv::DtElementEntry::ElementType&); 00094 00098 virtual bool isEditable(const makVrv::DtUniqueID&) const; 00099 virtual void setEditable(const makVrv::DtUniqueID&, bool); 00100 00102 virtual std::vector<DtVector> convertToLocal(const std::vector<DtVector>& geocentric) const; 00103 00105 virtual bool isEditingOrCreating() const; 00106 00107 protected: 00108 00110 virtual void slot_onCreationStopped(DtVrfObjectManipulationHandlerBaseClass*); 00111 00113 virtual void slot_onTerrainPropCreationStopped(DtVrfObjectManipulationHandlerBaseClass*); 00114 00115 virtual void slot_onCreateObject(const DtEntityType&, std::string, int, const std::vector<DtVector>&,double entityHeading, bool clamp, bool isAggregated, std::string userData ); 00116 00118 virtual void slot_onCreateTerrainProp(const DtString& propType, const DtString& propModelDef); 00119 00121 virtual DtVrfObjectManipulationHandlerBaseClass* manipulationHandlerFor(const DtEntityType&) const; 00122 virtual DtVrfObjectManipulationHandlerBaseClass* manipulationHandlerFor(const makVrv::DtElementEntry::ElementType&) const; 00123 00124 virtual void onInputDriverToBeDestroyed( makVrv::DtInputDriver* inputDriver ); 00125 00126 virtual void cleanup(); 00127 00129 virtual void onObjectFacadeCreated(DtVrfObjectFacadeInterface*, bool editing); 00130 00132 virtual void onObjectFacadeAboutToBeRemoved(DtVrfObjectFacadeInterface*); 00133 00134 public: 00138 virtual void createObject(const DtEntityType&, int force,DtCreationSignalType creationSignal = DtNoCreationSignal); 00139 00141 virtual void setLocation(const DtVector& loc); 00142 00144 virtual void createTerrainProp(const DtString& propType, const DtString& propModelDef); 00145 00147 virtual void stop(); 00148 00149 public: 00150 boost::signal<void ()> signal_stopped; 00151 boost::signal<void (const DtEntityType&, int, makVrf::DtCreationSignalType)> signal_creatingObject; 00152 boost::signal<void (const DtEntityType&, std::string, int, const std::vector<DtVector>&,double,bool, bool, std::string )> signal_createObject; 00153 00154 boost::signal<void ()> signal_creatingTerrainProp; 00155 boost::signal<void (const DtString&, const DtString&)> signal_createTerrainProp; 00156 00157 boost::signal<void (DtVrfObjectFacadeInterface*, bool)> signal_objectFacadeCreated; 00158 boost::signal<void (DtVrfObjectFacadeInterface*)> signal_objectFacadeAboutToBeRemoved; 00159 00160 //Sent by event processor when an item is double clicked that does not have an object type to edit 00161 boost::signal<void (makVrv::DtElementID)> signal_unhandledEdit; 00162 public: 00163 00164 bool editingObjects() const; 00165 void setAllowEditing(bool b); 00166 bool allowEditing() const; 00167 00171 virtual void editSelectedObjects( const makVrv::DtUniqueID& principalID, 00172 makVrv::DtChannel& initiatingChannel, const DtEditingType& edtype=Mouse ); 00173 00175 virtual void deleteSelected(); 00176 virtual void deleteProp(makVrv::DtUniqueID id); 00177 00178 virtual void deleteVertex( const makVrv::DtUniqueID& vertexId ); 00179 virtual void deleteVertex( const makVrv::DtUniqueID& shapeId, 00180 const DtVector& dbLocation ); 00181 00182 virtual void addVertexBefore( const makVrv::DtUniqueID& vertexId ); 00183 00184 virtual void addVertexBefore( const makVrv::DtUniqueID& shapeId, 00185 const DtVector& dbLocation ); 00186 00187 virtual void addVertexBeforeSelected(); 00188 00189 virtual void addVertexAfter( const makVrv::DtUniqueID& vertexId ); 00190 00191 virtual void addVertexAfter( const makVrv::DtUniqueID& shapeId, 00192 const DtVector& dbLocation ); 00193 00194 virtual void addVertexAfterSelected(); 00195 00197 virtual int indexOfVertex( DtEnvironmentStateView* shapeStateView, 00198 const DtVector& dbVtxLocation ) const; 00199 00202 virtual bool getVertexLocation( const makVrv::DtUniqueID& vertexId, 00203 DtVector& dbLocation ) const; 00204 00210 virtual void requestAndProcessEnvState( const makVrv::DtUniqueID& sceneId, 00211 ProcessEnvStateFunction* processor ); 00212 00214 virtual void setWaitTimeAfterComplete(double); 00215 virtual double waitTimeAfterComplete() const; 00216 00217 boost::signal<void (const makVrv::DtUniqueID&, DtEditingType)> signal_editingObject; 00218 boost::signal<void (const makVrv::DtUniqueID&, DtEditingType)> signal_editingTerrainProp; 00219 00220 boost::signal<void (const makVrv::DtSelectionManager::IdSet&, DtEditingType)> signal_editingObjects; 00221 boost::signal<void (const makVrv::DtSelectionManager::IdSet&, DtEditingType)> signal_editingTerrainProps; 00222 00223 boost::signal<void ()> signal_editStopped; 00224 boost::signal<void ()> signal_editingNotAllowed; 00225 00226 protected: 00227 00228 virtual void slot_editStopped( DtVrfObjectManipulationHandlerBaseClass* ); 00229 00230 virtual void slot_stateReturned( DtEnvironmentStateView* shapeStateView, 00231 const makVrv::DtUniqueID& shapeId, ProcessEnvStateFunction* processor ); 00232 00233 virtual void deleteVertexUsingState( DtEnvironmentStateView* shapeStateView, 00234 const makVrv::DtUniqueID& shapeId, const DtVector& dbVtxLocation ); 00235 00236 virtual void addVertexUsingState( DtEnvironmentStateView* shapeStateView, 00237 const makVrv::DtUniqueID& shapeId, const DtVector& dbVtxLocation, bool before ); 00238 00239 virtual void restoreSelectionState( DtVrfObjectManipulationHandlerBaseClass* handler ); 00240 00241 virtual void slot_onTick(); 00242 00243 virtual void slot_onAttributesChanged( 00244 const makVrv::DtElementData::EntryAttributesList& signalList ); 00245 00246 bool isOnIdList( makVrv::DtUniqueID id, 00247 const makVrv::DtSelectionManager::IdSet& list ); 00248 00249 virtual void addHandlerToBeCleanedUp(DtVrfObjectManipulationHandlerBaseClass*); 00250 00251 public: 00252 bool shapeAtMinimum( DtEnvironmentStateView* shapeStateView ) const; 00253 bool shapeAtMaximum( DtEnvironmentStateView* shapeStateView ) const; 00254 00255 protected: 00256 makVrv::DtDe& myDe; 00257 VrfObjectManipulationCreators myManipulationHandlers; 00258 DtVrfObjectManipulationHandlerBaseClass* myCurrentObjectManipulationHandler; 00259 DtVrfEditManagerEventProcessor* myEventProcessor; 00260 00261 makVrv::DtSelectionManager::IdSet mySavedSelectionState; 00262 makVrv::DtSelectionManager::IdSet myRemainingSavedSelections; 00263 00264 typedef boost::unordered_map<makVrv::DtUniqueID, bool> EditableMap; 00265 EditableMap myEditableMap; 00266 00267 typedef boost::unordered_map<int, makVrv::DtElementEntry::ElementType> KindToTypeMap; 00268 KindToTypeMap myKindToTypeMap; 00269 00270 typedef boost::unordered_map<makVrv::DtElementEntry::ElementType, DtVrfObjectManipulationHandlerCreatorInterface*> TypeCreatorMap; 00271 TypeCreatorMap myTypeCreators; 00272 00273 double myWaitTimeAfterComplete; 00274 00275 std::vector<DtVrfObjectManipulationHandlerBaseClass*> myHandlersToBeCleanedUp; 00276 }; 00277 00278 class DT_DLL_VRFGUICORE DtVrfObjectManipulationManagerCreator : 00279 public makVrv::DtVirtualBaseClass 00280 { 00281 00282 public: 00285 static DtVrfObjectManipulationManagerCreator& instance( makVrv::DtDe& de ); 00286 00288 static void registerInstance( makVrv::DtDe& de, 00289 DtVrfObjectManipulationManagerCreator* instance); 00290 00292 virtual DtVrfObjectManipulationManager* create( makVrv::DtDe& de ); 00293 }; 00294 }