/* ========================================================================== * ÀÛ ¼º ÀÚ : À̼ø±Ô * ÀÛ ¼º ÀÏ : 2006.12.08 * ³» ¿ë : Àå¸é ³ëµå * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "Ray.h" #include "Sphere.h" class NiCamera; class NiVisibleArray; class cLightSceneNode; class NICOLLISION_ENTRY SimpleBoxPickObjectPolicy : public NiPick::PickObjectPolicy { public: virtual bool FindIntersections( const NiPoint3& kOrigin, const NiPoint3& kDir, NiPick& kPick, NiRenderObject* pkRenderObj); SimpleBoxPickObjectPolicy( bool onlyBound ) { mOnlyBound = onlyBound; } protected: bool mOnlyBound; }; /// ¾ËÆÄ µ¥ÀÌŸ 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: /// °æ·Î À̸§ cString mPathName; /// À§Ä¡ NiPoint3 mTranslate; /// ȸÀü NiMatrix3 mRotate; /// ¹èÀ² float mScale; /// ÇÈÅ· NiPick::QueryType mQueryType; NiPick::SortType mPickSort; NiPick::IntersectType mPickIntersect; NiPick::CoordinateType mPickCoordinate; bool mPickFrontOnly; bool mPickReturnTexture; bool mPickReturnNormal; bool mPickReturnColor; }; /// Àå¸é ³ëµå class cSceneNode { friend class cSceneManager; friend class cSceneTree; friend class cSceneTreeNode; public: /// Àå¸é ³ëµå ŸÀÔ enum eType { eNULL = 0, eRENDERING = (1 << 0), eAREA = (1 << 1), eLIGHT = (1 << 2), eSOUND = (1 << 3), eSTATIC = (1 << 4) | eRENDERING, eMANAGEDSTATIC = (1 << 5) | eSTATIC, eDYNAMIC = (1 << 6) | eRENDERING, eEFFECT = (1 << 7) | eRENDERING, eDROPITEM = (1 << 8) | eMANAGEDSTATIC, eMAPPORTAL = (1 << 9) | eMANAGEDSTATIC, eGATHERING = (1 << 10) | eMANAGEDSTATIC, eDOOR = (1 << 11) | eMANAGEDSTATIC, ePLAYER = (1 << 12) | eDYNAMIC, eNPC = (1 << 13) | eDYNAMIC, eMONSTER = (1 << 14) | eDYNAMIC, eVEHICLE = (1 << 15) | eDYNAMIC, eHERO = (1 << 16) | ePLAYER, }; enum eTypeVer8 { eNULL_VER8 = 0, eAREA_VER8, eLIGHT_VER8, eSOUND_VER8, eSTATIC_VER8, eDYNAMIC_VER8, }; public: /// ó¸® virtual void OnProcess( unsigned long deltaTime, unsigned long accumTime ); virtual void ProcessAlpha( unsigned long deltaTime ); virtual bool OnVisible(); /// ÇÈÅ· virtual bool Pick( const cRay& ray ); /// ÇÈÅ· °á°ú /// ÁÖÀÇ: Pick()¸¦ È£ÃâÇÑ Á÷ÈÄ¿¡¸¸ »ç¿ëÇØ¾ß ÇÑ´Ù. const NiPick::Results& GetPickResults(); const NiPoint3& GetPickPos(); float GetPickDistance(); /// ¾ËÆÄ ºí·»µù virtual void SetAlphaBlended( float targetAlpha ); bool IsAlphaBlended(); virtual void UpdateAlpha(); /// ŸÀÔ eType GetType(); bool IsKindof( eType type ); bool IsEnableFrustumFlag() { return mCheckFrustum; } /// À̵¿ virtual void Translate( const NiPoint3& move ); virtual void SetTranslate( const NiPoint3& trans ); const NiPoint3& GetTranslate(); virtual void SetWorldTranslate( const NiPoint3& trans ); virtual const NiPoint3& GetWorldTranslate(); /// ȸÀü virtual void SetRotate( const NiPoint3& axis, float angle ); virtual void SetRotate( float xangle, float yangle, float zangle ); virtual void SetRotate( const NiMatrix3& rot ); const NiMatrix3& GetRotate(); const NiMatrix3& GetWorldRotate(); /// Å©±â virtual void SetScale( float scale ); float GetScale(); float GetWorldScale(); virtual void SetTargetScale( float /*scale*/ ) {} /// °æ°è ±¸ const cSphere& GetBoundSphere(); /// Áß½ÉÁ¡ virtual const NiPoint3& GetCenter(); /// ¹ÝÁö¸§ virtual float GetRadius(); /// Æò¸éÀÇ ¾î´ÀÂÊ virtual unsigned int WhichSide( const NiPlane& plane ); /// À̸§ const char* GetName(); static NiMesh* GetGeom( NiAVObject* obj ); static void SetAppCulled( NiAVObject* obj, bool cull ); virtual void SetSelectLightFlag( bool attach ); virtual void Play( unsigned long ) {} virtual void Rew( unsigned long ) {} virtual void Stop() {} virtual void SetViewNode( bool view ); virtual bool IsViewNode() { return mViewNode; } inline unsigned int GetIndexByManger() { return mIndexByManager; } virtual inline NiNode* GetNiNode() { return mSceneNiNode; } virtual inline NiAVObject* GetNiObj() { return (NiAVObject*)mSceneNiNode; } /// ½ÃÁ¡¿¡ ÀÇÇÑ Ãæµ¹½Ã ÇÊ¿äó¸® Á¤¸® virtual bool UpdateCameraPickInfo() { return true; } virtual void UpdatePickInfo( void* /*extra*/ ) {} protected: cSceneNode( eType = eNULL ); virtual ~cSceneNode(); /// ÃʱâÈ­ 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 ); virtual void ClearCollectInfo(); /// ±âÇÏ ¿ÀºêÁ§Æ®µéÀ» °¡½Ã ¹è¿­¿¡ Ãß°¡ virtual void AddToVisibleArray(); /// °¡½Ã ·¹º§ unsigned int CalcVisibleLevel(); protected: /// ŸÀÔ eType mType; /// ÇÈÅ· /// Àå¸é Æ®¸®¸¦ ÀÌ¿ëÇÑ Ãæµ¹ °Ë»ç °úÁ¤¿¡¼­ ÇÈÅ·À» ¼öÇàÇϰí, ±× °á°ú¸¦ ÀúÀåÇÑ´Ù. NiPick mPick; NiPoint3 mPickPos; float mPickDistance; /// bool mViewNode; /// °»½Å ÇÊ¿ä ¿©ºÎ bool mNeedUpdateTransform; /// °æ°è ±¸ cSphere mBoundSphere; /// ¾ËÆÄ bool mEnableAlphaProcess; float mTargetAlpha; float mAlpha; float mAlphaSpeed; /// over & select node attach selectLight bool mAttachSelectLight; bool mUpdateSelectLIght; /// Àå¸é °ü¸®ÀÚ¿¡ ÀÇÇØ ¼³Á¤µÈ ³»ºÎ À妽º unsigned int mIndexByManager; /// ÄÁÅ×À̳ʿ¡ ÀÇÇØ ¼³Á¤µÈ ³»ºÎ ¹Ýº¹ÀÚ bool mIteratorValid; tPointerList::cIterator mIteratorByContainer; /// ÀçÁú ¼Ó¼º ¸®½ºÆ® typedef tPointerList cMatPropList; cMatPropList mMatPropList; /// ¾ËÆÄ µ¥ÀÌŸ ¸®½ºÆ® typedef tPointerList cAlphaDataList; cAlphaDataList mAlphaDataList; typedef tList cVertexColorList; cVertexColorList mVertexColorDataList; /// ±âÇÏ ¿ÀºêÁ§Æ® ¸®½ºÆ® typedef tPair cRenderObjPair; typedef tList cRenderObjList; cRenderObjList mRenderObjList; /// ºôº¸µå ³ëµå ¸®½ºÆ® typedef tList cBillboardList; cBillboardList mBillboardList; /// ¿£Áø ¿ÀºêÁ§Æ® // NiAVObjectPtr mNiObject; NiNodePtr mSceneNiNode; /// ÄÁÅ×ÀÌ³Ê /// Àå¸é ³ëµå¸¦ Æ÷ÇÔÇÏ´Â Àå¸é Æ®¸® ³ëµå cSceneTreeNode* mContainer; bool mCheckFrustum; protected: /// Äøµ¿ë static NiCamera* mCamera; static NiVisibleArray* mSolidArray; static NiVisibleArray* mAlphaArray; static NiVisibleArray* mAlphaTestArray; }; inline const NiPick::Results& cSceneNode::GetPickResults() { return mPick.GetResults(); } inline const NiPoint3& cSceneNode::GetPickPos() { return mPickPos; } inline float cSceneNode::GetPickDistance() { return mPickDistance; } 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 cSceneNode::eType cSceneNode::GetType() { return mType; } inline bool cSceneNode::IsKindof( eType type ) { return (mType & type) == type; } 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 char* cSceneNode::GetName() { return (const char*)GetNiObj()->GetName(); } inline void cSceneNode::SetSelectLightFlag( bool attach ) { if( mAttachSelectLight != attach ) { mAttachSelectLight = attach; mUpdateSelectLIght = true; mNeedUpdateTransform = true; } } /// Àå¸é ³ëµå ºñ±³ ÇÔ¼öÀÚ /// ÇÈÅ· °Å¸®·Î ºñ±³ÇÑ´Ù. class cSceneNodeCompareForPicking { public: bool operator () ( const void* left, const void* right ) const { return ( ((cSceneNode*)left)->GetPickDistance() < ((cSceneNode*)right)->GetPickDistance() ); }; };