| 
									
										
										
										
											2017-10-26 17:17:30 +08:00
										 |  |  |  | #include "..\emanagers.h"
 | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | #include "..\enodes.h"
 | 
					
						
							|  |  |  |  | #include "..\elisteners.h"
 | 
					
						
							| 
									
										
										
										
											2017-10-26 17:17:30 +08:00
										 |  |  |  | #include "..\egeometry.h"
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-11-03 12:51:01 +08:00
										 |  |  |  | e2d::EVector<e2d::EListenerPhysics*> s_vListeners; | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | // <20><>״<EFBFBD><D7B4><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-26 17:17:30 +08:00
										 |  |  |  | e2d::EVector<e2d::EGeometry*> s_vGeometries; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-31 17:19:13 +08:00
										 |  |  |  | void e2d::EPhysicsManager::PhysicsGeometryProc(EGeometry * pActiveGeometry) | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	if (s_vListeners.empty() || s_vGeometries.empty() || EApp::isPaused()) | 
					
						
							|  |  |  |  | 		return; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-29 23:48:32 +08:00
										 |  |  |  | 	// pActiveGeometry Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 	EPhysicsMsg::s_pActiveGeometry = pActiveGeometry; | 
					
						
							|  |  |  |  | 	// <20>жϱ仯<CFB1><E4BBAF><EFBFBD><EFBFBD>״̬
 | 
					
						
							|  |  |  |  | 	for (auto &pPassiveGeometry : s_vGeometries) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-10-31 17:19:13 +08:00
										 |  |  |  | 		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2017-10-29 23:48:32 +08:00
										 |  |  |  | 		if (!pPassiveGeometry->getParentNode() ||  | 
					
						
							|  |  |  |  | 			(pPassiveGeometry->getParentNode()->getParentScene() != EApp::getCurrentScene())) | 
					
						
							|  |  |  |  | 			continue; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		if (pActiveGeometry != pPassiveGeometry) | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2017-11-05 14:45:53 +08:00
										 |  |  |  | 			// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><E0BBA5>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 			if (pActiveGeometry->m_nCollisionBitmask & pPassiveGeometry->m_nCategoryBitmask) | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2017-11-05 14:45:53 +08:00
										 |  |  |  | 				// pPassiveGeometry Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 				EPhysicsMsg::s_pPassiveGeometry = pPassiveGeometry; | 
					
						
							|  |  |  |  | 				// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD>ϵ
 | 
					
						
							|  |  |  |  | 				EPhysicsMsg::s_nRelation = pActiveGeometry->_intersectWith(pPassiveGeometry); | 
					
						
							|  |  |  |  | 				// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>Ϊδ֪<CEB4><D6AA><EFBFBD><EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 				if (EPhysicsMsg::s_nRelation != EPhysicsMsg::UNKNOWN && | 
					
						
							|  |  |  |  | 					EPhysicsMsg::s_nRelation != EPhysicsMsg::DISJOINT) | 
					
						
							|  |  |  |  | 				{ | 
					
						
							|  |  |  |  | 					// ִ<>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 					PhysicsListenerProc(); | 
					
						
							|  |  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::EPhysicsManager::PhysicsListenerProc() | 
					
						
							| 
									
										
										
										
											2017-10-26 17:17:30 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | 	// ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 	for (size_t i = 0; i < s_vListeners.size(); i++) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		auto &listener = s_vListeners[i]; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		if (listener->isRunning()) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			if (listener->getParentNode() && | 
					
						
							|  |  |  |  | 				listener->getParentNode()->getParentScene() == EApp::getCurrentScene()) | 
					
						
							|  |  |  |  | 			{ | 
					
						
							|  |  |  |  | 				listener->_callOn(); | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-03 12:51:01 +08:00
										 |  |  |  | void e2d::EPhysicsManager::bindListener(EListenerPhysics * listener, EScene * pParentScene) | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	EPhysicsManager::bindListener(listener, pParentScene->getRoot()); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-03 12:51:01 +08:00
										 |  |  |  | void e2d::EPhysicsManager::bindListener(EListenerPhysics * listener, ENode * pParentNode) | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-11-03 12:51:01 +08:00
										 |  |  |  | 	WARN_IF(listener == nullptr, "EListenerPhysics NULL pointer exception!"); | 
					
						
							|  |  |  |  | 	WARN_IF(pParentNode == nullptr, "EListenerPhysics add to a NULL ENode pointer!"); | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if (listener && pParentNode) | 
					
						
							| 
									
										
										
										
											2017-10-26 17:17:30 +08:00
										 |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		ASSERT( | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | 			!listener->m_pParentNode, | 
					
						
							|  |  |  |  | 			"The listener is already binded, it cannot bind again!" | 
					
						
							| 
									
										
										
										
											2017-10-26 17:17:30 +08:00
										 |  |  |  | 		); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | 		listener->retain(); | 
					
						
							|  |  |  |  | 		listener->start(); | 
					
						
							|  |  |  |  | 		listener->m_pParentNode = pParentNode; | 
					
						
							|  |  |  |  | 		s_vListeners.push_back(listener); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-31 17:19:13 +08:00
										 |  |  |  | void e2d::EPhysicsManager::_addGeometry(EGeometry * geometry) | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	if (geometry) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-10-26 17:17:30 +08:00
										 |  |  |  | 		geometry->retain(); | 
					
						
							|  |  |  |  | 		s_vGeometries.push_back(geometry); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-31 17:19:13 +08:00
										 |  |  |  | void e2d::EPhysicsManager::_delGeometry(EGeometry * geometry) | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	if (geometry) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		for (size_t i = 0; i < s_vGeometries.size(); i++) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			if (s_vGeometries[i] == geometry) | 
					
						
							|  |  |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2017-10-31 17:19:13 +08:00
										 |  |  |  | 				SafeRelease(&geometry); | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | 				s_vGeometries.erase(s_vGeometries.begin() + i); | 
					
						
							|  |  |  |  | 				return; | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::EPhysicsManager::startListeners(const EString & name) | 
					
						
							| 
									
										
										
										
											2017-10-26 17:17:30 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | 	for (auto listener : s_vListeners) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		if (listener->getName() == name) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			listener->start(); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::EPhysicsManager::stopListeners(const EString & name) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	for (auto listener : s_vListeners) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		if (listener->getName() == name) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			listener->stop(); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::EPhysicsManager::delListeners(const EString & name) | 
					
						
							|  |  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-11-03 12:51:01 +08:00
										 |  |  |  | 	EVector<EListenerPhysics*>::iterator iter; | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | 	for (iter = s_vListeners.begin(); iter != s_vListeners.end();) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		if ((*iter)->getName() == name) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2017-10-31 17:19:13 +08:00
										 |  |  |  | 			SafeRelease(&(*iter)); | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | 			iter = s_vListeners.erase(iter); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 		else | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			iter++; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::EPhysicsManager::startAllListenersBindedWith(EScene * pParentScene) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	EPhysicsManager::startAllListenersBindedWith(pParentScene->getRoot()); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::EPhysicsManager::stopAllListenersBindedWith(EScene * pParentScene) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	EPhysicsManager::stopAllListenersBindedWith(pParentScene->getRoot()); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::EPhysicsManager::startAllListenersBindedWith(ENode * pParentNode) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	for (auto listener : s_vListeners) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		if (listener->getParentNode() == pParentNode) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			listener->start(); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	for (auto child : pParentNode->getChildren()) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		EPhysicsManager::startAllListenersBindedWith(child); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::EPhysicsManager::stopAllListenersBindedWith(ENode * pParentNode) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	for (auto listener : s_vListeners) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		if (listener->getParentNode() == pParentNode) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			listener->stop(); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	for (auto child : pParentNode->getChildren()) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		EPhysicsManager::stopAllListenersBindedWith(child); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::EPhysicsManager::startAllListeners() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	EPhysicsManager::startAllListenersBindedWith(EApp::getCurrentScene()); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::EPhysicsManager::stopAllListeners() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	EPhysicsManager::stopAllListenersBindedWith(EApp::getCurrentScene()); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::EPhysicsManager::_clearManager() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	s_vListeners.clear(); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::EPhysicsManager::_clearAllListenersBindedWith(ENode * pParentNode) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	for (size_t i = 0; i < s_vListeners.size();) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		auto listener = s_vListeners[i]; | 
					
						
							|  |  |  |  | 		if (listener->getParentNode() == pParentNode) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2017-10-31 17:19:13 +08:00
										 |  |  |  | 			SafeRelease(&listener); | 
					
						
							| 
									
										
										
										
											2017-10-28 18:48:21 +08:00
										 |  |  |  | 			s_vListeners.erase(s_vListeners.begin() + i); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 		else | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			i++; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-10-26 17:17:30 +08:00
										 |  |  |  | } |