/** @file SnapTool.h @brief 吸点工具
*	Copyright (c) 2007,第九城市游戏研发中心
*	All rights reserved.
*
*	当前版本:2009-02-04
*	作    者:和萌
*	完成日期:
*
*	取代版本:
*	作    者:
*	完成日期:
*/ #pragma once #include #ifndef _SNAPTOOL_H #define _SNAPTOOL_H #ifndef CODE_INGAME //源物件与目标物件之间的最大距离,只有小于最大距离时才进行吸附 #define MAX_DISTANCE 100.0f struct RecursiveFindGeometries { bool operator() (NiAVObject* pkAVObject) { if (NiIsKindOf(NiNode, pkAVObject)) { NiNode* pkNode = NiDynamicCast(NiNode, pkAVObject); if ( pkNode->GetName().ContainsNoCase("Snap") ) { NiPoint3* pkPos = NiNew NiPoint3; pkPos->x = pkNode->GetWorldTranslate().x; pkPos->y = pkNode->GetWorldTranslate().y; pkPos->z = pkNode->GetWorldTranslate().z; m_pkPos.push_back(pkPos); } } return true; } vector m_pkPos; }; //---------------------------------------------------------------------------------------------------- class MAIN_ENTRY CSnapTool { public: CSnapTool(void); ~CSnapTool(void); static CSnapTool* Instance(); bool SetSrcEntity(NiAVObject* pkEntity); bool SetDesEntity(NiAVObject* pkEntity); // 判断是否是可吸附物件 // 返回 0 否 // 1 源物件 // 2 目标物件 // -1 错误 int IsSnapEntity(NiAVObject* pkObject); NiAVObject* GetSrcEntity() {return m_pkSrcEntity;} NiAVObject* GetDesEntity() {return m_pkDesEntity;} /*NiAVObject* GetSanpSign() { return m_pkSnapSign; }*/ bool GetDesPos(NiPoint3 &kCurrPos); bool ClearSnapEntity(); /*bool RenderSnapEntityVertice(NiRenderer* pkRenderer);*/ void Do_Dispos(); enum EEntityType { EP_NONE, EP_SRC, EP_DES }; private: CSnapTool(CSnapTool&); float _ComputeDistance(NiPoint3 kSrcPos, NiPoint3 kDesPos); bool _IsValidaEntity(NiAVObject* pkEntity); /*bool _CreateGeom(EEntityType epType);*/ // 源物件,即需要移动的物件 NiAVObject* m_pkSrcEntity; // 目标物件,即吸附的物件 NiAVObject* m_pkDesEntity; NiAVObject* m_pkSnapSign; // 源物件snap点标志 NiLinesPtr m_pkSrcGeom; // 目标物件snap点标志 NiLinesPtr m_pkDesGeom; static CSnapTool* ms_pkThis; }; #endif #endif