1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048 |
- /****************************************************************************
- Copyright (c) 2008-2010 Ricardo Quesada
- Copyright (c) 2010-2012 cocos2d-x.org
- Copyright (c) 2011 Zynga Inc.
- Copyright (c) 2013-2017 Chukong Technologies Inc.
-
- http://www.cocos2d-x.org
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- ****************************************************************************/
- #include <stdarg.h>
- #include "2d/CCLayer.h"
- #include "base/CCScriptSupport.h"
- #include "platform/CCDevice.h"
- #include "renderer/CCRenderer.h"
- #include "renderer/ccGLStateCache.h"
- #include "renderer/CCGLProgramState.h"
- #include "base/CCDirector.h"
- #include "base/CCEventDispatcher.h"
- #include "base/CCEventListenerTouch.h"
- #include "base/CCEventTouch.h"
- #include "base/CCEventKeyboard.h"
- #include "base/CCEventListenerKeyboard.h"
- #include "base/CCEventAcceleration.h"
- #include "base/CCEventListenerAcceleration.h"
- #include "base/ccUTF8.h"
- NS_CC_BEGIN
- // Layer
- Layer::Layer()
- : _touchEnabled(false)
- , _accelerometerEnabled(false)
- , _keyboardEnabled(false)
- , _touchListener(nullptr)
- , _keyboardListener(nullptr)
- , _accelerationListener(nullptr)
- , _touchMode(Touch::DispatchMode::ALL_AT_ONCE)
- , _swallowsTouches(true)
- {
- _ignoreAnchorPointForPosition = true;
- setAnchorPoint(Vec2(0.5f, 0.5f));
- }
- Layer::~Layer()
- {
- }
- bool Layer::init()
- {
- Director * director = Director::getInstance();
- setContentSize(director->getWinSize());
- return true;
- }
- Layer *Layer::create()
- {
- Layer *ret = new (std::nothrow) Layer();
- if (ret && ret->init())
- {
- ret->autorelease();
- return ret;
- }
- else
- {
- CC_SAFE_DELETE(ret);
- return nullptr;
- }
- }
- int Layer::executeScriptTouchHandler(EventTouch::EventCode eventType, Touch* touch, Event* event)
- {
- #if CC_ENABLE_SCRIPT_BINDING
- if (kScriptTypeLua == _scriptType)
- {
- TouchScriptData data(eventType, this, touch, event);
- ScriptEvent scriptEvent(kTouchEvent, &data);
- return ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&scriptEvent);
- }
- #else
- CC_UNUSED_PARAM(eventType);
- CC_UNUSED_PARAM(touch);
- CC_UNUSED_PARAM(event);
- #endif
- return 0;
- }
- int Layer::executeScriptTouchesHandler(EventTouch::EventCode eventType, const std::vector<Touch*>& touches, Event* event)
- {
- #if CC_ENABLE_SCRIPT_BINDING
- if (kScriptTypeLua == _scriptType)
- {
- TouchesScriptData data(eventType, this, touches, event);
- ScriptEvent scriptEvent(kTouchesEvent, &data);
- return ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&scriptEvent);
- }
- #else
- CC_UNUSED_PARAM(eventType);
- CC_UNUSED_PARAM(touches);
- CC_UNUSED_PARAM(event);
- #endif
- return 0;
- }
- bool Layer::ccTouchBegan(Touch* /*pTouch*/, Event* /*pEvent*/) {return false;};
- void Layer::ccTouchMoved(Touch* /*pTouch*/, Event* /*pEvent*/) {}
- void Layer::ccTouchEnded(Touch* /*pTouch*/, Event* /*pEvent*/) {}
- void Layer::ccTouchCancelled(Touch* /*pTouch*/, Event* /*pEvent*/) {}
- void Layer::ccTouchesBegan(__Set* /*pTouches*/, Event* /*pEvent*/) {}
- void Layer::ccTouchesMoved(__Set* /*pTouches*/, Event* /*pEvent*/) {}
- void Layer::ccTouchesEnded(__Set* /*pTouches*/, Event* /*pEvent*/) {}
- void Layer::ccTouchesCancelled(__Set* /*pTouches*/, Event* /*pEvent*/) {}
- #if defined(__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
- #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- #elif _MSC_VER >= 1400 //vs 2005 or higher
- #pragma warning (push)
- #pragma warning (disable: 4996)
- #endif
- /// isTouchEnabled getter
- bool Layer::isTouchEnabled() const
- {
- return _touchEnabled;
- }
- /// isTouchEnabled setter
- void Layer::setTouchEnabled(bool enabled)
- {
- if (_touchEnabled != enabled)
- {
- _touchEnabled = enabled;
- if (enabled)
- {
- if (_touchListener != nullptr)
- return;
- if( _touchMode == Touch::DispatchMode::ALL_AT_ONCE )
- {
- // Register Touch Event
- auto listener = EventListenerTouchAllAtOnce::create();
- listener->onTouchesBegan = CC_CALLBACK_2(Layer::onTouchesBegan, this);
- listener->onTouchesMoved = CC_CALLBACK_2(Layer::onTouchesMoved, this);
- listener->onTouchesEnded = CC_CALLBACK_2(Layer::onTouchesEnded, this);
- listener->onTouchesCancelled = CC_CALLBACK_2(Layer::onTouchesCancelled, this);
- _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
- _touchListener = listener;
- }
- else
- {
- // Register Touch Event
- auto listener = EventListenerTouchOneByOne::create();
- listener->setSwallowTouches(_swallowsTouches);
- listener->onTouchBegan = CC_CALLBACK_2(Layer::onTouchBegan, this);
- listener->onTouchMoved = CC_CALLBACK_2(Layer::onTouchMoved, this);
- listener->onTouchEnded = CC_CALLBACK_2(Layer::onTouchEnded, this);
- listener->onTouchCancelled = CC_CALLBACK_2(Layer::onTouchCancelled, this);
- _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
- _touchListener = listener;
- }
- }
- else
- {
- _eventDispatcher->removeEventListener(_touchListener);
- _touchListener = nullptr;
- }
- }
- }
- void Layer::setTouchMode(Touch::DispatchMode mode)
- {
- if(_touchMode != mode)
- {
- _touchMode = mode;
- if( _touchEnabled)
- {
- setTouchEnabled(false);
- setTouchEnabled(true);
- }
- }
- }
- void Layer::setSwallowsTouches(bool swallowsTouches)
- {
- if (_swallowsTouches != swallowsTouches)
- {
- _swallowsTouches = swallowsTouches;
- if( _touchEnabled)
- {
- setTouchEnabled(false);
- setTouchEnabled(true);
- }
- }
- }
- Touch::DispatchMode Layer::getTouchMode() const
- {
- return _touchMode;
- }
- bool Layer::isSwallowsTouches() const
- {
- return _swallowsTouches;
- }
- /// isAccelerometerEnabled getter
- bool Layer::isAccelerometerEnabled() const
- {
- return _accelerometerEnabled;
- }
- /// isAccelerometerEnabled setter
- void Layer::setAccelerometerEnabled(bool enabled)
- {
- if (enabled != _accelerometerEnabled)
- {
- _accelerometerEnabled = enabled;
- Device::setAccelerometerEnabled(enabled);
- _eventDispatcher->removeEventListener(_accelerationListener);
- _accelerationListener = nullptr;
- if (enabled)
- {
- _accelerationListener = EventListenerAcceleration::create(CC_CALLBACK_2(Layer::onAcceleration, this));
- _eventDispatcher->addEventListenerWithSceneGraphPriority(_accelerationListener, this);
- }
- }
- }
- void Layer::setAccelerometerInterval(double interval) {
- if (_accelerometerEnabled)
- {
- if (_running)
- {
- Device::setAccelerometerInterval(interval);
- }
- }
- }
- void Layer::onAcceleration(Acceleration* acc, Event* /*unused_event*/)
- {
- #if CC_ENABLE_SCRIPT_BINDING
- if(kScriptTypeNone != _scriptType)
- {
- BasicScriptData data(this,(void*)acc);
- ScriptEvent event(kAccelerometerEvent,&data);
- ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&event);
- }
- #else
- CC_UNUSED_PARAM(acc);
- #endif
- }
- void Layer::onKeyPressed(EventKeyboard::KeyCode /*keyCode*/, Event* /*unused_event*/)
- {
- }
- void Layer::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* /*unused_event*/)
- {
- #if CC_ENABLE_SCRIPT_BINDING
- if(kScriptTypeNone != _scriptType)
- {
- KeypadScriptData data(keyCode, this);
- ScriptEvent event(kKeypadEvent,&data);
- ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&event);
- }
- #else
- CC_UNUSED_PARAM(keyCode);
- #endif
- }
- /// isKeyboardEnabled getter
- bool Layer::isKeyboardEnabled() const
- {
- return _keyboardEnabled;
- }
- /// isKeyboardEnabled setter
- void Layer::setKeyboardEnabled(bool enabled)
- {
- if (enabled != _keyboardEnabled)
- {
- _keyboardEnabled = enabled;
- _eventDispatcher->removeEventListener(_keyboardListener);
- _keyboardListener = nullptr;
- if (enabled)
- {
- auto listener = EventListenerKeyboard::create();
- listener->onKeyPressed = CC_CALLBACK_2(Layer::onKeyPressed, this);
- listener->onKeyReleased = CC_CALLBACK_2(Layer::onKeyReleased, this);
- _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
- _keyboardListener = listener;
- }
- }
- }
- void Layer::setKeypadEnabled(bool enabled)
- {
- setKeyboardEnabled(enabled);
- }
- /// Callbacks
- bool Layer::onTouchBegan(Touch *touch, Event *event)
- {
- #if CC_ENABLE_SCRIPT_BINDING
- if (kScriptTypeLua == _scriptType)
- {
- return executeScriptTouchHandler(EventTouch::EventCode::BEGAN, touch, event) == 0 ? false : true;
- }
- #else
- CC_UNUSED_PARAM(touch);
- CC_UNUSED_PARAM(event);
- #endif
- CCASSERT(false, "Layer#ccTouchBegan override me");
- return true;
- }
- void Layer::onTouchMoved(Touch *touch, Event *event)
- {
- #if CC_ENABLE_SCRIPT_BINDING
- if (kScriptTypeLua == _scriptType)
- {
- executeScriptTouchHandler(EventTouch::EventCode::MOVED, touch, event);
- return;
- }
- #else
- CC_UNUSED_PARAM(touch);
- CC_UNUSED_PARAM(event);
- #endif
- }
- void Layer::onTouchEnded(Touch *touch, Event *event)
- {
- #if CC_ENABLE_SCRIPT_BINDING
- if (kScriptTypeLua == _scriptType)
- {
- executeScriptTouchHandler(EventTouch::EventCode::ENDED, touch, event);
- return;
- }
- #else
- CC_UNUSED_PARAM(touch);
- CC_UNUSED_PARAM(event);
- #endif
- }
- void Layer::onTouchCancelled(Touch *touch, Event *event)
- {
- #if CC_ENABLE_SCRIPT_BINDING
- if (kScriptTypeLua == _scriptType)
- {
- executeScriptTouchHandler(EventTouch::EventCode::CANCELLED, touch, event);
- return;
- }
- #else
- CC_UNUSED_PARAM(touch);
- CC_UNUSED_PARAM(event);
- #endif
- }
- void Layer::onTouchesBegan(const std::vector<Touch*>& touches, Event *event)
- {
- #if CC_ENABLE_SCRIPT_BINDING
- if (kScriptTypeLua == _scriptType)
- {
- executeScriptTouchesHandler(EventTouch::EventCode::BEGAN, touches, event);
- return;
- }
- #else
- CC_UNUSED_PARAM(touches);
- CC_UNUSED_PARAM(event);
- #endif
- }
- void Layer::onTouchesMoved(const std::vector<Touch*>& touches, Event *event)
- {
- #if CC_ENABLE_SCRIPT_BINDING
- if (kScriptTypeLua == _scriptType)
- {
- executeScriptTouchesHandler(EventTouch::EventCode::MOVED, touches, event);
- return;
- }
- #else
- CC_UNUSED_PARAM(touches);
- CC_UNUSED_PARAM(event);
- #endif
- }
- void Layer::onTouchesEnded(const std::vector<Touch*>& touches, Event *event)
- {
- #if CC_ENABLE_SCRIPT_BINDING
- if (kScriptTypeLua == _scriptType)
- {
- executeScriptTouchesHandler(EventTouch::EventCode::ENDED, touches, event);
- return;
- }
- #else
- CC_UNUSED_PARAM(touches);
- CC_UNUSED_PARAM(event);
- #endif
- }
- void Layer::onTouchesCancelled(const std::vector<Touch*>& touches, Event *event)
- {
- #if CC_ENABLE_SCRIPT_BINDING
- if (kScriptTypeLua == _scriptType)
- {
- executeScriptTouchesHandler(EventTouch::EventCode::CANCELLED, touches, event);
- return;
- }
- #else
- CC_UNUSED_PARAM(touches);
- CC_UNUSED_PARAM(event);
- #endif
- }
- std::string Layer::getDescription() const
- {
- return StringUtils::format("<Layer | Tag = %d>", _tag);
- }
- __LayerRGBA::__LayerRGBA()
- {
- CCLOG("LayerRGBA deprecated.");
- }
- #if defined(__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
- #pragma GCC diagnostic warning "-Wdeprecated-declarations"
- #elif _MSC_VER >= 1400 //vs 2005 or higher
- #pragma warning (pop)
- #endif
- /// LayerColor
- LayerColor::LayerColor()
- {
- // default blend function
- _blendFunc = BlendFunc::ALPHA_PREMULTIPLIED;
- }
-
- LayerColor::~LayerColor()
- {
- }
- /// blendFunc getter
- const BlendFunc &LayerColor::getBlendFunc() const
- {
- return _blendFunc;
- }
- /// blendFunc setter
- void LayerColor::setBlendFunc(const BlendFunc &var)
- {
- _blendFunc = var;
- }
- LayerColor* LayerColor::create()
- {
- LayerColor* ret = new (std::nothrow) LayerColor();
- if (ret && ret->init())
- {
- ret->autorelease();
- }
- else
- {
- CC_SAFE_DELETE(ret);
- }
- return ret;
- }
- LayerColor * LayerColor::create(const Color4B& color, GLfloat width, GLfloat height)
- {
- LayerColor * layer = new (std::nothrow) LayerColor();
- if( layer && layer->initWithColor(color,width,height))
- {
- layer->autorelease();
- return layer;
- }
- CC_SAFE_DELETE(layer);
- return nullptr;
- }
- LayerColor * LayerColor::create(const Color4B& color)
- {
- LayerColor * layer = new (std::nothrow) LayerColor();
- if(layer && layer->initWithColor(color))
- {
- layer->autorelease();
- return layer;
- }
- CC_SAFE_DELETE(layer);
- return nullptr;
- }
- bool LayerColor::init()
- {
- Size s = Director::getInstance()->getWinSize();
- return initWithColor(Color4B(0,0,0,0), s.width, s.height);
- }
- bool LayerColor::initWithColor(const Color4B& color, GLfloat w, GLfloat h)
- {
- if (Layer::init())
- {
- // default blend function
- _blendFunc = BlendFunc::ALPHA_NON_PREMULTIPLIED;
- _displayedColor.r = _realColor.r = color.r;
- _displayedColor.g = _realColor.g = color.g;
- _displayedColor.b = _realColor.b = color.b;
- _displayedOpacity = _realOpacity = color.a;
- for (size_t i = 0; i<sizeof(_squareVertices) / sizeof( _squareVertices[0]); i++ )
- {
- _squareVertices[i].x = 0.0f;
- _squareVertices[i].y = 0.0f;
- }
- updateColor();
- setContentSize(Size(w, h));
- setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_COLOR_NO_MVP));
- return true;
- }
- return false;
- }
- bool LayerColor::initWithColor(const Color4B& color)
- {
- Size s = Director::getInstance()->getWinSize();
- return initWithColor(color, s.width, s.height);
- }
- /// override contentSize
- void LayerColor::setContentSize(const Size & size)
- {
- _squareVertices[1].x = size.width;
- _squareVertices[2].y = size.height;
- _squareVertices[3].x = size.width;
- _squareVertices[3].y = size.height;
- Layer::setContentSize(size);
- }
- void LayerColor::changeWidthAndHeight(GLfloat w ,GLfloat h)
- {
- this->setContentSize(Size(w, h));
- }
- void LayerColor::changeWidth(GLfloat w)
- {
- this->setContentSize(Size(w, _contentSize.height));
- }
- void LayerColor::changeHeight(GLfloat h)
- {
- this->setContentSize(Size(_contentSize.width, h));
- }
- void LayerColor::updateColor()
- {
- for( unsigned int i=0; i < 4; i++ )
- {
- _squareColors[i].r = _displayedColor.r / 255.0f;
- _squareColors[i].g = _displayedColor.g / 255.0f;
- _squareColors[i].b = _displayedColor.b / 255.0f;
- _squareColors[i].a = _displayedOpacity / 255.0f;
- }
- }
- void LayerColor::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
- {
- _customCommand.init(_globalZOrder, transform, flags);
- _customCommand.func = CC_CALLBACK_0(LayerColor::onDraw, this, transform, flags);
- renderer->addCommand(&_customCommand);
-
- for(int i = 0; i < 4; ++i)
- {
- Vec4 pos;
- pos.x = _squareVertices[i].x; pos.y = _squareVertices[i].y; pos.z = _positionZ;
- pos.w = 1;
- _modelViewTransform.transformVector(&pos);
- _noMVPVertices[i] = Vec3(pos.x,pos.y,pos.z)/pos.w;
- }
- }
- void LayerColor::onDraw(const Mat4& transform, uint32_t /*flags*/)
- {
- getGLProgram()->use();
- getGLProgram()->setUniformsForBuiltins(transform);
-
- GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION | GL::VERTEX_ATTRIB_FLAG_COLOR );
-
- //
- // Attributes
- //
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, 0, _noMVPVertices);
- glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_FLOAT, GL_FALSE, 0, _squareColors);
- GL::blendFunc( _blendFunc.src, _blendFunc.dst );
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
- CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,4);
- }
- std::string LayerColor::getDescription() const
- {
- return StringUtils::format("<LayerColor | Tag = %d>", _tag);
- }
- //
- // LayerGradient
- //
- LayerGradient::LayerGradient()
- : _startColor(Color4B::BLACK)
- , _endColor(Color4B::BLACK)
- , _startOpacity(255)
- , _endOpacity(255)
- , _alongVector(Vec2(0, -1))
- , _compressedInterpolation(true)
- {
-
- }
- LayerGradient::~LayerGradient()
- {
- }
- LayerGradient* LayerGradient::create(const Color4B& start, const Color4B& end)
- {
- LayerGradient * layer = new (std::nothrow) LayerGradient();
- if( layer && layer->initWithColor(start, end))
- {
- layer->autorelease();
- return layer;
- }
- CC_SAFE_DELETE(layer);
- return nullptr;
- }
- LayerGradient* LayerGradient::create(const Color4B& start, const Color4B& end, const Vec2& v)
- {
- LayerGradient * layer = new (std::nothrow) LayerGradient();
- if( layer && layer->initWithColor(start, end, v))
- {
- layer->autorelease();
- return layer;
- }
- CC_SAFE_DELETE(layer);
- return nullptr;
- }
- LayerGradient* LayerGradient::create()
- {
- LayerGradient* ret = new (std::nothrow) LayerGradient();
- if (ret && ret->init())
- {
- ret->autorelease();
- }
- else
- {
- CC_SAFE_DELETE(ret);
- }
- return ret;
- }
- bool LayerGradient::init()
- {
- return initWithColor(Color4B(0, 0, 0, 255), Color4B(0, 0, 0, 255));
- }
- bool LayerGradient::initWithColor(const Color4B& start, const Color4B& end)
- {
- return initWithColor(start, end, Vec2(0, -1));
- }
- bool LayerGradient::initWithColor(const Color4B& start, const Color4B& end, const Vec2& v)
- {
- _endColor.r = end.r;
- _endColor.g = end.g;
- _endColor.b = end.b;
- _endOpacity = end.a;
- _startOpacity = start.a;
- _alongVector = v;
- _compressedInterpolation = true;
- return LayerColor::initWithColor(Color4B(start.r, start.g, start.b, 255));
- }
- void LayerGradient::updateColor()
- {
- LayerColor::updateColor();
- float h = _alongVector.getLength();
- if (h == 0)
- return;
- float c = sqrtf(2.0f);
- Vec2 u(_alongVector.x / h, _alongVector.y / h);
- // Compressed Interpolation mode
- if (_compressedInterpolation)
- {
- float h2 = 1 / ( fabsf(u.x) + fabsf(u.y) );
- u = u * (h2 * (float)c);
- }
- float opacityf = (float)_displayedOpacity / 255.0f;
- Color4F S(
- _displayedColor.r / 255.0f,
- _displayedColor.g / 255.0f,
- _displayedColor.b / 255.0f,
- _startOpacity * opacityf / 255.0f
- );
- Color4F E(
- _endColor.r / 255.0f,
- _endColor.g / 255.0f,
- _endColor.b / 255.0f,
- _endOpacity * opacityf / 255.0f
- );
- // (-1, -1)
- _squareColors[0].r = E.r + (S.r - E.r) * ((c + u.x + u.y) / (2.0f * c));
- _squareColors[0].g = E.g + (S.g - E.g) * ((c + u.x + u.y) / (2.0f * c));
- _squareColors[0].b = E.b + (S.b - E.b) * ((c + u.x + u.y) / (2.0f * c));
- _squareColors[0].a = E.a + (S.a - E.a) * ((c + u.x + u.y) / (2.0f * c));
- // (1, -1)
- _squareColors[1].r = E.r + (S.r - E.r) * ((c - u.x + u.y) / (2.0f * c));
- _squareColors[1].g = E.g + (S.g - E.g) * ((c - u.x + u.y) / (2.0f * c));
- _squareColors[1].b = E.b + (S.b - E.b) * ((c - u.x + u.y) / (2.0f * c));
- _squareColors[1].a = E.a + (S.a - E.a) * ((c - u.x + u.y) / (2.0f * c));
- // (-1, 1)
- _squareColors[2].r = E.r + (S.r - E.r) * ((c + u.x - u.y) / (2.0f * c));
- _squareColors[2].g = E.g + (S.g - E.g) * ((c + u.x - u.y) / (2.0f * c));
- _squareColors[2].b = E.b + (S.b - E.b) * ((c + u.x - u.y) / (2.0f * c));
- _squareColors[2].a = E.a + (S.a - E.a) * ((c + u.x - u.y) / (2.0f * c));
- // (1, 1)
- _squareColors[3].r = E.r + (S.r - E.r) * ((c - u.x - u.y) / (2.0f * c));
- _squareColors[3].g = E.g + (S.g - E.g) * ((c - u.x - u.y) / (2.0f * c));
- _squareColors[3].b = E.b + (S.b - E.b) * ((c - u.x - u.y) / (2.0f * c));
- _squareColors[3].a = E.a + (S.a - E.a) * ((c - u.x - u.y) / (2.0f * c));
- }
- const Color3B& LayerGradient::getStartColor() const
- {
- return _realColor;
- }
- void LayerGradient::setStartColor(const Color3B& color)
- {
- setColor(color);
- }
- void LayerGradient::setEndColor(const Color3B& color)
- {
- _endColor = color;
- updateColor();
- }
- const Color3B& LayerGradient::getEndColor() const
- {
- return _endColor;
- }
- void LayerGradient::setStartOpacity(GLubyte o)
- {
- _startOpacity = o;
- updateColor();
- }
- GLubyte LayerGradient::getStartOpacity() const
- {
- return _startOpacity;
- }
- void LayerGradient::setEndOpacity(GLubyte o)
- {
- _endOpacity = o;
- updateColor();
- }
- GLubyte LayerGradient::getEndOpacity() const
- {
- return _endOpacity;
- }
- void LayerGradient::setVector(const Vec2& var)
- {
- _alongVector = var;
- updateColor();
- }
- const Vec2& LayerGradient::getVector() const
- {
- return _alongVector;
- }
- bool LayerGradient::isCompressedInterpolation() const
- {
- return _compressedInterpolation;
- }
- void LayerGradient::setCompressedInterpolation(bool compress)
- {
- _compressedInterpolation = compress;
- updateColor();
- }
- std::string LayerGradient::getDescription() const
- {
- return StringUtils::format("<LayerGradient | Tag = %d>", _tag);
- }
- /// MultiplexLayer
- LayerMultiplex::LayerMultiplex()
- : _enabledLayer(0)
- {
- }
- LayerMultiplex::~LayerMultiplex()
- {
- for(const auto &layer : _layers) {
- layer->cleanup();
- }
- }
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
- LayerMultiplex * LayerMultiplex::createVariadic(Layer * layer, ...)
- {
- va_list args;
- va_start(args,layer);
- LayerMultiplex * multiplexLayer = new (std::nothrow) LayerMultiplex();
- if(multiplexLayer && multiplexLayer->initWithLayers(layer, args))
- {
- multiplexLayer->autorelease();
- va_end(args);
- return multiplexLayer;
- }
- va_end(args);
- CC_SAFE_DELETE(multiplexLayer);
- return nullptr;
- }
- #else
- LayerMultiplex * LayerMultiplex::create(Layer * layer, ...)
- {
- va_list args;
- va_start(args,layer);
- LayerMultiplex * multiplexLayer = new (std::nothrow) LayerMultiplex();
- if(multiplexLayer && multiplexLayer->initWithLayers(layer, args))
- {
- multiplexLayer->autorelease();
- va_end(args);
- return multiplexLayer;
- }
- va_end(args);
- CC_SAFE_DELETE(multiplexLayer);
- return nullptr;
- }
- #endif
- LayerMultiplex * LayerMultiplex::createWithLayer(Layer* layer)
- {
- return LayerMultiplex::create(layer, nullptr);
- }
- LayerMultiplex* LayerMultiplex::create()
- {
- LayerMultiplex* ret = new (std::nothrow) LayerMultiplex();
- if (ret && ret->init())
- {
- ret->autorelease();
- }
- else
- {
- CC_SAFE_DELETE(ret);
- }
- return ret;
- }
- LayerMultiplex* LayerMultiplex::createWithArray(const Vector<Layer*>& arrayOfLayers)
- {
- LayerMultiplex* ret = new (std::nothrow) LayerMultiplex();
- if (ret && ret->initWithArray(arrayOfLayers))
- {
- ret->autorelease();
- }
- else
- {
- CC_SAFE_DELETE(ret);
- }
- return ret;
- }
- void LayerMultiplex::addLayer(Layer* layer)
- {
- #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
- auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
- if (sEngine)
- {
- sEngine->retainScriptObject(this, layer);
- }
- #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
- _layers.pushBack(layer);
- }
- bool LayerMultiplex::init()
- {
- if (Layer::init())
- {
- _enabledLayer = 0;
- return true;
- }
- return false;
- }
- bool LayerMultiplex::initWithLayers(Layer *layer, va_list params)
- {
- if (Layer::init())
- {
- _layers.reserve(5);
- #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
- auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
- if (sEngine)
- {
- sEngine->retainScriptObject(this, layer);
- }
- #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
- _layers.pushBack(layer);
- Layer *l = va_arg(params,Layer*);
- while( l ) {
- #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
- if (sEngine)
- {
- sEngine->retainScriptObject(this, l);
- }
- #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
- _layers.pushBack(l);
- l = va_arg(params,Layer*);
- }
- _enabledLayer = 0;
- this->addChild(_layers.at(_enabledLayer));
- return true;
- }
- return false;
- }
- bool LayerMultiplex::initWithArray(const Vector<Layer*>& arrayOfLayers)
- {
- if (Layer::init())
- {
- #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
- auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
- if (sEngine)
- {
- for (const auto &layer : arrayOfLayers)
- {
- if (layer)
- {
- sEngine->retainScriptObject(this, layer);
- }
- }
- }
- #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
- _layers.reserve(arrayOfLayers.size());
- _layers.pushBack(arrayOfLayers);
- _enabledLayer = 0;
- this->addChild(_layers.at(_enabledLayer));
- return true;
- }
- return false;
- }
- void LayerMultiplex::switchTo(int n)
- {
- CCASSERT( n < _layers.size(), "Invalid index in MultiplexLayer switchTo message" );
- this->removeChild(_layers.at(_enabledLayer), true);
- _enabledLayer = n;
- this->addChild(_layers.at(n));
- }
- void LayerMultiplex::switchToAndReleaseMe(int n)
- {
- CCASSERT( n < _layers.size(), "Invalid index in MultiplexLayer switchTo message" );
- this->removeChild(_layers.at(_enabledLayer), true);
- #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
- auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
- if (sEngine)
- {
- sEngine->releaseScriptObject(this, _layers.at(_enabledLayer));
- }
- #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
-
- _layers.replace(_enabledLayer, nullptr);
- _enabledLayer = n;
- this->addChild(_layers.at(n));
- }
- std::string LayerMultiplex::getDescription() const
- {
- return StringUtils::format("<LayerMultiplex | Tag = %d, Layers = %d", _tag, static_cast<int>(_children.size()));
- }
- NS_CC_END
|