| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | #include "..\ebase.h"
 | 
					
						
							| 
									
										
										
										
											2018-04-02 23:01:38 +08:00
										 |  |  |  | #include "..\etransition.h"
 | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-27 21:07:43 +08:00
										 |  |  |  | e2d::Transition::Transition(double duration) | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  |  | 	: m_bEnd(false) | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 	, m_fLast(0) | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  |  | 	, m_fRateOfProgress(0) | 
					
						
							|  |  |  |  | 	, m_pPrevScene(nullptr) | 
					
						
							|  |  |  |  | 	, m_pNextScene(nullptr) | 
					
						
							| 
									
										
										
										
											2018-04-17 01:11:56 +08:00
										 |  |  |  | 	, m_pPrevLayer(nullptr) | 
					
						
							|  |  |  |  | 	, m_pNextLayer(nullptr) | 
					
						
							|  |  |  |  | 	, m_sPrevLayerParam() | 
					
						
							|  |  |  |  | 	, m_sNextLayerParam() | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 	m_fDuration = max(duration, 0); | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 01:11:56 +08:00
										 |  |  |  | e2d::Transition::~Transition() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	SafeRelease(&m_pPrevScene); | 
					
						
							|  |  |  |  | 	SafeRelease(&m_pNextScene); | 
					
						
							|  |  |  |  | 	SafeReleaseInterface(&m_pPrevLayer); | 
					
						
							|  |  |  |  | 	SafeReleaseInterface(&m_pNextLayer); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  |  | bool e2d::Transition::isEnding() | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	return m_bEnd; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 01:11:56 +08:00
										 |  |  |  | void e2d::Transition::_init(Scene * prev, Scene * next) | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-04-17 01:11:56 +08:00
										 |  |  |  | 	// <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
 | 
					
						
							|  |  |  |  | 	HRESULT hr = Renderer::getRenderTarget()->CreateLayer(&m_pNextLayer); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if (SUCCEEDED(hr)) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		hr = Renderer::getRenderTarget()->CreateLayer(&m_pPrevLayer); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if (FAILED(hr)) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		ASSERT(false, L"Create layer failed!"); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	m_fLast = Time::getTotalTime(); | 
					
						
							|  |  |  |  | 	m_pPrevScene = prev; | 
					
						
							|  |  |  |  | 	m_pNextScene = next; | 
					
						
							|  |  |  |  | 	if (m_pPrevScene) m_pPrevScene->retain(); | 
					
						
							|  |  |  |  | 	if (m_pNextScene) m_pNextScene->retain(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	auto size = Window::getSize(); | 
					
						
							|  |  |  |  | 	m_sPrevLayerParam = m_sNextLayerParam = D2D1::LayerParameters( | 
					
						
							|  |  |  |  | 		D2D1::RectF(0, 0, float(size.width), float(size.height)) | 
					
						
							|  |  |  |  | 	); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::Transition::_update() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD>㶯<EFBFBD><E3B6AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 	if (m_fDuration == 0) | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		m_fRateOfProgress = 1; | 
					
						
							| 
									
										
										
										
											2018-04-17 01:11:56 +08:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | 	else | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		m_fRateOfProgress = min((Time::getTotalTime() - m_fLast) / m_fDuration, 1); | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 01:11:56 +08:00
										 |  |  |  | 	this->_updateCustom(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD>³<EFBFBD><C2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 	if (m_pPrevScene) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		m_pPrevScene->_update(); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	if (m_pNextScene) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		m_pNextScene->_update(); | 
					
						
							|  |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 01:11:56 +08:00
										 |  |  |  | void e2d::Transition::_render() | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-04-17 01:11:56 +08:00
										 |  |  |  | 	auto pRT = Renderer::getRenderTarget(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if (m_pPrevScene) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		pRT->SetTransform(D2D1::Matrix3x2F::Identity()); | 
					
						
							|  |  |  |  | 		pRT->PushLayer(m_sPrevLayerParam, m_pPrevLayer); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// <20><>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 		m_pPrevScene->_render(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		pRT->PopLayer(); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if (m_pNextScene) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		pRT->SetTransform(D2D1::Matrix3x2F::Identity()); | 
					
						
							|  |  |  |  | 		pRT->PushLayer(m_sNextLayerParam, m_pNextLayer); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// <20><>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 		m_pNextScene->_render(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		pRT->PopLayer(); | 
					
						
							|  |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 01:11:56 +08:00
										 |  |  |  | void e2d::Transition::_stop() | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-04-17 01:11:56 +08:00
										 |  |  |  | 	m_bEnd = true; | 
					
						
							|  |  |  |  | 	_reset(); | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  |  | } |