/* ========================================================================== * ÀÛ ¼º ÀÚ : À̼ø±Ô * ÀÛ ¼º ÀÏ : 2007.11.23 * ³» ¿ë : ±×¸²ÀÚ ±âÇÏ * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once class cDynamicSceneNode; /// ±×¸²ÀÚ ±âÇÏ class cShadowGeometry { friend class cShadowGeomCompareForRendering; public: cShadowGeometry(); ~cShadowGeometry(); /// Áö¿ò void Clear(); /// ÃʱâÈ­ bool Init( NiTexture* tex, float maxRadius, float height = 2.0f, bool zTest = true ); /// ó¸® void Process( bool needUpdate, const NiPoint3& center, float alpha ); void Draw( NiRenderer* renderer ); /// void SetTexture( NiTexture* tex ); NiTexture* GetTexture() const; void SetRadius( float r ); protected: void AddShadowTriangle( NiPoint3* v, NiDataStreamElementLock& kPositionLock, NiDataStreamElementLock& kTexCoordLock ); void CalcRange( unsigned int* xbegin, unsigned int* ybegin, unsigned int* xend, unsigned int* yend, float x, float y, float radius ); void SetActiveCount( unsigned int count ); protected: /// ¹ÝÁö¸§ float mMaxRadius; float mRadius; /// ÁöÇ¥¸éÀ¸·ÎºÎÅÍÀÇ ³ôÀÌ float mHeight; /// int mLineCount; /// ÃÖ´ë Á¤Á¡ ¼ö unsigned int mMaxVerts; unsigned int mActiveCount; /// NiPoint3 mCenter; float mOOWidth; /// ¾ËÆÄ°ª float mAlpha; /// ±×¸²ÀÚ »ï°¢Çü NiMeshPtr mTris; NiTexturingPropertyPtr mTexProp; NiTexture* mTex; }; inline NiTexture* cShadowGeometry::GetTexture() const { return mTex; } inline void cShadowGeometry::SetRadius( float r ) { if( r > mMaxRadius ) mRadius = mMaxRadius; else mRadius = r; } /// ±×¸²ÀÚ ±âÇÏ ºñ±³ ÇÔ¼öÀÚ class cShadowGeomCompareForRendering { public: bool operator () ( const cShadowGeometry* left, const cShadowGeometry* right ) const { return left->mTex > right->mTex; }; };