| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | #include "..\e2dbase.h"
 | 
					
						
							| 
									
										
										
										
											2018-04-21 21:24:46 +08:00
										 |  |  | #include "..\e2dtransition.h"
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | #include "..\e2dnode.h"
 | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-14 00:26:20 +08:00
										 |  |  | e2d::Transition::Transition(Scene* scene, float duration) | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 	: _end(false) | 
					
						
							| 
									
										
										
										
											2018-08-02 00:27:45 +08:00
										 |  |  | 	, _started() | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 	, _delta(0) | 
					
						
							|  |  |  | 	, _outScene(nullptr) | 
					
						
							| 
									
										
										
										
											2018-08-14 00:26:20 +08:00
										 |  |  | 	, _inScene(scene) | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 	, _outLayer(nullptr) | 
					
						
							|  |  |  | 	, _inLayer(nullptr) | 
					
						
							|  |  |  | 	, _outLayerParam() | 
					
						
							|  |  |  | 	, _inLayerParam() | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-07-28 20:06:27 +08:00
										 |  |  | 	_duration = std::max(duration, 0.f); | 
					
						
							| 
									
										
										
										
											2018-08-14 00:26:20 +08:00
										 |  |  | 	if (_inScene) | 
					
						
							|  |  |  | 		_inScene->retain(); | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | e2d::Transition::~Transition() | 
					
						
							| 
									
										
										
										
											2018-04-17 01:11:56 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-22 12:24:43 +08:00
										 |  |  | 	SafeRelease(_outLayer); | 
					
						
							|  |  |  | 	SafeRelease(_inLayer); | 
					
						
							| 
									
										
										
										
											2018-08-23 16:37:51 +08:00
										 |  |  | 	GC::getInstance()->safeRelease(_outScene); | 
					
						
							|  |  |  | 	GC::getInstance()->safeRelease(_inScene); | 
					
						
							| 
									
										
										
										
											2018-04-17 01:11:56 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-23 16:37:51 +08:00
										 |  |  | bool e2d::Transition::isDone() | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 	return _end; | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-19 15:11:20 +08:00
										 |  |  | bool e2d::Transition::_init(Game * game, Scene * prev) | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-08-14 00:26:20 +08:00
										 |  |  | 	_started = Time::now(); | 
					
						
							|  |  |  | 	_outScene = prev; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (_outScene) | 
					
						
							|  |  |  | 		_outScene->retain(); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	HRESULT hr = S_OK; | 
					
						
							| 
									
										
										
										
											2018-08-28 00:06:10 +08:00
										 |  |  | 	auto renderer = Renderer::getInstance(); | 
					
						
							| 
									
										
										
										
											2018-08-14 00:26:20 +08:00
										 |  |  | 	if (_inScene) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-08-23 16:37:51 +08:00
										 |  |  | 		hr = renderer->getRenderTarget()->CreateLayer(&_inLayer); | 
					
						
							| 
									
										
										
										
											2018-08-14 00:26:20 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-14 00:26:20 +08:00
										 |  |  | 	if (SUCCEEDED(hr) && _outScene) | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-08-23 16:37:51 +08:00
										 |  |  | 		hr = renderer->getRenderTarget()->CreateLayer(&_outLayer); | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (FAILED(hr)) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-08-02 00:27:45 +08:00
										 |  |  | 		return false; | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-24 00:24:29 +08:00
										 |  |  | 	_outLayerParam = _inLayerParam = D2D1::LayerParameters( | 
					
						
							|  |  |  | 		D2D1::InfiniteRect(), | 
					
						
							|  |  |  | 		nullptr, | 
					
						
							|  |  |  | 		D2D1_ANTIALIAS_MODE_PER_PRIMITIVE, | 
					
						
							|  |  |  | 		D2D1::Matrix3x2F::Identity(), | 
					
						
							| 
									
										
										
										
											2018-07-28 20:06:27 +08:00
										 |  |  | 		1.f, | 
					
						
							| 
									
										
										
										
											2018-08-23 16:37:51 +08:00
										 |  |  | 		renderer->getSolidColorBrush(), | 
					
						
							| 
									
										
										
										
											2018-07-24 00:24:29 +08:00
										 |  |  | 		D2D1_LAYER_OPTIONS_NONE | 
					
						
							|  |  |  | 	); | 
					
						
							| 
									
										
										
										
											2018-08-02 00:27:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return true; | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-14 00:26:20 +08:00
										 |  |  | void e2d::Transition::_update() | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | { | 
					
						
							|  |  |  | 	if (_duration == 0) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		_delta = 1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-08-02 00:27:45 +08:00
										 |  |  | 		_delta = (Time::now() - _started).seconds() / _duration; | 
					
						
							| 
									
										
										
										
											2018-07-28 20:06:27 +08:00
										 |  |  | 		_delta = std::min(_delta, 1.f); | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-28 00:06:10 +08:00
										 |  |  | void e2d::Transition::_render() | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-08-28 00:06:10 +08:00
										 |  |  | 	auto renderTarget = Renderer::getInstance()->getRenderTarget(); | 
					
						
							|  |  |  | 	auto size = Window::getInstance()->getSize(); | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (_outScene) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-08-28 00:06:10 +08:00
										 |  |  | 		auto rootPos = _outScene->getPos(); | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 		auto clipRect = D2D1::RectF( | 
					
						
							| 
									
										
										
										
											2018-07-28 20:06:27 +08:00
										 |  |  | 			std::max(rootPos.x, 0.f), | 
					
						
							|  |  |  | 			std::max(rootPos.y, 0.f), | 
					
						
							| 
									
										
										
										
											2018-08-28 00:06:10 +08:00
										 |  |  | 			std::min(rootPos.x + size.width, size.width), | 
					
						
							|  |  |  | 			std::min(rootPos.y + size.height, size.height) | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-08-19 15:11:20 +08:00
										 |  |  | 		renderTarget->SetTransform(D2D1::Matrix3x2F::Identity()); | 
					
						
							|  |  |  | 		renderTarget->PushAxisAlignedClip(clipRect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); | 
					
						
							|  |  |  | 		renderTarget->PushLayer(_outLayerParam, _outLayer); | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-28 00:06:10 +08:00
										 |  |  | 		_outScene->visit(); | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-19 15:11:20 +08:00
										 |  |  | 		renderTarget->PopLayer(); | 
					
						
							|  |  |  | 		renderTarget->PopAxisAlignedClip(); | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (_inScene) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-08-23 16:37:51 +08:00
										 |  |  | 		Point rootPos = _inScene->getPos(); | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 		auto clipRect = D2D1::RectF( | 
					
						
							| 
									
										
										
										
											2018-07-28 20:06:27 +08:00
										 |  |  | 			std::max(rootPos.x, 0.f), | 
					
						
							|  |  |  | 			std::max(rootPos.y, 0.f), | 
					
						
							| 
									
										
										
										
											2018-08-28 00:06:10 +08:00
										 |  |  | 			std::min(rootPos.x + size.width, size.width), | 
					
						
							|  |  |  | 			std::min(rootPos.y + size.height, size.height) | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-08-19 15:11:20 +08:00
										 |  |  | 		renderTarget->SetTransform(D2D1::Matrix3x2F::Identity()); | 
					
						
							|  |  |  | 		renderTarget->PushAxisAlignedClip(clipRect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); | 
					
						
							|  |  |  | 		renderTarget->PushLayer(_inLayerParam, _inLayer); | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-28 00:06:10 +08:00
										 |  |  | 		_inScene->visit(); | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-19 15:11:20 +08:00
										 |  |  | 		renderTarget->PopLayer(); | 
					
						
							|  |  |  | 		renderTarget->PopAxisAlignedClip(); | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-14 00:26:20 +08:00
										 |  |  | void e2d::Transition::_stop() | 
					
						
							| 
									
										
										
										
											2018-05-09 00:34:15 +08:00
										 |  |  | { | 
					
						
							|  |  |  | 	_end = true; | 
					
						
							| 
									
										
										
										
											2018-08-14 00:26:20 +08:00
										 |  |  | 	_reset(); | 
					
						
							| 
									
										
										
										
											2017-12-09 15:27:11 +08:00
										 |  |  | } |