/* ========================================================================== * ÀÛ ¼º ÀÚ : À̼ø±Ô * ÀÛ ¼º ÀÏ : 2006.12.08 * ³» ¿ë : Àå¸é ³ëµå * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "Ray.h" #include "Sphere.h" #include "MaterialData.h" class cSceneCuller; class cLightSceneNode; /// Àå¸é ³ëµå ŸÀÔ enum eSceneNodeType { SCENENODE_NULL = 0, SCENENODE_RENDERING = (1 << 0), SCENENODE_AREA = (1 << 1), SCENENODE_LIGHT = (1 << 2), SCENENODE_SOUND = (1 << 3), SCENENODE_STATIC = (1 << 4) | SCENENODE_RENDERING, SCENENODE_DYNAMIC = (1 << 5) | SCENENODE_RENDERING, SCENENODE_EFFECT = (1 << 6) | SCENENODE_RENDERING, SCENENODE_ITEM = (1 << 7) | SCENENODE_STATIC, SCENENODE_PORTAL = (1 << 8) | SCENENODE_STATIC, SCENENODE_GATHERING = (1 << 9) | SCENENODE_STATIC, SCENENODE_PATTERN = (1 << 10) | SCENENODE_STATIC, SCENENODE_DOOR = (1 << 11) | SCENENODE_STATIC, SCENENODE_PLAYER = (1 << 12) | SCENENODE_DYNAMIC, SCENENODE_NPC = (1 << 13) | SCENENODE_DYNAMIC, SCENENODE_MONSTER = (1 << 14) | SCENENODE_DYNAMIC, SCENENODE_HERO = (1 << 15) | SCENENODE_PLAYER, }; enum eSceneNodeTypeVer8 { SCENENODE_NULL_VER8 = 0, SCENENODE_AREA_VER8, SCENENODE_LIGHT_VER8, SCENENODE_SOUND_VER8, SCENENODE_STATIC_VER8, SCENENODE_DYNAMIC_VER8, }; /// ¾ËÆÄ µ¥ÀÌŸ class cAlphaData { public: cAlphaData( bool blendEnabled, bool testEnabled, NiAlphaProperty::TestFunction testFunc, unsigned char testRef, NiAlphaProperty* prop ); ~cAlphaData(); public: /// ¾ËÆÄ ºí·»µù bool mBlendEnabled; /// ¾ËÆÄ Å×½ºÆÃ bool mTestEnabled; NiAlphaProperty::TestFunction mTestFunc; unsigned char mTestRef; /// ¾ËÆÄ ¼Ó¼º NiAlphaProperty* mProp; }; class cVertexColorData { public: cVertexColorData( NiVertexColorProperty::SourceVertexMode sourceMode, NiVertexColorProperty::LightingMode lightMode, NiVertexColorProperty* prop ); ~cVertexColorData(); public: NiVertexColorProperty::SourceVertexMode mSourceMode; NiVertexColorProperty::LightingMode mLightMode; NiVertexColorProperty* mProp; }; /// Àå¸é ³ëµå ÀÎÀÚ class cSceneNodeParam { public: cSceneNodeParam(); public: unsigned long mWoldAccumTime; /// °æ·Î À̸§ mutable cString mPathName; /// À§Ä¡ NiPoint3 mTranslate; /// ȸÀü NiMatrix3 mRotate; /// ¹èÀ² float mScale; /// ÇÈÅ· mutable NiPick::QueryType mQueryType; mutable NiPick::SortType mPickSort; mutable NiPick::IntersectType mPickIntersect; mutable NiPick::CoordinateType mPickCoordinate; mutable bool mPickFrontOnly; mutable bool mPickReturnTexture; mutable bool mPickReturnNormal; mutable bool mPickReturnColor; }; /// Àå¸é ³ëµå class cSceneNode { friend class cSceneManager; friend class cSceneTree; friend class cSceneTreeNode; friend class cObjectEditor; friend class cLightEditor; friend class cObjectDeletingInfo; public: /// ó¸® virtual void Process( unsigned long deltaTime, unsigned long accumTime ); virtual void ProcessAlpha( unsigned long deltaTime ); virtual bool OnVisible( cSceneCuller& culler ); /// °»½Å void Update(); void UpdateAlpha(); void UpdateTransform(); virtual void SetAlphaBlended( float targetAlpha ); bool IsAlphaBlended(); virtual void SetViewNode( bool view ); virtual bool IsViewNode() { return mViewNode; } /// ÇÈÅ· virtual bool Pick( const cRay& ray ); /// ÇÈÅ· °á°ú /// ÁÖÀÇ: Pick()¸¦ È£ÃâÇÑ Á÷ÈÄ¿¡¸¸ »ç¿ëÇØ¾ß ÇÑ´Ù. const NiPick::Results& GetPickResults(); const NiPoint3& GetPickPos(); float GetPickDistance(); /// Á¶¸í void RemoveLight( cLightSceneNode* node ); /// ŸÀÔ eSceneNodeType GetType(); bool IsKindof( eSceneNodeType type ); bool IsEnableFrustumFlag() { return mCheckFrustum; } /// ¿£Áø ¿ÀºêÁ§Æ® virtual inline NiNode* GetNiNode() { return mSceneNiNode; } virtual inline NiAVObject* GetNiObj() { return (NiAVObject*)mSceneNiNode; } /// À̵¿ void Translate( const NiPoint3& move ); virtual void SetTranslate( const NiPoint3& trans ); const NiPoint3& GetTranslate(); virtual const NiPoint3& GetWorldTranslate(); /// ȸÀü void SetRotate( const NiPoint3& axis, float angle ); void SetRotate( const float xangle, float yangle, float zangle ); virtual void SetRotate( const NiMatrix3& rot ); const NiMatrix3& GetRotate(); const NiMatrix3& GetWorldRotate(); /// Å©±â void SetScale( float scale ); float GetScale(); float GetWorldScale(); /// °æ°è ±¸ const cSphere& GetBoundSphere(); /// Áß½ÉÁ¡ virtual const NiPoint3& GetCenter(); /// ¹ÝÁö¸§ virtual float GetRadius(); /// Æò¸éÀÇ ¾î´ÀÂÊ unsigned int WhichSide( const NiPlane& plane ); /// ÆÄÀÏ À̸§ const cString& GetFileName(); /// »ç¿ëÀÚ µ¥ÀÌŸ void SetUserData0( unsigned int data ); void SetUserData1( unsigned int data ); void SetUserData2( unsigned int data ); void SetUserData3( unsigned int data ); void SetUserData4( unsigned int data ); void SetUserData5( unsigned int data ); void SetUserData( void* data ); unsigned int GetUserData0(); unsigned int GetUserData1(); unsigned int GetUserData2(); unsigned int GetUserData3(); unsigned int GetUserData4(); unsigned int GetUserData5(); void* GetUserData(); /// °»½Å ÇÊ¿ä ¿©ºÎ void SetNeedUpdateTransform( bool update ); void SetNeedUpdateEffects( bool update ); /// ±âÇÏ ¿ÀºêÁ§Æ® ¼ö unsigned int GetNumGeoms(); #ifdef REGEN_TOOL /// Äøµ void SetCulled( bool culled ); #endif protected: cSceneNode( eSceneNodeType = SCENENODE_NULL ); virtual ~cSceneNode(); /// ÀúÀå virtual bool Save( cFileSaver& saver ); /// ÃʱâÈ­ virtual bool Init( const cSceneNodeParam& param ); /// Àç±Í ÇÔ¼ö void RecursiveNodeInfo( NiAVObject* obj, bool geom = true, bool property = true ); virtual void CollectNodeInfo( NiAVObject* obj, bool& collectGeom, bool& collectProperty ); void ClearCollectInfo(); /// ±âÇÏ ¿ÀºêÁ§Æ® NiMesh* GetGeom( NiAVObject* obj ); /// ±âÇÏ ¿ÀºêÁ§Æ®µéÀ» °¡½Ã ¹è¿­¿¡ Ãß°¡ virtual void AddToVisibleArray( NiVisibleArray* solidArray, NiVisibleArray* alphaArray, NiVisibleArray* alphaTestArray ); protected: /// ŸÀÔ eSceneNodeType mType; /// À̸§ cString mFilePath; cString mFileName; /// »ç¿ëÀÚ µ¥ÀÌŸ unsigned int mUserData0; unsigned int mUserData1; unsigned int mUserData2; unsigned int mUserData3; unsigned int mUserData4; /// µ¿Á·ÀÎ½Ä ±×·ì¹øÈ£ unsigned int mUserData5; /// ÆÐÅÏ index void* mUserData; /// ¿£Áø ¿ÀºêÁ§Æ® // NiAVObjectPtr mNiObject; NiNodePtr mSceneNiNode; /// ÀçÁú µ¥ÀÌŸ ¸®½ºÆ® typedef tPointerList cMaterialDataList; cMaterialDataList mMatDataList; /// ¾ËÆÄ µ¥ÀÌŸ ¸®½ºÆ® typedef tPointerList cAlphaDataList; cAlphaDataList mAlphaDataList; typedef tPointerList cVertexColorList; cVertexColorList mVertexColorDataList; /// ±âÇÏ ¿ÀºêÁ§Æ® ¸®½ºÆ® typedef tPair cRenderObjPair; typedef tList cRenderObjList; cRenderObjList mRenderObjList; /// ºôº¸µå ³ëµå ¸®½ºÆ® typedef tList cBillboardList; cBillboardList mBillboardList; /// ÇÈÅ· /// Àå¸é Æ®¸®¸¦ ÀÌ¿ëÇÑ Ãæµ¹ °Ë»ç °úÁ¤¿¡¼­ ÇÈÅ·À» ¼öÇàÇϰí, ±× °á°ú¸¦ ÀúÀåÇÑ´Ù. bool mPickBound; NiPick mPick; NiPoint3 mPickPos; float mPickDistance; bool mViewNode; /// °»½Å ÇÊ¿ä ¿©ºÎ bool mNeedUpdateProperties; bool mNeedUpdateTransform; bool mNeedUpdateEffects; /// °æ°è ±¸ cSphere mBoundSphere; /// ¾ËÆÄ bool mEnableAlphaProcess; float mTargetAlpha; float mAlpha; float mAlphaSpeed; /// Á¶¸í ¹è¿­ typedef tArray cLightArray; cLightArray mLightArray; /// Àå¸é °ü¸®ÀÚ¿¡ ÀÇÇØ ¼³Á¤µÈ ³»ºÎ À妽º unsigned int mIndexByManager; /// ÄÁÅ×ÀÌ³Ê /// Àå¸é ³ëµå¸¦ Æ÷ÇÔÇÏ´Â Àå¸é Æ®¸® ³ëµå cSceneTreeNode* mContainer; /// ÄÁÅ×À̳ʿ¡ ÀÇÇØ ¼³Á¤µÈ ³»ºÎ ¹Ýº¹ÀÚ tList::cIterator mIteratorByContainer; bool mCheckFrustum; #ifdef REGEN_TOOL bool mCulled; #endif }; inline void cSceneNode::SetNeedUpdateTransform( bool update ) { mNeedUpdateTransform = update; } inline void cSceneNode::SetNeedUpdateEffects( bool update ) { mNeedUpdateEffects = update; } inline void cSceneNode::SetAlphaBlended( float targetAlpha ) { mTargetAlpha = targetAlpha; if( mAlpha != mTargetAlpha ) mEnableAlphaProcess = true; } inline bool cSceneNode::IsAlphaBlended() { if( mAlpha < 1.0f - FLT_EPSILON ) return true; else return false; } inline eSceneNodeType cSceneNode::GetType() { return mType; } inline bool cSceneNode::IsKindof( eSceneNodeType type ) { return (mType & type) == type; } inline const NiPick::Results& cSceneNode::GetPickResults() { return mPick.GetResults(); } inline const NiPoint3& cSceneNode::GetPickPos() { return mPickPos; } inline float cSceneNode::GetPickDistance() { return mPickDistance; } inline const NiPoint3& cSceneNode::GetTranslate() { return GetNiObj()->GetTranslate(); } inline const NiMatrix3& cSceneNode::GetRotate() { return GetNiObj()->GetRotate(); } inline float cSceneNode::GetScale() { return GetNiObj()->GetScale(); } inline const NiPoint3& cSceneNode::GetWorldTranslate() { return GetNiObj()->GetWorldTranslate(); } inline const NiMatrix3& cSceneNode::GetWorldRotate() { return GetNiObj()->GetWorldRotate(); } inline float cSceneNode::GetWorldScale() { return GetNiObj()->GetWorldScale(); } inline const cSphere& cSceneNode::GetBoundSphere() { return mBoundSphere; } inline unsigned int cSceneNode::WhichSide( const NiPlane& plane ) { float dist = plane.Distance( GetCenter() ); float radius = GetRadius(); if( dist <= -radius ) return NiPlane::NEGATIVE_SIDE; else if( dist >= radius ) return NiPlane::POSITIVE_SIDE; else return NiPlane::NO_SIDE; } inline const cString& cSceneNode::GetFileName() { return mFileName; } inline void cSceneNode::SetUserData0( unsigned int data ) { mUserData0 = data; } inline void cSceneNode::SetUserData1( unsigned int data ) { mUserData1 = data; } inline void cSceneNode::SetUserData2( unsigned int data ) { mUserData2 = data; } inline void cSceneNode::SetUserData3( unsigned int data ) { mUserData3 = data; } inline void cSceneNode::SetUserData4( unsigned int data ) { mUserData4 = data; } inline void cSceneNode::SetUserData5( unsigned int data ) { mUserData5 = data; } inline void cSceneNode::SetUserData( void* data ) { mUserData = data; } inline unsigned int cSceneNode::GetUserData0() { return mUserData0; } inline unsigned int cSceneNode::GetUserData1() { return mUserData1; } inline unsigned int cSceneNode::GetUserData2() { return mUserData2; } inline unsigned int cSceneNode::GetUserData3() { return mUserData3; } inline unsigned int cSceneNode::GetUserData4() { return mUserData4; } inline unsigned int cSceneNode::GetUserData5() { return mUserData5; } inline void* cSceneNode::GetUserData() { return mUserData; } inline unsigned int cSceneNode::GetNumGeoms() { return mRenderObjList.GetSize(); } #ifdef REGEN_TOOL inline void cSceneNode::SetCulled( bool culled ) { mCulled = culled; } #endif /// Àå¸é ³ëµå ºñ±³ ÇÔ¼öÀÚ /// ÇÈÅ· °Å¸®·Î ºñ±³ÇÑ´Ù. class cSceneNodeCompareForPicking { public: bool operator () ( cSceneNode* left, cSceneNode* right ) { return left->GetPickDistance() < right->GetPickDistance(); }; };