/* ========================================================================== * ÀÛ ¼º ÀÚ : À̼ø±Ô * ÀÛ ¼º ÀÏ : 2006.12.13 * ³» ¿ë : ¿ÀºêÁ§Æ® ÆíÁýÀÚ * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once class cSceneNode; class cStaticSceneNode; class cObjectCreating; class cObjectSelectingInfo; class cObjectSelecting; class cObjectDeletingInfo; class cObjectDeleting; class cObjectCopying; class cObjectTranslating; class cObjectRotating; class cObjectScaling; class cObjectTransformDialog; class cObjectPropertyDialog; class cObjectInfoDialog; class cStringTable; /// ±×·ì ¿ÀºêÁ§Æ® /// ¿ÀºêÁ§Æ® ±×·ìÀ» Çϳª·Î ¹­´Â ¿ªÇÒÀ» ÇÑ´Ù. class cObjectGroup { friend class cObjectEditor; public: cObjectGroup(); ~cObjectGroup(); /// Áö¿ò void Clear(); /// ·»´õ¸µ void Render(); /// ¿ÀºêÁ§Æ®¸¦ ¼±Åà void Select( cStaticSceneNode* node, bool ctrl ); void Select( const tHashSet& nodeSet ); void Deselect(); /// ¿ÀºêÁ§Æ®µéÀ» »èÁ¦ void Delete(); /// À̵¿ void SetTranslate( const NiPoint3& trans ); const NiPoint3& GetTranslate() const; /// ȸÀü void SetRotate( float xangle, float yangle, float zangle ); const NiMatrix3& GetRotate() const; /// ¹èÀ² void SetScale( float scale ); float GetScale() const; /// ÀçÁú Àû¿ë void SetMaterialApplied( bool matApplied ); bool GetMaterialApplied() const; /// ÁÖº¯±¤ ¹Ý»çÀ² void SetAmbient( COLORREF rgb ); COLORREF GetAmbient() const; /// »ê¶õ±¤ ¹Ý»çÀ² void SetDiffuse( COLORREF rgb ); COLORREF GetDiffuse() const; /// ¹ß»ê»ö void SetEmissive( COLORREF rgb ); COLORREF GetEmissive() const; /// À̸§À» ¸®ÅÏ const char* GetFileName() const; /// °¡½Ã ·¹º§ void SetVisibleLevel( unsigned int level ); unsigned int GetVisibleLevel() const; /// Â÷Æó ·¹º§ void SetOccludeLevel( unsigned int level ); unsigned int GetOccludeLevel() const; /// ¾È°³ Àû¿ë void SetFogApplied( bool fogApplied ); bool GetFogApplied() const; /// ¿ÀºêÁ§Æ® ¼ö¸¦ ¸®ÅÏ unsigned int GetSize() const; /// ºñ¾îÀÖ´ÂÁö ¿©ºÎ¸¦ ¸®ÅÏ bool IsEmpty() const; /// ¼±ÅÃµÈ Àå¸é ³ëµå ™VÀ» ¸®ÅÏ const tHashSet& GetSelectedSet() const; typedef tHashSet cSelectedSet; private: /// ³ëµåµéÀ» Å»ºÎÂø void DetachAll(); void AttachAll(); /// ¹é¾÷ /// Undo¿¡ ÇÊ¿äÇÑ Á¤º¸¸¦ ¼öÁýÇÑ´Ù. void CollectUnSelecting( cObjectSelectingInfo* info ); void CollectUnDeleting( cObjectDeletingInfo* info ); /// °»½Å /// Redo¿¡ ÇÊ¿äÇÑ Á¤º¸¸¦ ¼öÁýÇÑ´Ù. void CollectReSelecting( cObjectSelectingInfo* info ); void CollectReDeleting( cObjectDeletingInfo* info ); /// Undo void Undo( const cObjectSelecting& doing ); void Undo( const cObjectDeleting& doing ); void Undo( const cObjectTranslating& doing ); void Undo( const cObjectRotating& doing ); void Undo( const cObjectScaling& doing ); /// Redo void Redo( const cObjectSelecting& doing ); void Redo( const cObjectDeleting& doing ); void Redo( const cObjectTranslating& doing ); void Redo( const cObjectRotating& doing ); void Redo( const cObjectScaling& doing ); private: /// ¿£Áø ³ëµå NiNodePtr mNiNode; /// ÆíÁý ¿ø /// ¼±ÅÃµÈ Àå¸é ³ëµåµéÀ» Ç¥½ÃÇϴµ¥ »ç¿ëÇÑ´Ù. NiMeshPtr mCircleLines; NiMaterialPropertyPtr mMatProp; NiVertexColorPropertyPtr mVertColorProp; NiWireframePropertyPtr mWireProp; /// ¼±ÅÃµÈ Àå¸é ³ëµå ™V cSelectedSet mSelectedSet; }; inline const NiPoint3& cObjectGroup::GetTranslate() const { return mNiNode->GetTranslate(); } inline const NiMatrix3& cObjectGroup::GetRotate() const { return mNiNode->GetRotate(); } inline float cObjectGroup::GetScale() const { return mNiNode->GetScale(); } inline unsigned int cObjectGroup::GetSize() const { return mSelectedSet.GetSize(); } inline bool cObjectGroup::IsEmpty() const { return mSelectedSet.IsEmpty(); } inline const tHashSet& cObjectGroup::GetSelectedSet() const { return mSelectedSet; } /// ¿ÀºêÁ§Æ® ÆíÁýÀÚ /// ¸Ê»óÀÇ ¿ÀºêÁ§Æ®(Àå¸é ³ëµå)µéÀ» ÆíÁýÇϰí /// Àå¸é ÆÄÀÏ(*.scene)À» ÀúÀå, ·ÎµùÇÑ´Ù. class cObjectEditor { static cObjectEditor* mSingleton; friend class cMapEditorView; friend class cObjectGroup; friend class cObjectCreating; friend class cObjectSelecting; friend class cObjectDeleting; friend class cObjectCopying; friend class cObjectTranslating; friend class cObjectRotating; friend class cObjectScaling; public: cObjectEditor(); ~cObjectEditor(); /// Áö¿ò void Clear(); void ClearGarbage(); /// ·»´õ¸µ void Render( bool group ); /// ÃʱâÈ­ void Init(); void Init( unsigned int gridSize, float metersPerVertex = 1.0f, unsigned int unitsPerMeter = 100 ); void InitTree(); /// ·Îµù bool Load( const cString& pathName ); bool Add( const cString& pathName ); bool LoadAreaGroup( const cString& pathName ); bool LoadObjectTransformScript( const cString& pathName ); /// ÀúÀå bool Save(); bool SaveGlobalArea( cFileSaver& saver ); bool SaveAs( const cString& pathName, bool objectAdded = true, bool lightAdded = true, bool soundAdded = true, bool areaAdded = true ); bool SaveAreaAs( const cString& pathName ); bool SaveObjectGroupAs( const cString& pathName ); /// ·Î±× void ExportLog( cStringTable& table, unsigned int& row, unsigned int divides ); /// ¿ÀºêÁ§Æ® À§Ä¡, Å©±â Á¶Àý void AdjustAllPos( float scale ); void AdjustAllSize( float scale ); /// ¿ÀºêÁ§Æ®¸¦ »ý¼º bool CreateObject( const char* pathName ); /// ¿ÀºêÁ§Æ®¸¦ °Ë»ö bool SelectObject( const char* pathName ); bool Find( cStaticSceneNode* node ); inline cObjectGroup* GetObjectGroup() { return mObjectGroup; } /// ÇÈÅ· bool Pick( CPoint point, bool ctrl ); /// ¼±Åà void SelectAll(); void DeselectAll(); /// ¿ÀºêÁ§Æ® ±×·ì void AttachGroupToTerrain( CPoint point ); void AttachGroupToObject( CPoint point ); void SetGroupTranslate( const NiPoint3& trans, bool updateDialog ); void SetGroupRotate( float xangle, float yangle, float zangle, bool updateDialog ); void SetGroupScale( float scale, bool updateDialog ); void SetGroupAmbient( COLORREF rgb ); void SetGroupDiffuse( COLORREF rgb ); void SetGroupEmissive( COLORREF rgb ); void SetGroupVisibleLevel( unsigned int level ); void SetGroupOccludeLevel( unsigned int level ); void SetGroupFogApplied( bool fogApplied ); void SetGroupMaterialApplied( bool matApplied ); void DeleteGroup(); void CopyGroup(); /// Á¤º¸ ´ÙÀ̾ó·Î±×¸¦ °»½Å void UpdateInfoDialog(); /// void SetVisibleLevelToSiblings(); void SetOccludeLevelToSiblings(); void SetFogToSiblings(); void SetMaterialToSiblings(); void SetAmbientSiblings(); void SetDiffuseSiblings(); void SetEmissiveSiblings(); /// ÁÖº¯±¤ void SetAmbientLightAmbient( unsigned int i, const NiColor& color ); void SetAmbientLightDiffuse( unsigned int i, const NiColor& color ); void SetAmbientLightDimmer( unsigned int i, float dimmer ); NiAmbientLight* GetAmbientLight( unsigned int i ) const; /// ¾È°³ void SetFog( bool enabled, const NiColor& color, float depth ); void SetFogColor( const NiColor& color ); void SetFogDepth( float depth ); /// ´ÙÀ̾ó·Î±×¸¦ ¼³Á¤ void SetTransformDialog( cObjectTransformDialog* dlg ); void SetPropertyDialog( cObjectPropertyDialog* dlg ); void SetInfoDialog( cObjectInfoDialog* dlg ); /// °æ·Î À̸§À» ¸®ÅÏ const cString& GetPathName() const; private: /// Undo void Undo( const cObjectCreating& doing ); void Undo( const cObjectSelecting& doing ); void Undo( const cObjectDeleting& doing ); void Undo( const cObjectCopying& doing ); void Undo( const cObjectTranslating& doing ); void Undo( const cObjectRotating& doing ); void Undo( const cObjectScaling& doing ); /// Redo void Redo( const cObjectCreating& doing ); void Redo( const cObjectSelecting& doing ); void Redo( const cObjectDeleting& doing ); void Redo( const cObjectCopying& doing ); void Redo( const cObjectTranslating& doing ); void Redo( const cObjectRotating& doing ); void Redo( const cObjectScaling& doing ); /// ÇØ´ç Àå¸é ³ëµå¸¦ Á¦°Å bool Kill( cStaticSceneNode* node ); /// ÇØ´ç Àå¸é ³ëµå¸¦ ºÎȰ void Rebirth( cStaticSceneNode* node ); /// ÇØ´ç Àå¸é ³ëµå¸¦ º¹Á¦ /// º¹Á¦µÈ »õ·Î¿î Àå¸é ³ëµå¸¦ ¸®ÅÏÇÑ´Ù. cStaticSceneNode* Clone( cStaticSceneNode* node ); /// ¸Þ½ÃÁö¸¦ ó¸® void OnMouseMove( CPoint point ); void OnLButtonDown_Transform( CPoint point, bool ctrl ); void OnRButtonDown_Transform( CPoint point, bool ctrl ); void OnKeyDown( UINT c ); public: /// ´ÜÀÏü¸¦ ¸®ÅÏ static cObjectEditor* GetSingleton(); protected: /// ÆíÁý ´ÙÀ̾ó·Î±× cObjectTransformDialog* mTransformDialog; /// ¼Ó¼º ´ÙÀ̾ó·Î±× cObjectPropertyDialog* mPropertyDialog; /// Á¤º¸ ´ÙÀ̾ó·Î±× cObjectInfoDialog* mInfoDialog; /// »ý¼ºµÈ Àå¸é ³ëµå ™V typedef tHashSet cCreatedSet; cCreatedSet mCreatedSet; /// »èÁ¦µÈ Àå¸é ³ëµå ™V typedef tHashSet cDestroyedSet; cDestroyedSet mDestroyedSet; /// ÇÈÅ·µÈ Àå¸é ³ëµå ¹è¿­ typedef tArray cPickedArray; cPickedArray mPickedArray; /// ±×·ì ¿ÀºêÁ§Æ® cObjectGroup* mObjectGroup; /// ¸¶¿ì½º ÁÂÇ¥ CPoint mMousePos; /// °æ·Î À̸§ cString mPathName; }; inline void cObjectEditor::SetTransformDialog( cObjectTransformDialog* dlg ) { assert( dlg ); mTransformDialog = dlg; } inline void cObjectEditor::SetPropertyDialog( cObjectPropertyDialog* dlg ) { assert( dlg ); mPropertyDialog = dlg; } inline void cObjectEditor::SetInfoDialog( cObjectInfoDialog* dlg ) { assert( dlg ); mInfoDialog = dlg; } inline const cString& cObjectEditor::GetPathName() const { return mPathName; } inline cObjectEditor* cObjectEditor::GetSingleton() { return mSingleton; } #define OBJECTEDIT cObjectEditor::GetSingleton()