From 03a4ddf764efd0eab91d61f29517b178562731ae Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Tue, 24 Sep 2019 11:31:35 +0800 Subject: [PATCH 01/96] fix warning (#20146) * fix warning fix warning * remove integer type constructor for Vec2 --- cocos/2d/CCActionTiledGrid.cpp | 12 +- cocos/2d/CCAutoPolygon.cpp | 8 +- cocos/2d/CCLabel.cpp | 6 +- cocos/2d/CCLabelAtlas.cpp | 2 +- cocos/2d/CCLayer.h | 2 +- cocos/2d/CCParticleExamples.cpp | 4 +- cocos/2d/CCTMXXMLParser.cpp | 4 +- cocos/2d/CCTransition.cpp | 14 +- cocos/physics/CCPhysicsShape.h | 2 +- .../manual/cocos2d/lua_cocos2dx_manual.cpp | 14 +- .../manual/network/lua_downloader.cpp | 6 +- cocos/ui/UIEditBox/UIEditBoxImpl-common.cpp | 12 +- cocos/ui/UILoadingBar.cpp | 4 +- cocos/ui/UIScrollView.cpp | 6 +- cocos/ui/UITabControl.cpp | 6 +- .../CCControlSaturationBrightnessPicker.cpp | 4 +- .../CCControlExtension/CCControlSwitch.cpp | 2 +- extensions/GUI/CCScrollView/CCTableView.cpp | 4 +- .../Classes/HelloWorldScene.cpp | 2 +- .../ActionManagerTest/ActionManagerTest.cpp | 16 +- .../ActionsEaseTest/ActionsEaseTest.cpp | 68 ++--- .../ActionsProgressTest.cpp | 18 +- .../Classes/ActionsTest/ActionsTest.cpp | 240 +++++++++--------- .../Classes/BillBoardTest/BillBoardTest.cpp | 38 +-- .../cpp-tests/Classes/BugsTest/Bug-12847.cpp | 4 +- .../Classes/Camera3DTest/Camera3DTest.cpp | 64 ++--- .../Classes/ChipmunkTest/ChipmunkTest.cpp | 4 +- .../ClippingNodeTest/ClippingNodeTest.cpp | 40 +-- .../Classes/DownloaderTest/DownloaderTest.cpp | 12 +- .../DrawPrimitivesTest/DrawPrimitivesTest.cpp | 74 +++--- .../EffectsAdvancedTest.cpp | 6 +- .../TableViewTest/TableViewTestScene.cpp | 6 +- .../Classes/IntervalTest/IntervalTest.cpp | 2 +- .../Classes/LabelTest/LabelTestNew.cpp | 92 +++---- .../cpp-tests/Classes/LayerTest/LayerTest.cpp | 54 ++-- .../cpp-tests/Classes/LightTest/LightTest.cpp | 14 +- .../MaterialSystemTest/MaterialSystemTest.cpp | 14 +- tests/cpp-tests/Classes/MenuTest/MenuTest.cpp | 10 +- .../MotionStreakTest/MotionStreakTest.cpp | 2 +- .../Classes/MultiTouchTest/MultiTouchTest.cpp | 6 +- .../NewEventDispatcherTest.cpp | 46 ++-- .../NewRendererTest/NewRendererTest.cpp | 18 +- tests/cpp-tests/Classes/NodeTest/NodeTest.cpp | 78 +++--- .../Classes/ParticleTest/ParticleTest.cpp | 26 +- .../Classes/PhysicsTest/PhysicsTest.cpp | 118 ++++----- .../RenderTextureTest/RenderTextureTest.cpp | 22 +- .../RotateWorldTest/RotateWorldTest.cpp | 4 +- .../cpp-tests/Classes/SceneTest/SceneTest.cpp | 2 +- .../Classes/SchedulerTest/SchedulerTest.cpp | 22 +- .../Classes/ShaderTest/ShaderTest.cpp | 2 +- .../Classes/ShaderTest/ShaderTest2.cpp | 16 +- .../Classes/Sprite3DTest/Sprite3DTest.cpp | 92 +++---- .../SpritePolygonTest/SpritePolygonTest.cpp | 12 +- .../Classes/SpriteTest/SpriteTest.cpp | 218 ++++++++-------- .../Classes/TileMapTest/TileMapTest.cpp | 38 +-- .../Classes/TileMapTest/TileMapTest2.cpp | 38 +-- .../UIButtonTest/UIButtonTest.cpp | 42 +-- .../UICheckBoxTest/UICheckBoxTest.cpp | 14 +- .../CocoStudioGUITest/UIEditBoxTest.cpp | 12 +- .../UIFocusTest/UIFocusTest.cpp | 12 +- .../UIImageViewTest/UIImageViewTest.cpp | 12 +- .../UIListViewTest/UIListViewTest.cpp | 50 ++-- .../UIPageViewTest/UIPageViewTest.cpp | 32 +-- .../UIRadioButtonTest/UIRadioButtonTest.cpp | 6 +- .../CocoStudioGUITest/UIScale9SpriteTest.cpp | 84 +++--- .../UIScrollViewTest/UIScrollViewTest.cpp | 32 +-- .../UISliderTest/UISliderTest.cpp | 32 +-- .../UITextFieldTest/UITextFieldTest.cpp | 4 +- .../UITextTest/UITextTest.cpp | 18 +- .../UIWidgetAddNodeTest.cpp | 2 +- 70 files changed, 1001 insertions(+), 1001 deletions(-) diff --git a/cocos/2d/CCActionTiledGrid.cpp b/cocos/2d/CCActionTiledGrid.cpp index b24ccd1134..a82e27faf6 100644 --- a/cocos/2d/CCActionTiledGrid.cpp +++ b/cocos/2d/CCActionTiledGrid.cpp @@ -623,7 +623,7 @@ void TurnOffTiles::update(float time) for (unsigned int i = 0; i < _tilesCount; i++ ) { t = _tilesOrder[i]; - Vec2 tilePos( (unsigned int)(t / _gridSize.height), t % (unsigned int)_gridSize.height ); + Vec2 tilePos((t /_gridSize.height), (float)(t % (int)_gridSize.height)); if ( i < l ) { @@ -795,9 +795,9 @@ void SplitRows::startWithTarget(Node *target) void SplitRows::update(float time) { - for (unsigned int j = 0; j < _gridSize.height; ++j) + for (int j = 0; j < _gridSize.height; ++j) { - Quad3 coords = getOriginalTile(Vec2(0, j)); + Quad3 coords = getOriginalTile(Vec2(0.0f, (float)j)); float direction = 1; if ( (j % 2 ) == 0 ) @@ -810,7 +810,7 @@ void SplitRows::update(float time) coords.tl.x += direction * _winSize.width * time; coords.tr.x += direction * _winSize.width * time; - setTile(Vec2(0, j), coords); + setTile(Vec2(0.0f, (float)j), coords); } } @@ -852,7 +852,7 @@ void SplitCols::update(float time) { for (unsigned int i = 0; i < _gridSize.width; ++i) { - Quad3 coords = getOriginalTile(Vec2(i, 0)); + Quad3 coords = getOriginalTile(Vec2((float)i, 0.0f)); float direction = 1; if ( (i % 2 ) == 0 ) @@ -865,7 +865,7 @@ void SplitCols::update(float time) coords.tl.y += direction * _winSize.height * time; coords.tr.y += direction * _winSize.height * time; - setTile(Vec2(i, 0), coords); + setTile(Vec2((float)i, 0.0f), coords); } } diff --git a/cocos/2d/CCAutoPolygon.cpp b/cocos/2d/CCAutoPolygon.cpp index f2cff63a92..a9e0f3f6f3 100644 --- a/cocos/2d/CCAutoPolygon.cpp +++ b/cocos/2d/CCAutoPolygon.cpp @@ -249,13 +249,13 @@ unsigned int AutoPolygon::getSquareValue(unsigned int x, unsigned int y, const R //NOTE: due to the way we pick points from texture, rect needs to be smaller, otherwise it goes outside 1 pixel auto fixedRect = Rect(rect.origin, rect.size-Size(2,2)); - Vec2 tl = Vec2(x-1, y-1); + Vec2 tl((float)x-1, (float)y-1); sv += (fixedRect.containsPoint(tl) && getAlphaByPos(tl) > threshold)? 1 : 0; - Vec2 tr = Vec2(x, y-1); + Vec2 tr((float)x, (float)y-1); sv += (fixedRect.containsPoint(tr) && getAlphaByPos(tr) > threshold)? 2 : 0; - Vec2 bl = Vec2(x-1, y); + Vec2 bl((float)x-1, (float)y); sv += (fixedRect.containsPoint(bl) && getAlphaByPos(bl) > threshold)? 4 : 0; - Vec2 br = Vec2(x, y); + Vec2 br((float)x, (float)y); sv += (fixedRect.containsPoint(br) && getAlphaByPos(br) > threshold)? 8 : 0; CCASSERT(sv != 0 && sv != 15, "square value should not be 0, or 15"); return sv; diff --git a/cocos/2d/CCLabel.cpp b/cocos/2d/CCLabel.cpp index 055d9b6138..84add9f6c8 100644 --- a/cocos/2d/CCLabel.cpp +++ b/cocos/2d/CCLabel.cpp @@ -1568,7 +1568,7 @@ void Label::updateContent() // FIXME: system fonts don't report the height of the font correctly. only the size of the texture, which is POT y += spriteSize.height / 2; // FIXME: Might not work with different vertical alignments - _underlineNode->drawLine(Vec2(0,y), Vec2(spriteSize.width,y), Color4F(_textSprite->getDisplayedColor())); + _underlineNode->drawLine(Vec2(0.0f,y), Vec2(spriteSize.width,y), Color4F(_textSprite->getDisplayedColor())); } } @@ -1581,9 +1581,9 @@ void Label::updateContent() Vec2 vertices[4] = { Vec2::ZERO, - Vec2(_contentSize.width, 0), + Vec2(_contentSize.width, 0.0f), Vec2(_contentSize.width, _contentSize.height), - Vec2(0, _contentSize.height) + Vec2(0.0f, _contentSize.height) }; _debugDrawNode->drawPoly(vertices, 4, true, Color4F::WHITE); #endif diff --git a/cocos/2d/CCLabelAtlas.cpp b/cocos/2d/CCLabelAtlas.cpp index 27b40f9061..9fa24cada0 100644 --- a/cocos/2d/CCLabelAtlas.cpp +++ b/cocos/2d/CCLabelAtlas.cpp @@ -264,7 +264,7 @@ void LabelAtlas::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) Vec2::ZERO, Vec2(size.width, 0), Vec2(size.width, size.height), - Vec2(0, size.height) + Vec2(0.0f, size.height) }; _debugDrawNode->drawPoly(vertices, 4, true, Color4F(1.0, 1.0, 1.0, 1.0)); } diff --git a/cocos/2d/CCLayer.h b/cocos/2d/CCLayer.h index cc77216152..38e62b61a8 100644 --- a/cocos/2d/CCLayer.h +++ b/cocos/2d/CCLayer.h @@ -427,7 +427,7 @@ protected: Color3B _endColor = Color3B::BLACK; uint8_t _startOpacity = 255; uint8_t _endOpacity = 255; - Vec2 _alongVector = {0, -1}; + Vec2 _alongVector = {0.0f, -1.0f}; bool _compressedInterpolation = true; }; diff --git a/cocos/2d/CCParticleExamples.cpp b/cocos/2d/CCParticleExamples.cpp index 1cda033e87..3fe170d78a 100644 --- a/cocos/2d/CCParticleExamples.cpp +++ b/cocos/2d/CCParticleExamples.cpp @@ -1076,7 +1076,7 @@ bool ParticleSnow::initWithTotalParticles(int numberOfParticles) // emitter position Size winSize = Director::getInstance()->getWinSize(); this->setPosition(winSize.width/2, winSize.height + 10); - setPosVar(Vec2(winSize.width/2, 0)); + setPosVar(Vec2(winSize.width/2, 0.0f)); // angle _angle = -90; @@ -1188,7 +1188,7 @@ bool ParticleRain::initWithTotalParticles(int numberOfParticles) // emitter position Size winSize = Director::getInstance()->getWinSize(); this->setPosition(winSize.width/2, winSize.height); - setPosVar(Vec2(winSize.width/2, 0)); + setPosVar(Vec2(winSize.width/2, 0.0f)); // life of particles _life = 4.5f; diff --git a/cocos/2d/CCTMXXMLParser.cpp b/cocos/2d/CCTMXXMLParser.cpp index 1dcb12b749..ba3245d575 100644 --- a/cocos/2d/CCTMXXMLParser.cpp +++ b/cocos/2d/CCTMXXMLParser.cpp @@ -416,9 +416,9 @@ void TMXMapInfo::startElement(void* /*ctx*/, const char *name, const char **atts { TMXTilesetInfo* tileset = tmxMapInfo->getTilesets().back(); - double tileOffsetX = attributeDict["x"].asDouble(); + float tileOffsetX = attributeDict["x"].asFloat(); - double tileOffsetY = attributeDict["y"].asDouble(); + float tileOffsetY = attributeDict["y"].asFloat(); tileset->_tileOffset = Vec2(tileOffsetX, tileOffsetY); diff --git a/cocos/2d/CCTransition.cpp b/cocos/2d/CCTransition.cpp index 50ceddd665..922b6cb547 100644 --- a/cocos/2d/CCTransition.cpp +++ b/cocos/2d/CCTransition.cpp @@ -360,7 +360,7 @@ void TransitionJumpZoom::onEnter() _inScene->setAnchorPoint(Vec2(0.5f, 0.5f)); _outScene->setAnchorPoint(Vec2(0.5f, 0.5f)); - ActionInterval *jump = JumpBy::create(_duration/4, Vec2(-s.width,0), s.width/4, 2); + ActionInterval *jump = JumpBy::create(_duration/4, Vec2(-s.width,0.0f), s.width/4, 2); ActionInterval *scaleIn = ScaleTo::create(_duration/4, 1.0f); ActionInterval *scaleOut = ScaleTo::create(_duration/4, 0.5f); @@ -425,7 +425,7 @@ void TransitionMoveInL::onEnter() ActionInterval* TransitionMoveInL::action() { - return MoveTo::create(_duration, Vec2(0,0)); + return MoveTo::create(_duration, Vec2(0.0f,0.0f)); } ActionInterval* TransitionMoveInL::easeActionWithAction(ActionInterval* action) @@ -569,13 +569,13 @@ void TransitionSlideInL::sceneOrder() void TransitionSlideInL:: initScenes() { Size s = Director::getInstance()->getWinSize(); - _inScene->setPosition(-(s.width-ADJUST_FACTOR),0); + _inScene->setPosition(-(s.width-ADJUST_FACTOR),0.0f); } ActionInterval* TransitionSlideInL::action() { Size s = Director::getInstance()->getWinSize(); - return MoveBy::create(_duration, Vec2(s.width-ADJUST_FACTOR,0)); + return MoveBy::create(_duration, Vec2(s.width-ADJUST_FACTOR,0.0f)); } ActionInterval* TransitionSlideInL::easeActionWithAction(ActionInterval* action) @@ -632,7 +632,7 @@ void TransitionSlideInR::initScenes() ActionInterval* TransitionSlideInR:: action() { Size s = Director::getInstance()->getWinSize(); - return MoveBy::create(_duration, Vec2(-(s.width-ADJUST_FACTOR),0)); + return MoveBy::create(_duration, Vec2(-(s.width-ADJUST_FACTOR),0.0f)); } @@ -673,7 +673,7 @@ void TransitionSlideInT::initScenes() ActionInterval* TransitionSlideInT::action() { Size s = Director::getInstance()->getWinSize(); - return MoveBy::create(_duration, Vec2(0,-(s.height-ADJUST_FACTOR))); + return MoveBy::create(_duration, Vec2(0.0f,-(s.height-ADJUST_FACTOR))); } // @@ -713,7 +713,7 @@ void TransitionSlideInB:: initScenes() ActionInterval* TransitionSlideInB:: action() { Size s = Director::getInstance()->getWinSize(); - return MoveBy::create(_duration, Vec2(0,s.height-ADJUST_FACTOR)); + return MoveBy::create(_duration, Vec2(0.0f,s.height-ADJUST_FACTOR)); } // diff --git a/cocos/physics/CCPhysicsShape.h b/cocos/physics/CCPhysicsShape.h index e71a5207f2..76e8925560 100644 --- a/cocos/physics/CCPhysicsShape.h +++ b/cocos/physics/CCPhysicsShape.h @@ -388,7 +388,7 @@ public: * @param offset A Vec2 object, it is the offset from the body's center of gravity in body local coordinates. * @return An autoreleased PhysicsShapeCircle object pointer. */ - static PhysicsShapeCircle* create(float radius, const PhysicsMaterial& material = PHYSICSSHAPE_MATERIAL_DEFAULT, const Vec2& offset = Vec2(0, 0)); + static PhysicsShapeCircle* create(float radius, const PhysicsMaterial& material = PHYSICSSHAPE_MATERIAL_DEFAULT, const Vec2& offset = Vec2(0.0f, 0.0f)); /** * Calculate the area of a circle with specified radius. diff --git a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp index 857ba69a7b..8aca5b670e 100644 --- a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp @@ -598,7 +598,7 @@ static int tolua_cocos2d_MenuItemToggle_create(lua_State* tolua_S) return 0; } - for (auto i = 0; i < argc; ++i) + for (int i = 0; i < argc; ++i) { #if COCOS2D_DEBUG >= 1 if (!tolua_isusertype(tolua_S, i + 2,"cc.MenuItem",0,&tolua_err) ) @@ -2403,7 +2403,7 @@ int tolua_cocos2d_Node_setAnchorPoint(lua_State* tolua_S) if (!ok) return 0; - cobj->setAnchorPoint(cocos2d::Vec2(x,y)); + cobj->setAnchorPoint(cocos2d::Vec2((float)x,(float)y)); lua_settop(tolua_S, 1); return 1; } @@ -7830,10 +7830,10 @@ static int tolua_cocos2d_Mat4_transformVector(lua_State* tolua_S) if (!ok) return 0; - x = (float)tolua_tonumber(tolua_S, 2, 0); - y = (float)tolua_tonumber(tolua_S, 3, 0); - z = (float)tolua_tonumber(tolua_S, 4, 0); - w = (float)tolua_tonumber(tolua_S, 5, 0); + x = tolua_tonumber(tolua_S, 2, 0); + y = tolua_tonumber(tolua_S, 3, 0); + z = tolua_tonumber(tolua_S, 4, 0); + w = tolua_tonumber(tolua_S, 5, 0); mat.transformVector(x,y,z,w, &dst); vec3_to_luaval(tolua_S, dst); @@ -8832,7 +8832,7 @@ static int tolua_cocos2d_bytearray_floatv(lua_State *L) } lua_pop(L, 1); lua_newtable(L); - for (size_t idx = 0; idx < arg.size(); idx++) + for (auto idx = 0; idx < arg.size(); idx++) { lua_pushnumber(L, arg[idx]); lua_rawseti(L, 1, idx + 1); diff --git a/cocos/scripting/lua-bindings/manual/network/lua_downloader.cpp b/cocos/scripting/lua-bindings/manual/network/lua_downloader.cpp index c7f8624da4..f8dfa58e77 100644 --- a/cocos/scripting/lua-bindings/manual/network/lua_downloader.cpp +++ b/cocos/scripting/lua-bindings/manual/network/lua_downloader.cpp @@ -237,9 +237,9 @@ static int lua_downloader_setOnTaskProgress(lua_State *L) if (ret) { pushTaskTable(L, task); //stack callbackfn, task - lua_pushnumber(L, bytesReceived); - lua_pushnumber(L, totalBytesReceived); - lua_pushnumber(L, totalBytesExpected); + lua_pushnumber(L, (lua_Number)bytesReceived); + lua_pushnumber(L, (lua_Number)totalBytesReceived); + lua_pushnumber(L, (lua_Number)totalBytesExpected); if (lua_pcall(L, 4, 0, 0) != 0) { lua_pop(L, 1); // remove callback or nil diff --git a/cocos/ui/UIEditBox/UIEditBoxImpl-common.cpp b/cocos/ui/UIEditBox/UIEditBoxImpl-common.cpp index a5984708a2..cfd5b166db 100755 --- a/cocos/ui/UIEditBox/UIEditBoxImpl-common.cpp +++ b/cocos/ui/UIEditBox/UIEditBoxImpl-common.cpp @@ -93,13 +93,13 @@ void EditBoxImplCommon::initInactiveLabels(const Size& size) const char* pDefaultFontName = this->getNativeDefaultFontName(); _label = Label::create(); - _label->setAnchorPoint(Vec2(0,1)); + _label->setAnchorPoint(Vec2(0.0f,1.0f)); _label->setOverflow(Label::Overflow::CLAMP); _label->setVisible(false); _editBox->addChild(_label, kLabelZOrder); _labelPlaceHolder = Label::create(); - _labelPlaceHolder->setAnchorPoint(Vec2(0, 1.0f)); + _labelPlaceHolder->setAnchorPoint(Vec2(0.0f, 1.0f)); _labelPlaceHolder->setTextColor(Color4B::GRAY); _labelPlaceHolder->enableWrap(false); _editBox->addChild(_labelPlaceHolder, kLabelZOrder); @@ -115,20 +115,20 @@ void EditBoxImplCommon::placeInactiveLabels(const Size& size) auto placeholderSize = _labelPlaceHolder->getContentSize(); if(_editBoxInputMode == EditBox::InputMode::ANY){ - _label->setPosition(Vec2(CC_EDIT_BOX_PADDING, size.height - CC_EDIT_BOX_PADDING)); + _label->setPosition(Vec2((float)CC_EDIT_BOX_PADDING, size.height - CC_EDIT_BOX_PADDING)); _label->setVerticalAlignment(TextVAlignment::TOP); _label->enableWrap(true); - _labelPlaceHolder->setPosition(Vec2(CC_EDIT_BOX_PADDING, + _labelPlaceHolder->setPosition(Vec2((float)CC_EDIT_BOX_PADDING, size.height - CC_EDIT_BOX_PADDING)); _labelPlaceHolder->setVerticalAlignment(TextVAlignment::TOP); } else { _label->enableWrap(false); - _label->setPosition(Vec2(CC_EDIT_BOX_PADDING, size.height)); + _label->setPosition(Vec2((float)CC_EDIT_BOX_PADDING, size.height)); _label->setVerticalAlignment(TextVAlignment::CENTER); - _labelPlaceHolder->setPosition(Vec2(CC_EDIT_BOX_PADDING, + _labelPlaceHolder->setPosition(Vec2((float)CC_EDIT_BOX_PADDING, (size.height + placeholderSize.height) / 2)); _labelPlaceHolder->setVerticalAlignment(TextVAlignment::CENTER); } diff --git a/cocos/ui/UILoadingBar.cpp b/cocos/ui/UILoadingBar.cpp index 70bbcdd83a..a8ad0ecc1e 100644 --- a/cocos/ui/UILoadingBar.cpp +++ b/cocos/ui/UILoadingBar.cpp @@ -101,7 +101,7 @@ void LoadingBar::initRenderer() _barRenderer = Scale9Sprite::create(); _barRenderer->setScale9Enabled(false); addProtectedChild(_barRenderer, BAR_RENDERER_Z, -1); - _barRenderer->setAnchorPoint(Vec2(0.0,0.5)); + _barRenderer->setAnchorPoint(Vec2(0.0f,0.5f)); } @@ -117,7 +117,7 @@ void LoadingBar::setDirection(cocos2d::ui::LoadingBar::Direction direction) { case Direction::LEFT: _barRenderer->setAnchorPoint(Vec2(0.0f,0.5f)); - _barRenderer->setPosition(Vec2(0,_contentSize.height*0.5f)); + _barRenderer->setPosition(Vec2(0.0f,_contentSize.height*0.5f)); break; case Direction::RIGHT: _barRenderer->setAnchorPoint(Vec2(1.0f,0.5f)); diff --git a/cocos/ui/UIScrollView.cpp b/cocos/ui/UIScrollView.cpp index 5f98d1a97c..689f366018 100644 --- a/cocos/ui/UIScrollView.cpp +++ b/cocos/ui/UIScrollView.cpp @@ -166,7 +166,7 @@ void ScrollView::onSizeChanged() float innerSizeWidth = MAX(orginInnerSizeWidth, _contentSize.width); float innerSizeHeight = MAX(orginInnerSizeHeight, _contentSize.height); _innerContainer->setContentSize(Size(innerSizeWidth, innerSizeHeight)); - setInnerContainerPosition(Vec2(0, _contentSize.height - _innerContainer->getContentSize().height)); + setInnerContainerPosition(Vec2(0.0f, _contentSize.height - _innerContainer->getContentSize().height)); if (_verticalScrollBar != nullptr) { @@ -1090,10 +1090,10 @@ void ScrollView::interceptTouchEvent(Widget::TouchEventType event, Widget *sende switch (_direction) { case Direction::HORIZONTAL: - offsetInInch = convertDistanceFromPointToInch(Vec2(std::abs(sender->getTouchBeganPosition().x - touchPoint.x), 0)); + offsetInInch = convertDistanceFromPointToInch(Vec2(std::abs(sender->getTouchBeganPosition().x - touchPoint.x), 0.0f)); break; case Direction::VERTICAL: - offsetInInch = convertDistanceFromPointToInch(Vec2(0, std::abs(sender->getTouchBeganPosition().y - touchPoint.y))); + offsetInInch = convertDistanceFromPointToInch(Vec2(0.0f, std::abs(sender->getTouchBeganPosition().y - touchPoint.y))); break; case Direction::BOTH: offsetInInch = convertDistanceFromPointToInch(sender->getTouchBeganPosition() - touchPoint); diff --git a/cocos/ui/UITabControl.cpp b/cocos/ui/UITabControl.cpp index f3be7629bf..038e93e4f8 100644 --- a/cocos/ui/UITabControl.cpp +++ b/cocos/ui/UITabControl.cpp @@ -481,7 +481,7 @@ namespace ui if (tabcell != nullptr && tabcell->init()) { tabcell->_frontCrossRenderer->setVisible(false); // _isSelected == false - tabcell->_anchorPoint = Vec2(.5f, 0); + tabcell->_anchorPoint = Vec2(.5f, 0.0f); tabcell->autorelease(); return tabcell; } @@ -503,7 +503,7 @@ namespace ui { tabcell->_frontCrossRenderer->setVisible(false); tabcell->_tabLabelRender->setString(titleStr); - tabcell->_anchorPoint = Vec2(.5f, 0); + tabcell->_anchorPoint = Vec2(.5f, 0.0f); tabcell->autorelease(); return tabcell; } @@ -529,7 +529,7 @@ namespace ui { tabcell->_frontCrossRenderer->setVisible(false); tabcell->_tabLabelRender->setString(titleStr); - tabcell->_anchorPoint = Vec2(.5f, 0); + tabcell->_anchorPoint = Vec2(.5f, 0.0f); tabcell->autorelease(); return tabcell; } diff --git a/extensions/GUI/CCControlExtension/CCControlSaturationBrightnessPicker.cpp b/extensions/GUI/CCControlExtension/CCControlSaturationBrightnessPicker.cpp index 19bc35847a..c183e41723 100644 --- a/extensions/GUI/CCControlExtension/CCControlSaturationBrightnessPicker.cpp +++ b/extensions/GUI/CCControlExtension/CCControlSaturationBrightnessPicker.cpp @@ -110,8 +110,8 @@ void ControlSaturationBrightnessPicker::updateWithHSV(HSV hsv) void ControlSaturationBrightnessPicker::updateDraggerWithHSV(HSV hsv) { // Set the position of the slider to the correct saturation and brightness - Vec2 pos(_startPos.x + boxPos + (boxSize*(1 - hsv.s)), - _startPos.y + boxPos + (boxSize*hsv.v)); + Vec2 pos(_startPos.x + boxPos + (boxSize*(1 - (float)hsv.s)), + _startPos.y + boxPos + (boxSize*(float)hsv.v)); // update updateSliderPosition(pos); diff --git a/extensions/GUI/CCControlExtension/CCControlSwitch.cpp b/extensions/GUI/CCControlExtension/CCControlSwitch.cpp index 647246d788..5602860a6f 100644 --- a/extensions/GUI/CCControlExtension/CCControlSwitch.cpp +++ b/extensions/GUI/CCControlExtension/CCControlSwitch.cpp @@ -424,7 +424,7 @@ bool ControlSwitch::onTouchBegan(Touch *pTouch, Event* /*pEvent*/) void ControlSwitch::onTouchMoved(Touch *pTouch, Event* /*pEvent*/) { Vec2 location = this->locationFromTouch(pTouch); - location = Vec2(location.x - _initialTouchXPosition, 0); + location = Vec2(location.x - _initialTouchXPosition, 0.0f); _moved = true; diff --git a/extensions/GUI/CCScrollView/CCTableView.cpp b/extensions/GUI/CCScrollView/CCTableView.cpp index 0f43b667bc..2c22f7dee3 100644 --- a/extensions/GUI/CCScrollView/CCTableView.cpp +++ b/extensions/GUI/CCScrollView/CCTableView.cpp @@ -307,11 +307,11 @@ void TableView::_updateContentSize() { if (_direction == Direction::HORIZONTAL) { - this->setContentOffset(Vec2(0,0)); + this->setContentOffset(Vec2(0.0f,0.0f)); } else { - this->setContentOffset(Vec2(0,this->minContainerOffset().y)); + this->setContentOffset(Vec2(0.0f,this->minContainerOffset().y)); } _oldDirection = _direction; } diff --git a/tests/cpp-empty-test/Classes/HelloWorldScene.cpp b/tests/cpp-empty-test/Classes/HelloWorldScene.cpp index c781419915..abfef75376 100644 --- a/tests/cpp-empty-test/Classes/HelloWorldScene.cpp +++ b/tests/cpp-empty-test/Classes/HelloWorldScene.cpp @@ -94,7 +94,7 @@ bool HelloWorld::init() auto s = Director::getInstance()->getWinSize(); Size boxSize(100.0f, 100.0f); auto box = LayerColor::create(Color4B(255,255,0,255)); - box->setAnchorPoint(Vec2(0.5,0.5)); + box->setAnchorPoint(Vec2(0.5f,0.5f)); box->setContentSize( boxSize ); box->setIgnoreAnchorPointForPosition(false); box->setPosition(s.width/2, s.height - 100 - box->getContentSize().height/2); diff --git a/tests/cpp-tests/Classes/ActionManagerTest/ActionManagerTest.cpp b/tests/cpp-tests/Classes/ActionManagerTest/ActionManagerTest.cpp index 2379f1114a..cfb1301096 100644 --- a/tests/cpp-tests/Classes/ActionManagerTest/ActionManagerTest.cpp +++ b/tests/cpp-tests/Classes/ActionManagerTest/ActionManagerTest.cpp @@ -127,7 +127,7 @@ void LogicTest::onEnter() grossini->setPosition(VisibleRect::center()); grossini->runAction( Sequence::create( - MoveBy::create(1, Vec2(150,0)), + MoveBy::create(1, Vec2(150.0f,0.0f)), CallFuncN::create(CC_CALLBACK_1(LogicTest::bugMe,this)), nullptr) ); @@ -171,7 +171,7 @@ void PauseTest::onEnter() addChild(grossini, 0, kTagGrossini); grossini->setPosition(VisibleRect::center() ); - auto action = MoveBy::create(1, Vec2(150,0)); + auto action = MoveBy::create(1, Vec2(150.0f,0.0f)); auto director = Director::getInstance(); director->getActionManager()->addAction(action, grossini, true); @@ -205,7 +205,7 @@ void StopActionTest::onEnter() addChild(l); l->setPosition(VisibleRect::center().x, VisibleRect::top().y - 75); - auto pMove = MoveBy::create(2, Vec2(200, 0)); + auto pMove = MoveBy::create(2, Vec2(200.0f, 0.0f)); auto pCallback = CallFunc::create(CC_CALLBACK_0(StopActionTest::stopAction,this)); auto pSequence = Sequence::create(pMove, pCallback, nullptr); pSequence->setTag(kTagSequence); @@ -241,8 +241,8 @@ void StopAllActionsTest::onEnter() addChild(l); l->setPosition( Vec2(VisibleRect::center().x, VisibleRect::top().y - 75) ); - auto pMove1 = MoveBy::create(2, Vec2(200, 0)); - auto pMove2 = MoveBy::create(2, Vec2(-200, 0)); + auto pMove1 = MoveBy::create(2, Vec2(200.0f, 0.0f)); + auto pMove2 = MoveBy::create(2, Vec2(-200.0f, 0.0f)); auto pSequenceMove = Sequence::createWithTwoActions(pMove1, pMove2); auto pRepeatMove = RepeatForever::create(pSequenceMove); pRepeatMove->setTag(kTagSequence); @@ -331,8 +331,8 @@ void StopActionsByFlagsTest::onEnter() addChild(l); l->setPosition( Vec2(VisibleRect::center().x, VisibleRect::top().y - 75) ); - auto pMove1 = MoveBy::create(2, Vec2(200, 0)); - auto pMove2 = MoveBy::create(2, Vec2(-200, 0)); + auto pMove1 = MoveBy::create(2, Vec2(200.0f, 0.0f)); + auto pMove2 = MoveBy::create(2, Vec2(-200.0f, 0.0f)); auto pSequenceMove = Sequence::createWithTwoActions(pMove1, pMove2); auto pRepeatMove = RepeatForever::create(pSequenceMove); pRepeatMove->setFlags(kMoveFlag | kRepeatForeverFlag); @@ -394,7 +394,7 @@ void Issue14050Test::onEnter() sprite->initWithFile("Images/grossini.png"); sprite->autorelease(); - auto move = MoveBy::create(2, Vec2(100, 100)); + auto move = MoveBy::create(2, Vec2(100.0f, 100.0f)); sprite->runAction(move); } diff --git a/tests/cpp-tests/Classes/ActionsEaseTest/ActionsEaseTest.cpp b/tests/cpp-tests/Classes/ActionsEaseTest/ActionsEaseTest.cpp index 62aa5a169e..29c9bc3d99 100644 --- a/tests/cpp-tests/Classes/ActionsEaseTest/ActionsEaseTest.cpp +++ b/tests/cpp-tests/Classes/ActionsEaseTest/ActionsEaseTest.cpp @@ -82,7 +82,7 @@ void SpriteEase::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130,0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130,0.0f)); auto move_back = move->reverse(); auto move_ease_in = EaseIn::create(move->clone(), 2.5f); @@ -135,7 +135,7 @@ void SpriteEaseInOut::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130,0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); // id move_back = move->reverse(); auto move_ease_inout1 = EaseInOut::create(move->clone(), 0.65f); @@ -174,7 +174,7 @@ void SpriteEaseExponential::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130,0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease_in = EaseExponentialIn::create(move->clone()); @@ -210,7 +210,7 @@ void SpriteEaseExponentialInOut::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease = EaseExponentialInOut::create(move->clone() ); @@ -243,7 +243,7 @@ void SpriteEaseSine::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease_in = EaseSineIn::create(move->clone() ); @@ -280,7 +280,7 @@ void SpriteEaseSineInOut::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130,0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease = EaseSineInOut::create(move->clone() ); @@ -312,7 +312,7 @@ void SpriteEaseElastic::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease_in = EaseElasticIn::create(move->clone() ); @@ -348,7 +348,7 @@ void SpriteEaseElasticInOut::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_ease_inout1 = EaseElasticInOut::create(move->clone(), 0.3f); auto move_ease_inout_back1 = move_ease_inout1->reverse(); @@ -387,7 +387,7 @@ void SpriteEaseBounce::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease_in = EaseBounceIn::create(move->clone() ); @@ -424,7 +424,7 @@ void SpriteEaseBounceInOut::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease = EaseBounceInOut::create(move->clone() ); @@ -457,7 +457,7 @@ void SpriteEaseBack::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease_in = EaseBackIn::create(move->clone()); @@ -493,7 +493,7 @@ void SpriteEaseBackInOut::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease = EaseBackInOut::create(move->clone() ); @@ -537,13 +537,13 @@ void SpriteEaseBezier::onEnter() // sprite 1 ccBezierConfig bezier; - bezier.controlPoint_1 = Vec2(0, s.height/2); - bezier.controlPoint_2 = Vec2(300, -s.height/2); - bezier.endPosition = Vec2(300,100); + bezier.controlPoint_1 = Vec2(0.0f, s.height/2); + bezier.controlPoint_2 = Vec2(300.0f, -s.height/2); + bezier.endPosition = Vec2(300.0f,100.0f); auto bezierForward = BezierBy::create(3, bezier); auto bezierEaseForward = EaseBezierAction::create(bezierForward); - bezierEaseForward->setBezierParamer(0.5, 0.5, 1.0, 1.0); + bezierEaseForward->setBezierParamer(0.5f, 0.5f, 1.0f, 1.0f); auto bezierEaseBack = bezierEaseForward->reverse(); auto rep = RepeatForever::create(Sequence::create( bezierEaseForward, bezierEaseBack, nullptr)); @@ -552,19 +552,19 @@ void SpriteEaseBezier::onEnter() // sprite 2 _tamara->setPosition(80,160); ccBezierConfig bezier2; - bezier2.controlPoint_1 = Vec2(100, s.height/2); - bezier2.controlPoint_2 = Vec2(200, -s.height/2); - bezier2.endPosition = Vec2(240,160); + bezier2.controlPoint_1 = Vec2(100.0f, s.height/2); + bezier2.controlPoint_2 = Vec2(200.0f, -s.height/2); + bezier2.endPosition = Vec2(240.0f,160.0f); auto bezierTo1 = BezierTo::create(2, bezier2); auto bezierEaseTo1 = EaseBezierAction::create(bezierTo1); - bezierEaseTo1->setBezierParamer(0.5, 0.5, 1.0, 1.0); + bezierEaseTo1->setBezierParamer(0.5f, 0.5f, 1.0f, 1.0f); // sprite 3 - _kathia->setPosition(400,160); + _kathia->setPosition(400.0f,160.0f); auto bezierTo2 = BezierTo::create(2, bezier2); auto bezierEaseTo2 = EaseBezierAction::create(bezierTo2); - bezierEaseTo2->setBezierParamer(0.0, 0.5, -5.0, 1.0); + bezierEaseTo2->setBezierParamer(0.0f, 0.5f, -5.0f, 1.0f); _grossini->runAction( rep); @@ -588,7 +588,7 @@ void SpriteEaseQuadratic::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease_in = EaseQuadraticActionIn::create(move->clone() ); @@ -623,7 +623,7 @@ void SpriteEaseQuadraticInOut::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease = EaseQuadraticActionInOut::create(move->clone() ); @@ -656,7 +656,7 @@ void SpriteEaseQuartic::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease_in = EaseQuarticActionIn::create(move->clone() ); @@ -691,7 +691,7 @@ void SpriteEaseQuarticInOut::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease = EaseQuarticActionInOut::create(move->clone() ); @@ -723,7 +723,7 @@ void SpriteEaseQuintic::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease_in = EaseQuinticActionIn::create(move->clone() ); @@ -759,7 +759,7 @@ void SpriteEaseQuinticInOut::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease = EaseQuinticActionInOut::create(move->clone() ); @@ -791,7 +791,7 @@ void SpriteEaseCircle::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease_in = EaseCircleActionIn::create(move->clone() ); @@ -827,7 +827,7 @@ void SpriteEaseCircleInOut::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease = EaseCircleActionInOut::create(move->clone() ); @@ -859,7 +859,7 @@ void SpriteEaseCubic::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease_in = EaseCubicActionIn::create(move->clone() ); @@ -895,7 +895,7 @@ void SpriteEaseCubicInOut::onEnter() { EaseSpriteDemo::onEnter(); - auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0)); + auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0.0f)); auto move_back = move->reverse(); auto move_ease = EaseCubicActionInOut::create(move->clone() ); @@ -929,9 +929,9 @@ void SpeedTest::onEnter() auto s = Director::getInstance()->getWinSize(); // rotate and jump - auto jump1 = JumpBy::create(4, Vec2(-s.width+80, 0), 100, 4); + auto jump1 = JumpBy::create(4.0f, Vec2(-s.width+80, 0.0f), 100.0f, 4); auto jump2 = jump1->reverse(); - auto rot1 = RotateBy::create(4, 360*2); + auto rot1 = RotateBy::create(4.0f, 360*2.0f); auto rot2 = rot1->reverse(); auto seq3_1 = Sequence::create(jump2, jump1, nullptr); diff --git a/tests/cpp-tests/Classes/ActionsProgressTest/ActionsProgressTest.cpp b/tests/cpp-tests/Classes/ActionsProgressTest/ActionsProgressTest.cpp index 1d0cf458c6..f1f2f2cba0 100644 --- a/tests/cpp-tests/Classes/ActionsProgressTest/ActionsProgressTest.cpp +++ b/tests/cpp-tests/Classes/ActionsProgressTest/ActionsProgressTest.cpp @@ -118,9 +118,9 @@ void SpriteProgressToHorizontal::onEnter() auto left = ProgressTimer::create(Sprite::create(s_pathSister1)); left->setType(ProgressTimer::Type::BAR); // Setup for a bar starting from the left since the midpoint is 0 for the x - left->setMidpoint(Vec2(0,0)); + left->setMidpoint(Vec2(0.0f,0.0f)); // Setup for a horizontal bar since the bar change rate is 0 for y meaning no vertical change - left->setBarChangeRate(Vec2(1, 0)); + left->setBarChangeRate(Vec2(1.0f, 0.0f)); addChild(left); left->setPosition(100, s.height/2); left->runAction( RepeatForever::create(to1)); @@ -128,9 +128,9 @@ void SpriteProgressToHorizontal::onEnter() auto right = ProgressTimer::create(Sprite::create(s_pathSister2)); right->setType(ProgressTimer::Type::BAR); // Setup for a bar starting from the left since the midpoint is 1 for the x - right->setMidpoint(Vec2(1, 0)); + right->setMidpoint(Vec2(1.0f, 0.0f)); // Setup for a horizontal bar since the bar change rate is 0 for y meaning no vertical change - right->setBarChangeRate(Vec2(1, 0)); + right->setBarChangeRate(Vec2(1.0f, 0.0f)); addChild(right); right->setPosition(s.width-100, s.height/2); right->runAction( RepeatForever::create(to2)); @@ -159,9 +159,9 @@ void SpriteProgressToVertical::onEnter() left->setType(ProgressTimer::Type::BAR); // Setup for a bar starting from the bottom since the midpoint is 0 for the y - left->setMidpoint(Vec2(0,0)); + left->setMidpoint(Vec2(0.0f,0.0f)); // Setup for a vertical bar since the bar change rate is 0 for x meaning no horizontal change - left->setBarChangeRate(Vec2(0, 1)); + left->setBarChangeRate(Vec2(0.0f, 1.0f)); addChild(left); left->setPosition(100, s.height/2); left->runAction( RepeatForever::create(to1)); @@ -245,7 +245,7 @@ void SpriteProgressBarVarious::onEnter() // Setup for a bar starting from the bottom since the midpoint is 0 for the y left->setMidpoint(Vec2(0.5f, 0.5f)); // Setup for a vertical bar since the bar change rate is 0 for x meaning no horizontal change - left->setBarChangeRate(Vec2(1, 0)); + left->setBarChangeRate(Vec2(1.0f, 0.0f)); addChild(left); left->setPosition(100, s.height/2); left->runAction(RepeatForever::create(to->clone())); @@ -302,7 +302,7 @@ void SpriteProgressBarTintAndFade::onEnter() // Setup for a bar starting from the bottom since the midpoint is 0 for the y left->setMidpoint(Vec2(0.5f, 0.5f)); // Setup for a vertical bar since the bar change rate is 0 for x meaning no horizontal change - left->setBarChangeRate(Vec2(1, 0)); + left->setBarChangeRate(Vec2(1.0f, 0.0f)); addChild(left); left->setPosition(100, s.height/2); left->runAction(RepeatForever::create(to->clone())); @@ -363,7 +363,7 @@ void SpriteProgressWithSpriteFrame::onEnter() // Setup for a bar starting from the bottom since the midpoint is 0 for the y left->setMidpoint(Vec2(0.5f, 0.5f)); // Setup for a vertical bar since the bar change rate is 0 for x meaning no horizontal change - left->setBarChangeRate(Vec2(1, 0)); + left->setBarChangeRate(Vec2(1.0f, 0.0f)); addChild(left); left->setPosition(100, s.height/2); left->runAction(RepeatForever::create(to->clone())); diff --git a/tests/cpp-tests/Classes/ActionsTest/ActionsTest.cpp b/tests/cpp-tests/Classes/ActionsTest/ActionsTest.cpp index e6508a8796..2d0217b3ca 100644 --- a/tests/cpp-tests/Classes/ActionsTest/ActionsTest.cpp +++ b/tests/cpp-tests/Classes/ActionsTest/ActionsTest.cpp @@ -202,12 +202,12 @@ void ActionMove::onEnter() auto s = Director::getInstance()->getWinSize(); auto actionTo = MoveTo::create(2, Vec2(s.width-40, s.height-40)); - auto actionBy = MoveBy::create(2, Vec2(80,80)); + auto actionBy = MoveBy::create(2, Vec2(80.0f,80.0f)); auto actionByBack = actionBy->reverse(); _tamara->runAction( actionTo); _grossini->runAction( Sequence::create(actionBy, actionByBack, nullptr)); - _kathia->runAction(MoveTo::create(1, Vec2(40,40))); + _kathia->runAction(MoveTo::create(1, Vec2(40.0f,40.0f))); } std::string ActionMove::subtitle() const @@ -228,16 +228,16 @@ void ActionMove3D::onEnter() auto s = Director::getInstance()->getWinSize(); - _tamara->setPosition3D(Vec3(s.width-40, s.height-40, 0)); - _kathia->setPosition3D(Vec3(40, 40, 0)); + _tamara->setPosition3D(Vec3(s.width-40, s.height-40, 0.0f)); + _kathia->setPosition3D(Vec3(40.0f, 40.0f, 0.0f)); - auto actionTo = MoveTo::create(2, Vec3(s.width-40, s.height-40, -100)); - auto actionBy = MoveBy::create(2, Vec3(80, 80, -100)); + auto actionTo = MoveTo::create(2, Vec3(s.width-40, s.height-40, -100.0f)); + auto actionBy = MoveBy::create(2, Vec3(80.0f, 80.0f, -100.0f)); auto actionByBack = actionBy->reverse(); _tamara->runAction(actionTo); _grossini->runAction(Sequence::create(actionBy, actionByBack, nullptr)); - _kathia->runAction(MoveTo::create(1, Vec3(40, 40, -100))); + _kathia->runAction(MoveTo::create(1, Vec3(40.0f, 40.0f, -100.0f))); } std::string ActionMove3D::subtitle() const @@ -339,7 +339,7 @@ void ActionRotationalSkewVSStandardSkew::onEnter() Size boxSize(100.0f, 100.0f); auto box = LayerColor::create(Color4B(255,255,0,255)); - box->setAnchorPoint(Vec2(0.5,0.5)); + box->setAnchorPoint(Vec2(0.5f,0.5f)); box->setContentSize( boxSize ); box->setIgnoreAnchorPointForPosition(false); box->setPosition(s.width/2, s.height - 100 - box->getContentSize().height/2); @@ -355,7 +355,7 @@ void ActionRotationalSkewVSStandardSkew::onEnter() box->runAction(Sequence::create(actionTo, actionToBack, nullptr)); box = LayerColor::create(Color4B(255,255,0,255)); - box->setAnchorPoint(Vec2(0.5,0.5)); + box->setAnchorPoint(Vec2(0.5f,0.5f)); box->setContentSize(boxSize); box->setIgnoreAnchorPointForPosition(false); box->setPosition(s.width/2, s.height - 250 - box->getContentSize().height/2); @@ -385,7 +385,7 @@ void ActionSkewRotateScale::onEnter() Size boxSize(100.0f, 100.0f); auto box = LayerColor::create(Color4B(255, 255, 0, 255)); - box->setAnchorPoint(Vec2(0, 0)); + box->setAnchorPoint(Vec2(0.0f, 0.0f)); box->setPosition(190, 110); box->setContentSize(boxSize); @@ -394,13 +394,13 @@ void ActionSkewRotateScale::onEnter() box->addChild(uL); uL->setContentSize(Size(markrside, markrside)); uL->setPosition(0.f, boxSize.height - markrside); - uL->setAnchorPoint(Vec2(0, 0)); + uL->setAnchorPoint(Vec2(0.0f, 0.0f)); auto uR = LayerColor::create(Color4B(0, 0, 255, 255)); box->addChild(uR); uR->setContentSize(Size(markrside, markrside)); uR->setPosition(boxSize.width - markrside, boxSize.height - markrside); - uR->setAnchorPoint(Vec2(0, 0)); + uR->setAnchorPoint(Vec2(0.0f, 0.0f)); addChild(box); auto actionTo = SkewTo::create(2, 0.f, 2.f); @@ -460,9 +460,9 @@ void ActionRotateBy3D::onEnter() centerSprites(3); - auto actionBy1 = RotateBy::create(4, Vec3(360, 0, 0)); - auto actionBy2 = RotateBy::create(4, Vec3(0, 360, 0)); - auto actionBy3 = RotateBy::create(4 ,Vec3(0, 0, 360)); + auto actionBy1 = RotateBy::create(4, Vec3(360.0f, 0.0f, 0.0f)); + auto actionBy2 = RotateBy::create(4, Vec3(0.0f, 360.0f, 0.0f)); + auto actionBy3 = RotateBy::create(4 ,Vec3(0.0f, 0.0f, 360.0f)); _tamara->runAction( Sequence::create(actionBy1, actionBy1->reverse(), nullptr)); _grossini->runAction( Sequence::create(actionBy2, actionBy2->reverse(), nullptr)); @@ -519,9 +519,9 @@ void ActionBezier::onEnter() // sprite 1 ccBezierConfig bezier; - bezier.controlPoint_1 = Vec2(0, s.height/2); - bezier.controlPoint_2 = Vec2(300, -s.height/2); - bezier.endPosition = Vec2(300,100); + bezier.controlPoint_1 = Vec2(0.0f, s.height/2); + bezier.controlPoint_2 = Vec2(300.0f, -s.height/2); + bezier.endPosition = Vec2(300.0f,100.0f); auto bezierForward = BezierBy::create(3, bezier); auto bezierBack = bezierForward->reverse(); @@ -531,9 +531,9 @@ void ActionBezier::onEnter() // sprite 2 _tamara->setPosition(80,160); ccBezierConfig bezier2; - bezier2.controlPoint_1 = Vec2(100, s.height/2); - bezier2.controlPoint_2 = Vec2(200, -s.height/2); - bezier2.endPosition = Vec2(240,160); + bezier2.controlPoint_1 = Vec2(100.0f, s.height/2); + bezier2.controlPoint_2 = Vec2(200.0f, -s.height/2); + bezier2.endPosition = Vec2(240.0f,160.0f); auto bezierTo1 = BezierTo::create(2, bezier2); @@ -718,7 +718,7 @@ void ActionSequence::onEnter() alignSpritesLeft(1); auto action = Sequence::create( - MoveBy::create( 2, Vec2(240,0)), + MoveBy::create( 2, Vec2(240.0f,0.0f)), RotateBy::create( 2, 540), nullptr); @@ -744,9 +744,9 @@ void ActionSequence2::onEnter() _grossini->setVisible(false); auto action = Sequence::create( - Place::create(Vec2(200,200)), + Place::create(Vec2(200.0f,200.0f)), Show::create(), - MoveBy::create(1, Vec2(100,0)), + MoveBy::create(1, Vec2(100.0f,0.0f)), CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback1,this)), CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback2,this,_grossini)), CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback3,this,_grossini,0xbebabeba)), @@ -799,7 +799,7 @@ void ActionSequence3::onEnter() alignSpritesLeft(1); // Uses Array API - auto action1 = MoveBy::create(2, Vec2(240,0)); + auto action1 = MoveBy::create(2, Vec2(240.0f,0.0f)); auto action2 = RotateBy::create(2, 540); auto action3 = action1->reverse(); auto action4 = action2->reverse(); @@ -830,7 +830,7 @@ void ActionCallFuncN::onEnter() centerSprites(1); auto action = Sequence::create( - MoveBy::create(2.0f, Vec2(150,0)), + MoveBy::create(2.0f, Vec2(150.0f,0.0f)), CallFuncN::create( CC_CALLBACK_1(ActionCallFuncN::callback, this)), nullptr); @@ -865,7 +865,7 @@ void ActionCallFuncND::onEnter() centerSprites(1); auto action = Sequence::create( - MoveBy::create(2.0f, Vec2(200,0)), + MoveBy::create(2.0f, Vec2(200.0f,0.0f)), CallFuncN::create( CC_CALLBACK_1(ActionCallFuncND::doRemoveFromParentAndCleanup, this, true)), nullptr); @@ -900,7 +900,7 @@ void ActionCallFunction::onEnter() auto action1 = Sequence::create( - MoveBy::create(2, Vec2(200,0)), + MoveBy::create(2, Vec2(200.0f,0.0f)), CallFunc::create( std::bind(&ActionCallFunction::callback1, this) ), CallFunc::create( // lambda @@ -1109,7 +1109,7 @@ void ActionDelayTime::onEnter() alignSpritesLeft(1); - auto move = MoveBy::create(1, Vec2(150,0)); + auto move = MoveBy::create(1, Vec2(150.0f,0.0f)); auto action = Sequence::create( move, DelayTime::create(2), move, nullptr); _grossini->runAction(action); @@ -1132,8 +1132,8 @@ void ActionReverseSequence::onEnter() alignSpritesLeft(1); - auto move1 = MoveBy::create(1, Vec2(250,0)); - auto move2 = MoveBy::create(1, Vec2(0,50)); + auto move1 = MoveBy::create(1, Vec2(250.0f,0.0f)); + auto move2 = MoveBy::create(1, Vec2(0.0f,50.0f)); auto seq = Sequence::create( move1, move2, move1->reverse(), nullptr); auto action = Sequence::create( seq, seq->reverse(), nullptr); @@ -1160,8 +1160,8 @@ void ActionReverseSequence2::onEnter() // Test: // Sequence should work both with IntervalAction and InstantActions - auto move1 = MoveBy::create(1, Vec2(250,0)); - auto move2 = MoveBy::create(1, Vec2(0,50)); + auto move1 = MoveBy::create(1, Vec2(250.0f,0.0f)); + auto move2 = MoveBy::create(1, Vec2(0.0f,50.0f)); auto tog1 = ToggleVisibility::create(); auto tog2 = ToggleVisibility::create(); auto seq = Sequence::create( move1, tog1, move2, tog2, move1->reverse(), nullptr); @@ -1172,8 +1172,8 @@ void ActionReverseSequence2::onEnter() // Also test that the reverse of Hide is Show, and vice-versa _kathia->runAction(action); - auto move_tamara = MoveBy::create(1, Vec2(100,0)); - auto move_tamara2 = MoveBy::create(1, Vec2(50,0)); + auto move_tamara = MoveBy::create(1, Vec2(100.0f,0.0f)); + auto move_tamara2 = MoveBy::create(1, Vec2(50.0f,0.0f)); auto hide = Hide::create(); auto seq_tamara = Sequence::create( move_tamara, hide, move_tamara2, nullptr); auto seq_back = seq_tamara->reverse(); @@ -1196,9 +1196,9 @@ void ActionRepeat::onEnter() alignSpritesLeft(2); - auto a1 = MoveBy::create(1, Vec2(150,0)); + auto a1 = MoveBy::create(1, Vec2(150.0f,0.0f)); auto action1 = Repeat::create( - Sequence::create( Place::create(Vec2(60,60)), a1, nullptr) , + Sequence::create( Place::create(Vec2(60.0f,60.0f)), a1, nullptr) , 3); auto action2 = RepeatForever::create( Sequence::create(a1->clone(), a1->reverse(), nullptr) @@ -1247,7 +1247,7 @@ void ActionOrbit::onEnter() _tamara->runAction(RepeatForever::create(action2)); _grossini->runAction(RepeatForever::create(action3)); - auto move = MoveBy::create(3, Vec2(100,-100)); + auto move = MoveBy::create(3, Vec2(100.0f,-100.0f)); auto move_back = move->reverse(); auto seq = Sequence::create(move, move_back, nullptr); auto rfe = RepeatForever::create(seq); @@ -1284,20 +1284,20 @@ void ActionFollow::onEnter() float x = s.width*2 - 100; float y = s.height; - Vec2 vertices[] = { Vec2(5,5), Vec2(x-5,5), Vec2(x-5,y-5), Vec2(5,y-5) }; - drawNode->drawPoly(vertices, 4, true, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1)); + Vec2 vertices[] = { Vec2(5.0f,5.0f), Vec2(x-5,5.0f), Vec2(x-5,y-5), Vec2(5.0f,y-5) }; + drawNode->drawPoly(vertices, 4, true, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1.0f)); this->addChild(drawNode); - _grossini->setPosition(-200, s.height / 2); - auto move = MoveBy::create(2, Vec2(s.width * 3, 0)); + _grossini->setPosition(-200.0f, s.height / 2); + auto move = MoveBy::create(2, Vec2(s.width * 3, 0.0f)); auto move_back = move->reverse(); auto seq = Sequence::create(move, move_back, nullptr); auto rep = RepeatForever::create(seq); _grossini->runAction(rep); - this->runAction(Follow::create(_grossini, Rect(0, 0, s.width * 2 - 100, s.height))); + this->runAction(Follow::create(_grossini, Rect(0.0f, 0.0f, s.width * 2 - 100, s.height))); } std::string ActionFollow::subtitle() const @@ -1321,13 +1321,13 @@ void ActionFollowWithOffset::onEnter() float x = s.width*2 - 100; float y = s.height; - Vec2 vertices[] = { Vec2(5,5), Vec2(x-5,5), Vec2(x-5,y-5), Vec2(5,y-5) }; - drawNode->drawPoly(vertices, 4, true, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1)); + Vec2 vertices[] = { Vec2(5.0f,5.0f), Vec2(x-5,5.0f), Vec2(x-5,y-5), Vec2(5.0f,y-5) }; + drawNode->drawPoly(vertices, 4, true, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1.0f)); this->addChild(drawNode); _grossini->setPosition(-200, s.height / 2); - auto move = MoveBy::create(2, Vec2(s.width * 3, 1)); + auto move = MoveBy::create(2, Vec2(s.width * 3, 1.0f)); auto move_back = move->reverse(); auto seq = Sequence::create(move, move_back, nullptr); auto rep = RepeatForever::create(seq); @@ -1337,7 +1337,7 @@ void ActionFollowWithOffset::onEnter() //sample offset values set float verticalOffset = -900; float horizontalOffset = 200; - this->runAction(Follow::createWithOffset(_grossini, horizontalOffset,verticalOffset,Rect(0, 0, s.width * 2 - 100, s.height))); + this->runAction(Follow::createWithOffset(_grossini, horizontalOffset,verticalOffset,Rect(0.0f, 0.0f, s.width * 2 - 100, s.height))); } std::string ActionFollowWithOffset::subtitle() const @@ -1469,11 +1469,11 @@ void ActionMoveStacked::runActionsInSprite(Sprite *sprite) sprite->runAction( RepeatForever::create( Sequence::create( - MoveBy::create(0.05f, Vec2(10,10)), - MoveBy::create(0.05f, Vec2(-10,-10)), + MoveBy::create(0.05f, Vec2(10.0f,10.0f)), + MoveBy::create(0.05f, Vec2(-10.0f,-10.0f)), nullptr))); - auto action = MoveBy::create(2.0f, Vec2(400,0)); + auto action = MoveBy::create(2.0f, Vec2(400.0f,0.0f)); auto action_back = action->reverse(); sprite->runAction( @@ -1521,9 +1521,9 @@ void ActionMoveBezierStacked::runActionsInSprite(Sprite *sprite) // sprite 1 ccBezierConfig bezier; - bezier.controlPoint_1 = Vec2(0, s.height/2); - bezier.controlPoint_2 = Vec2(300, -s.height/2); - bezier.endPosition = Vec2(300,100); + bezier.controlPoint_1 = Vec2(0.0f, s.height/2); + bezier.controlPoint_2 = Vec2(300.0f, -s.height/2); + bezier.endPosition = Vec2(300.0f,100.0f); auto bezierForward = BezierBy::create(3, bezier); auto bezierBack = bezierForward->reverse(); @@ -1534,8 +1534,8 @@ void ActionMoveBezierStacked::runActionsInSprite(Sprite *sprite) sprite->runAction( RepeatForever::create( Sequence::create( - MoveBy::create(0.05f, Vec2(10,0)), - MoveBy::create(0.05f, Vec2(-10,0)), + MoveBy::create(0.05f, Vec2(10.0f,0.0f)), + MoveBy::create(0.05f, Vec2(-10.0f,0.0f)), nullptr))); } @@ -1566,12 +1566,12 @@ void ActionCatmullRomStacked::onEnter() auto array = PointArray::create(20); - array->addControlPoint(Vec2(0,0)); - array->addControlPoint(Vec2(80,80)); - array->addControlPoint(Vec2(s.width-80,80)); - array->addControlPoint(Vec2(s.width-80,s.height-80)); - array->addControlPoint(Vec2(80,s.height-80)); - array->addControlPoint(Vec2(80,80)); + array->addControlPoint(Vec2(0.0f,0.0f)); + array->addControlPoint(Vec2(80.0f,80.0f)); + array->addControlPoint(Vec2(s.width-80,80.0f)); + array->addControlPoint(Vec2(s.width-80,s.height-80.0f)); + array->addControlPoint(Vec2(80.0f,s.height-80.0f)); + array->addControlPoint(Vec2(80.0f,80.0f)); array->addControlPoint(Vec2(s.width/2, s.height/2)); auto action = CatmullRomBy::create(3, array); @@ -1584,13 +1584,13 @@ void ActionCatmullRomStacked::onEnter() _tamara->runAction( RepeatForever::create( Sequence::create( - MoveBy::create(0.05f, Vec2(10,0)), - MoveBy::create(0.05f, Vec2(-10,0)), + MoveBy::create(0.05f, Vec2(10.0f,0.0f)), + MoveBy::create(0.05f, Vec2(-10.0f,0.0f)), nullptr))); auto drawNode1 = DrawNode::create(); - drawNode1->setPosition(Vec2(50,50)); - drawNode1->drawCatmullRom(array, 50, Color4F(1.0, 1.0, 0.0, 0.5)); + drawNode1->setPosition(Vec2(50.0f,50.0f)); + drawNode1->drawCatmullRom(array, 50, Color4F(1.0f, 1.0f, 0.0f, 0.5f)); this->addChild(drawNode1); // @@ -1602,11 +1602,11 @@ void ActionCatmullRomStacked::onEnter() auto array2 = PointArray::create(20); - array2->addControlPoint(Vec2(s.width/2, 30)); - array2->addControlPoint(Vec2(s.width-80,30)); - array2->addControlPoint(Vec2(s.width-80,s.height-80)); - array2->addControlPoint(Vec2(s.width/2,s.height-80)); - array2->addControlPoint(Vec2(s.width/2, 30)); + array2->addControlPoint(Vec2(s.width/2, 30.0f)); + array2->addControlPoint(Vec2(s.width-80,30.0f)); + array2->addControlPoint(Vec2(s.width-80.0f,s.height-80.0f)); + array2->addControlPoint(Vec2(s.width/2,s.height-80.0f)); + array2->addControlPoint(Vec2(s.width/2, 30.0f)); auto action2 = CatmullRomTo::create(3, array2); auto reverse2 = action2->reverse(); @@ -1618,8 +1618,8 @@ void ActionCatmullRomStacked::onEnter() _kathia->runAction( RepeatForever::create( Sequence::create( - MoveBy::create(0.05f, Vec2(10,0)), - MoveBy::create(0.05f, Vec2(-10,0)), + MoveBy::create(0.05f, Vec2(10.0f,0.0f)), + MoveBy::create(0.05f, Vec2(-10.0f,0.0f)), nullptr))); auto drawNode2 = DrawNode::create(); @@ -1654,11 +1654,11 @@ void ActionCardinalSplineStacked::onEnter() auto array = PointArray::create(20); - array->addControlPoint(Vec2(0, 0)); - array->addControlPoint(Vec2(s.width/2-30,0)); - array->addControlPoint(Vec2(s.width/2-30,s.height-80)); - array->addControlPoint(Vec2(0, s.height-80)); - array->addControlPoint(Vec2(0, 0)); + array->addControlPoint(Vec2(0.0f, 0.0f)); + array->addControlPoint(Vec2(s.width/2-30,0.0f)); + array->addControlPoint(Vec2(s.width/2-30,s.height-80.0f)); + array->addControlPoint(Vec2(0.0f, s.height-80.0f)); + array->addControlPoint(Vec2(0.0f, 0.0f)); // @@ -1678,13 +1678,13 @@ void ActionCardinalSplineStacked::onEnter() _tamara->runAction( RepeatForever::create( Sequence::create( - MoveBy::create(0.05f, Vec2(10,0)), - MoveBy::create(0.05f, Vec2(-10,0)), + MoveBy::create(0.05f, Vec2(10.0f,0.0f)), + MoveBy::create(0.05f, Vec2(-10.0f,0.0f)), nullptr))); auto drawNode1 = DrawNode::create(); - drawNode1->setPosition(Vec2(50,50)); - drawNode1->drawCardinalSpline(array, 0, 100, Color4F(1.0, 0.0, 1.0, 1.0)); + drawNode1->setPosition(Vec2(50.0f,50.0f)); + drawNode1->drawCardinalSpline(array, 0, 100, Color4F(1.0f, 0.0f, 1.0f, 1.0f)); this->addChild(drawNode1); // @@ -1705,13 +1705,13 @@ void ActionCardinalSplineStacked::onEnter() _kathia->runAction( RepeatForever::create( Sequence::create( - MoveBy::create(0.05f, Vec2(10,0)), - MoveBy::create(0.05f, Vec2(-10,0)), + MoveBy::create(0.05f, Vec2(10.0f,0.0f)), + MoveBy::create(0.05f, Vec2(-10.0f,0.0f)), nullptr))); auto drawNode2 = DrawNode::create(); - drawNode2->setPosition(Vec2(s.width/2,50)); - drawNode2->drawCardinalSpline(array, 1, 100, Color4F(0.0, 0.0, 1.0, 1.0)); + drawNode2->setPosition(Vec2(s.width/2,50.0f)); + drawNode2->drawCardinalSpline(array, 1, 100, Color4F(0.0f, 0.0f, 1.0f, 1.0f)); this->addChild(drawNode2); } @@ -1777,7 +1777,7 @@ void Issue1305_2::onEnter() spr->setPosition(200,200); addChild(spr); - auto act1 = MoveBy::create(2 ,Vec2(0, 100)); + auto act1 = MoveBy::create(2 ,Vec2(0.0f, 100.0f)); /* c++ can't support block, so we use CallFuncN instead. id act2 = [CallBlock actionWithBlock:^{ NSLog(@"1st block"); @@ -1797,11 +1797,11 @@ void Issue1305_2::onEnter() */ auto act2 = CallFunc::create( std::bind( &Issue1305_2::printLog1, this)); - auto act3 = MoveBy::create(2, Vec2(0, -100)); + auto act3 = MoveBy::create(2, Vec2(0.0f, -100.0f)); auto act4 = CallFunc::create( std::bind( &Issue1305_2::printLog2, this)); - auto act5 = MoveBy::create(2, Vec2(100, -100)); + auto act5 = MoveBy::create(2, Vec2(100.0f, -100.0f)); auto act6 = CallFunc::create( std::bind( &Issue1305_2::printLog3, this)); - auto act7 = MoveBy::create(2, Vec2(-100, 0)); + auto act7 = MoveBy::create(2, Vec2(-100.0f, 0.0f)); auto act8 = CallFunc::create( std::bind( &Issue1305_2::printLog4, this)); auto actF = Sequence::create(act1, act2, act3, act4, act5, act6, act7, act8, nullptr); @@ -1850,7 +1850,7 @@ void Issue1288::onEnter() spr->setPosition(100, 100); addChild(spr); - auto act1 = MoveBy::create(0.5, Vec2(100, 0)); + auto act1 = MoveBy::create(0.5, Vec2(100.0f, 0.0f)); auto act2 = act1->reverse(); auto act3 = Sequence::create(act1, act2, nullptr); auto act4 = Repeat::create(act3, 2); @@ -1877,7 +1877,7 @@ void Issue1288_2::onEnter() spr->setPosition(100, 100); addChild(spr); - auto act1 = MoveBy::create(0.5, Vec2(100, 0)); + auto act1 = MoveBy::create(0.5, Vec2(100.0f, 0.0f)); spr->runAction(Repeat::create(act1, 1)); } @@ -2027,12 +2027,12 @@ void ActionCatmullRom::onEnter() auto array = PointArray::create(20); - array->addControlPoint(Vec2(0, 0)); - array->addControlPoint(Vec2(80, 80)); - array->addControlPoint(Vec2(s.width - 80, 80)); + array->addControlPoint(Vec2(0.0f, 0.0f)); + array->addControlPoint(Vec2(80.0f, 80.0f)); + array->addControlPoint(Vec2(s.width - 80, 80.0f)); array->addControlPoint(Vec2(s.width - 80, s.height - 80)); - array->addControlPoint(Vec2(80, s.height - 80)); - array->addControlPoint(Vec2(80, 80)); + array->addControlPoint(Vec2(80.0f, s.height - 80.0f)); + array->addControlPoint(Vec2(80.0f, 80.0f)); array->addControlPoint(Vec2(s.width / 2, s.height / 2)); auto action = CatmullRomBy::create(3, array); @@ -2043,8 +2043,8 @@ void ActionCatmullRom::onEnter() _tamara->runAction(seq); auto drawNode1 = DrawNode::create(); - drawNode1->setPosition(Vec2(50,50)); - drawNode1->drawCatmullRom(array, 50, Color4F(1.0, 0.0, 1.0, 1.0)); + drawNode1->setPosition(Vec2(50.0f,50.0f)); + drawNode1->drawCatmullRom(array, 50, Color4F(1.0f, 0.0f, 1.0f, 1.0f)); this->addChild(drawNode1); // @@ -2056,11 +2056,11 @@ void ActionCatmullRom::onEnter() auto array2 = PointArray::create(20); - array2->addControlPoint(Vec2(s.width / 2, 30)); - array2->addControlPoint(Vec2(s.width -80, 30)); + array2->addControlPoint(Vec2(s.width / 2, 30.0f)); + array2->addControlPoint(Vec2(s.width -80, 30.0f)); array2->addControlPoint(Vec2(s.width - 80, s.height - 80)); array2->addControlPoint(Vec2(s.width / 2, s.height - 80)); - array2->addControlPoint(Vec2(s.width / 2, 30)); + array2->addControlPoint(Vec2(s.width / 2, 30.0f)); auto action2 = CatmullRomTo::create(3, array2); auto reverse2 = action2->reverse(); @@ -2070,7 +2070,7 @@ void ActionCatmullRom::onEnter() _kathia->runAction(seq2); auto drawNode2 = DrawNode::create(); - drawNode2->drawCatmullRom(array2, 50, Color4F(0.0, 1.0, 1.0, 1.0)); + drawNode2->drawCatmullRom(array2, 50, Color4F(0.0f, 1.0f, 1.0f, 1.0f)); this->addChild(drawNode2); } @@ -2100,11 +2100,11 @@ void ActionCardinalSpline::onEnter() auto array = PointArray::create(20); - array->addControlPoint(Vec2(0, 0)); - array->addControlPoint(Vec2(s.width/2-30, 0)); + array->addControlPoint(Vec2(0.0f, 0.0f)); + array->addControlPoint(Vec2(s.width/2-30, 0.0f)); array->addControlPoint(Vec2(s.width/2-30, s.height-80)); - array->addControlPoint(Vec2(0, s.height-80)); - array->addControlPoint(Vec2(0, 0)); + array->addControlPoint(Vec2(0.0f, s.height-80)); + array->addControlPoint(Vec2(0.0f, 0.0f)); // // sprite 1 (By) @@ -2121,8 +2121,8 @@ void ActionCardinalSpline::onEnter() _tamara->runAction(seq); auto drawNode1 = DrawNode::create(); - drawNode1->setPosition(Vec2(50,50)); - drawNode1->drawCardinalSpline(array, 0, 100, Color4F(1.0, 0.0, 1.0, 1.0)); + drawNode1->setPosition(Vec2(50.0f,50.0f)); + drawNode1->drawCardinalSpline(array, 0, 100, Color4F(1.0f, 0.0f, 1.0f, 1.0f)); this->addChild(drawNode1); // @@ -2140,8 +2140,8 @@ void ActionCardinalSpline::onEnter() _kathia->runAction(seq2); auto drawNode2 = DrawNode::create(); - drawNode2->setPosition(Vec2(s.width/2, 50)); - drawNode2->drawCardinalSpline(array, 1, 100, Color4F(1.0, 0.0, 1.0, 1.0)); + drawNode2->setPosition(Vec2(s.width/2, 50.0f)); + drawNode2->drawCardinalSpline(array, 1, 100, Color4F(1.0f, 0.0f, 1.0f, 1.0f)); this->addChild(drawNode2); } @@ -2178,9 +2178,9 @@ void PauseResumeActions::onEnter() this->centerSprites(3); - _tamara->runAction(RepeatForever::create(RotateBy::create(3, 360))); - _grossini->runAction(RepeatForever::create(RotateBy::create(3, -360))); - _kathia->runAction(RepeatForever::create(RotateBy::create(3, 360))); + _tamara->runAction(RepeatForever::create(RotateBy::create(3.0f, 360.0f))); + _grossini->runAction(RepeatForever::create(RotateBy::create(3.0f, -360.0f))); + _kathia->runAction(RepeatForever::create(RotateBy::create(3.0f, 360.0f))); this->schedule([&](float dt){ log("Pausing"); @@ -2237,15 +2237,15 @@ void ActionResize::onEnter() Vec2 offset(0.0f, 50.0f); ImageView* imageViewResize = ImageView::create("cocosui/buttonHighlighted.png"); imageViewResize->setScale9Enabled(true); - imageViewResize->setContentSize(Size(50, 40)); + imageViewResize->setContentSize(Size(50.0f, 40.0f)); imageViewResize->setPosition(Vec2((widgetSize.width / 2.0f) + offset.x, (widgetSize.height / 2.0f) + offset.y)); - auto resizeDown = cocos2d::ResizeTo::create(2.8f, Size(50, 40)); - auto resizeUp = cocos2d::ResizeTo::create(2.8f, Size(300, 40)); + auto resizeDown = cocos2d::ResizeTo::create(2.8f, Size(50.0f, 40.0f)); + auto resizeUp = cocos2d::ResizeTo::create(2.8f, Size(300.0f, 40.0f)); - auto resizeByDown = cocos2d::ResizeBy::create(1.8f, Size(0, -30)); - auto resizeByUp = cocos2d::ResizeBy::create(1.8f, Size(0, 30)); + auto resizeByDown = cocos2d::ResizeBy::create(1.8f, Size(0.0f, -30.0f)); + auto resizeByUp = cocos2d::ResizeBy::create(1.8f, Size(0.0f, 30.0f)); addChild(imageViewResize); auto rep = RepeatForever::create(Sequence::create(resizeUp, resizeDown, resizeByDown, resizeByUp, nullptr)); imageViewResize->runAction(rep); @@ -2253,7 +2253,7 @@ void ActionResize::onEnter() // Create another imageview that scale to see the difference ImageView* imageViewScale = ImageView::create("cocosui/buttonHighlighted.png"); imageViewScale->setScale9Enabled(true); - imageViewScale->setContentSize(Size(50, 40)); + imageViewScale->setContentSize(Size(50.0f, 40.0f)); imageViewScale->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); @@ -2284,7 +2284,7 @@ void ActionRemoveSelf::onEnter() alignSpritesLeft(1); auto action = Sequence::create( - MoveBy::create( 2, Vec2(240,0)), + MoveBy::create( 2, Vec2(240.0f,0.0f)), RotateBy::create( 2, 540), ScaleTo::create(1,0.1f), RemoveSelf::create(), diff --git a/tests/cpp-tests/Classes/BillBoardTest/BillBoardTest.cpp b/tests/cpp-tests/Classes/BillBoardTest/BillBoardTest.cpp index d54a407efc..8918c1d75e 100644 --- a/tests/cpp-tests/Classes/BillBoardTest/BillBoardTest.cpp +++ b/tests/cpp-tests/Classes/BillBoardTest/BillBoardTest.cpp @@ -49,12 +49,12 @@ BillBoardTests::BillBoardTests() BillBoardRotationTest::BillBoardRotationTest() { auto root = Sprite3D::create(); - root->setPositionNormalized(Vec2(.5,.25)); + root->setPositionNormalized(Vec2(0.5f,0.25f)); addChild(root); auto model = Sprite3D::create("Sprite3DTest/orc.c3b"); model->setScale(5); - model->setRotation3D(Vec3(0,180,0)); + model->setRotation3D(Vec3(0.0f,180.0f,0.0f)); root->addChild(model); auto bill = BillBoard::create(); @@ -66,19 +66,19 @@ BillBoardRotationTest::BillBoardRotationTest() bill->addChild(sp); auto lbl = Label::create(); - lbl->setPosition(0, 30); + lbl->setPosition(0.0f, 30.0f); lbl->setString("+100"); bill->addChild(lbl); - auto r = RotateBy::create(10, Vec3(0,360,0)); + auto r = RotateBy::create(10, Vec3(0.0f,360.0f,0.0f)); auto rp = RepeatForever::create(r); root->runAction(rp); - auto jump = JumpBy::create(1, Vec2(0, 0), 30, 1); + auto jump = JumpBy::create(1, Vec2(0.0f, 0.0f), 30, 1); auto scale = ScaleBy::create(2.f, 2.f, 2.f, 0.1f); auto seq = Sequence::create(jump,scale, NULL); - auto rot = RotateBy::create(2, Vec3(-90, 0, 0)); + auto rot = RotateBy::create(2, Vec3(-90.0f, 0.0f, 0.0f)); auto act = Spawn::create(seq, rot,NULL); auto scale2 = scale->reverse(); @@ -134,7 +134,7 @@ BillBoardTest::BillBoardTest() for (unsigned int i = 0; i < 4; ++i) { Layer *layer = Layer::create(); - auto billboard = BillBoard::create(imgs[(unsigned int)(CCRANDOM_0_1() * 1 + 0.5)]); + auto billboard = BillBoard::create(imgs[(unsigned int)(CCRANDOM_0_1() * 1 + 0.5f)]); billboard->setScale(0.5f); billboard->setPosition3D(Vec3(0.0f, 0.0f, CCRANDOM_MINUS1_1() * 150.0f)); billboard->setOpacity(CCRANDOM_0_1() * 128 + 128); @@ -162,20 +162,20 @@ BillBoardTest::BillBoardTest() _layerBillBoard->addChild(sprite3d); } - addNewBillBoardWithCoords(Vec3(20,5,0)); - addNewBillBoardWithCoords(Vec3(60,5,0)); - addNewBillBoardWithCoords(Vec3(100,5,0)); - addNewBillBoardWithCoords(Vec3(140,5,0)); - addNewBillBoardWithCoords(Vec3(180,5,0)); + addNewBillBoardWithCoords(Vec3(20.0f,5.0f,0.0f)); + addNewBillBoardWithCoords(Vec3(60.0f,5.0f,0.0f)); + addNewBillBoardWithCoords(Vec3(100.0f,5.0f,0.0f)); + addNewBillBoardWithCoords(Vec3(140.0f,5.0f,0.0f)); + addNewBillBoardWithCoords(Vec3(180.0f,5.0f,0.0f)); - addNewAniBillBoardWithCoords(Vec3(-20,0,0)); - addNewAniBillBoardWithCoords(Vec3(-60,0,0)); - addNewAniBillBoardWithCoords(Vec3(-100,0,0)); - addNewAniBillBoardWithCoords(Vec3(-140,0,0)); - addNewAniBillBoardWithCoords(Vec3(-180,0,0)); + addNewAniBillBoardWithCoords(Vec3(-20.0f,0.0f,0.0f)); + addNewAniBillBoardWithCoords(Vec3(-60.0f,0.0f,0.0f)); + addNewAniBillBoardWithCoords(Vec3(-100.0f,0.0f,0.0f)); + addNewAniBillBoardWithCoords(Vec3(-140.0f,0.0f,0.0f)); + addNewAniBillBoardWithCoords(Vec3(-180.0f,0.0f,0.0f)); - _camera->setPosition3D(Vec3(0, 100, 230)); - _camera->lookAt(Vec3(0,0,0), Vec3(0,1,0)); + _camera->setPosition3D(Vec3(0.0f, 100.0f, 230.0f)); + _camera->lookAt(Vec3(0,0,0), Vec3(0.0f,1.0f,0.0f)); TTFConfig ttfConfig("fonts/arial.ttf", 16); auto label1 = Label::createWithTTF(ttfConfig,"rotate+"); diff --git a/tests/cpp-tests/Classes/BugsTest/Bug-12847.cpp b/tests/cpp-tests/Classes/BugsTest/Bug-12847.cpp index 18e5016ea2..0d6ffb0af4 100644 --- a/tests/cpp-tests/Classes/BugsTest/Bug-12847.cpp +++ b/tests/cpp-tests/Classes/BugsTest/Bug-12847.cpp @@ -57,7 +57,7 @@ bool Bug12847Layer::init() { sprite1 = Sprite::create("Images/bug12847_sprite.png"); sprite1->getTexture()->setAliasTexParameters(); - sprite1->setPosition(Vec2(_visibleSize.width/3, 50)); + sprite1->setPosition(Vec2(_visibleSize.width/3, 50.0f)); this->addChild(sprite1, 1); sprite2 = Sprite::create("Images/bug12847_sprite.png"); @@ -71,7 +71,7 @@ bool Bug12847Layer::init() sprite3 = Sprite::createWithSpriteFrameName("bug12847_sprite2.png"); sprite3->getTexture()->setAliasTexParameters(); - sprite3->setPosition(Vec2(_visibleSize.width * 2/3, 50)); + sprite3->setPosition(Vec2(_visibleSize.width * 2/3, 50.0f)); this->addChild(sprite3, 1); sprite4 = Sprite::createWithSpriteFrameName("bug12847_sprite2.png"); diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp index a609d025d9..1c6d90d90c 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp @@ -67,7 +67,7 @@ CameraRotationTest::CameraRotationTest() auto s = Director::getInstance()->getWinSize(); _camControlNode = Node::create(); - _camControlNode->setPositionNormalized(Vec2(.5,.5)); + _camControlNode->setPositionNormalized(Vec2(0.5f,0.5f)); addChild(_camControlNode); _camNode = Node::create(); @@ -86,30 +86,30 @@ CameraRotationTest::CameraRotationTest() //Billboards //Yellow is at the back bill1 = BillBoard::create("Images/Icon.png"); - bill1->setPosition3D(Vec3(50, 10, -10)); + bill1->setPosition3D(Vec3(50.0f, 10.0f, -10.0f)); bill1->setColor(Color3B::YELLOW); bill1->setScale(0.6f); sp3d->addChild(bill1); l1 = Label::create(); - l1->setPosition(Vec2(0,-10)); + l1->setPosition(Vec2(0.0f,-10.0f)); l1->setString("Billboard1"); l1->setColor(Color3B::WHITE); l1->setScale(3); bill1->addChild(l1); auto p1 = ParticleSystemQuad::create("Particles/SmallSun.plist"); - p1->setPosition(30,80); + p1->setPosition(30.0f,80.0f); bill1->addChild(p1); bill2 = BillBoard::create("Images/Icon.png"); - bill2->setPosition3D(Vec3(-50, -10, 10)); + bill2->setPosition3D(Vec3(-50.0f, -10.0f, 10.0f)); bill2->setScale(0.6f); sp3d->addChild(bill2); l2 = Label::create(); l2->setString("Billboard2"); - l2->setPosition(Vec2(0,-10)); + l2->setPosition(Vec2(0.0f,-10.0f)); l2->setColor(Color3B::WHITE); l2->setScale(3); bill2->addChild(l2); @@ -827,7 +827,7 @@ void CameraCullingDemo::update(float dt) void CameraCullingDemo::reachEndCallBack() { _cameraFirst->stopActionByTag(100); - auto inverse = MoveTo::create(4.f, Vec2(-_cameraFirst->getPositionX(), 0)); + auto inverse = MoveTo::create(4.f, Vec2(-_cameraFirst->getPositionX(), 0.0f)); inverse->retain(); _moveAction->release(); @@ -844,11 +844,11 @@ void CameraCullingDemo::switchViewCallback(Ref* sender) if (_cameraFirst == nullptr) { - _cameraFirst = Camera::createPerspective(30, (float)s.width/s.height, 10, 200); + _cameraFirst = Camera::createPerspective(30.0f, (float)s.width/s.height, 10.0f, 200.0f); _cameraFirst->setCameraFlag(CameraFlag::USER8); - _cameraFirst->setPosition3D(Vec3(-100,0,0)); - _cameraFirst->lookAt(Vec3(1000,0,0)); - _moveAction = MoveTo::create(4.f, Vec2(-_cameraFirst->getPositionX(), 0)); + _cameraFirst->setPosition3D(Vec3(-100.0f,0.0f,0.0f)); + _cameraFirst->lookAt(Vec3(1000.0f,0.0f,0.0f)); + _moveAction = MoveTo::create(4.f, Vec2(-_cameraFirst->getPositionX(), 0.0f)); _moveAction->retain(); auto seq = Sequence::create(_moveAction, CallFunc::create(CC_CALLBACK_0(CameraCullingDemo::reachEndCallBack, this)), nullptr); seq->setTag(100); @@ -860,7 +860,7 @@ void CameraCullingDemo::switchViewCallback(Ref* sender) { _cameraThird = Camera::createPerspective(60, (float)s.width/s.height, 1, 1000); _cameraThird->setCameraFlag(CameraFlag::USER8); - _cameraThird->setPosition3D(Vec3(0, 130, 130)); + _cameraThird->setPosition3D(Vec3(0.0f, 130.0f, 130.0f)); _cameraThird->lookAt(Vec3(0,0,0)); addChild(_cameraThird); } @@ -892,8 +892,8 @@ void CameraCullingDemo::addSpriteCallback(Ref* sender) for (int z = -_row; z < _row; z++) { auto sprite = Sprite3D::create("Sprite3DTest/orc.c3b"); - sprite->setPosition3D(Vec3(x * 30, 0, z * 30)); - sprite->setRotation3D(Vec3(0,180,0)); + sprite->setPosition3D(Vec3(x * 30.0f, 0.0f, z * 30.0f)); + sprite->setRotation3D(Vec3(0.0f,180.0f,0.0f)); _objects.push_back(sprite); _layer3D->addChild(sprite); } @@ -921,7 +921,7 @@ void CameraCullingDemo::delSpriteCallback(Ref* sender) for (int z = -_row; z < _row; z++) { auto sprite = Sprite3D::create("Sprite3DTest/orc.c3b"); - sprite->setPosition3D(Vec3(x * 30, 0, z * 30)); + sprite->setPosition3D(Vec3(x * 30.0f, 0.0f, z * 30.0f)); _objects.push_back(sprite); _layer3D->addChild(sprite); } @@ -1045,22 +1045,22 @@ void CameraArcBallDemo::onEnter() { _camera=Camera::createPerspective(60, (float)s.width/s.height, 1, 1000); _camera->setCameraFlag(CameraFlag::USER1); - _camera->setPosition3D(Vec3(0, 10, 50)); - _camera->lookAt(Vec3(0, 0, 0), Vec3(0, 1, 0)); + _camera->setPosition3D(Vec3(0.0f, 10.0f, 50.0f)); + _camera->lookAt(Vec3(0, 0, 0), Vec3(0.0f, 1.0f, 0.0f)); _camera->retain(); _layer3D->addChild(_camera); } _sprite3D1 = Sprite3D::create("Sprite3DTest/orc.c3b"); _sprite3D1->setScale(0.5); - _sprite3D1->setRotation3D(Vec3(0,180,0)); + _sprite3D1->setRotation3D(Vec3(0.0f,180.0f,0.0f)); _sprite3D1->setPosition3D(Vec3(0,0,0)); _layer3D->addChild(_sprite3D1); _sprite3D2 = Sprite3D::create("Sprite3DTest/boss.c3b"); _sprite3D2->setScale(0.6f); - _sprite3D2->setRotation3D(Vec3(-90,0,0)); - _sprite3D2->setPosition3D(Vec3(20,0,0)); + _sprite3D2->setRotation3D(Vec3(-90.0f,0.0f,0.0f)); + _sprite3D2->setPosition3D(Vec3(20.0f,0.0f,0.0f)); _layer3D->addChild(_sprite3D2); _drawGrid =DrawNode3D::create(); @@ -1293,19 +1293,19 @@ void FogTestDemo::onEnter() _layer3D->addChild(_sprite3D1); _sprite3D1->setPosition3D( Vec3( 0, 0,0 ) ); _sprite3D1->setScale(2.0f); - _sprite3D1->setRotation3D(Vec3(-90,180,0)); + _sprite3D1->setRotation3D(Vec3(-90.0f,180.0f,0.0f)); _layer3D->addChild(_sprite3D2); - _sprite3D2->setPosition3D( Vec3( 0, 0,-20 ) ); + _sprite3D2->setPosition3D( Vec3( 0.0f, 0.0f,-20.0f) ); _sprite3D2->setScale(2.0f); - _sprite3D2->setRotation3D(Vec3(-90,180,0)); + _sprite3D2->setRotation3D(Vec3(-90.0f,180.0f,0.0f)); if (_camera == nullptr) { _camera=Camera::createPerspective(60, (float)s.width/s.height, 1, 1000); _camera->setCameraFlag(CameraFlag::USER1); - _camera->setPosition3D(Vec3(0, 30, 40)); - _camera->lookAt(Vec3(0,0,0), Vec3(0, 1, 0)); + _camera->setPosition3D(Vec3(0.0f, 30.0f, 40.0f)); + _camera->lookAt(Vec3(0,0,0), Vec3(0.0f, 1.0f, 0.0f)); _layer3D->addChild(_camera); } @@ -1517,8 +1517,8 @@ void BackgroundColorBrushTest::onEnter() { // 1st Camera - auto camera = Camera::createPerspective(60, (float)s.width/s.height, 1, 1000); - camera->setPosition3D(Vec3(0, 0, 200)); + auto camera = Camera::createPerspective(60.0f, (float)s.width/s.height, 1.0f, 1000.0f); + camera->setPosition3D(Vec3(0.0f, 0.0f, 200.0f)); camera->lookAt(Vec3::ZERO); camera->setDepth(-2); camera->setCameraFlag(CameraFlag::USER1); @@ -1527,11 +1527,11 @@ void BackgroundColorBrushTest::onEnter() // 3D model auto model = Sprite3D::create("Sprite3DTest/boss1.obj"); model->setScale(4); - model->setPosition3D(Vec3(20, 0, 0)); + model->setPosition3D(Vec3(20.0f, 0.0f, 0.0f)); model->setTexture("Sprite3DTest/boss.png"); model->setCameraMask(static_cast(CameraFlag::USER1)); addChild(model); - model->runAction(RepeatForever::create(RotateBy::create(1.f, Vec3(10, 20, 30)))); + model->runAction(RepeatForever::create(RotateBy::create(1.f, Vec3(10.0f, 20.0f, 30.0f)))); } { @@ -1544,7 +1544,7 @@ void BackgroundColorBrushTest::onEnter() auto camera = Camera::createPerspective(60, (float)s.width/s.height, 1, 1000); auto colorBrush = CameraBackgroundBrush::createColorBrush(Color4F(.1f, .1f, 1.f, .5f), 1.f); camera->setBackgroundBrush(colorBrush); - camera->setPosition3D(Vec3(0, 0, 200)); + camera->setPosition3D(Vec3(0.0f, 0.0f, 200.0f)); camera->lookAt(Vec3::ZERO); camera->setDepth(-1); camera->setCameraFlag(CameraFlag::USER2); @@ -1565,10 +1565,10 @@ void BackgroundColorBrushTest::onEnter() // 3D model for 2nd camera auto model = Sprite3D::create("Sprite3DTest/boss1.obj"); model->setScale(4); - model->setPosition3D(Vec3(-20, 0, 0)); + model->setPosition3D(Vec3(-20.0f, 0.0f, 0.0f)); model->setTexture("Sprite3DTest/boss.png"); model->setCameraMask(static_cast(CameraFlag::USER2)); base->addChild(model); - model->runAction(RepeatForever::create(RotateBy::create(1.f, Vec3(10, 20, 30)))); + model->runAction(RepeatForever::create(RotateBy::create(1.f, Vec3(10.0f, 20.0f, 30.0f)))); } } diff --git a/tests/cpp-tests/Classes/ChipmunkTest/ChipmunkTest.cpp b/tests/cpp-tests/Classes/ChipmunkTest/ChipmunkTest.cpp index eb8206ba47..e7af66af9d 100644 --- a/tests/cpp-tests/Classes/ChipmunkTest/ChipmunkTest.cpp +++ b/tests/cpp-tests/Classes/ChipmunkTest/ChipmunkTest.cpp @@ -80,7 +80,7 @@ ChipmunkTest::ChipmunkTest() #endif addChild(parent, 0, kTagParentNode); - addNewSpriteAtPosition(cocos2d::Vec2(200,200)); + addNewSpriteAtPosition(cocos2d::Vec2(200.0f,200.0f)); // menu for debug layer MenuItemFont::setFontSize(18); @@ -142,7 +142,7 @@ void ChipmunkTest::initPhysics() cpHastySpaceSetThreads(_space, 0); #endif - cpSpaceSetGravity(_space, cpv(0, -100)); + cpSpaceSetGravity(_space, cpv(0.0f, -100.0f)); // // rogue shapes diff --git a/tests/cpp-tests/Classes/ClippingNodeTest/ClippingNodeTest.cpp b/tests/cpp-tests/Classes/ClippingNodeTest/ClippingNodeTest.cpp index cb2cf04daf..cea0741aa6 100644 --- a/tests/cpp-tests/Classes/ClippingNodeTest/ClippingNodeTest.cpp +++ b/tests/cpp-tests/Classes/ClippingNodeTest/ClippingNodeTest.cpp @@ -122,7 +122,7 @@ void BasicTest::setup() auto clipper = this->clipper(); clipper->setTag( kTagClipperNode ); - clipper->setAnchorPoint(Vec2(0.5, 0.5)); + clipper->setAnchorPoint(Vec2(0.5f, 0.5f)); clipper->setPosition(s.width / 2 - 50, s.height / 2 - 50); clipper->setStencil(stencil); this->addChild(clipper); @@ -321,15 +321,15 @@ void NestedTest::setup() auto clipper = ClippingNode::create(); clipper->setContentSize(Size(size, size)); - clipper->setAnchorPoint(Vec2(0.5, 0.5)); + clipper->setAnchorPoint(Vec2(0.5f, 0.5f)); clipper->setPosition(parent->getContentSize().width / 2, parent->getContentSize().height / 2); clipper->setAlphaThreshold(0.05f); - clipper->runAction(RepeatForever::create(RotateBy::create(i % 3 ? 1.33 : 1.66, i % 2 ? 90 : -90))); + clipper->runAction(RepeatForever::create(RotateBy::create(i % 3 ? 1.33f : 1.66f, i % 2 ? 90.0f : -90.0f))); parent->addChild(clipper); auto stencil = Sprite::create(s_pathGrossini); - stencil->setScale( 2.5 - (i * (2.5 / depth)) ); - stencil->setAnchorPoint( Vec2(0.5, 0.5) ); + stencil->setScale( 2.5f - (i * (2.5f / depth)) ); + stencil->setAnchorPoint( Vec2(0.5f, 0.5f) ); stencil->setPosition(clipper->getContentSize().width / 2, clipper->getContentSize().height / 2); stencil->setVisible(false); stencil->runAction(Sequence::createWithTwoActions(DelayTime::create(i), Show::create())); @@ -373,7 +373,7 @@ void HoleDemo::setup() transform = AffineTransformScale(transform, target->getScale(), target->getScale()); _outerClipper->setContentSize(SizeApplyAffineTransform(target->getContentSize(), transform)); - _outerClipper->setAnchorPoint( Vec2(0.5, 0.5) ); + _outerClipper->setAnchorPoint( Vec2(0.5f, 0.5f) ); _outerClipper->setPosition(Vec2(this->getContentSize()) * 0.5f); _outerClipper->runAction(RepeatForever::create(RotateBy::create(1, 45))); @@ -453,18 +453,18 @@ void ScrollViewDemo::setup() { auto clipper = ClippingNode::create(); clipper->setTag( kTagClipperNode ); - clipper->setContentSize( Size(200, 200) ); - clipper->setAnchorPoint( Vec2(0.5, 0.5) ); + clipper->setContentSize( Size(200.0f, 200.0f) ); + clipper->setAnchorPoint( Vec2(0.5f, 0.5f) ); clipper->setPosition(this->getContentSize().width / 2, this->getContentSize().height / 2); clipper->runAction(RepeatForever::create(RotateBy::create(1, 45))); this->addChild(clipper); auto stencil = DrawNode::create(); Vec2 rectangle[4]; - rectangle[0] = Vec2(0, 0); - rectangle[1] = Vec2(clipper->getContentSize().width, 0); + rectangle[0] = Vec2(0.0f, 0.0f); + rectangle[1] = Vec2(clipper->getContentSize().width, 0.0f); rectangle[2] = Vec2(clipper->getContentSize().width, clipper->getContentSize().height); - rectangle[3] = Vec2(0, clipper->getContentSize().height); + rectangle[3] = Vec2(0.0f, clipper->getContentSize().height); Color4F white(1, 1, 1, 1); stencil->drawPolygon(rectangle, 4, white, 1, white); @@ -472,7 +472,7 @@ void ScrollViewDemo::setup() auto content = Sprite::create(s_back2); content->setTag( kTagContentNode ); - content->setAnchorPoint( Vec2(0.5, 0.5) ); + content->setAnchorPoint( Vec2(0.5f, 0.5f) ); content->setPosition(clipper->getContentSize().width / 2, clipper->getContentSize().height / 2); clipper->addChild(content); @@ -601,9 +601,9 @@ void RawStencilBufferTest::initCommands() cmd.setBeforeCallback( CC_CALLBACK_0(RawStencilBufferTest::onBeforeDrawClip, this, i) ); Vec2 vertices[] = { Vec2::ZERO, - Vec2(stencilPoint.x, 0), + Vec2(stencilPoint.x, 0.0f), stencilPoint, - Vec2(0, stencilPoint.y) + Vec2(0.0f, stencilPoint.y) }; unsigned short indices[] = {0, 2, 1, 0, 3, 2}; cmd.createVertexBuffer(sizeof(Vec2), 4, backend::BufferUsage::STATIC); @@ -625,9 +625,9 @@ void RawStencilBufferTest::initCommands() cmd2.setBeforeCallback(CC_CALLBACK_0(RawStencilBufferTest::onBeforeDrawSprite, this, i)); Vec2 vertices2[] = { Vec2::ZERO, - Vec2(winPoint.x, 0), + Vec2(winPoint.x, 0.0f), winPoint, - Vec2(0, winPoint.y) + Vec2(0.0f, winPoint.y) }; cmd2.createVertexBuffer(sizeof(Vec2), 4, backend::BufferUsage::STATIC); cmd2.updateVertexBuffer(vertices2, sizeof(vertices2)); @@ -899,7 +899,7 @@ void ClippingToRenderTextureTest::expectedBehaviour() stencil->drawPolygon(triangle, 3, green, 0, green); auto clipper = ClippingNode::create(); - clipper->setAnchorPoint(Point(0.5, 0.5)); + clipper->setAnchorPoint(Point(0.5f, 0.5f)); clipper->setPosition( Point(visibleSize.width/2, visibleSize.height/2) ); clipper->setStencil(stencil); clipper->setInverted(true); @@ -945,7 +945,7 @@ void ClippingToRenderTextureTest::reproduceBug() stencil->drawPolygon(triangle, 3, green, 0, green); auto clipper = ClippingNode::create(); - clipper->setAnchorPoint(Point(0.5, 0.5)); + clipper->setAnchorPoint(Point(0.5f, 0.5f)); clipper->setPosition( Point(visibleSize.width/2, visibleSize.height/2) ); clipper->setStencil(stencil); clipper->setInverted(true); @@ -986,13 +986,13 @@ std::string ClippingRectangleNodeTest::subtitle() const void ClippingRectangleNodeTest::setup() { auto clipper = ClippingRectangleNode::create(); - clipper->setClippingRegion(Rect(this->getContentSize().width / 2 - 100, this->getContentSize().height / 2 - 100, 200, 200)); + clipper->setClippingRegion(Rect(this->getContentSize().width / 2 - 100, this->getContentSize().height / 2 - 100, 200.0f, 200.0f)); clipper->setTag( kTagClipperNode ); this->addChild(clipper); auto content = Sprite::create(s_back2); content->setTag( kTagContentNode ); - content->setAnchorPoint( Vec2(0.5, 0.5) ); + content->setAnchorPoint( Vec2(0.5f, 0.5f) ); content->setPosition(this->getContentSize().width / 2, this->getContentSize().height / 2); clipper->addChild(content); } diff --git a/tests/cpp-tests/Classes/DownloaderTest/DownloaderTest.cpp b/tests/cpp-tests/Classes/DownloaderTest/DownloaderTest.cpp index 4181834e23..2b94f72f47 100644 --- a/tests/cpp-tests/Classes/DownloaderTest/DownloaderTest.cpp +++ b/tests/cpp-tests/Classes/DownloaderTest/DownloaderTest.cpp @@ -83,7 +83,7 @@ struct DownloaderTest : public TestCase // add a title on the top auto title = Label::createWithTTF(name,"fonts/arial.ttf",16); title->setTag(TAG_TITLE); - title->setAnchorPoint(Vec2(0.5, 1)); + title->setAnchorPoint(Vec2(0.5f, 1.0f)); title->setPosition(viewSize.width / 2, viewSize.height - margin); bg->addChild(title, 10); @@ -92,7 +92,7 @@ struct DownloaderTest : public TestCase "cocosui/animationbuttonpressed.png"); btn->setTag(TAG_BUTTON); btn->setTitleText("Download"); - btn->setAnchorPoint(Vec2(0.5, 0)); + btn->setAnchorPoint(Vec2(0.5f, 0.0f)); btn->setPosition(Vec2(viewSize.width / 2, margin)); btn->addClickEventListener(callback); bg->addChild(btn, 10); @@ -101,7 +101,7 @@ struct DownloaderTest : public TestCase auto bar = ui::LoadingBar::create("ccs-res/cocosui/sliderProgress.png"); bar->setTag(TAG_PROGRESS_BAR); bar->ignoreContentAdaptWithSize(false); - bar->setAnchorPoint(Vec2(0.5, 0)); + bar->setAnchorPoint(Vec2(0.5f, 0.0f)); bar->setContentSize(Size(viewSize.width - margin * 2, btn->getContentSize().height)); bar->setPosition(btn->getPosition()); bar->setVisible(false); @@ -110,9 +110,9 @@ struct DownloaderTest : public TestCase // add a status label auto label = Label::createWithTTF("","fonts/arial.ttf",14); label->setTag(TAG_STATUS); - label->setAnchorPoint(Vec2(0.5, 0.5)); + label->setAnchorPoint(Vec2(0.5f, 0.5f)); label->setPosition(Vec2(viewSize.width / 2, viewSize.height / 2)); - label->setContentSize(Size(viewSize.width, 0)); + label->setContentSize(Size(viewSize.width, 0.0f)); label->setAlignment(TextHAlignment::CENTER, TextVAlignment::CENTER); label->setDimensions(viewSize.width, viewSize.height); bg->addChild(label, 20); @@ -167,7 +167,7 @@ struct DownloaderTest : public TestCase this->downloader->createDownloadDataTask(sURLList[1], sNameList[1]); }); topLeftView->setName(sNameList[1]); - topLeftView->setAnchorPoint(Vec2(1, 0)); + topLeftView->setAnchorPoint(Vec2(1.0f, 0.0f)); topLeftView->setPosition(VisibleRect::center()); this->addChild(topLeftView); diff --git a/tests/cpp-tests/Classes/DrawPrimitivesTest/DrawPrimitivesTest.cpp b/tests/cpp-tests/Classes/DrawPrimitivesTest/DrawPrimitivesTest.cpp index 543f2c00e2..1c94ff53ab 100644 --- a/tests/cpp-tests/Classes/DrawPrimitivesTest/DrawPrimitivesTest.cpp +++ b/tests/cpp-tests/Classes/DrawPrimitivesTest/DrawPrimitivesTest.cpp @@ -66,54 +66,54 @@ DrawNodeTest::DrawNodeTest() draw->drawRect(Vec2(15,30), Vec2(30,15), Vec2(15,0), Vec2(0,15), Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1)); // draw a circle - draw->drawCircle(VisibleRect::center() + Vec2(140,0), 100, CC_DEGREES_TO_RADIANS(90), 50, true, 1.0f, 2.0f, Color4F(1.0, 0.0, 0.0, 0.5)); + draw->drawCircle(VisibleRect::center() + Vec2(140,0), 100, CC_DEGREES_TO_RADIANS(90), 50, true, 1.0f, 2.0f, Color4F(1.0f, 0.0f, 0.0f, 0.5f)); - draw->drawCircle(VisibleRect::center() - Vec2(140,0), 50, CC_DEGREES_TO_RADIANS(90), 30, false, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1)); + draw->drawCircle(VisibleRect::center() - Vec2(140,0), 50, CC_DEGREES_TO_RADIANS(90), 30, false, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1.0f)); // Draw some beziers - draw->drawQuadBezier(Vec2(s.width - 150, s.height - 150), Vec2(s.width - 70, s.height - 10), Vec2(s.width - 10, s.height - 10), 10, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5)); + draw->drawQuadBezier(Vec2(s.width - 150, s.height - 150), Vec2(s.width - 70, s.height - 10), Vec2(s.width - 10, s.height - 10), 10, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5f)); - draw->drawQuadBezier(Vec2(0, s.height), Vec2(s.width/2, s.height/2), Vec2(s.width, s.height), 50, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5)); + draw->drawQuadBezier(Vec2(0.0f, s.height), Vec2(s.width/2, s.height/2), Vec2(s.width, s.height), 50, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5f)); - draw->drawCubicBezier(VisibleRect::center(), Vec2(VisibleRect::center().x+30,VisibleRect::center().y+50), Vec2(VisibleRect::center().x+60,VisibleRect::center().y-50),VisibleRect::right(),100, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5)); + draw->drawCubicBezier(VisibleRect::center(), Vec2(VisibleRect::center().x+30,VisibleRect::center().y+50), Vec2(VisibleRect::center().x+60,VisibleRect::center().y-50),VisibleRect::right(),100, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5f)); - draw->drawCubicBezier(Vec2(s.width - 250, 40), Vec2(s.width - 70, 100), Vec2(s.width - 30, 250), Vec2(s.width - 10, s.height - 50), 10, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5)); + draw->drawCubicBezier(Vec2(s.width - 250, 40.0f), Vec2(s.width - 70, 100.0f), Vec2(s.width - 30, 250.0f), Vec2(s.width - 10, s.height - 50), 10, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5f)); auto array = PointArray::create(20); - array->addControlPoint(Vec2(0,0)); - array->addControlPoint(Vec2(80,80)); - array->addControlPoint(Vec2(s.width-80,80)); + array->addControlPoint(Vec2(0.0f,0.0f)); + array->addControlPoint(Vec2(80.0f,80.0f)); + array->addControlPoint(Vec2(s.width-80,80.0f)); array->addControlPoint(Vec2(s.width-80,s.height-80)); - array->addControlPoint(Vec2(80,s.height-80)); - array->addControlPoint(Vec2(80,80)); + array->addControlPoint(Vec2(80.0f,s.height-80)); + array->addControlPoint(Vec2(80.0f,80.0f)); array->addControlPoint(Vec2(s.width/2, s.height/2)); - draw->drawCardinalSpline(array, 0.5, 50, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5)); + draw->drawCardinalSpline(array, 0.5f, 50, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5f)); auto array2 = PointArray::create(20); - array2->addControlPoint(Vec2(s.width / 2, 30)); - array2->addControlPoint(Vec2(s.width -80, 30)); + array2->addControlPoint(Vec2(s.width / 2, 30.0f)); + array2->addControlPoint(Vec2(s.width -80, 30.0f)); array2->addControlPoint(Vec2(s.width - 80, s.height - 80)); array2->addControlPoint(Vec2(s.width / 2, s.height - 80)); - array2->addControlPoint(Vec2(s.width / 2, 30)); - draw->drawCatmullRom(array2, 50, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5)); + array2->addControlPoint(Vec2(s.width / 2, 30.0f)); + draw->drawCatmullRom(array2, 50, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5f)); // open random color poly - Vec2 vertices[] = { Vec2(0,0), Vec2(50,50), Vec2(100,50), Vec2(100,100), Vec2(50,100) }; - draw->drawPoly( vertices, 5, false, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1)); + Vec2 vertices[] = { Vec2(0.0f,0.0f), Vec2(50.0f,50.0f), Vec2(100.0f,50.0f), Vec2(100.0f,100.0f), Vec2(50.0f,100.0f) }; + draw->drawPoly( vertices, 5, false, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1.0f)); // closed random color poly - Vec2 vertices2[] = { Vec2(30,130), Vec2(30,230), Vec2(50,200) }; - draw->drawPoly( vertices2, 3, true, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1)); + Vec2 vertices2[] = { Vec2(30.0f,130.0f), Vec2(30.0f,230.0f), Vec2(50.0f,200.0f) }; + draw->drawPoly( vertices2, 3, true, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1.0f)); // Draw 10 circles for( int i=0; i < 10; i++) { - draw->drawDot(Vec2(s.width/2, s.height/2), 10*(10-i), Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1)); + draw->drawDot(Vec2(s.width/2, s.height/2), 10*(10-i), Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1.0f)); } // Draw polygons - Vec2 points[] = { Vec2(s.height/4,0), Vec2(s.width,s.height/5), Vec2(s.width/3*2,s.height) }; - draw->drawPolygon(points, sizeof(points)/sizeof(points[0]), Color4F(1,0,0,0.5), 4, Color4F(0,0,1,0.5)); + Vec2 points[] = { Vec2(s.height/4,0.0f), Vec2(s.width,s.height/5), Vec2(s.width/3*2,s.height) }; + draw->drawPolygon(points, sizeof(points)/sizeof(points[0]), Color4F(1.0f,0.0f,0.0f,0.5f), 4, Color4F(0.0f,0.0f,1.0f,0.5f)); // star poly (triggers buggs) { @@ -127,7 +127,7 @@ DrawNodeTest::DrawNodeTest() // {o -h, o+w}, {o,o}, // left spike }; - draw->drawPolygon(star, sizeof(star)/sizeof(star[0]), Color4F(1,0,0,0.5), 1, Color4F(0,0,1,1)); + draw->drawPolygon(star, sizeof(star)/sizeof(star[0]), Color4F(1.0f,0.0f,0.0f,0.5f), 1, Color4F(0.0f,0.0f,1.0f,1.0f)); } // star poly (doesn't trigger bug... order is important un tesselation is supported. @@ -142,36 +142,36 @@ DrawNodeTest::DrawNodeTest() Vec2(o -h, o+w), // left spike }; - draw->drawPolygon(star, sizeof(star)/sizeof(star[0]), Color4F(1,0,0,0.5), 1, Color4F(0,0,1,1)); + draw->drawPolygon(star, sizeof(star)/sizeof(star[0]), Color4F(1.0f,0.0f,0.0f,0.5f), 1, Color4F(0.0f,0.0f,1.0f,1.0f)); } //draw a solid polygon - Vec2 vertices3[] = {Vec2(60,160), Vec2(70,190), Vec2(100,190), Vec2(90,160)}; - draw->drawSolidPoly( vertices3, 4, Color4F(1,1,0,1) ); + Vec2 vertices3[] = {Vec2(60.0f,160.0f), Vec2(70.0f,190.0f), Vec2(100.0f,190.0f), Vec2(90.0f,160.0f)}; + draw->drawSolidPoly( vertices3, 4, Color4F(1.0f,1.0f,0.0f,1.0f) ); //draw a solid rectangle - draw->drawSolidRect(Vec2(10,10), Vec2(20,20), Color4F(1,1,0,1)); + draw->drawSolidRect(Vec2(10.0f,10.0f), Vec2(20.0f,20.0f), Color4F(1.0f,1.0f,0.0f,1.0f)); //draw a solid circle - draw->drawSolidCircle( VisibleRect::center() + Vec2(140,0), 40, CC_DEGREES_TO_RADIANS(90), 50, 2.0f, 2.0f, Color4F(0.0, 1.0, 0.0, 1.0)); + draw->drawSolidCircle( VisibleRect::center() + Vec2(140.0f,0.0f), 40, CC_DEGREES_TO_RADIANS(90), 50, 2.0f, 2.0f, Color4F(0.0f, 1.0f, 0.0f, 1.0f)); // Draw segment - draw->drawSegment(Vec2(20,s.height), Vec2(20,s.height/2), 10, Color4F(0, 1, 0, 1)); + draw->drawSegment(Vec2(20.0f,s.height), Vec2(20.0f,s.height/2), 10, Color4F(0.0f, 1.0f, 0.0f, 1.0f)); - draw->drawSegment(Vec2(10,s.height/2), Vec2(s.width/2, s.height/2), 40, Color4F(1, 0, 1, 0.5)); + draw->drawSegment(Vec2(10.0f,s.height/2), Vec2(s.width/2, s.height/2), 40, Color4F(1.0f, 0.0f, 1.0f, 0.5f)); // Draw triangle - draw->drawTriangle(Vec2(10, 10), Vec2(70, 30), Vec2(100, 140), Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5)); + draw->drawTriangle(Vec2(10.0f, 10.0f), Vec2(70.0f, 30.0f), Vec2(100.0f, 140.0f), Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5f)); for (int i = 0; i < 100; i++) { - draw->drawPoint(Vec2(i*7, 5), (float)i/5+1, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1)); + draw->drawPoint(Vec2(i*7.0f, 5.0f), (float)i/5+1, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1.0f)); } auto draw1 = DrawNode::create(); this->addChild(draw1, 10); draw1->setLineWidth(4); - draw1->drawLine(Vec2(0, s.height), Vec2(s.width, s.height - 20), Color4F::YELLOW); - draw1->drawLine(Vec2(0, 0), Vec2(s.width, s.height - 20), Color4F::YELLOW); + draw1->drawLine(Vec2(0.0f, s.height), Vec2(s.width, s.height - 20), Color4F::YELLOW); + draw1->drawLine(Vec2(0.0f, 0.0f), Vec2(s.width, s.height - 20), Color4F::YELLOW); draw->runAction(RepeatForever::create(Sequence::create(FadeIn::create(1.2),FadeOut::create(1.2), NULL))); draw1->runAction(RepeatForever::create(Sequence::create(FadeIn::create(1.2),FadeOut::create(1.2), NULL))); @@ -197,9 +197,9 @@ Issue11942Test::Issue11942Test() // draw a circle draw->setLineWidth(1); - draw->drawCircle(VisibleRect::center() - Vec2(140,0), 50, CC_DEGREES_TO_RADIANS(90), 30, false, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1)); + draw->drawCircle(VisibleRect::center() - Vec2(140.0f,0.0f), 50, CC_DEGREES_TO_RADIANS(90), 30, false, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1)); draw->setLineWidth(10); - draw->drawCircle(VisibleRect::center() + Vec2(140,0), 50, CC_DEGREES_TO_RADIANS(90), 30, false, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1)); + draw->drawCircle(VisibleRect::center() + Vec2(140.0f,0.0f), 50, CC_DEGREES_TO_RADIANS(90), 30, false, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1)); } string Issue11942Test::title() const diff --git a/tests/cpp-tests/Classes/EffectsAdvancedTest/EffectsAdvancedTest.cpp b/tests/cpp-tests/Classes/EffectsAdvancedTest/EffectsAdvancedTest.cpp index c82084558b..7a9d62b358 100644 --- a/tests/cpp-tests/Classes/EffectsAdvancedTest/EffectsAdvancedTest.cpp +++ b/tests/cpp-tests/Classes/EffectsAdvancedTest/EffectsAdvancedTest.cpp @@ -312,7 +312,7 @@ void EffectAdvanceBaseTest::onEnter() TestCase::onEnter(); _bgNode = NodeGrid::create(); - _bgNode->setAnchorPoint(Vec2(0.5,0.5)); + _bgNode->setAnchorPoint(Vec2(0.5f,0.5f)); addChild(_bgNode); //_bgNode->setPosition( VisibleRect::center() ); auto bg = Sprite::create("Images/background3.png"); @@ -322,7 +322,7 @@ void EffectAdvanceBaseTest::onEnter() _bgNode->addChild(bg); _target1 = NodeGrid::create(); - _target1->setAnchorPoint(Vec2(0.5,0.5)); + _target1->setAnchorPoint(Vec2(0.5f,0.5f)); auto grossini = Sprite::create("Images/grossinis_sister2.png"); _target1->addChild(grossini); _bgNode->addChild(_target1); @@ -333,7 +333,7 @@ void EffectAdvanceBaseTest::onEnter() _target2 = NodeGrid::create(); - _target2->setAnchorPoint(Vec2(0.5,0.5)); + _target2->setAnchorPoint(Vec2(0.5f,0.5f)); auto tamara = Sprite::create("Images/grossinis_sister1.png"); _target2->addChild(tamara); _bgNode->addChild(_target2); diff --git a/tests/cpp-tests/Classes/ExtensionsTest/TableViewTest/TableViewTestScene.cpp b/tests/cpp-tests/Classes/ExtensionsTest/TableViewTest/TableViewTestScene.cpp index 164413d1a0..144595032e 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/TableViewTest/TableViewTestScene.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/TableViewTest/TableViewTestScene.cpp @@ -44,9 +44,9 @@ bool TableViewTest::init() Size winSize = Director::getInstance()->getWinSize(); - TableView* tableView = TableView::create(this, Size(250, 60)); + TableView* tableView = TableView::create(this, Size(250.0f, 60.0f)); tableView->setDirection(ScrollView::Direction::HORIZONTAL); - tableView->setPosition(Vec2(20,winSize.height/2-30)); + tableView->setPosition(Vec2(20.0f,winSize.height/2-30)); tableView->setDelegate(this); this->addChild(tableView); tableView->reloadData(); @@ -58,7 +58,7 @@ bool TableViewTest::init() CCAssert(nullptr == tableView->getChildByName("testNode"), "The added child has been removed!"); - tableView = TableView::create(this, Size(60, 250)); + tableView = TableView::create(this, Size(60.0f, 250.0f)); tableView->setDirection(ScrollView::Direction::VERTICAL); tableView->setPosition(Vec2(winSize.width-150,winSize.height/2-120)); tableView->setDelegate(this); diff --git a/tests/cpp-tests/Classes/IntervalTest/IntervalTest.cpp b/tests/cpp-tests/Classes/IntervalTest/IntervalTest.cpp index 59170abbff..a998e7edeb 100644 --- a/tests/cpp-tests/Classes/IntervalTest/IntervalTest.cpp +++ b/tests/cpp-tests/Classes/IntervalTest/IntervalTest.cpp @@ -108,7 +108,7 @@ IntervalTest::IntervalTest() auto sprite = Sprite::create(s_pathGrossini); sprite->setPosition(VisibleRect::left().x + 40, VisibleRect::bottom().y + 50); - auto jump = JumpBy::create(3, Vec2(s.width-80,0), 50, 4); + auto jump = JumpBy::create(3, Vec2(s.width-80,0.0f), 50, 4); addChild(sprite); sprite->runAction( RepeatForever::create(Sequence::create(jump, jump->reverse(), nullptr) )); diff --git a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp index 9d3bdaa8b8..0d21487228 100644 --- a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp +++ b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp @@ -213,8 +213,8 @@ LabelFNTSpriteActions::LabelFNTSpriteActions() auto s = Director::getInstance()->getWinSize(); auto drawNode = DrawNode::create(); - drawNode->drawLine( Vec2(0, s.height/2), Vec2(s.width, s.height/2), Color4F(1.0, 1.0, 1.0, 1.0) ); - drawNode->drawLine( Vec2(s.width/2, 0), Vec2(s.width/2, s.height), Color4F(1.0, 1.0, 1.0, 1.0) ); + drawNode->drawLine( Vec2(0.0f, s.height/2), Vec2(s.width, s.height/2), Color4F(1.0f, 1.0f, 1.0f, 1.0f) ); + drawNode->drawLine( Vec2(s.width/2, 0.0f), Vec2(s.width/2, s.height), Color4F(1.0f, 1.0f, 1.0f, 1.0f) ); addChild(drawNode, -1); // Upper Label @@ -254,7 +254,7 @@ LabelFNTSpriteActions::LabelFNTSpriteActions() // Bottom Label auto label2 = Label::createWithBMFont("fonts/bitmapFontTest.fnt", "00.0"); addChild(label2, 0, kTagBitmapAtlas2); - label2->setPosition( Vec2(s.width/2.0f, 80) ); + label2->setPosition( Vec2(s.width/2.0f, 80.0f) ); auto lastChar = (Sprite*) label2->getLetter(3); lastChar->runAction( rot_4ever->clone() ); @@ -472,7 +472,7 @@ LabelFNTandTTFEmpty::LabelFNTandTTFEmpty() auto label3 = Label::createWithCharMap("fonts/tuffy_bold_italic-charmap.plist"); addChild(label3, 0, kTagBitmapAtlas3); - label3->setPosition(Vec2(s.width/2, 100)); + label3->setPosition(Vec2(s.width/2, 100.0f)); schedule(CC_CALLBACK_1(LabelFNTandTTFEmpty::updateStrings, this), 1.0f, "update_strings_key"); @@ -919,7 +919,7 @@ LabelFNTBounds::LabelFNTBounds() Vec2(labelSize.width + origin.width, labelSize.height + origin.height), Vec2(origin.width, labelSize.height + origin.height) }; - drawNode->drawPoly(vertices, 4, true, Color4F(1.0, 1.0, 1.0, 1.0)); + drawNode->drawPoly(vertices, 4, true, Color4F(1.0f, 1.0f, 1.0f, 1.0f)); addChild(drawNode); } @@ -941,7 +941,7 @@ LabelTTFLongLineWrapping::LabelTTFLongLineWrapping() TTFConfig ttfConfig("fonts/arial.ttf", 14); auto label1 = Label::createWithTTF(ttfConfig, LongSentencesExample, TextHAlignment::CENTER,size.width); label1->setPosition( Vec2(size.width/2, size.height/2) ); - label1->setAnchorPoint(Vec2(0.5, 1.0)); + label1->setAnchorPoint(Vec2(0.5f, 1.0f)); addChild(label1); } @@ -1056,19 +1056,19 @@ LabelTTFCJKWrappingTest::LabelTTFCJKWrappingTest() drawNode->setAnchorPoint(Vec2(0, 0)); this->addChild(drawNode); drawNode->drawSegment( - Vec2(size.width * 0.1, size.height * 0.8), - Vec2(size.width * 0.1, 0), 1, Color4F(1, 0, 0, 1)); + Vec2(size.width * 0.1f, size.height * 0.8f), + Vec2(size.width * 0.1, 0.0f), 1, Color4F(1.0f, 0.0f, 0.0f, 1.0f)); drawNode->drawSegment( - Vec2(size.width * 0.85, size.height * 0.8), - Vec2(size.width * 0.85, 0), 1, Color4F(1, 0, 0, 1)); + Vec2(size.width * 0.85f, size.height * 0.8f), + Vec2(size.width * 0.85f, 0.0f), 1, Color4F(1.0f, 0.0f, 0.0f, 1.0f)); TTFConfig ttfConfig("fonts/HKYuanMini.ttf", 25, GlyphCollection::DYNAMIC); auto label1 = Label::createWithTTF(ttfConfig, - "你好,Cocos2d-x v3的New Label.", TextHAlignment::LEFT, size.width * 0.75); + "你好,Cocos2d-x v3的New Label.", TextHAlignment::LEFT, size.width * 0.75f); if(label1) { label1->setTextColor(Color4B(128, 255, 255, 255)); - label1->setPosition(Vec2(size.width * 0.1, size.height * 0.6)); - label1->setAnchorPoint(Vec2(0, 0.5)); + label1->setPosition(Vec2(size.width * 0.1f, size.height * 0.6f)); + label1->setAnchorPoint(Vec2(0.0f, 0.5f)); this->addChild(label1); // Demo for unloadFontAtlasTTF function, after it been called, all UI widget // use the special font must reset font, because the old one is invalid. @@ -1077,20 +1077,20 @@ LabelTTFCJKWrappingTest::LabelTTFCJKWrappingTest() } auto label2 = Label::createWithTTF(ttfConfig, - "早上好,Cocos2d-x v3的New Label.", TextHAlignment::LEFT, size.width * 0.75); + "早上好,Cocos2d-x v3的New Label.", TextHAlignment::LEFT, size.width * 0.75f); if(label2) { label2->setTextColor(Color4B(255, 128, 255, 255)); - label2->setPosition(Vec2(size.width * 0.1, size.height * 0.4)); - label2->setAnchorPoint(Vec2(0, 0.5)); + label2->setPosition(Vec2(size.width * 0.1f, size.height * 0.4f)); + label2->setAnchorPoint(Vec2(0.0f, 0.5f)); this->addChild(label2); } auto label3 = Label::createWithTTF(ttfConfig, - "美好的一天啊美好的一天啊美好的一天啊", TextHAlignment::LEFT, size.width * 0.75); + "美好的一天啊美好的一天啊美好的一天啊", TextHAlignment::LEFT, size.width * 0.75f); if(label3) { label3->setTextColor(Color4B(255, 255, 128, 255)); - label3->setPosition(Vec2(size.width * 0.1, size.height * 0.2)); - label3->setAnchorPoint(Vec2(0, 0.5)); + label3->setPosition(Vec2(size.width * 0.1f, size.height * 0.2f)); + label3->setAnchorPoint(Vec2(0.0f, 0.5f)); this->addChild(label3); } } @@ -1232,9 +1232,9 @@ LabelTTFDistanceField::LabelTTFDistanceField() Vec2 vertices[4] = { Vec2::ZERO, - Vec2(labelContentSize.width, 0), + Vec2(labelContentSize.width, 0.0f), Vec2(labelContentSize.width, labelContentSize.height), - Vec2(0, labelContentSize.height) + Vec2(0.0f, labelContentSize.height) }; borderDraw->drawPoly(vertices, 4, true, Color4F::RED); @@ -1252,9 +1252,9 @@ LabelTTFDistanceField::LabelTTFDistanceField() Vec2 vertices2[4] = { Vec2::ZERO, - Vec2(labelContentSize2.width, 0), + Vec2(labelContentSize2.width, 0.0f), Vec2(labelContentSize2.width, labelContentSize2.height), - Vec2(0, labelContentSize2.height) + Vec2(0.0f, labelContentSize2.height) }; borderDraw2->drawPoly(vertices2, 4, true, Color4F::GREEN); } @@ -1347,7 +1347,7 @@ void LabelShadowTest::onEnter() slider2->loadBarTexture("cocosui/sliderTrack.png"); slider2->loadSlidBallTextures("cocosui/sliderThumb.png", "cocosui/sliderThumb.png", ""); slider2->loadProgressBarTexture("cocosui/sliderProgress.png"); - slider2->setPosition(Vec2(size.width * 0.15f, size.height / 2.0)); + slider2->setPosition(Vec2(size.width * 0.15f, size.height / 2.0f)); slider2->setRotation(90); slider2->setPercent(52); slider2->addEventListener(CC_CALLBACK_2(LabelShadowTest::sliderEvent, this)); @@ -1380,7 +1380,7 @@ void LabelShadowTest::onEnter() addChild(shadowLabelGrow); shadowLabelBMFont = Label::createWithBMFont("fonts/bitmapFontTest.fnt", "BMFont:Shadow"); - shadowLabelBMFont->setPosition( Vec2(size.width/2, horizontalSliderY + step * (0.5f + 0))); + shadowLabelBMFont->setPosition( Vec2(size.width/2, horizontalSliderY + step * 0.5f)); shadowLabelBMFont->setColor( Color3B::RED ); shadowLabelBMFont->enableShadow(Color4B::GREEN); addChild(shadowLabelBMFont); @@ -1563,7 +1563,7 @@ LabelTTFOldNew::LabelTTFOldNew() Vec2(labelSize.width + origin.width, labelSize.height + origin.height), Vec2(origin.width, labelSize.height + origin.height) }; - drawNode->drawPoly(vertices, 4, true, Color4F(1.0, 0.0, 0.0, 1.0)); + drawNode->drawPoly(vertices, 4, true, Color4F(1.0f, 0.0f, 0.0f, 1.0f)); labelSize = label2->getContentSize(); origin = Director::getInstance()->getWinSize(); @@ -1578,7 +1578,7 @@ LabelTTFOldNew::LabelTTFOldNew() Vec2(labelSize.width + origin.width, labelSize.height + origin.height), Vec2(origin.width, labelSize.height + origin.height) }; - drawNode->drawPoly(vertices2, 4, true, Color4F(1.0, 1.0, 1.0, 1.0)); + drawNode->drawPoly(vertices2, 4, true, Color4F(1.0f, 1.0f, 1.0f, 1.0f)); addChild(drawNode); } @@ -1636,7 +1636,7 @@ LabelAlignmentTest::LabelAlignmentTest() MenuItemFont::create("Right", CC_CALLBACK_1(LabelAlignmentTest::setAlignmentRight, this)), nullptr); menu->alignItemsVerticallyWithPadding(4); - menu->setPosition(Vec2(50, s.height / 2 - 20)); + menu->setPosition(Vec2(50.0f, s.height / 2 - 20)); this->addChild(menu); menu = Menu::create( @@ -1894,7 +1894,7 @@ std::string LabelIssue9255Test::subtitle() const LabelSmallDimensionsTest::LabelSmallDimensionsTest() { - auto label = Label::createWithSystemFont("Hello World!", "fonts/arial.ttf", 24, Size(30,100)); + auto label = Label::createWithSystemFont("Hello World!", "fonts/arial.ttf", 24, Size(30.0f,100.0f)); label->setPosition(VisibleRect::center()); addChild(label); } @@ -2259,7 +2259,7 @@ void LabelLayoutBaseTest::initFontSizeChange(const cocos2d::Size& size) stepper->setScale(0.5); fontSizeLabel->setPosition(stepper->getPosition() - - Vec2(stepper->getContentSize().width/2 + fontSizeLabel->getContentSize().width/2,0)); + Vec2(stepper->getContentSize().width/2 + fontSizeLabel->getContentSize().width/2,0.0f)); this->addChild(fontSizeLabel); } @@ -2338,7 +2338,7 @@ void LabelLayoutBaseTest::initAlignmentOption(const cocos2d::Size& size) MenuItemFont::create("Right", CC_CALLBACK_1(LabelLayoutBaseTest::setAlignmentRight, this)), nullptr); menu->alignItemsVerticallyWithPadding(4); - menu->setPosition(Vec2(50, size.height / 2 - 20)); + menu->setPosition(Vec2(50.0f, size.height / 2 - 20)); this->addChild(menu); menu = Menu::create( @@ -2369,7 +2369,7 @@ void LabelLayoutBaseTest::initSliders(const cocos2d::Size& size) slider2->loadBarTexture("cocosui/sliderTrack.png"); slider2->loadSlidBallTextures("cocosui/sliderThumb.png", "cocosui/sliderThumb.png", ""); slider2->loadProgressBarTexture("cocosui/sliderProgress.png"); - slider2->setPosition(Vec2(size.width * 0.2f, size.height / 2.0)); + slider2->setPosition(Vec2(size.width * 0.2f, size.height / 2.0f)); slider2->setRotation(90); slider2->setPercent(52); addChild(slider2); @@ -2495,10 +2495,10 @@ void LabelLayoutBaseTest::updateDrawNodeSize(const cocos2d::Size &drawNodeSize) Vec2(origin.width, drawNodeSize.height + origin.height) }; _drawNode->clear(); - _drawNode->drawLine(vertices[0], vertices[1], Color4F(1.0, 1.0, 1.0, 1.0)); - _drawNode->drawLine(vertices[0], vertices[3], Color4F(1.0, 1.0, 1.0, 1.0)); - _drawNode->drawLine(vertices[2], vertices[3], Color4F(1.0, 1.0, 1.0, 1.0)); - _drawNode->drawLine(vertices[1], vertices[2], Color4F(1.0, 1.0, 1.0, 1.0)); + _drawNode->drawLine(vertices[0], vertices[1], Color4F(1.0f, 1.0f, 1.0f, 1.0f)); + _drawNode->drawLine(vertices[0], vertices[3], Color4F(1.0f, 1.0f, 1.0f, 1.0f)); + _drawNode->drawLine(vertices[2], vertices[3], Color4F(1.0f, 1.0f, 1.0f, 1.0f)); + _drawNode->drawLine(vertices[1], vertices[2], Color4F(1.0f, 1.0f, 1.0f, 1.0f)); } @@ -2756,7 +2756,7 @@ void LabelToggleTypeTest::initToggleCheckboxes() this->addChild(radioButton); auto label = Label::createWithSystemFont(labelTypes.at(i), "Arial", 20); - label->setPosition(radioButton->getPosition() + Vec2(50,0)); + label->setPosition(radioButton->getPosition() + Vec2(50.0f,0.0f)); this->addChild(label); } } @@ -2901,7 +2901,7 @@ void LabelSystemFontTest::initToggleCheckboxes() this->addChild(radioButton); auto label = Label::createWithSystemFont(labelTypes.at(i), "Arial", 20); - label->setPosition(radioButton->getPosition() + Vec2(50,0)); + label->setPosition(radioButton->getPosition() + Vec2(50.0f,0.0f)); this->addChild(label); } } @@ -3014,7 +3014,7 @@ LabelRichText::LabelRichText() if (richText2) { richText2->ignoreContentAdaptWithSize(false); - richText2->setContentSize(Size(400, 400)); + richText2->setContentSize(Size(400.0f, 400.0f)); richText2->setPosition(center); addChild(richText2); @@ -3300,7 +3300,7 @@ LabelLocalizationTest::LabelLocalizationTest() this->addChild(radioButton); auto label = Label::createWithSystemFont(labelTypes.at(i), "Arial", 20); - label->setPosition(radioButton->getPosition() + Vec2(50, 0)); + label->setPosition(radioButton->getPosition() + Vec2(50.0f, 0.0f)); this->addChild(label); } @@ -3309,18 +3309,18 @@ LabelLocalizationTest::LabelLocalizationTest() _label1->setPosition(Vec2(winSize.width / 2, winSize.height * 1 / 3)); Label * label = Label::createWithSystemFont("From json data :", "Arial", 24); - label->setAnchorPoint(Vec2(0, 0.5)); + label->setAnchorPoint(Vec2(0.0f, 0.5f)); addChild(label, 0); - label->setPosition(Vec2(20, winSize.height * 1 / 3 + 24)); + label->setPosition(Vec2(20.0f, winSize.height * 1 / 3 + 24)); _label2 = Label::createWithSystemFont(_localizationBin->getLocalizationString("Text Label"), "Arial", 24); addChild(_label2, 0); _label2->setPosition(Vec2(winSize.width / 2, winSize.height * 1 / 2)); label = Label::createWithSystemFont("From binary data :", "Arial", 24); - label->setAnchorPoint(Vec2(0, 0.5)); + label->setAnchorPoint(Vec2(0.0f, 0.5f)); addChild(label, 0); - label->setPosition(Vec2(20, winSize.height * 1 / 2 + 24)); + label->setPosition(Vec2(20.0f, winSize.height * 1 / 2 + 24)); } std::string LabelLocalizationTest::title() const @@ -3486,7 +3486,7 @@ LabelIssue16717::LabelIssue16717() { auto label = Label::createWithTTF("Hello World", "fonts/arial.ttf", 70); - label->setPosition(VisibleRect::center() + Vec2(0, 40)); + label->setPosition(VisibleRect::center() + Vec2(0.0f, 40.0f)); label->enableOutline(Color4B(0, 255, 0, 100), 10); // Set 100 alpha for outline label->setTextColor(Color4B(0, 0, 255, 100)); // Also set 100 alpha for text addChild(label); @@ -3494,7 +3494,7 @@ LabelIssue16717::LabelIssue16717() { auto label = Label::createWithTTF("Hello World", "fonts/arial.ttf", 70); - label->setPosition(VisibleRect::center() + Vec2(0, -40)); + label->setPosition(VisibleRect::center() + Vec2(0.0f, -40.0f)); label->enableOutline(Color4B(0, 255, 0, 100), 10); // Set 100 alpha for outline label->setTextColor(Color4B(0, 255, 0, 100)); // Also set 100 alpha for text addChild(label); diff --git a/tests/cpp-tests/Classes/LayerTest/LayerTest.cpp b/tests/cpp-tests/Classes/LayerTest/LayerTest.cpp index cd527cac9d..1bc88b56b6 100644 --- a/tests/cpp-tests/Classes/LayerTest/LayerTest.cpp +++ b/tests/cpp-tests/Classes/LayerTest/LayerTest.cpp @@ -132,7 +132,7 @@ void LayerTestCascadingOpacityB::onEnter() auto layer1 = LayerColor::create(Color4B(192, 0, 0, 255), s.width, s.height/2); layer1->setCascadeColorEnabled(false); - layer1->setPosition( Vec2(0, s.height/2)); + layer1->setPosition( Vec2(0.0f, s.height/2)); auto sister1 = Sprite::create("Images/grossinis_sister1.png"); auto sister2 = Sprite::create("Images/grossinis_sister2.png"); @@ -143,9 +143,9 @@ void LayerTestCascadingOpacityB::onEnter() layer1->addChild(label); this->addChild( layer1, 0, kTagLayer); - sister1->setPosition( Vec2( s.width*1/3, 0)); - sister2->setPosition( Vec2( s.width*2/3, 0)); - label->setPosition( Vec2( s.width/2, 0)); + sister1->setPosition( Vec2( s.width*1/3, 0.0f)); + sister2->setPosition( Vec2( s.width*2/3, 0.0f)); + label->setPosition( Vec2( s.width/2, 0.0f)); layer1->runAction( RepeatForever::create( @@ -185,7 +185,7 @@ void LayerTestCascadingOpacityC::onEnter() layer1->setCascadeColorEnabled(false); layer1->setCascadeOpacityEnabled(false); - layer1->setPosition( Vec2(0, s.height/2)); + layer1->setPosition( Vec2(0.0f, s.height/2)); auto sister1 = Sprite::create("Images/grossinis_sister1.png"); auto sister2 = Sprite::create("Images/grossinis_sister2.png"); @@ -196,9 +196,9 @@ void LayerTestCascadingOpacityC::onEnter() layer1->addChild(label); this->addChild( layer1, 0, kTagLayer); - sister1->setPosition( Vec2( s.width*1/3, 0)); - sister2->setPosition( Vec2( s.width*2/3, 0)); - label->setPosition( Vec2( s.width/2, 0)); + sister1->setPosition( Vec2( s.width*1/3, 0.0f)); + sister2->setPosition( Vec2( s.width*2/3, 0.0f)); + label->setPosition( Vec2( s.width/2, 0.0f)); layer1->runAction( RepeatForever::create( @@ -286,7 +286,7 @@ void LayerTestCascadingColorB::onEnter() auto s = Director::getInstance()->getWinSize(); auto layer1 = LayerColor::create(Color4B(255, 255, 255, 255), s.width, s.height/2); - layer1->setPosition( Vec2(0, s.height/2)); + layer1->setPosition( Vec2(0.0f, s.height/2)); auto sister1 = Sprite::create("Images/grossinis_sister1.png"); auto sister2 = Sprite::create("Images/grossinis_sister2.png"); @@ -297,9 +297,9 @@ void LayerTestCascadingColorB::onEnter() layer1->addChild(label); this->addChild( layer1, 0, kTagLayer); - sister1->setPosition( Vec2( s.width*1/3, 0)); - sister2->setPosition( Vec2( s.width*2/3, 0)); - label->setPosition( Vec2( s.width/2, 0)); + sister1->setPosition( Vec2( s.width*1/3, 0.0f)); + sister2->setPosition( Vec2( s.width*2/3, 0.0f)); + label->setPosition( Vec2( s.width/2, 0.0f)); layer1->runAction( RepeatForever::create( @@ -338,7 +338,7 @@ void LayerTestCascadingColorC::onEnter() auto s = Director::getInstance()->getWinSize(); auto layer1 = LayerColor::create(Color4B(255, 255, 255, 255), s.width, s.height/2); layer1->setCascadeColorEnabled(false); - layer1->setPosition( Vec2(0, s.height/2)); + layer1->setPosition( Vec2(0.0f, s.height/2)); auto sister1 = Sprite::create("Images/grossinis_sister1.png"); auto sister2 = Sprite::create("Images/grossinis_sister2.png"); @@ -349,9 +349,9 @@ void LayerTestCascadingColorC::onEnter() layer1->addChild(label); this->addChild( layer1, 0, kTagLayer); - sister1->setPosition( Vec2( s.width*1/3, 0)); - sister2->setPosition( Vec2( s.width*2/3, 0)); - label->setPosition( Vec2( s.width/2, 0)); + sister1->setPosition( Vec2( s.width*1/3, 0.0f)); + sister2->setPosition( Vec2( s.width*2/3, 0.0f)); + label->setPosition( Vec2( s.width/2, 0.0f)); layer1->runAction( RepeatForever::create( @@ -547,7 +547,7 @@ LayerGradientTest::LayerGradientTest() auto menu = Menu::create(item, nullptr); addChild(menu); auto s = Director::getInstance()->getWinSize(); - menu->setPosition(Vec2(s.width / 2, 100)); + menu->setPosition(Vec2(s.width / 2, 100.0f)); } void LayerGradientTest::toggleItem(Ref *sender) @@ -754,18 +754,18 @@ std::string LayerIgnoreAnchorPointScale::subtitle() const LayerExtendedBlendOpacityTest::LayerExtendedBlendOpacityTest() { auto layer1 = LayerGradient::create(Color4B(255, 0, 0, 255), Color4B(255, 0, 255, 255)); - layer1->setContentSize(Size(80, 80)); - layer1->setPosition(Vec2(50,50)); + layer1->setContentSize(Size(80.0f, 80.0f)); + layer1->setPosition(Vec2(50.0f,50.0f)); addChild(layer1); auto layer2 = LayerGradient::create(Color4B(0, 0, 0, 127), Color4B(255, 255, 255, 127)); - layer2->setContentSize(Size(80, 80)); - layer2->setPosition(Vec2(100,90)); + layer2->setContentSize(Size(80.0f, 80.0f)); + layer2->setPosition(Vec2(100.0f,90.0f)); addChild(layer2); auto layer3 = LayerGradient::create(); - layer3->setContentSize(Size(80, 80)); - layer3->setPosition(Vec2(150,140)); + layer3->setContentSize(Size(80.0f, 80.0f)); + layer3->setPosition(Vec2(150.0f,140.0f)); layer3->setStartColor(Color3B(255, 0, 0)); layer3->setEndColor(Color3B(255, 0, 255)); layer3->setStartOpacity(255); @@ -798,7 +798,7 @@ void LayerBug3162A::onEnter() { _layer[i] = LayerColor::create(color[i]); _layer[i]->setContentSize(size); - _layer[i]->setPosition(Vec2(size.width/2, size.height/2) - Vec2(20, 20)); + _layer[i]->setPosition(Vec2(size.width/2, size.height/2) - Vec2(20.0f, 20.0f)); _layer[i]->setOpacity(150); _layer[i]->setCascadeOpacityEnabled(true); if (i > 0) @@ -841,7 +841,7 @@ void LayerBug3162B::onEnter() { _layer[i] = LayerColor::create(color[i]); _layer[i]->setContentSize(size); - _layer[i]->setPosition(Vec2(size.width/2, size.height/2) - Vec2(20, 20)); + _layer[i]->setPosition(Vec2(size.width/2, size.height/2) - Vec2(20.0f, 20.0f)); //_layer[i]->setOpacity(150); if (i > 0) { @@ -920,11 +920,11 @@ void LayerRadialGradientTest::onEnter() addChild(_layer); auto scaleSlider = LayerRadialGradientTest::createSlider(); - scaleSlider->setPosition(Vec2(50, 130)); + scaleSlider->setPosition(Vec2(50.0f, 130.0f)); addChild(scaleSlider); auto listview = createListView(); - listview->setPosition(Vec2(100, 150)); + listview->setPosition(Vec2(100.0f, 150.0f)); addChild(listview); } diff --git a/tests/cpp-tests/Classes/LightTest/LightTest.cpp b/tests/cpp-tests/Classes/LightTest/LightTest.cpp index 4afe15cb65..26c449459d 100644 --- a/tests/cpp-tests/Classes/LightTest/LightTest.cpp +++ b/tests/cpp-tests/Classes/LightTest/LightTest.cpp @@ -43,8 +43,8 @@ LightTest::LightTest() auto s = Director::getInstance()->getWinSize(); auto camera = Camera::createPerspective(60, (float)s.width/s.height, 1.0f, 1000.0f); camera->setCameraFlag(CameraFlag::USER1); - camera->setPosition3D(Vec3(0.0, 100, 100)); - camera->lookAt(Vec3(0.0, 0.0, 0.0), Vec3(0.0, 1.0, 0.0)); + camera->setPosition3D(Vec3(0.0f, 100.0f, 100.0f)); + camera->lookAt(Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 1.0f, 0.0f)); addChild(camera); TTFConfig ttfConfig("fonts/arial.ttf", 15); @@ -120,8 +120,8 @@ void LightTest::addSprite() { std::string fileName = "Sprite3DTest/orc.c3b"; auto sprite = Sprite3D::create(fileName); - sprite->setRotation3D(Vec3(0.0, 180.0, 0.0)); - sprite->setPosition(Vec2(0.0, 0.0)); + sprite->setRotation3D(Vec3(0.0f, 180.0f, 0.0f)); + sprite->setPosition(Vec2(0.0f, 0.0f)); sprite->setScale(2.0); auto sp = Sprite3D::create("Sprite3DTest/axe.c3b"); sprite->getAttachNode("Bip001 R Hand")->addChild(sp); @@ -139,7 +139,7 @@ void LightTest::addSprite() { std::string fileName = "Sprite3DTest/sphere.c3b"; auto sprite = Sprite3D::create(fileName); - sprite->setPosition(Vec2(30.0, 0.0)); + sprite->setPosition(Vec2(30.0f, 0.0f)); addChild(sprite); sprite->setCameraMask(2); } @@ -148,7 +148,7 @@ void LightTest::addSprite() std::string fileName = "Sprite3DTest/sphere.c3b"; auto sprite = Sprite3D::create(fileName); sprite->setScale(0.5f); - sprite->setPosition(Vec2(-50.0, 0.0)); + sprite->setPosition(Vec2(-50.0f, 0.0f)); addChild(sprite); sprite->setCameraMask(2); } @@ -157,7 +157,7 @@ void LightTest::addSprite() std::string fileName = "Sprite3DTest/sphere.c3b"; auto sprite = Sprite3D::create(fileName); sprite->setScale(0.5f); - sprite->setPosition(Vec2(-30.0, 10.0)); + sprite->setPosition(Vec2(-30.0f, 10.0f)); addChild(sprite); sprite->setCameraMask(2); } diff --git a/tests/cpp-tests/Classes/MaterialSystemTest/MaterialSystemTest.cpp b/tests/cpp-tests/Classes/MaterialSystemTest/MaterialSystemTest.cpp index 24935b11f8..de0539305e 100644 --- a/tests/cpp-tests/Classes/MaterialSystemTest/MaterialSystemTest.cpp +++ b/tests/cpp-tests/Classes/MaterialSystemTest/MaterialSystemTest.cpp @@ -66,7 +66,7 @@ void Material_Sprite3DTest::onEnter() sprite->setScale(8.f); sprite->setTexture("Sprite3DTest/boss.png"); this->addChild(sprite); - sprite->setPositionNormalized(Vec2(0.5,0.5)); + sprite->setPositionNormalized(Vec2(0.5f,0.5f)); } std::string Material_Sprite3DTest::subtitle() const @@ -296,7 +296,7 @@ void Material_setTechnique::onEnter() auto sprite = Sprite3D::create("Sprite3DTest/boss1.obj"); sprite->setScale(6); this->addChild(sprite); - sprite->setPositionNormalized(Vec2(0.5,0.5)); + sprite->setPositionNormalized(Vec2(0.5f,0.5f)); _sprite = sprite; @@ -313,7 +313,7 @@ void Material_setTechnique::onEnter() this->schedule(CC_CALLBACK_1(Material_setTechnique::changeMaterial, this), 1, "cookie"); _techniqueState = 0; - auto rot = RotateBy::create(5, Vec3(30,60,270)); + auto rot = RotateBy::create(5, Vec3(30.0f,60.0f,270.0f)); auto repeat = RepeatForever::create(rot); sprite->runAction(repeat); } @@ -354,12 +354,12 @@ void Material_clone::onEnter() auto sprite = Sprite3D::create("Sprite3DTest/boss1.obj"); sprite->setScale(3); this->addChild(sprite); - sprite->setPositionNormalized(Vec2(0.25, 0.5)); + sprite->setPositionNormalized(Vec2(0.25f, 0.5f)); Material *mat = Material::createWithFilename("Materials/3d_effects.material"); sprite->setMaterial(mat); - auto rot = RotateBy::create(5, Vec3(360,240,120)); + auto rot = RotateBy::create(5, Vec3(360.0f,240.0f,120.0f)); auto repeat = RepeatForever::create(rot); sprite->runAction(repeat); @@ -367,7 +367,7 @@ void Material_clone::onEnter() auto sprite2 = Sprite3D::create("Sprite3DTest/boss1.obj"); sprite2->setScale(3); this->addChild(sprite2); - sprite2->setPositionNormalized(Vec2(0.5, 0.5)); + sprite2->setPositionNormalized(Vec2(0.5f, 0.5f)); sprite2->setMaterial(mat); sprite2->runAction(repeat->clone()); @@ -375,7 +375,7 @@ void Material_clone::onEnter() auto sprite3 = Sprite3D::create("Sprite3DTest/boss1.obj"); sprite3->setScale(3); this->addChild(sprite3); - sprite3->setPositionNormalized(Vec2(0.75, 0.5)); + sprite3->setPositionNormalized(Vec2(0.75f, 0.5f)); auto mat2 = mat->clone(); sprite3->setMaterial(mat2); sprite3->runAction(repeat->clone()); diff --git a/tests/cpp-tests/Classes/MenuTest/MenuTest.cpp b/tests/cpp-tests/Classes/MenuTest/MenuTest.cpp index 91cbad64c4..29ea7aa37d 100644 --- a/tests/cpp-tests/Classes/MenuTest/MenuTest.cpp +++ b/tests/cpp-tests/Classes/MenuTest/MenuTest.cpp @@ -127,7 +127,7 @@ MenuLayerMainMenu::MenuLayerMainMenu() child->setPosition( Vec2( dstPoint.x + offset, dstPoint.y) ); child->runAction( - EaseElasticOut::create(MoveBy::create(2, Vec2(dstPoint.x - offset,0)), 0.35f) + EaseElasticOut::create(MoveBy::create(2, Vec2(dstPoint.x - offset,0.0f)), 0.35f) ); i++; } @@ -259,7 +259,7 @@ void MenuLayer2::alignMenusH() // TIP: if no padding, padding = 5 menu->alignItemsHorizontally(); auto p = menu->getPosition(); - menu->setPosition(p + Vec2(0,30)); + menu->setPosition(p + Vec2(0.0f,30.0f)); } else @@ -267,7 +267,7 @@ void MenuLayer2::alignMenusH() // TIP: but padding is configurable menu->alignItemsHorizontallyWithPadding(40); auto p = menu->getPosition(); - menu->setPosition(p - Vec2(0,30)); + menu->setPosition(p - Vec2(0.0f,30.0f)); } } } @@ -283,14 +283,14 @@ void MenuLayer2::alignMenusV() // TIP: if no padding, padding = 5 menu->alignItemsVertically(); auto p = menu->getPosition(); - menu->setPosition(p + Vec2(100,0)); + menu->setPosition(p + Vec2(100.0f,0.0f)); } else { // TIP: but padding is configurable menu->alignItemsVerticallyWithPadding(40); auto p = menu->getPosition(); - menu->setPosition(p - Vec2(100,0)); + menu->setPosition(p - Vec2(100.0f,0.0f)); } } } diff --git a/tests/cpp-tests/Classes/MotionStreakTest/MotionStreakTest.cpp b/tests/cpp-tests/Classes/MotionStreakTest/MotionStreakTest.cpp index 1d5f992907..b016c17898 100644 --- a/tests/cpp-tests/Classes/MotionStreakTest/MotionStreakTest.cpp +++ b/tests/cpp-tests/Classes/MotionStreakTest/MotionStreakTest.cpp @@ -61,7 +61,7 @@ void MotionStreakTest1::onEnter() // the target object is offset from root, and the streak is moved to follow it _target = Sprite::create(s_pathR1); _root->addChild(_target); - _target->setPosition(Vec2(s.width/4, 0)); + _target->setPosition(Vec2(s.width/4, 0.0f)); // create the streak object and add it to the scene _streak = MotionStreak::create(2, 3, 32, Color3B::GREEN, s_streak); diff --git a/tests/cpp-tests/Classes/MultiTouchTest/MultiTouchTest.cpp b/tests/cpp-tests/Classes/MultiTouchTest/MultiTouchTest.cpp index 764583b9aa..54cd482799 100644 --- a/tests/cpp-tests/Classes/MultiTouchTest/MultiTouchTest.cpp +++ b/tests/cpp-tests/Classes/MultiTouchTest/MultiTouchTest.cpp @@ -47,8 +47,8 @@ public: DrawNode* drawNode = DrawNode::create(); auto s = Director::getInstance()->getWinSize(); Color4F color(touchColor.r/255.0f, touchColor.g/255.0f, touchColor.b/255.0f, 1.0f); - drawNode->drawLine(Vec2(0, touchPoint.y), Vec2(s.width, touchPoint.y), color); - drawNode->drawLine(Vec2(touchPoint.x, 0), Vec2(touchPoint.x, s.height), color); + drawNode->drawLine(Vec2(0.0f, touchPoint.y), Vec2(s.width, touchPoint.y), color); + drawNode->drawLine(Vec2(touchPoint.x, 0.0f), Vec2(touchPoint.x, s.height), color); drawNode->drawDot(touchPoint, 3, color); addChild(drawNode); } @@ -74,7 +74,7 @@ bool MultiTouchTest::init() _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); auto title = Label::createWithSystemFont("Please touch the screen!", "", 24); - title->setPosition(VisibleRect::top()+Vec2(0, -40)); + title->setPosition(VisibleRect::top()+Vec2(0.0f, -40.0f)); addChild(title); return true; diff --git a/tests/cpp-tests/Classes/NewEventDispatcherTest/NewEventDispatcherTest.cpp b/tests/cpp-tests/Classes/NewEventDispatcherTest/NewEventDispatcherTest.cpp index 9ba95088db..fa1d97c419 100644 --- a/tests/cpp-tests/Classes/NewEventDispatcherTest/NewEventDispatcherTest.cpp +++ b/tests/cpp-tests/Classes/NewEventDispatcherTest/NewEventDispatcherTest.cpp @@ -75,7 +75,7 @@ void TouchableSpriteTest::onEnter() auto containerForSprite1 = Node::create(); auto sprite1 = Sprite::create("Images/CyanSquare.png"); - sprite1->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80, 80)); + sprite1->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80.0f, 80.0f)); containerForSprite1->addChild(sprite1); addChild(containerForSprite1, 10); @@ -142,7 +142,7 @@ void TouchableSpriteTest::onEnter() }); nextItem->setFontSizeObj(16); - nextItem->setPosition(VisibleRect::right() + Vec2(-100, -30)); + nextItem->setPosition(VisibleRect::right() + Vec2(-100.0f, -30.0f)); auto menu2 = Menu::create(nextItem, nullptr); menu2->setPosition(Vec2(0, 0)); @@ -151,7 +151,7 @@ void TouchableSpriteTest::onEnter() }); removeAllTouchItem->setFontSizeObj(16); - removeAllTouchItem->setPosition(VisibleRect::right() + Vec2(-100, 0)); + removeAllTouchItem->setPosition(VisibleRect::right() + Vec2(-100.0f, 0.0f)); auto menu = Menu::create(removeAllTouchItem, nullptr); menu->setPosition(Vec2(0, 0)); @@ -271,7 +271,7 @@ void FixedPriorityTest::onEnter() auto sprite1 = TouchableSprite::create(30); sprite1->setTexture("Images/CyanSquare.png"); - sprite1->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80, 40)); + sprite1->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80.0f, 40.0f)); addChild(sprite1, 10); auto sprite2 = TouchableSprite::create(20); @@ -356,10 +356,10 @@ void RemoveListenerWhenDispatching::onEnter() } }, MenuItemFont::create("Enabled"), MenuItemFont::create("Disabled"), nullptr); - toggleItem->setPosition(origin + Vec2(size.width/2, 80)); + toggleItem->setPosition(origin + Vec2(size.width/2, 80.0f)); auto menu = Menu::create(toggleItem, nullptr); - menu->setPosition(Vec2(0, 0)); - menu->setAnchorPoint(Vec2(0, 0)); + menu->setPosition(Vec2(0.0f, 0.0f)); + menu->setAnchorPoint(Vec2(0.0f, 0.0f)); addChild(menu, -1); } @@ -528,8 +528,8 @@ _pos = _max; \ ptNow.x += acc->x * 9.81f; ptNow.y += acc->y * 9.81f; - FIX_POS(ptNow.x, (VisibleRect::left().x+ballSize.width / 2.0), (VisibleRect::right().x - ballSize.width / 2.0)); - FIX_POS(ptNow.y, (VisibleRect::bottom().y+ballSize.height / 2.0), (VisibleRect::top().y - ballSize.height / 2.0)); + FIX_POS(ptNow.x, (VisibleRect::left().x+ballSize.width / 2.0), (VisibleRect::right().x - ballSize.width / 2.0f)); + FIX_POS(ptNow.y, (VisibleRect::bottom().y+ballSize.height / 2.0), (VisibleRect::top().y - ballSize.height / 2.0f)); sprite->setPosition(ptNow); }); @@ -650,13 +650,13 @@ void RemoveListenerAfterAddingTest::onEnter() _eventDispatcher->removeEventListener(listener); }); - item1->setPosition(VisibleRect::center() + Vec2(0, 80)); + item1->setPosition(VisibleRect::center() + Vec2(0.0f, 80.0f)); auto addNextButton = [this](){ auto next = MenuItemFont::create("Please Click Me To Reset!", [this](Ref* sender){ getTestSuite()->restartCurrTest(); }); - next->setPosition(VisibleRect::center() + Vec2(0, -40)); + next->setPosition(VisibleRect::center() + Vec2(0.0f, -40.0f)); auto menu = Menu::create(next, nullptr); menu->setPosition(VisibleRect::leftBottom()); @@ -677,7 +677,7 @@ void RemoveListenerAfterAddingTest::onEnter() addNextButton(); }); - item2->setPosition(VisibleRect::center() + Vec2(0, 40)); + item2->setPosition(VisibleRect::center() + Vec2(0.0f, 40.0f)); auto item3 = MenuItemFont::create("Click Me 3", [=](Ref* sender){ auto listener = EventListenerTouchOneByOne::create(); @@ -1073,7 +1073,7 @@ PauseResumeTargetTest::PauseResumeTargetTest() auto sprite1 = TouchableSprite::create(); sprite1->setTexture("Images/CyanSquare.png"); - sprite1->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80, 40)); + sprite1->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80.0f, 40.0f)); addChild(sprite1, -10); auto sprite2 = TouchableSprite::create(); @@ -1143,7 +1143,7 @@ PauseResumeTargetTest2::PauseResumeTargetTest2() _touchableSprite = TouchableSprite::create(); _touchableSprite->retain(); _touchableSprite->setTexture("Images/CyanSquare.png"); - _touchableSprite->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80, 40)); + _touchableSprite->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80.0f, 40.0f)); addChild(_touchableSprite); _itemPauseTouch = MenuItemFont::create("pauseTouch", [=](Ref* sender){ @@ -1154,7 +1154,7 @@ PauseResumeTargetTest2::PauseResumeTargetTest2() }); _itemPauseTouch->setAnchorPoint(Vec2::ANCHOR_MIDDLE_RIGHT); - _itemPauseTouch->setPosition(VisibleRect::right() + Vec2(-150, 0)); + _itemPauseTouch->setPosition(VisibleRect::right() + Vec2(-150.0f, 0.0f)); _itemResumeTouch = MenuItemFont::create("resumeTouch", [=](Ref* sender){ _itemPauseTouch->setEnabled(true); @@ -1174,7 +1174,7 @@ PauseResumeTargetTest2::PauseResumeTargetTest2() }); _itemAddToScene->setAnchorPoint(Vec2::ANCHOR_MIDDLE_RIGHT); - _itemAddToScene->setPosition(VisibleRect::right() + Vec2(-150, -50)); + _itemAddToScene->setPosition(VisibleRect::right() + Vec2(-150.0f, -50.0f)); _itemRemoveFromScene = MenuItemFont::create("removeFromScene", [=](Ref* sender){ _itemAddToScene->setEnabled(true); @@ -1183,7 +1183,7 @@ PauseResumeTargetTest2::PauseResumeTargetTest2() }); _itemRemoveFromScene->setAnchorPoint(Vec2::ANCHOR_MIDDLE_RIGHT); - _itemRemoveFromScene->setPosition(VisibleRect::right() + Vec2(0, -50)); + _itemRemoveFromScene->setPosition(VisibleRect::right() + Vec2(0.0f, -50.0f)); _itemAddToScene->setEnabled(false); _itemResumeTouch->setEnabled(false); @@ -1223,7 +1223,7 @@ PauseResumeTargetTest3::PauseResumeTargetTest3() Size size = Director::getInstance()->getVisibleSize(); _touchableSprite = Sprite::create("Images/CyanSquare.png"); - _touchableSprite->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80, 40)); + _touchableSprite->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80.0f, 40.0f)); addChild(_touchableSprite); auto item = MenuItemFont::create("addListener", [=](Ref* sender){ @@ -1289,8 +1289,8 @@ Issue4129::Issue4129() _customlistener = _eventDispatcher->addCustomEventListener(EVENT_COME_TO_BACKGROUND, [this](EventCustom* event){ auto label = Label::createWithSystemFont("Yeah, this issue was fixed.", "", 20); - label->setAnchorPoint(Vec2(0, 0.5f)); - label->setPosition(Vec2(VisibleRect::left() + Vec2(0, 30))); + label->setAnchorPoint(Vec2(0.0f, 0.5f)); + label->setPosition(Vec2(VisibleRect::left() + Vec2(0.0f, 30.0f))); this->addChild(label); // After test, remove it. @@ -1312,7 +1312,7 @@ Issue4129::Issue4129() }); nextItem->setFontSizeObj(16); - nextItem->setPosition(VisibleRect::right() + Vec2(-100, -30)); + nextItem->setPosition(VisibleRect::right() + Vec2(-100.0f, -30.0f)); auto menu2 = Menu::create(nextItem, nullptr); menu2->setPosition(Vec2(0, 0)); @@ -1324,7 +1324,7 @@ Issue4129::Issue4129() }); removeAllTouchItem->setFontSizeObj(16); - removeAllTouchItem->setPosition(VisibleRect::right() + Vec2(-100, 0)); + removeAllTouchItem->setPosition(VisibleRect::right() + Vec2(-100.0f, 0.0f)); auto menu = Menu::create(removeAllTouchItem, nullptr); menu->setPosition(Vec2(0, 0)); @@ -1358,7 +1358,7 @@ Issue4160::Issue4160() auto sprite1 = TouchableSprite::create(-30); sprite1->setTexture("Images/CyanSquare.png"); - sprite1->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80, 40)); + sprite1->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80.0f, 40.0f)); addChild(sprite1, -10); auto sprite2 = TouchableSprite::create(-20); diff --git a/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp b/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp index 057a1e3c04..668d75fc5f 100644 --- a/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp +++ b/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp @@ -237,8 +237,8 @@ NewClippingNodeTest::NewClippingNodeTest() auto clipper = ClippingNode::create(); clipper->setTag( kTagClipperNode ); - clipper->setContentSize( Size(200, 200) ); - clipper->setAnchorPoint( Vec2(0.5, 0.5) ); + clipper->setContentSize( Size(200.0f, 200.0f) ); + clipper->setAnchorPoint( Vec2(0.5f, 0.5f) ); clipper->setPosition( Vec2(s.width / 2, s.height / 2) ); clipper->runAction(RepeatForever::create(RotateBy::create(1, 45))); @@ -264,7 +264,7 @@ NewClippingNodeTest::NewClippingNodeTest() auto content = Sprite::create("Images/background2.png"); content->setTag( kTagContentNode ); - content->setAnchorPoint( Vec2(0.5, 0.5) ); + content->setAnchorPoint( Vec2(0.5f, 0.5f) ); content->setPosition( Vec2(clipper->getContentSize().width / 2, clipper->getContentSize().height / 2) ); clipper->addChild(content); @@ -620,13 +620,13 @@ CaptureScreenTest::CaptureScreenTest() auto sp1 = Sprite::create("Images/grossini.png"); sp1->setPosition(left); - auto move1 = MoveBy::create(1, Vec2(s.width/2, 0)); + auto move1 = MoveBy::create(1, Vec2(s.width/2, 0.0f)); auto seq1 = RepeatForever::create(Sequence::create(move1, move1->reverse(), nullptr)); addChild(sp1); sp1->runAction(seq1); auto sp2 = Sprite::create("Images/grossinis_sister1.png"); sp2->setPosition(right); - auto move2 = MoveBy::create(1, Vec2(-s.width/2, 0)); + auto move2 = MoveBy::create(1, Vec2(-s.width/2, 0.0f)); auto seq2 = RepeatForever::create(Sequence::create(move2, move2->reverse(), nullptr)); addChild(sp2); sp2->runAction(seq2); @@ -693,13 +693,13 @@ CaptureNodeTest::CaptureNodeTest() auto sp1 = Sprite::create("Images/grossini.png"); sp1->setPosition(left); - auto move1 = MoveBy::create(1, Vec2(s.width / 2, 0)); + auto move1 = MoveBy::create(1, Vec2(s.width / 2, 0.0f)); auto seq1 = RepeatForever::create(Sequence::create(move1, move1->reverse(), nullptr)); addChild(sp1); sp1->runAction(seq1); auto sp2 = Sprite::create("Images/grossinis_sister1.png"); sp2->setPosition(right); - auto move2 = MoveBy::create(1, Vec2(-s.width / 2, 0)); + auto move2 = MoveBy::create(1, Vec2(-s.width / 2, 0.0f)); auto seq2 = RepeatForever::create(Sequence::create(move2, move2->reverse(), nullptr)); addChild(sp2); sp2->runAction(seq2); @@ -769,7 +769,7 @@ BugAutoCulling::BugAutoCulling() } this->scheduleOnce([=](float){ auto camera = Director::getInstance()->getRunningScene()->getCameras().front(); - auto move = MoveBy::create(2.0, Vec2(2 * s.width, 0)); + auto move = MoveBy::create(2.0f, Vec2(2 * s.width, 0.0f)); camera->runAction(Sequence::create(move, move->reverse(),nullptr)); }, 1.0f, "lambda-autoculling-bug"); } @@ -803,7 +803,7 @@ RendererBatchQuadTri::RendererBatchQuadTri() addChild(label); auto sprite = Sprite::create("fonts/tuffy_bold_italic-charmap.png"); - sprite->setTextureRect(Rect(0,0,100,100)); + sprite->setTextureRect(Rect(0.0f,0.0f,100.0f,100.0f)); sprite->setPosition(Vec2(x,y)); sprite->setColor(Color3B::BLUE); addChild(sprite); diff --git a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp index d5f19383d4..6432935779 100644 --- a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp +++ b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp @@ -106,8 +106,8 @@ void NodeTest2::onEnter() auto sp3 = Sprite::create(s_pathSister1); auto sp4 = Sprite::create(s_pathSister2); - sp1->setPosition(Vec2(100, s.height /2 )); - sp2->setPosition(Vec2(380, s.height /2 )); + sp1->setPosition(Vec2(100.0f, s.height /2 )); + sp2->setPosition(Vec2(380.0f, s.height /2 )); addChild(sp1); addChild(sp2); @@ -192,10 +192,10 @@ NodeTest5::NodeTest5() auto sp1 = Sprite::create(s_pathSister1); auto sp2 = Sprite::create(s_pathSister2); - sp1->setPosition(Vec2(100,160)); - sp2->setPosition(Vec2(380,160)); + sp1->setPosition(Vec2(100.0f,160.0f)); + sp2->setPosition(Vec2(380.0f,160.0f)); - auto rot = RotateBy::create(2, 360); + auto rot = RotateBy::create(2.0f, 360.0f); auto rot_back = rot->reverse(); auto forever = RepeatForever::create(Sequence::create(rot, rot_back, nullptr)); auto forever2 = forever->clone(); @@ -247,10 +247,10 @@ NodeTest6::NodeTest6() auto sp2 = Sprite::create(s_pathSister2); auto sp21 = Sprite::create(s_pathSister2); - sp1->setPosition(Vec2(100,160)); - sp2->setPosition(Vec2(380,160)); + sp1->setPosition(Vec2(100.0f,160.0f)); + sp2->setPosition(Vec2(380.0f,160.0f)); - auto rot = RotateBy::create(2, 360); + auto rot = RotateBy::create(2.0f, 360.0f); auto rot_back = rot->reverse(); auto forever1 = RepeatForever::create(Sequence::create(rot, rot_back, nullptr)); auto forever11 = forever1->clone(); @@ -360,9 +360,9 @@ StressTest2::StressTest2() auto sublayer = Layer::create(); auto sp1 = Sprite::create(s_pathSister1); - sp1->setPosition( Vec2(80, s.height/2) ); + sp1->setPosition( Vec2(80.0f, s.height/2) ); - auto move = MoveBy::create(3, Vec2(350,0)); + auto move = MoveBy::create(3, Vec2(350.0f,0.0f)); auto move_ease_inout3 = EaseInOut::create(move->clone(), 2.0f); auto move_ease_inout_back3 = move_ease_inout3->reverse(); auto seq3 = Sequence::create( move_ease_inout3, move_ease_inout_back3, nullptr); @@ -371,7 +371,7 @@ StressTest2::StressTest2() auto fire = ParticleFire::create(); fire->setTexture(Director::getInstance()->getTextureCache()->addImage("Images/fire.png")); - fire->setPosition( Vec2(80, s.height/2-50) ); + fire->setPosition( Vec2(80.0f, s.height/2-50) ); auto copy_seq3 = seq3->clone(); @@ -489,11 +489,11 @@ NodeToWorld::NodeToWorld() menu->setPosition( Vec2(backSize.width/2, backSize.height/2)); back->addChild(menu); - auto rot = RotateBy::create(5, 360); + auto rot = RotateBy::create(5.0f, 360.0f); auto fe = RepeatForever::create( rot); item->runAction( fe ); - auto move = MoveBy::create(3, Vec2(200,0)); + auto move = MoveBy::create(3.0f, Vec2(200.0f,0.0f)); auto move_back = move->reverse(); auto seq = Sequence::create( move, move_back, nullptr); auto fe2 = RepeatForever::create(seq); @@ -520,13 +520,13 @@ NodeToWorld3D::NodeToWorld3D() Size s = Director::getInstance()->getWinSize(); auto parent = Node::create(); parent->setContentSize(s); - parent->setAnchorPoint(Vec2(0.5, 0.5)); + parent->setAnchorPoint(Vec2(0.5f, 0.5f)); parent->setPosition(s.width/2, s.height/2); this->addChild(parent); auto back = Sprite::create(s_back3); parent->addChild( back, -10); - back->setAnchorPoint( Vec2(0,0) ); + back->setAnchorPoint( Vec2(0.0f,0.0f) ); auto backSize = back->getContentSize(); auto item = MenuItemImage::create(s_PlayNormal, s_PlaySelect); @@ -539,7 +539,7 @@ NodeToWorld3D::NodeToWorld3D() auto fe = RepeatForever::create( rot); item->runAction( fe ); - auto move = MoveBy::create(3, Vec2(200,0)); + auto move = MoveBy::create(3, Vec2(200.0f,0.0f)); auto move_back = move->reverse(); auto seq = Sequence::create( move, move_back, nullptr); auto fe2 = RepeatForever::create(seq); @@ -729,8 +729,8 @@ CameraCenterTest::CameraCenterTest() addChild( sprite, 0); sprite->setPosition(Vec2(s.width/5*1, s.height/5*1)); sprite->setColor(Color3B::RED); - sprite->setTextureRect(Rect(0, 0, 120, 50)); - orbit = OrbitCamera::create(10, 1, 0, 0, 360, 0, 0); + sprite->setTextureRect(Rect(0.0f, 0.0f, 120.0f, 50.0f)); + orbit = OrbitCamera::create(10.0f, 1.0f, 0.0f, 0.0f, 360.0f, 0.0f, 0.0f); sprite->runAction(RepeatForever::create( orbit )); // [sprite setAnchorPoint: Vec2(0,1)); @@ -741,8 +741,8 @@ CameraCenterTest::CameraCenterTest() addChild( sprite, 0, 40); sprite->setPosition(Vec2(s.width/5*1, s.height/5*4)); sprite->setColor(Color3B::BLUE); - sprite->setTextureRect(Rect(0, 0, 120, 50)); - orbit = OrbitCamera::create(10, 1, 0, 0, 360, 0, 0); + sprite->setTextureRect(Rect(0.0f, 0.0f, 120.0f, 50.0f)); + orbit = OrbitCamera::create(10.0f, 1.0f, 0.0f, 0.0f, 360.0f, 0.0f, 0.0f); sprite->runAction(RepeatForever::create( orbit )); @@ -751,8 +751,8 @@ CameraCenterTest::CameraCenterTest() addChild( sprite, 0); sprite->setPosition(Vec2(s.width/5*4, s.height/5*1)); sprite->setColor(Color3B::YELLOW); - sprite->setTextureRect(Rect(0, 0, 120, 50)); - orbit = OrbitCamera::create(10, 1, 0, 0, 360, 0, 0); + sprite->setTextureRect(Rect(0.0f, 0.0f, 120.0f, 50.0f)); + orbit = OrbitCamera::create(10.0f, 1.0f, 0.0f, 0.0f, 360.0f, 0.0f, 0.0f); sprite->runAction(RepeatForever::create( orbit) ); @@ -761,8 +761,8 @@ CameraCenterTest::CameraCenterTest() addChild( sprite, 0, 40); sprite->setPosition(Vec2(s.width/5*4, s.height/5*4)); sprite->setColor(Color3B::GREEN); - sprite->setTextureRect(Rect(0, 0, 120, 50)); - orbit = OrbitCamera::create(10, 1, 0, 0, 360, 0, 0); + sprite->setTextureRect(Rect(0.0f, 0.0f, 120.0f, 50.0f)); + orbit = OrbitCamera::create(10.0f, 1.0f, 0.0f, 0.0f, 360.0f, 0.0f, 0.0f); sprite->runAction( RepeatForever::create( orbit ) ); // CENTER @@ -770,8 +770,8 @@ CameraCenterTest::CameraCenterTest() addChild( sprite, 0, 40); sprite->setPosition(Vec2(s.width/2, s.height/2)); sprite->setColor(Color3B::WHITE); - sprite->setTextureRect(Rect(0, 0, 120, 50)); - orbit = OrbitCamera::create(10, 1, 0, 0, 360, 0, 0); + sprite->setTextureRect(Rect(0.0f, 0.0f, 120.0f, 50.0f)); + orbit = OrbitCamera::create(10.0f, 1.0f, 0.0f, 0.0f, 360.0f, 0.0f, 0.0f); sprite->runAction(RepeatForever::create( orbit ) ); } @@ -1144,11 +1144,11 @@ NodeNormalizedPositionTest1::NodeNormalizedPositionTest1() { Sprite *sprites[5]; Vec2 positions[5]; - positions[0] = Vec2(0,0); - positions[1] = Vec2(0,1); - positions[2] = Vec2(0.5,0.5); - positions[3] = Vec2(1,0); - positions[4] = Vec2(1,1); + positions[0] = Vec2(0.0f,0.0f); + positions[1] = Vec2(0.0f,1.0f); + positions[2] = Vec2(0.5f,0.5f); + positions[3] = Vec2(1.0f,0.0f); + positions[4] = Vec2(1.0f,1.0f); for(int i=0; i<5; i++) { sprites[i] = Sprite::create("Images/grossini.png"); @@ -1177,11 +1177,11 @@ NodeNormalizedPositionTest2::NodeNormalizedPositionTest2() { Sprite *sprites[5]; Vec2 positions[5]; - positions[0] = Vec2(0,0); - positions[1] = Vec2(0,1); - positions[2] = Vec2(0.5,0.5); - positions[3] = Vec2(1,0); - positions[4] = Vec2(1,1); + positions[0] = Vec2(0.0f,0.0f); + positions[1] = Vec2(0.0f,1.0f); + positions[2] = Vec2(0.5f,0.5f); + positions[3] = Vec2(1.0f,0.0f); + positions[4] = Vec2(1.0f,1.0f); for(int i=0; i<5; i++) { sprites[i] = Sprite::create("Images/grossini.png"); @@ -1230,7 +1230,7 @@ NodeNormalizedPositionBugTest::NodeNormalizedPositionBugTest() { Vec2 position; - position = Vec2(0.5,0.5); + position = Vec2(0.5f,0.5f); sprite = Sprite::create("Images/grossini.png"); @@ -1486,7 +1486,7 @@ void Issue16100Test::onEnter() this->addChild(sprite); sprite->setPosition(-200,s.height/3); - auto moveby = MoveBy::create(2, Vec2(400,0)); + auto moveby = MoveBy::create(2, Vec2(400.0f,0.0f)); auto movebyback = moveby->reverse(); auto seq = Sequence::create(moveby, movebyback, nullptr); auto forever = RepeatForever::create(seq); @@ -1501,7 +1501,7 @@ void Issue16100Test::onEnter() this->addChild(sister); sister->setPosition(-200,s.height*2/3); - auto moveby1 = MoveBy::create(2, Vec2(400,0)); + auto moveby1 = MoveBy::create(2, Vec2(400.0f,0.0f)); auto movebyback1 = moveby1->reverse(); auto seq1 = Sequence::create(moveby1, movebyback1, nullptr); auto forever1 = RepeatForever::create(seq1); diff --git a/tests/cpp-tests/Classes/ParticleTest/ParticleTest.cpp b/tests/cpp-tests/Classes/ParticleTest/ParticleTest.cpp index f62e1e7ffe..c22299983a 100644 --- a/tests/cpp-tests/Classes/ParticleTest/ParticleTest.cpp +++ b/tests/cpp-tests/Classes/ParticleTest/ParticleTest.cpp @@ -71,7 +71,7 @@ void DemoFire::onEnter() _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(s_fire) );//.pvr"); auto p = _emitter->getPosition(); - _emitter->setPosition( Vec2(p.x, 100) ); + _emitter->setPosition( Vec2(p.x, 100.0f) ); setEmitterPosition(); } @@ -439,7 +439,7 @@ void DemoSmoke::onEnter() _emitter->setTexture( Director::getInstance()->getTextureCache()->addImage(s_fire) ); auto p = _emitter->getPosition(); - _emitter->setPosition( Vec2( p.x, 100) ); + _emitter->setPosition( Vec2( p.x, 100.0f) ); setEmitterPosition(); } @@ -468,7 +468,7 @@ void DemoSnow::onEnter() _emitter->setLifeVar(1); // gravity - _emitter->setGravity(Vec2(0,-10)); + _emitter->setGravity(Vec2(0.0f,-10.0f)); // speed of particles _emitter->setSpeed(130); @@ -547,7 +547,7 @@ void DemoModernArt::onEnter() _emitter->setDuration(-1); // gravity - _emitter->setGravity(Vec2(0,0)); + _emitter->setGravity(Vec2(0.0f,0.0f)); // angle _emitter->setAngle(0); @@ -656,8 +656,8 @@ void ParallaxParticle::onEnter() auto p1 = Sprite::create(s_back3); auto p2 = Sprite::create(s_back3); - p->addChild( p1, 1, Vec2(0.5f,1), Vec2(0,250) ); - p->addChild(p2, 2, Vec2(1.5f,1), Vec2(0,50) ); + p->addChild( p1, 1, Vec2(0.5f,1.0f), Vec2(0.0f,250.0f) ); + p->addChild(p2, 2, Vec2(1.5f,1.0f), Vec2(0.0f,50.0f) ); _emitter = ParticleFlower::create(); _emitter->retain(); @@ -670,7 +670,7 @@ void ParallaxParticle::onEnter() p2->addChild(par, 10); par->setTexture( Director::getInstance()->getTextureCache()->addImage(s_fire) ); - auto move = MoveBy::create(4, Vec2(300,0)); + auto move = MoveBy::create(4, Vec2(300.0f,0.0f)); auto move_back = move->reverse(); auto seq = Sequence::create( move, move_back, nullptr); p->runAction(RepeatForever::create(seq)); @@ -1115,7 +1115,7 @@ void ParticleDemo::onEnter() auto labelAtlas = LabelAtlas::create("0000", "fps_images.png", 12, 32, '.'); addChild(labelAtlas, 100, kTagParticleCount); - labelAtlas->setPosition(Vec2(s.width-66,50)); + labelAtlas->setPosition(Vec2(s.width-66,50.0f)); // moving background _background = Sprite::create(s_back3); @@ -1406,7 +1406,7 @@ bool RainbowEffect::initWithTotalParticles(int numberOfParticles) setEmitterMode(ParticleSystem::Mode::GRAVITY); // Gravity Mode: gravity - setGravity(Vec2(0,0)); + setGravity(Vec2(0.0f,0.0f)); // Gravity mode: radial acceleration setRadialAccel(0); @@ -1508,7 +1508,7 @@ void MultipleParticleSystems::onEnter() for (int i = 0; i<5; i++) { auto particleSystem = ParticleSystemQuad::create("Particles/SpinningPeas.plist"); - particleSystem->setPosition(Vec2(i*50 ,i*50)); + particleSystem->setPosition(Vec2(i*50.0f,i*50.0f)); particleSystem->setPositionType(ParticleSystem::PositionType::GROUPED); addChild(particleSystem); @@ -1566,7 +1566,7 @@ void MultipleParticleSystemsBatched::onEnter() auto particleSystem = ParticleSystemQuad::create("Particles/SpinningPeas.plist"); particleSystem->setPositionType(ParticleSystem::PositionType::GROUPED); - particleSystem->setPosition(Vec2(i*50 ,i*50)); + particleSystem->setPosition(Vec2(i*50.0f,i*50.0f)); batchNode->setTexture(particleSystem->getTexture()); batchNode->addChild(particleSystem); @@ -1628,7 +1628,7 @@ void AddAndDeleteParticleSystems::onEnter() particleSystem->setPositionType(ParticleSystem::PositionType::GROUPED); particleSystem->setTotalParticles(200); - particleSystem->setPosition(Vec2(i*15 +100,i*15+100)); + particleSystem->setPosition(Vec2(i*15 +100.0f,i*15+100.0f)); unsigned int randZ = rand() % 100; _batchNode->addChild(particleSystem, randZ, -1); @@ -1774,7 +1774,7 @@ void ReorderParticleSystems::onEnter() // additive - particleSystem->setPosition(Vec2(i*10+120 ,200)); + particleSystem->setPosition(Vec2(i*10+120.0f,200.0f)); _batchNode->addChild(particleSystem); diff --git a/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp b/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp index 06c447458a..4010999fcc 100644 --- a/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp +++ b/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp @@ -249,7 +249,7 @@ Sprite* PhysicsDemo::makeTriangle(Vec2 point, Size size, int color, PhysicsMater triangle->setScaleY(size.height / 43.5f); } - Vec2 vers[] = { Vec2(0, triangle->getContentSize().height / 2), Vec2(triangle->getContentSize().width / 2, -triangle->getContentSize().height / 2), Vec2(-triangle->getContentSize().width / 2, -triangle->getContentSize().height / 2) }; + Vec2 vers[] = { Vec2(0.0f, triangle->getContentSize().height / 2), Vec2(triangle->getContentSize().width / 2, -triangle->getContentSize().height / 2), Vec2(-triangle->getContentSize().width / 2, -triangle->getContentSize().height / 2) }; triangle->addComponent(PhysicsBody::createPolygon(vers, 3, material)); triangle->setPosition(Vec2(point.x, point.y)); @@ -318,7 +318,7 @@ void PhysicsDemoLogoSmash::onEnter() { PhysicsDemo::onEnter(); - _physicsWorld->setGravity(Vec2(0, 0)); + _physicsWorld->setGravity(Vec2(0.0f, 0.0f)); _physicsWorld->setUpdateRate(5.0f); _ball = SpriteBatchNode::create("Images/ball.png", sizeof(LOGO_IMAGE)/sizeof(LOGO_IMAGE[0])); @@ -346,10 +346,10 @@ void PhysicsDemoLogoSmash::onEnter() } - auto bullet = makeBall(Vec2(400, 0), 10, PhysicsMaterial(PHYSICS_INFINITY, 0, 0)); - bullet->getPhysicsBody()->setVelocity(Vec2(200, 0)); + auto bullet = makeBall(Vec2(400.0f, 0.0f), 10, PhysicsMaterial(PHYSICS_INFINITY, 0, 0)); + bullet->getPhysicsBody()->setVelocity(Vec2(200.0f, 0.0f)); - bullet->setPosition(Vec2(-500, VisibleRect::getVisibleRect().size.height/2)); + bullet->setPosition(Vec2(-500.0f, VisibleRect::getVisibleRect().size.height/2)); _ball->addChild(bullet); } @@ -432,8 +432,8 @@ void PhysicsDemoPyramidStack::onEnter() _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); auto node = Node::create(); - node->addComponent(PhysicsBody::createEdgeSegment(VisibleRect::leftBottom() + Vec2(0, 50), - VisibleRect::rightBottom() + Vec2(0, 50))); + node->addComponent(PhysicsBody::createEdgeSegment(VisibleRect::leftBottom() + Vec2(0.0f, 50.0f), + VisibleRect::rightBottom() + Vec2(0.0f, 50.0f))); this->addChild(node); auto ball = Sprite::create("Images/ball.png"); @@ -442,7 +442,7 @@ void PhysicsDemoPyramidStack::onEnter() auto body = PhysicsBody::createCircle(10); ball->addComponent(body); body->setTag(DRAG_BODYS_TAG); - ball->setPosition(VisibleRect::bottom() + Vec2(0, 60)); + ball->setPosition(VisibleRect::bottom() + Vec2(0.0f, 60.0f)); this->addChild(ball); scheduleOnce(CC_SCHEDULE_SELECTOR(PhysicsDemoPyramidStack::updateOnce), 3.0); @@ -486,8 +486,8 @@ void PhysicsDemoRayCast::onEnter() _physicsWorld->setGravity(Point::ZERO); auto node = DrawNode::create(); - node->addComponent(PhysicsBody::createEdgeSegment(VisibleRect::leftBottom() + Vec2(0, 50), VisibleRect::rightBottom() + Vec2(0, 50))); - node->drawSegment(VisibleRect::leftBottom() + Vec2(0, 50), VisibleRect::rightBottom() + Vec2(0, 50), 1, STATIC_COLOR); + node->addComponent(PhysicsBody::createEdgeSegment(VisibleRect::leftBottom() + Vec2(0.0f, 50.0f), VisibleRect::rightBottom() + Vec2(0.0f, 50.0f))); + node->drawSegment(VisibleRect::leftBottom() + Vec2(0.0f, 50.0f), VisibleRect::rightBottom() + Vec2(0.0f, 50.0f), 1, STATIC_COLOR); this->addChild(node); MenuItemFont::setFontSize(18); @@ -664,9 +664,9 @@ void PhysicsDemoActions::onEnter() this->addChild(node); Sprite* sp1 = addGrossiniAtPosition(VisibleRect::center()); - Sprite* sp2 = addGrossiniAtPosition(VisibleRect::left() + Vec2(50, 0)); - Sprite* sp3 = addGrossiniAtPosition(VisibleRect::right() - Vec2(20, 0)); - Sprite* sp4 = addGrossiniAtPosition(VisibleRect::leftTop() + Vec2(50, -50)); + Sprite* sp2 = addGrossiniAtPosition(VisibleRect::left() + Vec2(50.0f, 0.0f)); + Sprite* sp3 = addGrossiniAtPosition(VisibleRect::right() - Vec2(20.0f, 0.0f)); + Sprite* sp4 = addGrossiniAtPosition(VisibleRect::leftTop() + Vec2(50.0f, -50.0f)); sp4->getPhysicsBody()->setGravityEnable(false); sp1->getPhysicsBody()->setTag(DRAG_BODYS_TAG); @@ -746,11 +746,11 @@ void PhysicsDemoJoints::onEnter() case 1: { - auto sp1 = makeBall(offset - Vec2(30, 0), 10); + auto sp1 = makeBall(offset - Vec2(30.0f, 0.0f), 10); auto sp1PhysicsBody = sp1->getPhysicsBody(); sp1PhysicsBody->setTag(DRAG_BODYS_TAG); - auto sp2 = makeBox(offset + Vec2(30, 0), Size(30, 10)); + auto sp2 = makeBox(offset + Vec2(30.0f, 0.0f), Size(30.0f, 10.0f)); auto sp2PhysicsBody = sp2->getPhysicsBody(); sp2PhysicsBody->setTag(DRAG_BODYS_TAG); @@ -763,11 +763,11 @@ void PhysicsDemoJoints::onEnter() } case 2: { - auto sp1 = makeBall(offset - Vec2(30, 0), 10); + auto sp1 = makeBall(offset - Vec2(30.0f, 0.0f), 10); auto sp1PhysicsBody = sp1->getPhysicsBody(); sp1PhysicsBody->setTag(DRAG_BODYS_TAG); - auto sp2 = makeBox(offset + Vec2(30, 0), Size(30, 10)); + auto sp2 = makeBox(offset + Vec2(30.0f, 0.0f), Size(30.0f, 10.0f)); auto sp2PhysicsBody = sp2->getPhysicsBody(); sp2PhysicsBody->setTag(DRAG_BODYS_TAG); @@ -780,11 +780,11 @@ void PhysicsDemoJoints::onEnter() } case 3: { - auto sp1 = makeBall(offset - Vec2(30, 0), 10); + auto sp1 = makeBall(offset - Vec2(30.0f, 0.0f), 10); auto sp1PhysicsBody = sp1->getPhysicsBody(); sp1PhysicsBody->setTag(DRAG_BODYS_TAG); - auto sp2 = makeBox(offset + Vec2(30, 0), Size(30, 10)); + auto sp2 = makeBox(offset + Vec2(30.0f, 0.0f), Size(30.0f, 10.0f)); auto sp2PhysicsBody = sp2->getPhysicsBody(); sp2PhysicsBody->setTag(DRAG_BODYS_TAG); @@ -797,11 +797,11 @@ void PhysicsDemoJoints::onEnter() } case 4: { - auto sp1 = makeBall(offset - Vec2(30, 0), 10); + auto sp1 = makeBall(offset - Vec2(30.0f, 0.0f), 10); auto sp1PhysicsBody = sp1->getPhysicsBody(); sp1PhysicsBody->setTag(DRAG_BODYS_TAG); - auto sp2 = makeBox(offset + Vec2(30, 0), Size(30, 10)); + auto sp2 = makeBox(offset + Vec2(30.0f, 0.0f), Size(30.0f, 10.0f)); auto sp2PhysicsBody = sp2->getPhysicsBody(); sp2PhysicsBody->setTag(DRAG_BODYS_TAG); @@ -814,15 +814,15 @@ void PhysicsDemoJoints::onEnter() } case 5: { - auto sp1 = makeBall(offset - Vec2(30, 0), 10); + auto sp1 = makeBall(offset - Vec2(30.0f, 0.0f), 10); auto sp1PhysicsBody = sp1->getPhysicsBody(); sp1PhysicsBody->setTag(DRAG_BODYS_TAG); - auto sp2 = makeBox(offset + Vec2(30, 0), Size(30, 10)); + auto sp2 = makeBox(offset + Vec2(30.0f, 0.0f), Size(30.0f, 10.0f)); auto sp2PhysicsBody = sp2->getPhysicsBody(); sp2PhysicsBody->setTag(DRAG_BODYS_TAG); - PhysicsJointGroove* joint = PhysicsJointGroove::construct(sp1PhysicsBody, sp2PhysicsBody, Vec2(30, 15), Vec2(30, -15), Vec2(-30, 0)); + PhysicsJointGroove* joint = PhysicsJointGroove::construct(sp1PhysicsBody, sp2PhysicsBody, Vec2(30.0f, 15.0f), Vec2(30.0f, -15.0f), Vec2(-30.0f, 0.0f)); getPhysicsWorld()->addJoint(joint); this->addChild(sp1); @@ -831,11 +831,11 @@ void PhysicsDemoJoints::onEnter() } case 6: { - auto sp1 = makeBox(offset - Vec2(30, 0), Size(30, 10)); + auto sp1 = makeBox(offset - Vec2(30.0f, 0.0f), Size(30.0f, 10.0f)); auto sp1PhysicsBody = sp1->getPhysicsBody(); sp1PhysicsBody->setTag(DRAG_BODYS_TAG); - auto sp2 = makeBox(offset + Vec2(30, 0), Size(30, 10)); + auto sp2 = makeBox(offset + Vec2(30.0f, 0.0f), Size(30.0f, 10.0f)); auto sp2PhysicsBody = sp2->getPhysicsBody(); sp2PhysicsBody->setTag(DRAG_BODYS_TAG); @@ -850,11 +850,11 @@ void PhysicsDemoJoints::onEnter() } case 7: { - auto sp1 = makeBox(offset - Vec2(30, 0), Size(30, 10)); + auto sp1 = makeBox(offset - Vec2(30.0f, 0.0f), Size(30.0f, 10.0f)); auto sp1PhysicsBody = sp1->getPhysicsBody(); sp1PhysicsBody->setTag(DRAG_BODYS_TAG); - auto sp2 = makeBox(offset + Vec2(30, 0), Size(30, 10)); + auto sp2 = makeBox(offset + Vec2(30.0f, 0.0f), Size(30.0f, 10.0f)); auto sp2PhysicsBody = sp2->getPhysicsBody(); sp2PhysicsBody->setTag(DRAG_BODYS_TAG); @@ -869,11 +869,11 @@ void PhysicsDemoJoints::onEnter() } case 8: { - auto sp1 = makeBox(offset - Vec2(30, 0), Size(30, 10)); + auto sp1 = makeBox(offset - Vec2(30.0f, 0.0f), Size(30.0f, 10.0f)); auto sp1PhysicsBody = sp1->getPhysicsBody(); sp1PhysicsBody->setTag(DRAG_BODYS_TAG); - auto sp2 = makeBox(offset + Vec2(30, 0), Size(30, 10)); + auto sp2 = makeBox(offset + Vec2(30.0f, 0.0f), Size(30.0f, 10.0f)); auto sp2PhysicsBody = sp2->getPhysicsBody(); sp2PhysicsBody->setTag(DRAG_BODYS_TAG); @@ -888,11 +888,11 @@ void PhysicsDemoJoints::onEnter() } case 9: { - auto sp1 = makeBox(offset - Vec2(30, 0), Size(30, 10)); + auto sp1 = makeBox(offset - Vec2(30.0f, 0.0f), Size(30.0f, 10.0f)); auto sp1PhysicsBody = sp1->getPhysicsBody(); sp1PhysicsBody->setTag(DRAG_BODYS_TAG); - auto sp2 = makeBox(offset + Vec2(30, 0), Size(30, 10)); + auto sp2 = makeBox(offset + Vec2(30.0f, 0.0f), Size(30.0f, 10.0f)); auto sp2PhysicsBody = sp2->getPhysicsBody(); sp2PhysicsBody->setTag(DRAG_BODYS_TAG); @@ -907,11 +907,11 @@ void PhysicsDemoJoints::onEnter() } case 10: { - auto sp1 = makeBox(offset - Vec2(30, 0), Size(30, 10)); + auto sp1 = makeBox(offset - Vec2(30.0f, 0.0f), Size(30.0f, 10.0f)); auto sp1PhysicsBody = sp1->getPhysicsBody(); sp1PhysicsBody->setTag(DRAG_BODYS_TAG); - auto sp2 = makeBox(offset + Vec2(30, 0), Size(30, 10)); + auto sp2 = makeBox(offset + Vec2(30.0f, 0.0f), Size(30.0f, 10.0f)); auto sp2PhysicsBody = sp2->getPhysicsBody(); sp2PhysicsBody->setTag(DRAG_BODYS_TAG); @@ -971,7 +971,7 @@ void PhysicsDemoPump::onEnter() // balls for (int i = 0; i < 6; ++i) { - auto ball = makeBall(VisibleRect::leftTop() + Vec2(75 + CCRANDOM_0_1() * 90, 0), 22, PhysicsMaterial(0.05f, 0.0f, 0.1f)); + auto ball = makeBall(VisibleRect::leftTop() + Vec2(75 + CCRANDOM_0_1() * 90, 0.0f), 22, PhysicsMaterial(0.05f, 0.0f, 0.1f)); ball->getPhysicsBody()->setTag(DRAG_BODYS_TAG); addChild(ball); } @@ -1001,18 +1001,18 @@ void PhysicsDemoPump::onEnter() sgearBody->setTag(1); auto sgear = Node::create(); sgear->addComponent(sgearBody); - sgear->setPosition(VisibleRect::leftBottom() + Vec2(125, 0)); + sgear->setPosition(VisibleRect::leftBottom() + Vec2(125.0f, 0.0f)); this->addChild(sgear); _physicsWorld->addJoint(PhysicsJointPin::construct(nodeBody, sgearBody, sgear->getPosition())); - _physicsWorld->addJoint(PhysicsJointDistance::construct(pumpBody, sgearBody, Vec2(0, 0), Vec2(0, -44))); + _physicsWorld->addJoint(PhysicsJointDistance::construct(pumpBody, sgearBody, Vec2(0.0f, 0.0f), Vec2(0.0f, -44.0f))); // big gear auto bgearBody = PhysicsBody::createCircle(100); bgearBody->setCategoryBitmask(0x04); auto bgear = Node::create(); bgear->addComponent(bgearBody); - bgear->setPosition(VisibleRect::leftBottom() + Vec2(275, 0)); + bgear->setPosition(VisibleRect::leftBottom() + Vec2(275.0f, 0.0f)); this->addChild(bgear); _physicsWorld->addJoint(PhysicsJointPin::construct(bgearBody, nodeBody, bgear->getPosition())); @@ -1035,8 +1035,8 @@ void PhysicsDemoPump::onEnter() this->addChild(plugger); sgearBody->setCollisionBitmask(0x04 | 0x01); - _physicsWorld->addJoint(PhysicsJointPin::construct(nodeBody, pluggerBody, VisibleRect::leftBottom() + Vec2(75, -90))); - _physicsWorld->addJoint(PhysicsJointDistance::construct(pluggerBody, sgearBody, Vec2::ZERO, Vec2(44, 0))); + _physicsWorld->addJoint(PhysicsJointPin::construct(nodeBody, pluggerBody, VisibleRect::leftBottom() + Vec2(75.0f, -90.0f))); + _physicsWorld->addJoint(PhysicsJointDistance::construct(pluggerBody, sgearBody, Vec2::ZERO, Vec2(44.0f, 0.0f))); } void PhysicsDemoPump::update(float delta) @@ -1047,10 +1047,10 @@ void PhysicsDemoPump::update(float delta) { if (body->getNode()!=nullptr) { - body->getNode()->setPosition(VisibleRect::leftTop() + Vec2(75 + CCRANDOM_0_1() * 90, 0)); + body->getNode()->setPosition(VisibleRect::leftTop() + Vec2(75 + CCRANDOM_0_1() * 90, 0.0f)); } - body->setVelocity(Vec2(0, 0)); + body->setVelocity(Vec2(0.0f, 0.0f)); } } @@ -1115,19 +1115,19 @@ void PhysicsDemoOneWayPlatform::onEnter() _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); auto ground = Node::create(); - ground->addComponent(PhysicsBody::createEdgeSegment(VisibleRect::leftBottom() + Vec2(0, 50), - VisibleRect::rightBottom() + Vec2(0, 50))); + ground->addComponent(PhysicsBody::createEdgeSegment(VisibleRect::leftBottom() + Vec2(0.0f, 50.0f), + VisibleRect::rightBottom() + Vec2(0.0f, 50.0f))); this->addChild(ground); - auto platform = makeBox(VisibleRect::center(), Size(200, 50)); + auto platform = makeBox(VisibleRect::center(), Size(200.0f, 50.0f)); auto platformBody = platform->getPhysicsBody(); platformBody->setDynamic(false); platformBody->setContactTestBitmask(0xFFFFFFFF); this->addChild(platform); - auto ball = makeBall(VisibleRect::center() - Vec2(0, 50), 20); + auto ball = makeBall(VisibleRect::center() - Vec2(0.0f, 50.0f), 20); auto ballBody = ball->getPhysicsBody(); - ballBody->setVelocity(Vec2(0, 150)); + ballBody->setVelocity(Vec2(0.0f, 150.0f)); ballBody->setTag(DRAG_BODYS_TAG); ballBody->setMass(1.0f); ballBody->setContactTestBitmask(0xFFFFFFFF); @@ -1161,11 +1161,11 @@ void PhysicsDemoSlice::onEnter() _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); auto ground = Node::create(); - ground->addComponent(PhysicsBody::createEdgeSegment(VisibleRect::leftBottom() + Vec2(0, 50), VisibleRect::rightBottom() + Vec2(0, 50))); + ground->addComponent(PhysicsBody::createEdgeSegment(VisibleRect::leftBottom() + Vec2(0, 50), VisibleRect::rightBottom() + Vec2(0.0f, 50.0f))); this->addChild(ground); auto box = Node::create(); - Vec2 points[4] = {Vec2(-100, -100), Vec2(-100, 100), Vec2(100, 100), Vec2(100, -100)}; + Vec2 points[4] = {Vec2(-100.0f, -100.0f), Vec2(-100.0f, 100.0f), Vec2(100.0f, 100.0f), Vec2(100.0f, -100.0f)}; box->addComponent(PhysicsBody::createPolygon(points, 4)); box->setPosition(VisibleRect::center()); box->getPhysicsBody()->setTag(_sliceTag); @@ -1259,11 +1259,11 @@ void PhysicsDemoBug3988::onEnter() _physicsWorld->setGravity(Vec2::ZERO); auto ball = Sprite::create("Images/YellowSquare.png"); - ball->setPosition(VisibleRect::center() - Vec2(100, 0)); + ball->setPosition(VisibleRect::center() - Vec2(100.0f, 0.0f)); ball->setRotation(30.0f); this->addChild(ball); - auto physicsBall = makeBox(VisibleRect::center() + Vec2(100, 0), Size(100, 100)); + auto physicsBall = makeBox(VisibleRect::center() + Vec2(100.0f, 0.0f), Size(100.0f, 100.0f)); physicsBall->setRotation(30.0f); this->addChild(physicsBall); } @@ -1455,7 +1455,7 @@ void PhysicsContactTest::resetTest() position.x = position.x * CCRANDOM_0_1(); position.y = position.y * CCRANDOM_0_1(); position = VisibleRect::leftBottom() + position + Vec2(size.width / 2, size.height / 2); - Vec2 velocity((CCRANDOM_0_1() - 0.5) * 200, (CCRANDOM_0_1() - 0.5) * 200); + Vec2 velocity((float)(CCRANDOM_0_1() - 0.5) * 200, (float)(CCRANDOM_0_1() - 0.5) * 200); auto box = makeBox(position, size, 1, PhysicsMaterial(0.1f, 1, 0.0f)); auto boxBody = box->getPhysicsBody(); boxBody->setVelocity(velocity); @@ -1474,7 +1474,7 @@ void PhysicsContactTest::resetTest() position.x = position.x * CCRANDOM_0_1(); position.y = position.y * CCRANDOM_0_1(); position = VisibleRect::leftBottom() + position + Vec2(size.width / 2, size.height / 2); - Vec2 velocity((CCRANDOM_0_1() - 0.5) * 200, (CCRANDOM_0_1() - 0.5) * 200); + Vec2 velocity((float)(CCRANDOM_0_1() - 0.5) * 200, (float)(CCRANDOM_0_1() - 0.5) * 200); auto box = makeBox(position, size, 2, PhysicsMaterial(0.1f, 1, 0.0f)); auto boxBody = box->getPhysicsBody(); boxBody->setVelocity(velocity); @@ -1493,7 +1493,7 @@ void PhysicsContactTest::resetTest() position.x = position.x * CCRANDOM_0_1(); position.y = position.y * CCRANDOM_0_1(); position = VisibleRect::leftBottom() + position + Vec2(size.width / 2, size.height / 2); - Vec2 velocity((CCRANDOM_0_1() - 0.5) * 300, (CCRANDOM_0_1() - 0.5) * 300); + Vec2 velocity((float)(CCRANDOM_0_1() - 0.5) * 300, (float)(CCRANDOM_0_1() - 0.5) * 300); auto triangle = makeTriangle(position, size, 1, PhysicsMaterial(0.1f, 1, 0.0f)); auto triangleBody = triangle->getPhysicsBody(); triangleBody->setVelocity(velocity); @@ -1512,7 +1512,7 @@ void PhysicsContactTest::resetTest() position.x = position.x * CCRANDOM_0_1(); position.y = position.y * CCRANDOM_0_1(); position = VisibleRect::leftBottom() + position + Vec2(size.width / 2, size.height / 2); - Vec2 velocity((CCRANDOM_0_1() - 0.5) * 300, (CCRANDOM_0_1() - 0.5) * 300); + Vec2 velocity((float)(CCRANDOM_0_1() - 0.5) * 300, (float)(CCRANDOM_0_1() - 0.5) * 300); auto triangle = makeTriangle(position, size, 2, PhysicsMaterial(0.1f, 1, 0.0f)); auto triangleBody = triangle->getPhysicsBody(); triangleBody->setVelocity(velocity); @@ -1846,12 +1846,12 @@ void PhysicsTransformTest::onEnter() auto bullet = Sprite::create("Images/ball.png"); bullet->setPosition(200, 200); bullet->addComponent(PhysicsBody::createCircle(bullet->getContentSize().width/2, PhysicsMaterial(0.1f, 1.0f, 0.0f))); - bullet->getPhysicsBody()->setVelocity(Vec2(100, 100)); + bullet->getPhysicsBody()->setVelocity(Vec2(100.0f, 100.0f)); _rootLayer->addChild(bullet); - MoveBy* move = MoveBy::create(2.0f, Vec2(100, 100)); - MoveBy* move2 = MoveBy::create(2.0f, Vec2(-200, 0)); - MoveBy* move3 = MoveBy::create(2.0f, Vec2(100, -100)); + MoveBy* move = MoveBy::create(2.0f, Vec2(100.0f, 100.0f)); + MoveBy* move2 = MoveBy::create(2.0f, Vec2(-200.0f, 0.0f)); + MoveBy* move3 = MoveBy::create(2.0f, Vec2(100.0f, -100.0f)); ScaleTo* scale = ScaleTo::create(3.0f, 0.3f); ScaleTo* scale2 = ScaleTo::create(3.0f, 1.0f); diff --git a/tests/cpp-tests/Classes/RenderTextureTest/RenderTextureTest.cpp b/tests/cpp-tests/Classes/RenderTextureTest/RenderTextureTest.cpp index 4cbcfa31bf..0847ef2ab4 100644 --- a/tests/cpp-tests/Classes/RenderTextureTest/RenderTextureTest.cpp +++ b/tests/cpp-tests/Classes/RenderTextureTest/RenderTextureTest.cpp @@ -105,7 +105,7 @@ void RenderTextureSave::saveImageWithPremultipliedAlpha(cocos2d::Ref* sender) auto sprite = Sprite::create(path); addChild(sprite); sprite->setScale(0.3f); - sprite->setPosition(Vec2(40, 40)); + sprite->setPosition(Vec2(40.0f, 40.0f)); sprite->setRotation(counter * 3); _target->release(); }; @@ -131,7 +131,7 @@ void RenderTextureSave::saveImageWithNonPremultipliedAlpha(cocos2d::Ref *sender) auto sprite = Sprite::create(path); addChild(sprite); sprite->setScale(0.3f); - sprite->setPosition(Vec2(40, 40)); + sprite->setPosition(Vec2(40.0f, 40.0f)); sprite->setRotation(counter * 3); rt->release(); }; @@ -456,7 +456,7 @@ RenderTexturePartTest::RenderTexturePartTest() _rend->end(); _spriteDraw = Sprite::createWithTexture(_rend->getSprite()->getTexture()); - FiniteTimeAction* baseAction = MoveBy::create(1, Vec2(size.width,0)); + FiniteTimeAction* baseAction = MoveBy::create(1, Vec2(size.width,0.0f)); _spriteDraw->setPosition(0,size.height/2); _spriteDraw->setScaleY(-1); _spriteDraw->runAction(RepeatForever::create(Sequence::create @@ -487,15 +487,15 @@ RenderTextureTestDepthStencil::RenderTextureTestDepthStencil() _spriteDS = Sprite::create("Images/fire.png"); _spriteDS->retain(); - _spriteDS->setPosition(Vec2(s.width * 0.25f, 0)); + _spriteDS->setPosition(Vec2(s.width * 0.25f, 0.0f)); _spriteDS->setScale(10); _spriteDraw = Sprite::create("Images/fire.png"); _spriteDraw->retain(); - _spriteDraw->setPosition(Vec2(s.width * 0.25f, 0)); + _spriteDraw->setPosition(Vec2(s.width * 0.25f, 0.0f)); _spriteDraw->setScale(10); //! move sprite half width and height, and draw only where not marked - _spriteDraw->setPosition(_spriteDraw->getPosition() + Vec2(_spriteDraw->getContentSize().width * _spriteDraw->getScale() * 0.5, _spriteDraw->getContentSize().height * _spriteDraw->getScale() * 0.5)); + _spriteDraw->setPosition(_spriteDraw->getPosition() + Vec2(_spriteDraw->getContentSize().width * _spriteDraw->getScale() * 0.5f, _spriteDraw->getContentSize().height * _spriteDraw->getScale() * 0.5f)); _rend = RenderTexture::create(s.width, s.height, backend::PixelFormat::RGBA4444, PixelFormat::D24S8); @@ -814,7 +814,7 @@ RenderTextureWithSprite3DIssue16894::RenderTextureWithSprite3DIssue16894() // Ship - Model is from cocos2d-x test project auto ship = Sprite3D::create("Sprite3DTest/boss.c3b"); ship->setScale(6); - ship->setRotation3D(Vec3(180,45,0)); + ship->setRotation3D(Vec3(180.0f,45.0f,0.0f)); ship->setPosition(Vec2(visibleSize.width/4 + origin.x, visibleSize.height/2 + origin.y)); ship->setForce2DQueue(true); ship->retain(); @@ -823,7 +823,7 @@ RenderTextureWithSprite3DIssue16894::RenderTextureWithSprite3DIssue16894() { addChild(ship, 1); //// Rotate Ship - auto spin = RotateBy::create(4, Vec3(0,180,0)); + auto spin = RotateBy::create(4, Vec3(0.0f,180.0f,0.0f)); auto repeatspin = RepeatForever::create(spin); ship->runAction(repeatspin); } @@ -845,15 +845,15 @@ RenderTextureWithSprite3DIssue16894::RenderTextureWithSprite3DIssue16894() scheduleUpdate(); auto label1 = Label::createWithTTF("Normal Sprite3D\n", "fonts/arial.ttf", 10); - label1->setPosition(Vec2(visibleSize.width/4 * 1, 60)); + label1->setPosition(Vec2(visibleSize.width/4 * 1, 60.0f)); this->addChild(label1, 1); auto label2 = Label::createWithTTF("RenderTexture\nDefault - No depth buffer", "fonts/arial.ttf", 10); - label2->setPosition(Vec2(visibleSize.width/4 * 2, 60)); + label2->setPosition(Vec2(visibleSize.width/4 * 2, 60.0f)); this->addChild(label2, 1); auto label3 = Label::createWithTTF("RenderTexture\nGL_DEPTH24_STENCIL8", "fonts/arial.ttf", 10); - label3->setPosition(Vec2(visibleSize.width/4 * 3, 60)); + label3->setPosition(Vec2(visibleSize.width/4 * 3, 60.0f)); this->addChild(label3, 1); } diff --git a/tests/cpp-tests/Classes/RotateWorldTest/RotateWorldTest.cpp b/tests/cpp-tests/Classes/RotateWorldTest/RotateWorldTest.cpp index 9f60d74239..405cf7f2be 100644 --- a/tests/cpp-tests/Classes/RotateWorldTest/RotateWorldTest.cpp +++ b/tests/cpp-tests/Classes/RotateWorldTest/RotateWorldTest.cpp @@ -81,7 +81,7 @@ void SpriteLayer::onEnter() spriteSister2->setScale(1.5f); sprite->setPosition(Vec2(x/2,y/2)); - spriteSister1->setPosition(Vec2(40,y/2)); + spriteSister1->setPosition(Vec2(40.0f,y/2)); spriteSister2->setPosition(Vec2(x-40,y/2)); auto rot = RotateBy::create(16, -3600); @@ -162,7 +162,7 @@ bool RotateWorldTest::init() auto layer = RotateWorldMainLayer::create(); addChild(layer); - runAction(RotateBy::create(4, -360)); + runAction(RotateBy::create(4.0f, -360.0f)); return true; } diff --git a/tests/cpp-tests/Classes/SceneTest/SceneTest.cpp b/tests/cpp-tests/Classes/SceneTest/SceneTest.cpp index 7e9de73e07..2b1e7375d8 100644 --- a/tests/cpp-tests/Classes/SceneTest/SceneTest.cpp +++ b/tests/cpp-tests/Classes/SceneTest/SceneTest.cpp @@ -199,7 +199,7 @@ bool SceneTestLayer3::init() auto sprite = Sprite::create(s_pathGrossini); addChild(sprite); - sprite->setPosition( Vec2(s.width/2, 40) ); + sprite->setPosition( Vec2(s.width/2, 40.0f) ); auto rotate = RotateBy::create(2, 360); auto repeat = RepeatForever::create(rotate); sprite->runAction(repeat); diff --git a/tests/cpp-tests/Classes/SchedulerTest/SchedulerTest.cpp b/tests/cpp-tests/Classes/SchedulerTest/SchedulerTest.cpp index 9831f4ffa1..d3d812dec2 100644 --- a/tests/cpp-tests/Classes/SchedulerTest/SchedulerTest.cpp +++ b/tests/cpp-tests/Classes/SchedulerTest/SchedulerTest.cpp @@ -166,7 +166,7 @@ void SchedulerPauseResumeAll::onEnter() auto sprite = Sprite::create("Images/grossinis_sister1.png"); sprite->setPosition(VisibleRect::center()); this->addChild(sprite); - sprite->runAction(RepeatForever::create(RotateBy::create(3.0, 360))); + sprite->runAction(RepeatForever::create(RotateBy::create(3.0f, 360.0f))); sprite->setTag(123); scheduleUpdate(); schedule(CC_SCHEDULE_SELECTOR(SchedulerPauseResumeAll::tick1), 0.5f); @@ -258,7 +258,7 @@ void SchedulerPauseResumeAllUser::onEnter() sprite->setPosition(Vec2(s.width/2, s.height/2)); sprite->setTag(123); this->addChild(sprite); - sprite->runAction(RepeatForever::create(RotateBy::create(3.0, 360))); + sprite->runAction(RepeatForever::create(RotateBy::create(3.0f, 360.0f))); schedule(CC_SCHEDULE_SELECTOR(SchedulerPauseResumeAllUser::tick1), 1.0f); schedule(CC_SCHEDULE_SELECTOR(SchedulerPauseResumeAllUser::tick2), 1.0f); @@ -379,7 +379,7 @@ void SchedulerUnscheduleAllHard::onEnter() auto sprite = Sprite::create("Images/grossinis_sister1.png"); sprite->setPosition(Vec2(s.width/2, s.height/2)); this->addChild(sprite); - sprite->runAction(RepeatForever::create(RotateBy::create(3.0, 360))); + sprite->runAction(RepeatForever::create(RotateBy::create(3.0f, 360.0f))); _actionManagerActive = true; @@ -451,7 +451,7 @@ void SchedulerUnscheduleAllUserLevel::onEnter() auto sprite = Sprite::create("Images/grossinis_sister1.png"); sprite->setPosition(Vec2(s.width/2, s.height/2)); this->addChild(sprite); - sprite->runAction(RepeatForever::create(RotateBy::create(3.0, 360))); + sprite->runAction(RepeatForever::create(RotateBy::create(3.0f, 360.0f))); schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAllUserLevel::tick1), 0.5f); schedule(CC_SCHEDULE_SELECTOR(SchedulerUnscheduleAllUserLevel::tick2), 1.0f); @@ -810,7 +810,7 @@ void SchedulerTimeScale::onEnter() auto s = Director::getInstance()->getWinSize(); // rotate and jump - auto jump1 = JumpBy::create(4, Vec2(-s.width+80,0), 100, 4); + auto jump1 = JumpBy::create(4, Vec2(-s.width+80,0.0f), 100, 4); auto jump2 = jump1->reverse(); auto rot1 = RotateBy::create(4, 360*2); auto rot2 = rot1->reverse(); @@ -827,9 +827,9 @@ void SchedulerTimeScale::onEnter() auto tamara = Sprite::create("Images/grossinis_sister1.png"); auto kathia = Sprite::create("Images/grossinis_sister2.png"); - grossini->setPosition(Vec2(40,80)); - tamara->setPosition(Vec2(40,80)); - kathia->setPosition(Vec2(40,80)); + grossini->setPosition(Vec2(40.0f,80.0f)); + tamara->setPosition(Vec2(40.0f,80.0f)); + kathia->setPosition(Vec2(40.0f,80.0f)); addChild(grossini); addChild(tamara); @@ -917,7 +917,7 @@ void TwoSchedulers::onEnter() // auto grossini = Sprite::create("Images/grossini.png"); addChild(grossini); - grossini->setPosition(Vec2(s.width/2,100)); + grossini->setPosition(Vec2(s.width/2,100.0f)); grossini->runAction(action->clone()); auto defaultScheduler = Director::getInstance()->getScheduler(); @@ -943,7 +943,7 @@ void TwoSchedulers::onEnter() sprite->setActionManager(actionManager1); addChild(sprite); - sprite->setPosition(Vec2(30+15*i,100)); + sprite->setPosition(Vec2(30+15*i,100.0f)); sprite->runAction(action->clone()); } @@ -968,7 +968,7 @@ void TwoSchedulers::onEnter() sprite->setActionManager(actionManager2); addChild(sprite); - sprite->setPosition(Vec2(s.width-30-15*i,100)); + sprite->setPosition(Vec2(s.width-30-15*i,100.0f)); sprite->runAction(action->clone()); } diff --git a/tests/cpp-tests/Classes/ShaderTest/ShaderTest.cpp b/tests/cpp-tests/Classes/ShaderTest/ShaderTest.cpp index e842702975..08b51ff223 100644 --- a/tests/cpp-tests/Classes/ShaderTest/ShaderTest.cpp +++ b/tests/cpp-tests/Classes/ShaderTest/ShaderTest.cpp @@ -111,7 +111,7 @@ bool ShaderNode::initWithVertex(const std::string &vert, const std::string &frag layout->setAttribute("a_position", 0, backend::VertexFormat::FLOAT2, 0, false); float w = SIZE_X, h = SIZE_Y; - Vec2 vertices[6] = { Vec2(0,0), Vec2(w,0), Vec2(w,h), Vec2(0,0), Vec2(0,h), Vec2(w,h) }; + Vec2 vertices[6] = { Vec2(0.0f,0.0f), Vec2(w,0.0f), Vec2(w,h), Vec2(0.0f,0.0f), Vec2(0.0f,h), Vec2(w,h) }; layout->setLayout(sizeof(Vec2)); /* diff --git a/tests/cpp-tests/Classes/ShaderTest/ShaderTest2.cpp b/tests/cpp-tests/Classes/ShaderTest/ShaderTest2.cpp index b56f0ea33d..ace57de939 100644 --- a/tests/cpp-tests/Classes/ShaderTest/ShaderTest2.cpp +++ b/tests/cpp-tests/Classes/ShaderTest/ShaderTest2.cpp @@ -488,15 +488,15 @@ bool EffectSpriteTest::init() auto menu = Menu::create(itemPrev, itemNext, nullptr); menu->alignItemsHorizontally(); menu->setScale(0.5); - menu->setAnchorPoint(Vec2(0,0)); - menu->setPosition(Vec2(s.width/2,70)); + menu->setAnchorPoint(Vec2(0.0f,0.0f)); + menu->setPosition(Vec2(s.width/2,70.0f)); addChild(menu); _sprite = EffectSprite::create("Images/grossini.png"); - _sprite->setPosition(Vec2(0, s.height/2)); + _sprite->setPosition(Vec2(0.0f, s.height/2)); addChild(_sprite); - auto jump = JumpBy::create(4, Vec2(s.width,0), 100, 4); + auto jump = JumpBy::create(4, Vec2(s.width,0.0f), 100, 4); auto rot = RotateBy::create(4, 720); auto spawn = Spawn::create(jump, rot, nullptr); auto rev = spawn->reverse(); @@ -549,7 +549,7 @@ bool EffectSpriteLamp::init() Mat4 mat = _sprite->getNodeToWorldTransform(); Point lightPosInLocalSpace = PointApplyAffineTransform(Vec2(pos.x, pos.y), _sprite->getWorldToNodeAffineTransform()); lampEffect->setLightColor(Color4F(1,1,1,1)); - lampEffect->setLightPos(Vec3(lightPosInLocalSpace.x, lightPosInLocalSpace.y, 50)); + lampEffect->setLightPos(Vec3(lightPosInLocalSpace.x, lightPosInLocalSpace.y, 50.0f)); lampEffect->setKBump(2); _sprite->setEffect(lampEffect); _effect = lampEffect; @@ -575,7 +575,7 @@ void EffectSpriteLamp::onTouchesBegan(const std::vector& touches, Event Vec3 pos(loc_winSpace.x,loc_winSpace.y, 50); Mat4 mat = _sprite->getNodeToWorldTransform(); Point lightPosInLocalSpace = PointApplyAffineTransform(Vec2(pos.x, pos.y), _sprite->getWorldToNodeAffineTransform()); - ((EffectNormalMapped*)_effect)->setLightPos(Vec3(lightPosInLocalSpace.x, lightPosInLocalSpace.y, 50)); + ((EffectNormalMapped*)_effect)->setLightPos(Vec3(lightPosInLocalSpace.x, lightPosInLocalSpace.y, 50.0f)); } } @@ -590,7 +590,7 @@ void EffectSpriteLamp::onTouchesMoved(const std::vector& touches, Event Vec3 pos(loc_winSpace.x,loc_winSpace.y, 50); Mat4 mat = _sprite->getNodeToWorldTransform(); Point lightPosInLocalSpace = PointApplyAffineTransform(Vec2(pos.x, pos.y), _sprite->getWorldToNodeAffineTransform()); - ((EffectNormalMapped*)_effect)->setLightPos(Vec3(lightPosInLocalSpace.x, lightPosInLocalSpace.y, 50)); + ((EffectNormalMapped*)_effect)->setLightPos(Vec3(lightPosInLocalSpace.x, lightPosInLocalSpace.y, 50.0f)); } } @@ -605,6 +605,6 @@ void EffectSpriteLamp::onTouchesEnded(const std::vector& touches, Event Vec3 pos(loc_winSpace.x,loc_winSpace.y, 50); Mat4 mat = _sprite->getNodeToWorldTransform(); Point lightPosInLocalSpace = PointApplyAffineTransform(Vec2(pos.x, pos.y), _sprite->getWorldToNodeAffineTransform()); - ((EffectNormalMapped*)_effect)->setLightPos(Vec3(lightPosInLocalSpace.x, lightPosInLocalSpace.y, 50)); + ((EffectNormalMapped*)_effect)->setLightPos(Vec3(lightPosInLocalSpace.x, lightPosInLocalSpace.y, 50.0f)); } } diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index a860d5f85c..74d7bfa53a 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -99,7 +99,7 @@ Sprite3DForceDepthTest::Sprite3DForceDepthTest() orc->setScale(5); orc->setPositionNormalized(Vec2(.5f, .3f)); orc->setPositionZ(40); - orc->setRotation3D(Vec3(0, 180, 0)); + orc->setRotation3D(Vec3(0.0f, 180.0f, 0.0f)); orc->setGlobalZOrder(-1); addChild(orc); @@ -107,8 +107,8 @@ Sprite3DForceDepthTest::Sprite3DForceDepthTest() auto ship = Sprite3D::create("Sprite3DTest/boss1.obj"); ship->setScale(5); ship->setTexture("Sprite3DTest/boss.png"); - ship->setPositionNormalized(Vec2(.5, .5)); - ship->setRotation3D(Vec3(90, 0, 0)); + ship->setPositionNormalized(Vec2(.5f, .5f)); + ship->setRotation3D(Vec3(90.0f, 0.0f, 0.0f)); ship->setForceDepthWrite(true); addChild(ship); @@ -132,7 +132,7 @@ std::string Sprite3DForceDepthTest::subtitle() const Sprite3DEmptyTest::Sprite3DEmptyTest() { auto s = Sprite3D::create(); - s->setPositionNormalized(Vec2(.5, .5)); + s->setPositionNormalized(Vec2(.5f, .5f)); auto l = Label::create(); l->setString("Test"); s->addChild(l); @@ -254,8 +254,8 @@ Sprite3DUVAnimationTest::Sprite3DUVAnimationTest() this->addChild(camera); //adjust cylinder's position & rotation - cylinder->setPosition3D(Vec3(0, -15, -50)); - cylinder->setRotation3D(Vec3(-90, 0, 0)); + cylinder->setPosition3D(Vec3(0.0f, -15.0f, -50.0f)); + cylinder->setRotation3D(Vec3(-90.0f, 0.0f, 0.0f)); //the callback function update cylinder's texcoord schedule(CC_SCHEDULE_SELECTOR(Sprite3DUVAnimationTest::cylinderUpdate)); @@ -335,12 +335,12 @@ Sprite3DFakeShadowTest::Sprite3DFakeShadowTest() //create Camera _camera = Camera::createPerspective(60, visibleSize.width / visibleSize.height, 0.1f, 200); _camera->setCameraFlag(CameraFlag::USER1); - _camera->setPosition3D(Vec3(0, 20, 25)); - _camera->setRotation3D(Vec3(-60, 0, 0)); + _camera->setPosition3D(Vec3(0.0f, 20.0f, 25.0f)); + _camera->setRotation3D(Vec3(-60.0f, 0.0f, 0.0f)); //create a plane _plane = Sprite3D::create("Sprite3DTest/plane.c3t"); - _plane->setRotation3D(Vec3(90, 0, 0)); + _plane->setRotation3D(Vec3(90.0f, 0.0f, 0.0f)); auto mat = Sprite3DMaterial::createWithFilename("Sprite3DTest/FakeShadow.material"); @@ -357,8 +357,8 @@ Sprite3DFakeShadowTest::Sprite3DFakeShadowTest() //create the orc _orc = Sprite3D::create("Sprite3DTest/orc.c3b"); _orc->setScale(0.2f); - _orc->setRotation3D(Vec3(0, 180, 0)); - _orc->setPosition3D(Vec3(0, 0, 10)); + _orc->setRotation3D(Vec3(0.0f, 180.0f, 0.0f)); + _orc->setPosition3D(Vec3(0.0f, 0.0f, 10.0f)); _targetPos = _orc->getPosition3D(); location = _state->getUniformLocation("u_target_pos"); _state->setUniform(location, &_targetPos, sizeof(_targetPos)); @@ -570,9 +570,9 @@ Sprite3DBasicToonShaderTest::Sprite3DBasicToonShaderTest() _state = mat->getTechniqueByIndex(0)->getPassByIndex(0)->getProgramState(); teapot->setMaterial(mat); - teapot->setPosition3D(Vec3(0, -5, -20)); - teapot->setRotation3D(Vec3(-90, 180, 0)); - auto rotate_action = RotateBy::create(1.5, Vec3(0, 30, 0)); + teapot->setPosition3D(Vec3(0.0f, -5.0f, -20.0f)); + teapot->setRotation3D(Vec3(-90.0f, 180.0f, 0.0f)); + auto rotate_action = RotateBy::create(1.5f, Vec3(0.0f, 30.0f, 0.0f)); teapot->runAction(RepeatForever::create(rotate_action)); addChild(teapot); addChild(_camera); @@ -619,8 +619,8 @@ Sprite3DLightMapTest::Sprite3DLightMapTest() Size visibleSize = Director::getInstance()->getVisibleSize(); _camera = Camera::createPerspective(60, visibleSize.width / visibleSize.height, 0.1f, 200); _camera->setCameraFlag(CameraFlag::USER1); - _camera->setPosition3D(Vec3(0, 25, 15)); - _camera->setRotation3D(Vec3(-35, 0, 0)); + _camera->setPosition3D(Vec3(0.0f, 25.0f, 15.0f)); + _camera->setRotation3D(Vec3(-35.0f, 0.0f, 0.0f)); auto LightMapScene = Sprite3D::create("Sprite3DTest/LightMapScene.c3b"); LightMapScene->setScale(0.1f); addChild(LightMapScene); @@ -695,18 +695,18 @@ Sprite3DHitTest::Sprite3DHitTest() //add to scene addChild(sprite1); - sprite1->runAction(RepeatForever::create(RotateBy::create(3, 360))); + sprite1->runAction(RepeatForever::create(RotateBy::create(3.0f, 360.0f))); auto sprite2 = Sprite3D::create("Sprite3DTest/boss1.obj"); sprite2->setScale(4.f); sprite2->setTexture("Sprite3DTest/boss.png"); sprite2->setPosition(Vec2(s.width / 2, s.height / 2)); - sprite2->setAnchorPoint(Vec2(0.5, 0.5)); + sprite2->setAnchorPoint(Vec2(0.5f, 0.5f)); //add to scene addChild(sprite2); - sprite2->runAction(RepeatForever::create(RotateBy::create(3, -360))); + sprite2->runAction(RepeatForever::create(RotateBy::create(3.0f, -360.0f))); // Make sprite1 touchable @@ -852,7 +852,7 @@ AsyncLoadSprite3DTest::AsyncLoadSprite3DTest() item1->setPosition(s.width * .5f, s.height * .8f); auto pMenu1 = Menu::create(item1, nullptr); - pMenu1->setPosition(Vec2(0, 0)); + pMenu1->setPosition(Vec2(0.0f, 0.0f)); this->addChild(pMenu1, 10); auto node = Node::create(); @@ -939,7 +939,7 @@ void Sprite3DWithSkinTest::addNewSpriteWithCoords(Vec2 p) std::string fileName = "Sprite3DTest/orc.c3b"; auto sprite = Sprite3D::create(fileName); sprite->setScale(3); - sprite->setRotation3D(Vec3(0, 180, 0)); + sprite->setRotation3D(Vec3(0.0f, 180.0f, 0.0f)); sprite->setPosition(Vec2(p.x, p.y)); addChild(sprite); _sprits.push_back(sprite); @@ -1057,7 +1057,7 @@ void Sprite3DWithSkinOutlineTest::addNewSpriteWithCoords(Vec2 p) sprite->setMaterial(material); sprite->setScale(3); - sprite->setRotation3D(Vec3(0, 180, 0)); + sprite->setRotation3D(Vec3(0.0f, 180.0f, 0.0f)); addChild(sprite); sprite->setPosition(Vec2(p.x, p.y)); @@ -1254,7 +1254,7 @@ void AttachmentTest::addNewSpriteWithCoords(Vec2 p) std::string fileName = "Sprite3DTest/orc.c3b"; auto sprite = Sprite3D::create(fileName); sprite->setScale(5); - sprite->setRotation3D(Vec3(0, 180, 0)); + sprite->setRotation3D(Vec3(0.0f, 180.0f, 0.0f)); addChild(sprite); sprite->setPosition(Vec2(p.x, p.y)); @@ -1318,7 +1318,7 @@ Sprite3DReskinTest::Sprite3DReskinTest() item4->setUserData((void*)SkinType::PANTS); item5->setUserData((void*)SkinType::SHOES); auto pMenu1 = Menu::create(item1, item2, item3, item4, item5, nullptr); - pMenu1->setPosition(Vec2(0, 0)); + pMenu1->setPosition(Vec2(0.0f, 0.0f)); this->addChild(pMenu1, 10); } @@ -1346,7 +1346,7 @@ void Sprite3DReskinTest::addNewSpriteWithCoords(Vec2 p) std::string fileName = "Sprite3DTest/ReskinGirl.c3b"; auto sprite = Sprite3D::create(fileName); sprite->setScale(4); - sprite->setRotation3D(Vec3(0, 0, 0)); + sprite->setRotation3D(Vec3(0.0f, 0.0f, 0.0f)); addChild(sprite); sprite->setPosition(Vec2(p.x, p.y - 60)); auto animation = Animation3D::create(fileName); @@ -1686,7 +1686,7 @@ void Sprite3DMirrorTest::addNewSpriteWithCoords(Vec2 p) std::string fileName = "Sprite3DTest/orc.c3b"; auto sprite = Sprite3D::create(fileName); sprite->setScale(5); - sprite->setRotation3D(Vec3(0, 180, 0)); + sprite->setRotation3D(Vec3(0.0f, 180.0f, 0.0f)); addChild(sprite); sprite->setPosition(Vec2(p.x - 80, p.y)); @@ -1709,7 +1709,7 @@ void Sprite3DMirrorTest::addNewSpriteWithCoords(Vec2 p) sprite->setScale(5); sprite->setScaleX(-5); sprite->setCullFace(CullFaceSide::FRONT); - sprite->setRotation3D(Vec3(0, 180, 0)); + sprite->setRotation3D(Vec3(0.0f, 180.0f, 0.0f)); addChild(sprite); sprite->setPosition(Vec2(p.x + 80, p.y)); @@ -1804,8 +1804,8 @@ UseCaseSprite3D::UseCaseSprite3D() auto menu = Menu::create(itemPrev, itemNext, nullptr); menu->alignItemsHorizontally(); menu->setScale(0.5); - menu->setAnchorPoint(Vec2(0, 0)); - menu->setPosition(Vec2(s.width / 2, 70)); + menu->setAnchorPoint(Vec2(0.0f, 0.0f)); + menu->setPosition(Vec2(s.width / 2, 70.0f)); _label = Label::create(); _label->setPosition(s.width * 0.5f, s.height * 0.8f); @@ -1857,7 +1857,7 @@ void UseCaseSprite3D::switchCase() circleBack->addChild(circle); circle->runAction(RepeatForever::create(RotateBy::create(3, Vec3(0.f, 0.f, 360.f)))); - circleBack->setRotation3D(Vec3(-90, -90, 0)); + circleBack->setRotation3D(Vec3(-90.0f, -90.0f, 0.0f)); auto pos = sprite->getPosition3D(); circleBack->setPosition3D(Vec3(pos.x, pos.y, pos.z - 1)); @@ -1906,7 +1906,7 @@ void UseCaseSprite3D::switchCase() item2->setPosition(Vec2(s.width * 0.5f - item1->getContentSize().width * 0.5f, s.height * 0.5f - item1->getContentSize().height * 2.f)); auto pMenu1 = Menu::create(item1, item2, nullptr); - pMenu1->setPosition(Vec2(0, 0)); + pMenu1->setPosition(Vec2(0.0f, 0.0f)); layer->addChild(pMenu1); layer->setTag(101); @@ -1991,9 +1991,9 @@ NodeAnimationTest::NodeAnimationTest() auto menu = Menu::create(itemPrev, itemNext, nullptr); menu->alignItemsHorizontally(); - menu->setScale(0.5); - menu->setAnchorPoint(Vec2(0, 0)); - menu->setPosition(Vec2(s.width / 2, 70)); + menu->setScale(0.5f); + menu->setAnchorPoint(Vec2(0.0f, 0.0f)); + menu->setPosition(Vec2(s.width / 2, 70.0f)); addChild(menu); addNewSpriteWithCoords(Vec2(s.width / 2.f, s.height / 2.f)); @@ -2014,7 +2014,7 @@ void NodeAnimationTest::addNewSpriteWithCoords(Vec2 p) // add jumping ball std::string fileName = "Sprite3DTest/ball.c3b"; auto sprite = Sprite3D::create(fileName); - sprite->setRotation3D(Vec3(0, 180, 0)); + sprite->setRotation3D(Vec3(0.0f, 180.0f, 0.0f)); sprite->setScale(3); sprite->setPosition(Vec2(s.width / 2.f, s.height / 3.f)); sprite->setTexture("Sprite3DTest/teapot.png"); @@ -2038,7 +2038,7 @@ void NodeAnimationTest::addNewSpriteWithCoords(Vec2 p) // add jumping orc fileName = "Sprite3DTest/orc_jump.c3t"; sprite = Sprite3D::create(fileName); - sprite->setRotation3D(Vec3(0, 180, 0)); + sprite->setRotation3D(Vec3(0.0f, 180.0f, 0.0f)); sprite->setScale(3); sprite->setPosition(Vec2(s.width / 2.f, s.height / 3.f)); sprite->setVisible(false); @@ -2123,10 +2123,10 @@ void Sprite3DCubeMapTest::addNewSpriteWithCoords(Vec2 p) auto cubeTexLoc = state->getUniformLocation("u_cubeTex"); state->setTexture(cubeTexLoc, 0, _textureCube->getBackendTexture()); - _teapot->setPosition3D(Vec3(0, -5, 0)); - _teapot->setRotation3D(Vec3(-90, 180, 0)); + _teapot->setPosition3D(Vec3(0.0f, -5.0f, 0.0f)); + _teapot->setRotation3D(Vec3(-90.0f, 180.0f, 0.0f)); - auto rotate_action = RotateBy::create(1.5, Vec3(0, 30, 0)); + auto rotate_action = RotateBy::create(1.5, Vec3(0.0f, 30.0f, 0.0f)); _teapot->runAction(RepeatForever::create(rotate_action)); addChild(_teapot); @@ -2206,7 +2206,7 @@ Issue9767::Issue9767() item1->setPosition(Vec2(s.width * 0.9f - item1->getContentSize().width * 0.5f, s.height * 0.5f - item1->getContentSize().height)); auto pMenu1 = Menu::create(item1, nullptr); - pMenu1->setPosition(Vec2(0, 0)); + pMenu1->setPosition(Vec2(0.0f, 0.0f)); addChild(pMenu1); } @@ -2351,7 +2351,7 @@ Sprite3DVertexColorTest::Sprite3DVertexColorTest() auto s = Director::getInstance()->getWinSize(); auto sprite = Sprite3D::create("Sprite3DTest/box_VertexCol.c3t"); - sprite->setPosition(Vec2(0, 0)); + sprite->setPosition(Vec2(0.0f, 0.0f)); sprite->setScale(1.0f); sprite->setCameraMask(2); auto mat = Sprite3DMaterial::createWithFilename("Sprite3DTest/VertexColor.material"); @@ -2405,7 +2405,7 @@ CameraBackgroundClearTest::CameraBackgroundClearTest() item1->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height*4 ) ); auto pMenu1 = Menu::create(item1, nullptr); - pMenu1->setPosition(Vec2(0,0)); + pMenu1->setPosition(Vec2(0.0f,0.0f)); this->addChild(pMenu1, 10); //setup camera @@ -2522,7 +2522,7 @@ Sprite3DNormalMappingTest::Sprite3DNormalMappingTest() { auto sprite = Sprite3D::create("Sprite3DTest/sphere.c3b"); - sprite->setPosition(Vec2(-30, 0)); + sprite->setPosition(Vec2(-30.0f, 0.0f)); sprite->setRotation3D(Vec3(90.0f, 0.0f, 0.0f)); sprite->setScale(2.0); sprite->setCameraMask(2); @@ -2535,7 +2535,7 @@ Sprite3DNormalMappingTest::Sprite3DNormalMappingTest() if (maxAttributes > 8) { auto sprite = Sprite3D::create("Sprite3DTest/sphere_bumped.c3b"); - sprite->setPosition(Vec2(30, 0)); + sprite->setPosition(Vec2(30.0f, 0.0f)); sprite->setRotation3D(Vec3(90.0f, 0.0f, 0.0f)); sprite->setScale(20.0); sprite->setCameraMask(2); @@ -2607,7 +2607,7 @@ Sprite3DPropertyTest::Sprite3DPropertyTest() _sprite = Sprite3D::create("Sprite3DTest/orc.c3b"); _sprite->setPosition(20.f, 0.f); - _sprite->setRotation3D(Vec3(0, 180, 0)); + _sprite->setRotation3D(Vec3(0.0f, 180.0f, 0.0f)); _meshTex = _sprite->getMesh()->getTexture(); _texFile = _meshTex->getPath(); addChild(_sprite); @@ -2632,7 +2632,7 @@ Sprite3DPropertyTest::Sprite3DPropertyTest() item3->setPosition(Vec2(VisibleRect::left().x + 100, VisibleRect::bottom().y + item1->getContentSize().height * 6)); auto pMenu1 = Menu::create(item1, item2, item3,nullptr); - pMenu1->setPosition(Vec2(0, 0)); + pMenu1->setPosition(Vec2(0.0f, 0.0f)); this->addChild(pMenu1, 10); scheduleUpdate(); diff --git a/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.cpp b/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.cpp index 84722b6a62..c35cff5c53 100644 --- a/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.cpp +++ b/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.cpp @@ -97,7 +97,7 @@ bool SpritePolygonTestCase::init() auto menu = Menu::create(menuItem, nullptr); menu->setPosition(Vec2::ZERO); menuItem->setAnchorPoint(Vec2::ANCHOR_TOP_LEFT); - menuItem->setPosition( VisibleRect::leftBottom() + Vec2(0, VisibleRect::leftTop().y/4)); + menuItem->setPosition( VisibleRect::leftBottom() + Vec2(0.0f, VisibleRect::leftTop().y/4)); this->addChild(menu, 9999); } return true; @@ -370,9 +370,9 @@ Sprite* SpritePolygonTestSlider::makeSprite(const std::string &filename, const V auto ttfConfig = TTFConfig("fonts/arial.ttf", 8); auto spArea = Label::createWithTTF(ttfConfig, filename+"\nVerts: "+Value((int)pinfo.getVertCount()).asString()+ "\nPixels: "+Value((int)(pinfo.getArea()/originalSize*100)).asString()+"%"); ret->addChild(spArea); - spArea->setAnchorPoint(Vec2(0,1)); + spArea->setAnchorPoint(Vec2(0.0f,1.0f)); spArea->setName(filename); - ret->setAnchorPoint(Vec2(0.5, 0)); + ret->setAnchorPoint(Vec2(0.5f, 0.0f)); updateDrawNode(); @@ -473,7 +473,7 @@ void SpritePolygonTest5::loadDefaultSprites() sprites[0]->setColor(Color3B::RED); sprites[1]->setOpacity(100); sprites[2]->setTexture(Director::getInstance()->getTextureCache()->addImage("Images/grossinis_sister1.png")); - sprites[3]->setTextureRect(Rect(0,0,100,30)); + sprites[3]->setTextureRect(Rect(0.0f,0.0f,100.0f,30.0f)); sprites[4]->setScale(0.5f, 2.0f); sprites[5]->setFlippedY(true); sprites[6]->setSkewX(60); @@ -639,7 +639,7 @@ SpritePolygonPerformanceTestDynamic::SpritePolygonPerformanceTestDynamic() Sprite* SpritePolygonPerformanceTestDynamic::makeSprite() { auto ret = Sprite::create(_pinfo); - ret->runAction(RepeatForever::create(RotateBy::create(1.0,360.0))); + ret->runAction(RepeatForever::create(RotateBy::create(1.0f,360.0f))); return ret; } @@ -660,7 +660,7 @@ void SpritePerformanceTestDynamic::initIncrementStats() Sprite* SpritePerformanceTestDynamic::makeSprite() { auto ret = Sprite::create(s_pathGrossini); - ret->runAction(RepeatForever::create(RotateBy::create(1.0,360.0))); + ret->runAction(RepeatForever::create(RotateBy::create(1.0f,360.0f))); return ret; } diff --git a/tests/cpp-tests/Classes/SpriteTest/SpriteTest.cpp b/tests/cpp-tests/Classes/SpriteTest/SpriteTest.cpp index 7f9fb93fef..63ff16fa3f 100644 --- a/tests/cpp-tests/Classes/SpriteTest/SpriteTest.cpp +++ b/tests/cpp-tests/Classes/SpriteTest/SpriteTest.cpp @@ -683,7 +683,7 @@ SpriteBatchNodeReorder::SpriteBatchNodeReorder() for(int i=0; i<10; i++) { - auto s1 = Sprite::createWithTexture(asmtest->getTexture(), Rect(0, 0, 50, 50)); + auto s1 = Sprite::createWithTexture(asmtest->getTexture(), Rect(0.0f, 0.0f, 50.0f, 50.0f)); a.pushBack(s1); asmtest->addChild(s1, 10); } @@ -806,13 +806,13 @@ SpriteBatchNodeReorderIssue766::SpriteBatchNodeReorderIssue766() addChild(batchNode, 1, 0); sprite1 = makeSpriteZ(2); - sprite1->setPosition(Vec2(200,160)); + sprite1->setPosition(Vec2(200.0f,160.0f)); sprite2 = makeSpriteZ(3); - sprite2->setPosition(Vec2(264,160)); + sprite2->setPosition(Vec2(264.0f,160.0f)); sprite3 = makeSpriteZ(4); - sprite3->setPosition(Vec2(328,160)); + sprite3->setPosition(Vec2(328.0f,160.0f)); schedule(CC_CALLBACK_1(SpriteBatchNodeReorderIssue766::reorderSprite, this), 2, "issue_766_key"); } @@ -2529,10 +2529,10 @@ SpriteBatchNodeChildren::SpriteBatchNodeChildren() sprite1->setPosition(Vec2( s.width/3, s.height/2)); auto sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png"); - sprite2->setPosition(Vec2(50,50)); + sprite2->setPosition(Vec2(50.0f,50.0f)); auto sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png"); - sprite3->setPosition(Vec2(-50,-50)); + sprite3->setPosition(Vec2(-50.0f,-50.0f)); batch->addChild(sprite1); sprite1->addChild(sprite2); @@ -2552,10 +2552,10 @@ SpriteBatchNodeChildren::SpriteBatchNodeChildren() sprite1->runAction(RepeatForever::create( Animate::create(animation) ) ); // END NEW CODE - auto action = MoveBy::create(2, Vec2(200,0)); + auto action = MoveBy::create(2, Vec2(200.0f,0.0f)); auto action_back = action->reverse(); - auto action_rot = RotateBy::create(2, 360); - auto action_s = ScaleBy::create(2, 2); + auto action_rot = RotateBy::create(2.0f, 360.0f); + auto action_s = ScaleBy::create(2.0f, 2.0f); auto action_s_back = action_s->reverse(); auto seq2 = action_rot->reverse(); @@ -2602,10 +2602,10 @@ SpriteBatchNodeChildrenZ::SpriteBatchNodeChildrenZ() sprite1->setPosition(Vec2( s.width/3, s.height/2)); sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png"); - sprite2->setPosition(Vec2(20,30)); + sprite2->setPosition(Vec2(20.0f,30.0f)); sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png"); - sprite3->setPosition(Vec2(-20,30)); + sprite3->setPosition(Vec2(-20.0f,30.0f)); batch->addChild(sprite1); sprite1->addChild(sprite2, 2); @@ -2619,10 +2619,10 @@ SpriteBatchNodeChildrenZ::SpriteBatchNodeChildrenZ() sprite1->setPosition(Vec2( 2*s.width/3, s.height/2)); sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png"); - sprite2->setPosition(Vec2(20,30)); + sprite2->setPosition(Vec2(20.0f,30.0f)); sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png"); - sprite3->setPosition(Vec2(-20,30)); + sprite3->setPosition(Vec2(-20.0f,30.0f)); batch->addChild(sprite1); sprite1->addChild(sprite2, -2); @@ -2699,19 +2699,19 @@ SpriteChildrenVisibility::SpriteChildrenVisibility() sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png"); - sprite1->setPosition(Vec2(0,0)); + sprite1->setPosition(Vec2(0.0f,0.0f)); sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png"); - sprite2->setPosition(Vec2(20,30)); + sprite2->setPosition(Vec2(20.0f,30.0f)); sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png"); - sprite3->setPosition(Vec2(-20,30)); + sprite3->setPosition(Vec2(-20.0f,30.0f)); aParent->addChild(sprite1); sprite1->addChild(sprite2, -2); sprite1->addChild(sprite3, 2); - sprite1->runAction(Blink::create(5, 10)); + sprite1->runAction(Blink::create(5.0f, 10.0f)); // // Sprite @@ -2721,19 +2721,19 @@ SpriteChildrenVisibility::SpriteChildrenVisibility() addChild(aParent, 0); sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png"); - sprite1->setPosition(Vec2(0,0)); + sprite1->setPosition(Vec2(0.0f,0.0f)); sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png"); - sprite2->setPosition(Vec2(20,30)); + sprite2->setPosition(Vec2(20.0f,30.0f)); sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png"); - sprite3->setPosition(Vec2(-20,30)); + sprite3->setPosition(Vec2(-20.0f,30.0f)); aParent->addChild(sprite1); sprite1->addChild(sprite2, -2); sprite1->addChild(sprite3, 2); - sprite1->runAction(Blink::create(5, 10)); + sprite1->runAction(Blink::create(5.0f, 10.0f)); } void SpriteChildrenVisibility::onExit() @@ -2769,13 +2769,13 @@ SpriteChildrenVisibilityIssue665::SpriteChildrenVisibilityIssue665() addChild(aParent, 0); sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png"); - sprite1->setPosition(Vec2(0,0)); + sprite1->setPosition(Vec2(0.0f,0.0f)); sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png"); - sprite2->setPosition(Vec2(20,30)); + sprite2->setPosition(Vec2(20.0f,30.0f)); sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png"); - sprite3->setPosition(Vec2(-20,30)); + sprite3->setPosition(Vec2(-20.0f,30.0f)); // test issue #665 sprite1->setVisible(false); @@ -2792,13 +2792,13 @@ SpriteChildrenVisibilityIssue665::SpriteChildrenVisibilityIssue665() addChild(aParent, 0); sprite1 = Sprite::createWithSpriteFrameName("grossini_dance_01.png"); - sprite1->setPosition(Vec2(0,0)); + sprite1->setPosition(Vec2(0.0f,0.0f)); sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png"); - sprite2->setPosition(Vec2(20,30)); + sprite2->setPosition(Vec2(20.0f,30.0f)); sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png"); - sprite3->setPosition(Vec2(-20,30)); + sprite3->setPosition(Vec2(-20.0f,30.0f)); // test issue #665 sprite1->setVisible(false); @@ -2851,13 +2851,13 @@ SpriteChildrenAnchorPoint::SpriteChildrenAnchorPoint() sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png"); - sprite2->setPosition(Vec2(20,30)); + sprite2->setPosition(Vec2(20.0f,30.0f)); sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png"); - sprite3->setPosition(Vec2(-20,30)); + sprite3->setPosition(Vec2(-20.0f,30.0f)); sprite4 = Sprite::createWithSpriteFrameName("grossini_dance_04.png"); - sprite4->setPosition(Vec2(0,0)); + sprite4->setPosition(Vec2(0.0f,0.0f)); sprite4->setScale( 0.5f ); @@ -2878,13 +2878,13 @@ SpriteChildrenAnchorPoint::SpriteChildrenAnchorPoint() sprite1->setAnchorPoint( Vec2::ANCHOR_MIDDLE ); sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png"); - sprite2->setPosition(Vec2(20,30)); + sprite2->setPosition(Vec2(20.0f,30.0f)); sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png"); - sprite3->setPosition(Vec2(-20,30)); + sprite3->setPosition(Vec2(-20.0f,30.0f)); sprite4 = Sprite::createWithSpriteFrameName("grossini_dance_04.png"); - sprite4->setPosition(Vec2(0,0)); + sprite4->setPosition(Vec2(0.0f,0.0f)); sprite4->setScale( 0.5f ); aParent->addChild(sprite1); @@ -2905,13 +2905,13 @@ SpriteChildrenAnchorPoint::SpriteChildrenAnchorPoint() sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png"); - sprite2->setPosition(Vec2(20,30)); + sprite2->setPosition(Vec2(20.0f,30.0f)); sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png"); - sprite3->setPosition(Vec2(-20,30)); + sprite3->setPosition(Vec2(-20.0f,30.0f)); sprite4 = Sprite::createWithSpriteFrameName("grossini_dance_04.png"); - sprite4->setPosition(Vec2(0,0)); + sprite4->setPosition(Vec2(0.0f,0.0f)); sprite4->setScale( 0.5f ); aParent->addChild(sprite1); @@ -2968,13 +2968,13 @@ SpriteBatchNodeChildrenAnchorPoint::SpriteBatchNodeChildrenAnchorPoint() sprite1->setAnchorPoint( Vec2::ANCHOR_BOTTOM_LEFT ); sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png"); - sprite2->setPosition(Vec2(20,30)); + sprite2->setPosition(Vec2(20.0f,30.0f)); sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png"); - sprite3->setPosition(Vec2(-20,30)); + sprite3->setPosition(Vec2(-20.0f,30.0f)); sprite4 = Sprite::createWithSpriteFrameName("grossini_dance_04.png"); - sprite4->setPosition(Vec2(0,0)); + sprite4->setPosition(Vec2(0.0f,0.0f)); sprite4->setScale( 0.5f ); aParent->addChild(sprite1); @@ -2994,13 +2994,13 @@ SpriteBatchNodeChildrenAnchorPoint::SpriteBatchNodeChildrenAnchorPoint() sprite1->setAnchorPoint( Vec2::ANCHOR_MIDDLE ); sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png"); - sprite2->setPosition(Vec2(20,30)); + sprite2->setPosition(Vec2(20.0f,30.0f)); sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png"); - sprite3->setPosition(Vec2(-20,30)); + sprite3->setPosition(Vec2(-20.0f,30.0f)); sprite4 = Sprite::createWithSpriteFrameName("grossini_dance_04.png"); - sprite4->setPosition(Vec2(0,0)); + sprite4->setPosition(Vec2(0.0f,0.0f)); sprite4->setScale( 0.5f ); aParent->addChild(sprite1); @@ -3020,13 +3020,13 @@ SpriteBatchNodeChildrenAnchorPoint::SpriteBatchNodeChildrenAnchorPoint() sprite1->setAnchorPoint( Vec2::ANCHOR_TOP_RIGHT ); sprite2 = Sprite::createWithSpriteFrameName("grossini_dance_02.png"); - sprite2->setPosition(Vec2(20,30)); + sprite2->setPosition(Vec2(20.0f,30.0f)); sprite3 = Sprite::createWithSpriteFrameName("grossini_dance_03.png"); - sprite3->setPosition(Vec2(-20,30)); + sprite3->setPosition(Vec2(-20.0f,30.0f)); sprite4 = Sprite::createWithSpriteFrameName("grossini_dance_04.png"); - sprite4->setPosition(Vec2(0,0)); + sprite4->setPosition(Vec2(0.0f,0.0f)); sprite4->setScale( 0.5f ); aParent->addChild(sprite1); @@ -3484,7 +3484,7 @@ SpriteNilTexture::SpriteNilTexture() addChild(sprite, 100); sprite = Sprite::create(); - sprite->setTextureRect(Rect(0, 0, 300,300)); + sprite->setTextureRect(Rect(0.0f, 0.0f, 300.0f,300.0f)); sprite->setColor(Color3B::BLUE); sprite->setOpacity(128); sprite->setPosition(Vec2(1*s.width/4, s.height/2)); @@ -3745,19 +3745,19 @@ SpriteBatchBug1217::SpriteBatchBug1217() { auto bn = SpriteBatchNode::create("Images/grossini_dance_atlas.png", 15); - auto s1 = Sprite::createWithTexture(bn->getTexture(), Rect(0, 0, 57, 57)); - auto s2 = Sprite::createWithTexture(bn->getTexture(), Rect(0, 0, 57, 57)); - auto s3 = Sprite::createWithTexture(bn->getTexture(), Rect(0, 0, 57, 57)); + auto s1 = Sprite::createWithTexture(bn->getTexture(), Rect(0.0f, 0.0f, 57.0f, 57.0f)); + auto s2 = Sprite::createWithTexture(bn->getTexture(), Rect(0.0f, 0.0f, 57.0f, 57.0f)); + auto s3 = Sprite::createWithTexture(bn->getTexture(), Rect(0.0f, 0.0f, 57.0f, 57.0f)); s1->setColor(Color3B(255, 0, 0)); s2->setColor(Color3B(0, 255, 0)); s3->setColor(Color3B(0, 0, 255)); - s1->setPosition(Vec2(20,200)); - s2->setPosition(Vec2(100,0)); - s3->setPosition(Vec2(100,0)); + s1->setPosition(Vec2(20.0f,200.0f)); + s2->setPosition(Vec2(100.0f,0.0f)); + s3->setPosition(Vec2(100.0f,0.0f)); - bn->setPosition(Vec2(0,0)); + bn->setPosition(Vec2(0.0f,0.0f)); //!!!!! s1->addChild(s2); @@ -4285,24 +4285,24 @@ NodeSort::NodeSort() _node = Node::create(); addChild(_node, 0, 0); - _sprite1 = Sprite::create("Images/piece.png", Rect(128, 0, 64, 64)); - _sprite1->setPosition(Vec2(100, 160)); + _sprite1 = Sprite::create("Images/piece.png", Rect(128.0f, 0.0f, 64.0f, 64.0f)); + _sprite1->setPosition(Vec2(100.0f, 160.0f)); _node->addChild(_sprite1, -6, 1); - _sprite2 = Sprite::create("Images/piece.png", Rect(128, 0, 64, 64)); - _sprite2->setPosition(Vec2(164, 160)); + _sprite2 = Sprite::create("Images/piece.png", Rect(128.0f, 0.0f, 64.0f, 64.0f)); + _sprite2->setPosition(Vec2(164.0f, 160.0f)); _node->addChild(_sprite2, -6, 2); - _sprite4 = Sprite::create("Images/piece.png", Rect(128, 0, 64, 64)); - _sprite4->setPosition(Vec2(292, 160)); + _sprite4 = Sprite::create("Images/piece.png", Rect(128.0f, 0.0f, 64.0f, 64.0f)); + _sprite4->setPosition(Vec2(292.0f, 160.0f)); _node->addChild(_sprite4, -3, 4); - _sprite3 = Sprite::create("Images/piece.png", Rect(128, 0, 64, 64)); - _sprite3->setPosition(Vec2(228, 160)); + _sprite3 = Sprite::create("Images/piece.png", Rect(128.0f, 0.0f, 64.0f, 64.0f)); + _sprite3->setPosition(Vec2(228.0f, 160.0f)); _node->addChild(_sprite3, -4, 3); - _sprite5 = Sprite::create("Images/piece.png", Rect(128, 0, 64, 64)); - _sprite5->setPosition(Vec2(356, 160)); + _sprite5 = Sprite::create("Images/piece.png", Rect(128.0f, 0.0f, 64.0f, 64.0f)); + _sprite5->setPosition(Vec2(356.0f, 160.0f)); _node->addChild(_sprite5, -3, 5); schedule(CC_CALLBACK_1(NodeSort::reorderSprite, this), "reorder_sprite_key"); @@ -4346,24 +4346,24 @@ SpriteBatchNodeReorderSameIndex::SpriteBatchNodeReorderSameIndex() _batchNode = SpriteBatchNode::create("Images/piece.png", 15); addChild(_batchNode, 1, 0); - _sprite1 = Sprite::createWithTexture(_batchNode->getTexture(), Rect(128,0,64,64)); - _sprite1->setPosition(Vec2(100,160)); + _sprite1 = Sprite::createWithTexture(_batchNode->getTexture(), Rect(128.0f,0.0f,64.0f,64.0f)); + _sprite1->setPosition(Vec2(100.0f,160.0f)); _batchNode->addChild(_sprite1, 3, 1); - _sprite2= Sprite::createWithTexture(_batchNode->getTexture(), Rect(128,0,64,64)); - _sprite2->setPosition(Vec2(164,160)); + _sprite2= Sprite::createWithTexture(_batchNode->getTexture(), Rect(128.0f,0.0f,64.0f,64.0f)); + _sprite2->setPosition(Vec2(164.0f,160.0f)); _batchNode->addChild(_sprite2, 4, 2); - _sprite3 = Sprite::createWithTexture(_batchNode->getTexture(), Rect(128,0,64,64)); - _sprite3->setPosition(Vec2(228,160)); + _sprite3 = Sprite::createWithTexture(_batchNode->getTexture(), Rect(128.0f,0.0f,64.0f,64.0f)); + _sprite3->setPosition(Vec2(228.0f,160.0f)); _batchNode->addChild(_sprite3, 4, 3); - _sprite4 = Sprite::createWithTexture(_batchNode->getTexture(), Rect(128,0,64,64)); - _sprite4->setPosition(Vec2(292,160)); + _sprite4 = Sprite::createWithTexture(_batchNode->getTexture(), Rect(128.0f,0.0f,64.0f,64.0f)); + _sprite4->setPosition(Vec2(292.0f,160.0f)); _batchNode->addChild(_sprite4, 5, 4); - _sprite5 = Sprite::createWithTexture(_batchNode->getTexture(), Rect(128,0,64,64)); - _sprite5->setPosition(Vec2(356,160)); + _sprite5 = Sprite::createWithTexture(_batchNode->getTexture(), Rect(128.0f,0.0f,64.0f,64.0f)); + _sprite5->setPosition(Vec2(356.0f,160.0f)); _batchNode->addChild(_sprite5, 6, 5); @@ -4965,13 +4965,13 @@ SpriteCullTest1::SpriteCullTest1() grossini->setPosition(s.width/2, s.height/2); - auto right = MoveBy::create(3, Vec2(s.width*2,0)); + auto right = MoveBy::create(3, Vec2(s.width*2,0.0f)); auto back1 = right->reverse(); - auto left = MoveBy::create(3, Vec2(-s.width*2,0)); + auto left = MoveBy::create(3, Vec2(-s.width*2,0.0f)); auto back2 = left->reverse(); - auto up = MoveBy::create(3, Vec2(0,s.height*2)); + auto up = MoveBy::create(3, Vec2(0.0f,s.height*2)); auto back3 = up->reverse(); - auto down = MoveBy::create(3, Vec2(0,-s.height*2)); + auto down = MoveBy::create(3, Vec2(0.0f,-s.height*2)); auto back4 = down->reverse(); auto seq = Sequence::create(right, back1, left, back2, up, back3, down, back4, nullptr); @@ -5004,13 +5004,13 @@ SpriteCullTest2::SpriteCullTest2() grossini->setPosition(s.width/2, s.height/2); - auto right = MoveBy::create(3, Vec2(s.width*2,0)); + auto right = MoveBy::create(3, Vec2(s.width*2,0.0f)); auto back1 = right->reverse(); - auto left = MoveBy::create(3, Vec2(-s.width*2,0)); + auto left = MoveBy::create(3, Vec2(-s.width*2,0.0f)); auto back2 = left->reverse(); - auto up = MoveBy::create(3, Vec2(0,s.height*2)); + auto up = MoveBy::create(3, Vec2(0.0f,s.height*2)); auto back3 = up->reverse(); - auto down = MoveBy::create(3, Vec2(0,-s.height*2)); + auto down = MoveBy::create(3, Vec2(0.0f,-s.height*2)); auto back4 = down->reverse(); grossini->setScale(0.1f); @@ -5043,18 +5043,18 @@ Sprite3DRotationTest::Sprite3DRotationTest() //Create reference sprite that's rotating based on there anchor point auto s1 = Sprite::create("Images/grossini.png"); s1->setPosition(s.width/4, s.height/4 * 3); - s1->setAnchorPoint(Vec2(0, 0)); - s1->runAction(RepeatForever::create(RotateBy::create(6, 360))); + s1->setAnchorPoint(Vec2(0.0f, 0.0f)); + s1->runAction(RepeatForever::create(RotateBy::create(6.0f, 360.0f))); addChild(s1); auto s2 = Sprite::create("Images/grossini.png"); s2->setPosition(s.width/4 * 3, s.height/4 * 3); - s2->runAction(RepeatForever::create(RotateBy::create(6, 360))); + s2->runAction(RepeatForever::create(RotateBy::create(6.0f, 360.0f))); addChild(s2); sprite1 = Sprite::create("Images/grossini.png"); sprite1->setPosition(s.width/4, s.height/4); - sprite1->setAnchorPoint(Vec2(0,0)); + sprite1->setAnchorPoint(Vec2(0.0f,0.0f)); addChild(sprite1); @@ -5125,8 +5125,8 @@ SpriteSlice9Test1::SpriteSlice9Test1() addChild(s1); s1->setPosition(s.width*1/4, s.height*i/3); s1->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT); - s1->setContentSize(Size(s1->getContentSize().width, 200)); - auto action1 = RepeatForever::create(RotateBy::create(5, 360)); + s1->setContentSize(Size(s1->getContentSize().width, 200.0f)); + auto action1 = RepeatForever::create(RotateBy::create(5.0f, 360.0f)); s1->runAction(action1); //Create reference sprite that's rotating based on there anchor point @@ -5134,8 +5134,8 @@ SpriteSlice9Test1::SpriteSlice9Test1() addChild(s2); s2->setPosition(s.width*2/4, s.height*i/3); s2->setAnchorPoint(Vec2::ANCHOR_MIDDLE); - s2->setContentSize(Size(s2->getContentSize().width, 200)); - auto action2 = RepeatForever::create(RotateBy::create(5, 360)); + s2->setContentSize(Size(s2->getContentSize().width, 200.0f)); + auto action2 = RepeatForever::create(RotateBy::create(5.0f, 360.0f)); s2->runAction(action2); //Create reference sprite that's rotating based on there anchor point @@ -5143,14 +5143,14 @@ SpriteSlice9Test1::SpriteSlice9Test1() addChild(s3); s3->setPosition(s.width*3/4, s.height*i/3); s3->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT); - s3->setContentSize(Size(s3->getContentSize().width, 200)); - auto action3 = RepeatForever::create(RotateBy::create(5, 360)); + s3->setContentSize(Size(s3->getContentSize().width, 200.0f)); + auto action3 = RepeatForever::create(RotateBy::create(5.0f, 360.0f)); s3->runAction(action3); if (i==2) { - s3->setCenterRectNormalized(Rect(0.4, 0.4, 0.2, 0.2)); - s2->setCenterRectNormalized(Rect(0.4, 0.4, 0.2, 0.2)); - s1->setCenterRectNormalized(Rect(0.4, 0.4, 0.2, 0.2)); + s3->setCenterRectNormalized(Rect(0.4f, 0.4f, 0.2f, 0.2f)); + s2->setCenterRectNormalized(Rect(0.4f, 0.4f, 0.2f, 0.2f)); + s1->setCenterRectNormalized(Rect(0.4f, 0.4f, 0.2f, 0.2f)); } // "anchor points" @@ -5190,8 +5190,8 @@ SpriteSlice9Test2::SpriteSlice9Test2() addChild(s1); s1->setPosition(s.width*1/4, s.height*i/3); s1->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT); - s1->setContentSize(Size(80, s1->getContentSize().height)); - auto action1 = RepeatForever::create(RotateBy::create(5, 360)); + s1->setContentSize(Size(80.0f, s1->getContentSize().height)); + auto action1 = RepeatForever::create(RotateBy::create(5.0f, 360.0f)); s1->runAction(action1); //Create reference sprite that's rotating based on there anchor point @@ -5199,8 +5199,8 @@ SpriteSlice9Test2::SpriteSlice9Test2() addChild(s2); s2->setPosition(s.width*2/4, s.height*i/3); s2->setAnchorPoint(Vec2::ANCHOR_MIDDLE); - s2->setContentSize(Size(80, s2->getContentSize().height)); - auto action2 = RepeatForever::create(RotateBy::create(5, 360)); + s2->setContentSize(Size(80.0f, s2->getContentSize().height)); + auto action2 = RepeatForever::create(RotateBy::create(5.0f, 360.0f)); s2->runAction(action2); //Create reference sprite that's rotating based on there anchor point @@ -5208,14 +5208,14 @@ SpriteSlice9Test2::SpriteSlice9Test2() addChild(s3); s3->setPosition(s.width*3/4, s.height*i/3); s3->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT); - s3->setContentSize(Size(80, s3->getContentSize().height)); - auto action3 = RepeatForever::create(RotateBy::create(5, 360)); + s3->setContentSize(Size(80.0f, s3->getContentSize().height)); + auto action3 = RepeatForever::create(RotateBy::create(5.0f, 360.0f)); s3->runAction(action3); if (i==2) { - s3->setCenterRectNormalized(Rect(0.4, 0.4, 0.2, 0.2)); - s2->setCenterRectNormalized(Rect(0.4, 0.4, 0.2, 0.2)); - s1->setCenterRectNormalized(Rect(0.4, 0.4, 0.2, 0.2)); + s3->setCenterRectNormalized(Rect(0.4f, 0.4f, 0.2f, 0.2f)); + s2->setCenterRectNormalized(Rect(0.4f, 0.4f, 0.2f, 0.2f)); + s1->setCenterRectNormalized(Rect(0.4f, 0.4f, 0.2f, 0.2f)); } // "anchor points" @@ -5254,7 +5254,7 @@ SpriteSlice9Test3::SpriteSlice9Test3() s1->setPosition(s.width*1/4, s.height*i/3); s1->setAnchorPoint(Vec2::ANCHOR_MIDDLE); s1->setContentSize(s1->getContentSize()); - auto action1 = RepeatForever::create(RotateBy::create(5, 360)); + auto action1 = RepeatForever::create(RotateBy::create(5.0f, 360.0f)); s1->runAction(action1); //Create reference sprite that's rotating based on there anchor point @@ -5263,7 +5263,7 @@ SpriteSlice9Test3::SpriteSlice9Test3() s2->setPosition(s.width*2/4, s.height*i/3); s2->setAnchorPoint(Vec2::ANCHOR_MIDDLE); s2->setContentSize(s2->getContentSize() * 2); - auto action2 = RepeatForever::create(RotateBy::create(5, 360)); + auto action2 = RepeatForever::create(RotateBy::create(5.0f, 360.0f)); s2->runAction(action2); //Create reference sprite that's rotating based on there anchor point @@ -5272,7 +5272,7 @@ SpriteSlice9Test3::SpriteSlice9Test3() s3->setPosition(s.width*3/4, s.height*i/3); s3->setAnchorPoint(Vec2::ANCHOR_MIDDLE); s3->setContentSize(s3->getContentSize() * 3); - auto action3 = RepeatForever::create(RotateBy::create(5, 360)); + auto action3 = RepeatForever::create(RotateBy::create(5.0f, 360.0f)); s3->runAction(action3); // enable slice 9, only in the first row @@ -5319,7 +5319,7 @@ SpriteSlice9Test4::SpriteSlice9Test4() s1->setPosition(s.width*1/4, s.height*i/3); s1->setAnchorPoint(Vec2::ANCHOR_MIDDLE); s1->setContentSize(s1->getContentSize() * 2); - auto action1 = RepeatForever::create(RotateBy::create(5, 360)); + auto action1 = RepeatForever::create(RotateBy::create(5.0f, 360.0f)); s1->runAction(action1); //Create reference sprite that's rotating based on there anchor point @@ -5328,7 +5328,7 @@ SpriteSlice9Test4::SpriteSlice9Test4() s2->setPosition(s.width*2/4, s.height*i/3); s2->setAnchorPoint(Vec2::ANCHOR_MIDDLE); s2->setContentSize(s2->getContentSize() * 3); - auto action2 = RepeatForever::create(RotateBy::create(5, 360)); + auto action2 = RepeatForever::create(RotateBy::create(5.0f, 360.0f)); s2->runAction(action2); //Create reference sprite that's rotating based on there anchor point @@ -5337,7 +5337,7 @@ SpriteSlice9Test4::SpriteSlice9Test4() s3->setPosition(s.width*3/4, s.height*i/3); s3->setAnchorPoint(Vec2::ANCHOR_MIDDLE); s3->setContentSize(s3->getContentSize() * 4); - auto action3 = RepeatForever::create(RotateBy::create(5, 360)); + auto action3 = RepeatForever::create(RotateBy::create(5.0f, 360.0f)); s3->runAction(action3); // enable slice 9, only in the first row diff --git a/tests/cpp-tests/Classes/TileMapTest/TileMapTest.cpp b/tests/cpp-tests/Classes/TileMapTest/TileMapTest.cpp index 500affd0ea..8e5bd68e29 100644 --- a/tests/cpp-tests/Classes/TileMapTest/TileMapTest.cpp +++ b/tests/cpp-tests/Classes/TileMapTest/TileMapTest.cpp @@ -147,7 +147,7 @@ TileMapTest::TileMapTest() addChild(map, 0, kTagTileMap); - map->setAnchorPoint( Vec2(0, 0.5f) ); + map->setAnchorPoint( Vec2(0.0f, 0.5f) ); auto scale = ScaleBy::create(4, 0.8f); auto scaleBack = scale->reverse(); @@ -383,7 +383,7 @@ TMXOrthoTest4::TMXOrthoTest4() child->getTexture()->setAntiAliasTexParameters(); } - map->setAnchorPoint(Vec2(0, 0)); + map->setAnchorPoint(Vec2(0.0f, 0.0f)); auto layer = map->getLayer("Layer 0"); auto s = layer->getLayerSize(); @@ -391,11 +391,11 @@ TMXOrthoTest4::TMXOrthoTest4() layer->setOpacity(128); Sprite* sprite; - sprite = layer->getTileAt(Vec2(0,0)); + sprite = layer->getTileAt(Vec2(0.0f,0.0f)); sprite->setScale(2); - sprite = layer->getTileAt(Vec2(s.width-1,0)); + sprite = layer->getTileAt(Vec2(s.width-1,0.0f)); sprite->setScale(2); - sprite = layer->getTileAt(Vec2(0,s.height-1)); + sprite = layer->getTileAt(Vec2(0.0f,s.height-1)); sprite->setScale(2); sprite = layer->getTileAt(Vec2(s.width-1,s.height-1)); sprite->setScale(2); @@ -412,10 +412,10 @@ void TMXOrthoTest4::removeSprite(float dt) auto layer = map->getLayer("Layer 0"); auto s = layer->getLayerSize(); - auto sprite = layer->getTileAt( Vec2(s.width-1,0) ); + auto sprite = layer->getTileAt( Vec2(s.width-1,0.0f) ); auto sprite2 = layer->getTileAt(Vec2(s.width-1, s.height-1)); layer->removeChild(sprite, true); - auto sprite3 = layer->getTileAt(Vec2(2, s.height-1)); + auto sprite3 = layer->getTileAt(Vec2(2.0f, s.height-1)); layer->removeChild(sprite3, true); layer->removeChild(sprite2, true); } @@ -462,7 +462,7 @@ TMXReadWriteTest::TMXReadWriteTest() tile2->setAnchorPoint( Vec2(0.5f, 0.5f) ); tile3->setAnchorPoint( Vec2(0.5f, 0.5f) ); - auto move = MoveBy::create(0.5f, Vec2(0,160)); + auto move = MoveBy::create(0.5f, Vec2(0.0f,160.0f)); auto rotate = RotateBy::create(2, 360); auto scale = ScaleBy::create(2, 5); auto opacity = FadeOut::create(2); @@ -882,7 +882,7 @@ TMXResizeTest::TMXResizeTest() { for (unsigned int x = 0; x < ls.width; x++) { - layer->setTileGID(1, Vec2( x, y ) ); + layer->setTileGID(1, Vec2( (float)x, (float)y ) ); } } } @@ -911,19 +911,19 @@ TMXIsoZorder::TMXIsoZorder() auto s = map->getContentSize(); CCLOG("ContentSize: %f, %f", s.width,s.height); - map->setPosition(Vec2(-s.width/2,0)); + map->setPosition(Vec2(-s.width/2,0.0f)); _tamara = Sprite::create(s_pathSister1); map->addChild(_tamara, (int)map->getChildren().size() ); _tamara->retain(); int mapWidth = map->getMapSize().width * map->getTileSize().width; - _tamara->setPosition(CC_POINT_PIXELS_TO_POINTS(Vec2( mapWidth/2,0))); + _tamara->setPosition(CC_POINT_PIXELS_TO_POINTS(Vec2( mapWidth/2.0f,0.0f))); _tamara->setScale(0.5); - _tamara->setAnchorPoint(Vec2(0.5f,0)); + _tamara->setAnchorPoint(Vec2(0.5f,0.0f)); - auto move = MoveBy::create(10, Vec2(300,250)); + auto move = MoveBy::create(10, Vec2(300.0f,250.0f)); auto back = move->reverse(); auto seq = Sequence::create(move, back,nullptr); _tamara->runAction( RepeatForever::create(seq) ); @@ -986,10 +986,10 @@ TMXOrthoZorder::TMXOrthoZorder() _tamara = Sprite::create(s_pathSister1); map->addChild(_tamara, (int)map->getChildren().size()); _tamara->retain(); - _tamara->setAnchorPoint(Vec2(0.5f,0)); + _tamara->setAnchorPoint(Vec2(0.5f,0.0f)); - auto move = MoveBy::create(10, Vec2(400,450)); + auto move = MoveBy::create(10, Vec2(400.0f,450.0f)); auto back = move->reverse(); auto seq = Sequence::create(move, back,nullptr); _tamara->runAction( RepeatForever::create(seq)); @@ -1042,7 +1042,7 @@ TMXIsoVertexZ::TMXIsoVertexZ() addChild(map, 0, kTagTileMap); auto s = map->getContentSize(); - map->setPosition( Vec2(-s.width/2,0) ); + map->setPosition( Vec2(-s.width/2,0.0f) ); CCLOG("ContentSize: %f, %f", s.width,s.height); // because I'm lazy, I'm reusing a tile as an sprite, but since this method uses vertexZ, you @@ -1190,7 +1190,7 @@ TMXIsoMoveLayer::TMXIsoMoveLayer() auto map = TMXTiledMap::create("TileMaps/iso-test-movelayer.tmx"); addChild(map, 0, kTagTileMap); - map->setPosition(Vec2(-700,-50)); + map->setPosition(Vec2(-700.0f,-50.0f)); Size CC_UNUSED s = map->getContentSize(); CCLOG("ContentSize: %f, %f", s.width,s.height); @@ -1451,9 +1451,9 @@ TMXBug987::TMXBug987() node->getTexture()->setAntiAliasTexParameters(); } - map->setAnchorPoint(Vec2(0, 0)); + map->setAnchorPoint(Vec2(0.0f, 0.0f)); auto layer = map->getLayer("Tile Layer 1"); - layer->setTileGID(3, Vec2(2,2)); + layer->setTileGID(3, Vec2(2.0f,2.0f)); } std::string TMXBug987::title() const diff --git a/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.cpp b/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.cpp index 727b7a316c..9bc4d113ce 100644 --- a/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.cpp +++ b/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.cpp @@ -132,7 +132,7 @@ TileMapTestNew::TileMapTestNew() addChild(map, 0, kTagTileMap); - map->setAnchorPoint( Vec2(0, 0.5f) ); + map->setAnchorPoint( Vec2(0.0f, 0.5f) ); auto scale = ScaleBy::create(4, 0.8f); auto scaleBack = scale->reverse(); @@ -316,17 +316,17 @@ TMXOrthoTest4New::TMXOrthoTest4New() Size CC_UNUSED s1 = map->getContentSize(); CCLOG("ContentSize: %f, %f", s1.width,s1.height); - map->setAnchorPoint(Vec2(0, 0)); + map->setAnchorPoint(Vec2(0.0f, 0.0f)); auto layer = map->getLayer("Layer 0"); auto s = layer->getLayerSize(); Sprite* sprite; - sprite = layer->getTileAt(Vec2(0,0)); + sprite = layer->getTileAt(Vec2(0.0f,0.0f)); sprite->setScale(2); - sprite = layer->getTileAt(Vec2(s.width-1,0)); + sprite = layer->getTileAt(Vec2(s.width-1,0.0f)); sprite->setScale(2); - sprite = layer->getTileAt(Vec2(0,s.height-1)); + sprite = layer->getTileAt(Vec2(0.0f,s.height-1)); sprite->setScale(2); sprite = layer->getTileAt(Vec2(s.width-1,s.height-1)); sprite->setScale(2); @@ -343,10 +343,10 @@ void TMXOrthoTest4New::removeSprite(float dt) auto layer = map->getLayer("Layer 0"); auto s = layer->getLayerSize(); - auto sprite = layer->getTileAt( Vec2(s.width-1,0) ); + auto sprite = layer->getTileAt( Vec2(s.width-1,0.0f) ); auto sprite2 = layer->getTileAt(Vec2(s.width-1, s.height-1)); layer->removeChild(sprite, true); - auto sprite3 = layer->getTileAt(Vec2(2, s.height-1)); + auto sprite3 = layer->getTileAt(Vec2(2.0f, s.height-1)); layer->removeChild(sprite3, true); layer->removeChild(sprite2, true); } @@ -392,7 +392,7 @@ TMXReadWriteTestNew::TMXReadWriteTestNew() tile2->setAnchorPoint( Vec2(0.5f, 0.5f) ); tile3->setAnchorPoint( Vec2(0.5f, 0.5f) ); - auto move = MoveBy::create(0.5f, Vec2(0,160)); + auto move = MoveBy::create(0.5f, Vec2(0.0f,160.0f)); auto rotate = RotateBy::create(2, 360); auto scale = ScaleBy::create(2, 5); auto opacity = FadeOut::create(2); @@ -768,7 +768,7 @@ TMXResizeTestNew::TMXResizeTestNew() { for (unsigned int x = 0; x < ls.width; x++) { - layer->setTileGID(1, Vec2( x, y ) ); + layer->setTileGID(1, Vec2((float)x, (float)y ) ); } } } @@ -797,17 +797,17 @@ TMXIsoZorderNew::TMXIsoZorderNew() auto s = map->getContentSize(); CCLOG("ContentSize: %f, %f", s.width,s.height); - map->setPosition(Vec2(-s.width/2,0)); + map->setPosition(Vec2(-s.width/2,0.0f)); _tamara = Sprite::create(s_pathSister1); map->addChild(_tamara, (int)map->getChildren().size() ); _tamara->retain(); int mapWidth = map->getMapSize().width * map->getTileSize().width; - _tamara->setPosition(CC_POINT_PIXELS_TO_POINTS(Vec2( mapWidth/2,0))); - _tamara->setAnchorPoint(Vec2(0.5f,0)); + _tamara->setPosition(CC_POINT_PIXELS_TO_POINTS(Vec2( mapWidth/2.0f,0.0f))); + _tamara->setAnchorPoint(Vec2(0.5f,0.0f)); - auto move = MoveBy::create(10, Vec2(300,250)); + auto move = MoveBy::create(10, Vec2(300.0f,250.0f)); auto back = move->reverse(); auto seq = Sequence::create(move, back,nullptr); _tamara->runAction( RepeatForever::create(seq) ); @@ -870,10 +870,10 @@ TMXOrthoZorderNew::TMXOrthoZorderNew() _tamara = Sprite::create(s_pathSister1); map->addChild(_tamara, (int)map->getChildren().size()); _tamara->retain(); - _tamara->setAnchorPoint(Vec2(0.5f,0)); + _tamara->setAnchorPoint(Vec2(0.5f,0.0f)); - auto move = MoveBy::create(10, Vec2(400,450)); + auto move = MoveBy::create(10, Vec2(400.0f,450.0f)); auto back = move->reverse(); auto seq = Sequence::create(move, back,nullptr); _tamara->runAction( RepeatForever::create(seq)); @@ -926,13 +926,13 @@ TMXIsoVertexZNew::TMXIsoVertexZNew() addChild(map, 0, kTagTileMap); auto s = map->getContentSize(); - map->setPosition( Vec2(-s.width/2,0) ); + map->setPosition( Vec2(-s.width/2,0.0f) ); CCLOG("ContentSize: %f, %f", s.width,s.height); // because I'm lazy, I'm reusing a tile as an sprite, but since this method uses vertexZ, you // can use any Sprite and it will work OK. auto layer = map->getLayer("Trees"); - _tamara = layer->getTileAt( Vec2(29,29) ); + _tamara = layer->getTileAt( Vec2(29.0f,29.0f) ); _tamara->retain(); auto move = MoveBy::create(10, Vec2(300,250) * (1/CC_CONTENT_SCALE_FACTOR())); @@ -1072,7 +1072,7 @@ TMXIsoMoveLayerNew::TMXIsoMoveLayerNew() auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/iso-test-movelayer.tmx"); addChild(map, 0, kTagTileMap); - map->setPosition(Vec2(-700,-50)); + map->setPosition(Vec2(-700.0f,-50.0f)); Size CC_UNUSED s = map->getContentSize(); CCLOG("ContentSize: %f, %f", s.width,s.height); @@ -1303,7 +1303,7 @@ TMXBug987New::TMXBug987New() Size CC_UNUSED s1 = map->getContentSize(); CCLOG("ContentSize: %f, %f", s1.width,s1.height); - map->setAnchorPoint(Vec2(0, 0)); + map->setAnchorPoint(Vec2(0.0f, 0.0f)); auto layer = map->getLayer("Tile Layer 1"); layer->setTileGID(3, Vec2(2,2)); } diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp index 0af09265f8..eadac80d4f 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp @@ -109,7 +109,7 @@ bool UIButtonTest::init() auto item1 = MenuItemLabel::create(label1, CC_CALLBACK_1(UIButtonTest::printWidgetResources, this)); item1->setPosition(Vec2(VisibleRect::left().x + 60, VisibleRect::bottom().y + item1->getContentSize().height * 3)); auto pMenu1 = Menu::create(item1, nullptr); - pMenu1->setPosition(Vec2(0, 0)); + pMenu1->setPosition(Vec2(0.0f, 0.0f)); this->addChild(pMenu1, 10); return true; @@ -198,9 +198,9 @@ bool UIButtonTest_Scale9::init() Button* button = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); // open scale9 render button->setScale9Enabled(true); - button->setContentSize(Size(150, 70)); + button->setContentSize(Size(150.0f, 70.0f)); button->setPosition(Vec2(-button->getContentSize().width - 10, widgetSize.height / 2.0f)); - auto moveBy = MoveBy::create(1.0, Vec2(widgetSize.width/2, 0)); + auto moveBy = MoveBy::create(1.0f, Vec2(widgetSize.width/2, 0.0f)); auto moveByReverse = moveBy->reverse()->clone(); button->runAction(RepeatForever::create( Sequence::create(moveBy,moveByReverse, NULL))); @@ -290,7 +290,7 @@ bool UIButtonTest_Scale9_State_Change::init() button->ignoreContentAdaptWithSize(false); button->setScale9Enabled(true); button->setPosition(Vec2(widgetSize.width / 2.0f - 100, widgetSize.height / 2.0f)); - button->setContentSize(Size(180, 60)); + button->setContentSize(Size(180.0f, 60.0f)); button->setTitleText("Hello Scale9"); button->setPressedActionEnabled(false); button->addTouchEventListener(CC_CALLBACK_2(UIButtonTest_Scale9_State_Change::touchEvent, this)); @@ -302,7 +302,7 @@ bool UIButtonTest_Scale9_State_Change::init() button2->setScale9Enabled(true); button2->setTitleText("Hello scale9"); button2->setPosition(Vec2(widgetSize.width / 2.0f + 100, widgetSize.height / 2.0f)); - button2->setContentSize(Size(180, 60)); + button2->setContentSize(Size(180.0f, 60.0f)); button2->setPressedActionEnabled(true); button2->addTouchEventListener(CC_CALLBACK_2(UIButtonTest_Scale9_State_Change::touchEvent, this)); _uiLayer->addChild(button2); @@ -387,7 +387,7 @@ bool UIButtonTest_PressedAction::init() _uiLayer->addChild(button); Button* button2 = Button::create("cocosui/animationbuttonnormal.png", "cocosui/animationbuttonpressed.png"); - button2->setPosition(button->getPosition() + Vec2(100,0)); + button2->setPosition(button->getPosition() + Vec2(100.0f,0.0f)); button2->setName("button2"); _uiLayer->addChild(button2); @@ -447,7 +447,7 @@ bool UIButtonTest_Title::init() // Add a label in which the text button events will be displayed _displayValueLabel = Text::create("No Event", "fonts/Marker Felt.ttf", 32); - _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); _uiLayer->addChild(_displayValueLabel); @@ -475,7 +475,7 @@ bool UIButtonTest_Title::init() TextBMFont *text = TextBMFont::create("BMFont", "cocosui/bitmapFontTest2.fnt"); - text->setPosition(button->getPosition() + Vec2(button->getContentSize().width/2 + 50,0)); + text->setPosition(button->getPosition() + Vec2(button->getContentSize().width/2 + 50,0.0f)); text->setColor(Color3B::YELLOW); text->setOpacity(50); text->setName("text"); @@ -485,7 +485,7 @@ bool UIButtonTest_Title::init() button2->setTitleText("BMFont"); //the change of font size will take no effect. button2->setTitleFontSize(30); - button2->setPosition(Vec2(button->getPosition() + Vec2(50,-80))); + button2->setPosition(Vec2(button->getPosition() + Vec2(50.0f,-80.0f))); this->addChild(button2); _uiLayer->addChild(text); @@ -676,7 +676,7 @@ void UIButtonTestSwitchScale9::touchEvent(Ref *pSender, Widget::TouchEventType t _displayValueLabel->setString(StringUtils::format("Touch Up")); auto btn = ((Button*)pSender); btn->setScale9Enabled(!btn->isScale9Enabled()); - btn->setContentSize(Size(200,100)); + btn->setContentSize(Size(200.0f,100.0f)); } break; @@ -825,7 +825,7 @@ bool UIButtonIgnoreContentSizeTest::init() auto button = Button::create("cocosui/animationbuttonnormal.png", "cocosui/animationbuttonpressed.png"); button->ignoreContentAdaptWithSize(false); - button->setContentSize(Size(200,100)); + button->setContentSize(Size(200.0f,100.0f)); button->setPositionNormalized(Vec2(0.3f, 0.5f)); button->setTitleText("PLAY GAME"); button->setZoomScale(0.3f); @@ -840,7 +840,7 @@ bool UIButtonIgnoreContentSizeTest::init() auto button2 = Button::create("cocosui/animationbuttonnormal.png", "cocosui/animationbuttonpressed.png"); button2->ignoreContentAdaptWithSize(false); - button2->setContentSize(Size(200,100)); + button2->setContentSize(Size(200.0f,100.0f)); button2->setPositionNormalized(Vec2(0.8f, 0.5f)); button2->setTitleText("PLAY GAME"); button2->setZoomScale(0.3f); @@ -1008,7 +1008,7 @@ bool UIButtonNormalDefaultTest::init() // open scale9 render buttonScale9->setScale9Enabled(true); buttonScale9->setPosition(Vec2(widgetSize.width / 2.0f + 50, widgetSize.height / 2.0f + 40)); - buttonScale9->setContentSize(Size(150, 70)); + buttonScale9->setContentSize(Size(150.0f, 70.0f)); buttonScale9->setPressedActionEnabled(true); _uiLayer->addChild(buttonScale9); @@ -1071,7 +1071,7 @@ bool UIButtonDisableDefaultTest::init() // open scale9 render buttonScale9->setScale9Enabled(true); buttonScale9->setPosition(Vec2(widgetSize.width / 2.0f + 50, widgetSize.height / 2.0f + 40)); - buttonScale9->setContentSize(Size(150, 70)); + buttonScale9->setContentSize(Size(150.0f, 70.0f)); buttonScale9->setPressedActionEnabled(true); buttonScale9->setEnabled(false); buttonScale9->setBright(false); @@ -1138,16 +1138,16 @@ bool UIButtonCloneTest::init() auto buttonScale9Copy = (Button*)button->clone(); - buttonScale9Copy->setPosition(button->getPosition() + Vec2(0, -60)); + buttonScale9Copy->setPosition(button->getPosition() + Vec2(0.0f, -60.0f)); buttonScale9Copy->setScale9Enabled(true); - buttonScale9Copy->setContentSize(button->getContentSize() * 1.5); + buttonScale9Copy->setContentSize(button->getContentSize() * 1.5f); this->addChild(buttonScale9Copy); auto buttonScale9Copy2 = (Button*)buttonScale9Copy->clone(); - buttonScale9Copy2->setPosition(buttonCopy->getPosition() + Vec2(0, -60)); + buttonScale9Copy2->setPosition(buttonCopy->getPosition() + Vec2(0.0f, -60.0f)); buttonScale9Copy2->setScale9Enabled(true); - buttonScale9Copy2->setContentSize(buttonCopy->getContentSize() * 1.5); + buttonScale9Copy2->setContentSize(buttonCopy->getContentSize() * 1.5f); this->addChild(buttonScale9Copy2); @@ -1278,13 +1278,13 @@ bool UIButtonScale9ChangeSpriteFrame::init() sprite->setScale9Enabled(true); sprite->setCapInsets(Rect(32, 32, 32, 32)); sprite->setContentSize(Size(96 * 1.5, 96)); - sprite->setNormalizedPosition(Vec2(0.2, 0.5)); + sprite->setNormalizedPosition(Vec2(0.2f, 0.5f)); this->addChild(sprite); auto button = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png"); button->setScale9Enabled(true); - button->setContentSize(Size(100, 50)); - button->setNormalizedPosition(Vec2(0.6, 0.5)); + button->setContentSize(Size(100.0f, 50.0f)); + button->setNormalizedPosition(Vec2(0.6f, 0.5f)); button->setTitleText("Press me"); addChild(button); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp index e1f0b09eaa..bcc85ec7e0 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp @@ -53,7 +53,7 @@ bool UICheckBoxTest::init() // Add a label in which the checkbox events will be displayed _displayValueLabel = Text::create("No Event", "fonts/Marker Felt.ttf", 32); - _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); _uiLayer->addChild(_displayValueLabel); @@ -79,7 +79,7 @@ bool UICheckBoxTest::init() auto item1 = MenuItemLabel::create(label1, CC_CALLBACK_1(UICheckBoxTest::printWidgetResources, this)); item1->setPosition(Vec2(VisibleRect::left().x + 60, VisibleRect::bottom().y + item1->getContentSize().height * 3)); auto pMenu1 = Menu::create(item1, nullptr); - pMenu1->setPosition(Vec2(0, 0)); + pMenu1->setPosition(Vec2(0.0f, 0.0f)); this->addChild(pMenu1, 10); return true; @@ -139,7 +139,7 @@ bool UICheckBoxDefaultBehaviorTest::init() // Add a label in which the checkbox events will be displayed _displayValueLabel = Text::create("No Event", "fonts/Marker Felt.ttf", 32); - _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); _uiLayer->addChild(_displayValueLabel); @@ -163,8 +163,8 @@ bool UICheckBoxDefaultBehaviorTest::init() "cocosui/check_box_active.png"); checkBox2->setPosition(Vec2(widgetSize.width / 2.0f - 150, widgetSize.height / 2.0f)); checkBox2->ignoreContentAdaptWithSize(false); - checkBox2->setZoomScale(0.5); - checkBox2->setContentSize(Size(80,80)); + checkBox2->setZoomScale(0.5f); + checkBox2->setContentSize(Size(80.0f,80.0f)); checkBox2->setName("bigCheckBox"); _uiLayer->addChild(checkBox2); @@ -208,7 +208,7 @@ bool UICheckBoxCopyTest::init() // Add a label in which the checkbox events will be displayed _displayValueLabel = Text::create("No Event", "fonts/Marker Felt.ttf", 32); - _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); _uiLayer->addChild(_displayValueLabel); @@ -227,7 +227,7 @@ bool UICheckBoxCopyTest::init() _uiLayer->addChild(checkBox); auto checkboxCopy = checkBox->clone(); - checkboxCopy->setPosition(checkBox->getPosition() + Vec2(50,0)); + checkboxCopy->setPosition(checkBox->getPosition() + Vec2(50.0f,0.0f)); _uiLayer->addChild(checkboxCopy); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIEditBoxTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIEditBoxTest.cpp index 08d00547b4..03f53b4acc 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIEditBoxTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIEditBoxTest.cpp @@ -78,7 +78,7 @@ bool UIEditBoxTest::init() "cocosui/animationbuttonpressed.png"); auto buttonSize = button->getContentSize(); button->setTitleText("Single Line"); - button->setPosition(_editName->getPosition() + Vec2(editBoxSize.width/2 + buttonSize.width/2, 0 )); + button->setPosition(_editName->getPosition() + Vec2(editBoxSize.width/2 + buttonSize.width/2, 0.0f)); button->addClickEventListener([=](Ref* ref){ _editName->setInputMode(ui::EditBox::InputMode::SINGLE_LINE); }); @@ -100,7 +100,7 @@ bool UIEditBoxTest::init() auto buttonPassword = (ui::Button*)button->clone(); buttonPassword->setTitleText("Multiline"); - buttonPassword->setPosition(_editPassword->getPosition() + Vec2(editBoxSize.width/2 + buttonSize.width/2, 0 )); + buttonPassword->setPosition(_editPassword->getPosition() + Vec2(editBoxSize.width/2 + buttonSize.width/2, 0.0f)); buttonPassword->addClickEventListener([=](Ref* ref){ _editPassword->setInputMode(ui::EditBox::InputMode::ANY); }); @@ -126,7 +126,7 @@ bool UIEditBoxTest::init() auto buttonEmail = (ui::Button*)button->clone(); buttonEmail->setTitleText("Multiline"); - buttonEmail->setPosition(_editEmailParent->getPosition() + Vec2(editBoxSize.width/2 + buttonSize.width/2, 0 )); + buttonEmail->setPosition(_editEmailParent->getPosition() + Vec2(editBoxSize.width/2 + buttonSize.width/2, 0.0f)); buttonEmail->addClickEventListener([=](Ref* ref){ _editEmail->setInputMode(ui::EditBox::InputMode::ANY); }); @@ -211,7 +211,7 @@ bool UIEditBoxTestToggleVisibility::init() "cocosui/animationbuttonpressed.png"); auto buttonSize = button->getContentSize(); button->setTitleText("Toggle Visibility"); - button->setPosition(_editName->getPosition() + Vec2(editBoxSize.width/2 + buttonSize.width/2, 0 )); + button->setPosition(_editName->getPosition() + Vec2(editBoxSize.width/2 + buttonSize.width/2, 0.0f)); button->addClickEventListener([=](Ref* ref){ _editName->setVisible(!_editName->isVisible()); }); @@ -232,7 +232,7 @@ bool UIEditBoxTestToggleVisibility::init() auto buttonPassword = (ui::Button*)button->clone(); buttonPassword->setTitleText("Toggle Visibility"); - buttonPassword->setPosition(_editPassword->getPosition() + Vec2(editBoxSize.width/2 + buttonSize.width/2, 0 )); + buttonPassword->setPosition(_editPassword->getPosition() + Vec2(editBoxSize.width/2 + buttonSize.width/2, 0.0f)); buttonPassword->addClickEventListener([=](Ref* ref){ _editPassword->setVisible(!_editPassword->isVisible()); }); @@ -258,7 +258,7 @@ bool UIEditBoxTestToggleVisibility::init() auto buttonEmail = (ui::Button*)button->clone(); buttonEmail->setTitleText("Toggle Visibility"); - buttonEmail->setPosition(_editEmailParent->getPosition() + Vec2(editBoxSize.width/2 + buttonSize.width/2, 0 )); + buttonEmail->setPosition(_editEmailParent->getPosition() + Vec2(editBoxSize.width/2 + buttonSize.width/2, 0.0f)); buttonEmail->addClickEventListener([=](Ref* ref){ _editEmail->setVisible(!_editEmail->isVisible()); }); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIFocusTest/UIFocusTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIFocusTest/UIFocusTest.cpp index fbfe0aa1cc..96d3638ce1 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIFocusTest/UIFocusTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIFocusTest/UIFocusTest.cpp @@ -95,7 +95,7 @@ bool UIFocusTestBase::init() _toggleButton = Button::create("cocosui/switch-mask.png"); _toggleButton->setTitleText("Toggle Loop"); - _toggleButton->setPosition(Vec2(60, winSize.height - 50)); + _toggleButton->setPosition(Vec2(60.0f, winSize.height - 50)); _toggleButton->setTitleColor(Color3B::RED); _toggleButton->setFocusEnabled(false); this->addChild(_toggleButton); @@ -184,7 +184,7 @@ bool UIFocusTestHorizontal::init() Size winSize = Director::getInstance()->getVisibleSize(); _horizontalLayout = HBox::create(); - _horizontalLayout->setPosition(Vec2(20, winSize.height/2 + 40)); + _horizontalLayout->setPosition(Vec2(20.0f, winSize.height/2 + 40)); _uiLayer->addChild(_horizontalLayout); _horizontalLayout->setFocused(true); @@ -500,7 +500,7 @@ bool UIFocusTestNestedLayout3::init() Size winSize = Director::getInstance()->getVisibleSize(); _verticalLayout = VBox::create(); - _verticalLayout->setPosition(Vec2(40, winSize.height - 70)); + _verticalLayout->setPosition(Vec2(40.0f, winSize.height - 70)); _uiLayer->addChild(_verticalLayout); _verticalLayout->setScale(0.8f); @@ -515,10 +515,10 @@ bool UIFocusTestNestedLayout3::init() _verticalLayout->addChild(upperHBox); LinearLayoutParameter *params = LinearLayoutParameter::create(); - params->setMargin(Margin(0,0,50,0)); + params->setMargin(Margin(0.0f,0.0f,50.0f,0.0f)); LinearLayoutParameter *vparams = LinearLayoutParameter::create(); - vparams->setMargin(Margin(10, 0, 0, 140)); + vparams->setMargin(Margin(10.0f, 0.0f, 0.0f, 140.0f)); upperHBox->setLayoutParameter(vparams); int count = 3; @@ -548,7 +548,7 @@ bool UIFocusTestNestedLayout3::init() bottomHBox->setLayoutParameter(vparams); count = 3; LinearLayoutParameter *bottomParams = LinearLayoutParameter::create(); - bottomParams->setMargin(Margin(0, 0, 8, 0)); + bottomParams->setMargin(Margin(0.0f, 0.0f, 8.0f, 0.0f)); for (int i=0; i < count; ++i) { ImageView *w = ImageView::create("cocosui/scrollviewbg.png"); w->setLayoutParameter(bottomParams); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest.cpp index 4f315b5359..c58ec5c895 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest.cpp @@ -66,7 +66,7 @@ bool UIImageViewTest::init() auto item1 = MenuItemLabel::create(label1, CC_CALLBACK_1(UIImageViewTest::printWidgetResources, this)); item1->setPosition(Vec2(VisibleRect::left().x + 60, VisibleRect::bottom().y + item1->getContentSize().height * 3)); auto pMenu1 = Menu::create(item1, nullptr); - pMenu1->setPosition(Vec2(0, 0)); + pMenu1->setPosition(Vec2(0.0f, 0.0f)); this->addChild(pMenu1, 10); return true; @@ -133,8 +133,8 @@ bool UIImageViewTest_Scale9_State_Change::init() ImageView* imageView = ImageView::create("cocosui/ccicon.png"); imageView->ignoreContentAdaptWithSize(false); imageView->setScale9Enabled(true); - imageView->setContentSize(Size(100, 100)); - imageView->setCapInsets(Rect(20,20,20,20)); + imageView->setContentSize(Size(100.0f, 100.0f)); + imageView->setCapInsets(Rect(20.0f,20.0f,20.0f,20.0f)); imageView->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); @@ -181,7 +181,7 @@ bool UIImageViewTest_ContentSize::init() // Create the imageview ImageView* imageView = ImageView::create("cocosui/buttonHighlighted.png"); imageView->setScale9Enabled(true); - imageView->setContentSize(Size(200, 80)); + imageView->setContentSize(Size(200.0f, 80.0f)); imageView->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f )); @@ -257,7 +257,7 @@ bool UIImageViewFlipTest::init() auto toggleButton = Button::create(); toggleButton->setTitleText("Toggle FlipX"); - toggleButton->setPosition(imageView->getPosition() + Vec2(-50, - imageView->getContentSize().height/2 - 20)); + toggleButton->setPosition(imageView->getPosition() + Vec2(-50.0f, - imageView->getContentSize().height/2 - 20)); this->addChild(toggleButton); toggleButton->addClickEventListener([=](Ref*){ imageView->setFlippedX(!imageView->isFlippedX()); @@ -265,7 +265,7 @@ bool UIImageViewFlipTest::init() auto toggleScale9 = Button::create(); toggleScale9->setTitleText("Toggle Scale9"); - toggleScale9->setPosition(imageView->getPosition() + Vec2(+50, - imageView->getContentSize().height/2- 20)); + toggleScale9->setPosition(imageView->getPosition() + Vec2(+50.0f, - imageView->getContentSize().height/2- 20)); this->addChild(toggleScale9); toggleScale9->addClickEventListener([=](Ref*){ imageView->setScale9Enabled(!imageView->isScale9Enabled()); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp index 9011512ef8..8d14453708 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp @@ -104,7 +104,7 @@ bool UIListViewTest_Vertical::init() _listView->setBackGroundImage("cocosui/green_edit.png"); _listView->setGlobalZOrder(200); _listView->setBackGroundImageScale9Enabled(true); - _listView->setContentSize(Size(240, 130)); + _listView->setContentSize(Size(240.0f, 130.0f)); _listView->setPosition(Vec2((widgetSize - _listView->getContentSize()) / 2.0f)); _listView->addEventListener((ui::ListView::ccListViewCallback)CC_CALLBACK_2(UIListViewTest_Vertical::selectedItemEvent, this)); _listView->addEventListener((ui::ListView::ccScrollViewCallback)CC_CALLBACK_2(UIListViewTest_Vertical::selectedItemEventScrollView,this)); @@ -171,15 +171,15 @@ bool UIListViewTest_Vertical::init() // Labels _indexLabels[0] = Text::create(" ", "fonts/Marker Felt.ttf", 12); _indexLabels[0]->setAnchorPoint(Vec2::ANCHOR_MIDDLE); - _indexLabels[0]->setPosition(_uiLayer->getContentSize() / 2 + Size(0, position)); + _indexLabels[0]->setPosition(_uiLayer->getContentSize() / 2 + Size(0.0f, position)); _uiLayer->addChild(_indexLabels[0]); _indexLabels[1] = Text::create(" ", "fonts/Marker Felt.ttf", 12); _indexLabels[1]->setAnchorPoint(Vec2::ANCHOR_MIDDLE); - _indexLabels[1]->setPosition(_uiLayer->getContentSize() / 2 + Size(140, 0)); + _indexLabels[1]->setPosition(_uiLayer->getContentSize() / 2 + Size(140.0f, 0.0f)); _uiLayer->addChild(_indexLabels[1]); _indexLabels[2] = Text::create(" ", "fonts/Marker Felt.ttf", 12); _indexLabels[2]->setAnchorPoint(Vec2::ANCHOR_MIDDLE); - _indexLabels[2]->setPosition(_uiLayer->getContentSize() / 2 + Size(0, -position)); + _indexLabels[2]->setPosition(_uiLayer->getContentSize() / 2 + Size(0.0f, -position)); _uiLayer->addChild(_indexLabels[2]); // Callback @@ -365,7 +365,7 @@ bool UIListViewTest_Horizontal::init() _listView->setBounceEnabled(true); _listView->setBackGroundImage("cocosui/green_edit.png"); _listView->setBackGroundImageScale9Enabled(true); - _listView->setContentSize(Size(240, 130)); + _listView->setContentSize(Size(240.0f, 130.0f)); _listView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - _listView->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + @@ -533,7 +533,7 @@ bool Issue12692::init() listView->setBounceEnabled(true); listView->setBackGroundImage("cocosui/green_edit.png"); listView->setBackGroundImageScale9Enabled(true); - listView->setContentSize(Size(240, 130)); + listView->setContentSize(Size(240.0f, 130.0f)); listView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - listView->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + @@ -627,7 +627,7 @@ bool Issue8316::init() listView->setTouchEnabled(false); listView->setBackGroundImage("cocosui/green_edit.png"); listView->setBackGroundImageScale9Enabled(true); - listView->setContentSize(Size(240, 130)); + listView->setContentSize(Size(240.0f, 130.0f)); listView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - listView->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + @@ -679,7 +679,7 @@ bool UIListViewTest_ScrollToItem::init() _nextIndex = 0; _titleLabel = Text::create("Scroll to item", "fonts/Marker Felt.ttf", 32); _titleLabel->setAnchorPoint(Vec2::ANCHOR_MIDDLE); - _titleLabel->setPosition(Vec2(layerSize / 2) + Vec2(0, _titleLabel->getContentSize().height * 3.15f)); + _titleLabel->setPosition(Vec2(layerSize / 2) + Vec2(0.0f, _titleLabel->getContentSize().height * 3.15f)); _uiLayer->addChild(_titleLabel, 3); // Create the list view @@ -717,7 +717,7 @@ bool UIListViewTest_ScrollToItem::init() auto pButton = Button::create("cocosui/backtotoppressed.png", "cocosui/backtotopnormal.png"); pButton->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT); pButton->setScale(0.8f); - pButton->setPosition(Vec2(layerSize / 2) + Vec2(120, -60)); + pButton->setPosition(Vec2(layerSize / 2) + Vec2(120.0f, -60.0f)); pButton->setTitleText(StringUtils::format("Go to '%d'", _nextIndex)); pButton->addClickEventListener([this, pButton](Ref*) { _listView->scrollToItem(_nextIndex, Vec2::ANCHOR_MIDDLE, Vec2::ANCHOR_MIDDLE); @@ -753,7 +753,7 @@ bool UIListViewTest_Magnetic::init() _titleLabel = Text::create("Magnetic scroll", "fonts/Marker Felt.ttf", 32); _titleLabel->setAnchorPoint(Vec2::ANCHOR_MIDDLE); - _titleLabel->setPosition(Vec2(layerSize / 2) + Vec2(0, _titleLabel->getContentSize().height * 3.15f)); + _titleLabel->setPosition(Vec2(layerSize / 2) + Vec2(0.0f, _titleLabel->getContentSize().height * 3.15f)); _uiLayer->addChild(_titleLabel, 3); // Create the list view @@ -796,10 +796,10 @@ bool UIListViewTest_Magnetic::init() _uiLayer->addChild(_indexLabels[i]); } float deltaX = 145, deltaY = 90; - _indexLabels[0]->setPosition(_uiLayer->getContentSize() / 2 + Size(-deltaX, 0)); // left - _indexLabels[1]->setPosition(_uiLayer->getContentSize() / 2 + Size(deltaX, 0)); // right - _indexLabels[2]->setPosition(_uiLayer->getContentSize() / 2 + Size(0, deltaY)); // top - _indexLabels[3]->setPosition(_uiLayer->getContentSize() / 2 + Size(0, -deltaY)); // bottom + _indexLabels[0]->setPosition(_uiLayer->getContentSize() / 2 + Size(-deltaX, 0.0f)); // left + _indexLabels[1]->setPosition(_uiLayer->getContentSize() / 2 + Size(deltaX, 0.0f)); // right + _indexLabels[2]->setPosition(_uiLayer->getContentSize() / 2 + Size(0.0f, deltaY)); // top + _indexLabels[3]->setPosition(_uiLayer->getContentSize() / 2 + Size(0.0f, -deltaY)); // bottom _indexLabels[4]->setPosition(_uiLayer->getContentSize() / 2 + Size(deltaX, deltaY)); // center // Callback @@ -831,7 +831,7 @@ bool UIListViewTest_Magnetic::init() auto pButton = Button::create("cocosui/backtotoppressed.png", "cocosui/backtotopnormal.png"); pButton->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT); pButton->setScale(0.8f); - pButton->setPosition(Vec2(layerSize / 2) + Vec2(130, -60)); + pButton->setPosition(Vec2(layerSize / 2) + Vec2(130.0f, -60.0f)); pButton->setTitleText("Next Magnetic"); pButton->addClickEventListener([this](Ref*) { ListView::MagneticType eCurrentType = _listView->getMagneticType(); @@ -912,7 +912,7 @@ bool UIListViewTest_Padding::init() _titleLabel = Text::create("Set Padding", "fonts/Marker Felt.ttf", 32); _titleLabel->setAnchorPoint(Vec2::ANCHOR_MIDDLE); - _titleLabel->setPosition(Vec2(layerSize / 2) + Vec2(0, _titleLabel->getContentSize().height * 3.15f)); + _titleLabel->setPosition(Vec2(layerSize / 2) + Vec2(0.0f, _titleLabel->getContentSize().height * 3.15f)); _uiLayer->addChild(_titleLabel, 3); // Create the list view @@ -952,7 +952,7 @@ bool UIListViewTest_Padding::init() { auto title = Text::create("Padding", "fonts/Marker Felt.ttf", 14); title->setAnchorPoint(Vec2::ANCHOR_MIDDLE); - title->setPosition(Vec2(30, 170)); + title->setPosition(Vec2(30.0f, 170.0f)); _uiLayer->addChild(title); for (int i = 0; i < 4; ++i) { @@ -961,9 +961,9 @@ bool UIListViewTest_Padding::init() slider->loadSlidBallTextures("cocosui/sliderThumb.png", "cocosui/sliderThumb.png", ""); slider->loadProgressBarTexture("cocosui/sliderProgress.png"); slider->setScale9Enabled(true); - slider->setCapInsets(Rect(0, 0, 0, 0)); - slider->setContentSize(Size(30, 10)); - slider->setPosition(Vec2(60, 150 - (25 * i))); + slider->setCapInsets(Rect(0.0f, 0.0f, 0.0f, 0.0f)); + slider->setContentSize(Size(30.0f, 10.0f)); + slider->setPosition(Vec2(60.0f, 150.0f - (25 * i))); slider->addEventListener(CC_CALLBACK_2(UIListViewTest_Padding::sliderEvent, this)); slider->setTag(i); _uiLayer->addChild(slider); @@ -985,7 +985,7 @@ bool UIListViewTest_Padding::init() { auto text = Text::create(str + "\nPadding=0", "fonts/Marker Felt.ttf", 12); text->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT); - text->setPosition(Vec2(layerSize.width - 65, 200 - (40 * i))); + text->setPosition(Vec2(layerSize.width - 65, 200.0f - (40 * i))); _uiLayer->addChild(text); _paddingLabels[i] = text; @@ -1002,10 +1002,10 @@ bool UIListViewTest_Padding::init() _uiLayer->addChild(_indexLabels[i]); } float deltaX = 145, deltaY = 90; - _indexLabels[0]->setPosition(_uiLayer->getContentSize() / 2 + Size(-deltaX, 0)); // left - _indexLabels[1]->setPosition(_uiLayer->getContentSize() / 2 + Size(deltaX, 0)); // right - _indexLabels[2]->setPosition(_uiLayer->getContentSize() / 2 + Size(0, deltaY)); // top - _indexLabels[3]->setPosition(_uiLayer->getContentSize() / 2 + Size(0, -deltaY)); // bottom + _indexLabels[0]->setPosition(_uiLayer->getContentSize() / 2 + Size(-deltaX, 0.0f)); // left + _indexLabels[1]->setPosition(_uiLayer->getContentSize() / 2 + Size(deltaX, 0.0f)); // right + _indexLabels[2]->setPosition(_uiLayer->getContentSize() / 2 + Size(0.0f, deltaY)); // top + _indexLabels[3]->setPosition(_uiLayer->getContentSize() / 2 + Size(0.0f, -deltaY)); // bottom _indexLabels[4]->setPosition(_uiLayer->getContentSize() / 2 + Size(deltaX, deltaY)); // center // Callback diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp index ea7ce86832..8897df3bbf 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp @@ -204,7 +204,7 @@ bool UIPageViewButtonTest::init() } LinearLayoutParameter *parameter = LinearLayoutParameter::create(); - parameter->setMargin(Margin(0,0,100,0)); + parameter->setMargin(Margin(0.0f,0.0f,100.0f,0.0f)); innerBox->setLayoutParameter(parameter); outerBox->addChild(innerBox); @@ -289,7 +289,7 @@ bool UIPageViewTouchPropagationTest::init() // Create the page view PageView* pageView = PageView::create(); pageView->setContentSize(Size(240.0f, 130.0f)); - pageView->setAnchorPoint(Vec2(0.5,0.5)); + pageView->setAnchorPoint(Vec2(0.5f,0.5f)); Size backgroundSize = background->getContentSize(); pageView->setPosition(Vec2(widgetSize.width / 2.0f ,widgetSize.height / 2.0f)); pageView->setBackGroundColor(Color3B::GREEN); @@ -314,7 +314,7 @@ bool UIPageViewTouchPropagationTest::init() } LinearLayoutParameter *parameter = LinearLayoutParameter::create(); - parameter->setMargin(Margin(0,0,100,0)); + parameter->setMargin(Margin(0.0f,0.0f,100.0f,0.0f)); innerBox->setLayoutParameter(parameter); outerBox->addChild(innerBox); @@ -347,15 +347,15 @@ bool UIPageViewTouchPropagationTest::init() _uiLayer->addChild(pageView); Text *propagationText = Text::create("Allow Propagation", "Arial", 10); - propagationText->setAnchorPoint(Vec2(0,0.5)); + propagationText->setAnchorPoint(Vec2(0.0f,0.5f)); propagationText->setTextColor(Color4B::RED); - propagationText->setPosition(Vec2(0, pageView->getPosition().y + 50)); + propagationText->setPosition(Vec2(0.0f, pageView->getPosition().y + 50)); _uiLayer->addChild(propagationText); Text *swallowTouchText = Text::create("Swallow Touches", "Arial", 10); - swallowTouchText->setAnchorPoint(Vec2(0,0.5)); + swallowTouchText->setAnchorPoint(Vec2(0.f,0.5f)); swallowTouchText->setTextColor(Color4B::RED); - swallowTouchText->setPosition(Vec2(0, pageView->getPosition().y)); + swallowTouchText->setPosition(Vec2(0.0f, pageView->getPosition().y)); _uiLayer->addChild(swallowTouchText); // Create the checkbox @@ -364,7 +364,7 @@ bool UIPageViewTouchPropagationTest::init() "cocosui/check_box_active.png", "cocosui/check_box_normal_disable.png", "cocosui/check_box_active_disable.png"); - checkBox1->setPosition(propagationText->getPosition() + Vec2(propagationText->getContentSize().width/2, -20)); + checkBox1->setPosition(propagationText->getPosition() + Vec2(propagationText->getContentSize().width/2, -20.0f)); checkBox1->setName("propagation"); _uiLayer->addChild(checkBox1); @@ -376,7 +376,7 @@ bool UIPageViewTouchPropagationTest::init() "cocosui/check_box_active.png", "cocosui/check_box_normal_disable.png", "cocosui/check_box_active_disable.png"); - checkBox2->setPosition(swallowTouchText->getPosition() + Vec2(swallowTouchText->getContentSize().width/2, -20)); + checkBox2->setPosition(swallowTouchText->getPosition() + Vec2(swallowTouchText->getContentSize().width/2, -20.0f)); checkBox2->setName("swallow"); _uiLayer->addChild(checkBox2); @@ -486,7 +486,7 @@ bool UIPageViewDynamicAddAndRemoveTest::init() PageView* pageView = PageView::create(); pageView->setDirection(ui::PageView::Direction::VERTICAL); pageView->setContentSize(Size(240.0f, 130.0f)); - pageView->setAnchorPoint(Vec2(0.5,0.5)); + pageView->setAnchorPoint(Vec2(0.5f,0.5f)); Size backgroundSize = background->getContentSize(); pageView->setPosition(Vec2(widgetSize.width / 2.0f ,widgetSize.height / 2.0f)); pageView->setBackGroundColor(Color3B::GREEN); @@ -514,7 +514,7 @@ bool UIPageViewDynamicAddAndRemoveTest::init() } LinearLayoutParameter *parameter = LinearLayoutParameter::create(); - parameter->setMargin(Margin(0,0,100,0)); + parameter->setMargin(Margin(0.0f,0.0f,100.0f,0.0f)); innerBox->setLayoutParameter(parameter); outerBox->addChild(innerBox); @@ -552,7 +552,7 @@ bool UIPageViewDynamicAddAndRemoveTest::init() } LinearLayoutParameter *parameter = LinearLayoutParameter::create(); - parameter->setMargin(Margin(0,0,100,0)); + parameter->setMargin(Margin(0.0f,0.0f,100.0f,0.0f)); innerBox->setLayoutParameter(parameter); outerBox->addChild(innerBox); } @@ -687,7 +687,7 @@ bool UIPageViewJumpToPageTest::init() ImageView* imageView = ImageView::create("cocosui/scrollviewbg.png"); imageView->setScale9Enabled(true); - imageView->setContentSize(Size(240, 130)); + imageView->setContentSize(Size(240.0f, 130.0f)); imageView->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); layout->addChild(imageView); @@ -796,7 +796,7 @@ bool UIPageViewVerticalTest::init() ImageView* imageView = ImageView::create("cocosui/scrollviewbg.png"); imageView->setScale9Enabled(true); - imageView->setContentSize(Size(240, 130)); + imageView->setContentSize(Size(240.0f, 130.0f)); imageView->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); layout->addChild(imageView); @@ -889,7 +889,7 @@ bool UIPageViewDisableTouchTest::init() ImageView* imageView = ImageView::create("cocosui/scrollviewbg.png"); imageView->setScale9Enabled(true); - imageView->setContentSize(Size(240, 130)); + imageView->setContentSize(Size(240.0f, 130.0f)); imageView->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); layout->addChild(imageView); @@ -1053,7 +1053,7 @@ bool UIPageViewIndicatorTest::init() ImageView* imageView = ImageView::create("cocosui/scrollviewbg.png"); imageView->setScale9Enabled(true); - imageView->setContentSize(Size(240, 130)); + imageView->setContentSize(Size(240.0f, 130.0f)); imageView->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); layout->addChild(imageView); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRadioButtonTest/UIRadioButtonTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRadioButtonTest/UIRadioButtonTest.cpp index 34a9b0769c..05796254ab 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRadioButtonTest/UIRadioButtonTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRadioButtonTest/UIRadioButtonTest.cpp @@ -165,17 +165,17 @@ bool UIRadioButtonTwoGroupsTest::init() // Add a label in which the radio button events will be displayed _groupEventLabel = Text::create("RadioButtonGroup : No Event", "fonts/Marker Felt.ttf", 25); - _groupEventLabel->setAnchorPoint(Vec2(0.5f, -1)); + _groupEventLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); _groupEventLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + 70)); _uiLayer->addChild(_groupEventLabel); _buttonEventLabel = Text::create("RadioButton : No Event", "fonts/Marker Felt.ttf", 25); - _buttonEventLabel->setAnchorPoint(Vec2(0.5f, -1)); + _buttonEventLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); _buttonEventLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + 35)); _uiLayer->addChild(_buttonEventLabel); _logConsole = Text::create("", "fonts/Marker Felt.ttf", 10); - _logConsole->setAnchorPoint(Vec2(0, 1)); + _logConsole->setAnchorPoint(Vec2(0.0f, 1.0f)); _logConsole->setPosition(Vec2(widgetSize.width / 2.0f + 110, widgetSize.height / 2.0f + 55)); _uiLayer->addChild(_logConsole); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScale9SpriteTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScale9SpriteTest.cpp index 217d51704f..6f770269d8 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScale9SpriteTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScale9SpriteTest.cpp @@ -79,10 +79,10 @@ bool UIScale9SpriteTest::init() { Size widgetSize = _widget->getContentSize(); - auto moveTo = MoveBy::create(1.0, Vec2(30,0)); + auto moveTo = MoveBy::create(1.0f, Vec2(30.0f,0.0f)); auto moveBack = moveTo->reverse(); - auto rotateBy = RotateBy::create(1.0, 180); - auto scaleBy = ScaleTo::create(1.0, -2.0); + auto rotateBy = RotateBy::create(1.0f, 180.0f); + auto scaleBy = ScaleTo::create(1.0f, -2.0f); auto action = Sequence::create(moveTo,moveBack, rotateBy,scaleBy, NULL); @@ -107,16 +107,16 @@ bool UIScale9SpriteTest::init() ui::Scale9Sprite *sp1 = ui::Scale9Sprite::create("cocosui/animationbuttonnormal.png"); sp1->setPosition(100, 160); sp1->setScale(1.2f); - sp1->setContentSize(Size(100,100)); + sp1->setContentSize(Size(100.0f,100.0f)); sp1->setColor(Color3B::GREEN); this->addChild(sp1); sp1->runAction((FiniteTimeAction*)action2); cocos2d::ui::Scale9Sprite *sp2 = ui::Scale9Sprite::create("cocosui/animationbuttonnormal.png"); - sp2->setPosition(350, 160); + sp2->setPosition(350.0f, 160.0f); sp2->setPreferredSize(sp1->getContentSize() * 1.2f); sp2->setColor(Color3B::GREEN); - sp2->setContentSize(Size(100,100)); + sp2->setContentSize(Size(100.0f,100.0f)); this->addChild(sp2); auto action3 = action->clone(); @@ -143,11 +143,11 @@ bool UIScale9SpriteHierarchialTest::init() { Size widgetSize = _widget->getContentSize(); - auto moveTo = MoveBy::create(1.0f, Vec2(30,0)); + auto moveTo = MoveBy::create(1.0f, Vec2(30.0f,0.0f)); auto moveBack = moveTo->reverse(); - auto rotateBy = RotateBy::create(1.0f, 180); + auto rotateBy = RotateBy::create(1.0f, 180.0f); auto fadeOut = FadeOut::create(2.0f); - auto scaleTo = ScaleTo::create(1.0, 2.0); + auto scaleTo = ScaleTo::create(1.0f, 2.0f); auto action = Sequence::create(moveTo,moveBack, rotateBy,fadeOut,scaleTo, NULL); Sprite *normalSprite1 = Sprite::create("cocosui/animationbuttonnormal.png"); @@ -166,9 +166,9 @@ bool UIScale9SpriteHierarchialTest::init() auto action2 = action->clone(); ui::Scale9Sprite *sp1 = ui::Scale9Sprite::create("cocosui/animationbuttonnormal.png"); - sp1->setPosition(200, 160); + sp1->setPosition(200.0f, 160.0f); sp1->setScale(1.2f); - sp1->setContentSize(Size(100,100)); + sp1->setContentSize(Size(100.0f,100.0f)); sp1->setColor(Color3B::GREEN); this->addChild(sp1); sp1->runAction((FiniteTimeAction*)action2); @@ -177,7 +177,7 @@ bool UIScale9SpriteHierarchialTest::init() sp2->setPreferredSize(sp1->getContentSize() * 1.2f); sp2->setColor(Color3B::GREEN); sp2->setFlippedX(true); - sp2->setContentSize(Size(100,100)); + sp2->setContentSize(Size(100.0f,100.0f)); sp1->addChild(sp2); @@ -205,7 +205,7 @@ bool UIScale9SpriteTouchTest::init() auto containerForSprite1 = Node::create(); auto sprite1 = cocos2d::ui::Scale9Sprite::create("Images/CyanSquare.png"); - sprite1->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80, 80)); + sprite1->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80.0f, 80.0f)); containerForSprite1->addChild(sprite1); addChild(containerForSprite1, 10); @@ -216,7 +216,7 @@ bool UIScale9SpriteTouchTest::init() addChild(sprite2, 20); auto sprite3 = ui::Scale9Sprite::create("Images/YellowSquare.png"); - sprite3->setPosition(Vec2(0, 0)); + sprite3->setPosition(Vec2(0.0f, 0.0f)); sprite3->setCascadeOpacityEnabled(false); sprite2->addChild(sprite3, 1); @@ -310,7 +310,7 @@ bool UIS9FrameNameSpriteSheet::init() blocks->setInsetRight(0); blocks->setInsetTop(0); blocks->setInsetBottom(0); - blocks->setPreferredSize(Size(400,80)); + blocks->setPreferredSize(Size(400.0f,80.0f)); blocks->setPosition(Vec2(x, y)); this->addChild(blocks); @@ -334,7 +334,7 @@ bool UIS9FrameNameSpriteSheetRotated::init() auto blocks = ui::Scale9Sprite::createWithSpriteFrameName("blocks9r.png"); - blocks->setPreferredSize(Size(400,80)); + blocks->setPreferredSize(Size(400.0f,80.0f)); blocks->setPosition(Vec2(x, y)); @@ -356,12 +356,12 @@ bool UIS9FrameNameSpriteSheetCropped::init() SpriteFrameCache::getInstance()->addSpriteFramesWithFile(s_s9s_blocks9_plist); auto blocks = ui::Scale9Sprite::createWithSpriteFrameName("blocks9c.png"); - blocks->setPreferredSize(Size(400,80)); + blocks->setPreferredSize(Size(400.0f,80.0f)); blocks->setPosition(Vec2(x, y + 45)); this->addChild(blocks); auto blocks2 = ui::Scale9Sprite::create("Images/blocks9c.png"); - blocks2->setPreferredSize(Size(400,80)); + blocks2->setPreferredSize(Size(400.0f,80.0f)); blocks2->setPosition(Vec2(x, y - 45)); this->addChild(blocks2); @@ -381,12 +381,12 @@ bool UIS9FrameNameSpriteSheetCroppedRotated::init() SpriteFrameCache::getInstance()->addSpriteFramesWithFile(s_s9s_blocks9_plist); auto blocks = ui::Scale9Sprite::createWithSpriteFrameName("blocks9cr.png"); - blocks->setPreferredSize(Size(400,80)); + blocks->setPreferredSize(Size(400.0f,80.0f)); blocks->setPosition(Vec2(x, y + 45)); this->addChild(blocks); auto blocks2 = ui::Scale9Sprite::create("Images/blocks9cr.png"); - blocks2->setPreferredSize(Size(400,80)); + blocks2->setPreferredSize(Size(400.0f,80.0f)); blocks2->setPosition(Vec2(x, y - 45)); this->addChild(blocks2); @@ -407,7 +407,7 @@ bool UIS9FrameNameSpriteSheetCroppedSimple::init() auto blocks = ui::Scale9Sprite::createWithSpriteFrameName("blocks9c.png"); blocks->setRenderingType(Scale9Sprite::RenderingType::SIMPLE); - blocks->setPreferredSize(Size(400,80)); + blocks->setPreferredSize(Size(400.0f,80.0f)); blocks->setPosition(Vec2(x, y + 45)); this->addChild(blocks); @@ -433,7 +433,7 @@ bool UIS9FrameNameSpriteSheetCroppedRotatedSimple::init() auto blocks = ui::Scale9Sprite::createWithSpriteFrameName("blocks9cr.png"); blocks->setRenderingType(Scale9Sprite::RenderingType::SIMPLE); - blocks->setPreferredSize(Size(400,80)); + blocks->setPreferredSize(Size(400.0f,80.0f)); blocks->setPosition(Vec2(x, y + 45)); this->addChild(blocks); @@ -730,11 +730,11 @@ bool UIS9ZOrder::init() blocks_scaled_with_insets->addChild(normalSprite); auto topLabel = Label::createWithSystemFont("I Must be On the Top", "Arial", 15); - topLabel->setPosition(Vec2(20,20)); + topLabel->setPosition(Vec2(20.0f,20.0f)); blocks_scaled_with_insets->addChild(topLabel); auto bottomLabel = Label::createWithSystemFont("I Must be On the Bottom", "Arial", 15); - bottomLabel->setPosition(Vec2(80,80)); + bottomLabel->setPosition(Vec2(80.0f,80.0f)); bottomLabel->setColor(Color3B::BLUE); blocks_scaled_with_insets->addChild(bottomLabel,-1); @@ -763,7 +763,7 @@ bool UIS9Flip::init() auto normalLabel = Label::createWithSystemFont("Normal Sprite","Arial",10); - normalLabel->setPosition(normalSprite->getPosition() + Vec2(0, normalSprite->getContentSize().height/2 + 10)); + normalLabel->setPosition(normalSprite->getPosition() + Vec2(0.0f, normalSprite->getContentSize().height/2 + 10)); this->addChild(normalLabel); @@ -776,7 +776,7 @@ bool UIS9Flip::init() flipXSprite->setFlippedX(false); auto flipXLabel = Label::createWithSystemFont("sprite is not flipped!","Arial",10); - flipXLabel->setPosition(flipXSprite->getPosition() + Vec2(0, flipXSprite->getContentSize().height/2 + 10)); + flipXLabel->setPosition(flipXSprite->getPosition() + Vec2(0.0f, flipXSprite->getContentSize().height/2 + 10)); this->addChild(flipXLabel); @@ -789,13 +789,13 @@ bool UIS9Flip::init() flipYSprite->setFlippedY(true); auto flipYLabel = Label::createWithSystemFont("sprite is flipped!","Arial",10); - flipYLabel->setPosition(flipYSprite->getPosition() + Vec2(0, flipYSprite->getContentSize().height/2 + 10)); + flipYLabel->setPosition(flipYSprite->getPosition() + Vec2(0.0f, flipYSprite->getContentSize().height/2 + 10)); this->addChild(flipYLabel); auto toggleFlipXButton = Button::create(); toggleFlipXButton->setTitleText("Toggle FlipX"); - toggleFlipXButton->setPosition(flipXSprite->getPosition() + Vec2(0, - 20 - flipXSprite->getContentSize().height/2)); + toggleFlipXButton->setPosition(flipXSprite->getPosition() + Vec2(0.0f, - 20 - flipXSprite->getContentSize().height/2)); toggleFlipXButton->addClickEventListener([=](Ref*){ flipXSprite->setFlippedX(! flipXSprite->isFlippedX()); if (flipXSprite->isFlippedX()) { @@ -809,7 +809,7 @@ bool UIS9Flip::init() auto toggleFlipYButton = Button::create(); toggleFlipYButton->setTitleText("Toggle FlipY"); - toggleFlipYButton->setPosition(flipYSprite->getPosition() + Vec2(0, -20 - flipYSprite->getContentSize().height/2)); + toggleFlipYButton->setPosition(flipYSprite->getPosition() + Vec2(0.0f, -20 - flipYSprite->getContentSize().height/2)); toggleFlipYButton->addClickEventListener([=](Ref*){ flipYSprite->setFlippedY(!flipYSprite->isFlippedY()); if (flipYSprite->isFlippedY()) { @@ -823,7 +823,7 @@ bool UIS9Flip::init() auto toggleScale9Button = Button::create(); toggleScale9Button->setTitleText("Toggle Scale9"); - toggleScale9Button->setPosition(normalSprite->getPosition() + Vec2(0, -20 - normalSprite->getContentSize().height/2)); + toggleScale9Button->setPosition(normalSprite->getPosition() + Vec2(0.0f, -20 - normalSprite->getContentSize().height/2)); toggleScale9Button->addClickEventListener([=](Ref*){ flipXSprite->setScale9Enabled(!flipXSprite->isScale9Enabled()); flipYSprite->setScale9Enabled(!flipYSprite->isScale9Enabled()); @@ -967,8 +967,8 @@ bool UIS9NinePatchTest::init() auto spriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName("buttonnormal.9.png"); auto buttonScale9Sprite = Scale9Sprite::createWithSpriteFrame(spriteFrame); - buttonScale9Sprite->setContentSize(Size(150,80)); - buttonScale9Sprite->setPosition(Vec2(100,200)); + buttonScale9Sprite->setContentSize(Size(150.0f,80.0f)); + buttonScale9Sprite->setPosition(Vec2(100.0f,200.0f)); this->addChild(buttonScale9Sprite); return true; @@ -987,7 +987,7 @@ bool UIS9BatchTest::init() label->setPosition(Vec2(winSize.width/2, winSize.height - 60)); this->addChild(label); - auto preferedSize = Size(150,99); + auto preferedSize = Size(150.0f,99.0f); std::vector spriteFrameNameArray = {"blocks9.png", "blocks9r.png"}; auto addSpriteButton = ui::Button::create("cocosui/animationbuttonnormal.png", "cocosui/animationbuttonpressed.png"); addSpriteButton->setPosition(Vec2(winSize.width/2 - 50,winSize.height - 100)); @@ -996,7 +996,7 @@ bool UIS9BatchTest::init() addSpriteButton->addClickEventListener([=](Ref*){ auto spriteFrameName = spriteFrameNameArray[rand()%2]; auto sprite = Sprite::createWithSpriteFrameName(spriteFrameName); - sprite->setPosition(Vec2(rand() % (int)winSize.width + 50, winSize.height/2)); + sprite->setPosition(Vec2(rand() % (int)winSize.width + 50.0f, winSize.height/2)); this->addChild(sprite); }); this->addChild(addSpriteButton); @@ -1008,7 +1008,7 @@ bool UIS9BatchTest::init() int random = rand()%2; auto spriteFrameName = spriteFrameNameArray[random]; auto sprite = ui::Scale9Sprite::createWithSpriteFrameName(spriteFrameName); - sprite->setPosition(Vec2(rand() % (int)winSize.width + 50, winSize.height/3)); + sprite->setPosition(Vec2(rand() % (int)winSize.width + 50.0f, winSize.height/3)); if (random == 0) { sprite->setRenderingType(Scale9Sprite::RenderingType::SIMPLE); }else{ @@ -1114,7 +1114,7 @@ bool UIS9EnableScale9FalseTest::init() auto blocks = ui::Scale9Sprite::create("Images/blocks9.png"); blocks->setScale9Enabled(false); blocks->setPosition(Vec2(x, y)); - blocks->setPreferredSize(Size(96*2, 96)); + blocks->setPreferredSize(Size(96*2.0f, 96.0f)); blocks->setColor(Color3B::RED); blocks->setGlobalZOrder(1); this->addChild(blocks); @@ -1122,16 +1122,16 @@ bool UIS9EnableScale9FalseTest::init() auto blocks2 = ui::Scale9Sprite::create("Images/blocks9.png"); blocks2->setScale9Enabled(false); - blocks2->setPosition(Vec2(0, 0)); - blocks2->setPreferredSize(Size(96*1.5, 96)); + blocks2->setPosition(Vec2(0.0f, 0.0f)); + blocks2->setPreferredSize(Size(96*1.5f, 96.0f)); blocks2->setGlobalZOrder(0); blocks2->setColor(Color3B::GREEN); blocks->addChild(blocks2); auto blocks3 = ui::Scale9Sprite::create("Images/blocks9.png"); blocks3->setScale9Enabled(false); - blocks3->setPosition(Vec2(0, 0)); - blocks3->setPreferredSize(Size(96, 96)); + blocks3->setPosition(Vec2(0.0f, 0.0f)); + blocks3->setPreferredSize(Size(96.0f, 96.0f)); blocks3->setGlobalZOrder(2); blocks3->setColor(Color3B::YELLOW); blocks2->addChild(blocks3); @@ -1168,9 +1168,9 @@ bool UIS9GrayStateOpacityTest::init() slider->loadBarTexture("cocosui/sliderTrack.png"); slider->loadSlidBallTextures("cocosui/sliderThumb.png", "cocosui/sliderThumb.png", ""); slider->loadProgressBarTexture("cocosui/sliderProgress.png"); - slider->setContentSize(Size(300, slider->getContentSize().height * 1.5)); + slider->setContentSize(Size(300, slider->getContentSize().height * 1.5f)); slider->setMaxPercent(100); - slider->setPercent(100 * 100.0 / 255.0); + slider->setPercent(100 * 100.0f / 255.0); slider->setPosition(Vec2(winSize.width / 2.0f, winSize.height / 2.0f - 100)); slider->addEventListener(CC_CALLBACK_2(UIS9GrayStateOpacityTest::sliderEvent, this)); _uiLayer->addChild(slider); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest.cpp index 450e752c13..322eb99209 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest.cpp @@ -305,8 +305,8 @@ bool UIScrollViewTest_ScrollToPercentBothDirection::init() sc->setBackGroundColor(Color3B::GREEN); sc->setBackGroundColorType(Layout::BackGroundColorType::SOLID); sc->setDirection(ui::ScrollView::Direction::BOTH); - sc->setInnerContainerSize(Size(480, 320)); - sc->setContentSize(Size(100,100)); + sc->setInnerContainerSize(Size(480.0f, 320.0f)); + sc->setContentSize(Size(100.0f,100.0f)); sc->setScrollBarEnabled(false); Size backgroundSize = background->getContentSize(); sc->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + @@ -315,7 +315,7 @@ bool UIScrollViewTest_ScrollToPercentBothDirection::init() (backgroundSize.height - sc->getContentSize().height) / 2.0f)); sc->scrollToPercentBothDirection(Vec2(50, 50), 1, true); ImageView* iv = ImageView::create("cocosui/Hello.png"); - iv->setPosition(Vec2(240, 160)); + iv->setPosition(Vec2(240.0f, 160.0f)); sc->addChild(iv); _uiLayer->addChild(sc); @@ -362,19 +362,19 @@ bool UIScrollViewTest_ScrollToPercentBothDirection_Bounce::init() sc->setBackGroundColorType(Layout::BackGroundColorType::SOLID); sc->setBounceEnabled(true); sc->setDirection(ui::ScrollView::Direction::BOTH); - sc->setInnerContainerSize(Size(480, 320)); - sc->setContentSize(Size(100,100)); - sc->setScrollBarPositionFromCornerForHorizontal(Vec2(5, sc->getContentSize().height - 5)); - sc->setScrollBarPositionFromCornerForVertical(Vec2(sc->getContentSize().width - 5, 5)); + sc->setInnerContainerSize(Size(480.0f, 320.0f)); + sc->setContentSize(Size(100.0f,100.0f)); + sc->setScrollBarPositionFromCornerForHorizontal(Vec2(5.0f, sc->getContentSize().height - 5)); + sc->setScrollBarPositionFromCornerForVertical(Vec2(sc->getContentSize().width - 5, 5.0f)); sc->setScrollBarAutoHideEnabled(false); Size backgroundSize = background->getContentSize(); sc->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + (backgroundSize.width - sc->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + (backgroundSize.height - sc->getContentSize().height) / 2.0f)); - sc->scrollToPercentBothDirection(Vec2(50, 50), 1, true); + sc->scrollToPercentBothDirection(Vec2(50.0f, 50.0f), 1, true); ImageView* iv = ImageView::create("cocosui/Hello.png"); - iv->setPosition(Vec2(240, 160)); + iv->setPosition(Vec2(240.0f, 160.0f)); sc->addChild(iv); _uiLayer->addChild(sc); return true; @@ -427,7 +427,7 @@ bool UIScrollViewNestTest::init() (backgroundSize.width - scrollView->getContentSize().width) / 2.0f, (widgetSize.height - backgroundSize.height) / 2.0f + (backgroundSize.height - scrollView->getContentSize().height) / 2.0f)); - scrollView->setScrollBarPositionFromCornerForVertical(Vec2(scrollView->getContentSize().width - 4, 4)); + scrollView->setScrollBarPositionFromCornerForVertical(Vec2(scrollView->getContentSize().width - 4, 4.0f)); scrollView->setScrollBarColor(Color3B::BLUE); _uiLayer->addChild(scrollView); @@ -464,14 +464,14 @@ bool UIScrollViewNestTest::init() sc->setBackGroundColorType(Layout::BackGroundColorType::SOLID); sc->setBounceEnabled(true); sc->setDirection(ui::ScrollView::Direction::BOTH); - sc->setInnerContainerSize(Size(480, 320)); - sc->setContentSize(Size(100,100)); + sc->setInnerContainerSize(Size(480.0f, 320.0f)); + sc->setContentSize(Size(100.0f,100.0f)); sc->setPropagateTouchEvents(false); - sc->setPosition(Vec2(180,100)); - sc->scrollToPercentBothDirection(Vec2(50, 50), 1, true); - sc->setScrollBarPositionFromCorner(Vec2(4, 4)); + sc->setPosition(Vec2(180.0f,100.0f)); + sc->scrollToPercentBothDirection(Vec2(50.0f, 50.0f), 1, true); + sc->setScrollBarPositionFromCorner(Vec2(4.0f, 4.0f)); ImageView* iv = ImageView::create("cocosui/Hello.png"); - iv->setPosition(Vec2(240, 160)); + iv->setPosition(Vec2(240.0f, 160.0f)); sc->addChild(iv); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp index ea9da9f8ce..cc4a4e92dc 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp @@ -58,7 +58,7 @@ bool UISliderTest::init() // Add a label in which the slider alert will be displayed _displayValueLabel = TextBMFont::create("Move the slider thumb", "ccb/markerfelt24shadow.fnt"); - _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); _uiLayer->addChild(_displayValueLabel); @@ -85,7 +85,7 @@ bool UISliderTest::init() auto item1 = MenuItemLabel::create(label1, CC_CALLBACK_1(UISliderTest::printWidgetResources, this)); item1->setPosition(Vec2(VisibleRect::left().x + 60, VisibleRect::bottom().y + item1->getContentSize().height * 3)); auto pMenu1 = Menu::create(item1, nullptr); - pMenu1->setPosition(Vec2(0, 0)); + pMenu1->setPosition(Vec2(0.0f, 0.0f)); this->addChild(pMenu1, 10); return true; @@ -137,7 +137,7 @@ bool UISliderTest_Scale9::init() // Add a label in which the slider alert will be displayed _displayValueLabel = Text::create("Move the slider thumb","fonts/Marker Felt.ttf",32); - _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); _uiLayer->addChild(_displayValueLabel); @@ -153,8 +153,8 @@ bool UISliderTest_Scale9::init() slider->loadSlidBallTextures("cocosui/sliderThumb.png", "cocosui/sliderThumb.png", ""); slider->loadProgressBarTexture("cocosui/slider_bar_active_9patch.png"); slider->setScale9Enabled(true); - slider->setCapInsets(Rect(0, 0, 0, 0)); - slider->setContentSize(Size(250.0f, 19)); + slider->setCapInsets(Rect(0.0f, 0.0f, 0.0f, 0.0f)); + slider->setContentSize(Size(250.0f, 19.0f)); slider->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f/* + slider->getSize().height * 3.0f*/)); slider->addEventListener(CC_CALLBACK_2(UISliderTest_Scale9::sliderEvent, this)); _uiLayer->addChild(slider); @@ -195,7 +195,7 @@ bool UISliderTest_Scale9_State_Change::init() // Add a label in which the slider alert will be displayed _displayValueLabel = Text::create("Click the slider thumb", "fonts/Marker Felt.ttf", 32); - _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); _uiLayer->addChild(_displayValueLabel); @@ -212,8 +212,8 @@ bool UISliderTest_Scale9_State_Change::init() slider->loadProgressBarTexture("cocosui/slider_bar_active_9patch.png"); slider->ignoreContentAdaptWithSize(false); slider->setScale9Enabled(true); - slider->setCapInsets(Rect(0, 0, 0, 0)); - slider->setContentSize(Size(200.0f, 60)); + slider->setCapInsets(Rect(0.0f, 0.0f, 0.0f, 0.0f)); + slider->setContentSize(Size(200.0f, 60.0f)); slider->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f/* + slider->getSize().height * 3.0f*/)); slider->addTouchEventListener([=](Ref* /*sender*/, Widget::TouchEventType type){ if (type == Widget::TouchEventType::ENDED) { @@ -263,7 +263,7 @@ bool UISliderNormalDefaultTest::init() // Add a label in which the slider alert will be displayed _displayValueLabel = Text::create("","Arial",32); - _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + 100)); _uiLayer->addChild(_displayValueLabel); @@ -284,9 +284,9 @@ bool UISliderNormalDefaultTest::init() Slider* sliderScale9 = (Slider*)slider->clone(); sliderScale9->setScale9Enabled(true); - sliderScale9->setCapInsets(Rect(0, 0, 0, 0)); + sliderScale9->setCapInsets(Rect(0.0f, 0.0f, 0.0f, 0.0f)); sliderScale9->setZoomScale(1.0); - sliderScale9->setContentSize(Size(250.0f, 19)); + sliderScale9->setContentSize(Size(250.0f, 19.0f)); sliderScale9->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - 20)); _uiLayer->addChild(sliderScale9); @@ -316,7 +316,7 @@ bool UISliderDisabledDefaultTest::init() // Add a label in which the slider alert will be displayed _displayValueLabel = Text::create("","Arial",32); - _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + 100)); _uiLayer->addChild(_displayValueLabel); @@ -341,8 +341,8 @@ bool UISliderDisabledDefaultTest::init() sliderScale9->setScale9Enabled(true); sliderScale9->setEnabled(false); sliderScale9->setBright(false); - sliderScale9->setCapInsets(Rect(0, 0, 0, 0)); - sliderScale9->setContentSize(Size(250.0f, 10)); + sliderScale9->setCapInsets(Rect(0.0f, 0.0f, 0.0f, 0.0f)); + sliderScale9->setContentSize(Size(250.0f, 10.0f)); sliderScale9->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - 20)); _uiLayer->addChild(sliderScale9); @@ -374,7 +374,7 @@ bool UISliderNewEventCallbackTest::init() // Add a label in which the slider alert will be displayed _displayValueLabel = Text::create("","Arial",32); - _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + 100)); _uiLayer->addChild(_displayValueLabel); @@ -439,7 +439,7 @@ bool UISliderIssue12249Test::init() // Add a label in which the slider alert will be displayed _displayValueLabel = TextBMFont::create("Move the slider thumb", "ccb/markerfelt24shadow.fnt"); - _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); _uiLayer->addChild(_displayValueLabel); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp index 9526962176..75c72866fb 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp @@ -298,7 +298,7 @@ bool UITextFieldTest_LineWrap::init() // Add a label in which the textfield events will be displayed _displayValueLabel = Text::create("No Event","fonts/Marker Felt.ttf",30); - _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + _displayValueLabel->getContentSize().height * 1.5)); _uiLayer->addChild(_displayValueLabel); @@ -312,7 +312,7 @@ bool UITextFieldTest_LineWrap::init() TextField* textField = TextField::create("input words here","fonts/Marker Felt.ttf",30); textField->ignoreContentAdaptWithSize(false); ((Label*)(textField->getVirtualRenderer()))->setLineBreakWithoutSpace(true); - textField->setContentSize(Size(240, 170)); + textField->setContentSize(Size(240.0f, 170.0f)); textField->setString("input words here"); textField->setTextHorizontalAlignment(TextHAlignment::CENTER); textField->setTextVerticalAlignment(TextVAlignment::CENTER); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest.cpp index 79e6c7e1dd..9ca3ef6155 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest.cpp @@ -85,7 +85,7 @@ bool UITextTest_LineWrap::init() Text* text = Text::create("TextArea Widget can line wrap", "AmericanTypewriter",32); text->ignoreContentAdaptWithSize(false); - text->setContentSize(Size(280, 150)); + text->setContentSize(Size(280.0f, 150.0f)); text->setTextHorizontalAlignment(TextHAlignment::CENTER); text->setTouchScaleChangeEnabled(true); text->setTouchEnabled(true); @@ -95,10 +95,10 @@ bool UITextTest_LineWrap::init() { if ((int)text->getContentSize().width == 280) { - text->setContentSize(Size(380,100)); + text->setContentSize(Size(380.0f,100.0f)); }else { - text->setContentSize(Size(280, 150)); + text->setContentSize(Size(280.0f, 150.0f)); } } }); @@ -178,8 +178,8 @@ bool UILabelTest_Effect::init() auto disableOutlineBtn= Button::create(); disableOutlineBtn->setTitleText("Disable outline"); disableOutlineBtn->setTitleFontName("fonts/Marker Felt.ttf"); - disableOutlineBtn->setPosition(Vec2(widgetSize.width * 0.3, - widgetSize.height * 0.7)); + disableOutlineBtn->setPosition(Vec2(widgetSize.width * 0.3f, + widgetSize.height * 0.7f)); disableOutlineBtn->setPressedActionEnabled(true); disableOutlineBtn->addClickEventListener([=](Ref*){ outline_label->disableEffect(LabelEffect::OUTLINE); @@ -193,7 +193,7 @@ bool UILabelTest_Effect::init() auto disableGlowBtn = (Button*)disableOutlineBtn->clone(); disableGlowBtn->setPosition(disableOutlineBtn->getPosition() - + Vec2(buttonWidth + 40,0)); + + Vec2(buttonWidth + 40,0.0f)); disableGlowBtn->setTitleText("Disable Glow"); disableGlowBtn->addClickEventListener([=](Ref*){ glow_label->disableEffect(LabelEffect::GLOW); @@ -202,7 +202,7 @@ bool UILabelTest_Effect::init() auto disableShadowBtn = (Button*)disableGlowBtn->clone(); disableShadowBtn->setPosition(disableGlowBtn->getPosition() - + Vec2(buttonWidth + 40,0)); + + Vec2(buttonWidth + 40,0.0f)); disableShadowBtn->setTitleText("Disable Shadow"); disableShadowBtn->addClickEventListener([=](Ref*){ shadow_label->disableEffect(LabelEffect::SHADOW); @@ -257,7 +257,7 @@ bool UITextTest_IgnoreContentSize::init() leftText->setPosition(Vec2(widgetSize.width / 2.0f - 50, widgetSize.height / 2.0f)); leftText->ignoreContentAdaptWithSize(false); - leftText->setTextAreaSize(Size(60,60)); + leftText->setTextAreaSize(Size(60.0f,60.0f)); leftText->setString("Text line with break\nText line with break\nText line with break\nText line with break\n"); leftText->setTouchScaleChangeEnabled(true); leftText->setTouchEnabled(true); @@ -270,7 +270,7 @@ bool UITextTest_IgnoreContentSize::init() widgetSize.height / 2.0f)); rightText->setString("Text line with break\nText line with break\nText line with break\nText line with break\n"); //note:setTextAreaSize must be used with ignoreContentAdaptWithSize(false) - rightText->setTextAreaSize(Size(100,30)); + rightText->setTextAreaSize(Size(100.0f,30.0f)); rightText->ignoreContentAdaptWithSize(false); _uiLayer->addChild(rightText); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest.cpp index 42b0fea321..fe20dfa920 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest.cpp @@ -64,7 +64,7 @@ bool UIWidgetAddNodeTest::init() _uiLayer->addChild(widget); Sprite* sprite = Sprite::create("cocosui/ccicon.png"); - sprite->setPosition(Vec2(0, sprite->getBoundingBox().size.height / 4)); + sprite->setPosition(Vec2(0.0f, sprite->getBoundingBox().size.height / 4)); widget->addChild(sprite); return true; From 391780d5e2cc82ea62e46c4d91fbef27ebba0981 Mon Sep 17 00:00:00 2001 From: Arnold <40414978+PatriceJiang@users.noreply.github.com> Date: Tue, 24 Sep 2019 14:28:22 +0800 Subject: [PATCH 02/96] [v4] update external version to metal-support-16 (#20161) recompile libfreetype.a for ubuntu 18 --- external/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/config.json b/external/config.json index 255e47c604..49310152cb 100644 --- a/external/config.json +++ b/external/config.json @@ -1,5 +1,5 @@ { - "version": "metal-support-15", + "version": "metal-support-16", "zip_file_size": "146254799", "repo_name": "cocos2d-x-3rd-party-libs-bin", "repo_parent": "https://github.com/cocos2d/", From 9ee9917047a78e6000e79279f05d09594042ca8c Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Tue, 24 Sep 2019 14:28:44 +0800 Subject: [PATCH 03/96] fix Physics3DDebugDrawer (#20160) Since drawing type is ARRAY, should use instead. --- cocos/physics3d/CCPhysics3DDebugDrawer.cpp | 2 +- cocos/physics3d/CCPhysics3DDebugDrawer.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/cocos/physics3d/CCPhysics3DDebugDrawer.cpp b/cocos/physics3d/CCPhysics3DDebugDrawer.cpp index 5d97f096d9..8fcf00b45d 100644 --- a/cocos/physics3d/CCPhysics3DDebugDrawer.cpp +++ b/cocos/physics3d/CCPhysics3DDebugDrawer.cpp @@ -106,7 +106,7 @@ void Physics3DDebugDrawer::draw( Renderer *renderer) _dirty = false; } - _customCommand.setIndexDrawInfo(0, _buffer.size()); + _customCommand.setVertexDrawInfo(0, _buffer.size()); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, _buffer.size()); diff --git a/cocos/physics3d/CCPhysics3DDebugDrawer.h b/cocos/physics3d/CCPhysics3DDebugDrawer.h index e7283b5201..63e76c84dc 100644 --- a/cocos/physics3d/CCPhysics3DDebugDrawer.h +++ b/cocos/physics3d/CCPhysics3DDebugDrawer.h @@ -46,7 +46,6 @@ NS_CC_BEGIN * @{ */ -class GLProgram; class Renderer; /** @brief Physics3DDebugDrawer: debug draw the physics object, used by Physics3DWorld */ From 77a47957a74cf2b336e3ca31d943b2260437dc8f Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 24 Sep 2019 14:29:14 +0800 Subject: [PATCH 04/96] set software mode will slow down performance (#20155) --- .../cocos2dx/lib/Cocos2dxWebViewHelper.java | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxWebViewHelper.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxWebViewHelper.java index 0dffbbcfd0..d6ace93469 100755 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxWebViewHelper.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxWebViewHelper.java @@ -127,23 +127,15 @@ public class Cocos2dxWebViewHelper { } public static void setBackgroundTransparent(final int index) { - if(android.os.Build.VERSION.SDK_INT >10) { - sCocos2dxActivity.runOnUiThread(new Runnable() { - @Override - public void run() { - Cocos2dxWebView webView = webViews.get(index); - if (webView != null) { - webView.setBackgroundColor(Color.TRANSPARENT); - try { - Method method = webView.getClass().getMethod("setLayerType",int.class,Paint.class); - method.invoke(webView,WebView.LAYER_TYPE_SOFTWARE,null); - } catch (Exception e) { - e.printStackTrace(); - } - } + sCocos2dxActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + Cocos2dxWebView webView = webViews.get(index); + if (webView != null) { + webView.setBackgroundColor(Color.TRANSPARENT); } - }); - } + } + }); } public static void setOpacityWebView(final int index, final float opacity) { From 0d9b5ff4424419f6eb6bc226edc72d987623abd0 Mon Sep 17 00:00:00 2001 From: Arnold <40414978+PatriceJiang@users.noreply.github.com> Date: Wed, 25 Sep 2019 09:13:23 +0800 Subject: [PATCH 05/96] rebase (#20166) --- tools/cocos2d-console | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cocos2d-console b/tools/cocos2d-console index 7df5348d16..85195df42e 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 7df5348d16ef6c3e24d4ae6fc072e158ffc1738b +Subproject commit 85195df42e66a673d73597577133ba00b1fbd89f From 70bd4e967d622d0a7bb2a8443fb3e82ea0e40fbf Mon Sep 17 00:00:00 2001 From: minggo Date: Wed, 25 Sep 2019 09:51:43 +0800 Subject: [PATCH 06/96] update external to fix compiling error on Xcode 11 (#20165) --- external/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/config.json b/external/config.json index 49310152cb..0c9b170239 100644 --- a/external/config.json +++ b/external/config.json @@ -1,5 +1,5 @@ { - "version": "metal-support-16", + "version": "metal-support-17", "zip_file_size": "146254799", "repo_name": "cocos2d-x-3rd-party-libs-bin", "repo_parent": "https://github.com/cocos2d/", From 6de088ab98c4c87da7bc290f81f97a92de760c24 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Wed, 25 Sep 2019 14:32:26 +0800 Subject: [PATCH 07/96] fix C4244 warning (#20162) * fix C4244 warning * fix warning C4244 * fix compile error --- cocos/2d/CCActionCatmullRom.cpp | 4 +- cocos/2d/CCActionGrid3D.cpp | 35 ++++++----- cocos/2d/CCActionInterval.cpp | 8 +-- cocos/2d/CCActionPageTurn3D.cpp | 7 ++- cocos/2d/CCActionTiledGrid.cpp | 63 ++++++++++--------- .../Classes/ActionsTest/ActionsTest.cpp | 15 ++--- .../Classes/BillBoardTest/BillBoardTest.cpp | 8 +-- tests/cpp-tests/Classes/BugsTest/Bug-914.cpp | 2 +- .../cpp-tests/Classes/BugsTest/Bug-Child.cpp | 2 +- .../Classes/Camera3DTest/Camera3DTest.cpp | 26 ++++---- 10 files changed, 92 insertions(+), 78 deletions(-) diff --git a/cocos/2d/CCActionCatmullRom.cpp b/cocos/2d/CCActionCatmullRom.cpp index 4f1eb6d131..9e7d9f5c35 100644 --- a/cocos/2d/CCActionCatmullRom.cpp +++ b/cocos/2d/CCActionCatmullRom.cpp @@ -269,8 +269,8 @@ void CardinalSplineTo::update(float time) } else { - p = time / _deltaT; - lt = (time - _deltaT * (float)p) / _deltaT; + p = (ssize_t)(time / _deltaT); + lt = (time - _deltaT * p) / _deltaT; } // Interpolate diff --git a/cocos/2d/CCActionGrid3D.cpp b/cocos/2d/CCActionGrid3D.cpp index 4bf8960f88..5f69e581f8 100644 --- a/cocos/2d/CCActionGrid3D.cpp +++ b/cocos/2d/CCActionGrid3D.cpp @@ -71,10 +71,11 @@ void Waves3D::update(float time) { for (j = 0; j < _gridSize.height + 1; ++j) { - Vec3 v = getOriginalVertex(Vec2(i ,j)); + Vec2 pos((float)i, (float)j); + Vec3 v = getOriginalVertex(pos); v.z += (sinf((float)M_PI * time * _waves * 2 + (v.y+v.x) * 0.01f) * _amplitude * _amplitudeRate); //CCLOG("v.z offset is %f\n", (sinf((float)M_PI * time * _waves * 2 + (v.y+v.x) * .01f) * _amplitude * _amplitudeRate)); - setVertex(Vec2(i, j), v); + setVertex(pos, v); } } } @@ -347,7 +348,8 @@ void Lens3D::update(float /*time*/) { for (j = 0; j < _gridSize.height + 1; ++j) { - Vec3 v = getOriginalVertex(Vec2(i, j)); + Vec2 pos((float)i, (float)j); + Vec3 v = getOriginalVertex(pos); Vec2 vect = _position - Vec2(v.x, v.y); float r = vect.getLength(); @@ -371,7 +373,7 @@ void Lens3D::update(float /*time*/) } } - setVertex(Vec2(i, j), v); + setVertex(pos, v); } } @@ -439,7 +441,8 @@ void Ripple3D::update(float time) { for (j = 0; j < (_gridSize.height+1); ++j) { - Vec3 v = getOriginalVertex(Vec2(i, j)); + Vec2 pos((float)i, (float)j); + Vec3 v = getOriginalVertex(pos); Vec2 vect = _position - Vec2(v.x,v.y); float r = vect.getLength(); @@ -450,7 +453,7 @@ void Ripple3D::update(float time) v.z += (sinf( time*(float)M_PI * _waves * 2 + r * 0.1f) * _amplitude * _amplitudeRate * rate); } - setVertex(Vec2(i, j), v); + setVertex(pos, v); } } } @@ -506,7 +509,8 @@ void Shaky3D::update(float /*time*/) { for (j = 0; j < (_gridSize.height+1); ++j) { - Vec3 v = getOriginalVertex(Vec2(i ,j)); + Vec2 pos((float)i, (float)j); + Vec3 v = getOriginalVertex(pos); v.x += (rand() % (_randrange*2)) - _randrange; v.y += (rand() % (_randrange*2)) - _randrange; if (_shakeZ) @@ -514,7 +518,7 @@ void Shaky3D::update(float /*time*/) v.z += (rand() % (_randrange*2)) - _randrange; } - setVertex(Vec2(i, j), v); + setVertex(pos, v); } } } @@ -571,10 +575,11 @@ void Liquid::update(float time) { for (j = 1; j < _gridSize.height; ++j) { - Vec3 v = getOriginalVertex(Vec2(i, j)); + Vec2 pos((float)i, (float)j); + Vec3 v = getOriginalVertex(pos); v.x = (v.x + (sinf(time * (float)M_PI * _waves * 2 + v.x * .01f) * _amplitude * _amplitudeRate)); v.y = (v.y + (sinf(time * (float)M_PI * _waves * 2 + v.y * .01f) * _amplitude * _amplitudeRate)); - setVertex(Vec2(i, j), v); + setVertex(pos, v); } } } @@ -633,7 +638,8 @@ void Waves::update(float time) { for (j = 0; j < _gridSize.height + 1; ++j) { - Vec3 v = getOriginalVertex(Vec2(i, j)); + Vec2 pos((float)i, (float)j); + Vec3 v = getOriginalVertex(pos); if (_vertical) { @@ -645,7 +651,7 @@ void Waves::update(float time) v.y = (v.y + (sinf(time * (float)M_PI * _waves * 2 + v.x * .01f) * _amplitude * _amplitudeRate)); } - setVertex(Vec2(i, j), v); + setVertex(pos, v); } } } @@ -709,7 +715,8 @@ void Twirl::update(float time) { for (j = 0; j < (_gridSize.height+1); ++j) { - Vec3 v = getOriginalVertex(Vec2(i ,j)); + Vec2 pos((float)i, (float)j); + Vec3 v = getOriginalVertex(pos); Vec2 avg(i-(_gridSize.width/2.0f), j-(_gridSize.height/2.0f)); float r = avg.getLength(); @@ -724,7 +731,7 @@ void Twirl::update(float time) v.x = c.x + d.x; v.y = c.y + d.y; - setVertex(Vec2(i ,j), v); + setVertex(pos, v); } } } diff --git a/cocos/2d/CCActionInterval.cpp b/cocos/2d/CCActionInterval.cpp index b862e1f6ed..8dd7612254 100644 --- a/cocos/2d/CCActionInterval.cpp +++ b/cocos/2d/CCActionInterval.cpp @@ -2095,7 +2095,7 @@ Blink* Blink::reverse() const FadeIn* FadeIn::create(float d) { FadeIn* action = new (std::nothrow) FadeIn(); - if (action && action->initWithDuration(d,255.0f)) + if (action && action->initWithDuration(d,255)) { action->autorelease(); return action; @@ -2132,7 +2132,7 @@ void FadeIn::startWithTarget(cocos2d::Node *target) if (nullptr != _reverseAction) this->_toOpacity = this->_reverseAction->_fromOpacity; else - _toOpacity = 255.0f; + _toOpacity = 255; if (target) _fromOpacity = target->getOpacity(); @@ -2145,7 +2145,7 @@ void FadeIn::startWithTarget(cocos2d::Node *target) FadeOut* FadeOut::create(float d) { FadeOut* action = new (std::nothrow) FadeOut(); - if (action && action->initWithDuration(d,0.0f)) + if (action && action->initWithDuration(d,0)) { action->autorelease(); return action; @@ -2168,7 +2168,7 @@ void FadeOut::startWithTarget(cocos2d::Node *target) if (nullptr != _reverseAction) _toOpacity = _reverseAction->_fromOpacity; else - _toOpacity = 0.0f; + _toOpacity = 0; if (target) _fromOpacity = target->getOpacity(); diff --git a/cocos/2d/CCActionPageTurn3D.cpp b/cocos/2d/CCActionPageTurn3D.cpp index 2d5630de1b..b5f149c680 100644 --- a/cocos/2d/CCActionPageTurn3D.cpp +++ b/cocos/2d/CCActionPageTurn3D.cpp @@ -74,7 +74,7 @@ void PageTurn3D::update(float time) float deltaTheta = sqrtf(time); float theta = deltaTheta > 0.5f ? (float)M_PI_2*deltaTheta : (float)M_PI_2*(1-deltaTheta); - float rotateByYAxis = (2-time)* M_PI; + float rotateByYAxis = (2-time)* (float)M_PI; float sinTheta = sinf(theta); float cosTheta = cosf(theta); @@ -83,8 +83,9 @@ void PageTurn3D::update(float time) { for (int j = 0; j <= _gridSize.height; ++j) { + Vec2 pos((float)i, (float)j); // Get original vertex - Vec3 p = getOriginalVertex(Vec2(i ,j)); + Vec3 p = getOriginalVertex(pos); p.x -= getGridRect().origin.x; float R = sqrtf((p.x * p.x) + ((p.y - ay) * (p.y - ay))); @@ -124,7 +125,7 @@ void PageTurn3D::update(float time) // Set new coords p.x += getGridRect().origin.x; - setVertex(Vec2(i, j), p); + setVertex(pos, p); } } diff --git a/cocos/2d/CCActionTiledGrid.cpp b/cocos/2d/CCActionTiledGrid.cpp index a82e27faf6..946b01b342 100644 --- a/cocos/2d/CCActionTiledGrid.cpp +++ b/cocos/2d/CCActionTiledGrid.cpp @@ -82,7 +82,8 @@ void ShakyTiles3D::update(float /*time*/) { for (j = 0; j < _gridSize.height; ++j) { - Quad3 coords = getOriginalTile(Vec2(i, j)); + Vec2 pos((float)i, (float)j); + Quad3 coords = getOriginalTile(pos); // X coords.bl.x += ( rand() % (_randrange*2) ) - _randrange; @@ -104,7 +105,7 @@ void ShakyTiles3D::update(float /*time*/) coords.tr.z += ( rand() % (_randrange*2) ) - _randrange; } - setTile(Vec2(i, j), coords); + setTile(pos, coords); } } } @@ -155,7 +156,8 @@ void ShatteredTiles3D::update(float /*time*/) { for (j = 0; j < _gridSize.height; ++j) { - Quad3 coords = getOriginalTile(Vec2(i ,j)); + Vec2 pos((float)i, (float)j); + Quad3 coords = getOriginalTile(pos); // X coords.bl.x += ( rand() % (_randrange*2) ) - _randrange; @@ -177,7 +179,7 @@ void ShatteredTiles3D::update(float /*time*/) coords.tr.z += ( rand() % (_randrange*2) ) - _randrange; } - setTile(Vec2(i, j), coords); + setTile(pos, coords); } } @@ -240,14 +242,12 @@ void ShuffleTiles::shuffle(unsigned int *array, unsigned int len) Size ShuffleTiles::getDelta(const Size& pos) const { - Vec2 pos2; + unsigned int idx = static_cast(pos.width * _gridSize.height + pos.height); - unsigned int idx = pos.width * _gridSize.height + pos.height; + float x = _tilesOrder[idx] / (_gridSize.height - pos.width); + float y = (float)(_tilesOrder[idx] % (int)(_gridSize.height - pos.height)); - pos2.x = (float)(_tilesOrder[idx] / (int)_gridSize.height); - pos2.y = (float)(_tilesOrder[idx] % (int)_gridSize.height); - - return Size((int)(pos2.x - pos.width), (int)(pos2.y - pos.height)); + return Size(x, y); } void ShuffleTiles::placeTile(const Vec2& pos, Tile *t) @@ -279,7 +279,7 @@ void ShuffleTiles::startWithTarget(Node *target) std::srand(_seed); } - _tilesCount = _gridSize.width * _gridSize.height; + _tilesCount = (unsigned int)(_gridSize.width * _gridSize.height); _tilesOrder = new unsigned int[_tilesCount]; /** @@ -302,7 +302,7 @@ void ShuffleTiles::startWithTarget(Node *target) { tileArray->position.set((float)i, (float)j); tileArray->startPosition.set((float)i, (float)j); - tileArray->delta = getDelta(Size(i, j)); + tileArray->delta = getDelta(Size((float)i, (float)j)); ++tileArray; } } @@ -317,7 +317,7 @@ void ShuffleTiles::update(float time) for (int j = 0; j < _gridSize.height; ++j) { tileArray->position = Vec2((float)tileArray->delta.width, (float)tileArray->delta.height) * time; - placeTile(Vec2(i, j), tileArray); + placeTile(Vec2((float)i, (float)j), tileArray); ++tileArray; } } @@ -394,18 +394,19 @@ void FadeOutTRTiles::update(float time) { for (int j = 0; j < _gridSize.height; ++j) { - float distance = testFunc(Size(i, j), time); + Vec2 pos((float)i, (float)j); + float distance = testFunc(Size((float)i, (float)j), time); if ( distance == 0 ) { - turnOffTile(Vec2(i, j)); + turnOffTile(pos); } else if (distance < 1) { - transformTile(Vec2(i, j), distance); + transformTile(pos, distance); } else { - turnOnTile(Vec2(i, j)); + turnOnTile(pos); } } } @@ -604,7 +605,7 @@ void TurnOffTiles::startWithTarget(Node *target) std::srand(_seed); } - _tilesCount = _gridSize.width * _gridSize.height; + _tilesCount = (unsigned int)(_gridSize.width * _gridSize.height); _tilesOrder = new unsigned int[_tilesCount]; for (unsigned int i = 0; i < _tilesCount; ++i) @@ -623,7 +624,7 @@ void TurnOffTiles::update(float time) for (unsigned int i = 0; i < _tilesCount; i++ ) { t = _tilesOrder[i]; - Vec2 tilePos((t /_gridSize.height), (float)(t % (int)_gridSize.height)); + Vec2 tilePos(t / _gridSize.height, (float)(t % (unsigned int)_gridSize.height)); if ( i < l ) { @@ -678,7 +679,8 @@ void WavesTiles3D::update(float time) { for (int j = 0; j < _gridSize.height; j++ ) { - Quad3 coords = getOriginalTile(Vec2(i, j)); + Vec2 pos((float)i, (float)j); + Quad3 coords = getOriginalTile(pos); coords.bl.z = (sinf(time * (float)M_PI *_waves * 2 + (coords.bl.y+coords.bl.x) * .01f) * _amplitude * _amplitudeRate ); @@ -686,7 +688,7 @@ void WavesTiles3D::update(float time) coords.tl.z = coords.bl.z; coords.tr.z = coords.bl.z; - setTile(Vec2(i, j), coords); + setTile(pos, coords); } } } @@ -736,7 +738,8 @@ void JumpTiles3D::update(float time) { for (int j = 0; j < _gridSize.height; j++ ) { - Quad3 coords = getOriginalTile(Vec2(i, j)); + Vec2 pos((float)i, (float)j); + Quad3 coords = getOriginalTile(pos); if ( ((i+j) % 2) == 0 ) { @@ -753,7 +756,7 @@ void JumpTiles3D::update(float time) coords.tr.z += sinz2; } - setTile(Vec2(i, j), coords); + setTile(pos, coords); } } } @@ -778,7 +781,7 @@ bool SplitRows::initWithDuration(float duration, unsigned int rows) { _rows = rows; - return TiledGrid3DAction::initWithDuration(duration, Size(1, rows)); + return TiledGrid3DAction::initWithDuration(duration, Size(1.0f, (float)rows)); } SplitRows* SplitRows::clone() const @@ -797,7 +800,8 @@ void SplitRows::update(float time) { for (int j = 0; j < _gridSize.height; ++j) { - Quad3 coords = getOriginalTile(Vec2(0.0f, (float)j)); + Vec2 pos(0, (float)j); + Quad3 coords = getOriginalTile(pos); float direction = 1; if ( (j % 2 ) == 0 ) @@ -810,7 +814,7 @@ void SplitRows::update(float time) coords.tl.x += direction * _winSize.width * time; coords.tr.x += direction * _winSize.width * time; - setTile(Vec2(0.0f, (float)j), coords); + setTile(pos, coords); } } @@ -833,7 +837,7 @@ SplitCols* SplitCols::create(float duration, unsigned int cols) bool SplitCols::initWithDuration(float duration, unsigned int cols) { _cols = cols; - return TiledGrid3DAction::initWithDuration(duration, Size(cols, 1)); + return TiledGrid3DAction::initWithDuration(duration, Size((float)cols, 1.0f)); } SplitCols* SplitCols::clone() const @@ -852,7 +856,8 @@ void SplitCols::update(float time) { for (unsigned int i = 0; i < _gridSize.width; ++i) { - Quad3 coords = getOriginalTile(Vec2((float)i, 0.0f)); + Vec2 pos((float)i, 0); + Quad3 coords = getOriginalTile(pos); float direction = 1; if ( (i % 2 ) == 0 ) @@ -865,7 +870,7 @@ void SplitCols::update(float time) coords.tl.y += direction * _winSize.height * time; coords.tr.y += direction * _winSize.height * time; - setTile(Vec2((float)i, 0.0f), coords); + setTile(pos, coords); } } diff --git a/tests/cpp-tests/Classes/ActionsTest/ActionsTest.cpp b/tests/cpp-tests/Classes/ActionsTest/ActionsTest.cpp index 2d0217b3ca..f492fb1c6a 100644 --- a/tests/cpp-tests/Classes/ActionsTest/ActionsTest.cpp +++ b/tests/cpp-tests/Classes/ActionsTest/ActionsTest.cpp @@ -1425,12 +1425,13 @@ void ActionStacked::onEnter() void ActionStacked::addNewSpriteWithCoords(Vec2 p) { - int idx = CCRANDOM_0_1() * 1400 / 100; - int x = (idx%5) * 85; - int y = (idx/5) * 121; + int idx = static_cast(CCRANDOM_0_1() * 1400 / 100); + float w = 85.0f; + float h = 121.0f; + float x = (idx%5) * w; + float y = (idx/5) * h; - - auto sprite = Sprite::create("Images/grossini_dance_atlas.png", Rect(x,y,85,121)); + auto sprite = Sprite::create("Images/grossini_dance_atlas.png", Rect(x,y,w,h)); sprite->setPosition(p); this->addChild(sprite); @@ -2425,13 +2426,13 @@ void SequenceWithFinalInstant::onEnter() const auto action = cocos2d::Sequence::create - (cocos2d::DelayTime::create(0.05), + (cocos2d::DelayTime::create(0.05f), cocos2d::CallFunc::create(f), nullptr); _target->runAction(action); _manager->update(0); - _manager->update(0.05 - FLT_EPSILON); + _manager->update(0.05f - FLT_EPSILON); if ( action->isDone() && !called ) assert(false); diff --git a/tests/cpp-tests/Classes/BillBoardTest/BillBoardTest.cpp b/tests/cpp-tests/Classes/BillBoardTest/BillBoardTest.cpp index 8918c1d75e..49b908ab22 100644 --- a/tests/cpp-tests/Classes/BillBoardTest/BillBoardTest.cpp +++ b/tests/cpp-tests/Classes/BillBoardTest/BillBoardTest.cpp @@ -137,7 +137,7 @@ BillBoardTest::BillBoardTest() auto billboard = BillBoard::create(imgs[(unsigned int)(CCRANDOM_0_1() * 1 + 0.5f)]); billboard->setScale(0.5f); billboard->setPosition3D(Vec3(0.0f, 0.0f, CCRANDOM_MINUS1_1() * 150.0f)); - billboard->setOpacity(CCRANDOM_0_1() * 128 + 128); + billboard->setOpacity(static_cast(CCRANDOM_0_1() * 128 + 128)); _billboards.push_back(billboard); layer->addChild(billboard); _layerBillBoard->addChild(layer); @@ -238,10 +238,10 @@ void BillBoardTest::addNewBillBoardWithCoords(Vec3 p) std::string imgs[3] = {"Images/Icon.png", "Images/r2.png"}; for (unsigned int i = 0; i < 10; ++i) { - auto billboard = BillBoard::create(imgs[(unsigned int)(CCRANDOM_0_1() * 1 + 0.5)]); + auto billboard = BillBoard::create(imgs[(unsigned int)(CCRANDOM_0_1() * 1 + 0.5f)]); billboard->setScale(0.5f); billboard->setPosition3D(Vec3(p.x, p.y, -150.0f + 30 * i)); - billboard->setOpacity(CCRANDOM_0_1() * 128 + 128); + billboard->setOpacity(static_cast(CCRANDOM_0_1() * 128 + 128)); _layerBillBoard->addChild(billboard); _billboards.push_back(billboard); @@ -269,7 +269,7 @@ void BillBoardTest::addNewAniBillBoardWithCoords(Vec3 p) auto action = Animate::create(animation); billboardAni->runAction(RepeatForever::create(action)); - billboardAni->setOpacity(CCRANDOM_0_1() * 128 + 128); + billboardAni->setOpacity(static_cast(CCRANDOM_0_1() * 128 + 128)); _billboards.push_back(billboardAni); } } diff --git a/tests/cpp-tests/Classes/BugsTest/Bug-914.cpp b/tests/cpp-tests/Classes/BugsTest/Bug-914.cpp index 4e5ded14bc..f80774c7d1 100644 --- a/tests/cpp-tests/Classes/BugsTest/Bug-914.cpp +++ b/tests/cpp-tests/Classes/BugsTest/Bug-914.cpp @@ -45,7 +45,7 @@ bool Bug914Layer::init() for( int i=0;i < 5;i++) { layer = LayerColor::create(Color4B(i*20, i*20, i*20,255)); - layer->setContentSize(Size(i*100, i*100)); + layer->setContentSize(Size(i*100.0f, i*100.0f)); layer->setPosition(size.width/2, size.height/2); layer->setAnchorPoint(Vec2(0.5f, 0.5f)); layer->setIgnoreAnchorPointForPosition(false); diff --git a/tests/cpp-tests/Classes/BugsTest/Bug-Child.cpp b/tests/cpp-tests/Classes/BugsTest/Bug-Child.cpp index c4ab2d4b9d..abab81548f 100644 --- a/tests/cpp-tests/Classes/BugsTest/Bug-Child.cpp +++ b/tests/cpp-tests/Classes/BugsTest/Bug-Child.cpp @@ -118,7 +118,7 @@ bool BugCameraMask::init() updateSpriteMaskLabel(); auto label = Label::create(); - label->setPosition(size.width/2, size.height * 0.9); + label->setPosition(size.width/2, size.height * 0.9f); label->setString("Sprite should always run action."); addChild(label); diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp index 1c6d90d90c..79d0a2c174 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp @@ -363,16 +363,16 @@ void Camera3DTestDemo::onEnter() //draw x for( int j =-20; j<=20 ;j++) { - line->drawLine(Vec3(-100, 0, 5*j),Vec3(100,0,5*j),Color4F(1,0,0,1)); + line->drawLine(Vec3(-100.0f, 0.0f, 5.0f*j),Vec3(100.0f,0.0f,5.0f*j),Color4F(1,0,0,1)); } //draw z for( int j =-20; j<=20 ;j++) { - line->drawLine(Vec3(5*j, 0, -100),Vec3(5*j,0,100),Color4F(0,0,1,1)); + line->drawLine(Vec3(5.0f*j, 0.0f, -100.0f),Vec3(5.0f*j,0.0f,100.0f),Color4F(0,0,1,1)); } //draw y - line->drawLine(Vec3(0, -50, 0),Vec3(0,0,0),Color4F(0,0.5,0,1)); - line->drawLine(Vec3(0, 0, 0),Vec3(0,50,0),Color4F(0,1,0,1)); + line->drawLine(Vec3(0.0f, -50.0f, 0.0f),Vec3(0,0,0),Color4F(0,0.5,0,1)); + line->drawLine(Vec3(0, 0, 0),Vec3(0,50.0f,0),Color4F(0,1,0,1)); _layer3D->addChild(line); _layer3D->setCameraMask(2); @@ -1068,15 +1068,15 @@ void CameraArcBallDemo::onEnter() //draw x for( int j =-20; j<=20 ;j++) { - _drawGrid->drawLine(Vec3(-100, 0, 5*j),Vec3(100,0,5*j),Color4F(1,0,0,1)); + _drawGrid->drawLine(Vec3(-100.0f, 0, 5.0f*j),Vec3(100.0f,0,5.0f*j),Color4F(1,0,0,1)); } //draw z for( int j =-20; j<=20 ;j++) { - _drawGrid->drawLine(Vec3(5*j, 0, -100),Vec3(5*j,0,100),Color4F(0,0,1,1)); + _drawGrid->drawLine(Vec3(5.0f*j, 0, -100.0f),Vec3(5.0f*j,0,100.0f),Color4F(0,0,1,1)); } //draw y - _drawGrid->drawLine(Vec3(0, 0, 0),Vec3(0,50,0),Color4F(0,1,0,1)); + _drawGrid->drawLine(Vec3(0, 0, 0),Vec3(0,50.0f,0),Color4F(0,1,0,1)); _layer3D->addChild(_drawGrid); _layer3D->setCameraMask(2); @@ -1103,10 +1103,10 @@ void CameraArcBallDemo::onTouchsMoved( const std::vector &touchs, Event Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 prelocation = touchs[0]->getPreviousLocationInView(); Vec2 location = touchs[0]->getLocationInView(); - location.x = 2.0 * (location.x) / (visibleSize.width) - 1.0f; - location.y = 2.0 * (visibleSize.height - location.y) / (visibleSize.height) - 1.0f; - prelocation.x = 2.0 * (prelocation.x) / (visibleSize.width) - 1.0f; - prelocation.y = 2.0 * (visibleSize.height - prelocation.y) / (visibleSize.height) - 1.0f; + location.x = 2.0f * (location.x) / (visibleSize.width) - 1.0f; + location.y = 2.0f * (visibleSize.height - location.y) / (visibleSize.height) - 1.0f; + prelocation.x = 2.0f * (prelocation.x) / (visibleSize.width) - 1.0f; + prelocation.y = 2.0f * (visibleSize.height - prelocation.y) / (visibleSize.height) - 1.0f; Vec3 axes; float angle; @@ -1141,7 +1141,7 @@ void CameraArcBallDemo::calculateArcBall( cocos2d::Vec3 & axis, float & angle, f Vec3::cross(p2, p1, &axis); //calculate rotation axis axis.normalize(); - float t = (p2 - p1).length() / (2.0 * _radius); + float t = (p2 - p1).length() / (2.0f * _radius); //clamp -1 to 1 if (t > 1.0) t = 1.0; if (t < -1.0) t = -1.0; @@ -1160,7 +1160,7 @@ float CameraArcBallDemo::projectToSphere( float r, float x, float y ) } else //on hyperbola { - t = r / 1.41421356237309504880; + t = r / 1.41421356237309504880f; z = t*t / d; } return z; From 42c43a53a1738c90f5948305dc40939145c6e5bd Mon Sep 17 00:00:00 2001 From: minggo Date: Wed, 25 Sep 2019 14:33:18 +0800 Subject: [PATCH 08/96] fix crash when back with playing video (#20169) --- .../UIVideoPlayerTest/UIVideoPlayerTest.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.cpp index 2e1ac03a6f..d2d9f9d487 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.cpp @@ -43,6 +43,10 @@ bool VideoPlayerTest::init() _visibleRect = Director::getInstance()->getOpenGLView()->getVisibleRect(); + // Should create video first to make sure video is destryed first. If not, then may crash. + // Because when destroying video, it will stop video which may trigger stopped event listener. + createVideo(); + MenuItemFont::setFontSize(16); auto fullSwitch = MenuItemFont::create("FullScreenSwitch", CC_CALLBACK_1(VideoPlayerTest::menuFullScreenCallback, this)); @@ -95,8 +99,6 @@ bool VideoPlayerTest::init() _loopStatusLabel->setAnchorPoint(Vec2::ANCHOR_MIDDLE_RIGHT); _loopStatusLabel->setPosition(Vec2(_visibleRect.origin.x + _visibleRect.size.width - 10,_visibleRect.origin.y + 185)); _uiLayer->addChild(_loopStatusLabel); - - createVideo(); return true; } From 774a90792cf931691ed3b8b1dab7a591feb89c0b Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 26 Sep 2019 16:09:59 +0800 Subject: [PATCH 09/96] fix link error on iOS simulator (#20172) --- cmake/Modules/CocosConfigDepend.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/Modules/CocosConfigDepend.cmake b/cmake/Modules/CocosConfigDepend.cmake index 8d0969a3ba..8919459869 100644 --- a/cmake/Modules/CocosConfigDepend.cmake +++ b/cmake/Modules/CocosConfigDepend.cmake @@ -24,7 +24,6 @@ macro(cocos2dx_depend) elseif(APPLE) include_directories(/System/Library/Frameworks) - find_library(ICONV_LIBRARY iconv) find_library(AUDIOTOOLBOX_LIBRARY AudioToolbox) find_library(FOUNDATION_LIBRARY Foundation) find_library(OPENAL_LIBRARY OpenAL) @@ -36,7 +35,6 @@ macro(cocos2dx_depend) ${AUDIOTOOLBOX_LIBRARY} ${QUARTZCORE_LIBRARY} ${FOUNDATION_LIBRARY} - ${ICONV_LIBRARY} ${GAMECONTROLLER_LIBRARY} ${METAL_LIBRARY} ) @@ -49,6 +47,7 @@ macro(cocos2dx_depend) find_library(APPLICATIONSERVICES_LIBRARY ApplicationServices) find_library(IOKIT_LIBRARY IOKit) find_library(APPKIT_LIBRARY AppKit) + find_library(ICONV_LIBRARY iconv) list(APPEND PLATFORM_SPECIFIC_LIBS ${COCOA_LIBRARY} ${OPENGL_LIBRARY} @@ -56,6 +55,7 @@ macro(cocos2dx_depend) ${IOKIT_LIBRARY} ${COCOS_APPLE_LIBS} ${APPKIT_LIBRARY} + ${ICONV_LIBRARY} ) elseif(IOS) # Locate system libraries on iOS @@ -68,7 +68,6 @@ macro(cocos2dx_depend) find_library(SECURITY_LIBRARY Security) find_library(CORE_GRAPHICS_LIBRARY CoreGraphics) find_library(AV_FOUNDATION_LIBRARY AVFoundation) - find_library(Z_LIBRARY z) find_library(WEBKIT_LIBRARY WebKit) list(APPEND PLATFORM_SPECIFIC_LIBS ${UIKIT_LIBRARY} @@ -80,9 +79,10 @@ macro(cocos2dx_depend) ${SECURITY_LIBRARY} ${CORE_GRAPHICS_LIBRARY} ${AV_FOUNDATION_LIBRARY} - ${Z_LIBRARY} ${WEBKIT_LIBRARY} ${COCOS_APPLE_LIBS} + "/usr/lib/libz.dylib" + "/usr/lib/libiconv.dylib" ) endif() endif() From d3359c3e4ad32d0e1238c362fed3dc9ab70c14ff Mon Sep 17 00:00:00 2001 From: Arnold <40414978+PatriceJiang@users.noreply.github.com> Date: Thu, 26 Sep 2019 16:10:53 +0800 Subject: [PATCH 10/96] [v4] update submodule cocos2d-console (#20170) disable compile lua scripts on linux --- tools/cocos2d-console | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cocos2d-console b/tools/cocos2d-console index 85195df42e..d437aeb253 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 85195df42e66a673d73597577133ba00b1fbd89f +Subproject commit d437aeb2530884f282a3194fbd4490c9be7edbe6 From 4ac3f94774a87a46c0aae248b4dde854ee3b9fb2 Mon Sep 17 00:00:00 2001 From: rh101 Date: Thu, 26 Sep 2019 18:11:23 +1000 Subject: [PATCH 11/96] V4 RenderTexture PMA flag fix (#20153) * This is to ensure the RenderTexture internal texture2D PMA flag is set to the correct value. [CCSprite.cpp] Blending mode needs to be set based on the PMA flag of the texture if using Sprite::initWithTexture(). * [CCSprite.cpp] Removed redundant code related to blending mode and opacityModifyRGB when creating a sprite with a texture. --- cocos/2d/CCRenderTexture.cpp | 12 +++++++++--- cocos/2d/CCSprite.cpp | 4 ---- cocos/renderer/CCTexture2D.cpp | 29 +++++++++++------------------ cocos/renderer/CCTexture2D.h | 11 +++++++---- 4 files changed, 27 insertions(+), 29 deletions(-) diff --git a/cocos/2d/CCRenderTexture.cpp b/cocos/2d/CCRenderTexture.cpp index c66d1a3ddc..c7bdcf7599 100644 --- a/cocos/2d/CCRenderTexture.cpp +++ b/cocos/2d/CCRenderTexture.cpp @@ -196,7 +196,7 @@ bool RenderTexture::initWithWidthAndHeight(int w, int h, backend::PixelFormat fo _texture2D = new (std::nothrow) Texture2D(); if (_texture2D) { - _texture2D->initWithBackendTexture(texture); + _texture2D->initWithBackendTexture(texture, CC_ENABLE_PREMULTIPLIED_ALPHA != 0); _texture2D->setRenderTarget(true); texture->release(); } @@ -240,8 +240,14 @@ bool RenderTexture::initWithWidthAndHeight(int w, int h, backend::PixelFormat fo #if defined(CC_USE_GL) || defined(CC_USE_GLES) _sprite->setFlippedY(true); #endif - _sprite->setBlendFunc( BlendFunc::ALPHA_PREMULTIPLIED ); + +#if CC_ENABLE_PREMULTIPLIED_ALPHA != 0 + _sprite->setBlendFunc(BlendFunc::ALPHA_PREMULTIPLIED); _sprite->setOpacityModifyRGB(true); +#else + _sprite->setBlendFunc(BlendFunc::ALPHA_NON_PREMULTIPLIED); + _sprite->setOpacityModifyRGB(false); +#endif // Disabled by default. _autoDraw = false; @@ -472,7 +478,7 @@ void RenderTexture::newImage(std::function imageCallback, bool fli Image *image = new (std::nothrow) Image(); auto initCallback = [&, savedBufferWidth, savedBufferHeight, imageCallback](Image* image, const unsigned char* tempData){ - image->initWithRawData(tempData, savedBufferWidth * savedBufferHeight * 4, savedBufferWidth, savedBufferHeight, 8, true); + image->initWithRawData(tempData, savedBufferWidth * savedBufferHeight * 4, savedBufferWidth, savedBufferHeight, 8, _texture2D->hasPremultipliedAlpha()); imageCallback(image); }; auto callback = std::bind(initCallback, image, std::placeholders::_1); diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index 0e1f1709ab..656b52e243 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -259,10 +259,6 @@ bool Sprite::initWithTexture(Texture2D *texture, const Rect& rect, bool rotated) _recursiveDirty = false; setDirty(false); - _opacityModifyRGB = true; - - _blendFunc = BlendFunc::ALPHA_PREMULTIPLIED; - _flippedX = _flippedY = false; // default transform anchor: center diff --git a/cocos/renderer/CCTexture2D.cpp b/cocos/renderer/CCTexture2D.cpp index 58e58fa2f1..c2eb02e162 100644 --- a/cocos/renderer/CCTexture2D.cpp +++ b/cocos/renderer/CCTexture2D.cpp @@ -222,7 +222,7 @@ bool Texture2D::hasPremultipliedAlpha() const return _hasPremultipliedAlpha; } -bool Texture2D::initWithData(const void *data, ssize_t dataLen, backend::PixelFormat pixelFormat, backend::PixelFormat renderFormat, int pixelsWide, int pixelsHigh, const Size& /*contentSize*/) +bool Texture2D::initWithData(const void *data, ssize_t dataLen, backend::PixelFormat pixelFormat, backend::PixelFormat renderFormat, int pixelsWide, int pixelsHigh, const Size& /*contentSize*/, bool preMultipliedAlpha) { CCASSERT(dataLen>0 && pixelsWide>0 && pixelsHigh>0, "Invalid size"); @@ -230,10 +230,10 @@ bool Texture2D::initWithData(const void *data, ssize_t dataLen, backend::PixelFo MipmapInfo mipmap; mipmap.address = (unsigned char*)data; mipmap.len = static_cast(dataLen); - return initWithMipmaps(&mipmap, 1, pixelFormat, renderFormat, pixelsWide, pixelsHigh); + return initWithMipmaps(&mipmap, 1, pixelFormat, renderFormat, pixelsWide, pixelsHigh, preMultipliedAlpha); } -bool Texture2D::initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, backend::PixelFormat pixelFormat, backend::PixelFormat renderFormat, int pixelsWide, int pixelsHigh) +bool Texture2D::initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, backend::PixelFormat pixelFormat, backend::PixelFormat renderFormat, int pixelsWide, int pixelsHigh, bool preMultipliedAlpha) { //the pixelFormat must be a certain value CCASSERT(pixelFormat != PixelFormat::NONE && pixelFormat != PixelFormat::AUTO, "the \"pixelFormat\" param must be a certain value!"); @@ -341,7 +341,7 @@ bool Texture2D::initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, backend::Pi _maxS = 1; _maxT = 1; - _hasPremultipliedAlpha = false; + _hasPremultipliedAlpha = preMultipliedAlpha; _hasMipmaps = mipmapsNum > 1; return true; @@ -441,11 +441,8 @@ bool Texture2D::initWithImage(Image *image, backend::PixelFormat format) //pixel format of data is not converted, renderFormat can be different from pixelFormat //it will be done later - initWithMipmaps(image->getMipmaps(), image->getNumberOfMipmaps(), image->getPixelFormat(), renderFormat, imageWidth, imageHeight); - - // set the premultiplied tag - _hasPremultipliedAlpha = image->hasPremultipliedAlpha(); - + initWithMipmaps(image->getMipmaps(), image->getNumberOfMipmaps(), image->getPixelFormat(), renderFormat, imageWidth, imageHeight, image->hasPremultipliedAlpha()); + return true; } else if (image->isCompressed()) @@ -455,20 +452,14 @@ bool Texture2D::initWithImage(Image *image, backend::PixelFormat format) CCLOG("cocos2d: WARNING: This image is compressed and we can't convert it for now"); } - initWithData(tempData, tempDataLen, image->getPixelFormat(), imageWidth, imageHeight, imageSize); - - // set the premultiplied tag - _hasPremultipliedAlpha = image->hasPremultipliedAlpha(); + initWithData(tempData, tempDataLen, image->getPixelFormat(), imageWidth, imageHeight, imageSize, image->hasPremultipliedAlpha()); return true; } else { //after conversion, renderFormat == pixelFormat of data - initWithData(tempData, tempDataLen, imagePixelFormat, renderFormat, imageWidth, imageHeight, imageSize); - - // set the premultiplied tag - _hasPremultipliedAlpha = image->hasPremultipliedAlpha(); + initWithData(tempData, tempDataLen, imagePixelFormat, renderFormat, imageWidth, imageHeight, imageSize, image->hasPremultipliedAlpha()); return true; } @@ -570,7 +561,7 @@ bool Texture2D::initWithString(const char *text, const FontDefinition& textDefin return ret; } -bool Texture2D::initWithBackendTexture(backend::TextureBackend *texture) +bool Texture2D::initWithBackendTexture(backend::TextureBackend *texture, bool preMultipliedAlpha) { CC_SAFE_RETAIN(texture); CC_SAFE_RELEASE(_texture); @@ -578,6 +569,8 @@ bool Texture2D::initWithBackendTexture(backend::TextureBackend *texture) CC_ASSERT(_texture); _pixelsWide = _contentSize.width = _texture->getWidth(); _pixelsHigh = _contentSize.height = _texture->getHeight(); + _hasPremultipliedAlpha = preMultipliedAlpha; + return true; } diff --git a/cocos/renderer/CCTexture2D.h b/cocos/renderer/CCTexture2D.h index 3ff5778794..7dc2b81e2c 100644 --- a/cocos/renderer/CCTexture2D.h +++ b/cocos/renderer/CCTexture2D.h @@ -138,10 +138,11 @@ public: @param pixelsWide The image width. @param pixelsHigh The image height. @param contentSize The image content size. + @param preMultipliedAlpha The texture has premultiplied alpha * @js NA * @lua NA */ - bool initWithData(const void *data, ssize_t dataLen, backend::PixelFormat pixelFormat, int pixelsWide, int pixelsHigh, const Size& contentSize) { return initWithData(data, dataLen, pixelFormat, pixelFormat, pixelsWide, pixelsHigh, contentSize);} + bool initWithData(const void *data, ssize_t dataLen, backend::PixelFormat pixelFormat, int pixelsWide, int pixelsHigh, const Size& contentSize, bool preMultipliedAlpha = false) { return initWithData(data, dataLen, pixelFormat, pixelFormat, pixelsWide, pixelsHigh, contentSize, preMultipliedAlpha);} /** Initializes with a texture2d with data. @@ -152,10 +153,11 @@ public: @param pixelsWide The image width. @param pixelsHigh The image height. @param contentSize The image content size. + @param preMultipliedAlpha The texture has premultiplied alpha * @js NA * @lua NA */ - bool initWithData(const void *data, ssize_t dataLen, backend::PixelFormat pixelFormat, backend::PixelFormat renderFormat, int pixelsWide, int pixelsHigh, const Size& contentSize); + bool initWithData(const void *data, ssize_t dataLen, backend::PixelFormat pixelFormat, backend::PixelFormat renderFormat, int pixelsWide, int pixelsHigh, const Size& contentSize, bool preMultipliedAlpha = false); /** Initializes with mipmaps. @@ -164,8 +166,9 @@ public: @param pixelFormat The image pixelFormat. @param pixelsWide The image width. @param pixelsHigh The image height. + @param preMultipliedAlpha The texture has premultiplied alpha */ - bool initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, backend::PixelFormat pixelFormat, backend::PixelFormat renderFormat, int pixelsWide, int pixelsHigh); + bool initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, backend::PixelFormat pixelFormat, backend::PixelFormat renderFormat, int pixelsWide, int pixelsHigh, bool preMultipliedAlpha = false); /** Update with texture data. @@ -228,7 +231,7 @@ public: bool initWithString(const char *text, const FontDefinition& textDefinition); //TODO: minggo: is it resaonable? - bool initWithBackendTexture(backend::TextureBackend* texture); + bool initWithBackendTexture(backend::TextureBackend* texture, bool preMultipliedAlpha = false); void setRenderTarget(bool renderTarget); inline bool isRenderTarget() const { return _isRenderTarget; } From 41163710530ea8c197af1396be4f451ca3fd9845 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Thu, 26 Sep 2019 17:35:39 +0800 Subject: [PATCH 12/96] [ci skip][AUTO]: updating luabinding & cocos_file.json automatically (#20176) --- .../lua-bindings/auto/lua_cocos2dx_auto.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp index 6a05ff6ea6..141b0e15b6 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp @@ -2603,6 +2603,23 @@ int lua_cocos2dx_Texture2D_initWithBackendTexture(lua_State* tolua_S) tolua_pushboolean(tolua_S,(bool)ret); return 1; } + if (argc == 2) + { + cocos2d::backend::TextureBackend* arg0; + bool arg1; + + ok &= luaval_to_object(tolua_S, 2, "ccb.TextureBackend",&arg0, "cc.Texture2D:initWithBackendTexture"); + + ok &= luaval_to_boolean(tolua_S, 3,&arg1, "cc.Texture2D:initWithBackendTexture"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Texture2D_initWithBackendTexture'", nullptr); + return 0; + } + bool ret = cobj->initWithBackendTexture(arg0, arg1); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Texture2D:initWithBackendTexture",argc, 1); return 0; From 49a3b5b228f59769494037625788582f3906a8fc Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Tue, 8 Oct 2019 15:06:47 +0800 Subject: [PATCH 13/96] fix auto test fails (#20183) needs an integer position --- cocos/2d/CCActionTiledGrid.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cocos/2d/CCActionTiledGrid.cpp b/cocos/2d/CCActionTiledGrid.cpp index 946b01b342..3faae36bd8 100644 --- a/cocos/2d/CCActionTiledGrid.cpp +++ b/cocos/2d/CCActionTiledGrid.cpp @@ -624,7 +624,9 @@ void TurnOffTiles::update(float time) for (unsigned int i = 0; i < _tilesCount; i++ ) { t = _tilesOrder[i]; - Vec2 tilePos(t / _gridSize.height, (float)(t % (unsigned int)_gridSize.height)); + //needs integer value + unsigned int x = (unsigned int)(t / _gridSize.height); + Vec2 tilePos((float)x, (float)(t % (unsigned int)_gridSize.height)); if ( i < l ) { From ab04e037b78632620c441784aeb9e13b18c6658f Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Tue, 8 Oct 2019 15:07:46 +0800 Subject: [PATCH 14/96] fix PhysicsContactTest (#20171) modify the item relative position to avoid inappropriate operation. --- tests/cpp-tests/Classes/BaseTest.h | 3 ++ .../Classes/PhysicsTest/PhysicsTest.cpp | 34 +++++++++++-------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/tests/cpp-tests/Classes/BaseTest.h b/tests/cpp-tests/Classes/BaseTest.h index 2dd3dd9ed0..3982e6ee1c 100644 --- a/tests/cpp-tests/Classes/BaseTest.h +++ b/tests/cpp-tests/Classes/BaseTest.h @@ -91,6 +91,9 @@ public: void setTestCaseName(const std::string& name) { _testCaseName = name; } std::string getTestCaseName() const { return _testCaseName; } + const cocos2d::Label* getSubtitleLable() const { return _subtitleLabel; } + const cocos2d::MenuItemImage* getRestartTestItem() const { return _restartTestItem; } + virtual void onEnter() override; CC_CONSTRUCTOR_ACCESS: virtual bool init() override; diff --git a/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp b/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp index 4010999fcc..1ee4b61928 100644 --- a/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp +++ b/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp @@ -1298,14 +1298,16 @@ void PhysicsContactTest::onEnter() decrease1->setTag(1); increase1->setTag(1); + float prevMenuPos = getSubtitleLable()->getPosition().y - getSubtitleLable()->getContentSize().height; + float menuStep = (getSubtitleLable()->getPosition().y -getRestartTestItem()->getPosition().y)*0.25f; auto menu1 = Menu::create(decrease1, increase1, nullptr); menu1->alignItemsHorizontally(); - menu1->setPosition(Vec2(s.width / 2, s.height - 50)); + menu1->setPosition(Vec2(s.width / 2, prevMenuPos)); addChild(menu1, 1); auto label = Label::createWithTTF("yellow box", "fonts/arial.ttf", 32); addChild(label, 1); - label->setPosition(Vec2(s.width / 2 - 150, s.height - 50)); + label->setPosition(Vec2(s.width / 2 - 150, prevMenuPos)); auto decrease2 = MenuItemFont::create(" - ", CC_CALLBACK_1(PhysicsContactTest::onDecrease, this)); decrease2->setColor(Color3B(0, 200, 20)); @@ -1316,13 +1318,13 @@ void PhysicsContactTest::onEnter() auto menu2 = Menu::create(decrease2, increase2, nullptr); menu2->alignItemsHorizontally(); - menu2->setPosition(Vec2(s.width / 2, s.height - 90)); + menu2->setPosition(Vec2(s.width / 2, prevMenuPos -= menuStep)); addChild(menu2, 1); label = Label::createWithTTF("blue box", "fonts/arial.ttf", 32); addChild(label, 1); - label->setPosition(Vec2(s.width / 2 - 150, s.height - 90)); - + label->setPosition(Vec2(s.width / 2 - 150, prevMenuPos)); + auto decrease3 = MenuItemFont::create(" - ", CC_CALLBACK_1(PhysicsContactTest::onDecrease, this)); decrease3->setColor(Color3B(0, 200, 20)); auto increase3 = MenuItemFont::create(" + ", CC_CALLBACK_1(PhysicsContactTest::onIncrease, this)); @@ -1332,13 +1334,13 @@ void PhysicsContactTest::onEnter() auto menu3 = Menu::create(decrease3, increase3, nullptr); menu3->alignItemsHorizontally(); - menu3->setPosition(Vec2(s.width / 2, s.height - 130)); + menu3->setPosition(Vec2(s.width / 2, prevMenuPos -= menuStep)); addChild(menu3, 1); label = Label::createWithTTF("yellow triangle", "fonts/arial.ttf", 32); addChild(label, 1); - label->setPosition(Vec2(s.width / 2 - 150, s.height - 130)); - + label->setPosition(Vec2(s.width / 2 - 150, prevMenuPos)); + auto decrease4 = MenuItemFont::create(" - ", CC_CALLBACK_1(PhysicsContactTest::onDecrease, this)); decrease4->setColor(Color3B(0, 200, 20)); auto increase4 = MenuItemFont::create(" + ", CC_CALLBACK_1(PhysicsContactTest::onIncrease, this)); @@ -1348,13 +1350,13 @@ void PhysicsContactTest::onEnter() auto menu4 = Menu::create(decrease4, increase4, nullptr); menu4->alignItemsHorizontally(); - menu4->setPosition(Vec2(s.width / 2, s.height - 170)); + menu4->setPosition(Vec2(s.width / 2, prevMenuPos -= menuStep)); addChild(menu4, 1); label = Label::createWithTTF("blue triangle", "fonts/arial.ttf", 32); addChild(label, 1); - label->setPosition(Vec2(s.width / 2 - 150, s.height - 170)); - + label->setPosition(Vec2(s.width / 2 - 150, prevMenuPos)); + resetTest(); } @@ -1414,28 +1416,30 @@ void PhysicsContactTest::resetTest() this->addChild(root); auto s = VisibleRect::getVisibleRect().size; + float prevMenuPos = getSubtitleLable()->getPosition().y - getSubtitleLable()->getContentSize().height; + float menuStep = (getSubtitleLable()->getPosition().y - getRestartTestItem()->getPosition().y)*0.25f; std::string strNum; char buffer[10]; sprintf(buffer, "%d", _yellowBoxNum); auto label = Label::createWithTTF(buffer, "fonts/arial.ttf", 32); root->addChild(label, 1); - label->setPosition(Vec2(s.width / 2, s.height - 50)); + label->setPosition(Vec2(s.width / 2, prevMenuPos)); sprintf(buffer, "%d", _blueBoxNum); label = Label::createWithTTF(buffer, "fonts/arial.ttf", 32); root->addChild(label, 1); - label->setPosition(Vec2(s.width / 2, s.height - 90)); + label->setPosition(Vec2(s.width / 2, prevMenuPos-=menuStep)); sprintf(buffer, "%d", _yellowTriangleNum); label = Label::createWithTTF(buffer, "fonts/arial.ttf", 32); root->addChild(label, 1); - label->setPosition(Vec2(s.width / 2, s.height - 130)); + label->setPosition(Vec2(s.width / 2, prevMenuPos-=menuStep)); sprintf(buffer, "%d", _blueTriangleNum); label = Label::createWithTTF(buffer, "fonts/arial.ttf", 32); root->addChild(label, 1); - label->setPosition(Vec2(s.width / 2, s.height - 170)); + label->setPosition(Vec2(s.width / 2, prevMenuPos-=menuStep)); auto wall = Node::create(); wall->addComponent(PhysicsBody::createEdgeBox(VisibleRect::getVisibleRect().size, PhysicsMaterial(0.1f, 1, 0.0f))); From c7020fbb5fdd5e7e454282556176ecf3ddeb27ab Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Wed, 9 Oct 2019 17:50:32 +0800 Subject: [PATCH 15/96] fix C4244 warning (#20173) --- cocos/2d/CCAutoPolygon.cpp | 35 ++++++------ cocos/2d/CCCamera.cpp | 2 +- cocos/2d/CCDrawNode.cpp | 4 +- cocos/2d/CCFastTMXLayer.cpp | 45 ++++++++-------- cocos/2d/CCFontAtlas.cpp | 16 +++--- cocos/2d/CCFontAtlasCache.cpp | 2 +- cocos/2d/CCFontCharMap.cpp | 2 +- cocos/2d/CCFontFNT.cpp | 4 +- cocos/2d/CCFontFreeType.cpp | 47 ++++++++-------- cocos/2d/CCGrid.cpp | 53 ++++++++++--------- cocos/3d/CCBundle3D.cpp | 36 ++++++------- cocos/audio/win32/AudioCache.cpp | 2 +- cocos/audio/win32/AudioPlayer.cpp | 2 +- cocos/base/CCConsole.cpp | 16 +++--- cocos/base/CCDirector.cpp | 12 ++--- cocos/base/base64.cpp | 6 +-- cocos/platform/CCGLView.cpp | 12 ++--- .../platform/desktop/CCGLViewImpl-desktop.cpp | 30 +++++------ cocos/platform/win32/CCApplication-win32.cpp | 2 +- cocos/platform/win32/CCDevice-win32.cpp | 6 +-- 20 files changed, 170 insertions(+), 164 deletions(-) diff --git a/cocos/2d/CCAutoPolygon.cpp b/cocos/2d/CCAutoPolygon.cpp index a9e0f3f6f3..e35b62a749 100644 --- a/cocos/2d/CCAutoPolygon.cpp +++ b/cocos/2d/CCAutoPolygon.cpp @@ -166,7 +166,7 @@ float PolygonInfo::getArea() const float area = 0; V3F_C4B_T2F *verts = triangles.verts; unsigned short *indices = triangles.indices; - for(int i = 0; i < triangles.indexCount; i+=3) + for(unsigned int i = 0; i < triangles.indexCount; i+=3) { auto A = verts[indices[i]].vertices; auto B = verts[indices[i+1]].vertices; @@ -249,13 +249,13 @@ unsigned int AutoPolygon::getSquareValue(unsigned int x, unsigned int y, const R //NOTE: due to the way we pick points from texture, rect needs to be smaller, otherwise it goes outside 1 pixel auto fixedRect = Rect(rect.origin, rect.size-Size(2,2)); - Vec2 tl((float)x-1, (float)y-1); + Vec2 tl = Vec2(x-1.0f, y-1.0f); sv += (fixedRect.containsPoint(tl) && getAlphaByPos(tl) > threshold)? 1 : 0; - Vec2 tr((float)x, (float)y-1); + Vec2 tr = Vec2(x-0.0f, y-1.0f); sv += (fixedRect.containsPoint(tr) && getAlphaByPos(tr) > threshold)? 2 : 0; - Vec2 bl((float)x-1, (float)y); + Vec2 bl = Vec2(x-1.0f, y-0.0f); sv += (fixedRect.containsPoint(bl) && getAlphaByPos(bl) > threshold)? 4 : 0; - Vec2 br((float)x, (float)y); + Vec2 br = Vec2(x-0.0f, y-0.0f); sv += (fixedRect.containsPoint(br) && getAlphaByPos(br) > threshold)? 8 : 0; CCASSERT(sv != 0 && sv != 15, "square value should not be 0, or 15"); return sv; @@ -267,8 +267,8 @@ std::vector AutoPolygon::marchSquare(const Rect& rect, const Vec2 int stepy = 0; int prevx = 0; int prevy = 0; - int startx = start.x; - int starty = start.y; + int startx = (int)start.x; + int starty = (int)start.y; int curx = startx; int cury = starty; unsigned int count = 0; @@ -526,7 +526,7 @@ std::vector AutoPolygon::expand(const std::vector& points, const coc ClipperLib::PolyTree out; for(const auto& pt : points) { - subj << ClipperLib::IntPoint(pt.x* PRECISION, pt.y * PRECISION); + subj << ClipperLib::IntPoint(static_cast(pt.x* PRECISION), static_cast(pt.y * PRECISION)); } ClipperLib::ClipperOffset co; co.AddPath(subj, ClipperLib::jtMiter, ClipperLib::etClosedPolygon); @@ -551,9 +551,10 @@ std::vector AutoPolygon::expand(const std::vector& points, const coc //create the clipping rect ClipperLib::Path clamp; clamp.push_back(ClipperLib::IntPoint(0, 0)); - clamp.push_back(ClipperLib::IntPoint(rect.size.width/_scaleFactor * PRECISION, 0)); - clamp.push_back(ClipperLib::IntPoint(rect.size.width/_scaleFactor * PRECISION, rect.size.height/_scaleFactor * PRECISION)); - clamp.push_back(ClipperLib::IntPoint(0, rect.size.height/_scaleFactor * PRECISION)); + clamp.push_back(ClipperLib::IntPoint(static_cast(rect.size.width/_scaleFactor * PRECISION), 0)); + clamp.push_back(ClipperLib::IntPoint(static_cast(rect.size.width/_scaleFactor * PRECISION), + static_cast(rect.size.height/_scaleFactor * PRECISION))); + clamp.push_back(ClipperLib::IntPoint(0, static_cast(rect.size.height/_scaleFactor * PRECISION))); cl.AddPath(clamp, ClipperLib::ptClip, true); cl.Execute(ClipperLib::ctIntersection, out); @@ -599,10 +600,10 @@ TrianglesCommand::Triangles AutoPolygon::triangulate(const std::vector& po for(int i = 0; i < 3; ++i) { auto p = ite->GetPoint(i); - auto v3 = Vec3(p->x, p->y, 0); + auto v3 = Vec3((float)p->x, (float)p->y, 0); bool found = false; - size_t j; - size_t length = vdx; + unsigned short j; + auto length = vdx; for(j = 0; j < length; j++) { if(verts[j].vertices == v3) @@ -668,8 +669,8 @@ void AutoPolygon::calculateUV(const Rect& rect, V3F_C4B_T2F* verts, ssize_t coun */ CCASSERT(_width && _height, "please specify width and height for this AutoPolygon instance"); - float texWidth = _width; - float texHeight = _height; + auto texWidth = _width; + auto texHeight = _height; auto end = &verts[count]; for(auto i = verts; i != end; ++i) @@ -690,7 +691,7 @@ Rect AutoPolygon::getRealRect(const Rect& rect) { //if the instance doesn't have width and height, then the whole operation is kaput CCASSERT(_height && _width, "Please specify a width and height for this instance before using its functions"); - realRect = Rect(0,0, _width, _height); + realRect = Rect(0,0, (float)_width, (float)_height); } else{ //rect is specified, so convert to real rect diff --git a/cocos/2d/CCCamera.cpp b/cocos/2d/CCCamera.cpp index f21282d21f..defd7332ec 100644 --- a/cocos/2d/CCCamera.cpp +++ b/cocos/2d/CCCamera.cpp @@ -45,7 +45,7 @@ Camera* Camera::create() Camera* camera = new (std::nothrow) Camera(); camera->initDefault(); camera->autorelease(); - camera->setDepth(0.f); + camera->setDepth(0); return camera; } diff --git a/cocos/2d/CCDrawNode.cpp b/cocos/2d/CCDrawNode.cpp index 97506debc3..724f6a3532 100644 --- a/cocos/2d/CCDrawNode.cpp +++ b/cocos/2d/CCDrawNode.cpp @@ -225,7 +225,7 @@ void DrawNode::updateUniforms(const Mat4 &transform, CustomCommand& cmd) auto mvpLocation = pipelineDescriptor.programState->getUniformLocation("u_MVPMatrix"); pipelineDescriptor.programState->setUniform(mvpLocation, matrixMVP.m, sizeof(matrixMVP.m)); - float alpha = _displayedOpacity / 255.0; + float alpha = _displayedOpacity / 255.0f; auto alphaUniformLocation = pipelineDescriptor.programState->getUniformLocation("u_alpha"); pipelineDescriptor.programState->setUniform(alphaUniformLocation, &alpha, sizeof(alpha)); } @@ -444,7 +444,7 @@ void DrawNode::drawCardinalSpline(PointArray *config, float tension, unsigned i p = config->count() - 1; lt = 1; } else { - p = dt / deltaT; + p = static_cast(dt / deltaT); lt = (dt - deltaT * (float)p) / deltaT; } diff --git a/cocos/2d/CCFastTMXLayer.cpp b/cocos/2d/CCFastTMXLayer.cpp index 7841b2c6ac..7e59349f2f 100644 --- a/cocos/2d/CCFastTMXLayer.cpp +++ b/cocos/2d/CCFastTMXLayer.cpp @@ -194,8 +194,8 @@ void TMXLayer::updateTiles(const Rect& culledRect) float tileSizeMax = std::max(tileSize.width, tileSize.height); if (_layerOrientation == FAST_TMX_ORIENTATION_ORTHO) { - tilesOverX = ceil(tileSizeMax / mapTileSize.width) - 1; - tilesOverY = ceil(tileSizeMax / mapTileSize.height) - 1; + tilesOverX = (int)ceil(tileSizeMax / mapTileSize.width) - 1; + tilesOverY = (int)ceil(tileSizeMax / mapTileSize.height) - 1; if (tilesOverX < 0) tilesOverX = 0; if (tilesOverY < 0) tilesOverY = 0; @@ -207,8 +207,8 @@ void TMXLayer::updateTiles(const Rect& culledRect) if (overTileRect.size.height < 0) overTileRect.size.height = 0; overTileRect = RectApplyTransform(overTileRect, nodeToTileTransform); - tilesOverX = ceil(overTileRect.origin.x + overTileRect.size.width) - floor(overTileRect.origin.x); - tilesOverY = ceil(overTileRect.origin.y + overTileRect.size.height) - floor(overTileRect.origin.y); + tilesOverX = (int)(ceil(overTileRect.origin.x + overTileRect.size.width) - floor(overTileRect.origin.x)); + tilesOverY = (int)(ceil(overTileRect.origin.y + overTileRect.size.height) - floor(overTileRect.origin.y)); } else { @@ -223,10 +223,10 @@ void TMXLayer::updateTiles(const Rect& culledRect) _indicesVertexZNumber[iter.first] = iter.second; } - int yBegin = std::max(0.f,visibleTiles.origin.y - tilesOverY); - int yEnd = std::min(_layerSize.height,visibleTiles.origin.y + visibleTiles.size.height + tilesOverY); - int xBegin = std::max(0.f,visibleTiles.origin.x - tilesOverX); - int xEnd = std::min(_layerSize.width,visibleTiles.origin.x + visibleTiles.size.width + tilesOverX); + int yBegin = static_cast(std::max(0.f,visibleTiles.origin.y - tilesOverY)); + int yEnd = static_cast(std::min(_layerSize.height,visibleTiles.origin.y + visibleTiles.size.height + tilesOverY)); + int xBegin = static_cast(std::max(0.f,visibleTiles.origin.x - tilesOverX)); + int xEnd = static_cast(std::min(_layerSize.width,visibleTiles.origin.x + visibleTiles.size.width + tilesOverX)); for (int y = yBegin; y < yEnd; ++y) { @@ -235,12 +235,12 @@ void TMXLayer::updateTiles(const Rect& culledRect) int tileIndex = getTileIndexByPos(x, y); if(_tiles[tileIndex] == 0) continue; - int vertexZ = getVertexZForPos(Vec2(x,y)); + int vertexZ = getVertexZForPos(Vec2((float)x,(float)y)); auto iter = _indicesVertexZNumber.find(vertexZ); int offset = iter->second; iter->second++; - int quadIndex = _tileToQuadIndex[tileIndex]; + unsigned short quadIndex = static_cast(_tileToQuadIndex[tileIndex]); CC_ASSERT(-1 != quadIndex); _indices[6 * offset + 0] = quadIndex * 4 + 0; _indices[6 * offset + 1] = quadIndex * 4 + 1; @@ -326,7 +326,7 @@ void TMXLayer::setupTiles() break; } - _screenTileCount = _screenGridSize.width * _screenGridSize.height; + _screenTileCount = (int)(_screenGridSize.width * _screenGridSize.height); } @@ -476,12 +476,12 @@ void TMXLayer::updateTotalQuads() if (_texture->hasPremultipliedAlpha()) { - color.r *= color.a / 255.0f; - color.g *= color.a / 255.0f; - color.b *= color.a / 255.0f; + auto alpha = color.a / 255.0f; + color.r = static_cast(color.r * alpha); + color.g = static_cast(color.g * alpha); + color.b = static_cast(color.b * alpha); } - int quadIndex = 0; for(int y = 0; y < _layerSize.height; ++y) { @@ -501,11 +501,12 @@ void TMXLayer::updateTotalQuads() float left, right, top, bottom, z; - z = getVertexZForPos(Vec2(x, y)); - auto iter = _indicesVertexZOffsets.find(z); + int zPos = getVertexZForPos(Vec2((float)x, (float)y)); + z = (float)zPos; + auto iter = _indicesVertexZOffsets.find(zPos); if(iter == _indicesVertexZOffsets.end()) { - _indicesVertexZOffsets[z] = 1; + _indicesVertexZOffsets[zPos] = 1; } else { @@ -613,7 +614,7 @@ Sprite* TMXLayer::getTileAt(const Vec2& tileCoordinate) // if GID == 0, then no tile is present if( gid ) { - int index = (int) tileCoordinate.x + (int) tileCoordinate.y * _layerSize.width; + int index = (int) tileCoordinate.x + (int)(tileCoordinate.y * _layerSize.width); auto it = _spriteContainer.find(index); if (it != _spriteContainer.end()) @@ -714,7 +715,7 @@ void TMXLayer::removeTileAt(const Vec2& tileCoordinate) if( gid ) { - int z = (int) tileCoordinate.x + (int) tileCoordinate.y * _layerSize.width; + int z = (int) tileCoordinate.x + (int)(tileCoordinate.y * _layerSize.width); // remove tile from GID map setFlaggedTileGIDByIndex(z, 0); @@ -824,13 +825,13 @@ void TMXLayer::setTileGID(int gid, const Vec2& tileCoordinate, TMXTileFlags flag // empty tile. create a new one else if (currentGID == 0) { - int z = (int) tileCoordinate.x + (int) tileCoordinate.y * _layerSize.width; + int z = (int) tileCoordinate.x + (int)(tileCoordinate.y * _layerSize.width); setFlaggedTileGIDByIndex(z, gidAndFlags); } // modifying an existing tile with a non-empty tile else { - int z = (int) tileCoordinate.x + (int) tileCoordinate.y * _layerSize.width; + int z = (int) tileCoordinate.x + (int)(tileCoordinate.y * _layerSize.width); auto it = _spriteContainer.find(z); if (it != _spriteContainer.end()) { diff --git a/cocos/2d/CCFontAtlas.cpp b/cocos/2d/CCFontAtlas.cpp index fbe43779cc..7a529acdf2 100644 --- a/cocos/2d/CCFontAtlas.cpp +++ b/cocos/2d/CCFontAtlas.cpp @@ -52,7 +52,7 @@ FontAtlas::FontAtlas(Font &theFont) _fontFreeType = dynamic_cast(_font); if (_fontFreeType) { - _lineHeight = _font->getFontMaxHeight(); + _lineHeight = (float)_font->getFontMaxHeight(); _fontAscender = _fontFreeType->getFontAscender(); _letterEdgeExtend = 2; @@ -203,7 +203,7 @@ void FontAtlas::scaleFontLetterDefinition(float scaleFactor) letterDefinition.height *= scaleFactor; letterDefinition.offsetX *= scaleFactor; letterDefinition.offsetY *= scaleFactor; - letterDefinition.xAdvance *= scaleFactor; + letterDefinition.xAdvance = (int)(letterDefinition.xAdvance * scaleFactor); } } @@ -379,7 +379,7 @@ bool FontAtlas::prepareLetterDefinitions(const std::u32string& utf32Text) auto scaleFactor = CC_CONTENT_SCALE_FACTOR(); auto pixelFormat = _fontFreeType->getOutlineSize() > 0 ? backend::PixelFormat::AI88 : backend::PixelFormat::A8; - float startY = _currentPageOrigY; + int startY = (int)_currentPageOrigY; for (auto&& it : codeMapOfNewChar) { @@ -401,7 +401,7 @@ bool FontAtlas::prepareLetterDefinitions(const std::u32string& utf32Text) { updateTextureContent(pixelFormat, startY); - startY = 0.0f; + startY = 0; _currentPageOrigY = 0; memset(_currentPageData, 0, _currentPageDataSize); @@ -428,7 +428,7 @@ bool FontAtlas::prepareLetterDefinitions(const std::u32string& utf32Text) { _currLineHeight = glyphHeight; } - _fontFreeType->renderCharAt(_currentPageData, _currentPageOrigX + adjustForExtend, _currentPageOrigY + adjustForExtend, bitmap, bitmapWidth, bitmapHeight); + _fontFreeType->renderCharAt(_currentPageData, (int)_currentPageOrigX + adjustForExtend, (int)_currentPageOrigY + adjustForExtend, bitmap, bitmapWidth, bitmapHeight); tempDef.U = _currentPageOrigX; tempDef.V = _currentPageOrigY; @@ -471,7 +471,7 @@ void FontAtlas::updateTextureContent(backend::PixelFormat format, int startY) auto outlineSize = _fontFreeType->getOutlineSize(); if (outlineSize > 0 && format == backend::PixelFormat::AI88) { - int nLen = CacheTextureWidth * (_currentPageOrigY - startY + _currLineHeight); + int nLen = CacheTextureWidth * ((int)_currentPageOrigY - startY + _currLineHeight); data = _currentPageData + CacheTextureWidth * (int)startY * 2; memset(_currentPageDataRGBA, 0, 4 * nLen); for (auto i = 0; i < nLen; i++) @@ -479,12 +479,12 @@ void FontAtlas::updateTextureContent(backend::PixelFormat format, int startY) _currentPageDataRGBA[i*4] = data[i*2]; _currentPageDataRGBA[i*4+3] = data[i*2+1]; } - _atlasTextures[_currentPage]->updateWithData(_currentPageDataRGBA, 0, startY, CacheTextureWidth, _currentPageOrigY - startY + _currLineHeight); + _atlasTextures[_currentPage]->updateWithData(_currentPageDataRGBA, 0, startY, CacheTextureWidth, (int)_currentPageOrigY - startY + _currLineHeight); } else { data = _currentPageData + CacheTextureWidth * (int)startY; - _atlasTextures[_currentPage]->updateWithData(data, 0, startY, CacheTextureWidth, _currentPageOrigY - startY + _currLineHeight); + _atlasTextures[_currentPage]->updateWithData(data, 0, startY, CacheTextureWidth, (int)_currentPageOrigY - startY + _currLineHeight); } } diff --git a/cocos/2d/CCFontAtlasCache.cpp b/cocos/2d/CCFontAtlasCache.cpp index 790f67cdd9..6240c16a3d 100644 --- a/cocos/2d/CCFontAtlasCache.cpp +++ b/cocos/2d/CCFontAtlasCache.cpp @@ -71,7 +71,7 @@ FontAtlas* FontAtlasCache::getFontAtlasTTF(const _ttfConfig* config) if ( it == _atlasMap.end() ) { auto font = FontFreeType::create(realFontFilename, config->fontSize, config->glyphs, - config->customGlyphs, useDistanceField, config->outlineSize); + config->customGlyphs, useDistanceField, (float)config->outlineSize); if (font) { auto tempAtlas = font->createFontAtlas(); diff --git a/cocos/2d/CCFontCharMap.cpp b/cocos/2d/CCFontCharMap.cpp index ab958166ab..ee4f1b796b 100644 --- a/cocos/2d/CCFontCharMap.cpp +++ b/cocos/2d/CCFontCharMap.cpp @@ -114,7 +114,7 @@ FontAtlas * FontCharMap::createFontAtlas() int itemsPerColumn = (int)(s.height / _itemHeight); int itemsPerRow = (int)(s.width / _itemWidth); - tempAtlas->setLineHeight(_itemHeight); + tempAtlas->setLineHeight((float)_itemHeight); auto contentScaleFactor = CC_CONTENT_SCALE_FACTOR(); diff --git a/cocos/2d/CCFontFNT.cpp b/cocos/2d/CCFontFNT.cpp index daa5720810..4724e13450 100644 --- a/cocos/2d/CCFontFNT.cpp +++ b/cocos/2d/CCFontFNT.cpp @@ -617,7 +617,7 @@ FontFNT * FontFNT::create(const std::string& fntFilePath, const Vec2& imageOffse } FontFNT *tempFont = new FontFNT(newConf,imageOffset); - tempFont->setFontSize(newConf->_fontSize); + tempFont->setFontSize((float)newConf->_fontSize); if (!tempFont) { return nullptr; @@ -713,7 +713,7 @@ FontAtlas * FontFNT::createFontAtlas() // common height int originalFontSize = _configuration->_fontSize; - float originalLineHeight = _configuration->_commonHeight; + float originalLineHeight = (float)_configuration->_commonHeight; float factor = 0.0f; if (std::abs(_fontSize - originalFontSize) < FLT_EPSILON) { factor = 1.0f; diff --git a/cocos/2d/CCFontFreeType.cpp b/cocos/2d/CCFontFreeType.cpp index 78e82b6bf8..429967dccd 100644 --- a/cocos/2d/CCFontFreeType.cpp +++ b/cocos/2d/CCFontFreeType.cpp @@ -257,13 +257,13 @@ int * FontFreeType::getHorizontalKerningForTextUTF32(const std::u32string& text, int FontFreeType::getHorizontalKerningForChars(uint64_t firstChar, uint64_t secondChar) const { // get the ID to the char we need - int glyphIndex1 = FT_Get_Char_Index(_fontRef, firstChar); + int glyphIndex1 = FT_Get_Char_Index(_fontRef, static_cast(firstChar)); if (!glyphIndex1) return 0; // get the ID to the char we need - int glyphIndex2 = FT_Get_Char_Index(_fontRef, secondChar); + int glyphIndex2 = FT_Get_Char_Index(_fontRef, static_cast(secondChar)); if (!glyphIndex2) return 0; @@ -301,20 +301,20 @@ unsigned char* FontFreeType::getGlyphBitmap(uint64_t theChar, long &outWidth, lo if (_distanceFieldEnabled) { - if (FT_Load_Char(_fontRef, theChar, FT_LOAD_RENDER | FT_LOAD_NO_HINTING | FT_LOAD_NO_AUTOHINT)) + if (FT_Load_Char(_fontRef, static_cast(theChar), FT_LOAD_RENDER | FT_LOAD_NO_HINTING | FT_LOAD_NO_AUTOHINT)) break; } else { - if (FT_Load_Char(_fontRef, theChar, FT_LOAD_RENDER | FT_LOAD_NO_AUTOHINT)) + if (FT_Load_Char(_fontRef, static_cast(theChar), FT_LOAD_RENDER | FT_LOAD_NO_AUTOHINT)) break; } auto& metrics = _fontRef->glyph->metrics; - outRect.origin.x = metrics.horiBearingX >> 6; - outRect.origin.y = -(metrics.horiBearingY >> 6); - outRect.size.width = (metrics.width >> 6); - outRect.size.height = (metrics.height >> 6); + outRect.origin.x = static_cast(metrics.horiBearingX >> 6); + outRect.origin.y = static_cast(-(metrics.horiBearingY >> 6)); + outRect.size.width = static_cast((metrics.width >> 6)); + outRect.size.height = static_cast((metrics.height >> 6)); xAdvance = (static_cast(_fontRef->glyph->metrics.horiAdvance >> 6)); @@ -336,15 +336,15 @@ unsigned char* FontFreeType::getGlyphBitmap(uint64_t theChar, long &outWidth, lo break; } - long glyphMinX = outRect.origin.x; - long glyphMaxX = outRect.origin.x + outWidth; - long glyphMinY = -outHeight - outRect.origin.y; - long glyphMaxY = -outRect.origin.y; + int glyphMinX = (int)outRect.origin.x; + int glyphMaxX = (int)(outRect.origin.x + outWidth); + int glyphMinY = (int)(-outHeight - outRect.origin.y); + int glyphMaxY = (int)-outRect.origin.y; - auto outlineMinX = bbox.xMin >> 6; - auto outlineMaxX = bbox.xMax >> 6; - auto outlineMinY = bbox.yMin >> 6; - auto outlineMaxY = bbox.yMax >> 6; + int outlineMinX = bbox.xMin >> 6; + int outlineMaxX = bbox.xMax >> 6; + int outlineMinY = bbox.yMin >> 6; + int outlineMaxY = bbox.yMax >> 6; auto outlineWidth = outlineMaxX - outlineMinX; auto outlineHeight = outlineMaxY - outlineMinY; @@ -353,15 +353,16 @@ unsigned char* FontFreeType::getGlyphBitmap(uint64_t theChar, long &outWidth, lo auto blendWidth = MAX(outlineMaxX, glyphMaxX) - blendImageMinX; auto blendHeight = blendImageMaxY - MIN(outlineMinY, glyphMinY); - outRect.origin.x = blendImageMinX; + outRect.origin.x = (float)blendImageMinX; outRect.origin.y = -blendImageMaxY + _outlineSize; unsigned char *blendImage = nullptr; if (blendWidth > 0 && blendHeight > 0) { - long index, index2; - blendImage = new (std::nothrow) unsigned char[blendWidth * blendHeight * 2]; - memset(blendImage, 0, blendWidth * blendHeight * 2); + int index, index2; + int imageSize = blendWidth * blendHeight * 2; + blendImage = new (std::nothrow) unsigned char[imageSize]; + memset(blendImage, 0, imageSize); auto px = outlineMinX - blendImageMinX; auto py = blendImageMaxY - outlineMaxY; @@ -388,8 +389,8 @@ unsigned char* FontFreeType::getGlyphBitmap(uint64_t theChar, long &outWidth, lo } } - outRect.size.width = blendWidth; - outRect.size.height = blendHeight; + outRect.size.width = (float)blendWidth; + outRect.size.height = (float)blendHeight; outWidth = blendWidth; outHeight = blendHeight; @@ -418,7 +419,7 @@ unsigned char* FontFreeType::getGlyphBitmap(uint64_t theChar, long &outWidth, lo unsigned char * FontFreeType::getGlyphBitmapWithOutline(uint64_t theChar, FT_BBox &bbox) { unsigned char* ret = nullptr; - if (FT_Load_Char(_fontRef, theChar, FT_LOAD_NO_BITMAP) == 0) + if (FT_Load_Char(_fontRef, static_cast(theChar), FT_LOAD_NO_BITMAP) == 0) { if (_fontRef->glyph->format == FT_GLYPH_FORMAT_OUTLINE) { diff --git a/cocos/2d/CCGrid.cpp b/cocos/2d/CCGrid.cpp index efd0f1559c..9538267eda 100644 --- a/cocos/2d/CCGrid.cpp +++ b/cocos/2d/CCGrid.cpp @@ -212,7 +212,7 @@ void GridBase::beforeDraw() _directorProjection = director->getProjection(); set2DProjection(); Size size = director->getWinSizeInPixels(); - renderer->setViewPort(0, 0, size.width, size.height); + renderer->setViewPort(0, 0, (unsigned int)size.width, (unsigned int)size.height); RenderTargetFlag flags = RenderTargetFlag::COLOR; _oldColorAttachment = renderer->getColorAttachment(); @@ -414,13 +414,13 @@ void Grid3D::calculateVertexPoints() CC_SAFE_FREE(_vertexBuffer); CC_SAFE_FREE(_indices); - size_t numOfPoints = (_gridSize.width+1) * (_gridSize.height+1); + size_t numOfPoints = static_cast((_gridSize.width+1) * (_gridSize.height+1)); _vertices = malloc(numOfPoints * sizeof(Vec3)); _originalVertices = malloc(numOfPoints * sizeof(Vec3)); _texCoordinates = malloc(numOfPoints * sizeof(Vec2)); _vertexBuffer = malloc(numOfPoints * (sizeof(Vec3) + sizeof(Vec2))); - _indices = (unsigned short*)malloc(_gridSize.width * _gridSize.height * sizeof(unsigned short) * 6); + _indices = (unsigned short*)malloc(static_cast(_gridSize.width * _gridSize.height * sizeof(unsigned short) * 6)); float *vertArray = (float*)_vertices; float *texArray = (float*)_texCoordinates; @@ -430,7 +430,7 @@ void Grid3D::calculateVertexPoints() { for (y = 0; y < _gridSize.height; ++y) { - int idx = (y * _gridSize.width) + x; + int idx = (int)(y * _gridSize.width) + x; float x1 = x * _step.x + _gridRect.origin.x; float x2 = x1 + _step.x; @@ -479,14 +479,14 @@ void Grid3D::calculateVertexPoints() updateVertexAndTexCoordinate(); - memcpy(_originalVertices, _vertices, (_gridSize.width+1) * (_gridSize.height+1) * sizeof(Vec3)); + memcpy(_originalVertices, _vertices, static_cast((_gridSize.width+1) * (_gridSize.height+1) * sizeof(Vec3))); } Vec3 Grid3D::getVertex(const Vec2& pos) const { CCASSERT( pos.x == (unsigned int)pos.x && pos.y == (unsigned int) pos.y , "Numbers must be integers"); - int index = (pos.x * (_gridSize.height+1) + pos.y) * 3; + int index = (int)(pos.x * (_gridSize.height+1) + pos.y) * 3; float *vertArray = (float*)_vertices; Vec3 vert(vertArray[index], vertArray[index+1], vertArray[index+2]); @@ -498,7 +498,7 @@ Vec3 Grid3D::getOriginalVertex(const Vec2& pos) const { CCASSERT( pos.x == (unsigned int)pos.x && pos.y == (unsigned int) pos.y , "Numbers must be integers"); - int index = (pos.x * (_gridSize.height+1) + pos.y) * 3; + int index = (int)(pos.x * (_gridSize.height+1) + pos.y) * 3; float *vertArray = (float*)_originalVertices; Vec3 vert(vertArray[index], vertArray[index+1], vertArray[index+2]); @@ -509,7 +509,7 @@ Vec3 Grid3D::getOriginalVertex(const Vec2& pos) const void Grid3D::setVertex(const Vec2& pos, const Vec3& vertex) { CCASSERT( pos.x == (unsigned int)pos.x && pos.y == (unsigned int) pos.y , "Numbers must be integers"); - int index = (pos.x * (_gridSize.height + 1) + pos.y) * 3; + int index = (int)(pos.x * (_gridSize.height + 1) + pos.y) * 3; float *vertArray = (float*)_vertices; vertArray[index] = vertex.x; vertArray[index+1] = vertex.y; @@ -520,14 +520,14 @@ void Grid3D::reuse() { if (_reuseGrid > 0) { - memcpy(_originalVertices, _vertices, (_gridSize.width+1) * (_gridSize.height+1) * sizeof(Vec3)); + memcpy(_originalVertices, _vertices, static_cast((_gridSize.width+1) * (_gridSize.height+1) * sizeof(Vec3))); --_reuseGrid; } } void Grid3D::updateVertexBuffer() { - size_t numOfPoints = (_gridSize.width+1) * (_gridSize.height+1); + size_t numOfPoints = static_cast((_gridSize.width+1) * (_gridSize.height+1)); auto tempVecPointer = (Vec3*)_vertices; for (size_t i = 0; i < numOfPoints; ++i) { @@ -536,15 +536,15 @@ void Grid3D::updateVertexBuffer() } _drawCommand.updateVertexBuffer(_vertexBuffer, (unsigned int)(numOfPoints * sizeof(Vec3) + numOfPoints * sizeof(Vec2)) ); - _drawCommand.updateIndexBuffer(_indices, _gridSize.width * _gridSize.height * 6 * sizeof(unsigned short)); + _drawCommand.updateIndexBuffer(_indices, static_cast(_gridSize.width * _gridSize.height * 6 * sizeof(unsigned short))); } void Grid3D::updateVertexAndTexCoordinate() { - unsigned int numOfPoints = (_gridSize.width+1) * (_gridSize.height+1); + unsigned int numOfPoints = static_cast((_gridSize.width+1) * (_gridSize.height+1)); auto tempVecPointer = (Vec3*)_vertices; auto tempTexPointer = (Vec2*)_texCoordinates; - for (size_t i = 0; i < numOfPoints; ++i) + for (unsigned int i = 0; i < numOfPoints; ++i) { auto offset = i * (sizeof(Vec3) + sizeof(Vec2)); memcpy((char*)_vertexBuffer + offset, &tempVecPointer[i], sizeof(Vec3)); @@ -553,8 +553,9 @@ void Grid3D::updateVertexAndTexCoordinate() _drawCommand.createVertexBuffer((unsigned int)(sizeof(Vec3) + sizeof(Vec2)), numOfPoints, CustomCommand::BufferUsage::DYNAMIC); _drawCommand.updateVertexBuffer(_vertexBuffer, numOfPoints * sizeof(Vec3) + numOfPoints * sizeof(Vec2)); - _drawCommand.createIndexBuffer(CustomCommand::IndexFormat::U_SHORT, _gridSize.width * _gridSize.height * 6, CustomCommand::BufferUsage::DYNAMIC); - _drawCommand.updateIndexBuffer(_indices, _gridSize.width * _gridSize.height * 6 * sizeof(unsigned short)); + unsigned int capacity = (unsigned int)(_gridSize.width * _gridSize.height) * 6; + _drawCommand.createIndexBuffer(CustomCommand::IndexFormat::U_SHORT, capacity, CustomCommand::BufferUsage::DYNAMIC); + _drawCommand.updateIndexBuffer(_indices, capacity * sizeof(unsigned short)); } // implementation of TiledGrid3D @@ -663,7 +664,7 @@ void TiledGrid3D::calculateVertexPoints() float height = (float)_texture->getPixelsHigh(); float imageH = _texture->getContentSizeInPixels().height; - int numQuads = _gridSize.width * _gridSize.height; + int numQuads = (int)(_gridSize.width * _gridSize.height); CC_SAFE_FREE(_vertices); CC_SAFE_FREE(_originalVertices); CC_SAFE_FREE(_texCoordinates); @@ -741,7 +742,7 @@ void TiledGrid3D::calculateVertexPoints() void TiledGrid3D::setTile(const Vec2& pos, const Quad3& coords) { CCASSERT( pos.x == (unsigned int)pos.x && pos.y == (unsigned int) pos.y , "Numbers must be integers"); - int idx = (_gridSize.height * pos.x + pos.y) * 4 * 3; + int idx = (int)(_gridSize.height * pos.x + pos.y) * 4 * 3; float *vertArray = (float*)_vertices; memcpy(&vertArray[idx], &coords, sizeof(Quad3)); } @@ -749,7 +750,7 @@ void TiledGrid3D::setTile(const Vec2& pos, const Quad3& coords) Quad3 TiledGrid3D::getOriginalTile(const Vec2& pos) const { CCASSERT( pos.x == (unsigned int)pos.x && pos.y == (unsigned int) pos.y , "Numbers must be integers"); - int idx = (_gridSize.height * pos.x + pos.y) * 4 * 3; + int idx = (int)(_gridSize.height * pos.x + pos.y) * 4 * 3; float *vertArray = (float*)_originalVertices; Quad3 ret; @@ -761,7 +762,7 @@ Quad3 TiledGrid3D::getOriginalTile(const Vec2& pos) const Quad3 TiledGrid3D::getTile(const Vec2& pos) const { CCASSERT( pos.x == (unsigned int)pos.x && pos.y == (unsigned int) pos.y , "Numbers must be integers"); - int idx = (_gridSize.height * pos.x + pos.y) * 4 * 3; + int idx = (int)(_gridSize.height * pos.x + pos.y) * 4 * 3; float *vertArray = (float*)_vertices; Quad3 ret; @@ -774,7 +775,7 @@ void TiledGrid3D::reuse() { if (_reuseGrid > 0) { - int numQuads = _gridSize.width * _gridSize.height; + int numQuads = (int)(_gridSize.width * _gridSize.height); memcpy(_originalVertices, _vertices, numQuads * 12 * sizeof(float)); --_reuseGrid; @@ -783,7 +784,8 @@ void TiledGrid3D::reuse() void TiledGrid3D::updateVertexBuffer() { - size_t numOfPoints = _gridSize.width * _gridSize.height * 4; + size_t gradSize = static_cast(_gridSize.width * _gridSize.height); + size_t numOfPoints = gradSize * 4; auto tempVecPointer = (Vec3*)_vertices; for (size_t i = 0; i < numOfPoints; ++i) { @@ -792,12 +794,13 @@ void TiledGrid3D::updateVertexBuffer() } _drawCommand.updateVertexBuffer(_vertexBuffer, (unsigned int)(numOfPoints * sizeof(Vec3) + numOfPoints * sizeof(Vec2)) ); - _drawCommand.updateIndexBuffer(_indices, _gridSize.width * _gridSize.height * 6 * sizeof(unsigned short)); + _drawCommand.updateIndexBuffer(_indices, gradSize * 6 * sizeof(unsigned short)); } void TiledGrid3D::updateVertexAndTexCoordinate() { - unsigned int numOfPoints = _gridSize.width * _gridSize.height * 4; + size_t gradSize = static_cast(_gridSize.width * _gridSize.height); + auto numOfPoints = gradSize * 4; auto tempVecPointer = (Vec3*)_vertices; auto tempTexPointer = (Vec2*)_texCoordinates; for (size_t i = 0; i < numOfPoints; ++i) @@ -809,8 +812,8 @@ void TiledGrid3D::updateVertexAndTexCoordinate() _drawCommand.createVertexBuffer((unsigned int)(sizeof(Vec3) + sizeof(Vec2) ), numOfPoints, CustomCommand::BufferUsage::DYNAMIC); _drawCommand.updateVertexBuffer(_vertexBuffer, numOfPoints * sizeof(Vec3) + numOfPoints * sizeof(Vec2)); - _drawCommand.createIndexBuffer(CustomCommand::IndexFormat::U_SHORT, _gridSize.width * _gridSize.height * 6, CustomCommand::BufferUsage::DYNAMIC); - _drawCommand.updateIndexBuffer(_indices, _gridSize.width * _gridSize.height * 6 * sizeof(unsigned short)); + _drawCommand.createIndexBuffer(CustomCommand::IndexFormat::U_SHORT, gradSize * 6, CustomCommand::BufferUsage::DYNAMIC); + _drawCommand.updateIndexBuffer(_indices, gradSize * 6 * sizeof(unsigned short)); } NS_CC_END diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 717113237a..25aacd7aec 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -100,7 +100,7 @@ void getChildMap(std::map >& map, SkinData* skinData, cons const rapidjson::Value& parent_transform = val[OLDTRANSFORM]; for (rapidjson::SizeType j = 0, size = parent_transform.Size(); j < size; ++j) { - transform.m[j] = parent_transform[j].GetDouble(); + transform.m[j] = parent_transform[j].GetFloat(); } // set origin matrices @@ -758,7 +758,7 @@ bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) meshData->vertexSizeInFloat = mesh_data_vertex_array_size; for (rapidjson::SizeType i = 0; i < mesh_data_vertex_array_size; ++i) { - meshData->vertex.push_back(mesh_data_vertex_array[i].GetDouble()); + meshData->vertex.push_back(mesh_data_vertex_array[i].GetFloat()); } // mesh part //////////////////////////////////////////////////////////////////////////////////////////////// @@ -781,10 +781,10 @@ bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) const rapidjson::Value& mesh_part_aabb = mesh_part[AABBS]; if (mesh_part.HasMember(AABBS) && mesh_part_aabb.Size() == 6) { - Vec3 min(mesh_part_aabb[(rapidjson::SizeType)0].GetDouble(), - mesh_part_aabb[(rapidjson::SizeType)1].GetDouble(), mesh_part_aabb[(rapidjson::SizeType)2].GetDouble()); - Vec3 max(mesh_part_aabb[(rapidjson::SizeType)3].GetDouble(), - mesh_part_aabb[(rapidjson::SizeType)4].GetDouble(), mesh_part_aabb[(rapidjson::SizeType)5].GetDouble()); + Vec3 min(mesh_part_aabb[(rapidjson::SizeType)0].GetFloat(), + mesh_part_aabb[(rapidjson::SizeType)1].GetFloat(), mesh_part_aabb[(rapidjson::SizeType)2].GetFloat()); + Vec3 max(mesh_part_aabb[(rapidjson::SizeType)3].GetFloat(), + mesh_part_aabb[(rapidjson::SizeType)4].GetFloat(), mesh_part_aabb[(rapidjson::SizeType)5].GetFloat()); meshData->subMeshAABB.push_back(AABB(min, max)); } else @@ -1162,7 +1162,7 @@ bool Bundle3D::loadMeshDataJson_0_1(MeshDatas& meshdatas) const rapidjson::Value& mesh_data_body_vertices = mesh_data_body_array_0[VERTICES]; for (rapidjson::SizeType i = 0; i < mesh_data_body_vertices.Size(); ++i) - meshdata->vertex[i] = mesh_data_body_vertices[i].GetDouble(); + meshdata->vertex[i] = mesh_data_body_vertices[i].GetFloat(); // index_number unsigned int indexnum = mesh_data_body_array_0[INDEXNUM].GetUint(); @@ -1209,7 +1209,7 @@ bool Bundle3D::loadMeshDataJson_0_2(MeshDatas& meshdatas) const rapidjson::Value& mesh_data_body_vertices = mesh_data_vertex_0[VERTICES]; for (rapidjson::SizeType i = 0; i < mesh_data_body_vertices.Size(); ++i) - meshdata->vertex[i] = mesh_data_body_vertices[i].GetDouble(); + meshdata->vertex[i] = mesh_data_body_vertices[i].GetFloat(); // submesh const rapidjson::Value& mesh_submesh_array = mesh_array_0[SUBMESH]; @@ -1259,7 +1259,7 @@ bool Bundle3D::loadSkinDataJson(SkinData* skindata) const rapidjson::Value& bind_pos = skin_data_bone[BINDSHAPE]; for (rapidjson::SizeType j = 0; j < bind_pos.Size(); ++j) { - mat_bind_pos.m[j] = bind_pos[j].GetDouble(); + mat_bind_pos.m[j] = bind_pos[j].GetFloat(); } skindata->inverseBindPoseMatrices.push_back(mat_bind_pos); } @@ -1473,7 +1473,7 @@ bool Bundle3D::loadAnimationDataJson(const std::string& id, Animation3DData* ani const rapidjson::Value& animation_data_array_val_0 = animation_data_array[(rapidjson::SizeType)the_index]; - animationdata->_totalTime = animation_data_array_val_0[LENGTH].GetDouble(); + animationdata->_totalTime = animation_data_array_val_0[LENGTH].GetFloat(); const rapidjson::Value& bones = animation_data_array_val_0[BONES]; for (rapidjson::SizeType i = 0; i < bones.Size(); ++i) @@ -1496,24 +1496,24 @@ bool Bundle3D::loadAnimationDataJson(const std::string& id, Animation3DData* ani if ( bone_keyframe.HasMember(TRANSLATION)) { const rapidjson::Value& bone_keyframe_translation = bone_keyframe[TRANSLATION]; - float keytime = bone_keyframe[KEYTIME].GetDouble(); - Vec3 val(bone_keyframe_translation[(rapidjson::SizeType)0].GetDouble(), bone_keyframe_translation[1].GetDouble(), bone_keyframe_translation[2].GetDouble()); + float keytime = bone_keyframe[KEYTIME].GetFloat(); + Vec3 val(bone_keyframe_translation[(rapidjson::SizeType)0].GetFloat(), bone_keyframe_translation[1].GetFloat(), bone_keyframe_translation[2].GetFloat()); animationdata->_translationKeys[bone_name].push_back(Animation3DData::Vec3Key(keytime,val)); } if ( bone_keyframe.HasMember(ROTATION)) { const rapidjson::Value& bone_keyframe_rotation = bone_keyframe[ROTATION]; - float keytime = bone_keyframe[KEYTIME].GetDouble(); - Quaternion val = Quaternion(bone_keyframe_rotation[(rapidjson::SizeType)0].GetDouble(),bone_keyframe_rotation[1].GetDouble(),bone_keyframe_rotation[2].GetDouble(),bone_keyframe_rotation[3].GetDouble()); + float keytime = bone_keyframe[KEYTIME].GetFloat(); + Quaternion val = Quaternion(bone_keyframe_rotation[(rapidjson::SizeType)0].GetFloat(),bone_keyframe_rotation[1].GetFloat(),bone_keyframe_rotation[2].GetFloat(),bone_keyframe_rotation[3].GetFloat()); animationdata->_rotationKeys[bone_name].push_back(Animation3DData::QuatKey(keytime,val)); } if ( bone_keyframe.HasMember(SCALE)) { const rapidjson::Value& bone_keyframe_scale = bone_keyframe[SCALE]; - float keytime = bone_keyframe[KEYTIME].GetDouble(); - Vec3 val(bone_keyframe_scale[(rapidjson::SizeType)0].GetDouble(), bone_keyframe_scale[1].GetDouble(), bone_keyframe_scale[2].GetDouble()); + float keytime = bone_keyframe[KEYTIME].GetFloat(); + Vec3 val(bone_keyframe_scale[(rapidjson::SizeType)0].GetFloat(), bone_keyframe_scale[1].GetFloat(), bone_keyframe_scale[2].GetFloat()); animationdata->_scaleKeys[bone_name].push_back(Animation3DData::Vec3Key(keytime,val)); } } @@ -1701,7 +1701,7 @@ NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue, bo for (rapidjson::SizeType j = 0; j < jtransform.Size(); ++j) { - transform.m[j] = jtransform[j].GetDouble(); + transform.m[j] = jtransform[j].GetFloat(); } nodedata->transform = transform; @@ -1753,7 +1753,7 @@ NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue, bo for (rapidjson::SizeType k = 0; k < jinvbindpos.Size(); ++k) { - invbindpos.m[k] = jinvbindpos[k].GetDouble(); + invbindpos.m[k] = jinvbindpos[k].GetFloat(); } //invbindpos.inverse(); diff --git a/cocos/audio/win32/AudioCache.cpp b/cocos/audio/win32/AudioCache.cpp index 34ba49c880..8c6d3c400d 100644 --- a/cocos/audio/win32/AudioCache.cpp +++ b/cocos/audio/win32/AudioCache.cpp @@ -249,7 +249,7 @@ void AudioCache::readDataTask(unsigned int selfId) } else { - _queBufferFrames = sampleRate * QUEUEBUFFER_TIME_STEP; + _queBufferFrames = static_cast(sampleRate * QUEUEBUFFER_TIME_STEP); BREAK_IF_ERR_LOG(_queBufferFrames == 0, "_queBufferFrames == 0"); const uint32_t queBufferBytes = _queBufferFrames * bytesPerFrame; diff --git a/cocos/audio/win32/AudioPlayer.cpp b/cocos/audio/win32/AudioPlayer.cpp index 4c3e512877..61b6800166 100644 --- a/cocos/audio/win32/AudioPlayer.cpp +++ b/cocos/audio/win32/AudioPlayer.cpp @@ -268,7 +268,7 @@ void AudioPlayer::rotateBufferThread(int offsetFrame) bufferProcessed--; if (_timeDirty) { _timeDirty = false; - offsetFrame = _currTime * decoder->getSampleRate(); + offsetFrame = (int)(_currTime * decoder->getSampleRate()); decoder->seek(offsetFrame); } else { diff --git a/cocos/base/CCConsole.cpp b/cocos/base/CCConsole.cpp index 970583fe35..b666520ef5 100644 --- a/cocos/base/CCConsole.cpp +++ b/cocos/base/CCConsole.cpp @@ -1278,8 +1278,8 @@ void Console::commandProjectionSubCommand3d(int /*fd*/, const std::string& /*arg void Console::commandResolution(int /*fd*/, const std::string& args) { - int width, height, policy; - + int policy; + float width, height; std::istringstream stream( args ); stream >> width >> height>> policy; @@ -1346,8 +1346,8 @@ void Console::commandTouchSubCommandTap(int fd, const std::string& args) if((argv.size() == 3 ) && (Console::Utility::isFloat(argv[1]) && Console::Utility::isFloat(argv[2]))) { - float x = utils::atof(argv[1].c_str()); - float y = utils::atof(argv[2].c_str()); + float x = (float)utils::atof(argv[1].c_str()); + float y = (float)utils::atof(argv[2].c_str()); std::srand ((unsigned)time(nullptr)); _touchId = rand(); @@ -1373,10 +1373,10 @@ void Console::commandTouchSubCommandSwipe(int fd, const std::string& args) && (Console::Utility::isFloat(argv[3])) && (Console::Utility::isFloat(argv[4]))) { - float x1 = utils::atof(argv[1].c_str()); - float y1 = utils::atof(argv[2].c_str()); - float x2 = utils::atof(argv[3].c_str()); - float y2 = utils::atof(argv[4].c_str()); + float x1 = (float)utils::atof(argv[1].c_str()); + float y1 = (float)utils::atof(argv[2].c_str()); + float x2 = (float)utils::atof(argv[3].c_str()); + float y2 = (float)utils::atof(argv[4].c_str()); std::srand ((unsigned)time(nullptr)); _touchId = rand(); diff --git a/cocos/base/CCDirector.cpp b/cocos/base/CCDirector.cpp index cced6be39b..5031377c7b 100644 --- a/cocos/base/CCDirector.cpp +++ b/cocos/base/CCDirector.cpp @@ -203,8 +203,8 @@ void Director::setDefaultValues() Configuration *conf = Configuration::getInstance(); // default FPS - double fps = conf->getValue("cocos2d.x.fps", Value(kDefaultFPS)).asDouble(); - _oldAnimationInterval = _animationInterval = 1.0 / fps; + float fps = conf->getValue("cocos2d.x.fps", Value(kDefaultFPS)).asFloat(); + _oldAnimationInterval = _animationInterval = 1.0f / fps; // Display FPS _displayStats = conf->getValue("cocos2d.x.display_fps", Value(false)).asBool(); @@ -1292,10 +1292,10 @@ void Director::createStatsLabel() Texture2D::setDefaultAlphaPixelFormat(currentFormat); - const int height_spacing = 22 / CC_CONTENT_SCALE_FACTOR(); - _drawnVerticesLabel->setPosition(Vec2(0, height_spacing*2) + CC_DIRECTOR_STATS_POSITION); - _drawnBatchesLabel->setPosition(Vec2(0, height_spacing*1) + CC_DIRECTOR_STATS_POSITION); - _FPSLabel->setPosition(Vec2(0, height_spacing*0)+CC_DIRECTOR_STATS_POSITION); + const int height_spacing = (int)(22 / CC_CONTENT_SCALE_FACTOR()); + _drawnVerticesLabel->setPosition(Vec2(0, height_spacing*2.0f) + CC_DIRECTOR_STATS_POSITION); + _drawnBatchesLabel->setPosition(Vec2(0, height_spacing*1.0f) + CC_DIRECTOR_STATS_POSITION); + _FPSLabel->setPosition(Vec2(0, height_spacing*0.0f)+CC_DIRECTOR_STATS_POSITION); } #endif // #if !CC_STRIP_FPS diff --git a/cocos/base/base64.cpp b/cocos/base/base64.cpp index 1e876fde00..47e1af3279 100644 --- a/cocos/base/base64.cpp +++ b/cocos/base/base64.cpp @@ -35,17 +35,17 @@ unsigned char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz int _base64Decode(const unsigned char *input, unsigned int input_len, unsigned char *output, unsigned int *output_len ) { static char inalphabet[256], decoder[256]; - int i, bits, c = 0, char_count, errors = 0; + int c = 0, char_count, errors = 0; unsigned int input_idx = 0; unsigned int output_idx = 0; - for (i = (sizeof alphabet) - 1; i >= 0 ; i--) { + for (char i = (sizeof alphabet) - 1; i >= 0 ; i--) { inalphabet[alphabet[i]] = 1; decoder[alphabet[i]] = i; } char_count = 0; - bits = 0; + unsigned char bits = 0; for( input_idx=0; input_idx < input_len ; input_idx++ ) { c = input[ input_idx ]; if (c == '=') diff --git a/cocos/platform/CCGLView.cpp b/cocos/platform/CCGLView.cpp index fc3b4dd1e3..280ad88b98 100644 --- a/cocos/platform/CCGLView.cpp +++ b/cocos/platform/CCGLView.cpp @@ -246,10 +246,10 @@ Vec2 GLView::getVisibleOrigin() const void GLView::setViewPortInPoints(float x , float y , float w , float h) { Viewport vp; - vp.x = x * _scaleX + _viewPortRect.origin.x; - vp.y = y * _scaleY + _viewPortRect.origin.y; - vp.w = w * _scaleX; - vp.h = h * _scaleY; + vp.x = (int)(x * _scaleX + _viewPortRect.origin.x); + vp.y = (int)(y * _scaleY + _viewPortRect.origin.y); + vp.w = (unsigned int)(w * _scaleX); + vp.h = (unsigned int)(h * _scaleY); Camera::setDefaultViewport(vp); } @@ -258,8 +258,8 @@ void GLView::setScissorInPoints(float x , float y , float w , float h) auto renderer = Director::getInstance()->getRenderer(); renderer->setScissorRect((int)(x * _scaleX + _viewPortRect.origin.x), (int)(y * _scaleY + _viewPortRect.origin.y), - (int)(w * _scaleX), - (int)(h * _scaleY)); + (unsigned int)(w * _scaleX), + (unsigned int)(h * _scaleY)); } bool GLView::isScissorEnabled() diff --git a/cocos/platform/desktop/CCGLViewImpl-desktop.cpp b/cocos/platform/desktop/CCGLViewImpl-desktop.cpp index e519416b84..d305fe82f5 100644 --- a/cocos/platform/desktop/CCGLViewImpl-desktop.cpp +++ b/cocos/platform/desktop/CCGLViewImpl-desktop.cpp @@ -302,8 +302,8 @@ bool GLViewImpl::initWithRect(const std::string& viewName, Rect rect, float fram glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); #endif - int neededWidth = rect.size.width * _frameZoomFactor; - int neededHeight = rect.size.height * _frameZoomFactor; + int neededWidth = (int)(rect.size.width * _frameZoomFactor); + int neededHeight = (int)(rect.size.height * _frameZoomFactor); _mainWindow = glfwCreateWindow(neededWidth, neededHeight, _viewName.c_str(), _monitor, nullptr); @@ -394,7 +394,7 @@ bool GLViewImpl::initWithFullScreen(const std::string& viewName) return false; const GLFWvidmode* videoMode = glfwGetVideoMode(_monitor); - return initWithRect(viewName, Rect(0, 0, videoMode->width, videoMode->height), 1.0f, false); + return initWithRect(viewName, Rect(0, 0, (float)videoMode->width, (float)videoMode->height), 1.0f, false); } bool GLViewImpl::initWithFullscreen(const std::string &viewname, const GLFWvidmode &videoMode, GLFWmonitor *monitor) @@ -410,7 +410,7 @@ bool GLViewImpl::initWithFullscreen(const std::string &viewname, const GLFWvidmo glfwWindowHint(GLFW_BLUE_BITS, videoMode.blueBits); glfwWindowHint(GLFW_GREEN_BITS, videoMode.greenBits); - return initWithRect(viewname, Rect(0, 0, videoMode.width, videoMode.height), 1.0f, false); + return initWithRect(viewname, Rect(0, 0, (float)videoMode.width, (float)videoMode.height), 1.0f, false); } bool GLViewImpl::isOpenGLReady() @@ -581,13 +581,13 @@ void GLViewImpl::setFullscreen(const GLFWvidmode &videoMode, GLFWmonitor *monito void GLViewImpl::setWindowed(int width, int height) { if (!this->isFullscreen()) { - this->setFrameSize(width, height); + this->setFrameSize((float)width, (float)height); } else { const GLFWvidmode* videoMode = glfwGetVideoMode(_monitor); int xpos = 0, ypos = 0; glfwGetMonitorPos(_monitor, &xpos, &ypos); - xpos += (videoMode->width - width) * 0.5; - ypos += (videoMode->height - height) * 0.5; + xpos += (int)((videoMode->width - width) * 0.5f); + ypos += (int)((videoMode->height - height) * 0.5f); _monitor = nullptr; glfwSetWindowMonitor(_mainWindow, nullptr, xpos, ypos, width, height, GLFW_DONT_CARE); #if (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) @@ -614,7 +614,7 @@ Size GLViewImpl::getMonitorSize() const { } if (nullptr != monitor) { const GLFWvidmode* videoMode = glfwGetVideoMode(monitor); - Size size = Size(videoMode->width, videoMode->height); + Size size = Size((float)videoMode->width, (float)videoMode->height); return size; } return Size::ZERO; @@ -650,7 +650,7 @@ void GLViewImpl::updateFrameSize() { _retinaFactor = 1; } - glfwSetWindowSize(_mainWindow, _screenSize.width * _retinaFactor * _frameZoomFactor, _screenSize.height *_retinaFactor * _frameZoomFactor); + glfwSetWindowSize(_mainWindow, (int)(_screenSize.width * _retinaFactor * _frameZoomFactor), (int)(_screenSize.height *_retinaFactor * _frameZoomFactor)); _isInRetinaMonitor = false; } @@ -666,10 +666,10 @@ void GLViewImpl::setFrameSize(float width, float height) void GLViewImpl::setViewPortInPoints(float x , float y , float w , float h) { Viewport vp; - vp.x = x * _scaleX * _retinaFactor * _frameZoomFactor + _viewPortRect.origin.x * _retinaFactor * _frameZoomFactor; - vp.y = y * _scaleY * _retinaFactor * _frameZoomFactor + _viewPortRect.origin.y * _retinaFactor * _frameZoomFactor; - vp.w = w * _scaleX * _retinaFactor * _frameZoomFactor; - vp.h = h * _scaleY * _retinaFactor * _frameZoomFactor; + vp.x = (int)(x * _scaleX * _retinaFactor * _frameZoomFactor + _viewPortRect.origin.x * _retinaFactor * _frameZoomFactor); + vp.y = (int)(y * _scaleY * _retinaFactor * _frameZoomFactor + _viewPortRect.origin.y * _retinaFactor * _frameZoomFactor); + vp.w = (unsigned int)(w * _scaleX * _retinaFactor * _frameZoomFactor); + vp.h = (unsigned int)(h * _scaleY * _retinaFactor * _frameZoomFactor); Camera::setDefaultViewport(vp); } @@ -907,8 +907,8 @@ void GLViewImpl::onGLFWWindowSizeFunCallback(GLFWwindow* /*window*/, int width, Size baseDesignSize = _designResolutionSize; ResolutionPolicy baseResolutionPolicy = _resolutionPolicy; - int frameWidth = width / _frameZoomFactor; - int frameHeight = height / _frameZoomFactor; + float frameWidth = width / _frameZoomFactor; + float frameHeight = height / _frameZoomFactor; setFrameSize(frameWidth, frameHeight); setDesignResolutionSize(baseDesignSize.width, baseDesignSize.height, baseResolutionPolicy); Director::getInstance()->setViewport(); diff --git a/cocos/platform/win32/CCApplication-win32.cpp b/cocos/platform/win32/CCApplication-win32.cpp index 32129a7efc..4cbf115005 100644 --- a/cocos/platform/win32/CCApplication-win32.cpp +++ b/cocos/platform/win32/CCApplication-win32.cpp @@ -119,7 +119,7 @@ int Application::run() // Sleep(3) may make a sleep of 2ms or 4ms. Therefore, we subtract 1ms here to make Sleep time shorter. // If 'waitMS' is equal or less than 1ms, don't sleep and run into next loop to // boost CPU to next frame accurately. - waitMS = (_animationInterval.QuadPart - interval) * 1000LL / freq.QuadPart - 1L; + waitMS = static_cast((_animationInterval.QuadPart - interval) * 1000LL / freq.QuadPart - 1L); if (waitMS > 1L) Sleep(waitMS); } diff --git a/cocos/platform/win32/CCDevice-win32.cpp b/cocos/platform/win32/CCDevice-win32.cpp index 49521e2e31..c025243a15 100644 --- a/cocos/platform/win32/CCDevice-win32.cpp +++ b/cocos/platform/win32/CCDevice-win32.cpp @@ -42,7 +42,7 @@ int Device::getDPI() int PixelsX = GetDeviceCaps(hScreenDC, HORZRES); int MMX = GetDeviceCaps(hScreenDC, HORZSIZE); ReleaseDC(nullptr, hScreenDC); - dpi = 254.0f*PixelsX / MMX / 10; + dpi = (int)(254.0f*PixelsX / MMX / 10); } return dpi; } @@ -493,7 +493,7 @@ Data Device::getTextureDataForText(const char * text, const FontDefinition& text { BitmapDC& dc = sharedBitmapDC(); - if (!dc.setFont(textDefinition._fontName.c_str(), textDefinition._fontSize,false)) + if (!dc.setFont(textDefinition._fontName.c_str(), (int)textDefinition._fontSize,false)) { log("Can't found font(%s), use system default", textDefinition._fontName.c_str()); } @@ -501,7 +501,7 @@ Data Device::getTextureDataForText(const char * text, const FontDefinition& text // draw text // does changing to SIZE here affects the font size by rounding from float? SIZE size = { (LONG)textDefinition._dimensions.width,(LONG)textDefinition._dimensions.height }; - CC_BREAK_IF(!dc.drawText(text, size, align, textDefinition._fontName.c_str(), textDefinition._fontSize, textDefinition._enableWrap, textDefinition._overflow)); + CC_BREAK_IF(!dc.drawText(text, size, align, textDefinition._fontName.c_str(), (int)textDefinition._fontSize, textDefinition._enableWrap, textDefinition._overflow)); int dataLen = size.cx * size.cy * 4; unsigned char* dataBuf = (unsigned char*)malloc(sizeof(unsigned char) * dataLen); From a91091e93ae1458a2f5a9ee1a4f0f0081625e08b Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Thu, 10 Oct 2019 09:41:39 +0800 Subject: [PATCH 16/96] fix triangle batch (#20185) * fix triangle batch since it would be too expensive to check the uniforms, simplify enable batching for built-in program. * enable user update the materialID --- cocos/renderer/CCTrianglesCommand.cpp | 15 +++++++++++++-- cocos/renderer/CCTrianglesCommand.h | 3 +++ cocos/renderer/backend/Program.h | 2 +- cocos/renderer/backend/Types.h | 1 + 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/cocos/renderer/CCTrianglesCommand.cpp b/cocos/renderer/CCTrianglesCommand.cpp index 223cc7af4c..1b389da72b 100644 --- a/cocos/renderer/CCTrianglesCommand.cpp +++ b/cocos/renderer/CCTrianglesCommand.cpp @@ -54,18 +54,29 @@ void TrianglesCommand::init(float globalOrder, Texture2D* texture, const BlendFu { _program = _pipelineDescriptor.programState->getProgram(); _texture = texture->getBackendTexture(); - _blendType = blendType; + + //since it would be too expensive to check the uniforms, simplify enable batching for built-in program. + if(_program->getProgramType() == backend::ProgramType::INVALID_PROGRAM) + setSkipBatching(true); + //TODO: minggo set it in Node? auto& blendDescriptor = _pipelineDescriptor.blendDescriptor; blendDescriptor.blendEnabled = true; blendDescriptor.sourceRGBBlendFactor = blendDescriptor.sourceAlphaBlendFactor = blendType.src; blendDescriptor.destinationRGBBlendFactor = blendDescriptor.destinationAlphaBlendFactor = blendType.dst; - generateMaterialID(); + if(!isSkipBatching()) + generateMaterialID(); } } +void TrianglesCommand::updateMaterialID() +{ + setSkipBatching(false); + generateMaterialID(); +} + TrianglesCommand::~TrianglesCommand() { } diff --git a/cocos/renderer/CCTrianglesCommand.h b/cocos/renderer/CCTrianglesCommand.h index 22228e0933..8cc7fc5e67 100644 --- a/cocos/renderer/CCTrianglesCommand.h +++ b/cocos/renderer/CCTrianglesCommand.h @@ -98,6 +98,9 @@ public: const unsigned short* getIndices() const { return _triangles.indices; } /**Get the model view matrix.*/ const Mat4& getModelView() const { return _mv; } + + /** update material ID */ + void updateMaterialID(); protected: /**Generate the material ID by textureID, glProgramState, and blend function.*/ diff --git a/cocos/renderer/backend/Program.h b/cocos/renderer/backend/Program.h index b2852688ae..b8bfc8c623 100644 --- a/cocos/renderer/backend/Program.h +++ b/cocos/renderer/backend/Program.h @@ -178,7 +178,7 @@ protected: std::string _vertexShader; ///< Vertex shader. std::string _fragmentShader; ///< Fragment shader. - ProgramType _programType; ///< built-in program type. + ProgramType _programType = ProgramType::INVALID_PROGRAM; ///< built-in program type. }; //end of _backend group diff --git a/cocos/renderer/backend/Types.h b/cocos/renderer/backend/Types.h index 99ceba4cb9..e95a355517 100644 --- a/cocos/renderer/backend/Types.h +++ b/cocos/renderer/backend/Types.h @@ -328,6 +328,7 @@ enum class TextureCubeFace : uint32_t enum ProgramType { + INVALID_PROGRAM = -1, POSITION_COLOR_LENGTH_TEXTURE, POSITION_COLOR_TEXTURE_AS_POINTSIZE, POSITION_COLOR, From 68aedd7ef07b028c40006e782e0da12199ad998a Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Fri, 11 Oct 2019 16:39:33 +0800 Subject: [PATCH 17/96] revert error caused by fixC4244Warning (#20190) --- cocos/base/base64.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/base/base64.cpp b/cocos/base/base64.cpp index 47e1af3279..792343b130 100644 --- a/cocos/base/base64.cpp +++ b/cocos/base/base64.cpp @@ -45,7 +45,7 @@ int _base64Decode(const unsigned char *input, unsigned int input_len, unsigned c } char_count = 0; - unsigned char bits = 0; + int bits = 0; for( input_idx=0; input_idx < input_len ; input_idx++ ) { c = input[ input_idx ]; if (c == '=') From b553648a77268a9c5d46e234fc2eb1b6f1b53d98 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Sat, 12 Oct 2019 09:45:56 +0800 Subject: [PATCH 18/96] remove unused code (#20195) --- cocos/renderer/backend/opengl/TextureGL.h | 1 - 1 file changed, 1 deletion(-) diff --git a/cocos/renderer/backend/opengl/TextureGL.h b/cocos/renderer/backend/opengl/TextureGL.h index b5fd2e8753..976e099c95 100644 --- a/cocos/renderer/backend/opengl/TextureGL.h +++ b/cocos/renderer/backend/opengl/TextureGL.h @@ -150,7 +150,6 @@ public: private: void initWithZeros(); - SamplerDescriptor _samplerDescriptor; TextureInfoGL _textureInfo; EventListener* _backToForegroundListener = nullptr; }; From 327407d59b370fd84d497f8d9f95f962a148d201 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Tue, 15 Oct 2019 09:38:51 +0800 Subject: [PATCH 19/96] fix full screen issue (#20202) need resize depth and stencil attachment texture as well. --- cocos/platform/mac/CCGLViewImpl-mac.mm | 8 +++----- cocos/renderer/backend/metal/Utils.h | 1 + cocos/renderer/backend/metal/Utils.mm | 7 +++++++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/cocos/platform/mac/CCGLViewImpl-mac.mm b/cocos/platform/mac/CCGLViewImpl-mac.mm index e03446dc2f..ca0b03630c 100644 --- a/cocos/platform/mac/CCGLViewImpl-mac.mm +++ b/cocos/platform/mac/CCGLViewImpl-mac.mm @@ -45,6 +45,7 @@ THE SOFTWARE. #endif /* CC_ICON_SET_SUPPORT */ #include "renderer/backend/metal/DeviceMTL.h" #include "renderer/CCRenderer.h" +#include "renderer/backend/metal/Utils.h" NS_CC_BEGIN @@ -879,13 +880,10 @@ void GLViewImpl::onGLFWWindowSizeFunCallback(GLFWwindow* /*window*/, int width, Director::getInstance()->setViewport(); Director::getInstance()->getEventDispatcher()->dispatchCustomEvent(GLViewImpl::EVENT_WINDOW_RESIZED, nullptr); - //update metal drawable size. + //update metal attachment texture size. int fbWidth, fbHeight; glfwGetFramebufferSize(_mainWindow, &fbWidth, &fbHeight); - CGSize size; - size.width = static_cast(fbWidth); - size.height = static_cast(fbHeight); - [backend::DeviceMTL::getCAMetalLayer() setDrawableSize:size]; + backend::Utils::resizeDefaultAttachmentTexture(fbWidth, fbHeight); } } diff --git a/cocos/renderer/backend/metal/Utils.h b/cocos/renderer/backend/metal/Utils.h index 9cefc1b0f6..8e7074cae0 100644 --- a/cocos/renderer/backend/metal/Utils.h +++ b/cocos/renderer/backend/metal/Utils.h @@ -49,6 +49,7 @@ public: * @param texture Specifies the texture to be setted to the color attachemnt. */ static void updateDefaultColorAttachmentTexture(id texture); + static void resizeDefaultAttachmentTexture(int width, int height); /** * Get the default combined depth and stencil attachment pixel format. diff --git a/cocos/renderer/backend/metal/Utils.mm b/cocos/renderer/backend/metal/Utils.mm index a35b9191ea..eb054f43aa 100644 --- a/cocos/renderer/backend/metal/Utils.mm +++ b/cocos/renderer/backend/metal/Utils.mm @@ -152,6 +152,13 @@ MTLPixelFormat Utils::toMTLPixelFormat(PixelFormat textureFormat) } } +void Utils::resizeDefaultAttachmentTexture(int width, int height) +{ + [backend::DeviceMTL::getCAMetalLayer() setDrawableSize:CGSizeMake(width, height)]; + [_defaultDepthStencilAttachmentTexture release]; + _defaultDepthStencilAttachmentTexture = Utils::createDepthStencilAttachmentTexture(); +} + id Utils::createDepthStencilAttachmentTexture() { auto CAMetalLayer = DeviceMTL::getCAMetalLayer(); From 67ae2e756ed535256b32a99632435edf7d3b6128 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Tue, 15 Oct 2019 09:40:59 +0800 Subject: [PATCH 20/96] fix ProgramState and Program performance (#20189) * fix ProgramState and Program performance * fix review * fix * add autorelease --- cocos/2d/CCAtlasNode.cpp | 3 +- cocos/2d/CCCameraBackgroundBrush.cpp | 6 +- cocos/2d/CCClippingNode.cpp | 3 +- cocos/2d/CCDrawNode.cpp | 9 +- cocos/2d/CCFastTMXLayer.cpp | 7 +- cocos/2d/CCGrid.cpp | 6 +- cocos/2d/CCLabel.cpp | 3 +- cocos/2d/CCLayer.cpp | 6 +- cocos/2d/CCMotionStreak.cpp | 3 +- cocos/2d/CCParticleBatchNode.cpp | 3 +- cocos/2d/CCParticleSystemQuad.cpp | 3 +- cocos/2d/CCProgressTimer.cpp | 3 +- cocos/2d/CCSprite.cpp | 10 +- cocos/2d/CCSpriteBatchNode.cpp | 8 +- cocos/3d/CCMotionStreak3D.cpp | 3 +- cocos/3d/CCSkybox.cpp | 4 +- cocos/3d/CCSprite3DMaterial.cpp | 44 ++---- cocos/3d/CCTerrain.cpp | 3 +- cocos/base/CCStencilStateManager.cpp | 3 +- .../cocostudio/ActionTimeline/CCBoneNode.cpp | 3 +- .../ActionTimeline/CCSkeletonNode.cpp | 3 +- cocos/navmesh/CCNavMeshDebugDraw.cpp | 8 +- cocos/physics3d/CCPhysics3DDebugDrawer.cpp | 3 +- cocos/renderer/CCMaterial.cpp | 7 +- cocos/renderer/CCTexture2D.cpp | 4 +- cocos/renderer/backend/Device.h | 21 +-- cocos/renderer/backend/Program.cpp | 6 + cocos/renderer/backend/Program.h | 6 + cocos/renderer/backend/ProgramCache.cpp | 146 ++++++++++++------ cocos/renderer/backend/ProgramCache.h | 16 +- cocos/renderer/backend/ProgramState.cpp | 21 +-- cocos/renderer/backend/ProgramState.h | 15 +- cocos/renderer/backend/Types.h | 49 ++++-- cocos/renderer/backend/metal/DeviceMTL.h | 16 +- cocos/renderer/backend/opengl/DeviceGL.h | 16 +- extensions/Particle3D/CCParticle3DRender.cpp | 6 +- .../Particle3D/PU/CCPUBillboardChain.cpp | 6 +- extensions/Particle3D/PU/CCPURender.cpp | 6 +- .../Classes/Camera3DTest/Camera3DTest.cpp | 15 +- .../ClippingNodeTest/ClippingNodeTest.cpp | 6 +- .../NewRendererTest/NewRendererTest.cpp | 31 ++-- .../Classes/ShaderTest/ShaderTest.cpp | 21 ++- .../Classes/ShaderTest/ShaderTest2.cpp | 7 +- .../Classes/Sprite3DTest/DrawNode3D.cpp | 3 +- .../Classes/Sprite3DTest/Sprite3DTest.cpp | 8 +- .../project/Classes/lua_test_bindings.cpp | 4 +- 46 files changed, 345 insertions(+), 238 deletions(-) diff --git a/cocos/2d/CCAtlasNode.cpp b/cocos/2d/CCAtlasNode.cpp index 6eea8166d8..a63838c175 100644 --- a/cocos/2d/CCAtlasNode.cpp +++ b/cocos/2d/CCAtlasNode.cpp @@ -44,7 +44,8 @@ NS_CC_BEGIN AtlasNode::AtlasNode() { auto& pipelineDescriptor = _quadCommand.getPipelineDescriptor(); - _programState = new (std::nothrow) backend::ProgramState(positionTextureColor_vert, positionTextureColor_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_TEXTURE_COLOR); + _programState = new (std::nothrow) backend::ProgramState(program); pipelineDescriptor.programState = _programState; _mvpMatrixLocation = pipelineDescriptor.programState->getUniformLocation("u_MVPMatrix"); _textureLocation = pipelineDescriptor.programState->getUniformLocation("u_texture"); diff --git a/cocos/2d/CCCameraBackgroundBrush.cpp b/cocos/2d/CCCameraBackgroundBrush.cpp index f38c4f5d6d..aee71f8f72 100644 --- a/cocos/2d/CCCameraBackgroundBrush.cpp +++ b/cocos/2d/CCCameraBackgroundBrush.cpp @@ -122,7 +122,8 @@ CameraBackgroundDepthBrush* CameraBackgroundDepthBrush::create(float depth) bool CameraBackgroundDepthBrush::init() { CC_SAFE_RELEASE_NULL(_programState); - _programState = new backend::ProgramState(cameraClear_vert, cameraClear_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::CAMERA_CLEAR); + _programState = new backend::ProgramState(program); _locDepth = _programState->getUniformLocation("dpeth"); @@ -409,7 +410,8 @@ bool CameraBackgroundSkyBoxBrush::init() _customCommand.setAfterCallback(CC_CALLBACK_0(CameraBackgroundSkyBoxBrush::onAfterDraw, this)); CC_SAFE_RELEASE_NULL(_programState); - _programState = new backend::ProgramState(CC3D_skybox_vert, CC3D_skybox_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::SKYBOX_3D); + _programState = new backend::ProgramState(program); _uniformColorLoc = _programState->getUniformLocation("u_color"); _uniformCameraRotLoc = _programState->getUniformLocation("u_cameraRot"); _uniformEnvLoc = _programState->getUniformLocation("u_Env"); diff --git a/cocos/2d/CCClippingNode.cpp b/cocos/2d/CCClippingNode.cpp index 0917331c71..9b99db4606 100644 --- a/cocos/2d/CCClippingNode.cpp +++ b/cocos/2d/CCClippingNode.cpp @@ -198,7 +198,8 @@ void ClippingNode::visit(Renderer *renderer, const Mat4 &parentTransform, uint32 auto alphaThreshold = this->getAlphaThreshold(); if (alphaThreshold < 1) { - auto programState = new (std::nothrow) backend::ProgramState(positionTextureColor_vert, positionTextureColorAlphaTest_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_TEXTURE_COLOR_ALPHA_TEST); + auto programState = new (std::nothrow) backend::ProgramState(program); auto alphaLocation = programState->getUniformLocation("u_alpha_value"); programState->setUniform(alphaLocation, &alphaThreshold, sizeof(alphaThreshold)); setProgramStateRecursively(_stencil, programState); diff --git a/cocos/2d/CCDrawNode.cpp b/cocos/2d/CCDrawNode.cpp index 724f6a3532..4ecb74542c 100644 --- a/cocos/2d/CCDrawNode.cpp +++ b/cocos/2d/CCDrawNode.cpp @@ -149,21 +149,24 @@ bool DrawNode::init() void DrawNode::updateShader() { CC_SAFE_RELEASE(_programState); - _programState = new (std::nothrow) backend::ProgramState(positionColorLengthTexture_vert, positionColorLengthTexture_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_COLOR_LENGTH_TEXTURE); + _programState = new (std::nothrow) backend::ProgramState(program); _customCommand.getPipelineDescriptor().programState = _programState; setVertexLayout(_customCommand); _customCommand.setDrawType(CustomCommand::DrawType::ARRAY); _customCommand.setPrimitiveType(CustomCommand::PrimitiveType::TRIANGLE); CC_SAFE_RELEASE(_programStatePoint); - _programStatePoint = new (std::nothrow) backend::ProgramState(positionColorTextureAsPointsize_vert, positionColor_frag); + program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_COLOR_TEXTURE_AS_POINTSIZE); + _programStatePoint = new (std::nothrow) backend::ProgramState(program); _customCommandGLPoint.getPipelineDescriptor().programState = _programStatePoint; setVertexLayout(_customCommandGLPoint); _customCommandGLPoint.setDrawType(CustomCommand::DrawType::ARRAY); _customCommandGLPoint.setPrimitiveType(CustomCommand::PrimitiveType::POINT); CC_SAFE_RELEASE(_programStateLine); - _programStateLine = new (std::nothrow) backend::ProgramState(positionColorLengthTexture_vert, positionColorLengthTexture_frag); + program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_COLOR_LENGTH_TEXTURE); + _programStateLine = new (std::nothrow) backend::ProgramState(program); _customCommandGLLine.getPipelineDescriptor().programState = _programStateLine; setVertexLayout(_customCommandGLLine); _customCommandGLLine.setDrawType(CustomCommand::DrawType::ARRAY); diff --git a/cocos/2d/CCFastTMXLayer.cpp b/cocos/2d/CCFastTMXLayer.cpp index 7e59349f2f..62e68aa8f9 100644 --- a/cocos/2d/CCFastTMXLayer.cpp +++ b/cocos/2d/CCFastTMXLayer.cpp @@ -408,16 +408,17 @@ void TMXLayer::updatePrimitives() if (_useAutomaticVertexZ) { CC_SAFE_RELEASE(pipelineDescriptor.programState); - auto programState = new (std::nothrow) backend::ProgramState(positionTextureColor_vert, positionTextureColorAlphaTest_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_TEXTURE_COLOR_ALPHA_TEST); + auto programState = new (std::nothrow) backend::ProgramState(program); pipelineDescriptor.programState = programState; _alphaValueLocation = pipelineDescriptor.programState->getUniformLocation("u_alpha_value"); pipelineDescriptor.programState->setUniform(_alphaValueLocation, &_alphaFuncValue, sizeof(_alphaFuncValue)); - } else { CC_SAFE_RELEASE(pipelineDescriptor.programState); - auto programState = new (std::nothrow) backend::ProgramState(positionTextureColor_vert, positionTextureColor_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_TEXTURE_COLOR); + auto programState = new (std::nothrow) backend::ProgramState(program); pipelineDescriptor.programState = programState; } auto vertexLayout = pipelineDescriptor.programState->getVertexLayout(); diff --git a/cocos/2d/CCGrid.cpp b/cocos/2d/CCGrid.cpp index 9538267eda..0807f2bec8 100644 --- a/cocos/2d/CCGrid.cpp +++ b/cocos/2d/CCGrid.cpp @@ -32,9 +32,10 @@ THE SOFTWARE. #include "renderer/CCRenderer.h" #include "renderer/CCTexture2D.h" #include "renderer/ccShaders.h" +#include "renderer/backend/ProgramState.h" #include "renderer/backend/Device.h" #include "2d/CCCamera.h" -#include "renderer/backend/ProgramState.h" + NS_CC_BEGIN // implementation of GridBase @@ -108,7 +109,8 @@ bool GridBase::initWithSize(const Size& gridSize, Texture2D *texture, bool flipp auto& pipelineDescriptor = _drawCommand.getPipelineDescriptor(); CC_SAFE_RELEASE(_programState); - _programState = new (std::nothrow) backend::ProgramState(positionTexture_vert, positionTexture_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_TEXTURE); + _programState = new (std::nothrow) backend::ProgramState(program); pipelineDescriptor.programState = _programState; _mvpMatrixLocation = pipelineDescriptor.programState->getUniformLocation("u_MVPMatrix"); _textureLocation = pipelineDescriptor.programState->getUniformLocation("u_texture"); diff --git a/cocos/2d/CCLabel.cpp b/cocos/2d/CCLabel.cpp index 84add9f6c8..41a0d20131 100644 --- a/cocos/2d/CCLabel.cpp +++ b/cocos/2d/CCLabel.cpp @@ -688,7 +688,8 @@ void Label::updateShaderProgram() } CC_SAFE_RELEASE(_programState); - _programState = new backend::ProgramState(programType); + auto* program = backend::Program::getBuiltinProgram(programType); + _programState = new backend::ProgramState(program); updateUniformLocations(); diff --git a/cocos/2d/CCLayer.cpp b/cocos/2d/CCLayer.cpp index 602834e78a..941b2e4ab9 100644 --- a/cocos/2d/CCLayer.cpp +++ b/cocos/2d/CCLayer.cpp @@ -288,7 +288,8 @@ LayerColor::LayerColor() _blendFunc = BlendFunc::ALPHA_PREMULTIPLIED; auto& pipelineDescriptor = _customCommand.getPipelineDescriptor(); - _programState = new (std::nothrow) backend::ProgramState(positionColor_vert, positionColor_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_COLOR); + _programState = new (std::nothrow) backend::ProgramState(program); pipelineDescriptor.programState = _programState; auto vertexLayout = _programState->getVertexLayout(); @@ -705,7 +706,8 @@ LayerRadialGradient* LayerRadialGradient::create() LayerRadialGradient::LayerRadialGradient() { auto& pipelineDescriptor = _customCommand.getPipelineDescriptor(); - _programState = new (std::nothrow) backend::ProgramState(position_vert, layer_radialGradient_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::LAYER_RADIA_GRADIENT); + _programState = new (std::nothrow) backend::ProgramState(program); pipelineDescriptor.programState = _programState; _mvpMatrixLocation = pipelineDescriptor.programState->getUniformLocation("u_MVPMatrix"); _startColorLocation = pipelineDescriptor.programState->getUniformLocation("u_startColor"); diff --git a/cocos/2d/CCMotionStreak.cpp b/cocos/2d/CCMotionStreak.cpp index a24eddc948..fa7f129e42 100644 --- a/cocos/2d/CCMotionStreak.cpp +++ b/cocos/2d/CCMotionStreak.cpp @@ -42,7 +42,8 @@ MotionStreak::MotionStreak() _customCommand.setPrimitiveType(CustomCommand::PrimitiveType::TRIANGLE_STRIP); auto& pipelineDescriptor = _customCommand.getPipelineDescriptor(); - _programState = new (std::nothrow) backend::ProgramState(positionTextureColor_vert, positionTextureColor_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_TEXTURE_COLOR); + _programState = new (std::nothrow) backend::ProgramState(program); pipelineDescriptor.programState = _programState; _mvpMatrixLocaiton = pipelineDescriptor.programState->getUniformLocation("u_MVPMatrix"); _textureLocation = pipelineDescriptor.programState->getUniformLocation("u_texture"); diff --git a/cocos/2d/CCParticleBatchNode.cpp b/cocos/2d/CCParticleBatchNode.cpp index ebc58f12da..f3048917a2 100644 --- a/cocos/2d/CCParticleBatchNode.cpp +++ b/cocos/2d/CCParticleBatchNode.cpp @@ -46,7 +46,8 @@ NS_CC_BEGIN ParticleBatchNode::ParticleBatchNode() { auto& pipelineDescriptor = _customCommand.getPipelineDescriptor(); - _programState = new (std::nothrow) backend::ProgramState(positionTextureColor_vert, positionTextureColor_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_TEXTURE_COLOR); + _programState = new (std::nothrow) backend::ProgramState(program); pipelineDescriptor.programState = _programState; _mvpMatrixLocaiton = pipelineDescriptor.programState->getUniformLocation("u_MVPMatrix"); _textureLocation = pipelineDescriptor.programState->getUniformLocation("u_texture"); diff --git a/cocos/2d/CCParticleSystemQuad.cpp b/cocos/2d/CCParticleSystemQuad.cpp index 09dc7d2ff7..e97ae7e370 100644 --- a/cocos/2d/CCParticleSystemQuad.cpp +++ b/cocos/2d/CCParticleSystemQuad.cpp @@ -50,7 +50,8 @@ NS_CC_BEGIN ParticleSystemQuad::ParticleSystemQuad() { auto& pipelieDescriptor = _quadCommand.getPipelineDescriptor(); - _programState = new (std::nothrow) backend::ProgramState(positionTextureColor_vert, positionTextureColor_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_TEXTURE_COLOR); + _programState = new (std::nothrow) backend::ProgramState(program); pipelieDescriptor.programState = _programState; _mvpMatrixLocaiton = pipelieDescriptor.programState->getUniformLocation("u_MVPMatrix"); _textureLocation = pipelieDescriptor.programState->getUniformLocation("u_texture"); diff --git a/cocos/2d/CCProgressTimer.cpp b/cocos/2d/CCProgressTimer.cpp index ac05931f9a..2d1b1a1901 100644 --- a/cocos/2d/CCProgressTimer.cpp +++ b/cocos/2d/CCProgressTimer.cpp @@ -47,7 +47,8 @@ namespace backend::ProgramState* initPipelineDescriptor(cocos2d::CustomCommand& command, bool ridal, backend::UniformLocation &locMVP, backend::UniformLocation &locTexture) { auto& pipelieDescriptor = command.getPipelineDescriptor(); - auto programState = new (std::nothrow) backend::ProgramState(positionTextureColor_vert, positionTextureColor_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_TEXTURE_COLOR); + auto programState = new (std::nothrow) backend::ProgramState(program); CC_SAFE_RELEASE(pipelieDescriptor.programState); pipelieDescriptor.programState = programState; diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index 656b52e243..57d3f50c36 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -42,6 +42,7 @@ THE SOFTWARE. #include "platform/CCFileUtils.h" #include "renderer/ccShaders.h" #include "renderer/backend/ProgramState.h" +#include "renderer/backend/Device.h" NS_CC_BEGIN @@ -374,9 +375,11 @@ void Sprite::setVertexLayout() void Sprite::updateShaders(const char* vert, const char* frag) { - auto programState = new (std::nothrow) backend::ProgramState(vert, frag); + auto* program = backend::Device::getInstance()->newProgram(vert, frag); + auto programState = new (std::nothrow) backend::ProgramState(program); setProgramState(programState); - CC_SAFE_RELEASE_NULL(programState); + CC_SAFE_RELEASE(programState); + CC_SAFE_RELEASE(program); } void Sprite::setProgramState(backend::ProgramType type) @@ -385,7 +388,8 @@ void Sprite::setProgramState(backend::ProgramType type) _programState->getProgram()->getProgramType() == type) return; - auto programState = new (std::nothrow) backend::ProgramState(type); + auto* program = backend::Program::getBuiltinProgram(type); + auto programState = new (std::nothrow) backend::ProgramState(program); setProgramState(programState); CC_SAFE_RELEASE_NULL(programState); } diff --git a/cocos/2d/CCSpriteBatchNode.cpp b/cocos/2d/CCSpriteBatchNode.cpp index 66174a08d5..8ca5e509f6 100644 --- a/cocos/2d/CCSpriteBatchNode.cpp +++ b/cocos/2d/CCSpriteBatchNode.cpp @@ -37,7 +37,7 @@ THE SOFTWARE. #include "renderer/CCQuadCommand.h" #include "renderer/ccShaders.h" #include "renderer/backend/ProgramState.h" - +#include "renderer/backend/Device.h" NS_CC_BEGIN @@ -115,12 +115,14 @@ bool SpriteBatchNode::initWithTexture(Texture2D *tex, ssize_t capacity/* = DEFAU void SpriteBatchNode::updateShaders(const std::string &vertexShader, const std::string &fragmentShader) { auto& pipelineDescriptor = _quadCommand.getPipelineDescriptor(); + auto* program = backend::Device::getInstance()->newProgram(vertexShader, fragmentShader); CC_SAFE_RELEASE(_programState); - _programState = new (std::nothrow) backend::ProgramState(vertexShader, fragmentShader); + _programState = new (std::nothrow) backend::ProgramState(program); pipelineDescriptor.programState = _programState; _mvpMatrixLocaiton = pipelineDescriptor.programState->getUniformLocation("u_MVPMatrix"); _textureLocation = pipelineDescriptor.programState->getUniformLocation("u_texture"); - + CC_SAFE_RELEASE(program); + auto vertexLayout = _programState->getVertexLayout(); const auto& attributeInfo = _programState->getProgram()->getActiveAttributes(); auto iter = attributeInfo.find("a_position"); diff --git a/cocos/3d/CCMotionStreak3D.cpp b/cocos/3d/CCMotionStreak3D.cpp index b95239dbb4..bf1dd00af1 100644 --- a/cocos/3d/CCMotionStreak3D.cpp +++ b/cocos/3d/CCMotionStreak3D.cpp @@ -118,7 +118,8 @@ bool MotionStreak3D::initWithFade(float fade, float minSeg, float stroke, const _blendFunc = BlendFunc::ALPHA_NON_PREMULTIPLIED; // shader state - _programState = new backend::ProgramState(positionTextureColor_vert, positionTextureColor_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_TEXTURE_COLOR); + _programState = new backend::ProgramState(program); _customCommand.getPipelineDescriptor().programState = _programState; diff --git a/cocos/3d/CCSkybox.cpp b/cocos/3d/CCSkybox.cpp index 019c5105dd..edb9bd2b6b 100644 --- a/cocos/3d/CCSkybox.cpp +++ b/cocos/3d/CCSkybox.cpp @@ -65,8 +65,8 @@ bool Skybox::init() _customCommand.setAfterCallback(CC_CALLBACK_0(Skybox::onAfterDraw, this)); // create and set our custom shader - - _programState = new backend::ProgramState(CC3D_skybox_vert, CC3D_skybox_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::SKYBOX_3D); + _programState = new backend::ProgramState(program); auto &pipelineDescriptor = _customCommand.getPipelineDescriptor(); auto layout = _programState->getVertexLayout(); diff --git a/cocos/3d/CCSprite3DMaterial.cpp b/cocos/3d/CCSprite3DMaterial.cpp index c07922f258..561ae64e1b 100644 --- a/cocos/3d/CCSprite3DMaterial.cpp +++ b/cocos/3d/CCSprite3DMaterial.cpp @@ -63,80 +63,68 @@ backend::ProgramState* Sprite3DMaterial::_vertexLitMaterialSkinProgState = nullp backend::ProgramState* Sprite3DMaterial::_diffuseMaterialSkinProgState = nullptr; backend::ProgramState* Sprite3DMaterial::_bumpedDiffuseMaterialSkinProgState = nullptr; -namespace -{ - std::string getShaderMacrosForLight() - { - char def[256]; - auto conf = Configuration::getInstance(); - - snprintf(def, sizeof(def)-1, "\n#define MAX_DIRECTIONAL_LIGHT_NUM %d \n" - "\n#define MAX_POINT_LIGHT_NUM %d \n" - "\n#define MAX_SPOT_LIGHT_NUM %d \n", - conf->getMaxSupportDirLightInShader(), - conf->getMaxSupportPointLightInShader(), - conf->getMaxSupportSpotLightInShader()); - - return std::string(def); - } -} void Sprite3DMaterial::createBuiltInMaterial() { - std::string def = getShaderMacrosForLight(); - std::string normalMapDef = "\n#define USE_NORMAL_MAPPING 1 \n"; - - _unLitMaterialSkinProgState = new (std::nothrow) backend::ProgramState(CC3D_skinPositionTexture_vert, CC3D_colorTexture_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::SKINPOSITION_TEXTURE_3D); + _unLitMaterialSkinProgState = new (std::nothrow) backend::ProgramState(program); _unLitMaterialSkin = new (std::nothrow) Sprite3DMaterial(); if (_unLitMaterialSkin && _unLitMaterialSkin->initWithProgramState(_unLitMaterialSkinProgState)) { _unLitMaterialSkin->_type = Sprite3DMaterial::MaterialType::UNLIT; } - _diffuseMaterialSkinProgState = new (std::nothrow) backend::ProgramState(def + CC3D_skinPositionNormalTexture_vert, def + CC3D_colorNormalTexture_frag); + program = backend::Program::getBuiltinProgram(backend::ProgramType::SKINPOSITION_NORMAL_TEXTURE_3D); + _diffuseMaterialSkinProgState = new (std::nothrow) backend::ProgramState(program); _diffuseMaterialSkin = new (std::nothrow) Sprite3DMaterial(); if (_diffuseMaterialSkin && _diffuseMaterialSkin->initWithProgramState(_diffuseMaterialSkinProgState)) { _diffuseMaterialSkin->_type = Sprite3DMaterial::MaterialType::DIFFUSE; } - _diffuseMaterialProgState = new (std::nothrow) backend::ProgramState(def + CC3D_positionNormalTexture_vert, def + CC3D_colorNormalTexture_frag); + program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_NORMAL_TEXTURE_3D); + _diffuseMaterialProgState = new (std::nothrow) backend::ProgramState(program); _diffuseMaterial = new (std::nothrow) Sprite3DMaterial(); if (_diffuseMaterial && _diffuseMaterial->initWithProgramState(_diffuseMaterialProgState)) { _diffuseMaterial->_type = Sprite3DMaterial::MaterialType::DIFFUSE; } - _unLitMaterialProgState = new (std::nothrow) backend::ProgramState(CC3D_positionTexture_vert, CC3D_colorTexture_frag); + program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_TEXTURE_3D); + _unLitMaterialProgState = new (std::nothrow) backend::ProgramState(program); _unLitMaterial = new (std::nothrow) Sprite3DMaterial(); if (_unLitMaterial && _unLitMaterial->initWithProgramState(_unLitMaterialProgState)) { _unLitMaterial->_type = Sprite3DMaterial::MaterialType::UNLIT; } - _unLitNoTexMaterialProgState = new (std::nothrow) backend::ProgramState(CC3D_positionTexture_vert, CC3D_color_frag); + program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_3D); + _unLitNoTexMaterialProgState = new (std::nothrow) backend::ProgramState(program); _unLitNoTexMaterial = new (std::nothrow) Sprite3DMaterial(); if (_unLitNoTexMaterial && _unLitNoTexMaterial->initWithProgramState(_unLitNoTexMaterialProgState)) { _unLitNoTexMaterial->_type = Sprite3DMaterial::MaterialType::UNLIT_NOTEX; } - _diffuseNoTexMaterialProgState = new (std::nothrow) backend::ProgramState(def + CC3D_positionNormalTexture_vert, def + CC3D_colorNormal_frag); + program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_NORMAL_3D); + _diffuseNoTexMaterialProgState = new (std::nothrow) backend::ProgramState(program); _diffuseNoTexMaterial = new (std::nothrow) Sprite3DMaterial(); if (_diffuseNoTexMaterial && _diffuseNoTexMaterial->initWithProgramState(_diffuseNoTexMaterialProgState)) { _diffuseNoTexMaterial->_type = Sprite3DMaterial::MaterialType::DIFFUSE_NOTEX; } - _bumpedDiffuseMaterialProgState = new (std::nothrow) backend::ProgramState(def + normalMapDef + CC3D_positionNormalTexture_vert, def + normalMapDef + CC3D_colorNormalTexture_frag); + program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_BUMPEDNORMAL_TEXTURE_3D); + _bumpedDiffuseMaterialProgState = new (std::nothrow) backend::ProgramState(program); _bumpedDiffuseMaterial = new (std::nothrow) Sprite3DMaterial(); if (_bumpedDiffuseMaterial && _bumpedDiffuseMaterial->initWithProgramState(_bumpedDiffuseMaterialProgState)) { _bumpedDiffuseMaterial->_type = Sprite3DMaterial::MaterialType::BUMPED_DIFFUSE; } - _bumpedDiffuseMaterialSkinProgState = new (std::nothrow) backend::ProgramState(def + normalMapDef + CC3D_skinPositionNormalTexture_vert, def + normalMapDef + CC3D_colorNormalTexture_frag); + program = backend::Program::getBuiltinProgram(backend::ProgramType::SKINPOSITION_BUMPEDNORMAL_TEXTURE_3D); + _bumpedDiffuseMaterialSkinProgState = new (std::nothrow) backend::ProgramState(program); _bumpedDiffuseMaterialSkin = new (std::nothrow) Sprite3DMaterial(); if (_bumpedDiffuseMaterialSkin && _bumpedDiffuseMaterialSkin->initWithProgramState(_bumpedDiffuseMaterialSkinProgState)) { diff --git a/cocos/3d/CCTerrain.cpp b/cocos/3d/CCTerrain.cpp index 343341267e..a95b2ae6a8 100644 --- a/cocos/3d/CCTerrain.cpp +++ b/cocos/3d/CCTerrain.cpp @@ -115,7 +115,8 @@ void cocos2d::Terrain::setLightDir(const Vec3& lightDir) bool Terrain::initProperties() { - _programState = new backend::ProgramState(CC3D_terrain_vert, CC3D_terrain_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::TERRAIN_3D); + _programState = new backend::ProgramState(program); _stateBlock.depthWrite = true; _stateBlock.depthTest = true; diff --git a/cocos/base/CCStencilStateManager.cpp b/cocos/base/CCStencilStateManager.cpp index 30e535810a..5b707d7a97 100644 --- a/cocos/base/CCStencilStateManager.cpp +++ b/cocos/base/CCStencilStateManager.cpp @@ -36,7 +36,8 @@ int StencilStateManager::s_layer = -1; StencilStateManager::StencilStateManager() { auto& pipelineDescriptor = _customCommand.getPipelineDescriptor(); - _programState = new (std::nothrow) backend::ProgramState(positionUColor_vert, positionUColor_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_UCOLOR); + _programState = new (std::nothrow) backend::ProgramState(program); pipelineDescriptor.programState = _programState; auto vertexLayout = _programState->getVertexLayout(); diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCBoneNode.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCBoneNode.cpp index 8321936462..af9a1b4316 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCBoneNode.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCBoneNode.cpp @@ -415,7 +415,8 @@ bool BoneNode::init() updateColor(); auto& pipelineDescriptor = _customCommand.getPipelineDescriptor(); - _programState = new (std::nothrow) cocos2d::backend::ProgramState(cocos2d::position_vert, cocos2d::positionColor_frag); + auto* program = cocos2d::backend::Program::getBuiltinProgram(cocos2d::backend::ProgramType::POSITION); + _programState = new (std::nothrow) cocos2d::backend::ProgramState(program); pipelineDescriptor.programState = _programState; _mvpLocation = _programState->getUniformLocation("u_MVPMatrix"); diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCSkeletonNode.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCSkeletonNode.cpp index 04bc826021..729905eb82 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCSkeletonNode.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCSkeletonNode.cpp @@ -53,7 +53,8 @@ bool SkeletonNode::init() // init _customCommand auto& pipelineDescriptor = _customCommand.getPipelineDescriptor(); - _programState = new (std::nothrow) cocos2d::backend::ProgramState(cocos2d::position_vert, cocos2d::positionColor_frag); + auto* program = cocos2d::backend::Program::getBuiltinProgram(cocos2d::backend::ProgramType::POSITION); + _programState = new (std::nothrow) cocos2d::backend::ProgramState(program); pipelineDescriptor.programState = _programState; _mvpLocation = _programState->getUniformLocation("u_MVPMatrix"); diff --git a/cocos/navmesh/CCNavMeshDebugDraw.cpp b/cocos/navmesh/CCNavMeshDebugDraw.cpp index ece3679233..52301d93ff 100644 --- a/cocos/navmesh/CCNavMeshDebugDraw.cpp +++ b/cocos/navmesh/CCNavMeshDebugDraw.cpp @@ -26,18 +26,20 @@ #if CC_USE_NAVMESH #include "renderer/backend/ProgramState.h" +#include "renderer/backend/Device.h" #include "renderer/CCRenderer.h" #include "renderer/CCRenderState.h" +#include "renderer/ccShaders.h" #include "base/CCDirector.h" #include "base/ccMacros.h" -#include "renderer/ccShaders.h" -#include "renderer/backend/Device.h" + NS_CC_BEGIN NavMeshDebugDraw::NavMeshDebugDraw() { - _programState = new backend::ProgramState(positionColor_vert, positionColor_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_COLOR); + _programState = new backend::ProgramState(program); _locMVP = _programState->getUniformLocation("u_MVPMatrix"); auto vertexLayout = _programState->getVertexLayout(); diff --git a/cocos/physics3d/CCPhysics3DDebugDrawer.cpp b/cocos/physics3d/CCPhysics3DDebugDrawer.cpp index 8fcf00b45d..b8356b40e7 100644 --- a/cocos/physics3d/CCPhysics3DDebugDrawer.cpp +++ b/cocos/physics3d/CCPhysics3DDebugDrawer.cpp @@ -127,7 +127,8 @@ Physics3DDebugDrawer::~Physics3DDebugDrawer() void Physics3DDebugDrawer::init() { CC_SAFE_RELEASE_NULL(_programState); - _programState = new backend::ProgramState(positionColor_vert, positionColor_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_COLOR); + _programState = new backend::ProgramState(program); _locMVP = _programState->getUniformLocation("u_MVPMatrix"); auto attributes = _programState->getProgram()->getActiveAttributes(); diff --git a/cocos/renderer/CCMaterial.cpp b/cocos/renderer/CCMaterial.cpp index e0360eddb8..1a6ed0562f 100644 --- a/cocos/renderer/CCMaterial.cpp +++ b/cocos/renderer/CCMaterial.cpp @@ -32,6 +32,7 @@ #include "renderer/CCPass.h" #include "renderer/CCTextureCache.h" #include "renderer/CCTexture2D.h" +#include "renderer/backend/Device.h" #include "base/CCProperties.h" #include "base/CCDirector.h" #include "platform/CCFileUtils.h" @@ -370,10 +371,10 @@ bool Material::parseShader(Pass* pass, Properties* shaderProperties) vertShaderSrc = defs + "\n" + vertShaderSrc; fragShaderSrc = defs + "\n" + fragShaderSrc; - auto programState = new backend::ProgramState(vertShaderSrc, fragShaderSrc); + auto* program = backend::Device::getInstance()->newProgram(vertShaderSrc, fragShaderSrc); + auto programState = new backend::ProgramState(program); pass->setProgramState(programState); - // Parse uniforms only if the GLProgramState was created auto property = shaderProperties->getNextProperty(); while (property) @@ -396,6 +397,8 @@ bool Material::parseShader(Pass* pass, Properties* shaderProperties) } space = shaderProperties->getNextNamespace(); } + CC_SAFE_RELEASE(program); + CC_SAFE_RELEASE(programState); } return true; diff --git a/cocos/renderer/CCTexture2D.cpp b/cocos/renderer/CCTexture2D.cpp index c2eb02e162..177812f04e 100644 --- a/cocos/renderer/CCTexture2D.cpp +++ b/cocos/renderer/CCTexture2D.cpp @@ -826,8 +826,8 @@ void Texture2D::initProgram() auto& pipelineDescriptor = _customCommand.getPipelineDescriptor(); //create program state - _programState = new (std::nothrow) cocos2d::backend::ProgramState( - positionTexture_vert, positionTexture_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_TEXTURE); + _programState = new (std::nothrow) cocos2d::backend::ProgramState(program); _mvpMatrixLocation = _programState->getUniformLocation("u_MVPMatrix"); _textureLocation = _programState->getUniformLocation("u_texture"); diff --git a/cocos/renderer/backend/Device.h b/cocos/renderer/backend/Device.h index f43e38ee14..97267efb2c 100644 --- a/cocos/renderer/backend/Device.h +++ b/cocos/renderer/backend/Device.h @@ -113,11 +113,20 @@ public: */ virtual void setFrameBufferOnly(bool frameBufferOnly) = 0; + /** + * Create an auto released Program. + * @param vertexShader Specifes this is a vertex shader source. + * @param fragmentShader Specifes this is a fragment shader source. + * @return A Program instance. + */ + virtual Program* newProgram(const std::string& vertexShader, const std::string& fragmentShader) = 0; + /** * Get a DeviceInfo object. * @return A DeviceInfo object. */ inline DeviceInfo* getDeviceInfo() const { return _deviceInfo; } + protected: /** * New a shaderModule, not auto released. @@ -126,17 +135,9 @@ protected: * @return A ShaderModule object. */ virtual ShaderModule* newShaderModule(ShaderStage stage, const std::string& source) = 0; - - /** - * New a Program, not auto released. - * @param vertexShader Specifes this is a vertex shader source. - * @param fragmentShader Specifes this is a fragment shader source. - * @return A Program object. - */ - virtual Program* newProgram(const std::string& vertexShader, const std::string& fragmentShader) = 0; - + DeviceInfo* _deviceInfo = nullptr; ///< Device information. - + private: static Device* _instance; }; diff --git a/cocos/renderer/backend/Program.cpp b/cocos/renderer/backend/Program.cpp index 22cd793826..48dcb73bc3 100644 --- a/cocos/renderer/backend/Program.cpp +++ b/cocos/renderer/backend/Program.cpp @@ -23,6 +23,7 @@ ****************************************************************************/ #include "Program.h" +#include "ProgramCache.h" CC_BACKEND_BEGIN @@ -37,4 +38,9 @@ void Program::setProgramType(ProgramType type) _programType = type; } +Program* Program::getBuiltinProgram(ProgramType type) +{ + return ProgramCache::getInstance()->getBuiltinProgram(type); +} + CC_BACKEND_END diff --git a/cocos/renderer/backend/Program.h b/cocos/renderer/backend/Program.h index b8bfc8c623..5d58233524 100644 --- a/cocos/renderer/backend/Program.h +++ b/cocos/renderer/backend/Program.h @@ -50,6 +50,12 @@ class ShaderModule; class Program : public Ref { public: + /** + * Get engine built-in program. + * @param type Specifies the built-in program type. + */ + static Program* getBuiltinProgram(ProgramType type); + /** * Get uniform location by name. * @param uniform Specifies the uniform name. diff --git a/cocos/renderer/backend/ProgramCache.cpp b/cocos/renderer/backend/ProgramCache.cpp index 49909e1fe1..0166a3724d 100644 --- a/cocos/renderer/backend/ProgramCache.cpp +++ b/cocos/renderer/backend/ProgramCache.cpp @@ -27,37 +27,43 @@ #include "ShaderModule.h" #include "renderer/ccShaders.h" #include "base/ccMacros.h" +#include "base/CCConfiguration.h" -namespace { - struct Shader +namespace std +{ + template <> + struct hash { - std::string vert; - std::string frag; - - Shader(const std::string& _vert, const std::string& _frag) - :vert(_vert), - frag(_frag) - {} - }; -} - -namespace std { - template<> struct hash - { - typedef Shader argument_type; + typedef cocos2d::backend::ProgramType argument_type; typedef std::size_t result_type; - result_type operator()(argument_type const& s) const noexcept + result_type operator()(argument_type const& v) const { - result_type const h1(std::hash < std::string>{}(s.vert)); - result_type const h2(std::hash{}(s.frag)); - return h1 ^ (h2 << 1); + return hash()(static_cast(v)); } }; } CC_BACKEND_BEGIN -std::unordered_map ProgramCache::_cachedPrograms; +namespace +{ + std::string getShaderMacrosForLight() + { + char def[256]; + auto conf = Configuration::getInstance(); + + snprintf(def, sizeof(def) - 1, "\n#define MAX_DIRECTIONAL_LIGHT_NUM %d \n" + "\n#define MAX_POINT_LIGHT_NUM %d \n" + "\n#define MAX_SPOT_LIGHT_NUM %d \n", + conf->getMaxSupportDirLightInShader(), + conf->getMaxSupportPointLightInShader(), + conf->getMaxSupportSpotLightInShader()); + + return std::string(def); + } +} + +std::unordered_map ProgramCache::_cachedPrograms; ProgramCache* ProgramCache::_sharedProgramCache = nullptr; ProgramCache* ProgramCache::getInstance() @@ -99,6 +105,7 @@ bool ProgramCache::init() addProgram(ProgramType::POSITION_COLOR_LENGTH_TEXTURE); addProgram(ProgramType::POSITION_COLOR_TEXTURE_AS_POINTSIZE); addProgram(ProgramType::POSITION_COLOR); + addProgram(ProgramType::POSITION); addProgram(ProgramType::LAYER_RADIA_GRADIENT); addProgram(ProgramType::POSITION_TEXTURE); addProgram(ProgramType::POSITION_TEXTURE_COLOR_ALPHA_TEST); @@ -106,6 +113,19 @@ bool ProgramCache::init() addProgram(ProgramType::ETC1_GRAY); addProgram(ProgramType::GRAY_SCALE); addProgram(ProgramType::LINE_COLOR_3D); + addProgram(ProgramType::CAMERA_CLEAR); + addProgram(ProgramType::SKYBOX_3D); + addProgram(ProgramType::SKINPOSITION_TEXTURE_3D); + addProgram(ProgramType::SKINPOSITION_NORMAL_TEXTURE_3D); + addProgram(ProgramType::POSITION_NORMAL_TEXTURE_3D); + addProgram(ProgramType::POSITION_TEXTURE_3D); + addProgram(ProgramType::POSITION_3D); + addProgram(ProgramType::POSITION_NORMAL_3D); + addProgram(ProgramType::POSITION_BUMPEDNORMAL_TEXTURE_3D); + addProgram(ProgramType::SKINPOSITION_BUMPEDNORMAL_TEXTURE_3D); + addProgram(ProgramType::TERRAIN_3D); + addProgram(ProgramType::PARTICLE_TEXTURE_3D); + addProgram(ProgramType::PARTICLE_COLOR_3D); return true; } @@ -140,6 +160,9 @@ void ProgramCache::addProgram(ProgramType type) case ProgramType::POSITION_COLOR: program = backend::Device::getInstance()->newProgram(positionColor_vert, positionColor_frag); break; + case ProgramType::POSITION: + program = backend::Device::getInstance()->newProgram(position_vert, positionColor_frag); + break; case ProgramType::LAYER_RADIA_GRADIENT: program = backend::Device::getInstance()->newProgram(position_vert, layer_radialGradient_frag); break; @@ -161,6 +184,62 @@ void ProgramCache::addProgram(ProgramType type) case ProgramType::LINE_COLOR_3D: program = backend::Device::getInstance()->newProgram(lineColor3D_vert, lineColor3D_frag); break; + case ProgramType::CAMERA_CLEAR: + program = backend::Device::getInstance()->newProgram(cameraClear_vert, cameraClear_frag); + break; + case ProgramType::SKYBOX_3D: + program = backend::Device::getInstance()->newProgram(CC3D_skybox_vert, CC3D_skybox_frag); + break; + case ProgramType::SKINPOSITION_TEXTURE_3D: + program = backend::Device::getInstance()->newProgram(CC3D_skinPositionTexture_vert, CC3D_colorTexture_frag); + break; + case ProgramType::SKINPOSITION_NORMAL_TEXTURE_3D: + { + std::string def = getShaderMacrosForLight(); + program = backend::Device::getInstance()->newProgram(def + CC3D_skinPositionNormalTexture_vert, def + CC3D_colorNormalTexture_frag); + } + break; + case ProgramType::POSITION_NORMAL_TEXTURE_3D: + { + std::string def = getShaderMacrosForLight(); + program = backend::Device::getInstance()->newProgram(def + CC3D_positionNormalTexture_vert, def + CC3D_colorNormalTexture_frag); + } + break; + case ProgramType::POSITION_TEXTURE_3D: + program = backend::Device::getInstance()->newProgram(CC3D_positionTexture_vert, CC3D_colorTexture_frag); + break; + case ProgramType::POSITION_3D: + program = backend::Device::getInstance()->newProgram(CC3D_positionTexture_vert, CC3D_color_frag); + break; + case ProgramType::POSITION_NORMAL_3D: + { + std::string def = getShaderMacrosForLight(); + program = backend::Device::getInstance()->newProgram(def + CC3D_positionNormalTexture_vert, def + CC3D_colorNormal_frag); + } + break; + case ProgramType::POSITION_BUMPEDNORMAL_TEXTURE_3D: + { + std::string def = getShaderMacrosForLight(); + std::string normalMapDef = "\n#define USE_NORMAL_MAPPING 1 \n"; + program = backend::Device::getInstance()->newProgram(def + normalMapDef + CC3D_positionNormalTexture_vert, def + normalMapDef + CC3D_colorNormalTexture_frag); + } + break; + case ProgramType::SKINPOSITION_BUMPEDNORMAL_TEXTURE_3D: + { + std::string def = getShaderMacrosForLight(); + std::string normalMapDef = "\n#define USE_NORMAL_MAPPING 1 \n"; + program = backend::Device::getInstance()->newProgram(def + normalMapDef + CC3D_skinPositionNormalTexture_vert, def + normalMapDef + CC3D_colorNormalTexture_frag); + } + break; + case ProgramType::TERRAIN_3D: + program = backend::Device::getInstance()->newProgram(CC3D_terrain_vert, CC3D_terrain_frag); + break; + case ProgramType::PARTICLE_TEXTURE_3D: + program = backend::Device::getInstance()->newProgram(CC3D_particle_vert, CC3D_particleTexture_frag); + break; + case ProgramType::PARTICLE_COLOR_3D: + program = backend::Device::getInstance()->newProgram(CC3D_particle_vert, CC3D_particleColor_frag); + break; default: CCASSERT(false, "Not built-in program type."); break; @@ -169,35 +248,14 @@ void ProgramCache::addProgram(ProgramType type) ProgramCache::_cachedPrograms.emplace(type, program); } -void ProgramCache::addProgram(const std::string& vertexShader, const std::string& fragmentShader) -{ - auto key = std::hash{}(Shader(vertexShader, fragmentShader)); - auto program = backend::Device::getInstance()->newProgram(vertexShader, fragmentShader); - ProgramCache::_cachedPrograms.emplace(key, program); -} - -backend::Program* ProgramCache::newBuiltinProgram(ProgramType type) +backend::Program* ProgramCache::getBuiltinProgram(ProgramType type) const { const auto& iter = ProgramCache::_cachedPrograms.find(type); - if (ProgramCache::_cachedPrograms.end() != iter) - return iter->second; - return nullptr; -} - -backend::Program* ProgramCache::newProgram(const std::string& vertexShader, const std::string& fragmentShader) -{ - auto key = std::hash{}(Shader(vertexShader, fragmentShader)); - const auto& iter = ProgramCache::_cachedPrograms.find(key); if (ProgramCache::_cachedPrograms.end() != iter) { - CC_SAFE_RETAIN(iter->second); return iter->second; } - - auto program = backend::Device::getInstance()->newProgram(vertexShader, fragmentShader); - ProgramCache::_cachedPrograms.emplace(key, program); - - return program; + return nullptr; } void ProgramCache::removeProgram(backend::Program* program) diff --git a/cocos/renderer/backend/ProgramCache.h b/cocos/renderer/backend/ProgramCache.h index 3a0a3613f4..71a3d0e4a0 100644 --- a/cocos/renderer/backend/ProgramCache.h +++ b/cocos/renderer/backend/ProgramCache.h @@ -49,15 +49,9 @@ public: /** purges the cache. It releases the retained instance. */ static void destroyInstance(); - - /** - * @param vertexShader Specifes the vertex shader source. - * @param fragmentShader Specifes the fragment shader source. - */ - backend::Program* newProgram(const std::string& vertexShader, const std::string& fragmentShader); /// get built-in program - backend::Program* newBuiltinProgram(ProgramType type); + backend::Program* getBuiltinProgram(ProgramType type) const; /** * Remove a program object from cache. @@ -84,16 +78,10 @@ protected: */ bool init(); - /** - * @param vertexShader Specifes the vertex shader source. - * @param fragmentShader Specifes the fragment shader source. - */ - void addProgram(const std::string& vertexShader, const std::string& fragmentShader); - /// Add built-in program void addProgram(ProgramType type); - static std::unordered_map _cachedPrograms; ///< The cached program object. + static std::unordered_map _cachedPrograms; ///< The cached program object. static ProgramCache *_sharedProgramCache; ///< A shared instance of the program cache. }; diff --git a/cocos/renderer/backend/ProgramState.cpp b/cocos/renderer/backend/ProgramState.cpp index 3094e354ac..3e96b385e1 100644 --- a/cocos/renderer/backend/ProgramState.cpp +++ b/cocos/renderer/backend/ProgramState.cpp @@ -155,25 +155,15 @@ TextureInfo& TextureInfo::operator=(const TextureInfo& rhs) return *this; } -ProgramState::ProgramState(ProgramType type) +ProgramState::ProgramState(Program* program) { - _program = backend::ProgramCache::getInstance()->newBuiltinProgram(type); - CCASSERT(_program, "Not built-in program type, please use ProgramState(const std::string& vertexShader, const std::string& fragmentShader) instead."); - CC_SAFE_RETAIN(_program); - - init(); + init(program); } -ProgramState::ProgramState(const std::string& vertexShader, const std::string& fragmentShader) -{ - _program = backend::ProgramCache::getInstance()->newProgram(vertexShader, fragmentShader); - CC_SAFE_RETAIN(_program); - - init(); -} - -void ProgramState::init() +bool ProgramState::init(Program* program) { + CC_SAFE_RETAIN(program); + _program = program; _vertexUniformBufferSize = _program->getUniformBufferSize(ShaderStage::VERTEX); _vertexUniformBuffer = new char[_vertexUniformBufferSize]; memset(_vertexUniformBuffer, 0, _vertexUniformBufferSize); @@ -189,6 +179,7 @@ void ProgramState::init() }); Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_backToForegroundListener, -1); #endif + return true; } void ProgramState::resetUniforms() diff --git a/cocos/renderer/backend/ProgramState.h b/cocos/renderer/backend/ProgramState.h index f8226f50c4..8c5397fe8a 100644 --- a/cocos/renderer/backend/ProgramState.h +++ b/cocos/renderer/backend/ProgramState.h @@ -78,19 +78,10 @@ public: using UniformCallback = std::function; /** - * @param vertexShader Specifies the vertex shader. - * @param fragmentShader Specifies the fragment shader. - * @see `ProgramState(ProgramType type)` + * @param program Specifies the program. */ - ProgramState(const std::string& vertexShader, const std::string& fragmentShader); + ProgramState(Program* program); - /** - * Create an program state object more efficient by engine built-in program type. - * @param type Specifies the built-in program type. - * @see `ProgramState(const std::string& vertexShader, const std::string& fragmentShader)` - */ - ProgramState(ProgramType type); - ///destructor virtual ~ProgramState(); @@ -306,7 +297,7 @@ protected: void resetUniforms(); ///Initialize. - void init(); + bool init(Program* program); #ifdef CC_USE_METAL /** diff --git a/cocos/renderer/backend/Types.h b/cocos/renderer/backend/Types.h index e95a355517..e70ac8c956 100644 --- a/cocos/renderer/backend/Types.h +++ b/cocos/renderer/backend/Types.h @@ -326,27 +326,42 @@ enum class TextureCubeFace : uint32_t NEGATIVE_Z = 5 }; -enum ProgramType +enum class ProgramType : int { INVALID_PROGRAM = -1, - POSITION_COLOR_LENGTH_TEXTURE, - POSITION_COLOR_TEXTURE_AS_POINTSIZE, - POSITION_COLOR, - POSITION_UCOLOR, - POSITION_TEXTURE, - POSITION_TEXTURE_COLOR, - POSITION_TEXTURE_COLOR_ALPHA_TEST, - LABEL_NORMAL, - LABLE_OUTLINE, - LABLE_DISTANCEFIELD_GLOW, - LABEL_DISTANCE_NORMAL, + POSITION_COLOR_LENGTH_TEXTURE, //positionColorLengthTexture_vert, positionColorLengthTexture_frag + POSITION_COLOR_TEXTURE_AS_POINTSIZE, //positionColorTextureAsPointsize_vert, positionColor_frag + POSITION_COLOR, //positionColor_vert, positionColor_frag + POSITION, //position_vert, positionColor_frag + POSITION_UCOLOR, //positionUColor_vert, positionUColor_frag + POSITION_TEXTURE, //positionTexture_vert, positionTexture_frag + POSITION_TEXTURE_COLOR, //positionTextureColor_vert, positionTextureColor_frag + POSITION_TEXTURE_COLOR_ALPHA_TEST, //positionTextureColor_vert, positionTextureColorAlphaTest_frag + LABEL_NORMAL, //positionTextureColor_vert, label_normal_frag + LABLE_OUTLINE, //positionTextureColor_vert, labelOutline_frag + LABLE_DISTANCEFIELD_GLOW, //positionTextureColor_vert, labelDistanceFieldGlow_frag + LABEL_DISTANCE_NORMAL, //positionTextureColor_vert, label_distanceNormal_frag - LAYER_RADIA_GRADIENT, + LAYER_RADIA_GRADIENT, //position_vert, layer_radialGradient_frag - ETC1, - ETC1_GRAY, - GRAY_SCALE, - LINE_COLOR_3D, + ETC1, //positionTextureColor_vert, etc1_frag + ETC1_GRAY, //positionTextureColor_vert, etc1Gray_frag + GRAY_SCALE, //positionTextureColor_vert, grayScale_frag + CAMERA_CLEAR, //cameraClear_vert, cameraClear_frag + + TERRAIN_3D, //CC3D_terrain_vert, CC3D_terrain_frag + LINE_COLOR_3D, //lineColor3D_vert, lineColor3D_frag + SKYBOX_3D, //CC3D_skybox_vert, CC3D_skybox_frag + SKINPOSITION_TEXTURE_3D, //CC3D_skinPositionTexture_vert, CC3D_colorTexture_frag + SKINPOSITION_NORMAL_TEXTURE_3D, //CC3D_skinPositionNormalTexture_vert, CC3D_colorNormalTexture_frag + POSITION_NORMAL_TEXTURE_3D, //CC3D_positionNormalTexture_vert, CC3D_colorNormalTexture_frag + POSITION_NORMAL_3D, //CC3D_positionNormalTexture_vert, CC3D_colorNormal_frag + POSITION_TEXTURE_3D, //CC3D_positionTexture_vert, CC3D_colorTexture_frag + POSITION_3D, //CC3D_positionTexture_vert, CC3D_color_frag + POSITION_BUMPEDNORMAL_TEXTURE_3D, //CC3D_positionNormalTexture_vert, CC3D_colorNormalTexture_frag + SKINPOSITION_BUMPEDNORMAL_TEXTURE_3D, //CC3D_skinPositionNormalTexture_vert, CC3D_colorNormalTexture_frag + PARTICLE_TEXTURE_3D, //CC3D_particle_vert, CC3D_particleTexture_frag + PARTICLE_COLOR_3D, //CC3D_particle_vert, CC3D_particleColor_frag }; ///built-in uniform name diff --git a/cocos/renderer/backend/metal/DeviceMTL.h b/cocos/renderer/backend/metal/DeviceMTL.h index 39805f2c96..01c7ba4c01 100644 --- a/cocos/renderer/backend/metal/DeviceMTL.h +++ b/cocos/renderer/backend/metal/DeviceMTL.h @@ -119,6 +119,14 @@ public: */ virtual void setFrameBufferOnly(bool frameBufferOnly) override; + /** + * New a Program, not auto release. + * @param vertexShader Specifes this is a vertex shader source. + * @param fragmentShader Specifes this is a fragment shader source. + * @return A Program instance. + */ + virtual Program* newProgram(const std::string& vertexShader, const std::string& fragmentShader) override; + /** * Get a MTLDevice object. * @return A MTLDevice object. @@ -140,14 +148,6 @@ protected: */ virtual ShaderModule* newShaderModule(ShaderStage stage, const std::string& source) override; - /** - * New a Program. - * @param vertexShader Specifes this is a vertex shader source. - * @param fragmentShader Specifes this is a fragment shader source. - * @return A Program object. - */ - virtual Program* newProgram(const std::string& vertexShader, const std::string& fragmentShader) override; - private: static CAMetalLayer* _metalLayer; static id _currentDrawable; diff --git a/cocos/renderer/backend/opengl/DeviceGL.h b/cocos/renderer/backend/opengl/DeviceGL.h index be752ac40b..8b5e30640f 100644 --- a/cocos/renderer/backend/opengl/DeviceGL.h +++ b/cocos/renderer/backend/opengl/DeviceGL.h @@ -80,6 +80,14 @@ public: */ virtual void setFrameBufferOnly(bool frameBufferOnly) override {} + /** + * New a Program, not auto released. + * @param vertexShader Specifes this is a vertex shader source. + * @param fragmentShader Specifes this is a fragment shader source. + * @return A Program instance. + */ + virtual Program* newProgram(const std::string& vertexShader, const std::string& fragmentShader) override; + protected: /** * New a shaderModule, not auto released. @@ -89,14 +97,6 @@ protected: */ virtual ShaderModule* newShaderModule(ShaderStage stage, const std::string& source) override; - /** - * New a Program, not auto released. - * @param vertexShader Specifes this is a vertex shader source. - * @param fragmentShader Specifes this is a fragment shader source. - * @return A Program object. - */ - virtual Program* newProgram(const std::string& vertexShader, const std::string& fragmentShader) override; - }; //end of _opengl group /// @} diff --git a/extensions/Particle3D/CCParticle3DRender.cpp b/extensions/Particle3D/CCParticle3DRender.cpp index ec498822a0..87c7f1e324 100755 --- a/extensions/Particle3D/CCParticle3DRender.cpp +++ b/extensions/Particle3D/CCParticle3DRender.cpp @@ -194,13 +194,15 @@ bool Particle3DQuadRender::initQuadRender( const std::string& texFile ) if (tex) { _texture = tex; - _programState = new backend::ProgramState(CC3D_particle_vert, CC3D_particleTexture_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::PARTICLE_TEXTURE_3D); + _programState = new backend::ProgramState(program); } } if (!_programState) { - _programState = new backend::ProgramState(CC3D_particle_vert, CC3D_particleColor_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::PARTICLE_COLOR_3D); + _programState = new backend::ProgramState(program); } auto &pipelineDescriptor = _meshCommand.getPipelineDescriptor(); diff --git a/extensions/Particle3D/PU/CCPUBillboardChain.cpp b/extensions/Particle3D/PU/CCPUBillboardChain.cpp index 17247197ee..d0ac619c6f 100644 --- a/extensions/Particle3D/PU/CCPUBillboardChain.cpp +++ b/extensions/Particle3D/PU/CCPUBillboardChain.cpp @@ -655,13 +655,15 @@ void PUBillboardChain::init( const std::string &texFile ) if (tex) { _texture = tex; - _programState = new backend::ProgramState(CC3D_particle_vert, CC3D_particleTexture_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::PARTICLE_TEXTURE_3D); + _programState = new backend::ProgramState(program); } } if(!_programState) { - _programState = new backend::ProgramState(CC3D_particle_vert, CC3D_particleColor_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::PARTICLE_COLOR_3D); + _programState = new backend::ProgramState(program); } auto &pipelineDescriptor = _meshCommand.getPipelineDescriptor(); diff --git a/extensions/Particle3D/PU/CCPURender.cpp b/extensions/Particle3D/PU/CCPURender.cpp index 9c7cd87907..4abee18b34 100644 --- a/extensions/Particle3D/PU/CCPURender.cpp +++ b/extensions/Particle3D/PU/CCPURender.cpp @@ -592,13 +592,15 @@ bool PUParticle3DEntityRender::initRender( const std::string &texFile ) if (tex) { _texture = tex; - _programState = new backend::ProgramState(CC3D_particle_vert, CC3D_particleTexture_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::PARTICLE_TEXTURE_3D); + _programState = new backend::ProgramState(program); } } if (!_programState) { - _programState = new backend::ProgramState(CC3D_particle_vert, CC3D_particleColor_frag); + auto* program = backend::Program::getBuiltinProgram(backend::ProgramType::PARTICLE_COLOR_3D); + _programState = new backend::ProgramState(program); } auto &pipelineDescriptor = _meshCommand.getPipelineDescriptor(); diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp index 79d0a2c174..394dfc0455 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp @@ -28,6 +28,7 @@ THE SOFTWARE. #include "testResource.h" #include "ui/UISlider.h" #include "platform/CCFileUtils.h" +#include "renderer/backend/Device.h" USING_NS_CC; @@ -1270,9 +1271,10 @@ void FogTestDemo::onEnter() auto vertexSource = FileUtils::getInstance()->getStringFromFile("Sprite3DTest/fog.vert"); auto fragSource = FileUtils::getInstance()->getStringFromFile("Sprite3DTest/fog.frag"); - - _programState1 = new backend::ProgramState(vertexSource, fragSource); - _programState2 = new backend::ProgramState(vertexSource, fragSource); + auto program = backend::Device::getInstance()->newProgram(vertexSource, fragSource); + _programState1 = new backend::ProgramState(program); + _programState2 = new backend::ProgramState(program); + CC_SAFE_RELEASE(program); _sprite3D1 = Sprite3D::create("Sprite3DTest/teapot.c3b"); _sprite3D2 = Sprite3D::create("Sprite3DTest/teapot.c3b"); @@ -1322,12 +1324,13 @@ void FogTestDemo::onEnter() auto vertexSource = FileUtils::getInstance()->getStringFromFile("Sprite3DTest/fog.vert"); auto fragSource = FileUtils::getInstance()->getStringFromFile("Sprite3DTest/fog.frag"); - - _programState1 = new backend::ProgramState(vertexSource, fragSource); - _programState2 = new backend::ProgramState(vertexSource, fragSource); + auto program = backend::Device::getInstance()->newProgram(vertexSource, fragSource); + _programState1 = new backend::ProgramState(program); + _programState2 = new backend::ProgramState(program); _sprite3D1->setProgramState(_programState1); _sprite3D2->setProgramState(_programState2); + CC_SAFE_RELEASE(program); auto fogColor = Vec4(0.5, 0.5, 0.5, 1.0); float fogStart = 10; diff --git a/tests/cpp-tests/Classes/ClippingNodeTest/ClippingNodeTest.cpp b/tests/cpp-tests/Classes/ClippingNodeTest/ClippingNodeTest.cpp index cea0741aa6..3c73098db0 100644 --- a/tests/cpp-tests/Classes/ClippingNodeTest/ClippingNodeTest.cpp +++ b/tests/cpp-tests/Classes/ClippingNodeTest/ClippingNodeTest.cpp @@ -577,7 +577,8 @@ void RawStencilBufferTest::initCommands() }; _disableStencilCallback.init(_globalZOrder); - _programState = new (std::nothrow) backend::ProgramState(positionUColor_vert, positionUColor_frag); + auto program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_UCOLOR); + _programState = new (std::nothrow) backend::ProgramState(program); _locColor = _programState->getProgram()->getUniformLocation("u_color"); _locMVPMatrix = _programState->getProgram()->getUniformLocation("u_MVPMatrix"); const auto& projectionMat = Director::getInstance()->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION); @@ -753,7 +754,8 @@ void RawStencilBufferTestAlphaTest::setup() RawStencilBufferTest::setup(); for(int i = 0; i < _planeCount; ++i) { - auto programState = new backend::ProgramState(positionTextureColor_vert, positionTextureColorAlphaTest_frag); + auto program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_TEXTURE_COLOR_ALPHA_TEST); + auto programState = new backend::ProgramState(program); programState->setUniform(programState->getUniformLocation("u_alpha_value"), &_alphaThreshold, sizeof(_alphaThreshold)); _spritesStencil.at(i)->setProgramState(programState); } diff --git a/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp b/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp index 668d75fc5f..1963f42525 100644 --- a/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp +++ b/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp @@ -26,6 +26,8 @@ #include "NewRendererTest.h" #include #include +#include "renderer/backend/Device.h" + USING_NS_CC; class DurationRecorder { @@ -861,9 +863,10 @@ cocos2d::backend::ProgramState* RendererUniformBatch::createBlurProgramState() auto fileUtiles = FileUtils::getInstance(); auto fragmentFullPath = fileUtiles->fullPathForFilename(shaderName); auto fragSource = fileUtiles->getStringFromFile(fragmentFullPath); - auto programState = new backend::ProgramState(positionTextureColor_vert, fragSource.c_str()); - - + auto program = backend::Device::getInstance()->newProgram(positionTextureColor_vert, fragSource.c_str()); + auto programState = new backend::ProgramState(program); + programState->autorelease(); + CC_SAFE_RELEASE(program); backend::UniformLocation loc = programState->getUniformLocation("resolution"); auto resolution = Vec2(85, 121); @@ -888,9 +891,11 @@ cocos2d::backend::ProgramState* RendererUniformBatch::createSepiaProgramState() auto fileUtiles = FileUtils::getInstance(); auto fragmentFullPath = fileUtiles->fullPathForFilename(shaderName); auto fragSource = fileUtiles->getStringFromFile(fragmentFullPath); - auto glprogram = new backend::ProgramState(positionTextureColor_vert, fragSource.c_str()); - - return glprogram; + auto program = backend::Device::getInstance()->newProgram(positionTextureColor_vert, fragSource.c_str()); + auto programState = new backend::ProgramState(program); + programState->autorelease(); + CC_SAFE_RELEASE(program); + return programState; } std::string RendererUniformBatch::title() const @@ -944,8 +949,10 @@ backend::ProgramState* RendererUniformBatch2::createBlurProgramState() auto fileUtiles = FileUtils::getInstance(); auto fragmentFullPath = fileUtiles->fullPathForFilename(shaderName); auto fragSource = fileUtiles->getStringFromFile(fragmentFullPath); - - auto programState = new backend::ProgramState(positionTextureColor_vert, fragSource.c_str()); + auto program = backend::Device::getInstance()->newProgram(positionTextureColor_vert, fragSource.c_str()); + auto programState = new backend::ProgramState(program); + programState->autorelease(); + CC_SAFE_RELEASE(program); backend::UniformLocation loc = programState->getUniformLocation("resolution"); auto resolution = Vec2(85, 121); @@ -970,9 +977,11 @@ backend::ProgramState* RendererUniformBatch2::createSepiaProgramState() auto fileUtiles = FileUtils::getInstance(); auto fragmentFullPath = fileUtiles->fullPathForFilename(shaderName); auto fragSource = fileUtiles->getStringFromFile(fragmentFullPath); - auto glprogram = new backend::ProgramState(positionTextureColor_vert, fragSource.c_str()); - - return glprogram; + auto program = backend::Device::getInstance()->newProgram(positionTextureColor_vert, fragSource.c_str()); + auto programState = new backend::ProgramState(program); + programState->autorelease(); + CC_SAFE_RELEASE(program); + return programState; } std::string RendererUniformBatch2::title() const diff --git a/tests/cpp-tests/Classes/ShaderTest/ShaderTest.cpp b/tests/cpp-tests/Classes/ShaderTest/ShaderTest.cpp index 08b51ff223..f3c1114a88 100644 --- a/tests/cpp-tests/Classes/ShaderTest/ShaderTest.cpp +++ b/tests/cpp-tests/Classes/ShaderTest/ShaderTest.cpp @@ -26,6 +26,7 @@ #include "../testResource.h" #include "cocos2d.h" #include "renderer/ccShaders.h" +#include "renderer/backend/Device.h" USING_NS_CC; USING_NS_CC_EXT; @@ -144,10 +145,11 @@ void ShaderNode::loadShaderVertex(const std::string &vert, const std::string &fr std::string vertexFilePath = fileUtiles->fullPathForFilename(vert); vertSource = fileUtiles->getStringFromFile(vertexFilePath); } - - auto programState = new backend::ProgramState(vertSource.c_str(), fragSource.c_str()); + auto program = backend::Device::getInstance()->newProgram(vertSource.c_str(), fragSource.c_str()); + auto programState = new backend::ProgramState(program); setProgramState(programState); CC_SAFE_RELEASE(programState); + CC_SAFE_RELEASE(program); } void ShaderNode::update(float dt) @@ -472,9 +474,11 @@ void SpriteBlur::initProgram() std::string fragSource = FileUtils::getInstance()->getStringFromFile( FileUtils::getInstance()->fullPathForFilename("Shaders/example_Blur.fsh")); - auto programState = new backend::ProgramState(positionTextureColor_vert, fragSource.data()); + auto program = backend::Device::getInstance()->newProgram(positionTextureColor_vert, fragSource.data()); + auto programState = new backend::ProgramState(program); setProgramState(programState); - CC_SAFE_RELEASE_NULL(programState); + CC_SAFE_RELEASE(programState); + CC_SAFE_RELEASE(program); auto size = getTexture()->getContentSizeInPixels(); @@ -603,7 +607,8 @@ bool ShaderRetroEffect::init() auto fragStr = FileUtils::getInstance()->getStringFromFile(FileUtils::getInstance()->fullPathForFilename("Shaders/example_HorizontalColor.fsh")); char * fragSource = (char*)fragStr.c_str(); - auto p = new backend::ProgramState(positionTextureColor_vert, fragSource); + auto program = backend::Device::getInstance()->newProgram(positionTextureColor_vert, fragSource); + auto p = new backend::ProgramState(program); auto director = Director::getInstance(); const auto& screenSizeLocation = p->getUniformLocation("u_screenSize"); const auto& frameSize = director->getOpenGLView()->getFrameSize(); @@ -623,6 +628,7 @@ bool ShaderRetroEffect::init() addChild(_label); scheduleUpdate(); + CC_SAFE_RELEASE(program); return true; } @@ -793,8 +799,8 @@ bool ShaderMultiTexture::init() auto * fu = FileUtils::getInstance(); auto vertexShader = fu->getStringFromFile("Shaders/example_MultiTexture.vsh"); auto fragmentShader = fu->getStringFromFile("Shaders/example_MultiTexture.fsh"); - - auto programState = new backend::ProgramState(vertexShader.c_str(), fragmentShader.c_str() ); + auto program = backend::Device::getInstance()->newProgram(vertexShader.c_str(), fragmentShader.c_str()); + auto programState = new backend::ProgramState(program); _sprite->setProgramState(programState); SET_TEXTURE(programState, "u_texture1", 1, right->getTexture()->getBackendTexture()); @@ -811,6 +817,7 @@ bool ShaderMultiTexture::init() menu->setPosition(s.width * 7 / 8, s.height / 2); CC_SAFE_RELEASE(programState); + CC_SAFE_RELEASE(program); return true; } diff --git a/tests/cpp-tests/Classes/ShaderTest/ShaderTest2.cpp b/tests/cpp-tests/Classes/ShaderTest/ShaderTest2.cpp index ace57de939..484a619317 100644 --- a/tests/cpp-tests/Classes/ShaderTest/ShaderTest2.cpp +++ b/tests/cpp-tests/Classes/ShaderTest/ShaderTest2.cpp @@ -27,6 +27,7 @@ #include "ShaderTest.h" #include "../testResource.h" #include "cocos2d.h" +#include "renderer/backend/Device.h" #include USING_NS_CC; @@ -178,10 +179,10 @@ bool Effect::initProgramState(const std::string &fragmentFilename) #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) _fragSource = fragSource; #endif - - auto programState = new backend::ProgramState(positionTextureColor_vert, fragSource.c_str()); - + auto program = backend::Device::getInstance()->newProgram(positionTextureColor_vert, fragSource.c_str()); + auto programState = new backend::ProgramState(program); CC_SAFE_RELEASE(_programState); + CC_SAFE_RELEASE(program); _programState = programState; return _programState != nullptr; diff --git a/tests/cpp-tests/Classes/Sprite3DTest/DrawNode3D.cpp b/tests/cpp-tests/Classes/Sprite3DTest/DrawNode3D.cpp index 9476a1f28f..e1339b73ae 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/DrawNode3D.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/DrawNode3D.cpp @@ -73,7 +73,8 @@ bool DrawNode3D::init() { _blendFunc = BlendFunc::ALPHA_PREMULTIPLIED; auto &pd = _customCommand.getPipelineDescriptor(); - _programStateLine = new backend::ProgramState(lineColor3D_vert, lineColor3D_frag); + auto program = backend::Program::getBuiltinProgram(backend::ProgramType::LINE_COLOR_3D); + _programStateLine = new backend::ProgramState(program); pd.programState = _programStateLine; _locMVPMatrix = _programStateLine->getUniformLocation("u_MVPMatrix"); diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index 74d7bfa53a..b9be4c87dd 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -2221,14 +2221,14 @@ void Issue9767::menuCallback_SwitchShader(cocos2d::Ref* sender) if (_shaderType == Issue9767::ShaderType::SHADER_TEX) { _shaderType = Issue9767::ShaderType::SHADER_COLOR; - //programState = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_POSITION); - _programState = new backend::ProgramState(CC3D_positionTexture_vert, CC3D_color_frag); + auto program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_3D); + _programState = new backend::ProgramState(program); } else { _shaderType = Issue9767::ShaderType::SHADER_TEX; - //programState = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_POSITION_TEXTURE); - _programState = new backend::ProgramState(CC3D_positionTexture_vert, CC3D_colorTexture_frag); + auto program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_TEXTURE_3D); + _programState = new backend::ProgramState(program); } _sprite->setProgramState(_programState); } diff --git a/tests/lua-tests/project/Classes/lua_test_bindings.cpp b/tests/lua-tests/project/Classes/lua_test_bindings.cpp index fed816e629..d16c8e242e 100644 --- a/tests/lua-tests/project/Classes/lua_test_bindings.cpp +++ b/tests/lua-tests/project/Classes/lua_test_bindings.cpp @@ -151,8 +151,8 @@ bool DrawNode3D::init() { _blendFunc = BlendFunc::ALPHA_PREMULTIPLIED; - - _programState = new backend::ProgramState(lineColor3D_vert, lineColor3D_frag); + auto program = backend::Program::getBuiltinProgram(backend::ProgramType::LINE_COLOR_3D); + _programState = new backend::ProgramState(program); _locMVPMatrix = _programState->getUniformLocation("u_MVPMatrix"); From bdf39670fd12cebf3c4a3c4e1afa75082ec47c86 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Wed, 16 Oct 2019 09:44:05 +0800 Subject: [PATCH 21/96] [ci skip][AUTO]: updating luabinding & cocos_file.json automatically (#20203) --- .../auto/lua_cocos2dx_backend_auto.cpp | 89 ++++++++++++------- .../auto/lua_cocos2dx_backend_auto.hpp | 1 + 2 files changed, 57 insertions(+), 33 deletions(-) diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.cpp index a0ecf4def2..4e917d2afb 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.cpp @@ -856,6 +856,42 @@ int lua_cocos2dx_backend_Program_getVertexShader(lua_State* tolua_S) return 0; } +int lua_cocos2dx_backend_Program_getBuiltinProgram(lua_State* tolua_S) +{ + int argc = 0; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertable(tolua_S,1,"ccb.Program",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S) - 1; + + if (argc == 1) + { + cocos2d::backend::ProgramType arg0; + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccb.Program:getBuiltinProgram"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_backend_Program_getBuiltinProgram'", nullptr); + return 0; + } + cocos2d::backend::Program* ret = cocos2d::backend::Program::getBuiltinProgram(arg0); + object_to_luaval(tolua_S, "ccb.Program",(cocos2d::backend::Program*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccb.Program:getBuiltinProgram",argc, 1); + return 0; +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_backend_Program_getBuiltinProgram'.",&tolua_err); +#endif + return 0; +} static int lua_cocos2dx_backend_Program_finalize(lua_State* tolua_S) { printf("luabindings: finalizing LUA object (Program)"); @@ -878,6 +914,7 @@ int lua_register_cocos2dx_backend_Program(lua_State* tolua_S) tolua_function(tolua_S,"getActiveAttributes",lua_cocos2dx_backend_Program_getActiveAttributes); tolua_function(tolua_S,"getAttributeLocation",lua_cocos2dx_backend_Program_getAttributeLocation); tolua_function(tolua_S,"getVertexShader",lua_cocos2dx_backend_Program_getVertexShader); + tolua_function(tolua_S,"getBuiltinProgram", lua_cocos2dx_backend_Program_getBuiltinProgram); tolua_endmodule(tolua_S); std::string typeName = typeid(cocos2d::backend::Program).name(); g_luaType[typeName] = "ccb.Program"; @@ -1461,46 +1498,32 @@ int lua_cocos2dx_backend_ProgramState_constructor(lua_State* tolua_S) int argc = 0; cocos2d::backend::ProgramState* cobj = nullptr; bool ok = true; + #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; #endif + + argc = lua_gettop(tolua_S)-1; - do{ - if (argc == 1) { - cocos2d::backend::ProgramType arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccb.ProgramState:ProgramState"); + if (argc == 1) + { + cocos2d::backend::Program* arg0; - if (!ok) { break; } - cobj = new cocos2d::backend::ProgramState(arg0); - cobj->autorelease(); - int ID = (int)cobj->_ID ; - int* luaID = &cobj->_luaID ; - toluafix_pushusertype_ccobject(tolua_S, ID, luaID, (void*)cobj,"ccb.ProgramState"); - return 1; + ok &= luaval_to_object(tolua_S, 2, "ccb.Program",&arg0, "ccb.ProgramState:ProgramState"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_backend_ProgramState_constructor'", nullptr); + return 0; } - }while(0); - ok = true; - do{ - if (argc == 2) { - std::string arg0; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccb.ProgramState:ProgramState"); - - if (!ok) { break; } - std::string arg1; - ok &= luaval_to_std_string(tolua_S, 3,&arg1, "ccb.ProgramState:ProgramState"); - - if (!ok) { break; } - cobj = new cocos2d::backend::ProgramState(arg0, arg1); - cobj->autorelease(); - int ID = (int)cobj->_ID ; - int* luaID = &cobj->_luaID ; - toluafix_pushusertype_ccobject(tolua_S, ID, luaID, (void*)cobj,"ccb.ProgramState"); - return 1; - } - }while(0); - ok = true; - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccb.ProgramState:ProgramState",argc, 2); + cobj = new cocos2d::backend::ProgramState(arg0); + cobj->autorelease(); + int ID = (int)cobj->_ID ; + int* luaID = &cobj->_luaID ; + toluafix_pushusertype_ccobject(tolua_S, ID, luaID, (void*)cobj,"ccb.ProgramState"); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccb.ProgramState:ProgramState",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.hpp index 2f17382371..89be61cc11 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.hpp @@ -53,6 +53,7 @@ int register_all_cocos2dx_backend(lua_State* tolua_S); + #endif // __cocos2dx_backend_h__ From b8cf6803424a4b5e023dabd3d1c4f5cf985bff46 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Wed, 16 Oct 2019 09:48:38 +0800 Subject: [PATCH 22/96] update ProgramState usage in lua (#20204) --- tests/lua-tests/src/Camera3DTest/Camera3DTest.lua | 4 +++- tests/lua-tests/src/Scene3DTest/Scene3DTest.lua | 6 +++--- tests/lua-tests/src/Sprite3DTest/Sprite3DTest.lua | 7 ++++--- tools/tolua/cocos2dx_backend.ini | 8 ++++---- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/tests/lua-tests/src/Camera3DTest/Camera3DTest.lua b/tests/lua-tests/src/Camera3DTest/Camera3DTest.lua index 566abdd122..9a304c195b 100644 --- a/tests/lua-tests/src/Camera3DTest/Camera3DTest.lua +++ b/tests/lua-tests/src/Camera3DTest/Camera3DTest.lua @@ -720,8 +720,10 @@ function FogTestDemo:createLayer3D() local vertexShader = cc.FileUtils:getInstance():getStringFromFile("Sprite3DTest/fog.vert") local fragmentShader = cc.FileUtils:getInstance():getStringFromFile("Sprite3DTest/fog.frag") - self._shader1 = ccb.ProgramState:new(vertexShader, fragmentShader) + local program = ccb.Device:getInstance():newProgram(vertexShader, fragmentShader) + self._shader1 = ccb.ProgramState:new(program) self._shader2 = self._shader1:clone() + program:release() self._sprite3D1 = cc.Sprite3D:create("Sprite3DTest/teapot.c3b") self._sprite3D2 = cc.Sprite3D:create("Sprite3DTest/teapot.c3b") diff --git a/tests/lua-tests/src/Scene3DTest/Scene3DTest.lua b/tests/lua-tests/src/Scene3DTest/Scene3DTest.lua index 030b42e59f..02259a63a0 100644 --- a/tests/lua-tests/src/Scene3DTest/Scene3DTest.lua +++ b/tests/lua-tests/src/Scene3DTest/Scene3DTest.lua @@ -333,9 +333,9 @@ function Scene3DTest:create3DWorld() local cmVert = cc.FileUtils:getInstance():getStringFromFile("Sprite3DTest/cube_map.vert") local cmFrag = cc.FileUtils:getInstance():getStringFromFile("Sprite3DTest/cube_map.frag") - - local state = ccb.ProgramState:new(cmVert, cmFrag) - + local program = ccb.Device:getInstance():newProgram(cmVert, cmFrag) + local state = ccb.ProgramState:new(program) + program:release() --create the second texture for cylinder self._textureCube = cc.TextureCube:create("Sprite3DTest/skybox/left.jpg", "Sprite3DTest/skybox/right.jpg", "Sprite3DTest/skybox/top.jpg", "Sprite3DTest/skybox/bottom.jpg", diff --git a/tests/lua-tests/src/Sprite3DTest/Sprite3DTest.lua b/tests/lua-tests/src/Sprite3DTest/Sprite3DTest.lua index a81b52c70d..47f44d926a 100644 --- a/tests/lua-tests/src/Sprite3DTest/Sprite3DTest.lua +++ b/tests/lua-tests/src/Sprite3DTest/Sprite3DTest.lua @@ -1125,9 +1125,10 @@ function Sprite3DCubeMapTest:addNewSpriteWithCoords(pos) local vertexShader = cc.FileUtils:getInstance():getStringFromFile("Sprite3DTest/cube_map.vert") local fragmentShader = cc.FileUtils:getInstance():getStringFromFile("Sprite3DTest/cube_map.frag") - - local programState = ccb.ProgramState:new(vertexShader, fragmentShader) - + local program = ccb.Device:getInstance():newProgram(vertexShader, fragmentShader) + local programState = ccb.ProgramState:new(program) + program:release() + self._textureCube = cc.TextureCube:create("Sprite3DTest/skybox/left.jpg", "Sprite3DTest/skybox/right.jpg", "Sprite3DTest/skybox/top.jpg", "Sprite3DTest/skybox/bottom.jpg", "Sprite3DTest/skybox/front.jpg", "Sprite3DTest/skybox/back.jpg") diff --git a/tools/tolua/cocos2dx_backend.ini b/tools/tolua/cocos2dx_backend.ini index 7521bed03d..02f5f4b314 100644 --- a/tools/tolua/cocos2dx_backend.ini +++ b/tools/tolua/cocos2dx_backend.ini @@ -23,12 +23,12 @@ cxxgenerator_headers = extra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s # what headers to parse -headers = %(cocosdir)s/cocos/renderer/backend/Types.h %(cocosdir)s/cocos/renderer/backend/ProgramState.h %(cocosdir)s/cocos/renderer/backend/Texture.h %(cocosdir)s/cocos/renderer/backend/VertexLayout.h +headers = %(cocosdir)s/cocos/renderer/backend/Types.h %(cocosdir)s/cocos/renderer/backend/ProgramState.h %(cocosdir)s/cocos/renderer/backend/Texture.h %(cocosdir)s/cocos/renderer/backend/VertexLayout.h %(cocosdir)s/cocos/renderer/backend/Device.h #headers = %(cocosdir)s/cocos/renderer/backend/ProgramState.h # what classes to produce code for. You can use regular expressions here. When testing the regular # expression, it will be enclosed in "^$", like this: "^Menu*$". -classes = VertexLayout BufferUsage BufferType ShaderStage VertexFormat PixelFormat TextureUsage IndexFormat VertexStepMode PrimitiveType TextureType SamplerAddressMode SamplerFilter StencilOperation CompareFunction BlendOperation BlendFactor ColorWriteMask SamplerDescriptor CullMode Winding UniformInfo UniformLocation AttributeBindInfo TextureCubeFace ProgramState TextureBackend Program Texture2DBackend TextureCubemapBackend +classes = VertexLayout BufferUsage BufferType ShaderStage VertexFormat PixelFormat TextureUsage IndexFormat VertexStepMode PrimitiveType TextureType SamplerAddressMode SamplerFilter StencilOperation CompareFunction BlendOperation BlendFactor ColorWriteMask SamplerDescriptor CullMode Winding UniformInfo UniformLocation AttributeBindInfo TextureCubeFace ProgramState TextureBackend Program Texture2DBackend TextureCubemapBackend Device # what should we skip? in the format ClassName::[function function] # ClassName is a regular expression, but will be used like this: "^ClassName$" functions are also @@ -39,8 +39,8 @@ classes = VertexLayout BufferUsage BufferType ShaderStage VertexFormat PixelForm skip = VertexLayout::[getAttributes], ProgramState::[getCallbackUniforms getVertexTextureInfos getVertexUniformInfos getFragmentTextureInfos getFragmentUniformInfos setTextureArray setCallbackUniform setUniform getVertexUniformBuffer getFragmentUniformBuffer getVertexLayout getUniformLocation], - Program::[getFragmentUniformInfos getVertexUniformInfos cloneUniformBuffer getActiveUniformInfo getAllActiveUniformInfo] - + Program::[getFragmentUniformInfos getVertexUniformInfos cloneUniformBuffer getActiveUniformInfo getAllActiveUniformInfo], + Device::[newCommandBuffer newBuffer newTexture createDepthStencilState newRenderPipeline setFrameBufferOnly getDeviceInfo] rename_functions = rename_classes = From 0a227ef2d79a9de72c1c38c1326f00d88b478e75 Mon Sep 17 00:00:00 2001 From: Andy Duplain Date: Wed, 16 Oct 2019 02:51:17 +0100 Subject: [PATCH 23/96] Don't use MTL_ pixelformat when building for iOS Simulator. (#20198) --- cocos/renderer/CCTexture2D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/renderer/CCTexture2D.cpp b/cocos/renderer/CCTexture2D.cpp index 177812f04e..9e3ab96702 100644 --- a/cocos/renderer/CCTexture2D.cpp +++ b/cocos/renderer/CCTexture2D.cpp @@ -406,7 +406,7 @@ bool Texture2D::initWithImage(Image *image, backend::PixelFormat format) //override renderFormat, since some render format is not supported by metal switch (renderFormat) { -#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS && !TARGET_OS_SIMULATOR) //packed 16 bits pixels only available on iOS case PixelFormat::RGB565: renderFormat = PixelFormat::MTL_B5G6R5; From 40038020ba3c75241fc094818a34bddd4ad10bf1 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Wed, 16 Oct 2019 11:41:06 +0800 Subject: [PATCH 24/96] [ci skip][AUTO]: updating luabinding & cocos_file.json automatically (#20208) --- .../auto/lua_cocos2dx_backend_auto.cpp | 110 ++++++++++++++++++ .../auto/lua_cocos2dx_backend_auto.hpp | 3 + 2 files changed, 113 insertions(+) diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.cpp index 4e917d2afb..58ff52dca1 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.cpp @@ -3,6 +3,7 @@ #include "renderer/backend/ProgramState.h" #include "renderer/backend/Texture.h" #include "renderer/backend/VertexLayout.h" +#include "renderer/backend/Device.h" #include "scripting/lua-bindings/manual/tolua_fix.h" #include "scripting/lua-bindings/manual/LuaBasicConversions.h" @@ -2440,6 +2441,114 @@ int lua_register_cocos2dx_backend_TextureCubemapBackend(lua_State* tolua_S) g_typeCast["TextureCubemapBackend"] = "ccb.TextureCubemapBackend"; return 1; } + +int lua_cocos2dx_backend_Device_newProgram(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::backend::Device* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccb.Device",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::backend::Device*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_backend_Device_newProgram'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 2) + { + std::string arg0; + std::string arg1; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccb.Device:newProgram"); + + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "ccb.Device:newProgram"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_backend_Device_newProgram'", nullptr); + return 0; + } + cocos2d::backend::Program* ret = cobj->newProgram(arg0, arg1); + object_to_luaval(tolua_S, "ccb.Program",(cocos2d::backend::Program*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccb.Device:newProgram",argc, 2); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_backend_Device_newProgram'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_backend_Device_getInstance(lua_State* tolua_S) +{ + int argc = 0; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertable(tolua_S,1,"ccb.Device",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S) - 1; + + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_backend_Device_getInstance'", nullptr); + return 0; + } + cocos2d::backend::Device* ret = cocos2d::backend::Device::getInstance(); + object_to_luaval(tolua_S, "ccb.Device",(cocos2d::backend::Device*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccb.Device:getInstance",argc, 0); + return 0; +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_backend_Device_getInstance'.",&tolua_err); +#endif + return 0; +} +static int lua_cocos2dx_backend_Device_finalize(lua_State* tolua_S) +{ + printf("luabindings: finalizing LUA object (Device)"); + return 0; +} + +int lua_register_cocos2dx_backend_Device(lua_State* tolua_S) +{ + tolua_usertype(tolua_S,"ccb.Device"); + tolua_cclass(tolua_S,"Device","ccb.Device","cc.Ref",nullptr); + + tolua_beginmodule(tolua_S,"Device"); + tolua_function(tolua_S,"newProgram",lua_cocos2dx_backend_Device_newProgram); + tolua_function(tolua_S,"getInstance", lua_cocos2dx_backend_Device_getInstance); + tolua_endmodule(tolua_S); + std::string typeName = typeid(cocos2d::backend::Device).name(); + g_luaType[typeName] = "ccb.Device"; + g_typeCast["Device"] = "ccb.Device"; + return 1; +} TOLUA_API int register_all_cocos2dx_backend(lua_State* tolua_S) { tolua_open(tolua_S); @@ -2459,6 +2568,7 @@ TOLUA_API int register_all_cocos2dx_backend(lua_State* tolua_S) lua_register_cocos2dx_backend_TextureCubeFace(tolua_S); lua_register_cocos2dx_backend_VertexLayout(tolua_S); lua_register_cocos2dx_backend_BlendFactor(tolua_S); + lua_register_cocos2dx_backend_Device(tolua_S); lua_register_cocos2dx_backend_VertexFormat(tolua_S); lua_register_cocos2dx_backend_VertexStepMode(tolua_S); lua_register_cocos2dx_backend_StencilOperation(tolua_S); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.hpp index 89be61cc11..d022b93be1 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.hpp @@ -52,6 +52,9 @@ int register_all_cocos2dx_backend(lua_State* tolua_S); + + + From 8a64e6f983851e089a673a0853e9c75205f170ba Mon Sep 17 00:00:00 2001 From: minggo Date: Wed, 16 Oct 2019 16:31:35 +0800 Subject: [PATCH 25/96] fix RotateTo animation when angle is bigger than 360 (#20009) (#20211) --- cocos/2d/CCActionInterval.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cocos/2d/CCActionInterval.cpp b/cocos/2d/CCActionInterval.cpp index 8dd7612254..1a06ce49eb 100644 --- a/cocos/2d/CCActionInterval.cpp +++ b/cocos/2d/CCActionInterval.cpp @@ -913,6 +913,8 @@ void RotateTo::calculateAngles(float &startAngle, float &diffAngle, float dstAng } diffAngle = dstAngle - startAngle; + //fix angle when angle is bigger than 360 + diffAngle = diffAngle - (int)diffAngle / 360 * 360; if (diffAngle > 180) { diffAngle -= 360; From 24b04e561b5202dfc7f03557f798fa9c71f1ebe0 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 17 Oct 2019 11:12:25 +0800 Subject: [PATCH 26/96] sync #20007 to v4 (#20210) * sync #20007 to v4 * Fixing a bug in Node::enumerateChildren (#20045) This patch fixes an issue that if both // (recursive enumeration) and .. (starting from parent node) are specified, Node::enumerateChildren does not honor the latter and starts searching from current node rather than parent node. --- cocos/2d/CCNode.cpp | 15 ++++++++++----- cocos/2d/CCNode.h | 2 +- tests/cpp-tests/Classes/NodeTest/NodeTest.cpp | 8 ++++---- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/cocos/2d/CCNode.cpp b/cocos/2d/CCNode.cpp index 7ecf261ffe..f203c62dc6 100644 --- a/cocos/2d/CCNode.cpp +++ b/cocos/2d/CCNode.cpp @@ -809,22 +809,27 @@ void Node::enumerateChildren(const std::string &name, std::functiondoEnumerateRecursive(target, newName, callback); } else { // name is xxx - doEnumerate(newName, callback); + target->doEnumerate(newName, callback); } } diff --git a/cocos/2d/CCNode.h b/cocos/2d/CCNode.h index 2f1dccd7b2..bbab0deef6 100644 --- a/cocos/2d/CCNode.h +++ b/cocos/2d/CCNode.h @@ -794,7 +794,7 @@ public: * @param name The name to search for, supports c++11 regular expression. * Search syntax options: * `//`: Can only be placed at the begin of the search string. This indicates that it will search recursively. - * `..`: The search should move up to the node's parent. Can only be placed at the end of string. + * `/..`: The search should move up to the node's parent. Can only be placed at the end of string. * `/` : When placed anywhere but the start of the search string, this indicates that the search should move to the node's children. * * @code diff --git a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp index 6432935779..3df31eee30 100644 --- a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp +++ b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp @@ -1395,14 +1395,14 @@ void NodeNameTest::test(float dt) // search from parent // name is xxx/.. i = 0; - parent->enumerateChildren("node/..", [&i](Node* node) -> bool { + parent->getChildByName("node1")->enumerateChildren("node[[:digit:]]+/node/..", [&i](Node* node) -> bool { ++i; return true; }); CCAssert(i == 1, ""); i = 0; - parent->enumerateChildren("node/..", [&i](Node* node) -> bool { + parent->getChildByName("node1")->enumerateChildren("node[[:digit:]]+/node/..", [&i](Node* node) -> bool { ++i; return false; }); @@ -1441,11 +1441,11 @@ void NodeNameTest::test(float dt) CCAssert(i == 1, ""); i = 0; - parent->enumerateChildren("//node[[:digit:]]+/..", [&i](Node* node) -> bool { + parent->getChildByName("node1")->enumerateChildren("//node[[:digit:]]+/..", [&i](Node* node) -> bool { ++i; return false; }); - CCAssert(i == 100, ""); + CCAssert(i == 110, ""); // utils::findChildren() From 99e984dde560f9b24b089ca511aedb43dcf87cd2 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 17 Oct 2019 11:12:37 +0800 Subject: [PATCH 27/96] fix crash when plist filename hasn't suffix (#19999) (#20212) --- cocos/2d/CCSpriteFrameCache.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/cocos/2d/CCSpriteFrameCache.cpp b/cocos/2d/CCSpriteFrameCache.cpp index a5316ae876..57bd730af0 100644 --- a/cocos/2d/CCSpriteFrameCache.cpp +++ b/cocos/2d/CCSpriteFrameCache.cpp @@ -384,7 +384,10 @@ void SpriteFrameCache::addSpriteFramesWithFile(const std::string& plist) // remove .xxx size_t startPos = texturePath.find_last_of('.'); - texturePath = texturePath.erase(startPos); + if(startPos != string::npos) + { + texturePath = texturePath.erase(startPos); + } // append .png texturePath = texturePath.append(".png"); @@ -686,8 +689,11 @@ bool SpriteFrameCache::reloadTexture(const std::string& plist) // remove .xxx size_t startPos = texturePath.find_last_of('.'); - texturePath = texturePath.erase(startPos); - + if(startPos != string::npos) + { + texturePath = texturePath.erase(startPos); + } + // append .png texturePath = texturePath.append(".png"); } From fafd16e9494485aaa214e15a94611a769fe8a222 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 17 Oct 2019 11:12:49 +0800 Subject: [PATCH 28/96] refactor Quaternion class (#20031) (#20213) * remove redundant copy constructor and destructor --- cocos/math/Quaternion.cpp | 9 --------- cocos/math/Quaternion.h | 12 ------------ 2 files changed, 21 deletions(-) diff --git a/cocos/math/Quaternion.cpp b/cocos/math/Quaternion.cpp index 4750d6d797..90cd1667c7 100644 --- a/cocos/math/Quaternion.cpp +++ b/cocos/math/Quaternion.cpp @@ -53,15 +53,6 @@ Quaternion::Quaternion(const Vec3& axis, float angle) set(axis, angle); } -Quaternion::Quaternion(const Quaternion& copy) -{ - set(copy); -} - -Quaternion::~Quaternion() -{ -} - const Quaternion& Quaternion::identity() { static Quaternion value(0.0f, 0.0f, 0.0f, 1.0f); diff --git a/cocos/math/Quaternion.h b/cocos/math/Quaternion.h index 2e5b1d46e7..c74521a4a3 100644 --- a/cocos/math/Quaternion.h +++ b/cocos/math/Quaternion.h @@ -125,18 +125,6 @@ public: */ Quaternion(const Vec3& axis, float angle); - /** - * Constructs a new quaternion that is a copy of the specified one. - * - * @param copy The quaternion to copy. - */ - Quaternion(const Quaternion& copy); - - /** - * Destructor. - */ - ~Quaternion(); - /** * Returns the identity quaternion. * From fae3ef8e48ab425c05f60238ef6764c0f448487e Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 17 Oct 2019 11:13:02 +0800 Subject: [PATCH 29/96] fix memory leak (#20110) (#20214) --- cocos/ui/UIVideoPlayer-ios.mm | 2 +- cocos/ui/UIWebView/UIWebViewImpl-ios.mm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/ui/UIVideoPlayer-ios.mm b/cocos/ui/UIVideoPlayer-ios.mm index 1ef018e34d..248f6a285a 100644 --- a/cocos/ui/UIVideoPlayer-ios.mm +++ b/cocos/ui/UIVideoPlayer-ios.mm @@ -87,7 +87,7 @@ typedef NS_ENUM(NSInteger, PlayerbackState) { -(id)init:(void*)videoPlayer { if (self = [super init]) { - self.playerController = [AVPlayerViewController new]; + self.playerController = [[AVPlayerViewController new] autorelease]; [self setRepeatEnabled:FALSE]; [self showPlaybackControls:TRUE]; diff --git a/cocos/ui/UIWebView/UIWebViewImpl-ios.mm b/cocos/ui/UIWebView/UIWebViewImpl-ios.mm index 339797b8ab..0755809ed8 100644 --- a/cocos/ui/UIWebView/UIWebViewImpl-ios.mm +++ b/cocos/ui/UIWebView/UIWebViewImpl-ios.mm @@ -124,7 +124,7 @@ - (void)setupWebView { if (!self.wkWebView) { - self.wkWebView = [[WKWebView alloc] init]; + self.wkWebView = [[[WKWebView alloc] init] autorelease]; self.wkWebView.UIDelegate = self; self.wkWebView.navigationDelegate = self; } From d29adb318005f437ca019e70749be9cb305b5b78 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 17 Oct 2019 11:14:04 +0800 Subject: [PATCH 30/96] sync #19914 (#20215) --- cocos/2d/CCFontAtlas.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cocos/2d/CCFontAtlas.cpp b/cocos/2d/CCFontAtlas.cpp index 7a529acdf2..5818b2c204 100644 --- a/cocos/2d/CCFontAtlas.cpp +++ b/cocos/2d/CCFontAtlas.cpp @@ -60,6 +60,13 @@ FontAtlas::FontAtlas(Font &theFont) { _letterPadding += 2 * FontFreeType::DistanceMapSpread; } + + auto outlineSize = _fontFreeType->getOutlineSize(); + if (outlineSize > 0) + { + _lineHeight += 2 * outlineSize; + } + #if CC_ENABLE_CACHE_TEXTURE_DATA auto eventDispatcher = Director::getInstance()->getEventDispatcher(); @@ -87,7 +94,6 @@ void FontAtlas::reinit() auto outlineSize = _fontFreeType->getOutlineSize(); if(outlineSize > 0) { - _lineHeight += 2 * outlineSize; _currentPageDataSize *= 2; _currentPageDataSizeRGBA = _currentPageDataSize * 2; From c816d2967b887230e5114518858fbf511142759a Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 17 Oct 2019 11:14:15 +0800 Subject: [PATCH 31/96] Fix include order for Win32. (#20216) --- cocos/platform/win32/CCStdC-win32.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cocos/platform/win32/CCStdC-win32.h b/cocos/platform/win32/CCStdC-win32.h index 98ba8641d0..48409900d0 100644 --- a/cocos/platform/win32/CCStdC-win32.h +++ b/cocos/platform/win32/CCStdC-win32.h @@ -97,12 +97,12 @@ typedef SSIZE_T ssize_t; #ifndef NOMINMAX #define NOMINMAX #endif -// Structure timeval has define in winsock.h, include windows.h for it. -#include #ifndef __MINGW32__ #include +// Structure timeval has define in winsock.h, include windows.h for it. +#include NS_CC_BEGIN @@ -120,6 +120,7 @@ NS_CC_END #undef _WINSOCKAPI_ #include +#include // Conflicted with math.h isnan #include From e86f22940a3404dfc8575d21cce90478627dcdf6 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 17 Oct 2019 11:14:28 +0800 Subject: [PATCH 32/96] Remove tinyxml2 from CCSaxParser implement. (#20141) (#20217) --- cocos/platform/CCSAXParser.cpp | 69 +++------------------------------- 1 file changed, 6 insertions(+), 63 deletions(-) diff --git a/cocos/platform/CCSAXParser.cpp b/cocos/platform/CCSAXParser.cpp index eca50aec1e..cdb83cc498 100644 --- a/cocos/platform/CCSAXParser.cpp +++ b/cocos/platform/CCSAXParser.cpp @@ -28,66 +28,10 @@ #include // because its based on windows 8 build :P #include "platform/CCFileUtils.h" -#include "tinyxml2.h" #include "rapidxml/rapidxml_sax3.hpp" NS_CC_BEGIN -class XmlSaxHander : public tinyxml2::XMLVisitor -{ -public: - XmlSaxHander():_ccsaxParserImp(0){}; - - virtual bool VisitEnter( const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* firstAttribute ); - virtual bool VisitExit( const tinyxml2::XMLElement& element ); - virtual bool Visit( const tinyxml2::XMLText& text ); - virtual bool Visit( const tinyxml2::XMLUnknown&){ return true; } - - void setSAXParserImp(SAXParser* parser) - { - _ccsaxParserImp = parser; - } - -private: - SAXParser *_ccsaxParserImp; -}; - - -bool XmlSaxHander::VisitEnter( const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* firstAttribute ) -{ - //log(" VisitEnter %s",element.Value()); - - std::vector attsVector; - for( const tinyxml2::XMLAttribute* attrib = firstAttribute; attrib; attrib = attrib->Next() ) - { - //log("%s", attrib->Name()); - attsVector.push_back(attrib->Name()); - //log("%s",attrib->Value()); - attsVector.push_back(attrib->Value()); - } - - // nullptr is used in c++11 - //attsVector.push_back(nullptr); - attsVector.push_back(nullptr); - - SAXParser::startElement(_ccsaxParserImp, (const CC_XML_CHAR *)element.Value(), (const CC_XML_CHAR **)(&attsVector[0])); - return true; -} -bool XmlSaxHander::VisitExit( const tinyxml2::XMLElement& element ) -{ - //log("VisitExit %s",element.Value()); - - SAXParser::endElement(_ccsaxParserImp, (const CC_XML_CHAR *)element.Value()); - return true; -} - -bool XmlSaxHander::Visit( const tinyxml2::XMLText& text ) -{ - //log("Visit %s",text.Value()); - SAXParser::textHandler(_ccsaxParserImp, (const CC_XML_CHAR *)text.Value(), strlen(text.Value())); - return true; -} - /// rapidxml SAX handler class RapidXmlSaxHander : public rapidxml::xml_sax2_handler { @@ -136,12 +80,11 @@ bool SAXParser::init(const char* /*encoding*/) bool SAXParser::parse(const char* xmlData, size_t dataLength) { - tinyxml2::XMLDocument tinyDoc; - tinyDoc.Parse(xmlData, dataLength); - XmlSaxHander printer; - printer.setSAXParserImp(this); - - return tinyDoc.Accept( &printer ); + if(xmlData != nullptr && dataLength > 0) { + std::string mutableData(xmlData, dataLength); + return this->parseIntrusive(&mutableData.front(), dataLength); + } + return false; } bool SAXParser::parse(const std::string& filename) @@ -150,7 +93,7 @@ bool SAXParser::parse(const std::string& filename) Data data = FileUtils::getInstance()->getDataFromFile(filename); if (!data.isNull()) { - ret = parse((const char*)data.getBytes(), data.getSize()); + ret = parseIntrusive((char*)data.getBytes(), data.getSize()); } return ret; From cbf3233b5981ce868cd4da6ea8053ab1f2500e53 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 17 Oct 2019 14:28:35 +0800 Subject: [PATCH 33/96] Rename cocos2d::MessageBox to cocos2d::ccMessageBox. (#20159) (#20218) --- cocos/platform/CCCommon.h | 2 +- cocos/platform/android/CCCommon-android.cpp | 2 +- cocos/platform/desktop/CCGLViewImpl-desktop.cpp | 8 ++++---- cocos/platform/ios/CCCommon-ios.mm | 2 +- cocos/platform/linux/CCCommon-linux.cpp | 2 +- cocos/platform/mac/CCCommon-mac.mm | 2 +- cocos/platform/mac/CCGLViewImpl-mac.mm | 2 +- cocos/platform/win32/CCCommon-win32.cpp | 2 +- cocos/platform/win32/CCStdC-win32.h | 5 ----- 9 files changed, 11 insertions(+), 16 deletions(-) diff --git a/cocos/platform/CCCommon.h b/cocos/platform/CCCommon.h index ba6f0aecd9..037eb65fd2 100644 --- a/cocos/platform/CCCommon.h +++ b/cocos/platform/CCCommon.h @@ -45,7 +45,7 @@ void CC_DLL LuaLog(const char * format); /** @brief Pop out a message box */ -void CC_DLL MessageBox(const char * msg, const char * title); +void CC_DLL ccMessageBox(const char * msg, const char * title); /** @brief Enum the language type supported now diff --git a/cocos/platform/android/CCCommon-android.cpp b/cocos/platform/android/CCCommon-android.cpp index 8f48d988ab..0759a7c660 100644 --- a/cocos/platform/android/CCCommon-android.cpp +++ b/cocos/platform/android/CCCommon-android.cpp @@ -37,7 +37,7 @@ NS_CC_BEGIN #define MAX_LEN (cocos2d::kMaxLogLen + 1) -void MessageBox(const char * pszMsg, const char * pszTitle) +void ccMessageBox(const char * pszMsg, const char * pszTitle) { JniHelper::callStaticVoidMethod("org.cocos2dx.lib.Cocos2dxHelper", "showDialog", pszTitle, pszMsg); } diff --git a/cocos/platform/desktop/CCGLViewImpl-desktop.cpp b/cocos/platform/desktop/CCGLViewImpl-desktop.cpp index d305fe82f5..b98110e2fb 100644 --- a/cocos/platform/desktop/CCGLViewImpl-desktop.cpp +++ b/cocos/platform/desktop/CCGLViewImpl-desktop.cpp @@ -316,7 +316,7 @@ bool GLViewImpl::initWithRect(const std::string& viewName, Rect rect, float fram message.append(_glfwError); } - MessageBox(message.c_str(), "Error launch application"); + ccMessageBox(message.c_str(), "Error launch application"); return false; } @@ -367,7 +367,7 @@ bool GLViewImpl::initWithRect(const std::string& viewName, Rect rect, float fram sprintf(strComplain, "OpenGL 1.5 or higher is required (your version is %s). Please upgrade the driver of your video card.", glVersion); - MessageBox(strComplain, "OpenGL version too old"); + ccMessageBox(strComplain, "OpenGL version too old"); return false; } @@ -1012,7 +1012,7 @@ bool GLViewImpl::initGlew() GLenum GlewInitResult = glewInit(); if (GLEW_OK != GlewInitResult) { - MessageBox((char *)glewGetErrorString(GlewInitResult), "OpenGL error"); + ccMessageBox((char *)glewGetErrorString(GlewInitResult), "OpenGL error"); return false; } @@ -1038,7 +1038,7 @@ bool GLViewImpl::initGlew() #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) if(glew_dynamic_binding() == false) { - MessageBox("No OpenGL framebuffer support. Please upgrade the driver of your video card.", "OpenGL error"); + ccMessageBox("No OpenGL framebuffer support. Please upgrade the driver of your video card.", "OpenGL error"); return false; } #endif //#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) diff --git a/cocos/platform/ios/CCCommon-ios.mm b/cocos/platform/ios/CCCommon-ios.mm index d5da2c0944..ca1115c407 100644 --- a/cocos/platform/ios/CCCommon-ios.mm +++ b/cocos/platform/ios/CCCommon-ios.mm @@ -39,7 +39,7 @@ NS_CC_BEGIN // ios no MessageBox, use log instead -void MessageBox(const char * msg, const char * title) +void ccMessageBox(const char * msg, const char * title) { // only enable it on iOS. // FIXME: Implement it for tvOS diff --git a/cocos/platform/linux/CCCommon-linux.cpp b/cocos/platform/linux/CCCommon-linux.cpp index 270c281b12..6ebaca744e 100644 --- a/cocos/platform/linux/CCCommon-linux.cpp +++ b/cocos/platform/linux/CCCommon-linux.cpp @@ -33,7 +33,7 @@ THE SOFTWARE. NS_CC_BEGIN -void MessageBox(const char * msg, const char * title) +void ccMessageBox(const char * msg, const char * title) { log("%s: %s", title, msg); } diff --git a/cocos/platform/mac/CCCommon-mac.mm b/cocos/platform/mac/CCCommon-mac.mm index 948e5a2015..c196b25a58 100644 --- a/cocos/platform/mac/CCCommon-mac.mm +++ b/cocos/platform/mac/CCCommon-mac.mm @@ -43,7 +43,7 @@ void LuaLog(const char * format) } // ios no MessageBox, use log instead -void MessageBox(const char * msg, const char * title) +void ccMessageBox(const char * msg, const char * title) { NSString * tmpTitle = (title) ? [NSString stringWithUTF8String : title] : nil; NSString * tmpMsg = (msg) ? [NSString stringWithUTF8String : msg] : nil; diff --git a/cocos/platform/mac/CCGLViewImpl-mac.mm b/cocos/platform/mac/CCGLViewImpl-mac.mm index ca0b03630c..9e57af7d62 100644 --- a/cocos/platform/mac/CCGLViewImpl-mac.mm +++ b/cocos/platform/mac/CCGLViewImpl-mac.mm @@ -316,7 +316,7 @@ bool GLViewImpl::initWithRect(const std::string& viewName, Rect rect, float fram message.append(_glfwError); } - MessageBox(message.c_str(), "Error launch application"); + ccMessageBox(message.c_str(), "Error launch application"); return false; } diff --git a/cocos/platform/win32/CCCommon-win32.cpp b/cocos/platform/win32/CCCommon-win32.cpp index c3b97c1bdd..344676c51f 100644 --- a/cocos/platform/win32/CCCommon-win32.cpp +++ b/cocos/platform/win32/CCCommon-win32.cpp @@ -35,7 +35,7 @@ NS_CC_BEGIN #define MAX_LEN (cocos2d::kMaxLogLen + 1) -void MessageBox(const char * pszMsg, const char * pszTitle) +void ccMessageBox(const char * pszMsg, const char * pszTitle) { std::wstring wsMsg = cocos2d::StringUtf8ToWideChar(pszMsg); std::wstring wsTitle = cocos2d::StringUtf8ToWideChar(pszTitle); diff --git a/cocos/platform/win32/CCStdC-win32.h b/cocos/platform/win32/CCStdC-win32.h index 48409900d0..088dae43d4 100644 --- a/cocos/platform/win32/CCStdC-win32.h +++ b/cocos/platform/win32/CCStdC-win32.h @@ -140,11 +140,6 @@ inline errno_t strcpy_s(char *strDestination, size_t numberOfElements, #endif #endif // __MINGW32__ -// Conflicted with cocos2d::MessageBox, so we need to undef it. -#ifdef MessageBox -#undef MessageBox -#endif - // Conflicted with ParticleSystem::PositionType::RELATIVE, so we need to undef it. #ifdef RELATIVE #undef RELATIVE From 1a047872871b41a57fcf4fb12b72bfe603bfd470 Mon Sep 17 00:00:00 2001 From: Andy Duplain Date: Tue, 22 Oct 2019 06:42:56 +0100 Subject: [PATCH 34/96] Rework CMake Xcode support. (#20205) - Build using C++17 by default. - Simplified customization of Xcode project via cmake. - Add documentation to demonstrate how to use the customization. - NOTE: I believe we could compile with bitcode enabled if the box2d library was compiled using bitcode. --- cmake/Modules/CocosBuildHelpers.cmake | 51 ++---------------- cmake/Modules/CocosConfigDefine.cmake | 1 + cmake/Modules/iOSBundleInfo.plist.in | 51 ------------------ cmake/README.md | 47 +++++++++++++++- cmake/images/Xcode_Find_Setting_Name.png | Bin 0 -> 372097 bytes cmake/images/Xcode_General_Page.png | Bin 0 -> 258536 bytes cocos/CMakeLists.txt | 6 +++ templates/cocos2dx_files.json | 3 +- templates/cpp-template-default/CMakeLists.txt | 12 ++--- .../proj.ios_mac/ios/Info.plist | 14 +++-- .../runtime-src/proj.ios_mac/ios/Info.plist | 14 +++-- .../runtime-src/proj.ios_mac/mac/Info.plist | 6 +-- tests/cpp-empty-test/CMakeLists.txt | 16 +++--- tests/cpp-empty-test/proj.ios/Info.plist | 12 ++--- tests/cpp-empty-test/proj.mac/Info.plist | 6 +-- tests/cpp-tests/CMakeLists.txt | 13 +++-- tests/cpp-tests/proj.ios/Info.plist | 20 +++---- tests/cpp-tests/proj.mac/Info.plist | 6 +-- tests/lua-empty-test/project/CMakeLists.txt | 12 ++--- .../project/proj.ios/Info.plist | 16 +++--- .../project/proj.mac/Info.plist | 4 +- tests/lua-tests/project/CMakeLists.txt | 12 ++--- .../project/proj.ios_mac/ios/Info.plist | 16 +++--- .../project/proj.ios_mac/mac/Info.plist | 6 +-- tests/performance-tests/proj.ios/Info.plist | 8 +-- tests/performance-tests/proj.mac/Info.plist | 6 +-- 26 files changed, 145 insertions(+), 213 deletions(-) delete mode 100644 cmake/Modules/iOSBundleInfo.plist.in create mode 100644 cmake/images/Xcode_Find_Setting_Name.png create mode 100644 cmake/images/Xcode_General_Page.png diff --git a/cmake/Modules/CocosBuildHelpers.cmake b/cmake/Modules/CocosBuildHelpers.cmake index 38ece29037..01d6b4adbd 100644 --- a/cmake/Modules/CocosBuildHelpers.cmake +++ b/cmake/Modules/CocosBuildHelpers.cmake @@ -202,6 +202,10 @@ function(setup_cocos_app_config app_name) if(XCODE OR VS) cocos_mark_code_files(${app_name}) endif() + + if (XCODE) + cocos_config_app_xcode_property(${app_name}) + endif() endfunction() # if cc_variable not set, then set it cc_value @@ -211,52 +215,6 @@ macro(cocos_set_default_value cc_variable cc_value) endif() endmacro() -# generate macOS app package infomations, need improve for example, the using of info.plist -function(cocos_pak_xcode cocos_target) - set(oneValueArgs - INFO_PLIST - BUNDLE_NAME - BUNDLE_VERSION - COPYRIGHT - GUI_IDENTIFIER - ICON_FILE - INFO_STRING - LONG_VERSION_STRING - SHORT_VERSION_STRING - ) - set(multiValueArgs) - cmake_parse_arguments(ARGS "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - string(TIMESTAMP ARGS_COPYRIGHT_YEAR "%Y") - # set default value - cocos_set_default_value(ARGS_INFO_PLIST "MacOSXBundleInfo.plist.in") - cocos_set_default_value(ARGS_BUNDLE_NAME "\${PRODUCT_NAME}") - cocos_set_default_value(ARGS_BUNDLE_VERSION "1") - cocos_set_default_value(ARGS_COPYRIGHT "Copyright © ${ARGS_COPYRIGHT_YEAR}. All rights reserved.") - cocos_set_default_value(ARGS_GUI_IDENTIFIER "org.cocos2dx.${APP_NAME}") - cocos_set_default_value(ARGS_ICON_FILE "Icon") - cocos_set_default_value(ARGS_INFO_STRING "cocos2d-x app") - cocos_set_default_value(ARGS_LONG_VERSION_STRING "1.0.0") - cocos_set_default_value(ARGS_SHORT_VERSION_STRING "1.0") - # set default values for Info.plist template - set_target_properties(${cocos_target} - PROPERTIES - MACOSX_BUNDLE_INFO_PLIST ${ARGS_INFO_PLIST} - ) - set(MACOSX_BUNDLE_BUNDLE_NAME ${ARGS_BUNDLE_NAME} PARENT_SCOPE) - set(MACOSX_BUNDLE_BUNDLE_VERSION ${ARGS_BUNDLE_VERSION} PARENT_SCOPE) - set(MACOSX_BUNDLE_COPYRIGHT ${ARGS_COPYRIGHT} PARENT_SCOPE) - set(MACOSX_BUNDLE_GUI_IDENTIFIER ${ARGS_GUI_IDENTIFIER} PARENT_SCOPE) - set(MACOSX_BUNDLE_ICON_FILE ${ARGS_ICON_FILE} PARENT_SCOPE) - set(MACOSX_BUNDLE_INFO_STRING ${ARGS_INFO_STRING} PARENT_SCOPE) - set(MACOSX_BUNDLE_LONG_VERSION_STRING ${ARGS_LONG_VERSION_STRING} PARENT_SCOPE) - set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${ARGS_SHORT_VERSION_STRING} PARENT_SCOPE) - - message(STATUS "cocos package: ${cocos_target}, plist file: ${ARGS_INFO_PLIST}") - - cocos_config_app_xcode_property(${cocos_target}) -endfunction() - # set Xcode property for application, include all depend target macro(cocos_config_app_xcode_property cocos_app) set(depend_libs) @@ -271,7 +229,6 @@ endmacro() # custom Xcode property for iOS target macro(cocos_config_target_xcode_property cocos_target) if(IOS) - set_xcode_property(${cocos_target} IPHONEOS_DEPLOYMENT_TARGET "8.0") set_xcode_property(${cocos_target} ENABLE_BITCODE "NO") set_xcode_property(${cocos_target} ONLY_ACTIVE_ARCH "YES") endif() diff --git a/cmake/Modules/CocosConfigDefine.cmake b/cmake/Modules/CocosConfigDefine.cmake index 54ae371fa8..63f2360af7 100644 --- a/cmake/Modules/CocosConfigDefine.cmake +++ b/cmake/Modules/CocosConfigDefine.cmake @@ -76,6 +76,7 @@ set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) # check visual studio version if(WINDOWS) diff --git a/cmake/Modules/iOSBundleInfo.plist.in b/cmake/Modules/iOSBundleInfo.plist.in deleted file mode 100644 index fa2a779a2d..0000000000 --- a/cmake/Modules/iOSBundleInfo.plist.in +++ /dev/null @@ -1,51 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${MACOSX_BUNDLE_EXECUTABLE_NAME} - CFBundleGetInfoString - ${MACOSX_BUNDLE_INFO_STRING} - CFBundleIconFile - ${MACOSX_BUNDLE_ICON_FILE} - CFBundleIdentifier - ${MACOSX_BUNDLE_GUI_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleLongVersionString - ${MACOSX_BUNDLE_LONG_VERSION_STRING} - CFBundleName - ${MACOSX_BUNDLE_BUNDLE_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - ${MACOSX_BUNDLE_SHORT_VERSION_STRING} - CFBundleSignature - ???? - CFBundleVersion - ${MACOSX_BUNDLE_BUNDLE_VERSION} - CSResourcesFileMapped - - LSRequiresIPhoneOS - - UIStatusBarHidden - - UIRequiresFullScreen - - UILaunchStoryboardName - LaunchScreen - UISupportedInterfaceOrientations - - UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationLandscapeLeft - - NSHumanReadableCopyright - ${MACOSX_BUNDLE_COPYRIGHT} - CFBundleIconFiles - - ${MACOSX_BUNDLE_ICON_FILE} - - - diff --git a/cmake/README.md b/cmake/README.md index ce9e6b785b..cfa80ffaf8 100644 --- a/cmake/README.md +++ b/cmake/README.md @@ -60,9 +60,52 @@ cmake .. -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos open Cocos2d-x.xcodeproj ``` -The parameter `-DCMAKE_OSX_SYSROOT=iphoneos` is optional, it generates a build for running on the iOS device. If you want to run in the simulator, please add `-DCMAKE_OSX_SYSROOT=iphonesimulator`, but remember you can't run a metal-support app in the simulator until Xcode 11 and MacOS 10.15. +#### How do I customize the generated Xcode project? + +Xcode project settings that you want to affect both the app project and the Cocos2d-X library project should be passed on the command +line when invoking `cmake`. + +Xcode project settings that you want to affect the app project only shoudl be put into the its `CMakeLists.txt` file. + +Any Xcode Build Setting can be changed by setting `CMAKE_XCODE_ATTRIBUTE_XXX` where `XXX` is the name found within the Xcode Build +Settings page of the target. The following image shows the name of the iOS Deployment Target: + +![Find Xcode Build Setting](images/Xcode_Find_Setting_Name.png) + +Cocos also provides the function `set_xcode_property()` to make this easier to set from within a `CMakeLists.txt` file, where only +the `XXX` part needed to be specified: + +``` +set_xcode_property(${APP_NAME} XXX "Value") +``` + +##### Deployment Target + +As explained above, pass this on the command line so both the app the Cocos2d-x are built using the same version: + +For iOS pass `-DCMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET=version`, where `version` is `9.0`, `10.0`, etc. + +For macOS pass `-DCMAKE_XCODE_ATTRIBUTE_MACOSX_DEPLOYMENT_TARGET=version`, where `version` is `10.12`, `10.13`, etc. + +##### Code Signing Development Team + +This should be set in the app `CMakeLists.txt` file. You only need to set the "Development Team" as Xcode will automatically manage the +other settings (certificate type, etc.). However the value you set is the 10-digit serial number following the development team name, +which you can see in the top-right of the [Apple Developer Certificates](https://developer.apple.com/account/resources/certificates/list) page. + +Set it like this: +``` +set_xcode_property(${APP_NAME} DEVELOPMENT_TEAM "GRLXXXX2K9") +``` + +##### Bundle Identifier, Version numbers and Device Support + +All this information is held in the `Info.plist` file that is part of the app's source files and is therefore not generated by `cmake`. Therefore +you can update these values from the `General` page of the Xcode target and the values will be preserved the next time you regenerate the project +from `cmake`: + +![Xcode General Page](images/Xcode_General_Page.png) -if you want to sign iOS app in CMake, you will need to fill development team ID into `set_xcode_property(${APP_NAME} DEVELOPMENT_TEAM "")`, or select to sign in Xcode after project files generated. ### Android Studio diff --git a/cmake/images/Xcode_Find_Setting_Name.png b/cmake/images/Xcode_Find_Setting_Name.png new file mode 100644 index 0000000000000000000000000000000000000000..2ce8a61818ad013ca77f2378cfe258dd22d777ac GIT binary patch literal 372097 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�R7?6m9fQ-0s=pb5CMKcVKCso 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�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®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

EJ;ab&@_ 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 z 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�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%0AR!+64m`Qu&vC$WK$PN1 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 z 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Уkv%OB7GdkY|erK2o)tqlw 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:-fno-aligned-allocation>) +#endif() diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index 008e06e4c8..210c9e56f4 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -27,8 +27,9 @@ "cmake/Modules/Findflatbuffers.cmake", "cmake/Modules/Findxxhash.cmake", "cmake/Modules/PreventInSourceBuilds.cmake", - "cmake/Modules/iOSBundleInfo.plist.in", "cmake/README.md", + "cmake/images/Xcode_Find_Setting_Name.png", + "cmake/images/Xcode_General_Page.png", "cocos/2d/CCAction.cpp", "cocos/2d/CCAction.h", "cocos/2d/CCActionCamera.cpp", diff --git a/templates/cpp-template-default/CMakeLists.txt b/templates/cpp-template-default/CMakeLists.txt index 25416f543f..a694ef80fe 100644 --- a/templates/cpp-template-default/CMakeLists.txt +++ b/templates/cpp-template-default/CMakeLists.txt @@ -133,16 +133,16 @@ target_include_directories(${APP_NAME} setup_cocos_app_config(${APP_NAME}) if(APPLE) set_target_properties(${APP_NAME} PROPERTIES RESOURCE "${APP_UI_RES}") + if(MACOSX) - set_target_properties(${APP_NAME} PROPERTIES - MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios_mac/mac/Info.plist" - ) + set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios_mac/mac/Info.plist") elseif(IOS) - cocos_pak_xcode(${APP_NAME} INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios_mac/ios/Info.plist") + set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios_mac/ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon") - set_xcode_property(${APP_NAME} DEVELOPMENT_TEAM "") - set_xcode_property(${APP_NAME} CODE_SIGN_IDENTITY "iPhone Developer") endif() + + # For code-signing, set the DEVELOPMENT_TEAM: + #set_xcode_property(${APP_NAME} DEVELOPMENT_TEAM "GRLXXXX2K9") elseif(WINDOWS) cocos_copy_target_dll(${APP_NAME}) endif() diff --git a/templates/cpp-template-default/proj.ios_mac/ios/Info.plist b/templates/cpp-template-default/proj.ios_mac/ios/Info.plist index 8b4aea8f9b..739c1700a8 100644 --- a/templates/cpp-template-default/proj.ios_mac/ios/Info.plist +++ b/templates/cpp-template-default/proj.ios_mac/ios/Info.plist @@ -7,25 +7,23 @@ CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable - ${MACOSX_BUNDLE_EXECUTABLE_NAME} + ${EXECUTABLE_NAME} CFBundleIconFile Icon-57.png CFBundleIdentifier - org.cocos2dx.hellocpp + org.cocos2dx.${PRODUCT_NAME} CFBundleInfoDictionaryVersion 6.0 CFBundleName - ${MACOSX_BUNDLE_BUNDLE_NAME} - CFBundleLongVersionString - ${MACOSX_BUNDLE_LONG_VERSION_STRING} + ${PRODUCT_NAME} CFBundleShortVersionString - ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + 1.0 CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion - ${MACOSX_BUNDLE_BUNDLE_VERSION} + 1 LSRequiresIPhoneOS UIAppFonts @@ -42,6 +40,6 @@ UIInterfaceOrientationLandscapeLeft NSHumanReadableCopyright - ${MACOSX_BUNDLE_COPYRIGHT} + Copyright © 2019. All rights reserved. diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/ios/Info.plist b/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/ios/Info.plist index 503a22c369..01667c8d0a 100644 --- a/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/ios/Info.plist +++ b/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/ios/Info.plist @@ -7,21 +7,19 @@ CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable - ${MACOSX_BUNDLE_EXECUTABLE_NAME} + ${EXECUTABLE_NAME} CFBundleIconFile Icon-57.png CFBundleIdentifier - org.cocos2dx.hellolua + org.cocos2dx.${PRODUCT_NAME} CFBundleInfoDictionaryVersion 6.0 CFBundleVersion - ${MACOSX_BUNDLE_BUNDLE_VERSION} + 1 CFBundleName - ${MACOSX_BUNDLE_BUNDLE_NAME} - CFBundleLongVersionString - ${MACOSX_BUNDLE_LONG_VERSION_STRING} + ${PRODUCT_NAME} CFBundleShortVersionString - ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + 1.0 CFBundlePackageType APPL CFBundleSignature @@ -47,6 +45,6 @@ UIInterfaceOrientationLandscapeLeft NSHumanReadableCopyright - ${MACOSX_BUNDLE_COPYRIGHT} + Copyright © 2019. All rights reserved. diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/mac/Info.plist b/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/mac/Info.plist index f72b36417b..7251aefce9 100644 --- a/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/mac/Info.plist +++ b/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/mac/Info.plist @@ -9,7 +9,7 @@ CFBundleIconFile Icon CFBundleIdentifier - org.cocos2dx.hellolua + org.cocos2dx.${PRODUCT_NAME} CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -24,10 +24,8 @@ 1 LSApplicationCategoryType public.app-category.games - LSMinimumSystemVersion - ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright - Copyright © 2013. All rights reserved. + Copyright © 2019. All rights reserved. NSMainNibFile MainMenu NSPrincipalClass diff --git a/tests/cpp-empty-test/CMakeLists.txt b/tests/cpp-empty-test/CMakeLists.txt index 92a5027e58..ca691c764e 100644 --- a/tests/cpp-empty-test/CMakeLists.txt +++ b/tests/cpp-empty-test/CMakeLists.txt @@ -123,21 +123,19 @@ target_link_libraries(${APP_NAME} cocos2d) target_include_directories(${APP_NAME} PRIVATE Classes) -# mark app resources setup_cocos_app_config(${APP_NAME}) -if(APPLE) +if(XCODE) set_target_properties(${APP_NAME} PROPERTIES RESOURCE "${APP_UI_RES}") + if(MACOSX) - set_target_properties(${APP_NAME} PROPERTIES - MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/proj.mac/Info.plist" - ) + set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.mac/Info.plist") elseif(IOS) - cocos_pak_xcode(${APP_NAME} INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios/Info.plist") + set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon-${APP_NAME}") - set_xcode_property(${APP_NAME} CODE_SIGN_IDENTITY "iPhone Developer") - set_xcode_property(${APP_NAME} DEVELOPMENT_TEAM "") - set_xcode_property(${APP_NAME} CODE_SIGN_IDENTITY "iPhone Developer") endif() + + # For code-signing, set the DEVELOPMENT_TEAM: + #set_xcode_property(${APP_NAME} DEVELOPMENT_TEAM "GRLXXXX2K9") elseif(WINDOWS) cocos_copy_target_dll(${APP_NAME}) endif() diff --git a/tests/cpp-empty-test/proj.ios/Info.plist b/tests/cpp-empty-test/proj.ios/Info.plist index 935eac086d..c50ab342a5 100644 --- a/tests/cpp-empty-test/proj.ios/Info.plist +++ b/tests/cpp-empty-test/proj.ios/Info.plist @@ -7,7 +7,7 @@ CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable - ${MACOSX_BUNDLE_EXECUTABLE_NAME} + ${EXECUTABLE_NAME} CFBundleIconFile Icon-57.png CFBundleIconFiles @@ -24,19 +24,19 @@ CFBundleIcons~ipad CFBundleIdentifier - ${MACOSX_BUNDLE_GUI_IDENTIFIER} + org.cocos2dx.${PRODUCT_NAME} CFBundleInfoDictionaryVersion 6.0 CFBundleName - ${MACOSX_BUNDLE_BUNDLE_NAME} + ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString - ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + 1.0 CFBundleSignature ???? CFBundleVersion - ${MACOSX_BUNDLE_BUNDLE_VERSION} + 1 LSRequiresIPhoneOS UILaunchStoryboardName @@ -50,6 +50,6 @@ UIInterfaceOrientationLandscapeRight NSHumanReadableCopyright - ${MACOSX_BUNDLE_COPYRIGHT} + Copyright © 2019. All rights reserved. diff --git a/tests/cpp-empty-test/proj.mac/Info.plist b/tests/cpp-empty-test/proj.mac/Info.plist index 608a82cdac..a1c1b9c2dc 100644 --- a/tests/cpp-empty-test/proj.mac/Info.plist +++ b/tests/cpp-empty-test/proj.mac/Info.plist @@ -9,7 +9,7 @@ CFBundleIconFile Icon CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) + org.cocos2dx.${PRODUCT_NAME} CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -22,10 +22,8 @@ ???? CFBundleVersion 1 - LSMinimumSystemVersion - ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright - Copyright © 2012. All rights reserved. + Copyright © 2019. All rights reserved. NSMainNibFile MainMenu NSPrincipalClass diff --git a/tests/cpp-tests/CMakeLists.txt b/tests/cpp-tests/CMakeLists.txt index 052c886b7c..8bb21f9aa6 100644 --- a/tests/cpp-tests/CMakeLists.txt +++ b/tests/cpp-tests/CMakeLists.txt @@ -459,17 +459,16 @@ target_include_directories(${APP_NAME} setup_cocos_app_config(${APP_NAME}) if(APPLE) set_target_properties(${APP_NAME} PROPERTIES RESOURCE "${APP_UI_RES}") + if(MACOSX) - set_target_properties(${APP_NAME} PROPERTIES - MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/proj.mac/Info.plist" - ) + set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.mac/Info.plist") elseif(IOS) - # set custom fonts - cocos_pak_xcode(${APP_NAME} INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios/Info.plist") + set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon-${APP_NAME}") - set_xcode_property(${APP_NAME} DEVELOPMENT_TEAM "") - set_xcode_property(${APP_NAME} CODE_SIGN_IDENTITY "iPhone Developer") endif() + + # For code-signing, set the DEVELOPMENT_TEAM: + #set_xcode_property(${APP_NAME} DEVELOPMENT_TEAM "GRLXXXX2K9") elseif(WINDOWS) # "too large PDB" error often occurs in cpp-tests when using default "/Zi" target_compile_options(${APP_NAME} PRIVATE /Z7) diff --git a/tests/cpp-tests/proj.ios/Info.plist b/tests/cpp-tests/proj.ios/Info.plist index de23973588..b340e7d833 100644 --- a/tests/cpp-tests/proj.ios/Info.plist +++ b/tests/cpp-tests/proj.ios/Info.plist @@ -7,31 +7,25 @@ CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable - ${MACOSX_BUNDLE_EXECUTABLE_NAME} + ${EXECUTABLE_NAME} CFBundleIconFile - ${MACOSX_BUNDLE_ICON_FILE} + Icon CFBundleIdentifier - ${MACOSX_BUNDLE_GUI_IDENTIFIER} + org.cocos2dx.${PRODUCT_NAME} CFBundleInfoDictionaryVersion 6.0 CFBundleName - ${MACOSX_BUNDLE_BUNDLE_NAME} + ${PRODUCT_NAME} CFBundlePackageType APPL - CFBundleLongVersionString - ${MACOSX_BUNDLE_LONG_VERSION_STRING} CFBundleShortVersionString - ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + 1.0 CFBundleSignature ???? CFBundleVersion - ${MACOSX_BUNDLE_BUNDLE_VERSION} + 1 NSHumanReadableCopyright - ${MACOSX_BUNDLE_COPYRIGHT} - CFBundleIconFiles - - ${MACOSX_BUNDLE_ICON_FILE} - + Copyright © 2019. All rights reserved. LSRequiresIPhoneOS NSAppTransportSecurity diff --git a/tests/cpp-tests/proj.mac/Info.plist b/tests/cpp-tests/proj.mac/Info.plist index 52ff14e9cf..ea5cd6d7d0 100644 --- a/tests/cpp-tests/proj.mac/Info.plist +++ b/tests/cpp-tests/proj.mac/Info.plist @@ -11,7 +11,7 @@ CFBundleIconFile Icon CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) + org.cocos2dx.${PRODUCT_NAME} CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -24,15 +24,13 @@ ???? CFBundleVersion 1 - LSMinimumSystemVersion - ${MACOSX_DEPLOYMENT_TARGET} NSAppTransportSecurity NSAllowsArbitraryLoads NSHumanReadableCopyright - Copyright © 2012. All rights reserved. + Copyright © 2019. All rights reserved. NSMainNibFile MainMenu NSPrincipalClass diff --git a/tests/lua-empty-test/project/CMakeLists.txt b/tests/lua-empty-test/project/CMakeLists.txt index 7b5c3c94f0..4aaa2d4eac 100644 --- a/tests/lua-empty-test/project/CMakeLists.txt +++ b/tests/lua-empty-test/project/CMakeLists.txt @@ -99,16 +99,16 @@ target_include_directories(${APP_NAME} PRIVATE Classes) setup_cocos_app_config(${APP_NAME}) if(APPLE) set_target_properties(${APP_NAME} PROPERTIES RESOURCE "${APP_UI_RES}") + if(MACOSX) - set_target_properties(${APP_NAME} PROPERTIES - MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/proj.mac/Info.plist" - ) + set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.mac/Info.plist") elseif(IOS) - cocos_pak_xcode(${APP_NAME} INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios/Info.plist") + set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon-${APP_NAME}") - set_xcode_property(${APP_NAME} DEVELOPMENT_TEAM "") - set_xcode_property(${APP_NAME} CODE_SIGN_IDENTITY "iPhone Developer") endif() + + # For code-signing, set the DEVELOPMENT_TEAM: + #set_xcode_property(${APP_NAME} DEVELOPMENT_TEAM "GRLXXXX2K9") elseif(WINDOWS) cocos_copy_target_dll(${APP_NAME}) endif() diff --git a/tests/lua-empty-test/project/proj.ios/Info.plist b/tests/lua-empty-test/project/proj.ios/Info.plist index 8efc91675c..1798164bd9 100644 --- a/tests/lua-empty-test/project/proj.ios/Info.plist +++ b/tests/lua-empty-test/project/proj.ios/Info.plist @@ -7,7 +7,7 @@ CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable - ${MACOSX_BUNDLE_EXECUTABLE_NAME} + ${EXECUTABLE_NAME} CFBundleIconFile Icon-57.png CFBundleIcons @@ -15,23 +15,21 @@ CFBundleIcons~ipad CFBundleIdentifier - ${MACOSX_BUNDLE_GUI_IDENTIFIER} + org.cocos2dx.${PRODUCT_NAME} CFBundleInfoDictionaryVersion 6.0 CFBundleName - ${MACOSX_BUNDLE_BUNDLE_NAME} + ${PRODUCT_NAME} CFBundlePackageType APPL - CFBundleLongVersionString - ${MACOSX_BUNDLE_LONG_VERSION_STRING} CFBundleShortVersionString - ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + 1.0 CFBundleSignature ???? CFBundleVersion - ${MACOSX_BUNDLE_BUNDLE_VERSION} + 1 NSHumanReadableCopyright - ${MACOSX_BUNDLE_COPYRIGHT} + Copyright © 2019. All rights reserved. LSRequiresIPhoneOS UILaunchStoryboardName @@ -42,8 +40,6 @@ accelerometer - opengles-1 - UIStatusBarHidden diff --git a/tests/lua-empty-test/project/proj.mac/Info.plist b/tests/lua-empty-test/project/proj.mac/Info.plist index 608a82cdac..7734386383 100644 --- a/tests/lua-empty-test/project/proj.mac/Info.plist +++ b/tests/lua-empty-test/project/proj.mac/Info.plist @@ -9,7 +9,7 @@ CFBundleIconFile Icon CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) + org.cocos2dx.${PRODUCT_NAME} CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -25,7 +25,7 @@ LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright - Copyright © 2012. All rights reserved. + Copyright © 2019. All rights reserved. NSMainNibFile MainMenu NSPrincipalClass diff --git a/tests/lua-tests/project/CMakeLists.txt b/tests/lua-tests/project/CMakeLists.txt index 8ec34ac8a4..5becda024a 100644 --- a/tests/lua-tests/project/CMakeLists.txt +++ b/tests/lua-tests/project/CMakeLists.txt @@ -112,16 +112,16 @@ target_include_directories(${APP_NAME} PRIVATE Classes) setup_cocos_app_config(${APP_NAME}) if(APPLE) set_target_properties(${APP_NAME} PROPERTIES RESOURCE "${APP_UI_RES}") + if(MACOSX) - set_target_properties(${APP_NAME} PROPERTIES - MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios_mac/mac/Info.plist" - ) + set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios_mac/mac/Info.plist") elseif(IOS) - cocos_pak_xcode(${APP_NAME} INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios_mac/ios/Info.plist") + set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios_mac/ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon-${APP_NAME}") - set_xcode_property(${APP_NAME} DEVELOPMENT_TEAM "") - set_xcode_property(${APP_NAME} CODE_SIGN_IDENTITY "iPhone Developer") endif() + + # For code-signing, set the DEVELOPMENT_TEAM: + #set_xcode_property(${APP_NAME} DEVELOPMENT_TEAM "GRLXXXX2K9") elseif(WINDOWS) cocos_copy_target_dll(${APP_NAME}) endif() diff --git a/tests/lua-tests/project/proj.ios_mac/ios/Info.plist b/tests/lua-tests/project/proj.ios_mac/ios/Info.plist index 64b0d48ad1..8539e9cd36 100644 --- a/tests/lua-tests/project/proj.ios_mac/ios/Info.plist +++ b/tests/lua-tests/project/proj.ios_mac/ios/Info.plist @@ -7,9 +7,9 @@ CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable - ${MACOSX_BUNDLE_EXECUTABLE_NAME} + ${EXECUTABLE_NAME} CFBundleIconFile - ${MACOSX_BUNDLE_ICON_FILE} + Icon CFBundleIconFiles Icon-57.png @@ -22,17 +22,19 @@ CFBundleIcons~ipad CFBundleIdentifier - ${MACOSX_BUNDLE_GUI_IDENTIFIER} + org.cocos2dx.$(PRODUCT_NAME) CFBundleInfoDictionaryVersion 6.0 CFBundleName - ${MACOSX_BUNDLE_BUNDLE_NAME} + $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleSignature ???? + CFBundleShortVersionString + 1.0 CFBundleVersion - ${MACOSX_BUNDLE_BUNDLE_VERSION} + 1 LSRequiresIPhoneOS NSAppTransportSecurity @@ -57,8 +59,6 @@ accelerometer - opengles-1 - UIStatusBarHidden @@ -68,6 +68,6 @@ UIInterfaceOrientationLandscapeLeft NSHumanReadableCopyright - ${MACOSX_BUNDLE_COPYRIGHT} + Copyright © 2019. All rights reserved. diff --git a/tests/lua-tests/project/proj.ios_mac/mac/Info.plist b/tests/lua-tests/project/proj.ios_mac/mac/Info.plist index 241c3b92f6..13d0fefb77 100644 --- a/tests/lua-tests/project/proj.ios_mac/mac/Info.plist +++ b/tests/lua-tests/project/proj.ios_mac/mac/Info.plist @@ -11,7 +11,7 @@ CFBundleIconFile Icon CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) + org.cocos2dx.${PRODUCT_NAME} CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -24,10 +24,8 @@ ???? CFBundleVersion 1 - LSMinimumSystemVersion - ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright - Copyright © 2012. All rights reserved. + Copyright © 2019. All rights reserved. NSMainNibFile MainMenu NSPrincipalClass diff --git a/tests/performance-tests/proj.ios/Info.plist b/tests/performance-tests/proj.ios/Info.plist index e28dd7c2c2..5d9101cf04 100644 --- a/tests/performance-tests/proj.ios/Info.plist +++ b/tests/performance-tests/proj.ios/Info.plist @@ -42,7 +42,7 @@ Icon-144.png CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) + org.cocos2dx.${PRODUCT_NAME} CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -50,11 +50,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - + 1.0 CFBundleSignature ???? CFBundleVersion - 1.0 + 1 LSRequiresIPhoneOS UIAppFonts @@ -151,5 +151,7 @@ UIInterfaceOrientationLandscapeRight UIInterfaceOrientationLandscapeLeft + NSHumanReadableCopyright + Copyright © 2019. All rights reserved. diff --git a/tests/performance-tests/proj.mac/Info.plist b/tests/performance-tests/proj.mac/Info.plist index c08a435c3c..7251aefce9 100644 --- a/tests/performance-tests/proj.mac/Info.plist +++ b/tests/performance-tests/proj.mac/Info.plist @@ -9,7 +9,7 @@ CFBundleIconFile Icon CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) + org.cocos2dx.${PRODUCT_NAME} CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -24,10 +24,8 @@ 1 LSApplicationCategoryType public.app-category.games - LSMinimumSystemVersion - ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright - Copyright © 2013. All rights reserved. + Copyright © 2019. All rights reserved. NSMainNibFile MainMenu NSPrincipalClass From 11a1f820e2ee4481f245278ea03245a250b0ca3e Mon Sep 17 00:00:00 2001 From: Arnold <40414978+PatriceJiang@users.noreply.github.com> Date: Tue, 22 Oct 2019 13:47:07 +0800 Subject: [PATCH 35/96] [v4] add unzip test code (#20219) --- cocos/base/ZipUtils.cpp | 20 ++- cocos/platform/CCFileUtils.cpp | 9 +- external/config.json | 2 +- tests/cpp-tests/CMakeLists.txt | 2 + tests/cpp-tests/Classes/ZipTest/ZipTests.cpp | 167 +++++++++++++++++++ tests/cpp-tests/Classes/ZipTest/ZipTests.h | 52 ++++++ tests/cpp-tests/Classes/controller.cpp | 1 + tests/cpp-tests/Classes/tests.h | 2 +- tests/cpp-tests/Resources/zip/10k-nopass.zip | Bin 0 -> 10404 bytes tests/cpp-tests/Resources/zip/10k.txt | Bin 0 -> 10240 bytes tests/cpp-tests/Resources/zip/10k.zip | Bin 0 -> 10432 bytes 11 files changed, 241 insertions(+), 14 deletions(-) create mode 100644 tests/cpp-tests/Classes/ZipTest/ZipTests.cpp create mode 100644 tests/cpp-tests/Classes/ZipTest/ZipTests.h create mode 100644 tests/cpp-tests/Resources/zip/10k-nopass.zip create mode 100644 tests/cpp-tests/Resources/zip/10k.txt create mode 100644 tests/cpp-tests/Resources/zip/10k.zip diff --git a/cocos/base/ZipUtils.cpp b/cocos/base/ZipUtils.cpp index 167ec94055..f69c263b7b 100644 --- a/cocos/base/ZipUtils.cpp +++ b/cocos/base/ZipUtils.cpp @@ -31,6 +31,8 @@ #else // from our embedded sources #include "unzip.h" #endif +#include "ioapi_mem.h" +#include #include #include @@ -42,11 +44,9 @@ #include "platform/CCFileUtils.h" #include -// FIXME: Other platforms should use upstream minizip like mingw-w64 -#ifdef MINIZIP_FROM_SYSTEM +// minizip 1.2.0 is same with other platforms #define unzGoToFirstFile64(A,B,C,D) unzGoToFirstFile2(A,B,C,D, NULL, 0, NULL, 0) #define unzGoToNextFile64(A,B,C,D) unzGoToNextFile2(A,B,C,D, NULL, 0, NULL, 0) -#endif NS_CC_BEGIN @@ -511,6 +511,7 @@ class ZipFilePrivate { public: unzFile zipFile; + std::unique_ptr memfs; // std::unordered_map is faster if available on the platform typedef std::unordered_map FileListContainer; @@ -523,7 +524,7 @@ ZipFile *ZipFile::createWithBuffer(const void* buffer, uLong size) if (zip && zip->initWithBuffer(buffer, size)) { return zip; } else { - if (zip) delete zip; + delete zip; return nullptr; } } @@ -741,10 +742,17 @@ int ZipFile::getCurrentFileInfo(std::string *filename, unz_file_info *info) bool ZipFile::initWithBuffer(const void *buffer, uLong size) { if (!buffer || size == 0) return false; + + zlib_filefunc_def memory_file = { 0 }; - _data->zipFile = unzOpenBuffer(buffer, size); + std::unique_ptr memfs(new(std::nothrow) ourmemory_t{ (char*)const_cast(buffer), static_cast(size), 0, 0, 0 }); + if (!memfs) return false; + fill_memory_filefunc(&memory_file, memfs.get()); + + _data->zipFile = unzOpen2(nullptr, &memory_file); if (!_data->zipFile) return false; - + _data->memfs = std::move(memfs); + setFilter(emptyFilename); return true; } diff --git a/cocos/platform/CCFileUtils.cpp b/cocos/platform/CCFileUtils.cpp index abe2681fe3..8bb105f63e 100644 --- a/cocos/platform/CCFileUtils.cpp +++ b/cocos/platform/CCFileUtils.cpp @@ -712,12 +712,9 @@ unsigned char* FileUtils::getFileDataFromZip(const std::string& zipFilePath, con file = unzOpen(FileUtils::getInstance()->getSuitableFOpen(zipFilePath).c_str()); CC_BREAK_IF(!file); - // FIXME: Other platforms should use upstream minizip like mingw-w64 -#ifdef MINIZIP_FROM_SYSTEM - int ret = unzLocateFile(file, filename.c_str(), NULL); -#else - int ret = unzLocateFile(file, filename.c_str(), 1); -#endif + // minizip 1.2.0 is same with other platforms + int ret = unzLocateFile(file, filename.c_str(), nullptr); + CC_BREAK_IF(UNZ_OK != ret); char filePathA[260]; diff --git a/external/config.json b/external/config.json index 0c9b170239..4bf33c806f 100644 --- a/external/config.json +++ b/external/config.json @@ -1,5 +1,5 @@ { - "version": "metal-support-17", + "version": "metal-support-18", "zip_file_size": "146254799", "repo_name": "cocos2d-x-3rd-party-libs-bin", "repo_parent": "https://github.com/cocos2d/", diff --git a/tests/cpp-tests/CMakeLists.txt b/tests/cpp-tests/CMakeLists.txt index 8bb21f9aa6..409ee6b117 100644 --- a/tests/cpp-tests/CMakeLists.txt +++ b/tests/cpp-tests/CMakeLists.txt @@ -204,6 +204,7 @@ list(APPEND GAME_HEADER Classes/OpenURLTest/OpenURLTest.h Classes/ConsoleTest/ConsoleTest.h Classes/MenuTest/MenuTest.h + Classes/ZipTest/ZipTests.h ) list(APPEND GAME_SOURCE @@ -325,6 +326,7 @@ list(APPEND GAME_SOURCE Classes/ZwoptexTest/ZwoptexTest.cpp Classes/SpriteFrameCacheTest/SpriteFrameCacheTest.cpp Classes/controller.cpp + Classes/ZipTest/ZipTests.cpp ) if(ANDROID OR IOS) diff --git a/tests/cpp-tests/Classes/ZipTest/ZipTests.cpp b/tests/cpp-tests/Classes/ZipTest/ZipTests.cpp new file mode 100644 index 0000000000..5388c1d56e --- /dev/null +++ b/tests/cpp-tests/Classes/ZipTest/ZipTests.cpp @@ -0,0 +1,167 @@ +/**************************************************************************** + Copyright (c) 2019 Xiamen Yaji Software Co., Ltd. + + http://www.cocos.com + + 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 "ZipTests.h" + +#include + +#include "unzip/unzip.h" +#include "unzip/crypt.h" + +using namespace cocos2d; + +ZipTests::ZipTests() { + ADD_TEST_CASE(UnZipNormalFile); + ADD_TEST_CASE(UnZipWithPassword); +} + +std::string ZipTest::title() const { + return "Unzip Test"; +} + + +static void unzipTest(Label *label, const std::string &originFile, const std::string &tmpName, const std::string &zipFile, const std::string& password = "") +{ + + auto fu = FileUtils::getInstance(); + cocos2d::Data origContent; + const int BUFF_SIZE = 1024; + char *buff = nullptr; + std::vector fileData; + bool hasError = false; + unz_file_info fileInfo = {0}; + char fileName[40] = {0}; + + auto newLocal = fu->getWritablePath() + tmpName; + //copy file to support android + + if(fu->isFileExist(newLocal)) { + CCLOG("Remove file %s", newLocal.c_str()); + fu->removeFile(newLocal); + } + + CCLOG("Copy %s to %s", zipFile.c_str(), newLocal.c_str()); + auto writeSuccess = fu->writeDataToFile(fu->getDataFromFile(zipFile), newLocal); + if(!writeSuccess) { + label->setString("Failed to copy zip file to writable path"); + return; + } + + unzFile fp = unzOpen(newLocal.c_str()); + if(!fp) { + CCLOG("Failed to open zip file %s", newLocal.c_str()); + label->setString("Failed to open zip file"); + return; + } + + int err = unzGoToFirstFile(fp); + if(err != UNZ_OK) { + label->setString("Failed to local first file"); + goto close_and_return; + } + + unzGetCurrentFileInfo(fp, &fileInfo, fileName, sizeof(fileName) -1, nullptr, 0, nullptr, 0 ); + + CCASSERT(strncmp("10k.txt", fileName, 7) == 0, "file name should be 10k.txt"); + + if(password.empty()) + { + err = unzOpenCurrentFile(fp); + } + else + { + err = unzOpenCurrentFilePassword(fp, password.c_str()); + } + + if(err != UNZ_OK) { + label->setString("failed to open zip file"); + goto close_and_return; + } + + buff = new char[BUFF_SIZE]; + + for(;;) { + int retSize = unzReadCurrentFile(fp, buff, BUFF_SIZE); + if(retSize < 0) { + hasError = true; + break; + } + else if(retSize == 0) { + break; + } + + fileData.insert(fileData.end(), buff, buff + retSize); + } + + delete[] buff; + + if(hasError) { + label->setString("unzip error! read error!"); + goto close_and_return; + } + + origContent = FileUtils::getInstance()->getDataFromFile(originFile); + + if(origContent.getSize() == fileData.size() && + memcmp(origContent.getBytes(), fileData.data(), fileData.size()) == 0) { + label->setString("unzip ok!"); + } else { + label->setString("unzip error! data mismatch!"); + } +close_and_return: + unzClose(fp); +} + + +void UnZipNormalFile::onEnter() { + TestCase::onEnter(); + + const auto winSize = Director::getInstance()->getWinSize(); + + Label *label = Label::createWithTTF("unziping file", "fonts/Marker Felt.ttf", 23); + label->setPosition(winSize.width/2, winSize.height/2); + addChild(label); + + unzipTest(label, "zip/10k.txt", "10-nopasswd.zip", "zip/10k-nopass.zip"); +} + +std::string UnZipNormalFile::subtitle() const { + return "unzip without password"; +} + +void UnZipWithPassword::onEnter() { + TestCase::onEnter(); + + const auto winSize = Director::getInstance()->getWinSize(); + + Label *label = Label::createWithTTF("unziping file", "fonts/Marker Felt.ttf", 23); + label->setPosition(winSize.width/2, winSize.height/2); + addChild(label); + + unzipTest(label, "zip/10k.txt", "10.zip", "zip/10k.zip", "123456"); +} + +std::string UnZipWithPassword::subtitle() const { + return "unzip with password"; +} diff --git a/tests/cpp-tests/Classes/ZipTest/ZipTests.h b/tests/cpp-tests/Classes/ZipTest/ZipTests.h new file mode 100644 index 0000000000..623c902f0c --- /dev/null +++ b/tests/cpp-tests/Classes/ZipTest/ZipTests.h @@ -0,0 +1,52 @@ +/**************************************************************************** + Copyright (c) 2019 Xiamen Yaji Software Co., Ltd. + + http://www.cocos.com + + 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. + ****************************************************************************/ + +#pragma once + +#include "../BaseTest.h" + +DEFINE_TEST_SUITE(ZipTests); + +class ZipTest : public TestCase +{ +public: + virtual std::string title() const override; +}; + +class UnZipNormalFile : public ZipTest +{ +public: + CREATE_FUNC(UnZipNormalFile); + virtual void onEnter() override; + virtual std::string subtitle() const override; +}; + +class UnZipWithPassword : public ZipTest +{ +public: + CREATE_FUNC(UnZipWithPassword); + virtual void onEnter() override; + virtual std::string subtitle() const override; +}; + diff --git a/tests/cpp-tests/Classes/controller.cpp b/tests/cpp-tests/Classes/controller.cpp index 5b5573c71f..f4d1bdc686 100644 --- a/tests/cpp-tests/Classes/controller.cpp +++ b/tests/cpp-tests/Classes/controller.cpp @@ -120,6 +120,7 @@ public: addTest("Touches", [](){return new TouchesTests(); }); addTest("Transitions", [](){return new TransitionsTests(); }); addTest("Unit Test", []() { return new UnitTests(); }); + addTest("Unzip Test", []() {return new ZipTests();}); addTest("URL Open Test", []() { return new OpenURLTests(); }); addTest("UserDefault", []() { return new UserDefaultTests(); }); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) diff --git a/tests/cpp-tests/Classes/tests.h b/tests/cpp-tests/Classes/tests.h index 51111ea50a..fc109acd99 100644 --- a/tests/cpp-tests/Classes/tests.h +++ b/tests/cpp-tests/Classes/tests.h @@ -117,5 +117,5 @@ #include "VibrateTest/VibrateTest.h" #include "ZwoptexTest/ZwoptexTest.h" #include "SpriteFrameCacheTest/SpriteFrameCacheTest.h" - +#include "ZipTest/ZipTests.h" #endif diff --git a/tests/cpp-tests/Resources/zip/10k-nopass.zip b/tests/cpp-tests/Resources/zip/10k-nopass.zip new file mode 100644 index 0000000000000000000000000000000000000000..35a28a96b7a1e4337ff059889f1bdd30cf6136a6 GIT binary patch literal 10404 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%0Aw^&uOfYULVTt>Y5acHl-PEG zj@`sNCKSNKzq@0iUeVh(38>qFsC4-YyBR;7a;R;T|KO&XGof2$DwUWRiUm^!K*naE znq;Hj&jRFKmmN!GC1H*}=S2;h5{<;&wO4=a&C-<`QPm8;leh;`HI`|b+9x?g+tn1t z0Y)uuFJkXrF1(b*_En2}mxMWK63f*?GahdmQD$2Q1JGaMu0Tr;>1`)8F10!tKq$Pe zD?eQEAJU_FW8Q0Rmn}`jSX0nc>K6AlG{GbAuvArpsd($72j{w;R9;H0hy=yephb>gJ0*d1zY3Y1j12o=s=~Nm~>{WkXLu61hK*$7_eS zJz%u!L0n{5&mdWSd$dU{&=IwddNj^t~w`$x$1AM0hKoz*|RcjGhzNiUQz-~WpD~66q zG`E81jV|YW-*>g)4)oozSa+kAtV|e(=Fjn^ps1>(Vjc%x-;nJkmQ48qy?NE*WZ@*Q zjzeG0l=#(#u=0{&*J3v1tW|}QH-YeKhcuDpg!3>jB6;$;#vpY{RPY){=mZ`DFqDde zhEYe=@RWH$ZA39jBO!Hu+M2p%&UkIRUEEaKAo3Bt1SejGKN^2I$0LXiAQ6`2V`kNp z!G!cQ29)l@_v%$Tofl~i0x+kqF|VWr8oZC(nCYp`FJp&7EWZ}3Tr&}XRy8S737aY} zUiWLJr0n*rKJH_(3GmJUqi?YequUXu&+)n2(_8BhMvELbLJ)W5sX`ya?(0*Z3HUn> z>N$(HRIceNv(Ki$cU+etmGfg6ZE;61HgCokJYaO~*b8-*_(Nu2y%Wv909SLXjB!o9 z(&p+l*4t<(OC>>daK+wc+9)i%2d{J!EX6#&8$MbaRoB|HXmN$Zw;JsYk$~b6{h9Yp zT0#hagv(MCclM87RfFtrck1-pI(3|zuU% zxNLpCsDx-T)vfIegja5(TzfHL1%U%L&I=ry6MY^!< zkUZD9W%3x*C(t07;rp-?s1t%(otzP{L(Mq+eF|BU*}`eq0RD-^)w({tV7g2t6q2ln zwYB7>g$E@T-fQFnNiDj3ddY&7dZjGN$LLM`l%5@hyH7KjrR6;X$ug9Vt@}fOF$|q@ z%Gr1oUbWY!eOsnQZ%3y_K>^4X|Dnr|@k;<#U?c(YG8Ob{T6oGMZMeey5fx2q&O?N) zWf)=r{hnpQ-t0XbS|Dm8w1flyZH4=>Fr&3(1v_mF?KgjFN}bsI>``betHgwb63FBr z#9DcF%Y;FqA#PXj8yLEHt$d!f6@ZD`oY6441H-Y;O)FMCLk)^jlI$I_+*K}sA^8S^ zX0>={(6(wRqgXa53d~`qY(qTLp$a>lr`RVi{E5W)dt9qkyz21NWqzAPFjA9T1!Chr z&O=lK_Ay;l#j&A!voFM)kubJjG-qN4<>GYF-Z9iF+cs592$BOeSow}CG_rLlzrQ4P zCqh#tsD-3q36V9gPRa?58&#(MbNK=%mIhy+&lq9do@VhIxY{wwzpbR`lF*Us;nu|^ z6(U1-@|xAfCgG-(NV&YrGcyA79>n7?ppATTt!!Xq{m9#T-m9WKxLBb^fEl4HV~R7c(PHNjbU=Uo=sR(WfCkj)7(i%P?`!(GIA~5hd1e zzuciC{< zJ|w{0bEs>s?`)&Z8cdArm2LV1Bdl{WC^q&qr&2GcqKCt=wF0T=4&5(p<@+o}T?Ov* zUza-##38<1s$U z@djUC;!X~Z9k~P~>>x`Qk4!$Xm=JoPM4bxiHNCF1zAD*kW|d*jQ%D}AM86_Y;`EvQ z;mAzP`RAq;9^jy#97KCLL6+qCfo^9(fLZzpvFE_7v5Z8u^u6q;zu_GE`b6H>oFSno z)Yn++`h|}0d3KfN()|2e*;!Ihu3!FduSx-@GyPEac0{g_vm*|}@P#vcu?I0lyQPDC5(bJJ z8Wf59sd5c3!g=cNHrrzmr*oB|NO6J;vtHB)`xu;YJJ82*lV-su63__M=5|dH)YQiP z@=&l3r+L03iGL%BjEzoUiBD6gd%iIW(V4IGxh94MWY-w)hwM;8lqv3QRIw=^cBl1Y z0lzhF6Z@FAB+9W9zwKBD60?STfzjNFPCrjZN5szN--B;$&F13e)vc25_+oDgGcj5v z*5yRmq)BFzK2jLg67c^(a2ptkMH;5Vb(*J;M-A-y?7K(($8ACfxyI2JYzMM0M89!zr>h3Ms0?>KPvR}iJ{+Yz^w z)ig$s30zZ~27?ozoJa98QA3YCgZ|I(eFQajUAvftPw$;8;86ES*I)QzYpM$*r9Q%Z zUIXFpuVv|;JdpFlkt+;$yNfR3L*@vMoyD{<3dCRy>U|6&6FiF(NmuSzmFBFyL!Ckv zMg3f3;%;d0N-CHf*DOqm_h2<8PMC)?4Ts%ab>zN7xqB9FcSf4#^pYmPgj0yZ^EB4- zMsH~rn`5*Z+wTeJt}DCrg_6AYm15k_kvF@wCk|P5tBzHPj}dCaNG)s))9GG~9~{~G zzE9+N6SNWeW+79{&wo)bwsILR+=KpfH$)A zgF5DNljlh#{YV9c8sftZ%G#Tku}X3^%Q?>p^^MBPyAQ4| zcs9|wqfZNd01b^eAnUZUQ_ma@*c+1R0aHRG(vwkc__MrGjr=C9p1O$jSqVd&9E~aI zM%I81qj#)CP!(~AMudsn_G)(!h-u9HtLZ*94;=}_L0|+b`E(X1)k`;+Dmq(AQTI=gS~p+8RHe&nf=~f52HJ>02*ji* zZMwlrq;3o$=0Q1iD0j$c0J(K6j8qe!e-`(*(#&QxTnV`DTy7B6Lcsc{pdhi_gA>uC zM|TZqj8ekJ2gtK?v~n|ENUv4Howi4EDW!DB_e2bSYA9KMSzUZvlr+mlXU{^iEmMKl zjoh1JK1lvOUVz@fI*XkUTC41VI+HH1CyM1%O+|i|$~jb>3v(SFvziJQp=J=lfBpFT zd*pX5VqwT8Nb5X5t7a{ba4u?&!c4NPbarasE59#s$efsyltE)_oiOBIY^?YB!&jR1 zZ){g^*-5B|vEE;&WG`Kew?$E9Pg{{!wz=pb2hR9TzTbD;ENLc!gOldsmKQcE-=Y($ z&dY2_CCt}e-q98hQ7-PMh1&!8*s*;p#V_PlhGj`Gjp4k35Qt#csb0s&EW5ew&Fl|C3}h!^mVY ze2O&&`ykzzYXt1^l=>on9F5ddzyCj*w8XY=Vi4tEi$7;d)=MV5EDk{A)91m;YEkY@ zg*6W`=@1908W0!#dYG)^#V3be>4G0WNM)y3RF_gaK>SkFLg@D9n+A=LL!B&)Fk-QR znQPyTmA`RLJ?QH3*3i{qc0&vzfV*}-zz|t|J`L42$_(Bssx=$CHe7nbV(4U*;7n7m)Tf-xvrx(3vM_`P<>}Kkv zHfN7iHviOtC5IWqm*K^n)R#IgFChz?qBc9cOyvXHSgO&K@Nx>@aVze7>C4i|57|wq zpf5G8&Bq1G)Ygj$v$;sy!vl{Zp9iM|ZWS4a=5I(ozO{>+BTv(w8{=OoX`dA_eIEO* z6i>B1#8?=;iC^Ic1SAsh2V83te!T%2tc;R1%(Ybhz~A}@Vj}?ybibTLm5sG>o|vX6 z(TJx3V^%>C+^@RO_SH0}sz9lTsNo%>&eqFL_d?umUuQ$4Cj^&xAld(&@fnbbt%5UY GLu!y?*5a!G literal 0 HcmV?d00001 diff --git a/tests/cpp-tests/Resources/zip/10k.zip b/tests/cpp-tests/Resources/zip/10k.zip new file mode 100644 index 0000000000000000000000000000000000000000..7e34910191b1e910c7065e141a7d3082a57997b2 GIT binary patch literal 10432 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 Z0~#vI{(}6UGSL52{=caAKb#`S{{f0@GA{rC literal 0 HcmV?d00001 From f210576c3a1bf74cc29459ec6f9a59c1640de656 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Tue, 22 Oct 2019 14:08:55 +0800 Subject: [PATCH 36/96] [ci skip][AUTO]: updating luabinding & cocos_file.json automatically (#20227) --- templates/cocos2dx_files.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index 210c9e56f4..aa7b7baa9e 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -28,8 +28,8 @@ "cmake/Modules/Findxxhash.cmake", "cmake/Modules/PreventInSourceBuilds.cmake", "cmake/README.md", - "cmake/images/Xcode_Find_Setting_Name.png", - "cmake/images/Xcode_General_Page.png", + "cmake/images/Xcode_Find_Setting_Name.png", + "cmake/images/Xcode_General_Page.png", "cocos/2d/CCAction.cpp", "cocos/2d/CCAction.h", "cocos/2d/CCActionCamera.cpp", From ee4432661c24b2095322cfa1fac3f4c599cce657 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Wed, 23 Oct 2019 14:13:38 +0800 Subject: [PATCH 37/96] fix label text word wrong warp issue (#20226) --- .../cpp-template-default/proj.ios_mac/ios/AppController.mm | 6 ++++++ .../runtime-src/proj.ios_mac/ios/AppController.mm | 6 ++++++ tests/cpp-empty-test/proj.ios/AppController.mm | 6 ++++++ tests/lua-empty-test/project/proj.ios/AppController.mm | 6 ++++++ tests/lua-tests/project/proj.ios_mac/ios/AppController.mm | 5 +++++ tests/performance-tests/proj.ios/AppController.mm | 6 ++++++ 6 files changed, 35 insertions(+) diff --git a/templates/cpp-template-default/proj.ios_mac/ios/AppController.mm b/templates/cpp-template-default/proj.ios_mac/ios/AppController.mm index 18c90ebbfc..edcd92178a 100644 --- a/templates/cpp-template-default/proj.ios_mac/ios/AppController.mm +++ b/templates/cpp-template-default/proj.ios_mac/ios/AppController.mm @@ -73,6 +73,12 @@ static AppDelegate s_sharedApplication; [[UIApplication sharedApplication] setStatusBarHidden:true]; + //Launching the app with the arguments -NSAllowsDefaultLineBreakStrategy NO to force back to the old behavior. + if ( [[UIDevice currentDevice].systemVersion floatValue] >= 13.0f) + { + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"NSAllowsDefaultLineBreakStrategy"]; + } + // IMPORTANT: Setting the GLView should be done after creating the RootViewController cocos2d::GLView *glview = cocos2d::GLViewImpl::createWithEAGLView((__bridge void *)_viewController.view); cocos2d::Director::getInstance()->setOpenGLView(glview); diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/ios/AppController.mm b/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/ios/AppController.mm index 18c90ebbfc..8116adeba9 100644 --- a/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/ios/AppController.mm +++ b/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/ios/AppController.mm @@ -72,6 +72,12 @@ static AppDelegate s_sharedApplication; [window makeKeyAndVisible]; [[UIApplication sharedApplication] setStatusBarHidden:true]; + + //Launching the app with the arguments -NSAllowsDefaultLineBreakStrategy NO to force back to the old behavior. + if ( [[UIDevice currentDevice].systemVersion floatValue] >= 13.0f) + { + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"NSAllowsDefaultLineBreakStrategy"]; + } // IMPORTANT: Setting the GLView should be done after creating the RootViewController cocos2d::GLView *glview = cocos2d::GLViewImpl::createWithEAGLView((__bridge void *)_viewController.view); diff --git a/tests/cpp-empty-test/proj.ios/AppController.mm b/tests/cpp-empty-test/proj.ios/AppController.mm index af9ebfd785..6f3e9d813c 100644 --- a/tests/cpp-empty-test/proj.ios/AppController.mm +++ b/tests/cpp-empty-test/proj.ios/AppController.mm @@ -78,6 +78,12 @@ static AppDelegate s_sharedApplication; [[UIApplication sharedApplication] setStatusBarHidden: YES]; + //Launching the app with the arguments -NSAllowsDefaultLineBreakStrategy NO to force back to the old behavior. + if ( [[UIDevice currentDevice].systemVersion floatValue] >= 13.0f) + { + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"NSAllowsDefaultLineBreakStrategy"]; + } + // IMPORTANT: Setting the GLView should be done after creating the RootViewController cocos2d::GLViewImpl *glview = cocos2d::GLViewImpl::createWithEAGLView(eaglView); cocos2d::Director::getInstance()->setOpenGLView(glview); diff --git a/tests/lua-empty-test/project/proj.ios/AppController.mm b/tests/lua-empty-test/project/proj.ios/AppController.mm index 12172a818a..5f463bba4c 100644 --- a/tests/lua-empty-test/project/proj.ios/AppController.mm +++ b/tests/lua-empty-test/project/proj.ios/AppController.mm @@ -76,6 +76,12 @@ static AppDelegate s_sharedApplication; [[UIApplication sharedApplication] setStatusBarHidden: YES]; + //Launching the app with the arguments -NSAllowsDefaultLineBreakStrategy NO to force back to the old behavior. + if ( [[UIDevice currentDevice].systemVersion floatValue] >= 13.0f) + { + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"NSAllowsDefaultLineBreakStrategy"]; + } + // IMPORTANT: Setting the GLView should be done after creating the RootViewController cocos2d::GLView *glview = cocos2d::GLViewImpl::createWithEAGLView(eaglView); cocos2d::Director::getInstance()->setOpenGLView(glview); diff --git a/tests/lua-tests/project/proj.ios_mac/ios/AppController.mm b/tests/lua-tests/project/proj.ios_mac/ios/AppController.mm index 22818380c2..260767392c 100644 --- a/tests/lua-tests/project/proj.ios_mac/ios/AppController.mm +++ b/tests/lua-tests/project/proj.ios_mac/ios/AppController.mm @@ -84,6 +84,11 @@ static AppDelegate s_sharedApplication; [[UIApplication sharedApplication] setStatusBarHidden: YES]; #endif + //Launching the app with the arguments -NSAllowsDefaultLineBreakStrategy NO to force back to the old behavior. + if ( [[UIDevice currentDevice].systemVersion floatValue] >= 13.0f) + { + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"NSAllowsDefaultLineBreakStrategy"]; + } // IMPORTANT: Setting the GLView should be done after creating the RootViewController cocos2d::GLView *glview = cocos2d::GLViewImpl::createWithEAGLView(eaglView); diff --git a/tests/performance-tests/proj.ios/AppController.mm b/tests/performance-tests/proj.ios/AppController.mm index b1e54524e2..b8765f41fe 100644 --- a/tests/performance-tests/proj.ios/AppController.mm +++ b/tests/performance-tests/proj.ios/AppController.mm @@ -81,6 +81,12 @@ static AppDelegate s_sharedApplication; [[UIApplication sharedApplication] setStatusBarHidden:true]; + //Launching the app with the arguments -NSAllowsDefaultLineBreakStrategy NO to force back to the old behavior. + if ( [[UIDevice currentDevice].systemVersion floatValue] >= 13.0f) + { + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"NSAllowsDefaultLineBreakStrategy"]; + } + // IMPORTANT: Setting the GLView should be done after creating the RootViewController cocos2d::GLView *glview = cocos2d::GLViewImpl::createWithEAGLView(eaglView); cocos2d::Director::getInstance()->setOpenGLView(glview); From 6b1e55f4197f77414ba90a027a5218f860d69256 Mon Sep 17 00:00:00 2001 From: minggo Date: Wed, 23 Oct 2019 14:58:31 +0800 Subject: [PATCH 38/96] Remove experimental namespace (#20229) --- cocos/2d/CCFastTMXLayer.cpp | 64 +- cocos/2d/CCFastTMXLayer.h | 11 +- cocos/2d/CCFastTMXTiledMap.cpp | 42 +- cocos/2d/CCFastTMXTiledMap.h | 29 +- cocos/audio/AudioEngine.cpp | 1 - cocos/audio/android/AssetFd.cpp | 4 +- cocos/audio/android/AssetFd.h | 4 +- cocos/audio/android/AudioBufferProvider.h | 4 +- cocos/audio/android/AudioDecoder.cpp | 4 +- cocos/audio/android/AudioDecoder.h | 4 +- cocos/audio/android/AudioDecoderMp3.cpp | 4 +- cocos/audio/android/AudioDecoderMp3.h | 4 +- cocos/audio/android/AudioDecoderOgg.cpp | 4 +- cocos/audio/android/AudioDecoderOgg.h | 4 +- cocos/audio/android/AudioDecoderProvider.cpp | 4 +- cocos/audio/android/AudioDecoderProvider.h | 4 +- cocos/audio/android/AudioDecoderSLES.cpp | 4 +- cocos/audio/android/AudioDecoderSLES.h | 4 +- cocos/audio/android/AudioDecoderWav.cpp | 4 +- cocos/audio/android/AudioDecoderWav.h | 4 +- cocos/audio/android/AudioEngine-inl.cpp | 1 - cocos/audio/android/AudioEngine-inl.h | 4 +- cocos/audio/android/AudioMixer.cpp | 4 +- cocos/audio/android/AudioMixer.h | 4 +- cocos/audio/android/AudioMixerController.cpp | 4 +- cocos/audio/android/AudioMixerController.h | 4 +- cocos/audio/android/AudioMixerOps.h | 4 +- cocos/audio/android/AudioPlayerProvider.cpp | 4 +- cocos/audio/android/AudioPlayerProvider.h | 4 +- cocos/audio/android/AudioResampler.cpp | 4 +- cocos/audio/android/AudioResampler.h | 4 +- cocos/audio/android/AudioResamplerCubic.cpp | 4 +- cocos/audio/android/AudioResamplerCubic.h | 4 +- cocos/audio/android/AudioResamplerPublic.h | 4 +- cocos/audio/android/CCThreadPool.cpp | 4 +- cocos/audio/android/CCThreadPool.h | 4 +- cocos/audio/android/IAudioPlayer.h | 4 +- cocos/audio/android/ICallerThreadUtils.h | 4 +- cocos/audio/android/IVolumeProvider.h | 4 +- cocos/audio/android/PcmAudioPlayer.cpp | 4 +- cocos/audio/android/PcmAudioPlayer.h | 4 +- cocos/audio/android/PcmAudioService.cpp | 4 +- cocos/audio/android/PcmAudioService.h | 4 +- cocos/audio/android/PcmBufferProvider.cpp | 4 +- cocos/audio/android/PcmBufferProvider.h | 4 +- cocos/audio/android/PcmData.cpp | 4 +- cocos/audio/android/PcmData.h | 4 +- cocos/audio/android/Track.cpp | 4 +- cocos/audio/android/Track.h | 4 +- cocos/audio/android/UrlAudioPlayer.cpp | 6 +- cocos/audio/android/UrlAudioPlayer.h | 4 +- cocos/audio/android/utils/Errors.h | 4 +- cocos/audio/android/utils/Utils.cpp | 4 +- cocos/audio/android/utils/Utils.h | 4 +- cocos/audio/apple/AudioCache.h | 7 - cocos/audio/apple/AudioCache.mm | 6 - cocos/audio/apple/AudioDecoder.h | 4 +- cocos/audio/apple/AudioDecoder.mm | 4 +- cocos/audio/apple/AudioEngine-inl.h | 11 +- cocos/audio/apple/AudioEngine-inl.mm | 6 - cocos/audio/apple/AudioPlayer.h | 7 - cocos/audio/apple/AudioPlayer.mm | 6 - cocos/audio/include/AudioEngine.h | 3 - cocos/audio/linux/AudioEngine-linux.cpp | 1 - cocos/audio/linux/AudioEngine-linux.h | 4 +- cocos/audio/win32/AudioCache.cpp | 1 - cocos/audio/win32/AudioCache.h | 2 - cocos/audio/win32/AudioDecoder.cpp | 4 +- cocos/audio/win32/AudioDecoder.h | 4 +- cocos/audio/win32/AudioDecoderManager.cpp | 4 +- cocos/audio/win32/AudioDecoderManager.h | 4 +- cocos/audio/win32/AudioDecoderMp3.cpp | 4 +- cocos/audio/win32/AudioDecoderMp3.h | 4 +- cocos/audio/win32/AudioDecoderOgg.cpp | 4 +- cocos/audio/win32/AudioDecoderOgg.h | 4 +- cocos/audio/win32/AudioEngine-win32.cpp | 11 +- cocos/audio/win32/AudioEngine-win32.h | 13 +- cocos/audio/win32/AudioPlayer.cpp | 11 +- cocos/audio/win32/AudioPlayer.h | 10 - .../cocostudio/SimpleAudioEngine.cpp | 1 - cocos/scripting/lua-bindings/CMakeLists.txt | 32 +- .../auto/lua_cocos2dx_audioengine_auto.cpp | 274 +-- .../lua-bindings/auto/lua_cocos2dx_auto.cpp | 1865 ++++++++++++++++ .../lua-bindings/auto/lua_cocos2dx_auto.hpp | 39 + .../auto/lua_cocos2dx_experimental_auto.cpp | 1882 ----------------- .../auto/lua_cocos2dx_experimental_auto.hpp | 54 - .../lua_cocos2dx_experimental_video_auto.cpp | 1002 --------- .../lua_cocos2dx_experimental_video_auto.hpp | 38 - ...lua_cocos2dx_experimental_webview_auto.cpp | 977 --------- ...lua_cocos2dx_experimental_webview_auto.hpp | 37 - .../auto/lua_cocos2dx_ui_auto.cpp | 961 ++++++++- .../auto/lua_cocos2dx_ui_auto.hpp | 20 + .../auto/lua_cocos2dx_video_auto.cpp | 1000 +++++++++ .../auto/lua_cocos2dx_video_auto.hpp | 36 + .../auto/lua_cocos2dx_webview_auto.cpp | 975 +++++++++ .../auto/lua_cocos2dx_webview_auto.hpp | 35 + .../lua-bindings/manual/CCLuaStack.cpp | 5 - .../lua_cocos2dx_audioengine_manual.cpp | 62 +- .../lua_cocos2dx_audioengine_manual.h | 7 +- .../lua_cocos2dx_experimental_manual.cpp | 147 -- .../manual/cocos2d/lua_cocos2dx_manual.cpp | 79 + ...a_cocos2dx_experimental_webview_manual.hpp | 42 - .../manual/ui/lua_cocos2dx_ui_manual.cpp | 16 +- ...nual.cpp => lua_cocos2dx_video_manual.cpp} | 28 +- .../lua_cocos2dx_video_manual.hpp} | 9 +- ...al.cpp => lua_cocos2dx_webview_manual.cpp} | 71 +- ...al.hpp => lua_cocos2dx_webview_manual.hpp} | 11 +- ...lua_cocos2dx_experimental_video_manual.cpp | 111 - ...lua_cocos2dx_experimental_video_manual.hpp | 42 - cocos/scripting/lua-bindings/script/init.lua | 1 - .../lua-bindings/script/ui/GuiConstants.lua | 7 + .../script/ui/experimentalUIConstants.lua | 10 - cocos/ui/UIVideoPlayer-android.cpp | 2 +- cocos/ui/UIVideoPlayer-ios.mm | 2 +- cocos/ui/UIVideoPlayer.h | 403 ++-- cocos/ui/UIWebView/UIWebView-inl.h | 342 ++- cocos/ui/UIWebView/UIWebView.cpp | 6 - cocos/ui/UIWebView/UIWebView.h | 18 +- cocos/ui/UIWebView/UIWebView.mm | 6 - cocos/ui/UIWebView/UIWebViewImpl-android.cpp | 279 ++- cocos/ui/UIWebView/UIWebViewImpl-android.h | 89 +- cocos/ui/UIWebView/UIWebViewImpl-ios.h | 11 +- cocos/ui/UIWebView/UIWebViewImpl-ios.mm | 14 +- .../NewAudioEngineTest/NewAudioEngineTest.cpp | 1 - .../NewAudioEngineTest/NewAudioEngineTest.h | 2 +- .../NewRendererTest/NewRendererTest.cpp | 2 +- .../Classes/TileMapTest/TileMapTest2.cpp | 74 +- .../UIVideoPlayerTest/UIVideoPlayerTest.cpp | 15 +- .../UIVideoPlayerTest/UIVideoPlayerTest.h | 8 +- .../UIWebViewTest/UIWebViewTest.cpp | 8 +- .../UIWebViewTest/UIWebViewTest.h | 8 +- .../src/FastTiledMapTest/FastTiledMapTest.lua | 50 +- .../NewAudioEngineTest/NewAudioEngineTest.lua | 48 +- .../src/VideoPlayerTest/VideoPlayerTest.lua | 10 +- .../lua-tests/src/WebViewTest/WebViewTest.lua | 2 +- tests/lua-tests/src/mainMenu.lua | 2 + tools/tolua/cocos2dx.ini | 3 +- tools/tolua/cocos2dx_audioengine.ini | 2 +- tools/tolua/cocos2dx_experimental.ini | 61 - tools/tolua/cocos2dx_ui.ini | 1 - ...erimental_video.ini => cocos2dx_video.ini} | 8 +- ...ental_webview.ini => cocos2dx_webview.ini} | 9 +- tools/tolua/genbindings.py | 5 +- 143 files changed, 6121 insertions(+), 5727 deletions(-) delete mode 100644 cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_auto.cpp delete mode 100644 cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_auto.hpp delete mode 100644 cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.cpp delete mode 100644 cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.hpp delete mode 100644 cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_webview_auto.cpp delete mode 100644 cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_webview_auto.hpp create mode 100644 cocos/scripting/lua-bindings/auto/lua_cocos2dx_video_auto.cpp create mode 100644 cocos/scripting/lua-bindings/auto/lua_cocos2dx_video_auto.hpp create mode 100644 cocos/scripting/lua-bindings/auto/lua_cocos2dx_webview_auto.cpp create mode 100644 cocos/scripting/lua-bindings/auto/lua_cocos2dx_webview_auto.hpp delete mode 100644 cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_experimental_manual.cpp delete mode 100644 cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_webview_manual.hpp rename cocos/scripting/lua-bindings/manual/ui/{lua_cocos2dx_experimental_video_manual.cpp => lua_cocos2dx_video_manual.cpp} (73%) rename cocos/scripting/lua-bindings/manual/{cocos2d/lua_cocos2dx_experimental_manual.hpp => ui/lua_cocos2dx_video_manual.hpp} (81%) rename cocos/scripting/lua-bindings/manual/ui/{lua_cocos2dx_experimental_webview_manual.cpp => lua_cocos2dx_webview_manual.cpp} (63%) rename cocos/scripting/lua-bindings/manual/ui/{lua_cocos2dx_experimental_video_manual.hpp => lua_cocos2dx_webview_manual.hpp} (72%) delete mode 100644 cocos/scripting/lua-bindings/manual/video/lua_cocos2dx_experimental_video_manual.cpp delete mode 100644 cocos/scripting/lua-bindings/manual/video/lua_cocos2dx_experimental_video_manual.hpp delete mode 100644 cocos/scripting/lua-bindings/script/ui/experimentalUIConstants.lua delete mode 100644 tools/tolua/cocos2dx_experimental.ini rename tools/tolua/{cocos2dx_experimental_video.ini => cocos2dx_video.ini} (92%) rename tools/tolua/{cocos2dx_experimental_webview.ini => cocos2dx_webview.ini} (92%) diff --git a/cocos/2d/CCFastTMXLayer.cpp b/cocos/2d/CCFastTMXLayer.cpp index 62e68aa8f9..d0671044a5 100644 --- a/cocos/2d/CCFastTMXLayer.cpp +++ b/cocos/2d/CCFastTMXLayer.cpp @@ -49,16 +49,15 @@ THE SOFTWARE. #include "renderer/backend/ProgramState.h" NS_CC_BEGIN -namespace experimental { -const int TMXLayer::FAST_TMX_ORIENTATION_ORTHO = 0; -const int TMXLayer::FAST_TMX_ORIENTATION_HEX = 1; -const int TMXLayer::FAST_TMX_ORIENTATION_ISO = 2; +const int FastTMXLayer::FAST_TMX_ORIENTATION_ORTHO = 0; +const int FastTMXLayer::FAST_TMX_ORIENTATION_HEX = 1; +const int FastTMXLayer::FAST_TMX_ORIENTATION_ISO = 2; // FastTMXLayer - init & alloc & dealloc -TMXLayer * TMXLayer::create(TMXTilesetInfo *tilesetInfo, TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo) +FastTMXLayer * FastTMXLayer::create(TMXTilesetInfo *tilesetInfo, TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo) { - TMXLayer *ret = new (std::nothrow) TMXLayer(); + FastTMXLayer *ret = new (std::nothrow) FastTMXLayer(); if (ret->initWithTilesetInfo(tilesetInfo, layerInfo, mapInfo)) { ret->autorelease(); @@ -68,7 +67,7 @@ TMXLayer * TMXLayer::create(TMXTilesetInfo *tilesetInfo, TMXLayerInfo *layerInfo return nullptr; } -bool TMXLayer::initWithTilesetInfo(TMXTilesetInfo *tilesetInfo, TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo) +bool FastTMXLayer::initWithTilesetInfo(TMXTilesetInfo *tilesetInfo, TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo) { if( tilesetInfo ) @@ -107,11 +106,11 @@ bool TMXLayer::initWithTilesetInfo(TMXTilesetInfo *tilesetInfo, TMXLayerInfo *la return true; } -TMXLayer::TMXLayer() +FastTMXLayer::FastTMXLayer() { } -TMXLayer::~TMXLayer() +FastTMXLayer::~FastTMXLayer() { CC_SAFE_RELEASE(_tileSet); CC_SAFE_RELEASE(_texture); @@ -126,7 +125,7 @@ TMXLayer::~TMXLayer() } } -void TMXLayer::draw(Renderer *renderer, const Mat4& transform, uint32_t flags) +void FastTMXLayer::draw(Renderer *renderer, const Mat4& transform, uint32_t flags) { updateTotalQuads(); @@ -170,7 +169,7 @@ void TMXLayer::draw(Renderer *renderer, const Mat4& transform, uint32_t flags) } } -void TMXLayer::updateTiles(const Rect& culledRect) +void FastTMXLayer::updateTiles(const Rect& culledRect) { Rect visibleTiles = Rect(culledRect.origin, culledRect.size * Director::getInstance()->getContentScaleFactor()); Size mapTileSize = CC_SIZE_PIXELS_TO_POINTS(_mapTileSize); @@ -263,7 +262,7 @@ void TMXLayer::updateTiles(const Rect& culledRect) } -void TMXLayer::updateVertexBuffer() +void FastTMXLayer::updateVertexBuffer() { unsigned int vertexBufferSize = (unsigned int)(sizeof(V3F_C4B_T2F) * _totalQuads.size() * 4); if (!_vertexBuffer) @@ -274,7 +273,7 @@ void TMXLayer::updateVertexBuffer() _vertexBuffer->updateData(&_totalQuads[0], vertexBufferSize); } -void TMXLayer::updateIndexBuffer() +void FastTMXLayer::updateIndexBuffer() { #ifdef CC_FAST_TILEMAP_32_BIT_INDICES unsigned int indexBufferSize = (unsigned int)(sizeof(unsigned int) * _indices.size()); @@ -290,7 +289,7 @@ void TMXLayer::updateIndexBuffer() } // FastTMXLayer - setup Tiles -void TMXLayer::setupTiles() +void FastTMXLayer::setupTiles() { // Optimization: quick hack that sets the image size on the tileset _tileSet->_imageSize = _texture->getContentSizeInPixels(); @@ -330,7 +329,7 @@ void TMXLayer::setupTiles() } -Mat4 TMXLayer::tileToNodeTransform() +Mat4 FastTMXLayer::tileToNodeTransform() { float w = _mapTileSize.width / CC_CONTENT_SCALE_FACTOR(); float h = _mapTileSize.height / CC_CONTENT_SCALE_FACTOR(); @@ -382,7 +381,7 @@ Mat4 TMXLayer::tileToNodeTransform() } -void TMXLayer::updatePrimitives() +void FastTMXLayer::updatePrimitives() { auto blendfunc = _texture->hasPremultipliedAlpha() ? BlendFunc::ALPHA_PREMULTIPLIED : BlendFunc::ALPHA_NON_PREMULTIPLIED; for(const auto& iter : _indicesVertexZNumber) @@ -453,14 +452,14 @@ void TMXLayer::updatePrimitives() } } -void TMXLayer::setOpacity(uint8_t opacity) +void FastTMXLayer::setOpacity(uint8_t opacity) { Node::setOpacity(opacity); _quadsDirty = true; } -void TMXLayer::updateTotalQuads() +void FastTMXLayer::updateTotalQuads() { if(_quadsDirty) { @@ -605,7 +604,7 @@ void TMXLayer::updateTotalQuads() } // removing / getting tiles -Sprite* TMXLayer::getTileAt(const Vec2& tileCoordinate) +Sprite* FastTMXLayer::getTileAt(const Vec2& tileCoordinate) { CCASSERT( tileCoordinate.x < _layerSize.width && tileCoordinate.y < _layerSize.height && tileCoordinate.x >=0 && tileCoordinate.y >=0, "TMXLayer: invalid position"); CCASSERT( _tiles, "TMXLayer: the tiles map has been released"); @@ -645,7 +644,7 @@ Sprite* TMXLayer::getTileAt(const Vec2& tileCoordinate) return tile; } -int TMXLayer::getTileGIDAt(const Vec2& tileCoordinate, TMXTileFlags* flags/* = nullptr*/) +int FastTMXLayer::getTileGIDAt(const Vec2& tileCoordinate, TMXTileFlags* flags/* = nullptr*/) { CCASSERT(tileCoordinate.x < _layerSize.width && tileCoordinate.y < _layerSize.height && tileCoordinate.x >=0 && tileCoordinate.y >=0, "TMXLayer: invalid position"); CCASSERT(_tiles, "TMXLayer: the tiles map has been released"); @@ -671,12 +670,12 @@ int TMXLayer::getTileGIDAt(const Vec2& tileCoordinate, TMXTileFlags* flags/* = n return (tile & kTMXFlippedMask); } -Vec2 TMXLayer::getPositionAt(const Vec2& pos) +Vec2 FastTMXLayer::getPositionAt(const Vec2& pos) { return PointApplyTransform(pos, _tileToNodeTransform); } -int TMXLayer::getVertexZForPos(const Vec2& pos) +int FastTMXLayer::getVertexZForPos(const Vec2& pos) { int ret = 0; int maxVal = 0; @@ -707,7 +706,7 @@ int TMXLayer::getVertexZForPos(const Vec2& pos) return ret; } -void TMXLayer::removeTileAt(const Vec2& tileCoordinate) +void FastTMXLayer::removeTileAt(const Vec2& tileCoordinate) { CCASSERT( tileCoordinate.x < _layerSize.width && tileCoordinate.y < _layerSize.height && tileCoordinate.x >=0 && tileCoordinate.y >=0, "TMXLayer: invalid position"); @@ -730,7 +729,7 @@ void TMXLayer::removeTileAt(const Vec2& tileCoordinate) } } -void TMXLayer::setFlaggedTileGIDByIndex(int index, uint32_t gid) +void FastTMXLayer::setFlaggedTileGIDByIndex(int index, uint32_t gid) { if(gid == _tiles[index]) return; _tiles[index] = gid; @@ -738,7 +737,7 @@ void TMXLayer::setFlaggedTileGIDByIndex(int index, uint32_t gid) _dirty = true; } -void TMXLayer::removeChild(Node* node, bool cleanup) +void FastTMXLayer::removeChild(Node* node, bool cleanup) { int tag = node->getTag(); auto it = _spriteContainer.find(tag); @@ -750,7 +749,7 @@ void TMXLayer::removeChild(Node* node, bool cleanup) } // TMXLayer - Properties -Value TMXLayer::getProperty(const std::string& propertyName) const +Value FastTMXLayer::getProperty(const std::string& propertyName) const { auto propItr = _properties.find(propertyName); if (propItr != _properties.end()) @@ -759,7 +758,7 @@ Value TMXLayer::getProperty(const std::string& propertyName) const return Value(); } -void TMXLayer::parseInternalProperties() +void FastTMXLayer::parseInternalProperties() { auto vertexz = getProperty("cc_vertexz"); if (vertexz.isNull()) return; @@ -779,7 +778,7 @@ void TMXLayer::parseInternalProperties() } //CCTMXLayer2 - obtaining positions, offset -Vec2 TMXLayer::calculateLayerOffset(const Vec2& pos) +Vec2 FastTMXLayer::calculateLayerOffset(const Vec2& pos) { Vec2 ret; switch (_layerOrientation) @@ -800,12 +799,12 @@ Vec2 TMXLayer::calculateLayerOffset(const Vec2& pos) } // TMXLayer - adding / remove tiles -void TMXLayer::setTileGID(int gid, const Vec2& tileCoordinate) +void FastTMXLayer::setTileGID(int gid, const Vec2& tileCoordinate) { setTileGID(gid, tileCoordinate, (TMXTileFlags)0); } -void TMXLayer::setTileGID(int gid, const Vec2& tileCoordinate, TMXTileFlags flags) +void FastTMXLayer::setTileGID(int gid, const Vec2& tileCoordinate, TMXTileFlags flags) { CCASSERT(tileCoordinate.x < _layerSize.width && tileCoordinate.y < _layerSize.height && tileCoordinate.x >=0 && tileCoordinate.y >=0, "TMXLayer: invalid position"); CCASSERT(_tiles, "TMXLayer: the tiles map has been released"); @@ -856,7 +855,7 @@ void TMXLayer::setTileGID(int gid, const Vec2& tileCoordinate, TMXTileFlags flag } } -void TMXLayer::setupTileSprite(Sprite* sprite, const Vec2& pos, uint32_t gid) +void FastTMXLayer::setupTileSprite(Sprite* sprite, const Vec2& pos, uint32_t gid) { sprite->setPosition(getPositionAt(pos)); sprite->setPositionZ((float)getVertexZForPos(pos)); @@ -912,11 +911,10 @@ void TMXLayer::setupTileSprite(Sprite* sprite, const Vec2& pos, uint32_t gid) } } -std::string TMXLayer::getDescription() const +std::string FastTMXLayer::getDescription() const { return StringUtils::format("", _tag, (int)_mapTileSize.width, (int)_mapTileSize.height); } -} //end of namespace experimental NS_CC_END diff --git a/cocos/2d/CCFastTMXLayer.h b/cocos/2d/CCFastTMXLayer.h index db8c92ab0d..0cb7b3409c 100644 --- a/cocos/2d/CCFastTMXLayer.h +++ b/cocos/2d/CCFastTMXLayer.h @@ -45,8 +45,6 @@ namespace backend class Buffer; } -namespace experimental{ - /** * @addtogroup _2d * @{ @@ -78,7 +76,7 @@ namespace experimental{ * @js NA */ -class CC_DLL TMXLayer : public Node +class CC_DLL FastTMXLayer : public Node { public: /** Possible orientations of the TMX map */ @@ -93,16 +91,16 @@ public: * @param mapInfo A map info. * @return Return an autorelease object. */ - static TMXLayer * create(TMXTilesetInfo *tilesetInfo, TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo); + static FastTMXLayer * create(TMXTilesetInfo *tilesetInfo, TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo); /** * @js ctor */ - TMXLayer(); + FastTMXLayer(); /** * @js NA * @lua NA */ - virtual ~TMXLayer(); + virtual ~FastTMXLayer(); /** Returns the tile gid at a given tile coordinate. It also returns the tile flags. * @@ -361,5 +359,4 @@ protected: // end of tilemap_parallax_nodes group /// @} -} //end of namespace experimental NS_CC_END diff --git a/cocos/2d/CCFastTMXTiledMap.cpp b/cocos/2d/CCFastTMXTiledMap.cpp index 7a29a3bb18..1a7e5ffff1 100644 --- a/cocos/2d/CCFastTMXTiledMap.cpp +++ b/cocos/2d/CCFastTMXTiledMap.cpp @@ -30,13 +30,12 @@ THE SOFTWARE. #include "base/ccUTF8.h" NS_CC_BEGIN -namespace experimental { // implementation FastTMXTiledMap -TMXTiledMap * TMXTiledMap::create(const std::string& tmxFile) +FastTMXTiledMap * FastTMXTiledMap::create(const std::string& tmxFile) { - TMXTiledMap *ret = new (std::nothrow) TMXTiledMap(); + FastTMXTiledMap *ret = new (std::nothrow) FastTMXTiledMap(); if (ret->initWithTMXFile(tmxFile)) { ret->autorelease(); @@ -46,9 +45,9 @@ TMXTiledMap * TMXTiledMap::create(const std::string& tmxFile) return nullptr; } -TMXTiledMap* TMXTiledMap::createWithXML(const std::string& tmxString, const std::string& resourcePath) +FastTMXTiledMap* FastTMXTiledMap::createWithXML(const std::string& tmxString, const std::string& resourcePath) { - TMXTiledMap *ret = new (std::nothrow) TMXTiledMap(); + FastTMXTiledMap *ret = new (std::nothrow) FastTMXTiledMap(); if (ret->initWithXML(tmxString, resourcePath)) { ret->autorelease(); @@ -58,7 +57,7 @@ TMXTiledMap* TMXTiledMap::createWithXML(const std::string& tmxString, const std: return nullptr; } -bool TMXTiledMap::initWithTMXFile(const std::string& tmxFile) +bool FastTMXTiledMap::initWithTMXFile(const std::string& tmxFile) { CCASSERT(tmxFile.size()>0, "FastTMXTiledMap: tmx file should not be empty"); @@ -76,7 +75,7 @@ bool TMXTiledMap::initWithTMXFile(const std::string& tmxFile) return true; } -bool TMXTiledMap::initWithXML(const std::string& tmxString, const std::string& resourcePath) +bool FastTMXTiledMap::initWithXML(const std::string& tmxString, const std::string& resourcePath) { setContentSize(Size::ZERO); @@ -88,24 +87,24 @@ bool TMXTiledMap::initWithXML(const std::string& tmxString, const std::string& r return true; } -TMXTiledMap::TMXTiledMap() +FastTMXTiledMap::FastTMXTiledMap() :_mapSize(Size::ZERO) ,_tileSize(Size::ZERO) { } -TMXTiledMap::~TMXTiledMap() +FastTMXTiledMap::~FastTMXTiledMap() { } // private -TMXLayer * TMXTiledMap::parseLayer(TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo) +FastTMXLayer * FastTMXTiledMap::parseLayer(TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo) { TMXTilesetInfo *tileset = tilesetForLayer(layerInfo, mapInfo); if (tileset == nullptr) return nullptr; - TMXLayer *layer = TMXLayer::create(tileset, layerInfo, mapInfo); + FastTMXLayer *layer = FastTMXLayer::create(tileset, layerInfo, mapInfo); // tell the layerinfo to release the ownership of the tiles map. layerInfo->_ownTiles = false; @@ -114,7 +113,7 @@ TMXLayer * TMXTiledMap::parseLayer(TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo) return layer; } -TMXTilesetInfo * TMXTiledMap::tilesetForLayer(TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo) +TMXTilesetInfo * FastTMXTiledMap::tilesetForLayer(TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo) { Size size = layerInfo->_layerSize; auto& tilesets = mapInfo->getTilesets(); @@ -158,7 +157,7 @@ TMXTilesetInfo * TMXTiledMap::tilesetForLayer(TMXLayerInfo *layerInfo, TMXMapInf return nullptr; } -void TMXTiledMap::buildWithMapInfo(TMXMapInfo* mapInfo) +void FastTMXTiledMap::buildWithMapInfo(TMXMapInfo* mapInfo) { _mapSize = mapInfo->getMapSize(); _tileSize = mapInfo->getTileSize(); @@ -176,7 +175,7 @@ void TMXTiledMap::buildWithMapInfo(TMXMapInfo* mapInfo) for(const auto &layerInfo : layers) { if (layerInfo->_visible) { - TMXLayer *child = parseLayer(layerInfo, mapInfo); + FastTMXLayer *child = parseLayer(layerInfo, mapInfo); if (child == nullptr) { idx++; continue; @@ -196,13 +195,13 @@ void TMXTiledMap::buildWithMapInfo(TMXMapInfo* mapInfo) } // public -TMXLayer * TMXTiledMap::getLayer(const std::string& layerName) const +FastTMXLayer * FastTMXTiledMap::getLayer(const std::string& layerName) const { CCASSERT(layerName.size() > 0, "Invalid layer name!"); for (auto& child : _children) { - TMXLayer* layer = dynamic_cast(child); + FastTMXLayer* layer = dynamic_cast(child); if(layer) { if(layerName.compare( layer->getLayerName()) == 0) @@ -216,7 +215,7 @@ TMXLayer * TMXTiledMap::getLayer(const std::string& layerName) const return nullptr; } -TMXObjectGroup * TMXTiledMap::getObjectGroup(const std::string& groupName) const +TMXObjectGroup * FastTMXTiledMap::getObjectGroup(const std::string& groupName) const { CCASSERT(groupName.size() > 0, "Invalid group name!"); @@ -235,7 +234,7 @@ TMXObjectGroup * TMXTiledMap::getObjectGroup(const std::string& groupName) const return nullptr; } -Value TMXTiledMap::getProperty(const std::string& propertyName) const +Value FastTMXTiledMap::getProperty(const std::string& propertyName) const { auto propsItr = _properties.find(propertyName); if (propsItr != _properties.end()) @@ -244,7 +243,7 @@ Value TMXTiledMap::getProperty(const std::string& propertyName) const return Value(); } -Value TMXTiledMap::getPropertiesForGID(int GID) const +Value FastTMXTiledMap::getPropertiesForGID(int GID) const { auto propsItr = _tileProperties.find(GID); if (propsItr != _tileProperties.end()) @@ -253,12 +252,9 @@ Value TMXTiledMap::getPropertiesForGID(int GID) const return Value(); } -std::string TMXTiledMap::getDescription() const +std::string FastTMXTiledMap::getDescription() const { return StringUtils::format("(_children.size())); } -} //end of namespace experimental - NS_CC_END - diff --git a/cocos/2d/CCFastTMXTiledMap.h b/cocos/2d/CCFastTMXTiledMap.h index 477761ca45..9b344dd8f6 100644 --- a/cocos/2d/CCFastTMXTiledMap.h +++ b/cocos/2d/CCFastTMXTiledMap.h @@ -25,8 +25,7 @@ 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. ****************************************************************************/ -#ifndef __CC_FAST_TMX_TILEMAP_H__ -#define __CC_FAST_TMX_TILEMAP_H__ +#pragma once #include "2d/CCNode.h" #include "2d/CCTMXObjectGroup.h" @@ -36,10 +35,7 @@ NS_CC_BEGIN class TMXLayerInfo; class TMXTilesetInfo; class TMXMapInfo; - -namespace experimental { - -class TMXLayer; +class FastTMXLayer; /** * @addtogroup _2d * @{ @@ -97,14 +93,14 @@ class TMXLayer; * @since v3.2 * @js NA */ -class CC_DLL TMXTiledMap : public Node +class CC_DLL FastTMXTiledMap : public Node { public: /** Creates a TMX Tiled Map with a TMX file. * * @return An autorelease object. */ - static TMXTiledMap* create(const std::string& tmxFile); + static FastTMXTiledMap* create(const std::string& tmxFile); /** Initializes a TMX Tiled Map with a TMX formatted XML string and a path to TMX resources. * @@ -112,13 +108,13 @@ public: * @param resourcePath A path to TMX resources. * @return An autorelease object. */ - static TMXTiledMap* createWithXML(const std::string& tmxString, const std::string& resourcePath); + static FastTMXTiledMap* createWithXML(const std::string& tmxString, const std::string& resourcePath); /** Return the FastTMXLayer for the specific layer. * * @return Return the FastTMXLayer for the specific layer. */ - TMXLayer* getLayer(const std::string& layerName) const; + FastTMXLayer* getLayer(const std::string& layerName) const; /** Return the TMXObjectGroup for the specific group. * @@ -209,12 +205,12 @@ protected: /** * @js ctor */ - TMXTiledMap(); + FastTMXTiledMap(); /** * @js NA * @lua NA */ - virtual ~TMXTiledMap(); + virtual ~FastTMXTiledMap(); /** initializes a TMX Tiled Map with a TMX file */ bool initWithTMXFile(const std::string& tmxFile); @@ -222,7 +218,7 @@ protected: /** initializes a TMX Tiled Map with a TMX formatted XML string and a path to TMX resources */ bool initWithXML(const std::string& tmxString, const std::string& resourcePath); - TMXLayer * parseLayer(TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo); + FastTMXLayer * parseLayer(TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo); TMXTilesetInfo * tilesetForLayer(TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo); void buildWithMapInfo(TMXMapInfo* mapInfo); @@ -241,17 +237,12 @@ protected: ValueMapIntKey _tileProperties; private: - CC_DISALLOW_COPY_AND_ASSIGN(TMXTiledMap); + CC_DISALLOW_COPY_AND_ASSIGN(FastTMXTiledMap); }; // end of tilemap_parallax_nodes group /** @} */ -} //end of namespace experimental NS_CC_END - -#endif //__CCTMX_TILE_MAP2_H__ - - diff --git a/cocos/audio/AudioEngine.cpp b/cocos/audio/AudioEngine.cpp index 3f192341f0..9035daed66 100644 --- a/cocos/audio/AudioEngine.cpp +++ b/cocos/audio/AudioEngine.cpp @@ -48,7 +48,6 @@ #endif // ERROR using namespace cocos2d; -using namespace cocos2d::experimental; const int AudioEngine::INVALID_AUDIO_ID = -1; const float AudioEngine::TIME_UNKNOWN = -1.0f; diff --git a/cocos/audio/android/AssetFd.cpp b/cocos/audio/android/AssetFd.cpp index fc8303142f..9d6e6a051a 100644 --- a/cocos/audio/android/AssetFd.cpp +++ b/cocos/audio/android/AssetFd.cpp @@ -28,7 +28,7 @@ THE SOFTWARE. #include "audio/android/cutils/log.h" #include "audio/android/AssetFd.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { AssetFd::AssetFd(int assetFd) : _assetFd(assetFd) @@ -45,4 +45,4 @@ AssetFd::~AssetFd() } }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AssetFd.h b/cocos/audio/android/AssetFd.h index aedb8c8ac2..d380f694d0 100644 --- a/cocos/audio/android/AssetFd.h +++ b/cocos/audio/android/AssetFd.h @@ -26,7 +26,7 @@ THE SOFTWARE. #include -namespace cocos2d { namespace experimental { +namespace cocos2d { class AssetFd { @@ -39,5 +39,5 @@ private: int _assetFd; }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AudioBufferProvider.h b/cocos/audio/android/AudioBufferProvider.h index cf9a3c0974..8efeea6da9 100644 --- a/cocos/audio/android/AudioBufferProvider.h +++ b/cocos/audio/android/AudioBufferProvider.h @@ -20,7 +20,7 @@ #include #include "audio/android/utils/Errors.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { // ---------------------------------------------------------------------------- class AudioBufferProvider @@ -77,4 +77,4 @@ public: }; // ---------------------------------------------------------------------------- -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AudioDecoder.cpp b/cocos/audio/android/AudioDecoder.cpp index 5f14e83fd5..78327e490c 100644 --- a/cocos/audio/android/AudioDecoder.cpp +++ b/cocos/audio/android/AudioDecoder.cpp @@ -34,7 +34,7 @@ THE SOFTWARE. #include #include -namespace cocos2d { namespace experimental { +namespace cocos2d { size_t AudioDecoder::fileRead(void* ptr, size_t size, size_t nmemb, void* datasource) { @@ -291,4 +291,4 @@ bool AudioDecoder::interleave() return false; } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AudioDecoder.h b/cocos/audio/android/AudioDecoder.h index 46ad515b1f..8ad1f2b4cf 100644 --- a/cocos/audio/android/AudioDecoder.h +++ b/cocos/audio/android/AudioDecoder.h @@ -29,7 +29,7 @@ THE SOFTWARE. #include "audio/android/PcmData.h" #include "base/CCData.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { class AudioDecoder { @@ -61,4 +61,4 @@ protected: size_t _fileCurrPos; }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AudioDecoderMp3.cpp b/cocos/audio/android/AudioDecoderMp3.cpp index 136c562fa7..a5ea481982 100644 --- a/cocos/audio/android/AudioDecoderMp3.cpp +++ b/cocos/audio/android/AudioDecoderMp3.cpp @@ -29,7 +29,7 @@ THE SOFTWARE. #include "audio/android/mp3reader.h" #include "platform/CCFileUtils.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { AudioDecoderMp3::AudioDecoderMp3() { @@ -80,4 +80,4 @@ bool AudioDecoderMp3::decodeToPcm() return false; } -}} // namespace cocos2d { namespace experimental { \ No newline at end of file +} // namespace cocos2d { \ No newline at end of file diff --git a/cocos/audio/android/AudioDecoderMp3.h b/cocos/audio/android/AudioDecoderMp3.h index 3def5a202d..8531320afe 100644 --- a/cocos/audio/android/AudioDecoderMp3.h +++ b/cocos/audio/android/AudioDecoderMp3.h @@ -27,7 +27,7 @@ THE SOFTWARE. #include "audio/android/AudioDecoder.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { class AudioDecoderMp3 : public AudioDecoder { @@ -40,4 +40,4 @@ protected: friend class AudioDecoderProvider; }; -}} // namespace cocos2d { namespace experimental { \ No newline at end of file +} // namespace cocos2d { \ No newline at end of file diff --git a/cocos/audio/android/AudioDecoderOgg.cpp b/cocos/audio/android/AudioDecoderOgg.cpp index 15f033636b..a1efb56f28 100644 --- a/cocos/audio/android/AudioDecoderOgg.cpp +++ b/cocos/audio/android/AudioDecoderOgg.cpp @@ -28,7 +28,7 @@ THE SOFTWARE. #include "audio/android/AudioDecoderOgg.h" #include "platform/CCFileUtils.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { AudioDecoderOgg::AudioDecoderOgg() { @@ -110,4 +110,4 @@ bool AudioDecoderOgg::decodeToPcm() return (curPos > 0); } -}} // namespace cocos2d { namespace experimental { \ No newline at end of file +} // namespace cocos2d { \ No newline at end of file diff --git a/cocos/audio/android/AudioDecoderOgg.h b/cocos/audio/android/AudioDecoderOgg.h index 4ad5166e65..e9eb6dfaee 100644 --- a/cocos/audio/android/AudioDecoderOgg.h +++ b/cocos/audio/android/AudioDecoderOgg.h @@ -29,7 +29,7 @@ THE SOFTWARE. #include "Tremolo/ivorbisfile.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { class AudioDecoderOgg : public AudioDecoder { @@ -43,4 +43,4 @@ protected: friend class AudioDecoderProvider; }; -}} // namespace cocos2d { namespace experimental { \ No newline at end of file +} // namespace cocos2d { \ No newline at end of file diff --git a/cocos/audio/android/AudioDecoderProvider.cpp b/cocos/audio/android/AudioDecoderProvider.cpp index cedf52b20e..077d8136bd 100644 --- a/cocos/audio/android/AudioDecoderProvider.cpp +++ b/cocos/audio/android/AudioDecoderProvider.cpp @@ -31,7 +31,7 @@ #include "audio/android/AudioDecoderWav.h" #include "platform/CCFileUtils.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { AudioDecoder* AudioDecoderProvider::createAudioDecoder(SLEngineItf engineItf, const std::string &url, int bufferSizeInFrames, int sampleRate, const FdGetterCallback &fdGetterCallback) { @@ -90,4 +90,4 @@ void AudioDecoderProvider::destroyAudioDecoder(AudioDecoder** decoder) } } -}} // namespace cocos2d { namespace experimental { \ No newline at end of file +} // namespace cocos2d { \ No newline at end of file diff --git a/cocos/audio/android/AudioDecoderProvider.h b/cocos/audio/android/AudioDecoderProvider.h index 9b2e7e1cb4..8070af0e0e 100644 --- a/cocos/audio/android/AudioDecoderProvider.h +++ b/cocos/audio/android/AudioDecoderProvider.h @@ -27,7 +27,7 @@ THE SOFTWARE. #include "audio/android/OpenSLHelper.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { class AudioDecoder; @@ -38,4 +38,4 @@ public: static void destroyAudioDecoder(AudioDecoder** decoder); }; -}} // namespace cocos2d { namespace experimental { \ No newline at end of file +} // namespace cocos2d { \ No newline at end of file diff --git a/cocos/audio/android/AudioDecoderSLES.cpp b/cocos/audio/android/AudioDecoderSLES.cpp index bbcc9382b2..837126305b 100644 --- a/cocos/audio/android/AudioDecoderSLES.cpp +++ b/cocos/audio/android/AudioDecoderSLES.cpp @@ -28,7 +28,7 @@ THE SOFTWARE. #include "audio/android/AudioDecoderSLES.h" #include "platform/CCFileUtils.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { /* Explicitly requesting SL_IID_ANDROIDSIMPLEBUFFERQUEUE and SL_IID_PREFETCHSTATUS * on the UrlAudioPlayer object for decoding, SL_IID_METADATAEXTRACTION for retrieving the @@ -643,4 +643,4 @@ void AudioDecoderSLES::decodeToPcmCallback(SLAndroidSimpleBufferQueueItf queueIt queryAudioInfo(); } -}} // namespace cocos2d { namespace experimental { \ No newline at end of file +} // namespace cocos2d { \ No newline at end of file diff --git a/cocos/audio/android/AudioDecoderSLES.h b/cocos/audio/android/AudioDecoderSLES.h index 30795ab736..4055b8e5a1 100644 --- a/cocos/audio/android/AudioDecoderSLES.h +++ b/cocos/audio/android/AudioDecoderSLES.h @@ -29,7 +29,7 @@ THE SOFTWARE. #include #include -namespace cocos2d { namespace experimental { +namespace cocos2d { class AudioDecoderSLES : public AudioDecoder { @@ -94,4 +94,4 @@ private: friend class AudioDecoderProvider; }; -}} // namespace cocos2d { namespace experimental { \ No newline at end of file +} // namespace cocos2d { \ No newline at end of file diff --git a/cocos/audio/android/AudioDecoderWav.cpp b/cocos/audio/android/AudioDecoderWav.cpp index a89526ced1..b55dc0dd8c 100644 --- a/cocos/audio/android/AudioDecoderWav.cpp +++ b/cocos/audio/android/AudioDecoderWav.cpp @@ -29,7 +29,7 @@ THE SOFTWARE. #include "audio/android/tinysndfile.h" #include "platform/CCFileUtils.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { AudioDecoderWav::AudioDecoderWav() { @@ -110,4 +110,4 @@ bool AudioDecoderWav::decodeToPcm() return ret; } -}} // namespace cocos2d { namespace experimental { \ No newline at end of file +} // namespace cocos2d { \ No newline at end of file diff --git a/cocos/audio/android/AudioDecoderWav.h b/cocos/audio/android/AudioDecoderWav.h index 41d57e6bf0..4234f04c90 100644 --- a/cocos/audio/android/AudioDecoderWav.h +++ b/cocos/audio/android/AudioDecoderWav.h @@ -27,7 +27,7 @@ THE SOFTWARE. #include "audio/android/AudioDecoder.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { class AudioDecoderWav : public AudioDecoder { @@ -44,4 +44,4 @@ protected: friend class AudioDecoderProvider; }; -}} // namespace cocos2d { namespace experimental { \ No newline at end of file +} // namespace cocos2d { \ No newline at end of file diff --git a/cocos/audio/android/AudioEngine-inl.cpp b/cocos/audio/android/AudioEngine-inl.cpp index 81bd20f335..09bcd63f02 100644 --- a/cocos/audio/android/AudioEngine-inl.cpp +++ b/cocos/audio/android/AudioEngine-inl.cpp @@ -55,7 +55,6 @@ #include "audio/android/UrlAudioPlayer.h" using namespace cocos2d; -using namespace cocos2d::experimental; // Audio focus values synchronized with which in cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java static const int AUDIOFOCUS_GAIN = 0; diff --git a/cocos/audio/android/AudioEngine-inl.h b/cocos/audio/android/AudioEngine-inl.h index 9b68d43d25..cef13de5d4 100644 --- a/cocos/audio/android/AudioEngine-inl.h +++ b/cocos/audio/android/AudioEngine-inl.h @@ -43,8 +43,6 @@ NS_CC_BEGIN class EventCustom; class EventListener; -namespace experimental { - class IAudioPlayer; class AudioPlayerProvider; @@ -103,7 +101,7 @@ private: }; #endif // __AUDIO_ENGINE_INL_H_ - } + NS_CC_END #endif diff --git a/cocos/audio/android/AudioMixer.cpp b/cocos/audio/android/AudioMixer.cpp index 2b9e1baacf..cfd665a464 100644 --- a/cocos/audio/android/AudioMixer.cpp +++ b/cocos/audio/android/AudioMixer.cpp @@ -73,7 +73,7 @@ static const bool kUseFloat = false; // Set to default copy buffer size in frames for input processing. static const size_t kCopyBufferFrameCount = 256; -namespace cocos2d { namespace experimental { +namespace cocos2d { // ---------------------------------------------------------------------------- @@ -2098,4 +2098,4 @@ AudioMixer::process_hook_t AudioMixer::getProcessHook(int processType, uint32_t } // ---------------------------------------------------------------------------- -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AudioMixer.h b/cocos/audio/android/AudioMixer.h index dc2080d71f..dd90ab40a1 100644 --- a/cocos/audio/android/AudioMixer.h +++ b/cocos/audio/android/AudioMixer.h @@ -30,7 +30,7 @@ // FIXME This is actually unity gain, which might not be max in future, expressed in U.12 #define MAX_GAIN_INT AudioMixer::UNITY_GAIN_INT -namespace cocos2d { namespace experimental { +namespace cocos2d { // ---------------------------------------------------------------------------- @@ -386,4 +386,4 @@ private: }; // ---------------------------------------------------------------------------- -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AudioMixerController.cpp b/cocos/audio/android/AudioMixerController.cpp index 4ffb323c09..4a92029600 100644 --- a/cocos/audio/android/AudioMixerController.cpp +++ b/cocos/audio/android/AudioMixerController.cpp @@ -33,7 +33,7 @@ THE SOFTWARE. #include #include -namespace cocos2d { namespace experimental { +namespace cocos2d { AudioMixerController::AudioMixerController(int bufferSizeInFrames, int sampleRate, int channelCount) : _bufferSizeInFrames(bufferSizeInFrames) @@ -348,4 +348,4 @@ bool AudioMixerController::hasPlayingTacks() return false; } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AudioMixerController.h b/cocos/audio/android/AudioMixerController.h index ce2097010f..d8c08f3fbc 100644 --- a/cocos/audio/android/AudioMixerController.h +++ b/cocos/audio/android/AudioMixerController.h @@ -33,7 +33,7 @@ THE SOFTWARE. #include #include -namespace cocos2d { namespace experimental { +namespace cocos2d { class Track; class AudioMixer; @@ -85,4 +85,4 @@ private: std::atomic_bool _isMixingFrame; }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AudioMixerOps.h b/cocos/audio/android/AudioMixerOps.h index 1e74daeb26..4a37aabaaa 100644 --- a/cocos/audio/android/AudioMixerOps.h +++ b/cocos/audio/android/AudioMixerOps.h @@ -18,7 +18,7 @@ #include "audio/android/cutils/log.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { /* Behavior of is_same<>::value is true if the types are identical, * false otherwise. Identical to the STL std::is_same. @@ -446,5 +446,5 @@ inline void volumeMulti(TO* out, size_t frameCount, } } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AudioPlayerProvider.cpp b/cocos/audio/android/AudioPlayerProvider.cpp index e42506482f..12c55659c7 100644 --- a/cocos/audio/android/AudioPlayerProvider.cpp +++ b/cocos/audio/android/AudioPlayerProvider.cpp @@ -40,7 +40,7 @@ THE SOFTWARE. #include #include // for std::find_if -namespace cocos2d { namespace experimental { +namespace cocos2d { static int getSystemAPILevel() { @@ -516,4 +516,4 @@ void AudioPlayerProvider::resume() } } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AudioPlayerProvider.h b/cocos/audio/android/AudioPlayerProvider.h index 8b21984c30..3f72a39f1d 100644 --- a/cocos/audio/android/AudioPlayerProvider.h +++ b/cocos/audio/android/AudioPlayerProvider.h @@ -33,7 +33,7 @@ THE SOFTWARE. #include #include -namespace cocos2d { namespace experimental { +namespace cocos2d { // Manage PcmAudioPlayer& UrlAudioPlayer class PcmAudioPlayer; @@ -124,5 +124,5 @@ private: ThreadPool* _threadPool; }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AudioResampler.cpp b/cocos/audio/android/AudioResampler.cpp index ab12289360..134821b964 100644 --- a/cocos/audio/android/AudioResampler.cpp +++ b/cocos/audio/android/AudioResampler.cpp @@ -39,7 +39,7 @@ -namespace cocos2d { namespace experimental { +namespace cocos2d { // ---------------------------------------------------------------------------- @@ -785,4 +785,4 @@ void AudioResamplerOrder1::AsmStereo16Loop(int16_t *in, int32_t* maxOutPt, int32 // ---------------------------------------------------------------------------- -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AudioResampler.h b/cocos/audio/android/AudioResampler.h index ee9185bb52..1e2a6ab23f 100644 --- a/cocos/audio/android/AudioResampler.h +++ b/cocos/audio/android/AudioResampler.h @@ -31,7 +31,7 @@ #include #include "audio/android/audio.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { class AudioResampler { @@ -178,4 +178,4 @@ private: }; // ---------------------------------------------------------------------------- -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AudioResamplerCubic.cpp b/cocos/audio/android/AudioResamplerCubic.cpp index 2b85321245..c2cbf13019 100644 --- a/cocos/audio/android/AudioResamplerCubic.cpp +++ b/cocos/audio/android/AudioResamplerCubic.cpp @@ -24,7 +24,7 @@ #include "audio/android/AudioResampler.h" #include "audio/android/AudioResamplerCubic.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { // ---------------------------------------------------------------------------- void AudioResamplerCubic::init() { @@ -188,4 +188,4 @@ save_state: } // ---------------------------------------------------------------------------- -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AudioResamplerCubic.h b/cocos/audio/android/AudioResamplerCubic.h index ef71b771f3..ab7145f1ff 100644 --- a/cocos/audio/android/AudioResamplerCubic.h +++ b/cocos/audio/android/AudioResamplerCubic.h @@ -22,7 +22,7 @@ #include "audio/android/AudioResampler.h" #include "audio/android/AudioBufferProvider.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { // ---------------------------------------------------------------------------- class AudioResamplerCubic : public AudioResampler { @@ -62,4 +62,4 @@ private: }; // ---------------------------------------------------------------------------- -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/AudioResamplerPublic.h b/cocos/audio/android/AudioResamplerPublic.h index 68f31ba60e..cb6e05bfb2 100644 --- a/cocos/audio/android/AudioResamplerPublic.h +++ b/cocos/audio/android/AudioResamplerPublic.h @@ -19,7 +19,7 @@ #include #include -namespace cocos2d { namespace experimental { +namespace cocos2d { // AUDIO_RESAMPLER_DOWN_RATIO_MAX is the maximum ratio between the original // audio sample rate and the target rate when downsampling, @@ -169,6 +169,6 @@ static inline bool isMusicRate(uint32_t sampleRate) { return sampleRate >= AUDIO_PROCESSING_MUSIC_RATE; } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { // --------------------------------------------------------------------------- diff --git a/cocos/audio/android/CCThreadPool.cpp b/cocos/audio/android/CCThreadPool.cpp index bc9213dfe9..9cdc6747b1 100644 --- a/cocos/audio/android/CCThreadPool.cpp +++ b/cocos/audio/android/CCThreadPool.cpp @@ -38,7 +38,7 @@ #define LOGD(...) printf(__VA_ARGS__) #endif -namespace cocos2d { namespace experimental { +namespace cocos2d { #define DEFAULT_THREAD_POOL_MIN_NUM (4) #define DEFAULT_THREAD_POOL_MAX_NUM (20) @@ -440,4 +440,4 @@ void ThreadPool::setThread(int tid) new(std::nothrow) std::thread(f)); // compiler may not support std::make_unique() } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/CCThreadPool.h b/cocos/audio/android/CCThreadPool.h index 6f20dc2833..b7783b4eb4 100644 --- a/cocos/audio/android/CCThreadPool.h +++ b/cocos/audio/android/CCThreadPool.h @@ -38,7 +38,7 @@ #include #include -namespace cocos2d { namespace experimental { +namespace cocos2d { /** * @addtogroup base @@ -234,4 +234,4 @@ private: // end of base group /// @} -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/IAudioPlayer.h b/cocos/audio/android/IAudioPlayer.h index c1e58c0203..61eefd523f 100644 --- a/cocos/audio/android/IAudioPlayer.h +++ b/cocos/audio/android/IAudioPlayer.h @@ -27,7 +27,7 @@ THE SOFTWARE. #include -namespace cocos2d { namespace experimental { +namespace cocos2d { class IAudioPlayer { @@ -86,4 +86,4 @@ public: virtual void setPlayEventCallback(const PlayEventCallback &playEventCallback) = 0; }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/ICallerThreadUtils.h b/cocos/audio/android/ICallerThreadUtils.h index 54ac681799..8363334d49 100644 --- a/cocos/audio/android/ICallerThreadUtils.h +++ b/cocos/audio/android/ICallerThreadUtils.h @@ -27,7 +27,7 @@ THE SOFTWARE. #include #include -namespace cocos2d { namespace experimental { +namespace cocos2d { class ICallerThreadUtils { @@ -39,4 +39,4 @@ public: virtual std::thread::id getCallerThreadId() = 0; }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/IVolumeProvider.h b/cocos/audio/android/IVolumeProvider.h index 076ac65b26..5aeb7c26de 100644 --- a/cocos/audio/android/IVolumeProvider.h +++ b/cocos/audio/android/IVolumeProvider.h @@ -26,7 +26,7 @@ THE SOFTWARE. #include "audio/android/audio_utils/include/audio_utils/minifloat.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { class IVolumeProvider { @@ -42,4 +42,4 @@ protected: { } }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/PcmAudioPlayer.cpp b/cocos/audio/android/PcmAudioPlayer.cpp index 2fbba41b0d..ab888809c5 100644 --- a/cocos/audio/android/PcmAudioPlayer.cpp +++ b/cocos/audio/android/PcmAudioPlayer.cpp @@ -30,7 +30,7 @@ THE SOFTWARE. #include "audio/android/AudioMixerController.h" #include "audio/android/ICallerThreadUtils.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { PcmAudioPlayer::PcmAudioPlayer(AudioMixerController * controller, ICallerThreadUtils* callerThreadUtils) : _id(-1) @@ -223,4 +223,4 @@ IAudioPlayer::State PcmAudioPlayer::getState() const return state; } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/PcmAudioPlayer.h b/cocos/audio/android/PcmAudioPlayer.h index aaacefc5a0..4959877dbc 100644 --- a/cocos/audio/android/PcmAudioPlayer.h +++ b/cocos/audio/android/PcmAudioPlayer.h @@ -29,7 +29,7 @@ THE SOFTWARE. #include "audio/android/PcmData.h" #include "audio/android/Track.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { class ICallerThreadUtils; class AudioMixerController; @@ -95,4 +95,4 @@ private: friend class AudioPlayerProvider; }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/PcmAudioService.cpp b/cocos/audio/android/PcmAudioService.cpp index e6aa23c848..70950e4fa8 100644 --- a/cocos/audio/android/PcmAudioService.cpp +++ b/cocos/audio/android/PcmAudioService.cpp @@ -28,7 +28,7 @@ THE SOFTWARE. #include "audio/android/PcmAudioService.h" #include "audio/android/AudioMixerController.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { static std::vector __silenceData; @@ -197,4 +197,4 @@ void PcmAudioService::resume() } } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/PcmAudioService.h b/cocos/audio/android/PcmAudioService.h index 27559f2c7f..cebb82f832 100644 --- a/cocos/audio/android/PcmAudioService.h +++ b/cocos/audio/android/PcmAudioService.h @@ -32,7 +32,7 @@ THE SOFTWARE. #include #include -namespace cocos2d { namespace experimental { +namespace cocos2d { class AudioMixerController; @@ -79,4 +79,4 @@ private: friend class AudioPlayerProvider; }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/PcmBufferProvider.cpp b/cocos/audio/android/PcmBufferProvider.cpp index 4ed2011c1a..82ca9b6293 100644 --- a/cocos/audio/android/PcmBufferProvider.cpp +++ b/cocos/audio/android/PcmBufferProvider.cpp @@ -35,7 +35,7 @@ THE SOFTWARE. #define ALOGVV(a...) do { } while (0) #endif -namespace cocos2d { namespace experimental { +namespace cocos2d { PcmBufferProvider::PcmBufferProvider() : _addr(nullptr) @@ -99,4 +99,4 @@ void PcmBufferProvider::reset() { _nextFrame = 0; } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/PcmBufferProvider.h b/cocos/audio/android/PcmBufferProvider.h index e5f5a2a7d5..253d9e9edb 100644 --- a/cocos/audio/android/PcmBufferProvider.h +++ b/cocos/audio/android/PcmBufferProvider.h @@ -30,7 +30,7 @@ THE SOFTWARE. #include #include -namespace cocos2d { namespace experimental { +namespace cocos2d { class PcmBufferProvider : public AudioBufferProvider { @@ -49,4 +49,4 @@ protected: size_t _unrel; // number of frames not yet released }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/PcmData.cpp b/cocos/audio/android/PcmData.cpp index a3bd8ddaa3..240aae8721 100644 --- a/cocos/audio/android/PcmData.cpp +++ b/cocos/audio/android/PcmData.cpp @@ -28,7 +28,7 @@ THE SOFTWARE. #include "audio/android/OpenSLHelper.h" #include "audio/android/PcmData.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { PcmData::PcmData() { @@ -136,4 +136,4 @@ std::string PcmData::toString() const return ret; } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/PcmData.h b/cocos/audio/android/PcmData.h index d0445e0cc0..18cf5cc162 100644 --- a/cocos/audio/android/PcmData.h +++ b/cocos/audio/android/PcmData.h @@ -30,7 +30,7 @@ THE SOFTWARE. #include #include -namespace cocos2d { namespace experimental { +namespace cocos2d { struct PcmData { @@ -63,4 +63,4 @@ struct PcmData std::string toString() const; }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/Track.cpp b/cocos/audio/android/Track.cpp index d2f7c9be4d..f93fcaedbc 100644 --- a/cocos/audio/android/Track.cpp +++ b/cocos/audio/android/Track.cpp @@ -30,7 +30,7 @@ THE SOFTWARE. #include -namespace cocos2d { namespace experimental { +namespace cocos2d { Track::Track(const PcmData &pcmData) : onStateChanged(nullptr) @@ -103,4 +103,4 @@ void Track::setState(State state) } }; -}} // namespace cocos2d { namespace experimental { \ No newline at end of file +} // namespace cocos2d { \ No newline at end of file diff --git a/cocos/audio/android/Track.h b/cocos/audio/android/Track.h index 09b8e2eb2f..cec7588011 100644 --- a/cocos/audio/android/Track.h +++ b/cocos/audio/android/Track.h @@ -32,7 +32,7 @@ THE SOFTWARE. #include #include -namespace cocos2d { namespace experimental { +namespace cocos2d { class Track : public PcmBufferProvider, public IVolumeProvider { @@ -104,4 +104,4 @@ private: friend class AudioMixerController; }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/UrlAudioPlayer.cpp b/cocos/audio/android/UrlAudioPlayer.cpp index ef073691c5..b05b0f45c4 100644 --- a/cocos/audio/android/UrlAudioPlayer.cpp +++ b/cocos/audio/android/UrlAudioPlayer.cpp @@ -34,12 +34,12 @@ THE SOFTWARE. namespace { std::mutex __playerContainerMutex; -std::vector __playerContainer; +std::vector __playerContainer; std::once_flag __onceFlag; } -namespace cocos2d { namespace experimental { +namespace cocos2d { class SLUrlAudioPlayerCallbackProxy { @@ -421,4 +421,4 @@ void UrlAudioPlayer::destroy() } } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/UrlAudioPlayer.h b/cocos/audio/android/UrlAudioPlayer.h index 16885effa8..22b4f4e28e 100644 --- a/cocos/audio/android/UrlAudioPlayer.h +++ b/cocos/audio/android/UrlAudioPlayer.h @@ -33,7 +33,7 @@ THE SOFTWARE. #include #include -namespace cocos2d { namespace experimental { +namespace cocos2d { class ICallerThreadUtils; class AssetFd; @@ -132,4 +132,4 @@ private: friend class AudioPlayerProvider; }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/android/utils/Errors.h b/cocos/audio/android/utils/Errors.h index a305cf5205..da8c7e6e47 100644 --- a/cocos/audio/android/utils/Errors.h +++ b/cocos/audio/android/utils/Errors.h @@ -20,7 +20,7 @@ #include #include -namespace cocos2d { namespace experimental { +namespace cocos2d { // use this type to return error codes #ifdef _WIN32 @@ -81,7 +81,7 @@ enum { # define NO_ERROR 0L #endif -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { // --------------------------------------------------------------------------- diff --git a/cocos/audio/android/utils/Utils.cpp b/cocos/audio/android/utils/Utils.cpp index bbd60ace04..7a40ae2d4c 100644 --- a/cocos/audio/android/utils/Utils.cpp +++ b/cocos/audio/android/utils/Utils.cpp @@ -25,11 +25,11 @@ THE SOFTWARE. #include "audio/android/utils/Utils.h" #include "platform/android/jni/JniHelper.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { int getSDKVersion() { return JniHelper::callStaticIntMethod("org.cocos2dx.lib.Cocos2dxHelper", "getSDKVersion"); } -}} // end of namespace cocos2d { namespace experimental +} // end of namespace cocos2d diff --git a/cocos/audio/android/utils/Utils.h b/cocos/audio/android/utils/Utils.h index 90ae035a4d..b48558bc1e 100644 --- a/cocos/audio/android/utils/Utils.h +++ b/cocos/audio/android/utils/Utils.h @@ -25,6 +25,6 @@ THE SOFTWARE. #include -namespace cocos2d { namespace experimental { +namespace cocos2d { extern int getSDKVersion(); -}} +} diff --git a/cocos/audio/apple/AudioCache.h b/cocos/audio/apple/AudioCache.h index 6174dcbdef..3052e8ba57 100644 --- a/cocos/audio/apple/AudioCache.h +++ b/cocos/audio/apple/AudioCache.h @@ -25,9 +25,6 @@ #pragma once -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC - #import #include @@ -38,7 +35,6 @@ #include "audio/apple/AudioMacros.h" NS_CC_BEGIN -namespace experimental{ class AudioEngineImpl; class AudioPlayer; @@ -111,6 +107,3 @@ protected: }; } -NS_CC_END - -#endif diff --git a/cocos/audio/apple/AudioCache.mm b/cocos/audio/apple/AudioCache.mm index 901c9a1b0f..fac5a1b091 100644 --- a/cocos/audio/apple/AudioCache.mm +++ b/cocos/audio/apple/AudioCache.mm @@ -25,9 +25,6 @@ #define LOG_TAG "AudioCache" -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC - #include "audio/apple/AudioCache.h" #import @@ -89,7 +86,6 @@ unsigned int __idIndex = 0; @end using namespace cocos2d; -using namespace cocos2d::experimental; AudioCache::AudioCache() : _format(-1) @@ -405,5 +401,3 @@ void AudioCache::invokingLoadCallbacks() _loadCallbacks.clear(); }); } - -#endif diff --git a/cocos/audio/apple/AudioDecoder.h b/cocos/audio/apple/AudioDecoder.h index 42fcf5e2ca..1739bbb629 100644 --- a/cocos/audio/apple/AudioDecoder.h +++ b/cocos/audio/apple/AudioDecoder.h @@ -28,7 +28,7 @@ #include #import -namespace cocos2d { namespace experimental { +namespace cocos2d { /** * @brief The class for decoding compressed audio file to PCM buffer. @@ -117,4 +117,4 @@ private: AudioStreamBasicDescription _outputFormat; }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/apple/AudioDecoder.mm b/cocos/audio/apple/AudioDecoder.mm index 5fc2bc3438..96e495e935 100644 --- a/cocos/audio/apple/AudioDecoder.mm +++ b/cocos/audio/apple/AudioDecoder.mm @@ -30,7 +30,7 @@ #define LOG_TAG "AudioDecoder" -namespace cocos2d { namespace experimental { +namespace cocos2d { AudioDecoder::AudioDecoder() : _isOpened(false) @@ -226,4 +226,4 @@ namespace cocos2d { namespace experimental { return _isOpened; } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/apple/AudioEngine-inl.h b/cocos/audio/apple/AudioEngine-inl.h index 4176b6df09..31e5b69cdc 100644 --- a/cocos/audio/apple/AudioEngine-inl.h +++ b/cocos/audio/apple/AudioEngine-inl.h @@ -22,12 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC - -#ifndef __AUDIO_ENGINE_INL_H_ -#define __AUDIO_ENGINE_INL_H_ +#pragma once #include #include @@ -39,7 +34,6 @@ NS_CC_BEGIN class Scheduler; -namespace experimental{ #define MAX_AUDIOINSTANCES 24 class AudioEngineImpl : public cocos2d::Ref @@ -89,7 +83,4 @@ private: int _currentAudioID; Scheduler* _scheduler; }; -} NS_CC_END -#endif // __AUDIO_ENGINE_INL_H_ -#endif diff --git a/cocos/audio/apple/AudioEngine-inl.mm b/cocos/audio/apple/AudioEngine-inl.mm index 81b8b86a89..64cf02bb86 100644 --- a/cocos/audio/apple/AudioEngine-inl.mm +++ b/cocos/audio/apple/AudioEngine-inl.mm @@ -25,9 +25,6 @@ #define LOG_TAG "AudioEngine-inl.mm" -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC - #include "audio/apple/AudioEngine-inl.h" #import @@ -44,7 +41,6 @@ #endif using namespace cocos2d; -using namespace cocos2d::experimental; static ALCdevice* s_ALDevice = nullptr; static ALCcontext* s_ALContext = nullptr; @@ -711,5 +707,3 @@ void AudioEngineImpl::uncacheAll() { _audioCaches.clear(); } - -#endif diff --git a/cocos/audio/apple/AudioPlayer.h b/cocos/audio/apple/AudioPlayer.h index db4c9a08aa..b88cf3fe9b 100644 --- a/cocos/audio/apple/AudioPlayer.h +++ b/cocos/audio/apple/AudioPlayer.h @@ -25,9 +25,6 @@ #pragma once -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC - #include "platform/CCPlatformMacros.h" #include "audio/apple/AudioMacros.h" @@ -38,7 +35,6 @@ #include NS_CC_BEGIN -namespace experimental{ class AudioCache; class AudioEngineImpl; @@ -91,7 +87,4 @@ protected: friend class AudioEngineImpl; }; -} NS_CC_END - -#endif diff --git a/cocos/audio/apple/AudioPlayer.mm b/cocos/audio/apple/AudioPlayer.mm index 4f5455c554..cd97915a56 100644 --- a/cocos/audio/apple/AudioPlayer.mm +++ b/cocos/audio/apple/AudioPlayer.mm @@ -25,9 +25,6 @@ #define LOG_TAG "AudioPlayer" -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC - #import #include "audio/apple/AudioPlayer.h" @@ -42,7 +39,6 @@ #endif using namespace cocos2d; -using namespace cocos2d::experimental; namespace { unsigned int __idIndex = 0; @@ -371,5 +367,3 @@ bool AudioPlayer::setTime(float time) } return false; } - -#endif diff --git a/cocos/audio/include/AudioEngine.h b/cocos/audio/include/AudioEngine.h index 090183a257..ce6a4aa9a7 100644 --- a/cocos/audio/include/AudioEngine.h +++ b/cocos/audio/include/AudioEngine.h @@ -43,8 +43,6 @@ */ NS_CC_BEGIN -namespace experimental { - /** * @class AudioProfile * @@ -368,7 +366,6 @@ protected: friend class AudioEngineImpl; }; -} // namespace experimental { NS_CC_END // end group diff --git a/cocos/audio/linux/AudioEngine-linux.cpp b/cocos/audio/linux/AudioEngine-linux.cpp index 0a9e89b860..80b886d894 100644 --- a/cocos/audio/linux/AudioEngine-linux.cpp +++ b/cocos/audio/linux/AudioEngine-linux.cpp @@ -34,7 +34,6 @@ #include "platform/CCFileUtils.h" using namespace cocos2d; -using namespace cocos2d::experimental; AudioEngineImpl * g_AudioEngineImpl = nullptr; diff --git a/cocos/audio/linux/AudioEngine-linux.h b/cocos/audio/linux/AudioEngine-linux.h index d52a152e5b..06c5659826 100644 --- a/cocos/audio/linux/AudioEngine-linux.h +++ b/cocos/audio/linux/AudioEngine-linux.h @@ -39,7 +39,7 @@ #include "base/CCRef.h" NS_CC_BEGIN - namespace experimental{ + #define MAX_AUDIOINSTANCES 32 class CC_DLL AudioEngineImpl : public cocos2d::Ref @@ -102,7 +102,7 @@ private: FMOD::System* pSystem; }; -} + NS_CC_END #endif // __AUDIO_ENGINE_LINUX_H_ #endif diff --git a/cocos/audio/win32/AudioCache.cpp b/cocos/audio/win32/AudioCache.cpp index 8c6d3c400d..702b6b62de 100644 --- a/cocos/audio/win32/AudioCache.cpp +++ b/cocos/audio/win32/AudioCache.cpp @@ -52,7 +52,6 @@ unsigned int __idIndex = 0; #define PCMDATA_CACHEMAXSIZE 1048576 using namespace cocos2d; -using namespace cocos2d::experimental; AudioCache::AudioCache() : _totalFrames(0) diff --git a/cocos/audio/win32/AudioCache.h b/cocos/audio/win32/AudioCache.h index b3c58f10ba..cb75fe918c 100644 --- a/cocos/audio/win32/AudioCache.h +++ b/cocos/audio/win32/AudioCache.h @@ -43,7 +43,6 @@ #include "audio/win32/AudioMacros.h" NS_CC_BEGIN -namespace experimental{ class AudioEngineImpl; class AudioPlayer; @@ -115,7 +114,6 @@ protected: friend class AudioPlayer; }; -} NS_CC_END #endif diff --git a/cocos/audio/win32/AudioDecoder.cpp b/cocos/audio/win32/AudioDecoder.cpp index 77d507777d..e05d1f9ec9 100644 --- a/cocos/audio/win32/AudioDecoder.cpp +++ b/cocos/audio/win32/AudioDecoder.cpp @@ -29,7 +29,7 @@ #define LOG_TAG "AudioDecoder" -namespace cocos2d { namespace experimental { +namespace cocos2d { AudioDecoder::AudioDecoder() : _isOpened(false) @@ -89,4 +89,4 @@ AudioDecoder::AudioDecoder() return _channelCount; } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/win32/AudioDecoder.h b/cocos/audio/win32/AudioDecoder.h index c7f321b8cd..ca466c94ba 100644 --- a/cocos/audio/win32/AudioDecoder.h +++ b/cocos/audio/win32/AudioDecoder.h @@ -29,7 +29,7 @@ #include "vorbis/vorbisfile.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { /** * @brief The class for decoding compressed audio file to PCM buffer. @@ -117,4 +117,4 @@ protected: friend class AudioDecoderManager; }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/win32/AudioDecoderManager.cpp b/cocos/audio/win32/AudioDecoderManager.cpp index 28ce2ca1e4..950c305355 100644 --- a/cocos/audio/win32/AudioDecoderManager.cpp +++ b/cocos/audio/win32/AudioDecoderManager.cpp @@ -33,7 +33,7 @@ THE SOFTWARE. #include "base/CCConsole.h" #include "mpg123.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { static bool __mp3Inited = false; @@ -67,5 +67,5 @@ void AudioDecoderManager::destroyDecoder(AudioDecoder* decoder) delete decoder; } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/win32/AudioDecoderManager.h b/cocos/audio/win32/AudioDecoderManager.h index ce80bdf1ff..d5295827a3 100644 --- a/cocos/audio/win32/AudioDecoderManager.h +++ b/cocos/audio/win32/AudioDecoderManager.h @@ -25,7 +25,7 @@ THE SOFTWARE. #pragma once -namespace cocos2d { namespace experimental { +namespace cocos2d { class AudioDecoder; @@ -38,5 +38,5 @@ public: static void destroyDecoder(AudioDecoder* decoder); }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/win32/AudioDecoderMp3.cpp b/cocos/audio/win32/AudioDecoderMp3.cpp index c343f888d1..e6d5b3a94d 100644 --- a/cocos/audio/win32/AudioDecoderMp3.cpp +++ b/cocos/audio/win32/AudioDecoderMp3.cpp @@ -32,7 +32,7 @@ #define LOG_TAG "AudioDecoderMp3" -namespace cocos2d { namespace experimental { +namespace cocos2d { static bool __mp3Inited = false; @@ -181,4 +181,4 @@ namespace cocos2d { namespace experimental { return static_cast(mpg123_tell(_mpg123handle)); } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/win32/AudioDecoderMp3.h b/cocos/audio/win32/AudioDecoderMp3.h index a11db607f3..41b642b7d9 100644 --- a/cocos/audio/win32/AudioDecoderMp3.h +++ b/cocos/audio/win32/AudioDecoderMp3.h @@ -29,7 +29,7 @@ struct mpg123_handle_struct; -namespace cocos2d { namespace experimental { +namespace cocos2d { /** * @brief The class for decoding compressed audio file to PCM buffer. @@ -83,4 +83,4 @@ protected: friend class AudioDecoderManager; }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/win32/AudioDecoderOgg.cpp b/cocos/audio/win32/AudioDecoderOgg.cpp index fc20453229..a5c5c7c6ab 100644 --- a/cocos/audio/win32/AudioDecoderOgg.cpp +++ b/cocos/audio/win32/AudioDecoderOgg.cpp @@ -29,7 +29,7 @@ #define LOG_TAG "AudioDecoderOgg" -namespace cocos2d { namespace experimental { +namespace cocos2d { AudioDecoderOgg::AudioDecoderOgg() { @@ -84,4 +84,4 @@ namespace cocos2d { namespace experimental { return static_cast(ov_pcm_tell(const_cast(&_vf))); } -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/win32/AudioDecoderOgg.h b/cocos/audio/win32/AudioDecoderOgg.h index 4c9ce9113c..13150677b1 100644 --- a/cocos/audio/win32/AudioDecoderOgg.h +++ b/cocos/audio/win32/AudioDecoderOgg.h @@ -29,7 +29,7 @@ #include "vorbis/vorbisfile.h" -namespace cocos2d { namespace experimental { +namespace cocos2d { /** * @brief The class for decoding compressed audio file to PCM buffer. @@ -79,4 +79,4 @@ protected: friend class AudioDecoderManager; }; -}} // namespace cocos2d { namespace experimental { +} // namespace cocos2d { diff --git a/cocos/audio/win32/AudioEngine-win32.cpp b/cocos/audio/win32/AudioEngine-win32.cpp index f779f4276e..168e445b1f 100644 --- a/cocos/audio/win32/AudioEngine-win32.cpp +++ b/cocos/audio/win32/AudioEngine-win32.cpp @@ -22,12 +22,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ -#define LOG_TAG "AudioEngine-Win32" - -#include "platform/CCPlatformConfig.h" - -#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 - #include "audio/win32/AudioEngine-win32.h" #ifdef OPENAL_PLAIN_INCLUDES @@ -45,6 +39,8 @@ #include +#define LOG_TAG "AudioEngine-Win32" + // log, CCLOG aren't threadsafe, since we uses sub threads for parsing pcm data, threadsafe log output // is needed. Define the following macros (ALOGV, ALOGD, ALOGI, ALOGW, ALOGE) for threadsafe log output. @@ -105,7 +101,6 @@ void audioLog(const char * format, ...) } using namespace cocos2d; -using namespace cocos2d::experimental; static ALCdevice *s_ALDevice = nullptr; static ALCcontext *s_ALContext = nullptr; @@ -516,5 +511,3 @@ void AudioEngineImpl::uncacheAll() { _audioCaches.clear(); } - -#endif diff --git a/cocos/audio/win32/AudioEngine-win32.h b/cocos/audio/win32/AudioEngine-win32.h index 132c662662..9cfd0f51b8 100644 --- a/cocos/audio/win32/AudioEngine-win32.h +++ b/cocos/audio/win32/AudioEngine-win32.h @@ -22,12 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ -#include "platform/CCPlatformConfig.h" - -#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 - -#ifndef __AUDIO_ENGINE_INL_H_ -#define __AUDIO_ENGINE_INL_H_ +#pragma once #include @@ -39,7 +34,6 @@ NS_CC_BEGIN class Scheduler; -namespace experimental { #define MAX_AUDIOINSTANCES 32 class CC_DLL AudioEngineImpl : public cocos2d::Ref @@ -86,8 +80,5 @@ private: int _currentAudioID; Scheduler* _scheduler; }; -} -NS_CC_END -#endif // __AUDIO_ENGINE_INL_H_ -#endif +NS_CC_END diff --git a/cocos/audio/win32/AudioPlayer.cpp b/cocos/audio/win32/AudioPlayer.cpp index 61b6800166..370c015982 100644 --- a/cocos/audio/win32/AudioPlayer.cpp +++ b/cocos/audio/win32/AudioPlayer.cpp @@ -22,12 +22,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - -#define LOG_TAG "AudioPlayer" - -#include "platform/CCPlatformConfig.h" - -#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 #include "audio/win32/AudioPlayer.h" #include "audio/win32/AudioCache.h" #include "platform/CCFileUtils.h" @@ -41,8 +35,9 @@ #define ALOGVV(...) do{} while(false) #endif +#define LOG_TAG "AudioPlayer" + using namespace cocos2d; -using namespace cocos2d::experimental; namespace { unsigned int __idIndex = 0; @@ -343,5 +338,3 @@ bool AudioPlayer::setTime(float time) } return false; } - -#endif diff --git a/cocos/audio/win32/AudioPlayer.h b/cocos/audio/win32/AudioPlayer.h index a7f8a579ed..362ede8fcf 100644 --- a/cocos/audio/win32/AudioPlayer.h +++ b/cocos/audio/win32/AudioPlayer.h @@ -22,13 +22,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - #pragma once -#include "platform/CCPlatformConfig.h" - -#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 - #include #include #include @@ -42,7 +37,6 @@ #include "platform/CCPlatformMacros.h" NS_CC_BEGIN -namespace experimental{ class AudioCache; class AudioEngineImpl; @@ -93,8 +87,4 @@ protected: friend class AudioEngineImpl; }; -} NS_CC_END - -#endif //CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 - diff --git a/cocos/editor-support/cocostudio/SimpleAudioEngine.cpp b/cocos/editor-support/cocostudio/SimpleAudioEngine.cpp index 4f4f79a656..452429c06b 100644 --- a/cocos/editor-support/cocostudio/SimpleAudioEngine.cpp +++ b/cocos/editor-support/cocostudio/SimpleAudioEngine.cpp @@ -28,7 +28,6 @@ using namespace CocosDenshion; using namespace cocos2d; -using namespace cocos2d::experimental; struct SimpleAudioEngineDelegate { SimpleAudioEngine * engine = nullptr; diff --git a/cocos/scripting/lua-bindings/CMakeLists.txt b/cocos/scripting/lua-bindings/CMakeLists.txt index 61100d6db0..ff22348108 100644 --- a/cocos/scripting/lua-bindings/CMakeLists.txt +++ b/cocos/scripting/lua-bindings/CMakeLists.txt @@ -30,7 +30,6 @@ set(lua_bindings_manual_headers manual/cocostudio/lua-cocos-studio-conversions.h manual/cocostudio/CustomGUIReader.h manual/ui/lua_cocos2dx_ui_manual.hpp - manual/ui/lua_cocos2dx_experimental_video_manual.hpp manual/controller/lua_cocos2dx_controller_manual.hpp ) @@ -46,7 +45,6 @@ set(lua_bindings_manual_files manual/CCComponentLua.cpp manual/cocos2d/LuaScriptHandlerMgr.cpp manual/cocos2d/lua_cocos2dx_deprecated.cpp - manual/cocos2d/lua_cocos2dx_experimental_manual.cpp manual/cocos2d/lua_cocos2dx_manual.cpp manual/cocos2d/lua_cocos2dx_physics_manual.cpp manual/3d/lua_cocos2dx_3d_manual.cpp @@ -63,7 +61,6 @@ set(lua_bindings_manual_files manual/network/lua_downloader.cpp #manual/spine/lua_cocos2dx_spine_manual.cpp manual/spine/LuaSkeletonAnimation.cpp - manual/ui/lua_cocos2dx_experimental_video_manual.cpp manual/ui/lua_cocos2dx_ui_manual.cpp manual/audioengine/lua_cocos2dx_audioengine_manual.cpp manual/physics3d/lua_cocos2dx_physics3d_manual.cpp @@ -76,13 +73,10 @@ set(lua_bindings_auto_headers auto/lua_cocos2dx_3d_auto.hpp auto/lua_cocos2dx_controller_auto.hpp auto/lua_cocos2dx_spine_auto.hpp - auto/lua_cocos2dx_experimental_webview_auto.hpp auto/lua_cocos2dx_studio_auto.hpp auto/lua_cocos2dx_auto.hpp - auto/lua_cocos2dx_experimental_video_auto.hpp auto/lua_cocos2dx_navmesh_auto.hpp auto/lua_cocos2dx_csloader_auto.hpp - auto/lua_cocos2dx_experimental_auto.hpp auto/lua_cocos2dx_physics3d_auto.hpp auto/lua_cocos2dx_ui_auto.hpp auto/lua_cocos2dx_physics_auto.hpp @@ -94,8 +88,6 @@ set(lua_bindings_auto_files auto/lua_cocos2dx_3d_auto.cpp auto/lua_cocos2dx_auto.cpp auto/lua_cocos2dx_controller_auto.cpp - auto/lua_cocos2dx_experimental_auto.cpp - auto/lua_cocos2dx_experimental_video_auto.cpp auto/lua_cocos2dx_extension_auto.cpp auto/lua_cocos2dx_physics_auto.cpp #auto/lua_cocos2dx_spine_auto.cpp @@ -121,25 +113,33 @@ if(APPLE) if(IOS) set(lua_bindings_manual_headers ${lua_bindings_manual_headers} - auto/lua_cocos2dx_experimental_webview_auto.hpp - manual/ui/lua_cocos2dx_experimental_webview_manual.hpp + manual/ui/lua_cocos2dx_webview_manual.hpp + auto/lua_cocos2dx_webview_auto.hpp + auto/lua_cocos2dx_video_auto.hpp + manual/ui/lua_cocos2dx_video_manual.hpp ) set(lua_bindings_manual_files ${lua_bindings_manual_files} - auto/lua_cocos2dx_experimental_webview_auto.cpp - manual/ui/lua_cocos2dx_experimental_webview_manual.cpp + manual/ui/lua_cocos2dx_webview_manual.cpp + auto/lua_cocos2dx_webview_auto.cpp + manual/ui/lua_cocos2dx_video_manual.cpp + auto/lua_cocos2dx_video_auto.cpp ) endif() elseif(ANDROID) set(lua_bindings_manual_headers ${lua_bindings_manual_headers} - auto/lua_cocos2dx_experimental_webview_auto.hpp - manual/ui/lua_cocos2dx_experimental_webview_manual.hpp + manual/ui/lua_cocos2dx_webview_manual.hpp + auto/lua_cocos2dx_webview_auto.hpp + auto/lua_cocos2dx_video_auto.hpp + manual/ui/lua_cocos2dx_video_manual.hpp ) set(lua_bindings_manual_files ${lua_bindings_manual_files} - auto/lua_cocos2dx_experimental_webview_auto.cpp - manual/ui/lua_cocos2dx_experimental_webview_manual.cpp + manual/ui/lua_cocos2dx_webview_manual.cpp + auto/lua_cocos2dx_webview_auto.cpp + manual/ui/lua_cocos2dx_video_manual.cpp + auto/lua_cocos2dx_video_auto.cpp ) endif() diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp index da3260f4f6..5e68b6204f 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp @@ -7,7 +7,7 @@ int lua_cocos2dx_audioengine_AudioProfile_constructor(lua_State* tolua_S) { int argc = 0; - cocos2d::experimental::AudioProfile* cobj = nullptr; + cocos2d::AudioProfile* cobj = nullptr; bool ok = true; #if COCOS2D_DEBUG >= 1 @@ -24,12 +24,12 @@ int lua_cocos2dx_audioengine_AudioProfile_constructor(lua_State* tolua_S) tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioProfile_constructor'", nullptr); return 0; } - cobj = new cocos2d::experimental::AudioProfile(); - tolua_pushusertype(tolua_S,(void*)cobj,"ccexp.AudioProfile"); + cobj = new cocos2d::AudioProfile(); + tolua_pushusertype(tolua_S,(void*)cobj,"cc.AudioProfile"); tolua_register_gc(tolua_S,lua_gettop(tolua_S)); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.AudioProfile:AudioProfile",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.AudioProfile:AudioProfile",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 @@ -47,15 +47,15 @@ static int lua_cocos2dx_audioengine_AudioProfile_finalize(lua_State* tolua_S) int lua_register_cocos2dx_audioengine_AudioProfile(lua_State* tolua_S) { - tolua_usertype(tolua_S,"ccexp.AudioProfile"); - tolua_cclass(tolua_S,"AudioProfile","ccexp.AudioProfile","",nullptr); + tolua_usertype(tolua_S,"cc.AudioProfile"); + tolua_cclass(tolua_S,"AudioProfile","cc.AudioProfile","",nullptr); tolua_beginmodule(tolua_S,"AudioProfile"); tolua_function(tolua_S,"new",lua_cocos2dx_audioengine_AudioProfile_constructor); tolua_endmodule(tolua_S); - std::string typeName = typeid(cocos2d::experimental::AudioProfile).name(); - g_luaType[typeName] = "ccexp.AudioProfile"; - g_typeCast["AudioProfile"] = "ccexp.AudioProfile"; + std::string typeName = typeid(cocos2d::AudioProfile).name(); + g_luaType[typeName] = "cc.AudioProfile"; + g_typeCast["AudioProfile"] = "cc.AudioProfile"; return 1; } @@ -69,7 +69,7 @@ int lua_cocos2dx_audioengine_AudioEngine_lazyInit(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -81,11 +81,11 @@ int lua_cocos2dx_audioengine_AudioEngine_lazyInit(lua_State* tolua_S) tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_lazyInit'", nullptr); return 0; } - bool ret = cocos2d::experimental::AudioEngine::lazyInit(); + bool ret = cocos2d::AudioEngine::lazyInit(); tolua_pushboolean(tolua_S,(bool)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:lazyInit",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:lazyInit",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -103,7 +103,7 @@ int lua_cocos2dx_audioengine_AudioEngine_setCurrentTime(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -112,18 +112,18 @@ int lua_cocos2dx_audioengine_AudioEngine_setCurrentTime(lua_State* tolua_S) { int arg0; double arg1; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.AudioEngine:setCurrentTime"); - ok &= luaval_to_number(tolua_S, 3,&arg1, "ccexp.AudioEngine:setCurrentTime"); + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.AudioEngine:setCurrentTime"); + ok &= luaval_to_number(tolua_S, 3,&arg1, "cc.AudioEngine:setCurrentTime"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_setCurrentTime'", nullptr); return 0; } - bool ret = cocos2d::experimental::AudioEngine::setCurrentTime(arg0, arg1); + bool ret = cocos2d::AudioEngine::setCurrentTime(arg0, arg1); tolua_pushboolean(tolua_S,(bool)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:setCurrentTime",argc, 2); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:setCurrentTime",argc, 2); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -141,7 +141,7 @@ int lua_cocos2dx_audioengine_AudioEngine_getVolume(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -149,17 +149,17 @@ int lua_cocos2dx_audioengine_AudioEngine_getVolume(lua_State* tolua_S) if (argc == 1) { int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.AudioEngine:getVolume"); + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.AudioEngine:getVolume"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_getVolume'", nullptr); return 0; } - double ret = cocos2d::experimental::AudioEngine::getVolume(arg0); + double ret = cocos2d::AudioEngine::getVolume(arg0); tolua_pushnumber(tolua_S,(lua_Number)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:getVolume",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:getVolume",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -177,7 +177,7 @@ int lua_cocos2dx_audioengine_AudioEngine_uncache(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -185,17 +185,17 @@ int lua_cocos2dx_audioengine_AudioEngine_uncache(lua_State* tolua_S) if (argc == 1) { std::string arg0; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.AudioEngine:uncache"); + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.AudioEngine:uncache"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_uncache'", nullptr); return 0; } - cocos2d::experimental::AudioEngine::uncache(arg0); + cocos2d::AudioEngine::uncache(arg0); lua_settop(tolua_S, 1); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:uncache",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:uncache",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -213,7 +213,7 @@ int lua_cocos2dx_audioengine_AudioEngine_resumeAll(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -225,11 +225,11 @@ int lua_cocos2dx_audioengine_AudioEngine_resumeAll(lua_State* tolua_S) tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_resumeAll'", nullptr); return 0; } - cocos2d::experimental::AudioEngine::resumeAll(); + cocos2d::AudioEngine::resumeAll(); lua_settop(tolua_S, 1); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:resumeAll",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:resumeAll",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -247,7 +247,7 @@ int lua_cocos2dx_audioengine_AudioEngine_stopAll(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -259,11 +259,11 @@ int lua_cocos2dx_audioengine_AudioEngine_stopAll(lua_State* tolua_S) tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_stopAll'", nullptr); return 0; } - cocos2d::experimental::AudioEngine::stopAll(); + cocos2d::AudioEngine::stopAll(); lua_settop(tolua_S, 1); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:stopAll",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:stopAll",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -281,7 +281,7 @@ int lua_cocos2dx_audioengine_AudioEngine_pause(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -289,17 +289,17 @@ int lua_cocos2dx_audioengine_AudioEngine_pause(lua_State* tolua_S) if (argc == 1) { int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.AudioEngine:pause"); + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.AudioEngine:pause"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_pause'", nullptr); return 0; } - cocos2d::experimental::AudioEngine::pause(arg0); + cocos2d::AudioEngine::pause(arg0); lua_settop(tolua_S, 1); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:pause",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:pause",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -317,7 +317,7 @@ int lua_cocos2dx_audioengine_AudioEngine_getMaxAudioInstance(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -329,11 +329,11 @@ int lua_cocos2dx_audioengine_AudioEngine_getMaxAudioInstance(lua_State* tolua_S) tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_getMaxAudioInstance'", nullptr); return 0; } - int ret = cocos2d::experimental::AudioEngine::getMaxAudioInstance(); + int ret = cocos2d::AudioEngine::getMaxAudioInstance(); tolua_pushnumber(tolua_S,(lua_Number)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:getMaxAudioInstance",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:getMaxAudioInstance",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -351,7 +351,7 @@ int lua_cocos2dx_audioengine_AudioEngine_isEnabled(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -363,11 +363,11 @@ int lua_cocos2dx_audioengine_AudioEngine_isEnabled(lua_State* tolua_S) tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_isEnabled'", nullptr); return 0; } - bool ret = cocos2d::experimental::AudioEngine::isEnabled(); + bool ret = cocos2d::AudioEngine::isEnabled(); tolua_pushboolean(tolua_S,(bool)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:isEnabled",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:isEnabled",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -385,7 +385,7 @@ int lua_cocos2dx_audioengine_AudioEngine_getCurrentTime(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -393,17 +393,17 @@ int lua_cocos2dx_audioengine_AudioEngine_getCurrentTime(lua_State* tolua_S) if (argc == 1) { int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.AudioEngine:getCurrentTime"); + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.AudioEngine:getCurrentTime"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_getCurrentTime'", nullptr); return 0; } - double ret = cocos2d::experimental::AudioEngine::getCurrentTime(arg0); + double ret = cocos2d::AudioEngine::getCurrentTime(arg0); tolua_pushnumber(tolua_S,(lua_Number)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:getCurrentTime",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:getCurrentTime",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -421,7 +421,7 @@ int lua_cocos2dx_audioengine_AudioEngine_setMaxAudioInstance(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -429,17 +429,17 @@ int lua_cocos2dx_audioengine_AudioEngine_setMaxAudioInstance(lua_State* tolua_S) if (argc == 1) { int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.AudioEngine:setMaxAudioInstance"); + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.AudioEngine:setMaxAudioInstance"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_setMaxAudioInstance'", nullptr); return 0; } - bool ret = cocos2d::experimental::AudioEngine::setMaxAudioInstance(arg0); + bool ret = cocos2d::AudioEngine::setMaxAudioInstance(arg0); tolua_pushboolean(tolua_S,(bool)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:setMaxAudioInstance",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:setMaxAudioInstance",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -457,7 +457,7 @@ int lua_cocos2dx_audioengine_AudioEngine_isLoop(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -465,17 +465,17 @@ int lua_cocos2dx_audioengine_AudioEngine_isLoop(lua_State* tolua_S) if (argc == 1) { int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.AudioEngine:isLoop"); + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.AudioEngine:isLoop"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_isLoop'", nullptr); return 0; } - bool ret = cocos2d::experimental::AudioEngine::isLoop(arg0); + bool ret = cocos2d::AudioEngine::isLoop(arg0); tolua_pushboolean(tolua_S,(bool)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:isLoop",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:isLoop",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -493,7 +493,7 @@ int lua_cocos2dx_audioengine_AudioEngine_pauseAll(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -505,11 +505,11 @@ int lua_cocos2dx_audioengine_AudioEngine_pauseAll(lua_State* tolua_S) tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_pauseAll'", nullptr); return 0; } - cocos2d::experimental::AudioEngine::pauseAll(); + cocos2d::AudioEngine::pauseAll(); lua_settop(tolua_S, 1); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:pauseAll",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:pauseAll",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -527,7 +527,7 @@ int lua_cocos2dx_audioengine_AudioEngine_uncacheAll(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -539,11 +539,11 @@ int lua_cocos2dx_audioengine_AudioEngine_uncacheAll(lua_State* tolua_S) tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_uncacheAll'", nullptr); return 0; } - cocos2d::experimental::AudioEngine::uncacheAll(); + cocos2d::AudioEngine::uncacheAll(); lua_settop(tolua_S, 1); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:uncacheAll",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:uncacheAll",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -561,7 +561,7 @@ int lua_cocos2dx_audioengine_AudioEngine_setVolume(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -570,18 +570,18 @@ int lua_cocos2dx_audioengine_AudioEngine_setVolume(lua_State* tolua_S) { int arg0; double arg1; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.AudioEngine:setVolume"); - ok &= luaval_to_number(tolua_S, 3,&arg1, "ccexp.AudioEngine:setVolume"); + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.AudioEngine:setVolume"); + ok &= luaval_to_number(tolua_S, 3,&arg1, "cc.AudioEngine:setVolume"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_setVolume'", nullptr); return 0; } - cocos2d::experimental::AudioEngine::setVolume(arg0, arg1); + cocos2d::AudioEngine::setVolume(arg0, arg1); lua_settop(tolua_S, 1); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:setVolume",argc, 2); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:setVolume",argc, 2); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -598,7 +598,7 @@ int lua_cocos2dx_audioengine_AudioEngine_preload(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S)-1; @@ -608,7 +608,7 @@ int lua_cocos2dx_audioengine_AudioEngine_preload(lua_State* tolua_S) if (argc == 2) { std::string arg0; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.AudioEngine:preload"); + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.AudioEngine:preload"); if (!ok) { break; } std::function arg1; do { @@ -617,7 +617,7 @@ int lua_cocos2dx_audioengine_AudioEngine_preload(lua_State* tolua_S) } while(0) ; if (!ok) { break; } - cocos2d::experimental::AudioEngine::preload(arg0, arg1); + cocos2d::AudioEngine::preload(arg0, arg1); lua_settop(tolua_S, 1); return 1; } @@ -628,15 +628,15 @@ int lua_cocos2dx_audioengine_AudioEngine_preload(lua_State* tolua_S) if (argc == 1) { std::string arg0; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.AudioEngine:preload"); + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.AudioEngine:preload"); if (!ok) { break; } - cocos2d::experimental::AudioEngine::preload(arg0); + cocos2d::AudioEngine::preload(arg0); lua_settop(tolua_S, 1); return 1; } } while (0); ok = true; - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d", "ccexp.AudioEngine:preload",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d", "cc.AudioEngine:preload",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -654,7 +654,7 @@ int lua_cocos2dx_audioengine_AudioEngine_setEnabled(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -662,17 +662,17 @@ int lua_cocos2dx_audioengine_AudioEngine_setEnabled(lua_State* tolua_S) if (argc == 1) { bool arg0; - ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccexp.AudioEngine:setEnabled"); + ok &= luaval_to_boolean(tolua_S, 2,&arg0, "cc.AudioEngine:setEnabled"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_setEnabled'", nullptr); return 0; } - cocos2d::experimental::AudioEngine::setEnabled(arg0); + cocos2d::AudioEngine::setEnabled(arg0); lua_settop(tolua_S, 1); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:setEnabled",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:setEnabled",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -690,7 +690,7 @@ int lua_cocos2dx_audioengine_AudioEngine_play2d(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -698,13 +698,13 @@ int lua_cocos2dx_audioengine_AudioEngine_play2d(lua_State* tolua_S) if (argc == 1) { std::string arg0; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.AudioEngine:play2d"); + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.AudioEngine:play2d"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_play2d'", nullptr); return 0; } - int ret = cocos2d::experimental::AudioEngine::play2d(arg0); + int ret = cocos2d::AudioEngine::play2d(arg0); tolua_pushnumber(tolua_S,(lua_Number)ret); return 1; } @@ -712,14 +712,14 @@ int lua_cocos2dx_audioengine_AudioEngine_play2d(lua_State* tolua_S) { std::string arg0; bool arg1; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.AudioEngine:play2d"); - ok &= luaval_to_boolean(tolua_S, 3,&arg1, "ccexp.AudioEngine:play2d"); + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.AudioEngine:play2d"); + ok &= luaval_to_boolean(tolua_S, 3,&arg1, "cc.AudioEngine:play2d"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_play2d'", nullptr); return 0; } - int ret = cocos2d::experimental::AudioEngine::play2d(arg0, arg1); + int ret = cocos2d::AudioEngine::play2d(arg0, arg1); tolua_pushnumber(tolua_S,(lua_Number)ret); return 1; } @@ -728,15 +728,15 @@ int lua_cocos2dx_audioengine_AudioEngine_play2d(lua_State* tolua_S) std::string arg0; bool arg1; double arg2; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.AudioEngine:play2d"); - ok &= luaval_to_boolean(tolua_S, 3,&arg1, "ccexp.AudioEngine:play2d"); - ok &= luaval_to_number(tolua_S, 4,&arg2, "ccexp.AudioEngine:play2d"); + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.AudioEngine:play2d"); + ok &= luaval_to_boolean(tolua_S, 3,&arg1, "cc.AudioEngine:play2d"); + ok &= luaval_to_number(tolua_S, 4,&arg2, "cc.AudioEngine:play2d"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_play2d'", nullptr); return 0; } - int ret = cocos2d::experimental::AudioEngine::play2d(arg0, arg1, arg2); + int ret = cocos2d::AudioEngine::play2d(arg0, arg1, arg2); tolua_pushnumber(tolua_S,(lua_Number)ret); return 1; } @@ -745,21 +745,21 @@ int lua_cocos2dx_audioengine_AudioEngine_play2d(lua_State* tolua_S) std::string arg0; bool arg1; double arg2; - const cocos2d::experimental::AudioProfile* arg3; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.AudioEngine:play2d"); - ok &= luaval_to_boolean(tolua_S, 3,&arg1, "ccexp.AudioEngine:play2d"); - ok &= luaval_to_number(tolua_S, 4,&arg2, "ccexp.AudioEngine:play2d"); - ok &= luaval_to_object(tolua_S, 5, "ccexp.AudioProfile",&arg3, "ccexp.AudioEngine:play2d"); + const cocos2d::AudioProfile* arg3; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.AudioEngine:play2d"); + ok &= luaval_to_boolean(tolua_S, 3,&arg1, "cc.AudioEngine:play2d"); + ok &= luaval_to_number(tolua_S, 4,&arg2, "cc.AudioEngine:play2d"); + ok &= luaval_to_object(tolua_S, 5, "cc.AudioProfile",&arg3, "cc.AudioEngine:play2d"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_play2d'", nullptr); return 0; } - int ret = cocos2d::experimental::AudioEngine::play2d(arg0, arg1, arg2, arg3); + int ret = cocos2d::AudioEngine::play2d(arg0, arg1, arg2, arg3); tolua_pushnumber(tolua_S,(lua_Number)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:play2d",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:play2d",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -777,7 +777,7 @@ int lua_cocos2dx_audioengine_AudioEngine_getState(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -785,17 +785,17 @@ int lua_cocos2dx_audioengine_AudioEngine_getState(lua_State* tolua_S) if (argc == 1) { int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.AudioEngine:getState"); + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.AudioEngine:getState"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_getState'", nullptr); return 0; } - int ret = (int)cocos2d::experimental::AudioEngine::getState(arg0); + int ret = (int)cocos2d::AudioEngine::getState(arg0); tolua_pushnumber(tolua_S,(lua_Number)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:getState",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:getState",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -813,7 +813,7 @@ int lua_cocos2dx_audioengine_AudioEngine_resume(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -821,17 +821,17 @@ int lua_cocos2dx_audioengine_AudioEngine_resume(lua_State* tolua_S) if (argc == 1) { int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.AudioEngine:resume"); + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.AudioEngine:resume"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_resume'", nullptr); return 0; } - cocos2d::experimental::AudioEngine::resume(arg0); + cocos2d::AudioEngine::resume(arg0); lua_settop(tolua_S, 1); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:resume",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:resume",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -849,7 +849,7 @@ int lua_cocos2dx_audioengine_AudioEngine_stop(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -857,17 +857,17 @@ int lua_cocos2dx_audioengine_AudioEngine_stop(lua_State* tolua_S) if (argc == 1) { int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.AudioEngine:stop"); + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.AudioEngine:stop"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_stop'", nullptr); return 0; } - cocos2d::experimental::AudioEngine::stop(arg0); + cocos2d::AudioEngine::stop(arg0); lua_settop(tolua_S, 1); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:stop",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:stop",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -885,7 +885,7 @@ int lua_cocos2dx_audioengine_AudioEngine_end(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -897,11 +897,11 @@ int lua_cocos2dx_audioengine_AudioEngine_end(lua_State* tolua_S) tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_end'", nullptr); return 0; } - cocos2d::experimental::AudioEngine::end(); + cocos2d::AudioEngine::end(); lua_settop(tolua_S, 1); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:end",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:end",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -919,7 +919,7 @@ int lua_cocos2dx_audioengine_AudioEngine_getDuration(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -927,17 +927,17 @@ int lua_cocos2dx_audioengine_AudioEngine_getDuration(lua_State* tolua_S) if (argc == 1) { int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.AudioEngine:getDuration"); + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.AudioEngine:getDuration"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_getDuration'", nullptr); return 0; } - double ret = cocos2d::experimental::AudioEngine::getDuration(arg0); + double ret = cocos2d::AudioEngine::getDuration(arg0); tolua_pushnumber(tolua_S,(lua_Number)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:getDuration",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:getDuration",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -955,7 +955,7 @@ int lua_cocos2dx_audioengine_AudioEngine_setLoop(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -964,18 +964,18 @@ int lua_cocos2dx_audioengine_AudioEngine_setLoop(lua_State* tolua_S) { int arg0; bool arg1; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.AudioEngine:setLoop"); - ok &= luaval_to_boolean(tolua_S, 3,&arg1, "ccexp.AudioEngine:setLoop"); + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.AudioEngine:setLoop"); + ok &= luaval_to_boolean(tolua_S, 3,&arg1, "cc.AudioEngine:setLoop"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_setLoop'", nullptr); return 0; } - cocos2d::experimental::AudioEngine::setLoop(arg0, arg1); + cocos2d::AudioEngine::setLoop(arg0, arg1); lua_settop(tolua_S, 1); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:setLoop",argc, 2); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:setLoop",argc, 2); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -993,7 +993,7 @@ int lua_cocos2dx_audioengine_AudioEngine_getDefaultProfile(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -1005,11 +1005,11 @@ int lua_cocos2dx_audioengine_AudioEngine_getDefaultProfile(lua_State* tolua_S) tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_getDefaultProfile'", nullptr); return 0; } - cocos2d::experimental::AudioProfile* ret = cocos2d::experimental::AudioEngine::getDefaultProfile(); - object_to_luaval(tolua_S, "ccexp.AudioProfile",(cocos2d::experimental::AudioProfile*)ret); + cocos2d::AudioProfile* ret = cocos2d::AudioEngine::getDefaultProfile(); + object_to_luaval(tolua_S, "cc.AudioProfile",(cocos2d::AudioProfile*)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:getDefaultProfile",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:getDefaultProfile",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -1026,7 +1026,7 @@ int lua_cocos2dx_audioengine_AudioEngine_getProfile(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S)-1; @@ -1036,10 +1036,10 @@ int lua_cocos2dx_audioengine_AudioEngine_getProfile(lua_State* tolua_S) if (argc == 1) { std::string arg0; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.AudioEngine:getProfile"); + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.AudioEngine:getProfile"); if (!ok) { break; } - cocos2d::experimental::AudioProfile* ret = cocos2d::experimental::AudioEngine::getProfile(arg0); - object_to_luaval(tolua_S, "ccexp.AudioProfile",(cocos2d::experimental::AudioProfile*)ret); + cocos2d::AudioProfile* ret = cocos2d::AudioEngine::getProfile(arg0); + object_to_luaval(tolua_S, "cc.AudioProfile",(cocos2d::AudioProfile*)ret); return 1; } } while (0); @@ -1049,15 +1049,15 @@ int lua_cocos2dx_audioengine_AudioEngine_getProfile(lua_State* tolua_S) if (argc == 1) { int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.AudioEngine:getProfile"); + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.AudioEngine:getProfile"); if (!ok) { break; } - cocos2d::experimental::AudioProfile* ret = cocos2d::experimental::AudioEngine::getProfile(arg0); - object_to_luaval(tolua_S, "ccexp.AudioProfile",(cocos2d::experimental::AudioProfile*)ret); + cocos2d::AudioProfile* ret = cocos2d::AudioEngine::getProfile(arg0); + object_to_luaval(tolua_S, "cc.AudioProfile",(cocos2d::AudioProfile*)ret); return 1; } } while (0); ok = true; - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d", "ccexp.AudioEngine:getProfile",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d", "cc.AudioEngine:getProfile",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -1075,7 +1075,7 @@ int lua_cocos2dx_audioengine_AudioEngine_getPlayingAudioCount(lua_State* tolua_S #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -1087,11 +1087,11 @@ int lua_cocos2dx_audioengine_AudioEngine_getPlayingAudioCount(lua_State* tolua_S tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_getPlayingAudioCount'", nullptr); return 0; } - int ret = cocos2d::experimental::AudioEngine::getPlayingAudioCount(); + int ret = cocos2d::AudioEngine::getPlayingAudioCount(); tolua_pushnumber(tolua_S,(lua_Number)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:getPlayingAudioCount",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:getPlayingAudioCount",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -1107,8 +1107,8 @@ static int lua_cocos2dx_audioengine_AudioEngine_finalize(lua_State* tolua_S) int lua_register_cocos2dx_audioengine_AudioEngine(lua_State* tolua_S) { - tolua_usertype(tolua_S,"ccexp.AudioEngine"); - tolua_cclass(tolua_S,"AudioEngine","ccexp.AudioEngine","",nullptr); + tolua_usertype(tolua_S,"cc.AudioEngine"); + tolua_cclass(tolua_S,"AudioEngine","cc.AudioEngine","",nullptr); tolua_beginmodule(tolua_S,"AudioEngine"); tolua_function(tolua_S,"lazyInit", lua_cocos2dx_audioengine_AudioEngine_lazyInit); @@ -1139,17 +1139,17 @@ int lua_register_cocos2dx_audioengine_AudioEngine(lua_State* tolua_S) tolua_function(tolua_S,"getProfile", lua_cocos2dx_audioengine_AudioEngine_getProfile); tolua_function(tolua_S,"getPlayingAudioCount", lua_cocos2dx_audioengine_AudioEngine_getPlayingAudioCount); tolua_endmodule(tolua_S); - std::string typeName = typeid(cocos2d::experimental::AudioEngine).name(); - g_luaType[typeName] = "ccexp.AudioEngine"; - g_typeCast["AudioEngine"] = "ccexp.AudioEngine"; + std::string typeName = typeid(cocos2d::AudioEngine).name(); + g_luaType[typeName] = "cc.AudioEngine"; + g_typeCast["AudioEngine"] = "cc.AudioEngine"; return 1; } TOLUA_API int register_all_cocos2dx_audioengine(lua_State* tolua_S) { tolua_open(tolua_S); - tolua_module(tolua_S,"ccexp",0); - tolua_beginmodule(tolua_S,"ccexp"); + tolua_module(tolua_S,"cc",0); + tolua_beginmodule(tolua_S,"cc"); lua_register_cocos2dx_audioengine_AudioProfile(tolua_S); lua_register_cocos2dx_audioengine_AudioEngine(tolua_S); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp index 141b0e15b6..8d9d9e4457 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp @@ -103081,6 +103081,1869 @@ int lua_register_cocos2dx_TileMapAtlas(lua_State* tolua_S) return 1; } +int lua_cocos2dx_FastTMXLayer_getPositionAt(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_getPositionAt'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::Vec2 arg0; + + ok &= luaval_to_vec2(tolua_S, 2, &arg0, "cc.FastTMXLayer:getPositionAt"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_getPositionAt'", nullptr); + return 0; + } + cocos2d::Vec2 ret = cobj->getPositionAt(arg0); + vec2_to_luaval(tolua_S, ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:getPositionAt",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_getPositionAt'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_setLayerOrientation(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_setLayerOrientation'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + int arg0; + + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.FastTMXLayer:setLayerOrientation"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_setLayerOrientation'", nullptr); + return 0; + } + cobj->setLayerOrientation(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:setLayerOrientation",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_setLayerOrientation'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_getLayerSize(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_getLayerSize'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_getLayerSize'", nullptr); + return 0; + } + const cocos2d::Size& ret = cobj->getLayerSize(); + size_to_luaval(tolua_S, ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:getLayerSize",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_getLayerSize'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_setMapTileSize(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_setMapTileSize'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::Size arg0; + + ok &= luaval_to_size(tolua_S, 2, &arg0, "cc.FastTMXLayer:setMapTileSize"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_setMapTileSize'", nullptr); + return 0; + } + cobj->setMapTileSize(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:setMapTileSize",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_setMapTileSize'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_getLayerOrientation(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_getLayerOrientation'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_getLayerOrientation'", nullptr); + return 0; + } + int ret = cobj->getLayerOrientation(); + tolua_pushnumber(tolua_S,(lua_Number)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:getLayerOrientation",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_getLayerOrientation'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_setProperties(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_setProperties'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::ValueMap arg0; + + ok &= luaval_to_ccvaluemap(tolua_S, 2, &arg0, "cc.FastTMXLayer:setProperties"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_setProperties'", nullptr); + return 0; + } + cobj->setProperties(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:setProperties",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_setProperties'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_setLayerName(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_setLayerName'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.FastTMXLayer:setLayerName"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_setLayerName'", nullptr); + return 0; + } + cobj->setLayerName(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:setLayerName",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_setLayerName'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_removeTileAt(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_removeTileAt'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::Vec2 arg0; + + ok &= luaval_to_vec2(tolua_S, 2, &arg0, "cc.FastTMXLayer:removeTileAt"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_removeTileAt'", nullptr); + return 0; + } + cobj->removeTileAt(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:removeTileAt",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_removeTileAt'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_getProperties(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_getProperties'", nullptr); + return 0; + } +#endif + argc = lua_gettop(tolua_S)-1; + do{ + if (argc == 0) { + cocos2d::ValueMap& ret = cobj->getProperties(); + ccvaluemap_to_luaval(tolua_S, ret); + return 1; + } + }while(0); + ok = true; + do{ + if (argc == 0) { + const cocos2d::ValueMap& ret = cobj->getProperties(); + ccvaluemap_to_luaval(tolua_S, ret); + return 1; + } + }while(0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:getProperties",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_getProperties'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_setupTiles(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_setupTiles'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_setupTiles'", nullptr); + return 0; + } + cobj->setupTiles(); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:setupTiles",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_setupTiles'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_setupTileSprite(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_setupTileSprite'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 3) + { + cocos2d::Sprite* arg0; + cocos2d::Vec2 arg1; + unsigned int arg2; + + ok &= luaval_to_object(tolua_S, 2, "cc.Sprite",&arg0, "cc.FastTMXLayer:setupTileSprite"); + + ok &= luaval_to_vec2(tolua_S, 3, &arg1, "cc.FastTMXLayer:setupTileSprite"); + + ok &= luaval_to_uint32(tolua_S, 4,&arg2, "cc.FastTMXLayer:setupTileSprite"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_setupTileSprite'", nullptr); + return 0; + } + cobj->setupTileSprite(arg0, arg1, arg2); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:setupTileSprite",argc, 3); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_setupTileSprite'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_setTileGID(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_setTileGID'", nullptr); + return 0; + } +#endif + argc = lua_gettop(tolua_S)-1; + do{ + if (argc == 3) { + int arg0; + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.FastTMXLayer:setTileGID"); + + if (!ok) { break; } + cocos2d::Vec2 arg1; + ok &= luaval_to_vec2(tolua_S, 3, &arg1, "cc.FastTMXLayer:setTileGID"); + + if (!ok) { break; } + cocos2d::TMXTileFlags_ arg2; + ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "cc.FastTMXLayer:setTileGID"); + + if (!ok) { break; } + cobj->setTileGID(arg0, arg1, arg2); + lua_settop(tolua_S, 1); + return 1; + } + }while(0); + ok = true; + do{ + if (argc == 2) { + int arg0; + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.FastTMXLayer:setTileGID"); + + if (!ok) { break; } + cocos2d::Vec2 arg1; + ok &= luaval_to_vec2(tolua_S, 3, &arg1, "cc.FastTMXLayer:setTileGID"); + + if (!ok) { break; } + cobj->setTileGID(arg0, arg1); + lua_settop(tolua_S, 1); + return 1; + } + }while(0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:setTileGID",argc, 2); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_setTileGID'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_getMapTileSize(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_getMapTileSize'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_getMapTileSize'", nullptr); + return 0; + } + const cocos2d::Size& ret = cobj->getMapTileSize(); + size_to_luaval(tolua_S, ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:getMapTileSize",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_getMapTileSize'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_getProperty(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_getProperty'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.FastTMXLayer:getProperty"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_getProperty'", nullptr); + return 0; + } + cocos2d::Value ret = cobj->getProperty(arg0); + ccvalue_to_luaval(tolua_S, ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:getProperty",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_getProperty'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_setLayerSize(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_setLayerSize'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::Size arg0; + + ok &= luaval_to_size(tolua_S, 2, &arg0, "cc.FastTMXLayer:setLayerSize"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_setLayerSize'", nullptr); + return 0; + } + cobj->setLayerSize(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:setLayerSize",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_setLayerSize'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_getLayerName(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_getLayerName'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_getLayerName'", nullptr); + return 0; + } + const std::string& ret = cobj->getLayerName(); + lua_pushlstring(tolua_S,ret.c_str(),ret.length()); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:getLayerName",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_getLayerName'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_setTileSet(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_setTileSet'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::TMXTilesetInfo* arg0; + + ok &= luaval_to_object(tolua_S, 2, "cc.TMXTilesetInfo",&arg0, "cc.FastTMXLayer:setTileSet"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_setTileSet'", nullptr); + return 0; + } + cobj->setTileSet(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:setTileSet",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_setTileSet'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_getTileSet(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_getTileSet'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_getTileSet'", nullptr); + return 0; + } + cocos2d::TMXTilesetInfo* ret = cobj->getTileSet(); + object_to_luaval(tolua_S, "cc.TMXTilesetInfo",(cocos2d::TMXTilesetInfo*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:getTileSet",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_getTileSet'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_getTileAt(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_getTileAt'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::Vec2 arg0; + + ok &= luaval_to_vec2(tolua_S, 2, &arg0, "cc.FastTMXLayer:getTileAt"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_getTileAt'", nullptr); + return 0; + } + cocos2d::Sprite* ret = cobj->getTileAt(arg0); + object_to_luaval(tolua_S, "cc.Sprite",(cocos2d::Sprite*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:getTileAt",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_getTileAt'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXLayer_create(lua_State* tolua_S) +{ + int argc = 0; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertable(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S) - 1; + + if (argc == 3) + { + cocos2d::TMXTilesetInfo* arg0; + cocos2d::TMXLayerInfo* arg1; + cocos2d::TMXMapInfo* arg2; + ok &= luaval_to_object(tolua_S, 2, "cc.TMXTilesetInfo",&arg0, "cc.FastTMXLayer:create"); + ok &= luaval_to_object(tolua_S, 3, "cc.TMXLayerInfo",&arg1, "cc.FastTMXLayer:create"); + ok &= luaval_to_object(tolua_S, 4, "cc.TMXMapInfo",&arg2, "cc.FastTMXLayer:create"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_create'", nullptr); + return 0; + } + cocos2d::FastTMXLayer* ret = cocos2d::FastTMXLayer::create(arg0, arg1, arg2); + object_to_luaval(tolua_S, "cc.FastTMXLayer",(cocos2d::FastTMXLayer*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.FastTMXLayer:create",argc, 3); + return 0; +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_create'.",&tolua_err); +#endif + return 0; +} +int lua_cocos2dx_FastTMXLayer_constructor(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXLayer_constructor'", nullptr); + return 0; + } + cobj = new cocos2d::FastTMXLayer(); + cobj->autorelease(); + int ID = (int)cobj->_ID ; + int* luaID = &cobj->_luaID ; + toluafix_pushusertype_ccobject(tolua_S, ID, luaID, (void*)cobj,"cc.FastTMXLayer"); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:FastTMXLayer",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_constructor'.",&tolua_err); +#endif + + return 0; +} + +static int lua_cocos2dx_FastTMXLayer_finalize(lua_State* tolua_S) +{ + printf("luabindings: finalizing LUA object (FastTMXLayer)"); + return 0; +} + +int lua_register_cocos2dx_FastTMXLayer(lua_State* tolua_S) +{ + tolua_usertype(tolua_S,"cc.FastTMXLayer"); + tolua_cclass(tolua_S,"FastTMXLayer","cc.FastTMXLayer","cc.Node",nullptr); + + tolua_beginmodule(tolua_S,"FastTMXLayer"); + tolua_function(tolua_S,"new",lua_cocos2dx_FastTMXLayer_constructor); + tolua_function(tolua_S,"getPositionAt",lua_cocos2dx_FastTMXLayer_getPositionAt); + tolua_function(tolua_S,"setLayerOrientation",lua_cocos2dx_FastTMXLayer_setLayerOrientation); + tolua_function(tolua_S,"getLayerSize",lua_cocos2dx_FastTMXLayer_getLayerSize); + tolua_function(tolua_S,"setMapTileSize",lua_cocos2dx_FastTMXLayer_setMapTileSize); + tolua_function(tolua_S,"getLayerOrientation",lua_cocos2dx_FastTMXLayer_getLayerOrientation); + tolua_function(tolua_S,"setProperties",lua_cocos2dx_FastTMXLayer_setProperties); + tolua_function(tolua_S,"setLayerName",lua_cocos2dx_FastTMXLayer_setLayerName); + tolua_function(tolua_S,"removeTileAt",lua_cocos2dx_FastTMXLayer_removeTileAt); + tolua_function(tolua_S,"getProperties",lua_cocos2dx_FastTMXLayer_getProperties); + tolua_function(tolua_S,"setupTiles",lua_cocos2dx_FastTMXLayer_setupTiles); + tolua_function(tolua_S,"setupTileSprite",lua_cocos2dx_FastTMXLayer_setupTileSprite); + tolua_function(tolua_S,"setTileGID",lua_cocos2dx_FastTMXLayer_setTileGID); + tolua_function(tolua_S,"getMapTileSize",lua_cocos2dx_FastTMXLayer_getMapTileSize); + tolua_function(tolua_S,"getProperty",lua_cocos2dx_FastTMXLayer_getProperty); + tolua_function(tolua_S,"setLayerSize",lua_cocos2dx_FastTMXLayer_setLayerSize); + tolua_function(tolua_S,"getLayerName",lua_cocos2dx_FastTMXLayer_getLayerName); + tolua_function(tolua_S,"setTileSet",lua_cocos2dx_FastTMXLayer_setTileSet); + tolua_function(tolua_S,"getTileSet",lua_cocos2dx_FastTMXLayer_getTileSet); + tolua_function(tolua_S,"getTileAt",lua_cocos2dx_FastTMXLayer_getTileAt); + tolua_function(tolua_S,"create", lua_cocos2dx_FastTMXLayer_create); + tolua_endmodule(tolua_S); + std::string typeName = typeid(cocos2d::FastTMXLayer).name(); + g_luaType[typeName] = "cc.FastTMXLayer"; + g_typeCast["FastTMXLayer"] = "cc.FastTMXLayer"; + return 1; +} + +int lua_cocos2dx_FastTMXTiledMap_setObjectGroups(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXTiledMap* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXTiledMap*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXTiledMap_setObjectGroups'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::Vector arg0; + + ok &= luaval_to_ccvector(tolua_S, 2, &arg0, "cc.FastTMXTiledMap:setObjectGroups"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXTiledMap_setObjectGroups'", nullptr); + return 0; + } + cobj->setObjectGroups(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXTiledMap:setObjectGroups",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_setObjectGroups'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXTiledMap_getProperty(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXTiledMap* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXTiledMap*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXTiledMap_getProperty'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.FastTMXTiledMap:getProperty"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXTiledMap_getProperty'", nullptr); + return 0; + } + cocos2d::Value ret = cobj->getProperty(arg0); + ccvalue_to_luaval(tolua_S, ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXTiledMap:getProperty",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_getProperty'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXTiledMap_setMapSize(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXTiledMap* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXTiledMap*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXTiledMap_setMapSize'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::Size arg0; + + ok &= luaval_to_size(tolua_S, 2, &arg0, "cc.FastTMXTiledMap:setMapSize"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXTiledMap_setMapSize'", nullptr); + return 0; + } + cobj->setMapSize(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXTiledMap:setMapSize",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_setMapSize'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXTiledMap_getObjectGroup(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXTiledMap* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXTiledMap*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXTiledMap_getObjectGroup'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.FastTMXTiledMap:getObjectGroup"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXTiledMap_getObjectGroup'", nullptr); + return 0; + } + cocos2d::TMXObjectGroup* ret = cobj->getObjectGroup(arg0); + object_to_luaval(tolua_S, "cc.TMXObjectGroup",(cocos2d::TMXObjectGroup*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXTiledMap:getObjectGroup",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_getObjectGroup'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXTiledMap_getObjectGroups(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXTiledMap* cobj = nullptr; + bool ok = true; +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + cobj = (cocos2d::FastTMXTiledMap*)tolua_tousertype(tolua_S,1,0); +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXTiledMap_getObjectGroups'", nullptr); + return 0; + } +#endif + argc = lua_gettop(tolua_S)-1; + do{ + if (argc == 0) { + cocos2d::Vector& ret = cobj->getObjectGroups(); + ccvector_to_luaval(tolua_S, ret); + return 1; + } + }while(0); + ok = true; + do{ + if (argc == 0) { + const cocos2d::Vector& ret = cobj->getObjectGroups(); + ccvector_to_luaval(tolua_S, ret); + return 1; + } + }while(0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXTiledMap:getObjectGroups",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_getObjectGroups'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXTiledMap_getTileSize(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXTiledMap* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXTiledMap*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXTiledMap_getTileSize'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXTiledMap_getTileSize'", nullptr); + return 0; + } + const cocos2d::Size& ret = cobj->getTileSize(); + size_to_luaval(tolua_S, ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXTiledMap:getTileSize",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_getTileSize'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXTiledMap_getMapSize(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXTiledMap* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXTiledMap*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXTiledMap_getMapSize'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXTiledMap_getMapSize'", nullptr); + return 0; + } + const cocos2d::Size& ret = cobj->getMapSize(); + size_to_luaval(tolua_S, ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXTiledMap:getMapSize",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_getMapSize'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXTiledMap_getProperties(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXTiledMap* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXTiledMap*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXTiledMap_getProperties'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXTiledMap_getProperties'", nullptr); + return 0; + } + const cocos2d::ValueMap& ret = cobj->getProperties(); + ccvaluemap_to_luaval(tolua_S, ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXTiledMap:getProperties",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_getProperties'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXTiledMap_getPropertiesForGID(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXTiledMap* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXTiledMap*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXTiledMap_getPropertiesForGID'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + int arg0; + + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.FastTMXTiledMap:getPropertiesForGID"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXTiledMap_getPropertiesForGID'", nullptr); + return 0; + } + cocos2d::Value ret = cobj->getPropertiesForGID(arg0); + ccvalue_to_luaval(tolua_S, ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXTiledMap:getPropertiesForGID",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_getPropertiesForGID'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXTiledMap_setTileSize(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXTiledMap* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXTiledMap*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXTiledMap_setTileSize'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::Size arg0; + + ok &= luaval_to_size(tolua_S, 2, &arg0, "cc.FastTMXTiledMap:setTileSize"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXTiledMap_setTileSize'", nullptr); + return 0; + } + cobj->setTileSize(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXTiledMap:setTileSize",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_setTileSize'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXTiledMap_setProperties(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXTiledMap* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXTiledMap*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXTiledMap_setProperties'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::ValueMap arg0; + + ok &= luaval_to_ccvaluemap(tolua_S, 2, &arg0, "cc.FastTMXTiledMap:setProperties"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXTiledMap_setProperties'", nullptr); + return 0; + } + cobj->setProperties(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXTiledMap:setProperties",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_setProperties'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXTiledMap_getLayer(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXTiledMap* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXTiledMap*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXTiledMap_getLayer'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.FastTMXTiledMap:getLayer"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXTiledMap_getLayer'", nullptr); + return 0; + } + cocos2d::FastTMXLayer* ret = cobj->getLayer(arg0); + object_to_luaval(tolua_S, "cc.FastTMXLayer",(cocos2d::FastTMXLayer*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXTiledMap:getLayer",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_getLayer'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXTiledMap_getMapOrientation(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXTiledMap* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXTiledMap*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXTiledMap_getMapOrientation'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXTiledMap_getMapOrientation'", nullptr); + return 0; + } + int ret = cobj->getMapOrientation(); + tolua_pushnumber(tolua_S,(lua_Number)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXTiledMap:getMapOrientation",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_getMapOrientation'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXTiledMap_setMapOrientation(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXTiledMap* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXTiledMap*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXTiledMap_setMapOrientation'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + int arg0; + + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.FastTMXTiledMap:setMapOrientation"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXTiledMap_setMapOrientation'", nullptr); + return 0; + } + cobj->setMapOrientation(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXTiledMap:setMapOrientation",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_setMapOrientation'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_FastTMXTiledMap_create(lua_State* tolua_S) +{ + int argc = 0; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertable(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S) - 1; + + if (argc == 1) + { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.FastTMXTiledMap:create"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXTiledMap_create'", nullptr); + return 0; + } + cocos2d::FastTMXTiledMap* ret = cocos2d::FastTMXTiledMap::create(arg0); + object_to_luaval(tolua_S, "cc.FastTMXTiledMap",(cocos2d::FastTMXTiledMap*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.FastTMXTiledMap:create",argc, 1); + return 0; +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_create'.",&tolua_err); +#endif + return 0; +} +int lua_cocos2dx_FastTMXTiledMap_createWithXML(lua_State* tolua_S) +{ + int argc = 0; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertable(tolua_S,1,"cc.FastTMXTiledMap",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S) - 1; + + if (argc == 2) + { + std::string arg0; + std::string arg1; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.FastTMXTiledMap:createWithXML"); + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.FastTMXTiledMap:createWithXML"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FastTMXTiledMap_createWithXML'", nullptr); + return 0; + } + cocos2d::FastTMXTiledMap* ret = cocos2d::FastTMXTiledMap::createWithXML(arg0, arg1); + object_to_luaval(tolua_S, "cc.FastTMXTiledMap",(cocos2d::FastTMXTiledMap*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.FastTMXTiledMap:createWithXML",argc, 2); + return 0; +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXTiledMap_createWithXML'.",&tolua_err); +#endif + return 0; +} +static int lua_cocos2dx_FastTMXTiledMap_finalize(lua_State* tolua_S) +{ + printf("luabindings: finalizing LUA object (FastTMXTiledMap)"); + return 0; +} + +int lua_register_cocos2dx_FastTMXTiledMap(lua_State* tolua_S) +{ + tolua_usertype(tolua_S,"cc.FastTMXTiledMap"); + tolua_cclass(tolua_S,"FastTMXTiledMap","cc.FastTMXTiledMap","cc.Node",nullptr); + + tolua_beginmodule(tolua_S,"FastTMXTiledMap"); + tolua_function(tolua_S,"setObjectGroups",lua_cocos2dx_FastTMXTiledMap_setObjectGroups); + tolua_function(tolua_S,"getProperty",lua_cocos2dx_FastTMXTiledMap_getProperty); + tolua_function(tolua_S,"setMapSize",lua_cocos2dx_FastTMXTiledMap_setMapSize); + tolua_function(tolua_S,"getObjectGroup",lua_cocos2dx_FastTMXTiledMap_getObjectGroup); + tolua_function(tolua_S,"getObjectGroups",lua_cocos2dx_FastTMXTiledMap_getObjectGroups); + tolua_function(tolua_S,"getTileSize",lua_cocos2dx_FastTMXTiledMap_getTileSize); + tolua_function(tolua_S,"getMapSize",lua_cocos2dx_FastTMXTiledMap_getMapSize); + tolua_function(tolua_S,"getProperties",lua_cocos2dx_FastTMXTiledMap_getProperties); + tolua_function(tolua_S,"getPropertiesForGID",lua_cocos2dx_FastTMXTiledMap_getPropertiesForGID); + tolua_function(tolua_S,"setTileSize",lua_cocos2dx_FastTMXTiledMap_setTileSize); + tolua_function(tolua_S,"setProperties",lua_cocos2dx_FastTMXTiledMap_setProperties); + tolua_function(tolua_S,"getLayer",lua_cocos2dx_FastTMXTiledMap_getLayer); + tolua_function(tolua_S,"getMapOrientation",lua_cocos2dx_FastTMXTiledMap_getMapOrientation); + tolua_function(tolua_S,"setMapOrientation",lua_cocos2dx_FastTMXTiledMap_setMapOrientation); + tolua_function(tolua_S,"create", lua_cocos2dx_FastTMXTiledMap_create); + tolua_function(tolua_S,"createWithXML", lua_cocos2dx_FastTMXTiledMap_createWithXML); + tolua_endmodule(tolua_S); + std::string typeName = typeid(cocos2d::FastTMXTiledMap).name(); + g_luaType[typeName] = "cc.FastTMXTiledMap"; + g_typeCast["FastTMXTiledMap"] = "cc.FastTMXTiledMap"; + return 1; +} + int lua_cocos2dx_MotionStreak3D_reset(lua_State* tolua_S) { int argc = 0; @@ -104245,6 +106108,7 @@ TOLUA_API int register_all_cocos2dx(lua_State* tolua_S) lua_register_cocos2dx_EaseBounceIn(tolua_S); lua_register_cocos2dx_Camera(tolua_S); lua_register_cocos2dx_TMXObjectGroup(tolua_S); + lua_register_cocos2dx_FastTMXTiledMap(tolua_S); lua_register_cocos2dx_ParticleGalaxy(tolua_S); lua_register_cocos2dx_Twirl(tolua_S); lua_register_cocos2dx_MenuItemLabel(tolua_S); @@ -104278,6 +106142,7 @@ TOLUA_API int register_all_cocos2dx(lua_State* tolua_S) lua_register_cocos2dx_SpriteFrame(tolua_S); lua_register_cocos2dx_Liquid(tolua_S); lua_register_cocos2dx_UserDefault(tolua_S); + lua_register_cocos2dx_FastTMXLayer(tolua_S); lua_register_cocos2dx_TransitionZoomFlipX(tolua_S); lua_register_cocos2dx_EventFocus(tolua_S); lua_register_cocos2dx_TransitionFade(tolua_S); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp index e377d2ed2c..3e1cc6c6fe 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp @@ -2273,6 +2273,45 @@ int register_all_cocos2dx(lua_State* tolua_S); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_auto.cpp deleted file mode 100644 index a50523af58..0000000000 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_auto.cpp +++ /dev/null @@ -1,1882 +0,0 @@ -#include "scripting/lua-bindings/auto/lua_cocos2dx_experimental_auto.hpp" -#include "2d/CCFastTMXLayer.h" -#include "2d/CCFastTMXTiledMap.h" -#include "scripting/lua-bindings/manual/tolua_fix.h" -#include "scripting/lua-bindings/manual/LuaBasicConversions.h" - -int lua_cocos2dx_experimental_TMXLayer_getPositionAt(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_getPositionAt'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::Vec2 arg0; - - ok &= luaval_to_vec2(tolua_S, 2, &arg0, "ccexp.TMXLayer:getPositionAt"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_getPositionAt'", nullptr); - return 0; - } - cocos2d::Vec2 ret = cobj->getPositionAt(arg0); - vec2_to_luaval(tolua_S, ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:getPositionAt",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_getPositionAt'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_setLayerOrientation(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_setLayerOrientation'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - int arg0; - - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.TMXLayer:setLayerOrientation"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_setLayerOrientation'", nullptr); - return 0; - } - cobj->setLayerOrientation(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:setLayerOrientation",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_setLayerOrientation'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_getLayerSize(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_getLayerSize'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_getLayerSize'", nullptr); - return 0; - } - const cocos2d::Size& ret = cobj->getLayerSize(); - size_to_luaval(tolua_S, ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:getLayerSize",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_getLayerSize'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_setMapTileSize(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_setMapTileSize'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::Size arg0; - - ok &= luaval_to_size(tolua_S, 2, &arg0, "ccexp.TMXLayer:setMapTileSize"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_setMapTileSize'", nullptr); - return 0; - } - cobj->setMapTileSize(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:setMapTileSize",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_setMapTileSize'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_getLayerOrientation(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_getLayerOrientation'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_getLayerOrientation'", nullptr); - return 0; - } - int ret = cobj->getLayerOrientation(); - tolua_pushnumber(tolua_S,(lua_Number)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:getLayerOrientation",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_getLayerOrientation'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_setProperties(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_setProperties'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::ValueMap arg0; - - ok &= luaval_to_ccvaluemap(tolua_S, 2, &arg0, "ccexp.TMXLayer:setProperties"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_setProperties'", nullptr); - return 0; - } - cobj->setProperties(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:setProperties",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_setProperties'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_setLayerName(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_setLayerName'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.TMXLayer:setLayerName"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_setLayerName'", nullptr); - return 0; - } - cobj->setLayerName(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:setLayerName",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_setLayerName'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_removeTileAt(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_removeTileAt'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::Vec2 arg0; - - ok &= luaval_to_vec2(tolua_S, 2, &arg0, "ccexp.TMXLayer:removeTileAt"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_removeTileAt'", nullptr); - return 0; - } - cobj->removeTileAt(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:removeTileAt",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_removeTileAt'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_getProperties(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_getProperties'", nullptr); - return 0; - } -#endif - argc = lua_gettop(tolua_S)-1; - do{ - if (argc == 0) { - cocos2d::ValueMap& ret = cobj->getProperties(); - ccvaluemap_to_luaval(tolua_S, ret); - return 1; - } - }while(0); - ok = true; - do{ - if (argc == 0) { - const cocos2d::ValueMap& ret = cobj->getProperties(); - ccvaluemap_to_luaval(tolua_S, ret); - return 1; - } - }while(0); - ok = true; - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:getProperties",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_getProperties'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_setupTiles(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_setupTiles'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_setupTiles'", nullptr); - return 0; - } - cobj->setupTiles(); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:setupTiles",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_setupTiles'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_setupTileSprite(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_setupTileSprite'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 3) - { - cocos2d::Sprite* arg0; - cocos2d::Vec2 arg1; - unsigned int arg2; - - ok &= luaval_to_object(tolua_S, 2, "cc.Sprite",&arg0, "ccexp.TMXLayer:setupTileSprite"); - - ok &= luaval_to_vec2(tolua_S, 3, &arg1, "ccexp.TMXLayer:setupTileSprite"); - - ok &= luaval_to_uint32(tolua_S, 4,&arg2, "ccexp.TMXLayer:setupTileSprite"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_setupTileSprite'", nullptr); - return 0; - } - cobj->setupTileSprite(arg0, arg1, arg2); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:setupTileSprite",argc, 3); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_setupTileSprite'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_setTileGID(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_setTileGID'", nullptr); - return 0; - } -#endif - argc = lua_gettop(tolua_S)-1; - do{ - if (argc == 3) { - int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.TMXLayer:setTileGID"); - - if (!ok) { break; } - cocos2d::Vec2 arg1; - ok &= luaval_to_vec2(tolua_S, 3, &arg1, "ccexp.TMXLayer:setTileGID"); - - if (!ok) { break; } - cocos2d::TMXTileFlags_ arg2; - ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "ccexp.TMXLayer:setTileGID"); - - if (!ok) { break; } - cobj->setTileGID(arg0, arg1, arg2); - lua_settop(tolua_S, 1); - return 1; - } - }while(0); - ok = true; - do{ - if (argc == 2) { - int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.TMXLayer:setTileGID"); - - if (!ok) { break; } - cocos2d::Vec2 arg1; - ok &= luaval_to_vec2(tolua_S, 3, &arg1, "ccexp.TMXLayer:setTileGID"); - - if (!ok) { break; } - cobj->setTileGID(arg0, arg1); - lua_settop(tolua_S, 1); - return 1; - } - }while(0); - ok = true; - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:setTileGID",argc, 2); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_setTileGID'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_getMapTileSize(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_getMapTileSize'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_getMapTileSize'", nullptr); - return 0; - } - const cocos2d::Size& ret = cobj->getMapTileSize(); - size_to_luaval(tolua_S, ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:getMapTileSize",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_getMapTileSize'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_getProperty(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_getProperty'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.TMXLayer:getProperty"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_getProperty'", nullptr); - return 0; - } - cocos2d::Value ret = cobj->getProperty(arg0); - ccvalue_to_luaval(tolua_S, ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:getProperty",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_getProperty'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_setLayerSize(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_setLayerSize'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::Size arg0; - - ok &= luaval_to_size(tolua_S, 2, &arg0, "ccexp.TMXLayer:setLayerSize"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_setLayerSize'", nullptr); - return 0; - } - cobj->setLayerSize(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:setLayerSize",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_setLayerSize'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_getLayerName(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_getLayerName'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_getLayerName'", nullptr); - return 0; - } - const std::string& ret = cobj->getLayerName(); - lua_pushlstring(tolua_S,ret.c_str(),ret.length()); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:getLayerName",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_getLayerName'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_setTileSet(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_setTileSet'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::TMXTilesetInfo* arg0; - - ok &= luaval_to_object(tolua_S, 2, "cc.TMXTilesetInfo",&arg0, "ccexp.TMXLayer:setTileSet"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_setTileSet'", nullptr); - return 0; - } - cobj->setTileSet(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:setTileSet",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_setTileSet'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_getTileSet(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_getTileSet'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_getTileSet'", nullptr); - return 0; - } - cocos2d::TMXTilesetInfo* ret = cobj->getTileSet(); - object_to_luaval(tolua_S, "cc.TMXTilesetInfo",(cocos2d::TMXTilesetInfo*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:getTileSet",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_getTileSet'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_getTileAt(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_getTileAt'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::Vec2 arg0; - - ok &= luaval_to_vec2(tolua_S, 2, &arg0, "ccexp.TMXLayer:getTileAt"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_getTileAt'", nullptr); - return 0; - } - cocos2d::Sprite* ret = cobj->getTileAt(arg0); - object_to_luaval(tolua_S, "cc.Sprite",(cocos2d::Sprite*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:getTileAt",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_getTileAt'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_create(lua_State* tolua_S) -{ - int argc = 0; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - argc = lua_gettop(tolua_S) - 1; - - if (argc == 3) - { - cocos2d::TMXTilesetInfo* arg0; - cocos2d::TMXLayerInfo* arg1; - cocos2d::TMXMapInfo* arg2; - ok &= luaval_to_object(tolua_S, 2, "cc.TMXTilesetInfo",&arg0, "ccexp.TMXLayer:create"); - ok &= luaval_to_object(tolua_S, 3, "cc.TMXLayerInfo",&arg1, "ccexp.TMXLayer:create"); - ok &= luaval_to_object(tolua_S, 4, "cc.TMXMapInfo",&arg2, "ccexp.TMXLayer:create"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_create'", nullptr); - return 0; - } - cocos2d::experimental::TMXLayer* ret = cocos2d::experimental::TMXLayer::create(arg0, arg1, arg2); - object_to_luaval(tolua_S, "ccexp.TMXLayer",(cocos2d::experimental::TMXLayer*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.TMXLayer:create",argc, 3); - return 0; -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_create'.",&tolua_err); -#endif - return 0; -} -int lua_cocos2dx_experimental_TMXLayer_constructor(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXLayer_constructor'", nullptr); - return 0; - } - cobj = new cocos2d::experimental::TMXLayer(); - cobj->autorelease(); - int ID = (int)cobj->_ID ; - int* luaID = &cobj->_luaID ; - toluafix_pushusertype_ccobject(tolua_S, ID, luaID, (void*)cobj,"ccexp.TMXLayer"); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:TMXLayer",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_constructor'.",&tolua_err); -#endif - - return 0; -} - -static int lua_cocos2dx_experimental_TMXLayer_finalize(lua_State* tolua_S) -{ - printf("luabindings: finalizing LUA object (TMXLayer)"); - return 0; -} - -int lua_register_cocos2dx_experimental_TMXLayer(lua_State* tolua_S) -{ - tolua_usertype(tolua_S,"ccexp.TMXLayer"); - tolua_cclass(tolua_S,"TMXLayer","ccexp.TMXLayer","cc.Node",nullptr); - - tolua_beginmodule(tolua_S,"TMXLayer"); - tolua_function(tolua_S,"new",lua_cocos2dx_experimental_TMXLayer_constructor); - tolua_function(tolua_S,"getPositionAt",lua_cocos2dx_experimental_TMXLayer_getPositionAt); - tolua_function(tolua_S,"setLayerOrientation",lua_cocos2dx_experimental_TMXLayer_setLayerOrientation); - tolua_function(tolua_S,"getLayerSize",lua_cocos2dx_experimental_TMXLayer_getLayerSize); - tolua_function(tolua_S,"setMapTileSize",lua_cocos2dx_experimental_TMXLayer_setMapTileSize); - tolua_function(tolua_S,"getLayerOrientation",lua_cocos2dx_experimental_TMXLayer_getLayerOrientation); - tolua_function(tolua_S,"setProperties",lua_cocos2dx_experimental_TMXLayer_setProperties); - tolua_function(tolua_S,"setLayerName",lua_cocos2dx_experimental_TMXLayer_setLayerName); - tolua_function(tolua_S,"removeTileAt",lua_cocos2dx_experimental_TMXLayer_removeTileAt); - tolua_function(tolua_S,"getProperties",lua_cocos2dx_experimental_TMXLayer_getProperties); - tolua_function(tolua_S,"setupTiles",lua_cocos2dx_experimental_TMXLayer_setupTiles); - tolua_function(tolua_S,"setupTileSprite",lua_cocos2dx_experimental_TMXLayer_setupTileSprite); - tolua_function(tolua_S,"setTileGID",lua_cocos2dx_experimental_TMXLayer_setTileGID); - tolua_function(tolua_S,"getMapTileSize",lua_cocos2dx_experimental_TMXLayer_getMapTileSize); - tolua_function(tolua_S,"getProperty",lua_cocos2dx_experimental_TMXLayer_getProperty); - tolua_function(tolua_S,"setLayerSize",lua_cocos2dx_experimental_TMXLayer_setLayerSize); - tolua_function(tolua_S,"getLayerName",lua_cocos2dx_experimental_TMXLayer_getLayerName); - tolua_function(tolua_S,"setTileSet",lua_cocos2dx_experimental_TMXLayer_setTileSet); - tolua_function(tolua_S,"getTileSet",lua_cocos2dx_experimental_TMXLayer_getTileSet); - tolua_function(tolua_S,"getTileAt",lua_cocos2dx_experimental_TMXLayer_getTileAt); - tolua_function(tolua_S,"create", lua_cocos2dx_experimental_TMXLayer_create); - tolua_endmodule(tolua_S); - std::string typeName = typeid(cocos2d::experimental::TMXLayer).name(); - g_luaType[typeName] = "ccexp.TMXLayer"; - g_typeCast["TMXLayer"] = "ccexp.TMXLayer"; - return 1; -} - -int lua_cocos2dx_experimental_TMXTiledMap_setObjectGroups(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXTiledMap* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXTiledMap*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXTiledMap_setObjectGroups'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::Vector arg0; - - ok &= luaval_to_ccvector(tolua_S, 2, &arg0, "ccexp.TMXTiledMap:setObjectGroups"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXTiledMap_setObjectGroups'", nullptr); - return 0; - } - cobj->setObjectGroups(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXTiledMap:setObjectGroups",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_setObjectGroups'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXTiledMap_getProperty(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXTiledMap* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXTiledMap*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXTiledMap_getProperty'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.TMXTiledMap:getProperty"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXTiledMap_getProperty'", nullptr); - return 0; - } - cocos2d::Value ret = cobj->getProperty(arg0); - ccvalue_to_luaval(tolua_S, ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXTiledMap:getProperty",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_getProperty'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXTiledMap_setMapSize(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXTiledMap* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXTiledMap*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXTiledMap_setMapSize'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::Size arg0; - - ok &= luaval_to_size(tolua_S, 2, &arg0, "ccexp.TMXTiledMap:setMapSize"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXTiledMap_setMapSize'", nullptr); - return 0; - } - cobj->setMapSize(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXTiledMap:setMapSize",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_setMapSize'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXTiledMap_getObjectGroup(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXTiledMap* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXTiledMap*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXTiledMap_getObjectGroup'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.TMXTiledMap:getObjectGroup"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXTiledMap_getObjectGroup'", nullptr); - return 0; - } - cocos2d::TMXObjectGroup* ret = cobj->getObjectGroup(arg0); - object_to_luaval(tolua_S, "cc.TMXObjectGroup",(cocos2d::TMXObjectGroup*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXTiledMap:getObjectGroup",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_getObjectGroup'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXTiledMap_getObjectGroups(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXTiledMap* cobj = nullptr; - bool ok = true; -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - cobj = (cocos2d::experimental::TMXTiledMap*)tolua_tousertype(tolua_S,1,0); -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXTiledMap_getObjectGroups'", nullptr); - return 0; - } -#endif - argc = lua_gettop(tolua_S)-1; - do{ - if (argc == 0) { - cocos2d::Vector& ret = cobj->getObjectGroups(); - ccvector_to_luaval(tolua_S, ret); - return 1; - } - }while(0); - ok = true; - do{ - if (argc == 0) { - const cocos2d::Vector& ret = cobj->getObjectGroups(); - ccvector_to_luaval(tolua_S, ret); - return 1; - } - }while(0); - ok = true; - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXTiledMap:getObjectGroups",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_getObjectGroups'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXTiledMap_getTileSize(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXTiledMap* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXTiledMap*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXTiledMap_getTileSize'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXTiledMap_getTileSize'", nullptr); - return 0; - } - const cocos2d::Size& ret = cobj->getTileSize(); - size_to_luaval(tolua_S, ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXTiledMap:getTileSize",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_getTileSize'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXTiledMap_getMapSize(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXTiledMap* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXTiledMap*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXTiledMap_getMapSize'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXTiledMap_getMapSize'", nullptr); - return 0; - } - const cocos2d::Size& ret = cobj->getMapSize(); - size_to_luaval(tolua_S, ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXTiledMap:getMapSize",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_getMapSize'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXTiledMap_getProperties(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXTiledMap* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXTiledMap*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXTiledMap_getProperties'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXTiledMap_getProperties'", nullptr); - return 0; - } - const cocos2d::ValueMap& ret = cobj->getProperties(); - ccvaluemap_to_luaval(tolua_S, ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXTiledMap:getProperties",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_getProperties'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXTiledMap_getPropertiesForGID(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXTiledMap* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXTiledMap*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXTiledMap_getPropertiesForGID'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - int arg0; - - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.TMXTiledMap:getPropertiesForGID"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXTiledMap_getPropertiesForGID'", nullptr); - return 0; - } - cocos2d::Value ret = cobj->getPropertiesForGID(arg0); - ccvalue_to_luaval(tolua_S, ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXTiledMap:getPropertiesForGID",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_getPropertiesForGID'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXTiledMap_setTileSize(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXTiledMap* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXTiledMap*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXTiledMap_setTileSize'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::Size arg0; - - ok &= luaval_to_size(tolua_S, 2, &arg0, "ccexp.TMXTiledMap:setTileSize"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXTiledMap_setTileSize'", nullptr); - return 0; - } - cobj->setTileSize(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXTiledMap:setTileSize",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_setTileSize'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXTiledMap_setProperties(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXTiledMap* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXTiledMap*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXTiledMap_setProperties'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::ValueMap arg0; - - ok &= luaval_to_ccvaluemap(tolua_S, 2, &arg0, "ccexp.TMXTiledMap:setProperties"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXTiledMap_setProperties'", nullptr); - return 0; - } - cobj->setProperties(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXTiledMap:setProperties",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_setProperties'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXTiledMap_getLayer(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXTiledMap* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXTiledMap*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXTiledMap_getLayer'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.TMXTiledMap:getLayer"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXTiledMap_getLayer'", nullptr); - return 0; - } - cocos2d::experimental::TMXLayer* ret = cobj->getLayer(arg0); - object_to_luaval(tolua_S, "ccexp.TMXLayer",(cocos2d::experimental::TMXLayer*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXTiledMap:getLayer",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_getLayer'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXTiledMap_getMapOrientation(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXTiledMap* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXTiledMap*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXTiledMap_getMapOrientation'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXTiledMap_getMapOrientation'", nullptr); - return 0; - } - int ret = cobj->getMapOrientation(); - tolua_pushnumber(tolua_S,(lua_Number)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXTiledMap:getMapOrientation",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_getMapOrientation'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXTiledMap_setMapOrientation(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXTiledMap* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXTiledMap*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXTiledMap_setMapOrientation'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - int arg0; - - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.TMXTiledMap:setMapOrientation"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXTiledMap_setMapOrientation'", nullptr); - return 0; - } - cobj->setMapOrientation(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXTiledMap:setMapOrientation",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_setMapOrientation'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_TMXTiledMap_create(lua_State* tolua_S) -{ - int argc = 0; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - - argc = lua_gettop(tolua_S) - 1; - - if (argc == 1) - { - std::string arg0; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.TMXTiledMap:create"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXTiledMap_create'", nullptr); - return 0; - } - cocos2d::experimental::TMXTiledMap* ret = cocos2d::experimental::TMXTiledMap::create(arg0); - object_to_luaval(tolua_S, "ccexp.TMXTiledMap",(cocos2d::experimental::TMXTiledMap*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.TMXTiledMap:create",argc, 1); - return 0; -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_create'.",&tolua_err); -#endif - return 0; -} -int lua_cocos2dx_experimental_TMXTiledMap_createWithXML(lua_State* tolua_S) -{ - int argc = 0; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.TMXTiledMap",0,&tolua_err)) goto tolua_lerror; -#endif - - argc = lua_gettop(tolua_S) - 1; - - if (argc == 2) - { - std::string arg0; - std::string arg1; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.TMXTiledMap:createWithXML"); - ok &= luaval_to_std_string(tolua_S, 3,&arg1, "ccexp.TMXTiledMap:createWithXML"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_TMXTiledMap_createWithXML'", nullptr); - return 0; - } - cocos2d::experimental::TMXTiledMap* ret = cocos2d::experimental::TMXTiledMap::createWithXML(arg0, arg1); - object_to_luaval(tolua_S, "ccexp.TMXTiledMap",(cocos2d::experimental::TMXTiledMap*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.TMXTiledMap:createWithXML",argc, 2); - return 0; -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXTiledMap_createWithXML'.",&tolua_err); -#endif - return 0; -} -static int lua_cocos2dx_experimental_TMXTiledMap_finalize(lua_State* tolua_S) -{ - printf("luabindings: finalizing LUA object (TMXTiledMap)"); - return 0; -} - -int lua_register_cocos2dx_experimental_TMXTiledMap(lua_State* tolua_S) -{ - tolua_usertype(tolua_S,"ccexp.TMXTiledMap"); - tolua_cclass(tolua_S,"TMXTiledMap","ccexp.TMXTiledMap","cc.Node",nullptr); - - tolua_beginmodule(tolua_S,"TMXTiledMap"); - tolua_function(tolua_S,"setObjectGroups",lua_cocos2dx_experimental_TMXTiledMap_setObjectGroups); - tolua_function(tolua_S,"getProperty",lua_cocos2dx_experimental_TMXTiledMap_getProperty); - tolua_function(tolua_S,"setMapSize",lua_cocos2dx_experimental_TMXTiledMap_setMapSize); - tolua_function(tolua_S,"getObjectGroup",lua_cocos2dx_experimental_TMXTiledMap_getObjectGroup); - tolua_function(tolua_S,"getObjectGroups",lua_cocos2dx_experimental_TMXTiledMap_getObjectGroups); - tolua_function(tolua_S,"getTileSize",lua_cocos2dx_experimental_TMXTiledMap_getTileSize); - tolua_function(tolua_S,"getMapSize",lua_cocos2dx_experimental_TMXTiledMap_getMapSize); - tolua_function(tolua_S,"getProperties",lua_cocos2dx_experimental_TMXTiledMap_getProperties); - tolua_function(tolua_S,"getPropertiesForGID",lua_cocos2dx_experimental_TMXTiledMap_getPropertiesForGID); - tolua_function(tolua_S,"setTileSize",lua_cocos2dx_experimental_TMXTiledMap_setTileSize); - tolua_function(tolua_S,"setProperties",lua_cocos2dx_experimental_TMXTiledMap_setProperties); - tolua_function(tolua_S,"getLayer",lua_cocos2dx_experimental_TMXTiledMap_getLayer); - tolua_function(tolua_S,"getMapOrientation",lua_cocos2dx_experimental_TMXTiledMap_getMapOrientation); - tolua_function(tolua_S,"setMapOrientation",lua_cocos2dx_experimental_TMXTiledMap_setMapOrientation); - tolua_function(tolua_S,"create", lua_cocos2dx_experimental_TMXTiledMap_create); - tolua_function(tolua_S,"createWithXML", lua_cocos2dx_experimental_TMXTiledMap_createWithXML); - tolua_endmodule(tolua_S); - std::string typeName = typeid(cocos2d::experimental::TMXTiledMap).name(); - g_luaType[typeName] = "ccexp.TMXTiledMap"; - g_typeCast["TMXTiledMap"] = "ccexp.TMXTiledMap"; - return 1; -} -TOLUA_API int register_all_cocos2dx_experimental(lua_State* tolua_S) -{ - tolua_open(tolua_S); - - tolua_module(tolua_S,"ccexp",0); - tolua_beginmodule(tolua_S,"ccexp"); - - lua_register_cocos2dx_experimental_TMXTiledMap(tolua_S); - lua_register_cocos2dx_experimental_TMXLayer(tolua_S); - - tolua_endmodule(tolua_S); - return 1; -} - diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_auto.hpp deleted file mode 100644 index 1510f395f7..0000000000 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_auto.hpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "base/ccConfig.h" -#ifndef __cocos2dx_experimental_h__ -#define __cocos2dx_experimental_h__ - -#ifdef __cplusplus -extern "C" { -#endif -#include "tolua++.h" -#ifdef __cplusplus -} -#endif - -int register_all_cocos2dx_experimental(lua_State* tolua_S); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -#endif // __cocos2dx_experimental_h__ diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.cpp deleted file mode 100644 index 57860b5056..0000000000 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.cpp +++ /dev/null @@ -1,1002 +0,0 @@ -#include "scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.hpp" -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_TARGET_OS_TVOS) -#include "ui/UIVideoPlayer.h" -#include "scripting/lua-bindings/manual/tolua_fix.h" -#include "scripting/lua-bindings/manual/LuaBasicConversions.h" - -int lua_cocos2dx_experimental_video_VideoPlayer_getFileName(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_getFileName'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_getFileName'", nullptr); - return 0; - } - const std::string& ret = cobj->getFileName(); - lua_pushlstring(tolua_S,ret.c_str(),ret.length()); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:getFileName",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_getFileName'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_getURL(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_getURL'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_getURL'", nullptr); - return 0; - } - const std::string& ret = cobj->getURL(); - lua_pushlstring(tolua_S,ret.c_str(),ret.length()); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:getURL",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_getURL'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_play(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_play'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_play'", nullptr); - return 0; - } - cobj->play(); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:play",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_play'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_isUserInputEnabled(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_isUserInputEnabled'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_isUserInputEnabled'", nullptr); - return 0; - } - bool ret = cobj->isUserInputEnabled(); - tolua_pushboolean(tolua_S,(bool)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:isUserInputEnabled",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_isUserInputEnabled'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_setKeepAspectRatioEnabled(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_setKeepAspectRatioEnabled'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - bool arg0; - - ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccexp.VideoPlayer:setKeepAspectRatioEnabled"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_setKeepAspectRatioEnabled'", nullptr); - return 0; - } - cobj->setKeepAspectRatioEnabled(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:setKeepAspectRatioEnabled",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_setKeepAspectRatioEnabled'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_stop(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_stop'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_stop'", nullptr); - return 0; - } - cobj->stop(); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:stop",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_stop'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_setFullScreenEnabled(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_setFullScreenEnabled'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - bool arg0; - - ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccexp.VideoPlayer:setFullScreenEnabled"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_setFullScreenEnabled'", nullptr); - return 0; - } - cobj->setFullScreenEnabled(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:setFullScreenEnabled",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_setFullScreenEnabled'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_setFileName(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_setFileName'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.VideoPlayer:setFileName"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_setFileName'", nullptr); - return 0; - } - cobj->setFileName(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:setFileName",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_setFileName'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_setURL(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_setURL'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.VideoPlayer:setURL"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_setURL'", nullptr); - return 0; - } - cobj->setURL(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:setURL",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_setURL'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_setStyle(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_setStyle'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::experimental::ui::VideoPlayer::StyleType arg0; - - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.VideoPlayer:setStyle"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_setStyle'", nullptr); - return 0; - } - cobj->setStyle(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:setStyle",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_setStyle'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_seekTo(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_seekTo'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - double arg0; - - ok &= luaval_to_number(tolua_S, 2,&arg0, "ccexp.VideoPlayer:seekTo"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_seekTo'", nullptr); - return 0; - } - cobj->seekTo(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:seekTo",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_seekTo'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_isKeepAspectRatioEnabled(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_isKeepAspectRatioEnabled'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_isKeepAspectRatioEnabled'", nullptr); - return 0; - } - bool ret = cobj->isKeepAspectRatioEnabled(); - tolua_pushboolean(tolua_S,(bool)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:isKeepAspectRatioEnabled",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_isKeepAspectRatioEnabled'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_onPlayEvent(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_onPlayEvent'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - int arg0; - - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.VideoPlayer:onPlayEvent"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_onPlayEvent'", nullptr); - return 0; - } - cobj->onPlayEvent(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:onPlayEvent",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_onPlayEvent'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_isFullScreenEnabled(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_isFullScreenEnabled'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_isFullScreenEnabled'", nullptr); - return 0; - } - bool ret = cobj->isFullScreenEnabled(); - tolua_pushboolean(tolua_S,(bool)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:isFullScreenEnabled",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_isFullScreenEnabled'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_isLooping(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_isLooping'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_isLooping'", nullptr); - return 0; - } - bool ret = cobj->isLooping(); - tolua_pushboolean(tolua_S,(bool)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:isLooping",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_isLooping'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_isPlaying(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_isPlaying'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_isPlaying'", nullptr); - return 0; - } - bool ret = cobj->isPlaying(); - tolua_pushboolean(tolua_S,(bool)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:isPlaying",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_isPlaying'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_setLooping(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_setLooping'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - bool arg0; - - ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccexp.VideoPlayer:setLooping"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_setLooping'", nullptr); - return 0; - } - cobj->setLooping(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:setLooping",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_setLooping'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_setUserInputEnabled(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_setUserInputEnabled'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - bool arg0; - - ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccexp.VideoPlayer:setUserInputEnabled"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_setUserInputEnabled'", nullptr); - return 0; - } - cobj->setUserInputEnabled(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:setUserInputEnabled",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_setUserInputEnabled'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_create(lua_State* tolua_S) -{ - int argc = 0; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - argc = lua_gettop(tolua_S) - 1; - - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_create'", nullptr); - return 0; - } - cocos2d::experimental::ui::VideoPlayer* ret = cocos2d::experimental::ui::VideoPlayer::create(); - object_to_luaval(tolua_S, "ccexp.VideoPlayer",(cocos2d::experimental::ui::VideoPlayer*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.VideoPlayer:create",argc, 0); - return 0; -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_create'.",&tolua_err); -#endif - return 0; -} -int lua_cocos2dx_experimental_video_VideoPlayer_constructor(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_video_VideoPlayer_constructor'", nullptr); - return 0; - } - cobj = new cocos2d::experimental::ui::VideoPlayer(); - cobj->autorelease(); - int ID = (int)cobj->_ID ; - int* luaID = &cobj->_luaID ; - toluafix_pushusertype_ccobject(tolua_S, ID, luaID, (void*)cobj,"ccexp.VideoPlayer"); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:VideoPlayer",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_constructor'.",&tolua_err); -#endif - - return 0; -} - -static int lua_cocos2dx_experimental_video_VideoPlayer_finalize(lua_State* tolua_S) -{ - printf("luabindings: finalizing LUA object (VideoPlayer)"); - return 0; -} - -int lua_register_cocos2dx_experimental_video_VideoPlayer(lua_State* tolua_S) -{ - tolua_usertype(tolua_S,"ccexp.VideoPlayer"); - tolua_cclass(tolua_S,"VideoPlayer","ccexp.VideoPlayer","ccui.Widget",nullptr); - - tolua_beginmodule(tolua_S,"VideoPlayer"); - tolua_function(tolua_S,"new",lua_cocos2dx_experimental_video_VideoPlayer_constructor); - tolua_function(tolua_S,"getFileName",lua_cocos2dx_experimental_video_VideoPlayer_getFileName); - tolua_function(tolua_S,"getURL",lua_cocos2dx_experimental_video_VideoPlayer_getURL); - tolua_function(tolua_S,"play",lua_cocos2dx_experimental_video_VideoPlayer_play); - tolua_function(tolua_S,"isUserInputEnabled",lua_cocos2dx_experimental_video_VideoPlayer_isUserInputEnabled); - tolua_function(tolua_S,"setKeepAspectRatioEnabled",lua_cocos2dx_experimental_video_VideoPlayer_setKeepAspectRatioEnabled); - tolua_function(tolua_S,"stop",lua_cocos2dx_experimental_video_VideoPlayer_stop); - tolua_function(tolua_S,"setFullScreenEnabled",lua_cocos2dx_experimental_video_VideoPlayer_setFullScreenEnabled); - tolua_function(tolua_S,"setFileName",lua_cocos2dx_experimental_video_VideoPlayer_setFileName); - tolua_function(tolua_S,"setURL",lua_cocos2dx_experimental_video_VideoPlayer_setURL); - tolua_function(tolua_S,"setStyle",lua_cocos2dx_experimental_video_VideoPlayer_setStyle); - tolua_function(tolua_S,"seekTo",lua_cocos2dx_experimental_video_VideoPlayer_seekTo); - tolua_function(tolua_S,"isKeepAspectRatioEnabled",lua_cocos2dx_experimental_video_VideoPlayer_isKeepAspectRatioEnabled); - tolua_function(tolua_S,"onPlayEvent",lua_cocos2dx_experimental_video_VideoPlayer_onPlayEvent); - tolua_function(tolua_S,"isFullScreenEnabled",lua_cocos2dx_experimental_video_VideoPlayer_isFullScreenEnabled); - tolua_function(tolua_S,"isLooping",lua_cocos2dx_experimental_video_VideoPlayer_isLooping); - tolua_function(tolua_S,"isPlaying",lua_cocos2dx_experimental_video_VideoPlayer_isPlaying); - tolua_function(tolua_S,"setLooping",lua_cocos2dx_experimental_video_VideoPlayer_setLooping); - tolua_function(tolua_S,"setUserInputEnabled",lua_cocos2dx_experimental_video_VideoPlayer_setUserInputEnabled); - tolua_function(tolua_S,"create", lua_cocos2dx_experimental_video_VideoPlayer_create); - tolua_endmodule(tolua_S); - std::string typeName = typeid(cocos2d::experimental::ui::VideoPlayer).name(); - g_luaType[typeName] = "ccexp.VideoPlayer"; - g_typeCast["VideoPlayer"] = "ccexp.VideoPlayer"; - return 1; -} -TOLUA_API int register_all_cocos2dx_experimental_video(lua_State* tolua_S) -{ - tolua_open(tolua_S); - - tolua_module(tolua_S,"ccexp",0); - tolua_beginmodule(tolua_S,"ccexp"); - - lua_register_cocos2dx_experimental_video_VideoPlayer(tolua_S); - - tolua_endmodule(tolua_S); - return 1; -} - -#endif diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.hpp deleted file mode 100644 index eb3ac2043d..0000000000 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "base/ccConfig.h" -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_TARGET_OS_TVOS) -#ifndef __cocos2dx_experimental_video_h__ -#define __cocos2dx_experimental_video_h__ - -#ifdef __cplusplus -extern "C" { -#endif -#include "tolua++.h" -#ifdef __cplusplus -} -#endif - -int register_all_cocos2dx_experimental_video(lua_State* tolua_S); - - - - - - - - - - - - - - - - - - - - - - -#endif // __cocos2dx_experimental_video_h__ -#endif //#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_TARGET_OS_TVOS) diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_webview_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_webview_auto.cpp deleted file mode 100644 index ea4c314ff5..0000000000 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_webview_auto.cpp +++ /dev/null @@ -1,977 +0,0 @@ -#include "scripting/lua-bindings/auto/lua_cocos2dx_experimental_webview_auto.hpp" -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_TARGET_OS_TVOS) -#include "ui/UIWebView/UIWebView.h" -#include "scripting/lua-bindings/manual/tolua_fix.h" -#include "scripting/lua-bindings/manual/LuaBasicConversions.h" - -int lua_cocos2dx_experimental_webview_WebView_setOpacityWebView(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_setOpacityWebView'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - double arg0; - - ok &= luaval_to_number(tolua_S, 2,&arg0, "ccexp.WebView:setOpacityWebView"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_setOpacityWebView'", nullptr); - return 0; - } - cobj->setOpacityWebView(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:setOpacityWebView",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_setOpacityWebView'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_canGoBack(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_canGoBack'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_canGoBack'", nullptr); - return 0; - } - bool ret = cobj->canGoBack(); - tolua_pushboolean(tolua_S,(bool)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:canGoBack",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_canGoBack'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_loadHTMLString(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_loadHTMLString'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.WebView:loadHTMLString"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_loadHTMLString'", nullptr); - return 0; - } - cobj->loadHTMLString(arg0); - lua_settop(tolua_S, 1); - return 1; - } - if (argc == 2) - { - std::string arg0; - std::string arg1; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.WebView:loadHTMLString"); - - ok &= luaval_to_std_string(tolua_S, 3,&arg1, "ccexp.WebView:loadHTMLString"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_loadHTMLString'", nullptr); - return 0; - } - cobj->loadHTMLString(arg0, arg1); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:loadHTMLString",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_loadHTMLString'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_goForward(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_goForward'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_goForward'", nullptr); - return 0; - } - cobj->goForward(); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:goForward",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_goForward'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_goBack(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_goBack'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_goBack'", nullptr); - return 0; - } - cobj->goBack(); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:goBack",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_goBack'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_setScalesPageToFit(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_setScalesPageToFit'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - bool arg0; - - ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccexp.WebView:setScalesPageToFit"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_setScalesPageToFit'", nullptr); - return 0; - } - cobj->setScalesPageToFit(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:setScalesPageToFit",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_setScalesPageToFit'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_loadFile(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_loadFile'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.WebView:loadFile"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_loadFile'", nullptr); - return 0; - } - cobj->loadFile(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:loadFile",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_loadFile'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_loadURL(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_loadURL'", nullptr); - return 0; - } -#endif - argc = lua_gettop(tolua_S)-1; - do{ - if (argc == 2) { - std::string arg0; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.WebView:loadURL"); - - if (!ok) { break; } - bool arg1; - ok &= luaval_to_boolean(tolua_S, 3,&arg1, "ccexp.WebView:loadURL"); - - if (!ok) { break; } - cobj->loadURL(arg0, arg1); - lua_settop(tolua_S, 1); - return 1; - } - }while(0); - ok = true; - do{ - if (argc == 1) { - std::string arg0; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.WebView:loadURL"); - - if (!ok) { break; } - cobj->loadURL(arg0); - lua_settop(tolua_S, 1); - return 1; - } - }while(0); - ok = true; - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:loadURL",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_loadURL'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_setBounces(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_setBounces'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - bool arg0; - - ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccexp.WebView:setBounces"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_setBounces'", nullptr); - return 0; - } - cobj->setBounces(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:setBounces",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_setBounces'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_evaluateJS(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_evaluateJS'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.WebView:evaluateJS"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_evaluateJS'", nullptr); - return 0; - } - cobj->evaluateJS(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:evaluateJS",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_evaluateJS'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_setBackgroundTransparent(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_setBackgroundTransparent'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_setBackgroundTransparent'", nullptr); - return 0; - } - cobj->setBackgroundTransparent(); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:setBackgroundTransparent",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_setBackgroundTransparent'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_getOnJSCallback(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_getOnJSCallback'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_getOnJSCallback'", nullptr); - return 0; - } - cocos2d::experimental::ui::WebView::ccWebViewCallback ret = cobj->getOnJSCallback(); - #pragma warning NO CONVERSION FROM NATIVE FOR std::function; - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:getOnJSCallback",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_getOnJSCallback'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_canGoForward(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_canGoForward'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_canGoForward'", nullptr); - return 0; - } - bool ret = cobj->canGoForward(); - tolua_pushboolean(tolua_S,(bool)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:canGoForward",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_canGoForward'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_stopLoading(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_stopLoading'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_stopLoading'", nullptr); - return 0; - } - cobj->stopLoading(); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:stopLoading",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_stopLoading'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_getOpacityWebView(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_getOpacityWebView'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_getOpacityWebView'", nullptr); - return 0; - } - double ret = cobj->getOpacityWebView(); - tolua_pushnumber(tolua_S,(lua_Number)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:getOpacityWebView",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_getOpacityWebView'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_reload(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_reload'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_reload'", nullptr); - return 0; - } - cobj->reload(); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:reload",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_reload'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_setJavascriptInterfaceScheme(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_webview_WebView_setJavascriptInterfaceScheme'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.WebView:setJavascriptInterfaceScheme"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_setJavascriptInterfaceScheme'", nullptr); - return 0; - } - cobj->setJavascriptInterfaceScheme(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:setJavascriptInterfaceScheme",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_setJavascriptInterfaceScheme'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_create(lua_State* tolua_S) -{ - int argc = 0; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - argc = lua_gettop(tolua_S) - 1; - - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_create'", nullptr); - return 0; - } - cocos2d::experimental::ui::WebView* ret = cocos2d::experimental::ui::WebView::create(); - object_to_luaval(tolua_S, "ccexp.WebView",(cocos2d::experimental::ui::WebView*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.WebView:create",argc, 0); - return 0; -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_create'.",&tolua_err); -#endif - return 0; -} -int lua_cocos2dx_experimental_webview_WebView_constructor(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_experimental_webview_WebView_constructor'", nullptr); - return 0; - } - cobj = new cocos2d::experimental::ui::WebView(); - cobj->autorelease(); - int ID = (int)cobj->_ID ; - int* luaID = &cobj->_luaID ; - toluafix_pushusertype_ccobject(tolua_S, ID, luaID, (void*)cobj,"ccexp.WebView"); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.WebView:WebView",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_webview_WebView_constructor'.",&tolua_err); -#endif - - return 0; -} - -static int lua_cocos2dx_experimental_webview_WebView_finalize(lua_State* tolua_S) -{ - printf("luabindings: finalizing LUA object (WebView)"); - return 0; -} - -int lua_register_cocos2dx_experimental_webview_WebView(lua_State* tolua_S) -{ - tolua_usertype(tolua_S,"ccexp.WebView"); - tolua_cclass(tolua_S,"WebView","ccexp.WebView","ccui.Widget",nullptr); - - tolua_beginmodule(tolua_S,"WebView"); - tolua_function(tolua_S,"new",lua_cocos2dx_experimental_webview_WebView_constructor); - tolua_function(tolua_S,"setOpacityWebView",lua_cocos2dx_experimental_webview_WebView_setOpacityWebView); - tolua_function(tolua_S,"canGoBack",lua_cocos2dx_experimental_webview_WebView_canGoBack); - tolua_function(tolua_S,"loadHTMLString",lua_cocos2dx_experimental_webview_WebView_loadHTMLString); - tolua_function(tolua_S,"goForward",lua_cocos2dx_experimental_webview_WebView_goForward); - tolua_function(tolua_S,"goBack",lua_cocos2dx_experimental_webview_WebView_goBack); - tolua_function(tolua_S,"setScalesPageToFit",lua_cocos2dx_experimental_webview_WebView_setScalesPageToFit); - tolua_function(tolua_S,"loadFile",lua_cocos2dx_experimental_webview_WebView_loadFile); - tolua_function(tolua_S,"loadURL",lua_cocos2dx_experimental_webview_WebView_loadURL); - tolua_function(tolua_S,"setBounces",lua_cocos2dx_experimental_webview_WebView_setBounces); - tolua_function(tolua_S,"evaluateJS",lua_cocos2dx_experimental_webview_WebView_evaluateJS); - tolua_function(tolua_S,"setBackgroundTransparent",lua_cocos2dx_experimental_webview_WebView_setBackgroundTransparent); - tolua_function(tolua_S,"getOnJSCallback",lua_cocos2dx_experimental_webview_WebView_getOnJSCallback); - tolua_function(tolua_S,"canGoForward",lua_cocos2dx_experimental_webview_WebView_canGoForward); - tolua_function(tolua_S,"stopLoading",lua_cocos2dx_experimental_webview_WebView_stopLoading); - tolua_function(tolua_S,"getOpacityWebView",lua_cocos2dx_experimental_webview_WebView_getOpacityWebView); - tolua_function(tolua_S,"reload",lua_cocos2dx_experimental_webview_WebView_reload); - tolua_function(tolua_S,"setJavascriptInterfaceScheme",lua_cocos2dx_experimental_webview_WebView_setJavascriptInterfaceScheme); - tolua_function(tolua_S,"create", lua_cocos2dx_experimental_webview_WebView_create); - tolua_endmodule(tolua_S); - std::string typeName = typeid(cocos2d::experimental::ui::WebView).name(); - g_luaType[typeName] = "ccexp.WebView"; - g_typeCast["WebView"] = "ccexp.WebView"; - return 1; -} -TOLUA_API int register_all_cocos2dx_experimental_webview(lua_State* tolua_S) -{ - tolua_open(tolua_S); - - tolua_module(tolua_S,"ccexp",0); - tolua_beginmodule(tolua_S,"ccexp"); - - lua_register_cocos2dx_experimental_webview_WebView(tolua_S); - - tolua_endmodule(tolua_S); - return 1; -} - -#endif diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_webview_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_webview_auto.hpp deleted file mode 100644 index 3d5c1be37c..0000000000 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_webview_auto.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "base/ccConfig.h" -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_TARGET_OS_TVOS) -#ifndef __cocos2dx_experimental_webview_h__ -#define __cocos2dx_experimental_webview_h__ - -#ifdef __cplusplus -extern "C" { -#endif -#include "tolua++.h" -#ifdef __cplusplus -} -#endif - -int register_all_cocos2dx_experimental_webview(lua_State* tolua_S); - - - - - - - - - - - - - - - - - - - - - -#endif // __cocos2dx_experimental_webview_h__ -#endif //#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_TARGET_OS_TVOS) diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp index 63014509af..bc81570408 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp @@ -31228,6 +31228,964 @@ int lua_register_cocos2dx_ui_RelativeBox(lua_State* tolua_S) return 1; } +int lua_cocos2dx_ui_WebView_setOpacityWebView(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_setOpacityWebView'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + double arg0; + + ok &= luaval_to_number(tolua_S, 2,&arg0, "ccui.WebView:setOpacityWebView"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_setOpacityWebView'", nullptr); + return 0; + } + cobj->setOpacityWebView(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:setOpacityWebView",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_setOpacityWebView'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_canGoBack(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_canGoBack'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_canGoBack'", nullptr); + return 0; + } + bool ret = cobj->canGoBack(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:canGoBack",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_canGoBack'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_loadHTMLString(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_loadHTMLString'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:loadHTMLString"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_loadHTMLString'", nullptr); + return 0; + } + cobj->loadHTMLString(arg0); + lua_settop(tolua_S, 1); + return 1; + } + if (argc == 2) + { + std::string arg0; + std::string arg1; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:loadHTMLString"); + + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "ccui.WebView:loadHTMLString"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_loadHTMLString'", nullptr); + return 0; + } + cobj->loadHTMLString(arg0, arg1); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:loadHTMLString",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_loadHTMLString'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_goForward(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_goForward'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_goForward'", nullptr); + return 0; + } + cobj->goForward(); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:goForward",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_goForward'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_goBack(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_goBack'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_goBack'", nullptr); + return 0; + } + cobj->goBack(); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:goBack",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_goBack'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_setScalesPageToFit(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_setScalesPageToFit'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + bool arg0; + + ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccui.WebView:setScalesPageToFit"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_setScalesPageToFit'", nullptr); + return 0; + } + cobj->setScalesPageToFit(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:setScalesPageToFit",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_setScalesPageToFit'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_loadFile(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_loadFile'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:loadFile"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_loadFile'", nullptr); + return 0; + } + cobj->loadFile(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:loadFile",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_loadFile'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_loadURL(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_loadURL'", nullptr); + return 0; + } +#endif + argc = lua_gettop(tolua_S)-1; + do{ + if (argc == 2) { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:loadURL"); + + if (!ok) { break; } + bool arg1; + ok &= luaval_to_boolean(tolua_S, 3,&arg1, "ccui.WebView:loadURL"); + + if (!ok) { break; } + cobj->loadURL(arg0, arg1); + lua_settop(tolua_S, 1); + return 1; + } + }while(0); + ok = true; + do{ + if (argc == 1) { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:loadURL"); + + if (!ok) { break; } + cobj->loadURL(arg0); + lua_settop(tolua_S, 1); + return 1; + } + }while(0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:loadURL",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_loadURL'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_setBounces(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_setBounces'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + bool arg0; + + ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccui.WebView:setBounces"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_setBounces'", nullptr); + return 0; + } + cobj->setBounces(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:setBounces",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_setBounces'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_evaluateJS(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_evaluateJS'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:evaluateJS"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_evaluateJS'", nullptr); + return 0; + } + cobj->evaluateJS(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:evaluateJS",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_evaluateJS'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_setBackgroundTransparent(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_setBackgroundTransparent'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_setBackgroundTransparent'", nullptr); + return 0; + } + cobj->setBackgroundTransparent(); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:setBackgroundTransparent",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_setBackgroundTransparent'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_getOnJSCallback(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_getOnJSCallback'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_getOnJSCallback'", nullptr); + return 0; + } + cocos2d::ui::WebView::ccWebViewCallback ret = cobj->getOnJSCallback(); + #pragma warning NO CONVERSION FROM NATIVE FOR std::function; + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:getOnJSCallback",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_getOnJSCallback'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_canGoForward(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_canGoForward'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_canGoForward'", nullptr); + return 0; + } + bool ret = cobj->canGoForward(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:canGoForward",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_canGoForward'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_stopLoading(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_stopLoading'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_stopLoading'", nullptr); + return 0; + } + cobj->stopLoading(); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:stopLoading",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_stopLoading'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_getOpacityWebView(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_getOpacityWebView'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_getOpacityWebView'", nullptr); + return 0; + } + double ret = cobj->getOpacityWebView(); + tolua_pushnumber(tolua_S,(lua_Number)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:getOpacityWebView",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_getOpacityWebView'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_reload(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_reload'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_reload'", nullptr); + return 0; + } + cobj->reload(); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:reload",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_reload'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_setJavascriptInterfaceScheme(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_setJavascriptInterfaceScheme'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:setJavascriptInterfaceScheme"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_setJavascriptInterfaceScheme'", nullptr); + return 0; + } + cobj->setJavascriptInterfaceScheme(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:setJavascriptInterfaceScheme",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_setJavascriptInterfaceScheme'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_ui_WebView_create(lua_State* tolua_S) +{ + int argc = 0; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertable(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S) - 1; + + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_create'", nullptr); + return 0; + } + cocos2d::ui::WebView* ret = cocos2d::ui::WebView::create(); + object_to_luaval(tolua_S, "ccui.WebView",(cocos2d::ui::WebView*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccui.WebView:create",argc, 0); + return 0; +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_create'.",&tolua_err); +#endif + return 0; +} +int lua_cocos2dx_ui_WebView_constructor(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_constructor'", nullptr); + return 0; + } + cobj = new cocos2d::ui::WebView(); + cobj->autorelease(); + int ID = (int)cobj->_ID ; + int* luaID = &cobj->_luaID ; + toluafix_pushusertype_ccobject(tolua_S, ID, luaID, (void*)cobj,"ccui.WebView"); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:WebView",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_constructor'.",&tolua_err); +#endif + + return 0; +} + +static int lua_cocos2dx_ui_WebView_finalize(lua_State* tolua_S) +{ + printf("luabindings: finalizing LUA object (WebView)"); + return 0; +} + +int lua_register_cocos2dx_ui_WebView(lua_State* tolua_S) +{ + tolua_usertype(tolua_S,"ccui.WebView"); + tolua_cclass(tolua_S,"WebView","ccui.WebView","ccui.Widget",nullptr); + + tolua_beginmodule(tolua_S,"WebView"); + tolua_function(tolua_S,"new",lua_cocos2dx_ui_WebView_constructor); + tolua_function(tolua_S,"setOpacityWebView",lua_cocos2dx_ui_WebView_setOpacityWebView); + tolua_function(tolua_S,"canGoBack",lua_cocos2dx_ui_WebView_canGoBack); + tolua_function(tolua_S,"loadHTMLString",lua_cocos2dx_ui_WebView_loadHTMLString); + tolua_function(tolua_S,"goForward",lua_cocos2dx_ui_WebView_goForward); + tolua_function(tolua_S,"goBack",lua_cocos2dx_ui_WebView_goBack); + tolua_function(tolua_S,"setScalesPageToFit",lua_cocos2dx_ui_WebView_setScalesPageToFit); + tolua_function(tolua_S,"loadFile",lua_cocos2dx_ui_WebView_loadFile); + tolua_function(tolua_S,"loadURL",lua_cocos2dx_ui_WebView_loadURL); + tolua_function(tolua_S,"setBounces",lua_cocos2dx_ui_WebView_setBounces); + tolua_function(tolua_S,"evaluateJS",lua_cocos2dx_ui_WebView_evaluateJS); + tolua_function(tolua_S,"setBackgroundTransparent",lua_cocos2dx_ui_WebView_setBackgroundTransparent); + tolua_function(tolua_S,"getOnJSCallback",lua_cocos2dx_ui_WebView_getOnJSCallback); + tolua_function(tolua_S,"canGoForward",lua_cocos2dx_ui_WebView_canGoForward); + tolua_function(tolua_S,"stopLoading",lua_cocos2dx_ui_WebView_stopLoading); + tolua_function(tolua_S,"getOpacityWebView",lua_cocos2dx_ui_WebView_getOpacityWebView); + tolua_function(tolua_S,"reload",lua_cocos2dx_ui_WebView_reload); + tolua_function(tolua_S,"setJavascriptInterfaceScheme",lua_cocos2dx_ui_WebView_setJavascriptInterfaceScheme); + tolua_function(tolua_S,"create", lua_cocos2dx_ui_WebView_create); + tolua_endmodule(tolua_S); + std::string typeName = typeid(cocos2d::ui::WebView).name(); + g_luaType[typeName] = "ccui.WebView"; + g_typeCast["WebView"] = "ccui.WebView"; + return 1; +} + int lua_cocos2dx_ui_Scale9Sprite_updateWithSprite(lua_State* tolua_S) { int argc = 0; @@ -40213,7 +41171,7 @@ TOLUA_API int register_all_cocos2dx_ui(lua_State* tolua_S) lua_register_cocos2dx_ui_RichElementCustomNode(tolua_S); lua_register_cocos2dx_ui_VBox(tolua_S); lua_register_cocos2dx_ui_RadioButtonGroup(tolua_S); - lua_register_cocos2dx_ui_TabControl(tolua_S); + lua_register_cocos2dx_ui_WebView(tolua_S); lua_register_cocos2dx_ui_ScrollView(tolua_S); lua_register_cocos2dx_ui_ListView(tolua_S); lua_register_cocos2dx_ui_TabHeader(tolua_S); @@ -40224,6 +41182,7 @@ TOLUA_API int register_all_cocos2dx_ui(lua_State* tolua_S) lua_register_cocos2dx_ui_LinearLayoutParameter(tolua_S); lua_register_cocos2dx_ui_RadioButton(tolua_S); lua_register_cocos2dx_ui_ImageView(tolua_S); + lua_register_cocos2dx_ui_TabControl(tolua_S); lua_register_cocos2dx_ui_HBox(tolua_S); lua_register_cocos2dx_ui_RichElementText(tolua_S); lua_register_cocos2dx_ui_PageView(tolua_S); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp index 0a0f20bde6..47cdf4be29 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp @@ -789,6 +789,26 @@ int register_all_cocos2dx_ui(lua_State* tolua_S); + + + + + + + + + + + + + + + + + + + + diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_video_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_video_auto.cpp new file mode 100644 index 0000000000..6c6f9559a3 --- /dev/null +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_video_auto.cpp @@ -0,0 +1,1000 @@ +#include "scripting/lua-bindings/auto/lua_cocos2dx_video_auto.hpp" +#include "ui/UIVideoPlayer.h" +#include "scripting/lua-bindings/manual/tolua_fix.h" +#include "scripting/lua-bindings/manual/LuaBasicConversions.h" + +int lua_cocos2dx_video_VideoPlayer_getFileName(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_getFileName'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_getFileName'", nullptr); + return 0; + } + const std::string& ret = cobj->getFileName(); + lua_pushlstring(tolua_S,ret.c_str(),ret.length()); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:getFileName",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_getFileName'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_getURL(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_getURL'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_getURL'", nullptr); + return 0; + } + const std::string& ret = cobj->getURL(); + lua_pushlstring(tolua_S,ret.c_str(),ret.length()); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:getURL",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_getURL'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_play(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_play'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_play'", nullptr); + return 0; + } + cobj->play(); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:play",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_play'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_isUserInputEnabled(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_isUserInputEnabled'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_isUserInputEnabled'", nullptr); + return 0; + } + bool ret = cobj->isUserInputEnabled(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:isUserInputEnabled",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_isUserInputEnabled'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_setKeepAspectRatioEnabled(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_setKeepAspectRatioEnabled'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + bool arg0; + + ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccui.VideoPlayer:setKeepAspectRatioEnabled"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_setKeepAspectRatioEnabled'", nullptr); + return 0; + } + cobj->setKeepAspectRatioEnabled(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:setKeepAspectRatioEnabled",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_setKeepAspectRatioEnabled'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_stop(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_stop'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_stop'", nullptr); + return 0; + } + cobj->stop(); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:stop",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_stop'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_setFullScreenEnabled(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_setFullScreenEnabled'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + bool arg0; + + ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccui.VideoPlayer:setFullScreenEnabled"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_setFullScreenEnabled'", nullptr); + return 0; + } + cobj->setFullScreenEnabled(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:setFullScreenEnabled",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_setFullScreenEnabled'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_setFileName(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_setFileName'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.VideoPlayer:setFileName"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_setFileName'", nullptr); + return 0; + } + cobj->setFileName(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:setFileName",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_setFileName'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_setURL(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_setURL'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.VideoPlayer:setURL"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_setURL'", nullptr); + return 0; + } + cobj->setURL(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:setURL",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_setURL'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_setStyle(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_setStyle'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::ui::VideoPlayer::StyleType arg0; + + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccui.VideoPlayer:setStyle"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_setStyle'", nullptr); + return 0; + } + cobj->setStyle(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:setStyle",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_setStyle'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_seekTo(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_seekTo'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + double arg0; + + ok &= luaval_to_number(tolua_S, 2,&arg0, "ccui.VideoPlayer:seekTo"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_seekTo'", nullptr); + return 0; + } + cobj->seekTo(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:seekTo",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_seekTo'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_isKeepAspectRatioEnabled(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_isKeepAspectRatioEnabled'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_isKeepAspectRatioEnabled'", nullptr); + return 0; + } + bool ret = cobj->isKeepAspectRatioEnabled(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:isKeepAspectRatioEnabled",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_isKeepAspectRatioEnabled'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_onPlayEvent(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_onPlayEvent'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + int arg0; + + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccui.VideoPlayer:onPlayEvent"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_onPlayEvent'", nullptr); + return 0; + } + cobj->onPlayEvent(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:onPlayEvent",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_onPlayEvent'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_isFullScreenEnabled(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_isFullScreenEnabled'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_isFullScreenEnabled'", nullptr); + return 0; + } + bool ret = cobj->isFullScreenEnabled(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:isFullScreenEnabled",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_isFullScreenEnabled'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_isLooping(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_isLooping'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_isLooping'", nullptr); + return 0; + } + bool ret = cobj->isLooping(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:isLooping",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_isLooping'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_isPlaying(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_isPlaying'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_isPlaying'", nullptr); + return 0; + } + bool ret = cobj->isPlaying(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:isPlaying",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_isPlaying'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_setLooping(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_setLooping'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + bool arg0; + + ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccui.VideoPlayer:setLooping"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_setLooping'", nullptr); + return 0; + } + cobj->setLooping(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:setLooping",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_setLooping'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_setUserInputEnabled(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_video_VideoPlayer_setUserInputEnabled'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + bool arg0; + + ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccui.VideoPlayer:setUserInputEnabled"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_setUserInputEnabled'", nullptr); + return 0; + } + cobj->setUserInputEnabled(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:setUserInputEnabled",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_setUserInputEnabled'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_video_VideoPlayer_create(lua_State* tolua_S) +{ + int argc = 0; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertable(tolua_S,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S) - 1; + + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_create'", nullptr); + return 0; + } + cocos2d::ui::VideoPlayer* ret = cocos2d::ui::VideoPlayer::create(); + object_to_luaval(tolua_S, "ccui.VideoPlayer",(cocos2d::ui::VideoPlayer*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccui.VideoPlayer:create",argc, 0); + return 0; +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_create'.",&tolua_err); +#endif + return 0; +} +int lua_cocos2dx_video_VideoPlayer_constructor(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::VideoPlayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_video_VideoPlayer_constructor'", nullptr); + return 0; + } + cobj = new cocos2d::ui::VideoPlayer(); + cobj->autorelease(); + int ID = (int)cobj->_ID ; + int* luaID = &cobj->_luaID ; + toluafix_pushusertype_ccobject(tolua_S, ID, luaID, (void*)cobj,"ccui.VideoPlayer"); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.VideoPlayer:VideoPlayer",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_video_VideoPlayer_constructor'.",&tolua_err); +#endif + + return 0; +} + +static int lua_cocos2dx_video_VideoPlayer_finalize(lua_State* tolua_S) +{ + printf("luabindings: finalizing LUA object (VideoPlayer)"); + return 0; +} + +int lua_register_cocos2dx_video_VideoPlayer(lua_State* tolua_S) +{ + tolua_usertype(tolua_S,"ccui.VideoPlayer"); + tolua_cclass(tolua_S,"VideoPlayer","ccui.VideoPlayer","ccui.Widget",nullptr); + + tolua_beginmodule(tolua_S,"VideoPlayer"); + tolua_function(tolua_S,"new",lua_cocos2dx_video_VideoPlayer_constructor); + tolua_function(tolua_S,"getFileName",lua_cocos2dx_video_VideoPlayer_getFileName); + tolua_function(tolua_S,"getURL",lua_cocos2dx_video_VideoPlayer_getURL); + tolua_function(tolua_S,"play",lua_cocos2dx_video_VideoPlayer_play); + tolua_function(tolua_S,"isUserInputEnabled",lua_cocos2dx_video_VideoPlayer_isUserInputEnabled); + tolua_function(tolua_S,"setKeepAspectRatioEnabled",lua_cocos2dx_video_VideoPlayer_setKeepAspectRatioEnabled); + tolua_function(tolua_S,"stop",lua_cocos2dx_video_VideoPlayer_stop); + tolua_function(tolua_S,"setFullScreenEnabled",lua_cocos2dx_video_VideoPlayer_setFullScreenEnabled); + tolua_function(tolua_S,"setFileName",lua_cocos2dx_video_VideoPlayer_setFileName); + tolua_function(tolua_S,"setURL",lua_cocos2dx_video_VideoPlayer_setURL); + tolua_function(tolua_S,"setStyle",lua_cocos2dx_video_VideoPlayer_setStyle); + tolua_function(tolua_S,"seekTo",lua_cocos2dx_video_VideoPlayer_seekTo); + tolua_function(tolua_S,"isKeepAspectRatioEnabled",lua_cocos2dx_video_VideoPlayer_isKeepAspectRatioEnabled); + tolua_function(tolua_S,"onPlayEvent",lua_cocos2dx_video_VideoPlayer_onPlayEvent); + tolua_function(tolua_S,"isFullScreenEnabled",lua_cocos2dx_video_VideoPlayer_isFullScreenEnabled); + tolua_function(tolua_S,"isLooping",lua_cocos2dx_video_VideoPlayer_isLooping); + tolua_function(tolua_S,"isPlaying",lua_cocos2dx_video_VideoPlayer_isPlaying); + tolua_function(tolua_S,"setLooping",lua_cocos2dx_video_VideoPlayer_setLooping); + tolua_function(tolua_S,"setUserInputEnabled",lua_cocos2dx_video_VideoPlayer_setUserInputEnabled); + tolua_function(tolua_S,"create", lua_cocos2dx_video_VideoPlayer_create); + tolua_endmodule(tolua_S); + std::string typeName = typeid(cocos2d::ui::VideoPlayer).name(); + g_luaType[typeName] = "ccui.VideoPlayer"; + g_typeCast["VideoPlayer"] = "ccui.VideoPlayer"; + return 1; +} +TOLUA_API int register_all_cocos2dx_video(lua_State* tolua_S) +{ + tolua_open(tolua_S); + + tolua_module(tolua_S,"ccui",0); + tolua_beginmodule(tolua_S,"ccui"); + + lua_register_cocos2dx_video_VideoPlayer(tolua_S); + + tolua_endmodule(tolua_S); + return 1; +} + diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_video_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_video_auto.hpp new file mode 100644 index 0000000000..31ac70ecb2 --- /dev/null +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_video_auto.hpp @@ -0,0 +1,36 @@ +#include "base/ccConfig.h" +#ifndef __cocos2dx_video_h__ +#define __cocos2dx_video_h__ + +#ifdef __cplusplus +extern "C" { +#endif +#include "tolua++.h" +#ifdef __cplusplus +} +#endif + +int register_all_cocos2dx_video(lua_State* tolua_S); + + + + + + + + + + + + + + + + + + + + + + +#endif // __cocos2dx_video_h__ diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_webview_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_webview_auto.cpp new file mode 100644 index 0000000000..baf0094bf0 --- /dev/null +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_webview_auto.cpp @@ -0,0 +1,975 @@ +#include "scripting/lua-bindings/auto/lua_cocos2dx_webview_auto.hpp" +#include "ui/UIWebView/UIWebView.h" +#include "scripting/lua-bindings/manual/tolua_fix.h" +#include "scripting/lua-bindings/manual/LuaBasicConversions.h" + +int lua_cocos2dx_webview_WebView_setOpacityWebView(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_setOpacityWebView'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + double arg0; + + ok &= luaval_to_number(tolua_S, 2,&arg0, "ccui.WebView:setOpacityWebView"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_setOpacityWebView'", nullptr); + return 0; + } + cobj->setOpacityWebView(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:setOpacityWebView",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_setOpacityWebView'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_canGoBack(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_canGoBack'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_canGoBack'", nullptr); + return 0; + } + bool ret = cobj->canGoBack(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:canGoBack",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_canGoBack'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_loadHTMLString(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_loadHTMLString'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:loadHTMLString"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_loadHTMLString'", nullptr); + return 0; + } + cobj->loadHTMLString(arg0); + lua_settop(tolua_S, 1); + return 1; + } + if (argc == 2) + { + std::string arg0; + std::string arg1; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:loadHTMLString"); + + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "ccui.WebView:loadHTMLString"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_loadHTMLString'", nullptr); + return 0; + } + cobj->loadHTMLString(arg0, arg1); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:loadHTMLString",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_loadHTMLString'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_goForward(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_goForward'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_goForward'", nullptr); + return 0; + } + cobj->goForward(); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:goForward",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_goForward'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_goBack(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_goBack'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_goBack'", nullptr); + return 0; + } + cobj->goBack(); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:goBack",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_goBack'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_setScalesPageToFit(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_setScalesPageToFit'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + bool arg0; + + ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccui.WebView:setScalesPageToFit"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_setScalesPageToFit'", nullptr); + return 0; + } + cobj->setScalesPageToFit(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:setScalesPageToFit",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_setScalesPageToFit'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_loadFile(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_loadFile'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:loadFile"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_loadFile'", nullptr); + return 0; + } + cobj->loadFile(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:loadFile",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_loadFile'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_loadURL(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_loadURL'", nullptr); + return 0; + } +#endif + argc = lua_gettop(tolua_S)-1; + do{ + if (argc == 2) { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:loadURL"); + + if (!ok) { break; } + bool arg1; + ok &= luaval_to_boolean(tolua_S, 3,&arg1, "ccui.WebView:loadURL"); + + if (!ok) { break; } + cobj->loadURL(arg0, arg1); + lua_settop(tolua_S, 1); + return 1; + } + }while(0); + ok = true; + do{ + if (argc == 1) { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:loadURL"); + + if (!ok) { break; } + cobj->loadURL(arg0); + lua_settop(tolua_S, 1); + return 1; + } + }while(0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:loadURL",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_loadURL'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_setBounces(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_setBounces'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + bool arg0; + + ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccui.WebView:setBounces"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_setBounces'", nullptr); + return 0; + } + cobj->setBounces(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:setBounces",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_setBounces'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_evaluateJS(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_evaluateJS'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:evaluateJS"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_evaluateJS'", nullptr); + return 0; + } + cobj->evaluateJS(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:evaluateJS",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_evaluateJS'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_setBackgroundTransparent(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_setBackgroundTransparent'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_setBackgroundTransparent'", nullptr); + return 0; + } + cobj->setBackgroundTransparent(); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:setBackgroundTransparent",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_setBackgroundTransparent'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_getOnJSCallback(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_getOnJSCallback'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_getOnJSCallback'", nullptr); + return 0; + } + cocos2d::ui::WebView::ccWebViewCallback ret = cobj->getOnJSCallback(); + #pragma warning NO CONVERSION FROM NATIVE FOR std::function; + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:getOnJSCallback",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_getOnJSCallback'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_canGoForward(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_canGoForward'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_canGoForward'", nullptr); + return 0; + } + bool ret = cobj->canGoForward(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:canGoForward",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_canGoForward'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_stopLoading(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_stopLoading'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_stopLoading'", nullptr); + return 0; + } + cobj->stopLoading(); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:stopLoading",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_stopLoading'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_getOpacityWebView(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_getOpacityWebView'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_getOpacityWebView'", nullptr); + return 0; + } + double ret = cobj->getOpacityWebView(); + tolua_pushnumber(tolua_S,(lua_Number)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:getOpacityWebView",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_getOpacityWebView'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_reload(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_reload'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_reload'", nullptr); + return 0; + } + cobj->reload(); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:reload",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_reload'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_setJavascriptInterfaceScheme(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_webview_WebView_setJavascriptInterfaceScheme'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:setJavascriptInterfaceScheme"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_setJavascriptInterfaceScheme'", nullptr); + return 0; + } + cobj->setJavascriptInterfaceScheme(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:setJavascriptInterfaceScheme",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_setJavascriptInterfaceScheme'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_webview_WebView_create(lua_State* tolua_S) +{ + int argc = 0; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertable(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S) - 1; + + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_create'", nullptr); + return 0; + } + cocos2d::ui::WebView* ret = cocos2d::ui::WebView::create(); + object_to_luaval(tolua_S, "ccui.WebView",(cocos2d::ui::WebView*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccui.WebView:create",argc, 0); + return 0; +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_create'.",&tolua_err); +#endif + return 0; +} +int lua_cocos2dx_webview_WebView_constructor(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::WebView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_webview_WebView_constructor'", nullptr); + return 0; + } + cobj = new cocos2d::ui::WebView(); + cobj->autorelease(); + int ID = (int)cobj->_ID ; + int* luaID = &cobj->_luaID ; + toluafix_pushusertype_ccobject(tolua_S, ID, luaID, (void*)cobj,"ccui.WebView"); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:WebView",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_webview_WebView_constructor'.",&tolua_err); +#endif + + return 0; +} + +static int lua_cocos2dx_webview_WebView_finalize(lua_State* tolua_S) +{ + printf("luabindings: finalizing LUA object (WebView)"); + return 0; +} + +int lua_register_cocos2dx_webview_WebView(lua_State* tolua_S) +{ + tolua_usertype(tolua_S,"ccui.WebView"); + tolua_cclass(tolua_S,"WebView","ccui.WebView","ccui.Widget",nullptr); + + tolua_beginmodule(tolua_S,"WebView"); + tolua_function(tolua_S,"new",lua_cocos2dx_webview_WebView_constructor); + tolua_function(tolua_S,"setOpacityWebView",lua_cocos2dx_webview_WebView_setOpacityWebView); + tolua_function(tolua_S,"canGoBack",lua_cocos2dx_webview_WebView_canGoBack); + tolua_function(tolua_S,"loadHTMLString",lua_cocos2dx_webview_WebView_loadHTMLString); + tolua_function(tolua_S,"goForward",lua_cocos2dx_webview_WebView_goForward); + tolua_function(tolua_S,"goBack",lua_cocos2dx_webview_WebView_goBack); + tolua_function(tolua_S,"setScalesPageToFit",lua_cocos2dx_webview_WebView_setScalesPageToFit); + tolua_function(tolua_S,"loadFile",lua_cocos2dx_webview_WebView_loadFile); + tolua_function(tolua_S,"loadURL",lua_cocos2dx_webview_WebView_loadURL); + tolua_function(tolua_S,"setBounces",lua_cocos2dx_webview_WebView_setBounces); + tolua_function(tolua_S,"evaluateJS",lua_cocos2dx_webview_WebView_evaluateJS); + tolua_function(tolua_S,"setBackgroundTransparent",lua_cocos2dx_webview_WebView_setBackgroundTransparent); + tolua_function(tolua_S,"getOnJSCallback",lua_cocos2dx_webview_WebView_getOnJSCallback); + tolua_function(tolua_S,"canGoForward",lua_cocos2dx_webview_WebView_canGoForward); + tolua_function(tolua_S,"stopLoading",lua_cocos2dx_webview_WebView_stopLoading); + tolua_function(tolua_S,"getOpacityWebView",lua_cocos2dx_webview_WebView_getOpacityWebView); + tolua_function(tolua_S,"reload",lua_cocos2dx_webview_WebView_reload); + tolua_function(tolua_S,"setJavascriptInterfaceScheme",lua_cocos2dx_webview_WebView_setJavascriptInterfaceScheme); + tolua_function(tolua_S,"create", lua_cocos2dx_webview_WebView_create); + tolua_endmodule(tolua_S); + std::string typeName = typeid(cocos2d::ui::WebView).name(); + g_luaType[typeName] = "ccui.WebView"; + g_typeCast["WebView"] = "ccui.WebView"; + return 1; +} +TOLUA_API int register_all_cocos2dx_webview(lua_State* tolua_S) +{ + tolua_open(tolua_S); + + tolua_module(tolua_S,"ccui",0); + tolua_beginmodule(tolua_S,"ccui"); + + lua_register_cocos2dx_webview_WebView(tolua_S); + + tolua_endmodule(tolua_S); + return 1; +} + diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_webview_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_webview_auto.hpp new file mode 100644 index 0000000000..b3ba8fa20f --- /dev/null +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_webview_auto.hpp @@ -0,0 +1,35 @@ +#include "base/ccConfig.h" +#ifndef __cocos2dx_webview_h__ +#define __cocos2dx_webview_h__ + +#ifdef __cplusplus +extern "C" { +#endif +#include "tolua++.h" +#ifdef __cplusplus +} +#endif + +int register_all_cocos2dx_webview(lua_State* tolua_S); + + + + + + + + + + + + + + + + + + + + + +#endif // __cocos2dx_webview_h__ diff --git a/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp b/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp index 31d0599fa4..2767ca0234 100644 --- a/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp +++ b/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp @@ -52,9 +52,7 @@ extern "C" { #include "scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_deprecated.h" #include "scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.hpp" #include "scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_physics_manual.hpp" -#include "scripting/lua-bindings/auto/lua_cocos2dx_experimental_auto.hpp" #include "scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.hpp" -#include "scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_experimental_manual.hpp" #include "base/ZipUtils.h" #include "scripting/deprecated/CCBool.h" #include "scripting/deprecated/CCDouble.h" @@ -152,9 +150,6 @@ bool LuaStack::init() register_all_cocos2dx_shaders_manual(_state); register_all_cocos2dx_bytearray_manual(_state); - register_all_cocos2dx_experimental(_state); - register_all_cocos2dx_experimental_manual(_state); - tolua_luanode_open(_state); register_luanode_manual(_state); #if CC_USE_PHYSICS diff --git a/cocos/scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.cpp b/cocos/scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.cpp index 91bbe3509c..fc9a715f9d 100644 --- a/cocos/scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.cpp @@ -22,12 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ -#include "platform/CCPlatformConfig.h" - #include "scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.h" - -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_LINUX - #include "scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp" #include "scripting/lua-bindings/manual/tolua_fix.h" #include "scripting/lua-bindings/manual/LuaBasicConversions.h" @@ -36,14 +31,14 @@ static int lua_get_AudioProfile_name(lua_State* L) { - cocos2d::experimental::AudioProfile* self = nullptr; + cocos2d::AudioProfile* self = nullptr; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; - if (!tolua_isusertype(L,1,"ccexp.AudioProfile",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertype(L,1,"cc.AudioProfile",0,&tolua_err)) goto tolua_lerror; #endif - self = (cocos2d::experimental::AudioProfile*) tolua_tousertype(L,1,0); + self = (cocos2d::AudioProfile*) tolua_tousertype(L,1,0); #if COCOS2D_DEBUG >= 1 if (nullptr == self) { @@ -65,14 +60,14 @@ tolua_lerror: static int lua_set_AudioProfile_name(lua_State* L) { int argc = 0; - cocos2d::experimental::AudioProfile* self = nullptr; + cocos2d::AudioProfile* self = nullptr; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; - if (!tolua_isusertype(L,1,"ccexp.AudioProfile",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertype(L,1,"cc.AudioProfile",0,&tolua_err)) goto tolua_lerror; #endif - self = (cocos2d::experimental::AudioProfile*) tolua_tousertype(L,1,0); + self = (cocos2d::AudioProfile*) tolua_tousertype(L,1,0); #if COCOS2D_DEBUG >= 1 if (nullptr == self) { @@ -104,14 +99,14 @@ tolua_lerror: static int lua_get_AudioProfile_maxInstances(lua_State* L) { - cocos2d::experimental::AudioProfile* self = nullptr; + cocos2d::AudioProfile* self = nullptr; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; - if (!tolua_isusertype(L,1,"ccexp.AudioProfile",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertype(L,1,"cc.AudioProfile",0,&tolua_err)) goto tolua_lerror; #endif - self = (cocos2d::experimental::AudioProfile*) tolua_tousertype(L,1,0); + self = (cocos2d::AudioProfile*) tolua_tousertype(L,1,0); #if COCOS2D_DEBUG >= 1 if (nullptr == self) { @@ -133,14 +128,14 @@ tolua_lerror: static int lua_set_AudioProfile_maxInstances(lua_State* L) { int argc = 0; - cocos2d::experimental::AudioProfile* self = nullptr; + cocos2d::AudioProfile* self = nullptr; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; - if (!tolua_isusertype(L,1,"ccexp.AudioProfile",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertype(L,1,"cc.AudioProfile",0,&tolua_err)) goto tolua_lerror; #endif - self = (cocos2d::experimental::AudioProfile*) tolua_tousertype(L,1,0); + self = (cocos2d::AudioProfile*) tolua_tousertype(L,1,0); #if COCOS2D_DEBUG >= 1 if (nullptr == self) { @@ -172,14 +167,14 @@ tolua_lerror: static int lua_get_AudioProfile_minDelay(lua_State* L) { - cocos2d::experimental::AudioProfile* self = nullptr; + cocos2d::AudioProfile* self = nullptr; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; - if (!tolua_isusertype(L,1,"ccexp.AudioProfile",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertype(L,1,"cc.AudioProfile",0,&tolua_err)) goto tolua_lerror; #endif - self = (cocos2d::experimental::AudioProfile*) tolua_tousertype(L,1,0); + self = (cocos2d::AudioProfile*) tolua_tousertype(L,1,0); #if COCOS2D_DEBUG >= 1 if (nullptr == self) { @@ -201,14 +196,14 @@ tolua_lerror: static int lua_set_AudioProfile_minDelay(lua_State* L) { int argc = 0; - cocos2d::experimental::AudioProfile* self = nullptr; + cocos2d::AudioProfile* self = nullptr; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; - if (!tolua_isusertype(L,1,"ccexp.AudioProfile",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertype(L,1,"cc.AudioProfile",0,&tolua_err)) goto tolua_lerror; #endif - self = (cocos2d::experimental::AudioProfile*) tolua_tousertype(L,1,0); + self = (cocos2d::AudioProfile*) tolua_tousertype(L,1,0); #if COCOS2D_DEBUG >= 1 if (nullptr == self) { @@ -248,7 +243,7 @@ int lua_cocos2dx_audioengine_AudioEngine_setFinishCallback(lua_State* tolua_S) #endif #if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertable(tolua_S,1,"cc.AudioEngine",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; @@ -256,7 +251,7 @@ int lua_cocos2dx_audioengine_AudioEngine_setFinishCallback(lua_State* tolua_S) if (argc == 2) { int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccexp.AudioEngine:setFinishCallback"); + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.AudioEngine:setFinishCallback"); #if COCOS2D_DEBUG >= 1 if (!toluafix_isfunction(tolua_S,3,"LUA_FUNCTION",0,&tolua_err)) @@ -267,7 +262,7 @@ int lua_cocos2dx_audioengine_AudioEngine_setFinishCallback(lua_State* tolua_S) LUA_FUNCTION handler = ( toluafix_ref_function(tolua_S,3,0)); - cocos2d::experimental::AudioEngine::setFinishCallback(arg0, [handler](int audioID, std::string filePath){ + cocos2d::AudioEngine::setFinishCallback(arg0, [handler](int audioID, std::string filePath){ LuaStack* stack = LuaEngine::getInstance()->getLuaStack(); stack->pushInt(audioID); @@ -280,7 +275,7 @@ int lua_cocos2dx_audioengine_AudioEngine_setFinishCallback(lua_State* tolua_S) return 0; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:setFinishCallback",argc, 2); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.AudioEngine:setFinishCallback",argc, 2); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -297,7 +292,7 @@ int register_audioengine_module(lua_State* L) register_all_cocos2dx_audioengine(L); if (L) { - lua_pushstring(L, "ccexp.AudioProfile"); + lua_pushstring(L, "cc.AudioProfile"); lua_rawget(L, LUA_REGISTRYINDEX); if (lua_istable(L,-1)) { @@ -307,7 +302,7 @@ int register_audioengine_module(lua_State* L) } lua_pop(L, 1); - lua_pushstring(L, "ccexp.AudioEngine"); + lua_pushstring(L, "cc.AudioEngine"); lua_rawget(L, LUA_REGISTRYINDEX); if (lua_istable(L,-1)) { @@ -320,12 +315,3 @@ int register_audioengine_module(lua_State* L) return 1; } - -#else - -int register_audioengine_module(lua_State* L) -{ - return 1; -} - -#endif diff --git a/cocos/scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.h b/cocos/scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.h index 26552e372f..07c9dbe4f4 100644 --- a/cocos/scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.h +++ b/cocos/scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.h @@ -22,8 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ -#ifndef COCOS_SCRIPTING_LUA_BINDINGS_MANUAL_AUDIOENGINE_LUA_COCOS2DX_AUDIOENGINE_MANUAL_H__ -#define COCOS_SCRIPTING_LUA_BINDINGS_MANUAL_AUDIOENGINE_LUA_COCOS2DX_AUDIOENGINE_MANUAL_H__ +#pragma once #ifdef __cplusplus extern "C" { @@ -40,7 +39,7 @@ extern "C" { /** * Call this function can import the lua bindings for the audioengine module. - * After registering, we could call the related audioengine code conveniently in the lua.eg,.ccexp.AudioEngine:stop(audioID). + * After registering, we could call the related audioengine code conveniently in the lua.eg,.cc.AudioEngine:stop(audioID). * If you don't want to use the audioengine module in the lua, you only don't call this registering function. * If you don't register the audioengine module, the package size would become smaller . * The current mechanism,this function is called in the lua_module_register.h @@ -50,5 +49,3 @@ TOLUA_API int register_audioengine_module(lua_State* L); // end group /// @} - -#endif // #ifndef COCOS_SCRIPTING_LUA_BINDINGS_MANUAL_AUDIOENGINE_LUA_COCOS2DX_AUDIOENGINE_MANUAL_H__ diff --git a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_experimental_manual.cpp b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_experimental_manual.cpp deleted file mode 100644 index 6d3d7ede1d..0000000000 --- a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_experimental_manual.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/**************************************************************************** - Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. - - 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 "scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_experimental_manual.hpp" -#include "scripting/lua-bindings/manual/tolua_fix.h" -#include "scripting/lua-bindings/manual/LuaBasicConversions.h" -#include "scripting/lua-bindings/manual/CCLuaValue.h" -#include "scripting/lua-bindings/manual/CCLuaEngine.h" -#include "2d/CCFastTMXLayer.h" - -static int lua_cocos2dx_experimental_TMXLayer_getTileGIDAt(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::TMXLayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.TMXLayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::TMXLayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_TMXLayer_getTileGIDAt'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::Vec2 arg0; - - ok &= luaval_to_vec2(tolua_S, 2, &arg0, "ccexp.TMXLayer:getTileGIDAt"); - if(!ok) - return 0; - int ret = cobj->getTileGIDAt(arg0); - tolua_pushnumber(tolua_S,(lua_Number)ret); - tolua_pushnumber(tolua_S,(lua_Number)0); - return 2; - } - if (argc == 2) - { - cocos2d::Vec2 arg0; - int arg1 = 0; - - ok &= luaval_to_vec2(tolua_S, 2, &arg0, "ccexp.TMXLayer:getTileGIDAt"); - ok &= luaval_to_int32(tolua_S, 3, &arg1, "ccexp.TMXLayer:getTileGIDAt"); - - if(!ok) - return 0; - - unsigned int ret = cobj->getTileGIDAt(arg0, (cocos2d::TMXTileFlags*)&arg1); - tolua_pushnumber(tolua_S,(lua_Number)ret); - tolua_pushnumber(tolua_S,(lua_Number)arg1); - return 2; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.TMXLayer:getTileGIDAt",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 -tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_TMXLayer_getTileGIDAt'.",&tolua_err); -#endif - - return 0; -} - -static void extendExperimentalTMXLayer(lua_State* tolua_S) -{ - lua_pushstring(tolua_S, "ccexp.TMXLayer"); - lua_rawget(tolua_S, LUA_REGISTRYINDEX); - if (lua_istable(tolua_S,-1)) - { - tolua_function(tolua_S, "getTileGIDAt", lua_cocos2dx_experimental_TMXLayer_getTileGIDAt); - } - lua_pop(tolua_S, 1); -} - -bool isVectorV3FC4BT2F(lua_State* tolua_S, int lo) -{ - if (!lua_istable(tolua_S, lo)) - return false; - - lua_pushnumber(tolua_S, 1); - lua_gettable(tolua_S,lo); - if (!lua_istable(tolua_S, -1)) - return false; - - lua_pushstring(tolua_S, "vertices"); - lua_gettable(tolua_S, -2); - if (lua_isnil(tolua_S, -1)) - return false; - lua_pop(tolua_S, 1); - - lua_pushstring(tolua_S, "colors"); - lua_gettable(tolua_S, -2); - if (lua_isnil(tolua_S, -1)) - return false; - lua_pop(tolua_S, 1); - - lua_pushstring(tolua_S, "texCoords"); - lua_gettable(tolua_S, -2); - if (lua_isnil(tolua_S, -1)) - return false; - lua_pop(tolua_S, 1); - - return true; -} - -int register_all_cocos2dx_experimental_manual(lua_State* L) -{ - if (nullptr == L) - return 0; - - extendExperimentalTMXLayer(L); - - return 0; -} diff --git a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp index 8aca5b670e..c55a5b9ea1 100644 --- a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp @@ -48,6 +48,8 @@ #include "2d/CCSpriteBatchNode.h" #include "2d/CCTMXLayer.h" #include "2d/CCTMXTiledMap.h" +#include "2d/CCFastTMXLayer.h" +#include "2d/CCFastTMXTiledMap.h" #include "2d/CCRenderTexture.h" #include "base/CCEventDispatcher.h" #include "base/CCEventListenerKeyboard.h" @@ -6676,6 +6678,82 @@ static void extendTMXLayer(lua_State* tolua_S) lua_pop(tolua_S, 1); } +static int lua_cocos2dx_FastTMXLayer_getTileGIDAt(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FastTMXLayer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.FastTMXLayer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FastTMXLayer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FastTMXLayer_getTileGIDAt'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::Vec2 arg0; + + ok &= luaval_to_vec2(tolua_S, 2, &arg0, "cc.FastTMXLayer:getTileGIDAt"); + if(!ok) + return 0; + int ret = cobj->getTileGIDAt(arg0); + tolua_pushnumber(tolua_S,(lua_Number)ret); + tolua_pushnumber(tolua_S,(lua_Number)0); + return 2; + } + if (argc == 2) + { + cocos2d::Vec2 arg0; + int arg1 = 0; + + ok &= luaval_to_vec2(tolua_S, 2, &arg0, "cc.FastTMXLayer:getTileGIDAt"); + ok &= luaval_to_int32(tolua_S, 3, &arg1, "cc.FastTMXLayer:getTileGIDAt"); + + if(!ok) + return 0; + + unsigned int ret = cobj->getTileGIDAt(arg0, (cocos2d::TMXTileFlags*)&arg1); + tolua_pushnumber(tolua_S,(lua_Number)ret); + tolua_pushnumber(tolua_S,(lua_Number)arg1); + return 2; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FastTMXLayer:getTileGIDAt",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 +tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FastTMXLayer_getTileGIDAt'.",&tolua_err); +#endif + + return 0; +} + +static void extendFastTMXLayer(lua_State* tolua_S) +{ + lua_pushstring(tolua_S, "cc.FastTMXLayer"); + lua_rawget(tolua_S, LUA_REGISTRYINDEX); + if (lua_istable(tolua_S,-1)) + { + tolua_function(tolua_S, "getTileGIDAt", lua_cocos2dx_FastTMXLayer_getTileGIDAt); + } + lua_pop(tolua_S, 1); +} + int lua_cocos2dx_Application_isIOS64bit(lua_State* tolua_S) { @@ -7624,6 +7702,7 @@ int register_all_cocos2dx_manual(lua_State* tolua_S) extendConsole(tolua_S); extendOrbitCamera(tolua_S); extendTMXLayer(tolua_S); + extendFastTMXLayer(tolua_S); extendApplication(tolua_S); extendTextureCache(tolua_S); extendGLView(tolua_S); diff --git a/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_webview_manual.hpp b/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_webview_manual.hpp deleted file mode 100644 index feeb1f9203..0000000000 --- a/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_webview_manual.hpp +++ /dev/null @@ -1,42 +0,0 @@ -/**************************************************************************** - Copyright (c) 2013-2016 Chukong Technologies Inc. - Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. - - 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 "base/ccConfig.h" -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) - -#ifndef COCOS_SCRIPTING_LUA_BINDINGS_LUA_COCOS2DX_EXPERIMENTAL_WEBVIEW_MANUAL_H -#define COCOS_SCRIPTING_LUA_BINDINGS_LUA_COCOS2DX_EXPERIMENTAL_WEBVIEW_MANUAL_H - -#ifdef __cplusplus -extern "C" { -#endif -#include "tolua++.h" -#ifdef __cplusplus -} -#endif - -TOLUA_API int register_all_cocos2dx_experimental_webview_manual(lua_State* L); - -#endif //#ifndef COCOS_SCRIPTING_LUA_BINDINGS_LUA_COCOS2DX_EXPERIMENTAL_WEBVIEW_MANUAL_H -#endif //#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) diff --git a/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_ui_manual.cpp b/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_ui_manual.cpp index ed30f98f4e..0a46ceba76 100644 --- a/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_ui_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_ui_manual.cpp @@ -25,10 +25,10 @@ #include "scripting/lua-bindings/manual/ui/lua_cocos2dx_ui_manual.hpp" #include "scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp" #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_TARGET_OS_TVOS) -#include "scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.hpp" -#include "scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_video_manual.hpp" -#include "scripting/lua-bindings/auto/lua_cocos2dx_experimental_webview_auto.hpp" -#include "scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_webview_manual.hpp" +#include "scripting/lua-bindings/auto/lua_cocos2dx_video_auto.hpp" +#include "scripting/lua-bindings/manual/ui/lua_cocos2dx_video_manual.hpp" +#include "scripting/lua-bindings/auto/lua_cocos2dx_webview_auto.hpp" +#include "scripting/lua-bindings/manual/ui/lua_cocos2dx_webview_manual.hpp" #endif #include "scripting/lua-bindings/manual/tolua_fix.h" @@ -1183,10 +1183,10 @@ int register_ui_module(lua_State* L) register_all_cocos2dx_ui(L); register_all_cocos2dx_ui_manual(L); #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_TARGET_OS_TVOS) - register_all_cocos2dx_experimental_video(L); - register_all_cocos2dx_experimental_video_manual(L); - register_all_cocos2dx_experimental_webview(L); - register_all_cocos2dx_experimental_webview_manual(L); + register_all_cocos2dx_video(L); + register_all_cocos2dx_video_manual(L); + register_all_cocos2dx_webview(L); + register_all_cocos2dx_webview_manual(L); #endif extendEventListenerFocusEvent(L); } diff --git a/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_video_manual.cpp b/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_video_manual.cpp similarity index 73% rename from cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_video_manual.cpp rename to cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_video_manual.cpp index f6a2f2df46..6652f25efb 100644 --- a/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_video_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_video_manual.cpp @@ -21,11 +21,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - -#include "scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_video_manual.hpp" - -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) - +#include "scripting/lua-bindings/manual/ui/lua_cocos2dx_video_manual.hpp" #include "ui/UIVideoPlayer.h" #include "scripting/lua-bindings/manual/tolua_fix.h" #include "scripting/lua-bindings/manual/LuaBasicConversions.h" @@ -34,18 +30,18 @@ -static int lua_cocos2dx_experimental_video_VideoPlayer_addEventListener(lua_State* L) +static int lua_cocos2dx_video_VideoPlayer_addEventListener(lua_State* L) { int argc = 0; - cocos2d::experimental::ui::VideoPlayer* self = nullptr; + cocos2d::ui::VideoPlayer* self = nullptr; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; - if (!tolua_isusertype(L,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertype(L,1,"ccui.VideoPlayer",0,&tolua_err)) goto tolua_lerror; #endif - self = static_cast(tolua_tousertype(L,1,0)); + self = static_cast(tolua_tousertype(L,1,0)); #if COCOS2D_DEBUG >= 1 if (nullptr == self) { @@ -67,7 +63,7 @@ static int lua_cocos2dx_experimental_video_VideoPlayer_addEventListener(lua_Stat LUA_FUNCTION handler = ( toluafix_ref_function(L,2,0)); - self->addEventListener([=](cocos2d::Ref* ref, cocos2d::experimental::ui::VideoPlayer::EventType eventType){ + self->addEventListener([=](cocos2d::Ref* ref, cocos2d::ui::VideoPlayer::EventType eventType){ LuaStack* stack = LuaEngine::getInstance()->getLuaStack(); stack->pushObject(ref, "cc.Ref"); @@ -78,27 +74,27 @@ static int lua_cocos2dx_experimental_video_VideoPlayer_addEventListener(lua_Stat return 0; } - luaL_error(L, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.VideoPlayer:addEventListener",argc, 0); + luaL_error(L, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccui.VideoPlayer:addEventListener",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(L, "#ferror in function 'lua_cocos2dx_experimental_VideoPlayer_addEventListener'.", &tolua_err); + tolua_error(L, "#ferror in function 'lua_cocos2dx_VideoPlayer_addEventListener'.", &tolua_err); #endif return 0; } static void extendVideoPlayer(lua_State* L) { - lua_pushstring(L, "ccexp.VideoPlayer"); + lua_pushstring(L, "ccui.VideoPlayer"); lua_rawget(L, LUA_REGISTRYINDEX); if (lua_istable(L,-1)) { - tolua_function(L, "addEventListener", lua_cocos2dx_experimental_video_VideoPlayer_addEventListener); + tolua_function(L, "addEventListener", lua_cocos2dx_video_VideoPlayer_addEventListener); } lua_pop(L, 1); } -int register_all_cocos2dx_experimental_video_manual(lua_State* L) +int register_all_cocos2dx_video_manual(lua_State* L) { if (nullptr == L) return 0; @@ -107,5 +103,3 @@ int register_all_cocos2dx_experimental_video_manual(lua_State* L) return 0; } - -#endif diff --git a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_experimental_manual.hpp b/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_video_manual.hpp similarity index 81% rename from cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_experimental_manual.hpp rename to cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_video_manual.hpp index 493ac64572..369f1fd6a4 100644 --- a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_experimental_manual.hpp +++ b/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_video_manual.hpp @@ -22,10 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ -#include "base/ccConfig.h" - -#ifndef COCOS_SCRIPTING_LUA_BINDINGS_LUA_COCOS2DX_EXPERIMENTAL_MANUAL_H -#define COCOS_SCRIPTING_LUA_BINDINGS_LUA_COCOS2DX_EXPERIMENTAL_MANUAL_H +#pragma once #ifdef __cplusplus extern "C" { @@ -35,6 +32,4 @@ extern "C" { } #endif -TOLUA_API int register_all_cocos2dx_experimental_manual(lua_State* L); - -#endif //#ifndef COCOS_SCRIPTING_LUA_BINDINGS_LUA_COCOS2DX_EXPERIMENTAL_MANUAL_H +TOLUA_API int register_all_cocos2dx_video_manual(lua_State* L); diff --git a/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_webview_manual.cpp b/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_webview_manual.cpp similarity index 63% rename from cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_webview_manual.cpp rename to cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_webview_manual.cpp index 7d8e80c0eb..8c20622b45 100644 --- a/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_webview_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_webview_manual.cpp @@ -21,10 +21,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - -#include "scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_video_manual.hpp" - -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) +#include "scripting/lua-bindings/manual/ui/lua_cocos2dx_webview_manual.hpp" #include "ui/UIWebView/UIWebView.h" #include "scripting/lua-bindings/manual/tolua_fix.h" @@ -34,22 +31,22 @@ -static int lua_cocos2dx_experimental_WebView_setOnShouldStartLoading(lua_State* L) +static int lua_cocos2dx_WebView_setOnShouldStartLoading(lua_State* L) { int argc = 0; - cocos2d::experimental::ui::WebView* self = nullptr; + cocos2d::ui::WebView* self = nullptr; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; - if (!tolua_isusertype(L,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertype(L,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; #endif - self = static_cast(tolua_tousertype(L,1,0)); + self = static_cast(tolua_tousertype(L,1,0)); #if COCOS2D_DEBUG >= 1 if (nullptr == self) { - tolua_error(L,"invalid 'self' in function 'lua_cocos2dx_experimental_WebView_setOnShouldStartLoading'\n", nullptr); + tolua_error(L,"invalid 'self' in function 'lua_cocos2dx_WebView_setOnShouldStartLoading'\n", nullptr); return 0; } #endif @@ -66,8 +63,8 @@ static int lua_cocos2dx_experimental_WebView_setOnShouldStartLoading(lua_State* #endif LUA_FUNCTION handler = ( toluafix_ref_function(L,2,0)); - std::function callback = [L,handler](experimental::ui::WebView *sender, const std::string &url)->bool{ - toluafix_pushusertype_ccobject(L, sender->_ID, &(sender->_luaID), (void*)sender,"ccexp.WebView"); + std::function callback = [L,handler](ui::WebView *sender, const std::string &url)->bool{ + toluafix_pushusertype_ccobject(L, sender->_ID, &(sender->_luaID), (void*)sender,"ccui.WebView"); tolua_pushcppstring(L, url); return LuaEngine::getInstance()->getLuaStack()->executeFunctionByHandler(handler, 2); }; @@ -77,31 +74,31 @@ static int lua_cocos2dx_experimental_WebView_setOnShouldStartLoading(lua_State* return 0; } - luaL_error(L, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.WebView:setOnShouldStartLoading",argc, 1); + luaL_error(L, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccui.WebView:setOnShouldStartLoading",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(L, "#ferror in function 'lua_cocos2dx_experimental_WebView_setOnShouldStartLoading'.", &tolua_err); + tolua_error(L, "#ferror in function 'lua_cocos2dx_WebView_setOnShouldStartLoading'.", &tolua_err); #endif return 0; } -static int lua_cocos2dx_experimental_WebView_setOnDidFinishLoading(lua_State* L) +static int lua_cocos2dx_WebView_setOnDidFinishLoading(lua_State* L) { int argc = 0; - cocos2d::experimental::ui::WebView* self = nullptr; + cocos2d::ui::WebView* self = nullptr; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; - if (!tolua_isusertype(L,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertype(L,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; #endif - self = static_cast(tolua_tousertype(L,1,0)); + self = static_cast(tolua_tousertype(L,1,0)); #if COCOS2D_DEBUG >= 1 if (nullptr == self) { - tolua_error(L,"invalid 'self' in function 'lua_cocos2dx_experimental_WebView_setOnDidFinishLoading'\n", nullptr); + tolua_error(L,"invalid 'self' in function 'lua_cocos2dx_WebView_setOnDidFinishLoading'\n", nullptr); return 0; } #endif @@ -118,8 +115,8 @@ static int lua_cocos2dx_experimental_WebView_setOnDidFinishLoading(lua_State* L) #endif LUA_FUNCTION handler = ( toluafix_ref_function(L,2,0)); - std::function callback = [L,handler](experimental::ui::WebView *sender, const std::string &url){ - toluafix_pushusertype_ccobject(L, sender->_ID, &(sender->_luaID), (void*)sender,"ccexp.WebView"); + std::function callback = [L,handler](ui::WebView *sender, const std::string &url){ + toluafix_pushusertype_ccobject(L, sender->_ID, &(sender->_luaID), (void*)sender,"ccui.WebView"); tolua_pushcppstring(L, url); LuaEngine::getInstance()->getLuaStack()->executeFunctionByHandler(handler, 2); }; @@ -128,31 +125,31 @@ static int lua_cocos2dx_experimental_WebView_setOnDidFinishLoading(lua_State* L) self->setOnDidFinishLoading(callback); return 0; } - luaL_error(L, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.WebView:setOnDidFinishLoading",argc, 1); + luaL_error(L, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccui.WebView:setOnDidFinishLoading",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(L, "#ferror in function 'lua_cocos2dx_experimental_WebView_setOnDidFinishLoading'.", &tolua_err); + tolua_error(L, "#ferror in function 'lua_cocos2dx_WebView_setOnDidFinishLoading'.", &tolua_err); #endif return 0; } -static int lua_cocos2dx_experimental_WebView_setOnDidFailLoading(lua_State* L) +static int lua_cocos2dx_WebView_setOnDidFailLoading(lua_State* L) { int argc = 0; - cocos2d::experimental::ui::WebView* self = nullptr; + cocos2d::ui::WebView* self = nullptr; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; - if (!tolua_isusertype(L,1,"ccexp.WebView",0,&tolua_err)) goto tolua_lerror; + if (!tolua_isusertype(L,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; #endif - self = static_cast(tolua_tousertype(L,1,0)); + self = static_cast(tolua_tousertype(L,1,0)); #if COCOS2D_DEBUG >= 1 if (nullptr == self) { - tolua_error(L,"invalid 'self' in function 'lua_cocos2dx_experimental_WebView_setOnDidFailLoading'\n", nullptr); + tolua_error(L,"invalid 'self' in function 'lua_cocos2dx_WebView_setOnDidFailLoading'\n", nullptr); return 0; } #endif @@ -169,8 +166,8 @@ static int lua_cocos2dx_experimental_WebView_setOnDidFailLoading(lua_State* L) #endif LUA_FUNCTION handler = ( toluafix_ref_function(L,2,0)); - std::function callback = [L,handler](experimental::ui::WebView *sender, const std::string &url){ - toluafix_pushusertype_ccobject(L, sender->_ID, &(sender->_luaID), (void*)sender,"ccexp.WebView"); + std::function callback = [L,handler](ui::WebView *sender, const std::string &url){ + toluafix_pushusertype_ccobject(L, sender->_ID, &(sender->_luaID), (void*)sender,"ccui.WebView"); tolua_pushcppstring(L, url); LuaEngine::getInstance()->getLuaStack()->executeFunctionByHandler(handler, 2); }; @@ -179,29 +176,29 @@ static int lua_cocos2dx_experimental_WebView_setOnDidFailLoading(lua_State* L) self->setOnDidFailLoading(callback); return 0; } - luaL_error(L, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.WebView:setOnDidFailLoading",argc, 1); + luaL_error(L, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccui.WebView:setOnDidFailLoading",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(L, "#ferror in function 'lua_cocos2dx_experimental_WebView_setOnDidFailLoading'.", &tolua_err); + tolua_error(L, "#ferror in function 'lua_cocos2dx_WebView_setOnDidFailLoading'.", &tolua_err); #endif return 0; } static void extendWebView(lua_State* L) { - lua_pushstring(L, "ccexp.WebView"); + lua_pushstring(L, "ccui.WebView"); lua_rawget(L, LUA_REGISTRYINDEX); if (lua_istable(L,-1)) { - tolua_function(L, "setOnShouldStartLoading", lua_cocos2dx_experimental_WebView_setOnShouldStartLoading); - tolua_function(L, "setOnDidFinishLoading", lua_cocos2dx_experimental_WebView_setOnDidFinishLoading); - tolua_function(L, "setOnDidFailLoading", lua_cocos2dx_experimental_WebView_setOnDidFailLoading); + tolua_function(L, "setOnShouldStartLoading", lua_cocos2dx_WebView_setOnShouldStartLoading); + tolua_function(L, "setOnDidFinishLoading", lua_cocos2dx_WebView_setOnDidFinishLoading); + tolua_function(L, "setOnDidFailLoading", lua_cocos2dx_WebView_setOnDidFailLoading); } lua_pop(L, 1); } -int register_all_cocos2dx_experimental_webview_manual(lua_State* L) +int register_all_cocos2dx_webview_manual(lua_State* L) { if (nullptr == L) return 0; @@ -210,5 +207,3 @@ int register_all_cocos2dx_experimental_webview_manual(lua_State* L) return 0; } - -#endif diff --git a/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_video_manual.hpp b/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_webview_manual.hpp similarity index 72% rename from cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_video_manual.hpp rename to cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_webview_manual.hpp index 0bd585ba61..05fb220099 100644 --- a/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_video_manual.hpp +++ b/cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_webview_manual.hpp @@ -22,11 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ -#include "base/ccConfig.h" -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) - -#ifndef COCOS_SCRIPTING_LUA_BINDINGS_LUA_COCOS2DX_EXPERIMENTAL_VIDEO_MANUAL_H -#define COCOS_SCRIPTING_LUA_BINDINGS_LUA_COCOS2DX_EXPERIMENTAL_VIDEO_MANUAL_H +#pragma once #ifdef __cplusplus extern "C" { @@ -36,7 +32,4 @@ extern "C" { } #endif -TOLUA_API int register_all_cocos2dx_experimental_video_manual(lua_State* L); - -#endif //#ifndef COCOS_SCRIPTING_LUA_BINDINGS_LUA_COCOS2DX_EXPERIMENTAL_VIDEO_MANUAL_H -#endif //#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) +TOLUA_API int register_all_cocos2dx_webview_manual(lua_State* L); diff --git a/cocos/scripting/lua-bindings/manual/video/lua_cocos2dx_experimental_video_manual.cpp b/cocos/scripting/lua-bindings/manual/video/lua_cocos2dx_experimental_video_manual.cpp deleted file mode 100644 index a123f95ca6..0000000000 --- a/cocos/scripting/lua-bindings/manual/video/lua_cocos2dx_experimental_video_manual.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/**************************************************************************** - Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. - - 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 "scripting/lua-bindings/manual/video/lua_cocos2dx_experimental_video_manual.hpp" - -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) - -#include "ui/UIVideoPlayer.h" -#include "scripting/lua-bindings/manual/tolua_fix.h" -#include "scripting/lua-bindings/manual/LuaBasicConversions.h" -#include "scripting/lua-bindings/manual/CCLuaValue.h" -#include "scripting/lua-bindings/manual/CCLuaEngine.h" - - - -static int lua_cocos2dx_experimental_video_VideoPlayer_addEventListener(lua_State* L) -{ - - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* self = nullptr; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; - if (!tolua_isusertype(L,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - self = static_cast(tolua_tousertype(L,1,0)); - -#if COCOS2D_DEBUG >= 1 - if (nullptr == self) { - tolua_error(L,"invalid 'self' in function 'lua_cocos2dx_Widget_addTouchEventListener'\n", nullptr); - return 0; - } -#endif - - argc = lua_gettop(L) - 1; - - if (argc == 1) - { -#if COCOS2D_DEBUG >= 1 - if (!toluafix_isfunction(L,2,"LUA_FUNCTION",0,&tolua_err)) - { - goto tolua_lerror; - } -#endif - - LUA_FUNCTION handler = ( toluafix_ref_function(L,2,0)); - - self->addEventListener([=](cocos2d::Ref* ref, cocos2d::experimental::ui::VideoPlayer::EventType eventType){ - LuaStack* stack = LuaEngine::getInstance()->getLuaStack(); - - stack->pushObject(ref, "cc.Ref"); - stack->pushInt((int)eventType); - - stack->executeFunctionByHandler(handler, 2); - }); - - return 0; - } - CCLOG("%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.VideoPlayer:addEventListener",argc, 0); - return 0; -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(L, "#ferror in function 'lua_cocos2dx_experimental_VideoPlayer_addEventListener'.", &tolua_err); -#endif - return 0; -} - -static void extendVideoPlayer(lua_State* L) -{ - lua_pushstring(L, "ccexp.VideoPlayer"); - lua_rawget(L, LUA_REGISTRYINDEX); - if (lua_istable(L,-1)) - { - tolua_function(L, "addEventListener", lua_cocos2dx_experimental_video_VideoPlayer_addEventListener); - } - lua_pop(L, 1); -} - -int register_all_cocos2dx_experimental_video_manual(lua_State* L) -{ - if (nullptr == L) - return 0; - - extendVideoPlayer(L); - - return 0; -} - -#endif diff --git a/cocos/scripting/lua-bindings/manual/video/lua_cocos2dx_experimental_video_manual.hpp b/cocos/scripting/lua-bindings/manual/video/lua_cocos2dx_experimental_video_manual.hpp deleted file mode 100644 index 0bd585ba61..0000000000 --- a/cocos/scripting/lua-bindings/manual/video/lua_cocos2dx_experimental_video_manual.hpp +++ /dev/null @@ -1,42 +0,0 @@ -/**************************************************************************** - Copyright (c) 2013-2016 Chukong Technologies Inc. - Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. - - 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 "base/ccConfig.h" -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) - -#ifndef COCOS_SCRIPTING_LUA_BINDINGS_LUA_COCOS2DX_EXPERIMENTAL_VIDEO_MANUAL_H -#define COCOS_SCRIPTING_LUA_BINDINGS_LUA_COCOS2DX_EXPERIMENTAL_VIDEO_MANUAL_H - -#ifdef __cplusplus -extern "C" { -#endif -#include "tolua++.h" -#ifdef __cplusplus -} -#endif - -TOLUA_API int register_all_cocos2dx_experimental_video_manual(lua_State* L); - -#endif //#ifndef COCOS_SCRIPTING_LUA_BINDINGS_LUA_COCOS2DX_EXPERIMENTAL_VIDEO_MANUAL_H -#endif //#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) diff --git a/cocos/scripting/lua-bindings/script/init.lua b/cocos/scripting/lua-bindings/script/init.lua index dc72992ce6..6c8eeb20ba 100644 --- a/cocos/scripting/lua-bindings/script/init.lua +++ b/cocos/scripting/lua-bindings/script/init.lua @@ -41,7 +41,6 @@ end -- ui if nil ~= ccui then require "cocos.ui.GuiConstants" - require "cocos.ui.experimentalUIConstants" end -- extensions diff --git a/cocos/scripting/lua-bindings/script/ui/GuiConstants.lua b/cocos/scripting/lua-bindings/script/ui/GuiConstants.lua index 2801a9a22f..b116af6d69 100644 --- a/cocos/scripting/lua-bindings/script/ui/GuiConstants.lua +++ b/cocos/scripting/lua-bindings/script/ui/GuiConstants.lua @@ -220,3 +220,10 @@ ccui.LayoutComponent.VerticalEdge = { Top = 2, Center = 3, } + +ccui.VideoPlayerEvent = { + PLAYING = 0, + PAUSED = 1, + STOPPED= 2, + COMPLETED =3, +} diff --git a/cocos/scripting/lua-bindings/script/ui/experimentalUIConstants.lua b/cocos/scripting/lua-bindings/script/ui/experimentalUIConstants.lua deleted file mode 100644 index b2bcc05bf1..0000000000 --- a/cocos/scripting/lua-bindings/script/ui/experimentalUIConstants.lua +++ /dev/null @@ -1,10 +0,0 @@ -if nil == ccexp then - return -end - -ccexp.VideoPlayerEvent = { - PLAYING = 0, - PAUSED = 1, - STOPPED= 2, - COMPLETED =3, -} diff --git a/cocos/ui/UIVideoPlayer-android.cpp b/cocos/ui/UIVideoPlayer-android.cpp index 344f7960ad..61307920ac 100644 --- a/cocos/ui/UIVideoPlayer-android.cpp +++ b/cocos/ui/UIVideoPlayer-android.cpp @@ -87,7 +87,7 @@ void setUserInputEnabledJNI(int index, bool enableInput) //----------------------------------------------------------------------------------------------------------- -using namespace cocos2d::experimental::ui; +using namespace cocos2d::ui; static std::unordered_map s_allVideoPlayers; diff --git a/cocos/ui/UIVideoPlayer-ios.mm b/cocos/ui/UIVideoPlayer-ios.mm index 248f6a285a..2a279108cf 100644 --- a/cocos/ui/UIVideoPlayer-ios.mm +++ b/cocos/ui/UIVideoPlayer-ios.mm @@ -28,7 +28,7 @@ // No Available on tvOS #if CC_TARGET_PLATFORM == CC_PLATFORM_IOS && !defined(CC_TARGET_OS_TVOS) -using namespace cocos2d::experimental::ui; +using namespace cocos2d::ui; //------------------------------------------------------------------------------------- #include "platform/ios/CCEAGLView-ios.h" diff --git a/cocos/ui/UIVideoPlayer.h b/cocos/ui/UIVideoPlayer.h index 4e8be1c9c5..166c411afd 100644 --- a/cocos/ui/UIVideoPlayer.h +++ b/cocos/ui/UIVideoPlayer.h @@ -22,9 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - -#ifndef __COCOS2D_UI_VIDEOWEIGTH_H_ -#define __COCOS2D_UI_VIDEOWEIGTH_H_ +#pragma once #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) && !defined(CC_PLATFORM_OS_TVOS) @@ -36,236 +34,233 @@ */ NS_CC_BEGIN -namespace experimental{ - namespace ui{ +namespace ui{ + + /** + * @class VideoPlayer + * @brief Displays a video file. + * + * @note VideoPlayer displays a video file base on system widget. + * It's mean VideoPlayer displays a video file above all graphical elements of cocos2d-x. + * @js NA + */ + class VideoPlayer : public cocos2d::ui::Widget + { + public: + /** + * Videoplayer play event type. + */ + enum class EventType + { + PLAYING = 0, + PAUSED, + STOPPED, + COMPLETED, + ERROR + }; + + /** + * Styles of how the the video player is presented + * For now only used on iOS to use either MPMovieControlStyleEmbedded (DEFAULT) or + * MPMovieControlStyleNone (NONE) + */ + enum class StyleType + { + DEFAULT = 0, + NONE + }; /** - * @class VideoPlayer - * @brief Displays a video file. - * - * @note VideoPlayer displays a video file base on system widget. - * It's mean VideoPlayer displays a video file above all graphical elements of cocos2d-x. - * @js NA + * A callback which will be called after specific VideoPlayer event happens. */ - class VideoPlayer : public cocos2d::ui::Widget - { - public: - /** - * Videoplayer play event type. - */ - enum class EventType - { - PLAYING = 0, - PAUSED, - STOPPED, - COMPLETED, - ERROR - }; - - /** - * Styles of how the the video player is presented - * For now only used on iOS to use either MPMovieControlStyleEmbedded (DEFAULT) or - * MPMovieControlStyleNone (NONE) - */ - enum class StyleType - { - DEFAULT = 0, - NONE - }; + typedef std::function ccVideoPlayerCallback; - /** - * A callback which will be called after specific VideoPlayer event happens. - */ - typedef std::function ccVideoPlayerCallback; + /** + *Static create method for instancing a VideoPlayer. + */ + CREATE_FUNC(VideoPlayer); - /** - *Static create method for instancing a VideoPlayer. - */ - CREATE_FUNC(VideoPlayer); + /** + * Sets a file path as a video source for VideoPlayer. + */ + virtual void setFileName(const std::string& videoPath); + + /** + * @brief Get the local video file name. + * + * @return The video file name. + */ + virtual const std::string& getFileName() const { return _videoURL;} - /** - * Sets a file path as a video source for VideoPlayer. - */ - virtual void setFileName(const std::string& videoPath); - - /** - * @brief Get the local video file name. - * - * @return The video file name. - */ - virtual const std::string& getFileName() const { return _videoURL;} + /** + * Sets a URL as a video source for VideoPlayer. + */ + virtual void setURL(const std::string& _videoURL); - /** - * Sets a URL as a video source for VideoPlayer. - */ - virtual void setURL(const std::string& _videoURL); + + /** + * @brief Get the URL of remoting video source. + * + * @return A remoting URL address. + */ + virtual const std::string& getURL() const { return _videoURL;} + + /** + * @brief Set if playback is done in loop mode + * + * @param looping the video will or not automatically restart at the end + */ + virtual void setLooping(bool looping); + + /** + * Set if the player will enable user input for basic pause and resume of video + * + * @param enableInput If true, input will be handled for basic functionality (pause/resume) + */ + virtual void setUserInputEnabled(bool enableInput); + + /** + * Set the style of the player + * + * @param style The corresponding style + */ + virtual void setStyle(StyleType style); - - /** - * @brief Get the URL of remoting video source. - * - * @return A remoting URL address. - */ - virtual const std::string& getURL() const { return _videoURL;} - - /** - * @brief Set if playback is done in loop mode - * - * @param looping the video will or not automatically restart at the end - */ - virtual void setLooping(bool looping); - - /** - * Set if the player will enable user input for basic pause and resume of video - * - * @param enableInput If true, input will be handled for basic functionality (pause/resume) - */ - virtual void setUserInputEnabled(bool enableInput); - - /** - * Set the style of the player - * - * @param style The corresponding style - */ - virtual void setStyle(StyleType style); + /** + * Starts playback. + */ + virtual void play(); - /** - * Starts playback. - */ - virtual void play(); + /** + * Pauses playback. + */ + virtual void pause()override; - /** - * Pauses playback. - */ - virtual void pause()override; + /** + * Resumes playback. + */ + virtual void resume()override; - /** - * Resumes playback. - */ - virtual void resume()override; + /** + * Stops playback. + */ + virtual void stop(); - /** - * Stops playback. - */ - virtual void stop(); + /** + * Seeks to specified time position. + * + * @param sec The offset in seconds from the start to seek to. + */ + virtual void seekTo(float sec); - /** - * Seeks to specified time position. - * - * @param sec The offset in seconds from the start to seek to. - */ - virtual void seekTo(float sec); - - /** - * Checks whether the VideoPlayer is playing. - * - * @return True if currently playing, false otherwise. - */ - virtual bool isPlaying() const; - - /** - * Checks whether the VideoPlayer is set with looping mode. - * - * @return true if the videoplayer is set to loop, false otherwise. - */ - virtual bool isLooping() const; + /** + * Checks whether the VideoPlayer is playing. + * + * @return True if currently playing, false otherwise. + */ + virtual bool isPlaying() const; + + /** + * Checks whether the VideoPlayer is set with looping mode. + * + * @return true if the videoplayer is set to loop, false otherwise. + */ + virtual bool isLooping() const; - /** - * Checks whether the VideoPlayer is set to listen user input to resume and pause the video - * - * @return true if the videoplayer user input is set, false otherwise. - */ - virtual bool isUserInputEnabled() const; - + /** + * Checks whether the VideoPlayer is set to listen user input to resume and pause the video + * + * @return true if the videoplayer user input is set, false otherwise. + */ + virtual bool isUserInputEnabled() const; + - /** - * Causes the video player to keep aspect ratio or no when displaying the video. - * - * @param enable Specify true to keep aspect ratio or false to scale the video until - * both dimensions fit the visible bounds of the view exactly. - */ - virtual void setKeepAspectRatioEnabled(bool enable); + /** + * Causes the video player to keep aspect ratio or no when displaying the video. + * + * @param enable Specify true to keep aspect ratio or false to scale the video until + * both dimensions fit the visible bounds of the view exactly. + */ + virtual void setKeepAspectRatioEnabled(bool enable); - /** - * Indicates whether the video player keep aspect ratio when displaying the video. - */ - virtual bool isKeepAspectRatioEnabled()const { return _keepAspectRatioEnabled;} + /** + * Indicates whether the video player keep aspect ratio when displaying the video. + */ + virtual bool isKeepAspectRatioEnabled()const { return _keepAspectRatioEnabled;} - /** - * Causes the video player to enter or exit full-screen mode. - * - * @param fullscreen Specify true to enter full-screen mode or false to exit full-screen mode. - */ - virtual void setFullScreenEnabled(bool fullscreen); + /** + * Causes the video player to enter or exit full-screen mode. + * + * @param fullscreen Specify true to enter full-screen mode or false to exit full-screen mode. + */ + virtual void setFullScreenEnabled(bool fullscreen); - /** - * Indicates whether the video player is in full-screen mode. - * - * @return True if the video player is in full-screen mode, false otherwise. - */ - virtual bool isFullScreenEnabled()const; + /** + * Indicates whether the video player is in full-screen mode. + * + * @return True if the video player is in full-screen mode, false otherwise. + */ + virtual bool isFullScreenEnabled()const; - /** - * Register a callback to be invoked when the video state is updated. - * - * @param callback The callback that will be run. - */ - virtual void addEventListener(const VideoPlayer::ccVideoPlayerCallback& callback); - - /** - * @brief A function which will be called when video is playing. - * - * @param event @see VideoPlayer::EventType. - - */ - virtual void onPlayEvent(int event); - virtual void setVisible(bool visible) override; - virtual void draw(Renderer *renderer, const Mat4& transform, uint32_t flags) override; - virtual void onEnter() override; - virtual void onExit() override; + /** + * Register a callback to be invoked when the video state is updated. + * + * @param callback The callback that will be run. + */ + virtual void addEventListener(const VideoPlayer::ccVideoPlayerCallback& callback); + + /** + * @brief A function which will be called when video is playing. + * + * @param event @see VideoPlayer::EventType. + + */ + virtual void onPlayEvent(int event); + virtual void setVisible(bool visible) override; + virtual void draw(Renderer *renderer, const Mat4& transform, uint32_t flags) override; + virtual void onEnter() override; + virtual void onExit() override; - protected: - virtual cocos2d::ui::Widget* createCloneInstance() override; - virtual void copySpecialProperties(Widget* model) override; - - CC_CONSTRUCTOR_ACCESS: - VideoPlayer(); - virtual ~VideoPlayer(); + protected: + virtual cocos2d::ui::Widget* createCloneInstance() override; + virtual void copySpecialProperties(Widget* model) override; + + CC_CONSTRUCTOR_ACCESS: + VideoPlayer(); + virtual ~VideoPlayer(); - protected: + protected: #if CC_VIDEOPLAYER_DEBUG_DRAW - DrawNode *_debugDrawNode; + DrawNode *_debugDrawNode; #endif - enum class Source - { - FILENAME = 0, - URL - }; - - bool _isPlaying; - bool _isLooping; - bool _isUserInputEnabled; - bool _fullScreenDirty; - bool _fullScreenEnabled; - bool _keepAspectRatioEnabled; - - StyleType _styleType; - - std::string _videoURL; - Source _videoSource; - - int _videoPlayerIndex; - ccVideoPlayerCallback _eventCallback; - - void* _videoView; + enum class Source + { + FILENAME = 0, + URL }; - } + + bool _isPlaying; + bool _isLooping; + bool _isUserInputEnabled; + bool _fullScreenDirty; + bool _fullScreenEnabled; + bool _keepAspectRatioEnabled; + + StyleType _styleType; + + std::string _videoURL; + Source _videoSource; + + int _videoPlayerIndex; + ccVideoPlayerCallback _eventCallback; + + void* _videoView; + }; } NS_CC_END // end group /// @} #endif -#endif diff --git a/cocos/ui/UIWebView/UIWebView-inl.h b/cocos/ui/UIWebView/UIWebView-inl.h index 0e12e07c6b..f60768a41e 100644 --- a/cocos/ui/UIWebView/UIWebView-inl.h +++ b/cocos/ui/UIWebView/UIWebView-inl.h @@ -22,6 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ +#pragma once /// @cond DO_NOT_SHOW @@ -31,216 +32,213 @@ #include "platform/CCFileUtils.h" NS_CC_BEGIN -namespace experimental{ - namespace ui{ +namespace ui{ + WebView::WebView() + : _impl(new WebViewImpl(this)), + _onJSCallback(nullptr), + _onShouldStartLoading(nullptr), + _onDidFinishLoading(nullptr), + _onDidFailLoading(nullptr) + { + } - WebView::WebView() - : _impl(new WebViewImpl(this)), - _onJSCallback(nullptr), - _onShouldStartLoading(nullptr), - _onDidFinishLoading(nullptr), - _onDidFailLoading(nullptr) - { - } + WebView::~WebView() + { + CC_SAFE_DELETE(_impl); + } - WebView::~WebView() + WebView *WebView::create() + { + auto webView = new(std::nothrow) WebView(); + if (webView && webView->init()) { - CC_SAFE_DELETE(_impl); + webView->autorelease(); + return webView; } + CC_SAFE_DELETE(webView); + return nullptr; + } - WebView *WebView::create() - { - auto webView = new(std::nothrow) WebView(); - if (webView && webView->init()) - { - webView->autorelease(); - return webView; - } - CC_SAFE_DELETE(webView); - return nullptr; - } + void WebView::setJavascriptInterfaceScheme(const std::string &scheme) + { + _impl->setJavascriptInterfaceScheme(scheme); + } - void WebView::setJavascriptInterfaceScheme(const std::string &scheme) - { - _impl->setJavascriptInterfaceScheme(scheme); - } + void WebView::loadData(const cocos2d::Data &data, + const std::string &MIMEType, + const std::string &encoding, + const std::string &baseURL) + { + _impl->loadData(data, MIMEType, encoding, baseURL); + } - void WebView::loadData(const cocos2d::Data &data, - const std::string &MIMEType, - const std::string &encoding, - const std::string &baseURL) - { - _impl->loadData(data, MIMEType, encoding, baseURL); - } + void WebView::loadHTMLString(const std::string &string, const std::string &baseURL) + { + _impl->loadHTMLString(string, baseURL); + } - void WebView::loadHTMLString(const std::string &string, const std::string &baseURL) - { - _impl->loadHTMLString(string, baseURL); - } + void WebView::loadURL(const std::string &url) + { + this->loadURL(url, false); + } - void WebView::loadURL(const std::string &url) - { - this->loadURL(url, false); - } + void WebView::loadURL(const std::string& url, bool cleanCachedData) + { + _impl->loadURL(url, cleanCachedData); + } - void WebView::loadURL(const std::string& url, bool cleanCachedData) - { - _impl->loadURL(url, cleanCachedData); - } + void WebView::loadFile(const std::string &fileName) + { + _impl->loadFile(fileName); + } - void WebView::loadFile(const std::string &fileName) - { - _impl->loadFile(fileName); - } + void WebView::stopLoading() + { + _impl->stopLoading(); + } - void WebView::stopLoading() - { - _impl->stopLoading(); - } + void WebView::reload() + { + _impl->reload(); + } - void WebView::reload() - { - _impl->reload(); - } + bool WebView::canGoBack() + { + return _impl->canGoBack(); + } - bool WebView::canGoBack() - { - return _impl->canGoBack(); - } + bool WebView::canGoForward() + { + return _impl->canGoForward(); + } - bool WebView::canGoForward() - { - return _impl->canGoForward(); - } + void WebView::goBack() + { + _impl->goBack(); + } - void WebView::goBack() - { - _impl->goBack(); - } + void WebView::goForward() + { + _impl->goForward(); + } - void WebView::goForward() - { - _impl->goForward(); - } + void WebView::evaluateJS(const std::string &js) + { + _impl->evaluateJS(js); + } - void WebView::evaluateJS(const std::string &js) - { - _impl->evaluateJS(js); - } + void WebView::setScalesPageToFit(bool const scalesPageToFit) + { + _impl->setScalesPageToFit(scalesPageToFit); + } - void WebView::setScalesPageToFit(bool const scalesPageToFit) - { - _impl->setScalesPageToFit(scalesPageToFit); - } + void WebView::draw(cocos2d::Renderer *renderer, cocos2d::Mat4 const &transform, uint32_t flags) + { + cocos2d::ui::Widget::draw(renderer, transform, flags); + _impl->draw(renderer, transform, flags); + } - void WebView::draw(cocos2d::Renderer *renderer, cocos2d::Mat4 const &transform, uint32_t flags) + void WebView::setVisible(bool visible) + { + Node::setVisible(visible); + if (!visible || isRunning()) { - cocos2d::ui::Widget::draw(renderer, transform, flags); - _impl->draw(renderer, transform, flags); + _impl->setVisible(visible); } + } + + void WebView::setOpacityWebView(float opacity){ + _impl->setOpacityWebView(opacity); + } + + float WebView::getOpacityWebView() const{ + return _impl->getOpacityWebView(); + } + + void WebView::setBackgroundTransparent() + { + _impl->setBackgroundTransparent(); + }; - void WebView::setVisible(bool visible) + void WebView::onEnter() + { + Widget::onEnter(); + if(isVisible()) { - Node::setVisible(visible); - if (!visible || isRunning()) - { - _impl->setVisible(visible); - } + _impl->setVisible(true); } - - void WebView::setOpacityWebView(float opacity){ - _impl->setOpacityWebView(opacity); - } - - float WebView::getOpacityWebView() const{ - return _impl->getOpacityWebView(); - } - - void WebView::setBackgroundTransparent() - { - _impl->setBackgroundTransparent(); - }; + } - void WebView::onEnter() - { - Widget::onEnter(); - if(isVisible()) - { - _impl->setVisible(true); - } - } + void WebView::onExit() + { + Widget::onExit(); + _impl->setVisible(false); + } + + void WebView::setBounces(bool bounces) + { + _impl->setBounces(bounces); + } + + cocos2d::ui::Widget* WebView::createCloneInstance() + { + return WebView::create(); + } - void WebView::onExit() + void WebView::copySpecialProperties(Widget* model) + { + WebView* webView = dynamic_cast(model); + if (webView) { - Widget::onExit(); - _impl->setVisible(false); - } - - void WebView::setBounces(bool bounces) - { - _impl->setBounces(bounces); - } - - cocos2d::ui::Widget* WebView::createCloneInstance() - { - return WebView::create(); + this->_impl = webView->_impl; + this->_onShouldStartLoading = webView->_onShouldStartLoading; + this->_onDidFinishLoading = webView->_onDidFinishLoading; + this->_onDidFailLoading = webView->_onDidFailLoading; + this->_onJSCallback = webView->_onJSCallback; } + } - void WebView::copySpecialProperties(Widget* model) - { - WebView* webView = dynamic_cast(model); - if (webView) - { - this->_impl = webView->_impl; - this->_onShouldStartLoading = webView->_onShouldStartLoading; - this->_onDidFinishLoading = webView->_onDidFinishLoading; - this->_onDidFailLoading = webView->_onDidFailLoading; - this->_onJSCallback = webView->_onJSCallback; - } - } + void WebView::setOnDidFailLoading(const ccWebViewCallback &callback) + { + _onDidFailLoading = callback; + } - void WebView::setOnDidFailLoading(const ccWebViewCallback &callback) - { - _onDidFailLoading = callback; - } + void WebView::setOnDidFinishLoading(const ccWebViewCallback &callback) + { + _onDidFinishLoading = callback; + } - void WebView::setOnDidFinishLoading(const ccWebViewCallback &callback) - { - _onDidFinishLoading = callback; - } + void WebView::setOnShouldStartLoading(const std::function &callback) + { + _onShouldStartLoading = callback; + } - void WebView::setOnShouldStartLoading(const std::function &callback) - { - _onShouldStartLoading = callback; - } + void WebView::setOnJSCallback(const ccWebViewCallback &callback) + { + _onJSCallback = callback; + } - void WebView::setOnJSCallback(const ccWebViewCallback &callback) - { - _onJSCallback = callback; - } + std::function WebView::getOnShouldStartLoading()const + { + return _onShouldStartLoading; + } - std::function WebView::getOnShouldStartLoading()const - { - return _onShouldStartLoading; - } + WebView::ccWebViewCallback WebView::getOnDidFailLoading()const + { + return _onDidFailLoading; + } - WebView::ccWebViewCallback WebView::getOnDidFailLoading()const - { - return _onDidFailLoading; - } + WebView::ccWebViewCallback WebView::getOnDidFinishLoading()const + { + return _onDidFinishLoading; + } - WebView::ccWebViewCallback WebView::getOnDidFinishLoading()const - { - return _onDidFinishLoading; - } + WebView::ccWebViewCallback WebView::getOnJSCallback()const + { + return _onJSCallback; + } - WebView::ccWebViewCallback WebView::getOnJSCallback()const - { - return _onJSCallback; - } - - } // namespace ui -} // namespace experimental +} // namespace ui } //namespace cocos2d /// @endcond diff --git a/cocos/ui/UIWebView/UIWebView.cpp b/cocos/ui/UIWebView/UIWebView.cpp index 937a8445d7..d8a7e30bcf 100644 --- a/cocos/ui/UIWebView/UIWebView.cpp +++ b/cocos/ui/UIWebView/UIWebView.cpp @@ -22,11 +22,5 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ -#include "platform/CCPlatformConfig.h" - -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) - #include "ui/UIWebView/UIWebViewImpl-android.h" #include "ui/UIWebView/UIWebView-inl.h" - -#endif diff --git a/cocos/ui/UIWebView/UIWebView.h b/cocos/ui/UIWebView/UIWebView.h index b9dd65af33..156e4bc41b 100644 --- a/cocos/ui/UIWebView/UIWebView.h +++ b/cocos/ui/UIWebView/UIWebView.h @@ -22,15 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - -#ifndef __COCOS2D_UI_WEBVIEW_H -#define __COCOS2D_UI_WEBVIEW_H - -#include "platform/CCPlatformConfig.h" - -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_PLATFORM_OS_TVOS) - - +#pragma once #include "ui/UIWidget.h" #include "ui/GUIExport.h" @@ -42,8 +34,7 @@ */ NS_CC_BEGIN -namespace experimental{ - namespace ui{ +namespace ui{ class WebViewImpl; @@ -262,11 +253,8 @@ private: friend class WebViewImpl; }; - } // namespace ui - } // namespace experimental +} // namespace ui }//namespace cocos2d -#endif // end group /// @} -#endif //__COCOS2D_UI_WEBVIEW_H diff --git a/cocos/ui/UIWebView/UIWebView.mm b/cocos/ui/UIWebView/UIWebView.mm index e639a3a91f..31a5694674 100644 --- a/cocos/ui/UIWebView/UIWebView.mm +++ b/cocos/ui/UIWebView/UIWebView.mm @@ -23,11 +23,5 @@ THE SOFTWARE. ****************************************************************************/ -#include "platform/CCPlatformConfig.h" - -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_PLATFORM_OS_TVOS) - #include "ui/UIWebView/UIWebViewImpl-ios.h" #include "ui/UIWebView/UIWebView-inl.h" - -#endif diff --git a/cocos/ui/UIWebView/UIWebViewImpl-android.cpp b/cocos/ui/UIWebView/UIWebViewImpl-android.cpp index e8fe07fe1d..e307cadc72 100644 --- a/cocos/ui/UIWebView/UIWebViewImpl-android.cpp +++ b/cocos/ui/UIWebView/UIWebViewImpl-android.cpp @@ -22,9 +22,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - -#ifdef __ANDROID__ - #include "ui/UIWebView/UIWebViewImpl-android.h" #include @@ -85,7 +82,7 @@ extern "C" { auto charUrl = env->GetStringUTFChars(jurl, NULL); std::string url = charUrl; env->ReleaseStringUTFChars(jurl, charUrl); - return cocos2d::experimental::ui::WebViewImpl::shouldStartLoading(index, url); + return cocos2d::ui::WebViewImpl::shouldStartLoading(index, url); } /* @@ -98,7 +95,7 @@ extern "C" { auto charUrl = env->GetStringUTFChars(jurl, NULL); std::string url = charUrl; env->ReleaseStringUTFChars(jurl, charUrl); - cocos2d::experimental::ui::WebViewImpl::didFinishLoading(index, url); + cocos2d::ui::WebViewImpl::didFinishLoading(index, url); } /* @@ -111,7 +108,7 @@ extern "C" { auto charUrl = env->GetStringUTFChars(jurl, NULL); std::string url = charUrl; env->ReleaseStringUTFChars(jurl, charUrl); - cocos2d::experimental::ui::WebViewImpl::didFailLoading(index, url); + cocos2d::ui::WebViewImpl::didFailLoading(index, url); } /* @@ -124,7 +121,7 @@ extern "C" { auto charMessage = env->GetStringUTFChars(jmessage, NULL); std::string message = charMessage; env->ReleaseStringUTFChars(jmessage, charMessage); - cocos2d::experimental::ui::WebViewImpl::onJsCallback(index, message); + cocos2d::ui::WebViewImpl::onJsCallback(index, message); } } @@ -159,152 +156,148 @@ std::string getUrlStringByFileName(const std::string &fileName) { } // namespace namespace cocos2d { - namespace experimental { - namespace ui{ +namespace ui{ - static std::unordered_map s_WebViewImpls; + static std::unordered_map s_WebViewImpls; - WebViewImpl::WebViewImpl(WebView *webView) : _viewTag(-1), _webView(webView) { - _viewTag = createWebViewJNI(); - s_WebViewImpls[_viewTag] = this; + WebViewImpl::WebViewImpl(WebView *webView) : _viewTag(-1), _webView(webView) { + _viewTag = createWebViewJNI(); + s_WebViewImpls[_viewTag] = this; + } + + WebViewImpl::~WebViewImpl() { + JniHelper::callStaticVoidMethod(className, "removeWebView", _viewTag); + s_WebViewImpls.erase(_viewTag); + } + + void WebViewImpl::loadData(const Data &data, const std::string &MIMEType, const std::string &encoding, const std::string &baseURL) { + std::string dataString(reinterpret_cast(data.getBytes()), static_cast(data.getSize())); + JniHelper::callStaticVoidMethod(className, "setJavascriptInterfaceScheme", _viewTag, dataString, MIMEType, encoding, baseURL); + } + + void WebViewImpl::loadHTMLString(const std::string &string, const std::string &baseURL) { + JniHelper::callStaticVoidMethod(className, "loadHTMLString", _viewTag, string, getFixedBaseUrl(baseURL)); + } + + void WebViewImpl::loadURL(const std::string &url) { + this->loadURL(url, false); + } + + void WebViewImpl::loadURL(const std::string &url, bool cleanCachedData) { + JniHelper::callStaticVoidMethod(className, "loadUrl", _viewTag, url, cleanCachedData); + } + + void WebViewImpl::loadFile(const std::string &fileName) { + auto fullPath = getUrlStringByFileName(fileName); + JniHelper::callStaticVoidMethod(className, "loadFile", _viewTag, fullPath); + } + + void WebViewImpl::stopLoading() { + JniHelper::callStaticVoidMethod(className, "stopLoading", _viewTag); + } + + void WebViewImpl::reload() { + JniHelper::callStaticVoidMethod(className, "reload", _viewTag); + } + + bool WebViewImpl::canGoBack() { + return JniHelper::callStaticBooleanMethod(className, "canGoBack", _viewTag); + } + + bool WebViewImpl::canGoForward() { + return JniHelper::callStaticBooleanMethod(className, "canGoForward", _viewTag); + } + + void WebViewImpl::goBack() { + JniHelper::callStaticVoidMethod(className, "goBack", _viewTag); + } + + void WebViewImpl::goForward() { + JniHelper::callStaticVoidMethod(className, "goForward", _viewTag); + } + + void WebViewImpl::setJavascriptInterfaceScheme(const std::string &scheme) { + JniHelper::callStaticVoidMethod(className, "setJavascriptInterfaceScheme", _viewTag, scheme); + } + + void WebViewImpl::evaluateJS(const std::string &js) { + JniHelper::callStaticVoidMethod(className, "evaluateJS", _viewTag, js); + } + + void WebViewImpl::setScalesPageToFit(const bool scalesPageToFit) { + JniHelper::callStaticVoidMethod(className, "setScalesPageToFit", _viewTag, scalesPageToFit); + } + + bool WebViewImpl::shouldStartLoading(const int viewTag, const std::string &url) { + bool allowLoad = true; + auto it = s_WebViewImpls.find(viewTag); + if (it != s_WebViewImpls.end()) { + auto webView = it->second->_webView; + if (webView->_onShouldStartLoading) { + allowLoad = webView->_onShouldStartLoading(webView, url); } + } + return allowLoad; + } - WebViewImpl::~WebViewImpl() { - JniHelper::callStaticVoidMethod(className, "removeWebView", _viewTag); - s_WebViewImpls.erase(_viewTag); + void WebViewImpl::didFinishLoading(const int viewTag, const std::string &url){ + auto it = s_WebViewImpls.find(viewTag); + if (it != s_WebViewImpls.end()) { + auto webView = it->second->_webView; + if (webView->_onDidFinishLoading) { + webView->_onDidFinishLoading(webView, url); } + } + } - void WebViewImpl::loadData(const Data &data, const std::string &MIMEType, const std::string &encoding, const std::string &baseURL) { - std::string dataString(reinterpret_cast(data.getBytes()), static_cast(data.getSize())); - JniHelper::callStaticVoidMethod(className, "setJavascriptInterfaceScheme", _viewTag, dataString, MIMEType, encoding, baseURL); + void WebViewImpl::didFailLoading(const int viewTag, const std::string &url){ + auto it = s_WebViewImpls.find(viewTag); + if (it != s_WebViewImpls.end()) { + auto webView = it->second->_webView; + if (webView->_onDidFailLoading) { + webView->_onDidFailLoading(webView, url); } + } + } - void WebViewImpl::loadHTMLString(const std::string &string, const std::string &baseURL) { - JniHelper::callStaticVoidMethod(className, "loadHTMLString", _viewTag, string, getFixedBaseUrl(baseURL)); + void WebViewImpl::onJsCallback(const int viewTag, const std::string &message){ + auto it = s_WebViewImpls.find(viewTag); + if (it != s_WebViewImpls.end()) { + auto webView = it->second->_webView; + if (webView->_onJSCallback) { + webView->_onJSCallback(webView, message); } + } + } - void WebViewImpl::loadURL(const std::string &url) { - this->loadURL(url, false); - } + void WebViewImpl::draw(cocos2d::Renderer *renderer, cocos2d::Mat4 const &transform, uint32_t flags) { + if (flags & cocos2d::Node::FLAGS_TRANSFORM_DIRTY) { + auto uiRect = cocos2d::ui::Helper::convertBoundingBoxToScreen(_webView); + JniHelper::callStaticVoidMethod(className, "setWebViewRect", _viewTag, + (int)uiRect.origin.x, (int)uiRect.origin.y, + (int)uiRect.size.width, (int)uiRect.size.height); + } + } - void WebViewImpl::loadURL(const std::string &url, bool cleanCachedData) { - JniHelper::callStaticVoidMethod(className, "loadUrl", _viewTag, url, cleanCachedData); - } + void WebViewImpl::setVisible(bool visible) { + JniHelper::callStaticVoidMethod(className, "setVisible", _viewTag, visible); + } + + void WebViewImpl::setOpacityWebView(const float opacity){ + JniHelper::callStaticVoidMethod(className, "setOpacityWebView", _viewTag, opacity); + }; + + + float WebViewImpl::getOpacityWebView()const{ + return JniHelper::callStaticFloatMethod(className, "getOpacityWebView", _viewTag); + }; + + void WebViewImpl::setBackgroundTransparent(){ + JniHelper::callStaticVoidMethod(className, "setBackgroundTransparent", _viewTag); + }; - void WebViewImpl::loadFile(const std::string &fileName) { - auto fullPath = getUrlStringByFileName(fileName); - JniHelper::callStaticVoidMethod(className, "loadFile", _viewTag, fullPath); - } - - void WebViewImpl::stopLoading() { - JniHelper::callStaticVoidMethod(className, "stopLoading", _viewTag); - } - - void WebViewImpl::reload() { - JniHelper::callStaticVoidMethod(className, "reload", _viewTag); - } - - bool WebViewImpl::canGoBack() { - return JniHelper::callStaticBooleanMethod(className, "canGoBack", _viewTag); - } - - bool WebViewImpl::canGoForward() { - return JniHelper::callStaticBooleanMethod(className, "canGoForward", _viewTag); - } - - void WebViewImpl::goBack() { - JniHelper::callStaticVoidMethod(className, "goBack", _viewTag); - } - - void WebViewImpl::goForward() { - JniHelper::callStaticVoidMethod(className, "goForward", _viewTag); - } - - void WebViewImpl::setJavascriptInterfaceScheme(const std::string &scheme) { - JniHelper::callStaticVoidMethod(className, "setJavascriptInterfaceScheme", _viewTag, scheme); - } - - void WebViewImpl::evaluateJS(const std::string &js) { - JniHelper::callStaticVoidMethod(className, "evaluateJS", _viewTag, js); - } - - void WebViewImpl::setScalesPageToFit(const bool scalesPageToFit) { - JniHelper::callStaticVoidMethod(className, "setScalesPageToFit", _viewTag, scalesPageToFit); - } - - bool WebViewImpl::shouldStartLoading(const int viewTag, const std::string &url) { - bool allowLoad = true; - auto it = s_WebViewImpls.find(viewTag); - if (it != s_WebViewImpls.end()) { - auto webView = it->second->_webView; - if (webView->_onShouldStartLoading) { - allowLoad = webView->_onShouldStartLoading(webView, url); - } - } - return allowLoad; - } - - void WebViewImpl::didFinishLoading(const int viewTag, const std::string &url){ - auto it = s_WebViewImpls.find(viewTag); - if (it != s_WebViewImpls.end()) { - auto webView = it->second->_webView; - if (webView->_onDidFinishLoading) { - webView->_onDidFinishLoading(webView, url); - } - } - } - - void WebViewImpl::didFailLoading(const int viewTag, const std::string &url){ - auto it = s_WebViewImpls.find(viewTag); - if (it != s_WebViewImpls.end()) { - auto webView = it->second->_webView; - if (webView->_onDidFailLoading) { - webView->_onDidFailLoading(webView, url); - } - } - } - - void WebViewImpl::onJsCallback(const int viewTag, const std::string &message){ - auto it = s_WebViewImpls.find(viewTag); - if (it != s_WebViewImpls.end()) { - auto webView = it->second->_webView; - if (webView->_onJSCallback) { - webView->_onJSCallback(webView, message); - } - } - } - - void WebViewImpl::draw(cocos2d::Renderer *renderer, cocos2d::Mat4 const &transform, uint32_t flags) { - if (flags & cocos2d::Node::FLAGS_TRANSFORM_DIRTY) { - auto uiRect = cocos2d::ui::Helper::convertBoundingBoxToScreen(_webView); - JniHelper::callStaticVoidMethod(className, "setWebViewRect", _viewTag, - (int)uiRect.origin.x, (int)uiRect.origin.y, - (int)uiRect.size.width, (int)uiRect.size.height); - } - } - - void WebViewImpl::setVisible(bool visible) { - JniHelper::callStaticVoidMethod(className, "setVisible", _viewTag, visible); - } - - void WebViewImpl::setOpacityWebView(const float opacity){ - JniHelper::callStaticVoidMethod(className, "setOpacityWebView", _viewTag, opacity); - }; - - - float WebViewImpl::getOpacityWebView()const{ - return JniHelper::callStaticFloatMethod(className, "getOpacityWebView", _viewTag); - }; - - void WebViewImpl::setBackgroundTransparent(){ - JniHelper::callStaticVoidMethod(className, "setBackgroundTransparent", _viewTag); - }; - - void WebViewImpl::setBounces(bool bounces) { - // empty function as this was mainly a fix for iOS - } - } // namespace ui - } // namespace experimental + void WebViewImpl::setBounces(bool bounces) { + // empty function as this was mainly a fix for iOS + } +} // namespace ui } //namespace cocos2d - -#endif // __ANDROID__ diff --git a/cocos/ui/UIWebView/UIWebViewImpl-android.h b/cocos/ui/UIWebView/UIWebViewImpl-android.h index 14cd172733..b77fd5becb 100644 --- a/cocos/ui/UIWebView/UIWebViewImpl-android.h +++ b/cocos/ui/UIWebView/UIWebViewImpl-android.h @@ -22,13 +22,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ +#pragma once -#ifndef __COCOS2D__UI__WEBVIEWIMPL_ANDROID_H_ -#define __COCOS2D__UI__WEBVIEWIMPL_ANDROID_H_ /// @cond DO_NOT_SHOW -#ifdef __ANDROID__ - #include #include @@ -37,77 +34,71 @@ namespace cocos2d { class Renderer; class Mat4; - namespace experimental { - namespace ui{ - class WebView; - } + namespace ui{ + class WebView; } } namespace cocos2d { - namespace experimental { - namespace ui{ +namespace ui{ - class WebViewImpl { - public: - WebViewImpl(cocos2d::experimental::ui::WebView *webView); + class WebViewImpl { + public: + WebViewImpl(cocos2d::ui::WebView *webView); - virtual ~WebViewImpl(); + virtual ~WebViewImpl(); - void setJavascriptInterfaceScheme(const std::string &scheme); + void setJavascriptInterfaceScheme(const std::string &scheme); - void loadData(const cocos2d::Data &data, const std::string &MIMEType, const std::string &encoding, const std::string &baseURL); + void loadData(const cocos2d::Data &data, const std::string &MIMEType, const std::string &encoding, const std::string &baseURL); - void loadHTMLString(const std::string &string, const std::string &baseURL); + void loadHTMLString(const std::string &string, const std::string &baseURL); - void loadURL(const std::string &url); - void loadURL(const std::string &url, bool cleanCachedData); + void loadURL(const std::string &url); + void loadURL(const std::string &url, bool cleanCachedData); - void loadFile(const std::string &fileName); + void loadFile(const std::string &fileName); - void stopLoading(); + void stopLoading(); - void reload(); + void reload(); - bool canGoBack(); + bool canGoBack(); - bool canGoForward(); + bool canGoForward(); - void goBack(); + void goBack(); - void goForward(); + void goForward(); - void evaluateJS(const std::string &js); + void evaluateJS(const std::string &js); - void setScalesPageToFit(const bool scalesPageToFit); + void setScalesPageToFit(const bool scalesPageToFit); - virtual void draw(cocos2d::Renderer *renderer, cocos2d::Mat4 const &transform, uint32_t flags); + virtual void draw(cocos2d::Renderer *renderer, cocos2d::Mat4 const &transform, uint32_t flags); - virtual void setVisible(bool visible); + virtual void setVisible(bool visible); - void setBounces(bool bounces); - - void setOpacityWebView(float opacity); - - float getOpacityWebView()const; - - void setBackgroundTransparent(); + void setBounces(bool bounces); + + void setOpacityWebView(float opacity); + + float getOpacityWebView()const; + + void setBackgroundTransparent(); - static bool shouldStartLoading(const int viewTag, const std::string &url); - static void didFinishLoading(const int viewTag, const std::string &url); - static void didFailLoading(const int viewTag, const std::string &url); - static void onJsCallback(const int viewTag, const std::string &message); + static bool shouldStartLoading(const int viewTag, const std::string &url); + static void didFinishLoading(const int viewTag, const std::string &url); + static void didFailLoading(const int viewTag, const std::string &url); + static void onJsCallback(const int viewTag, const std::string &message); - private: - int _viewTag; - WebView *_webView; - }; + private: + int _viewTag; + WebView *_webView; + }; - } // namespace ui - } // namespace experimental +} // namespace ui } //cocos2d -#endif // __ANDROID__ /// @endcond -#endif /* __COCOS2D__UI__WEBVIEWIMPL_ANDROID_H_ */ diff --git a/cocos/ui/UIWebView/UIWebViewImpl-ios.h b/cocos/ui/UIWebView/UIWebViewImpl-ios.h index 74603987f9..d4ff5511cb 100644 --- a/cocos/ui/UIWebView/UIWebViewImpl-ios.h +++ b/cocos/ui/UIWebView/UIWebViewImpl-ios.h @@ -22,9 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - -#ifndef __COCOS2D_UI_WEBVIEWIMPL_IOS_H_ -#define __COCOS2D_UI_WEBVIEWIMPL_IOS_H_ +#pragma once /// @cond DO_NOT_SHOW #include @@ -37,9 +35,8 @@ namespace cocos2d { class Data; class Renderer; class Mat4; - -namespace experimental { - namespace ui{ + +namespace ui{ class WebView; @@ -97,8 +94,6 @@ private: }; } // namespace ui - } // namespace experimental }//namespace cocos2d /// @endcond -#endif /* __COCOS2D_UI_WEBVIEWIMPL_IOS_H_ */ diff --git a/cocos/ui/UIWebView/UIWebViewImpl-ios.mm b/cocos/ui/UIWebView/UIWebViewImpl-ios.mm index 0755809ed8..85dbf16d33 100644 --- a/cocos/ui/UIWebView/UIWebViewImpl-ios.mm +++ b/cocos/ui/UIWebView/UIWebViewImpl-ios.mm @@ -22,12 +22,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - -#include "platform/CCPlatformConfig.h" - -// Webview not available on tvOS -#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_TARGET_OS_TVOS) - #import #import #import @@ -307,8 +301,7 @@ namespace cocos2d { -namespace experimental { - namespace ui{ +namespace ui{ WebViewImpl::WebViewImpl(WebView *webView) : _uiWebViewWrapper([UIWebViewWrapper newWebViewWrapper]), @@ -451,8 +444,5 @@ void WebViewImpl::setBackgroundTransparent(){ } - } // namespace ui -} // namespace experimental +} // namespace ui } //namespace cocos2d - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_IOS diff --git a/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp b/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp index 331e4460d9..a0e58da2aa 100644 --- a/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp +++ b/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp @@ -29,7 +29,6 @@ using namespace cocos2d; using namespace cocos2d::ui; -using namespace cocos2d::experimental; AudioEngineTests::AudioEngineTests() { diff --git a/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.h b/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.h index 5d9c30e988..ffcd11e7b9 100644 --- a/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.h +++ b/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.h @@ -111,7 +111,7 @@ public: private: static const int FILE_COUNT = 2; std::string _files[FILE_COUNT]; - cocos2d::experimental::AudioProfile _audioProfile; + cocos2d::AudioProfile _audioProfile; int _audioCount; cocos2d::Label* _showLabel; diff --git a/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp b/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp index 1963f42525..37d171df12 100644 --- a/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp +++ b/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp @@ -759,7 +759,7 @@ void CaptureNodeTest::onCaptured(Ref*) BugAutoCulling::BugAutoCulling() { Size s = Director::getInstance()->getWinSize(); - auto fastmap = cocos2d::experimental::TMXTiledMap::create("TileMaps/orthogonal-test2.tmx"); + auto fastmap = cocos2d::FastTMXTiledMap::create("TileMaps/orthogonal-test2.tmx"); this->addChild(fastmap); for (int i = 0; i < 30; i++) { auto sprite = Sprite::create("Images/grossini.png"); diff --git a/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.cpp b/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.cpp index 9bc4d113ce..19b731abc3 100644 --- a/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.cpp +++ b/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.cpp @@ -224,7 +224,7 @@ TMXOrthoTestNew::TMXOrthoTestNew() //auto color = LayerColor::create( Color4B(64,64,64,255) ); //addChild(color, -1); - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/orthogonal-test2.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/orthogonal-test2.tmx"); addChild(map, 0, kTagTileMap); @@ -267,7 +267,7 @@ std::string TMXOrthoTestNew::title() const //------------------------------------------------------------------ TMXOrthoTest2New::TMXOrthoTest2New() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/orthogonal-test1.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/orthogonal-test1.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); @@ -288,7 +288,7 @@ std::string TMXOrthoTest2New::title() const //------------------------------------------------------------------ TMXOrthoTest3New::TMXOrthoTest3New() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/orthogonal-test3.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/orthogonal-test3.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); @@ -310,7 +310,7 @@ std::string TMXOrthoTest3New::title() const //------------------------------------------------------------------ TMXOrthoTest4New::TMXOrthoTest4New() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/orthogonal-test4.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/orthogonal-test4.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s1 = map->getContentSize(); @@ -339,7 +339,7 @@ void TMXOrthoTest4New::removeSprite(float dt) { unschedule(CC_SCHEDULE_SELECTOR(TMXOrthoTest4New::removeSprite)); - auto map = static_cast( getChildByTag(kTagTileMap) ); + auto map = static_cast( getChildByTag(kTagTileMap) ); auto layer = map->getLayer("Layer 0"); auto s = layer->getLayerSize(); @@ -372,7 +372,7 @@ TMXReadWriteTestNew::TMXReadWriteTestNew() { _gid = 0; - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/orthogonal-test2.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/orthogonal-test2.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); @@ -438,8 +438,8 @@ void TMXReadWriteTestNew::removeSprite(Node* sender) void TMXReadWriteTestNew::updateCol(float dt) { - auto map = (cocos2d::experimental::TMXTiledMap*)getChildByTag(kTagTileMap); - auto layer = (cocos2d::experimental::TMXLayer*)map->getChildByTag(0); + auto map = (cocos2d::FastTMXTiledMap*)getChildByTag(kTagTileMap); + auto layer = (cocos2d::FastTMXLayer*)map->getChildByTag(0); ////----CCLOG("++++atlas quantity: %d", layer->textureAtlas()->getTotalQuads()); ////----CCLOG("++++children: %d", layer->getChildren()->count() ); @@ -459,8 +459,8 @@ void TMXReadWriteTestNew::repaintWithGID(float dt) { // unschedule:_cmd); - auto map = (cocos2d::experimental::TMXTiledMap*)getChildByTag(kTagTileMap); - auto layer = (cocos2d::experimental::TMXLayer*)map->getChildByTag(0); + auto map = (cocos2d::FastTMXTiledMap*)getChildByTag(kTagTileMap); + auto layer = (cocos2d::FastTMXLayer*)map->getChildByTag(0); auto s = layer->getLayerSize(); for( int x=0; xgetChildByTag(0); + auto map = (cocos2d::FastTMXTiledMap*)getChildByTag(kTagTileMap); + auto layer = (cocos2d::FastTMXLayer*)map->getChildByTag(0); auto s = layer->getLayerSize(); for( int y=0; y< s.height; y++ ) @@ -502,7 +502,7 @@ TMXHexTestNew::TMXHexTestNew() auto color = LayerColor::create( Color4B(64,64,64,255) ); addChild(color, -1); - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/hexa-test.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/hexa-test.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); @@ -524,7 +524,7 @@ TMXIsoTestNew::TMXIsoTestNew() auto color = LayerColor::create( Color4B(64,64,64,255) ); addChild(color, -1); - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/iso-test.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/iso-test.tmx"); addChild(map, 0, kTagTileMap); // move map to the center of the screen @@ -548,7 +548,7 @@ TMXIsoTest1New::TMXIsoTest1New() auto color = LayerColor::create( Color4B(64,64,64,255) ); addChild(color, -1); - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/iso-test1.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/iso-test1.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); @@ -572,7 +572,7 @@ TMXIsoTest2New::TMXIsoTest2New() auto color = LayerColor::create( Color4B(64,64,64,255) ); addChild(color, -1); - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/iso-test2.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/iso-test2.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); @@ -599,7 +599,7 @@ TMXUncompressedTestNew::TMXUncompressedTestNew() auto color = LayerColor::create( Color4B(64,64,64,255) ); addChild(color, -1); - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/iso-test2-uncompressed.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/iso-test2-uncompressed.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); @@ -634,7 +634,7 @@ std::string TMXUncompressedTestNew::title() const //------------------------------------------------------------------ TMXTilesetTestNew::TMXTilesetTestNew() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/orthogonal-test5.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/orthogonal-test5.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); @@ -653,7 +653,7 @@ std::string TMXTilesetTestNew::title() const //------------------------------------------------------------------ TMXOrthoObjectsTestNew::TMXOrthoObjectsTestNew() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/ortho-objects.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/ortho-objects.tmx"); addChild(map, -1, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); @@ -703,7 +703,7 @@ std::string TMXOrthoObjectsTestNew::subtitle() const TMXIsoObjectsTestNew::TMXIsoObjectsTestNew() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/iso-test-objectgroup.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/iso-test-objectgroup.tmx"); addChild(map, -1, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); @@ -754,13 +754,13 @@ std::string TMXIsoObjectsTestNew::subtitle() const TMXResizeTestNew::TMXResizeTestNew() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/orthogonal-test5.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/orthogonal-test5.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); CCLOG("ContentSize: %f, %f", s.width,s.height); - cocos2d::experimental::TMXLayer* layer; + cocos2d::FastTMXLayer* layer; layer = map->getLayer("Layer 0"); auto ls = layer->getLayerSize(); @@ -792,7 +792,7 @@ std::string TMXResizeTestNew::subtitle() const TMXIsoZorderNew::TMXIsoZorderNew() { Director::getInstance()->getRenderer()->setDepthTest(false); - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/iso-test-zorder.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/iso-test-zorder.tmx"); addChild(map, 0, kTagTileMap); auto s = map->getContentSize(); @@ -861,7 +861,7 @@ std::string TMXIsoZorderNew::subtitle() const //------------------------------------------------------------------ TMXOrthoZorderNew::TMXOrthoZorderNew() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/orthogonal-test-zorder.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/orthogonal-test-zorder.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); @@ -922,7 +922,7 @@ std::string TMXOrthoZorderNew::subtitle() const //------------------------------------------------------------------ TMXIsoVertexZNew::TMXIsoVertexZNew() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/iso-test-vertexz.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/iso-test-vertexz.tmx"); addChild(map, 0, kTagTileMap); auto s = map->getContentSize(); @@ -996,7 +996,7 @@ std::string TMXIsoVertexZNew::subtitle() const //------------------------------------------------------------------ TMXOrthoVertexZNew::TMXOrthoVertexZNew() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/orthogonal-test-vertexz.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/orthogonal-test-vertexz.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); @@ -1069,7 +1069,7 @@ std::string TMXOrthoVertexZNew::subtitle() const //------------------------------------------------------------------ TMXIsoMoveLayerNew::TMXIsoMoveLayerNew() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/iso-test-movelayer.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/iso-test-movelayer.tmx"); addChild(map, 0, kTagTileMap); map->setPosition(Vec2(-700.0f,-50.0f)); @@ -1096,7 +1096,7 @@ std::string TMXIsoMoveLayerNew::subtitle() const //------------------------------------------------------------------ TMXOrthoMoveLayerNew::TMXOrthoMoveLayerNew() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/orthogonal-test-movelayer.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/orthogonal-test-movelayer.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); @@ -1121,7 +1121,7 @@ std::string TMXOrthoMoveLayerNew::subtitle() const TMXTilePropertyTestNew::TMXTilePropertyTestNew() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/ortho-tile-property.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/ortho-tile-property.tmx"); addChild(map ,0 ,kTagTileMap); for(int i=1;i<=20;i++){ @@ -1150,7 +1150,7 @@ std::string TMXTilePropertyTestNew::subtitle() const TMXOrthoFlipTestNew::TMXOrthoFlipTestNew() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/ortho-rotation-test.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/ortho-rotation-test.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); @@ -1173,7 +1173,7 @@ std::string TMXOrthoFlipTestNew::title() const TMXOrthoFlipRunTimeTestNew::TMXOrthoFlipRunTimeTestNew() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/ortho-rotation-test.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/ortho-rotation-test.tmx"); addChild(map, 0, kTagTileMap); auto s = map->getContentSize(); @@ -1197,7 +1197,7 @@ std::string TMXOrthoFlipRunTimeTestNew::subtitle() const void TMXOrthoFlipRunTimeTestNew::flipIt(float dt) { - auto map = (cocos2d::experimental::TMXTiledMap*) getChildByTag(kTagTileMap); + auto map = (cocos2d::FastTMXTiledMap*) getChildByTag(kTagTileMap); auto layer = map->getLayer("Layer 0"); //blue diamond @@ -1245,7 +1245,7 @@ TMXOrthoFromXMLTestNew::TMXOrthoFromXMLTestNew() auto fileUtils = FileUtils::getInstance(); std::string str = fileUtils->getStringFromFile(fileUtils->fullPathForFilename(file.c_str())); - auto map = cocos2d::experimental::TMXTiledMap::createWithXML(str ,resources.c_str()); + auto map = cocos2d::FastTMXTiledMap::createWithXML(str ,resources.c_str()); addChild(map, 0, kTagTileMap); auto s = map->getContentSize(); @@ -1271,7 +1271,7 @@ TMXOrthoXMLFormatTestNew::TMXOrthoXMLFormatTestNew() // 1. load xml format tilemap // 2. gid lower than firstgid is ignored // 3. firstgid in tsx is ignored, tile property in tsx loaded correctly. - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/xml-test.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/xml-test.tmx"); addChild(map, 0, kTagTileMap); auto s = map->getContentSize(); @@ -1297,7 +1297,7 @@ std::string TMXOrthoXMLFormatTestNew::title() const //------------------------------------------------------------------ TMXBug987New::TMXBug987New() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/orthogonal-test6.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/orthogonal-test6.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s1 = map->getContentSize(); @@ -1325,7 +1325,7 @@ std::string TMXBug987New::subtitle() const //------------------------------------------------------------------ TMXBug787New::TMXBug787New() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/iso-test-bug787.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/iso-test-bug787.tmx"); addChild(map, 0, kTagTileMap); map->setScale(0.25f); @@ -1348,7 +1348,7 @@ std::string TMXBug787New::subtitle() const //------------------------------------------------------------------ TMXGIDObjectsTestNew::TMXGIDObjectsTestNew() { - auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/test-object-layer.tmx"); + auto map = cocos2d::FastTMXTiledMap::create("TileMaps/test-object-layer.tmx"); addChild(map, -1, kTagTileMap); Size CC_UNUSED s = map->getContentSize(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.cpp index d2d9f9d487..9ff8037307 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.cpp @@ -26,7 +26,6 @@ USING_NS_CC; using namespace cocos2d::ui; -using namespace cocos2d::experimental::ui; VideoPlayerTests::VideoPlayerTests() { @@ -265,7 +264,7 @@ void VideoPlayerTest::videoEventCallback(Ref* sender, VideoPlayer::EventType eve SimpleVideoPlayerTest::SimpleVideoPlayerTest() { _videoPlayer = nullptr; - _style = cocos2d::experimental::ui::VideoPlayer::StyleType::NONE; + _style = cocos2d::ui::VideoPlayer::StyleType::NONE; _userInputEnabled = true; _switchUserInputEnabled = nullptr; @@ -285,12 +284,12 @@ void SimpleVideoPlayerTest::updateButtonsTexts() std::string str = " - "; switch(_style) { - case cocos2d::experimental::ui::VideoPlayer::StyleType::NONE: + case cocos2d::ui::VideoPlayer::StyleType::NONE: _switchUserInputEnabled->setVisible(false); str = "< NO Sytle >"; break; - case cocos2d::experimental::ui::VideoPlayer::StyleType::DEFAULT: + case cocos2d::ui::VideoPlayer::StyleType::DEFAULT: str = "< Default Style >"; _switchUserInputEnabled->setVisible(true); break; @@ -345,12 +344,12 @@ void SimpleVideoPlayerTest::menuCloseCallback(Ref* sender) void SimpleVideoPlayerTest::switchStyleCallback(Ref* sender) { switch (_style) { - case cocos2d::experimental::ui::VideoPlayer::StyleType::NONE: - _style = cocos2d::experimental::ui::VideoPlayer::StyleType::DEFAULT; + case cocos2d::ui::VideoPlayer::StyleType::NONE: + _style = cocos2d::ui::VideoPlayer::StyleType::DEFAULT; break; - case cocos2d::experimental::ui::VideoPlayer::StyleType::DEFAULT: - _style = cocos2d::experimental::ui::VideoPlayer::StyleType::NONE; + case cocos2d::ui::VideoPlayer::StyleType::DEFAULT: + _style = cocos2d::ui::VideoPlayer::StyleType::NONE; break; default: diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.h b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.h index 375a54ed25..5f055e7655 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.h +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.h @@ -51,14 +51,14 @@ public: void sliderCallback(cocos2d::Ref* sender, cocos2d::ui::Slider::EventType eventType); - void videoEventCallback(cocos2d::Ref* sender, cocos2d::experimental::ui::VideoPlayer::EventType eventType); + void videoEventCallback(cocos2d::Ref* sender, cocos2d::ui::VideoPlayer::EventType eventType); private: void createVideo(); void createSlider(); cocos2d::MenuItemFont* _hintItem; - cocos2d::experimental::ui::VideoPlayer* _videoPlayer; + cocos2d::ui::VideoPlayer* _videoPlayer; cocos2d::Label* _videoStateLabel; cocos2d::Label* _loopStatusLabel; cocos2d::Rect _visibleRect; @@ -85,14 +85,14 @@ private: void createVideo(); cocos2d::Rect _visibleRect; - cocos2d::experimental::ui::VideoPlayer* _videoPlayer; + cocos2d::ui::VideoPlayer* _videoPlayer; cocos2d::MenuItemFont* _switchUserInputEnabled; cocos2d::MenuItemFont* _switchStyle; bool _userInputEnabled; - cocos2d::experimental::ui::VideoPlayer::StyleType _style; + cocos2d::ui::VideoPlayer::StyleType _style; void updateButtonsTexts(); }; diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWebViewTest/UIWebViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWebViewTest/UIWebViewTest.cpp index b2bf692538..97d97241ab 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWebViewTest/UIWebViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWebViewTest/UIWebViewTest.cpp @@ -39,7 +39,7 @@ bool WebViewTest::init() Size winSize = Director::getInstance()->getVisibleSize(); - _webView = cocos2d::experimental::ui::WebView::create(); + _webView = cocos2d::ui::WebView::create(); _webView->setPosition(winSize/2); _webView->setContentSize(winSize * 0.5); _webView->loadURL("https://www.baidu.com"); @@ -188,21 +188,21 @@ bool WebViewTest::init() return false; } -bool WebViewTest::onWebViewShouldStartLoading(experimental::ui::WebView *sender, const std::string &url) +bool WebViewTest::onWebViewShouldStartLoading(ui::WebView *sender, const std::string &url) { CCLOG("onWebViewShouldStartLoading, url is %s", url.c_str()); //don't do any OpenGL operation here!! It's forbidden! return true; } -void WebViewTest::onWebViewDidFinishLoading(experimental::ui::WebView *sender, const std::string &url) +void WebViewTest::onWebViewDidFinishLoading(ui::WebView *sender, const std::string &url) { auto node = (ui::Button*)this->getChildByName("evalJs"); node->setTitleText("start loading..."); CCLOG("onWebViewDidFinishLoading, url is %s", url.c_str()); } -void WebViewTest::onWebViewDidFailLoading(experimental::ui::WebView *sender, const std::string &url) +void WebViewTest::onWebViewDidFailLoading(ui::WebView *sender, const std::string &url) { CCLOG("onWebViewDidFailLoading, url is %s", url.c_str()); } diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWebViewTest/UIWebViewTest.h b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWebViewTest/UIWebViewTest.h index 61290e0c2b..8eb41095df 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWebViewTest/UIWebViewTest.h +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWebViewTest/UIWebViewTest.h @@ -36,13 +36,13 @@ public: CREATE_FUNC(WebViewTest); virtual bool init() override; - bool onWebViewShouldStartLoading(cocos2d::experimental::ui::WebView *sender, const std::string &url); - void onWebViewDidFinishLoading(cocos2d::experimental::ui::WebView *sender, const std::string &url); - void onWebViewDidFailLoading(cocos2d::experimental::ui::WebView *sender, const std::string &url); + bool onWebViewShouldStartLoading(cocos2d::ui::WebView *sender, const std::string &url); + void onWebViewDidFinishLoading(cocos2d::ui::WebView *sender, const std::string &url); + void onWebViewDidFailLoading(cocos2d::ui::WebView *sender, const std::string &url); private: - cocos2d::experimental::ui::WebView *_webView; + cocos2d::ui::WebView *_webView; }; diff --git a/tests/lua-tests/src/FastTiledMapTest/FastTiledMapTest.lua b/tests/lua-tests/src/FastTiledMapTest/FastTiledMapTest.lua index 1d962da08b..5701f04457 100644 --- a/tests/lua-tests/src/FastTiledMapTest/FastTiledMapTest.lua +++ b/tests/lua-tests/src/FastTiledMapTest/FastTiledMapTest.lua @@ -144,7 +144,7 @@ local function TMXOrthoTest() --local color = cc.LayerColor:create( cc.c4b(64,64,64,255) ) --addChild(color, -1) - local map = ccexp.TMXTiledMap:create("TileMaps/orthogonal-test2.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/orthogonal-test2.tmx") layer:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -178,7 +178,7 @@ end local function TMXOrthoTest2() local layer = createTileDemoLayer("TMX Ortho test2") - local map = ccexp.TMXTiledMap:create("TileMaps/orthogonal-test1.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/orthogonal-test1.tmx") layer:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -195,7 +195,7 @@ end -------------------------------------------------------------------- local function TMXOrthoTest3() local layer = createTileDemoLayer("TMX anchorPoint test") - local map = ccexp.TMXTiledMap:create("TileMaps/orthogonal-test3.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/orthogonal-test3.tmx") layer:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -214,7 +214,7 @@ end -------------------------------------------------------------------- local function TMXOrthoTest4() local ret = createTileDemoLayer("TMX width/height test") - local map = ccexp.TMXTiledMap:create("TileMaps/orthogonal-test4.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/orthogonal-test4.tmx") ret:addChild(map, 0, kTagTileMap) local s1 = map:getContentSize() @@ -277,7 +277,7 @@ local function TMXReadWriteTest() local ret = createTileDemoLayer("TMX Read/Write test") local m_gid = 0 local m_gid2 = 0 - local map = ccexp.TMXTiledMap:create("TileMaps/orthogonal-test2.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/orthogonal-test2.tmx") ret:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -437,7 +437,7 @@ local function TMXIsoTest() local color = cc.LayerColor:create( cc.c4b(64,64,64,255) ) ret:addChild(color, -1) - local map = ccexp.TMXTiledMap:create("TileMaps/iso-test.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/iso-test.tmx") ret:addChild(map, 0, kTagTileMap) -- move map to the center of the screen @@ -457,7 +457,7 @@ local function TMXIsoTest1() local color = cc.LayerColor:create( cc.c4b(64,64,64,255) ) ret:addChild(color, -1) - local map = ccexp.TMXTiledMap:create("TileMaps/iso-test1.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/iso-test1.tmx") ret:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -477,7 +477,7 @@ local function TMXIsoTest2() local color = cc.LayerColor:create( cc.c4b(64,64,64,255) ) ret:addChild(color, -1) - local map = ccexp.TMXTiledMap:create("TileMaps/iso-test2.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/iso-test2.tmx") ret:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -500,7 +500,7 @@ local function TMXUncompressedTest() local color = cc.LayerColor:create( cc.c4b(64,64,64,255) ) ret:addChild(color, -1) - local map = ccexp.TMXTiledMap:create("TileMaps/iso-test2-uncompressed.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/iso-test2-uncompressed.tmx") ret:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -521,7 +521,7 @@ end -------------------------------------------------------------------- local function TMXTilesetTest() local ret = createTileDemoLayer("TMX Tileset test") - local map = ccexp.TMXTiledMap:create("TileMaps/orthogonal-test5.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/orthogonal-test5.tmx") ret:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -537,7 +537,7 @@ end -------------------------------------------------------------------- local function TMXOrthoObjectsTest() local ret = createTileDemoLayer("TMX Ortho object test", "You should see a white box around the 3 platforms") - local map = ccexp.TMXTiledMap:create("TileMaps/ortho-objects.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/ortho-objects.tmx") ret:addChild(map, -1, kTagTileMap) local s = map:getContentSize() @@ -595,7 +595,7 @@ end local function TMXIsoObjectsTest() local ret = createTileDemoLayer("TMX Iso object test", "You need to parse them manually. See bug #810") - local map = ccexp.TMXTiledMap:create("TileMaps/iso-test-objectgroup.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/iso-test-objectgroup.tmx") ret:addChild(map, -1, kTagTileMap) local s = map:getContentSize() @@ -646,7 +646,7 @@ end local function TMXResizeTest() local ret = createTileDemoLayer("TMX resize test", "Should not crash. Testing issue #740") - local map = ccexp.TMXTiledMap:create("TileMaps/orthogonal-test5.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/orthogonal-test5.tmx") ret:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -672,7 +672,7 @@ end local function TMXIsoZorder() local m_tamara = nil local ret = createTileDemoLayer("TMX Iso Zorder", "Sprite should hide behind the trees") - local map = ccexp.TMXTiledMap:create("TileMaps/iso-test-zorder.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/iso-test-zorder.tmx") ret:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -733,7 +733,7 @@ end local function TMXOrthoZorder() local m_tamara = nil local ret = createTileDemoLayer("TMX Ortho Zorder", "Sprite should hide behind the trees") - local map = ccexp.TMXTiledMap:create("TileMaps/orthogonal-test-zorder.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/orthogonal-test-zorder.tmx") ret:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -791,7 +791,7 @@ end local function TMXIsoVertexZ() local m_tamara = nil local ret = createTileDemoLayer("TMX Iso VertexZ", "Sprite should hide behind the trees") - local map = ccexp.TMXTiledMap:create("TileMaps/iso-test-vertexz.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/iso-test-vertexz.tmx") ret:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -850,7 +850,7 @@ end local function TMXOrthoVertexZ() local m_tamara = nil local ret = createTileDemoLayer("TMX Ortho vertexZ", "Sprite should hide behind the trees") - local map = ccexp.TMXTiledMap:create("TileMaps/orthogonal-test-vertexz.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/orthogonal-test-vertexz.tmx") ret:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -908,7 +908,7 @@ end -------------------------------------------------------------------- local function TMXIsoMoveLayer() local ret = createTileDemoLayer("TMX Iso Move Layer", "Trees should be horizontally aligned") - local map = ccexp.TMXTiledMap:create("TileMaps/iso-test-movelayer.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/iso-test-movelayer.tmx") ret:addChild(map, 0, kTagTileMap) map:setPosition(cc.p(-700,-50)) @@ -926,7 +926,7 @@ end -------------------------------------------------------------------- local function TMXOrthoMoveLayer() local ret = createTileDemoLayer("TMX Ortho Move Layer", "Trees should be horizontally aligned") - local map = ccexp.TMXTiledMap:create("TileMaps/orthogonal-test-movelayer.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/orthogonal-test-movelayer.tmx") ret:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -959,7 +959,7 @@ end local function TMXOrthoFlipTest() local ret = createTileDemoLayer("TMX tile flip test") - local map = ccexp.TMXTiledMap:create("TileMaps/ortho-rotation-test.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/ortho-rotation-test.tmx") ret:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -978,7 +978,7 @@ end local function TMXOrthoFlipRunTimeTest() local ret = createTileDemoLayer("TMX tile flip run time test", "in 2 sec bottom left tiles will flip") - local map = ccexp.TMXTiledMap:create("TileMaps/ortho-rotation-test.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/ortho-rotation-test.tmx") ret:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -1052,7 +1052,7 @@ local function TMXOrthoFromXMLTest() cclog("Unable to open file") end - local map = ccexp.TMXTiledMap:createWithXML(str ,resources) + local map = cc.FastTMXTiledMap:createWithXML(str ,resources) ret:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -1072,7 +1072,7 @@ end local function TMXOrthoXMLFormatTest() local ret = createTileDemoLayer("you should see blue, green and yellow in console.") - local map = ccexp.TMXTiledMap:create("TileMaps/xml-test.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/xml-test.tmx") ret:addChild(map, 0, kTagTileMap) local s = map:getContentSize() @@ -1094,7 +1094,7 @@ end -------------------------------------------------------------------- local function TMXBug987() local ret = createTileDemoLayer("TMX Bug 987", "You should see an square") - local map = ccexp.TMXTiledMap:create("TileMaps/orthogonal-test6.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/orthogonal-test6.tmx") ret:addChild(map, 0, kTagTileMap) local s1 = map:getContentSize() @@ -1113,7 +1113,7 @@ end -------------------------------------------------------------------- local function TMXBug787() local ret = createTileDemoLayer("TMX Bug 787", "You should see a map") - local map = ccexp.TMXTiledMap:create("TileMaps/iso-test-bug787.tmx") + local map = cc.FastTMXTiledMap:create("TileMaps/iso-test-bug787.tmx") ret:addChild(map, 0, kTagTileMap) map:setScale(0.25) return ret diff --git a/tests/lua-tests/src/NewAudioEngineTest/NewAudioEngineTest.lua b/tests/lua-tests/src/NewAudioEngineTest/NewAudioEngineTest.lua index d9c4423d87..1744fea745 100644 --- a/tests/lua-tests/src/NewAudioEngineTest/NewAudioEngineTest.lua +++ b/tests/lua-tests/src/NewAudioEngineTest/NewAudioEngineTest.lua @@ -123,7 +123,7 @@ function AudioControlTest.create() ------playItem local function playAudio(tag, sender) if AudioControlTest._audioID == cc.AUDIO_INVAILD_ID then - AudioControlTest._audioID = ccexp.AudioEngine:play2d("background.mp3", AudioControlTest._loopEnabled, AudioControlTest._volume) + AudioControlTest._audioID = cc.AudioEngine:play2d("background.mp3", AudioControlTest._loopEnabled, AudioControlTest._volume) if AudioControlTest._audioID ~= cc.AUDIO_INVAILD_ID then AudioControlTest._playItem:setEnabled(false) @@ -133,7 +133,7 @@ function AudioControlTest.create() AudioControlTest._playItem:setEnabled(true) end - ccexp.AudioEngine:setFinishCallback(AudioControlTest._audioID,finishCallback) + cc.AudioEngine:setFinishCallback(AudioControlTest._audioID,finishCallback) end end end @@ -145,7 +145,7 @@ function AudioControlTest.create() ------stopItem local function stopAudio(tag, sender) if AudioControlTest._audioID ~= cc.AUDIO_INVAILD_ID then - ccexp.AudioEngine:stop(AudioControlTest._audioID) + cc.AudioEngine:stop(AudioControlTest._audioID) AudioControlTest._audioID = cc.AUDIO_INVAILD_ID AudioControlTest._playItem:setEnabled(true) end @@ -158,7 +158,7 @@ function AudioControlTest.create() ------pauseItem local function pauseAudio(tag, sender) if AudioControlTest._audioID ~= cc.AUDIO_INVAILD_ID then - ccexp.AudioEngine:pause(AudioControlTest._audioID) + cc.AudioEngine:pause(AudioControlTest._audioID) end end @@ -169,7 +169,7 @@ function AudioControlTest.create() ------resumeItem local function resumeAudio(tag, sender) if AudioControlTest._audioID ~= cc.AUDIO_INVAILD_ID then - ccexp.AudioEngine:resume(AudioControlTest._audioID) + cc.AudioEngine:resume(AudioControlTest._audioID) end end @@ -181,7 +181,7 @@ function AudioControlTest.create() local function switchLoop(tag, sender) AudioControlTest._loopEnabled = not AudioControlTest._loopEnabled if AudioControlTest._audioID ~= cc.AUDIO_INVAILD_ID then - ccexp.AudioEngine:setLoop(AudioControlTest._audioID, AudioControlTest._loopEnabled) + cc.AudioEngine:setLoop(AudioControlTest._audioID, AudioControlTest._loopEnabled) end if AudioControlTest._loopEnabled then AudioControlTest.loopItem:setString("disable-loop") @@ -196,7 +196,7 @@ function AudioControlTest.create() ------uncacheItem local function uncache(tag, sender) - ccexp.AudioEngine:uncache("background.mp3") + cc.AudioEngine:uncache("background.mp3") AudioControlTest._audioID = cc.AUDIO_INVAILD_ID AudioControlTest._playItem:setEnabled(true) end @@ -218,7 +218,7 @@ function AudioControlTest.create() local function volumeSliderChangedEvent(sender,eventType) AudioControlTest._volume = sender:getPercent() / 100.0 if AudioControlTest._audioID ~= cc.AUDIO_INVAILD_ID then - ccexp.AudioEngine:setVolume(AudioControlTest._audioID, AudioControlTest._volume) + cc.AudioEngine:setVolume(AudioControlTest._audioID, AudioControlTest._volume) end end local volumeSlider = ccui.Slider:create() @@ -247,7 +247,7 @@ function AudioControlTest.create() AudioControlTest._updateTimeSlider = false else if (AudioControlTest._audioID ~= cc.AUDIO_INVAILD_ID and AudioControlTest._duration ~= cc.AUDIO_TIME_UNKNOWN) then - ccexp.AudioEngine:setCurrentTime(AudioControlTest._audioID,AudioControlTest._duration * ratio) + cc.AudioEngine:setCurrentTime(AudioControlTest._audioID,AudioControlTest._duration * ratio) end AudioControlTest._updateTimeSlider = true end @@ -261,10 +261,10 @@ function AudioControlTest.create() local function step(dt) if AudioControlTest._audioID ~= cc.AUDIO_INVAILD_ID then if AudioControlTest._duration == cc.AUDIO_TIME_UNKNOWN then - AudioControlTest._duration = ccexp.AudioEngine:getDuration(AudioControlTest._audioID) + AudioControlTest._duration = cc.AudioEngine:getDuration(AudioControlTest._audioID) end if AudioControlTest._duration ~= cc.AUDIO_TIME_UNKNOWN then - local time = ccexp.AudioEngine:getCurrentTime(AudioControlTest._audioID) + local time = cc.AudioEngine:getCurrentTime(AudioControlTest._audioID) AudioControlTest._timeRatio = time / AudioControlTest._duration if AudioControlTest._updateTimeSlider then AudioControlTest._timeSlider:setRatio(AudioControlTest._timeRatio) @@ -277,7 +277,7 @@ function AudioControlTest.create() function onNodeEvent(tag) if tag == "exit" then - ccexp.AudioEngine:stopAll() + cc.AudioEngine:stopAll() end end layer:registerScriptHandler(onNodeEvent) @@ -302,7 +302,7 @@ function PlaySimultaneouslyTest.create() local audioID = cc.AUDIO_INVAILD_ID --for k, v in pairs(PlaySimultaneouslyTest.files) do for index=1,10 do - audioID = ccexp.AudioEngine:play2d(PlaySimultaneouslyTest.files[index]) + audioID = cc.AudioEngine:play2d(PlaySimultaneouslyTest.files[index]) if audioID ~= cc.AUDIO_INVAILD_ID then PlaySimultaneouslyTest._playItem:setEnabled(false) @@ -315,7 +315,7 @@ function PlaySimultaneouslyTest.create() end end - ccexp.AudioEngine:setFinishCallback(audioID,finishCallback) + cc.AudioEngine:setFinishCallback(audioID,finishCallback) end end end @@ -330,7 +330,7 @@ function PlaySimultaneouslyTest.create() function onNodeEvent(tag) if tag == "exit" then - ccexp.AudioEngine:stopAll() + cc.AudioEngine:stopAll() end end layer:registerScriptHandler(onNodeEvent) @@ -356,7 +356,7 @@ function AudioProfileTest.create() AudioProfileTest._files[2] = "background.ogg" end - AudioProfileTest._profile = ccexp.AudioProfile:new() + AudioProfileTest._profile = cc.AudioProfile:new() AudioProfileTest._profile.name = "AudioProfileTest" AudioProfileTest._profile.maxInstances = 3 AudioProfileTest._profile.minDelay = 1.0 @@ -372,7 +372,7 @@ function AudioProfileTest.create() local heightRatio = 0.7 for index=1,2 do local function itemClickCallback(tag, sender) - local audioID = ccexp.AudioEngine:play2d(AudioProfileTest._files[tag],false,1.0,AudioProfileTest._profile) + local audioID = cc.AudioEngine:play2d(AudioProfileTest._files[tag],false,1.0,AudioProfileTest._profile) if audioID ~= cc.AUDIO_INVAILD_ID then AudioProfileTest._time = AudioProfileTest._minDelay AudioProfileTest._audioCount = AudioProfileTest._audioCount + 1 @@ -383,7 +383,7 @@ function AudioProfileTest.create() AudioProfileTest._showLabel:setString(string.format("audio count:%d",AudioProfileTest._audioCount)) end - ccexp.AudioEngine:setFinishCallback(audioID,finishCallback) + cc.AudioEngine:setFinishCallback(audioID,finishCallback) end end @@ -429,7 +429,7 @@ function AudioProfileTest.create() function onNodeEvent(tag) if tag == "exit" then - ccexp.AudioEngine:stopAll() + cc.AudioEngine:stopAll() end end layer:registerScriptHandler(onNodeEvent) @@ -450,10 +450,10 @@ function InvalidAudioFileTest.create() local function playUnsupportedAudio(tag, sender) local targetPlatform = cc.Application:getInstance():getTargetPlatform() if (cc.PLATFORM_OS_MAC == currPlatform or cc.PLATFORM_OS_IPHONE == targetPlatform or cc.PLATFORM_OS_IPAD == targetPlatform) then - ccexp.AudioEngine:play2d("background.ogg") + cc.AudioEngine:play2d("background.ogg") end if (cc.PLATFORM_OS_ANDROID == targetPlatform) then - ccexp.AudioEngine:play2d("background.caf") + cc.AudioEngine:play2d("background.caf") end end @@ -463,7 +463,7 @@ function InvalidAudioFileTest.create() -- not-existent audio local function playNotExistentAudio(tag, sender) - ccexp.AudioEngine:play2d("not-existent file.mp3") + cc.AudioEngine:play2d("not-existent file.mp3") end local playItem2 = cc.MenuItemFont:create("play not-existent file") @@ -488,7 +488,7 @@ function LargeAudioFileTest.create() local layerSize = layer:getContentSize() local function playAudio(tag, sender) - ccexp.AudioEngine:play2d("audio/LuckyDay.mp3") + cc.AudioEngine:play2d("audio/LuckyDay.mp3") end local playItem = cc.MenuItemFont:create("play large audio file") @@ -501,7 +501,7 @@ function LargeAudioFileTest.create() function onNodeEvent(tag) if tag == "exit" then - ccexp.AudioEngine:stopAll() + cc.AudioEngine:stopAll() end end layer:registerScriptHandler(onNodeEvent) diff --git a/tests/lua-tests/src/VideoPlayerTest/VideoPlayerTest.lua b/tests/lua-tests/src/VideoPlayerTest/VideoPlayerTest.lua index 28c5ef1e0a..79fa34287a 100644 --- a/tests/lua-tests/src/VideoPlayerTest/VideoPlayerTest.lua +++ b/tests/lua-tests/src/VideoPlayerTest/VideoPlayerTest.lua @@ -18,18 +18,18 @@ local function VideoPlayerTest() layer:addChild(videoStateLabel) local function onVideoEventCallback(sener, eventType) - if eventType == ccexp.VideoPlayerEvent.PLAYING then + if eventType == ccui.VideoPlayerEvent.PLAYING then videoStateLabel:setString("PLAYING") - elseif eventType == ccexp.VideoPlayerEvent.PAUSED then + elseif eventType == ccui.VideoPlayerEvent.PAUSED then videoStateLabel:setString("PAUSED") - elseif eventType == ccexp.VideoPlayerEvent.STOPPED then + elseif eventType == ccui.VideoPlayerEvent.STOPPED then videoStateLabel:setString("STOPPED") - elseif eventType == ccexp.VideoPlayerEvent.COMPLETED then + elseif eventType == ccui.VideoPlayerEvent.COMPLETED then videoStateLabel:setString("COMPLETED") end end local widgetSize = widget:getContentSize() - local videoPlayer = ccexp.VideoPlayer:create() + local videoPlayer = ccui.VideoPlayer:create() videoPlayer:setPosition(centerPos) videoPlayer:setAnchorPoint(cc.p(0.5, 0.5)) videoPlayer:setContentSize(cc.size(widgetSize.width * 0.4,widgetSize.height * 0.4)) diff --git a/tests/lua-tests/src/WebViewTest/WebViewTest.lua b/tests/lua-tests/src/WebViewTest/WebViewTest.lua index a33ca19259..e655cad5ff 100644 --- a/tests/lua-tests/src/WebViewTest/WebViewTest.lua +++ b/tests/lua-tests/src/WebViewTest/WebViewTest.lua @@ -18,7 +18,7 @@ function WebViewTest:init() Helper.subtitleLabel:setString(self:subtitle()) local winSize = cc.Director:getInstance():getVisibleSize() - self._webView = ccexp.WebView:create() + self._webView = ccui.WebView:create() self._webView:setPosition(winSize.width / 2, winSize.height / 2) self._webView:setContentSize(winSize.width / 2, winSize.height / 2) self._webView:loadURL("https://www.baidu.com") diff --git a/tests/lua-tests/src/mainMenu.lua b/tests/lua-tests/src/mainMenu.lua index ff23100542..971c82e988 100644 --- a/tests/lua-tests/src/mainMenu.lua +++ b/tests/lua-tests/src/mainMenu.lua @@ -194,6 +194,8 @@ function CreateTestMenu() CloseMenu:addChild(CloseItem) menuLayer:addChild(CloseMenu) + local targetPlatform = cc.Application:getInstance():getTargetPlatform() + -- add menu items for tests local MainMenu = cc.Menu:create() local index = 0 diff --git a/tools/tolua/cocos2dx.ini b/tools/tolua/cocos2dx.ini index 99dea8ac05..3c27181756 100644 --- a/tools/tolua/cocos2dx.ini +++ b/tools/tolua/cocos2dx.ini @@ -27,7 +27,7 @@ headers = %(cocosdir)s/cocos/cocos2d.h %(cocosdir)s/cocos/2d/CCProtectedNode.h % # what classes to produce code for. You can use regular expressions here. When testing the regular # expression, it will be enclosed in "^$", like this: "^Menu*$". -classes = New.* Sprite.* Scene Node.* Director Layer.* Menu.* Touch .*Action.* Move.* Rotate.* Blink.* Tint.* Sequence Repeat.* Fade.* Ease.* Scale.* Transition.* Spawn Animat.* Flip.* Delay.* Skew.* Jump.* Place.* Show.* Progress.* PointArray ToggleVisibility.* RemoveSelf Hide Particle.* Label.* Atlas.* TextureCache.* Texture2D Cardinal.* CatmullRom.* ParallaxNode TileMap.* .*TMX.* CallFunc RenderTexture GridAction Grid3DAction GridBase$ .+Grid Shaky3D Waves3D FlipX3D FlipY3D Speed ActionManager Set Scheduler Timer Orbit.* Follow.* Bezier.* CardinalSpline.* Camera.* DrawNode .*3D$ Liquid$ Waves$ ShuffleTiles$ TurnOffTiles$ Split.* Twirl$ FileUtils$ GLProgram ShaderCache Application ClippingNode MotionStreak ^Ref$ UserDefault GLViewImpl GLView Image Event(?!.*(Physics).*).* Component ProtectedNode Console GLProgramCache GLProgramState Device ClippingRectangleNode .*Light$ AsyncTaskPool RenderState Material Properties Technique Pass PolygonInfo AutoPolygon BoneNode SkeletonNode ComponentLua PipelineDescriptor Renderer +classes = New.* Sprite.* Scene Node.* Director Layer.* Menu.* Touch .*Action.* Move.* Rotate.* Blink.* Tint.* Sequence Repeat.* Fade.* Ease.* Scale.* Transition.* Spawn Animat.* Flip.* Delay.* Skew.* Jump.* Place.* Show.* Progress.* PointArray ToggleVisibility.* RemoveSelf Hide Particle.* Label.* Atlas.* TextureCache.* Texture2D Cardinal.* CatmullRom.* ParallaxNode TileMap.* .*TMX.* CallFunc RenderTexture GridAction Grid3DAction GridBase$ .+Grid Shaky3D Waves3D FlipX3D FlipY3D Speed ActionManager Set Scheduler Timer Orbit.* Follow.* Bezier.* CardinalSpline.* Camera.* DrawNode .*3D$ Liquid$ Waves$ ShuffleTiles$ TurnOffTiles$ Split.* Twirl$ FileUtils$ GLProgram ShaderCache Application ClippingNode MotionStreak ^Ref$ UserDefault GLViewImpl GLView Image Event(?!.*(Physics).*).* Component ProtectedNode Console GLProgramCache GLProgramState Device ClippingRectangleNode .*Light$ AsyncTaskPool RenderState Material Properties Technique Pass PolygonInfo AutoPolygon BoneNode SkeletonNode ComponentLua PipelineDescriptor Renderer FastTMXLayer FastTMXTiledMap # what should we skip? in the format ClassName::[function function] # ClassName is a regular expression, but will be used like this: "^ClassName$" functions are also @@ -91,6 +91,7 @@ skip = Node::[setGLServerState description getUserObject .*UserData getGLServerS TiledGrid3DAction::[create actionWith.* tile originalTile getOriginalTile (g|s)etTile], TiledGrid3D::[tile originalTile getOriginalTile (g|s)etTile], TMXLayer::[getTiles getTileGIDAt setTiles], + FastTMXLayer::[(g|s)etTiles getTileGIDAt], TMXMapInfo::[startElement endElement textHandler], ParticleSystemQuad::[postStep setBatchNode draw setTexture$ setTotalParticles updateQuadWithParticle setupIndices listenBackToForeground initWithTotalParticles particleWithFile node], LayerMultiplex::[create layerWith.* initWithLayers], diff --git a/tools/tolua/cocos2dx_audioengine.ini b/tools/tolua/cocos2dx_audioengine.ini index 3d75a34000..d097f6be2f 100644 --- a/tools/tolua/cocos2dx_audioengine.ini +++ b/tools/tolua/cocos2dx_audioengine.ini @@ -5,7 +5,7 @@ prefix = cocos2dx_audioengine # create a target namespace (in javascript, this would create some code like the equiv. to `ns = ns || {}`) # all classes will be embedded in that namespace -target_namespace = ccexp +target_namespace = cc macro_judgement = #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_LINUX diff --git a/tools/tolua/cocos2dx_experimental.ini b/tools/tolua/cocos2dx_experimental.ini deleted file mode 100644 index d579896ba2..0000000000 --- a/tools/tolua/cocos2dx_experimental.ini +++ /dev/null @@ -1,61 +0,0 @@ -[cocos2dx_experimental] -# the prefix to be added to the generated functions. You might or might not use this in your own -# templates -prefix = cocos2dx_experimental - -# create a target namespace (in javascript, this would create some code like the equiv. to `ns = ns || {}`) -# all classes will be embedded in that namespace -target_namespace = ccexp - -android_headers = - -android_flags = -target armv7-none-linux-androideabi -D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS -DANDROID -D__ANDROID_API__=14 -gcc-toolchain %(gcc_toolchain_dir)s --sysroot=%(androidndkdir)s/platforms/android-14/arch-arm -idirafter %(androidndkdir)s/sources/android/support/include -idirafter %(androidndkdir)s/sysroot/usr/include -idirafter %(androidndkdir)s/sysroot/usr/include/arm-linux-androideabi -idirafter %(clangllvmdir)s/lib64/clang/5.0/include -I%(androidndkdir)s/sources/cxx-stl/llvm-libc++/include - -clang_headers = -clang_flags = -nostdinc -x c++ -std=c++11 -fsigned-char -U__SSE__ - -cocos_headers = -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/editor-support -I%(cocosdir)s/cocos/platform/android -I%(cocosdir)s/external - -cocos_flags = -DANDROID - -cxxgenerator_headers = - -# extra arguments for clang -extra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s - -# what headers to parse -headers = %(cocosdir)s/cocos/2d/CCFastTMXLayer.h %(cocosdir)s/cocos/2d/CCFastTMXTiledMap.h - -# what classes to produce code for. You can use regular expressions here. When testing the regular -# expression, it will be enclosed in "^$", like this: "^Menu*$". -classes = TMXLayer TMXTiledMap - -# what should we skip? in the format ClassName::[function function] -# ClassName is a regular expression, but will be used like this: "^ClassName$" functions are also -# regular expressions, they will not be surrounded by "^$". If you want to skip a whole class, just -# add a single "*" as functions. See bellow for several examples. A special class name is "*", which -# will apply to all class names. This is a convenience wildcard to be able to skip similar named -# functions from all classes. - -skip = TMXLayer::[(g|s)etTiles getTileGIDAt] - -rename_functions = - -rename_classes = - -# for all class names, should we remove something when registering in the target VM? -remove_prefix = - -# classes for which there will be no "parent" lookup -classes_have_no_parents = - -# base classes which will be skipped when their sub-classes found them. -base_classes_to_skip = - -# classes that create no constructor -# Set is special and we will use a hand-written constructor -abstract_classes = - -# Determining whether to use script object(js object) to control the lifecycle of native(cpp) object or the other way around. Supported values are 'yes' or 'no'. -script_control_cpp = no - diff --git a/tools/tolua/cocos2dx_ui.ini b/tools/tolua/cocos2dx_ui.ini index b877f4d54d..48103a81bd 100644 --- a/tools/tolua/cocos2dx_ui.ini +++ b/tools/tolua/cocos2dx_ui.ini @@ -44,7 +44,6 @@ skip = *::[^visit$ copyWith.* onEnter.* onExit.* ^description$ getObjectType .*H Widget::[addTouchEventListener addClickEventListener addCCSEventListener], LayoutParameter::[(s|g)etMargin], RichText::[setTagDescription removeTagDescription setOpenUrlHandler] - rename_functions = rename_classes = diff --git a/tools/tolua/cocos2dx_experimental_video.ini b/tools/tolua/cocos2dx_video.ini similarity index 92% rename from tools/tolua/cocos2dx_experimental_video.ini rename to tools/tolua/cocos2dx_video.ini index 004c030813..bf876774bd 100644 --- a/tools/tolua/cocos2dx_experimental_video.ini +++ b/tools/tolua/cocos2dx_video.ini @@ -1,13 +1,11 @@ -[cocos2dx_experimental_video] +[cocos2dx_video] # the prefix to be added to the generated functions. You might or might not use this in your own # templates -prefix = cocos2dx_experimental_video +prefix = cocos2dx_video # create a target namespace (in javascript, this would create some code like the equiv. to `ns = ns || {}`) # all classes will be embedded in that namespace -target_namespace = ccexp - -macro_judgement = #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_TARGET_OS_TVOS) +target_namespace = ccui android_headers = diff --git a/tools/tolua/cocos2dx_experimental_webview.ini b/tools/tolua/cocos2dx_webview.ini similarity index 92% rename from tools/tolua/cocos2dx_experimental_webview.ini rename to tools/tolua/cocos2dx_webview.ini index 3d738cb66d..e92626b865 100644 --- a/tools/tolua/cocos2dx_experimental_webview.ini +++ b/tools/tolua/cocos2dx_webview.ini @@ -1,14 +1,11 @@ -[cocos2dx_experimental_webview] +[cocos2dx_webview] # the prefix to be added to the generated functions. You might or might not use this in your own # templates -prefix = cocos2dx_experimental_webview +prefix = cocos2dx_webview # create a target namespace (in javascript, this would create some code like the equiv. to `ns = ns || {}`) # all classes will be embedded in that namespace -target_namespace = ccexp - -macro_judgement = #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_TARGET_OS_TVOS) - +target_namespace = ccui android_headers = android_flags = -target armv7-none-linux-androideabi -D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS -DANDROID -D__ANDROID_API__=14 -gcc-toolchain %(gcc_toolchain_dir)s --sysroot=%(androidndkdir)s/platforms/android-14/arch-arm -idirafter %(androidndkdir)s/sources/android/support/include -idirafter %(androidndkdir)s/sysroot/usr/include -idirafter %(androidndkdir)s/sysroot/usr/include/arm-linux-androideabi -idirafter %(clangllvmdir)s/lib64/clang/5.0/include -I%(androidndkdir)s/sources/cxx-stl/llvm-libc++/include diff --git a/tools/tolua/genbindings.py b/tools/tolua/genbindings.py index 0ab59acfcb..98c3da823d 100755 --- a/tools/tolua/genbindings.py +++ b/tools/tolua/genbindings.py @@ -206,13 +206,12 @@ def main(): 'cocos2dx_studio.ini' : ('cocos2dx_studio', 'lua_cocos2dx_studio_auto'), \ 'cocos2dx_spine.ini' : ('cocos2dx_spine', 'lua_cocos2dx_spine_auto'), \ 'cocos2dx_physics.ini' : ('cocos2dx_physics', 'lua_cocos2dx_physics_auto'), \ - 'cocos2dx_experimental_video.ini' : ('cocos2dx_experimental_video', 'lua_cocos2dx_experimental_video_auto'), \ - 'cocos2dx_experimental.ini' : ('cocos2dx_experimental', 'lua_cocos2dx_experimental_auto'), \ + 'cocos2dx_video.ini' : ('cocos2dx_video', 'lua_cocos2dx_video_auto'), \ 'cocos2dx_controller.ini' : ('cocos2dx_controller', 'lua_cocos2dx_controller_auto'), \ 'cocos2dx_3d.ini': ('cocos2dx_3d', 'lua_cocos2dx_3d_auto'), \ 'cocos2dx_audioengine.ini': ('cocos2dx_audioengine', 'lua_cocos2dx_audioengine_auto'), \ 'cocos2dx_csloader.ini' : ('cocos2dx_csloader', 'lua_cocos2dx_csloader_auto'), \ - 'cocos2dx_experimental_webview.ini' : ('cocos2dx_experimental_webview', 'lua_cocos2dx_experimental_webview_auto'), \ + 'cocos2dx_webview.ini' : ('cocos2dx_webview', 'lua_cocos2dx_webview_auto'), \ 'cocos2dx_physics3d.ini' : ('cocos2dx_physics3d', 'lua_cocos2dx_physics3d_auto'), \ 'cocos2dx_navmesh.ini' : ('cocos2dx_navmesh', 'lua_cocos2dx_navmesh_auto'), \ } From 8a191d5f6fad738b50644feaeface51f9dff5738 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Wed, 23 Oct 2019 15:06:43 +0800 Subject: [PATCH 39/96] [ci skip][AUTO]: updating luabinding & cocos_file.json automatically (#20230) --- .../auto/lua_cocos2dx_ui_auto.cpp | 961 +----------------- .../auto/lua_cocos2dx_ui_auto.hpp | 20 - templates/cocos2dx_files.json | 28 +- 3 files changed, 11 insertions(+), 998 deletions(-) diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp index bc81570408..63014509af 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp @@ -31228,964 +31228,6 @@ int lua_register_cocos2dx_ui_RelativeBox(lua_State* tolua_S) return 1; } -int lua_cocos2dx_ui_WebView_setOpacityWebView(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_setOpacityWebView'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - double arg0; - - ok &= luaval_to_number(tolua_S, 2,&arg0, "ccui.WebView:setOpacityWebView"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_setOpacityWebView'", nullptr); - return 0; - } - cobj->setOpacityWebView(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:setOpacityWebView",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_setOpacityWebView'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_canGoBack(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_canGoBack'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_canGoBack'", nullptr); - return 0; - } - bool ret = cobj->canGoBack(); - tolua_pushboolean(tolua_S,(bool)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:canGoBack",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_canGoBack'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_loadHTMLString(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_loadHTMLString'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:loadHTMLString"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_loadHTMLString'", nullptr); - return 0; - } - cobj->loadHTMLString(arg0); - lua_settop(tolua_S, 1); - return 1; - } - if (argc == 2) - { - std::string arg0; - std::string arg1; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:loadHTMLString"); - - ok &= luaval_to_std_string(tolua_S, 3,&arg1, "ccui.WebView:loadHTMLString"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_loadHTMLString'", nullptr); - return 0; - } - cobj->loadHTMLString(arg0, arg1); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:loadHTMLString",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_loadHTMLString'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_goForward(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_goForward'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_goForward'", nullptr); - return 0; - } - cobj->goForward(); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:goForward",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_goForward'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_goBack(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_goBack'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_goBack'", nullptr); - return 0; - } - cobj->goBack(); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:goBack",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_goBack'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_setScalesPageToFit(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_setScalesPageToFit'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - bool arg0; - - ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccui.WebView:setScalesPageToFit"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_setScalesPageToFit'", nullptr); - return 0; - } - cobj->setScalesPageToFit(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:setScalesPageToFit",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_setScalesPageToFit'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_loadFile(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_loadFile'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:loadFile"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_loadFile'", nullptr); - return 0; - } - cobj->loadFile(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:loadFile",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_loadFile'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_loadURL(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_loadURL'", nullptr); - return 0; - } -#endif - argc = lua_gettop(tolua_S)-1; - do{ - if (argc == 2) { - std::string arg0; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:loadURL"); - - if (!ok) { break; } - bool arg1; - ok &= luaval_to_boolean(tolua_S, 3,&arg1, "ccui.WebView:loadURL"); - - if (!ok) { break; } - cobj->loadURL(arg0, arg1); - lua_settop(tolua_S, 1); - return 1; - } - }while(0); - ok = true; - do{ - if (argc == 1) { - std::string arg0; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:loadURL"); - - if (!ok) { break; } - cobj->loadURL(arg0); - lua_settop(tolua_S, 1); - return 1; - } - }while(0); - ok = true; - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:loadURL",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_loadURL'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_setBounces(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_setBounces'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - bool arg0; - - ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccui.WebView:setBounces"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_setBounces'", nullptr); - return 0; - } - cobj->setBounces(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:setBounces",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_setBounces'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_evaluateJS(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_evaluateJS'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:evaluateJS"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_evaluateJS'", nullptr); - return 0; - } - cobj->evaluateJS(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:evaluateJS",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_evaluateJS'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_setBackgroundTransparent(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_setBackgroundTransparent'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_setBackgroundTransparent'", nullptr); - return 0; - } - cobj->setBackgroundTransparent(); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:setBackgroundTransparent",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_setBackgroundTransparent'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_getOnJSCallback(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_getOnJSCallback'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_getOnJSCallback'", nullptr); - return 0; - } - cocos2d::ui::WebView::ccWebViewCallback ret = cobj->getOnJSCallback(); - #pragma warning NO CONVERSION FROM NATIVE FOR std::function; - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:getOnJSCallback",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_getOnJSCallback'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_canGoForward(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_canGoForward'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_canGoForward'", nullptr); - return 0; - } - bool ret = cobj->canGoForward(); - tolua_pushboolean(tolua_S,(bool)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:canGoForward",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_canGoForward'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_stopLoading(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_stopLoading'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_stopLoading'", nullptr); - return 0; - } - cobj->stopLoading(); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:stopLoading",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_stopLoading'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_getOpacityWebView(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_getOpacityWebView'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_getOpacityWebView'", nullptr); - return 0; - } - double ret = cobj->getOpacityWebView(); - tolua_pushnumber(tolua_S,(lua_Number)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:getOpacityWebView",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_getOpacityWebView'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_reload(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_reload'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_reload'", nullptr); - return 0; - } - cobj->reload(); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:reload",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_reload'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_setJavascriptInterfaceScheme(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::WebView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_WebView_setJavascriptInterfaceScheme'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.WebView:setJavascriptInterfaceScheme"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_setJavascriptInterfaceScheme'", nullptr); - return 0; - } - cobj->setJavascriptInterfaceScheme(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:setJavascriptInterfaceScheme",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_setJavascriptInterfaceScheme'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_ui_WebView_create(lua_State* tolua_S) -{ - int argc = 0; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"ccui.WebView",0,&tolua_err)) goto tolua_lerror; -#endif - - argc = lua_gettop(tolua_S) - 1; - - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_create'", nullptr); - return 0; - } - cocos2d::ui::WebView* ret = cocos2d::ui::WebView::create(); - object_to_luaval(tolua_S, "ccui.WebView",(cocos2d::ui::WebView*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccui.WebView:create",argc, 0); - return 0; -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_create'.",&tolua_err); -#endif - return 0; -} -int lua_cocos2dx_ui_WebView_constructor(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::WebView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_WebView_constructor'", nullptr); - return 0; - } - cobj = new cocos2d::ui::WebView(); - cobj->autorelease(); - int ID = (int)cobj->_ID ; - int* luaID = &cobj->_luaID ; - toluafix_pushusertype_ccobject(tolua_S, ID, luaID, (void*)cobj,"ccui.WebView"); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.WebView:WebView",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_WebView_constructor'.",&tolua_err); -#endif - - return 0; -} - -static int lua_cocos2dx_ui_WebView_finalize(lua_State* tolua_S) -{ - printf("luabindings: finalizing LUA object (WebView)"); - return 0; -} - -int lua_register_cocos2dx_ui_WebView(lua_State* tolua_S) -{ - tolua_usertype(tolua_S,"ccui.WebView"); - tolua_cclass(tolua_S,"WebView","ccui.WebView","ccui.Widget",nullptr); - - tolua_beginmodule(tolua_S,"WebView"); - tolua_function(tolua_S,"new",lua_cocos2dx_ui_WebView_constructor); - tolua_function(tolua_S,"setOpacityWebView",lua_cocos2dx_ui_WebView_setOpacityWebView); - tolua_function(tolua_S,"canGoBack",lua_cocos2dx_ui_WebView_canGoBack); - tolua_function(tolua_S,"loadHTMLString",lua_cocos2dx_ui_WebView_loadHTMLString); - tolua_function(tolua_S,"goForward",lua_cocos2dx_ui_WebView_goForward); - tolua_function(tolua_S,"goBack",lua_cocos2dx_ui_WebView_goBack); - tolua_function(tolua_S,"setScalesPageToFit",lua_cocos2dx_ui_WebView_setScalesPageToFit); - tolua_function(tolua_S,"loadFile",lua_cocos2dx_ui_WebView_loadFile); - tolua_function(tolua_S,"loadURL",lua_cocos2dx_ui_WebView_loadURL); - tolua_function(tolua_S,"setBounces",lua_cocos2dx_ui_WebView_setBounces); - tolua_function(tolua_S,"evaluateJS",lua_cocos2dx_ui_WebView_evaluateJS); - tolua_function(tolua_S,"setBackgroundTransparent",lua_cocos2dx_ui_WebView_setBackgroundTransparent); - tolua_function(tolua_S,"getOnJSCallback",lua_cocos2dx_ui_WebView_getOnJSCallback); - tolua_function(tolua_S,"canGoForward",lua_cocos2dx_ui_WebView_canGoForward); - tolua_function(tolua_S,"stopLoading",lua_cocos2dx_ui_WebView_stopLoading); - tolua_function(tolua_S,"getOpacityWebView",lua_cocos2dx_ui_WebView_getOpacityWebView); - tolua_function(tolua_S,"reload",lua_cocos2dx_ui_WebView_reload); - tolua_function(tolua_S,"setJavascriptInterfaceScheme",lua_cocos2dx_ui_WebView_setJavascriptInterfaceScheme); - tolua_function(tolua_S,"create", lua_cocos2dx_ui_WebView_create); - tolua_endmodule(tolua_S); - std::string typeName = typeid(cocos2d::ui::WebView).name(); - g_luaType[typeName] = "ccui.WebView"; - g_typeCast["WebView"] = "ccui.WebView"; - return 1; -} - int lua_cocos2dx_ui_Scale9Sprite_updateWithSprite(lua_State* tolua_S) { int argc = 0; @@ -41171,7 +40213,7 @@ TOLUA_API int register_all_cocos2dx_ui(lua_State* tolua_S) lua_register_cocos2dx_ui_RichElementCustomNode(tolua_S); lua_register_cocos2dx_ui_VBox(tolua_S); lua_register_cocos2dx_ui_RadioButtonGroup(tolua_S); - lua_register_cocos2dx_ui_WebView(tolua_S); + lua_register_cocos2dx_ui_TabControl(tolua_S); lua_register_cocos2dx_ui_ScrollView(tolua_S); lua_register_cocos2dx_ui_ListView(tolua_S); lua_register_cocos2dx_ui_TabHeader(tolua_S); @@ -41182,7 +40224,6 @@ TOLUA_API int register_all_cocos2dx_ui(lua_State* tolua_S) lua_register_cocos2dx_ui_LinearLayoutParameter(tolua_S); lua_register_cocos2dx_ui_RadioButton(tolua_S); lua_register_cocos2dx_ui_ImageView(tolua_S); - lua_register_cocos2dx_ui_TabControl(tolua_S); lua_register_cocos2dx_ui_HBox(tolua_S); lua_register_cocos2dx_ui_RichElementText(tolua_S); lua_register_cocos2dx_ui_PageView(tolua_S); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp index 47cdf4be29..0a0f20bde6 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp @@ -789,26 +789,6 @@ int register_all_cocos2dx_ui(lua_State* tolua_S); - - - - - - - - - - - - - - - - - - - - diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index aa7b7baa9e..8a76ee1183 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -3809,12 +3809,6 @@ "cocos/scripting/lua-bindings/auto/lua_cocos2dx_controller_auto.hpp", "cocos/scripting/lua-bindings/auto/lua_cocos2dx_csloader_auto.cpp", "cocos/scripting/lua-bindings/auto/lua_cocos2dx_csloader_auto.hpp", - "cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_auto.cpp", - "cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_auto.hpp", - "cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.cpp", - "cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.hpp", - "cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_webview_auto.cpp", - "cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_webview_auto.hpp", "cocos/scripting/lua-bindings/auto/lua_cocos2dx_extension_auto.cpp", "cocos/scripting/lua-bindings/auto/lua_cocos2dx_extension_auto.hpp", "cocos/scripting/lua-bindings/auto/lua_cocos2dx_navmesh_auto.cpp", @@ -3829,6 +3823,10 @@ "cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp", "cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp", "cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp", + "cocos/scripting/lua-bindings/auto/lua_cocos2dx_video_auto.cpp", + "cocos/scripting/lua-bindings/auto/lua_cocos2dx_video_auto.hpp", + "cocos/scripting/lua-bindings/auto/lua_cocos2dx_webview_auto.cpp", + "cocos/scripting/lua-bindings/auto/lua_cocos2dx_webview_auto.hpp", "cocos/scripting/lua-bindings/manual/3d/lua_cocos2dx_3d_manual.cpp", "cocos/scripting/lua-bindings/manual/3d/lua_cocos2dx_3d_manual.h", "cocos/scripting/lua-bindings/manual/CCComponentLua.cpp", @@ -3852,8 +3850,6 @@ "cocos/scripting/lua-bindings/manual/cocos2d/LuaScriptHandlerMgr.h", "cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_deprecated.cpp", "cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_deprecated.h", - "cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_experimental_manual.cpp", - "cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_experimental_manual.hpp", "cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp", "cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.hpp", "cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_physics_manual.cpp", @@ -3900,14 +3896,12 @@ "cocos/scripting/lua-bindings/manual/spine/lua_cocos2dx_spine_manual.hpp", "cocos/scripting/lua-bindings/manual/tolua_fix.cpp", "cocos/scripting/lua-bindings/manual/tolua_fix.h", - "cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_video_manual.cpp", - "cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_video_manual.hpp", - "cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_webview_manual.cpp", - "cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_experimental_webview_manual.hpp", "cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_ui_manual.cpp", "cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_ui_manual.hpp", - "cocos/scripting/lua-bindings/manual/video/lua_cocos2dx_experimental_video_manual.cpp", - "cocos/scripting/lua-bindings/manual/video/lua_cocos2dx_experimental_video_manual.hpp", + "cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_video_manual.cpp", + "cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_video_manual.hpp", + "cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_webview_manual.cpp", + "cocos/scripting/lua-bindings/manual/ui/lua_cocos2dx_webview_manual.hpp", "cocos/scripting/lua-bindings/proj.android/CMakeLists.txt", "cocos/scripting/lua-bindings/script/3d/3dConstants.lua", "cocos/scripting/lua-bindings/script/cocos2d/Cocos2d.lua", @@ -3960,7 +3954,6 @@ "cocos/scripting/lua-bindings/script/ui/DeprecatedUIEnum.lua", "cocos/scripting/lua-bindings/script/ui/DeprecatedUIFunc.lua", "cocos/scripting/lua-bindings/script/ui/GuiConstants.lua", - "cocos/scripting/lua-bindings/script/ui/experimentalUIConstants.lua", "external/lua/cjson/fpconv.c", "external/lua/cjson/fpconv.h", "external/lua/cjson/lua_cjson.c", @@ -4168,9 +4161,6 @@ "tools/tolua/cocos2dx_backend.ini", "tools/tolua/cocos2dx_controller.ini", "tools/tolua/cocos2dx_csloader.ini", - "tools/tolua/cocos2dx_experimental.ini", - "tools/tolua/cocos2dx_experimental_video.ini", - "tools/tolua/cocos2dx_experimental_webview.ini", "tools/tolua/cocos2dx_extension.ini", "tools/tolua/cocos2dx_navmesh.ini", "tools/tolua/cocos2dx_physics.ini", @@ -4178,6 +4168,8 @@ "tools/tolua/cocos2dx_spine.ini", "tools/tolua/cocos2dx_studio.ini", "tools/tolua/cocos2dx_ui.ini", + "tools/tolua/cocos2dx_video.ini", + "tools/tolua/cocos2dx_webview.ini", "tools/tolua/genbindings.py", "tools/tolua/userconf.ini" ] From 1898d477ceae7737bb9a85e01d3aa58ce56c5110 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 24 Oct 2019 14:34:48 +0800 Subject: [PATCH 40/96] [ci skip]Release note (#20234) * update changelog * update release note * update version --- CHANGELOG | 8 ++++ cocos/cocos2d.cpp | 2 +- docs/RELEASE_NOTES.md | 78 +++++++++++------------------------ docs/RELEASE_NOTES_CN.md | 88 ++++++++++------------------------------ docs/doxygen.config | 2 +- 5 files changed, 54 insertions(+), 124 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 8cf7b01ae0..2f4916503f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,10 +4,18 @@ cocos2d-x-4.0 ?? [HIGHLIGHT] Use CMake for all platforms [REFINE] Update glfw to 3.3 +[REFINE] Update minizip to 1.2 [CHANGE] remove deprecated functions [CHANGE] remove h5 engine and JSB [CHANGE] remove tiff +[CHANGE] remove `experimental` namespace + +[FIX] system font can not work correctly on macOS 15 +[FIX] TextField can not work if using system input to get Chinese characters with iOS13 +[FIX] UIWebView uses WKWebView instead +[FIX] VideoPlayer uses AVPlayerController instead +[FX] lua crashes on 64it devcices cocos2d-x-3.17 May.21 2018 diff --git a/cocos/cocos2d.cpp b/cocos/cocos2d.cpp index 2fd0c4830f..1ff9fef9c2 100644 --- a/cocos/cocos2d.cpp +++ b/cocos/cocos2d.cpp @@ -32,7 +32,7 @@ NS_CC_BEGIN CC_DLL const char* cocos2dVersion() { - return "cocos2d-x-4.0rc0"; + return "cocos2d-x-4.0"; } NS_CC_END diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index da4ca4b805..c1cb9c7662 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -2,69 +2,37 @@ **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* -- [Cocos2d-x 3.17 Release Notes](#cocos2d-x-317-release-notes) - - [Android requirements](#android-requirements) +- [Cocos2d-x 4.0 Release Notes](#cocos2d-x-40-release-notes) - [Highlights](#highlights) - - [added support for iPhone X](#added-support-for-iphone-x) - - [added support Android Studio 3.0+](#added-support-android-studio-30) - - [CMake is now supported on all platforms](#cmake-is-now-supported-on-all-platforms) - - [upgrade 3rd-party libraries](#upgrade-3rd-party-libraries) - - [remove outdated](#remove-outdated) - - [misc bugs fix and stability improvements](#misc-bugs-fix-and-stability-improvements) + - [Documentation](#documentation) -# Cocos2d-x 3.17 Release Notes # -The 3.17 release focuses on stability and increased performance with some under the hood enhancements that will make cross-platform development easier. +# Cocos2d-x 4.0 Release Notes # -## Android requirements +This version is mainly to support metal on iOS/macOS. In order to support metal, this version does a big refactor of the rendering system. And this version also remove deprecated functions, so there are some API modification. -v3.17 has been tested using Android Studio (3.0, 3.1, 3.1.1) with NDK r16 +In order to help develpers easily update to v4, we wrote some documentations. These documentations can be found [here](https://docs.cocos.com/cocos2d-x/v4/manual/en/upgradeGuide/). ## Highlights -- added support for iPhone X -- added support Android Studio 3.0+ -- CMake is now supported on all platforms -- upgraded Spine runtime to v3.6.39 -- upgraded GLFW to 3.2.1 -- misc bugs fix and stability improvements +- support metal on iOS/macOS +- use CMake for all platforms +- update GLFW to 3.3 +- update minizip to 1.2 +- remove deprecated functions +- remove h5 engine and JSB +- remove tiff +- remove `SimpleAudioEngine` +- remove `experimetnal` namespace +- fix bug that system font can not work correctly on macOS15 +- fix lua crash issue on 64bit devices +- fix bugs for iOS13 + - UIWebView uses WKWebView instead + - VideoPlayer uses AVPlayerController instead -### added support for iPhone X +## Documentation -3.17 brings support for iPhone X including supporting full screen mode, using Storyboards for launch images, __safe area__ API and support for auto hiding the Home indicator. It is important to note exactly what and where the safe area is: - -

- -

- -Developers can get the safe area easily by calling: `Director::getSafeAreaRect()`. - -### added support Android Studio 3.0+ - -Android Studio is the only official IDE for Google's Android operating system. -Cocos2d-x supports Android Studio using NDK version r16 to r16. Gradle configurations have been updated, including simplifying Gradle PROP_* values, changing the deprecated `compile` to the new `implementation`in dependency declaration, and added Proguard configuration to reduce Release package size. - -### CMake is now supported on all platforms - -CMake is now supported on all platforms, including Android(NDK), iOS, macOS, Windows (VC++ compiler), Linux. Supports precompile libraries for engine, and reusing precompiled libraries in the new build process. Your projects build time will be greatly reduced. For detailed usage, please refer to [CMake Doc](https://github.com/cocos2d/cocos2d-x/blob/v3/cmake/README.md) - -### upgrade 3rd-party libraries - -Spine skeleton animation is widely used in games developed by Cocos2d-x. Spine runtime has been upgraded to 3.6.39 to keep current. - -GLFW has been upgraded to 3.2.1 to help fix joystick issues. You can also now use GLFW as a precompiled library. - -Box2D hasn't been updated in quite some time. A new production version has yet to be released so far in 2018. We felt GitHub commit f655c603ba9d83 was stable. You can also now use Box2D as a precompiled library. - -Each Cocos2d-x release comes with a specific version of third-party libraries. If you want to upgrade third-party libraries due to your projects needs, please refer to: [3rd-party Doc](https://github.com/cocos2d/cocos2d-x-3rd-party-libs-src/blob/v3/README.md) - -### remove outdated - -Google officially deprecated ant build support starting in [Android SDK Tools 25.3.0](http://tools.android.com/recent/androidsdktoolsrevision2530feb2017). The old ant based `proj.android` and been dropped and now `proj.android` is an Android Studio project. The default architecture is changed from `armeabi` to `armeabi-v7a`. - -Visual Studio 2013 support has been dropped. Visual Studio 2015/2017 are still currently supported. The existing win32 project files is quite suitable for 2015. To use 2017, you can open a 2015 project file, modify the configuration to suit your needs, or use CMake (See above). - -### misc bugs fix and stability improvements - -This release contains more than 51 bugs fixed and 33 misc improvements, please refer to [Changelog](https://github.com/cocos2d/cocos2d-x/blob/v3/CHANGELOG) +We wrote some documentations to help developers upgrade to v4: +- [how to run tests and how to create a new project and run](https://docs.cocos2d-x.org/cocos2d-x/v4/en/installation/) +- [v4 updrade guide](https://docs.cocos2d-x.org/cocos2d-x/v4/en/upgradeGuide/) diff --git a/docs/RELEASE_NOTES_CN.md b/docs/RELEASE_NOTES_CN.md index e8cb6991cc..1c66622ae6 100644 --- a/docs/RELEASE_NOTES_CN.md +++ b/docs/RELEASE_NOTES_CN.md @@ -2,79 +2,33 @@ **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* -- [Cocos2d-x 3.17 Release Notes](#cocos2d-x-317-release-notes) - - [测试环境](#%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83) +- [Cocos2d-x v4 Release Notes](#cocos2d-x-v4-release-notes) - [版本特性](#%E7%89%88%E6%9C%AC%E7%89%B9%E6%80%A7) - - [详细介绍](#%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D) - - [支持 iPhone X](#%E6%94%AF%E6%8C%81-iphone-x) - - [支持 Android Studio 3.0+](#%E6%94%AF%E6%8C%81-android-studio-30) - - [CMake 支持全平台](#cmake-%E6%94%AF%E6%8C%81%E5%85%A8%E5%B9%B3%E5%8F%B0) - - [升级第三方库](#%E5%8D%87%E7%BA%A7%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%93) - - [移除过时的内容](#%E7%A7%BB%E9%99%A4%E8%BF%87%E6%97%B6%E7%9A%84%E5%86%85%E5%AE%B9) - - [Bugs 修复,提高稳定性](#bugs-%E4%BF%AE%E5%A4%8D%E6%8F%90%E9%AB%98%E7%A8%B3%E5%AE%9A%E6%80%A7) + - [文档](#%E6%96%87%E6%A1%A3) -# Cocos2d-x 3.17 Release Notes # - -Cocos2d-x 3.17 版本着重于工具链的更新,和稳定性的增强。 - -## 测试环境 - - Android 平台使用 Android Studio (3.0, 3.1, 3.1.1) 和 NDK r16 进行测试。 +# Cocos2d-x v4 Release Notes # ## 版本特性 -- 支持 iPhone X -- 支持 Android Studio 3.0+ -- CMake 支持全平台,支持预编译引擎库 -- 升级 Spine runtime 至 v3.6.39 -- 升级 GLFW 至 3.2.1,并提供预编译库 -- 更新 Box2D,并提供预编译库 -- 去除 Android 的 ant 工程 -- 去除 Visual Studio 2013 的支持 +- iOS/macOS 支持 metal +- 使用 CMake,删除各平台的工程文件 +- 升级 GLFW 到 3.3 +- 升级 minizip 到 1.2 +- 删除废弃函数 +- 删除 h5 引擎和 Javascript 绑定 +- 删除 tiff +- 删除 `SimpleAudioEngine` +- 删除 `experimental` 名字空间 +- 修复 macOS 15 系统字体绘制问题 +- 适配 iOS13 + - UIWebView 使用 WKWebView 实现 + - VideoPlayer 使用 AVPlayerController 实现 +- 修复 lua 工程在 64 位设备的崩溃问题 -## 详细介绍 - -### 支持 iPhone X - -3.17 带来对 iPhone X 的支持,包含支持全屏模式,支持自动隐藏 Home 指示器,改用 Storyboard 作为启动屏幕,和增加获取 Safe Area 的接口。在开发支持 iPhone X 的应用时,最需要了解清楚的就是 Safe Area: - -

- -

- -开发者可以通过调用 `Director::getSafeAreaRect()` 来获取 Safe Area 区域。 - -### 支持 Android Studio 3.0+ - -Android Studio 是 Google 官方唯一支持的 Android 开发 IDE。 - -该版本增加了对 Android Studio 3.0+ 的支持。在支持的过程中,同时将 NDK 版本从 r14 升级到 r16。对 Gradle 工程配置也进行了诸多改进,包括简化 Gradle 变量 PROP_*,将依赖声明中弃用的 `compile` 改为新的 `implementation`,增加用以削减 Release 包体积的 Proguard 文件。 - -### CMake 支持全平台 - -扩展 CMake 构建支持至全平台,包括 Android (NDK)、iOS、macOS、Linux、Windows(VC++ compiler)。支持将引擎部分进行预编译,并在新的构建过程中重用预编译的引擎库。通过使用预编译库,可以极大的缩短工程构建时间。 - -详细的使用方法请参考 [CMake 文档](https://github.com/cocos2d/cocos2d-x/blob/v3/cmake/README.md) - -### 升级第三方库 - -Spine 骨骼动画广泛用于 Cocos2d-x 开发的游戏,引擎跟进 Spine 的升级,升级 Runtime 至 3.6.39。 - -升级 GLFW 至 3.2.1 以修复支持游戏手柄时存在的问题,同时提供 GLFW 预编译库。 - -社区希望引擎升级 Box2D,可 Box2D 的新版本迟迟未发布,根据反馈 GitHub 提交 f655c603ba9d83 是稳定的,升级 Box2D 至该提交,同时提供 Box2D 的预编译库。 - -每一次版本发布,都会附带特定版本的第三方预编译库,如果由于项目需要想对第三方库进行定制,请参考: [第三方库文档](https://github.com/cocos2d/cocos2d-x-3rd-party-libs-src/blob/v3/README.md) - -### 移除过时的内容 - -由于 Google 官方自 [Android SDK Tools 25.3.0](http://tools.android.com/recent/androidsdktoolsrevision2530feb2017) 就已放弃 ant 支持。移除旧有的 `proj.android` ant 工程,新的 `proj.android` 是 Android Studio 工程。[NDK r16](https://developer.android.com/ndk/guides/abis) 弃用了 armeabi,引擎调整默认的编译架构从 armeabi 为 armeabi-v7a。 - -在 win32 平台,越来越多的开发者已经使用 Visual Studio 2015/2017 进行开发,移除对年代久远的 2013 的支持。现存的工程配置适合于 2015 ,如果需要使用 2017,可打开现有的 sln 文件,调整配置,或使用 CMake。 - -### Bugs 修复,提高稳定性 - -改版本包含 51 项 bugs 修复和 33 项小改进,不再列举,请参考 [Changelog](https://github.com/cocos2d/cocos2d-x/blob/v3/CHANGELOG)。 +## 文档 +编写了一些文档方便开发者升级到 v4: +- [如何运行测试例子,如何新建工程并运行](https://docs.cocos2d-x.org/cocos2d-x/v4/zn/installation) +- [v4 升级指南](https://docs.cocos2d-x.org/cocos2d-x/v4/en/upgradeGuide/) \ No newline at end of file diff --git a/docs/doxygen.config b/docs/doxygen.config index 629b0e73de..370e1e279f 100644 --- a/docs/doxygen.config +++ b/docs/doxygen.config @@ -38,7 +38,7 @@ PROJECT_NAME = Cocos2d-x # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = v3.16 +PROJECT_NUMBER = v4 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a From 8bf83dcf3a5b4554c363bbfa18956ae0f769ea4a Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 24 Oct 2019 17:19:18 +0800 Subject: [PATCH 41/96] Sync 20209 (#20233) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix issue: TextField can not receive characters(non number or english… (#20209) --- cocos/platform/CMakeLists.txt | 2 + cocos/platform/ios/CCEAGLView-ios.h | 39 +- cocos/platform/ios/CCEAGLView-ios.mm | 490 +------------------------ cocos/platform/ios/CCGLViewImpl-ios.mm | 4 +- cocos/platform/ios/CCInputView-ios.h | 4 + cocos/platform/ios/CCInputView-ios.mm | 347 +++++++++++++++++ 6 files changed, 375 insertions(+), 511 deletions(-) create mode 100644 cocos/platform/ios/CCInputView-ios.h create mode 100644 cocos/platform/ios/CCInputView-ios.mm diff --git a/cocos/platform/CMakeLists.txt b/cocos/platform/CMakeLists.txt index c5c8ce171c..a330236782 100644 --- a/cocos/platform/CMakeLists.txt +++ b/cocos/platform/CMakeLists.txt @@ -94,6 +94,7 @@ elseif(APPLE) platform/ios/CCPlatformDefine-ios.h platform/ios/CCStdC-ios.h platform/ios/OpenGL_Internal-ios.h + platform/ios/CCInputView-ios.h ) set(COCOS_PLATFORM_SPECIFIC_SRC ${COCOS_PLATFORM_SPECIFIC_SRC} @@ -104,6 +105,7 @@ elseif(APPLE) platform/ios/CCEAGLView-ios.mm platform/ios/CCGLViewImpl-ios.mm platform/ios/CCImage-ios.mm + platform/ios/CCInputView-ios.mm ) endif() diff --git a/cocos/platform/ios/CCEAGLView-ios.h b/cocos/platform/ios/CCEAGLView-ios.h index c1908e7dd3..ac9b40b242 100644 --- a/cocos/platform/ios/CCEAGLView-ios.h +++ b/cocos/platform/ios/CCEAGLView-ios.h @@ -60,10 +60,6 @@ APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Copyright (C) 2008 Apple Inc. All Rights Reserved. */ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS - #import #import #import @@ -78,42 +74,16 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. * The view content is basically an EAGL surface you render your OpenGL scene into. * Note that setting the view non-opaque will only work if the EAGL surface has an alpha channel. */ -@interface CCEAGLView : UIView +@interface CCEAGLView : UIView { -// id renderer_; -// EAGLContext *context_; // weak ref - - NSString *pixelformat_; - GLuint depthFormat_; BOOL preserveBackbuffer_; - - CGSize size_; CGRect safeArea_; BOOL discardFramebufferSupported_; //fsaa addition - BOOL multisampling_; unsigned int requestedSamples_; - BOOL isUseUITextField; -@private - NSString * markedText_; - CGRect caretRect_; - CGRect originalRect_; - NSNotification* keyboardShowNotification_; - BOOL isKeyboardShown_; } -@property(nonatomic, readonly) UITextPosition *beginningOfDocument; -@property(nonatomic, readonly) UITextPosition *endOfDocument; -@property(nonatomic, assign) id inputDelegate; -@property(nonatomic, readonly) UITextRange *markedTextRange; -@property (nonatomic, copy) NSDictionary *markedTextStyle; -@property(readwrite, copy) UITextRange *selectedTextRange; -@property(nonatomic, readonly) id tokenizer; -@property(nonatomic, readonly, getter = isKeyboardShown) BOOL isKeyboardShown; -@property(nonatomic, copy) NSNotification* keyboardShowNotification; -@property(nonatomic) UITextAutocorrectionType autocorrectionType; // default is UITextAutocorrectionTypeDefault - /** creates an initializes an CCEAGLView with a frame and 0-bit depth buffer, and a RGB565 color buffer */ + (id) viewWithFrame:(CGRect)frame; /** creates an initializes an CCEAGLView with a frame, a color buffer format, and 0-bit depth buffer */ @@ -130,7 +100,7 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. /** Initializes an CCEAGLView with a frame, a color buffer format, a depth buffer format, a sharegroup and multisampling support */ - (id) initWithFrame:(CGRect)frame pixelFormat:(NSString*)format depthFormat:(GLuint)depth preserveBackbuffer:(BOOL)retained sharegroup:(EAGLSharegroup*)sharegroup multiSampling:(BOOL)sampling numberOfSamples:(unsigned int)nSamples; -/** pixel format: it could be RGBA8 (32-bit) or RGB565 (16-bit) */ +//// * pixel format: it could be RGBA8 (32-bit) or RGB565 (16-bit) @property(nonatomic,readonly) NSString* pixelFormat; /** depth format of the render buffer: 0, 16 or 24 bits*/ @property(nonatomic,readonly) GLuint depthFormat; @@ -155,6 +125,7 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. -(void) doAnimationWhenKeyboardMoveWithDuration:(float) duration distance:(float) dis; -(void) doAnimationWhenAnotherEditBeClicked; -@end -#endif // CC_PLATFORM_IOS +- (void) showKeyboard; +- (void) hideKeyboard; +@end diff --git a/cocos/platform/ios/CCEAGLView-ios.mm b/cocos/platform/ios/CCEAGLView-ios.mm index c07666872d..9bc1d6814c 100644 --- a/cocos/platform/ios/CCEAGLView-ios.mm +++ b/cocos/platform/ios/CCEAGLView-ios.mm @@ -69,12 +69,14 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. #import "base/CCTouch.h" #import "base/CCIMEDispatcher.h" #import "renderer/backend/metal/DeviceMTL.h" +#import "platform/ios/CCInputView-ios.h" //CLASS IMPLEMENTATIONS: #define IOS_MAX_TOUCHES_COUNT 10 -@interface CCEAGLView (Private) +@interface CCEAGLView () +@property (nonatomic) UIView* textInputView; - (BOOL) setupSurfaceWithSharegroup:(EAGLSharegroup*)sharegroup; - (unsigned int) convertPixelFormat:(NSString*) pixelFormat; @end @@ -85,8 +87,7 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. @synthesize pixelFormat=pixelformat_, depthFormat=depthFormat_; @synthesize context=context_; @synthesize multiSampling=multiSampling_; -@synthesize isKeyboardShown=isKeyboardShown_; -@synthesize keyboardShowNotification = keyboardShowNotification_; + + (Class) layerClass { return [CAMetalLayer class]; @@ -126,13 +127,8 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. { if((self = [super initWithFrame:frame])) { - isUseUITextField = YES; - markedText_ = nil; + self.textInputView = [[CCInputView alloc] initWithFrame:frame]; - originalRect_ = self.frame; - self.keyboardShowNotification = nil; - self.autocorrectionType = UITextAutocorrectionTypeNo; - if ([self respondsToSelector:@selector(setContentScaleFactor:)]) { self.contentScaleFactor = [[UIScreen mainScreen] scale]; @@ -159,31 +155,12 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. if ( (self = [super initWithCoder:aDecoder]) ) { size_ = [self bounds].size; - markedText_ = nil; + self.textInputView = [[CCInputView alloc] initWithCoder:aDecoder]; } return self; } -- (void)didMoveToWindow -{ -#if !defined(CC_TARGET_OS_TVOS) - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(onUIKeyboardNotification:) - name:UIKeyboardWillShowNotification object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(onUIKeyboardNotification:) - name:UIKeyboardDidShowNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(onUIKeyboardNotification:) - name:UIKeyboardWillHideNotification object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(onUIKeyboardNotification:) - name:UIKeyboardDidHideNotification object:nil]; -#endif -} -(int) getWidth { @@ -200,7 +177,7 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; // remove keyboard notification - self.keyboardShowNotification = nullptr; // implicit release + [self.textInputView release]; [super dealloc]; } @@ -250,34 +227,10 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. return ret; } - --(void) handleTouchesAfterKeyboardShow -{ - NSArray *subviews = self.subviews; - - for(UIView* view in subviews) - { - if([view isKindOfClass:NSClassFromString(@"UITextView")] || - [view isKindOfClass:NSClassFromString(@"UITextField")]) - { - if ([view isFirstResponder]) - { - [view resignFirstResponder]; - return; - } - } - } -} - // Pass the touches to the superview #pragma mark CCEAGLView - Touch Delegate - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event -{ - if (isKeyboardShown_) - { - [self handleTouchesAfterKeyboardShow]; - } - +{ UITouch* ids[IOS_MAX_TOUCHES_COUNT] = {0}; float xs[IOS_MAX_TOUCHES_COUNT] = {0.0f}; float ys[IOS_MAX_TOUCHES_COUNT] = {0.0f}; @@ -377,438 +330,25 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. glview->handleTouchesCancel(i, (intptr_t*)ids, xs, ys); } -#pragma mark - UIView - Responder - -- (BOOL)canBecomeFirstResponder +- (void) showKeyboard { - if (nil != markedText_) { - [markedText_ release]; - } - markedText_ = nil; - if (isUseUITextField) - { - return NO; - } - return YES; + [self addSubview:self.textInputView]; + [self.textInputView becomeFirstResponder]; } -- (BOOL)becomeFirstResponder +- (void) hideKeyboard { - isUseUITextField = NO; - return [super becomeFirstResponder]; + [self.textInputView resignFirstResponder]; + [self.textInputView removeFromSuperview]; } -- (BOOL)resignFirstResponder +-(void) doAnimationWhenKeyboardMoveWithDuration:(float) duration distance:(float) dis { - isUseUITextField = YES; - return [super resignFirstResponder]; -} - -#pragma mark - UIKeyInput protocol - - -- (BOOL)hasText -{ - return NO; -} - -- (void)insertText:(NSString *)text -{ - if (nil != markedText_) { - [markedText_ release]; - markedText_ = nil; - } - const char * pszText = [text cStringUsingEncoding:NSUTF8StringEncoding]; - cocos2d::IMEDispatcher::sharedDispatcher()->dispatchInsertText(pszText, strlen(pszText)); -} - -- (void)deleteBackward -{ - if (nil != markedText_) { - [markedText_ release]; - markedText_ = nil; - } - cocos2d::IMEDispatcher::sharedDispatcher()->dispatchDeleteBackward(); -} - -#pragma mark - UITextInputTrait protocol - --(UITextAutocapitalizationType) autocapitalizationType -{ - return UITextAutocapitalizationTypeNone; -} - -#pragma mark - UITextInput protocol - -#pragma mark UITextInput - properties - -@synthesize beginningOfDocument; -@synthesize endOfDocument; -@synthesize inputDelegate; -@synthesize markedTextRange; -@synthesize markedTextStyle; -// @synthesize selectedTextRange; // must implement -@synthesize tokenizer; -@synthesize autocorrectionType; - -/* Text may have a selection, either zero-length (a caret) or ranged. Editing operations are - * always performed on the text from this selection. nil corresponds to no selection. */ -- (void)setSelectedTextRange:(UITextRange *)aSelectedTextRange -{ - CCLOG("UITextRange:setSelectedTextRange"); -} -- (UITextRange *)selectedTextRange -{ - return [[[UITextRange alloc] init] autorelease]; -} - -#pragma mark UITextInput - Replacing and Returning Text - -- (NSString *)textInRange:(UITextRange *)range -{ - CCLOG("textInRange"); - return @""; -} -- (void)replaceRange:(UITextRange *)range withText:(NSString *)theText -{ - CCLOG("replaceRange"); -} - -#pragma mark UITextInput - Working with Marked and Selected Text - - - -/* If text can be selected, it can be marked. Marked text represents provisionally - * inserted text that has yet to be confirmed by the user. It requires unique visual - * treatment in its display. If there is any marked text, the selection, whether a - * caret or an extended range, always resides within. - * - * Setting marked text either replaces the existing marked text or, if none is present, - * inserts it from the current selection. */ - -- (void)setMarkedTextRange:(UITextRange *)markedTextRange -{ - CCLOG("setMarkedTextRange"); -} - -- (UITextRange *)markedTextRange -{ - CCLOG("markedTextRange"); - return nil; // Nil if no marked text. -} -- (void)setMarkedTextStyle:(NSDictionary *)markedTextStyle -{ - CCLOG("setMarkedTextStyle"); } -- (NSDictionary *)markedTextStyle -{ - CCLOG("markedTextStyle"); - return nil; -} -- (void)setMarkedText:(NSString *)markedText selectedRange:(NSRange)selectedRange -{ - CCLOG("setMarkedText"); - if (markedText == markedText_) { - return; - } - if (nil != markedText_) { - [markedText_ release]; - } - markedText_ = markedText; - [markedText_ retain]; -} -- (void)unmarkText -{ - CCLOG("unmarkText"); - if (nil == markedText_) - { - return; - } - const char * pszText = [markedText_ cStringUsingEncoding:NSUTF8StringEncoding]; - cocos2d::IMEDispatcher::sharedDispatcher()->dispatchInsertText(pszText, strlen(pszText)); - [markedText_ release]; - markedText_ = nil; -} - -#pragma mark Methods for creating ranges and positions. - -- (UITextRange *)textRangeFromPosition:(UITextPosition *)fromPosition toPosition:(UITextPosition *)toPosition -{ - CCLOG("textRangeFromPosition"); - return nil; -} -- (UITextPosition *)positionFromPosition:(UITextPosition *)position offset:(NSInteger)offset -{ - CCLOG("positionFromPosition"); - return nil; -} -- (UITextPosition *)positionFromPosition:(UITextPosition *)position inDirection:(UITextLayoutDirection)direction offset:(NSInteger)offset -{ - CCLOG("positionFromPosition"); - return nil; -} - -/* Simple evaluation of positions */ -- (NSComparisonResult)comparePosition:(UITextPosition *)position toPosition:(UITextPosition *)other -{ - CCLOG("comparePosition"); - return (NSComparisonResult)0; -} -- (NSInteger)offsetFromPosition:(UITextPosition *)from toPosition:(UITextPosition *)toPosition -{ - CCLOG("offsetFromPosition"); - return 0; -} - -- (UITextPosition *)positionWithinRange:(UITextRange *)range farthestInDirection:(UITextLayoutDirection)direction -{ - CCLOG("positionWithinRange"); - return nil; -} -- (UITextRange *)characterRangeByExtendingPosition:(UITextPosition *)position inDirection:(UITextLayoutDirection)direction -{ - CCLOG("characterRangeByExtendingPosition"); - return nil; -} - -#pragma mark Writing direction - -- (UITextWritingDirection)baseWritingDirectionForPosition:(UITextPosition *)position inDirection:(UITextStorageDirection)direction -{ - CCLOG("baseWritingDirectionForPosition"); - return UITextWritingDirectionNatural; -} -- (void)setBaseWritingDirection:(UITextWritingDirection)writingDirection forRange:(UITextRange *)range -{ - CCLOG("setBaseWritingDirection"); -} - -#pragma mark Geometry - -/* Geometry used to provide, for example, a correction rect. */ -- (CGRect)firstRectForRange:(UITextRange *)range -{ - CCLOG("firstRectForRange"); - return CGRectNull; -} -- (CGRect)caretRectForPosition:(UITextPosition *)position -{ - CCLOG("caretRectForPosition"); - return caretRect_; -} - -#pragma mark Hit testing - -/* JS - Find the closest position to a given point */ -- (UITextPosition *)closestPositionToPoint:(CGPoint)point -{ - CCLOG("closestPositionToPoint"); - return nil; -} -- (UITextPosition *)closestPositionToPoint:(CGPoint)point withinRange:(UITextRange *)range -{ - CCLOG("closestPositionToPoint"); - return nil; -} -- (UITextRange *)characterRangeAtPoint:(CGPoint)point -{ - CCLOG("characterRangeAtPoint"); - return nil; -} - -- (NSArray *)selectionRectsForRange:(UITextRange *)range -{ - CCLOG("selectionRectsForRange"); - return nil; -} - -#pragma mark - UIKeyboard notification - -#if !defined(CC_TARGET_OS_TVOS) -- (void)onUIKeyboardNotification:(NSNotification *)notif -{ - NSString * type = notif.name; - - NSDictionary* info = [notif userInfo]; - CGRect begin = [self convertRect: - [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] - fromView:self]; - CGRect end = [self convertRect: - [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] - fromView:self]; - double aniDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - - CGSize viewSize = self.frame.size; - - CGFloat tmp; - switch (getFixedOrientation([[UIApplication sharedApplication] statusBarOrientation])) - { - case UIInterfaceOrientationPortrait: - begin.origin.y = viewSize.height - begin.origin.y - begin.size.height; - end.origin.y = viewSize.height - end.origin.y - end.size.height; - break; - - case UIInterfaceOrientationPortraitUpsideDown: - begin.origin.x = viewSize.width - (begin.origin.x + begin.size.width); - end.origin.x = viewSize.width - (end.origin.x + end.size.width); - break; - - case UIInterfaceOrientationLandscapeLeft: - std::swap(begin.size.width, begin.size.height); - std::swap(end.size.width, end.size.height); - std::swap(viewSize.width, viewSize.height); - - tmp = begin.origin.x; - begin.origin.x = begin.origin.y; - begin.origin.y = viewSize.height - tmp - begin.size.height; - tmp = end.origin.x; - end.origin.x = end.origin.y; - end.origin.y = viewSize.height - tmp - end.size.height; - break; - - case UIInterfaceOrientationLandscapeRight: - std::swap(begin.size.width, begin.size.height); - std::swap(end.size.width, end.size.height); - std::swap(viewSize.width, viewSize.height); - - tmp = begin.origin.x; - begin.origin.x = begin.origin.y; - begin.origin.y = tmp; - tmp = end.origin.x; - end.origin.x = end.origin.y; - end.origin.y = tmp; - break; - - default: - break; - } - - auto glview = cocos2d::Director::getInstance()->getOpenGLView(); - float scaleX = glview->getScaleX(); - float scaleY = glview->getScaleY(); - - // Convert to pixel coordinate - begin = CGRectApplyAffineTransform(begin, CGAffineTransformScale(CGAffineTransformIdentity, self.contentScaleFactor, self.contentScaleFactor)); - end = CGRectApplyAffineTransform(end, CGAffineTransformScale(CGAffineTransformIdentity, self.contentScaleFactor, self.contentScaleFactor)); - - float offestY = glview->getViewPortRect().origin.y; - if (offestY < 0.0f) - { - begin.origin.y += offestY; - begin.size.height -= offestY; - end.size.height -= offestY; - } - - // Convert to design coordinate - begin = CGRectApplyAffineTransform(begin, CGAffineTransformScale(CGAffineTransformIdentity, 1.0f/scaleX, 1.0f/scaleY)); - end = CGRectApplyAffineTransform(end, CGAffineTransformScale(CGAffineTransformIdentity, 1.0f/scaleX, 1.0f/scaleY)); - - - cocos2d::IMEKeyboardNotificationInfo notiInfo; - notiInfo.begin = cocos2d::Rect(begin.origin.x, - begin.origin.y, - begin.size.width, - begin.size.height); - notiInfo.end = cocos2d::Rect(end.origin.x, - end.origin.y, - end.size.width, - end.size.height); - notiInfo.duration = (float)aniDuration; - - cocos2d::IMEDispatcher* dispatcher = cocos2d::IMEDispatcher::sharedDispatcher(); - if (UIKeyboardWillShowNotification == type) - { - self.keyboardShowNotification = notif; // implicit copy - dispatcher->dispatchKeyboardWillShow(notiInfo); - } - else if (UIKeyboardDidShowNotification == type) - { - //CGSize screenSize = self.window.screen.bounds.size; - dispatcher->dispatchKeyboardDidShow(notiInfo); - caretRect_ = end; - - int fontSize = [UIFont smallSystemFontSize]; - caretRect_.origin.y = viewSize.height - (caretRect_.origin.y + caretRect_.size.height + fontSize); - caretRect_.size.height = 0; - isKeyboardShown_ = YES; - } - else if (UIKeyboardWillHideNotification == type) - { - dispatcher->dispatchKeyboardWillHide(notiInfo); - } - else if (UIKeyboardDidHideNotification == type) - { - caretRect_ = CGRectZero; - dispatcher->dispatchKeyboardDidHide(notiInfo); - isKeyboardShown_ = NO; - } -} -#endif - -#if !defined(CC_TARGET_OS_TVOS) -UIInterfaceOrientation getFixedOrientation(UIInterfaceOrientation statusBarOrientation) -{ - if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) - { - statusBarOrientation = UIInterfaceOrientationPortrait; - } - return statusBarOrientation; -} -#endif - --(void) doAnimationWhenKeyboardMoveWithDuration:(float)duration distance:(float)dis -{ - [UIView beginAnimations:nil context:nullptr]; - [UIView setAnimationDelegate:self]; - [UIView setAnimationDuration:duration]; - [UIView setAnimationBeginsFromCurrentState:YES]; - - //NSLog(@"[animation] dis = %f, scale = %f \n", dis, cocos2d::GLView::getInstance()->getScaleY()); - - if (dis < 0.0f) dis = 0.0f; - - auto glview = cocos2d::Director::getInstance()->getOpenGLView(); - dis *= glview->getScaleY(); - - dis /= self.contentScaleFactor; - -#if defined(CC_TARGET_OS_TVOS) - self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y - dis, originalRect_.size.width, originalRect_.size.height); -#else - switch (getFixedOrientation([[UIApplication sharedApplication] statusBarOrientation])) - { - case UIInterfaceOrientationPortrait: - self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y - dis, originalRect_.size.width, originalRect_.size.height); - break; - - case UIInterfaceOrientationPortraitUpsideDown: - self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y + dis, originalRect_.size.width, originalRect_.size.height); - break; - - case UIInterfaceOrientationLandscapeLeft: - self.frame = CGRectMake(originalRect_.origin.x - dis, originalRect_.origin.y , originalRect_.size.width, originalRect_.size.height); - break; - - case UIInterfaceOrientationLandscapeRight: - self.frame = CGRectMake(originalRect_.origin.x + dis, originalRect_.origin.y , originalRect_.size.width, originalRect_.size.height); - break; - - default: - break; - } -#endif - - [UIView commitAnimations]; -} - -(void) doAnimationWhenAnotherEditBeClicked { - if (self.keyboardShowNotification != nil) - { - [[NSNotificationCenter defaultCenter]postNotification:self.keyboardShowNotification]; - } } @end diff --git a/cocos/platform/ios/CCGLViewImpl-ios.mm b/cocos/platform/ios/CCGLViewImpl-ios.mm index 476d66377a..5d5b366914 100644 --- a/cocos/platform/ios/CCGLViewImpl-ios.mm +++ b/cocos/platform/ios/CCGLViewImpl-ios.mm @@ -224,11 +224,11 @@ void GLViewImpl::setIMEKeyboardState(bool open) if (open) { - [eaglview becomeFirstResponder]; + [eaglview showKeyboard]; } else { - [eaglview resignFirstResponder]; + [eaglview hideKeyboard]; } } diff --git a/cocos/platform/ios/CCInputView-ios.h b/cocos/platform/ios/CCInputView-ios.h new file mode 100644 index 0000000000..94b69ff605 --- /dev/null +++ b/cocos/platform/ios/CCInputView-ios.h @@ -0,0 +1,4 @@ +#import + +@interface CCInputView : UIView +@end diff --git a/cocos/platform/ios/CCInputView-ios.mm b/cocos/platform/ios/CCInputView-ios.mm new file mode 100644 index 0000000000..65390b2de4 --- /dev/null +++ b/cocos/platform/ios/CCInputView-ios.mm @@ -0,0 +1,347 @@ +#import "platform/ios/CCInputView-ios.h" +#import "base/CCIMEDispatcher.h" +#import "base/CCDirector.h" + +@interface CCInputView () + +@property(nonatomic) NSString* myMarkedText; +@property(nonatomic) BOOL isKeyboardShown; + +@end + +@implementation CCInputView + +@synthesize myMarkedText; +@synthesize isKeyboardShown; + +@synthesize hasText; +@synthesize selectedTextRange; +@synthesize beginningOfDocument; +@synthesize endOfDocument; +@synthesize markedTextStyle; +@synthesize tokenizer; +@synthesize autocorrectionType; + +- (instancetype) initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame] ) { + self.myMarkedText = nil; + self.autocorrectionType = UITextAutocorrectionTypeNo; + } + + return self; +} + +- (void) dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; // remove keyboard notification + [self.myMarkedText release]; + [self removeFromSuperview]; + [super dealloc]; +} + +- (void)didMoveToWindow +{ +#if !defined(CC_TARGET_OS_TVOS) + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(onUIKeyboardNotification:) + name:UIKeyboardWillShowNotification object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(onUIKeyboardNotification:) + name:UIKeyboardDidShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(onUIKeyboardNotification:) + name:UIKeyboardWillHideNotification object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(onUIKeyboardNotification:) + name:UIKeyboardDidHideNotification object:nil]; +#endif +} + +- (BOOL) canBecomeFirstResponder { + return YES; +} + +- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event +{ + [self resignFirstResponder]; + [self removeFromSuperview]; +} + + +#pragma TextInput protocol + +- (id)inputDelegate { + return nil; +} + +- (void)setInputDelegate:(id)inputDelegate { + +} + +- (void)deleteBackward { + if (nil != self.myMarkedText) { + [self.myMarkedText release]; + self.myMarkedText = nil; + } + cocos2d::IMEDispatcher::sharedDispatcher()->dispatchDeleteBackward(); +} + +- (void)insertText:(nonnull NSString *)text { + if (nil != self.myMarkedText) { + [self.myMarkedText release]; + self.myMarkedText = nil; + } + const char * pszText = [text cStringUsingEncoding:NSUTF8StringEncoding]; + cocos2d::IMEDispatcher::sharedDispatcher()->dispatchInsertText(pszText, strlen(pszText)); +} + +- (NSWritingDirection)baseWritingDirectionForPosition:(nonnull UITextPosition *)position inDirection:(UITextStorageDirection)direction { + CCLOG("baseWritingDirectionForPosition"); + return NSWritingDirectionLeftToRight; +} + +- (CGRect)caretRectForPosition:(nonnull UITextPosition *)position { + CCLOG("caretRectForPosition"); + return CGRectZero; +} + +- (nullable UITextRange *)characterRangeAtPoint:(CGPoint)point { + CCLOG("characterRangeAtPoint"); + return nil; +} + +- (nullable UITextRange *)characterRangeByExtendingPosition:(nonnull UITextPosition *)position inDirection:(UITextLayoutDirection)direction { + CCLOG("characterRangeByExtendingPosition"); + return nil; +} + +- (nullable UITextPosition *)closestPositionToPoint:(CGPoint)point { + CCLOG("closestPositionToPoint"); + return nil; +} + +- (nullable UITextPosition *)closestPositionToPoint:(CGPoint)point withinRange:(nonnull UITextRange *)range { + CCLOG("closestPositionToPoint"); + return nil; +} + +- (NSComparisonResult)comparePosition:(nonnull UITextPosition *)position toPosition:(nonnull UITextPosition *)other { + CCLOG("comparePosition"); + return (NSComparisonResult)0; +} + +- (CGRect)firstRectForRange:(nonnull UITextRange *)range { + CCLOG("firstRectForRange"); + return CGRectNull; +} + +- (NSInteger)offsetFromPosition:(nonnull UITextPosition *)from toPosition:(nonnull UITextPosition *)toPosition { + CCLOG("offsetFromPosition"); + return 0; +} + +- (nullable UITextPosition *)positionFromPosition:(nonnull UITextPosition *)position inDirection:(UITextLayoutDirection)direction offset:(NSInteger)offset { + CCLOG("positionFromPosition"); + return nil; +} + +- (nullable UITextPosition *)positionFromPosition:(nonnull UITextPosition *)position offset:(NSInteger)offset { + CCLOG("positionFromPosition"); + return nil; +} + +- (nullable UITextPosition *)positionWithinRange:(nonnull UITextRange *)range farthestInDirection:(UITextLayoutDirection)direction { + CCLOG("positionWithinRange"); + return nil; +} + +- (void)replaceRange:(nonnull UITextRange *)range withText:(nonnull NSString *)text { + +} + +- (nonnull NSArray *)selectionRectsForRange:(nonnull UITextRange *)range { + CCLOG("selectionRectsForRange"); + return nil; +} + +- (void)setBaseWritingDirection:(NSWritingDirection)writingDirection forRange:(nonnull UITextRange *)range { + +} + +- (void)setMarkedText:(nullable NSString *)markedText selectedRange:(NSRange)selectedRange { + CCLOG("setMarkedText"); + if (markedText == self.myMarkedText) { + return; + } + if (nil != self.myMarkedText) { + [self.myMarkedText release]; + } + self.myMarkedText = markedText; + [self.myMarkedText retain]; +} + +- (UITextRange *)markedTextRange +{ + CCLOG("markedTextRange"); + if (nil != self.myMarkedText) { + return [[[UITextRange alloc] init] autorelease]; + } + return nil; // Nil if no marked text. +} + +- (nullable NSString *)textInRange:(nonnull UITextRange *)range { + CCLOG("textInRange"); + if (nil != self.myMarkedText) { + return self.myMarkedText; + } + return nil; +} + +- (nullable UITextRange *)textRangeFromPosition:(nonnull UITextPosition *)fromPosition toPosition:(nonnull UITextPosition *)toPosition { + CCLOG("textRangeFromPosition"); + return nil; +} + +- (void)unmarkText { + CCLOG("unmarkText"); + if (nil == self.myMarkedText) + { + return; + } + const char * pszText = [self.myMarkedText cStringUsingEncoding:NSUTF8StringEncoding]; + cocos2d::IMEDispatcher::sharedDispatcher()->dispatchInsertText(pszText, strlen(pszText)); + [self.myMarkedText release]; + self.myMarkedText = nil; +} + +- (void)encodeWithCoder:(nonnull NSCoder *)coder { + +} + +#pragma UIKeyboard notification + +#if !defined(CC_TARGET_OS_TVOS) +namespace { + UIInterfaceOrientation getFixedOrientation(UIInterfaceOrientation statusBarOrientation) + { + if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) + { + statusBarOrientation = UIInterfaceOrientationPortrait; + } + return statusBarOrientation; + } +} +#endif + +- (void)onUIKeyboardNotification:(NSNotification *)notif +{ + NSString * type = notif.name; + + NSDictionary* info = [notif userInfo]; + CGRect begin = [self convertRect: + [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] + fromView:self]; + CGRect end = [self convertRect: + [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] + fromView:self]; + double aniDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; + + CGSize viewSize = self.frame.size; + + CGFloat tmp; + switch (getFixedOrientation([[UIApplication sharedApplication] statusBarOrientation])) + { + case UIInterfaceOrientationPortrait: + begin.origin.y = viewSize.height - begin.origin.y - begin.size.height; + end.origin.y = viewSize.height - end.origin.y - end.size.height; + break; + + case UIInterfaceOrientationPortraitUpsideDown: + begin.origin.x = viewSize.width - (begin.origin.x + begin.size.width); + end.origin.x = viewSize.width - (end.origin.x + end.size.width); + break; + + case UIInterfaceOrientationLandscapeLeft: + std::swap(begin.size.width, begin.size.height); + std::swap(end.size.width, end.size.height); + std::swap(viewSize.width, viewSize.height); + + tmp = begin.origin.x; + begin.origin.x = begin.origin.y; + begin.origin.y = viewSize.height - tmp - begin.size.height; + tmp = end.origin.x; + end.origin.x = end.origin.y; + end.origin.y = viewSize.height - tmp - end.size.height; + break; + + case UIInterfaceOrientationLandscapeRight: + std::swap(begin.size.width, begin.size.height); + std::swap(end.size.width, end.size.height); + std::swap(viewSize.width, viewSize.height); + + tmp = begin.origin.x; + begin.origin.x = begin.origin.y; + begin.origin.y = tmp; + tmp = end.origin.x; + end.origin.x = end.origin.y; + end.origin.y = tmp; + break; + + default: + break; + } + + auto glview = cocos2d::Director::getInstance()->getOpenGLView(); + float scaleX = glview->getScaleX(); + float scaleY = glview->getScaleY(); + + // Convert to pixel coordinate + begin = CGRectApplyAffineTransform(begin, CGAffineTransformScale(CGAffineTransformIdentity, self.contentScaleFactor, self.contentScaleFactor)); + end = CGRectApplyAffineTransform(end, CGAffineTransformScale(CGAffineTransformIdentity, self.contentScaleFactor, self.contentScaleFactor)); + + float offestY = glview->getViewPortRect().origin.y; + if (offestY < 0.0f) + { + begin.origin.y += offestY; + begin.size.height -= offestY; + end.size.height -= offestY; + } + + // Convert to design coordinate + begin = CGRectApplyAffineTransform(begin, CGAffineTransformScale(CGAffineTransformIdentity, 1.0f/scaleX, 1.0f/scaleY)); + end = CGRectApplyAffineTransform(end, CGAffineTransformScale(CGAffineTransformIdentity, 1.0f/scaleX, 1.0f/scaleY)); + + + cocos2d::IMEKeyboardNotificationInfo notiInfo; + notiInfo.begin = cocos2d::Rect(begin.origin.x, + begin.origin.y, + begin.size.width, + begin.size.height); + notiInfo.end = cocos2d::Rect(end.origin.x, + end.origin.y, + end.size.width, + end.size.height); + notiInfo.duration = (float)aniDuration; + + cocos2d::IMEDispatcher* dispatcher = cocos2d::IMEDispatcher::sharedDispatcher(); + if (UIKeyboardWillShowNotification == type) + { + dispatcher->dispatchKeyboardWillShow(notiInfo); + } + else if (UIKeyboardDidShowNotification == type) + { + //CGSize screenSize = self.window.screen.bounds.size; + dispatcher->dispatchKeyboardDidShow(notiInfo); + } + else if (UIKeyboardWillHideNotification == type) + { + dispatcher->dispatchKeyboardWillHide(notiInfo); + } + else if (UIKeyboardDidHideNotification == type) + { + dispatcher->dispatchKeyboardDidHide(notiInfo); + } +} + +@end From b5f1b0ecd9db301c4728f653574aa94dcabc83e6 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Thu, 24 Oct 2019 17:24:13 +0800 Subject: [PATCH 42/96] support iphone simulator (#20235) --- tools/cocos2d-console | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cocos2d-console b/tools/cocos2d-console index d437aeb253..abcbd5439c 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit d437aeb2530884f282a3194fbd4490c9be7edbe6 +Subproject commit abcbd5439c778106226906f62d8e1a7bc8bf6715 From c2c6aa4268a2ebce77e681be2beba35a8c2c127e Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 24 Oct 2019 17:25:35 +0800 Subject: [PATCH 43/96] don't compile codes for binding generator if it is a pull request (#20237) --- tools/travis-scripts/run-script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/travis-scripts/run-script.sh b/tools/travis-scripts/run-script.sh index 6bf333c665..3f0550c19c 100755 --- a/tools/travis-scripts/run-script.sh +++ b/tools/travis-scripts/run-script.sh @@ -279,7 +279,7 @@ function run_after_merge() } # build pull request -if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then +if [ "$TRAVIS_PULL_REQUEST" != "false" ] && [ x$GEN_BINDING_AND_COCOSFILE != x"true" ]; then run_pull_request fi From a2eeb25b757ec1e6fdacb7900d2f4d8a8772f560 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Thu, 24 Oct 2019 17:52:38 +0800 Subject: [PATCH 44/96] update bullet (#20239) --- external/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/config.json b/external/config.json index 4bf33c806f..fcfe4f3b1d 100644 --- a/external/config.json +++ b/external/config.json @@ -1,5 +1,5 @@ { - "version": "metal-support-18", + "version": "metal-support-19", "zip_file_size": "146254799", "repo_name": "cocos2d-x-3rd-party-libs-bin", "repo_parent": "https://github.com/cocos2d/", From 4b1cecdb12df8434bc9af71c712b7e6c542d70ce Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Thu, 24 Oct 2019 18:09:40 +0800 Subject: [PATCH 45/96] [ci skip][AUTO]: updating luabinding & cocos_file.json automatically (#20241) --- templates/cocos2dx_files.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index 8a76ee1183..2fe99f2c17 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -946,6 +946,8 @@ "cocos/platform/ios/CCGLViewImpl-ios.h", "cocos/platform/ios/CCGLViewImpl-ios.mm", "cocos/platform/ios/CCImage-ios.mm", + "cocos/platform/ios/CCInputView-ios.h", + "cocos/platform/ios/CCInputView-ios.mm", "cocos/platform/ios/CCPlatformDefine-ios.h", "cocos/platform/ios/CCStdC-ios.h", "cocos/platform/ios/OpenGL_Internal-ios.h", From d7f2ae3a9fa33fe3ad13ea6347c38e1756d9680e Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Fri, 25 Oct 2019 09:26:57 +0800 Subject: [PATCH 46/96] fix TODO (#20245) --- cocos/editor-support/cocostudio/CCArmature.cpp | 3 --- cocos/editor-support/cocostudio/CCBatchNode.cpp | 3 --- cocos/renderer/shaders/3D_positionTexture.vert | 5 ++--- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/cocos/editor-support/cocostudio/CCArmature.cpp b/cocos/editor-support/cocostudio/CCArmature.cpp index 0d7c1a5ab2..48f49bc6a9 100644 --- a/cocos/editor-support/cocostudio/CCArmature.cpp +++ b/cocos/editor-support/cocostudio/CCArmature.cpp @@ -181,9 +181,6 @@ bool Armature::init(const std::string& name) } -//TODO minggo -// setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR)); - setCascadeOpacityEnabled(true); setCascadeColorEnabled(true); diff --git a/cocos/editor-support/cocostudio/CCBatchNode.cpp b/cocos/editor-support/cocostudio/CCBatchNode.cpp index 46dc347b67..c02b7fb034 100644 --- a/cocos/editor-support/cocostudio/CCBatchNode.cpp +++ b/cocos/editor-support/cocostudio/CCBatchNode.cpp @@ -60,9 +60,6 @@ BatchNode::~BatchNode() bool BatchNode::init() { bool ret = Node::init(); - //TODO minggo -// setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR)); - return ret; } diff --git a/cocos/renderer/shaders/3D_positionTexture.vert b/cocos/renderer/shaders/3D_positionTexture.vert index 3fccd38e17..15c5fb569c 100644 --- a/cocos/renderer/shaders/3D_positionTexture.vert +++ b/cocos/renderer/shaders/3D_positionTexture.vert @@ -48,10 +48,9 @@ attribute vec4 a_blendIndex; attribute vec2 a_texCoord; -// TODO minggo: currently can not declare variable outside function. -//const int SKINNING_JOINT_COUNT = 60; +const int SKINNING_JOINT_COUNT = 60; // Uniforms -uniform vec4 u_matrixPalette[60 * 3]; +uniform vec4 u_matrixPalette[SKINNING_JOINT_COUNT * 3]; uniform mat4 u_MVPMatrix; // Varyings From 4c3d7b49a3e2a5a4208fa39ae18e0bd90fb87390 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Fri, 25 Oct 2019 09:27:32 +0800 Subject: [PATCH 47/96] remove deprecated setBlendFunc (#20244) --- .../manual/3d/lua_cocos2dx_3d_manual.cpp | 51 ---- .../manual/cocos2d/lua_cocos2dx_manual.cpp | 228 ------------------ .../spine/lua_cocos2dx_spine_manual.cpp | 61 ----- 3 files changed, 340 deletions(-) diff --git a/cocos/scripting/lua-bindings/manual/3d/lua_cocos2dx_3d_manual.cpp b/cocos/scripting/lua-bindings/manual/3d/lua_cocos2dx_3d_manual.cpp index a01569d353..b73eee4ea3 100644 --- a/cocos/scripting/lua-bindings/manual/3d/lua_cocos2dx_3d_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/3d/lua_cocos2dx_3d_manual.cpp @@ -30,56 +30,6 @@ #include "3d/CCSprite3D.h" #include "3d/CCTerrain.h" -extern int lua_cocos2dx_3d_Sprite3D_setBlendFunc(lua_State* L); - -CC_DEPRECATED_ATTRIBUTE int lua_cocos2dx_3d_Sprite3D_setBlendFunc01(lua_State* L) -{ - int argc = 0; - cocos2d::Sprite3D* cobj = nullptr; - - tolua_Error tolua_err; - - if (!tolua_isusertype(L,1,"cc.Sprite3D",0,&tolua_err)) - goto tolua_lerror; - - cobj = (cocos2d::Sprite3D*)tolua_tousertype(L,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(L,"invalid 'cobj' in function 'lua_cocos2dx_3d_Sprite3D_setBlendFunc01'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(L)-1; - if (argc != 2) - { - goto tolua_lerror; - } - else - { - CCLOG("setBlendFunc of cc.Sprite3D will deprecate two int parameter form,please pass a table like {src = xx, dst = xx} as a parameter"); - - GLenum src, dst; - if (!luaval_to_int32(L, 2, (int32_t*)&src, "cc.Sprite3D:setBlendFunc")) - return 0; - - if (!luaval_to_int32(L, 3, (int32_t*)&dst, "cc.Sprite3D:setBlendFunc")) - return 0; - -//TODO minggo -// BlendFunc blendFunc = {src, dst}; -// cobj->setBlendFunc(blendFunc); - - lua_settop(L, 1); - return 1; - } - -tolua_lerror: - return lua_cocos2dx_3d_Sprite3D_setBlendFunc(L); -} - int lua_cocos2dx_3d_Sprite3D_getAABB(lua_State* L) { int argc = 0; @@ -210,7 +160,6 @@ static void extendSprite3D(lua_State* L) lua_rawget(L, LUA_REGISTRYINDEX); if (lua_istable(L,-1)) { - tolua_function(L, "setBlendFunc", lua_cocos2dx_3d_Sprite3D_setBlendFunc01); tolua_function(L, "getAABB", lua_cocos2dx_3d_Sprite3D_getAABB); tolua_function(L, "createAsync", lua_cocos2dx_3d_Sprite3D_createAsync); } diff --git a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp index c55a5b9ea1..14e48df7c1 100644 --- a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp @@ -3658,155 +3658,6 @@ tolua_lerror: return 0; } -// setBlendFunc -template -static int tolua_cocos2dx_setBlendFunc(lua_State* tolua_S,const char* className) -{ - if (NULL == tolua_S || NULL == className || strlen(className) == 0) - return 0; - - int argc = 0; - T* self = nullptr; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; - if (!tolua_isusertype(tolua_S,1,className,0,&tolua_err)) goto tolua_lerror; -#endif - - self = static_cast(tolua_tousertype(tolua_S,1,0)); - - argc = lua_gettop(tolua_S) - 1; - if (2 == argc) - { - CCLOG("setBlendFunc of %s will deprecate two int parameter form,please pass a table like {src = xx, dst = xx} as a parameter", className); - -//TODO minggo -// GLenum src, dst; -// if (!luaval_to_int32(tolua_S, 2, (int32_t*)&src, StringUtils::format("%s%s",className, ":setBlendFunc").c_str())) -// return 0; -// -// if (!luaval_to_int32(tolua_S, 3, (int32_t*)&dst, StringUtils::format("%s%s",className, ":setBlendFunc").c_str())) -// return 0; -// -// BlendFunc blendFunc = {src, dst}; -// self->setBlendFunc(blendFunc); - return 0; - } - - - luaL_error(tolua_S, "'setBlendFunc' has wrong number of arguments: %d, was expecting %d\n", argc, 2); - return 0; - -#if COCOS2D_DEBUG >= 1 -tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'tolua_cocos2dx_setBlendFunc'.",&tolua_err); - return 0; -#endif -} -extern int lua_cocos2dx_Sprite_setBlendFunc(lua_State* tolua_S); - -CC_DEPRECATED_ATTRIBUTE static int tolua_cocos2dx_Sprite_setBlendFunc01(lua_State* tolua_S) -{ - int argc = lua_gettop(tolua_S) - 1; - if (argc == 2) - { - return tolua_cocos2dx_setBlendFunc(tolua_S,"cc.Sprite"); - } - - return lua_cocos2dx_Sprite_setBlendFunc(tolua_S); -} - -extern int lua_cocos2dx_SpriteBatchNode_setBlendFunc(lua_State* tolua_S); - -CC_DEPRECATED_ATTRIBUTE static int tolua_cocos2dx_SpriteBatchNode_setBlendFunc01(lua_State* tolua_S) -{ - int argc = lua_gettop(tolua_S) - 1; - if (argc == 2) - { - return tolua_cocos2dx_setBlendFunc(tolua_S,"cc.SpriteBatchNode"); - } - - return lua_cocos2dx_SpriteBatchNode_setBlendFunc(tolua_S); -} - -extern int lua_cocos2dx_MotionStreak_setBlendFunc(lua_State* tolua_S); - -CC_DEPRECATED_ATTRIBUTE static int tolua_cocos2dx_MotionStreak_setBlendFunc01(lua_State* tolua_S) -{ - int argc = lua_gettop(tolua_S) - 1; - if (argc == 2) - { - return tolua_cocos2dx_setBlendFunc(tolua_S,"cc.MotionStreak"); - } - - return lua_cocos2dx_MotionStreak_setBlendFunc(tolua_S); -} - -extern int lua_cocos2dx_AtlasNode_setBlendFunc(lua_State* tolua_S); - -CC_DEPRECATED_ATTRIBUTE static int tolua_cocos2dx_AtlasNode_setBlendFunc01(lua_State* tolua_S) -{ - int argc = lua_gettop(tolua_S) - 1; - if (argc == 2) - { - return tolua_cocos2dx_setBlendFunc(tolua_S,"cc.AtlasNode"); - } - - return lua_cocos2dx_AtlasNode_setBlendFunc(tolua_S); -} - -extern int lua_cocos2dx_ParticleBatchNode_setBlendFunc(lua_State* tolua_S); - -CC_DEPRECATED_ATTRIBUTE static int tolua_cocos2dx_ParticleBatchNode_setBlendFunc01(lua_State* tolua_S) -{ - int argc = lua_gettop(tolua_S) - 1; - if (argc == 2) - { - return tolua_cocos2dx_setBlendFunc(tolua_S,"cc.ParticleBatchNode"); - } - - return lua_cocos2dx_ParticleBatchNode_setBlendFunc(tolua_S); -} - -extern int lua_cocos2dx_LayerColor_setBlendFunc(lua_State* tolua_S); - -CC_DEPRECATED_ATTRIBUTE static int tolua_cocos2dx_LayerColor_setBlendFunc01(lua_State* tolua_S) -{ - int argc = lua_gettop(tolua_S) - 1; - if (argc == 2) - { - return tolua_cocos2dx_setBlendFunc(tolua_S,"cc.LayerColor"); - } - - return lua_cocos2dx_LayerColor_setBlendFunc(tolua_S); -} - -extern int lua_cocos2dx_ParticleSystem_setBlendFunc(lua_State* tolua_S); - -CC_DEPRECATED_ATTRIBUTE static int tolua_cocos2dx_ParticleSystem_setBlendFunc01(lua_State* tolua_S) -{ - int argc = lua_gettop(tolua_S) - 1; - if (argc == 2) - { - return tolua_cocos2dx_setBlendFunc(tolua_S,"cc.ParticleSystem"); - } - - return lua_cocos2dx_ParticleSystem_setBlendFunc(tolua_S); -} - -extern int lua_cocos2dx_DrawNode_setBlendFunc(lua_State* tolua_S); - -CC_DEPRECATED_ATTRIBUTE static int tolua_cocos2dx_DrawNode_setBlendFunc01(lua_State* tolua_S) -{ - int argc = lua_gettop(tolua_S) - 1; - if (argc == 2) - { - return tolua_cocos2dx_setBlendFunc(tolua_S,"cc.DrawNode"); - } - - return lua_cocos2dx_DrawNode_setBlendFunc(tolua_S); -} - static int tolua_cocos2dx_LayerMultiplex_create(lua_State* tolua_S) { if (nullptr == tolua_S) @@ -4586,10 +4437,6 @@ static void extendDrawNode(lua_State* tolua_S) lua_pushstring(tolua_S,"drawPoints"); lua_pushcfunction(tolua_S,tolua_cocos2dx_DrawNode_drawPoints); lua_rawset(tolua_S,-3); - - lua_pushstring(tolua_S,"setBlendFunc"); - lua_pushcfunction(tolua_S,tolua_cocos2dx_DrawNode_setBlendFunc01); - lua_rawset(tolua_S,-3); } lua_pop(tolua_S, 1); } @@ -4775,7 +4622,6 @@ static void extendSprite(lua_State* tolua_S) lua_rawget(tolua_S,LUA_REGISTRYINDEX); if (lua_istable(tolua_S,-1)) { - tolua_function(tolua_S, "setBlendFunc", tolua_cocos2dx_Sprite_setBlendFunc01); tolua_function(tolua_S, "initWithPolygon", lua_cocos2dx_Sprite_initWithPolygon); tolua_function(tolua_S, "setPolygonInfo", lua_cocos2dx_Sprite_setPolygonInfo); tolua_function(tolua_S, "create", lua_cocos2dx_Sprite_create); @@ -4783,19 +4629,6 @@ static void extendSprite(lua_State* tolua_S) lua_pop(tolua_S, 1); } -static void extendLayerColor(lua_State* tolua_S) -{ - lua_pushstring(tolua_S,"cc.LayerColor"); - lua_rawget(tolua_S,LUA_REGISTRYINDEX); - if (lua_istable(tolua_S,-1)) - { - lua_pushstring(tolua_S,"setBlendFunc"); - lua_pushcfunction(tolua_S,tolua_cocos2dx_LayerColor_setBlendFunc01); - lua_rawset(tolua_S,-3); - } - lua_pop(tolua_S, 1); -} - static void extendLayerMultiplex(lua_State* tolua_S) { lua_pushstring(tolua_S,"cc.LayerMultiplex"); @@ -4809,19 +4642,6 @@ static void extendLayerMultiplex(lua_State* tolua_S) lua_pop(tolua_S, 1); } -static void extendParticleSystem(lua_State* tolua_S) -{ - lua_pushstring(tolua_S,"cc.ParticleSystem"); - lua_rawget(tolua_S,LUA_REGISTRYINDEX); - if (lua_istable(tolua_S,-1)) - { - lua_pushstring(tolua_S,"setBlendFunc"); - lua_pushcfunction(tolua_S,tolua_cocos2dx_ParticleSystem_setBlendFunc01); - lua_rawset(tolua_S,-3); - } - lua_pop(tolua_S, 1); -} - static void extendFileUtils(lua_State* tolua_S) { lua_pushstring(tolua_S, "cc.FileUtils"); @@ -4861,49 +4681,6 @@ static void extendSpriteBatchNode(lua_State* tolua_S) lua_pushstring(tolua_S,"getDescendants"); lua_pushcfunction(tolua_S,tolua_cocos2dx_SpriteBatchNode_getDescendants ); lua_rawset(tolua_S,-3); - - lua_pushstring(tolua_S,"setBlendFunc"); - lua_pushcfunction(tolua_S,tolua_cocos2dx_SpriteBatchNode_setBlendFunc01); - lua_rawset(tolua_S,-3); - } - lua_pop(tolua_S, 1); -} - -static void extendMotionStreak(lua_State* tolua_S) -{ - lua_pushstring(tolua_S, "cc.MotionStreak"); - lua_rawget(tolua_S, LUA_REGISTRYINDEX); - if (lua_istable(tolua_S,-1)) - { - lua_pushstring(tolua_S,"setBlendFunc"); - lua_pushcfunction(tolua_S,tolua_cocos2dx_MotionStreak_setBlendFunc01); - lua_rawset(tolua_S,-3); - } - lua_pop(tolua_S, 1); -} - -static void extendAtlasNode(lua_State* tolua_S) -{ - lua_pushstring(tolua_S, "cc.AtlasNode"); - lua_rawget(tolua_S, LUA_REGISTRYINDEX); - if (lua_istable(tolua_S,-1)) - { - lua_pushstring(tolua_S,"setBlendFunc"); - lua_pushcfunction(tolua_S,tolua_cocos2dx_AtlasNode_setBlendFunc01); - lua_rawset(tolua_S,-3); - } - lua_pop(tolua_S, 1); -} - -static void extendParticleBatchNode(lua_State* tolua_S) -{ - lua_pushstring(tolua_S, "cc.ParticleBatchNode"); - lua_rawget(tolua_S, LUA_REGISTRYINDEX); - if (lua_istable(tolua_S,-1)) - { - lua_pushstring(tolua_S,"setBlendFunc"); - lua_pushcfunction(tolua_S,tolua_cocos2dx_ParticleBatchNode_setBlendFunc01); - lua_rawset(tolua_S,-3); } lua_pop(tolua_S, 1); } @@ -7676,9 +7453,7 @@ int register_all_cocos2dx_manual(lua_State* tolua_S) extendBezierTo(tolua_S); extendDrawNode(tolua_S); extendSprite(tolua_S); - extendLayerColor(tolua_S); extendLayerMultiplex(tolua_S); - extendParticleSystem(tolua_S); extendFileUtils(tolua_S); extendUserDefault(tolua_S); extendTexture2D(tolua_S); @@ -7694,9 +7469,6 @@ int register_all_cocos2dx_manual(lua_State* tolua_S) extendPipelineDescriptor(tolua_S); extendProgramState(tolua_S); - extendMotionStreak(tolua_S); - extendAtlasNode(tolua_S); - extendParticleBatchNode(tolua_S); extendLabel(tolua_S); extendTMXTiledMap(tolua_S); extendConsole(tolua_S); diff --git a/cocos/scripting/lua-bindings/manual/spine/lua_cocos2dx_spine_manual.cpp b/cocos/scripting/lua-bindings/manual/spine/lua_cocos2dx_spine_manual.cpp index c059dd4279..2deee55119 100644 --- a/cocos/scripting/lua-bindings/manual/spine/lua_cocos2dx_spine_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/spine/lua_cocos2dx_spine_manual.cpp @@ -36,53 +36,6 @@ using namespace spine; -// setBlendFunc -template -static int tolua_cocos2dx_setBlendFunc(lua_State* tolua_S,const char* className) -{ - if (NULL == tolua_S || NULL == className || strlen(className) == 0) - return 0; - - int argc = 0; - T* self = nullptr; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; - if (!tolua_isusertype(tolua_S,1,className,0,&tolua_err)) goto tolua_lerror; -#endif - - self = static_cast(tolua_tousertype(tolua_S,1,0)); - - argc = lua_gettop(tolua_S) - 1; - if (2 == argc) - { - CCLOG("setBlendFunc of %s will deprecate two int parameter form,please pass a table like {src = xx, dst = xx} as a parameter", className); - - GLenum src, dst; - if (!luaval_to_int32(tolua_S, 2, (int32_t*)&src, StringUtils::format("%s%s",className,":setBlendFunc").c_str())) - return 0; - - if (!luaval_to_int32(tolua_S, 3, (int32_t*)&dst,StringUtils::format("%s%s",className,":setBlendFunc").c_str())) - return 0; - -//TODO minggo -// BlendFunc blendFunc = {src, dst}; -// self->setBlendFunc(blendFunc); - return 0; - } - - - luaL_error(tolua_S, "'setBlendFunc' has wrong number of arguments: %d, was expecting %d\n", argc, 2); - return 0; - -#if COCOS2D_DEBUG >= 1 -tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'setBlendFunc'.",&tolua_err); - return 0; -#endif -} - - static int lua_cocos2dx_CCSkeletonAnimation_createWithFile(lua_State* L) { if (nullptr == L) @@ -357,19 +310,6 @@ tolua_lerror: #endif } -extern int lua_cocos2dx_spine_SkeletonRenderer_setBlendFunc(lua_State* tolua_S); - -CC_DEPRECATED_ATTRIBUTE static int tolua_spine_SkeletoneAnimation_setBlendFunc(lua_State* tolua_S) -{ - int argc = lua_gettop(tolua_S) - 1; - if (argc == 2) - { - return tolua_cocos2dx_setBlendFunc(tolua_S,"sp.SkeletonAnimation"); - } - - return lua_cocos2dx_spine_SkeletonRenderer_setBlendFunc(tolua_S); -} - static int lua_cocos2dx_spine_SkeletonAnimation_addAnimation(lua_State* tolua_S) { int argc = 0; @@ -512,7 +452,6 @@ static void extendCCSkeletonAnimation(lua_State* L) tolua_function(L, "create", lua_cocos2dx_CCSkeletonAnimation_createWithFile); tolua_function(L, "registerSpineEventHandler", tolua_Cocos2d_CCSkeletonAnimation_registerSpineEventHandler00); tolua_function(L, "unregisterSpineEventHandler", tolua_Cocos2d_CCSkeletonAnimation_unregisterSpineEventHandler00); - tolua_function(L, "setBlendFunc", tolua_spine_SkeletoneAnimation_setBlendFunc); tolua_function(L, "addAnimation", lua_cocos2dx_spine_SkeletonAnimation_addAnimation); tolua_function(L, "setAnimation", lua_cocos2dx_spine_SkeletonAnimation_setAnimation); } From be038d9ffcc9fa2b3f51d41dd9b9ab25606b1d6f Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 25 Oct 2019 09:27:54 +0800 Subject: [PATCH 48/96] fix some warnings (#20236) --- cocos/2d/CCFastTMXLayer.cpp | 1 - cocos/platform/ios/CCApplication-ios.mm | 2 +- cocos/ui/UIEditBox/iOS/CCUIEditBoxIOS.h | 28 ++++----- cocos/ui/UIWebView/UIWebView-inl.h | 6 +- cocos/ui/UIWebView/UIWebView.h | 13 ++-- .../Classes/Box2DTestBed/GLES-Render.h | 4 +- .../Classes/Camera3DTest/Camera3DTest.cpp | 12 +--- .../Classes/Camera3DTest/Camera3DTest.h | 2 +- .../RenderTextureTest/RenderTextureTest.h | 4 -- .../Classes/SchedulerTest/SchedulerTest.cpp | 7 +-- .../Classes/SchedulerTest/SchedulerTest.h | 8 +-- .../UIButtonTest/UIButtonTest.cpp | 2 +- .../UIListViewTest/UIListViewTest.cpp | 19 +----- .../UIListViewTest/UIListViewTest.h | 60 ++++++++++--------- .../UIVideoPlayerTest/UIVideoPlayerTest.h | 4 -- tests/cpp-tests/Classes/UnitTest/UnitTest.cpp | 4 +- .../Classes/VibrateTest/VibrateTest.cpp | 6 +- .../Classes/VibrateTest/VibrateTest.h | 7 +-- .../proj.ios/Classes/testsAppDelegate.mm | 2 +- 19 files changed, 74 insertions(+), 117 deletions(-) diff --git a/cocos/2d/CCFastTMXLayer.cpp b/cocos/2d/CCFastTMXLayer.cpp index d0671044a5..02f5339cd3 100644 --- a/cocos/2d/CCFastTMXLayer.cpp +++ b/cocos/2d/CCFastTMXLayer.cpp @@ -240,7 +240,6 @@ void FastTMXLayer::updateTiles(const Rect& culledRect) iter->second++; unsigned short quadIndex = static_cast(_tileToQuadIndex[tileIndex]); - CC_ASSERT(-1 != quadIndex); _indices[6 * offset + 0] = quadIndex * 4 + 0; _indices[6 * offset + 1] = quadIndex * 4 + 1; _indices[6 * offset + 2] = quadIndex * 4 + 2; diff --git a/cocos/platform/ios/CCApplication-ios.mm b/cocos/platform/ios/CCApplication-ios.mm index 47b74c5e5e..c4360ee05b 100644 --- a/cocos/platform/ios/CCApplication-ios.mm +++ b/cocos/platform/ios/CCApplication-ios.mm @@ -106,7 +106,7 @@ LanguageType Application::getCurrentLanguage() Application::Platform Application::getTargetPlatform() { - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) // idiom for iOS <= 3.2, otherwise: [UIDevice userInterfaceIdiom] is faster. + if ([UIDevice.currentDevice userInterfaceIdiom] == UIUserInterfaceIdiomPad) // idiom for iOS <= 3.2, otherwise: [UIDevice userInterfaceIdiom] is faster. { return Platform::OS_IPAD; } diff --git a/cocos/ui/UIEditBox/iOS/CCUIEditBoxIOS.h b/cocos/ui/UIEditBox/iOS/CCUIEditBoxIOS.h index 3befee2994..7b69afa2fb 100644 --- a/cocos/ui/UIEditBox/iOS/CCUIEditBoxIOS.h +++ b/cocos/ui/UIEditBox/iOS/CCUIEditBoxIOS.h @@ -43,25 +43,25 @@ @property (nonatomic, readwrite) BOOL returnPressed; - (instancetype)initWithFrame:(CGRect)frameRect editBox:(void *)editBox; -- ()doAnimationWhenKeyboardMoveWithDuration:(float)duration distance:(float)distance; +- (void)doAnimationWhenKeyboardMoveWithDuration:(float)duration distance:(float)distance; - (NSString *)getDefaultFontName; - (cocos2d::ui::EditBoxDelegate::EditBoxEndAction)getEndAction; -- ()setInputMode:(cocos2d::ui::EditBox::InputMode)inputMode; -- ()setInputFlag:(cocos2d::ui::EditBox::InputFlag)flag; -- ()setReturnType:(cocos2d::ui::EditBox::KeyboardReturnType)returnType; -- ()setTextHorizontalAlignment:(cocos2d::TextHAlignment)alignment; +- (void)setInputMode:(cocos2d::ui::EditBox::InputMode)inputMode; +- (void)setInputFlag:(cocos2d::ui::EditBox::InputFlag)flag; +- (void)setReturnType:(cocos2d::ui::EditBox::KeyboardReturnType)returnType; +- (void)setTextHorizontalAlignment:(cocos2d::TextHAlignment)alignment; -- ()setPlaceHolder:(NSString *)text; -- ()setPlaceholderFont:(UIFont *)font; -- ()setPlaceholderTextColor:(UIColor *)color; -- ()setVisible:(BOOL)visible; -- ()setTextColor:(UIColor*)color; -- ()setFont:(UIFont *)font; -- ()updateFrame:(CGRect)rect; +- (void)setPlaceHolder:(NSString *)text; +- (void)setPlaceholderFont:(UIFont *)font; +- (void)setPlaceholderTextColor:(UIColor *)color; +- (void)setVisible:(BOOL)visible; +- (void)setTextColor:(UIColor*)color; +- (void)setFont:(UIFont *)font; +- (void)updateFrame:(CGRect)rect; -- ()openKeyboard; -- ()closeKeyboard; +- (void)openKeyboard; +- (void)closeKeyboard; @end diff --git a/cocos/ui/UIWebView/UIWebView-inl.h b/cocos/ui/UIWebView/UIWebView-inl.h index f60768a41e..e635ca75b3 100644 --- a/cocos/ui/UIWebView/UIWebView-inl.h +++ b/cocos/ui/UIWebView/UIWebView-inl.h @@ -34,11 +34,7 @@ NS_CC_BEGIN namespace ui{ WebView::WebView() - : _impl(new WebViewImpl(this)), - _onJSCallback(nullptr), - _onShouldStartLoading(nullptr), - _onDidFinishLoading(nullptr), - _onDidFailLoading(nullptr) + : _impl(new WebViewImpl(this)) { } diff --git a/cocos/ui/UIWebView/UIWebView.h b/cocos/ui/UIWebView/UIWebView.h index 156e4bc41b..1d97be01af 100644 --- a/cocos/ui/UIWebView/UIWebView.h +++ b/cocos/ui/UIWebView/UIWebView.h @@ -229,13 +229,10 @@ protected: virtual cocos2d::ui::Widget* createCloneInstance() override; virtual void copySpecialProperties(Widget* model) override; - std::function _onShouldStartLoading; - - ccWebViewCallback _onDidFinishLoading; - - ccWebViewCallback _onDidFailLoading; - - ccWebViewCallback _onJSCallback; + std::function _onShouldStartLoading = nullptr; + ccWebViewCallback _onDidFinishLoading = nullptr; + ccWebViewCallback _onDidFailLoading = nullptr; + ccWebViewCallback _onJSCallback = nullptr; CC_CONSTRUCTOR_ACCESS: /** @@ -249,7 +246,7 @@ CC_CONSTRUCTOR_ACCESS: virtual ~WebView(); private: - WebViewImpl *_impl; + WebViewImpl *_impl = nullptr; friend class WebViewImpl; }; diff --git a/tests/cpp-tests/Classes/Box2DTestBed/GLES-Render.h b/tests/cpp-tests/Classes/Box2DTestBed/GLES-Render.h index a679946004..43a896c34b 100644 --- a/tests/cpp-tests/Classes/Box2DTestBed/GLES-Render.h +++ b/tests/cpp-tests/Classes/Box2DTestBed/GLES-Render.h @@ -31,9 +31,7 @@ struct b2AABB; class GLESDebugDraw : public b2Draw { float32 mRatio; - int mColorLocation; - - void initShader( void ); + void initShader(); public: GLESDebugDraw(); diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp index 394dfc0455..e9961f616e 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp @@ -128,7 +128,7 @@ CameraRotationTest::CameraRotationTest() //Listener _lis = EventListenerTouchOneByOne::create(); - _lis->onTouchBegan = [this](Touch* t, Event* e) { + _lis->onTouchBegan = [](Touch* t, Event* e) { return true; }; @@ -411,11 +411,6 @@ void Camera3DTestDemo::addNewSpriteWithCoords(Vec3 p,std::string fileName,bool p } void Camera3DTestDemo::onTouchesBegan(const std::vector& touches, cocos2d::Event *event) { - for ( auto &item: touches ) - { - auto touch = item; - auto location = touch->getLocation(); - } } void Camera3DTestDemo::onTouchesMoved(const std::vector& touches, cocos2d::Event *event) { @@ -1214,11 +1209,6 @@ void CameraArcBallDemo::update(float dt) // FogTestDemo FogTestDemo::FogTestDemo() : CameraBaseTest() -, _layer3D(nullptr) -, _cameraType(CameraType::Free) -, _camera(nullptr) -, _programState1(nullptr) -, _programState2(nullptr) { } FogTestDemo::~FogTestDemo() diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h index 94d45afd0a..75b4e244db 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h @@ -246,7 +246,7 @@ public: void switchTypeCallback(cocos2d::Ref* sender,int type); protected: - CameraType _cameraType; + CameraType _cameraType = CameraType::Free; cocos2d::Layer* _layer3D = nullptr; cocos2d::Camera* _camera = nullptr; cocos2d::Sprite3D* _sprite3D1 = nullptr; diff --git a/tests/cpp-tests/Classes/RenderTextureTest/RenderTextureTest.h b/tests/cpp-tests/Classes/RenderTextureTest/RenderTextureTest.h index ebd8904605..680b06d834 100644 --- a/tests/cpp-tests/Classes/RenderTextureTest/RenderTextureTest.h +++ b/tests/cpp-tests/Classes/RenderTextureTest/RenderTextureTest.h @@ -176,10 +176,6 @@ public: Issue16113Test(); virtual std::string title() const override; virtual std::string subtitle() const override; - -private: - cocos2d::RenderTexture* _rend; - cocos2d::Sprite* _spriteDraw; }; class RenderTextureWithSprite3DIssue16894 : public RenderTextureTest diff --git a/tests/cpp-tests/Classes/SchedulerTest/SchedulerTest.cpp b/tests/cpp-tests/Classes/SchedulerTest/SchedulerTest.cpp index d3d812dec2..ea6128ca6c 100644 --- a/tests/cpp-tests/Classes/SchedulerTest/SchedulerTest.cpp +++ b/tests/cpp-tests/Classes/SchedulerTest/SchedulerTest.cpp @@ -1091,7 +1091,7 @@ void SchedulerIssueWithReschedule::onEnter() _scheduler->schedule([this, verified](float dt){ log("SchedulerIssueWithReschedule - first timer"); - _scheduler->schedule([this, verified](float dt){ + _scheduler->schedule([verified](float dt){ log("SchedulerIssueWithReschedule - second timer. OK"); *verified = true; }, this, 0.1f, 0, 0, false, "test_timer"); @@ -1422,10 +1422,9 @@ void SchedulerRemoveEntryWhileUpdate::onExit() } SchedulerRemoveEntryWhileUpdate::TestClass::TestClass(int index, TestClass *nextObj, cocos2d::Scheduler* scheduler) -: _index(index) -, _nextObj(nextObj) +: _nextObj(nextObj) +, _index(index) , _scheduler(scheduler) -, _cleanedUp(false) { } diff --git a/tests/cpp-tests/Classes/SchedulerTest/SchedulerTest.h b/tests/cpp-tests/Classes/SchedulerTest/SchedulerTest.h index 34ccb9d408..4156e2e3b6 100644 --- a/tests/cpp-tests/Classes/SchedulerTest/SchedulerTest.h +++ b/tests/cpp-tests/Classes/SchedulerTest/SchedulerTest.h @@ -431,10 +431,10 @@ private: TestClass(int index, TestClass *nextObj, cocos2d::Scheduler* scheduler); void update(float dt); private: - TestClass *_nextObj; - int _index; - cocos2d::Scheduler *_scheduler; - bool _cleanedUp; + TestClass *_nextObj = nullptr; + int _index = 0; + cocos2d::Scheduler *_scheduler = nullptr; + bool _cleanedUp = false; }; std::vector _testvector; }; diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp index eadac80d4f..66c6a762ff 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp @@ -787,7 +787,7 @@ bool UIButtonTextOnly::init() button->getContentSize().height); button->setZoomScale(0.3f); button->setPressedActionEnabled(true); - button->addClickEventListener([this](Ref* sender) { + button->addClickEventListener([](Ref* sender) { CCLOG("clicked!"); }); _uiLayer->addChild(button); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp index 8d14453708..02ea37b7ef 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.cpp @@ -46,16 +46,7 @@ UIListViewTests::UIListViewTests() // UIListViewTest_Vertical UIListViewTest_Vertical::UIListViewTest_Vertical() -: _displayValueLabel(nullptr), -_spawnCount(5), //spawnCount should > listview.width / templateWidth + 2 -_totalCount(50), -_bufferZone(45), //bufferZone should be larger than List item width -_updateTimer(0), -_updateInterval(1.0f / 24), // you could tweak this value to adjust ListView data update rate -_lastContentPosY(0), //use this value to detect if we are scrolling left or right -_itemTemplateHeight(0) { - } UIListViewTest_Vertical::~UIListViewTest_Vertical() @@ -303,14 +294,6 @@ void UIListViewTest_Vertical::selectedItemEventScrollView(Ref* pSender, ui::Scro // UIListViewTest_Horizontal UIListViewTest_Horizontal::UIListViewTest_Horizontal() -: _displayValueLabel(nullptr), -_spawnCount(4), //spawnCount should > listview.width / templateWidth + 2 -_totalCount(50), -_bufferZone(140), //bufferZone should be larger than List item width -_updateTimer(0), -_updateInterval(1.0f / 24), // you could tweak this value to adjust ListView data update rate -_lastContentPosX(0), //use this value to detect if we are scrolling left or right -_itemTemplateWidth(0) { } @@ -835,7 +818,7 @@ bool UIListViewTest_Magnetic::init() pButton->setTitleText("Next Magnetic"); pButton->addClickEventListener([this](Ref*) { ListView::MagneticType eCurrentType = _listView->getMagneticType(); - ListView::MagneticType eNextType; + ListView::MagneticType eNextType = ListView::MagneticType::NONE; std::string sString; if(eCurrentType == ListView::MagneticType::NONE) { diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.h b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.h index 7e59e40ba3..179486f996 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.h +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.h @@ -48,21 +48,25 @@ protected: float getItemPositionYInView(cocos2d::ui::Widget* item) const; void updateItem(int itemID, int templateID); - cocos2d::ui::Text* _displayValueLabel; - //how many items we actually spawn, these items will be reused. - int _spawnCount; - // how many items we need for the ListView. Usually this is a big number. - int _totalCount; - //when item is away from bufferSzone, we relocate it. - float _bufferZone; - float _itemTemplateHeight; - float _updateInterval; - float _updateTimer; - float _lastContentPosY; - float _reuseItemOffset; - cocos2d::ui::ListView* _listView; + cocos2d::ui::Text* _displayValueLabel = nullptr; + // How many items we actually spawn, these items will be reused. + // Should > listview.width / templateWidth + 2. + int _spawnCount = 5; + // How many items we need for the ListView. Usually this is a big number. + int _totalCount = 50; + // when item is away from bufferSzone, we relocate it. + // Should be larger than List item width. + float _bufferZone = 45.f; + float _itemTemplateHeight = 0.f; + // Could tweak this value to adjust ListView data update rate. + float _updateInterval = (1.0f / 24); + float _updateTimer = 0.f; + // Use this value to detect if we are scrolling left or right + float _lastContentPosY = 0.f; + float _reuseItemOffset = 0.f; + cocos2d::ui::ListView* _listView =nullptr; std::vector _array; - cocos2d::ui::Text* _indexLabels[3]; + cocos2d::ui::Text* _indexLabels[3] = {nullptr}; }; class UIListViewTest_Horizontal : public UIScene @@ -80,19 +84,21 @@ protected: float getItemPositionXInView(cocos2d::ui::Widget* item) const; void updateItem(int itemID, int templateID); - cocos2d::ui::Text* _displayValueLabel; - //how many items we actually spawn, these items will be reused. - int _spawnCount; - // how many items we need for the ListView. Usually this is a big number. - int _totalCount; - //when item is away from bufferSzone, we relocate it. - float _bufferZone; - float _itemTemplateWidth; - float _updateInterval; - float _updateTimer; - float _lastContentPosX; - float _reuseItemOffset; - cocos2d::ui::ListView* _listView; + cocos2d::ui::Text* _displayValueLabel = nullptr; + // How many items we actually spawn, these items will be reused. + // Should > listview.width / templateWidth + 2. + int _spawnCount = 4; + // How many items we need for the ListView. Usually this is a big number. + int _totalCount = 50; + // when item is away from bufferSzone, we relocate it. + float _bufferZone = 140.f; + float _itemTemplateWidth = 0.f; + // Could tweak this value to adjust ListView data update rate. + float _updateInterval = 1.0f / 24; + float _updateTimer = 0.f; + float _lastContentPosX = 0.f; + float _reuseItemOffset = 0.f; + cocos2d::ui::ListView* _listView = nullptr; std::vector _array; }; diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.h b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.h index 5f055e7655..6cdc84bc4f 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.h +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIVideoPlayerTest/UIVideoPlayerTest.h @@ -57,14 +57,10 @@ private: void createVideo(); void createSlider(); - cocos2d::MenuItemFont* _hintItem; cocos2d::ui::VideoPlayer* _videoPlayer; cocos2d::Label* _videoStateLabel; cocos2d::Label* _loopStatusLabel; cocos2d::Rect _visibleRect; - - cocos2d::Layer* _rootLayer; - }; diff --git a/tests/cpp-tests/Classes/UnitTest/UnitTest.cpp b/tests/cpp-tests/Classes/UnitTest/UnitTest.cpp index 5574dbe787..55d0ef32cc 100644 --- a/tests/cpp-tests/Classes/UnitTest/UnitTest.cpp +++ b/tests/cpp-tests/Classes/UnitTest/UnitTest.cpp @@ -143,7 +143,7 @@ void TemplateVectorTest::onEnter() // Test move constructor - auto createVector = [this](){ + auto createVector = [](){ Vector ret; for (int i = 0; i < 20; i++) @@ -372,7 +372,7 @@ void TemplateMapTest::onEnter() { UnitTestDemo::onEnter(); - auto createMap = [this](){ + auto createMap = [](){ Map ret; for (int i = 0; i < 20; ++i) { diff --git a/tests/cpp-tests/Classes/VibrateTest/VibrateTest.cpp b/tests/cpp-tests/Classes/VibrateTest/VibrateTest.cpp index 5e80ae7081..6aa3e17be3 100644 --- a/tests/cpp-tests/Classes/VibrateTest/VibrateTest.cpp +++ b/tests/cpp-tests/Classes/VibrateTest/VibrateTest.cpp @@ -72,8 +72,6 @@ namespace { private: TextButton() - : _enabled(true) - , _onTriggered(nullptr) { auto listener = EventListenerTouchOneByOne::create(); listener->setSwallowTouches(true); @@ -128,9 +126,9 @@ namespace { runAction(action); } - std::function _onTriggered; + std::function _onTriggered = nullptr; - bool _enabled; + bool _enabled = false; }; class SliderEx : public Slider diff --git a/tests/cpp-tests/Classes/VibrateTest/VibrateTest.h b/tests/cpp-tests/Classes/VibrateTest/VibrateTest.h index 1122039d80..fc05417e7f 100644 --- a/tests/cpp-tests/Classes/VibrateTest/VibrateTest.h +++ b/tests/cpp-tests/Classes/VibrateTest/VibrateTest.h @@ -51,11 +51,10 @@ public: virtual std::string title() const override; private: - float _duration; + float _duration = 0.f; - void* _durationLabel; - void* _durationSlider; - bool _updateTimeSlider; + void* _durationLabel = nullptr; + void* _durationSlider = nullptr; }; diff --git a/tests/cpp-tests/proj.ios/Classes/testsAppDelegate.mm b/tests/cpp-tests/proj.ios/Classes/testsAppDelegate.mm index e2a5ffcc5a..061027154b 100644 --- a/tests/cpp-tests/proj.ios/Classes/testsAppDelegate.mm +++ b/tests/cpp-tests/proj.ios/Classes/testsAppDelegate.mm @@ -86,7 +86,7 @@ static AppDelegate s_sharedApplication; [window makeKeyAndVisible]; #if !defined(CC_TARGET_OS_TVOS) - [[UIApplication sharedApplication] setStatusBarHidden:true]; + [viewController prefersStatusBarHidden]; #endif // IMPORTANT: Setting the GLView should be done after creating the RootViewController From b849fce8429922b252c49e3b3f3eab8e4424bd3b Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Fri, 25 Oct 2019 13:37:08 +0800 Subject: [PATCH 49/96] remove box2d tests (#20246) --- tests/cpp-tests/CMakeLists.txt | 64 --- .../cpp-tests/Classes/Box2DTest/Box2dTest.cpp | 266 ---------- tests/cpp-tests/Classes/Box2DTest/Box2dTest.h | 62 --- .../Classes/Box2DTestBed/Box2dView.cpp | 246 --------- .../Classes/Box2DTestBed/Box2dView.h | 83 --- .../Classes/Box2DTestBed/GLES-Render.cpp | 252 --------- .../Classes/Box2DTestBed/GLES-Render.h | 60 --- tests/cpp-tests/Classes/Box2DTestBed/Test.cpp | 460 ----------------- tests/cpp-tests/Classes/Box2DTestBed/Test.h | 196 ------- .../Classes/Box2DTestBed/TestEntries.cpp | 125 ----- .../Classes/Box2DTestBed/Tests/AddPair.h | 68 --- .../Classes/Box2DTestBed/Tests/ApplyForce.h | 180 ------- .../Classes/Box2DTestBed/Tests/BodyTypes.h | 159 ------ .../Classes/Box2DTestBed/Tests/Breakable.h | 155 ------ .../Classes/Box2DTestBed/Tests/Bridge.h | 125 ----- .../Classes/Box2DTestBed/Tests/BulletTest.h | 136 ----- .../Classes/Box2DTestBed/Tests/Cantilever.h | 211 -------- .../Classes/Box2DTestBed/Tests/Car.h | 286 ----------- .../Classes/Box2DTestBed/Tests/Chain.h | 74 --- .../Box2DTestBed/Tests/CharacterCollision.h | 253 --------- .../Box2DTestBed/Tests/CollisionFiltering.h | 177 ------- .../Box2DTestBed/Tests/CollisionProcessing.h | 188 ------- .../Box2DTestBed/Tests/CompoundShapes.h | 143 ------ .../Classes/Box2DTestBed/Tests/Confined.h | 167 ------ .../Box2DTestBed/Tests/ContinuousTest.h | 157 ------ .../Classes/Box2DTestBed/Tests/ConvexHull.h | 116 ----- .../Classes/Box2DTestBed/Tests/ConveyorBelt.h | 98 ---- .../Classes/Box2DTestBed/Tests/DistanceTest.h | 135 ----- .../Classes/Box2DTestBed/Tests/Dominos.h | 215 -------- .../Classes/Box2DTestBed/Tests/DumpShell.h | 175 ------- .../Box2DTestBed/Tests/DynamicTreeTest.h | 357 ------------- .../Classes/Box2DTestBed/Tests/EdgeShapes.h | 249 --------- .../Classes/Box2DTestBed/Tests/EdgeTest.h | 109 ---- .../Classes/Box2DTestBed/Tests/Gears.h | 186 ------- .../Classes/Box2DTestBed/Tests/Mobile.h | 102 ---- .../Box2DTestBed/Tests/MobileBalanced.h | 105 ---- .../Classes/Box2DTestBed/Tests/MotorJoint.h | 114 ----- .../Box2DTestBed/Tests/OneSidedPlatform.h | 132 ----- .../Classes/Box2DTestBed/Tests/Pinball.h | 169 ------ .../Box2DTestBed/Tests/PolyCollision.h | 122 ----- .../Classes/Box2DTestBed/Tests/PolyShapes.h | 299 ----------- .../Classes/Box2DTestBed/Tests/Prismatic.h | 107 ---- .../Classes/Box2DTestBed/Tests/Pulleys.h | 106 ---- .../Classes/Box2DTestBed/Tests/Pyramid.h | 89 ---- .../Classes/Box2DTestBed/Tests/RayCast.h | 481 ------------------ .../Classes/Box2DTestBed/Tests/Revolute.h | 166 ------ .../Classes/Box2DTestBed/Tests/Rope.h | 101 ---- .../Classes/Box2DTestBed/Tests/RopeJoint.h | 145 ------ .../Classes/Box2DTestBed/Tests/SensorTest.h | 181 ------- .../Classes/Box2DTestBed/Tests/ShapeEditing.h | 105 ---- .../Classes/Box2DTestBed/Tests/SliderCrank.h | 156 ------ .../Classes/Box2DTestBed/Tests/SphereStack.h | 86 ---- .../Classes/Box2DTestBed/Tests/TheoJansen.h | 256 ---------- .../Classes/Box2DTestBed/Tests/Tiles.h | 156 ------ .../Classes/Box2DTestBed/Tests/TimeOfImpact.h | 127 ----- .../Classes/Box2DTestBed/Tests/Tumbler.h | 99 ---- .../Box2DTestBed/Tests/VaryingFriction.h | 124 ----- .../Box2DTestBed/Tests/VaryingRestitution.h | 69 --- .../Box2DTestBed/Tests/VerticalStack.h | 165 ------ .../Classes/Box2DTestBed/Tests/Web.h | 209 -------- tests/cpp-tests/Classes/controller.cpp | 4 - 61 files changed, 9908 deletions(-) delete mode 100644 tests/cpp-tests/Classes/Box2DTest/Box2dTest.cpp delete mode 100644 tests/cpp-tests/Classes/Box2DTest/Box2dTest.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Box2dView.cpp delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Box2dView.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/GLES-Render.cpp delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/GLES-Render.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Test.cpp delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Test.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/TestEntries.cpp delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/AddPair.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/ApplyForce.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/BodyTypes.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Breakable.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Bridge.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/BulletTest.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Cantilever.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Car.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Chain.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/CharacterCollision.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/CollisionFiltering.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/CollisionProcessing.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/CompoundShapes.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Confined.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/ContinuousTest.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/ConvexHull.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/ConveyorBelt.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/DistanceTest.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Dominos.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/DumpShell.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/DynamicTreeTest.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/EdgeShapes.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/EdgeTest.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Gears.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Mobile.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/MobileBalanced.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/MotorJoint.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/OneSidedPlatform.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Pinball.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/PolyCollision.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/PolyShapes.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Prismatic.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Pulleys.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Pyramid.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/RayCast.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Revolute.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Rope.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/RopeJoint.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/SensorTest.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/ShapeEditing.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/SliderCrank.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/SphereStack.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/TheoJansen.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Tiles.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/TimeOfImpact.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Tumbler.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/VaryingFriction.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/VaryingRestitution.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/VerticalStack.h delete mode 100644 tests/cpp-tests/Classes/Box2DTestBed/Tests/Web.h diff --git a/tests/cpp-tests/CMakeLists.txt b/tests/cpp-tests/CMakeLists.txt index 409ee6b117..28e33d2db9 100644 --- a/tests/cpp-tests/CMakeLists.txt +++ b/tests/cpp-tests/CMakeLists.txt @@ -351,70 +351,6 @@ if(WINDOWS OR MACOSX OR LINUX) ) endif() -list(APPEND GAME_HEADER - Classes/Box2DTest/Box2dTest.cpp - Classes/Box2DTestBed/Test.h - Classes/Box2DTestBed/Tests/Chain.h - Classes/Box2DTestBed/Tests/Confined.h - Classes/Box2DTestBed/Tests/PolyCollision.h - Classes/Box2DTestBed/Tests/EdgeTest.h - Classes/Box2DTestBed/Tests/ApplyForce.h - Classes/Box2DTestBed/Tests/Gears.h - Classes/Box2DTestBed/Tests/SliderCrank.h - Classes/Box2DTestBed/Tests/ContinuousTest.h - Classes/Box2DTestBed/Tests/Revolute.h - Classes/Box2DTestBed/Tests/TheoJansen.h - Classes/Box2DTestBed/Tests/Bridge.h - Classes/Box2DTestBed/Tests/CollisionProcessing.h - Classes/Box2DTestBed/Tests/DistanceTest.h - Classes/Box2DTestBed/Tests/PolyShapes.h - Classes/Box2DTestBed/Tests/TimeOfImpact.h - Classes/Box2DTestBed/Tests/ConveyorBelt.h - Classes/Box2DTestBed/Tests/Tiles.h - Classes/Box2DTestBed/Tests/BulletTest.h - Classes/Box2DTestBed/Tests/MotorJoint.h - Classes/Box2DTestBed/Tests/Car.h - Classes/Box2DTestBed/Tests/Mobile.h - Classes/Box2DTestBed/Tests/VaryingFriction.h - Classes/Box2DTestBed/Tests/Rope.h - Classes/Box2DTestBed/Tests/SensorTest.h - Classes/Box2DTestBed/Tests/Pyramid.h - Classes/Box2DTestBed/Tests/VaryingRestitution.h - Classes/Box2DTestBed/Tests/RopeJoint.h - Classes/Box2DTestBed/Tests/VerticalStack.h - Classes/Box2DTestBed/Tests/MobileBalanced.h - Classes/Box2DTestBed/Tests/CompoundShapes.h - Classes/Box2DTestBed/Tests/CollisionFiltering.h - Classes/Box2DTestBed/Tests/Pulleys.h - Classes/Box2DTestBed/Tests/Breakable.h - Classes/Box2DTestBed/Tests/BodyTypes.h - Classes/Box2DTestBed/Tests/DumpShell.h - Classes/Box2DTestBed/Tests/ShapeEditing.h - Classes/Box2DTestBed/Tests/SphereStack.h - Classes/Box2DTestBed/Tests/OneSidedPlatform.h - Classes/Box2DTestBed/Tests/AddPair.h - Classes/Box2DTestBed/Tests/Pinball.h - Classes/Box2DTestBed/Tests/Tumbler.h - Classes/Box2DTestBed/Tests/RayCast.h - Classes/Box2DTestBed/Tests/ConvexHull.h - Classes/Box2DTestBed/Tests/EdgeShapes.h - Classes/Box2DTestBed/Tests/Prismatic.h - Classes/Box2DTestBed/Tests/Dominos.h - Classes/Box2DTestBed/Tests/Web.h - Classes/Box2DTestBed/Tests/CharacterCollision.h - Classes/Box2DTestBed/Tests/DynamicTreeTest.h - Classes/Box2DTestBed/Tests/Cantilever.h - Classes/Box2DTestBed/Box2dView.h - Classes/Box2DTestBed/GLES-Render.h - ) -list(APPEND GAME_SOURCE - Classes/Box2DTest/Box2dTest.cpp - Classes/Box2DTestBed/Box2dView.cpp - Classes/Box2DTestBed/GLES-Render.cpp - Classes/Box2DTestBed/Test.cpp - Classes/Box2DTestBed/TestEntries.cpp - ) - list(APPEND GAME_HEADER Classes/Physics3DTest/Physics3DTest.h Classes/NavMeshTest/NavMeshTest.h diff --git a/tests/cpp-tests/Classes/Box2DTest/Box2dTest.cpp b/tests/cpp-tests/Classes/Box2DTest/Box2dTest.cpp deleted file mode 100644 index ad3de2be54..0000000000 --- a/tests/cpp-tests/Classes/Box2DTest/Box2dTest.cpp +++ /dev/null @@ -1,266 +0,0 @@ -/**************************************************************************** - Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. - - 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 "Box2dTest.h" -#include "../testResource.h" -#include "extensions/cocos-ext.h" -#include "renderer/CCRenderer.h" -#include "renderer/CCCustomCommand.h" - -USING_NS_CC; -USING_NS_CC_EXT; - -#define PTM_RATIO 32 - -enum { - kTagParentNode = 1, -}; - -Box2DTests::Box2DTests() -{ - ADD_TEST_CASE(Box2DTest); -} - -bool Box2DTest::init() -{ - if (!TestCase::init()) - { - return false; - } -#if CC_ENABLE_BOX2D_INTEGRATION - auto dispatcher = Director::getInstance()->getEventDispatcher(); - - auto touchListener = EventListenerTouchAllAtOnce::create(); - touchListener->onTouchesEnded = CC_CALLBACK_2(Box2DTest::onTouchesEnded, this); - dispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); - - // init physics - this->initPhysics(); - // create reset button - this->createResetButton(); - - //Set up sprite -#if 1 - // Use batch node. Faster - auto parent = SpriteBatchNode::create("Images/blocks.png", 100); - _spriteTexture = parent->getTexture(); -#else - // doesn't use batch node. Slower - _spriteTexture = Director::getInstance()->getTextureCache()->addImage("Images/blocks.png"); - auto parent = Node::create(); -#endif - addChild(parent, 0, kTagParentNode); - - - addNewSpriteAtPosition(VisibleRect::center()); - - auto label = Label::createWithTTF("Tap screen", "fonts/Marker Felt.ttf", 32.0f); - addChild(label, 0); - label->setColor(Color3B(0, 0, 255)); - label->setPosition(VisibleRect::center().x, VisibleRect::top().y - 50); - - scheduleUpdate(); -#else - auto label = Label::createWithTTF("Should define CC_ENABLE_BOX2D_INTEGRATION=1\n to run this test case", - "fonts/arial.ttf", - 18); - auto size = Director::getInstance()->getWinSize(); - label->setPosition(size.width / 2, size.height / 2); - - addChild(label); -#endif - - return true; -} - -#if CC_ENABLE_BOX2D_INTEGRATION -Box2DTest::Box2DTest() - : _spriteTexture(nullptr) - , world(nullptr) -{ - -} - -Box2DTest::~Box2DTest() -{ - CC_SAFE_DELETE(world); -} - -void Box2DTest::initPhysics() -{ - b2Vec2 gravity; - gravity.Set(0.0f, -10.0f); - world = new b2World(gravity); - - // Do we want to let bodies sleep? - world->SetAllowSleeping(true); - - world->SetContinuousPhysics(true); - - // Define the ground body. - b2BodyDef groundBodyDef; - groundBodyDef.position.Set(0, 0); // bottom-left corner - - // Call the body factory which allocates memory for the ground body - // from a pool and creates the ground box shape (also from a pool). - // The body is also added to the world. - b2Body* groundBody = world->CreateBody(&groundBodyDef); - - // Define the ground box shape. - b2EdgeShape groundBox; - - // bottom - groundBox.Set(b2Vec2(VisibleRect::leftBottom().x/PTM_RATIO,VisibleRect::leftBottom().y/PTM_RATIO), b2Vec2(VisibleRect::rightBottom().x/PTM_RATIO,VisibleRect::rightBottom().y/PTM_RATIO)); - groundBody->CreateFixture(&groundBox,0); - - // top - groundBox.Set(b2Vec2(VisibleRect::leftTop().x/PTM_RATIO,VisibleRect::leftTop().y/PTM_RATIO), b2Vec2(VisibleRect::rightTop().x/PTM_RATIO,VisibleRect::rightTop().y/PTM_RATIO)); - groundBody->CreateFixture(&groundBox,0); - - // left - groundBox.Set(b2Vec2(VisibleRect::leftTop().x/PTM_RATIO,VisibleRect::leftTop().y/PTM_RATIO), b2Vec2(VisibleRect::leftBottom().x/PTM_RATIO,VisibleRect::leftBottom().y/PTM_RATIO)); - groundBody->CreateFixture(&groundBox,0); - - // right - groundBox.Set(b2Vec2(VisibleRect::rightBottom().x/PTM_RATIO,VisibleRect::rightBottom().y/PTM_RATIO), b2Vec2(VisibleRect::rightTop().x/PTM_RATIO,VisibleRect::rightTop().y/PTM_RATIO)); - groundBody->CreateFixture(&groundBox,0); -} - -void Box2DTest::createResetButton() -{ - auto reset = MenuItemImage::create("Images/r1.png", "Images/r2.png", [&](Ref *sender) { - getTestSuite()->restartCurrTest(); - }); - - auto menu = Menu::create(reset, nullptr); - - menu->setPosition(VisibleRect::bottom().x, VisibleRect::bottom().y + 30); - this->addChild(menu, -1); - -} - -void Box2DTest::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) -{ - // - // IMPORTANT: - // This is only for debug purposes - // It is recommend to disable it - // - Scene::draw(renderer, transform, flags); - - GL::enableVertexAttribs( cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION ); - Director* director = Director::getInstance(); - CCASSERT(nullptr != director, "Director is null when setting matrix stack"); - director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); - - _modelViewMV = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); - - _customCommand.init(_globalZOrder); - _customCommand.func = CC_CALLBACK_0(Box2DTest::onDraw, this); - renderer->addCommand(&_customCommand); - - director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); -} - -void Box2DTest::onDraw() -{ - Director* director = Director::getInstance(); - CCASSERT(nullptr != director, "Director is null when setting matrix stack"); - - auto oldMV = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); - director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewMV); - world->DrawDebugData(); - director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, oldMV); -} - - -void Box2DTest::addNewSpriteAtPosition(Vec2 p) -{ - CCLOG("Add sprite %0.2f x %02.f",p.x,p.y); - - // Define the dynamic body. - //Set up a 1m squared box in the physics world - b2BodyDef bodyDef; - bodyDef.type = b2_dynamicBody; - bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO); - - b2Body *body = world->CreateBody(&bodyDef); - - // Define another box shape for our dynamic body. - b2PolygonShape dynamicBox; - dynamicBox.SetAsBox(.5f, .5f);//These are mid points for our 1m box - - // Define the dynamic body fixture. - b2FixtureDef fixtureDef; - fixtureDef.shape = &dynamicBox; - fixtureDef.density = 1.0f; - fixtureDef.friction = 0.3f; - body->CreateFixture(&fixtureDef); - -#if CC_ENABLE_BOX2D_INTEGRATION - auto parent = this->getChildByTag(kTagParentNode); - - //We have a 64x64 sprite sheet with 4 different 32x32 images. The following code is - //just randomly picking one of the images - int idx = (CCRANDOM_0_1() > .5 ? 0:1); - int idy = (CCRANDOM_0_1() > .5 ? 0:1); - auto sprite = PhysicsSprite::createWithTexture(_spriteTexture,Rect(32 * idx,32 * idy,32,32)); - parent->addChild(sprite); - sprite->setB2Body(body); - sprite->setPTMRatio(PTM_RATIO); - sprite->setPosition(cocos2d::Vec2(p.x, p.y)); -#endif -} - -void Box2DTest::update(float dt) -{ - //It is recommended that a fixed time step is used with Box2D for stability - //of the simulation, however, we are using a variable time step here. - //You need to make an informed choice, the following URL is useful - //http://gafferongames.com/game-physics/fix-your-timestep/ - - int velocityIterations = 8; - int positionIterations = 1; - - // Instruct the world to perform a single step of simulation. It is - // generally best to keep the time step and iterations fixed. - world->Step(dt, velocityIterations, positionIterations); -} - -void Box2DTest::onTouchesEnded(const std::vector& touches, Event* event) -{ - //Add a new body/atlas sprite at the touched location - - for (auto& touch : touches) - { - if(!touch) - break; - - auto location = touch->getLocation(); - - addNewSpriteAtPosition( location ); - } -} - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTest/Box2dTest.h b/tests/cpp-tests/Classes/Box2DTest/Box2dTest.h deleted file mode 100644 index 36837befb4..0000000000 --- a/tests/cpp-tests/Classes/Box2DTest/Box2dTest.h +++ /dev/null @@ -1,62 +0,0 @@ -/**************************************************************************** - Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. - - 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. - ****************************************************************************/ - -#ifndef _BOX2D_TEST_H_ -#define _BOX2D_TEST_H_ - -#include "cocos2d.h" -#include "Box2D/Box2D.h" -#include "../BaseTest.h" - -DEFINE_TEST_SUITE(Box2DTests); - -class Box2DTest : public TestCase -{ -public: - CREATE_FUNC(Box2DTest); - - virtual bool init() override; - -#if CC_ENABLE_BOX2D_INTEGRATION - Box2DTest(); - ~Box2DTest(); - - void initPhysics(); - void createResetButton(); - virtual void draw(cocos2d::Renderer* renderer, const cocos2d::Mat4& transform, uint32_t flags) override; - - void addNewSpriteAtPosition(cocos2d::Vec2 p); - void update(float dt) override; - void onTouchesEnded(const std::vector& touches, cocos2d::Event* event); - -private: - cocos2d::Mat4 _modelViewMV; - void onDraw(); - cocos2d::CustomCommand _customCommand; - cocos2d::Texture2D* _spriteTexture; - b2World* world; -#endif -} ; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Box2dView.cpp b/tests/cpp-tests/Classes/Box2DTestBed/Box2dView.cpp deleted file mode 100644 index 418229ed53..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Box2dView.cpp +++ /dev/null @@ -1,246 +0,0 @@ -/**************************************************************************** - Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. - - 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 "Box2dView.h" -#include "GLES-Render.h" -#include "Test.h" -#include "renderer/CCRenderer.h" - -USING_NS_CC; - -#define kAccelerometerFrequency 30 -#define FRAMES_BETWEEN_PRESSES_FOR_DOUBLE_CLICK 10 - -extern int g_totalEntries; - -Settings settings; - -enum -{ - kTagBox2DNode, -}; - -Box2dTestBedSuite::Box2dTestBedSuite() -{ - for (int entryId = 0; entryId < g_totalEntries; ++entryId) - { - addTestCase(g_testEntries[entryId].name, [entryId](){ - return Box2dTestBed::createWithEntryID(entryId); - }); - } -} - -//------------------------------------------------------------------ -// -// Box2dTestBed -// -//------------------------------------------------------------------ - -Box2dTestBed::Box2dTestBed() -{ -} - -Box2dTestBed::~Box2dTestBed() -{ - _eventDispatcher->removeEventListener(_touchListener); -} - -Box2dTestBed* Box2dTestBed::createWithEntryID(int entryId) -{ - auto layer = new (std::nothrow) Box2dTestBed(); - layer->initWithEntryID(entryId); - layer->autorelease(); - - return layer; -} - -bool Box2dTestBed::initWithEntryID(int entryId) -{ - if (!TestCase::init()) - { - return false; - } - auto director = Director::getInstance(); - Vec2 visibleOrigin = director->getVisibleOrigin(); - Size visibleSize = director->getVisibleSize(); - - m_entryID = entryId; - - Box2DView* view = Box2DView::viewWithEntryID( entryId ); - addChild(view, 0, kTagBox2DNode); - view->setScale(15); - view->setAnchorPoint( Vec2(0,0) ); - view->setPosition(visibleOrigin.x+visibleSize.width/2, visibleOrigin.y+visibleSize.height/3); - auto label = Label::createWithTTF(view->title().c_str(), "fonts/arial.ttf", 28); - addChild(label, 1); - label->setPosition(visibleOrigin.x+visibleSize.width/2, visibleOrigin.y+visibleSize.height-50); - - // Adds touch event listener - auto listener = EventListenerTouchOneByOne::create(); - listener->setSwallowTouches(true); - - listener->onTouchBegan = CC_CALLBACK_2(Box2dTestBed::onTouchBegan, this); - listener->onTouchMoved = CC_CALLBACK_2(Box2dTestBed::onTouchMoved, this); - - _eventDispatcher->addEventListenerWithFixedPriority(listener, 1); - - _touchListener = listener; - - return true; -} - -bool Box2dTestBed::onTouchBegan(Touch* touch, Event* event) -{ - return true; -} - -void Box2dTestBed::onTouchMoved(Touch* touch, Event* event) -{ - auto diff = touch->getDelta(); - auto node = getChildByTag( kTagBox2DNode ); - auto currentPos = node->getPosition(); - node->setPosition(currentPos + diff); -} - -//------------------------------------------------------------------ -// -// Box2DView -// -//------------------------------------------------------------------ -Box2DView::Box2DView() -{ -} - -Box2DView* Box2DView::viewWithEntryID(int entryId) -{ - Box2DView* pView = new (std::nothrow) Box2DView(); - pView->initWithEntryID(entryId); - pView->autorelease(); - - return pView; -} - -bool Box2DView::initWithEntryID(int entryId) -{ - m_entry = g_testEntries + entryId; - m_test = m_entry->createFcn(); - - - // Adds Touch Event Listener - auto listener = EventListenerTouchOneByOne::create(); - listener->setSwallowTouches(true); - - listener->onTouchBegan = CC_CALLBACK_2(Box2DView::onTouchBegan, this); - listener->onTouchMoved = CC_CALLBACK_2(Box2DView::onTouchMoved, this); - listener->onTouchEnded = CC_CALLBACK_2(Box2DView::onTouchEnded, this); - - _eventDispatcher->addEventListenerWithFixedPriority(listener, -10); - _touchListener = listener; - - auto keyboardListener = EventListenerKeyboard::create(); - keyboardListener->onKeyPressed = CC_CALLBACK_2(Box2DView::onKeyPressed, this); - keyboardListener->onKeyReleased = CC_CALLBACK_2(Box2DView::onKeyReleased, this); - _eventDispatcher->addEventListenerWithFixedPriority(keyboardListener, -11); - _keyboardListener = keyboardListener; - - return true; -} - -std::string Box2DView::title() const -{ - return std::string(m_entry->name); -} - -void Box2DView::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) -{ - Layer::draw(renderer, transform, flags); - - _customCmd.init(_globalZOrder, transform, flags); - _customCmd.func = CC_CALLBACK_0(Box2DView::onDraw, this, transform, flags); - renderer->addCommand(&_customCmd); -} - -void Box2DView::onDraw(const Mat4 &transform, uint32_t flags) -{ - Director* director = Director::getInstance(); - CCASSERT(nullptr != director, "Director is null when setting matrix stack"); - director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); - director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, transform); - -// glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_POSITION); - m_test->Step(&settings); - m_test->m_world->DrawDebugData(); - - director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); -} - -Box2DView::~Box2DView() -{ - // Removes Touch Event Listener - _eventDispatcher->removeEventListener(_touchListener); - _eventDispatcher->removeEventListener(_keyboardListener); - delete m_test; -} - -bool Box2DView::onTouchBegan(Touch* touch, Event* event) -{ - auto touchLocation = touch->getLocation(); - - auto nodePosition = convertToNodeSpace( touchLocation ); - log("Box2DView::onTouchBegan, pos: %f,%f -> %f,%f", touchLocation.x, touchLocation.y, nodePosition.x, nodePosition.y); - - return m_test->MouseDown(b2Vec2(nodePosition.x,nodePosition.y)); -} - -void Box2DView::onTouchMoved(Touch* touch, Event* event) -{ - auto touchLocation = touch->getLocation(); - auto nodePosition = convertToNodeSpace( touchLocation ); - - log("Box2DView::onTouchMoved, pos: %f,%f -> %f,%f", touchLocation.x, touchLocation.y, nodePosition.x, nodePosition.y); - - m_test->MouseMove(b2Vec2(nodePosition.x,nodePosition.y)); -} - -void Box2DView::onTouchEnded(Touch* touch, Event* event) -{ - auto touchLocation = touch->getLocation(); - auto nodePosition = convertToNodeSpace( touchLocation ); - - log("Box2DView::onTouchEnded, pos: %f,%f -> %f,%f", touchLocation.x, touchLocation.y, nodePosition.x, nodePosition.y); - - m_test->MouseUp(b2Vec2(nodePosition.x,nodePosition.y)); -} - -void Box2DView::onKeyPressed(EventKeyboard::KeyCode code, Event* event) -{ - log("Box2dView:onKeyPressed, keycode: %d", static_cast(code)); - m_test->Keyboard(static_cast(code)); -} - -void Box2DView::onKeyReleased(EventKeyboard::KeyCode code, Event* event) -{ - log("onKeyReleased, keycode: %d", static_cast(code)); - m_test->KeyboardUp(static_cast(code)); -} diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Box2dView.h b/tests/cpp-tests/Classes/Box2DTestBed/Box2dView.h deleted file mode 100644 index b5f26d329d..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Box2dView.h +++ /dev/null @@ -1,83 +0,0 @@ -/**************************************************************************** - Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. - - 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. - ****************************************************************************/ - -#ifndef _BOX2D_VIEW_H_ -#define _BOX2D_VIEW_H_ - -#include "../BaseTest.h" -#include "renderer/CCCustomCommand.h" - -DEFINE_TEST_SUITE(Box2dTestBedSuite); - -class Box2dTestBed : public TestCase -{ -public: - static Box2dTestBed* createWithEntryID(int entryId); - - Box2dTestBed(); - virtual ~Box2dTestBed(); - - bool initWithEntryID(int entryId); - - bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event); - void onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event); -private: - int m_entryID; - cocos2d::EventListenerTouchOneByOne* _touchListener; -}; - -struct TestEntry; -class Test; -class Box2DView : public cocos2d::Layer -{ - cocos2d::EventListenerTouchOneByOne* _touchListener; - cocos2d::EventListenerKeyboard* _keyboardListener; - TestEntry* m_entry; - Test* m_test; - int m_entryID; -public: - Box2DView(); - virtual ~Box2DView(); - - bool initWithEntryID(int entryId); - std::string title() const; - virtual void draw(cocos2d::Renderer* renderer, const cocos2d::Mat4& transform, uint32_t flags) override; - -// virtual void registerWithTouchDispatcher(); - bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event)override; - void onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event)override; - void onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event)override; - - void onKeyPressed(cocos2d::EventKeyboard::KeyCode code, cocos2d::Event* event)override; - void onKeyReleased(cocos2d::EventKeyboard::KeyCode code, cocos2d::Event* event)override; - //virtual void accelerometer(UIAccelerometer* accelerometer, cocos2d::Acceleration* acceleration); - - static Box2DView* viewWithEntryID(int entryId); -protected: - void onDraw(const cocos2d::Mat4& transform, uint32_t flags); - - cocos2d::CustomCommand _customCmd; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/GLES-Render.cpp b/tests/cpp-tests/Classes/Box2DTestBed/GLES-Render.cpp deleted file mode 100644 index 25c4baa5be..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/GLES-Render.cpp +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com - * - * iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - */ - - //TODO minggo - -#include "GLES-Render.h" -#include "cocos2d.h" -#include -#include -#include - -USING_NS_CC; - -GLESDebugDraw::GLESDebugDraw() - : mRatio( 1.0f ) -{ - this->initShader(); -} - -GLESDebugDraw::GLESDebugDraw( float32 ratio ) - : mRatio( ratio ) -{ - this->initShader(); -} - -void GLESDebugDraw::initShader( void ) -{ -// mShaderProgram = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_U_COLOR); -// -// mColorLocation = glGetUniformLocation( mShaderProgram->getProgram(), "u_color"); -} - -void GLESDebugDraw::DrawPolygon(const b2Vec2* old_vertices, int vertexCount, const b2Color& color) -{ -// mShaderProgram->use(); -// mShaderProgram->setUniformsForBuiltins(); -// - b2Vec2* vertices = new b2Vec2[vertexCount]; - for( int i=0;isetUniformLocationWith4f(mColorLocation, color.r, color.g, color.b, 1); -// -// glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); -// glDrawArrays(GL_LINE_LOOP, 0, vertexCount); -// -// CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,vertexCount); -// -// -// CHECK_GL_ERROR_DEBUG(); - - delete[] vertices; -} - -void GLESDebugDraw::DrawSolidPolygon(const b2Vec2* old_vertices, int vertexCount, const b2Color& color) -{ -// mShaderProgram->use(); -// mShaderProgram->setUniformsForBuiltins(); - - b2Vec2* vertices = new b2Vec2[vertexCount]; - for( int i=0;isetUniformLocationWith4f(mColorLocation, color.r*0.5f, color.g*0.5f, color.b*0.5f, 0.5f); -// -// glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); -// -// glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount); -// -// mShaderProgram->setUniformLocationWith4f(mColorLocation, color.r, color.g, color.b, 1); -// glDrawArrays(GL_LINE_LOOP, 0, vertexCount); -// -// CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(2,vertexCount*2); -// -// CHECK_GL_ERROR_DEBUG(); - - delete[] vertices; -} - -void GLESDebugDraw::DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color) -{ -// mShaderProgram->use(); -// mShaderProgram->setUniformsForBuiltins(); - - const float32 k_segments = 16.0f; - int vertexCount=16; - const float32 k_increment = 2.0f * b2_pi / k_segments; - float32 theta = 0.0f; - - float* glVertices = new (std::nothrow) float[vertexCount*2]; - for (int i = 0; i < k_segments; ++i) - { - b2Vec2 v = center + radius * b2Vec2(cosf(theta), sinf(theta)); - glVertices[i*2]=v.x * mRatio; - glVertices[i*2+1]=v.y * mRatio; - theta += k_increment; - } - -// mShaderProgram->setUniformLocationWith4f(mColorLocation, color.r, color.g, color.b, 1); -// glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, glVertices); - -// glDrawArrays(GL_LINE_LOOP, 0, vertexCount); -// -// CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,vertexCount); -// -// CHECK_GL_ERROR_DEBUG(); - - delete[] glVertices; -} - -void GLESDebugDraw::DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color) -{ -// mShaderProgram->use(); -// mShaderProgram->setUniformsForBuiltins(); - - const float32 k_segments = 16.0f; - int vertexCount=16; - const float32 k_increment = 2.0f * b2_pi / k_segments; - float32 theta = 0.0f; - - float* glVertices = new (std::nothrow) float[vertexCount*2]; - for (int i = 0; i < k_segments; ++i) - { - b2Vec2 v = center + radius * b2Vec2(cosf(theta), sinf(theta)); - glVertices[i*2]=v.x * mRatio; - glVertices[i*2+1]=v.y * mRatio; - theta += k_increment; - } - -// mShaderProgram->setUniformLocationWith4f(mColorLocation, color.r*0.5f, color.g*0.5f, color.b*0.5f, 0.5f); -// glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, glVertices); -// glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount); -// -// -// mShaderProgram->setUniformLocationWith4f(mColorLocation, color.r, color.g, color.b, 1); -// glDrawArrays(GL_LINE_LOOP, 0, vertexCount); - - // Draw the axis line - DrawSegment(center,center+radius*axis,color); - - CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(2,vertexCount*2); - -// CHECK_GL_ERROR_DEBUG(); - - delete[] glVertices; -} - -void GLESDebugDraw::DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color) -{ -// mShaderProgram->use(); -// mShaderProgram->setUniformsForBuiltins(); -// -// mShaderProgram->setUniformLocationWith4f(mColorLocation, color.r, color.g, color.b, 1); - -// GLfloat glVertices[] = -// { -// p1.x * mRatio, p1.y * mRatio, -// p2.x * mRatio, p2.y * mRatio -// }; -// glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, glVertices); - -// glDrawArrays(GL_LINES, 0, 2); -// -// CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,2); -// -// CHECK_GL_ERROR_DEBUG(); -} - -void GLESDebugDraw::DrawTransform(const b2Transform& xf) -{ - b2Vec2 p1 = xf.p, p2; - const float32 k_axisScale = 0.4f; - p2 = p1 + k_axisScale * xf.q.GetXAxis(); - DrawSegment(p1, p2, b2Color(1,0,0)); - - p2 = p1 + k_axisScale * xf.q.GetYAxis(); - DrawSegment(p1,p2,b2Color(0,1,0)); -} - -void GLESDebugDraw::DrawPoint(const b2Vec2& p, float32 size, const b2Color& color) -{ -// mShaderProgram->use(); -// mShaderProgram->setUniformsForBuiltins(); -// -// mShaderProgram->setUniformLocationWith4f(mColorLocation, color.r, color.g, color.b, 1); -// -// // glPointSize(size); -// -// GLfloat glVertices[] = { -// p.x * mRatio, p.y * mRatio -// }; -// -// glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, glVertices); - -// glDrawArrays(GL_POINTS, 0, 1); -// // glPointSize(1.0f); -// -// CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,1); -// -// CHECK_GL_ERROR_DEBUG(); -} - -void GLESDebugDraw::DrawString(int x, int y, const char *string, ...) -{ -// NSLog(@"DrawString: unsupported: %s", string); - //printf(string); - /* Unsupported as yet. Could replace with bitmap font renderer at a later date */ -} - -void GLESDebugDraw::DrawAABB(b2AABB* aabb, const b2Color& color) -{ -// mShaderProgram->use(); -// mShaderProgram->setUniformsForBuiltins(); -// -// mShaderProgram->setUniformLocationWith4f(mColorLocation, color.r, color.g, color.b, 1); - -// GLfloat glVertices[] = { -// aabb->lowerBound.x * mRatio, aabb->lowerBound.y * mRatio, -// aabb->upperBound.x * mRatio, aabb->lowerBound.y * mRatio, -// aabb->upperBound.x * mRatio, aabb->upperBound.y * mRatio, -// aabb->lowerBound.x * mRatio, aabb->upperBound.y * mRatio -// }; - -// glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, glVertices); -// glDrawArrays(GL_LINE_LOOP, 0, 4); -// -// CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,4); -// -// CHECK_GL_ERROR_DEBUG(); -} diff --git a/tests/cpp-tests/Classes/Box2DTestBed/GLES-Render.h b/tests/cpp-tests/Classes/Box2DTestBed/GLES-Render.h deleted file mode 100644 index 43a896c34b..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/GLES-Render.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef RENDER_H -#define RENDER_H - -#include "Box2D/Box2D.h" -#include "cocos2d.h" - -struct b2AABB; - -// This class implements debug drawing callbacks that are invoked -// inside b2World::Step. -class GLESDebugDraw : public b2Draw -{ - float32 mRatio; - void initShader(); -public: - GLESDebugDraw(); - - GLESDebugDraw( float32 ratio ); - - virtual void DrawPolygon(const b2Vec2* vertices, int vertexCount, const b2Color& color); - - virtual void DrawSolidPolygon(const b2Vec2* vertices, int vertexCount, const b2Color& color); - - virtual void DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color); - - virtual void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color); - - virtual void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color); - - virtual void DrawTransform(const b2Transform& xf); - - virtual void DrawPoint(const b2Vec2& p, float32 size, const b2Color& color); - - virtual void DrawString(int x, int y, const char* string, ...); - - virtual void DrawAABB(b2AABB* aabb, const b2Color& color); -}; - - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Test.cpp b/tests/cpp-tests/Classes/Box2DTestBed/Test.cpp deleted file mode 100644 index 556ab4f9a3..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Test.cpp +++ /dev/null @@ -1,460 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "Test.h" -#include "GLES-Render.h" - -#include - -void DestructionListener::SayGoodbye(b2Joint* joint) -{ - if (test->m_mouseJoint == joint) - { - test->m_mouseJoint = nullptr; - } - else - { - test->JointDestroyed(joint); - } -} - -Test::Test() -{ - b2Vec2 gravity; - gravity.Set(0.0f, -10.0f); - m_world = new b2World(gravity); - m_bomb = nullptr; - m_textLine = 30; - m_mouseJoint = nullptr; - m_pointCount = 0; - - m_destructionListener.test = this; - m_world->SetDestructionListener(&m_destructionListener); - m_world->SetContactListener(this); - m_world->SetDebugDraw(&m_debugDraw); - - m_bombSpawning = false; - - m_stepCount = 0; - - b2BodyDef bodyDef; - m_groundBody = m_world->CreateBody(&bodyDef); - - memset(&m_maxProfile, 0, sizeof(b2Profile)); - memset(&m_totalProfile, 0, sizeof(b2Profile)); -} - -Test::~Test() -{ - // By deleting the world, we delete the bomb, mouse joint, etc. - delete m_world; - m_world = nullptr; -} - -void Test::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) -{ - const b2Manifold* manifold = contact->GetManifold(); - - if (manifold->pointCount == 0) - { - return; - } - - b2Fixture* fixtureA = contact->GetFixtureA(); - b2Fixture* fixtureB = contact->GetFixtureB(); - - b2PointState state1[b2_maxManifoldPoints], state2[b2_maxManifoldPoints]; - b2GetPointStates(state1, state2, oldManifold, manifold); - - b2WorldManifold worldManifold; - contact->GetWorldManifold(&worldManifold); - - for (int32 i = 0; i < manifold->pointCount && m_pointCount < k_maxContactPoints; ++i) - { - ContactPoint* cp = m_points + m_pointCount; - cp->fixtureA = fixtureA; - cp->fixtureB = fixtureB; - cp->position = worldManifold.points[i]; - cp->normal = worldManifold.normal; - cp->state = state2[i]; - cp->normalImpulse = manifold->points[i].normalImpulse; - cp->tangentImpulse = manifold->points[i].tangentImpulse; - cp->separation = worldManifold.separations[i]; - ++m_pointCount; - } -} - -void Test::DrawTitle(const char *string) -{ - m_debugDraw.DrawString(5, DRAW_STRING_NEW_LINE, string); - m_textLine = 2 * DRAW_STRING_NEW_LINE; -} - -class QueryCallback : public b2QueryCallback -{ -public: - QueryCallback(const b2Vec2& point) - { - m_point = point; - m_fixture = nullptr; - } - - bool ReportFixture(b2Fixture* fixture) - { - b2Body* body = fixture->GetBody(); - if (body->GetType() == b2_dynamicBody) - { - bool inside = fixture->TestPoint(m_point); - if (inside) - { - m_fixture = fixture; - - // We are done, terminate the query. - return false; - } - } - - // Continue the query. - return true; - } - - b2Vec2 m_point; - b2Fixture* m_fixture; -}; - -bool Test::MouseDown(const b2Vec2& p) -{ - m_mouseWorld = p; - - if (m_mouseJoint != nullptr) - { - return false; - } - - // Make a small box. - b2AABB aabb; - b2Vec2 d; - d.Set(0.001f, 0.001f); - aabb.lowerBound = p - d; - aabb.upperBound = p + d; - - // Query the world for overlapping shapes. - QueryCallback callback(p); - m_world->QueryAABB(&callback, aabb); - - if (callback.m_fixture) - { - b2Body* body = callback.m_fixture->GetBody(); - b2MouseJointDef md; - md.bodyA = m_groundBody; - md.bodyB = body; - md.target = p; - md.maxForce = 1000.0f * body->GetMass(); - m_mouseJoint = (b2MouseJoint*)m_world->CreateJoint(&md); - body->SetAwake(true); - return true; - } - - return false; -} - -void Test::SpawnBomb(const b2Vec2& worldPt) -{ - m_bombSpawnPoint = worldPt; - m_bombSpawning = true; -} - -void Test::CompleteBombSpawn(const b2Vec2& p) -{ - if (m_bombSpawning == false) - { - return; - } - - const float multiplier = 30.0f; - b2Vec2 vel = m_bombSpawnPoint - p; - vel *= multiplier; - LaunchBomb(m_bombSpawnPoint,vel); - m_bombSpawning = false; -} - -void Test::ShiftMouseDown(const b2Vec2& p) -{ - m_mouseWorld = p; - - if (m_mouseJoint != nullptr) - { - return; - } - - SpawnBomb(p); -} - -void Test::MouseUp(const b2Vec2& p) -{ - if (m_mouseJoint) - { - m_world->DestroyJoint(m_mouseJoint); - m_mouseJoint = nullptr; - } - - if (m_bombSpawning) - { - CompleteBombSpawn(p); - } -} - -void Test::MouseMove(const b2Vec2& p) -{ - m_mouseWorld = p; - - if (m_mouseJoint) - { - m_mouseJoint->SetTarget(p); - } -} - -void Test::LaunchBomb() -{ - b2Vec2 p(RandomFloat(-15.0f, 15.0f), 30.0f); - b2Vec2 v = -5.0f * p; - LaunchBomb(p, v); -} - -void Test::LaunchBomb(const b2Vec2& position, const b2Vec2& velocity) -{ - if (m_bomb) - { - m_world->DestroyBody(m_bomb); - m_bomb = nullptr; - } - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position = position; - bd.bullet = true; - m_bomb = m_world->CreateBody(&bd); - m_bomb->SetLinearVelocity(velocity); - - b2CircleShape circle; - circle.m_radius = 0.3f; - - b2FixtureDef fd; - fd.shape = &circle; - fd.density = 20.0f; - fd.restitution = 0.0f; - - b2Vec2 minV = position - b2Vec2(0.3f,0.3f); - b2Vec2 maxV = position + b2Vec2(0.3f,0.3f); - - b2AABB aabb; - aabb.lowerBound = minV; - aabb.upperBound = maxV; - - m_bomb->CreateFixture(&fd); -} - -void Test::Step(Settings* settings) -{ - float32 timeStep = settings->hz > 0.0f ? 1.0f / settings->hz : float32(0.0f); - - if (settings->pause) - { - if (settings->singleStep) - { - settings->singleStep = 0; - } - else - { - timeStep = 0.0f; - } - - m_debugDraw.DrawString(5, m_textLine, "****PAUSED****"); - m_textLine += DRAW_STRING_NEW_LINE; - } - - uint32 flags = 0; - flags += settings->drawShapes * b2Draw::e_shapeBit; - flags += settings->drawJoints * b2Draw::e_jointBit; - flags += settings->drawAABBs * b2Draw::e_aabbBit; - flags += settings->drawCOMs * b2Draw::e_centerOfMassBit; - m_debugDraw.SetFlags(flags); - - m_world->SetAllowSleeping(settings->enableSleep > 0); - m_world->SetWarmStarting(settings->enableWarmStarting > 0); - m_world->SetContinuousPhysics(settings->enableContinuous > 0); - m_world->SetSubStepping(settings->enableSubStepping > 0); - - m_pointCount = 0; - - m_world->Step(timeStep, settings->velocityIterations, settings->positionIterations); - - m_world->DrawDebugData(); - - if (timeStep > 0.0f) - { - ++m_stepCount; - } - - if (settings->drawStats) - { - int32 bodyCount = m_world->GetBodyCount(); - int32 contactCount = m_world->GetContactCount(); - int32 jointCount = m_world->GetJointCount(); - m_debugDraw.DrawString(5, m_textLine, "bodies/contacts/joints = %d/%d/%d", bodyCount, contactCount, jointCount); - m_textLine += DRAW_STRING_NEW_LINE; - - int32 proxyCount = m_world->GetProxyCount(); - int32 height = m_world->GetTreeHeight(); - int32 balance = m_world->GetTreeBalance(); - float32 quality = m_world->GetTreeQuality(); - m_debugDraw.DrawString(5, m_textLine, "proxies/height/balance/quality = %d/%d/%d/%g", proxyCount, height, balance, quality); - m_textLine += DRAW_STRING_NEW_LINE; - } - - // Track maximum profile times - { - const b2Profile& p = m_world->GetProfile(); - m_maxProfile.step = b2Max(m_maxProfile.step, p.step); - m_maxProfile.collide = b2Max(m_maxProfile.collide, p.collide); - m_maxProfile.solve = b2Max(m_maxProfile.solve, p.solve); - m_maxProfile.solveInit = b2Max(m_maxProfile.solveInit, p.solveInit); - m_maxProfile.solveVelocity = b2Max(m_maxProfile.solveVelocity, p.solveVelocity); - m_maxProfile.solvePosition = b2Max(m_maxProfile.solvePosition, p.solvePosition); - m_maxProfile.solveTOI = b2Max(m_maxProfile.solveTOI, p.solveTOI); - m_maxProfile.broadphase = b2Max(m_maxProfile.broadphase, p.broadphase); - - m_totalProfile.step += p.step; - m_totalProfile.collide += p.collide; - m_totalProfile.solve += p.solve; - m_totalProfile.solveInit += p.solveInit; - m_totalProfile.solveVelocity += p.solveVelocity; - m_totalProfile.solvePosition += p.solvePosition; - m_totalProfile.solveTOI += p.solveTOI; - m_totalProfile.broadphase += p.broadphase; - } - - if (settings->drawProfile) - { - const b2Profile& p = m_world->GetProfile(); - - b2Profile aveProfile; - memset(&aveProfile, 0, sizeof(b2Profile)); - if (m_stepCount > 0) - { - float32 scale = 1.0f / m_stepCount; - aveProfile.step = scale * m_totalProfile.step; - aveProfile.collide = scale * m_totalProfile.collide; - aveProfile.solve = scale * m_totalProfile.solve; - aveProfile.solveInit = scale * m_totalProfile.solveInit; - aveProfile.solveVelocity = scale * m_totalProfile.solveVelocity; - aveProfile.solvePosition = scale * m_totalProfile.solvePosition; - aveProfile.solveTOI = scale * m_totalProfile.solveTOI; - aveProfile.broadphase = scale * m_totalProfile.broadphase; - } - - m_debugDraw.DrawString(5, m_textLine, "step [ave] (max) = %5.2f [%6.2f] (%6.2f)", p.step, aveProfile.step, m_maxProfile.step); - m_textLine += DRAW_STRING_NEW_LINE; - m_debugDraw.DrawString(5, m_textLine, "collide [ave] (max) = %5.2f [%6.2f] (%6.2f)", p.collide, aveProfile.collide, m_maxProfile.collide); - m_textLine += DRAW_STRING_NEW_LINE; - m_debugDraw.DrawString(5, m_textLine, "solve [ave] (max) = %5.2f [%6.2f] (%6.2f)", p.solve, aveProfile.solve, m_maxProfile.solve); - m_textLine += DRAW_STRING_NEW_LINE; - m_debugDraw.DrawString(5, m_textLine, "solve init [ave] (max) = %5.2f [%6.2f] (%6.2f)", p.solveInit, aveProfile.solveInit, m_maxProfile.solveInit); - m_textLine += DRAW_STRING_NEW_LINE; - m_debugDraw.DrawString(5, m_textLine, "solve velocity [ave] (max) = %5.2f [%6.2f] (%6.2f)", p.solveVelocity, aveProfile.solveVelocity, m_maxProfile.solveVelocity); - m_textLine += DRAW_STRING_NEW_LINE; - m_debugDraw.DrawString(5, m_textLine, "solve position [ave] (max) = %5.2f [%6.2f] (%6.2f)", p.solvePosition, aveProfile.solvePosition, m_maxProfile.solvePosition); - m_textLine += DRAW_STRING_NEW_LINE; - m_debugDraw.DrawString(5, m_textLine, "solveTOI [ave] (max) = %5.2f [%6.2f] (%6.2f)", p.solveTOI, aveProfile.solveTOI, m_maxProfile.solveTOI); - m_textLine += DRAW_STRING_NEW_LINE; - m_debugDraw.DrawString(5, m_textLine, "broad-phase [ave] (max) = %5.2f [%6.2f] (%6.2f)", p.broadphase, aveProfile.broadphase, m_maxProfile.broadphase); - m_textLine += DRAW_STRING_NEW_LINE; - } - - if (m_mouseJoint) - { - b2Vec2 p1 = m_mouseJoint->GetAnchorB(); - b2Vec2 p2 = m_mouseJoint->GetTarget(); - - b2Color c; - c.Set(0.0f, 1.0f, 0.0f); - m_debugDraw.DrawPoint(p1, 4.0f, c); - m_debugDraw.DrawPoint(p2, 4.0f, c); - - c.Set(0.8f, 0.8f, 0.8f); - m_debugDraw.DrawSegment(p1, p2, c); - } - - if (m_bombSpawning) - { - b2Color c; - c.Set(0.0f, 0.0f, 1.0f); - m_debugDraw.DrawPoint(m_bombSpawnPoint, 4.0f, c); - - c.Set(0.8f, 0.8f, 0.8f); - m_debugDraw.DrawSegment(m_mouseWorld, m_bombSpawnPoint, c); - } - - if (settings->drawContactPoints) - { - const float32 k_impulseScale = 0.1f; - const float32 k_axisScale = 0.3f; - - for (int32 i = 0; i < m_pointCount; ++i) - { - ContactPoint* point = m_points + i; - - if (point->state == b2_addState) - { - // Add - m_debugDraw.DrawPoint(point->position, 10.0f, b2Color(0.3f, 0.95f, 0.3f)); - } - else if (point->state == b2_persistState) - { - // Persist - m_debugDraw.DrawPoint(point->position, 5.0f, b2Color(0.3f, 0.3f, 0.95f)); - } - - if (settings->drawContactNormals == 1) - { - b2Vec2 p1 = point->position; - b2Vec2 p2 = p1 + k_axisScale * point->normal; - m_debugDraw.DrawSegment(p1, p2, b2Color(0.9f, 0.9f, 0.9f)); - } - else if (settings->drawContactImpulse == 1) - { - b2Vec2 p1 = point->position; - b2Vec2 p2 = p1 + k_impulseScale * point->normalImpulse * point->normal; - m_debugDraw.DrawSegment(p1, p2, b2Color(0.9f, 0.9f, 0.3f)); - } - - if (settings->drawFrictionImpulse == 1) - { - b2Vec2 tangent = b2Cross(point->normal, 1.0f); - b2Vec2 p1 = point->position; - b2Vec2 p2 = p1 + k_impulseScale * point->tangentImpulse * tangent; - m_debugDraw.DrawSegment(p1, p2, b2Color(0.9f, 0.9f, 0.3f)); - } - } - } -} - -void Test::ShiftOrigin(const b2Vec2& newOrigin) -{ - m_world->ShiftOrigin(newOrigin); -} diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Test.h b/tests/cpp-tests/Classes/Box2DTestBed/Test.h deleted file mode 100644 index 7ec5b1c9f5..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Test.h +++ /dev/null @@ -1,196 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef TEST_H -#define TEST_H - -#include -#include "GLES-Render.h" - -#include - -class Test; -struct Settings; - -typedef Test* TestCreateFcn(); - -#define RAND_LIMIT 32767 -#define DRAW_STRING_NEW_LINE 25 - -/// Random number in range [-1,1] -inline float32 RandomFloat() -{ - float32 r = (float32)(std::rand() & (RAND_LIMIT)); - r /= RAND_LIMIT; - r = 2.0f * r - 1.0f; - return r; -} - -/// Random floating point number in range [lo, hi] -inline float32 RandomFloat(float32 lo, float32 hi) -{ - float32 r = (float32)(std::rand() & (RAND_LIMIT)); - r /= RAND_LIMIT; - r = (hi - lo) * r + lo; - return r; -} - -/// Test settings. Some can be controlled in the GUI. -struct Settings -{ - Settings() - { - viewCenter.Set(0.0f, 20.0f); - hz = 60.0f; - velocityIterations = 8; - positionIterations = 3; - drawShapes = 1; - drawJoints = 1; - drawAABBs = 0; - drawContactPoints = 0; - drawContactNormals = 0; - drawContactImpulse = 0; - drawFrictionImpulse = 0; - drawCOMs = 0; - drawStats = 0; - drawProfile = 0; - enableWarmStarting = 1; - enableContinuous = 1; - enableSubStepping = 0; - enableSleep = 1; - pause = 0; - singleStep = 0; - } - - b2Vec2 viewCenter; - float32 hz; - int32 velocityIterations; - int32 positionIterations; - int32 drawShapes; - int32 drawJoints; - int32 drawAABBs; - int32 drawContactPoints; - int32 drawContactNormals; - int32 drawContactImpulse; - int32 drawFrictionImpulse; - int32 drawCOMs; - int32 drawStats; - int32 drawProfile; - int32 enableWarmStarting; - int32 enableContinuous; - int32 enableSubStepping; - int32 enableSleep; - int32 pause; - int32 singleStep; -}; - -struct TestEntry -{ - const char *name; - TestCreateFcn *createFcn; -}; - -extern TestEntry g_testEntries[]; -// This is called when a joint in the world is implicitly destroyed -// because an attached body is destroyed. This gives us a chance to -// nullify the mouse joint. -class DestructionListener : public b2DestructionListener -{ -public: - void SayGoodbye(b2Fixture* fixture) { B2_NOT_USED(fixture); } - void SayGoodbye(b2Joint* joint); - - Test* test; -}; - -const int32 k_maxContactPoints = 2048; - -struct ContactPoint -{ - b2Fixture* fixtureA; - b2Fixture* fixtureB; - b2Vec2 normal; - b2Vec2 position; - b2PointState state; - float32 normalImpulse; - float32 tangentImpulse; - float32 separation; -}; - -class Test : public b2ContactListener -{ -public: - - Test(); - virtual ~Test(); - - void DrawTitle(const char *string); - virtual void Step(Settings* settings); - virtual void Keyboard(unsigned char key) { B2_NOT_USED(key); } - virtual void KeyboardUp(unsigned char key) { B2_NOT_USED(key); } - void ShiftMouseDown(const b2Vec2& p); - virtual bool MouseDown(const b2Vec2& p); - virtual void MouseUp(const b2Vec2& p); - void MouseMove(const b2Vec2& p); - void LaunchBomb(); - void LaunchBomb(const b2Vec2& position, const b2Vec2& velocity); - - void SpawnBomb(const b2Vec2& worldPt); - void CompleteBombSpawn(const b2Vec2& p); - - // Let derived tests know that a joint was destroyed. - virtual void JointDestroyed(b2Joint* joint) { B2_NOT_USED(joint); } - - // Callbacks for derived classes. - virtual void BeginContact(b2Contact* contact) { B2_NOT_USED(contact); } - virtual void EndContact(b2Contact* contact) { B2_NOT_USED(contact); } - virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold); - virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) - { - B2_NOT_USED(contact); - B2_NOT_USED(impulse); - } - - void ShiftOrigin(const b2Vec2& newOrigin); - -protected: - friend class DestructionListener; - friend class BoundaryListener; - friend class ContactListener; - friend class Box2DView; - - b2Body* m_groundBody; - b2AABB m_worldAABB; - ContactPoint m_points[k_maxContactPoints]; - int32 m_pointCount; - DestructionListener m_destructionListener; - GLESDebugDraw m_debugDraw; - int32 m_textLine; - b2World* m_world; - b2Body* m_bomb; - b2MouseJoint* m_mouseJoint; - b2Vec2 m_bombSpawnPoint; - bool m_bombSpawning; - b2Vec2 m_mouseWorld; - int32 m_stepCount; - - b2Profile m_maxProfile; - b2Profile m_totalProfile; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/TestEntries.cpp b/tests/cpp-tests/Classes/Box2DTestBed/TestEntries.cpp deleted file mode 100644 index 57d437a92b..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/TestEntries.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ -#include -using namespace std; - -#include "Test.h" -#include "Tests/AddPair.h" -#include "Tests/ApplyForce.h" -#include "Tests/BodyTypes.h" -#include "Tests/Breakable.h" -#include "Tests/Bridge.h" -#include "Tests/BulletTest.h" -#include "Tests/Cantilever.h" -#include "Tests/Car.h" -#include "Tests/ContinuousTest.h" -#include "Tests/Chain.h" -#include "Tests/CharacterCollision.h" -#include "Tests/CollisionFiltering.h" -#include "Tests/CollisionProcessing.h" -#include "Tests/CompoundShapes.h" -#include "Tests/Confined.h" -#include "Tests/ConvexHull.h" -#include "Tests/ConveyorBelt.h" -#include "Tests/DistanceTest.h" -#include "Tests/Dominos.h" -#include "Tests/DumpShell.h" -#include "Tests/DynamicTreeTest.h" -#include "Tests/EdgeShapes.h" -#include "Tests/EdgeTest.h" -#include "Tests/Gears.h" -#include "Tests/Mobile.h" -#include "Tests/MobileBalanced.h" -#include "Tests/MotorJoint.h" -#include "Tests/OneSidedPlatform.h" -#include "Tests/Pinball.h" -#include "Tests/PolyCollision.h" -#include "Tests/PolyShapes.h" -#include "Tests/Prismatic.h" -#include "Tests/Pulleys.h" -#include "Tests/Pyramid.h" -#include "Tests/RayCast.h" -#include "Tests/Revolute.h" -#include "Tests/RopeJoint.h" -#include "Tests/SensorTest.h" -#include "Tests/ShapeEditing.h" -#include "Tests/SliderCrank.h" -#include "Tests/SphereStack.h" -#include "Tests/TheoJansen.h" -#include "Tests/Tiles.h" -#include "Tests/TimeOfImpact.h" -#include "Tests/Tumbler.h" -#include "Tests/VaryingFriction.h" -#include "Tests/VaryingRestitution.h" -#include "Tests/VerticalStack.h" -#include "Tests/Web.h" - -TestEntry g_testEntries[] = -{ - {"Ray-Cast", RayCast::Create}, - {"Dump Shell", DumpShell::Create}, - {"Convex Hull", ConvexHull::Create}, - {"Apply Force", ApplyForce::Create}, - {"Continuous Test", ContinuousTest::Create}, - // {"Time of Impact", TimeOfImpact::Create}, - {"Motor Joint", MotorJoint::Create}, - {"One-Sided Platform", OneSidedPlatform::Create}, - {"Mobile", Mobile::Create}, - {"MobileBalanced", MobileBalanced::Create}, - {"Conveyor Belt", ConveyorBelt::Create}, - {"Gears", Gears::Create}, - {"Varying Restitution", VaryingRestitution::Create}, - {"Tumbler", Tumbler::Create}, - {"Tiles", Tiles::Create}, - {"Cantilever", Cantilever::Create}, - {"Character Collision", CharacterCollision::Create}, - {"Edge Test", EdgeTest::Create}, - {"Body Types", BodyTypes::Create}, - {"Shape Editing", ShapeEditing::Create}, - {"Car", Car::Create}, - {"Prismatic", Prismatic::Create}, - {"Vertical Stack", VerticalStack::Create}, - {"SphereStack", SphereStack::Create}, - {"Revolute", Revolute::Create}, - {"Pulleys", Pulleys::Create}, - {"Polygon Shapes", PolyShapes::Create}, - {"Web", Web::Create}, - {"RopeJoint", RopeJoint::Create}, - {"Pinball", Pinball::Create}, - {"Bullet Test", BulletTest::Create}, - {"Confined", Confined::Create}, - {"Pyramid", Pyramid::Create}, - {"Theo Jansen's Walker", TheoJansen::Create}, - {"Edge Shapes", EdgeShapes::Create}, - {"PolyCollision", PolyCollision::Create}, - {"Bridge", Bridge::Create}, - {"Breakable", Breakable::Create}, - {"Chain", Chain::Create}, - {"Collision Filtering", CollisionFiltering::Create}, - {"Collision Processing", CollisionProcessing::Create}, - {"Compound Shapes", CompoundShapes::Create}, - {"Distance Test", DistanceTest::Create}, - {"Dominos", Dominos::Create}, - {"Dynamic Tree", DynamicTreeTest::Create}, - {"Sensor Test", SensorTest::Create}, - {"Slider Crank", SliderCrank::Create}, - {"Varying Friction", VaryingFriction::Create}, - {"Add Pair Stress Test", AddPair::Create}, -}; - -int g_totalEntries = sizeof(g_testEntries) / sizeof(g_testEntries[0]); diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/AddPair.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/AddPair.h deleted file mode 100644 index 6f995e0ce8..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/AddPair.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -* Copyright (c) 2006-2012 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef AddPair_H -#define AddPair_H - -class AddPair : public Test -{ -public: - - AddPair() - { - m_world->SetGravity(b2Vec2(0.0f,0.0f)); - { - b2CircleShape shape; - shape.m_p.SetZero(); - shape.m_radius = 0.1f; - - float minX = -6.0f; - float maxX = 0.0f; - float minY = 4.0f; - float maxY = 6.0f; - - for (int32 i = 0; i < 400; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position = b2Vec2(RandomFloat(minX,maxX),RandomFloat(minY,maxY)); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 0.01f); - } - } - - { - b2PolygonShape shape; - shape.SetAsBox(1.5f, 1.5f); - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-40.0f,5.0f); - bd.bullet = true; - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 1.0f); - body->SetLinearVelocity(b2Vec2(150.0f, 0.0f)); - } - } - - static Test* Create() - { - return new AddPair; - } -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/ApplyForce.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/ApplyForce.h deleted file mode 100644 index b4bd10f425..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/ApplyForce.h +++ /dev/null @@ -1,180 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef APPLY_FORCE_H -#define APPLY_FORCE_H - -class ApplyForce : public Test -{ -public: - ApplyForce() - { - m_world->SetGravity(b2Vec2(0.0f, 0.0f)); - - const float32 k_restitution = 0.4f; - - b2Body* ground; - { - b2BodyDef bd; - bd.position.Set(0.0f, 20.0f); - ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - - b2FixtureDef sd; - sd.shape = &shape; - sd.density = 0.0f; - sd.restitution = k_restitution; - - // Left vertical - shape.Set(b2Vec2(-20.0f, -20.0f), b2Vec2(-20.0f, 20.0f)); - ground->CreateFixture(&sd); - - // Right vertical - shape.Set(b2Vec2(20.0f, -20.0f), b2Vec2(20.0f, 20.0f)); - ground->CreateFixture(&sd); - - // Top horizontal - shape.Set(b2Vec2(-20.0f, 20.0f), b2Vec2(20.0f, 20.0f)); - ground->CreateFixture(&sd); - - // Bottom horizontal - shape.Set(b2Vec2(-20.0f, -20.0f), b2Vec2(20.0f, -20.0f)); - ground->CreateFixture(&sd); - } - - { - b2Transform xf1; - xf1.q.Set(0.3524f * b2_pi); - xf1.p = xf1.q.GetXAxis(); - - b2Vec2 vertices[3]; - vertices[0] = b2Mul(xf1, b2Vec2(-1.0f, 0.0f)); - vertices[1] = b2Mul(xf1, b2Vec2(1.0f, 0.0f)); - vertices[2] = b2Mul(xf1, b2Vec2(0.0f, 0.5f)); - - b2PolygonShape poly1; - poly1.Set(vertices, 3); - - b2FixtureDef sd1; - sd1.shape = &poly1; - sd1.density = 4.0f; - - b2Transform xf2; - xf2.q.Set(-0.3524f * b2_pi); - xf2.p = -xf2.q.GetXAxis(); - - vertices[0] = b2Mul(xf2, b2Vec2(-1.0f, 0.0f)); - vertices[1] = b2Mul(xf2, b2Vec2(1.0f, 0.0f)); - vertices[2] = b2Mul(xf2, b2Vec2(0.0f, 0.5f)); - - b2PolygonShape poly2; - poly2.Set(vertices, 3); - - b2FixtureDef sd2; - sd2.shape = &poly2; - sd2.density = 2.0f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.angularDamping = 2.0f; - bd.linearDamping = 0.5f; - - bd.position.Set(0.0f, 2.0); - bd.angle = b2_pi; - bd.allowSleep = false; - m_body = m_world->CreateBody(&bd); - m_body->CreateFixture(&sd1); - m_body->CreateFixture(&sd2); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.5f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - fd.friction = 0.3f; - - for (int i = 0; i < 10; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - - bd.position.Set(0.0f, 5.0f + 1.54f * i); - b2Body* body = m_world->CreateBody(&bd); - - body->CreateFixture(&fd); - - float32 gravity = 10.0f; - float32 I = body->GetInertia(); - float32 mass = body->GetMass(); - - // For a circle: I = 0.5 * m * r * r ==> r = sqrt(2 * I / m) - float32 radius = b2Sqrt(2.0f * I / mass); - - b2FrictionJointDef jd; - jd.localAnchorA.SetZero(); - jd.localAnchorB.SetZero(); - jd.bodyA = ground; - jd.bodyB = body; - jd.collideConnected = true; - jd.maxForce = mass * gravity; - jd.maxTorque = mass * radius * gravity; - - m_world->CreateJoint(&jd); - } - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'w': - { - b2Vec2 f = m_body->GetWorldVector(b2Vec2(0.0f, -200.0f)); - b2Vec2 p = m_body->GetWorldPoint(b2Vec2(0.0f, 2.0f)); - m_body->ApplyForce(f, p, true); - } - break; - - case 'a': - { - m_body->ApplyTorque(50.0f, true); - } - break; - - case 'd': - { - m_body->ApplyTorque(-50.0f, true); - } - break; - } - } - - static Test* Create() - { - return new ApplyForce; - } - - b2Body* m_body; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/BodyTypes.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/BodyTypes.h deleted file mode 100644 index 050b611aca..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/BodyTypes.h +++ /dev/null @@ -1,159 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef BODY_TYPES_H -#define BODY_TYPES_H - -class BodyTypes : public Test -{ -public: - BodyTypes() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-20.0f, 0.0f), b2Vec2(20.0f, 0.0f)); - - b2FixtureDef fd; - fd.shape = &shape; - - ground->CreateFixture(&fd); - } - - // Define attachment - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 3.0f); - m_attachment = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(0.5f, 2.0f); - m_attachment->CreateFixture(&shape, 2.0f); - } - - // Define platform - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-4.0f, 5.0f); - m_platform = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(0.5f, 4.0f, b2Vec2(4.0f, 0.0f), 0.5f * b2_pi); - - b2FixtureDef fd; - fd.shape = &shape; - fd.friction = 0.6f; - fd.density = 2.0f; - m_platform->CreateFixture(&fd); - - b2RevoluteJointDef rjd; - rjd.Initialize(m_attachment, m_platform, b2Vec2(0.0f, 5.0f)); - rjd.maxMotorTorque = 50.0f; - rjd.enableMotor = true; - m_world->CreateJoint(&rjd); - - b2PrismaticJointDef pjd; - pjd.Initialize(ground, m_platform, b2Vec2(0.0f, 5.0f), b2Vec2(1.0f, 0.0f)); - - pjd.maxMotorForce = 1000.0f; - pjd.enableMotor = true; - pjd.lowerTranslation = -10.0f; - pjd.upperTranslation = 10.0f; - pjd.enableLimit = true; - - m_world->CreateJoint(&pjd); - - m_speed = 3.0f; - } - - // Create a payload - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 8.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(0.75f, 0.75f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.friction = 0.6f; - fd.density = 2.0f; - - body->CreateFixture(&fd); - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'd': - m_platform->SetType(b2_dynamicBody); - break; - - case 's': - m_platform->SetType(b2_staticBody); - break; - - case 'k': - m_platform->SetType(b2_kinematicBody); - m_platform->SetLinearVelocity(b2Vec2(-m_speed, 0.0f)); - m_platform->SetAngularVelocity(0.0f); - break; - } - } - - void Step(Settings* settings) - { - // Drive the kinematic body. - if (m_platform->GetType() == b2_kinematicBody) - { - b2Vec2 p = m_platform->GetTransform().p; - b2Vec2 v = m_platform->GetLinearVelocity(); - - if ((p.x < -10.0f && v.x < 0.0f) || - (p.x > 10.0f && v.x > 0.0f)) - { - v.x = -v.x; - m_platform->SetLinearVelocity(v); - } - } - - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Keys: (d) dynamic, (s) static, (k) kinematic"); - m_textLine += DRAW_STRING_NEW_LINE; - } - - static Test* Create() - { - return new BodyTypes; - } - - b2Body* m_attachment; - b2Body* m_platform; - float32 m_speed; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Breakable.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Breakable.h deleted file mode 100644 index 521ae7a090..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Breakable.h +++ /dev/null @@ -1,155 +0,0 @@ -/* -* Copyright (c) 2008-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef BREAKABLE_TEST_H -#define BREAKABLE_TEST_H - -// This is used to test sensor shapes. -class Breakable : public Test -{ -public: - - enum - { - e_count = 7 - }; - - Breakable() - { - // Ground body - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - // Breakable dynamic body - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 40.0f); - bd.angle = 0.25f * b2_pi; - m_body1 = m_world->CreateBody(&bd); - - m_shape1.SetAsBox(0.5f, 0.5f, b2Vec2(-0.5f, 0.0f), 0.0f); - m_piece1 = m_body1->CreateFixture(&m_shape1, 1.0f); - - m_shape2.SetAsBox(0.5f, 0.5f, b2Vec2(0.5f, 0.0f), 0.0f); - m_piece2 = m_body1->CreateFixture(&m_shape2, 1.0f); - } - - m_break = false; - m_broke = false; - } - - void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) - { - if (m_broke) - { - // The body already broke. - return; - } - - // Should the body break? - int32 count = contact->GetManifold()->pointCount; - - float32 maxImpulse = 0.0f; - for (int32 i = 0; i < count; ++i) - { - maxImpulse = b2Max(maxImpulse, impulse->normalImpulses[i]); - } - - if (maxImpulse > 40.0f) - { - // Flag the body for breaking. - m_break = true; - } - } - - void Break() - { - // Create two bodies from one. - b2Body* body1 = m_piece1->GetBody(); - b2Vec2 center = body1->GetWorldCenter(); - - body1->DestroyFixture(m_piece2); - m_piece2 = NULL; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position = body1->GetPosition(); - bd.angle = body1->GetAngle(); - - b2Body* body2 = m_world->CreateBody(&bd); - m_piece2 = body2->CreateFixture(&m_shape2, 1.0f); - - // Compute consistent velocities for new bodies based on - // cached velocity. - b2Vec2 center1 = body1->GetWorldCenter(); - b2Vec2 center2 = body2->GetWorldCenter(); - - b2Vec2 velocity1 = m_velocity + b2Cross(m_angularVelocity, center1 - center); - b2Vec2 velocity2 = m_velocity + b2Cross(m_angularVelocity, center2 - center); - - body1->SetAngularVelocity(m_angularVelocity); - body1->SetLinearVelocity(velocity1); - - body2->SetAngularVelocity(m_angularVelocity); - body2->SetLinearVelocity(velocity2); - } - - void Step(Settings* settings) - { - if (m_break) - { - Break(); - m_broke = true; - m_break = false; - } - - // Cache velocities to improve movement on breakage. - if (m_broke == false) - { - m_velocity = m_body1->GetLinearVelocity(); - m_angularVelocity = m_body1->GetAngularVelocity(); - } - - Test::Step(settings); - } - - static Test* Create() - { - return new Breakable; - } - - b2Body* m_body1; - b2Vec2 m_velocity; - float32 m_angularVelocity; - b2PolygonShape m_shape1; - b2PolygonShape m_shape2; - b2Fixture* m_piece1; - b2Fixture* m_piece2; - - bool m_broke; - bool m_break; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Bridge.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Bridge.h deleted file mode 100644 index 25492ce4cb..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Bridge.h +++ /dev/null @@ -1,125 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef BRIDGE_H -#define BRIDGE_H - -class Bridge : public Test -{ -public: - - enum - { - e_count = 30 - }; - - Bridge() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.125f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - fd.friction = 0.2f; - - b2RevoluteJointDef jd; - - b2Body* prevBody = ground; - for (int32 i = 0; i < e_count; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-14.5f + 1.0f * i, 5.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - - b2Vec2 anchor(-15.0f + 1.0f * i, 5.0f); - jd.Initialize(prevBody, body, anchor); - m_world->CreateJoint(&jd); - - if (i == (e_count >> 1)) - { - m_middle = body; - } - prevBody = body; - } - - b2Vec2 anchor(-15.0f + 1.0f * e_count, 5.0f); - jd.Initialize(prevBody, ground, anchor); - m_world->CreateJoint(&jd); - } - - for (int32 i = 0; i < 2; ++i) - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.5f, 0.0f); - vertices[1].Set(0.5f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - - b2PolygonShape shape; - shape.Set(vertices, 3); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-8.0f + 8.0f * i, 12.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - } - - for (int32 i = 0; i < 3; ++i) - { - b2CircleShape shape; - shape.m_radius = 0.5f; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-6.0f + 6.0f * i, 10.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - } - } - - static Test* Create() - { - return new Bridge; - } - - b2Body* m_middle; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/BulletTest.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/BulletTest.h deleted file mode 100644 index 6f246090c8..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/BulletTest.h +++ /dev/null @@ -1,136 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef BULLET_TEST_H -#define BULLET_TEST_H - -class BulletTest : public Test -{ -public: - - BulletTest() - { - { - b2BodyDef bd; - bd.position.Set(0.0f, 0.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2EdgeShape edge; - - edge.Set(b2Vec2(-10.0f, 0.0f), b2Vec2(10.0f, 0.0f)); - body->CreateFixture(&edge, 0.0f); - - b2PolygonShape shape; - shape.SetAsBox(0.2f, 1.0f, b2Vec2(0.5f, 1.0f), 0.0f); - body->CreateFixture(&shape, 0.0f); - } - - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 4.0f); - - b2PolygonShape box; - box.SetAsBox(2.0f, 0.1f); - - m_body = m_world->CreateBody(&bd); - m_body->CreateFixture(&box, 1.0f); - - box.SetAsBox(0.25f, 0.25f); - - //m_x = RandomFloat(-1.0f, 1.0f); - m_x = 0.20352793f; - bd.position.Set(m_x, 10.0f); - bd.bullet = true; - - m_bullet = m_world->CreateBody(&bd); - m_bullet->CreateFixture(&box, 100.0f); - - m_bullet->SetLinearVelocity(b2Vec2(0.0f, -50.0f)); - } - } - - void Launch() - { - m_body->SetTransform(b2Vec2(0.0f, 4.0f), 0.0f); - m_body->SetLinearVelocity(b2Vec2_zero); - m_body->SetAngularVelocity(0.0f); - - m_x = RandomFloat(-1.0f, 1.0f); - m_bullet->SetTransform(b2Vec2(m_x, 10.0f), 0.0f); - m_bullet->SetLinearVelocity(b2Vec2(0.0f, -50.0f)); - m_bullet->SetAngularVelocity(0.0f); - - extern int32 b2_gjkCalls, b2_gjkIters, b2_gjkMaxIters; - extern int32 b2_toiCalls, b2_toiIters, b2_toiMaxIters; - extern int32 b2_toiRootIters, b2_toiMaxRootIters; - - b2_gjkCalls = 0; - b2_gjkIters = 0; - b2_gjkMaxIters = 0; - - b2_toiCalls = 0; - b2_toiIters = 0; - b2_toiMaxIters = 0; - b2_toiRootIters = 0; - b2_toiMaxRootIters = 0; - } - - void Step(Settings* settings) - { - Test::Step(settings); - - extern int32 b2_gjkCalls, b2_gjkIters, b2_gjkMaxIters; - extern int32 b2_toiCalls, b2_toiIters; - extern int32 b2_toiRootIters, b2_toiMaxRootIters; - - if (b2_gjkCalls > 0) - { - m_debugDraw.DrawString(5, m_textLine, "gjk calls = %d, ave gjk iters = %3.1f, max gjk iters = %d", - b2_gjkCalls, b2_gjkIters / float32(b2_gjkCalls), b2_gjkMaxIters); - m_textLine += DRAW_STRING_NEW_LINE; - } - - if (b2_toiCalls > 0) - { - m_debugDraw.DrawString(5, m_textLine, "toi calls = %d, ave toi iters = %3.1f, max toi iters = %d", - b2_toiCalls, b2_toiIters / float32(b2_toiCalls), b2_toiMaxRootIters); - m_textLine += DRAW_STRING_NEW_LINE; - - m_debugDraw.DrawString(5, m_textLine, "ave toi root iters = %3.1f, max toi root iters = %d", - b2_toiRootIters / float32(b2_toiCalls), b2_toiMaxRootIters); - m_textLine += DRAW_STRING_NEW_LINE; - } - - if (m_stepCount % 60 == 0) - { - Launch(); - } - } - - static Test* Create() - { - return new BulletTest; - } - - b2Body* m_body; - b2Body* m_bullet; - float32 m_x; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Cantilever.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Cantilever.h deleted file mode 100644 index 5a0767984b..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Cantilever.h +++ /dev/null @@ -1,211 +0,0 @@ -/* -* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef CANTILEVER_H -#define CANTILEVER_H - -// It is difficult to make a cantilever made of links completely rigid with weld joints. -// You will have to use a high number of iterations to make them stiff. -// So why not go ahead and use soft weld joints? They behave like a revolute -// joint with a rotational spring. -class Cantilever : public Test -{ -public: - - enum - { - e_count = 8 - }; - - Cantilever() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.125f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - - b2WeldJointDef jd; - - b2Body* prevBody = ground; - for (int32 i = 0; i < e_count; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-14.5f + 1.0f * i, 5.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - - b2Vec2 anchor(-15.0f + 1.0f * i, 5.0f); - jd.Initialize(prevBody, body, anchor); - m_world->CreateJoint(&jd); - - prevBody = body; - } - } - - { - b2PolygonShape shape; - shape.SetAsBox(1.0f, 0.125f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - - b2WeldJointDef jd; - jd.frequencyHz = 5.0f; - jd.dampingRatio = 0.7f; - - b2Body* prevBody = ground; - for (int32 i = 0; i < 3; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-14.0f + 2.0f * i, 15.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - - b2Vec2 anchor(-15.0f + 2.0f * i, 15.0f); - jd.Initialize(prevBody, body, anchor); - m_world->CreateJoint(&jd); - - prevBody = body; - } - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.125f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - - b2WeldJointDef jd; - - b2Body* prevBody = ground; - for (int32 i = 0; i < e_count; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-4.5f + 1.0f * i, 5.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - - if (i > 0) - { - b2Vec2 anchor(-5.0f + 1.0f * i, 5.0f); - jd.Initialize(prevBody, body, anchor); - m_world->CreateJoint(&jd); - } - - prevBody = body; - } - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.125f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - - b2WeldJointDef jd; - jd.frequencyHz = 8.0f; - jd.dampingRatio = 0.7f; - - b2Body* prevBody = ground; - for (int32 i = 0; i < e_count; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(5.5f + 1.0f * i, 10.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - - if (i > 0) - { - b2Vec2 anchor(5.0f + 1.0f * i, 10.0f); - jd.Initialize(prevBody, body, anchor); - m_world->CreateJoint(&jd); - } - - prevBody = body; - } - } - - for (int32 i = 0; i < 2; ++i) - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.5f, 0.0f); - vertices[1].Set(0.5f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - - b2PolygonShape shape; - shape.Set(vertices, 3); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-8.0f + 8.0f * i, 12.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - } - - for (int32 i = 0; i < 2; ++i) - { - b2CircleShape shape; - shape.m_radius = 0.5f; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-6.0f + 6.0f * i, 10.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - } - } - - static Test* Create() - { - return new Cantilever; - } - - b2Body* m_middle; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Car.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Car.h deleted file mode 100644 index f4d038232f..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Car.h +++ /dev/null @@ -1,286 +0,0 @@ -/* -* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef CAR_H -#define CAR_H - -// This is a fun demo that shows off the wheel joint -class Car : public Test -{ -public: - Car() - { - m_hz = 4.0f; - m_zeta = 0.7f; - m_speed = 50.0f; - - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 0.0f; - fd.friction = 0.6f; - - shape.Set(b2Vec2(-20.0f, 0.0f), b2Vec2(20.0f, 0.0f)); - ground->CreateFixture(&fd); - - float32 hs[10] = {0.25f, 1.0f, 4.0f, 0.0f, 0.0f, -1.0f, -2.0f, -2.0f, -1.25f, 0.0f}; - - float32 x = 20.0f, y1 = 0.0f, dx = 5.0f; - - for (int32 i = 0; i < 10; ++i) - { - float32 y2 = hs[i]; - shape.Set(b2Vec2(x, y1), b2Vec2(x + dx, y2)); - ground->CreateFixture(&fd); - y1 = y2; - x += dx; - } - - for (int32 i = 0; i < 10; ++i) - { - float32 y2 = hs[i]; - shape.Set(b2Vec2(x, y1), b2Vec2(x + dx, y2)); - ground->CreateFixture(&fd); - y1 = y2; - x += dx; - } - - shape.Set(b2Vec2(x, 0.0f), b2Vec2(x + 40.0f, 0.0f)); - ground->CreateFixture(&fd); - - x += 80.0f; - shape.Set(b2Vec2(x, 0.0f), b2Vec2(x + 40.0f, 0.0f)); - ground->CreateFixture(&fd); - - x += 40.0f; - shape.Set(b2Vec2(x, 0.0f), b2Vec2(x + 10.0f, 5.0f)); - ground->CreateFixture(&fd); - - x += 20.0f; - shape.Set(b2Vec2(x, 0.0f), b2Vec2(x + 40.0f, 0.0f)); - ground->CreateFixture(&fd); - - x += 40.0f; - shape.Set(b2Vec2(x, 0.0f), b2Vec2(x, 20.0f)); - ground->CreateFixture(&fd); - } - - // Teeter - { - b2BodyDef bd; - bd.position.Set(140.0f, 1.0f); - bd.type = b2_dynamicBody; - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape box; - box.SetAsBox(10.0f, 0.25f); - body->CreateFixture(&box, 1.0f); - - b2RevoluteJointDef jd; - jd.Initialize(ground, body, body->GetPosition()); - jd.lowerAngle = -8.0f * b2_pi / 180.0f; - jd.upperAngle = 8.0f * b2_pi / 180.0f; - jd.enableLimit = true; - m_world->CreateJoint(&jd); - - body->ApplyAngularImpulse(100.0f, true); - } - - // Bridge - { - int32 N = 20; - b2PolygonShape shape; - shape.SetAsBox(1.0f, 0.125f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - fd.friction = 0.6f; - - b2RevoluteJointDef jd; - - b2Body* prevBody = ground; - for (int32 i = 0; i < N; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(161.0f + 2.0f * i, -0.125f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - - b2Vec2 anchor(160.0f + 2.0f * i, -0.125f); - jd.Initialize(prevBody, body, anchor); - m_world->CreateJoint(&jd); - - prevBody = body; - } - - b2Vec2 anchor(160.0f + 2.0f * N, -0.125f); - jd.Initialize(prevBody, ground, anchor); - m_world->CreateJoint(&jd); - } - - // Boxes - { - b2PolygonShape box; - box.SetAsBox(0.5f, 0.5f); - - b2Body* body = NULL; - b2BodyDef bd; - bd.type = b2_dynamicBody; - - bd.position.Set(230.0f, 0.5f); - body = m_world->CreateBody(&bd); - body->CreateFixture(&box, 0.5f); - - bd.position.Set(230.0f, 1.5f); - body = m_world->CreateBody(&bd); - body->CreateFixture(&box, 0.5f); - - bd.position.Set(230.0f, 2.5f); - body = m_world->CreateBody(&bd); - body->CreateFixture(&box, 0.5f); - - bd.position.Set(230.0f, 3.5f); - body = m_world->CreateBody(&bd); - body->CreateFixture(&box, 0.5f); - - bd.position.Set(230.0f, 4.5f); - body = m_world->CreateBody(&bd); - body->CreateFixture(&box, 0.5f); - } - - // Car - { - b2PolygonShape chassis; - b2Vec2 vertices[8]; - vertices[0].Set(-1.5f, -0.5f); - vertices[1].Set(1.5f, -0.5f); - vertices[2].Set(1.5f, 0.0f); - vertices[3].Set(0.0f, 0.9f); - vertices[4].Set(-1.15f, 0.9f); - vertices[5].Set(-1.5f, 0.2f); - chassis.Set(vertices, 6); - - b2CircleShape circle; - circle.m_radius = 0.4f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 1.0f); - m_car = m_world->CreateBody(&bd); - m_car->CreateFixture(&chassis, 1.0f); - - b2FixtureDef fd; - fd.shape = &circle; - fd.density = 1.0f; - fd.friction = 0.9f; - - bd.position.Set(-1.0f, 0.35f); - m_wheel1 = m_world->CreateBody(&bd); - m_wheel1->CreateFixture(&fd); - - bd.position.Set(1.0f, 0.4f); - m_wheel2 = m_world->CreateBody(&bd); - m_wheel2->CreateFixture(&fd); - - b2WheelJointDef jd; - b2Vec2 axis(0.0f, 1.0f); - - jd.Initialize(m_car, m_wheel1, m_wheel1->GetPosition(), axis); - jd.motorSpeed = 0.0f; - jd.maxMotorTorque = 20.0f; - jd.enableMotor = true; - jd.frequencyHz = m_hz; - jd.dampingRatio = m_zeta; - m_spring1 = (b2WheelJoint*)m_world->CreateJoint(&jd); - - jd.Initialize(m_car, m_wheel2, m_wheel2->GetPosition(), axis); - jd.motorSpeed = 0.0f; - jd.maxMotorTorque = 10.0f; - jd.enableMotor = false; - jd.frequencyHz = m_hz; - jd.dampingRatio = m_zeta; - m_spring2 = (b2WheelJoint*)m_world->CreateJoint(&jd); - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'a': - m_spring1->SetMotorSpeed(m_speed); - break; - - case 's': - m_spring1->SetMotorSpeed(0.0f); - break; - - case 'd': - m_spring1->SetMotorSpeed(-m_speed); - break; - - case 'q': - m_hz = b2Max(0.0f, m_hz - 1.0f); - m_spring1->SetSpringFrequencyHz(m_hz); - m_spring2->SetSpringFrequencyHz(m_hz); - break; - - case 'e': - m_hz += 1.0f; - m_spring1->SetSpringFrequencyHz(m_hz); - m_spring2->SetSpringFrequencyHz(m_hz); - break; - } - } - - void Step(Settings* settings) - { - m_debugDraw.DrawString(5, m_textLine, "Keys: left = a, brake = s, right = d, hz down = q, hz up = e"); - m_textLine += DRAW_STRING_NEW_LINE; - m_debugDraw.DrawString(5, m_textLine, "frequency = %g hz, damping ratio = %g", m_hz, m_zeta); - m_textLine += DRAW_STRING_NEW_LINE; - - settings->viewCenter.x = m_car->GetPosition().x; - Test::Step(settings); - } - - static Test* Create() - { - return new Car; - } - - b2Body* m_car; - b2Body* m_wheel1; - b2Body* m_wheel2; - - float32 m_hz; - float32 m_zeta; - float32 m_speed; - b2WheelJoint* m_spring1; - b2WheelJoint* m_spring2; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Chain.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Chain.h deleted file mode 100644 index de4414f849..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Chain.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef CHAIN_H -#define CHAIN_H - -class Chain : public Test -{ -public: - Chain() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.6f, 0.125f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - fd.friction = 0.2f; - - b2RevoluteJointDef jd; - jd.collideConnected = false; - - const float32 y = 25.0f; - b2Body* prevBody = ground; - for (int32 i = 0; i < 30; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.5f + i, y); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - - b2Vec2 anchor(float32(i), y); - jd.Initialize(prevBody, body, anchor); - m_world->CreateJoint(&jd); - - prevBody = body; - } - } - } - - static Test* Create() - { - return new Chain; - } -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/CharacterCollision.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/CharacterCollision.h deleted file mode 100644 index 541c84f516..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/CharacterCollision.h +++ /dev/null @@ -1,253 +0,0 @@ -/* -* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef CHARACTER_COLLISION_H -#define CHARACTER_COLLISION_H - -/// This is a test of typical character collision scenarios. This does not -/// show how you should implement a character in your application. -/// Instead this is used to test smooth collision on edge chains. -class CharacterCollision : public Test -{ -public: - CharacterCollision() - { - // Ground body - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-20.0f, 0.0f), b2Vec2(20.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - // Collinear edges with no adjacency information. - // This shows the problematic case where a box shape can hit - // an internal vertex. - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-8.0f, 1.0f), b2Vec2(-6.0f, 1.0f)); - ground->CreateFixture(&shape, 0.0f); - shape.Set(b2Vec2(-6.0f, 1.0f), b2Vec2(-4.0f, 1.0f)); - ground->CreateFixture(&shape, 0.0f); - shape.Set(b2Vec2(-4.0f, 1.0f), b2Vec2(-2.0f, 1.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - // Chain shape - { - b2BodyDef bd; - bd.angle = 0.25f * b2_pi; - b2Body* ground = m_world->CreateBody(&bd); - - b2Vec2 vs[4]; - vs[0].Set(5.0f, 7.0f); - vs[1].Set(6.0f, 8.0f); - vs[2].Set(7.0f, 8.0f); - vs[3].Set(8.0f, 7.0f); - b2ChainShape shape; - shape.CreateChain(vs, 4); - ground->CreateFixture(&shape, 0.0f); - } - - // Square tiles. This shows that adjacency shapes may - // have non-smooth collision. There is no solution - // to this problem. - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(1.0f, 1.0f, b2Vec2(4.0f, 3.0f), 0.0f); - ground->CreateFixture(&shape, 0.0f); - shape.SetAsBox(1.0f, 1.0f, b2Vec2(6.0f, 3.0f), 0.0f); - ground->CreateFixture(&shape, 0.0f); - shape.SetAsBox(1.0f, 1.0f, b2Vec2(8.0f, 3.0f), 0.0f); - ground->CreateFixture(&shape, 0.0f); - } - - // Square made from an edge loop. Collision should be smooth. - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2Vec2 vs[4]; - vs[0].Set(-1.0f, 3.0f); - vs[1].Set(1.0f, 3.0f); - vs[2].Set(1.0f, 5.0f); - vs[3].Set(-1.0f, 5.0f); - b2ChainShape shape; - shape.CreateLoop(vs, 4); - ground->CreateFixture(&shape, 0.0f); - } - - // Edge loop. Collision should be smooth. - { - b2BodyDef bd; - bd.position.Set(-10.0f, 4.0f); - b2Body* ground = m_world->CreateBody(&bd); - - b2Vec2 vs[10]; - vs[0].Set(0.0f, 0.0f); - vs[1].Set(6.0f, 0.0f); - vs[2].Set(6.0f, 2.0f); - vs[3].Set(4.0f, 1.0f); - vs[4].Set(2.0f, 2.0f); - vs[5].Set(0.0f, 2.0f); - vs[6].Set(-2.0f, 2.0f); - vs[7].Set(-4.0f, 3.0f); - vs[8].Set(-6.0f, 2.0f); - vs[9].Set(-6.0f, 0.0f); - b2ChainShape shape; - shape.CreateLoop(vs, 10); - ground->CreateFixture(&shape, 0.0f); - } - - // Square character 1 - { - b2BodyDef bd; - bd.position.Set(-3.0f, 8.0f); - bd.type = b2_dynamicBody; - bd.fixedRotation = true; - bd.allowSleep = false; - - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.5f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - body->CreateFixture(&fd); - } - - // Square character 2 - { - b2BodyDef bd; - bd.position.Set(-5.0f, 5.0f); - bd.type = b2_dynamicBody; - bd.fixedRotation = true; - bd.allowSleep = false; - - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(0.25f, 0.25f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - body->CreateFixture(&fd); - } - - // Hexagon character - { - b2BodyDef bd; - bd.position.Set(-5.0f, 8.0f); - bd.type = b2_dynamicBody; - bd.fixedRotation = true; - bd.allowSleep = false; - - b2Body* body = m_world->CreateBody(&bd); - - float32 angle = 0.0f; - float32 delta = b2_pi / 3.0f; - b2Vec2 vertices[6]; - for (int32 i = 0; i < 6; ++i) - { - vertices[i].Set(0.5f * cosf(angle), 0.5f * sinf(angle)); - angle += delta; - } - - b2PolygonShape shape; - shape.Set(vertices, 6); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - body->CreateFixture(&fd); - } - - // Circle character - { - b2BodyDef bd; - bd.position.Set(3.0f, 5.0f); - bd.type = b2_dynamicBody; - bd.fixedRotation = true; - bd.allowSleep = false; - - b2Body* body = m_world->CreateBody(&bd); - - b2CircleShape shape; - shape.m_radius = 0.5f; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - body->CreateFixture(&fd); - } - - // Circle character - { - b2BodyDef bd; - bd.position.Set(-7.0f, 6.0f); - bd.type = b2_dynamicBody; - bd.allowSleep = false; - - m_character = m_world->CreateBody(&bd); - - b2CircleShape shape; - shape.m_radius = 0.25f; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - fd.friction = 1.0f; - m_character->CreateFixture(&fd); - } - } - - void Step(Settings* settings) - { - b2Vec2 v = m_character->GetLinearVelocity(); - v.x = -5.0f; - m_character->SetLinearVelocity(v); - - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "This tests various character collision shapes."); - m_textLine += DRAW_STRING_NEW_LINE; - m_debugDraw.DrawString(5, m_textLine, "Limitation: square and hexagon can snag on aligned boxes."); - m_textLine += DRAW_STRING_NEW_LINE; - m_debugDraw.DrawString(5, m_textLine, "Feature: edge chains have smooth collision inside and out."); - m_textLine += DRAW_STRING_NEW_LINE; - } - - static Test* Create() - { - return new CharacterCollision; - } - - b2Body* m_character; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/CollisionFiltering.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/CollisionFiltering.h deleted file mode 100644 index 8a11dc195f..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/CollisionFiltering.h +++ /dev/null @@ -1,177 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef COLLISION_FILTERING_H -#define COLLISION_FILTERING_H - -// This is a test of collision filtering. -// There is a triangle, a box, and a circle. -// There are 6 shapes. 3 large and 3 small. -// The 3 small ones always collide. -// The 3 large ones never collide. -// The boxes don't collide with triangles (except if both are small). -const int16 k_smallGroup = 1; -const int16 k_largeGroup = -1; - -const uint16 k_defaultCategory = 0x0001; -const uint16 k_triangleCategory = 0x0002; -const uint16 k_boxCategory = 0x0004; -const uint16 k_circleCategory = 0x0008; - -const uint16 k_triangleMask = 0xFFFF; -const uint16 k_boxMask = 0xFFFF ^ k_triangleCategory; -const uint16 k_circleMask = 0xFFFF; - -class CollisionFiltering : public Test -{ -public: - CollisionFiltering() - { - // Ground body - { - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - - b2FixtureDef sd; - sd.shape = &shape; - sd.friction = 0.3f; - - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&sd); - } - - // Small triangle - b2Vec2 vertices[3]; - vertices[0].Set(-1.0f, 0.0f); - vertices[1].Set(1.0f, 0.0f); - vertices[2].Set(0.0f, 2.0f); - b2PolygonShape polygon; - polygon.Set(vertices, 3); - - b2FixtureDef triangleShapeDef; - triangleShapeDef.shape = &polygon; - triangleShapeDef.density = 1.0f; - - triangleShapeDef.filter.groupIndex = k_smallGroup; - triangleShapeDef.filter.categoryBits = k_triangleCategory; - triangleShapeDef.filter.maskBits = k_triangleMask; - - b2BodyDef triangleBodyDef; - triangleBodyDef.type = b2_dynamicBody; - triangleBodyDef.position.Set(-5.0f, 2.0f); - - b2Body* body1 = m_world->CreateBody(&triangleBodyDef); - body1->CreateFixture(&triangleShapeDef); - - // Large triangle (recycle definitions) - vertices[0] *= 2.0f; - vertices[1] *= 2.0f; - vertices[2] *= 2.0f; - polygon.Set(vertices, 3); - triangleShapeDef.filter.groupIndex = k_largeGroup; - triangleBodyDef.position.Set(-5.0f, 6.0f); - triangleBodyDef.fixedRotation = true; // look at me! - - b2Body* body2 = m_world->CreateBody(&triangleBodyDef); - body2->CreateFixture(&triangleShapeDef); - - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-5.0f, 10.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape p; - p.SetAsBox(0.5f, 1.0f); - body->CreateFixture(&p, 1.0f); - - b2PrismaticJointDef jd; - jd.bodyA = body2; - jd.bodyB = body; - jd.enableLimit = true; - jd.localAnchorA.Set(0.0f, 4.0f); - jd.localAnchorB.SetZero(); - jd.localAxisA.Set(0.0f, 1.0f); - jd.lowerTranslation = -1.0f; - jd.upperTranslation = 1.0f; - - m_world->CreateJoint(&jd); - } - - // Small box - polygon.SetAsBox(1.0f, 0.5f); - b2FixtureDef boxShapeDef; - boxShapeDef.shape = &polygon; - boxShapeDef.density = 1.0f; - boxShapeDef.restitution = 0.1f; - - boxShapeDef.filter.groupIndex = k_smallGroup; - boxShapeDef.filter.categoryBits = k_boxCategory; - boxShapeDef.filter.maskBits = k_boxMask; - - b2BodyDef boxBodyDef; - boxBodyDef.type = b2_dynamicBody; - boxBodyDef.position.Set(0.0f, 2.0f); - - b2Body* body3 = m_world->CreateBody(&boxBodyDef); - body3->CreateFixture(&boxShapeDef); - - // Large box (recycle definitions) - polygon.SetAsBox(2.0f, 1.0f); - boxShapeDef.filter.groupIndex = k_largeGroup; - boxBodyDef.position.Set(0.0f, 6.0f); - - b2Body* body4 = m_world->CreateBody(&boxBodyDef); - body4->CreateFixture(&boxShapeDef); - - // Small circle - b2CircleShape circle; - circle.m_radius = 1.0f; - - b2FixtureDef circleShapeDef; - circleShapeDef.shape = &circle; - circleShapeDef.density = 1.0f; - - circleShapeDef.filter.groupIndex = k_smallGroup; - circleShapeDef.filter.categoryBits = k_circleCategory; - circleShapeDef.filter.maskBits = k_circleMask; - - b2BodyDef circleBodyDef; - circleBodyDef.type = b2_dynamicBody; - circleBodyDef.position.Set(5.0f, 2.0f); - - b2Body* body5 = m_world->CreateBody(&circleBodyDef); - body5->CreateFixture(&circleShapeDef); - - // Large circle - circle.m_radius *= 2.0f; - circleShapeDef.filter.groupIndex = k_largeGroup; - circleBodyDef.position.Set(5.0f, 6.0f); - - b2Body* body6 = m_world->CreateBody(&circleBodyDef); - body6->CreateFixture(&circleShapeDef); - } - - static Test* Create() - { - return new CollisionFiltering; - } -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/CollisionProcessing.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/CollisionProcessing.h deleted file mode 100644 index 96d4b2bdf2..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/CollisionProcessing.h +++ /dev/null @@ -1,188 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef COLLISION_PROCESSING_H -#define COLLISION_PROCESSING_H - -#include - -// This test shows collision processing and tests -// deferred body destruction. -class CollisionProcessing : public Test -{ -public: - CollisionProcessing() - { - // Ground body - { - b2EdgeShape shape; - shape.Set(b2Vec2(-50.0f, 0.0f), b2Vec2(50.0f, 0.0f)); - - b2FixtureDef sd; - sd.shape = &shape; - - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&sd); - } - - float32 xLo = -5.0f, xHi = 5.0f; - float32 yLo = 2.0f, yHi = 35.0f; - - // Small triangle - b2Vec2 vertices[3]; - vertices[0].Set(-1.0f, 0.0f); - vertices[1].Set(1.0f, 0.0f); - vertices[2].Set(0.0f, 2.0f); - - b2PolygonShape polygon; - polygon.Set(vertices, 3); - - b2FixtureDef triangleShapeDef; - triangleShapeDef.shape = &polygon; - triangleShapeDef.density = 1.0f; - - b2BodyDef triangleBodyDef; - triangleBodyDef.type = b2_dynamicBody; - triangleBodyDef.position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); - - b2Body* body1 = m_world->CreateBody(&triangleBodyDef); - body1->CreateFixture(&triangleShapeDef); - - // Large triangle (recycle definitions) - vertices[0] *= 2.0f; - vertices[1] *= 2.0f; - vertices[2] *= 2.0f; - polygon.Set(vertices, 3); - - triangleBodyDef.position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); - - b2Body* body2 = m_world->CreateBody(&triangleBodyDef); - body2->CreateFixture(&triangleShapeDef); - - // Small box - polygon.SetAsBox(1.0f, 0.5f); - - b2FixtureDef boxShapeDef; - boxShapeDef.shape = &polygon; - boxShapeDef.density = 1.0f; - - b2BodyDef boxBodyDef; - boxBodyDef.type = b2_dynamicBody; - boxBodyDef.position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); - - b2Body* body3 = m_world->CreateBody(&boxBodyDef); - body3->CreateFixture(&boxShapeDef); - - // Large box (recycle definitions) - polygon.SetAsBox(2.0f, 1.0f); - boxBodyDef.position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); - - b2Body* body4 = m_world->CreateBody(&boxBodyDef); - body4->CreateFixture(&boxShapeDef); - - // Small circle - b2CircleShape circle; - circle.m_radius = 1.0f; - - b2FixtureDef circleShapeDef; - circleShapeDef.shape = &circle; - circleShapeDef.density = 1.0f; - - b2BodyDef circleBodyDef; - circleBodyDef.type = b2_dynamicBody; - circleBodyDef.position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); - - b2Body* body5 = m_world->CreateBody(&circleBodyDef); - body5->CreateFixture(&circleShapeDef); - - // Large circle - circle.m_radius *= 2.0f; - circleBodyDef.position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); - - b2Body* body6 = m_world->CreateBody(&circleBodyDef); - body6->CreateFixture(&circleShapeDef); - } - - void Step(Settings* settings) - { - Test::Step(settings); - - // We are going to destroy some bodies according to contact - // points. We must buffer the bodies that should be destroyed - // because they may belong to multiple contact points. - const int32 k_maxNuke = 6; - b2Body* nuke[k_maxNuke]; - int32 nukeCount = 0; - - // Traverse the contact results. Destroy bodies that - // are touching heavier bodies. - for (int32 i = 0; i < m_pointCount; ++i) - { - ContactPoint* point = m_points + i; - - b2Body* body1 = point->fixtureA->GetBody(); - b2Body* body2 = point->fixtureB->GetBody(); - float32 mass1 = body1->GetMass(); - float32 mass2 = body2->GetMass(); - - if (mass1 > 0.0f && mass2 > 0.0f) - { - if (mass2 > mass1) - { - nuke[nukeCount++] = body1; - } - else - { - nuke[nukeCount++] = body2; - } - - if (nukeCount == k_maxNuke) - { - break; - } - } - } - - // Sort the nuke array to group duplicates. - std::sort(nuke, nuke + nukeCount); - - // Destroy the bodies, skipping duplicates. - int32 i = 0; - while (i < nukeCount) - { - b2Body* b = nuke[i++]; - while (i < nukeCount && nuke[i] == b) - { - ++i; - } - - if (b != m_bomb) - { - m_world->DestroyBody(b); - } - } - } - - static Test* Create() - { - return new CollisionProcessing; - } -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/CompoundShapes.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/CompoundShapes.h deleted file mode 100644 index bdba8a60d5..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/CompoundShapes.h +++ /dev/null @@ -1,143 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef COMPOUND_SHAPES_H -#define COMPOUND_SHAPES_H - -// TODO_ERIN test joints on compounds. -class CompoundShapes : public Test -{ -public: - CompoundShapes() - { - { - b2BodyDef bd; - bd.position.Set(0.0f, 0.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(50.0f, 0.0f), b2Vec2(-50.0f, 0.0f)); - - body->CreateFixture(&shape, 0.0f); - } - - { - b2CircleShape circle1; - circle1.m_radius = 0.5f; - circle1.m_p.Set(-0.5f, 0.5f); - - b2CircleShape circle2; - circle2.m_radius = 0.5f; - circle2.m_p.Set(0.5f, 0.5f); - - for (int i = 0; i < 10; ++i) - { - float32 x = RandomFloat(-0.1f, 0.1f); - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(x + 5.0f, 1.05f + 2.5f * i); - bd.angle = RandomFloat(-b2_pi, b2_pi); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&circle1, 2.0f); - body->CreateFixture(&circle2, 0.0f); - } - } - - { - b2PolygonShape polygon1; - polygon1.SetAsBox(0.25f, 0.5f); - - b2PolygonShape polygon2; - polygon2.SetAsBox(0.25f, 0.5f, b2Vec2(0.0f, -0.5f), 0.5f * b2_pi); - - for (int i = 0; i < 10; ++i) - { - float32 x = RandomFloat(-0.1f, 0.1f); - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(x - 5.0f, 1.05f + 2.5f * i); - bd.angle = RandomFloat(-b2_pi, b2_pi); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&polygon1, 2.0f); - body->CreateFixture(&polygon2, 2.0f); - } - } - - { - b2Transform xf1; - xf1.q.Set(0.3524f * b2_pi); - xf1.p = xf1.q.GetXAxis(); - - b2Vec2 vertices[3]; - - b2PolygonShape triangle1; - vertices[0] = b2Mul(xf1, b2Vec2(-1.0f, 0.0f)); - vertices[1] = b2Mul(xf1, b2Vec2(1.0f, 0.0f)); - vertices[2] = b2Mul(xf1, b2Vec2(0.0f, 0.5f)); - triangle1.Set(vertices, 3); - - b2Transform xf2; - xf2.q.Set(-0.3524f * b2_pi); - xf2.p = -xf2.q.GetXAxis(); - - b2PolygonShape triangle2; - vertices[0] = b2Mul(xf2, b2Vec2(-1.0f, 0.0f)); - vertices[1] = b2Mul(xf2, b2Vec2(1.0f, 0.0f)); - vertices[2] = b2Mul(xf2, b2Vec2(0.0f, 0.5f)); - triangle2.Set(vertices, 3); - - for (int32 i = 0; i < 10; ++i) - { - float32 x = RandomFloat(-0.1f, 0.1f); - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(x, 2.05f + 2.5f * i); - bd.angle = 0.0f; - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&triangle1, 2.0f); - body->CreateFixture(&triangle2, 2.0f); - } - } - - { - b2PolygonShape bottom; - bottom.SetAsBox( 1.5f, 0.15f ); - - b2PolygonShape left; - left.SetAsBox(0.15f, 2.7f, b2Vec2(-1.45f, 2.35f), 0.2f); - - b2PolygonShape right; - right.SetAsBox(0.15f, 2.7f, b2Vec2(1.45f, 2.35f), -0.2f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set( 0.0f, 2.0f ); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&bottom, 4.0f); - body->CreateFixture(&left, 4.0f); - body->CreateFixture(&right, 4.0f); - } - } - - static Test* Create() - { - return new CompoundShapes; - } -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Confined.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Confined.h deleted file mode 100644 index 6f7aefaec2..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Confined.h +++ /dev/null @@ -1,167 +0,0 @@ -/* -* Copyright (c) 2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef CONFINED_H -#define CONFINED_H - -class Confined : public Test -{ -public: - - enum - { - e_columnCount = 20, - e_rowCount = 10 - }; - - Confined() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - - // Floor - shape.Set(b2Vec2(-10.0f, 0.0f), b2Vec2(10.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - - // Left wall - shape.Set(b2Vec2(-10.0f, 0.0f), b2Vec2(-10.0f, 20.0f)); - ground->CreateFixture(&shape, 0.0f); - - // Right wall - shape.Set(b2Vec2(10.0f, 0.0f), b2Vec2(10.0f, 20.0f)); - ground->CreateFixture(&shape, 0.0f); - - // Roof - shape.Set(b2Vec2(-10.0f, 20.0f), b2Vec2(10.0f, 20.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - float32 radius = 0.5f; - b2CircleShape shape; - shape.m_p.SetZero(); - shape.m_radius = radius; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - fd.friction = 0.1f; - - for (int32 j = 0; j < e_columnCount; ++j) - { - for (int i = 0; i < e_rowCount; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-10.0f + (2.1f * j + 1.0f + 0.01f * i) * radius, (2.0f * i + 1.0f) * radius); - b2Body* body = m_world->CreateBody(&bd); - - body->CreateFixture(&fd); - } - } - - m_world->SetGravity(b2Vec2(0.0f, 0.0f)); - } - - void CreateCircle() - { - float32 radius = 2.0f; - b2CircleShape shape; - shape.m_p.SetZero(); - shape.m_radius = radius; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - fd.friction = 0.0f; - - b2Vec2 p(RandomFloat(), 3.0f + RandomFloat()); - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position = p; - //bd.allowSleep = false; - b2Body* body = m_world->CreateBody(&bd); - - body->CreateFixture(&fd); - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'c': - CreateCircle(); - break; - } - } - - void Step(Settings* settings) - { - bool sleeping = true; - for (b2Body* b = m_world->GetBodyList(); b; b = b->GetNext()) - { - if (b->GetType() != b2_dynamicBody) - { - continue; - } - - if (b->IsAwake()) - { - sleeping = false; - } - } - - if (m_stepCount == 180) - { - m_stepCount += 0; - } - - //if (sleeping) - //{ - // CreateCircle(); - //} - - Test::Step(settings); - - for (b2Body* b = m_world->GetBodyList(); b; b = b->GetNext()) - { - if (b->GetType() != b2_dynamicBody) - { - continue; - } - - b2Vec2 p = b->GetPosition(); - if (p.x <= -10.0f || 10.0f <= p.x || p.y <= 0.0f || 20.0f <= p.y) - { - p.x += 0.0f; - } - } - - m_debugDraw.DrawString(5, m_textLine, "Press 'c' to create a circle."); - m_textLine += DRAW_STRING_NEW_LINE; - } - - static Test* Create() - { - return new Confined; - } -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/ContinuousTest.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/ContinuousTest.h deleted file mode 100644 index 7165aac374..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/ContinuousTest.h +++ /dev/null @@ -1,157 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef CONTINUOUS_TEST_H -#define CONTINUOUS_TEST_H - -class ContinuousTest : public Test -{ -public: - - ContinuousTest() - { - { - b2BodyDef bd; - bd.position.Set(0.0f, 0.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2EdgeShape edge; - - edge.Set(b2Vec2(-10.0f, 0.0f), b2Vec2(10.0f, 0.0f)); - body->CreateFixture(&edge, 0.0f); - - b2PolygonShape shape; - shape.SetAsBox(0.2f, 1.0f, b2Vec2(0.5f, 1.0f), 0.0f); - body->CreateFixture(&shape, 0.0f); - } - -#if 1 - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 20.0f); - //bd.angle = 0.1f; - - b2PolygonShape shape; - shape.SetAsBox(2.0f, 0.1f); - - m_body = m_world->CreateBody(&bd); - m_body->CreateFixture(&shape, 1.0f); - - m_angularVelocity = RandomFloat(-50.0f, 50.0f); - //m_angularVelocity = 46.661274f; - m_body->SetLinearVelocity(b2Vec2(0.0f, -100.0f)); - m_body->SetAngularVelocity(m_angularVelocity); - } -#else - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 2.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2CircleShape shape; - shape.m_p.SetZero(); - shape.m_radius = 0.5f; - body->CreateFixture(&shape, 1.0f); - - bd.bullet = true; - bd.position.Set(0.0f, 10.0f); - body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 1.0f); - body->SetLinearVelocity(b2Vec2(0.0f, -100.0f)); - } -#endif - - extern int32 b2_gjkCalls, b2_gjkIters, b2_gjkMaxIters; - extern int32 b2_toiCalls, b2_toiIters; - extern int32 b2_toiRootIters, b2_toiMaxRootIters; - extern float32 b2_toiTime, b2_toiMaxTime; - - b2_gjkCalls = 0; b2_gjkIters = 0; b2_gjkMaxIters = 0; - b2_toiCalls = 0; b2_toiIters = 0; - b2_toiRootIters = 0; b2_toiMaxRootIters = 0; - b2_toiTime = 0.0f; b2_toiMaxTime = 0.0f; - } - - void Launch() - { - extern int32 b2_gjkCalls, b2_gjkIters, b2_gjkMaxIters; - extern int32 b2_toiCalls, b2_toiIters; - extern int32 b2_toiRootIters, b2_toiMaxRootIters; - extern float32 b2_toiTime, b2_toiMaxTime; - - b2_gjkCalls = 0; b2_gjkIters = 0; b2_gjkMaxIters = 0; - b2_toiCalls = 0; b2_toiIters = 0; - b2_toiRootIters = 0; b2_toiMaxRootIters = 0; - b2_toiTime = 0.0f; b2_toiMaxTime = 0.0f; - - m_body->SetTransform(b2Vec2(0.0f, 20.0f), 0.0f); - m_angularVelocity = RandomFloat(-50.0f, 50.0f); - m_body->SetLinearVelocity(b2Vec2(0.0f, -100.0f)); - m_body->SetAngularVelocity(m_angularVelocity); - } - - void Step(Settings* settings) - { - Test::Step(settings); - - extern int32 b2_gjkCalls, b2_gjkIters, b2_gjkMaxIters; - - if (b2_gjkCalls > 0) - { - m_debugDraw.DrawString(5, m_textLine, "gjk calls = %d, ave gjk iters = %3.1f, max gjk iters = %d", - b2_gjkCalls, b2_gjkIters / float32(b2_gjkCalls), b2_gjkMaxIters); - m_textLine += DRAW_STRING_NEW_LINE; - } - - extern int32 b2_toiCalls, b2_toiIters; - extern int32 b2_toiRootIters, b2_toiMaxRootIters; - extern float32 b2_toiTime, b2_toiMaxTime; - - if (b2_toiCalls > 0) - { - m_debugDraw.DrawString(5, m_textLine, "toi calls = %d, ave [max] toi iters = %3.1f [%d]", - b2_toiCalls, b2_toiIters / float32(b2_toiCalls), b2_toiMaxRootIters); - m_textLine += DRAW_STRING_NEW_LINE; - - m_debugDraw.DrawString(5, m_textLine, "ave [max] toi root iters = %3.1f [%d]", - b2_toiRootIters / float32(b2_toiCalls), b2_toiMaxRootIters); - m_textLine += DRAW_STRING_NEW_LINE; - - m_debugDraw.DrawString(5, m_textLine, "ave [max] toi time = %.1f [%.1f] (microseconds)", - 1000.0f * b2_toiTime / float32(b2_toiCalls), 1000.0f * b2_toiMaxTime); - m_textLine += DRAW_STRING_NEW_LINE; - } - - if (m_stepCount % 60 == 0) - { - //Launch(); - } - } - - static Test* Create() - { - return new ContinuousTest; - } - - b2Body* m_body; - float32 m_angularVelocity; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/ConvexHull.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/ConvexHull.h deleted file mode 100644 index fc5742892b..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/ConvexHull.h +++ /dev/null @@ -1,116 +0,0 @@ -/* -* Copyright (c) 2011 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef CONVEX_HULL_H -#define CONVEX_HULL_H - -class ConvexHull : public Test -{ -public: - enum - { - e_count = b2_maxPolygonVertices - }; - - ConvexHull() - { - Generate(); - m_auto = false; - } - - void Generate() - { - b2Vec2 lowerBound(-8.0f, -8.0f); - b2Vec2 upperBound(8.0f, 8.0f); - - for (int32 i = 0; i < e_count; ++i) - { - float32 x = 10.0f * RandomFloat(); - float32 y = 10.0f * RandomFloat(); - - // Clamp onto a square to help create collinearities. - // This will stress the convex hull algorithm. - b2Vec2 v(x, y); - v = b2Clamp(v, lowerBound, upperBound); - m_points[i] = v; - } - - m_count = e_count; - - m_points[0].Set( -1.70082211f, -1.43221712f ); - m_points[1].Set( 0.5f, -0.5f ); - m_points[2].Set( 0.104992867f, 0.97400856f ); - m_points[3].Set( -0.658002853f, 0.926608086f ); - m_points[4].Set( -0.994554818f, 0.165337861f ); - m_count = 5; - } - - static Test* Create() - { - return new ConvexHull; - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'a': - m_auto = !m_auto; - break; - - case 'g': - Generate(); - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - - b2PolygonShape shape; - shape.Set(m_points, m_count); - - m_debugDraw.DrawString(5, m_textLine, "Press g to generate a new random convex hull"); - m_textLine += DRAW_STRING_NEW_LINE; - - m_debugDraw.DrawPolygon(shape.m_vertices, shape.m_count, b2Color(0.9f, 0.9f, 0.9f)); - - for (int32 i = 0; i < m_count; ++i) - { - m_debugDraw.DrawPoint(m_points[i], 2.0f, b2Color(0.9f, 0.5f, 0.5f)); - //m_debugDraw.DrawString(m_points[i] + b2Vec2(0.05f, 0.05f), "%d", i); - } - - if (shape.Validate() == false) - { - m_textLine += 0; - } - - if (m_auto) - { - Generate(); - } - } - - b2Vec2 m_points[b2_maxPolygonVertices]; - int32 m_count; - bool m_auto; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/ConveyorBelt.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/ConveyorBelt.h deleted file mode 100644 index 01ddc94043..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/ConveyorBelt.h +++ /dev/null @@ -1,98 +0,0 @@ -/* -* Copyright (c) 2011 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef CONVEYOR_BELT_H -#define CONVEYOR_BELT_H - -class ConveyorBelt : public Test -{ -public: - - ConveyorBelt() - { - // Ground - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-20.0f, 0.0f), b2Vec2(20.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - // Platform - { - b2BodyDef bd; - bd.position.Set(-5.0f, 5.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(10.0f, 0.5f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.friction = 0.8f; - m_platform = body->CreateFixture(&fd); - } - - // Boxes - for (int32 i = 0; i < 5; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-10.0f + 2.0f * i, 7.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.5f); - body->CreateFixture(&shape, 20.0f); - } - } - - void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) - { - Test::PreSolve(contact, oldManifold); - - b2Fixture* fixtureA = contact->GetFixtureA(); - b2Fixture* fixtureB = contact->GetFixtureB(); - - if (fixtureA == m_platform) - { - contact->SetTangentSpeed(5.0f); - } - - if (fixtureB == m_platform) - { - contact->SetTangentSpeed(-5.0f); - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - } - - static Test* Create() - { - return new ConveyorBelt; - } - - b2Fixture* m_platform; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/DistanceTest.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/DistanceTest.h deleted file mode 100644 index de8c720a3d..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/DistanceTest.h +++ /dev/null @@ -1,135 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef DISTANCE_TEST_H -#define DISTANCE_TEST_H - -class DistanceTest : public Test -{ -public: - DistanceTest() - { - { - m_transformA.SetIdentity(); - m_transformA.p.Set(0.0f, -0.2f); - m_polygonA.SetAsBox(10.0f, 0.2f); - } - - { - m_positionB.Set(12.017401f, 0.13678508f); - m_angleB = -0.0109265f; - m_transformB.Set(m_positionB, m_angleB); - - m_polygonB.SetAsBox(2.0f, 0.1f); - } - } - - static Test* Create() - { - return new DistanceTest; - } - - void Step(Settings* settings) - { - Test::Step(settings); - - b2DistanceInput input; - input.proxyA.Set(&m_polygonA, 0); - input.proxyB.Set(&m_polygonB, 0); - input.transformA = m_transformA; - input.transformB = m_transformB; - input.useRadii = true; - b2SimplexCache cache; - cache.count = 0; - b2DistanceOutput output; - b2Distance(&output, &cache, &input); - - m_debugDraw.DrawString(5, m_textLine, "distance = %g", output.distance); - m_textLine += DRAW_STRING_NEW_LINE; - - m_debugDraw.DrawString(5, m_textLine, "iterations = %d", output.iterations); - m_textLine += DRAW_STRING_NEW_LINE; - - { - b2Color color(0.9f, 0.9f, 0.9f); - b2Vec2 v[b2_maxPolygonVertices]; - for (int32 i = 0; i < m_polygonA.m_count; ++i) - { - v[i] = b2Mul(m_transformA, m_polygonA.m_vertices[i]); - } - m_debugDraw.DrawPolygon(v, m_polygonA.m_count, color); - - for (int32 i = 0; i < m_polygonB.m_count; ++i) - { - v[i] = b2Mul(m_transformB, m_polygonB.m_vertices[i]); - } - m_debugDraw.DrawPolygon(v, m_polygonB.m_count, color); - } - - b2Vec2 x1 = output.pointA; - b2Vec2 x2 = output.pointB; - - b2Color c1(1.0f, 0.0f, 0.0f); - m_debugDraw.DrawPoint(x1, 4.0f, c1); - - b2Color c2(1.0f, 1.0f, 0.0f); - m_debugDraw.DrawPoint(x2, 4.0f, c2); - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'a': - m_positionB.x -= 0.1f; - break; - - case 'd': - m_positionB.x += 0.1f; - break; - - case 's': - m_positionB.y -= 0.1f; - break; - - case 'w': - m_positionB.y += 0.1f; - break; - - case 'q': - m_angleB += 0.1f * b2_pi; - break; - - case 'e': - m_angleB -= 0.1f * b2_pi; - break; - } - - m_transformB.Set(m_positionB, m_angleB); - } - - b2Vec2 m_positionB; - float32 m_angleB; - - b2Transform m_transformA; - b2Transform m_transformB; - b2PolygonShape m_polygonA; - b2PolygonShape m_polygonB; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Dominos.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Dominos.h deleted file mode 100644 index 2d9b310cf3..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Dominos.h +++ /dev/null @@ -1,215 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef DOMINOS_H -#define DOMINOS_H - -class Dominos : public Test -{ -public: - - Dominos() - { - b2Body* b1; - { - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - - b2BodyDef bd; - b1 = m_world->CreateBody(&bd); - b1->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(6.0f, 0.25f); - - b2BodyDef bd; - bd.position.Set(-1.5f, 10.0f); - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.1f, 1.0f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - fd.friction = 0.1f; - - for (int i = 0; i < 10; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-6.0f + 1.0f * i, 11.25f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - } - } - - { - b2PolygonShape shape; - shape.SetAsBox(7.0f, 0.25f, b2Vec2_zero, 0.3f); - - b2BodyDef bd; - bd.position.Set(1.0f, 6.0f); - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&shape, 0.0f); - } - - b2Body* b2; - { - b2PolygonShape shape; - shape.SetAsBox(0.25f, 1.5f); - - b2BodyDef bd; - bd.position.Set(-7.0f, 4.0f); - b2 = m_world->CreateBody(&bd); - b2->CreateFixture(&shape, 0.0f); - } - - b2Body* b3; - { - b2PolygonShape shape; - shape.SetAsBox(6.0f, 0.125f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-0.9f, 1.0f); - bd.angle = -0.15f; - - b3 = m_world->CreateBody(&bd); - b3->CreateFixture(&shape, 10.0f); - } - - b2RevoluteJointDef jd; - b2Vec2 anchor; - - anchor.Set(-2.0f, 1.0f); - jd.Initialize(b1, b3, anchor); - jd.collideConnected = true; - m_world->CreateJoint(&jd); - - b2Body* b4; - { - b2PolygonShape shape; - shape.SetAsBox(0.25f, 0.25f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-10.0f, 15.0f); - b4 = m_world->CreateBody(&bd); - b4->CreateFixture(&shape, 10.0f); - } - - anchor.Set(-7.0f, 15.0f); - jd.Initialize(b2, b4, anchor); - m_world->CreateJoint(&jd); - - b2Body* b5; - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(6.5f, 3.0f); - b5 = m_world->CreateBody(&bd); - - b2PolygonShape shape; - b2FixtureDef fd; - - fd.shape = &shape; - fd.density = 10.0f; - fd.friction = 0.1f; - - shape.SetAsBox(1.0f, 0.1f, b2Vec2(0.0f, -0.9f), 0.0f); - b5->CreateFixture(&fd); - - shape.SetAsBox(0.1f, 1.0f, b2Vec2(-0.9f, 0.0f), 0.0f); - b5->CreateFixture(&fd); - - shape.SetAsBox(0.1f, 1.0f, b2Vec2(0.9f, 0.0f), 0.0f); - b5->CreateFixture(&fd); - } - - anchor.Set(6.0f, 2.0f); - jd.Initialize(b1, b5, anchor); - m_world->CreateJoint(&jd); - - b2Body* b6; - { - b2PolygonShape shape; - shape.SetAsBox(1.0f, 0.1f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(6.5f, 4.1f); - b6 = m_world->CreateBody(&bd); - b6->CreateFixture(&shape, 30.0f); - } - - anchor.Set(7.5f, 4.0f); - jd.Initialize(b5, b6, anchor); - m_world->CreateJoint(&jd); - - b2Body* b7; - { - b2PolygonShape shape; - shape.SetAsBox(0.1f, 1.0f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(7.4f, 1.0f); - - b7 = m_world->CreateBody(&bd); - b7->CreateFixture(&shape, 10.0f); - } - - b2DistanceJointDef djd; - djd.bodyA = b3; - djd.bodyB = b7; - djd.localAnchorA.Set(6.0f, 0.0f); - djd.localAnchorB.Set(0.0f, -1.0f); - b2Vec2 d = djd.bodyB->GetWorldPoint(djd.localAnchorB) - djd.bodyA->GetWorldPoint(djd.localAnchorA); - djd.length = d.Length(); - m_world->CreateJoint(&djd); - - { - float32 radius = 0.2f; - - b2CircleShape shape; - shape.m_radius = radius; - - for (int32 i = 0; i < 4; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(5.9f + 2.0f * radius * i, 2.4f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 10.0f); - } - } - } - - static Test* Create() - { - return new Dominos; - } -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/DumpShell.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/DumpShell.h deleted file mode 100644 index 0ea705d3ee..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/DumpShell.h +++ /dev/null @@ -1,175 +0,0 @@ -/* -* Copyright (c) 2011 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef DUMP_SHELL_H -#define DUMP_SHELL_H - -// This test holds worlds dumped using b2World::Dump. -class DumpShell : public Test -{ -public: - - DumpShell() - { - //Source code dump of Box2D scene: issue304-minimal-case.rube - // - // Created by R.U.B.E 1.3.0 - // Using Box2D version 2.3.0 - // Wed April 3 2013 04:33:28 - // - // This code is originally intended for use in the Box2D testbed, - // but you can easily use it in other applications by providing - // a b2World for use as the 'm_world' variable in the code below. - - b2Vec2 g(0.000000000000000e+00f, -1.000000000000000e+01f); - m_world->SetGravity(g); - b2Body** bodies = (b2Body**)b2Alloc(3 * sizeof(b2Body*)); - b2Joint** joints = (b2Joint**)b2Alloc(0 * sizeof(b2Joint*)); - { - b2BodyDef bd; - bd.type = b2BodyType(0); - bd.position.Set(2.587699890136719e-02f, 5.515012264251709e+00f); - bd.angle = 0.000000000000000e+00f; - bd.linearVelocity.Set(0.000000000000000e+00f, 0.000000000000000e+00f); - bd.angularVelocity = 0.000000000000000e+00f; - bd.linearDamping = 0.000000000000000e+00f; - bd.angularDamping = 0.000000000000000e+00f; - bd.allowSleep = bool(4); - bd.awake = bool(2); - bd.fixedRotation = bool(0); - bd.bullet = bool(0); - bd.active = bool(32); - bd.gravityScale = 1.000000000000000e+00f; - bodies[0] = m_world->CreateBody(&bd); - - { - b2FixtureDef fd; - fd.friction = 2.000000029802322e-01f; - fd.restitution = 0.000000000000000e+00f; - fd.density = 1.000000000000000e+00f; - fd.isSensor = bool(0); - fd.filter.categoryBits = uint16(1); - fd.filter.maskBits = uint16(65535); - fd.filter.groupIndex = int16(0); - b2PolygonShape shape; - b2Vec2 vs[8]; - vs[0].Set(7.733039855957031e-01f, -1.497260034084320e-01f); - vs[1].Set(-4.487270116806030e-01f, 1.138330027461052e-01f); - vs[2].Set(-1.880589962005615e+00f, -1.365900039672852e-01f); - vs[3].Set(3.972740173339844e-01f, -3.897832870483398e+00f); - shape.Set(vs, 4); - - fd.shape = &shape; - - bodies[0]->CreateFixture(&fd); - } - } - { - b2BodyDef bd; - bd.type = b2BodyType(2); - bd.position.Set(-3.122138977050781e-02f, 7.535382270812988e+00f); - bd.angle = -1.313644275069237e-02f; - bd.linearVelocity.Set(8.230687379837036e-01f, 7.775862514972687e-02f); - bd.angularVelocity = 3.705333173274994e-02f; - bd.linearDamping = 0.000000000000000e+00f; - bd.angularDamping = 0.000000000000000e+00f; - bd.allowSleep = bool(4); - bd.awake = bool(2); - bd.fixedRotation = bool(0); - bd.bullet = bool(0); - bd.active = bool(32); - bd.gravityScale = 1.000000000000000e+00f; - bodies[1] = m_world->CreateBody(&bd); - - { - b2FixtureDef fd; - fd.friction = 5.000000000000000e-01f; - fd.restitution = 0.000000000000000e+00f; - fd.density = 5.000000000000000e+00f; - fd.isSensor = bool(0); - fd.filter.categoryBits = uint16(1); - fd.filter.maskBits = uint16(65535); - fd.filter.groupIndex = int16(0); - b2PolygonShape shape; - b2Vec2 vs[8]; - vs[0].Set(3.473900079727173e+00f, -2.009889930486679e-01f); - vs[1].Set(3.457079887390137e+00f, 3.694039955735207e-02f); - vs[2].Set(-3.116359949111938e+00f, 2.348500071093440e-03f); - vs[3].Set(-3.109960079193115e+00f, -3.581250011920929e-01f); - vs[4].Set(-2.590820074081421e+00f, -5.472509860992432e-01f); - vs[5].Set(2.819370031356812e+00f, -5.402340292930603e-01f); - shape.Set(vs, 6); - - fd.shape = &shape; - - bodies[1]->CreateFixture(&fd); - } - } - { - b2BodyDef bd; - bd.type = b2BodyType(2); - bd.position.Set(-7.438077926635742e-01f, 6.626811981201172e+00f); - bd.angle = -1.884713363647461e+01f; - bd.linearVelocity.Set(1.785794943571091e-01f, 3.799796104431152e-07f); - bd.angularVelocity = -5.908820639888290e-06f; - bd.linearDamping = 0.000000000000000e+00f; - bd.angularDamping = 0.000000000000000e+00f; - bd.allowSleep = bool(4); - bd.awake = bool(2); - bd.fixedRotation = bool(0); - bd.bullet = bool(0); - bd.active = bool(32); - bd.gravityScale = 1.000000000000000e+00f; - bodies[2] = m_world->CreateBody(&bd); - - { - b2FixtureDef fd; - fd.friction = 9.499999880790710e-01f; - fd.restitution = 0.000000000000000e+00f; - fd.density = 1.000000000000000e+01f; - fd.isSensor = bool(0); - fd.filter.categoryBits = uint16(1); - fd.filter.maskBits = uint16(65535); - fd.filter.groupIndex = int16(-3); - b2PolygonShape shape; - b2Vec2 vs[8]; - vs[0].Set(1.639146506786346e-01f, 4.428443685173988e-02f); - vs[1].Set(-1.639146655797958e-01f, 4.428443685173988e-02f); - vs[2].Set(-1.639146655797958e-01f, -4.428443312644958e-02f); - vs[3].Set(1.639146357774734e-01f, -4.428444057703018e-02f); - shape.Set(vs, 4); - - fd.shape = &shape; - - bodies[2]->CreateFixture(&fd); - } - } - b2Free(joints); - b2Free(bodies); - joints = NULL; - bodies = NULL; - - } - - static Test* Create() - { - return new DumpShell; - } -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/DynamicTreeTest.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/DynamicTreeTest.h deleted file mode 100644 index 4531630d4b..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/DynamicTreeTest.h +++ /dev/null @@ -1,357 +0,0 @@ -/* -* Copyright (c) 2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef DYNAMIC_TREE_TEST_H -#define DYNAMIC_TREE_TEST_H - -class DynamicTreeTest : public Test -{ -public: - - enum - { - e_actorCount = 128 - }; - - DynamicTreeTest() - { - m_worldExtent = 15.0f; - m_proxyExtent = 0.5f; - - std::srand(888); - - for (int32 i = 0; i < e_actorCount; ++i) - { - Actor* actor = m_actors + i; - GetRandomAABB(&actor->aabb); - actor->proxyId = m_tree.CreateProxy(actor->aabb, actor); - } - - m_stepCount = 0; - - float32 h = m_worldExtent; - m_queryAABB.lowerBound.Set(-3.0f, -4.0f + h); - m_queryAABB.upperBound.Set(5.0f, 6.0f + h); - - m_rayCastInput.p1.Set(-5.0, 5.0f + h); - m_rayCastInput.p2.Set(7.0f, -4.0f + h); - //m_rayCastInput.p1.Set(0.0f, 2.0f + h); - //m_rayCastInput.p2.Set(0.0f, -2.0f + h); - m_rayCastInput.maxFraction = 1.0f; - - m_automated = false; - } - - static Test* Create() - { - return new DynamicTreeTest; - } - - void Step(Settings* settings) - { - B2_NOT_USED(settings); - - m_rayActor = NULL; - for (int32 i = 0; i < e_actorCount; ++i) - { - m_actors[i].fraction = 1.0f; - m_actors[i].overlap = false; - } - - if (m_automated == true) - { - int32 actionCount = b2Max(1, e_actorCount >> 2); - - for (int32 i = 0; i < actionCount; ++i) - { - Action(); - } - } - - Query(); - RayCast(); - - for (int32 i = 0; i < e_actorCount; ++i) - { - Actor* actor = m_actors + i; - if (actor->proxyId == b2_nullNode) - continue; - - b2Color c(0.9f, 0.9f, 0.9f); - if (actor == m_rayActor && actor->overlap) - { - c.Set(0.9f, 0.6f, 0.6f); - } - else if (actor == m_rayActor) - { - c.Set(0.6f, 0.9f, 0.6f); - } - else if (actor->overlap) - { - c.Set(0.6f, 0.6f, 0.9f); - } - - m_debugDraw.DrawAABB(&actor->aabb, c); - } - - b2Color c(0.7f, 0.7f, 0.7f); - m_debugDraw.DrawAABB(&m_queryAABB, c); - - m_debugDraw.DrawSegment(m_rayCastInput.p1, m_rayCastInput.p2, c); - - b2Color c1(0.2f, 0.9f, 0.2f); - b2Color c2(0.9f, 0.2f, 0.2f); - m_debugDraw.DrawPoint(m_rayCastInput.p1, 6.0f, c1); - m_debugDraw.DrawPoint(m_rayCastInput.p2, 6.0f, c2); - - if (m_rayActor) - { - b2Color cr(0.2f, 0.2f, 0.9f); - b2Vec2 p = m_rayCastInput.p1 + m_rayActor->fraction * (m_rayCastInput.p2 - m_rayCastInput.p1); - m_debugDraw.DrawPoint(p, 6.0f, cr); - } - - { - int32 height = m_tree.GetHeight(); - m_debugDraw.DrawString(5, m_textLine, "dynamic tree height = %d", height); - m_textLine += DRAW_STRING_NEW_LINE; - } - - ++m_stepCount; - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'a': - m_automated = !m_automated; - break; - - case 'c': - CreateProxy(); - break; - - case 'd': - DestroyProxy(); - break; - - case 'm': - MoveProxy(); - break; - } - } - - bool QueryCallback(int32 proxyId) - { - Actor* actor = (Actor*)m_tree.GetUserData(proxyId); - actor->overlap = b2TestOverlap(m_queryAABB, actor->aabb); - return true; - } - - float32 RayCastCallback(const b2RayCastInput& input, int32 proxyId) - { - Actor* actor = (Actor*)m_tree.GetUserData(proxyId); - - b2RayCastOutput output; - bool hit = actor->aabb.RayCast(&output, input); - - if (hit) - { - m_rayCastOutput = output; - m_rayActor = actor; - m_rayActor->fraction = output.fraction; - return output.fraction; - } - - return input.maxFraction; - } - -private: - - struct Actor - { - b2AABB aabb; - float32 fraction; - bool overlap; - int32 proxyId; - }; - - void GetRandomAABB(b2AABB* aabb) - { - b2Vec2 w; w.Set(2.0f * m_proxyExtent, 2.0f * m_proxyExtent); - //aabb->lowerBound.x = -m_proxyExtent; - //aabb->lowerBound.y = -m_proxyExtent + m_worldExtent; - aabb->lowerBound.x = RandomFloat(-m_worldExtent, m_worldExtent); - aabb->lowerBound.y = RandomFloat(0.0f, 2.0f * m_worldExtent); - aabb->upperBound = aabb->lowerBound + w; - } - - void MoveAABB(b2AABB* aabb) - { - b2Vec2 d; - d.x = RandomFloat(-0.5f, 0.5f); - d.y = RandomFloat(-0.5f, 0.5f); - //d.x = 2.0f; - //d.y = 0.0f; - aabb->lowerBound += d; - aabb->upperBound += d; - - b2Vec2 c0 = 0.5f * (aabb->lowerBound + aabb->upperBound); - b2Vec2 min; min.Set(-m_worldExtent, 0.0f); - b2Vec2 max; max.Set(m_worldExtent, 2.0f * m_worldExtent); - b2Vec2 c = b2Clamp(c0, min, max); - - aabb->lowerBound += c - c0; - aabb->upperBound += c - c0; - } - - void CreateProxy() - { - for (int32 i = 0; i < e_actorCount; ++i) - { - int32 j = rand() % e_actorCount; - Actor* actor = m_actors + j; - if (actor->proxyId == b2_nullNode) - { - GetRandomAABB(&actor->aabb); - actor->proxyId = m_tree.CreateProxy(actor->aabb, actor); - return; - } - } - } - - void DestroyProxy() - { - for (int32 i = 0; i < e_actorCount; ++i) - { - int32 j = rand() % e_actorCount; - Actor* actor = m_actors + j; - if (actor->proxyId != b2_nullNode) - { - m_tree.DestroyProxy(actor->proxyId); - actor->proxyId = b2_nullNode; - return; - } - } - } - - void MoveProxy() - { - for (int32 i = 0; i < e_actorCount; ++i) - { - int32 j = rand() % e_actorCount; - Actor* actor = m_actors + j; - if (actor->proxyId == b2_nullNode) - { - continue; - } - - b2AABB aabb0 = actor->aabb; - MoveAABB(&actor->aabb); - b2Vec2 displacement = actor->aabb.GetCenter() - aabb0.GetCenter(); - m_tree.MoveProxy(actor->proxyId, actor->aabb, displacement); - return; - } - } - - void Action() - { - int32 choice = rand() % 20; - - switch (choice) - { - case 0: - CreateProxy(); - break; - - case 1: - DestroyProxy(); - break; - - default: - MoveProxy(); - } - } - - void Query() - { - m_tree.Query(this, m_queryAABB); - - for (int32 i = 0; i < e_actorCount; ++i) - { - if (m_actors[i].proxyId == b2_nullNode) - { - continue; - } - - bool overlap = b2TestOverlap(m_queryAABB, m_actors[i].aabb); - B2_NOT_USED(overlap); - b2Assert(overlap == m_actors[i].overlap); - } - } - - void RayCast() - { - m_rayActor = NULL; - - b2RayCastInput input = m_rayCastInput; - - // Ray cast against the dynamic tree. - m_tree.RayCast(this, input); - - // Brute force ray cast. - Actor* bruteActor = NULL; - b2RayCastOutput bruteOutput; - for (int32 i = 0; i < e_actorCount; ++i) - { - if (m_actors[i].proxyId == b2_nullNode) - { - continue; - } - - b2RayCastOutput output; - bool hit = m_actors[i].aabb.RayCast(&output, input); - if (hit) - { - bruteActor = m_actors + i; - bruteOutput = output; - input.maxFraction = output.fraction; - } - } - - if (bruteActor != NULL) - { - b2Assert(bruteOutput.fraction == m_rayCastOutput.fraction); - } - } - - float32 m_worldExtent; - float32 m_proxyExtent; - - b2DynamicTree m_tree; - b2AABB m_queryAABB; - b2RayCastInput m_rayCastInput; - b2RayCastOutput m_rayCastOutput; - Actor* m_rayActor; - Actor m_actors[e_actorCount]; - int32 m_stepCount; - bool m_automated; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/EdgeShapes.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/EdgeShapes.h deleted file mode 100644 index 09fd2061e7..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/EdgeShapes.h +++ /dev/null @@ -1,249 +0,0 @@ -/* -* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef EDGE_SHAPES_H -#define EDGE_SHAPES_H - -class EdgeShapesCallback : public b2RayCastCallback -{ -public: - EdgeShapesCallback() - { - m_fixture = NULL; - } - - float32 ReportFixture( b2Fixture* fixture, const b2Vec2& point, - const b2Vec2& normal, float32 fraction) - { - m_fixture = fixture; - m_point = point; - m_normal = normal; - - return fraction; - } - - b2Fixture* m_fixture; - b2Vec2 m_point; - b2Vec2 m_normal; -}; - -class EdgeShapes : public Test -{ -public: - - enum - { - e_maxBodies = 256 - }; - - EdgeShapes() - { - // Ground body - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - float32 x1 = -20.0f; - float32 y1 = 2.0f * cosf(x1 / 10.0f * b2_pi); - for (int32 i = 0; i < 80; ++i) - { - float32 x2 = x1 + 0.5f; - float32 y2 = 2.0f * cosf(x2 / 10.0f * b2_pi); - - b2EdgeShape shape; - shape.Set(b2Vec2(x1, y1), b2Vec2(x2, y2)); - ground->CreateFixture(&shape, 0.0f); - - x1 = x2; - y1 = y2; - } - } - - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.5f, 0.0f); - vertices[1].Set(0.5f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - m_polygons[0].Set(vertices, 3); - } - - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.1f, 0.0f); - vertices[1].Set(0.1f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - m_polygons[1].Set(vertices, 3); - } - - { - float32 w = 1.0f; - float32 b = w / (2.0f + b2Sqrt(2.0f)); - float32 s = b2Sqrt(2.0f) * b; - - b2Vec2 vertices[8]; - vertices[0].Set(0.5f * s, 0.0f); - vertices[1].Set(0.5f * w, b); - vertices[2].Set(0.5f * w, b + s); - vertices[3].Set(0.5f * s, w); - vertices[4].Set(-0.5f * s, w); - vertices[5].Set(-0.5f * w, b + s); - vertices[6].Set(-0.5f * w, b); - vertices[7].Set(-0.5f * s, 0.0f); - - m_polygons[2].Set(vertices, 8); - } - - { - m_polygons[3].SetAsBox(0.5f, 0.5f); - } - - { - m_circle.m_radius = 0.5f; - } - - m_bodyIndex = 0; - memset(m_bodies, 0, sizeof(m_bodies)); - - m_angle = 0.0f; - } - - void Create(int32 index) - { - if (m_bodies[m_bodyIndex] != NULL) - { - m_world->DestroyBody(m_bodies[m_bodyIndex]); - m_bodies[m_bodyIndex] = NULL; - } - - b2BodyDef bd; - - float32 x = RandomFloat(-10.0f, 10.0f); - float32 y = RandomFloat(10.0f, 20.0f); - bd.position.Set(x, y); - bd.angle = RandomFloat(-b2_pi, b2_pi); - bd.type = b2_dynamicBody; - - if (index == 4) - { - bd.angularDamping = 0.02f; - } - - m_bodies[m_bodyIndex] = m_world->CreateBody(&bd); - - if (index < 4) - { - b2FixtureDef fd; - fd.shape = m_polygons + index; - fd.friction = 0.3f; - fd.density = 20.0f; - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } - else - { - b2FixtureDef fd; - fd.shape = &m_circle; - fd.friction = 0.3f; - fd.density = 20.0f; - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } - - m_bodyIndex = (m_bodyIndex + 1) % e_maxBodies; - } - - void DestroyBody() - { - for (int32 i = 0; i < e_maxBodies; ++i) - { - if (m_bodies[i] != NULL) - { - m_world->DestroyBody(m_bodies[i]); - m_bodies[i] = NULL; - return; - } - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case '1': - case '2': - case '3': - case '4': - case '5': - Create(key - '1'); - break; - - case 'd': - DestroyBody(); - break; - } - } - - void Step(Settings* settings) - { - bool advanceRay = settings->pause == 0 || settings->singleStep; - - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Press 1-5 to drop stuff"); - m_textLine += DRAW_STRING_NEW_LINE; - - float32 L = 25.0f; - b2Vec2 point1(0.0f, 10.0f); - b2Vec2 d(L * cosf(m_angle), -L * b2Abs(sinf(m_angle))); - b2Vec2 point2 = point1 + d; - - EdgeShapesCallback callback; - - m_world->RayCast(&callback, point1, point2); - - if (callback.m_fixture) - { - m_debugDraw.DrawPoint(callback.m_point, 5.0f, b2Color(0.4f, 0.9f, 0.4f)); - - m_debugDraw.DrawSegment(point1, callback.m_point, b2Color(0.8f, 0.8f, 0.8f)); - - b2Vec2 head = callback.m_point + 0.5f * callback.m_normal; - m_debugDraw.DrawSegment(callback.m_point, head, b2Color(0.9f, 0.9f, 0.4f)); - } - else - { - m_debugDraw.DrawSegment(point1, point2, b2Color(0.8f, 0.8f, 0.8f)); - } - - if (advanceRay) - { - m_angle += 0.25f * b2_pi / 180.0f; - } - } - - static Test* Create() - { - return new EdgeShapes; - } - - int32 m_bodyIndex; - b2Body* m_bodies[e_maxBodies]; - b2PolygonShape m_polygons[4]; - b2CircleShape m_circle; - - float32 m_angle; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/EdgeTest.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/EdgeTest.h deleted file mode 100644 index a89f262807..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/EdgeTest.h +++ /dev/null @@ -1,109 +0,0 @@ -/* -* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef EDGE_TEST_H -#define EDGE_TEST_H - -class EdgeTest : public Test -{ -public: - - EdgeTest() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2Vec2 v1(-10.0f, 0.0f), v2(-7.0f, -2.0f), v3(-4.0f, 0.0f); - b2Vec2 v4(0.0f, 0.0f), v5(4.0f, 0.0f), v6(7.0f, 2.0f), v7(10.0f, 0.0f); - - b2EdgeShape shape; - - shape.Set(v1, v2); - shape.m_hasVertex3 = true; - shape.m_vertex3 = v3; - ground->CreateFixture(&shape, 0.0f); - - shape.Set(v2, v3); - shape.m_hasVertex0 = true; - shape.m_hasVertex3 = true; - shape.m_vertex0 = v1; - shape.m_vertex3 = v4; - ground->CreateFixture(&shape, 0.0f); - - shape.Set(v3, v4); - shape.m_hasVertex0 = true; - shape.m_hasVertex3 = true; - shape.m_vertex0 = v2; - shape.m_vertex3 = v5; - ground->CreateFixture(&shape, 0.0f); - - shape.Set(v4, v5); - shape.m_hasVertex0 = true; - shape.m_hasVertex3 = true; - shape.m_vertex0 = v3; - shape.m_vertex3 = v6; - ground->CreateFixture(&shape, 0.0f); - - shape.Set(v5, v6); - shape.m_hasVertex0 = true; - shape.m_hasVertex3 = true; - shape.m_vertex0 = v4; - shape.m_vertex3 = v7; - ground->CreateFixture(&shape, 0.0f); - - shape.Set(v6, v7); - shape.m_hasVertex0 = true; - shape.m_vertex0 = v5; - ground->CreateFixture(&shape, 0.0f); - } - - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-0.5f, 0.6f); - bd.allowSleep = false; - b2Body* body = m_world->CreateBody(&bd); - - b2CircleShape shape; - shape.m_radius = 0.5f; - - body->CreateFixture(&shape, 1.0f); - } - - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(1.0f, 0.6f); - bd.allowSleep = false; - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.5f); - - body->CreateFixture(&shape, 1.0f); - } - } - - static Test* Create() - { - return new EdgeTest; - } -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Gears.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Gears.h deleted file mode 100644 index 580707cefa..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Gears.h +++ /dev/null @@ -1,186 +0,0 @@ -/* -* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef GEARS_H -#define GEARS_H - -class Gears : public Test -{ -public: - Gears() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(50.0f, 0.0f), b2Vec2(-50.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2CircleShape circle1; - circle1.m_radius = 1.0f; - - b2PolygonShape box; - box.SetAsBox(0.5f, 5.0f); - - b2CircleShape circle2; - circle2.m_radius = 2.0f; - - b2BodyDef bd1; - bd1.type = b2_staticBody; - bd1.position.Set(10.0f, 9.0f); - b2Body* body1 = m_world->CreateBody(&bd1); - body1->CreateFixture(&circle1, 5.0f); - - b2BodyDef bd2; - bd2.type = b2_dynamicBody; - bd2.position.Set(10.0f, 8.0f); - b2Body* body2 = m_world->CreateBody(&bd2); - body2->CreateFixture(&box, 5.0f); - - b2BodyDef bd3; - bd3.type = b2_dynamicBody; - bd3.position.Set(10.0f, 6.0f); - b2Body* body3 = m_world->CreateBody(&bd3); - body3->CreateFixture(&circle2, 5.0f); - - b2RevoluteJointDef jd1; - jd1.Initialize(body2, body1, bd1.position); - b2Joint* joint1 = m_world->CreateJoint(&jd1); - - b2RevoluteJointDef jd2; - jd2.Initialize(body2, body3, bd3.position); - b2Joint* joint2 = m_world->CreateJoint(&jd2); - - b2GearJointDef jd4; - jd4.bodyA = body1; - jd4.bodyB = body3; - jd4.joint1 = joint1; - jd4.joint2 = joint2; - jd4.ratio = circle2.m_radius / circle1.m_radius; - m_world->CreateJoint(&jd4); - } - - { - b2CircleShape circle1; - circle1.m_radius = 1.0f; - - b2CircleShape circle2; - circle2.m_radius = 2.0f; - - b2PolygonShape box; - box.SetAsBox(0.5f, 5.0f); - - b2BodyDef bd1; - bd1.type = b2_dynamicBody; - bd1.position.Set(-3.0f, 12.0f); - b2Body* body1 = m_world->CreateBody(&bd1); - body1->CreateFixture(&circle1, 5.0f); - - b2RevoluteJointDef jd1; - jd1.bodyA = ground; - jd1.bodyB = body1; - jd1.localAnchorA = ground->GetLocalPoint(bd1.position); - jd1.localAnchorB = body1->GetLocalPoint(bd1.position); - jd1.referenceAngle = body1->GetAngle() - ground->GetAngle(); - m_joint1 = (b2RevoluteJoint*)m_world->CreateJoint(&jd1); - - b2BodyDef bd2; - bd2.type = b2_dynamicBody; - bd2.position.Set(0.0f, 12.0f); - b2Body* body2 = m_world->CreateBody(&bd2); - body2->CreateFixture(&circle2, 5.0f); - - b2RevoluteJointDef jd2; - jd2.Initialize(ground, body2, bd2.position); - m_joint2 = (b2RevoluteJoint*)m_world->CreateJoint(&jd2); - - b2BodyDef bd3; - bd3.type = b2_dynamicBody; - bd3.position.Set(2.5f, 12.0f); - b2Body* body3 = m_world->CreateBody(&bd3); - body3->CreateFixture(&box, 5.0f); - - b2PrismaticJointDef jd3; - jd3.Initialize(ground, body3, bd3.position, b2Vec2(0.0f, 1.0f)); - jd3.lowerTranslation = -5.0f; - jd3.upperTranslation = 5.0f; - jd3.enableLimit = true; - - m_joint3 = (b2PrismaticJoint*)m_world->CreateJoint(&jd3); - - b2GearJointDef jd4; - jd4.bodyA = body1; - jd4.bodyB = body2; - jd4.joint1 = m_joint1; - jd4.joint2 = m_joint2; - jd4.ratio = circle2.m_radius / circle1.m_radius; - m_joint4 = (b2GearJoint*)m_world->CreateJoint(&jd4); - - b2GearJointDef jd5; - jd5.bodyA = body2; - jd5.bodyB = body3; - jd5.joint1 = m_joint2; - jd5.joint2 = m_joint3; - jd5.ratio = -1.0f / circle2.m_radius; - m_joint5 = (b2GearJoint*)m_world->CreateJoint(&jd5); - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 0: - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - - float32 ratio, value; - - ratio = m_joint4->GetRatio(); - value = m_joint1->GetJointAngle() + ratio * m_joint2->GetJointAngle(); - m_debugDraw.DrawString(5, m_textLine, "theta1 + %4.2f * theta2 = %4.2f", (float) ratio, (float) value); - m_textLine += DRAW_STRING_NEW_LINE; - - ratio = m_joint5->GetRatio(); - value = m_joint2->GetJointAngle() + ratio * m_joint3->GetJointTranslation(); - m_debugDraw.DrawString(5, m_textLine, "theta2 + %4.2f * delta = %4.2f", (float) ratio, (float) value); - m_textLine += DRAW_STRING_NEW_LINE; - } - - static Test* Create() - { - return new Gears; - } - - b2RevoluteJoint* m_joint1; - b2RevoluteJoint* m_joint2; - b2PrismaticJoint* m_joint3; - b2GearJoint* m_joint4; - b2GearJoint* m_joint5; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Mobile.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Mobile.h deleted file mode 100644 index d16e659379..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Mobile.h +++ /dev/null @@ -1,102 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef MOBILE_H -#define MOBILE_H - -class Mobile : public Test -{ -public: - - enum - { - e_depth = 4 - }; - - Mobile() - { - b2Body* ground; - - // Create ground body. - { - b2BodyDef bodyDef; - bodyDef.position.Set(0.0f, 5.0f); - ground = m_world->CreateBody(&bodyDef); - } - - float32 a = 0.5f; - b2Vec2 h(0.0f, a); - - b2Body* root = AddNode(ground, b2Vec2_zero, 0, 3.0f, a); - - b2RevoluteJointDef jointDef; - jointDef.bodyA = ground; - jointDef.bodyB = root; - jointDef.localAnchorA.SetZero(); - jointDef.localAnchorB = h; - m_world->CreateJoint(&jointDef); - } - - b2Body* AddNode(b2Body* parent, const b2Vec2& localAnchor, int32 depth, float32 offset, float32 a) - { - float32 density = 20.0f; - b2Vec2 h(0.0f, a); - - b2Vec2 p = parent->GetPosition() + localAnchor - h; - - b2BodyDef bodyDef; - bodyDef.type = b2_dynamicBody; - bodyDef.position = p; - b2Body* body = m_world->CreateBody(&bodyDef); - - b2PolygonShape shape; - shape.SetAsBox(0.25f * a, a); - body->CreateFixture(&shape, density); - - if (depth == e_depth) - { - return body; - } - - b2Vec2 a1 = b2Vec2(offset, -a); - b2Vec2 a2 = b2Vec2(-offset, -a); - b2Body* body1 = AddNode(body, a1, depth + 1, 0.5f * offset, a); - b2Body* body2 = AddNode(body, a2, depth + 1, 0.5f * offset, a); - - b2RevoluteJointDef jointDef; - jointDef.bodyA = body; - jointDef.localAnchorB = h; - - jointDef.localAnchorA = a1; - jointDef.bodyB = body1; - m_world->CreateJoint(&jointDef); - - jointDef.localAnchorA = a2; - jointDef.bodyB = body2; - m_world->CreateJoint(&jointDef); - - return body; - } - - static Test* Create() - { - return new Mobile; - } -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/MobileBalanced.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/MobileBalanced.h deleted file mode 100644 index ea4784190b..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/MobileBalanced.h +++ /dev/null @@ -1,105 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef MOBILE_BALANCED_H -#define MOBILE_BALANCED_H - -class MobileBalanced : public Test -{ -public: - - enum - { - e_depth = 4 - }; - - MobileBalanced() - { - b2Body* ground; - - // Create ground body. - { - b2BodyDef bodyDef; - bodyDef.position.Set(0.0f, 5.0f); - ground = m_world->CreateBody(&bodyDef); - } - - float32 a = 0.5f; - b2Vec2 h(0.0f, a); - - b2Body* root = AddNode(ground, b2Vec2_zero, 0, 3.0f, a); - - b2RevoluteJointDef jointDef; - jointDef.bodyA = ground; - jointDef.bodyB = root; - jointDef.localAnchorA.SetZero(); - jointDef.localAnchorB = h; - m_world->CreateJoint(&jointDef); - } - - b2Body* AddNode(b2Body* parent, const b2Vec2& localAnchor, int32 depth, float32 offset, float32 a) - { - float32 density = 20.0f; - b2Vec2 h(0.0f, a); - - b2Vec2 p = parent->GetPosition() + localAnchor - h; - - b2BodyDef bodyDef; - bodyDef.type = b2_dynamicBody; - bodyDef.position = p; - b2Body* body = m_world->CreateBody(&bodyDef); - - b2PolygonShape shape; - shape.SetAsBox(0.25f * a, a); - body->CreateFixture(&shape, density); - - if (depth == e_depth) - { - return body; - } - - shape.SetAsBox(offset, 0.25f * a, b2Vec2(0, -a), 0.0f); - body->CreateFixture(&shape, density); - - b2Vec2 a1 = b2Vec2(offset, -a); - b2Vec2 a2 = b2Vec2(-offset, -a); - b2Body* body1 = AddNode(body, a1, depth + 1, 0.5f * offset, a); - b2Body* body2 = AddNode(body, a2, depth + 1, 0.5f * offset, a); - - b2RevoluteJointDef jointDef; - jointDef.bodyA = body; - jointDef.localAnchorB = h; - - jointDef.localAnchorA = a1; - jointDef.bodyB = body1; - m_world->CreateJoint(&jointDef); - - jointDef.localAnchorA = a2; - jointDef.bodyB = body2; - m_world->CreateJoint(&jointDef); - - return body; - } - - static Test* Create() - { - return new MobileBalanced; - } -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/MotorJoint.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/MotorJoint.h deleted file mode 100644 index cd3ded9bae..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/MotorJoint.h +++ /dev/null @@ -1,114 +0,0 @@ -/* -* Copyright (c) 2006-2012 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef MOTOR_JOINT_H -#define MOTOR_JOINT_H - -/// This test shows how to use a motor joint. A motor joint -/// can be used to animate a dynamic body. With finite motor forces -/// the body can be blocked by collision with other bodies. -class MotorJoint : public Test -{ -public: - MotorJoint() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-20.0f, 0.0f), b2Vec2(20.0f, 0.0f)); - - b2FixtureDef fd; - fd.shape = &shape; - - ground->CreateFixture(&fd); - } - - // Define motorized body - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 8.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(2.0f, 0.5f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.friction = 0.6f; - fd.density = 2.0f; - body->CreateFixture(&fd); - - b2MotorJointDef mjd; - mjd.Initialize(ground, body); - mjd.maxForce = 1000.0f; - mjd.maxTorque = 1000.0f; - m_joint = (b2MotorJoint*)m_world->CreateJoint(&mjd); - } - - m_go = false; - m_time = 0.0f; - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 's': - m_go = !m_go; - break; - } - } - - void Step(Settings* settings) - { - if (m_go && settings->hz > 0.0f) - { - m_time += 1.0f / settings->hz; - } - - b2Vec2 linearOffset; - linearOffset.x = 6.0f * sinf(2.0f * m_time); - linearOffset.y = 8.0f + 4.0f * sinf(1.0f * m_time); - - float32 angularOffset = 4.0f * m_time; - - m_joint->SetLinearOffset(linearOffset); - m_joint->SetAngularOffset(angularOffset); - - m_debugDraw.DrawPoint(linearOffset, 4.0f, b2Color(0.9f, 0.9f, 0.9f)); - - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Keys: (s) pause"); - m_textLine += 15; - } - - static Test* Create() - { - return new MotorJoint; - } - - b2MotorJoint* m_joint; - float32 m_time; - bool m_go; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/OneSidedPlatform.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/OneSidedPlatform.h deleted file mode 100644 index 69e339a855..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/OneSidedPlatform.h +++ /dev/null @@ -1,132 +0,0 @@ -/* -* Copyright (c) 2008-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef ONE_SIDED_PLATFORM_H -#define ONE_SIDED_PLATFORM_H - -class OneSidedPlatform : public Test -{ -public: - - enum State - { - e_unknown, - e_above, - e_below - }; - - OneSidedPlatform() - { - // Ground - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-20.0f, 0.0f), b2Vec2(20.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - // Platform - { - b2BodyDef bd; - bd.position.Set(0.0f, 10.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(3.0f, 0.5f); - m_platform = body->CreateFixture(&shape, 0.0f); - - m_bottom = 10.0f - 0.5f; - m_top = 10.0f + 0.5f; - } - - // Actor - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 12.0f); - b2Body* body = m_world->CreateBody(&bd); - - m_radius = 0.5f; - b2CircleShape shape; - shape.m_radius = m_radius; - m_character = body->CreateFixture(&shape, 20.0f); - - body->SetLinearVelocity(b2Vec2(0.0f, -50.0f)); - - m_state = e_unknown; - } - } - - void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) - { - Test::PreSolve(contact, oldManifold); - - b2Fixture* fixtureA = contact->GetFixtureA(); - b2Fixture* fixtureB = contact->GetFixtureB(); - - if (fixtureA != m_platform && fixtureA != m_character) - { - return; - } - - if (fixtureB != m_platform && fixtureB != m_character) - { - return; - } - -#if 1 - b2Vec2 position = m_character->GetBody()->GetPosition(); - - if (position.y < m_top + m_radius - 3.0f * b2_linearSlop) - { - contact->SetEnabled(false); - } -#else - b2Vec2 v = m_character->GetBody()->GetLinearVelocity(); - if (v.y > 0.0f) - { - contact->SetEnabled(false); - } -#endif - } - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Press: (c) create a shape, (d) destroy a shape."); - m_textLine += DRAW_STRING_NEW_LINE; - - b2Vec2 v = m_character->GetBody()->GetLinearVelocity(); - m_debugDraw.DrawString(5, m_textLine, "Character Linear Velocity: %f", v.y); - m_textLine += DRAW_STRING_NEW_LINE; - } - - static Test* Create() - { - return new OneSidedPlatform; - } - - float32 m_radius, m_top, m_bottom; - State m_state; - b2Fixture* m_platform; - b2Fixture* m_character; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Pinball.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Pinball.h deleted file mode 100644 index 9d5982f25f..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Pinball.h +++ /dev/null @@ -1,169 +0,0 @@ -/* -* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef PINBALL_H -#define PINBALL_H - -/// This tests bullet collision and provides an example of a gameplay scenario. -/// This also uses a loop shape. -class Pinball : public Test -{ -public: - Pinball() - { - // Ground body - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2Vec2 vs[5]; - vs[0].Set(0.0f, -2.0f); - vs[1].Set(8.0f, 6.0f); - vs[2].Set(8.0f, 20.0f); - vs[3].Set(-8.0f, 20.0f); - vs[4].Set(-8.0f, 6.0f); - - b2ChainShape loop; - loop.CreateLoop(vs, 5); - b2FixtureDef fd; - fd.shape = &loop; - fd.density = 0.0f; - ground->CreateFixture(&fd); - } - - // Flippers - { - b2Vec2 p1(-2.0f, 0.0f), p2(2.0f, 0.0f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - - bd.position = p1; - b2Body* leftFlipper = m_world->CreateBody(&bd); - - bd.position = p2; - b2Body* rightFlipper = m_world->CreateBody(&bd); - - b2PolygonShape box; - box.SetAsBox(1.75f, 0.1f); - - b2FixtureDef fd; - fd.shape = &box; - fd.density = 1.0f; - - leftFlipper->CreateFixture(&fd); - rightFlipper->CreateFixture(&fd); - - b2RevoluteJointDef jd; - jd.bodyA = ground; - jd.localAnchorB.SetZero(); - jd.enableMotor = true; - jd.maxMotorTorque = 1000.0f; - jd.enableLimit = true; - - jd.motorSpeed = 0.0f; - jd.localAnchorA = p1; - jd.bodyB = leftFlipper; - jd.lowerAngle = -30.0f * b2_pi / 180.0f; - jd.upperAngle = 5.0f * b2_pi / 180.0f; - m_leftJoint = (b2RevoluteJoint*)m_world->CreateJoint(&jd); - - jd.motorSpeed = 0.0f; - jd.localAnchorA = p2; - jd.bodyB = rightFlipper; - jd.lowerAngle = -5.0f * b2_pi / 180.0f; - jd.upperAngle = 30.0f * b2_pi / 180.0f; - m_rightJoint = (b2RevoluteJoint*)m_world->CreateJoint(&jd); - } - - // Circle character - { - b2BodyDef bd; - bd.position.Set(1.0f, 15.0f); - bd.type = b2_dynamicBody; - bd.bullet = true; - - m_ball = m_world->CreateBody(&bd); - - b2CircleShape shape; - shape.m_radius = 0.2f; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - m_ball->CreateFixture(&fd); - } - - m_button = false; - } - - void Step(Settings* settings) - { - if (m_button) - { - m_leftJoint->SetMotorSpeed(20.0f); - m_rightJoint->SetMotorSpeed(-20.0f); - } - else - { - m_leftJoint->SetMotorSpeed(-10.0f); - m_rightJoint->SetMotorSpeed(10.0f); - } - - Test::Step(settings); - - m_debugDraw.DrawString(5, m_textLine, "Press 'a' to control the flippers"); - m_textLine += DRAW_STRING_NEW_LINE; - - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'a': - case 'A': - m_button = true; - break; - } - } - - void KeyboardUp(unsigned char key) - { - switch (key) - { - case 'a': - case 'A': - m_button = false; - break; - } - } - - static Test* Create() - { - return new Pinball; - } - - b2RevoluteJoint* m_leftJoint; - b2RevoluteJoint* m_rightJoint; - b2Body* m_ball; - bool m_button; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/PolyCollision.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/PolyCollision.h deleted file mode 100644 index 0316a7b16e..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/PolyCollision.h +++ /dev/null @@ -1,122 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef POLYCOLLISION_H -#define POLYCOLLISION_H - -class PolyCollision : public Test -{ -public: - PolyCollision() - { - { - m_polygonA.SetAsBox(0.2f, 0.4f); - m_transformA.Set(b2Vec2(0.0f, 0.0f), 0.0f); - } - - { - m_polygonB.SetAsBox(0.5f, 0.5f); - m_positionB.Set(19.345284f, 1.5632932f); - m_angleB = 1.9160721f; - m_transformB.Set(m_positionB, m_angleB); - } - } - - static Test* Create() - { - return new PolyCollision; - } - - void Step(Settings* settings) - { - B2_NOT_USED(settings); - - b2Manifold manifold; - b2CollidePolygons(&manifold, &m_polygonA, m_transformA, &m_polygonB, m_transformB); - - b2WorldManifold worldManifold; - worldManifold.Initialize(&manifold, m_transformA, m_polygonA.m_radius, m_transformB, m_polygonB.m_radius); - - m_debugDraw.DrawString(5, m_textLine, "point count = %d", manifold.pointCount); - m_textLine += DRAW_STRING_NEW_LINE; - - { - b2Color color(0.9f, 0.9f, 0.9f); - b2Vec2 v[b2_maxPolygonVertices]; - for (int32 i = 0; i < m_polygonA.m_count; ++i) - { - v[i] = b2Mul(m_transformA, m_polygonA.m_vertices[i]); - } - m_debugDraw.DrawPolygon(v, m_polygonA.m_count, color); - - for (int32 i = 0; i < m_polygonB.m_count; ++i) - { - v[i] = b2Mul(m_transformB, m_polygonB.m_vertices[i]); - } - m_debugDraw.DrawPolygon(v, m_polygonB.m_count, color); - } - - for (int32 i = 0; i < manifold.pointCount; ++i) - { - m_debugDraw.DrawPoint(worldManifold.points[i], 4.0f, b2Color(0.9f, 0.3f, 0.3f)); - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'a': - m_positionB.x -= 0.1f; - break; - - case 'd': - m_positionB.x += 0.1f; - break; - - case 's': - m_positionB.y -= 0.1f; - break; - - case 'w': - m_positionB.y += 0.1f; - break; - - case 'q': - m_angleB += 0.1f * b2_pi; - break; - - case 'e': - m_angleB -= 0.1f * b2_pi; - break; - } - - m_transformB.Set(m_positionB, m_angleB); - } - - b2PolygonShape m_polygonA; - b2PolygonShape m_polygonB; - - b2Transform m_transformA; - b2Transform m_transformB; - - b2Vec2 m_positionB; - float32 m_angleB; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/PolyShapes.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/PolyShapes.h deleted file mode 100644 index 532071a58d..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/PolyShapes.h +++ /dev/null @@ -1,299 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef POLY_SHAPES_H -#define POLY_SHAPES_H - -/// This tests stacking. It also shows how to use b2World::Query -/// and b2TestOverlap. - -/// This callback is called by b2World::QueryAABB. We find all the fixtures -/// that overlap an AABB. Of those, we use b2TestOverlap to determine which fixtures -/// overlap a circle. Up to 4 overlapped fixtures will be highlighted with a yellow border. -class PolyShapesCallback : public b2QueryCallback -{ -public: - - enum - { - e_maxCount = 4 - }; - - PolyShapesCallback() - { - m_count = 0; - } - - void DrawFixture(b2Fixture* fixture) - { - b2Color color(0.95f, 0.95f, 0.6f); - const b2Transform& xf = fixture->GetBody()->GetTransform(); - - switch (fixture->GetType()) - { - case b2Shape::e_circle: - { - b2CircleShape* circle = (b2CircleShape*)fixture->GetShape(); - - b2Vec2 center = b2Mul(xf, circle->m_p); - float32 radius = circle->m_radius; - - m_debugDraw->DrawCircle(center, radius, color); - } - break; - - case b2Shape::e_polygon: - { - b2PolygonShape* poly = (b2PolygonShape*)fixture->GetShape(); - int32 vertexCount = poly->m_count; - b2Assert(vertexCount <= b2_maxPolygonVertices); - b2Vec2 vertices[b2_maxPolygonVertices]; - - for (int32 i = 0; i < vertexCount; ++i) - { - vertices[i] = b2Mul(xf, poly->m_vertices[i]); - } - - m_debugDraw->DrawPolygon(vertices, vertexCount, color); - } - break; - - default: - break; - } - } - - /// Called for each fixture found in the query AABB. - /// @return false to terminate the query. - bool ReportFixture(b2Fixture* fixture) - { - if (m_count == e_maxCount) - { - return false; - } - - b2Body* body = fixture->GetBody(); - b2Shape* shape = fixture->GetShape(); - - bool overlap = b2TestOverlap(shape, 0, &m_circle, 0, body->GetTransform(), m_transform); - - if (overlap) - { - DrawFixture(fixture); - ++m_count; - } - - return true; - } - - b2CircleShape m_circle; - b2Transform m_transform; - b2Draw* m_debugDraw; - int32 m_count; -}; - -class PolyShapes : public Test -{ -public: - - enum - { - e_maxBodies = 256 - }; - - PolyShapes() - { - // Ground body - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.5f, 0.0f); - vertices[1].Set(0.5f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - m_polygons[0].Set(vertices, 3); - } - - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.1f, 0.0f); - vertices[1].Set(0.1f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - m_polygons[1].Set(vertices, 3); - } - - { - float32 w = 1.0f; - float32 b = w / (2.0f + b2Sqrt(2.0f)); - float32 s = b2Sqrt(2.0f) * b; - - b2Vec2 vertices[8]; - vertices[0].Set(0.5f * s, 0.0f); - vertices[1].Set(0.5f * w, b); - vertices[2].Set(0.5f * w, b + s); - vertices[3].Set(0.5f * s, w); - vertices[4].Set(-0.5f * s, w); - vertices[5].Set(-0.5f * w, b + s); - vertices[6].Set(-0.5f * w, b); - vertices[7].Set(-0.5f * s, 0.0f); - - m_polygons[2].Set(vertices, 8); - } - - { - m_polygons[3].SetAsBox(0.5f, 0.5f); - } - - { - m_circle.m_radius = 0.5f; - } - - m_bodyIndex = 0; - memset(m_bodies, 0, sizeof(m_bodies)); - } - - void Create(int32 index) - { - if (m_bodies[m_bodyIndex] != NULL) - { - m_world->DestroyBody(m_bodies[m_bodyIndex]); - m_bodies[m_bodyIndex] = NULL; - } - - b2BodyDef bd; - bd.type = b2_dynamicBody; - - float32 x = RandomFloat(-2.0f, 2.0f); - bd.position.Set(x, 10.0f); - bd.angle = RandomFloat(-b2_pi, b2_pi); - - if (index == 4) - { - bd.angularDamping = 0.02f; - } - - m_bodies[m_bodyIndex] = m_world->CreateBody(&bd); - - if (index < 4) - { - b2FixtureDef fd; - fd.shape = m_polygons + index; - fd.density = 1.0f; - fd.friction = 0.3f; - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } - else - { - b2FixtureDef fd; - fd.shape = &m_circle; - fd.density = 1.0f; - fd.friction = 0.3f; - - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } - - m_bodyIndex = (m_bodyIndex + 1) % e_maxBodies; - } - - void DestroyBody() - { - for (int32 i = 0; i < e_maxBodies; ++i) - { - if (m_bodies[i] != NULL) - { - m_world->DestroyBody(m_bodies[i]); - m_bodies[i] = NULL; - return; - } - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case '1': - case '2': - case '3': - case '4': - case '5': - Create(key - '1'); - break; - - case 'a': - for (int32 i = 0; i < e_maxBodies; i += 2) - { - if (m_bodies[i]) - { - bool active = m_bodies[i]->IsActive(); - m_bodies[i]->SetActive(!active); - } - } - break; - - case 'd': - DestroyBody(); - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - - PolyShapesCallback callback; - callback.m_circle.m_radius = 2.0f; - callback.m_circle.m_p.Set(0.0f, 1.1f); - callback.m_transform.SetIdentity(); - callback.m_debugDraw = &m_debugDraw; - - b2AABB aabb; - callback.m_circle.ComputeAABB(&aabb, callback.m_transform, 0); - - m_world->QueryAABB(&callback, aabb); - - b2Color color(0.4f, 0.7f, 0.8f); - m_debugDraw.DrawCircle(callback.m_circle.m_p, callback.m_circle.m_radius, color); - - m_debugDraw.DrawString(5, m_textLine, "Press 1-5 to drop stuff"); - m_textLine += DRAW_STRING_NEW_LINE; - m_debugDraw.DrawString(5, m_textLine, "Press 'a' to (de)activate some bodies"); - m_textLine += DRAW_STRING_NEW_LINE; - m_debugDraw.DrawString(5, m_textLine, "Press 'd' to destroy a body"); - m_textLine += DRAW_STRING_NEW_LINE; - } - - static Test* Create() - { - return new PolyShapes; - } - - int32 m_bodyIndex; - b2Body* m_bodies[e_maxBodies]; - b2PolygonShape m_polygons[4]; - b2CircleShape m_circle; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Prismatic.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Prismatic.h deleted file mode 100644 index 731745c64d..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Prismatic.h +++ /dev/null @@ -1,107 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef PRISMATIC_H -#define PRISMATIC_H - -// The motor in this test gets smoother with higher velocity iterations. -class Prismatic : public Test -{ -public: - Prismatic() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(2.0f, 0.5f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-10.0f, 10.0f); - bd.angle = 0.5f * b2_pi; - bd.allowSleep = false; - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 5.0f); - - b2PrismaticJointDef pjd; - - // Bouncy limit - b2Vec2 axis(2.0f, 1.0f); - axis.Normalize(); - pjd.Initialize(ground, body, b2Vec2(0.0f, 0.0f), axis); - - // Non-bouncy limit - //pjd.Initialize(ground, body, b2Vec2(-10.0f, 10.0f), b2Vec2(1.0f, 0.0f)); - - pjd.motorSpeed = 10.0f; - pjd.maxMotorForce = 10000.0f; - pjd.enableMotor = true; - pjd.lowerTranslation = 0.0f; - pjd.upperTranslation = 20.0f; - pjd.enableLimit = true; - - m_joint = (b2PrismaticJoint*)m_world->CreateJoint(&pjd); - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'l': - m_joint->EnableLimit(!m_joint->IsLimitEnabled()); - break; - - case 'm': - m_joint->EnableMotor(!m_joint->IsMotorEnabled()); - break; - - case 's': - m_joint->SetMotorSpeed(-m_joint->GetMotorSpeed()); - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Keys: (l) limits, (m) motors, (s) speed"); - m_textLine += DRAW_STRING_NEW_LINE; - float32 force = m_joint->GetMotorForce(settings->hz); - m_debugDraw.DrawString(5, m_textLine, "Motor Force = %4.0f", (float) force); - m_textLine += DRAW_STRING_NEW_LINE; - } - - static Test* Create() - { - return new Prismatic; - } - - b2PrismaticJoint* m_joint; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Pulleys.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Pulleys.h deleted file mode 100644 index ad5dd8ce39..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Pulleys.h +++ /dev/null @@ -1,106 +0,0 @@ -/* -* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef PULLEYS_H -#define PULLEYS_H - -class Pulleys : public Test -{ -public: - Pulleys() - { - float32 y = 16.0f; - float32 L = 12.0f; - float32 a = 1.0f; - float32 b = 2.0f; - - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2EdgeShape edge; - edge.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - //ground->CreateFixture(&shape, 0.0f); - - b2CircleShape circle; - circle.m_radius = 2.0f; - - circle.m_p.Set(-10.0f, y + b + L); - ground->CreateFixture(&circle, 0.0f); - - circle.m_p.Set(10.0f, y + b + L); - ground->CreateFixture(&circle, 0.0f); - } - - { - - b2PolygonShape shape; - shape.SetAsBox(a, b); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - - //bd.fixedRotation = true; - bd.position.Set(-10.0f, y); - b2Body* body1 = m_world->CreateBody(&bd); - body1->CreateFixture(&shape, 5.0f); - - bd.position.Set(10.0f, y); - b2Body* body2 = m_world->CreateBody(&bd); - body2->CreateFixture(&shape, 5.0f); - - b2PulleyJointDef pulleyDef; - b2Vec2 anchor1(-10.0f, y + b); - b2Vec2 anchor2(10.0f, y + b); - b2Vec2 groundAnchor1(-10.0f, y + b + L); - b2Vec2 groundAnchor2(10.0f, y + b + L); - pulleyDef.Initialize(body1, body2, groundAnchor1, groundAnchor2, anchor1, anchor2, 1.5f); - - m_joint1 = (b2PulleyJoint*)m_world->CreateJoint(&pulleyDef); - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 0: - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - - float32 ratio = m_joint1->GetRatio(); - float32 L = m_joint1->GetCurrentLengthA() + ratio * m_joint1->GetCurrentLengthB(); - m_debugDraw.DrawString(5, m_textLine, "L1 + %4.2f * L2 = %4.2f", (float) ratio, (float) L); - m_textLine += DRAW_STRING_NEW_LINE; - } - - static Test* Create() - { - return new Pulleys; - } - - b2PulleyJoint* m_joint1; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Pyramid.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Pyramid.h deleted file mode 100644 index b52322ef01..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Pyramid.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef PYRAMID_H -#define PYRAMID_H - -class Pyramid : public Test -{ -public: - enum - { - e_count = 20 - }; - - Pyramid() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - float32 a = 0.5f; - b2PolygonShape shape; - shape.SetAsBox(a, a); - - b2Vec2 x(-7.0f, 0.75f); - b2Vec2 y; - b2Vec2 deltaX(0.5625f, 1.25f); - b2Vec2 deltaY(1.125f, 0.0f); - - for (int32 i = 0; i < e_count; ++i) - { - y = x; - - for (int32 j = i; j < e_count; ++j) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position = y; - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 5.0f); - - y += deltaY; - } - - x += deltaX; - } - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - - //b2DynamicTree* tree = &m_world->m_contactManager.m_broadPhase.m_tree; - - //if (m_stepCount == 400) - //{ - // tree->RebuildBottomUp(); - //} - } - - static Test* Create() - { - return new Pyramid; - } -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/RayCast.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/RayCast.h deleted file mode 100644 index 89d0bd06e2..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/RayCast.h +++ /dev/null @@ -1,481 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef RAY_CAST_H -#define RAY_CAST_H - -// This test demonstrates how to use the world ray-cast feature. -// NOTE: we are intentionally filtering one of the polygons, therefore -// the ray will always miss one type of polygon. - -// This callback finds the closest hit. Polygon 0 is filtered. -class RayCastClosestCallback : public b2RayCastCallback -{ -public: - RayCastClosestCallback() - { - m_hit = false; - } - - float32 ReportFixture(b2Fixture* fixture, const b2Vec2& point, const b2Vec2& normal, float32 fraction) - { - b2Body* body = fixture->GetBody(); - void* userData = body->GetUserData(); - if (userData) - { - int32 index = *(int32*)userData; - if (index == 0) - { - // By returning -1, we instruct the calling code to ignore this fixture and - // continue the ray-cast to the next fixture. - return -1.0f; - } - } - - m_hit = true; - m_point = point; - m_normal = normal; - - // By returning the current fraction, we instruct the calling code to clip the ray and - // continue the ray-cast to the next fixture. WARNING: do not assume that fixtures - // are reported in order. However, by clipping, we can always get the closest fixture. - return fraction; - } - - bool m_hit; - b2Vec2 m_point; - b2Vec2 m_normal; -}; - -// This callback finds any hit. Polygon 0 is filtered. For this type of query we are usually -// just checking for obstruction, so the actual fixture and hit point are irrelevant. -class RayCastAnyCallback : public b2RayCastCallback -{ -public: - RayCastAnyCallback() - { - m_hit = false; - } - - float32 ReportFixture(b2Fixture* fixture, const b2Vec2& point, const b2Vec2& normal, float32 fraction) - { - b2Body* body = fixture->GetBody(); - void* userData = body->GetUserData(); - if (userData) - { - int32 index = *(int32*)userData; - if (index == 0) - { - // By returning -1, we instruct the calling code to ignore this fixture - // and continue the ray-cast to the next fixture. - return -1.0f; - } - } - - m_hit = true; - m_point = point; - m_normal = normal; - - // At this point we have a hit, so we know the ray is obstructed. - // By returning 0, we instruct the calling code to terminate the ray-cast. - return 0.0f; - } - - bool m_hit; - b2Vec2 m_point; - b2Vec2 m_normal; -}; - -// This ray cast collects multiple hits along the ray. Polygon 0 is filtered. -// The fixtures are not necessary reported in order, so we might not capture -// the closest fixture. -class RayCastMultipleCallback : public b2RayCastCallback -{ -public: - enum - { - e_maxCount = 3 - }; - - RayCastMultipleCallback() - { - m_count = 0; - } - - float32 ReportFixture(b2Fixture* fixture, const b2Vec2& point, const b2Vec2& normal, float32 fraction) - { - b2Body* body = fixture->GetBody(); - void* userData = body->GetUserData(); - if (userData) - { - int32 index = *(int32*)userData; - if (index == 0) - { - // By returning -1, we instruct the calling code to ignore this fixture - // and continue the ray-cast to the next fixture. - return -1.0f; - } - } - - b2Assert(m_count < e_maxCount); - - m_points[m_count] = point; - m_normals[m_count] = normal; - ++m_count; - - if (m_count == e_maxCount) - { - // At this point the buffer is full. - // By returning 0, we instruct the calling code to terminate the ray-cast. - return 0.0f; - } - - // By returning 1, we instruct the caller to continue without clipping the ray. - return 1.0f; - } - - b2Vec2 m_points[e_maxCount]; - b2Vec2 m_normals[e_maxCount]; - int32 m_count; -}; - - -class RayCast : public Test -{ -public: - - enum - { - e_maxBodies = 256 - }; - - enum Mode - { - e_closest, - e_any, - e_multiple - }; - - RayCast() - { - // Ground body - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.5f, 0.0f); - vertices[1].Set(0.5f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - m_polygons[0].Set(vertices, 3); - } - - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.1f, 0.0f); - vertices[1].Set(0.1f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - m_polygons[1].Set(vertices, 3); - } - - { - float32 w = 1.0f; - float32 b = w / (2.0f + b2Sqrt(2.0f)); - float32 s = b2Sqrt(2.0f) * b; - - b2Vec2 vertices[8]; - vertices[0].Set(0.5f * s, 0.0f); - vertices[1].Set(0.5f * w, b); - vertices[2].Set(0.5f * w, b + s); - vertices[3].Set(0.5f * s, w); - vertices[4].Set(-0.5f * s, w); - vertices[5].Set(-0.5f * w, b + s); - vertices[6].Set(-0.5f * w, b); - vertices[7].Set(-0.5f * s, 0.0f); - - m_polygons[2].Set(vertices, 8); - } - - { - m_polygons[3].SetAsBox(0.5f, 0.5f); - } - - { - m_circle.m_radius = 0.5f; - } - - { - m_edge.Set(b2Vec2(-1.0f, 0.0f), b2Vec2(1.0f, 0.0f)); - } - - m_bodyIndex = 0; - memset(m_bodies, 0, sizeof(m_bodies)); - - m_angle = 0.0f; - - m_mode = e_closest; - } - - void Create(int32 index) - { - if (m_bodies[m_bodyIndex] != NULL) - { - m_world->DestroyBody(m_bodies[m_bodyIndex]); - m_bodies[m_bodyIndex] = NULL; - } - - b2BodyDef bd; - - float32 x = RandomFloat(-10.0f, 10.0f); - float32 y = RandomFloat(0.0f, 20.0f); - bd.position.Set(x, y); - bd.angle = RandomFloat(-b2_pi, b2_pi); - - m_userData[m_bodyIndex] = index; - bd.userData = m_userData + m_bodyIndex; - - if (index == 4) - { - bd.angularDamping = 0.02f; - } - - m_bodies[m_bodyIndex] = m_world->CreateBody(&bd); - - if (index < 4) - { - b2FixtureDef fd; - fd.shape = m_polygons + index; - fd.friction = 0.3f; - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } - else if (index < 5) - { - b2FixtureDef fd; - fd.shape = &m_circle; - fd.friction = 0.3f; - - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } - else - { - b2FixtureDef fd; - fd.shape = &m_edge; - fd.friction = 0.3f; - - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } - - m_bodyIndex = (m_bodyIndex + 1) % e_maxBodies; - } - - void DestroyBody() - { - for (int32 i = 0; i < e_maxBodies; ++i) - { - if (m_bodies[i] != NULL) - { - m_world->DestroyBody(m_bodies[i]); - m_bodies[i] = NULL; - return; - } - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - Create(key - '1'); - break; - - case 'd': - DestroyBody(); - break; - - case 'm': - if (m_mode == e_closest) - { - m_mode = e_any; - } - else if (m_mode == e_any) - { - m_mode = e_multiple; - } - else if (m_mode == e_multiple) - { - m_mode = e_closest; - } - } - } - - void Step(Settings* settings) - { - bool advanceRay = settings->pause == 0 || settings->singleStep; - - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Press 1-6 to drop stuff, m to change the mode"); - m_textLine += DRAW_STRING_NEW_LINE; - switch (m_mode) - { - case e_closest: - m_debugDraw.DrawString(5, m_textLine, "Ray-cast mode: closest - find closest fixture along the ray"); - break; - - case e_any: - m_debugDraw.DrawString(5, m_textLine, "Ray-cast mode: any - check for obstruction"); - break; - - case e_multiple: - m_debugDraw.DrawString(5, m_textLine, "Ray-cast mode: multiple - gather multiple fixtures"); - break; - } - - m_textLine += DRAW_STRING_NEW_LINE; - - float32 L = 11.0f; - b2Vec2 point1(0.0f, 10.0f); - b2Vec2 d(L * cosf(m_angle), L * sinf(m_angle)); - b2Vec2 point2 = point1 + d; - - if (m_mode == e_closest) - { - RayCastClosestCallback callback; - m_world->RayCast(&callback, point1, point2); - - if (callback.m_hit) - { - m_debugDraw.DrawPoint(callback.m_point, 5.0f, b2Color(0.4f, 0.9f, 0.4f)); - m_debugDraw.DrawSegment(point1, callback.m_point, b2Color(0.8f, 0.8f, 0.8f)); - b2Vec2 head = callback.m_point + 0.5f * callback.m_normal; - m_debugDraw.DrawSegment(callback.m_point, head, b2Color(0.9f, 0.9f, 0.4f)); - } - else - { - m_debugDraw.DrawSegment(point1, point2, b2Color(0.8f, 0.8f, 0.8f)); - } - } - else if (m_mode == e_any) - { - RayCastAnyCallback callback; - m_world->RayCast(&callback, point1, point2); - - if (callback.m_hit) - { - m_debugDraw.DrawPoint(callback.m_point, 5.0f, b2Color(0.4f, 0.9f, 0.4f)); - m_debugDraw.DrawSegment(point1, callback.m_point, b2Color(0.8f, 0.8f, 0.8f)); - b2Vec2 head = callback.m_point + 0.5f * callback.m_normal; - m_debugDraw.DrawSegment(callback.m_point, head, b2Color(0.9f, 0.9f, 0.4f)); - } - else - { - m_debugDraw.DrawSegment(point1, point2, b2Color(0.8f, 0.8f, 0.8f)); - } - } - else if (m_mode == e_multiple) - { - RayCastMultipleCallback callback; - m_world->RayCast(&callback, point1, point2); - m_debugDraw.DrawSegment(point1, point2, b2Color(0.8f, 0.8f, 0.8f)); - - for (int32 i = 0; i < callback.m_count; ++i) - { - b2Vec2 p = callback.m_points[i]; - b2Vec2 n = callback.m_normals[i]; - m_debugDraw.DrawPoint(p, 5.0f, b2Color(0.4f, 0.9f, 0.4f)); - m_debugDraw.DrawSegment(point1, p, b2Color(0.8f, 0.8f, 0.8f)); - b2Vec2 head = p + 0.5f * n; - m_debugDraw.DrawSegment(p, head, b2Color(0.9f, 0.9f, 0.4f)); - } - } - - if (advanceRay) - { - m_angle += 0.25f * b2_pi / 180.0f; - } - -#if 0 - // This case was failing. - { - b2Vec2 vertices[4]; - //vertices[0].Set(-22.875f, -3.0f); - //vertices[1].Set(22.875f, -3.0f); - //vertices[2].Set(22.875f, 3.0f); - //vertices[3].Set(-22.875f, 3.0f); - - b2PolygonShape shape; - //shape.Set(vertices, 4); - shape.SetAsBox(22.875f, 3.0f); - - b2RayCastInput input; - input.p1.Set(10.2725f,1.71372f); - input.p2.Set(10.2353f,2.21807f); - //input.maxFraction = 0.567623f; - input.maxFraction = 0.56762173f; - - b2Transform xf; - xf.SetIdentity(); - xf.position.Set(23.0f, 5.0f); - - b2RayCastOutput output; - bool hit; - hit = shape.RayCast(&output, input, xf); - hit = false; - - b2Color color(1.0f, 1.0f, 1.0f); - b2Vec2 vs[4]; - for (int32 i = 0; i < 4; ++i) - { - vs[i] = b2Mul(xf, shape.m_vertices[i]); - } - - m_debugDraw.DrawPolygon(vs, 4, color); - m_debugDraw.DrawSegment(input.p1, input.p2, color); - } -#endif - } - - static Test* Create() - { - return new RayCast; - } - - int32 m_bodyIndex; - b2Body* m_bodies[e_maxBodies]; - int32 m_userData[e_maxBodies]; - b2PolygonShape m_polygons[4]; - b2CircleShape m_circle; - b2EdgeShape m_edge; - - float32 m_angle; - - Mode m_mode; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Revolute.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Revolute.h deleted file mode 100644 index 6501eb6cba..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Revolute.h +++ /dev/null @@ -1,166 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef REVOLUTE_H -#define REVOLUTE_H - -class Revolute : public Test -{ -public: - Revolute() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - - b2FixtureDef fd; - fd.shape = &shape; - //fd.filter.categoryBits = 2; - - ground->CreateFixture(&fd); - } - - { - b2CircleShape shape; - shape.m_radius = 0.5f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - - b2RevoluteJointDef rjd; - - bd.position.Set(-10.0f, 20.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 5.0f); - - float32 w = 100.0f; - body->SetAngularVelocity(w); - body->SetLinearVelocity(b2Vec2(-8.0f * w, 0.0f)); - - rjd.Initialize(ground, body, b2Vec2(-10.0f, 12.0f)); - rjd.motorSpeed = 1.0f * b2_pi; - rjd.maxMotorTorque = 10000.0f; - rjd.enableMotor = false; - rjd.lowerAngle = -0.25f * b2_pi; - rjd.upperAngle = 0.5f * b2_pi; - rjd.enableLimit = true; - rjd.collideConnected = true; - - m_joint = (b2RevoluteJoint*)m_world->CreateJoint(&rjd); - } - - { - b2CircleShape circle_shape; - circle_shape.m_radius = 3.0f; - - b2BodyDef circle_bd; - circle_bd.type = b2_dynamicBody; - circle_bd.position.Set(5.0f, 30.0f); - - b2FixtureDef fd; - fd.density = 5.0f; - fd.filter.maskBits = 1; - fd.shape = &circle_shape; - - m_ball = m_world->CreateBody(&circle_bd); - m_ball->CreateFixture(&fd); - - b2PolygonShape polygon_shape; - polygon_shape.SetAsBox(10.0f, 0.2f, b2Vec2 (-10.0f, 0.0f), 0.0f); - - b2BodyDef polygon_bd; - polygon_bd.position.Set(20.0f, 10.0f); - polygon_bd.type = b2_dynamicBody; - polygon_bd.bullet = true; - b2Body* polygon_body = m_world->CreateBody(&polygon_bd); - polygon_body->CreateFixture(&polygon_shape, 2.0f); - - b2RevoluteJointDef rjd; - rjd.Initialize(ground, polygon_body, b2Vec2(20.0f, 10.0f)); - rjd.lowerAngle = -0.25f * b2_pi; - rjd.upperAngle = 0.0f * b2_pi; - rjd.enableLimit = true; - m_world->CreateJoint(&rjd); - } - - // Tests mass computation of a small object far from the origin - { - b2BodyDef bodyDef; - bodyDef.type = b2_dynamicBody; - b2Body* body = m_world->CreateBody(&bodyDef); - - b2PolygonShape polyShape; - b2Vec2 verts[3]; - verts[0].Set( 17.63f, 36.31f ); - verts[1].Set( 17.52f, 36.69f ); - verts[2].Set( 17.19f, 36.36f ); - polyShape.Set(verts, 3); - - b2FixtureDef polyFixtureDef; - polyFixtureDef.shape = &polyShape; - polyFixtureDef.density = 1; - - body->CreateFixture(&polyFixtureDef); //assertion hits inside here - } - - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'l': - m_joint->EnableLimit(!m_joint->IsLimitEnabled()); - break; - - case 'm': - m_joint->EnableMotor(!m_joint->IsMotorEnabled()); - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Keys: (l) limits, (m) motor"); - m_textLine += DRAW_STRING_NEW_LINE; - - //if (m_stepCount == 360) - //{ - // m_ball->SetTransform(b2Vec2(0.0f, 0.5f), 0.0f); - //} - - //float32 torque1 = m_joint1->GetMotorTorque(); - //m_debugDraw.DrawString(5, m_textLine, "Motor Torque = %4.0f, %4.0f : Motor Force = %4.0f", (float) torque1, (float) torque2, (float) force3); - //m_textLine += DRAW_STRING_NEW_LINE; - } - - static Test* Create() - { - return new Revolute; - } - - b2Body* m_ball; - b2RevoluteJoint* m_joint; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Rope.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Rope.h deleted file mode 100644 index b479134e94..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Rope.h +++ /dev/null @@ -1,101 +0,0 @@ -/* -* Copyright (c) 2011 Erin Catto http://box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef ROPE_H -#define ROPE_H - -/// -class Rope : public Test -{ -public: - Rope() - { - const int32 N = 40; - b2Vec2 vertices[N]; - float32 masses[N]; - - for (int32 i = 0; i < N; ++i) - { - vertices[i].Set(0.0f, 20.0f - 0.25f * i); - masses[i] = 1.0f; - } - masses[0] = 0.0f; - masses[1] = 0.0f; - - b2RopeDef def; - def.vertices = vertices; - def.count = N; - def.gravity.Set(0.0f, -10.0f); - def.masses = masses; - def.damping = 0.1f; - def.k2 = 1.0f; - def.k3 = 0.5f; - - m_rope.Initialize(&def); - - m_angle = 0.0f; - m_rope.SetAngle(m_angle); - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'q': - m_angle = b2Max(-b2_pi, m_angle - 0.05f * b2_pi); - m_rope.SetAngle(m_angle); - break; - - case 'e': - m_angle = b2Min(b2_pi, m_angle + 0.05f * b2_pi); - m_rope.SetAngle(m_angle); - break; - } - } - - void Step(Settings* settings) - { - float32 dt = settings->hz > 0.0f ? 1.0f / settings->hz : 0.0f; - - if (settings->pause == 1 && settings->singleStep == 0) - { - dt = 0.0f; - } - - m_rope.Step(dt, 1); - - Test::Step(settings); - - m_rope.Draw(&m_debugDraw); - - m_debugDraw.DrawString(5, m_textLine, "Press (q,e) to adjust target angle"); - m_textLine += DRAW_STRING_NEW_LINE; - m_debugDraw.DrawString(5, m_textLine, "Target angle = %g degrees", m_angle * 180.0f / b2_pi); - m_textLine += DRAW_STRING_NEW_LINE; - } - - static Test* Create() - { - return new Rope; - } - - b2Rope m_rope; - float32 m_angle; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/RopeJoint.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/RopeJoint.h deleted file mode 100644 index a8b935201a..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/RopeJoint.h +++ /dev/null @@ -1,145 +0,0 @@ -/* -* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef ROPE_JOINT_H -#define ROPE_JOINT_H - -/// This test shows how a rope joint can be used to stabilize a chain of -/// bodies with a heavy payload. Notice that the rope joint just prevents -/// excessive stretching and has no other effect. -/// By disabling the rope joint you can see that the Box2D solver has trouble -/// supporting heavy bodies with light bodies. Try playing around with the -/// densities, time step, and iterations to see how they affect stability. -/// This test also shows how to use contact filtering. Filtering is configured -/// so that the payload does not collide with the chain. -class RopeJoint : public Test -{ -public: - RopeJoint() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.125f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - fd.friction = 0.2f; - fd.filter.categoryBits = 0x0001; - fd.filter.maskBits = 0xFFFF & ~0x0002; - - b2RevoluteJointDef jd; - jd.collideConnected = false; - - const int32 N = 10; - const float32 y = 15.0f; - m_ropeDef.localAnchorA.Set(0.0f, y); - - b2Body* prevBody = ground; - for (int32 i = 0; i < N; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.5f + 1.0f * i, y); - if (i == N - 1) - { - shape.SetAsBox(1.5f, 1.5f); - fd.density = 100.0f; - fd.filter.categoryBits = 0x0002; - bd.position.Set(1.0f * i, y); - bd.angularDamping = 0.4f; - } - - b2Body* body = m_world->CreateBody(&bd); - - body->CreateFixture(&fd); - - b2Vec2 anchor(float32(i), y); - jd.Initialize(prevBody, body, anchor); - m_world->CreateJoint(&jd); - - prevBody = body; - } - - m_ropeDef.localAnchorB.SetZero(); - - float32 extraLength = 0.01f; - m_ropeDef.maxLength = N - 1.0f + extraLength; - m_ropeDef.bodyB = prevBody; - } - - { - m_ropeDef.bodyA = ground; - m_rope = m_world->CreateJoint(&m_ropeDef); - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'j': - if (m_rope) - { - m_world->DestroyJoint(m_rope); - m_rope = NULL; - } - else - { - m_rope = m_world->CreateJoint(&m_ropeDef); - } - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Press (j) to toggle the rope joint."); - m_textLine += DRAW_STRING_NEW_LINE; - if (m_rope) - { - m_debugDraw.DrawString(5, m_textLine, "Rope ON"); - } - else - { - m_debugDraw.DrawString(5, m_textLine, "Rope OFF"); - } - m_textLine += DRAW_STRING_NEW_LINE; - } - - static Test* Create() - { - return new RopeJoint; - } - - b2RopeJointDef m_ropeDef; - b2Joint* m_rope; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/SensorTest.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/SensorTest.h deleted file mode 100644 index f15cd7714e..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/SensorTest.h +++ /dev/null @@ -1,181 +0,0 @@ -/* -* Copyright (c) 2008-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SENSOR_TEST_H -#define SENSOR_TEST_H - -// This is used to test sensor shapes. -class SensorTest : public Test -{ -public: - - enum - { - e_count = 7 - }; - - SensorTest() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - { - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - -#if 0 - { - b2FixtureDef sd; - sd.SetAsBox(10.0f, 2.0f, b2Vec2(0.0f, 20.0f), 0.0f); - sd.isSensor = true; - m_sensor = ground->CreateFixture(&sd); - } -#else - { - b2CircleShape shape; - shape.m_radius = 5.0f; - shape.m_p.Set(0.0f, 10.0f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.isSensor = true; - m_sensor = ground->CreateFixture(&fd); - } -#endif - } - - { - b2CircleShape shape; - shape.m_radius = 1.0f; - - for (int32 i = 0; i < e_count; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-10.0f + 3.0f * i, 20.0f); - bd.userData = m_touching + i; - - m_touching[i] = false; - m_bodies[i] = m_world->CreateBody(&bd); - - m_bodies[i]->CreateFixture(&shape, 1.0f); - } - } - } - - // Implement contact listener. - void BeginContact(b2Contact* contact) - { - b2Fixture* fixtureA = contact->GetFixtureA(); - b2Fixture* fixtureB = contact->GetFixtureB(); - - if (fixtureA == m_sensor) - { - void* userData = fixtureB->GetBody()->GetUserData(); - if (userData) - { - bool* touching = (bool*)userData; - *touching = true; - } - } - - if (fixtureB == m_sensor) - { - void* userData = fixtureA->GetBody()->GetUserData(); - if (userData) - { - bool* touching = (bool*)userData; - *touching = true; - } - } - } - - // Implement contact listener. - void EndContact(b2Contact* contact) - { - b2Fixture* fixtureA = contact->GetFixtureA(); - b2Fixture* fixtureB = contact->GetFixtureB(); - - if (fixtureA == m_sensor) - { - void* userData = fixtureB->GetBody()->GetUserData(); - if (userData) - { - bool* touching = (bool*)userData; - *touching = false; - } - } - - if (fixtureB == m_sensor) - { - void* userData = fixtureA->GetBody()->GetUserData(); - if (userData) - { - bool* touching = (bool*)userData; - *touching = false; - } - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - - // Traverse the contact results. Apply a force on shapes - // that overlap the sensor. - for (int32 i = 0; i < e_count; ++i) - { - if (m_touching[i] == false) - { - continue; - } - - b2Body* body = m_bodies[i]; - b2Body* ground = m_sensor->GetBody(); - - b2CircleShape* circle = (b2CircleShape*)m_sensor->GetShape(); - b2Vec2 center = ground->GetWorldPoint(circle->m_p); - - b2Vec2 position = body->GetPosition(); - - b2Vec2 d = center - position; - if (d.LengthSquared() < FLT_EPSILON * FLT_EPSILON) - { - continue; - } - - d.Normalize(); - b2Vec2 F = 100.0f * d; - body->ApplyForce(F, position, false); - } - } - - static Test* Create() - { - return new SensorTest; - } - - b2Fixture* m_sensor; - b2Body* m_bodies[e_count]; - bool m_touching[e_count]; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/ShapeEditing.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/ShapeEditing.h deleted file mode 100644 index 5cea181793..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/ShapeEditing.h +++ /dev/null @@ -1,105 +0,0 @@ -/* -* Copyright (c) 2008-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SHAPE_EDITING_H -#define SHAPE_EDITING_H - -class ShapeEditing : public Test -{ -public: - - ShapeEditing() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 10.0f); - m_body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(4.0f, 4.0f, b2Vec2(0.0f, 0.0f), 0.0f); - m_fixture1 = m_body->CreateFixture(&shape, 10.0f); - - m_fixture2 = NULL; - - m_sensor = false; - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'c': - if (m_fixture2 == NULL) - { - b2CircleShape shape; - shape.m_radius = 3.0f; - shape.m_p.Set(0.5f, -4.0f); - m_fixture2 = m_body->CreateFixture(&shape, 10.0f); - m_body->SetAwake(true); - } - break; - - case 'd': - if (m_fixture2 != NULL) - { - m_body->DestroyFixture(m_fixture2); - m_fixture2 = NULL; - m_body->SetAwake(true); - } - break; - - case 's': - if (m_fixture2 != NULL) - { - m_sensor = !m_sensor; - m_fixture2->SetSensor(m_sensor); - } - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Press: (c) create a shape, (d) destroy a shape."); - m_textLine += DRAW_STRING_NEW_LINE; - m_debugDraw.DrawString(5, m_textLine, "sensor = %d", m_sensor); - m_textLine += DRAW_STRING_NEW_LINE; - } - - static Test* Create() - { - return new ShapeEditing; - } - - b2Body* m_body; - b2Fixture* m_fixture1; - b2Fixture* m_fixture2; - bool m_sensor; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/SliderCrank.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/SliderCrank.h deleted file mode 100644 index 7d914d7eed..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/SliderCrank.h +++ /dev/null @@ -1,156 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SLIDER_CRANK_H -#define SLIDER_CRANK_H - -// A motor driven slider crank with joint friction. - -class SliderCrank : public Test -{ -public: - SliderCrank() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2Body* prevBody = ground; - - // Define crank. - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 2.0f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 7.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 2.0f); - - b2RevoluteJointDef rjd; - rjd.Initialize(prevBody, body, b2Vec2(0.0f, 5.0f)); - rjd.motorSpeed = 1.0f * b2_pi; - rjd.maxMotorTorque = 10000.0f; - rjd.enableMotor = true; - m_joint1 = (b2RevoluteJoint*)m_world->CreateJoint(&rjd); - - prevBody = body; - } - - // Define follower. - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 4.0f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 13.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 2.0f); - - b2RevoluteJointDef rjd; - rjd.Initialize(prevBody, body, b2Vec2(0.0f, 9.0f)); - rjd.enableMotor = false; - m_world->CreateJoint(&rjd); - - prevBody = body; - } - - // Define piston - { - b2PolygonShape shape; - shape.SetAsBox(1.5f, 1.5f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.fixedRotation = true; - bd.position.Set(0.0f, 17.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 2.0f); - - b2RevoluteJointDef rjd; - rjd.Initialize(prevBody, body, b2Vec2(0.0f, 17.0f)); - m_world->CreateJoint(&rjd); - - b2PrismaticJointDef pjd; - pjd.Initialize(ground, body, b2Vec2(0.0f, 17.0f), b2Vec2(0.0f, 1.0f)); - - pjd.maxMotorForce = 1000.0f; - pjd.enableMotor = true; - - m_joint2 = (b2PrismaticJoint*)m_world->CreateJoint(&pjd); - } - - // Create a payload - { - b2PolygonShape shape; - shape.SetAsBox(1.5f, 1.5f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 23.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 2.0f); - } - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'f': - m_joint2->EnableMotor(!m_joint2->IsMotorEnabled()); - m_joint2->GetBodyB()->SetAwake(true); - break; - - case 'm': - m_joint1->EnableMotor(!m_joint1->IsMotorEnabled()); - m_joint1->GetBodyB()->SetAwake(true); - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Keys: (f) toggle friction, (m) toggle motor"); - m_textLine += DRAW_STRING_NEW_LINE; - float32 torque = m_joint1->GetMotorTorque(settings->hz); - m_debugDraw.DrawString(5, m_textLine, "Motor Torque = %5.0f", (float) torque); - m_textLine += DRAW_STRING_NEW_LINE; - } - - static Test* Create() - { - return new SliderCrank; - } - - b2RevoluteJoint* m_joint1; - b2PrismaticJoint* m_joint2; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/SphereStack.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/SphereStack.h deleted file mode 100644 index 2948cbfd48..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/SphereStack.h +++ /dev/null @@ -1,86 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SPHERE_STACK_H -#define SPHERE_STACK_H - -class SphereStack : public Test -{ -public: - - enum - { - e_count = 10 - }; - - SphereStack() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2CircleShape shape; - shape.m_radius = 1.0f; - - for (int32 i = 0; i < e_count; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0, 4.0f + 3.0f * i); - - m_bodies[i] = m_world->CreateBody(&bd); - - m_bodies[i]->CreateFixture(&shape, 1.0f); - - m_bodies[i]->SetLinearVelocity(b2Vec2(0.0f, -50.0f)); - } - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - - //for (int32 i = 0; i < e_count; ++i) - //{ - // printf("%g ", m_bodies[i]->GetWorldCenter().y); - //} - - //for (int32 i = 0; i < e_count; ++i) - //{ - // printf("%g ", m_bodies[i]->GetLinearVelocity().y); - //} - - //printf("\n"); - } - - static Test* Create() - { - return new SphereStack; - } - - b2Body* m_bodies[e_count]; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/TheoJansen.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/TheoJansen.h deleted file mode 100644 index f884d68176..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/TheoJansen.h +++ /dev/null @@ -1,256 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -// Inspired by a contribution by roman_m -// Dimensions scooped from APE (http://www.cove.org/ape/index.htm) - -#ifndef THEO_JANSEN_H -#define THEO_JANSEN_H - -class TheoJansen : public Test -{ -public: - - void CreateLeg(float32 s, const b2Vec2& wheelAnchor) - { - b2Vec2 p1(5.4f * s, -6.1f); - b2Vec2 p2(7.2f * s, -1.2f); - b2Vec2 p3(4.3f * s, -1.9f); - b2Vec2 p4(3.1f * s, 0.8f); - b2Vec2 p5(6.0f * s, 1.5f); - b2Vec2 p6(2.5f * s, 3.7f); - - b2FixtureDef fd1, fd2; - fd1.filter.groupIndex = -1; - fd2.filter.groupIndex = -1; - fd1.density = 1.0f; - fd2.density = 1.0f; - - b2PolygonShape poly1, poly2; - - if (s > 0.0f) - { - b2Vec2 vertices[3]; - - vertices[0] = p1; - vertices[1] = p2; - vertices[2] = p3; - poly1.Set(vertices, 3); - - vertices[0] = b2Vec2_zero; - vertices[1] = p5 - p4; - vertices[2] = p6 - p4; - poly2.Set(vertices, 3); - } - else - { - b2Vec2 vertices[3]; - - vertices[0] = p1; - vertices[1] = p3; - vertices[2] = p2; - poly1.Set(vertices, 3); - - vertices[0] = b2Vec2_zero; - vertices[1] = p6 - p4; - vertices[2] = p5 - p4; - poly2.Set(vertices, 3); - } - - fd1.shape = &poly1; - fd2.shape = &poly2; - - b2BodyDef bd1, bd2; - bd1.type = b2_dynamicBody; - bd2.type = b2_dynamicBody; - bd1.position = m_offset; - bd2.position = p4 + m_offset; - - bd1.angularDamping = 10.0f; - bd2.angularDamping = 10.0f; - - b2Body* body1 = m_world->CreateBody(&bd1); - b2Body* body2 = m_world->CreateBody(&bd2); - - body1->CreateFixture(&fd1); - body2->CreateFixture(&fd2); - - b2DistanceJointDef djd; - - // Using a soft distance constraint can reduce some jitter. - // It also makes the structure seem a bit more fluid by - // acting like a suspension system. - djd.dampingRatio = 0.5f; - djd.frequencyHz = 10.0f; - - djd.Initialize(body1, body2, p2 + m_offset, p5 + m_offset); - m_world->CreateJoint(&djd); - - djd.Initialize(body1, body2, p3 + m_offset, p4 + m_offset); - m_world->CreateJoint(&djd); - - djd.Initialize(body1, m_wheel, p3 + m_offset, wheelAnchor + m_offset); - m_world->CreateJoint(&djd); - - djd.Initialize(body2, m_wheel, p6 + m_offset, wheelAnchor + m_offset); - m_world->CreateJoint(&djd); - - b2RevoluteJointDef rjd; - - rjd.Initialize(body2, m_chassis, p4 + m_offset); - m_world->CreateJoint(&rjd); - } - - TheoJansen() - { - m_offset.Set(0.0f, 8.0f); - m_motorSpeed = 2.0f; - m_motorOn = true; - b2Vec2 pivot(0.0f, 0.8f); - - // Ground - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-50.0f, 0.0f), b2Vec2(50.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - - shape.Set(b2Vec2(-50.0f, 0.0f), b2Vec2(-50.0f, 10.0f)); - ground->CreateFixture(&shape, 0.0f); - - shape.Set(b2Vec2(50.0f, 0.0f), b2Vec2(50.0f, 10.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - // Balls - for (int32 i = 0; i < 40; ++i) - { - b2CircleShape shape; - shape.m_radius = 0.25f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-40.0f + 2.0f * i, 0.5f); - - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 1.0f); - } - - // Chassis - { - b2PolygonShape shape; - shape.SetAsBox(2.5f, 1.0f); - - b2FixtureDef sd; - sd.density = 1.0f; - sd.shape = &shape; - sd.filter.groupIndex = -1; - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position = pivot + m_offset; - m_chassis = m_world->CreateBody(&bd); - m_chassis->CreateFixture(&sd); - } - - { - b2CircleShape shape; - shape.m_radius = 1.6f; - - b2FixtureDef sd; - sd.density = 1.0f; - sd.shape = &shape; - sd.filter.groupIndex = -1; - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position = pivot + m_offset; - m_wheel = m_world->CreateBody(&bd); - m_wheel->CreateFixture(&sd); - } - - { - b2RevoluteJointDef jd; - jd.Initialize(m_wheel, m_chassis, pivot + m_offset); - jd.collideConnected = false; - jd.motorSpeed = m_motorSpeed; - jd.maxMotorTorque = 400.0f; - jd.enableMotor = m_motorOn; - m_motorJoint = (b2RevoluteJoint*)m_world->CreateJoint(&jd); - } - - b2Vec2 wheelAnchor; - - wheelAnchor = pivot + b2Vec2(0.0f, -0.8f); - - CreateLeg(-1.0f, wheelAnchor); - CreateLeg(1.0f, wheelAnchor); - - m_wheel->SetTransform(m_wheel->GetPosition(), 120.0f * b2_pi / 180.0f); - CreateLeg(-1.0f, wheelAnchor); - CreateLeg(1.0f, wheelAnchor); - - m_wheel->SetTransform(m_wheel->GetPosition(), -120.0f * b2_pi / 180.0f); - CreateLeg(-1.0f, wheelAnchor); - CreateLeg(1.0f, wheelAnchor); - } - - void Step(Settings* settings) - { - m_debugDraw.DrawString(5, m_textLine, "Keys: left = a, brake = s, right = d, toggle motor = m"); - m_textLine += DRAW_STRING_NEW_LINE; - - Test::Step(settings); - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'a': - m_motorJoint->SetMotorSpeed(-m_motorSpeed); - break; - - case 's': - m_motorJoint->SetMotorSpeed(0.0f); - break; - - case 'd': - m_motorJoint->SetMotorSpeed(m_motorSpeed); - break; - - case 'm': - m_motorJoint->EnableMotor(!m_motorJoint->IsMotorEnabled()); - break; - } - } - - static Test* Create() - { - return new TheoJansen; - } - - b2Vec2 m_offset; - b2Body* m_chassis; - b2Body* m_wheel; - b2RevoluteJoint* m_motorJoint; - bool m_motorOn; - float32 m_motorSpeed; -}; - -#endif // THEO_JANSEN_H diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Tiles.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Tiles.h deleted file mode 100644 index 9d675d2c88..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Tiles.h +++ /dev/null @@ -1,156 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef TILES_H -#define TILES_H - -/// This stress tests the dynamic tree broad-phase. This also shows that tile -/// based collision is _not_ smooth due to Box2D not knowing about adjacency. -class Tiles : public Test -{ -public: - enum - { - e_count = 20 - }; - - Tiles() - { - m_fixtureCount = 0; - b2Timer timer; - - { - float32 a = 0.5f; - b2BodyDef bd; - bd.position.y = -a; - b2Body* ground = m_world->CreateBody(&bd); - -#if 1 - int32 N = 200; - int32 M = 10; - b2Vec2 position; - position.y = 0.0f; - for (int32 j = 0; j < M; ++j) - { - position.x = -N * a; - for (int32 i = 0; i < N; ++i) - { - b2PolygonShape shape; - shape.SetAsBox(a, a, position, 0.0f); - ground->CreateFixture(&shape, 0.0f); - ++m_fixtureCount; - position.x += 2.0f * a; - } - position.y -= 2.0f * a; - } -#else - int32 N = 200; - int32 M = 10; - b2Vec2 position; - position.x = -N * a; - for (int32 i = 0; i < N; ++i) - { - position.y = 0.0f; - for (int32 j = 0; j < M; ++j) - { - b2PolygonShape shape; - shape.SetAsBox(a, a, position, 0.0f); - ground->CreateFixture(&shape, 0.0f); - position.y -= 2.0f * a; - } - position.x += 2.0f * a; - } -#endif - } - - { - float32 a = 0.5f; - b2PolygonShape shape; - shape.SetAsBox(a, a); - - b2Vec2 x(-7.0f, 0.75f); - b2Vec2 y; - b2Vec2 deltaX(0.5625f, 1.25f); - b2Vec2 deltaY(1.125f, 0.0f); - - for (int32 i = 0; i < e_count; ++i) - { - y = x; - - for (int32 j = i; j < e_count; ++j) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position = y; - - //if (i == 0 && j == 0) - //{ - // bd.allowSleep = false; - //} - //else - //{ - // bd.allowSleep = true; - //} - - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 5.0f); - ++m_fixtureCount; - y += deltaY; - } - - x += deltaX; - } - } - - m_createTime = timer.GetMilliseconds(); - } - - void Step(Settings* settings) - { - const b2ContactManager& cm = m_world->GetContactManager(); - int32 height = cm.m_broadPhase.GetTreeHeight(); - int32 leafCount = cm.m_broadPhase.GetProxyCount(); - int32 minimumNodeCount = 2 * leafCount - 1; - float32 minimumHeight = ceilf(logf(float32(minimumNodeCount)) / logf(2.0f)); - m_debugDraw.DrawString(5, m_textLine, "dynamic tree height = %d, min = %d", height, int32(minimumHeight)); - m_textLine += DRAW_STRING_NEW_LINE; - - Test::Step(settings); - - m_debugDraw.DrawString(5, m_textLine, "create time = %6.2f ms, fixture count = %d", - m_createTime, m_fixtureCount); - m_textLine += DRAW_STRING_NEW_LINE; - - //b2DynamicTree* tree = &m_world->m_contactManager.m_broadPhase.m_tree; - - //if (m_stepCount == 400) - //{ - // tree->RebuildBottomUp(); - //} - } - - static Test* Create() - { - return new Tiles; - } - - int32 m_fixtureCount; - float32 m_createTime; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/TimeOfImpact.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/TimeOfImpact.h deleted file mode 100644 index 3d72eeda7b..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/TimeOfImpact.h +++ /dev/null @@ -1,127 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef TIME_OF_IMPACT_H -#define TIME_OF_IMPACT_H - -class TimeOfImpact : public Test -{ -public: - TimeOfImpact() - { - m_shapeA.SetAsBox(25.0f, 5.0f); - m_shapeB.SetAsBox(2.5f, 2.5f); - } - - static Test* Create() - { - return new TimeOfImpact; - } - - void Step(Settings* settings) - { - Test::Step(settings); - - b2Sweep sweepA; - sweepA.c0.Set(24.0f, -60.0f); - sweepA.a0 = 2.95f; - sweepA.c = sweepA.c0; - sweepA.a = sweepA.a0; - sweepA.localCenter.SetZero(); - - b2Sweep sweepB; - sweepB.c0.Set(53.474274f, -50.252514f); - sweepB.a0 = 513.36676f; // - 162.0f * b2_pi; - sweepB.c.Set(54.595478f, -51.083473f); - sweepB.a = 513.62781f; // - 162.0f * b2_pi; - sweepB.localCenter.SetZero(); - - //sweepB.a0 -= 300.0f * b2_pi; - //sweepB.a -= 300.0f * b2_pi; - - b2TOIInput input; - input.proxyA.Set(&m_shapeA, 0); - input.proxyB.Set(&m_shapeB, 0); - input.sweepA = sweepA; - input.sweepB = sweepB; - input.tMax = 1.0f; - - b2TOIOutput output; - - b2TimeOfImpact(&output, &input); - - m_debugDraw.DrawString(5, m_textLine, "toi = %g", output.t); - m_textLine += DRAW_STRING_NEW_LINE; - - extern int32 b2_toiMaxIters, b2_toiMaxRootIters; - m_debugDraw.DrawString(5, m_textLine, "max toi iters = %d, max root iters = %d", b2_toiMaxIters, b2_toiMaxRootIters); - m_textLine += DRAW_STRING_NEW_LINE; - - b2Vec2 vertices[b2_maxPolygonVertices]; - - b2Transform transformA; - sweepA.GetTransform(&transformA, 0.0f); - for (int32 i = 0; i < m_shapeA.m_count; ++i) - { - vertices[i] = b2Mul(transformA, m_shapeA.m_vertices[i]); - } - m_debugDraw.DrawPolygon(vertices, m_shapeA.m_count, b2Color(0.9f, 0.9f, 0.9f)); - - b2Transform transformB; - sweepB.GetTransform(&transformB, 0.0f); - - //b2Vec2 localPoint(2.0f, -0.1f); - - for (int32 i = 0; i < m_shapeB.m_count; ++i) - { - vertices[i] = b2Mul(transformB, m_shapeB.m_vertices[i]); - } - m_debugDraw.DrawPolygon(vertices, m_shapeB.m_count, b2Color(0.5f, 0.9f, 0.5f)); - - sweepB.GetTransform(&transformB, output.t); - for (int32 i = 0; i < m_shapeB.m_count; ++i) - { - vertices[i] = b2Mul(transformB, m_shapeB.m_vertices[i]); - } - m_debugDraw.DrawPolygon(vertices, m_shapeB.m_count, b2Color(0.5f, 0.7f, 0.9f)); - - sweepB.GetTransform(&transformB, 1.0f); - for (int32 i = 0; i < m_shapeB.m_count; ++i) - { - vertices[i] = b2Mul(transformB, m_shapeB.m_vertices[i]); - } - m_debugDraw.DrawPolygon(vertices, m_shapeB.m_count, b2Color(0.9f, 0.5f, 0.5f)); - -#if 0 - for (float32 t = 0.0f; t < 1.0f; t += 0.1f) - { - sweepB.GetTransform(&transformB, t); - for (int32 i = 0; i < m_shapeB.m_count; ++i) - { - vertices[i] = b2Mul(transformB, m_shapeB.m_vertices[i]); - } - m_debugDraw.DrawPolygon(vertices, m_shapeB.m_count, b2Color(0.9f, 0.5f, 0.5f)); - } -#endif - } - - b2PolygonShape m_shapeA; - b2PolygonShape m_shapeB; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Tumbler.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Tumbler.h deleted file mode 100644 index d2c6c62ee8..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Tumbler.h +++ /dev/null @@ -1,99 +0,0 @@ -/* -* Copyright (c) 2011 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef TUMBLER_H -#define TUMBLER_H - -class Tumbler : public Test -{ -public: - - enum - { - e_count = 800 - }; - - Tumbler() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - } - - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.allowSleep = false; - bd.position.Set(0.0f, 10.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(0.5f, 10.0f, b2Vec2( 10.0f, 0.0f), 0.0); - body->CreateFixture(&shape, 5.0f); - shape.SetAsBox(0.5f, 10.0f, b2Vec2(-10.0f, 0.0f), 0.0); - body->CreateFixture(&shape, 5.0f); - shape.SetAsBox(10.0f, 0.5f, b2Vec2(0.0f, 10.0f), 0.0); - body->CreateFixture(&shape, 5.0f); - shape.SetAsBox(10.0f, 0.5f, b2Vec2(0.0f, -10.0f), 0.0); - body->CreateFixture(&shape, 5.0f); - - b2RevoluteJointDef jd; - jd.bodyA = ground; - jd.bodyB = body; - jd.localAnchorA.Set(0.0f, 10.0f); - jd.localAnchorB.Set(0.0f, 0.0f); - jd.referenceAngle = 0.0f; - jd.motorSpeed = 0.05f * b2_pi; - jd.maxMotorTorque = 1e8f; - jd.enableMotor = true; - m_joint = (b2RevoluteJoint*)m_world->CreateJoint(&jd); - } - - m_count = 0; - } - - void Step(Settings* settings) - { - Test::Step(settings); - - if (m_count < e_count) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 10.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(0.125f, 0.125f); - body->CreateFixture(&shape, 1.0f); - - ++m_count; - } - } - - static Test* Create() - { - return new Tumbler; - } - - b2RevoluteJoint* m_joint; - int32 m_count; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/VaryingFriction.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/VaryingFriction.h deleted file mode 100644 index c85a496b0b..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/VaryingFriction.h +++ /dev/null @@ -1,124 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef VARYING_FRICTION_H -#define VARYING_FRICTION_H - -class VaryingFriction : public Test -{ -public: - - VaryingFriction() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(13.0f, 0.25f); - - b2BodyDef bd; - bd.position.Set(-4.0f, 22.0f); - bd.angle = -0.25f; - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.25f, 1.0f); - - b2BodyDef bd; - bd.position.Set(10.5f, 19.0f); - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(13.0f, 0.25f); - - b2BodyDef bd; - bd.position.Set(4.0f, 14.0f); - bd.angle = 0.25f; - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.25f, 1.0f); - - b2BodyDef bd; - bd.position.Set(-10.5f, 11.0f); - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(13.0f, 0.25f); - - b2BodyDef bd; - bd.position.Set(-4.0f, 6.0f); - bd.angle = -0.25f; - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.5f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 25.0f; - - float friction[5] = {0.75f, 0.5f, 0.35f, 0.1f, 0.0f}; - - for (int i = 0; i < 5; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-15.0f + 4.0f * i, 28.0f); - b2Body* body = m_world->CreateBody(&bd); - - fd.friction = friction[i]; - body->CreateFixture(&fd); - } - } - } - - static Test* Create() - { - return new VaryingFriction; - } -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/VaryingRestitution.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/VaryingRestitution.h deleted file mode 100644 index c06aca0a87..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/VaryingRestitution.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef VARYING_RESTITUTION_H -#define VARYING_RESTITUTION_H - -// Note: even with a restitution of 1.0, there is some energy change -// due to position correction. -class VaryingRestitution : public Test -{ -public: - - VaryingRestitution() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2CircleShape shape; - shape.m_radius = 1.0f; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - - float32 restitution[7] = {0.0f, 0.1f, 0.3f, 0.5f, 0.75f, 0.9f, 1.0f}; - - for (int32 i = 0; i < 7; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-10.0f + 3.0f * i, 20.0f); - - b2Body* body = m_world->CreateBody(&bd); - - fd.restitution = restitution[i]; - body->CreateFixture(&fd); - } - } - } - - static Test* Create() - { - return new VaryingRestitution; - } -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/VerticalStack.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/VerticalStack.h deleted file mode 100644 index a5c74f83ef..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/VerticalStack.h +++ /dev/null @@ -1,165 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef VERTICAL_STACK_H -#define VERTICAL_STACK_H - -class VerticalStack : public Test -{ -public: - - enum - { - e_columnCount = 5, - e_rowCount = 16 - //e_columnCount = 1, - //e_rowCount = 1 - }; - - VerticalStack() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - - shape.Set(b2Vec2(20.0f, 0.0f), b2Vec2(20.0f, 20.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - float32 xs[5] = {0.0f, -10.0f, -5.0f, 5.0f, 10.0f}; - - for (int32 j = 0; j < e_columnCount; ++j) - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.5f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - fd.friction = 0.3f; - - for (int i = 0; i < e_rowCount; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - - int32 n = j * e_rowCount + i; - b2Assert(n < e_rowCount * e_columnCount); - m_indices[n] = n; - bd.userData = m_indices + n; - - float32 x = 0.0f; - //float32 x = RandomFloat(-0.02f, 0.02f); - //float32 x = i % 2 == 0 ? -0.025f : 0.025f; - bd.position.Set(xs[j] + x, 0.752f + 1.54f * i); - b2Body* body = m_world->CreateBody(&bd); - - m_bodies[n] = body; - - body->CreateFixture(&fd); - } - } - - m_bullet = NULL; - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case ',': - if (m_bullet != NULL) - { - m_world->DestroyBody(m_bullet); - m_bullet = NULL; - } - - { - b2CircleShape shape; - shape.m_radius = 0.25f; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - fd.restitution = 0.05f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.bullet = true; - bd.position.Set(-31.0f, 5.0f); - - m_bullet = m_world->CreateBody(&bd); - m_bullet->CreateFixture(&fd); - - m_bullet->SetLinearVelocity(b2Vec2(400.0f, 0.0f)); - } - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Press: (,) to launch a bullet."); - m_textLine += DRAW_STRING_NEW_LINE; - - //if (m_stepCount == 300) - //{ - // if (m_bullet != NULL) - // { - // m_world->DestroyBody(m_bullet); - // m_bullet = NULL; - // } - - // { - // b2CircleShape shape; - // shape.m_radius = 0.25f; - - // b2FixtureDef fd; - // fd.shape = &shape; - // fd.density = 20.0f; - // fd.restitution = 0.05f; - - // b2BodyDef bd; - // bd.type = b2_dynamicBody; - // bd.bullet = true; - // bd.position.Set(-31.0f, 5.0f); - - // m_bullet = m_world->CreateBody(&bd); - // m_bullet->CreateFixture(&fd); - - // m_bullet->SetLinearVelocity(b2Vec2(400.0f, 0.0f)); - // } - //} - } - - static Test* Create() - { - return new VerticalStack; - } - - b2Body* m_bullet; - b2Body* m_bodies[e_rowCount * e_columnCount]; - int32 m_indices[e_rowCount * e_columnCount]; -}; - -#endif diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Web.h b/tests/cpp-tests/Classes/Box2DTestBed/Tests/Web.h deleted file mode 100644 index 375a2b4ba3..0000000000 --- a/tests/cpp-tests/Classes/Box2DTestBed/Tests/Web.h +++ /dev/null @@ -1,209 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef WEB_H -#define WEB_H - -// This tests distance joints, body destruction, and joint destruction. -class Web : public Test -{ -public: - Web() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2EdgeShape shape; - shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.5f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - - bd.position.Set(-5.0f, 5.0f); - m_bodies[0] = m_world->CreateBody(&bd); - m_bodies[0]->CreateFixture(&shape, 5.0f); - - bd.position.Set(5.0f, 5.0f); - m_bodies[1] = m_world->CreateBody(&bd); - m_bodies[1]->CreateFixture(&shape, 5.0f); - - bd.position.Set(5.0f, 15.0f); - m_bodies[2] = m_world->CreateBody(&bd); - m_bodies[2]->CreateFixture(&shape, 5.0f); - - bd.position.Set(-5.0f, 15.0f); - m_bodies[3] = m_world->CreateBody(&bd); - m_bodies[3]->CreateFixture(&shape, 5.0f); - - b2DistanceJointDef jd; - b2Vec2 p1, p2, d; - - jd.frequencyHz = 2.0f; - jd.dampingRatio = 0.0f; - - jd.bodyA = ground; - jd.bodyB = m_bodies[0]; - jd.localAnchorA.Set(-10.0f, 0.0f); - jd.localAnchorB.Set(-0.5f, -0.5f); - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[0] = m_world->CreateJoint(&jd); - - jd.bodyA = ground; - jd.bodyB = m_bodies[1]; - jd.localAnchorA.Set(10.0f, 0.0f); - jd.localAnchorB.Set(0.5f, -0.5f); - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[1] = m_world->CreateJoint(&jd); - - jd.bodyA = ground; - jd.bodyB = m_bodies[2]; - jd.localAnchorA.Set(10.0f, 20.0f); - jd.localAnchorB.Set(0.5f, 0.5f); - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[2] = m_world->CreateJoint(&jd); - - jd.bodyA = ground; - jd.bodyB = m_bodies[3]; - jd.localAnchorA.Set(-10.0f, 20.0f); - jd.localAnchorB.Set(-0.5f, 0.5f); - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[3] = m_world->CreateJoint(&jd); - - jd.bodyA = m_bodies[0]; - jd.bodyB = m_bodies[1]; - jd.localAnchorA.Set(0.5f, 0.0f); - jd.localAnchorB.Set(-0.5f, 0.0f); - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[4] = m_world->CreateJoint(&jd); - - jd.bodyA = m_bodies[1]; - jd.bodyB = m_bodies[2]; - jd.localAnchorA.Set(0.0f, 0.5f); - jd.localAnchorB.Set(0.0f, -0.5f); - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[5] = m_world->CreateJoint(&jd); - - jd.bodyA = m_bodies[2]; - jd.bodyB = m_bodies[3]; - jd.localAnchorA.Set(-0.5f, 0.0f); - jd.localAnchorB.Set(0.5f, 0.0f); - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[6] = m_world->CreateJoint(&jd); - - jd.bodyA = m_bodies[3]; - jd.bodyB = m_bodies[0]; - jd.localAnchorA.Set(0.0f, -0.5f); - jd.localAnchorB.Set(0.0f, 0.5f); - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[7] = m_world->CreateJoint(&jd); - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'b': - for (int32 i = 0; i < 4; ++i) - { - if (m_bodies[i]) - { - m_world->DestroyBody(m_bodies[i]); - m_bodies[i] = NULL; - break; - } - } - break; - - case 'j': - for (int32 i = 0; i < 8; ++i) - { - if (m_joints[i]) - { - m_world->DestroyJoint(m_joints[i]); - m_joints[i] = NULL; - break; - } - } - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "This demonstrates a soft distance joint."); - m_textLine += DRAW_STRING_NEW_LINE; - m_debugDraw.DrawString(5, m_textLine, "Press: (b) to delete a body, (j) to delete a joint"); - m_textLine += DRAW_STRING_NEW_LINE; - } - - void JointDestroyed(b2Joint* joint) - { - for (int32 i = 0; i < 8; ++i) - { - if (m_joints[i] == joint) - { - m_joints[i] = NULL; - break; - } - } - } - - static Test* Create() - { - return new Web; - } - - b2Body* m_bodies[4]; - b2Joint* m_joints[8]; -}; - -#endif diff --git a/tests/cpp-tests/Classes/controller.cpp b/tests/cpp-tests/Classes/controller.cpp index f4d1bdc686..96608778fc 100644 --- a/tests/cpp-tests/Classes/controller.cpp +++ b/tests/cpp-tests/Classes/controller.cpp @@ -49,10 +49,6 @@ public: addTest("Actions - Ease", [](){return new (std::nothrow) ActionsEaseTests(); }); addTest("Actions - Progress", [](){return new (std::nothrow) ActionsProgressTests(); }); addTest("Audio - NewAudioEngine", []() { return new (std::nothrow) AudioEngineTests(); }); -#if CC_ENABLE_BOX2D_INTEGRATION - addTest("Box2d - Basic", []() { return new (std::nothrow) Box2DTests(); }); - addTest("Box2d - TestBed", []() { return new (std::nothrow) Box2dTestBedSuite(); }); -#endif #if CC_ENABLE_CHIPMUNK_INTEGRATION addTest("Chipmunk", []() { return new ChipmunkTests(); }); #endif From 6dbbb4cc0a6ad67ec162a593a52b46372a8eac8e Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Fri, 25 Oct 2019 15:39:59 +0800 Subject: [PATCH 50/96] remove the comment of enableRetina for mac (#20249) --- cocos/platform/mac/CCGLViewImpl-mac.mm | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/cocos/platform/mac/CCGLViewImpl-mac.mm b/cocos/platform/mac/CCGLViewImpl-mac.mm index 9e57af7d62..699b28acf6 100644 --- a/cocos/platform/mac/CCGLViewImpl-mac.mm +++ b/cocos/platform/mac/CCGLViewImpl-mac.mm @@ -446,19 +446,16 @@ void GLViewImpl::pollEvents() void GLViewImpl::enableRetina(bool enabled) { - //TODO coulsonwang -//#if (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) -// _isRetinaEnabled = enabled; -// if (_isRetinaEnabled) -// { -// _retinaFactor = 1; -// } -// else -// { -// _retinaFactor = 2; -// } -// updateFrameSize(); -//#endif + _isRetinaEnabled = enabled; + if (_isRetinaEnabled) + { + _retinaFactor = 1; + } + else + { + _retinaFactor = 2; + } + updateFrameSize(); } From c9af873e2effec6ae8d4650ec74e60727073f9ec Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 25 Oct 2019 16:40:30 +0800 Subject: [PATCH 51/96] fix some warnings (#20247) --- cocos/2d/CCFontFreeType.cpp | 12 ++--- cocos/2d/CCGrid.cpp | 2 +- cocos/2d/CCTMXLayer.cpp | 8 ++-- cocos/base/base64.cpp | 2 +- cocos/platform/ios/CCApplication-ios.mm | 11 ++++- cocos/platform/ios/CCCommon-ios.mm | 21 +++++---- cocos/platform/ios/CCDevice-ios.mm | 9 ++-- cocos/platform/ios/CCDirectorCaller-ios.mm | 6 --- cocos/platform/ios/CCEAGLView-ios.h | 8 ++-- cocos/platform/ios/CCEAGLView-ios.mm | 10 +++-- cocos/platform/ios/CCInputView-ios.h | 1 + cocos/platform/ios/CCInputView-ios.mm | 5 ++- cocos/renderer/CCCustomCommand.cpp | 18 ++++---- cocos/renderer/CCCustomCommand.h | 44 +++++++++---------- cocos/renderer/backend/Buffer.h | 10 ++--- cocos/renderer/backend/CommandBuffer.h | 4 +- cocos/renderer/backend/Device.h | 2 +- cocos/renderer/backend/ProgramState.cpp | 8 ++-- cocos/renderer/backend/ProgramState.h | 8 ++-- cocos/renderer/backend/Texture.h | 14 +++--- cocos/renderer/backend/VertexLayout.cpp | 4 +- cocos/renderer/backend/VertexLayout.h | 14 +++--- cocos/renderer/backend/metal/BufferMTL.h | 6 +-- cocos/renderer/backend/metal/BufferMTL.mm | 6 +-- .../renderer/backend/metal/CommandBufferMTL.h | 6 +-- .../backend/metal/CommandBufferMTL.mm | 4 +- cocos/renderer/backend/metal/DeviceMTL.h | 2 +- cocos/renderer/backend/metal/DeviceMTL.mm | 2 +- .../backend/metal/RenderPipelineMTL.mm | 4 ++ .../renderer/backend/metal/ShaderModuleMTL.mm | 2 +- cocos/renderer/backend/metal/TextureMTL.h | 16 +++---- cocos/renderer/backend/metal/TextureMTL.mm | 34 +++++++------- cocos/renderer/backend/metal/Utils.h | 6 +-- cocos/renderer/backend/metal/Utils.mm | 6 +-- cocos/renderer/backend/opengl/BufferGL.cpp | 8 ++-- cocos/renderer/backend/opengl/BufferGL.h | 10 ++--- .../backend/opengl/CommandBufferGL.cpp | 4 +- .../renderer/backend/opengl/CommandBufferGL.h | 4 +- cocos/renderer/backend/opengl/DeviceGL.cpp | 2 +- cocos/renderer/backend/opengl/DeviceGL.h | 2 +- cocos/renderer/backend/opengl/TextureGL.cpp | 16 +++---- cocos/renderer/backend/opengl/TextureGL.h | 12 ++--- cocos/ui/UIVideoPlayer-ios.mm | 9 ---- cocos/ui/UIVideoPlayer.h | 20 ++++----- cocos/ui/UIWebView/UIWebViewImpl-ios.mm | 2 +- .../AssetsManagerExTest.cpp | 3 +- .../NewRendererTest/NewRendererTest.cpp | 2 +- .../Classes/Physics3DTest/Physics3DTest.cpp | 6 +-- .../Classes/Physics3DTest/Physics3DTest.h | 6 +-- .../Classes/Sprite3DTest/DrawNode3D.cpp | 2 +- .../Classes/VibrateTest/VibrateTest.cpp | 2 +- 51 files changed, 214 insertions(+), 211 deletions(-) diff --git a/cocos/2d/CCFontFreeType.cpp b/cocos/2d/CCFontFreeType.cpp index 429967dccd..63d36d391e 100644 --- a/cocos/2d/CCFontFreeType.cpp +++ b/cocos/2d/CCFontFreeType.cpp @@ -341,10 +341,10 @@ unsigned char* FontFreeType::getGlyphBitmap(uint64_t theChar, long &outWidth, lo int glyphMinY = (int)(-outHeight - outRect.origin.y); int glyphMaxY = (int)-outRect.origin.y; - int outlineMinX = bbox.xMin >> 6; - int outlineMaxX = bbox.xMax >> 6; - int outlineMinY = bbox.yMin >> 6; - int outlineMaxY = bbox.yMax >> 6; + auto outlineMinX = bbox.xMin >> 6; + auto outlineMaxX = bbox.xMax >> 6; + auto outlineMinY = bbox.yMin >> 6; + auto outlineMaxY = bbox.yMax >> 6; auto outlineWidth = outlineMaxX - outlineMinX; auto outlineHeight = outlineMaxY - outlineMinY; @@ -359,8 +359,8 @@ unsigned char* FontFreeType::getGlyphBitmap(uint64_t theChar, long &outWidth, lo unsigned char *blendImage = nullptr; if (blendWidth > 0 && blendHeight > 0) { - int index, index2; - int imageSize = blendWidth * blendHeight * 2; + FT_Pos index, index2; + auto imageSize = blendWidth * blendHeight * 2; blendImage = new (std::nothrow) unsigned char[imageSize]; memset(blendImage, 0, imageSize); diff --git a/cocos/2d/CCGrid.cpp b/cocos/2d/CCGrid.cpp index 0807f2bec8..c63b10fa9d 100644 --- a/cocos/2d/CCGrid.cpp +++ b/cocos/2d/CCGrid.cpp @@ -409,7 +409,7 @@ void Grid3D::calculateVertexPoints() float height = (float)_texture->getPixelsHigh(); float imageH = _texture->getContentSizeInPixels().height; - size_t x = 0, y = 0, i = 0; + int x = 0, y = 0, i = 0; CC_SAFE_FREE(_vertices); CC_SAFE_FREE(_originalVertices); CC_SAFE_FREE(_texCoordinates); diff --git a/cocos/2d/CCTMXLayer.cpp b/cocos/2d/CCTMXLayer.cpp index 0fa38414cd..f4bc2ee17d 100644 --- a/cocos/2d/CCTMXLayer.cpp +++ b/cocos/2d/CCTMXLayer.cpp @@ -424,7 +424,7 @@ Sprite * TMXLayer::insertTileForGID(uint32_t gid, const Vec2& pos) for(const auto &child : _children) { Sprite* sp = static_cast(child); - ssize_t ai = sp->getAtlasIndex(); + auto ai = sp->getAtlasIndex(); if ( ai >= indexForZ ) { sp->setAtlasIndex(ai+1); @@ -449,8 +449,8 @@ Sprite * TMXLayer::updateTileForGID(uint32_t gid, const Vec2& pos) setupTileSprite(tile ,pos ,gid); // get atlas index - ssize_t indexForZ = atlasIndexForExistantZ(z); - tile->setAtlasIndex(indexForZ); + auto indexForZ = atlasIndexForExistantZ(z); + tile->setAtlasIndex(static_cast(indexForZ) ); tile->setDirty(true); tile->updateTransform(); _tiles[z] = gid; @@ -671,7 +671,7 @@ void TMXLayer::removeTileAt(const Vec2& pos) // update possible children for(const auto &obj : _children) { Sprite* child = static_cast(obj); - ssize_t ai = child->getAtlasIndex(); + auto ai = child->getAtlasIndex(); if ( ai >= atlasIndex ) { child->setAtlasIndex(ai-1); diff --git a/cocos/base/base64.cpp b/cocos/base/base64.cpp index 792343b130..fffb4cff93 100644 --- a/cocos/base/base64.cpp +++ b/cocos/base/base64.cpp @@ -39,7 +39,7 @@ int _base64Decode(const unsigned char *input, unsigned int input_len, unsigned c unsigned int input_idx = 0; unsigned int output_idx = 0; - for (char i = (sizeof alphabet) - 1; i >= 0 ; i--) { + for (size_t i = (sizeof alphabet) - 1; i >= 0 ; i--) { inalphabet[alphabet[i]] = 1; decoder[alphabet[i]] = i; } diff --git a/cocos/platform/ios/CCApplication-ios.mm b/cocos/platform/ios/CCApplication-ios.mm index c4360ee05b..f5060f5a24 100644 --- a/cocos/platform/ios/CCApplication-ios.mm +++ b/cocos/platform/ios/CCApplication-ios.mm @@ -128,7 +128,16 @@ bool Application::openURL(const std::string &url) { NSString* msg = [NSString stringWithCString:url.c_str() encoding:NSUTF8StringEncoding]; NSURL* nsUrl = [NSURL URLWithString:msg]; - return [[UIApplication sharedApplication] openURL:nsUrl]; + + id application = [UIApplication sharedApplication]; + if ([application respondsToSelector:@selector(openURL:options:completionHandler:)] ) + { + [application openURL:nsUrl options:@{} completionHandler:nil]; + } + else + { + return [application openURL:nsUrl]; + } } void Application::applicationScreenSizeChanged(int newWidth, int newHeight) { diff --git a/cocos/platform/ios/CCCommon-ios.mm b/cocos/platform/ios/CCCommon-ios.mm index ca1115c407..6ab709d2af 100644 --- a/cocos/platform/ios/CCCommon-ios.mm +++ b/cocos/platform/ios/CCCommon-ios.mm @@ -32,7 +32,8 @@ #include #include -#import +#import +#import #include "base/CCDirector.h" #include "base/CCConsole.h" @@ -46,13 +47,17 @@ void ccMessageBox(const char * msg, const char * title) #if !defined(CC_TARGET_OS_TVOS) NSString * tmpTitle = (title) ? [NSString stringWithUTF8String : title] : nil; NSString * tmpMsg = (msg) ? [NSString stringWithUTF8String : msg] : nil; - UIAlertView * messageBox = [[UIAlertView alloc] initWithTitle: tmpTitle - message: tmpMsg - delegate: nil - cancelButtonTitle: @"OK" - otherButtonTitles: nil]; - [messageBox autorelease]; - [messageBox show]; + + UIAlertController* alertController = [UIAlertController alertControllerWithTitle:tmpTitle + message:tmpMsg + preferredStyle:UIAlertControllerStyleAlert]; + + UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault + handler:^(UIAlertAction * action) {}]; + + [alertController addAction:defaultAction]; + auto rootViewController = [UIApplication sharedApplication].windows[0].rootViewController; + [rootViewController presentViewController:alertController animated:YES completion:nil]; #endif } diff --git a/cocos/platform/ios/CCDevice-ios.mm b/cocos/platform/ios/CCDevice-ios.mm index 2b7712bc77..26b494b392 100644 --- a/cocos/platform/ios/CCDevice-ios.mm +++ b/cocos/platform/ios/CCDevice-ios.mm @@ -175,7 +175,7 @@ static CGSize _calculateShrinkedSizeForString(NSAttributedString **str, #define SENSOR_DELAY_GAME 0.02 #if !defined(CC_TARGET_OS_TVOS) -@interface CCAccelerometerDispatcher : NSObject +@interface CCAccelerometerDispatcher : NSObject { cocos2d::Acceleration *_acceleration; CMMotionManager *_motionManager; @@ -247,7 +247,7 @@ static CCAccelerometerDispatcher* s_pAccelerometerDispatcher; double tmp = _acceleration->x; - switch ([[UIApplication sharedApplication] statusBarOrientation]) + switch ([[[UIApplication sharedApplication].windows[0] windowScene] interfaceOrientation]) { case UIInterfaceOrientationLandscapeRight: _acceleration->x = -_acceleration->y; @@ -294,9 +294,10 @@ int Device::getDPI() scale = [[UIScreen mainScreen] scale]; } - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { + UIUserInterfaceIdiom userInterfaceIdiom = [UIDevice.currentDevice userInterfaceIdiom]; + if (userInterfaceIdiom == UIUserInterfaceIdiomPad) { dpi = 132 * scale; - } else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { + } else if (userInterfaceIdiom == UIUserInterfaceIdiomPhone) { dpi = 163 * scale; } else { dpi = 160 * scale; diff --git a/cocos/platform/ios/CCDirectorCaller-ios.mm b/cocos/platform/ios/CCDirectorCaller-ios.mm index 14d39d9cc9..3e89ca5f12 100644 --- a/cocos/platform/ios/CCDirectorCaller-ios.mm +++ b/cocos/platform/ios/CCDirectorCaller-ios.mm @@ -136,12 +136,6 @@ static id s_sharedDirectorCaller; { if (isAppActive) { cocos2d::Director* director = cocos2d::Director::getInstance(); - EAGLContext* cocos2dxContext = [(CCEAGLView*)director->getOpenGLView()->getEAGLView() context]; - if (cocos2dxContext != [EAGLContext currentContext]) - glFlush(); - - [EAGLContext setCurrentContext: cocos2dxContext]; - CFTimeInterval dt = ((CADisplayLink*)displayLink).timestamp - lastDisplayTime; lastDisplayTime = ((CADisplayLink*)displayLink).timestamp; director->mainLoop(dt); diff --git a/cocos/platform/ios/CCEAGLView-ios.h b/cocos/platform/ios/CCEAGLView-ios.h index ac9b40b242..655162a526 100644 --- a/cocos/platform/ios/CCEAGLView-ios.h +++ b/cocos/platform/ios/CCEAGLView-ios.h @@ -108,9 +108,6 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. /** returns surface size in pixels */ @property(nonatomic,readonly) CGSize surfaceSize; -/** OpenGL context */ -@property(nonatomic,readonly) EAGLContext *context; - @property(nonatomic,readwrite) BOOL multiSampling; @@ -126,6 +123,7 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. -(void) doAnimationWhenKeyboardMoveWithDuration:(float) duration distance:(float) dis; -(void) doAnimationWhenAnotherEditBeClicked; -- (void) showKeyboard; -- (void) hideKeyboard; +-(void) showKeyboard; +-(void) hideKeyboard; +-(BOOL) isKeyboardShown; @end diff --git a/cocos/platform/ios/CCEAGLView-ios.mm b/cocos/platform/ios/CCEAGLView-ios.mm index 9bc1d6814c..5729257313 100644 --- a/cocos/platform/ios/CCEAGLView-ios.mm +++ b/cocos/platform/ios/CCEAGLView-ios.mm @@ -76,16 +76,13 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. #define IOS_MAX_TOUCHES_COUNT 10 @interface CCEAGLView () -@property (nonatomic) UIView* textInputView; -- (BOOL) setupSurfaceWithSharegroup:(EAGLSharegroup*)sharegroup; -- (unsigned int) convertPixelFormat:(NSString*) pixelFormat; +@property (nonatomic) CCInputView* textInputView; @end @implementation CCEAGLView @synthesize surfaceSize=size_; @synthesize pixelFormat=pixelformat_, depthFormat=depthFormat_; -@synthesize context=context_; @synthesize multiSampling=multiSampling_; + (Class) layerClass @@ -342,6 +339,11 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. [self.textInputView removeFromSuperview]; } +-(BOOL) isKeyboardShown +{ + return [self.textInputView isKeyboardShown]; +} + -(void) doAnimationWhenKeyboardMoveWithDuration:(float) duration distance:(float) dis { diff --git a/cocos/platform/ios/CCInputView-ios.h b/cocos/platform/ios/CCInputView-ios.h index 94b69ff605..ff60d5b94f 100644 --- a/cocos/platform/ios/CCInputView-ios.h +++ b/cocos/platform/ios/CCInputView-ios.h @@ -1,4 +1,5 @@ #import @interface CCInputView : UIView +@property(nonatomic) BOOL isKeyboardShown; @end diff --git a/cocos/platform/ios/CCInputView-ios.mm b/cocos/platform/ios/CCInputView-ios.mm index 65390b2de4..eae5631738 100644 --- a/cocos/platform/ios/CCInputView-ios.mm +++ b/cocos/platform/ios/CCInputView-ios.mm @@ -5,7 +5,6 @@ @interface CCInputView () @property(nonatomic) NSString* myMarkedText; -@property(nonatomic) BOOL isKeyboardShown; @end @@ -250,7 +249,7 @@ namespace { CGSize viewSize = self.frame.size; CGFloat tmp; - switch (getFixedOrientation([[UIApplication sharedApplication] statusBarOrientation])) + switch (getFixedOrientation([[[UIApplication sharedApplication].windows[0] windowScene] interfaceOrientation])) { case UIInterfaceOrientationPortrait: begin.origin.y = viewSize.height - begin.origin.y - begin.size.height; @@ -332,6 +331,7 @@ namespace { else if (UIKeyboardDidShowNotification == type) { //CGSize screenSize = self.window.screen.bounds.size; + self.isKeyboardShown = YES; dispatcher->dispatchKeyboardDidShow(notiInfo); } else if (UIKeyboardWillHideNotification == type) @@ -340,6 +340,7 @@ namespace { } else if (UIKeyboardDidHideNotification == type) { + self.isKeyboardShown = NO; dispatcher->dispatchKeyboardDidHide(notiInfo); } } diff --git a/cocos/renderer/CCCustomCommand.cpp b/cocos/renderer/CCCustomCommand.cpp index c0f04b334e..f1c57d4d1c 100644 --- a/cocos/renderer/CCCustomCommand.cpp +++ b/cocos/renderer/CCCustomCommand.cpp @@ -61,7 +61,7 @@ void CustomCommand::init(float globalZOrder, const BlendFunc& blendFunc) blendDescriptor.destinationRGBBlendFactor = blendDescriptor.destinationAlphaBlendFactor = blendFunc.dst; } -void CustomCommand::createVertexBuffer(unsigned int vertexSize, unsigned int capacity, BufferUsage usage) +void CustomCommand::createVertexBuffer(std::size_t vertexSize, std::size_t capacity, BufferUsage usage) { CC_SAFE_RELEASE(_vertexBuffer); @@ -72,7 +72,7 @@ void CustomCommand::createVertexBuffer(unsigned int vertexSize, unsigned int cap _vertexBuffer = device->newBuffer(vertexSize * capacity, backend::BufferType::VERTEX, usage); } -void CustomCommand::createIndexBuffer(IndexFormat format, unsigned int capacity, BufferUsage usage) +void CustomCommand::createIndexBuffer(IndexFormat format, std::size_t capacity, BufferUsage usage) { CC_SAFE_RELEASE(_indexBuffer); @@ -85,13 +85,13 @@ void CustomCommand::createIndexBuffer(IndexFormat format, unsigned int capacity, _indexBuffer = device->newBuffer(_indexSize * capacity, backend::BufferType::INDEX, usage); } -void CustomCommand::updateVertexBuffer(void* data, unsigned int offset, unsigned int length) +void CustomCommand::updateVertexBuffer(void* data, std::size_t offset, std::size_t length) { assert(_vertexBuffer); _vertexBuffer->updateSubData(data, offset, length); } -void CustomCommand::updateIndexBuffer(void* data, unsigned int offset, unsigned int length) +void CustomCommand::updateIndexBuffer(void* data, std::size_t offset, std::size_t length) { assert(_indexBuffer); _indexBuffer->updateSubData(data, offset, length); @@ -118,24 +118,24 @@ void CustomCommand::setIndexBuffer(backend::Buffer *indexBuffer, IndexFormat for _indexSize = computeIndexSize(); } -void CustomCommand::updateVertexBuffer(void* data, unsigned int length) +void CustomCommand::updateVertexBuffer(void* data, std::size_t length) { assert(_vertexBuffer); _vertexBuffer->updateData(data, length); } -void CustomCommand::updateIndexBuffer(void* data, unsigned int length) +void CustomCommand::updateIndexBuffer(void* data, std::size_t length) { assert(_indexBuffer); _indexBuffer->updateData(data, length); } -unsigned int CustomCommand::computeIndexSize() const +std::size_t CustomCommand::computeIndexSize() const { if (IndexFormat::U_SHORT == _indexFormat) - return (unsigned int)sizeof(unsigned short); + return sizeof(unsigned short); else - return (unsigned int)sizeof(unsigned int); + return sizeof(unsigned int); } NS_CC_END diff --git a/cocos/renderer/CCCustomCommand.h b/cocos/renderer/CCCustomCommand.h index b952be8241..4513afd93d 100644 --- a/cocos/renderer/CCCustomCommand.h +++ b/cocos/renderer/CCCustomCommand.h @@ -102,7 +102,7 @@ public: @param usage the usage of the vertex buffer. Use Static of the vertex data are not updated every frame, otherwise use DYNAMIC. */ - void createVertexBuffer(unsigned int vertexSize, unsigned int capacity, BufferUsage usage); + void createVertexBuffer(std::size_t vertexSize, std::size_t capacity, BufferUsage usage); /** Create an index buffer of the custom command. The buffer size is (indexSize * capacity). Index size is determined by format. If the buffer already exists, then it will delete the @@ -113,43 +113,43 @@ public: @param usage the usage of the vertex buffer. Use Static of the index data are not updated every frame, otherwise use DYNAMIC. */ - void createIndexBuffer(IndexFormat format, unsigned int capacity, BufferUsage usage); + void createIndexBuffer(IndexFormat format, std::size_t capacity, BufferUsage usage); /** Update vertex buffer contents. @param data Specifies a pointer to the new data that will be copied into the data store. @param length Specifies the length in bytes of the data store region being replaced. */ - void updateVertexBuffer(void* data, unsigned int length); + void updateVertexBuffer(void* data, std::size_t length); /** Update index buffer contents. @param data Specifies a pointer to the new data that will be copied into the data store. @param length Specifies the size in bytes of the data store region being replaced. */ - void updateIndexBuffer(void* data, unsigned int length); + void updateIndexBuffer(void* data, std::size_t length); /** Update some or all contents of vertex buffer. @param data Specifies a pointer to the new data that will be copied into the data store. @param offset Specifies the offset into the buffer object's data store where data replacement will begin, measured in bytes. @param length Specifies the size in bytes of the data store region being replaced. */ - void updateVertexBuffer(void* data, unsigned int offset, unsigned int length); + void updateVertexBuffer(void* data, std::size_t offset, std::size_t length); /** Update some or call contents of index buffer @param data Specifies a pointer to the new data that will be copied into the data store. @param offset specifies the offset into the buffer object's data store where data replacement will begin, measured in bytes. @param length Specifies the size in bytes of the data store region being replaced. */ - void updateIndexBuffer(void* data, unsigned int offset, unsigned int length); + void updateIndexBuffer(void* data, std::size_t offset, std::size_t length); /** Get vertex buffer capacity. */ - inline unsigned int getVertexCapacity() const { return _vertexCapacity; } + inline std::size_t getVertexCapacity() const { return _vertexCapacity; } /** Get index buffer capacity. */ - inline unsigned int getIndexCapacity() const { return _indexCapacity; } + inline std::size_t getIndexCapacity() const { return _indexCapacity; } inline void setDrawType(DrawType drawType) { _drawType = drawType; } inline DrawType getDrawType() const { return _drawType; } @@ -174,18 +174,18 @@ public: @start specifices the starting index of vertex buffer @count specifices the number of vertices to be rendered */ - inline void setVertexDrawInfo(unsigned int start, unsigned int count) { _vertexDrawStart = start; _vertexDrawCount = count; } - inline unsigned int getVertexDrawStart() const { return _vertexDrawStart; } - inline unsigned int getVertexDrawCount() const { return _vertexDrawCount;} + inline void setVertexDrawInfo(std::size_t start, std::size_t count) { _vertexDrawStart = start; _vertexDrawCount = count; } + inline std::size_t getVertexDrawStart() const { return _vertexDrawStart; } + inline std::size_t getVertexDrawCount() const { return _vertexDrawCount;} /** Set the drawing information if the drawing type is ELEMENT. @start specifices the starting index of index buffer @count specifices the number of indices to be rendered */ - inline void setIndexDrawInfo(unsigned int start, unsigned int count) { _indexDrawOffset = start * _indexSize; _indexDrawCount = count; } - inline unsigned int getIndexDrawOffset() const { return _indexDrawOffset; } - inline unsigned int getIndexDrawCount() const { return _indexDrawCount; } + inline void setIndexDrawInfo(std::size_t start, std::size_t count) { _indexDrawOffset = start * _indexSize; _indexDrawCount = count; } + inline std::size_t getIndexDrawOffset() const { return _indexDrawOffset; } + inline std::size_t getIndexDrawCount() const { return _indexDrawCount; } inline void setLineWidth(float lineWidth) { _lineWidth = lineWidth; } inline float getLineWidth() const { return _lineWidth; } @@ -211,16 +211,16 @@ public: const CallBackFunc &getAfterCallback() { return _afterCallback; } protected: - unsigned int computeIndexSize() const; + std::size_t computeIndexSize() const; backend::Buffer* _vertexBuffer = nullptr; backend::Buffer* _indexBuffer = nullptr; - unsigned int _vertexDrawStart = 0; - unsigned int _vertexDrawCount = 0; + std::size_t _vertexDrawStart = 0; + std::size_t _vertexDrawCount = 0; - unsigned int _indexDrawOffset = 0; - unsigned int _indexDrawCount = 0; + std::size_t _indexDrawOffset = 0; + std::size_t _indexDrawCount = 0; DrawType _drawType = DrawType::ELEMENT; PrimitiveType _primitiveType = PrimitiveType::TRIANGLE; @@ -228,10 +228,10 @@ protected: float _lineWidth = 0.0; - unsigned int _indexSize = 0; + std::size_t _indexSize = 0; - unsigned int _vertexCapacity = 0; - unsigned int _indexCapacity = 0; + std::size_t _vertexCapacity = 0; + std::size_t _indexCapacity = 0; CallBackFunc _beforeCallback = nullptr; diff --git a/cocos/renderer/backend/Buffer.h b/cocos/renderer/backend/Buffer.h index 727feafd70..6dfde47e55 100644 --- a/cocos/renderer/backend/Buffer.h +++ b/cocos/renderer/backend/Buffer.h @@ -52,7 +52,7 @@ public: * @param size Specifies the size in bytes of the data store region being replaced. * @see `updateSubData(void* data, unsigned int offset, unsigned int size)` */ - virtual void updateData(void* data, unsigned int size) = 0; + virtual void updateData(void* data, std::size_t size) = 0; /** * @brief Update buffer sub-region data @@ -61,7 +61,7 @@ public: * @param size Specifies the size in bytes of the data store region being replaced. * @see `updateData(void* data, unsigned int size)` */ - virtual void updateSubData(void* data, unsigned int offset, unsigned int size) = 0; + virtual void updateSubData(void* data, std::size_t offset, std::size_t size) = 0; /** * By default, static buffer data will automatically stored when it comes to foreground. @@ -74,7 +74,7 @@ public: * Get buffer size in bytes. * @return The buffer size in bytes. */ - unsigned int getSize() const { return _size; } + std::size_t getSize() const { return _size; } protected: /** @@ -82,7 +82,7 @@ protected: * @param type Specifies the target buffer object. The symbolic constant must be BufferType::VERTEX or BufferType::INDEX. * @param usage Specifies the expected usage pattern of the data store. The symbolic constant must be GL_STREAM_DRAW, GL_STATIC_DRAW, or GL_DYNAMIC_DRAW. */ - Buffer(unsigned int size, BufferType type, BufferUsage usage) + Buffer(std::size_t size, BufferType type, BufferUsage usage) : _usage(usage) , _type(type) , _size(size) @@ -92,7 +92,7 @@ protected: BufferUsage _usage = BufferUsage::DYNAMIC; ///< Buffer usage. BufferType _type = BufferType::VERTEX; ///< Buffer type. - unsigned int _size = 0; ///< buffer size in bytes. + std::size_t _size = 0; ///< buffer size in bytes. }; // end of _backend group diff --git a/cocos/renderer/backend/CommandBuffer.h b/cocos/renderer/backend/CommandBuffer.h index 8cab5760e6..eab781b59b 100644 --- a/cocos/renderer/backend/CommandBuffer.h +++ b/cocos/renderer/backend/CommandBuffer.h @@ -122,7 +122,7 @@ public: * @param count For each instance, the number of indexes to draw * @see `drawElements(PrimitiveType primitiveType, IndexFormat indexType, unsigned int count, unsigned int offset)` */ - virtual void drawArrays(PrimitiveType primitiveType, unsigned int start, unsigned int count) = 0; + virtual void drawArrays(PrimitiveType primitiveType, std::size_t start, std::size_t count) = 0; /** * Draw primitives with an index list. @@ -133,7 +133,7 @@ public: * @see `setIndexBuffer(Buffer* buffer)` * @see `drawArrays(PrimitiveType primitiveType, unsigned int start, unsigned int count)` */ - virtual void drawElements(PrimitiveType primitiveType, IndexFormat indexType, unsigned int count, unsigned int offset) = 0; + virtual void drawElements(PrimitiveType primitiveType, IndexFormat indexType, std::size_t count, std::size_t offset) = 0; /** * Do some resources release. diff --git a/cocos/renderer/backend/Device.h b/cocos/renderer/backend/Device.h index 97267efb2c..f5f516ef30 100644 --- a/cocos/renderer/backend/Device.h +++ b/cocos/renderer/backend/Device.h @@ -80,7 +80,7 @@ public: * @param usage Specifies the expected usage pattern of the data store. The symbolic constant must be BufferUsage::STATIC, BufferUsage::DYNAMIC. * @return A Buffer object. */ - virtual Buffer* newBuffer(uint32_t size, BufferType type, BufferUsage usage) = 0; + virtual Buffer* newBuffer(size_t size, BufferType type, BufferUsage usage) = 0; /** * New a TextureBackend object, not auto released. diff --git a/cocos/renderer/backend/ProgramState.cpp b/cocos/renderer/backend/ProgramState.cpp index 3e96b385e1..b093543a10 100644 --- a/cocos/renderer/backend/ProgramState.cpp +++ b/cocos/renderer/backend/ProgramState.cpp @@ -253,7 +253,7 @@ void ProgramState::setCallbackUniform(const backend::UniformLocation& uniformLoc _callbackUniforms[uniformLocation] = callback; } -void ProgramState::setUniform(const backend::UniformLocation& uniformLocation, const void* data, uint32_t size) +void ProgramState::setUniform(const backend::UniformLocation& uniformLocation, const void* data, std::size_t size) { switch (uniformLocation.shaderStage) { @@ -273,7 +273,7 @@ void ProgramState::setUniform(const backend::UniformLocation& uniformLocation, c } #ifdef CC_USE_METAL -void ProgramState::convertAndCopyUniformData(const backend::UniformInfo& uniformInfo, const void* srcData, uint32_t srcSize, void* buffer) +void ProgramState::convertAndCopyUniformData(const backend::UniformInfo& uniformInfo, const void* srcData, std::size_t srcSize, void* buffer) { auto basicType = static_cast(uniformInfo.type); char* convertedData = new char[uniformInfo.size]; @@ -341,7 +341,7 @@ void ProgramState::convertAndCopyUniformData(const backend::UniformInfo& uniform } #endif -void ProgramState::setVertexUniform(int location, const void* data, uint32_t size, uint32_t offset) +void ProgramState::setVertexUniform(int location, const void* data, std::size_t size, std::size_t offset) { if(location < 0) return; @@ -362,7 +362,7 @@ void ProgramState::setVertexUniform(int location, const void* data, uint32_t siz #endif } -void ProgramState::setFragmentUniform(int location, const void* data, uint32_t size) +void ProgramState::setFragmentUniform(int location, const void* data, std::size_t size) { if(location < 0) return; diff --git a/cocos/renderer/backend/ProgramState.h b/cocos/renderer/backend/ProgramState.h index 8c5397fe8a..ff45a25dab 100644 --- a/cocos/renderer/backend/ProgramState.h +++ b/cocos/renderer/backend/ProgramState.h @@ -101,7 +101,7 @@ public: * @param data Specifies the new values to be used for the specified uniform variable. * @param size Specifies the uniform data size. */ - void setUniform(const backend::UniformLocation& uniformLocation, const void* data, uint32_t size); + void setUniform(const backend::UniformLocation& uniformLocation, const void* data, std::size_t size); /** * Get uniform location in given uniform name. @@ -263,7 +263,7 @@ protected: * @param data Specifies the new values to be used for the specified uniform variable. * @param size Specifies the uniform data size. */ - void setVertexUniform(int location, const void* data, uint32_t size, uint32_t offset); + void setVertexUniform(int location, const void* data, std::size_t size, std::size_t offset); /** * Set the fargment uniform data. @@ -271,7 +271,7 @@ protected: * @param data Specifies the new values to be used for the specified uniform variable. * @param size Specifies the uniform data size. */ - void setFragmentUniform(int location, const void* data, uint32_t size); + void setFragmentUniform(int location, const void* data, std::size_t size); /** * Set texture. @@ -307,7 +307,7 @@ protected: * @param srcSize Specifies the uniform data size. * @param uniformBuffer Specifies the uniform buffer to update. */ - void convertAndCopyUniformData(const backend::UniformInfo& uniformInfo, const void* srcData, uint32_t srcSize, void* buffer); + void convertAndCopyUniformData(const backend::UniformInfo& uniformInfo, const void* srcData, std::size_t srcSize, void* buffer); #endif /** * Applies the specified custom auto-binding. diff --git a/cocos/renderer/backend/Texture.h b/cocos/renderer/backend/Texture.h index a20754eec9..bd8435cafc 100644 --- a/cocos/renderer/backend/Texture.h +++ b/cocos/renderer/backend/Texture.h @@ -69,7 +69,7 @@ public: * @param flipImage Specifies if needs to flip the image. * @param callback Specifies a call back function to deal with the image. */ - virtual void getBytes(int x, int y, int width, int height, bool flipImage, std::function callback) = 0; + virtual void getBytes(std::size_t x, std::size_t y, std::size_t width, std::size_t height, bool flipImage, std::function callback) = 0; /// Generate mipmaps. virtual void generateMipmaps() = 0; @@ -136,7 +136,7 @@ public: * @param height Specifies the height of the texture image. * @param level Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. */ - virtual void updateData(uint8_t* data, uint32_t width , uint32_t height, uint32_t level) = 0; + virtual void updateData(uint8_t* data, std::size_t width , std::size_t height, std::size_t level) = 0; /** * Update a two-dimensional texture image in a compressed format @@ -146,7 +146,7 @@ public: * @param dataLen Specifies the totoal size of compressed image in bytes. * @param level Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. */ - virtual void updateCompressedData(uint8_t* data, uint32_t width , uint32_t height, uint32_t dataLen, uint32_t level) = 0; + virtual void updateCompressedData(uint8_t* data, std::size_t width , std::size_t height, std::size_t dataLen, std::size_t level) = 0; /** * Update a two-dimensional texture subimage @@ -157,7 +157,7 @@ public: * @param level Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. * @param data Specifies a pointer to the image data in memory. */ - virtual void updateSubData(uint32_t xoffset, uint32_t yoffset, uint32_t width, uint32_t height, uint32_t level, uint8_t* data) = 0; + virtual void updateSubData(std::size_t xoffset, std::size_t yoffset, std::size_t width, std::size_t height, std::size_t level, uint8_t* data) = 0; /** * Update a two-dimensional texture subimage in a compressed format @@ -169,19 +169,19 @@ public: * @param level Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. * @param data Specifies a pointer to the compressed image data in memory. */ - virtual void updateCompressedSubData(uint32_t xoffset, uint32_t yoffset, uint32_t width, uint32_t height, uint32_t dataLen, uint32_t level, uint8_t* data) = 0; + virtual void updateCompressedSubData(std::size_t xoffset, std::size_t yoffset, std::size_t width, std::size_t height, std::size_t dataLen, std::size_t level, uint8_t* data) = 0; /** * Get texture width. * @return Texture width. */ - inline uint32_t getWidth() const { return _width; } + inline std::size_t getWidth() const { return _width; } /** * Get texture height. * @return Texture height. */ - inline uint32_t getHeight() const { return _height; } + inline std::size_t getHeight() const { return _height; } protected: /** diff --git a/cocos/renderer/backend/VertexLayout.cpp b/cocos/renderer/backend/VertexLayout.cpp index 99559ec8d4..a2bedb9d9a 100644 --- a/cocos/renderer/backend/VertexLayout.cpp +++ b/cocos/renderer/backend/VertexLayout.cpp @@ -28,7 +28,7 @@ CC_BACKEND_BEGIN -void VertexLayout::setAttribute(const std::string &name, unsigned int index, VertexFormat format, unsigned int offset, bool needToBeNormallized) +void VertexLayout::setAttribute(const std::string &name, std::size_t index, VertexFormat format, std::size_t offset, bool needToBeNormallized) { if(index == -1) return; @@ -36,7 +36,7 @@ void VertexLayout::setAttribute(const std::string &name, unsigned int index, Ver _attributes[name] = { name, index, format, offset, needToBeNormallized }; } -void VertexLayout::setLayout(unsigned int stride) +void VertexLayout::setLayout(std::size_t stride) { _stride = stride; } diff --git a/cocos/renderer/backend/VertexLayout.h b/cocos/renderer/backend/VertexLayout.h index c8cdbb64bb..c158165d42 100644 --- a/cocos/renderer/backend/VertexLayout.h +++ b/cocos/renderer/backend/VertexLayout.h @@ -48,7 +48,7 @@ public: struct Attribute { Attribute() = default; - Attribute(const std::string& _name, unsigned int _index, VertexFormat _format, unsigned int _offset, bool needToBeNormallized) + Attribute(const std::string& _name, std::size_t _index, VertexFormat _format, std::size_t _offset, bool needToBeNormallized) : name(_name) , format(_format) , offset(_offset) @@ -58,8 +58,8 @@ public: std::string name; ///< name is used in opengl VertexFormat format = VertexFormat::INT3; - unsigned int offset = 0; - unsigned int index = 0; ///< index is used in metal + std::size_t offset = 0; + std::size_t index = 0; ///< index is used in metal bool needToBeNormallized = false; }; @@ -73,19 +73,19 @@ public: * @param offset Specifies the byte offset to the first component of the first generic vertex attribute. * @param needToBeNormallized Specifies whether fixed-point data values should be normalized (true) or converted directly as fixed-point values (false) when they are accessed. */ - void setAttribute(const std::string& name, unsigned int index, VertexFormat format, unsigned int offset, bool needToBeNormallized); + void setAttribute(const std::string& name, std::size_t index, VertexFormat format, std::size_t offset, bool needToBeNormallized); /** * Set stride of vertices. * @param stride Specifies the distance between the data of two vertices, in bytes. */ - void setLayout(unsigned int stride); + void setLayout(std::size_t stride); /** * Get the distance between the data of two vertices, in bytes. * @return The distance between the data of two vertices, in bytes. */ - inline unsigned int getStride() const { return _stride; } + inline std::size_t getStride() const { return _stride; } /** * Get vertex step function. Default value is VERTEX. @@ -107,7 +107,7 @@ public: private: std::unordered_map _attributes; - unsigned int _stride = 0; + std::size_t _stride = 0; VertexStepMode _stepMode = VertexStepMode::VERTEX; }; diff --git a/cocos/renderer/backend/metal/BufferMTL.h b/cocos/renderer/backend/metal/BufferMTL.h index 961be773ca..4ce742ae99 100644 --- a/cocos/renderer/backend/metal/BufferMTL.h +++ b/cocos/renderer/backend/metal/BufferMTL.h @@ -50,7 +50,7 @@ public: * @param type Specifies the target buffer object. The symbolic constant must be BufferType::VERTEX or BufferType::INDEX. * @param usage Specifies the expected usage pattern of the data store. The symbolic constant must be BufferUsage::STATIC, BufferUsage::DYNAMIC. */ - BufferMTL(id mtlDevice, unsigned int size, BufferType type, BufferUsage usage); + BufferMTL(id mtlDevice, std::size_t size, BufferType type, BufferUsage usage); ~BufferMTL(); /// @name Update Buffer @@ -60,7 +60,7 @@ public: * @param size Specifies the size in bytes of the data store region being replaced. * @see `updateSubData(void* data, unsigned int offset, unsigned int size)` */ - virtual void updateData(void* data, unsigned int size) override; + virtual void updateData(void* data, std::size_t size) override; /** * @brief Update buffer sub-region data @@ -69,7 +69,7 @@ public: * @param size Specifies the size in bytes of the data store region being replaced. * @see `updateData(void* data, unsigned int size)` */ - virtual void updateSubData(void* data, unsigned int offset, unsigned int size) override; + virtual void updateSubData(void* data, std::size_t offset, std::size_t size) override; /** * Emply implementation. Mainly used in EGL context lost. diff --git a/cocos/renderer/backend/metal/BufferMTL.mm b/cocos/renderer/backend/metal/BufferMTL.mm index 2f0b1142b2..9abe3d62a4 100644 --- a/cocos/renderer/backend/metal/BufferMTL.mm +++ b/cocos/renderer/backend/metal/BufferMTL.mm @@ -28,7 +28,7 @@ CC_BACKEND_BEGIN -BufferMTL::BufferMTL(id mtlDevice, unsigned int size, BufferType type, BufferUsage usage) +BufferMTL::BufferMTL(id mtlDevice, std::size_t size, BufferType type, BufferUsage usage) : Buffer(size, type, usage) { if (BufferUsage::DYNAMIC == usage) @@ -68,14 +68,14 @@ BufferMTL::~BufferMTL() } } -void BufferMTL::updateData(void* data, unsigned int size) +void BufferMTL::updateData(void* data, std::size_t size) { assert(size <= _size); updateIndex(); memcpy((uint8_t*)_mtlBuffer.contents, data, size); } -void BufferMTL::updateSubData(void* data, unsigned int offset, unsigned int size) +void BufferMTL::updateSubData(void* data, std::size_t offset, std::size_t size) { assert(offset + size <= _size); updateIndex(); diff --git a/cocos/renderer/backend/metal/CommandBufferMTL.h b/cocos/renderer/backend/metal/CommandBufferMTL.h index 7e3874a721..edc44d154c 100644 --- a/cocos/renderer/backend/metal/CommandBufferMTL.h +++ b/cocos/renderer/backend/metal/CommandBufferMTL.h @@ -42,7 +42,7 @@ class RenderPipelineMTL; * @brief Store encoded commands for the GPU to execute. * A command buffer stores encoded commands until the buffer is committed for execution by the GPU */ -class CommandBufferMTL final : public CommandBuffer +class CommandBufferMTL : public CommandBuffer { public: /// @name Constructor, Destructor and Initializers @@ -122,7 +122,7 @@ public: * @param count For each instance, the number of indexes to draw * @see `drawElements(PrimitiveType primitiveType, IndexFormat indexType, unsigned int count, unsigned int offset)` */ - virtual void drawArrays(PrimitiveType primitiveType, unsigned int start, unsigned int count) override; + virtual void drawArrays(PrimitiveType primitiveType, std::size_t start, std::size_t count) override; /** * Draw primitives with an index list. @@ -133,7 +133,7 @@ public: * @see `setIndexBuffer(Buffer* buffer)` * @see `drawArrays(PrimitiveType primitiveType, unsigned int start, unsigned int count)` */ - virtual void drawElements(PrimitiveType primitiveType, IndexFormat indexType, unsigned int count, unsigned int offset) override; + virtual void drawElements(PrimitiveType primitiveType, IndexFormat indexType, std::size_t count, std::size_t offset) override; /** * Do some resources release. diff --git a/cocos/renderer/backend/metal/CommandBufferMTL.mm b/cocos/renderer/backend/metal/CommandBufferMTL.mm index 6081d7b969..6bbe598265 100644 --- a/cocos/renderer/backend/metal/CommandBufferMTL.mm +++ b/cocos/renderer/backend/metal/CommandBufferMTL.mm @@ -318,7 +318,7 @@ void CommandBufferMTL::setIndexBuffer(Buffer* buffer) [_mtlIndexBuffer retain]; } -void CommandBufferMTL::drawArrays(PrimitiveType primitiveType, unsigned int start, unsigned int count) +void CommandBufferMTL::drawArrays(PrimitiveType primitiveType, std::size_t start, std::size_t count) { prepareDrawing(); [_mtlRenderEncoder drawPrimitives:toMTLPrimitive(primitiveType) @@ -326,7 +326,7 @@ void CommandBufferMTL::drawArrays(PrimitiveType primitiveType, unsigned int star vertexCount:count]; } -void CommandBufferMTL::drawElements(PrimitiveType primitiveType, IndexFormat indexType, unsigned int count, unsigned int offset) +void CommandBufferMTL::drawElements(PrimitiveType primitiveType, IndexFormat indexType, std::size_t count, std::size_t offset) { prepareDrawing(); [_mtlRenderEncoder drawIndexedPrimitives:toMTLPrimitive(primitiveType) diff --git a/cocos/renderer/backend/metal/DeviceMTL.h b/cocos/renderer/backend/metal/DeviceMTL.h index 01c7ba4c01..89622fd7b7 100644 --- a/cocos/renderer/backend/metal/DeviceMTL.h +++ b/cocos/renderer/backend/metal/DeviceMTL.h @@ -87,7 +87,7 @@ public: * @param usage Specifies the expected usage pattern of the data store. The symbolic constant must be BufferUsage::STATIC, BufferUsage::DYNAMIC. * @return A Buffer object. */ - virtual Buffer* newBuffer(unsigned int size, BufferType type, BufferUsage usage) override; + virtual Buffer* newBuffer(std::size_t size, BufferType type, BufferUsage usage) override; /** * New a TextureBackend object. diff --git a/cocos/renderer/backend/metal/DeviceMTL.mm b/cocos/renderer/backend/metal/DeviceMTL.mm index 55a01b9b58..feccd94991 100644 --- a/cocos/renderer/backend/metal/DeviceMTL.mm +++ b/cocos/renderer/backend/metal/DeviceMTL.mm @@ -90,7 +90,7 @@ CommandBuffer* DeviceMTL::newCommandBuffer() return new (std::nothrow) CommandBufferMTL(this); } -Buffer* DeviceMTL::newBuffer(unsigned int size, BufferType type, BufferUsage usage) +Buffer* DeviceMTL::newBuffer(std::size_t size, BufferType type, BufferUsage usage) { return new (std::nothrow) BufferMTL(_mtlDevice, size, type, usage); } diff --git a/cocos/renderer/backend/metal/RenderPipelineMTL.mm b/cocos/renderer/backend/metal/RenderPipelineMTL.mm index 32168c8897..5306de5be0 100644 --- a/cocos/renderer/backend/metal/RenderPipelineMTL.mm +++ b/cocos/renderer/backend/metal/RenderPipelineMTL.mm @@ -135,6 +135,8 @@ namespace return MTLBlendFactorSourceAlphaSaturated; case BlendFactor::BLEND_CLOLOR: return MTLBlendFactorBlendColor; + default: + return MTLBlendFactorZero; } } @@ -147,6 +149,8 @@ namespace return MTLBlendOperationSubtract; case BlendOperation::RESERVE_SUBTRACT: return MTLBlendOperationReverseSubtract; + default: + return MTLBlendOperationAdd; } } } diff --git a/cocos/renderer/backend/metal/ShaderModuleMTL.mm b/cocos/renderer/backend/metal/ShaderModuleMTL.mm index 3537cc0b54..d0f8291a41 100644 --- a/cocos/renderer/backend/metal/ShaderModuleMTL.mm +++ b/cocos/renderer/backend/metal/ShaderModuleMTL.mm @@ -133,7 +133,7 @@ void ShaderModuleMTL::parseUniform(id mtlDevice, glslopt_shader* shad } else { - nextLocation = _uniformBufferSize; + nextLocation = static_cast(_uniformBufferSize); } glslopt_shader_get_uniform_desc(shader, i, &parName, &parType, &parPrec, &parVecSize, &parMatSize, &parArrSize, &location); diff --git a/cocos/renderer/backend/metal/TextureMTL.h b/cocos/renderer/backend/metal/TextureMTL.h index 1ed4184bf6..efadd6982b 100644 --- a/cocos/renderer/backend/metal/TextureMTL.h +++ b/cocos/renderer/backend/metal/TextureMTL.h @@ -54,7 +54,7 @@ public: * @param height Specifies the height of the texture image. * @param level Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. */ - virtual void updateData(uint8_t* data, uint32_t width , uint32_t height, uint32_t level) override; + virtual void updateData(uint8_t* data, std::size_t width , std::size_t height, std::size_t level) override; /** * Update a two-dimensional texture image in a compressed format @@ -64,7 +64,7 @@ public: * @param dataLen Specifies the totoal size of compressed image in bytes. * @param level Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. */ - virtual void updateCompressedData(uint8_t* data, uint32_t width , uint32_t height, uint32_t dataLen, uint32_t level) override; + virtual void updateCompressedData(uint8_t* data, std::size_t width , std::size_t height, std::size_t dataLen, std::size_t level) override; /** * Update a two-dimensional texture subimage @@ -75,7 +75,7 @@ public: * @param level Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. * @param data Specifies a pointer to the image data in memory. */ - virtual void updateSubData(uint32_t xoffset, uint32_t yoffset, uint32_t width, uint32_t height, uint32_t level, uint8_t* data) override; + virtual void updateSubData(std::size_t xoffset, std::size_t yoffset, std::size_t width, std::size_t height, std::size_t level, uint8_t* data) override; /** * Update a two-dimensional texture subimage in a compressed format @@ -87,7 +87,7 @@ public: * @param level Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. * @param data Specifies a pointer to the compressed image data in memory. */ - virtual void updateCompressedSubData(uint32_t xoffset, uint32_t yoffset, uint32_t width, uint32_t height, uint32_t dataLen, uint32_t level, uint8_t* data) override; + virtual void updateCompressedSubData(std::size_t xoffset, std::size_t yoffset, std::size_t width, std::size_t height, std::size_t dataLen, std::size_t level, uint8_t* data) override; /** * Update sampler @@ -102,7 +102,7 @@ public: * @param flipImage Specifies if needs to flip the image. * @param callback Specifies a call back function to deal with the image. */ - virtual void getBytes(int x, int y, int width, int height, bool flipImage, std::function callback) override; + virtual void getBytes(std::size_t x, std::size_t y, std::size_t width, std::size_t height, bool flipImage, std::function callback) override; /** * Generate mipmaps. @@ -176,7 +176,7 @@ public: * @param flipImage Specifies if needs to flip the image. * @param callback */ - virtual void getBytes(int x, int y, int width, int height, bool flipImage, std::function callback) override; + virtual void getBytes(std::size_t x, std::size_t y, std::size_t width, std::size_t height, bool flipImage, std::function callback) override; /** * Generate mipmaps. @@ -215,8 +215,8 @@ private: id _mtlTexture = nil; id _mtlSamplerState = nil; MTLRegion _region; - unsigned int _bytesPerImage = 0; - unsigned int _bytesPerRow = 0; + std::size_t _bytesPerImage = 0; + std::size_t _bytesPerRow = 0; }; // end of _metal group diff --git a/cocos/renderer/backend/metal/TextureMTL.mm b/cocos/renderer/backend/metal/TextureMTL.mm index 1499e3b727..923027f0fa 100644 --- a/cocos/renderer/backend/metal/TextureMTL.mm +++ b/cocos/renderer/backend/metal/TextureMTL.mm @@ -65,9 +65,9 @@ namespace } } - void convertRGB2RGBA(uint8_t* src, uint8_t* dst, uint32_t length) + void convertRGB2RGBA(uint8_t* src, uint8_t* dst, std::size_t length) { - for (uint32_t i = 0; i < length; ++i) + for (std::size_t i = 0; i < length; ++i) { *dst++ = *src++; *dst++ = *src++; @@ -77,7 +77,7 @@ namespace } - bool convertData(uint8_t* src, unsigned int length, PixelFormat format, uint8_t** out) + bool convertData(uint8_t* src, std::size_t length, PixelFormat format, uint8_t** out) { *out = src; bool converted = false; @@ -114,9 +114,9 @@ namespace } } - uint32_t getBytesPerRowETC(MTLPixelFormat pixleFormat, uint32_t width) + std::size_t getBytesPerRowETC(MTLPixelFormat pixleFormat, std::size_t width) { - uint32_t bytesPerRow = 0; + std::size_t bytesPerRow = 0; #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) uint32_t bytesPerBlock = 0, blockWidth = 4; switch (pixleFormat) { @@ -139,9 +139,9 @@ namespace return bytesPerRow; } - uint32_t getBytesPerRowS3TC(MTLPixelFormat pixleFormat, uint32_t width) + std::size_t getBytesPerRowS3TC(MTLPixelFormat pixleFormat, std::size_t width) { - uint32_t bytesPerRow = 0; + std::size_t bytesPerRow = 0; #if (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) uint32_t bytesPerBlock = 0, blockWidth = 4; switch (pixleFormat) { @@ -161,10 +161,10 @@ namespace return bytesPerRow; } - uint32_t getBytesPerRow(PixelFormat textureFormat, uint32_t width, uint32_t bitsPerElement) + std::size_t getBytesPerRow(PixelFormat textureFormat, std::size_t width, std::size_t bitsPerElement) { MTLPixelFormat pixelFormat = Utils::toMTLPixelFormat(textureFormat); - uint32_t bytesPerRow = 0; + std::size_t bytesPerRow = 0; if(textureFormat >= PixelFormat::PVRTC4 && textureFormat <= PixelFormat::PVRTC2A) @@ -219,12 +219,12 @@ void TextureMTL::updateTextureDescriptor(const cocos2d::backend::TextureDescript _bytesPerRow = descriptor.width * _bitsPerElement / 8 ; } -void TextureMTL::updateData(uint8_t* data, uint32_t width , uint32_t height, uint32_t level) +void TextureMTL::updateData(uint8_t* data, std::size_t width , std::size_t height, std::size_t level) { updateSubData(0, 0, width, height, level, data); } -void TextureMTL::updateSubData(uint32_t xoffset, uint32_t yoffset, uint32_t width, uint32_t height, uint32_t level, uint8_t* data) +void TextureMTL::updateSubData(std::size_t xoffset, std::size_t yoffset, std::size_t width, std::size_t height, std::size_t level, uint8_t* data) { MTLRegion region = { @@ -234,10 +234,10 @@ void TextureMTL::updateSubData(uint32_t xoffset, uint32_t yoffset, uint32_t widt uint8_t* convertedData = nullptr; bool converted = convertData(data, - (uint32_t)(width * height), + width * height, _textureFormat, &convertedData); - int bytesPerRow = getBytesPerRow(_textureFormat, width, _bitsPerElement); + std::size_t bytesPerRow = getBytesPerRow(_textureFormat, width, _bitsPerElement); [_mtlTexture replaceRegion:region mipmapLevel:level @@ -251,12 +251,12 @@ void TextureMTL::updateSubData(uint32_t xoffset, uint32_t yoffset, uint32_t widt _hasMipmaps = true; } -void TextureMTL::updateCompressedData(uint8_t *data, uint32_t width, uint32_t height, uint32_t dataLen, uint32_t level) +void TextureMTL::updateCompressedData(uint8_t *data, std::size_t width, std::size_t height, std::size_t dataLen, std::size_t level) { updateCompressedSubData(0, 0, width, height, dataLen, level, data); } -void TextureMTL::updateCompressedSubData(uint32_t xoffset, uint32_t yoffset, uint32_t width, uint32_t height, uint32_t dataLen, uint32_t level, uint8_t *data) +void TextureMTL::updateCompressedSubData(std::size_t xoffset, std::size_t yoffset, std::size_t width, std::size_t height, std::size_t dataLen, std::size_t level, uint8_t *data) { updateSubData(xoffset, yoffset, width, height, level, data); } @@ -312,7 +312,7 @@ void TextureMTL::createSampler(id mtlDevice, const SamplerDescriptor [mtlDescriptor release]; } -void TextureMTL::getBytes(int x, int y, int width, int height, bool flipImage, std::function callback) +void TextureMTL::getBytes(std::size_t x, std::size_t y, std::size_t width, std::size_t height, bool flipImage, std::function callback) { CC_ASSERT(width <= _width && height <= _height); @@ -446,7 +446,7 @@ void TextureCubeMTL::updateFaceData(TextureCubeFace side, void *data) bytesPerImage:_bytesPerImage]; } -void TextureCubeMTL::getBytes(int x, int y, int width, int height, bool flipImage, std::function callback) +void TextureCubeMTL::getBytes(std::size_t x, std::size_t y, std::size_t width, std::size_t height, bool flipImage, std::function callback) { CC_ASSERT(width <= _mtlTexture.width && height <= _mtlTexture.height); diff --git a/cocos/renderer/backend/metal/Utils.h b/cocos/renderer/backend/metal/Utils.h index 8e7074cae0..e4c3745943 100644 --- a/cocos/renderer/backend/metal/Utils.h +++ b/cocos/renderer/backend/metal/Utils.h @@ -49,7 +49,7 @@ public: * @param texture Specifies the texture to be setted to the color attachemnt. */ static void updateDefaultColorAttachmentTexture(id texture); - static void resizeDefaultAttachmentTexture(int width, int height); + static void resizeDefaultAttachmentTexture(std::size_t width, std::size_t height); /** * Get the default combined depth and stencil attachment pixel format. @@ -89,7 +89,7 @@ public: * @param texture Specifies the texture to get the image. * @param callback Specifies a call back function to deal with the image. */ - static void getTextureBytes(int origX, int origY, int rectWidth, int rectHeight, id texture, std::function callback); + static void getTextureBytes(std::size_t origX, std::size_t origY, std::size_t rectWidth, std::size_t rectHeight, id texture, std::function callback); /** * Swizzle the iamge form the given format to MTLPixelFormatRGBA8Unorm. @@ -98,7 +98,7 @@ public: * @param heigth Specifies the height of the image. * @param format Specifies the format of the image. */ - static void swizzleImage(unsigned char* image, int width, int height, MTLPixelFormat format); + static void swizzleImage(unsigned char* image, std::size_t width, std::size_t height, MTLPixelFormat format); private: static id createDepthStencilAttachmentTexture(); diff --git a/cocos/renderer/backend/metal/Utils.mm b/cocos/renderer/backend/metal/Utils.mm index eb054f43aa..0974d4f330 100644 --- a/cocos/renderer/backend/metal/Utils.mm +++ b/cocos/renderer/backend/metal/Utils.mm @@ -152,7 +152,7 @@ MTLPixelFormat Utils::toMTLPixelFormat(PixelFormat textureFormat) } } -void Utils::resizeDefaultAttachmentTexture(int width, int height) +void Utils::resizeDefaultAttachmentTexture(std::size_t width, std::size_t height) { [backend::DeviceMTL::getCAMetalLayer() setDrawableSize:CGSizeMake(width, height)]; [_defaultDepthStencilAttachmentTexture release]; @@ -184,7 +184,7 @@ void Utils::generateMipmaps(id texture) [commandBuffer commit]; } -void Utils::swizzleImage(unsigned char *image, int width, int height, MTLPixelFormat format) +void Utils::swizzleImage(unsigned char *image, std::size_t width, std::size_t height, MTLPixelFormat format) { if(!image) return; @@ -206,7 +206,7 @@ void Utils::swizzleImage(unsigned char *image, int width, int height, MTLPixelFo } } -void Utils::getTextureBytes(int origX, int origY, int rectWidth, int rectHeight, id texture, std::function callback) +void Utils::getTextureBytes(std::size_t origX, std::size_t origY, std::size_t rectWidth, std::size_t rectHeight, id texture, std::function callback) { NSUInteger texWidth = texture.width; NSUInteger texHeight = texture.height; diff --git a/cocos/renderer/backend/opengl/BufferGL.cpp b/cocos/renderer/backend/opengl/BufferGL.cpp index 74a88f74ca..31f9242a64 100644 --- a/cocos/renderer/backend/opengl/BufferGL.cpp +++ b/cocos/renderer/backend/opengl/BufferGL.cpp @@ -46,7 +46,7 @@ namespace { } } -BufferGL::BufferGL(unsigned int size, BufferType type, BufferUsage usage) +BufferGL::BufferGL(std::size_t size, BufferType type, BufferUsage usage) : Buffer(size, type, usage) { glGenBuffers(1, &_buffer); @@ -89,7 +89,7 @@ void BufferGL::reloadBuffer() updateData(_data, _bufferAllocated); } -void BufferGL::fillBuffer(void* data, unsigned int offset, unsigned int size) +void BufferGL::fillBuffer(void* data, std::size_t offset, std::size_t size) { if(_bufferAlreadyFilled || !_needDefaultStoredData || BufferUsage::STATIC != _usage) return; @@ -104,7 +104,7 @@ void BufferGL::fillBuffer(void* data, unsigned int offset, unsigned int size) } #endif -void BufferGL::updateData(void* data, unsigned int size) +void BufferGL::updateData(void* data, std::size_t size) { assert(size && size <= _size); @@ -129,7 +129,7 @@ void BufferGL::updateData(void* data, unsigned int size) } } -void BufferGL::updateSubData(void* data, unsigned int offset, unsigned int size) +void BufferGL::updateSubData(void* data, std::size_t offset, std::size_t size) { CCASSERT(_bufferAllocated != 0, "updateData should be invoke before updateSubData"); diff --git a/cocos/renderer/backend/opengl/BufferGL.h b/cocos/renderer/backend/opengl/BufferGL.h index 16f1e0721f..d094dc6f18 100644 --- a/cocos/renderer/backend/opengl/BufferGL.h +++ b/cocos/renderer/backend/opengl/BufferGL.h @@ -47,7 +47,7 @@ public: * @param type Specifies the target buffer object. The symbolic constant must be BufferType::VERTEX or BufferType::INDEX. * @param usage Specifies the expected usage pattern of the data store. The symbolic constant must be BufferUsage::STATIC, BufferUsage::DYNAMIC. */ - BufferGL(unsigned int size, BufferType type, BufferUsage usage); + BufferGL(std::size_t size, BufferType type, BufferUsage usage); ~BufferGL(); /** @@ -56,7 +56,7 @@ public: * @param size Specifies the size in bytes of the data store region being replaced. * @see `updateSubData(void* data, unsigned int offset, unsigned int size)` */ - virtual void updateData(void* data, unsigned int size) override; + virtual void updateData(void* data, std::size_t size) override; /** * @brief Update buffer sub-region data @@ -65,7 +65,7 @@ public: * @param size Specifies the size in bytes of the data store region being replaced. * @see `updateData(void* data, unsigned int size)` */ - virtual void updateSubData(void* data, unsigned int offset, unsigned int size) override; + virtual void updateSubData(void* data, std::size_t offset, std::size_t size) override; /** * Static buffer data will automatically stored when it comes to foreground. @@ -83,14 +83,14 @@ public: private: #if CC_ENABLE_CACHE_TEXTURE_DATA void reloadBuffer(); - void fillBuffer(void* data, unsigned int offset, unsigned int size); + void fillBuffer(void* data, std::size_t offset, std::size_t size); bool _bufferAlreadyFilled = false; EventListenerCustom* _backToForegroundListener = nullptr; #endif GLuint _buffer = 0; - unsigned int _bufferAllocated = 0; + std::size_t _bufferAllocated = 0; char* _data = nullptr; bool _needDefaultStoredData = true; }; diff --git a/cocos/renderer/backend/opengl/CommandBufferGL.cpp b/cocos/renderer/backend/opengl/CommandBufferGL.cpp index fb34916c90..721a653272 100644 --- a/cocos/renderer/backend/opengl/CommandBufferGL.cpp +++ b/cocos/renderer/backend/opengl/CommandBufferGL.cpp @@ -337,7 +337,7 @@ void CommandBufferGL::setProgramState(ProgramState* programState) _programState = programState; } -void CommandBufferGL::drawArrays(PrimitiveType primitiveType, unsigned int start, unsigned int count) +void CommandBufferGL::drawArrays(PrimitiveType primitiveType, std::size_t start, std::size_t count) { prepareDrawing(); glDrawArrays(UtilsGL::toGLPrimitiveType(primitiveType), start, count); @@ -345,7 +345,7 @@ void CommandBufferGL::drawArrays(PrimitiveType primitiveType, unsigned int start cleanResources(); } -void CommandBufferGL::drawElements(PrimitiveType primitiveType, IndexFormat indexType, unsigned int count, unsigned int offset) +void CommandBufferGL::drawElements(PrimitiveType primitiveType, IndexFormat indexType, std::size_t count, std::size_t offset) { prepareDrawing(); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer->getHandler()); diff --git a/cocos/renderer/backend/opengl/CommandBufferGL.h b/cocos/renderer/backend/opengl/CommandBufferGL.h index fc6bcadb12..eb7dff7e70 100644 --- a/cocos/renderer/backend/opengl/CommandBufferGL.h +++ b/cocos/renderer/backend/opengl/CommandBufferGL.h @@ -120,7 +120,7 @@ public: * @param count For each instance, the number of indexes to draw * @see `drawElements(PrimitiveType primitiveType, IndexFormat indexType, unsigned int count, unsigned int offset)` */ - virtual void drawArrays(PrimitiveType primitiveType, unsigned int start, unsigned int count) override; + virtual void drawArrays(PrimitiveType primitiveType, std::size_t start, std::size_t count) override; /** * Draw primitives with an index list. @@ -131,7 +131,7 @@ public: * @see `setIndexBuffer(Buffer* buffer)` * @see `drawArrays(PrimitiveType primitiveType, unsigned int start, unsigned int count)` */ - virtual void drawElements(PrimitiveType primitiveType, IndexFormat indexType, unsigned int count, unsigned int offset) override; + virtual void drawElements(PrimitiveType primitiveType, IndexFormat indexType, std::size_t count, std::size_t offset) override; /** * Do some resources release. diff --git a/cocos/renderer/backend/opengl/DeviceGL.cpp b/cocos/renderer/backend/opengl/DeviceGL.cpp index 5fa719ea19..f4f2ede1e7 100644 --- a/cocos/renderer/backend/opengl/DeviceGL.cpp +++ b/cocos/renderer/backend/opengl/DeviceGL.cpp @@ -64,7 +64,7 @@ CommandBuffer* DeviceGL::newCommandBuffer() return new (std::nothrow) CommandBufferGL(); } -Buffer* DeviceGL::newBuffer(unsigned int size, BufferType type, BufferUsage usage) +Buffer* DeviceGL::newBuffer(std::size_t size, BufferType type, BufferUsage usage) { return new (std::nothrow) BufferGL(size, type, usage); } diff --git a/cocos/renderer/backend/opengl/DeviceGL.h b/cocos/renderer/backend/opengl/DeviceGL.h index 8b5e30640f..4ab0409577 100644 --- a/cocos/renderer/backend/opengl/DeviceGL.h +++ b/cocos/renderer/backend/opengl/DeviceGL.h @@ -52,7 +52,7 @@ public: * @param usage Specifies the expected usage pattern of the data store. The symbolic constant must be BufferUsage::STATIC, BufferUsage::DYNAMIC. * @return A Buffer object. */ - virtual Buffer* newBuffer(unsigned int size, BufferType type, BufferUsage usage) override; + virtual Buffer* newBuffer(std::size_t size, BufferType type, BufferUsage usage) override; /** * New a TextureBackend object, not auto released. diff --git a/cocos/renderer/backend/opengl/TextureGL.cpp b/cocos/renderer/backend/opengl/TextureGL.cpp index adafbc0f4f..0aef8a4808 100644 --- a/cocos/renderer/backend/opengl/TextureGL.cpp +++ b/cocos/renderer/backend/opengl/TextureGL.cpp @@ -157,7 +157,7 @@ void Texture2DGL::updateSamplerDescriptor(const SamplerDescriptor &sampler) { } } -void Texture2DGL::updateData(uint8_t* data, uint32_t width , uint32_t height, uint32_t level) +void Texture2DGL::updateData(uint8_t* data, std::size_t width , std::size_t height, std::size_t level) { //Set the row align only when mipmapsNum == 1 and the data is uncompressed auto mipmapEnalbed = isMipmapEnabled(_textureInfo.minFilterGL) || isMipmapEnabled(_textureInfo.magFilterGL); @@ -210,8 +210,8 @@ void Texture2DGL::updateData(uint8_t* data, uint32_t width , uint32_t height, ui _hasMipmaps = true; } -void Texture2DGL::updateCompressedData(uint8_t *data, uint32_t width, uint32_t height, - uint32_t dataLen, uint32_t level) +void Texture2DGL::updateCompressedData(uint8_t *data, std::size_t width, std::size_t height, + std::size_t dataLen, std::size_t level) { glPixelStorei(GL_UNPACK_ALIGNMENT, 1); @@ -237,7 +237,7 @@ void Texture2DGL::updateCompressedData(uint8_t *data, uint32_t width, uint32_t h _hasMipmaps = true; } -void Texture2DGL::updateSubData(uint32_t xoffset, uint32_t yoffset, uint32_t width, uint32_t height, uint32_t level, uint8_t* data) +void Texture2DGL::updateSubData(std::size_t xoffset, std::size_t yoffset, std::size_t width, std::size_t height, std::size_t level, uint8_t* data) { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, _textureInfo.texture); @@ -257,8 +257,8 @@ void Texture2DGL::updateSubData(uint32_t xoffset, uint32_t yoffset, uint32_t wid _hasMipmaps = true; } -void Texture2DGL::updateCompressedSubData(uint32_t xoffset, uint32_t yoffset, uint32_t width, - uint32_t height, uint32_t dataLen, uint32_t level, +void Texture2DGL::updateCompressedSubData(std::size_t xoffset, std::size_t yoffset, std::size_t width, + std::size_t height, std::size_t dataLen, std::size_t level, uint8_t *data) { glActiveTexture(GL_TEXTURE0); @@ -298,7 +298,7 @@ void Texture2DGL::generateMipmaps() } } -void Texture2DGL::getBytes(int x, int y, int width, int height, bool flipImage, std::function callback) +void Texture2DGL::getBytes(std::size_t x, std::size_t y, std::size_t width, std::size_t height, bool flipImage, std::function callback) { GLint defaultFBO = 0; glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO); @@ -418,7 +418,7 @@ void TextureCubeGL::updateFaceData(TextureCubeFace side, void *data) glBindTexture(GL_TEXTURE_CUBE_MAP, 0); } -void TextureCubeGL::getBytes(int x, int y, int width, int height, bool flipImage, std::function callback) +void TextureCubeGL::getBytes(std::size_t x, std::size_t y, std::size_t width, std::size_t height, bool flipImage, std::function callback) { GLint defaultFBO = 0; glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO); diff --git a/cocos/renderer/backend/opengl/TextureGL.h b/cocos/renderer/backend/opengl/TextureGL.h index 976e099c95..98fc93a0ac 100644 --- a/cocos/renderer/backend/opengl/TextureGL.h +++ b/cocos/renderer/backend/opengl/TextureGL.h @@ -74,7 +74,7 @@ public: * @param height Specifies the height of the texture image. * @param level Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. */ - virtual void updateData(uint8_t* data, uint32_t width , uint32_t height, uint32_t level) override; + virtual void updateData(uint8_t* data, std::size_t width , std::size_t height, std::size_t level) override; /** * Update a two-dimensional texture image in a compressed format @@ -84,7 +84,7 @@ public: * @param dataLen Specifies the totoal size of compressed image in bytes. * @param level Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. */ - virtual void updateCompressedData(uint8_t* data, uint32_t width , uint32_t height, uint32_t dataLen, uint32_t level) override; + virtual void updateCompressedData(uint8_t* data, std::size_t width , std::size_t height, std::size_t dataLen, std::size_t level) override; /** * Update a two-dimensional texture subimage @@ -95,7 +95,7 @@ public: * @param level Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. * @param data Specifies a pointer to the image data in memory. */ - virtual void updateSubData(uint32_t xoffset, uint32_t yoffset, uint32_t width, uint32_t height, uint32_t level, uint8_t* data) override; + virtual void updateSubData(std::size_t xoffset, std::size_t yoffset, std::size_t width, std::size_t height, std::size_t level, uint8_t* data) override; /** * Update a two-dimensional texture subimage in a compressed format @@ -107,7 +107,7 @@ public: * @param level Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. * @param data Specifies a pointer to the compressed image data in memory. */ - virtual void updateCompressedSubData(uint32_t xoffset, uint32_t yoffset, uint32_t width, uint32_t height, uint32_t dataLen, uint32_t level, uint8_t* data) override; + virtual void updateCompressedSubData(std::size_t xoffset, std::size_t yoffset, std::size_t width, std::size_t height, std::size_t dataLen, std::size_t level, uint8_t* data) override; /** * Update sampler @@ -122,7 +122,7 @@ public: * @param flipImage Specifies if needs to flip the image. * @param callback Specifies a call back function to deal with the image. */ - virtual void getBytes(int x, int y, int width, int height, bool flipImage, std::function callback) override; + virtual void getBytes(std::size_t x, std::size_t y, std::size_t width, std::size_t height, bool flipImage, std::function callback) override; /** * Generate mipmaps. @@ -186,7 +186,7 @@ public: * @param flipImage Specifies if needs to flip the image. * @param callback */ - virtual void getBytes(int x, int y, int width, int height, bool flipImage, std::function callback) override; + virtual void getBytes(std::size_t x, std::size_t y, std::size_t width, std::size_t height, bool flipImage, std::function callback) override; /// Generate mipmaps. virtual void generateMipmaps() override; diff --git a/cocos/ui/UIVideoPlayer-ios.mm b/cocos/ui/UIVideoPlayer-ios.mm index 2a279108cf..6a787e8216 100644 --- a/cocos/ui/UIVideoPlayer-ios.mm +++ b/cocos/ui/UIVideoPlayer-ios.mm @@ -268,15 +268,6 @@ typedef NS_ENUM(NSInteger, PlayerbackState) { //------------------------------------------------------------------------------------------------------------ VideoPlayer::VideoPlayer() -: _isPlaying(false) -, _fullScreenDirty(false) -, _fullScreenEnabled(false) -, _keepAspectRatioEnabled(false) -, _videoPlayerIndex(-1) -, _eventCallback(nullptr) -, _isLooping(false) -, _isUserInputEnabled(true) -, _styleType(StyleType::DEFAULT) { _videoView = [[UIVideoViewWrapperIos alloc] init:this]; diff --git a/cocos/ui/UIVideoPlayer.h b/cocos/ui/UIVideoPlayer.h index 166c411afd..53c6153264 100644 --- a/cocos/ui/UIVideoPlayer.h +++ b/cocos/ui/UIVideoPlayer.h @@ -241,22 +241,22 @@ namespace ui{ URL }; - bool _isPlaying; - bool _isLooping; - bool _isUserInputEnabled; - bool _fullScreenDirty; - bool _fullScreenEnabled; - bool _keepAspectRatioEnabled; + bool _isPlaying = false; + bool _isLooping = false; + bool _isUserInputEnabled = true; + bool _fullScreenDirty = false; + bool _fullScreenEnabled = false; + bool _keepAspectRatioEnabled = false; - StyleType _styleType; + StyleType _styleType = StyleType::DEFAULT; std::string _videoURL; Source _videoSource; - int _videoPlayerIndex; - ccVideoPlayerCallback _eventCallback; + int _videoPlayerIndex = -1; + ccVideoPlayerCallback _eventCallback = nullptr; - void* _videoView; + void* _videoView = nullptr; }; } diff --git a/cocos/ui/UIWebView/UIWebViewImpl-ios.mm b/cocos/ui/UIWebView/UIWebViewImpl-ios.mm index 85dbf16d33..a9a7600ba2 100644 --- a/cocos/ui/UIWebView/UIWebViewImpl-ios.mm +++ b/cocos/ui/UIWebView/UIWebViewImpl-ios.mm @@ -292,7 +292,7 @@ completionHandler(); }]]; - auto rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController; + auto rootViewController = [UIApplication sharedApplication].windows[0].rootViewController; [rootViewController presentViewController:alertController animated:YES completion:^{}]; } diff --git a/tests/cpp-tests/Classes/ExtensionsTest/AssetsManagerExTest/AssetsManagerExTest.cpp b/tests/cpp-tests/Classes/ExtensionsTest/AssetsManagerExTest/AssetsManagerExTest.cpp index fe5f508e42..d6bf7f0d98 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/AssetsManagerExTest/AssetsManagerExTest.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/AssetsManagerExTest/AssetsManagerExTest.cpp @@ -123,8 +123,7 @@ void AssetsManagerExLoaderScene::startDownloadCallback(Ref* sender) } else { - int testIndex = _testIndex; - _amListener = cocos2d::extension::EventListenerAssetsManagerEx::create(_am, [testIndex, this](EventAssetsManagerEx* event){ + _amListener = cocos2d::extension::EventListenerAssetsManagerEx::create(_am, [this](EventAssetsManagerEx* event){ static int failCount = 0; switch (event->getEventCode()) { diff --git a/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp b/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp index 37d171df12..476fb637b6 100644 --- a/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp +++ b/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp @@ -46,7 +46,7 @@ public: else if(itr->second < 0) { itr->second = n + itr->second; } - return itr->second; + return static_cast(itr->second); } inline int64_t now() const{ diff --git a/tests/cpp-tests/Classes/Physics3DTest/Physics3DTest.cpp b/tests/cpp-tests/Classes/Physics3DTest/Physics3DTest.cpp index afe1993be7..9d530d4177 100644 --- a/tests/cpp-tests/Classes/Physics3DTest/Physics3DTest.cpp +++ b/tests/cpp-tests/Classes/Physics3DTest/Physics3DTest.cpp @@ -176,9 +176,7 @@ void Physics3DTestDemo::onTouchesEnded(const std::vector& touches, cocos } } -Physics3DTestDemo::Physics3DTestDemo( void ) -: _angle(0.0f) -, _camera(nullptr) +Physics3DTestDemo::Physics3DTestDemo() { } @@ -188,7 +186,7 @@ void Physics3DTestDemo::update( float /*delta*/ ) } -Physics3DTestDemo::~Physics3DTestDemo( void ) +Physics3DTestDemo::~Physics3DTestDemo() { } diff --git a/tests/cpp-tests/Classes/Physics3DTest/Physics3DTest.h b/tests/cpp-tests/Classes/Physics3DTest/Physics3DTest.h index 2bdf5150d7..a53773cb83 100644 --- a/tests/cpp-tests/Classes/Physics3DTest/Physics3DTest.h +++ b/tests/cpp-tests/Classes/Physics3DTest/Physics3DTest.h @@ -68,9 +68,9 @@ protected: protected: std::string _title; - cocos2d::Camera *_camera; - float _angle; - bool _needShootBox; + cocos2d::Camera *_camera = nullptr; + float _angle = 0.f; + bool _needShootBox = false; }; class BasicPhysics3DDemo : public Physics3DTestDemo diff --git a/tests/cpp-tests/Classes/Sprite3DTest/DrawNode3D.cpp b/tests/cpp-tests/Classes/Sprite3DTest/DrawNode3D.cpp index e1339b73ae..50013b1061 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/DrawNode3D.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/DrawNode3D.cpp @@ -58,7 +58,7 @@ void DrawNode3D::ensureCapacity(int count) { CCASSERT(count>=0, "capacity must be >= 0"); - const int EXTENDED_SIZE = _bufferLines.size() + count; + auto EXTENDED_SIZE = _bufferLines.size() + count; _bufferLines.reserve(EXTENDED_SIZE); diff --git a/tests/cpp-tests/Classes/VibrateTest/VibrateTest.cpp b/tests/cpp-tests/Classes/VibrateTest/VibrateTest.cpp index 6aa3e17be3..656e73c1ca 100644 --- a/tests/cpp-tests/Classes/VibrateTest/VibrateTest.cpp +++ b/tests/cpp-tests/Classes/VibrateTest/VibrateTest.cpp @@ -128,7 +128,7 @@ namespace { std::function _onTriggered = nullptr; - bool _enabled = false; + bool _enabled = true; }; class SliderEx : public Slider From a09806f5806adbc432812dce6fffa9e805cc9b45 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Fri, 25 Oct 2019 16:41:03 +0800 Subject: [PATCH 52/96] Fix todo (#20248) --- cocos/3d/CCTerrain.cpp | 2 -- cocos/renderer/backend/metal/TextureMTL.mm | 5 +++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/cocos/3d/CCTerrain.cpp b/cocos/3d/CCTerrain.cpp index a95b2ae6a8..7f90607ead 100644 --- a/cocos/3d/CCTerrain.cpp +++ b/cocos/3d/CCTerrain.cpp @@ -1403,8 +1403,6 @@ void Terrain::Chunk::updateVerticesForLOD() } } - //TODO coulsonwang -// glBufferData(GL_ARRAY_BUFFER, sizeof(TerrainVertexData)*_currentVertices.size(), &_currentVertices[0], GL_STREAM_DRAW); _oldLod = _currentLod; } diff --git a/cocos/renderer/backend/metal/TextureMTL.mm b/cocos/renderer/backend/metal/TextureMTL.mm index 923027f0fa..e230c05f80 100644 --- a/cocos/renderer/backend/metal/TextureMTL.mm +++ b/cocos/renderer/backend/metal/TextureMTL.mm @@ -24,6 +24,7 @@ #include "TextureMTL.h" #include "Utils.h" +#include "base/ccMacros.h" CC_BACKEND_BEGIN @@ -43,7 +44,7 @@ namespace ret = MTLSamplerAddressModeClampToEdge; break; default: - assert(false); + CCASSERT(false, "Not supported sampler address mode!"); break; } return ret; @@ -130,7 +131,7 @@ namespace bytesPerBlock = 16; break; default: - assert(false); //TODO coulsonwang + CCASSERT(false, "Not supported ETC format!"); break; } auto blocksPerRow = (width + (blockWidth - 1)) / blockWidth; From 8878303e225b941d09a53a7763b792e1de8954b9 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Fri, 25 Oct 2019 17:20:01 +0800 Subject: [PATCH 53/96] [ci skip][AUTO]: updating luabinding & cocos_file.json automatically (#20252) --- .../auto/lua_cocos2dx_backend_auto.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.cpp index 58ff52dca1..f8f2c29006 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_backend_auto.cpp @@ -1923,20 +1923,20 @@ int lua_cocos2dx_backend_TextureBackend_getBytes(lua_State* tolua_S) argc = lua_gettop(tolua_S)-1; if (argc == 6) { - int arg0; - int arg1; - int arg2; - int arg3; + unsigned int arg0; + unsigned int arg1; + unsigned int arg2; + unsigned int arg3; bool arg4; - std::function arg5; + std::function arg5; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccb.TextureBackend:getBytes"); + ok &= luaval_to_uint32(tolua_S, 2,&arg0, "ccb.TextureBackend:getBytes"); - ok &= luaval_to_int32(tolua_S, 3,(int *)&arg1, "ccb.TextureBackend:getBytes"); + ok &= luaval_to_uint32(tolua_S, 3,&arg1, "ccb.TextureBackend:getBytes"); - ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "ccb.TextureBackend:getBytes"); + ok &= luaval_to_uint32(tolua_S, 4,&arg2, "ccb.TextureBackend:getBytes"); - ok &= luaval_to_int32(tolua_S, 5,(int *)&arg3, "ccb.TextureBackend:getBytes"); + ok &= luaval_to_uint32(tolua_S, 5,&arg3, "ccb.TextureBackend:getBytes"); ok &= luaval_to_boolean(tolua_S, 6,&arg4, "ccb.TextureBackend:getBytes"); From 2501f53b9b571650453ffe7e1fb8ef88f05cd7f9 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Fri, 25 Oct 2019 18:22:35 +0800 Subject: [PATCH 54/96] add CameraTest (#20253) * nodeTest * fix --- cocos/2d/CCSprite.cpp | 6 ++-- tests/cpp-tests/Classes/NodeTest/NodeTest.cpp | 32 ++++++++++++++----- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index 57d3f50c36..ab3bef1312 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -417,9 +417,6 @@ void Sprite::setProgramState(backend::ProgramState *programState) void Sprite::setTexture(Texture2D *texture) { - auto isETC1 = texture && texture->getAlphaTextureName(); - setProgramState((isETC1) ? backend::ProgramType::ETC1 : backend::ProgramType::POSITION_TEXTURE_COLOR); - CCASSERT(! _batchNode || (texture && texture == _batchNode->getTexture()), "CCSprite: Batched sprites should use the same texture as the batchnode"); // accept texture==nil as argument CCASSERT( !texture || dynamic_cast(texture), "setTexture expects a Texture2D. Invalid argument"); @@ -451,7 +448,8 @@ void Sprite::setTexture(Texture2D *texture) } updateBlendFunc(); } - + auto isETC1 = texture && texture->getAlphaTextureName(); + setProgramState((isETC1) ? backend::ProgramType::ETC1 : backend::ProgramType::POSITION_TEXTURE_COLOR); updateProgramState(); } diff --git a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp index 3df31eee30..fbb25905d2 100644 --- a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp +++ b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp @@ -47,10 +47,9 @@ enum CocosNodeTests::CocosNodeTests() { - //ADD_TEST_CASE(CameraTest1); - // TODO: Camera has been removed from CCNode; add new feature to support it - // ADD_TEST_CASE(CameraTest2); - //ADD_TEST_CASE(CameraCenterTest); + ADD_TEST_CASE(CameraTest1); + ADD_TEST_CASE(CameraTest2); + ADD_TEST_CASE(CameraCenterTest); ADD_TEST_CASE(NodeTest2); ADD_TEST_CASE(NodeTest4); ADD_TEST_CASE(NodeTest5); @@ -970,11 +969,13 @@ public: auto sprite = new (std::nothrow) MySprite; sprite->initWithFile(spritefilename); sprite->autorelease(); - -// auto shaderState = GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR); -// sprite->setGLProgramState(shaderState); + auto program = backend::Program::getBuiltinProgram(backend::ProgramType::POSITION_TEXTURE_COLOR); + auto programState = new (std::nothrow) backend::ProgramState(program); + programState->autorelease(); + sprite->setProgramState(programState); return sprite; } + virtual void setProgramState(backend::ProgramState* programState) override; virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override; void onDraw(const Mat4 &transform, uint32_t flags); @@ -983,10 +984,25 @@ protected: }; +void MySprite::setProgramState(backend::ProgramState* programState) +{ + Sprite::setProgramState(programState); + auto& pipelineDescriptor = _customCommand.getPipelineDescriptor(); + pipelineDescriptor.programState = programState; + _customCommand.getPipelineDescriptor().programState->setTexture(_textureLocation, 0, _texture->getBackendTexture()); + + _customCommand.setDrawType(CustomCommand::DrawType::ARRAY); + _customCommand.setPrimitiveType(CustomCommand::PrimitiveType::TRIANGLE_STRIP); + _customCommand.createVertexBuffer(sizeof(V3F_C4B_T2F), 4, CustomCommand::BufferUsage::STATIC); + _customCommand.updateVertexBuffer(&_quad, 4*sizeof(V3F_C4B_T2F)); +} + void MySprite::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) { + const auto& projectionMat = Director::getInstance()->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION); + auto mvpMatrix = projectionMat * transform; + _customCommand.getPipelineDescriptor().programState->setUniform(_mvpMatrixLocation, mvpMatrix.m, sizeof(mvpMatrix.m)); _customCommand.init(_globalZOrder, transform, flags); - _customCommand.func = CC_CALLBACK_0(MySprite::onDraw, this, transform, flags); renderer->addCommand(&_customCommand); } From 7f796936ee7161e82de388cb7b4cb3ebe8714ada Mon Sep 17 00:00:00 2001 From: minggo Date: Mon, 28 Oct 2019 09:53:07 +0800 Subject: [PATCH 55/96] Revert "fix RotateTo animation when angle is bigger than 360 (#20009) (#20211)" (#20257) This reverts commit 8a64e6f983851e089a673a0853e9c75205f170ba. --- cocos/2d/CCActionInterval.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/cocos/2d/CCActionInterval.cpp b/cocos/2d/CCActionInterval.cpp index 1a06ce49eb..8dd7612254 100644 --- a/cocos/2d/CCActionInterval.cpp +++ b/cocos/2d/CCActionInterval.cpp @@ -913,8 +913,6 @@ void RotateTo::calculateAngles(float &startAngle, float &diffAngle, float dstAng } diffAngle = dstAngle - startAngle; - //fix angle when angle is bigger than 360 - diffAngle = diffAngle - (int)diffAngle / 360 * 360; if (diffAngle > 180) { diffAngle -= 360; From c85cfcb2234b60d63a59b44a0b95258e2e9184f7 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Mon, 28 Oct 2019 14:26:09 +0800 Subject: [PATCH 56/96] fix crash --- cocos/base/base64.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cocos/base/base64.cpp b/cocos/base/base64.cpp index fffb4cff93..86b4eca2ec 100644 --- a/cocos/base/base64.cpp +++ b/cocos/base/base64.cpp @@ -39,7 +39,8 @@ int _base64Decode(const unsigned char *input, unsigned int input_len, unsigned c unsigned int input_idx = 0; unsigned int output_idx = 0; - for (size_t i = (sizeof alphabet) - 1; i >= 0 ; i--) { + + for (size_t i = 0; i < (sizeof alphabet); i++) { inalphabet[alphabet[i]] = 1; decoder[alphabet[i]] = i; } From 2d42aa1d219bceac1a9bae3b1debf8d79bfb6629 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Mon, 28 Oct 2019 15:04:03 +0800 Subject: [PATCH 57/96] fix memory leak (#20258) --- cocos/2d/CCSprite.cpp | 1 - cocos/renderer/backend/ProgramState.cpp | 2 + tests/cpp-tests/Classes/NodeTest/NodeTest.cpp | 37 ------------------- 3 files changed, 2 insertions(+), 38 deletions(-) diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index ab3bef1312..be30600100 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -450,7 +450,6 @@ void Sprite::setTexture(Texture2D *texture) } auto isETC1 = texture && texture->getAlphaTextureName(); setProgramState((isETC1) ? backend::ProgramType::ETC1 : backend::ProgramType::POSITION_TEXTURE_COLOR); - updateProgramState(); } void Sprite::updateProgramState() diff --git a/cocos/renderer/backend/ProgramState.cpp b/cocos/renderer/backend/ProgramState.cpp index b093543a10..878d8c5b6d 100644 --- a/cocos/renderer/backend/ProgramState.cpp +++ b/cocos/renderer/backend/ProgramState.cpp @@ -424,6 +424,7 @@ void ProgramState::setTexture(int location, uint32_t slot, backend::TextureBacke if(location < 0) return; TextureInfo& info = textureInfo[location]; + info.releaseTextures(); info.slot = {slot}; info.textures = {texture}; info.retainTextures(); @@ -436,6 +437,7 @@ void ProgramState::setTextureArray(int location, const std::vector& sl { assert(slots.size() == textures.size()); TextureInfo& info = textureInfo[location]; + info.releaseTextures(); info.slot = slots; info.textures = textures; info.retainTextures(); diff --git a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp index fbb25905d2..b0cd647d62 100644 --- a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp +++ b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp @@ -977,7 +977,6 @@ public: } virtual void setProgramState(backend::ProgramState* programState) override; virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override; - void onDraw(const Mat4 &transform, uint32_t flags); protected: CustomCommand _customCommand; @@ -989,7 +988,6 @@ void MySprite::setProgramState(backend::ProgramState* programState) Sprite::setProgramState(programState); auto& pipelineDescriptor = _customCommand.getPipelineDescriptor(); pipelineDescriptor.programState = programState; - _customCommand.getPipelineDescriptor().programState->setTexture(_textureLocation, 0, _texture->getBackendTexture()); _customCommand.setDrawType(CustomCommand::DrawType::ARRAY); _customCommand.setPrimitiveType(CustomCommand::PrimitiveType::TRIANGLE_STRIP); @@ -1006,41 +1004,6 @@ void MySprite::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) renderer->addCommand(&_customCommand); } -void MySprite::onDraw(const Mat4 &transform, uint32_t flags) -{ -// getGLProgram()->use(); -// getGLProgram()->setUniformsForBuiltins(transform); - -// cocos2d::utils::setBlending(_blendFunc.src, _blendFunc.dst); - -// glActiveTexture(GL_TEXTURE0); -// glBindTexture(GL_TEXTURE_2D, _texture->getName()); - -// glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_POSITION); -// glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_TEX_COORD); -// glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_COLOR); - - #define kQuadSize sizeof(_quad.bl) -// size_t offset = (size_t)&_quad; - - // vertex - int diff = offsetof( V3F_C4B_T2F, vertices); -// glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff)); - - // texCoords - diff = offsetof( V3F_C4B_T2F, texCoords); -// glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff)); - - // color - diff = offsetof( V3F_C4B_T2F, colors); -// glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff)); - - //TODO coulsonwang -// glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); -// -// CHECK_GL_ERROR_DEBUG(); - CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,4); -} //------------------------------------------------------------------ // // CameraTest1 From d9f829649871f65ca65ade47e0050ce80eb0a7f8 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Mon, 28 Oct 2019 15:05:17 +0800 Subject: [PATCH 58/96] update reivew --- cocos/base/base64.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cocos/base/base64.cpp b/cocos/base/base64.cpp index 86b4eca2ec..b3c34565fc 100644 --- a/cocos/base/base64.cpp +++ b/cocos/base/base64.cpp @@ -40,9 +40,9 @@ int _base64Decode(const unsigned char *input, unsigned int input_len, unsigned c unsigned int output_idx = 0; - for (size_t i = 0; i < (sizeof alphabet); i++) { - inalphabet[alphabet[i]] = 1; - decoder[alphabet[i]] = i; + for (char i = (sizeof alphabet) - 1; i >= 0 ; i--){ + inalphabet[alphabet[static_cast(i)]] = 1; + decoder[alphabet[static_cast(i)]] = i; } char_count = 0; From 84feb1f87cb48bd934133416694cd6487540f066 Mon Sep 17 00:00:00 2001 From: minggo Date: Mon, 28 Oct 2019 15:43:42 +0800 Subject: [PATCH 59/96] update default ABI --- tests/cpp-empty-test/proj.android/gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/cpp-empty-test/proj.android/gradle.properties b/tests/cpp-empty-test/proj.android/gradle.properties index 0994d0bdea..96483e2186 100644 --- a/tests/cpp-empty-test/proj.android/gradle.properties +++ b/tests/cpp-empty-test/proj.android/gradle.properties @@ -31,10 +31,10 @@ PROP_TARGET_SDK_VERSION=28 # Available architextures (armeabi-v7a | arm64-v8a | x86) # To build for multiple architexture, use the `:` between them # Example - PROP_APP_ABI=armeabi-v7a:arm64-v8a:x86 -PROP_APP_ABI=x86 +PROP_APP_ABI=armeabi-v7a # uncomment it and fill in sign information for release mode #RELEASE_STORE_FILE=file path of keystore #RELEASE_STORE_PASSWORD=password of keystore #RELEASE_KEY_ALIAS=alias of key -#RELEASE_KEY_PASSWORD=password of key \ No newline at end of file +#RELEASE_KEY_PASSWORD=password of key From eb23e1ffde8fe67b0b9380e5b45de31dd38b2753 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Mon, 28 Oct 2019 16:05:05 +0800 Subject: [PATCH 60/96] needs update texture info --- cocos/2d/CCSprite.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index be30600100..9176d895ff 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -417,6 +417,8 @@ void Sprite::setProgramState(backend::ProgramState *programState) void Sprite::setTexture(Texture2D *texture) { + auto isETC1 = texture && texture->getAlphaTextureName(); + setProgramState((isETC1) ? backend::ProgramType::ETC1 : backend::ProgramType::POSITION_TEXTURE_COLOR); CCASSERT(! _batchNode || (texture && texture == _batchNode->getTexture()), "CCSprite: Batched sprites should use the same texture as the batchnode"); // accept texture==nil as argument CCASSERT( !texture || dynamic_cast(texture), "setTexture expects a Texture2D. Invalid argument"); @@ -448,8 +450,7 @@ void Sprite::setTexture(Texture2D *texture) } updateBlendFunc(); } - auto isETC1 = texture && texture->getAlphaTextureName(); - setProgramState((isETC1) ? backend::ProgramType::ETC1 : backend::ProgramType::POSITION_TEXTURE_COLOR); + updateProgramState(); } void Sprite::updateProgramState() From a0d775151021c8c3747351edcd7034c100612a3d Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Mon, 28 Oct 2019 16:47:27 +0800 Subject: [PATCH 61/96] rename to make function name more clear --- cocos/2d/CCSprite.cpp | 6 +++--- cocos/2d/CCSprite.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index 9176d895ff..4094fe60e0 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -411,7 +411,7 @@ void Sprite::setProgramState(backend::ProgramState *programState) _alphaTextureLocation = pipelineDescriptor.programState->getUniformLocation(backend::Uniform::TEXTURE1); setVertexLayout(); - updateProgramState(); + updateProgramStateTexture(); setMVPMatrixUniform(); } @@ -450,10 +450,10 @@ void Sprite::setTexture(Texture2D *texture) } updateBlendFunc(); } - updateProgramState(); + updateProgramStateTexture(); } -void Sprite::updateProgramState() +void Sprite::updateProgramStateTexture() { if (_texture == nullptr || _texture->getBackendTexture() == nullptr) return; diff --git a/cocos/2d/CCSprite.h b/cocos/2d/CCSprite.h index d5f012a00a..0f0d5c14ab 100644 --- a/cocos/2d/CCSprite.h +++ b/cocos/2d/CCSprite.h @@ -635,7 +635,7 @@ protected: virtual void setDirtyRecursively(bool value); virtual void flipX(); virtual void flipY(); - virtual void updateProgramState(); + virtual void updateProgramStateTexture(); void updatePoly(); void updateStretchFactor(); From 35b246939a485f576fe1ac09cc44587eee98d720 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Mon, 28 Oct 2019 18:11:17 +0800 Subject: [PATCH 62/96] update review --- cocos/base/base64.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cocos/base/base64.cpp b/cocos/base/base64.cpp index b3c34565fc..633ec3d777 100644 --- a/cocos/base/base64.cpp +++ b/cocos/base/base64.cpp @@ -39,10 +39,10 @@ int _base64Decode(const unsigned char *input, unsigned int input_len, unsigned c unsigned int input_idx = 0; unsigned int output_idx = 0; - - for (char i = (sizeof alphabet) - 1; i >= 0 ; i--){ - inalphabet[alphabet[static_cast(i)]] = 1; - decoder[alphabet[static_cast(i)]] = i; + auto alphabetSize = sizeof(alphabet); + for (size_t i = 0; i < alphabetSize; i++){ + inalphabet[alphabet[i]] = 1; + decoder[alphabet[i]] = i; } char_count = 0; From 4af28a2f6850328eb7f02e5e0cf2864dd123555d Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 29 Oct 2019 10:46:24 +0800 Subject: [PATCH 63/96] revert cpp-empty-test (#20262) --- .../Classes/HelloWorldScene.cpp | 75 ++++++++----------- 1 file changed, 31 insertions(+), 44 deletions(-) diff --git a/tests/cpp-empty-test/Classes/HelloWorldScene.cpp b/tests/cpp-empty-test/Classes/HelloWorldScene.cpp index abfef75376..912cd5b800 100644 --- a/tests/cpp-empty-test/Classes/HelloWorldScene.cpp +++ b/tests/cpp-empty-test/Classes/HelloWorldScene.cpp @@ -50,39 +50,35 @@ bool HelloWorld::init() // 2. add a menu item with "X" image, which is clicked to quit the program // you may modify it. -// // add a "close" icon to exit the progress. it's an autorelease object -// auto closeItem = MenuItemImage::create( -// "CloseNormal.png", -// "CloseSelected.png", -// CC_CALLBACK_1(HelloWorld::menuCloseCallback,this)); -// -// closeItem->setPosition(origin + Vec2(visibleSize) - Vec2(closeItem->getContentSize() / 2)); -// -// // create menu, it's an autorelease object -// auto menu = Menu::create(closeItem, nullptr); -// menu->setPosition(Vec2::ZERO); -// this->addChild(menu, 1); -// -// ///////////////////////////// -// // 3. add your codes below... -// -// // add a label shows "Hello World" -// // create and initialize a label -// -// auto label = Label::createWithTTF("Hello World", "fonts/arial.ttf", TITLE_FONT_SIZE); - auto label = Label::createWithSystemFont("Hello World", "Arial", 20); -// -// // position the label on the center of the screen + // add a "close" icon to exit the progress. it's an autorelease object + auto closeItem = MenuItemImage::create( + "CloseNormal.png", + "CloseSelected.png", + CC_CALLBACK_1(HelloWorld::menuCloseCallback,this)); + + closeItem->setPosition(origin + Vec2(visibleSize) - Vec2(closeItem->getContentSize() / 2)); + + // create menu, it's an autorelease object + auto menu = Menu::create(closeItem, nullptr); + menu->setPosition(Vec2::ZERO); + this->addChild(menu, 1); + + ///////////////////////////// + // 3. add your codes below... + + // add a label shows "Hello World" + // create and initialize a label + + auto label = Label::createWithTTF("Hello World", "fonts/arial.ttf", TITLE_FONT_SIZE); + + // position the label on the center of the screen label->setPosition(origin.x + visibleSize.width/2, origin.y + visibleSize.height - label->getContentSize().height); -// // add the label as a child to this layer + // add the label as a child to this layer this->addChild(label, 1); - label->runAction(MoveTo::create(10, Vec2(100, 100))); -// -// // add "HelloWorld" splash screen" -// SpriteFrameCache::getInstance()->addSpriteFramesWithFile("bugs/circle.plist"); -// auto sprite = Sprite::createWithSpriteFrameName("circle.png"); + + // add "HelloWorld" splash screen" auto sprite = Sprite::create("HelloWorld.png"); // position the sprite on the center of the screen @@ -90,22 +86,13 @@ bool HelloWorld::init() // add the sprite as a child to this layer this->addChild(sprite); - - auto s = Director::getInstance()->getWinSize(); - Size boxSize(100.0f, 100.0f); - auto box = LayerColor::create(Color4B(255,255,0,255)); - box->setAnchorPoint(Vec2(0.5f,0.5f)); - box->setContentSize( boxSize ); - box->setIgnoreAnchorPointForPosition(false); - box->setPosition(s.width/2, s.height - 100 - box->getContentSize().height/2); - this->addChild(box, 1); -// auto drawNode = DrawNode::create(); -// drawNode->setPosition(Vec2(0, 0)); -// addChild(drawNode); -// -// Rect safeArea = Director::getInstance()->getSafeAreaRect(); -// drawNode->drawRect(safeArea.origin, safeArea.origin + safeArea.size, Color4F::BLUE); + auto drawNode = DrawNode::create(); + drawNode->setPosition(Vec2(0, 0)); + addChild(drawNode); + + Rect safeArea = Director::getInstance()->getSafeAreaRect(); + drawNode->drawRect(safeArea.origin, safeArea.origin + safeArea.size, Color4F::BLUE); return true; } From 2f79eb10af5a4c702b3c196c7af0f780ec10691c Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 29 Oct 2019 11:35:22 +0800 Subject: [PATCH 64/96] fix installation error on some Android devices May meet "The application could not be installed: INSTALL_FAILED_TEST_ONLY" error on some devices. --- templates/cpp-template-default/proj.android/gradle.properties | 4 +++- .../frameworks/runtime-src/proj.android/gradle.properties | 4 +++- tests/cpp-empty-test/proj.android/gradle.properties | 2 ++ tests/cpp-tests/proj.android/gradle.properties | 4 +++- tests/lua-empty-test/project/proj.android/gradle.properties | 4 +++- tests/lua-tests/project/proj.android/gradle.properties | 4 +++- tests/performance-tests/proj.android/gradle.properties | 4 +++- 7 files changed, 20 insertions(+), 6 deletions(-) diff --git a/templates/cpp-template-default/proj.android/gradle.properties b/templates/cpp-template-default/proj.android/gradle.properties index 83d8774574..ebbe920606 100644 --- a/templates/cpp-template-default/proj.android/gradle.properties +++ b/templates/cpp-template-default/proj.android/gradle.properties @@ -37,4 +37,6 @@ PROP_APP_ABI=armeabi-v7a #RELEASE_STORE_FILE=file path of keystore #RELEASE_STORE_PASSWORD=password of keystore #RELEASE_KEY_ALIAS=alias of key -#RELEASE_KEY_PASSWORD=password of key \ No newline at end of file +#RELEASE_KEY_PASSWORD=password of key + +android.injected.testOnly=false diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.android/gradle.properties b/templates/lua-template-default/frameworks/runtime-src/proj.android/gradle.properties index 83d8774574..df277e6673 100644 --- a/templates/lua-template-default/frameworks/runtime-src/proj.android/gradle.properties +++ b/templates/lua-template-default/frameworks/runtime-src/proj.android/gradle.properties @@ -37,4 +37,6 @@ PROP_APP_ABI=armeabi-v7a #RELEASE_STORE_FILE=file path of keystore #RELEASE_STORE_PASSWORD=password of keystore #RELEASE_KEY_ALIAS=alias of key -#RELEASE_KEY_PASSWORD=password of key \ No newline at end of file +#RELEASE_KEY_PASSWORD=password of key + +android.injected.testOnly=false \ No newline at end of file diff --git a/tests/cpp-empty-test/proj.android/gradle.properties b/tests/cpp-empty-test/proj.android/gradle.properties index 96483e2186..ebbe920606 100644 --- a/tests/cpp-empty-test/proj.android/gradle.properties +++ b/tests/cpp-empty-test/proj.android/gradle.properties @@ -38,3 +38,5 @@ PROP_APP_ABI=armeabi-v7a #RELEASE_STORE_PASSWORD=password of keystore #RELEASE_KEY_ALIAS=alias of key #RELEASE_KEY_PASSWORD=password of key + +android.injected.testOnly=false diff --git a/tests/cpp-tests/proj.android/gradle.properties b/tests/cpp-tests/proj.android/gradle.properties index 83d8774574..ebbe920606 100644 --- a/tests/cpp-tests/proj.android/gradle.properties +++ b/tests/cpp-tests/proj.android/gradle.properties @@ -37,4 +37,6 @@ PROP_APP_ABI=armeabi-v7a #RELEASE_STORE_FILE=file path of keystore #RELEASE_STORE_PASSWORD=password of keystore #RELEASE_KEY_ALIAS=alias of key -#RELEASE_KEY_PASSWORD=password of key \ No newline at end of file +#RELEASE_KEY_PASSWORD=password of key + +android.injected.testOnly=false diff --git a/tests/lua-empty-test/project/proj.android/gradle.properties b/tests/lua-empty-test/project/proj.android/gradle.properties index 83d8774574..df277e6673 100644 --- a/tests/lua-empty-test/project/proj.android/gradle.properties +++ b/tests/lua-empty-test/project/proj.android/gradle.properties @@ -37,4 +37,6 @@ PROP_APP_ABI=armeabi-v7a #RELEASE_STORE_FILE=file path of keystore #RELEASE_STORE_PASSWORD=password of keystore #RELEASE_KEY_ALIAS=alias of key -#RELEASE_KEY_PASSWORD=password of key \ No newline at end of file +#RELEASE_KEY_PASSWORD=password of key + +android.injected.testOnly=false \ No newline at end of file diff --git a/tests/lua-tests/project/proj.android/gradle.properties b/tests/lua-tests/project/proj.android/gradle.properties index 83d8774574..ebbe920606 100644 --- a/tests/lua-tests/project/proj.android/gradle.properties +++ b/tests/lua-tests/project/proj.android/gradle.properties @@ -37,4 +37,6 @@ PROP_APP_ABI=armeabi-v7a #RELEASE_STORE_FILE=file path of keystore #RELEASE_STORE_PASSWORD=password of keystore #RELEASE_KEY_ALIAS=alias of key -#RELEASE_KEY_PASSWORD=password of key \ No newline at end of file +#RELEASE_KEY_PASSWORD=password of key + +android.injected.testOnly=false diff --git a/tests/performance-tests/proj.android/gradle.properties b/tests/performance-tests/proj.android/gradle.properties index 37661c012e..24ed69788b 100644 --- a/tests/performance-tests/proj.android/gradle.properties +++ b/tests/performance-tests/proj.android/gradle.properties @@ -42,4 +42,6 @@ PROP_BUILD_TYPE=cmake #RELEASE_STORE_FILE=file path of keystore #RELEASE_STORE_PASSWORD=password of keystore #RELEASE_KEY_ALIAS=alias of key -#RELEASE_KEY_PASSWORD=password of key \ No newline at end of file +#RELEASE_KEY_PASSWORD=password of key + +android.injected.testOnly=false From d77cd8f3b1d92bf1c6575566440b9816fbea4336 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Tue, 29 Oct 2019 14:19:16 +0800 Subject: [PATCH 65/96] fix experimental namespace --- tests/lua-empty-test/src/hello.lua | 8 ++++---- tests/lua-tests/src/ComponentTest/main.lua | 4 ++-- tests/lua-tests/src/ComponentTest/player.lua | 2 +- tests/lua-tests/src/ComponentTest/scene.lua | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/lua-empty-test/src/hello.lua b/tests/lua-empty-test/src/hello.lua index de9fa8f3da..b4075c8186 100644 --- a/tests/lua-empty-test/src/hello.lua +++ b/tests/lua-empty-test/src/hello.lua @@ -172,14 +172,14 @@ local function main() local function menuCallbackClosePopup() -- stop test sound effect - ccexp.AudioEngine:stop(effectID) + cc.AudioEngine:stop(effectID) menuPopup:setVisible(false) end local function menuCallbackOpenPopup() -- loop test sound effect local effectPath = cc.FileUtils:getInstance():fullPathForFilename("effect1.wav") - effectID = ccexp.AudioEngine:play2d(effectPath) + effectID = cc.AudioEngine:play2d(effectPath) menuPopup:setVisible(true) end @@ -207,9 +207,9 @@ local function main() -- play background music, preload effect local bgMusicPath = cc.FileUtils:getInstance():fullPathForFilename("background.mp3") - ccexp.AudioEngine:play2d(bgMusicPath, true) + cc.AudioEngine:play2d(bgMusicPath, true) local effectPath = cc.FileUtils:getInstance():fullPathForFilename("effect1.wav") - ccexp.AudioEngine:preload(effectPath) + cc.AudioEngine:preload(effectPath) -- run local sceneGame = cc.Scene:create() diff --git a/tests/lua-tests/src/ComponentTest/main.lua b/tests/lua-tests/src/ComponentTest/main.lua index 69d59c252f..510c06af8b 100644 --- a/tests/lua-tests/src/ComponentTest/main.lua +++ b/tests/lua-tests/src/ComponentTest/main.lua @@ -22,7 +22,7 @@ local function ComponentTestLayer() layer:addChild(player); local function onEvent(event) - ccexp.AudioEngine:stopAll() + cc.AudioEngine:stopAll() local scene = cc.Scene:create() scene:addChild(ComponentTestLayer()) @@ -32,7 +32,7 @@ local function ComponentTestLayer() local function onNodeEvent(event) if "exit" == event then - ccexp.AudioEngine:stopAll() + cc.AudioEngine:stopAll() end end diff --git a/tests/lua-tests/src/ComponentTest/player.lua b/tests/lua-tests/src/ComponentTest/player.lua index 2a72c2bcd0..7955b48ef7 100644 --- a/tests/lua-tests/src/ComponentTest/player.lua +++ b/tests/lua-tests/src/ComponentTest/player.lua @@ -40,7 +40,7 @@ local player = { local function onTouchesEnded(touches, event) local location = touches[1]:getLocation() self:generateProjectile(location.x, location.y) - ccexp.AudioEngine:play2d("pew-pew-lei.wav") + cc.AudioEngine:play2d("pew-pew-lei.wav") end local listener = cc.EventListenerTouchAllAtOnce:create() diff --git a/tests/lua-tests/src/ComponentTest/scene.lua b/tests/lua-tests/src/ComponentTest/scene.lua index 87c8e3f806..35f98cbf44 100644 --- a/tests/lua-tests/src/ComponentTest/scene.lua +++ b/tests/lua-tests/src/ComponentTest/scene.lua @@ -10,7 +10,7 @@ local scene = { enemies = {}, onEnter = function(self) - ccexp.AudioEngine:play2d("background-music-aac.mp3", true) + cc.AudioEngine:play2d("background-music-aac.mp3", true) end, update = function(self, dt) From 4f486528cc9d43ad37f808adc070d81d1c8792aa Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Tue, 29 Oct 2019 19:24:35 +0800 Subject: [PATCH 66/96] fix walking boundary of 3D test in lua --- .../manual/3d/lua_cocos2dx_3d_manual.cpp | 62 +++++++++++++++++++ .../src/Camera3DTest/Camera3DTest.lua | 5 ++ .../lua-tests/src/Scene3DTest/Scene3DTest.lua | 33 +++------- 3 files changed, 74 insertions(+), 26 deletions(-) diff --git a/cocos/scripting/lua-bindings/manual/3d/lua_cocos2dx_3d_manual.cpp b/cocos/scripting/lua-bindings/manual/3d/lua_cocos2dx_3d_manual.cpp index b73eee4ea3..bdee328444 100644 --- a/cocos/scripting/lua-bindings/manual/3d/lua_cocos2dx_3d_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/3d/lua_cocos2dx_3d_manual.cpp @@ -468,6 +468,67 @@ tolua_lerror: return 0; } +int lua_cocos2dx_3d_Terrain_getIntersectionPoint(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Terrain* cobj = nullptr; + bool ok = true; +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S, 1, "cc.Terrain", 0, &tolua_err)) goto tolua_lerror; +#endif + cobj = (cocos2d::Terrain*)tolua_tousertype(tolua_S, 1, 0); +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S, "invalid 'cobj' in function 'lua_cocos2dx_3d_Terrain_getIntersectionPoint'", nullptr); + return 0; + } +#endif + argc = lua_gettop(tolua_S) - 1; + do { + if (argc == 2) { + cocos2d::Ray* arg0 = nullptr; + ok &= luaval_to_object(tolua_S, 2, "cc.Ray", &arg0, "cc.Terrain:getIntersectionPoint"); + + if (!ok) { break; } + cocos2d::Vec3 arg1; + ok &= luaval_to_vec3(tolua_S, 3, &arg1, "cc.Terrain:getIntersectionPoint"); + + if (!ok) { break; } + bool ret = cobj->getIntersectionPoint(*arg0, arg1); + tolua_pushboolean(tolua_S, (bool)ret); + vec3_to_luaval(tolua_S, arg1); + return 2; + } + } while (0); + ok = true; + do { + if (argc == 1) { + cocos2d::Ray* arg0; + ok &= luaval_to_object(tolua_S, 2, "cc.Ray", &arg0, "cc.Terrain:getIntersectionPoint"); + + if (!ok) { break; } + cocos2d::Vec3 ret = cobj->getIntersectionPoint(*arg0); + vec3_to_luaval(tolua_S, ret); + return 1; + } + } while (0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Terrain:getIntersectionPoint", argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S, "#ferror in function 'lua_cocos2dx_3d_Terrain_getIntersectionPoint'.", &tolua_err); +#endif + + return 0; +} + static void extendTerrain(lua_State* L) { lua_pushstring(L, "cc.Terrain"); @@ -476,6 +537,7 @@ static void extendTerrain(lua_State* L) { tolua_function(L, "create", lua_cocos2dx_3d_Terrain_create); tolua_function(L, "getHeight", lua_cocos2dx_3d_Terrain_getHeight); + tolua_function(L, "getIntersectionPoint", lua_cocos2dx_3d_Terrain_getIntersectionPoint); } lua_pop(L, 1); } diff --git a/tests/lua-tests/src/Camera3DTest/Camera3DTest.lua b/tests/lua-tests/src/Camera3DTest/Camera3DTest.lua index 9a304c195b..3a493f32a0 100644 --- a/tests/lua-tests/src/Camera3DTest/Camera3DTest.lua +++ b/tests/lua-tests/src/Camera3DTest/Camera3DTest.lua @@ -236,6 +236,11 @@ function Camera3DTestDemo:onEnter() local ndo = nearP.x * 0 + nearP.y * 1 + nearP.z * 0 dist= (0 - ndo) / ndd local p = cc.vec3add(nearP, cc.vec3mul(dir, dist)) + + if p.x > 100 then p.x = 100 end + if p.x < -100 then p.x = -100 end + if p.z > 100 then p.z = 100 end + if p.z < -100 then p.z = -100 end self._targetPos = p end end diff --git a/tests/lua-tests/src/Scene3DTest/Scene3DTest.lua b/tests/lua-tests/src/Scene3DTest/Scene3DTest.lua index 02259a63a0..d29a295d61 100644 --- a/tests/lua-tests/src/Scene3DTest/Scene3DTest.lua +++ b/tests/lua-tests/src/Scene3DTest/Scene3DTest.lua @@ -181,34 +181,16 @@ function TerrainWalkThru:init() local dir = cc.vec3sub(farP, nearP) dir = cc.vec3normalize(dir) - local rayStep = cc.vec3mul(dir, 15) - local rayPos = nearP - local rayStartPosition = nearP - local lastRayPosition = rayPos - rayPos = cc.vec3add(rayPos, rayStep) - -- Linear search - Loop until find a point inside and outside the terrain Vector3 - local height = self._terrain:getHeight(rayPos.x, rayPos.z) + local collisionPoint = cc.vec3(-999,-999,-999) + local ray = cc.Ray:new(nearP, dir) + local isInTerrain = true; + isInTerrain, collisionPoint = self._terrain:getIntersectionPoint(ray, collisionPoint) - while rayPos.y > height do - lastRayPosition = rayPos - rayPos = cc.vec3add(rayPos, rayStep) - height = self._terrain:getHeight(rayPos.x,rayPos.z) + if( not isInTerrain) then + self._player:idle() + return end - local startPosition = lastRayPosition - local endPosition = rayPos - - for i = 1, 32 do - -- Binary search pass - local middlePoint = cc.vec3mul(cc.vec3add(startPosition, endPosition), 0.5) - if (middlePoint.y < height) then - endPosition = middlePoint - else - startPosition = middlePoint - end - end - - local collisionPoint = cc.vec3mul(cc.vec3add(startPosition, endPosition), 0.5) local playerPos = self._player:getPosition3D() dir = cc.vec3sub(collisionPoint, playerPos) dir.y = 0 @@ -217,7 +199,6 @@ function TerrainWalkThru:init() self._player._headingAxis = vec3_cross(dir, cc.vec3(0, 0, -1), self._player._headingAxis) self._player._targetPos = collisionPoint - -- self._player:forward() self._player._playerState = PLAER_STATE.FORWARD end end From d35a1dee458eaddc0e782fd041376fc373b9a0df Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Wed, 30 Oct 2019 13:55:52 +0800 Subject: [PATCH 67/96] fix crash due to iOS13 UIWindowScene --- cocos/platform/ios/CCDevice-ios.mm | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/cocos/platform/ios/CCDevice-ios.mm b/cocos/platform/ios/CCDevice-ios.mm index 26b494b392..5c56ba3e74 100644 --- a/cocos/platform/ios/CCDevice-ios.mm +++ b/cocos/platform/ios/CCDevice-ios.mm @@ -246,24 +246,34 @@ static CCAccelerometerDispatcher* s_pAccelerometerDispatcher; _acceleration->timestamp = accelerometerData.timestamp; double tmp = _acceleration->x; - - switch ([[[UIApplication sharedApplication].windows[0] windowScene] interfaceOrientation]) + UIInterfaceOrientation orientation; + if (@available(iOS 13.0, *)) + { + orientation = [[[UIApplication sharedApplication].windows[0] windowScene] interfaceOrientation]; + } + else + { + // Fallback on earlier versions + orientation = [[UIApplication sharedApplication] statusBarOrientation]; + } + + switch (orientation) { case UIInterfaceOrientationLandscapeRight: _acceleration->x = -_acceleration->y; _acceleration->y = tmp; break; - + case UIInterfaceOrientationLandscapeLeft: _acceleration->x = _acceleration->y; _acceleration->y = -tmp; break; - + case UIInterfaceOrientationPortraitUpsideDown: _acceleration->x = -_acceleration->y; _acceleration->y = -tmp; break; - + case UIInterfaceOrientationPortrait: break; default: From d41457d44705954d25cc4613e5527ff5665c1bb8 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Wed, 30 Oct 2019 16:25:08 +0800 Subject: [PATCH 68/96] comment spine codes in lua (#20272) --- .../lua-tests/src/Scene3DTest/Scene3DTest.lua | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/tests/lua-tests/src/Scene3DTest/Scene3DTest.lua b/tests/lua-tests/src/Scene3DTest/Scene3DTest.lua index d29a295d61..2dbe46e6dc 100644 --- a/tests/lua-tests/src/Scene3DTest/Scene3DTest.lua +++ b/tests/lua-tests/src/Scene3DTest/Scene3DTest.lua @@ -473,26 +473,26 @@ function Scene3DTest:createDetailDlg() self._detailDlg:addChild(title) -- add a spine ffd animation on it - -- TODO: spine is not enable in V4.0 - local skeletonNode = sp.SkeletonAnimation:create("spine/goblins-pro.json", "spine/goblins.atlas", 1.5) - skeletonNode:setAnimation(0, "walk", true) - skeletonNode:setSkin("goblin") - - skeletonNode:setScale(0.25) - local windowSize = cc.Director:getInstance():getWinSize() - skeletonNode:setPosition(cc.p(dlgSize.width / 2, 20)) - self._detailDlg:addChild(skeletonNode) + -- TODO coulsonwang: spine is not enable in V4.0 +-- local skeletonNode = sp.SkeletonAnimation:create("spine/goblins-pro.json", "spine/goblins.atlas", 1.5) +-- skeletonNode:setAnimation(0, "walk", true) +-- skeletonNode:setSkin("goblin") +-- +-- skeletonNode:setScale(0.25) +-- local windowSize = cc.Director:getInstance():getWinSize() +-- skeletonNode:setPosition(cc.p(dlgSize.width / 2, 20)) +-- self._detailDlg:addChild(skeletonNode) local listener = cc.EventListenerTouchOneByOne:create() listener:registerScriptHandler(function (touch, event) - if (not skeletonNode:getDebugBonesEnabled()) then - skeletonNode:setDebugBonesEnabled(true) - elseif skeletonNode:getTimeScale() == 1 then - skeletonNode:setTimeScale(0.3) - else - skeletonNode:setTimeScale(1) - skeletonNode:setDebugBonesEnabled(false) - end +-- if (not skeletonNode:getDebugBonesEnabled()) then +-- skeletonNode:setDebugBonesEnabled(true) +-- elseif skeletonNode:getTimeScale() == 1 then +-- skeletonNode:setTimeScale(0.3) +-- else +-- skeletonNode:setTimeScale(1) +-- skeletonNode:setDebugBonesEnabled(false) +-- end return true end,cc.Handler.EVENT_TOUCH_BEGAN ) From 251eaa203380d41c321a365616d205a80b8f844b Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Wed, 30 Oct 2019 17:43:07 +0800 Subject: [PATCH 69/96] fix crash due to iOS13 UIWindowScene (#20271) --- cocos/platform/ios/CCInputView-ios.mm | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cocos/platform/ios/CCInputView-ios.mm b/cocos/platform/ios/CCInputView-ios.mm index eae5631738..68a50ccf2a 100644 --- a/cocos/platform/ios/CCInputView-ios.mm +++ b/cocos/platform/ios/CCInputView-ios.mm @@ -249,7 +249,17 @@ namespace { CGSize viewSize = self.frame.size; CGFloat tmp; - switch (getFixedOrientation([[[UIApplication sharedApplication].windows[0] windowScene] interfaceOrientation])) + UIInterfaceOrientation orientation; + if (@available(iOS 13.0, *)) + { + orientation = [[[UIApplication sharedApplication].windows[0] windowScene] interfaceOrientation]; + } + else + { + // Fallback on earlier versions + orientation = [[UIApplication sharedApplication] statusBarOrientation]; + } + switch(orientation) { case UIInterfaceOrientationPortrait: begin.origin.y = viewSize.height - begin.origin.y - begin.size.height; From dddcdf3a8730714c5152f57be95c167f62242428 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 31 Oct 2019 10:58:35 +0800 Subject: [PATCH 70/96] Fixes so that in the web view we are able to navigate different links correctly (#20266) (#20275) --- cocos/ui/UIWebView/UIWebViewImpl-ios.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/ui/UIWebView/UIWebViewImpl-ios.mm b/cocos/ui/UIWebView/UIWebViewImpl-ios.mm index a9a7600ba2..2335e113fb 100644 --- a/cocos/ui/UIWebView/UIWebViewImpl-ios.mm +++ b/cocos/ui/UIWebView/UIWebViewImpl-ios.mm @@ -244,7 +244,7 @@ #pragma mark - WKNavigationDelegate - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { - NSString *url = [webView.URL absoluteString]; + NSString *url = [[[navigationAction request] URL] absoluteString]; if ([[webView.URL scheme] isEqualToString:self.jsScheme]) { self.onJsCallback([url UTF8String]); decisionHandler(WKNavigationActionPolicyCancel); From 4914dfff1036af0a56eb952b46ee52804def9311 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Thu, 31 Oct 2019 16:05:57 +0800 Subject: [PATCH 71/96] fix AudioSwitchStateTest subtile (#20278) --- .../cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp b/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp index a0e58da2aa..a2b3254da7 100644 --- a/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp +++ b/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp @@ -869,7 +869,7 @@ std::string AudioSwitchStateTest::title() const std::string AudioSwitchStateTest::subtitle() const { - return "Should not crash"; + return "Should not crash. No sound is ok"; } ///////////////////////////////////////////////////////////////////////// From 29e50a8631568de913bc7c5710fec8fad3aca458 Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 1 Nov 2019 09:22:38 +0800 Subject: [PATCH 72/96] remove extern "C" from base/base64.h for avoiding base64 function symbols conflict at linking libraries. (#20276) (#20280) --- cocos/base/base64.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/cocos/base/base64.h b/cocos/base/base64.h index 419b6d47b0..abd3369138 100644 --- a/cocos/base/base64.h +++ b/cocos/base/base64.h @@ -29,10 +29,6 @@ THE SOFTWARE. /// @cond DO_NOT_SHOW #include "platform/CCPlatformMacros.h" - -#ifdef __cplusplus -extern "C" { -#endif namespace cocos2d { @@ -62,9 +58,6 @@ int CC_DLL base64Encode(const unsigned char *in, unsigned int inLength, char **o }//namespace cocos2d -#ifdef __cplusplus -} -#endif /// @endcond #endif // __SUPPORT_BASE64_H__ From b852fc33554e1ed43174b96d297b3a5c0b8c3806 Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 1 Nov 2019 12:02:48 +0800 Subject: [PATCH 73/96] Revert "don't compile codes for binding generator if it is a pull request (#20237)" (#20283) This reverts commit c2c6aa4268a2ebce77e681be2beba35a8c2c127e. --- tools/travis-scripts/run-script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/travis-scripts/run-script.sh b/tools/travis-scripts/run-script.sh index 3f0550c19c..6bf333c665 100755 --- a/tools/travis-scripts/run-script.sh +++ b/tools/travis-scripts/run-script.sh @@ -279,7 +279,7 @@ function run_after_merge() } # build pull request -if [ "$TRAVIS_PULL_REQUEST" != "false" ] && [ x$GEN_BINDING_AND_COCOSFILE != x"true" ]; then +if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then run_pull_request fi From 8126cfafd5487e7cb5c597a0a5017b5483846205 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Fri, 1 Nov 2019 17:07:52 +0800 Subject: [PATCH 74/96] add defualt ios deloyment target (#20282) * add defualt ios deloyment target --- cocos/CMakeLists.txt | 6 ++++++ templates/cpp-template-default/CMakeLists.txt | 3 +++ templates/lua-template-default/CMakeLists.txt | 3 +++ tests/cpp-empty-test/CMakeLists.txt | 3 +++ tests/cpp-tests/CMakeLists.txt | 3 +++ tests/lua-empty-test/project/CMakeLists.txt | 3 +++ tests/lua-tests/project/CMakeLists.txt | 3 +++ 7 files changed, 24 insertions(+) diff --git a/cocos/CMakeLists.txt b/cocos/CMakeLists.txt index 50349bfbd0..f0e83af990 100644 --- a/cocos/CMakeLists.txt +++ b/cocos/CMakeLists.txt @@ -153,6 +153,12 @@ if(WINDOWS) set_source_files_properties(${COCOS_SPINE_SRC} base/ccFPSImages.c PROPERTIES LANGUAGE CXX) endif() +if(XCODE) + if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) + set_xcode_property(cocos2d IPHONEOS_DEPLOYMENT_TARGET "8.0") + endif() +endif() + #if(XCODE) # # Later versions of Xcode clang want to compile C++17 with aligned allocation turned on and this is only supported on iOS 11.0+ # # TODO: Only turn this off if ${CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET} < 11.0 diff --git a/templates/cpp-template-default/CMakeLists.txt b/templates/cpp-template-default/CMakeLists.txt index a694ef80fe..312a719fd9 100644 --- a/templates/cpp-template-default/CMakeLists.txt +++ b/templates/cpp-template-default/CMakeLists.txt @@ -139,6 +139,9 @@ if(APPLE) elseif(IOS) set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios_mac/ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon") + if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) + set_xcode_property(${APP_NAME} IPHONEOS_DEPLOYMENT_TARGET "8.0") + endif() endif() # For code-signing, set the DEVELOPMENT_TEAM: diff --git a/templates/lua-template-default/CMakeLists.txt b/templates/lua-template-default/CMakeLists.txt index a5c669fab1..cbd8910c85 100644 --- a/templates/lua-template-default/CMakeLists.txt +++ b/templates/lua-template-default/CMakeLists.txt @@ -131,6 +131,9 @@ if(APPLE) set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon") set_xcode_property(${APP_NAME} DEVELOPMENT_TEAM "") set_xcode_property(${APP_NAME} CODE_SIGN_IDENTITY "iPhone Developer") + if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) + set_xcode_property(${APP_NAME} IPHONEOS_DEPLOYMENT_TARGET "8.0") + endif() endif() elseif(WINDOWS) cocos_copy_target_dll(${APP_NAME}) diff --git a/tests/cpp-empty-test/CMakeLists.txt b/tests/cpp-empty-test/CMakeLists.txt index ca691c764e..cba97253ad 100644 --- a/tests/cpp-empty-test/CMakeLists.txt +++ b/tests/cpp-empty-test/CMakeLists.txt @@ -132,6 +132,9 @@ if(XCODE) elseif(IOS) set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon-${APP_NAME}") + if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) + set_xcode_property(${APP_NAME} IPHONEOS_DEPLOYMENT_TARGET "8.0") + endif() endif() # For code-signing, set the DEVELOPMENT_TEAM: diff --git a/tests/cpp-tests/CMakeLists.txt b/tests/cpp-tests/CMakeLists.txt index 28e33d2db9..6aef4dbf4b 100644 --- a/tests/cpp-tests/CMakeLists.txt +++ b/tests/cpp-tests/CMakeLists.txt @@ -403,6 +403,9 @@ if(APPLE) elseif(IOS) set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon-${APP_NAME}") + if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) + set_xcode_property(${APP_NAME} IPHONEOS_DEPLOYMENT_TARGET "8.0") + endif() endif() # For code-signing, set the DEVELOPMENT_TEAM: diff --git a/tests/lua-empty-test/project/CMakeLists.txt b/tests/lua-empty-test/project/CMakeLists.txt index 4aaa2d4eac..202fe0d143 100644 --- a/tests/lua-empty-test/project/CMakeLists.txt +++ b/tests/lua-empty-test/project/CMakeLists.txt @@ -105,6 +105,9 @@ if(APPLE) elseif(IOS) set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon-${APP_NAME}") + if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) + set_xcode_property(${APP_NAME} IPHONEOS_DEPLOYMENT_TARGET "8.0") + endif() endif() # For code-signing, set the DEVELOPMENT_TEAM: diff --git a/tests/lua-tests/project/CMakeLists.txt b/tests/lua-tests/project/CMakeLists.txt index 5becda024a..93bcd99285 100644 --- a/tests/lua-tests/project/CMakeLists.txt +++ b/tests/lua-tests/project/CMakeLists.txt @@ -118,6 +118,9 @@ if(APPLE) elseif(IOS) set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios_mac/ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon-${APP_NAME}") + if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) + set_xcode_property(${APP_NAME} IPHONEOS_DEPLOYMENT_TARGET "8.0") + endif() endif() # For code-signing, set the DEVELOPMENT_TEAM: From 29e03729de7cf50b85e213b5846592fd00940548 Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 5 Nov 2019 10:19:27 +0800 Subject: [PATCH 75/96] fix issue that can not run release mode with lua projects (#20291) It is because luajit has 32bit version, and ubuntu does not support 32bit application by default. --- install-deps-linux.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/install-deps-linux.sh b/install-deps-linux.sh index cf6bab4dae..1de5606128 100755 --- a/install-deps-linux.sh +++ b/install-deps-linux.sh @@ -11,13 +11,19 @@ fi sudo apt-get update -DEPENDS='libx11-dev' +# run 32bit applicatio: needed for lua relase mode as luajit has 32bit version +# https://askubuntu.com/questions/454253/how-to-run-32-bit-app-in-ubuntu-64-bit +sudo dpkg --add-architecture i386 +DEPENDS='libc6:i386 libncurses5:i386 libstdc++6:i386' + + +DEPENDS+=' libx11-dev' DEPENDS+=' libxmu-dev' DEPENDS+=' libglu1-mesa-dev' DEPENDS+=' libgl2ps-dev' DEPENDS+=' libxi-dev' DEPENDS+=' libzip-dev' -DEPENDS+=' libpng12-dev' +DEPENDS+=' libpng-dev' DEPENDS+=' libcurl4-gnutls-dev' DEPENDS+=' libfontconfig1-dev' DEPENDS+=' libsqlite3-dev' From f52df598e6a3f572a6d7e6a9e25c45ddcd6b2bff Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 5 Nov 2019 15:23:09 +0800 Subject: [PATCH 76/96] update cocos console (#20293) --- tools/cocos2d-console | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cocos2d-console b/tools/cocos2d-console index abcbd5439c..707bc5c28a 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit abcbd5439c778106226906f62d8e1a7bc8bf6715 +Subproject commit 707bc5c28a0bda926612421ed636501c10c60319 From 5acc952a17387079a6b23b04fa33ebd6e644e9dc Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 5 Nov 2019 15:23:54 +0800 Subject: [PATCH 77/96] fix iOS build issue (#20292) --- cmake/Modules/CocosBuildHelpers.cmake | 1 - cocos/CMakeLists.txt | 6 ------ templates/cpp-template-default/CMakeLists.txt | 9 ++++++--- templates/lua-template-default/CMakeLists.txt | 9 ++++++--- tests/cpp-empty-test/CMakeLists.txt | 9 ++++++--- tests/cpp-tests/CMakeLists.txt | 9 ++++++--- tests/lua-empty-test/project/CMakeLists.txt | 9 ++++++--- tests/lua-tests/project/CMakeLists.txt | 9 ++++++--- 8 files changed, 36 insertions(+), 25 deletions(-) diff --git a/cmake/Modules/CocosBuildHelpers.cmake b/cmake/Modules/CocosBuildHelpers.cmake index 01d6b4adbd..f512262d65 100644 --- a/cmake/Modules/CocosBuildHelpers.cmake +++ b/cmake/Modules/CocosBuildHelpers.cmake @@ -325,4 +325,3 @@ function(cocos_use_pkg target pkg) endif() endfunction() - diff --git a/cocos/CMakeLists.txt b/cocos/CMakeLists.txt index f0e83af990..50349bfbd0 100644 --- a/cocos/CMakeLists.txt +++ b/cocos/CMakeLists.txt @@ -153,12 +153,6 @@ if(WINDOWS) set_source_files_properties(${COCOS_SPINE_SRC} base/ccFPSImages.c PROPERTIES LANGUAGE CXX) endif() -if(XCODE) - if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) - set_xcode_property(cocos2d IPHONEOS_DEPLOYMENT_TARGET "8.0") - endif() -endif() - #if(XCODE) # # Later versions of Xcode clang want to compile C++17 with aligned allocation turned on and this is only supported on iOS 11.0+ # # TODO: Only turn this off if ${CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET} < 11.0 diff --git a/templates/cpp-template-default/CMakeLists.txt b/templates/cpp-template-default/CMakeLists.txt index 312a719fd9..e842335e8f 100644 --- a/templates/cpp-template-default/CMakeLists.txt +++ b/templates/cpp-template-default/CMakeLists.txt @@ -27,6 +27,12 @@ cmake_minimum_required(VERSION 3.6) set(APP_NAME HelloCpp) +if(XCODE) + if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) + SET (CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 8.0) + endif() +endif() + project(${APP_NAME}) if(NOT DEFINED BUILD_ENGINE_DONE) # to test HelloCpp into root project @@ -139,9 +145,6 @@ if(APPLE) elseif(IOS) set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios_mac/ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon") - if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) - set_xcode_property(${APP_NAME} IPHONEOS_DEPLOYMENT_TARGET "8.0") - endif() endif() # For code-signing, set the DEVELOPMENT_TEAM: diff --git a/templates/lua-template-default/CMakeLists.txt b/templates/lua-template-default/CMakeLists.txt index cbd8910c85..a972b6582d 100644 --- a/templates/lua-template-default/CMakeLists.txt +++ b/templates/lua-template-default/CMakeLists.txt @@ -27,6 +27,12 @@ set(APP_NAME HelloLua) project(${APP_NAME}) +if(XCODE) + if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) + SET (CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 8.0) + endif() +endif() + set(RUNTIME_SRC_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/frameworks/runtime-src) set(COCOS2DX_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/frameworks/cocos2d-x) set(CMAKE_MODULE_PATH ${COCOS2DX_ROOT_PATH}/cmake/Modules/) @@ -131,9 +137,6 @@ if(APPLE) set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon") set_xcode_property(${APP_NAME} DEVELOPMENT_TEAM "") set_xcode_property(${APP_NAME} CODE_SIGN_IDENTITY "iPhone Developer") - if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) - set_xcode_property(${APP_NAME} IPHONEOS_DEPLOYMENT_TARGET "8.0") - endif() endif() elseif(WINDOWS) cocos_copy_target_dll(${APP_NAME}) diff --git a/tests/cpp-empty-test/CMakeLists.txt b/tests/cpp-empty-test/CMakeLists.txt index cba97253ad..2628028508 100644 --- a/tests/cpp-empty-test/CMakeLists.txt +++ b/tests/cpp-empty-test/CMakeLists.txt @@ -27,6 +27,12 @@ set(APP_NAME cpp-empty-test) project(${APP_NAME}) +if(XCODE) + if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) + SET (CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 8.0) + endif() +endif() + if(NOT DEFINED BUILD_ENGINE_DONE) set(COCOS2DX_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../..) set(CMAKE_MODULE_PATH ${COCOS2DX_ROOT_PATH}/cmake/Modules/) @@ -132,9 +138,6 @@ if(XCODE) elseif(IOS) set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon-${APP_NAME}") - if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) - set_xcode_property(${APP_NAME} IPHONEOS_DEPLOYMENT_TARGET "8.0") - endif() endif() # For code-signing, set the DEVELOPMENT_TEAM: diff --git a/tests/cpp-tests/CMakeLists.txt b/tests/cpp-tests/CMakeLists.txt index 6aef4dbf4b..f3aeda703e 100644 --- a/tests/cpp-tests/CMakeLists.txt +++ b/tests/cpp-tests/CMakeLists.txt @@ -4,6 +4,12 @@ set(APP_NAME cpp-tests) project(${APP_NAME}) +if(XCODE) + if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) + SET (CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 8.0) + endif() +endif() + if(NOT DEFINED BUILD_ENGINE_DONE) set(COCOS2DX_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../..) set(CMAKE_MODULE_PATH ${COCOS2DX_ROOT_PATH}/cmake/Modules/) @@ -403,9 +409,6 @@ if(APPLE) elseif(IOS) set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon-${APP_NAME}") - if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) - set_xcode_property(${APP_NAME} IPHONEOS_DEPLOYMENT_TARGET "8.0") - endif() endif() # For code-signing, set the DEVELOPMENT_TEAM: diff --git a/tests/lua-empty-test/project/CMakeLists.txt b/tests/lua-empty-test/project/CMakeLists.txt index 202fe0d143..88cb012549 100644 --- a/tests/lua-empty-test/project/CMakeLists.txt +++ b/tests/lua-empty-test/project/CMakeLists.txt @@ -2,6 +2,12 @@ cmake_minimum_required(VERSION 3.6) set(APP_NAME lua-empty-test) +if(XCODE) + if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) + SET (CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 8.0) + endif() +endif() + project(${APP_NAME}) if(NOT DEFINED BUILD_ENGINE_DONE) @@ -105,9 +111,6 @@ if(APPLE) elseif(IOS) set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon-${APP_NAME}") - if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) - set_xcode_property(${APP_NAME} IPHONEOS_DEPLOYMENT_TARGET "8.0") - endif() endif() # For code-signing, set the DEVELOPMENT_TEAM: diff --git a/tests/lua-tests/project/CMakeLists.txt b/tests/lua-tests/project/CMakeLists.txt index 93bcd99285..15ebecd0bd 100644 --- a/tests/lua-tests/project/CMakeLists.txt +++ b/tests/lua-tests/project/CMakeLists.txt @@ -2,6 +2,12 @@ cmake_minimum_required(VERSION 3.6) set(APP_NAME lua-tests) +if(XCODE) + if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) + SET (CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 8.0) + endif() +endif() + project(${APP_NAME}) if(NOT DEFINED BUILD_ENGINE_DONE) @@ -118,9 +124,6 @@ if(APPLE) elseif(IOS) set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios_mac/ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon-${APP_NAME}") - if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) - set_xcode_property(${APP_NAME} IPHONEOS_DEPLOYMENT_TARGET "8.0") - endif() endif() # For code-signing, set the DEVELOPMENT_TEAM: From 01ff6ddd660660294b49f44fca923e3d92dc7abe Mon Sep 17 00:00:00 2001 From: minggo Date: Wed, 6 Nov 2019 14:24:06 +0800 Subject: [PATCH 78/96] delete useless files and clean codes (#20279) --- cocos/2d/CCAtlasNode.cpp | 3 +- cocos/2d/CCCameraBackgroundBrush.cpp | 2 + cocos/2d/CCDrawNode.cpp | 3 +- cocos/2d/CCFastTMXLayer.cpp | 2 + cocos/2d/CCFastTMXLayer.h | 2 +- cocos/2d/CCLabel.cpp | 4 +- cocos/2d/CCParticleBatchNode.cpp | 2 + cocos/2d/CCParticleSystemQuad.cpp | 6 +- cocos/2d/CCProgressTimer.cpp | 4 +- cocos/2d/CCSprite.cpp | 4 +- cocos/2d/CCSpriteBatchNode.cpp | 3 +- cocos/3d/CCMotionStreak3D.cpp | 3 +- cocos/3d/CCTerrain.cpp | 2 + cocos/base/CCConfiguration.h | 1 - cocos/base/CCDirector.h | 1 - cocos/base/ccTypes.h | 1 - cocos/cocos2d.h | 2 - .../spine/SkeletonTwoColorBatch.cpp | 3 +- cocos/math/TransformUtils.h | 2 - cocos/navmesh/CCNavMeshDebugDraw.cpp | 3 +- cocos/physics3d/CCPhysics3DDebugDrawer.cpp | 3 +- cocos/platform/CCGL.h | 6 +- cocos/platform/CMakeLists.txt | 6 -- .../android/CCApplication-android.cpp | 6 -- .../platform/android/CCApplication-android.h | 11 +-- cocos/platform/android/CCCommon-android.cpp | 7 -- cocos/platform/android/CCDevice-android.cpp | 6 -- .../platform/android/CCEnhanceAPI-android.cpp | 8 -- cocos/platform/android/CCEnhanceAPI-android.h | 11 +-- .../platform/android/CCFileUtils-android.cpp | 6 -- cocos/platform/android/CCFileUtils-android.h | 10 +-- cocos/platform/android/CCGL-android.h | 12 +-- .../platform/android/CCGLViewImpl-android.cpp | 6 -- cocos/platform/android/CCGLViewImpl-android.h | 12 +-- .../android/CCPlatformDefine-android.h | 11 +-- cocos/platform/android/CCStdC-android.h | 11 +-- .../platform/android/javaactivity-android.cpp | 7 -- cocos/platform/apple/CCLock-apple.cpp | 50 ----------- cocos/platform/apple/CCLock-apple.h | 53 ------------ cocos/platform/desktop/CCGLViewImpl-desktop.h | 1 + cocos/platform/ios/CCApplication-ios.h | 13 +-- cocos/platform/ios/CCApplication-ios.mm | 5 -- cocos/platform/ios/CCCommon-ios.mm | 6 -- cocos/platform/ios/CCDevice-ios.mm | 7 -- cocos/platform/ios/CCDirectorCaller-ios.h | 6 -- cocos/platform/ios/CCDirectorCaller-ios.mm | 7 -- cocos/platform/ios/CCGL-ios.h | 39 --------- cocos/platform/ios/CCGLViewImpl-ios.h | 11 +-- cocos/platform/ios/CCGLViewImpl-ios.mm | 6 -- cocos/platform/ios/CCImage-ios.mm | 7 -- cocos/platform/ios/CCInputView-ios.h | 23 +++++ cocos/platform/ios/CCInputView-ios.mm | 23 +++++ cocos/platform/ios/CCPlatformDefine-ios.h | 5 -- cocos/platform/ios/CCStdC-ios.h | 10 +-- cocos/platform/ios/OpenGL_Internal-ios.h | 86 ------------------- cocos/platform/linux/CCApplication-linux.cpp | 7 -- cocos/platform/linux/CCApplication-linux.h | 11 +-- cocos/platform/linux/CCCommon-linux.cpp | 6 -- cocos/platform/linux/CCDevice-linux.cpp | 6 -- cocos/platform/linux/CCFileUtils-linux.cpp | 6 -- cocos/platform/linux/CCFileUtils-linux.h | 10 +-- cocos/platform/linux/CCGL-linux.h | 11 +-- cocos/platform/linux/CCPlatformDefine-linux.h | 6 -- cocos/platform/linux/CCStdC-linux.cpp | 33 ------- cocos/platform/linux/CCStdC-linux.h | 11 +-- cocos/platform/mac/CCApplication-mac.h | 6 +- cocos/platform/mac/CCCommon-mac.mm | 6 -- cocos/platform/mac/CCDevice-mac.mm | 6 -- cocos/platform/mac/CCGL-mac.h | 39 --------- cocos/platform/mac/CCGLViewImpl-mac.h | 6 +- cocos/platform/mac/CCGLViewImpl-mac.mm | 1 - cocos/platform/mac/CCStdC-mac.h | 11 +-- cocos/platform/win32/CCApplication-win32.cpp | 6 -- cocos/platform/win32/CCApplication-win32.h | 6 -- cocos/platform/win32/CCCommon-win32.cpp | 6 -- cocos/platform/win32/CCDevice-win32.cpp | 6 -- cocos/platform/win32/CCFileUtils-win32.cpp | 6 -- cocos/platform/win32/CCFileUtils-win32.h | 10 +-- cocos/platform/win32/CCGL-win32.h | 11 +-- cocos/platform/win32/CCPlatformDefine-win32.h | 6 -- cocos/platform/win32/CCStdC-win32.cpp | 7 -- cocos/platform/win32/CCStdC-win32.h | 14 +-- cocos/platform/win32/CCUtils-win32.h | 6 +- cocos/scripting/deprecated/CCDeprecated.h | 14 +-- extensions/Particle3D/CCParticle3DRender.cpp | 3 +- .../Particle3D/PU/CCPUBillboardChain.cpp | 3 +- extensions/Particle3D/PU/CCPURender.cpp | 3 +- 87 files changed, 113 insertions(+), 726 deletions(-) delete mode 100644 cocos/platform/apple/CCLock-apple.cpp delete mode 100644 cocos/platform/apple/CCLock-apple.h delete mode 100644 cocos/platform/ios/CCGL-ios.h delete mode 100644 cocos/platform/ios/OpenGL_Internal-ios.h delete mode 100644 cocos/platform/linux/CCStdC-linux.cpp delete mode 100644 cocos/platform/mac/CCGL-mac.h diff --git a/cocos/2d/CCAtlasNode.cpp b/cocos/2d/CCAtlasNode.cpp index a63838c175..91183550d3 100644 --- a/cocos/2d/CCAtlasNode.cpp +++ b/cocos/2d/CCAtlasNode.cpp @@ -25,8 +25,9 @@ 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 "2d/CCAtlasNode.h" +#include // offsetof +#include "base/ccTypes.h" #include "renderer/CCTextureAtlas.h" #include "base/CCDirector.h" #include "renderer/CCTextureCache.h" diff --git a/cocos/2d/CCCameraBackgroundBrush.cpp b/cocos/2d/CCCameraBackgroundBrush.cpp index aee71f8f72..01ad20741f 100644 --- a/cocos/2d/CCCameraBackgroundBrush.cpp +++ b/cocos/2d/CCCameraBackgroundBrush.cpp @@ -24,6 +24,8 @@ ****************************************************************************/ #include "2d/CCCameraBackgroundBrush.h" +#include // offsetof +#include "base/ccTypes.h" #include "2d/CCCamera.h" #include "base/ccMacros.h" #include "base/ccUtils.h" diff --git a/cocos/2d/CCDrawNode.cpp b/cocos/2d/CCDrawNode.cpp index 4ecb74542c..cfdb282b68 100644 --- a/cocos/2d/CCDrawNode.cpp +++ b/cocos/2d/CCDrawNode.cpp @@ -23,6 +23,8 @@ */ #include "2d/CCDrawNode.h" +#include // offsetof +#include "base/ccTypes.h" #include "base/CCEventType.h" #include "base/CCConfiguration.h" #include "renderer/CCRenderer.h" @@ -30,7 +32,6 @@ #include "base/CCEventListenerCustom.h" #include "base/CCEventDispatcher.h" #include "2d/CCActionCatmullRom.h" -#include "platform/CCGL.h" #include "base/ccUtils.h" #include "renderer/ccShaders.h" #include "renderer/backend/ProgramState.h" diff --git a/cocos/2d/CCFastTMXLayer.cpp b/cocos/2d/CCFastTMXLayer.cpp index 02f5339cd3..a11c0cd1ec 100644 --- a/cocos/2d/CCFastTMXLayer.cpp +++ b/cocos/2d/CCFastTMXLayer.cpp @@ -36,6 +36,8 @@ THE SOFTWARE. */ #include "2d/CCFastTMXLayer.h" +#include // offsetof +#include "base/ccTypes.h" #include "2d/CCFastTMXTiledMap.h" #include "2d/CCSprite.h" #include "2d/CCCamera.h" diff --git a/cocos/2d/CCFastTMXLayer.h b/cocos/2d/CCFastTMXLayer.h index 0cb7b3409c..f50bf7608b 100644 --- a/cocos/2d/CCFastTMXLayer.h +++ b/cocos/2d/CCFastTMXLayer.h @@ -276,7 +276,7 @@ public: void removeChild(Node* child, bool cleanup = true) override; protected: - virtual void setOpacity(GLubyte opacity) override; + virtual void setOpacity(uint8_t opacity) override; bool initWithTilesetInfo(TMXTilesetInfo *tilesetInfo, TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo); void updateTiles(const Rect& culledRect); diff --git a/cocos/2d/CCLabel.cpp b/cocos/2d/CCLabel.cpp index 41a0d20131..b06c151702 100644 --- a/cocos/2d/CCLabel.cpp +++ b/cocos/2d/CCLabel.cpp @@ -25,9 +25,9 @@ ****************************************************************************/ #include "2d/CCLabel.h" - #include - +#include // offsetof +#include "base/ccTypes.h" #include "2d/CCFont.h" #include "2d/CCFontAtlasCache.h" #include "2d/CCFontAtlas.h" diff --git a/cocos/2d/CCParticleBatchNode.cpp b/cocos/2d/CCParticleBatchNode.cpp index f3048917a2..e6ab3b9ea0 100644 --- a/cocos/2d/CCParticleBatchNode.cpp +++ b/cocos/2d/CCParticleBatchNode.cpp @@ -29,6 +29,8 @@ * */ #include "2d/CCParticleBatchNode.h" +#include // offsetof +#include "base/ccTypes.h" #include "2d/CCGrid.h" #include "2d/CCParticleSystem.h" #include "renderer/CCTextureCache.h" diff --git a/cocos/2d/CCParticleSystemQuad.cpp b/cocos/2d/CCParticleSystemQuad.cpp index e97ae7e370..f69c9048d2 100644 --- a/cocos/2d/CCParticleSystemQuad.cpp +++ b/cocos/2d/CCParticleSystemQuad.cpp @@ -26,12 +26,10 @@ 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 "2d/CCParticleSystemQuad.h" - #include - +#include // offsetof +#include "base/ccTypes.h" #include "2d/CCSpriteFrame.h" #include "2d/CCParticleBatchNode.h" #include "renderer/CCTextureAtlas.h" diff --git a/cocos/2d/CCProgressTimer.cpp b/cocos/2d/CCProgressTimer.cpp index 2d1b1a1901..d385c3d570 100644 --- a/cocos/2d/CCProgressTimer.cpp +++ b/cocos/2d/CCProgressTimer.cpp @@ -25,9 +25,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "2d/CCProgressTimer.h" - #include - +#include // offsetof +#include "base/ccTypes.h" #include "base/ccMacros.h" #include "base/CCDirector.h" #include "2d/CCSprite.h" diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index 4094fe60e0..eb20451354 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -26,9 +26,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "2d/CCSprite.h" - #include - +#include // offsetof +#include "base/ccTypes.h" #include "2d/CCSpriteBatchNode.h" #include "2d/CCAnimationCache.h" #include "2d/CCSpriteFrame.h" diff --git a/cocos/2d/CCSpriteBatchNode.cpp b/cocos/2d/CCSpriteBatchNode.cpp index 8ca5e509f6..5082f4d9b3 100644 --- a/cocos/2d/CCSpriteBatchNode.cpp +++ b/cocos/2d/CCSpriteBatchNode.cpp @@ -26,8 +26,9 @@ 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 "2d/CCSpriteBatchNode.h" +#include // offsetof +#include "base/ccTypes.h" #include "2d/CCSprite.h" #include "base/CCDirector.h" #include "base/CCProfiling.h" diff --git a/cocos/3d/CCMotionStreak3D.cpp b/cocos/3d/CCMotionStreak3D.cpp index bf1dd00af1..6ba4da32b9 100644 --- a/cocos/3d/CCMotionStreak3D.cpp +++ b/cocos/3d/CCMotionStreak3D.cpp @@ -24,8 +24,9 @@ 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 "3d/CCMotionStreak3D.h" +#include // offsetof +#include "base/ccTypes.h" #include "math/CCVertex.h" #include "base/CCDirector.h" #include "base/ccUtils.h" diff --git a/cocos/3d/CCTerrain.cpp b/cocos/3d/CCTerrain.cpp index 7f90607ead..c31d486830 100644 --- a/cocos/3d/CCTerrain.cpp +++ b/cocos/3d/CCTerrain.cpp @@ -29,12 +29,14 @@ USING_NS_CC; #include #include #include +#include // offsetof #include "renderer/CCRenderer.h" #include "renderer/ccShaders.h" #include "renderer/backend/Device.h" #include "renderer/backend/Program.h" #include "renderer/backend/Buffer.h" #include "base/CCDirector.h" +#include "base/ccTypes.h" #include "base/CCEventType.h" #include "2d/CCCamera.h" #include "platform/CCImage.h" diff --git a/cocos/base/CCConfiguration.h b/cocos/base/CCConfiguration.h index bd4405b5a4..5a2282c028 100644 --- a/cocos/base/CCConfiguration.h +++ b/cocos/base/CCConfiguration.h @@ -32,7 +32,6 @@ THE SOFTWARE. #include "base/CCRef.h" #include "base/CCValue.h" -#include "platform/CCGL.h" #include "3d/CCAnimate3D.h" /** diff --git a/cocos/base/CCDirector.h b/cocos/base/CCDirector.h index d58e5a4a00..68bfe44c34 100644 --- a/cocos/base/CCDirector.h +++ b/cocos/base/CCDirector.h @@ -36,7 +36,6 @@ THE SOFTWARE. #include "base/CCVector.h" #include "2d/CCScene.h" #include "math/CCMath.h" -#include "platform/CCGL.h" #include "platform/CCGLView.h" NS_CC_BEGIN diff --git a/cocos/base/ccTypes.h b/cocos/base/ccTypes.h index e5a62e68ba..52ed47ab5a 100644 --- a/cocos/base/ccTypes.h +++ b/cocos/base/ccTypes.h @@ -32,7 +32,6 @@ THE SOFTWARE. #include "math/CCGeometry.h" #include "math/CCMath.h" #include "base/CCRef.h" -#include "platform/CCGL.h" #include "base/CCEnumClass.h" #include "renderer/backend/Types.h" diff --git a/cocos/cocos2d.h b/cocos/cocos2d.h index 0fbe61ea1e..a81ea7e3c5 100644 --- a/cocos/cocos2d.h +++ b/cocos/cocos2d.h @@ -183,7 +183,6 @@ THE SOFTWARE. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) #include "platform/ios/CCApplication-ios.h" #include "platform/ios/CCGLViewImpl-ios.h" - #include "platform/ios/CCGL-ios.h" #include "platform/ios/CCStdC-ios.h" #endif // CC_TARGET_PLATFORM == CC_PLATFORM_IOS @@ -207,7 +206,6 @@ THE SOFTWARE. #if (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) #include "platform/desktop/CCGLViewImpl-desktop.h" #include "platform/mac/CCApplication-mac.h" - #include "platform/mac/CCGL-mac.h" #include "platform/mac/CCStdC-mac.h" #endif // CC_TARGET_PLATFORM == CC_PLATFORM_MAC diff --git a/cocos/editor-support/spine/SkeletonTwoColorBatch.cpp b/cocos/editor-support/spine/SkeletonTwoColorBatch.cpp index fac3fc971a..32a11d3591 100644 --- a/cocos/editor-support/spine/SkeletonTwoColorBatch.cpp +++ b/cocos/editor-support/spine/SkeletonTwoColorBatch.cpp @@ -30,7 +30,8 @@ #include #include #include - +#include // offsetof +#include "base/ccTypes.h" #include "base/ccUtils.h" USING_NS_CC; diff --git a/cocos/math/TransformUtils.h b/cocos/math/TransformUtils.h index c063a890e2..d22718a0f8 100644 --- a/cocos/math/TransformUtils.h +++ b/cocos/math/TransformUtils.h @@ -28,8 +28,6 @@ THE SOFTWARE. #ifndef __SUPPORT_TRANSFORM_UTILS_H__ #define __SUPPORT_TRANSFORM_UTILS_H__ -// TODO: when in MAC or windows, it includes -#include "platform/CCGL.h" #include "base/ccMacros.h" /** diff --git a/cocos/navmesh/CCNavMeshDebugDraw.cpp b/cocos/navmesh/CCNavMeshDebugDraw.cpp index 52301d93ff..7a51fdf03b 100644 --- a/cocos/navmesh/CCNavMeshDebugDraw.cpp +++ b/cocos/navmesh/CCNavMeshDebugDraw.cpp @@ -24,7 +24,8 @@ ****************************************************************************/ #include "navmesh/CCNavMeshDebugDraw.h" #if CC_USE_NAVMESH - +#include // offsetof +#include "base/ccTypes.h" #include "renderer/backend/ProgramState.h" #include "renderer/backend/Device.h" #include "renderer/CCRenderer.h" diff --git a/cocos/physics3d/CCPhysics3DDebugDrawer.cpp b/cocos/physics3d/CCPhysics3DDebugDrawer.cpp index b8356b40e7..d2e5376dc5 100644 --- a/cocos/physics3d/CCPhysics3DDebugDrawer.cpp +++ b/cocos/physics3d/CCPhysics3DDebugDrawer.cpp @@ -22,8 +22,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - #include "physics3d/CCPhysics3D.h" +#include // offsetof +#include "base/ccTypes.h" #include "base/CCConfiguration.h" #include "base/ccMacros.h" #include "base/CCDirector.h" diff --git a/cocos/platform/CCGL.h b/cocos/platform/CCGL.h index cce37da893..ecfb28ede5 100644 --- a/cocos/platform/CCGL.h +++ b/cocos/platform/CCGL.h @@ -30,11 +30,7 @@ THE SOFTWARE. #include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_MAC -#include "platform/mac/CCGL-mac.h" -#elif CC_TARGET_PLATFORM == CC_PLATFORM_IOS -#include "platform/ios/CCGL-ios.h" -#elif CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID +#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID #include "platform/android/CCGL-android.h" #elif CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 #include "platform/win32/CCGL-win32.h" diff --git a/cocos/platform/CMakeLists.txt b/cocos/platform/CMakeLists.txt index a330236782..4700e2519a 100644 --- a/cocos/platform/CMakeLists.txt +++ b/cocos/platform/CMakeLists.txt @@ -57,11 +57,9 @@ elseif(WINDOWS) elseif(APPLE) set(COCOS_PLATFORM_SPECIFIC_HEADER platform/apple/CCFileUtils-apple.h - platform/apple/CCLock-apple.h platform/apple/CCDevice-apple.h ) set(COCOS_PLATFORM_SPECIFIC_SRC - platform/apple/CCLock-apple.cpp platform/apple/CCFileUtils-apple.mm platform/apple/CCDevice-apple.mm ) @@ -72,7 +70,6 @@ elseif(APPLE) platform/mac/CCGLViewImpl-mac.h platform/mac/CCPlatformDefine-mac.h platform/mac/CCApplication-mac.h - platform/mac/CCGL-mac.h # platform/desktop/CCGLViewImpl-desktop.h ) set(COCOS_PLATFORM_SPECIFIC_SRC @@ -89,11 +86,9 @@ elseif(APPLE) platform/ios/CCApplication-ios.h platform/ios/CCDirectorCaller-ios.h platform/ios/CCEAGLView-ios.h - platform/ios/CCGL-ios.h platform/ios/CCGLViewImpl-ios.h platform/ios/CCPlatformDefine-ios.h platform/ios/CCStdC-ios.h - platform/ios/OpenGL_Internal-ios.h platform/ios/CCInputView-ios.h ) set(COCOS_PLATFORM_SPECIFIC_SRC @@ -128,7 +123,6 @@ elseif(LINUX) platform/desktop/CCGLViewImpl-desktop.h ) set(COCOS_PLATFORM_SPECIFIC_SRC - platform/linux/CCStdC-linux.cpp platform/linux/CCFileUtils-linux.cpp platform/linux/CCCommon-linux.cpp platform/linux/CCApplication-linux.cpp diff --git a/cocos/platform/android/CCApplication-android.cpp b/cocos/platform/android/CCApplication-android.cpp index da71a1ba54..e2b0b265ae 100644 --- a/cocos/platform/android/CCApplication-android.cpp +++ b/cocos/platform/android/CCApplication-android.cpp @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - #include "platform/android/jni/JniHelper.h" #include "platform/CCApplication.h" #include "base/CCDirector.h" @@ -132,5 +128,3 @@ void Application::applicationScreenSizeChanged(int newWidth, int newHeight) { } NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID diff --git a/cocos/platform/android/CCApplication-android.h b/cocos/platform/android/CCApplication-android.h index c2278ce958..bc15ada448 100644 --- a/cocos/platform/android/CCApplication-android.h +++ b/cocos/platform/android/CCApplication-android.h @@ -23,12 +23,7 @@ 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. ****************************************************************************/ - -#ifndef __CC_APPLICATION_ANDROID_H__ -#define __CC_APPLICATION_ANDROID_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID +#pragma once #include "platform/CCCommon.h" #include "platform/CCApplicationProtocol.h" @@ -109,7 +104,3 @@ protected: }; NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - -#endif // __CC_APPLICATION_ANDROID_H__ diff --git a/cocos/platform/android/CCCommon-android.cpp b/cocos/platform/android/CCCommon-android.cpp index 0759a7c660..6c388e53d0 100644 --- a/cocos/platform/android/CCCommon-android.cpp +++ b/cocos/platform/android/CCCommon-android.cpp @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - #include "platform/CCCommon.h" #include "platform/android/jni/JniHelper.h" #include @@ -48,6 +44,3 @@ void LuaLog(const char * pszFormat) } NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - diff --git a/cocos/platform/android/CCDevice-android.cpp b/cocos/platform/android/CCDevice-android.cpp index ab298d83cb..16ee4cba3c 100644 --- a/cocos/platform/android/CCDevice-android.cpp +++ b/cocos/platform/android/CCDevice-android.cpp @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - #include "platform/CCDevice.h" #include #include @@ -184,8 +180,6 @@ void Device::vibrate(float duration) NS_CC_END -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - // this method is called by Cocos2dxBitmap extern "C" { diff --git a/cocos/platform/android/CCEnhanceAPI-android.cpp b/cocos/platform/android/CCEnhanceAPI-android.cpp index 0519a06e0b..1db28b1814 100644 --- a/cocos/platform/android/CCEnhanceAPI-android.cpp +++ b/cocos/platform/android/CCEnhanceAPI-android.cpp @@ -12,11 +12,6 @@ * it only in accordance with the terms of the license agreement * you entered into with Samsung ****************************************************************************/ - - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - #include "platform/android/jni/JniHelper.h" #include "platform/android/CCEnhanceAPI-android.h" #include @@ -106,6 +101,3 @@ int EnhanceAPI::setLowPowerMode(bool enable) return ret; } NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - diff --git a/cocos/platform/android/CCEnhanceAPI-android.h b/cocos/platform/android/CCEnhanceAPI-android.h index f00248a67e..6421ac1056 100644 --- a/cocos/platform/android/CCEnhanceAPI-android.h +++ b/cocos/platform/android/CCEnhanceAPI-android.h @@ -12,12 +12,7 @@ * it only in accordance with the terms of the license agreement * you entered into with Samsung ****************************************************************************/ - -#ifndef __CC_ENHANCEAPI_ANDROID_H__ -#define __CC_ENHANCEAPI_ANDROID_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID +#pragma once #include "platform/CCCommon.h" #include "platform/CCApplicationProtocol.h" @@ -98,7 +93,3 @@ public: }; NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - -#endif // __CC_ENHANCEAPI_ANDROID_H__ diff --git a/cocos/platform/android/CCFileUtils-android.cpp b/cocos/platform/android/CCFileUtils-android.cpp index 3faa14a7f7..ca3803919e 100644 --- a/cocos/platform/android/CCFileUtils-android.cpp +++ b/cocos/platform/android/CCFileUtils-android.cpp @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - #include "platform/android/CCFileUtils-android.h" #include "platform/CCCommon.h" #include "platform/android/jni/JniHelper.h" @@ -416,5 +412,3 @@ string FileUtilsAndroid::getWritablePath() const } NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID diff --git a/cocos/platform/android/CCFileUtils-android.h b/cocos/platform/android/CCFileUtils-android.h index 2153199b18..2d5fbb8384 100644 --- a/cocos/platform/android/CCFileUtils-android.h +++ b/cocos/platform/android/CCFileUtils-android.h @@ -23,11 +23,7 @@ Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ -#ifndef __CC_FILEUTILS_ANDROID_H__ -#define __CC_FILEUTILS_ANDROID_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID +#pragma once #include "platform/CCFileUtils.h" #include "platform/CCPlatformMacros.h" @@ -88,7 +84,3 @@ private: /// @} NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - -#endif // __CC_FILEUTILS_ANDROID_H__ diff --git a/cocos/platform/android/CCGL-android.h b/cocos/platform/android/CCGL-android.h index 87342e0b38..ba5ca8f947 100644 --- a/cocos/platform/android/CCGL-android.h +++ b/cocos/platform/android/CCGL-android.h @@ -23,12 +23,7 @@ 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. ****************************************************************************/ - -#ifndef __CCGL_H__ -#define __CCGL_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID +#pragma once #define glClearDepth glClearDepthf #define glDeleteVertexArrays glDeleteVertexArraysOES @@ -65,8 +60,3 @@ extern PFNGLDELETEVERTEXARRAYSOESPROC glDeleteVertexArraysOESEXT; #define glGenVertexArraysOES glGenVertexArraysOESEXT #define glBindVertexArrayOES glBindVertexArrayOESEXT #define glDeleteVertexArraysOES glDeleteVertexArraysOESEXT - - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - -#endif // __CCGL_H__ diff --git a/cocos/platform/android/CCGLViewImpl-android.cpp b/cocos/platform/android/CCGLViewImpl-android.cpp index 519584f383..303560203b 100644 --- a/cocos/platform/android/CCGLViewImpl-android.cpp +++ b/cocos/platform/android/CCGLViewImpl-android.cpp @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - #include "platform/android/CCGLViewImpl-android.h" #include "base/CCDirector.h" #include "base/ccMacros.h" @@ -217,5 +213,3 @@ Rect GLViewImpl::getSafeAreaRect() const { } NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID diff --git a/cocos/platform/android/CCGLViewImpl-android.h b/cocos/platform/android/CCGLViewImpl-android.h index 83cab2d5e6..b3430c428d 100644 --- a/cocos/platform/android/CCGLViewImpl-android.h +++ b/cocos/platform/android/CCGLViewImpl-android.h @@ -23,12 +23,7 @@ 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. ****************************************************************************/ - -#ifndef __CC_EGLVIEWIMPL_ANDROID_H__ -#define __CC_EGLVIEWIMPL_ANDROID_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID +#pragma once #include "base/CCRef.h" #include "math/CCGeometry.h" @@ -60,8 +55,3 @@ protected: }; NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - -#endif // end of __CC_EGLVIEWIMPL_ANDROID_H__ - diff --git a/cocos/platform/android/CCPlatformDefine-android.h b/cocos/platform/android/CCPlatformDefine-android.h index 49abace9cb..b477755fce 100644 --- a/cocos/platform/android/CCPlatformDefine-android.h +++ b/cocos/platform/android/CCPlatformDefine-android.h @@ -23,12 +23,7 @@ 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. ****************************************************************************/ - -#ifndef __CCPLATFORMDEFINE_H__ -#define __CCPLATFORMDEFINE_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID +#pragma once #include @@ -62,7 +57,3 @@ THE SOFTWARE. #define NULL ((void *)0) #endif #endif - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - -#endif /* __CCPLATFORMDEFINE_H__*/ diff --git a/cocos/platform/android/CCStdC-android.h b/cocos/platform/android/CCStdC-android.h index 430889dd18..5b598fd24a 100644 --- a/cocos/platform/android/CCStdC-android.h +++ b/cocos/platform/android/CCStdC-android.h @@ -23,12 +23,7 @@ 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. ****************************************************************************/ - -#ifndef __CC_STD_C_H__ -#define __CC_STD_C_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID +#pragma once #include "platform/CCPlatformMacros.h" #include @@ -49,7 +44,3 @@ THE SOFTWARE. #ifndef MAX #define MAX(x,y) (((x) < (y)) ? (y) : (x)) #endif // MAX - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - -#endif // __CC_STD_C_H__ diff --git a/cocos/platform/android/javaactivity-android.cpp b/cocos/platform/android/javaactivity-android.cpp index ef47c31878..56096cfaf6 100644 --- a/cocos/platform/android/javaactivity-android.cpp +++ b/cocos/platform/android/javaactivity-android.cpp @@ -22,10 +22,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - #include "platform/android/CCApplication-android.h" #include "platform/android/CCGLViewImpl-android.h" #include "base/CCDirector.h" @@ -131,6 +127,3 @@ JNIEXPORT void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeOnSurfaceChanged(JNI } } - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - diff --git a/cocos/platform/apple/CCLock-apple.cpp b/cocos/platform/apple/CCLock-apple.cpp deleted file mode 100644 index 76d67ca8f1..0000000000 --- a/cocos/platform/apple/CCLock-apple.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/**************************************************************************** -Copyright (c) 2010-2012 cocos2d-x.org -Copyright (c) 2013-2016 Chukong Technologies Inc. -Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. - -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 "platform/apple/CCLock-apple.h" - -NS_CC_BEGIN - -Lock::Lock() -{ -} - -Lock::~Lock() -{ - -} - -void Lock::lock() -{ - -} - -void Lock::unlock() -{ - -} - -NS_CC_END diff --git a/cocos/platform/apple/CCLock-apple.h b/cocos/platform/apple/CCLock-apple.h deleted file mode 100644 index 6ad5c571c2..0000000000 --- a/cocos/platform/apple/CCLock-apple.h +++ /dev/null @@ -1,53 +0,0 @@ -/**************************************************************************** -Copyright (c) 2010-2012 cocos2d-x.org -Copyright (c) 2013-2016 Chukong Technologies Inc. -Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. - -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. -****************************************************************************/ - -#ifndef __PLATFORM_IPHONE_PLATFORM_CCLOCK_H__ -#define __PLATFORM_IPHONE_PLATFORM_CCLOCK_H__ - -#include "platform/CCPlatformMacros.h" - -NS_CC_BEGIN - -class Lock -{ -public: - /** - * @js ctor - */ - Lock(); - /** - * @js NA - * @lua NA - */ - ~Lock(); - - void lock(); - void unlock(); -}; - -NS_CC_END - -#endif // __PLATFORM_IPHONE_PLATFORM_CCLOCK_H__ diff --git a/cocos/platform/desktop/CCGLViewImpl-desktop.h b/cocos/platform/desktop/CCGLViewImpl-desktop.h index 8d5cab5cd4..c51a7f8488 100644 --- a/cocos/platform/desktop/CCGLViewImpl-desktop.h +++ b/cocos/platform/desktop/CCGLViewImpl-desktop.h @@ -26,6 +26,7 @@ THE SOFTWARE. #pragma once +#include "platform/CCGL.h" #include "base/CCRef.h" #include "platform/CCCommon.h" #include "platform/CCGLView.h" diff --git a/cocos/platform/ios/CCApplication-ios.h b/cocos/platform/ios/CCApplication-ios.h index cb2ef487ba..f3e8583887 100644 --- a/cocos/platform/ios/CCApplication-ios.h +++ b/cocos/platform/ios/CCApplication-ios.h @@ -23,20 +23,13 @@ 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. ****************************************************************************/ - -#ifndef __CC_APPLICATION_IOS_H__ -#define __CC_APPLICATION_IOS_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS +#pragma once #include "platform/CCCommon.h" #include "platform/CCApplicationProtocol.h" NS_CC_BEGIN -class Rect; - class CC_DLL Application : public ApplicationProtocol { public: @@ -108,7 +101,3 @@ protected: }; NS_CC_END - -#endif // CC_PLATFORM_IOS - -#endif // end of __CC_APPLICATION_IOS_H__ diff --git a/cocos/platform/ios/CCApplication-ios.mm b/cocos/platform/ios/CCApplication-ios.mm index f5060f5a24..eb47ba9a82 100644 --- a/cocos/platform/ios/CCApplication-ios.mm +++ b/cocos/platform/ios/CCApplication-ios.mm @@ -23,11 +23,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - #import "CCApplication.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS - #import #import "math/CCGeometry.h" @@ -145,5 +142,3 @@ void Application::applicationScreenSizeChanged(int newWidth, int newHeight) { } NS_CC_END - -#endif // CC_PLATFORM_IOS diff --git a/cocos/platform/ios/CCCommon-ios.mm b/cocos/platform/ios/CCCommon-ios.mm index 6ab709d2af..254978be54 100644 --- a/cocos/platform/ios/CCCommon-ios.mm +++ b/cocos/platform/ios/CCCommon-ios.mm @@ -23,10 +23,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS - #include "platform/CCCommon.h" #include @@ -68,5 +64,3 @@ void LuaLog(const char * format) } NS_CC_END - -#endif // CC_PLATFORM_IOS diff --git a/cocos/platform/ios/CCDevice-ios.mm b/cocos/platform/ios/CCDevice-ios.mm index 5c56ba3e74..11d4b71190 100644 --- a/cocos/platform/ios/CCDevice-ios.mm +++ b/cocos/platform/ios/CCDevice-ios.mm @@ -23,11 +23,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS - #import #include "platform/CCDevice.h" @@ -630,5 +625,3 @@ void Device::vibrate(float duration) } NS_CC_END - -#endif // CC_PLATFORM_IOS diff --git a/cocos/platform/ios/CCDirectorCaller-ios.h b/cocos/platform/ios/CCDirectorCaller-ios.h index cdc5e254bd..483e7a3a88 100644 --- a/cocos/platform/ios/CCDirectorCaller-ios.h +++ b/cocos/platform/ios/CCDirectorCaller-ios.h @@ -23,10 +23,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS - #import @interface CCDirectorCaller : NSObject { @@ -44,5 +40,3 @@ +(void) destroy; @end -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_IOS - diff --git a/cocos/platform/ios/CCDirectorCaller-ios.mm b/cocos/platform/ios/CCDirectorCaller-ios.mm index 3e89ca5f12..f6a933ada9 100644 --- a/cocos/platform/ios/CCDirectorCaller-ios.mm +++ b/cocos/platform/ios/CCDirectorCaller-ios.mm @@ -23,10 +23,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS - #include #import "platform/ios/CCDirectorCaller-ios.h" @@ -153,6 +149,3 @@ static id s_sharedDirectorCaller; } @end - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_IOS - diff --git a/cocos/platform/ios/CCGL-ios.h b/cocos/platform/ios/CCGL-ios.h deleted file mode 100644 index 7e7cba2929..0000000000 --- a/cocos/platform/ios/CCGL-ios.h +++ /dev/null @@ -1,39 +0,0 @@ -/**************************************************************************** -Copyright (c) 2010-2012 cocos2d-x.org -Copyright (c) 2013-2016 Chukong Technologies Inc. -Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. - -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. -****************************************************************************/ - -#ifndef __PLATFORM_IOS_CCGL_H__ -#define __PLATFORM_IOS_CCGL_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS - -#include -#include - -#endif // CC_PLATFORM_IOS - -#endif // __PLATFORM_IOS_CCGL_H__ - diff --git a/cocos/platform/ios/CCGLViewImpl-ios.h b/cocos/platform/ios/CCGLViewImpl-ios.h index 874fd1d5bf..e1ad641b17 100644 --- a/cocos/platform/ios/CCGLViewImpl-ios.h +++ b/cocos/platform/ios/CCGLViewImpl-ios.h @@ -23,12 +23,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - -#ifndef __CC_EGLVIEWIMPL_IPHONE_H__ -#define __CC_EGLVIEWIMPL_IPHONE_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS +#pragma once #include "base/CCRef.h" #include "platform/CCCommon.h" @@ -92,7 +87,3 @@ protected: }; NS_CC_END - -#endif // CC_PLATFORM_IOS - -#endif // end of __CC_EGLViewImpl_IPHONE_H__ diff --git a/cocos/platform/ios/CCGLViewImpl-ios.mm b/cocos/platform/ios/CCGLViewImpl-ios.mm index 5d5b366914..26623708ca 100644 --- a/cocos/platform/ios/CCGLViewImpl-ios.mm +++ b/cocos/platform/ios/CCGLViewImpl-ios.mm @@ -23,10 +23,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS - #import #include "platform/ios/CCEAGLView-ios.h" @@ -280,5 +276,3 @@ Rect GLViewImpl::getSafeAreaRect() const } NS_CC_END - -#endif // CC_PLATFORM_IOS diff --git a/cocos/platform/ios/CCImage-ios.mm b/cocos/platform/ios/CCImage-ios.mm index f2dd09a247..214fa4332e 100644 --- a/cocos/platform/ios/CCImage-ios.mm +++ b/cocos/platform/ios/CCImage-ios.mm @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS - #import "platform/CCImage.h" #import "platform/CCCommon.h" #import @@ -136,6 +132,3 @@ bool cocos2d::Image::saveToFile(const std::string& filename, bool isToRGB) } NS_CC_END - -#endif // CC_PLATFORM_IOS - diff --git a/cocos/platform/ios/CCInputView-ios.h b/cocos/platform/ios/CCInputView-ios.h index ff60d5b94f..3b9e43ef2d 100644 --- a/cocos/platform/ios/CCInputView-ios.h +++ b/cocos/platform/ios/CCInputView-ios.h @@ -1,3 +1,26 @@ +/**************************************************************************** +Copyright (c) 2019 Xiamen Yaji Software Co., Ltd. + +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. +****************************************************************************/ #import @interface CCInputView : UIView diff --git a/cocos/platform/ios/CCInputView-ios.mm b/cocos/platform/ios/CCInputView-ios.mm index 68a50ccf2a..4552a5feb1 100644 --- a/cocos/platform/ios/CCInputView-ios.mm +++ b/cocos/platform/ios/CCInputView-ios.mm @@ -1,3 +1,26 @@ +/**************************************************************************** +Copyright (c) 2019 Xiamen Yaji Software Co., Ltd. + +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. +****************************************************************************/ #import "platform/ios/CCInputView-ios.h" #import "base/CCIMEDispatcher.h" #import "base/CCDirector.h" diff --git a/cocos/platform/ios/CCPlatformDefine-ios.h b/cocos/platform/ios/CCPlatformDefine-ios.h index 6df88fd9ab..16b8c308d3 100644 --- a/cocos/platform/ios/CCPlatformDefine-ios.h +++ b/cocos/platform/ios/CCPlatformDefine-ios.h @@ -25,9 +25,6 @@ THE SOFTWARE. ****************************************************************************/ #pragma once -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS - #include #define CC_DLL @@ -45,5 +42,3 @@ THE SOFTWARE. #define NULL ((void *)0) #endif #endif - -#endif // CC_PLATFORM_IOS diff --git a/cocos/platform/ios/CCStdC-ios.h b/cocos/platform/ios/CCStdC-ios.h index 8b49f9c8e0..774fa33fb7 100644 --- a/cocos/platform/ios/CCStdC-ios.h +++ b/cocos/platform/ios/CCStdC-ios.h @@ -23,12 +23,7 @@ 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. ****************************************************************************/ - -#ifndef __CC_STD_C_H__ -#define __CC_STD_C_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS +#pragma once #include "platform/CCPlatformMacros.h" #include @@ -48,6 +43,3 @@ THE SOFTWARE. #ifndef MAX #define MAX(x,y) (((x) < (y)) ? (y) : (x)) #endif // MAX - -#endif // CC_PLATFORM_IOS -#endif // __CC_STD_C_H__ diff --git a/cocos/platform/ios/OpenGL_Internal-ios.h b/cocos/platform/ios/OpenGL_Internal-ios.h deleted file mode 100644 index d9d9c2acc3..0000000000 --- a/cocos/platform/ios/OpenGL_Internal-ios.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - -===== IMPORTANT ===== - -This is sample code demonstrating API, technology or techniques in development. -Although this sample code has been reviewed for technical accuracy, it is not -final. Apple is supplying this information to help you plan for the adoption of -the technologies and programming interfaces described herein. This information -is subject to change, and software implemented based on this sample code should -be tested with final operating system software and final documentation. Newer -versions of this sample code may be provided with future seeds of the API or -technology. For information about updates to this and other developer -documentation, view the New & Updated sidebars in subsequent documentation -seeds. - -===================== - -File: OpenGL_Internal.h -Abstract: This file is included for support purposes and isn't necessary for -understanding this sample. - -Version: 1.0 - -Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. -("Apple") in consideration of your agreement to the following terms, and your -use, installation, modification or redistribution of this Apple software -constitutes acceptance of these terms. If you do not agree with these terms, -please do not use, install, modify or redistribute this Apple software. - -In consideration of your agreement to abide by the following terms, and subject -to these terms, Apple grants you a personal, non-exclusive license, under -Apple's copyrights in this original Apple software (the "Apple Software"), to -use, reproduce, modify and redistribute the Apple Software, with or without -modifications, in source and/or binary forms; provided that if you redistribute -the Apple Software in its entirety and without modifications, you must retain -this notice and the following text and disclaimers in all such redistributions -of the Apple Software. -Neither the name, trademarks, service marks or logos of Apple Inc. may be used -to endorse or promote products derived from the Apple Software without specific -prior written permission from Apple. Except as expressly stated in this notice, -no other rights or licenses, express or implied, are granted by Apple herein, -including but not limited to any patent rights that may be infringed by your -derivative works or by other works in which the Apple Software may be -incorporated. - -The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO -WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED -WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN -COMBINATION WITH YOUR PRODUCTS. - -IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR -DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF -CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF -APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Copyright (C) 2008 Apple Inc. All Rights Reserved. - -*/ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS - -/* Generic error reporting */ -#define REPORT_ERROR(__FORMAT__, ...) printf("%s: %s\n", __FUNCTION__, [[NSString stringWithFormat:__FORMAT__, __VA_ARGS__] UTF8String]) - -/* EAGL and GL functions calling wrappers that log on error */ -#define CALL_EAGL_FUNCTION(__FUNC__, ...) ({ EAGLError __error = __FUNC__( __VA_ARGS__ ); if(__error != kEAGLErrorSuccess) printf("%s() called from %s returned error %i\n", #__FUNC__, __FUNCTION__, __error); (__error ? NO : YES); }) -//#define CHECK_GL_ERROR() ({ GLenum __error = glGetError(); if(__error) printf("OpenGL error 0x%04X in %s\n", __error, __FUNCTION__); (__error ? NO : YES); }) -#define CHECK_GL_ERROR() ({ GLenum __error = glGetError(); if(__error) printf("OpenGL error 0x%04X in %s %d\n", __error, __FUNCTION__, __LINE__); }) - - -/* Optional delegate methods support */ -#ifndef __DELEGATE_IVAR__ -#define __DELEGATE_IVAR__ _delegate -#endif -#ifndef __DELEGATE_METHODS_IVAR__ -#define __DELEGATE_METHODS_IVAR__ _delegateMethods -#endif -#define TEST_DELEGATE_METHOD_BIT(__BIT__) (self->__DELEGATE_METHODS_IVAR__ & (1 << __BIT__)) -#define SET_DELEGATE_METHOD_BIT(__BIT__, __NAME__) { if([self->__DELEGATE_IVAR__ respondsToSelector:@selector(__NAME__)]) self->__DELEGATE_METHODS_IVAR__ |= (1 << __BIT__); else self->__DELEGATE_METHODS_IVAR__ &= ~(1 << __BIT__); } - -#endif // CC_PLATFORM_IOS diff --git a/cocos/platform/linux/CCApplication-linux.cpp b/cocos/platform/linux/CCApplication-linux.cpp index d1ed03a8c9..630ecb7928 100644 --- a/cocos/platform/linux/CCApplication-linux.cpp +++ b/cocos/platform/linux/CCApplication-linux.cpp @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_LINUX - #include "platform/linux/CCApplication-linux.h" #include #include @@ -195,6 +191,3 @@ LanguageType Application::getCurrentLanguage() } NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_LINUX - diff --git a/cocos/platform/linux/CCApplication-linux.h b/cocos/platform/linux/CCApplication-linux.h index 875938e4bd..8e47460231 100644 --- a/cocos/platform/linux/CCApplication-linux.h +++ b/cocos/platform/linux/CCApplication-linux.h @@ -23,12 +23,7 @@ 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. ****************************************************************************/ - -#ifndef CCAPLICATION_H_ -#define CCAPLICATION_H_ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_LINUX +#pragma once #include "platform/CCCommon.h" #include "platform/CCApplicationProtocol.h" @@ -116,7 +111,3 @@ protected: }; NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_LINUX - -#endif /* CCAPLICATION_H_ */ diff --git a/cocos/platform/linux/CCCommon-linux.cpp b/cocos/platform/linux/CCCommon-linux.cpp index 6ebaca744e..7bee16e171 100644 --- a/cocos/platform/linux/CCCommon-linux.cpp +++ b/cocos/platform/linux/CCCommon-linux.cpp @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_LINUX - #include "platform/CCCommon.h" #include "platform/linux/CCStdC-linux.h" #include "base/CCConsole.h" @@ -44,5 +40,3 @@ void LuaLog(const char * format) } NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_LINUX diff --git a/cocos/platform/linux/CCDevice-linux.cpp b/cocos/platform/linux/CCDevice-linux.cpp index 92e4137a73..806f45ed23 100644 --- a/cocos/platform/linux/CCDevice-linux.cpp +++ b/cocos/platform/linux/CCDevice-linux.cpp @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_LINUX - #include "platform/CCDevice.h" #include "platform/CCFileUtils.h" @@ -519,5 +515,3 @@ void Device::vibrate(float /*duration*/) } NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_LINUX diff --git a/cocos/platform/linux/CCFileUtils-linux.cpp b/cocos/platform/linux/CCFileUtils-linux.cpp index 831a77efb8..a8647dceef 100644 --- a/cocos/platform/linux/CCFileUtils-linux.cpp +++ b/cocos/platform/linux/CCFileUtils-linux.cpp @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_LINUX - #include "platform/linux/CCFileUtils-linux.h" #include "platform/linux/CCApplication-linux.h" #include "platform/CCCommon.h" @@ -128,5 +124,3 @@ bool FileUtilsLinux::isFileExistInternal(const std::string& strFilePath) const } NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_LINUX diff --git a/cocos/platform/linux/CCFileUtils-linux.h b/cocos/platform/linux/CCFileUtils-linux.h index 7c19161779..a4ea4d34cc 100644 --- a/cocos/platform/linux/CCFileUtils-linux.h +++ b/cocos/platform/linux/CCFileUtils-linux.h @@ -23,11 +23,7 @@ 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. ****************************************************************************/ -#ifndef __CC_FILEUTILS_LINUX_H__ -#define __CC_FILEUTILS_LINUX_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_LINUX +#pragma once #include "platform/CCFileUtils.h" #include "platform/CCPlatformMacros.h" @@ -62,7 +58,3 @@ private: /// @} NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_LINUX - -#endif // __CC_FILEUTILS_LINUX_H__ diff --git a/cocos/platform/linux/CCGL-linux.h b/cocos/platform/linux/CCGL-linux.h index 42c860b5f8..6f6a486396 100644 --- a/cocos/platform/linux/CCGL-linux.h +++ b/cocos/platform/linux/CCGL-linux.h @@ -22,17 +22,8 @@ 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. ****************************************************************************/ - -#ifndef __CCGL_H__ -#define __CCGL_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_LINUX +#pragma once #include "GL/glew.h" #define CC_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8 - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_LINUX - -#endif // __CCGL_H__ diff --git a/cocos/platform/linux/CCPlatformDefine-linux.h b/cocos/platform/linux/CCPlatformDefine-linux.h index 97f3d7d54b..19eb054cf3 100644 --- a/cocos/platform/linux/CCPlatformDefine-linux.h +++ b/cocos/platform/linux/CCPlatformDefine-linux.h @@ -23,12 +23,8 @@ 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. ****************************************************************************/ - #pragma once -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_LINUX - #include #define CC_DLL @@ -45,5 +41,3 @@ THE SOFTWARE. #define NULL ((void *)0) #endif #endif - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_LINUX diff --git a/cocos/platform/linux/CCStdC-linux.cpp b/cocos/platform/linux/CCStdC-linux.cpp deleted file mode 100644 index fe5f597c5b..0000000000 --- a/cocos/platform/linux/CCStdC-linux.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/**************************************************************************** -Copyright (c) 2010-2012 cocos2d-x.org -Copyright (c) 2013-2016 Chukong Technologies Inc. -Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. - -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 "platform/CCPlatformConfig.h" -#include "platform/linux/CCStdC-linux.h" - -#if CC_TARGET_PLATFORM == CC_PLATFORM_LINUX - - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_LINUX diff --git a/cocos/platform/linux/CCStdC-linux.h b/cocos/platform/linux/CCStdC-linux.h index f436322118..6bd836bcb5 100644 --- a/cocos/platform/linux/CCStdC-linux.h +++ b/cocos/platform/linux/CCStdC-linux.h @@ -23,12 +23,7 @@ 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. ****************************************************************************/ - -#ifndef __CC_STD_C_H__ -#define __CC_STD_C_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_LINUX +#pragma once #include "platform/CCPlatformMacros.h" @@ -50,7 +45,3 @@ THE SOFTWARE. #ifndef MAX #define MAX(x,y) (((x) < (y)) ? (y) : (x)) #endif // MAX - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_LINUX - -#endif // __CC_STD_C_H__ diff --git a/cocos/platform/mac/CCApplication-mac.h b/cocos/platform/mac/CCApplication-mac.h index d1ead6e6a2..ac5fe5790f 100644 --- a/cocos/platform/mac/CCApplication-mac.h +++ b/cocos/platform/mac/CCApplication-mac.h @@ -23,9 +23,7 @@ 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. ****************************************************************************/ - -#ifndef __CC_APPLICATION_MAC_H__ -#define __CC_APPLICATION_MAC_H__ +#pragma once #include "platform/CCCommon.h" #include "platform/CCApplicationProtocol.h" @@ -107,5 +105,3 @@ protected: }; NS_CC_END - -#endif // end of __CC_APPLICATION_MAC_H__; diff --git a/cocos/platform/mac/CCCommon-mac.mm b/cocos/platform/mac/CCCommon-mac.mm index c196b25a58..3ce527eb52 100644 --- a/cocos/platform/mac/CCCommon-mac.mm +++ b/cocos/platform/mac/CCCommon-mac.mm @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_MAC - #include "platform/CCCommon.h" #include "base/CCDirector.h" @@ -60,5 +56,3 @@ void ccMessageBox(const char * msg, const char * title) } NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_MAC diff --git a/cocos/platform/mac/CCDevice-mac.mm b/cocos/platform/mac/CCDevice-mac.mm index f0017a97b8..d78ee99c4b 100644 --- a/cocos/platform/mac/CCDevice-mac.mm +++ b/cocos/platform/mac/CCDevice-mac.mm @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_MAC - #include "platform/CCDevice.h" #include #include @@ -368,5 +364,3 @@ void Device::vibrate(float duration) } NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_MAC diff --git a/cocos/platform/mac/CCGL-mac.h b/cocos/platform/mac/CCGL-mac.h deleted file mode 100644 index 173c8a0640..0000000000 --- a/cocos/platform/mac/CCGL-mac.h +++ /dev/null @@ -1,39 +0,0 @@ -/**************************************************************************** -Copyright (c) 2010-2012 cocos2d-x.org -Copyright (c) 2013-2016 Chukong Technologies Inc. -Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. - -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. -****************************************************************************/ - -#ifndef __PLATFORM_MAC_CCGL_H__ -#define __PLATFORM_MAC_CCGL_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_MAC - -#import -#import -#import - -#endif // __PLATFORM_MAC_CCGL_H__ - -#endif //s CC_TARGET_PLATFORM == CC_PLATFORM_MAC diff --git a/cocos/platform/mac/CCGLViewImpl-mac.h b/cocos/platform/mac/CCGLViewImpl-mac.h index 8b66861d54..fa18d77d85 100644 --- a/cocos/platform/mac/CCGLViewImpl-mac.h +++ b/cocos/platform/mac/CCGLViewImpl-mac.h @@ -23,9 +23,7 @@ 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. ****************************************************************************/ - -#ifndef __CC_EGLViewIMPL_DESKTOP_H__ -#define __CC_EGLViewIMPL_DESKTOP_H__ +#pragma once #include "base/CCRef.h" #include "platform/CCCommon.h" @@ -260,5 +258,3 @@ private: }; NS_CC_END // end of namespace cocos2d - -#endif // end of __CC_EGLViewImpl_DESKTOP_H__ diff --git a/cocos/platform/mac/CCGLViewImpl-mac.mm b/cocos/platform/mac/CCGLViewImpl-mac.mm index 699b28acf6..04d1ee127e 100644 --- a/cocos/platform/mac/CCGLViewImpl-mac.mm +++ b/cocos/platform/mac/CCGLViewImpl-mac.mm @@ -23,7 +23,6 @@ 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 "platform/desktop/CCGLViewImpl-desktop.h" #include diff --git a/cocos/platform/mac/CCStdC-mac.h b/cocos/platform/mac/CCStdC-mac.h index 11c4d93504..774fa33fb7 100644 --- a/cocos/platform/mac/CCStdC-mac.h +++ b/cocos/platform/mac/CCStdC-mac.h @@ -23,12 +23,7 @@ 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. ****************************************************************************/ - -#ifndef __CC_STD_C_H__ -#define __CC_STD_C_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_MAC +#pragma once #include "platform/CCPlatformMacros.h" #include @@ -48,7 +43,3 @@ THE SOFTWARE. #ifndef MAX #define MAX(x,y) (((x) < (y)) ? (y) : (x)) #endif // MAX - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_MAC - -#endif // __CC_STD_C_H__ diff --git a/cocos/platform/win32/CCApplication-win32.cpp b/cocos/platform/win32/CCApplication-win32.cpp index 4cbf115005..7b23dcab32 100644 --- a/cocos/platform/win32/CCApplication-win32.cpp +++ b/cocos/platform/win32/CCApplication-win32.cpp @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 - #include "platform/CCApplication.h" #include "base/CCDirector.h" #include @@ -362,5 +358,3 @@ static void PVRFrameEnableControlWindow(bool bEnable) RegCloseKey(hKey); } - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 diff --git a/cocos/platform/win32/CCApplication-win32.h b/cocos/platform/win32/CCApplication-win32.h index 66f53613dd..d750fe77be 100644 --- a/cocos/platform/win32/CCApplication-win32.h +++ b/cocos/platform/win32/CCApplication-win32.h @@ -24,8 +24,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ #pragma once -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 #include "platform/CCStdC.h" #include "platform/CCCommon.h" @@ -34,8 +32,6 @@ THE SOFTWARE. NS_CC_BEGIN -class Rect; - class CC_DLL Application : public ApplicationProtocol { public: @@ -114,5 +110,3 @@ protected: }; NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 diff --git a/cocos/platform/win32/CCCommon-win32.cpp b/cocos/platform/win32/CCCommon-win32.cpp index 344676c51f..2dee5fcc15 100644 --- a/cocos/platform/win32/CCCommon-win32.cpp +++ b/cocos/platform/win32/CCCommon-win32.cpp @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 - #include "platform/CCCommon.h" #include "platform/CCStdC.h" #include "platform/win32/CCUtils-win32.h" @@ -51,5 +47,3 @@ void LuaLog(const char *pszMsg) } NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 diff --git a/cocos/platform/win32/CCDevice-win32.cpp b/cocos/platform/win32/CCDevice-win32.cpp index c025243a15..1a2cb3e42c 100644 --- a/cocos/platform/win32/CCDevice-win32.cpp +++ b/cocos/platform/win32/CCDevice-win32.cpp @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 - #include "platform/CCDevice.h" #include "platform/CCFileUtils.h" #include "platform/CCStdC.h" @@ -557,5 +553,3 @@ void Device::vibrate(float duration) } NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 \ No newline at end of file diff --git a/cocos/platform/win32/CCFileUtils-win32.cpp b/cocos/platform/win32/CCFileUtils-win32.cpp index d0cc12ebae..d3e599c725 100644 --- a/cocos/platform/win32/CCFileUtils-win32.cpp +++ b/cocos/platform/win32/CCFileUtils-win32.cpp @@ -23,10 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 - #include "platform/win32/CCFileUtils-win32.h" #include "platform/win32/CCUtils-win32.h" #include "platform/CCCommon.h" @@ -535,5 +531,3 @@ bool FileUtilsWin32::removeDirectory(const std::string& dirPath) const } NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 diff --git a/cocos/platform/win32/CCFileUtils-win32.h b/cocos/platform/win32/CCFileUtils-win32.h index d1c2fccbef..b64cab3b2c 100644 --- a/cocos/platform/win32/CCFileUtils-win32.h +++ b/cocos/platform/win32/CCFileUtils-win32.h @@ -23,11 +23,7 @@ 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. ****************************************************************************/ -#ifndef __CC_FILEUTILS_WIN32_H__ -#define __CC_FILEUTILS_WIN32_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 +#pragma once #include "platform/CCFileUtils.h" #include "platform/CCPlatformMacros.h" @@ -157,7 +153,3 @@ protected: /// @} NS_CC_END - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 - -#endif // __CC_FILEUTILS_WIN32_H__ diff --git a/cocos/platform/win32/CCGL-win32.h b/cocos/platform/win32/CCGL-win32.h index 7a5fbccb8b..60d5023b6f 100644 --- a/cocos/platform/win32/CCGL-win32.h +++ b/cocos/platform/win32/CCGL-win32.h @@ -23,17 +23,8 @@ 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. ****************************************************************************/ - -#ifndef __CCGL_H__ -#define __CCGL_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 +#pragma once #include "GL/glew.h" #define CC_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8 - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 - -#endif // __CCGL_H__ diff --git a/cocos/platform/win32/CCPlatformDefine-win32.h b/cocos/platform/win32/CCPlatformDefine-win32.h index 81f9dc8a0a..12ed25a63b 100644 --- a/cocos/platform/win32/CCPlatformDefine-win32.h +++ b/cocos/platform/win32/CCPlatformDefine-win32.h @@ -25,9 +25,6 @@ THE SOFTWARE. ****************************************************************************/ #pragma once -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 - #ifdef __MINGW32__ #include #endif @@ -59,6 +56,3 @@ THE SOFTWARE. #define NULL ((void *)0) #endif #endif - -#endif //s CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 - diff --git a/cocos/platform/win32/CCStdC-win32.cpp b/cocos/platform/win32/CCStdC-win32.cpp index 431c53d341..68f46b3a05 100644 --- a/cocos/platform/win32/CCStdC-win32.cpp +++ b/cocos/platform/win32/CCStdC-win32.cpp @@ -23,11 +23,6 @@ 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 "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 - #include "platform/CCStdC.h" #ifndef __MINGW32__ @@ -50,5 +45,3 @@ int gettimeofday(struct timeval * val, struct timezone *) NS_CC_END #endif // __MINGW32__ - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 diff --git a/cocos/platform/win32/CCStdC-win32.h b/cocos/platform/win32/CCStdC-win32.h index 088dae43d4..45114e8682 100644 --- a/cocos/platform/win32/CCStdC-win32.h +++ b/cocos/platform/win32/CCStdC-win32.h @@ -23,12 +23,7 @@ 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. ****************************************************************************/ - -#ifndef __CC_STD_C_H__ -#define __CC_STD_C_H__ - -#include "platform/CCPlatformConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 +#pragma once #include #ifndef __SSIZE_T @@ -157,10 +152,3 @@ inline errno_t strcpy_s(char *strDestination, size_t numberOfElements, #undef min #undef max - -#endif // CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 - -#endif // __CC_STD_C_H__ - - - diff --git a/cocos/platform/win32/CCUtils-win32.h b/cocos/platform/win32/CCUtils-win32.h index 92795a1ad1..6f5d9a8185 100644 --- a/cocos/platform/win32/CCUtils-win32.h +++ b/cocos/platform/win32/CCUtils-win32.h @@ -23,9 +23,7 @@ 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. ****************************************************************************/ - -#ifndef __CC_UTILS_WIN32_H__ -#define __CC_UTILS_WIN32_H__ +#pragma once #include "platform/CCPlatformMacros.h" @@ -38,5 +36,3 @@ std::string CC_DLL StringWideCharToUtf8(const std::wstring& strWideChar); std::string CC_DLL UTF8StringToMultiByte(const std::string& strUtf8); NS_CC_END - -#endif // __CC_UTILS_WIN32_H__ diff --git a/cocos/scripting/deprecated/CCDeprecated.h b/cocos/scripting/deprecated/CCDeprecated.h index 8d9a982030..b7bc73cd01 100644 --- a/cocos/scripting/deprecated/CCDeprecated.h +++ b/cocos/scripting/deprecated/CCDeprecated.h @@ -467,7 +467,7 @@ CC_DEPRECATED_ATTRIBUTE extern const Color3B ccGRAY; CC_DEPRECATED_ATTRIBUTE extern const BlendFunc kCCBlendFuncDisable; -CC_DEPRECATED_ATTRIBUTE static inline Color3B ccc3(GLubyte r, GLubyte g, GLubyte b) +CC_DEPRECATED_ATTRIBUTE static inline Color3B ccc3(uint8_t r, uint8_t g, uint8_t b) { return Color3B(r, g, b); } @@ -478,7 +478,7 @@ CC_DEPRECATED_ATTRIBUTE static inline bool ccc3BEqual(const Color3B &col1, const } CC_DEPRECATED_ATTRIBUTE static inline Color4B -ccc4(const GLubyte r, const GLubyte g, const GLubyte b, const GLubyte o) +ccc4(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t o) { return Color4B(r, g, b, o); } @@ -489,7 +489,7 @@ CC_DEPRECATED_ATTRIBUTE static inline Color4F ccc4FFromccc3B(Color3B c) } CC_DEPRECATED_ATTRIBUTE static inline Color4F -ccc4f(const GLfloat r, const GLfloat g, const GLfloat b, const GLfloat a) +ccc4f(const float r, const float g, const float b, const float a) { return Color4F(r, g, b, a); } @@ -501,7 +501,7 @@ CC_DEPRECATED_ATTRIBUTE static inline Color4F ccc4FFromccc4B(Color4B c) CC_DEPRECATED_ATTRIBUTE static inline Color4B ccc4BFromccc4F(Color4F c) { - return Color4B((GLubyte)(c.r*255), (GLubyte)(c.g*255), (GLubyte)(c.b*255), (GLubyte)(c.a*255)); + return Color4B((uint8_t)(c.r*255), (uint8_t)(c.g*255), (uint8_t)(c.b*255), (uint8_t)(c.a*255)); } CC_DEPRECATED_ATTRIBUTE static inline bool ccc4FEqual(Color4F a, Color4F b) @@ -1003,9 +1003,9 @@ CC_DEPRECATED_ATTRIBUTE void CC_DLL ccDrawQuadBezier(const Vec2& origin, const V CC_DEPRECATED_ATTRIBUTE void CC_DLL ccDrawCubicBezier(const Vec2& origin, const Vec2& control1, const Vec2& control2, const Vec2& destination, unsigned int segments); CC_DEPRECATED_ATTRIBUTE void CC_DLL ccDrawCatmullRom( PointArray *arrayOfControlPoints, unsigned int segments ); CC_DEPRECATED_ATTRIBUTE void CC_DLL ccDrawCardinalSpline( PointArray *config, float tension, unsigned int segments ); -CC_DEPRECATED_ATTRIBUTE void CC_DLL ccDrawColor4B( GLubyte r, GLubyte g, GLubyte b, GLubyte a ); -CC_DEPRECATED_ATTRIBUTE void CC_DLL ccDrawColor4F( GLfloat r, GLfloat g, GLfloat b, GLfloat a ); -CC_DEPRECATED_ATTRIBUTE void CC_DLL ccPointSize( GLfloat pointSize ); +CC_DEPRECATED_ATTRIBUTE void CC_DLL ccDrawColor4B( uint8_t r, uint8_t g, uint8_t b, uint8_t a ); +CC_DEPRECATED_ATTRIBUTE void CC_DLL ccDrawColor4F( float r, float g, float b, float a ); +CC_DEPRECATED_ATTRIBUTE void CC_DLL ccPointSize( float pointSize ); CC_DEPRECATED_ATTRIBUTE typedef Data CCData; CC_DEPRECATED_ATTRIBUTE typedef __Set CCSet; diff --git a/extensions/Particle3D/CCParticle3DRender.cpp b/extensions/Particle3D/CCParticle3DRender.cpp index 87c7f1e324..e2942e8353 100755 --- a/extensions/Particle3D/CCParticle3DRender.cpp +++ b/extensions/Particle3D/CCParticle3DRender.cpp @@ -22,8 +22,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - #include "extensions/Particle3D/CCParticleSystem3D.h" +#include // offsetof +#include "base/ccTypes.h" #include "extensions/Particle3D/CCParticle3DRender.h" #include "renderer/CCMeshCommand.h" #include "renderer/CCRenderer.h" diff --git a/extensions/Particle3D/PU/CCPUBillboardChain.cpp b/extensions/Particle3D/PU/CCPUBillboardChain.cpp index d0ac619c6f..8515820493 100644 --- a/extensions/Particle3D/PU/CCPUBillboardChain.cpp +++ b/extensions/Particle3D/PU/CCPUBillboardChain.cpp @@ -23,8 +23,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - #include "extensions/Particle3D/PU/CCPUBillboardChain.h" +#include // offsetof +#include "base/ccTypes.h" #include "extensions/Particle3D/PU/CCPUParticleSystem3D.h" #include "base/CCDirector.h" #include "renderer/ccShaders.h" diff --git a/extensions/Particle3D/PU/CCPURender.cpp b/extensions/Particle3D/PU/CCPURender.cpp index 4abee18b34..1b0dea701b 100644 --- a/extensions/Particle3D/PU/CCPURender.cpp +++ b/extensions/Particle3D/PU/CCPURender.cpp @@ -23,8 +23,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - #include "extensions/Particle3D/CCParticleSystem3D.h" +#include // offsetof +#include "base/ccTypes.h" #include "extensions/Particle3D/PU/CCPURender.h" #include "extensions/Particle3D/PU/CCPUParticleSystem3D.h" #include "extensions/Particle3D/PU/CCPUUtil.h" From 09428955c6328433c8cca90f3c714ed3dab9518e Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Wed, 6 Nov 2019 14:42:17 +0800 Subject: [PATCH 79/96] [ci skip][AUTO]: updating luabinding & cocos_file.json automatically (#20295) --- templates/cocos2dx_files.json | 6 ------ 1 file changed, 6 deletions(-) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index 2fe99f2c17..a7de30e283 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -930,8 +930,6 @@ "cocos/platform/apple/CCDevice-apple.mm", "cocos/platform/apple/CCFileUtils-apple.h", "cocos/platform/apple/CCFileUtils-apple.mm", - "cocos/platform/apple/CCLock-apple.cpp", - "cocos/platform/apple/CCLock-apple.h", "cocos/platform/desktop/CCGLViewImpl-desktop.cpp", "cocos/platform/desktop/CCGLViewImpl-desktop.h", "cocos/platform/ios/CCApplication-ios.h", @@ -942,7 +940,6 @@ "cocos/platform/ios/CCDirectorCaller-ios.mm", "cocos/platform/ios/CCEAGLView-ios.h", "cocos/platform/ios/CCEAGLView-ios.mm", - "cocos/platform/ios/CCGL-ios.h", "cocos/platform/ios/CCGLViewImpl-ios.h", "cocos/platform/ios/CCGLViewImpl-ios.mm", "cocos/platform/ios/CCImage-ios.mm", @@ -950,7 +947,6 @@ "cocos/platform/ios/CCInputView-ios.mm", "cocos/platform/ios/CCPlatformDefine-ios.h", "cocos/platform/ios/CCStdC-ios.h", - "cocos/platform/ios/OpenGL_Internal-ios.h", "cocos/platform/ios/cocos2d-prefix.pch", "cocos/platform/linux/CCApplication-linux.cpp", "cocos/platform/linux/CCApplication-linux.h", @@ -960,13 +956,11 @@ "cocos/platform/linux/CCFileUtils-linux.h", "cocos/platform/linux/CCGL-linux.h", "cocos/platform/linux/CCPlatformDefine-linux.h", - "cocos/platform/linux/CCStdC-linux.cpp", "cocos/platform/linux/CCStdC-linux.h", "cocos/platform/mac/CCApplication-mac.h", "cocos/platform/mac/CCApplication-mac.mm", "cocos/platform/mac/CCCommon-mac.mm", "cocos/platform/mac/CCDevice-mac.mm", - "cocos/platform/mac/CCGL-mac.h", "cocos/platform/mac/CCGLViewImpl-mac.h", "cocos/platform/mac/CCGLViewImpl-mac.mm", "cocos/platform/mac/CCPlatformDefine-mac.h", From 0cbaec9f2956881aa9cfe86d78245f556dbc788e Mon Sep 17 00:00:00 2001 From: minggo Date: Wed, 6 Nov 2019 16:10:16 +0800 Subject: [PATCH 80/96] don't set glview transparent, it many cause afterimage (#20298) (#20299) --- .../android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java index 5ff21f46d7..22ad92a365 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java @@ -300,7 +300,8 @@ public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelpe public Cocos2dxGLSurfaceView onCreateView() { Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this); //this line is need on some device if we specify an alpha bits - if(this.mGLContextAttrs[3] > 0) glSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT); + // FIXME: is it needed? And it will cause afterimage. + // if(this.mGLContextAttrs[3] > 0) glSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT); // use custom EGLConfigureChooser Cocos2dxEGLConfigChooser chooser = new Cocos2dxEGLConfigChooser(this.mGLContextAttrs); From afbf817ec07c8f69dcba213f55cc7b77dd96b0a3 Mon Sep 17 00:00:00 2001 From: minggo Date: Wed, 6 Nov 2019 16:11:37 +0800 Subject: [PATCH 81/96] fix testfiled issue on iOS13 (#20296) --- cocos/platform/ios/CCEAGLView-ios.mm | 202 +++++++++++++++++++++++++- cocos/platform/ios/CCInputView-ios.h | 1 - cocos/platform/ios/CCInputView-ios.mm | 169 +-------------------- 3 files changed, 208 insertions(+), 164 deletions(-) diff --git a/cocos/platform/ios/CCEAGLView-ios.mm b/cocos/platform/ios/CCEAGLView-ios.mm index 5729257313..4bb11c25de 100644 --- a/cocos/platform/ios/CCEAGLView-ios.mm +++ b/cocos/platform/ios/CCEAGLView-ios.mm @@ -77,6 +77,9 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. @interface CCEAGLView () @property (nonatomic) CCInputView* textInputView; +@property(nonatomic) BOOL isKeyboardShown; +@property(nonatomic, copy) NSNotification* keyboardShowNotification; +@property(nonatomic, assign) CGRect originalRect; @end @implementation CCEAGLView @@ -84,6 +87,9 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. @synthesize surfaceSize=size_; @synthesize pixelFormat=pixelformat_, depthFormat=depthFormat_; @synthesize multiSampling=multiSampling_; +@synthesize keyboardShowNotification = keyboardShowNotification_; +@synthesize isKeyboardShown; +@synthesize originalRect = originalRect_; + (Class) layerClass { @@ -126,6 +132,8 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. { self.textInputView = [[CCInputView alloc] initWithFrame:frame]; + originalRect_ = self.frame; + self.keyboardShowNotification = nil; if ([self respondsToSelector:@selector(setContentScaleFactor:)]) { self.contentScaleFactor = [[UIScreen mainScreen] scale]; @@ -341,16 +349,206 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. -(BOOL) isKeyboardShown { - return [self.textInputView isKeyboardShown]; + return self.isKeyboardShown; } -(void) doAnimationWhenKeyboardMoveWithDuration:(float) duration distance:(float) dis { - + [UIView beginAnimations:nil context:nullptr]; + [UIView setAnimationDelegate:self]; + [UIView setAnimationDuration:duration]; + [UIView setAnimationBeginsFromCurrentState:YES]; + + //NSLog(@"[animation] dis = %f, scale = %f \n", dis, cocos2d::GLView::getInstance()->getScaleY()); + + if (dis < 0.0f) dis = 0.0f; + + auto glview = cocos2d::Director::getInstance()->getOpenGLView(); + dis *= glview->getScaleY(); + + dis /= self.contentScaleFactor; + + #if defined(CC_TARGET_OS_TVOS) + self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y - dis, originalRect_.size.width, originalRect_.size.height); + #else + switch (getFixedOrientation([[UIApplication sharedApplication] statusBarOrientation])) + { + case UIInterfaceOrientationPortrait: + self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y - dis, originalRect_.size.width, originalRect_.size.height); + break; + + case UIInterfaceOrientationPortraitUpsideDown: + self.frame = CGRectMake(originalRect_.origin.x, originalRect_.origin.y + dis, originalRect_.size.width, originalRect_.size.height); + break; + + case UIInterfaceOrientationLandscapeLeft: + self.frame = CGRectMake(originalRect_.origin.x - dis, originalRect_.origin.y , originalRect_.size.width, originalRect_.size.height); + break; + + case UIInterfaceOrientationLandscapeRight: + self.frame = CGRectMake(originalRect_.origin.x + dis, originalRect_.origin.y , originalRect_.size.width, originalRect_.size.height); + break; + + default: + break; + } + #endif + + [UIView commitAnimations]; } -(void) doAnimationWhenAnotherEditBeClicked { + if (self.keyboardShowNotification != nil) + { + [[NSNotificationCenter defaultCenter]postNotification:self.keyboardShowNotification]; + } +} + +#pragma UIKeyboard notification + +#if !defined(CC_TARGET_OS_TVOS) +namespace { + UIInterfaceOrientation getFixedOrientation(UIInterfaceOrientation statusBarOrientation) + { + if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) + { + statusBarOrientation = UIInterfaceOrientationPortrait; + } + return statusBarOrientation; + } +} +#endif + +- (void)didMoveToWindow +{ +#if !defined(CC_TARGET_OS_TVOS) + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(onUIKeyboardNotification:) + name:UIKeyboardWillShowNotification object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(onUIKeyboardNotification:) + name:UIKeyboardDidShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(onUIKeyboardNotification:) + name:UIKeyboardWillHideNotification object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(onUIKeyboardNotification:) + name:UIKeyboardDidHideNotification object:nil]; +#endif +} + +- (void)onUIKeyboardNotification:(NSNotification *)notif +{ + NSString * type = notif.name; + + NSDictionary* info = [notif userInfo]; + CGRect begin = [self convertRect: + [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] + fromView:self]; + CGRect end = [self convertRect: + [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] + fromView:self]; + double aniDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; + + CGSize viewSize = self.frame.size; + + CGFloat tmp; + switch (getFixedOrientation([[UIApplication sharedApplication] statusBarOrientation])) + { + case UIInterfaceOrientationPortrait: + begin.origin.y = viewSize.height - begin.origin.y - begin.size.height; + end.origin.y = viewSize.height - end.origin.y - end.size.height; + break; + + case UIInterfaceOrientationPortraitUpsideDown: + begin.origin.x = viewSize.width - (begin.origin.x + begin.size.width); + end.origin.x = viewSize.width - (end.origin.x + end.size.width); + break; + + case UIInterfaceOrientationLandscapeLeft: + std::swap(begin.size.width, begin.size.height); + std::swap(end.size.width, end.size.height); + std::swap(viewSize.width, viewSize.height); + + tmp = begin.origin.x; + begin.origin.x = begin.origin.y; + begin.origin.y = viewSize.height - tmp - begin.size.height; + tmp = end.origin.x; + end.origin.x = end.origin.y; + end.origin.y = viewSize.height - tmp - end.size.height; + break; + + case UIInterfaceOrientationLandscapeRight: + std::swap(begin.size.width, begin.size.height); + std::swap(end.size.width, end.size.height); + std::swap(viewSize.width, viewSize.height); + + tmp = begin.origin.x; + begin.origin.x = begin.origin.y; + begin.origin.y = tmp; + tmp = end.origin.x; + end.origin.x = end.origin.y; + end.origin.y = tmp; + break; + + default: + break; + } + + auto glview = cocos2d::Director::getInstance()->getOpenGLView(); + float scaleX = glview->getScaleX(); + float scaleY = glview->getScaleY(); + + // Convert to pixel coordinate + begin = CGRectApplyAffineTransform(begin, CGAffineTransformScale(CGAffineTransformIdentity, self.contentScaleFactor, self.contentScaleFactor)); + end = CGRectApplyAffineTransform(end, CGAffineTransformScale(CGAffineTransformIdentity, self.contentScaleFactor, self.contentScaleFactor)); + + float offestY = glview->getViewPortRect().origin.y; + if (offestY < 0.0f) + { + begin.origin.y += offestY; + begin.size.height -= offestY; + end.size.height -= offestY; + } + + // Convert to design coordinate + begin = CGRectApplyAffineTransform(begin, CGAffineTransformScale(CGAffineTransformIdentity, 1.0f/scaleX, 1.0f/scaleY)); + end = CGRectApplyAffineTransform(end, CGAffineTransformScale(CGAffineTransformIdentity, 1.0f/scaleX, 1.0f/scaleY)); + + + cocos2d::IMEKeyboardNotificationInfo notiInfo; + notiInfo.begin = cocos2d::Rect(begin.origin.x, + begin.origin.y, + begin.size.width, + begin.size.height); + notiInfo.end = cocos2d::Rect(end.origin.x, + end.origin.y, + end.size.width, + end.size.height); + notiInfo.duration = (float)aniDuration; + + cocos2d::IMEDispatcher* dispatcher = cocos2d::IMEDispatcher::sharedDispatcher(); + if (UIKeyboardWillShowNotification == type) + { + dispatcher->dispatchKeyboardWillShow(notiInfo); + } + else if (UIKeyboardDidShowNotification == type) + { + self.isKeyboardShown = YES; + dispatcher->dispatchKeyboardDidShow(notiInfo); + } + else if (UIKeyboardWillHideNotification == type) + { + dispatcher->dispatchKeyboardWillHide(notiInfo); + } + else if (UIKeyboardDidHideNotification == type) + { + self.isKeyboardShown = NO; + dispatcher->dispatchKeyboardDidHide(notiInfo); + } } @end diff --git a/cocos/platform/ios/CCInputView-ios.h b/cocos/platform/ios/CCInputView-ios.h index 3b9e43ef2d..fa55f88546 100644 --- a/cocos/platform/ios/CCInputView-ios.h +++ b/cocos/platform/ios/CCInputView-ios.h @@ -24,5 +24,4 @@ THE SOFTWARE. #import @interface CCInputView : UIView -@property(nonatomic) BOOL isKeyboardShown; @end diff --git a/cocos/platform/ios/CCInputView-ios.mm b/cocos/platform/ios/CCInputView-ios.mm index 4552a5feb1..1293e4536c 100644 --- a/cocos/platform/ios/CCInputView-ios.mm +++ b/cocos/platform/ios/CCInputView-ios.mm @@ -34,10 +34,7 @@ THE SOFTWARE. @implementation CCInputView @synthesize myMarkedText; -@synthesize isKeyboardShown; - @synthesize hasText; -@synthesize selectedTextRange; @synthesize beginningOfDocument; @synthesize endOfDocument; @synthesize markedTextStyle; @@ -60,26 +57,6 @@ THE SOFTWARE. [super dealloc]; } -- (void)didMoveToWindow -{ -#if !defined(CC_TARGET_OS_TVOS) - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(onUIKeyboardNotification:) - name:UIKeyboardWillShowNotification object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(onUIKeyboardNotification:) - name:UIKeyboardDidShowNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(onUIKeyboardNotification:) - name:UIKeyboardWillHideNotification object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(onUIKeyboardNotification:) - name:UIKeyboardDidHideNotification object:nil]; -#endif -} - - (BOOL) canBecomeFirstResponder { return YES; } @@ -101,6 +78,14 @@ THE SOFTWARE. } +- (void)setSelectedTextRange:(UITextRange *)aSelectedTextRange { + CCLOG("UITextRange:setSelectedTextRange"); +} + +- (UITextRange *)selectedTextRange { + return [[[UITextRange alloc] init] autorelease]; +} + - (void)deleteBackward { if (nil != self.myMarkedText) { [self.myMarkedText release]; @@ -238,144 +223,6 @@ THE SOFTWARE. } - (void)encodeWithCoder:(nonnull NSCoder *)coder { - -} - -#pragma UIKeyboard notification - -#if !defined(CC_TARGET_OS_TVOS) -namespace { - UIInterfaceOrientation getFixedOrientation(UIInterfaceOrientation statusBarOrientation) - { - if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) - { - statusBarOrientation = UIInterfaceOrientationPortrait; - } - return statusBarOrientation; - } -} -#endif - -- (void)onUIKeyboardNotification:(NSNotification *)notif -{ - NSString * type = notif.name; - - NSDictionary* info = [notif userInfo]; - CGRect begin = [self convertRect: - [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] - fromView:self]; - CGRect end = [self convertRect: - [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] - fromView:self]; - double aniDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - - CGSize viewSize = self.frame.size; - - CGFloat tmp; - UIInterfaceOrientation orientation; - if (@available(iOS 13.0, *)) - { - orientation = [[[UIApplication sharedApplication].windows[0] windowScene] interfaceOrientation]; - } - else - { - // Fallback on earlier versions - orientation = [[UIApplication sharedApplication] statusBarOrientation]; - } - switch(orientation) - { - case UIInterfaceOrientationPortrait: - begin.origin.y = viewSize.height - begin.origin.y - begin.size.height; - end.origin.y = viewSize.height - end.origin.y - end.size.height; - break; - - case UIInterfaceOrientationPortraitUpsideDown: - begin.origin.x = viewSize.width - (begin.origin.x + begin.size.width); - end.origin.x = viewSize.width - (end.origin.x + end.size.width); - break; - - case UIInterfaceOrientationLandscapeLeft: - std::swap(begin.size.width, begin.size.height); - std::swap(end.size.width, end.size.height); - std::swap(viewSize.width, viewSize.height); - - tmp = begin.origin.x; - begin.origin.x = begin.origin.y; - begin.origin.y = viewSize.height - tmp - begin.size.height; - tmp = end.origin.x; - end.origin.x = end.origin.y; - end.origin.y = viewSize.height - tmp - end.size.height; - break; - - case UIInterfaceOrientationLandscapeRight: - std::swap(begin.size.width, begin.size.height); - std::swap(end.size.width, end.size.height); - std::swap(viewSize.width, viewSize.height); - - tmp = begin.origin.x; - begin.origin.x = begin.origin.y; - begin.origin.y = tmp; - tmp = end.origin.x; - end.origin.x = end.origin.y; - end.origin.y = tmp; - break; - - default: - break; - } - - auto glview = cocos2d::Director::getInstance()->getOpenGLView(); - float scaleX = glview->getScaleX(); - float scaleY = glview->getScaleY(); - - // Convert to pixel coordinate - begin = CGRectApplyAffineTransform(begin, CGAffineTransformScale(CGAffineTransformIdentity, self.contentScaleFactor, self.contentScaleFactor)); - end = CGRectApplyAffineTransform(end, CGAffineTransformScale(CGAffineTransformIdentity, self.contentScaleFactor, self.contentScaleFactor)); - - float offestY = glview->getViewPortRect().origin.y; - if (offestY < 0.0f) - { - begin.origin.y += offestY; - begin.size.height -= offestY; - end.size.height -= offestY; - } - - // Convert to design coordinate - begin = CGRectApplyAffineTransform(begin, CGAffineTransformScale(CGAffineTransformIdentity, 1.0f/scaleX, 1.0f/scaleY)); - end = CGRectApplyAffineTransform(end, CGAffineTransformScale(CGAffineTransformIdentity, 1.0f/scaleX, 1.0f/scaleY)); - - - cocos2d::IMEKeyboardNotificationInfo notiInfo; - notiInfo.begin = cocos2d::Rect(begin.origin.x, - begin.origin.y, - begin.size.width, - begin.size.height); - notiInfo.end = cocos2d::Rect(end.origin.x, - end.origin.y, - end.size.width, - end.size.height); - notiInfo.duration = (float)aniDuration; - - cocos2d::IMEDispatcher* dispatcher = cocos2d::IMEDispatcher::sharedDispatcher(); - if (UIKeyboardWillShowNotification == type) - { - dispatcher->dispatchKeyboardWillShow(notiInfo); - } - else if (UIKeyboardDidShowNotification == type) - { - //CGSize screenSize = self.window.screen.bounds.size; - self.isKeyboardShown = YES; - dispatcher->dispatchKeyboardDidShow(notiInfo); - } - else if (UIKeyboardWillHideNotification == type) - { - dispatcher->dispatchKeyboardWillHide(notiInfo); - } - else if (UIKeyboardDidHideNotification == type) - { - self.isKeyboardShown = NO; - dispatcher->dispatchKeyboardDidHide(notiInfo); - } } @end From 292e4c3b4d7227fa0c7df4e78ca03011b696f5fe Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Wed, 6 Nov 2019 16:25:30 +0800 Subject: [PATCH 82/96] fix effect test (#20286) --- cocos/2d/CCActionTiledGrid.cpp | 8 ++++---- cocos/2d/CCGrid.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cocos/2d/CCActionTiledGrid.cpp b/cocos/2d/CCActionTiledGrid.cpp index 3faae36bd8..3e624729f2 100644 --- a/cocos/2d/CCActionTiledGrid.cpp +++ b/cocos/2d/CCActionTiledGrid.cpp @@ -243,11 +243,11 @@ void ShuffleTiles::shuffle(unsigned int *array, unsigned int len) Size ShuffleTiles::getDelta(const Size& pos) const { unsigned int idx = static_cast(pos.width * _gridSize.height + pos.height); + Vec2 pos2; + pos2.x = (float)(_tilesOrder[idx] / (int)_gridSize.height); + pos2.y = (float)(_tilesOrder[idx] % (int)_gridSize.height); - float x = _tilesOrder[idx] / (_gridSize.height - pos.width); - float y = (float)(_tilesOrder[idx] % (int)(_gridSize.height - pos.height)); - - return Size(x, y); + return Size((int)(pos2.x - pos.width), (int)(pos2.y - pos.height)); } void ShuffleTiles::placeTile(const Vec2& pos, Tile *t) diff --git a/cocos/2d/CCGrid.cpp b/cocos/2d/CCGrid.cpp index c63b10fa9d..3517a0b3a1 100644 --- a/cocos/2d/CCGrid.cpp +++ b/cocos/2d/CCGrid.cpp @@ -811,7 +811,7 @@ void TiledGrid3D::updateVertexAndTexCoordinate() memcpy((char*)_vertexBuffer + offset, &tempVecPointer[i], sizeof(Vec3)); memcpy((char*)_vertexBuffer + offset + sizeof(Vec3), &tempTexPointer[i], sizeof(Vec2)); } - _drawCommand.createVertexBuffer((unsigned int)(sizeof(Vec3) + sizeof(Vec2) ), numOfPoints, CustomCommand::BufferUsage::DYNAMIC); + _drawCommand.createVertexBuffer((sizeof(Vec3) + sizeof(Vec2) ), numOfPoints, CustomCommand::BufferUsage::DYNAMIC); _drawCommand.updateVertexBuffer(_vertexBuffer, numOfPoints * sizeof(Vec3) + numOfPoints * sizeof(Vec2)); _drawCommand.createIndexBuffer(CustomCommand::IndexFormat::U_SHORT, gradSize * 6, CustomCommand::BufferUsage::DYNAMIC); From 98ab6d23b65436e808aa9b82e86cd0e79910f6a6 Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 8 Nov 2019 10:30:51 +0800 Subject: [PATCH 83/96] set iOS default deployment version in correct place (#20307) --- templates/cpp-template-default/CMakeLists.txt | 4 ++-- tests/lua-empty-test/project/CMakeLists.txt | 4 ++-- tests/lua-tests/project/CMakeLists.txt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/templates/cpp-template-default/CMakeLists.txt b/templates/cpp-template-default/CMakeLists.txt index e842335e8f..855de970b3 100644 --- a/templates/cpp-template-default/CMakeLists.txt +++ b/templates/cpp-template-default/CMakeLists.txt @@ -27,14 +27,14 @@ cmake_minimum_required(VERSION 3.6) set(APP_NAME HelloCpp) +project(${APP_NAME}) + if(XCODE) if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) SET (CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 8.0) endif() endif() -project(${APP_NAME}) - if(NOT DEFINED BUILD_ENGINE_DONE) # to test HelloCpp into root project set(COCOS2DX_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cocos2d) set(CMAKE_MODULE_PATH ${COCOS2DX_ROOT_PATH}/cmake/Modules/) diff --git a/tests/lua-empty-test/project/CMakeLists.txt b/tests/lua-empty-test/project/CMakeLists.txt index 88cb012549..549178f185 100644 --- a/tests/lua-empty-test/project/CMakeLists.txt +++ b/tests/lua-empty-test/project/CMakeLists.txt @@ -2,14 +2,14 @@ cmake_minimum_required(VERSION 3.6) set(APP_NAME lua-empty-test) +project(${APP_NAME}) + if(XCODE) if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) SET (CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 8.0) endif() endif() -project(${APP_NAME}) - if(NOT DEFINED BUILD_ENGINE_DONE) set(COCOS2DX_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../..) set(CMAKE_MODULE_PATH ${COCOS2DX_ROOT_PATH}/cmake/Modules/) diff --git a/tests/lua-tests/project/CMakeLists.txt b/tests/lua-tests/project/CMakeLists.txt index 15ebecd0bd..d74fc2b35b 100644 --- a/tests/lua-tests/project/CMakeLists.txt +++ b/tests/lua-tests/project/CMakeLists.txt @@ -2,14 +2,14 @@ cmake_minimum_required(VERSION 3.6) set(APP_NAME lua-tests) +project(${APP_NAME}) + if(XCODE) if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) SET (CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 8.0) endif() endif() -project(${APP_NAME}) - if(NOT DEFINED BUILD_ENGINE_DONE) set(COCOS2DX_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../..) set(CMAKE_MODULE_PATH ${COCOS2DX_ROOT_PATH}/cmake/Modules/) From 3aa7a73df24ac442757c5f2120b3aba03affae42 Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 8 Nov 2019 11:03:12 +0800 Subject: [PATCH 84/96] Sync 20303 (#20308) * fix infinite loop * fix issue that touch event does not match If click area ouside keyboard, then engine only receive touch begin event witouth touch end or touch cancled event. --- cocos/platform/ios/CCEAGLView-ios.h | 2 +- cocos/platform/ios/CCEAGLView-ios.mm | 7 +------ cocos/platform/ios/CCInputView-ios.mm | 3 +-- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/cocos/platform/ios/CCEAGLView-ios.h b/cocos/platform/ios/CCEAGLView-ios.h index 655162a526..ae12b00b2b 100644 --- a/cocos/platform/ios/CCEAGLView-ios.h +++ b/cocos/platform/ios/CCEAGLView-ios.h @@ -109,6 +109,7 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. @property(nonatomic,readonly) CGSize surfaceSize; @property(nonatomic,readwrite) BOOL multiSampling; +@property(nonatomic, readonly) BOOL isKeyboardShown; /** CCEAGLView uses double-buffer. This method swaps the buffers */ @@ -125,5 +126,4 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. -(void) showKeyboard; -(void) hideKeyboard; --(BOOL) isKeyboardShown; @end diff --git a/cocos/platform/ios/CCEAGLView-ios.mm b/cocos/platform/ios/CCEAGLView-ios.mm index 4bb11c25de..9e4532cab1 100644 --- a/cocos/platform/ios/CCEAGLView-ios.mm +++ b/cocos/platform/ios/CCEAGLView-ios.mm @@ -77,7 +77,7 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. @interface CCEAGLView () @property (nonatomic) CCInputView* textInputView; -@property(nonatomic) BOOL isKeyboardShown; +@property(nonatomic, readwrite, assign) BOOL isKeyboardShown; @property(nonatomic, copy) NSNotification* keyboardShowNotification; @property(nonatomic, assign) CGRect originalRect; @end @@ -347,11 +347,6 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. [self.textInputView removeFromSuperview]; } --(BOOL) isKeyboardShown -{ - return self.isKeyboardShown; -} - -(void) doAnimationWhenKeyboardMoveWithDuration:(float) duration distance:(float) dis { [UIView beginAnimations:nil context:nullptr]; diff --git a/cocos/platform/ios/CCInputView-ios.mm b/cocos/platform/ios/CCInputView-ios.mm index 1293e4536c..8b131d54f5 100644 --- a/cocos/platform/ios/CCInputView-ios.mm +++ b/cocos/platform/ios/CCInputView-ios.mm @@ -61,13 +61,12 @@ THE SOFTWARE. return YES; } -- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self resignFirstResponder]; [self removeFromSuperview]; } - #pragma TextInput protocol - (id)inputDelegate { From 48239ee16036f3e363a2ac1544c04dbbca2a234c Mon Sep 17 00:00:00 2001 From: Arnold <40414978+PatriceJiang@users.noreply.github.com> Date: Fri, 8 Nov 2019 16:29:04 +0800 Subject: [PATCH 85/96] update external (#20310) --- external/config.json | 2 +- tools/cocos2d-console | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/external/config.json b/external/config.json index fcfe4f3b1d..991e93f1ad 100644 --- a/external/config.json +++ b/external/config.json @@ -1,5 +1,5 @@ { - "version": "metal-support-19", + "version": "metal-support-21", "zip_file_size": "146254799", "repo_name": "cocos2d-x-3rd-party-libs-bin", "repo_parent": "https://github.com/cocos2d/", diff --git a/tools/cocos2d-console b/tools/cocos2d-console index 707bc5c28a..96768f3371 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 707bc5c28a0bda926612421ed636501c10c60319 +Subproject commit 96768f3371cff6545daed79b0c6d4a9ee5cc4b8e From 4d16f313db450c98417f944befdec7de7e5a6dc3 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Fri, 8 Nov 2019 16:47:35 +0800 Subject: [PATCH 86/96] [ci skip][AUTO]: updating luabinding & cocos_file.json automatically (#20311) --- templates/cocos2dx_files.json | 57 ----------------------------------- 1 file changed, 57 deletions(-) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index a7de30e283..0d5a48b29d 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -3956,63 +3956,6 @@ "external/lua/cjson/lua_cjson.h", "external/lua/cjson/strbuf.c", "external/lua/cjson/strbuf.h", - "external/lua/lua/Android.mk", - "external/lua/lua/CMakeLists.txt", - "external/lua/lua/lapi.c", - "external/lua/lua/lapi.h", - "external/lua/lua/lauxlib.c", - "external/lua/lua/lauxlib.h", - "external/lua/lua/lbaselib.c", - "external/lua/lua/lcode.c", - "external/lua/lua/lcode.h", - "external/lua/lua/ldblib.c", - "external/lua/lua/ldebug.c", - "external/lua/lua/ldebug.h", - "external/lua/lua/ldo.c", - "external/lua/lua/ldo.h", - "external/lua/lua/ldump.c", - "external/lua/lua/lfunc.c", - "external/lua/lua/lfunc.h", - "external/lua/lua/lgc.c", - "external/lua/lua/lgc.h", - "external/lua/lua/linit.c", - "external/lua/lua/liolib.c", - "external/lua/lua/llex.c", - "external/lua/lua/llex.h", - "external/lua/lua/llimits.h", - "external/lua/lua/lmathlib.c", - "external/lua/lua/lmem.c", - "external/lua/lua/lmem.h", - "external/lua/lua/loadlib.c", - "external/lua/lua/lobject.c", - "external/lua/lua/lobject.h", - "external/lua/lua/lopcodes.c", - "external/lua/lua/lopcodes.h", - "external/lua/lua/loslib.c", - "external/lua/lua/lparser.c", - "external/lua/lua/lparser.h", - "external/lua/lua/lstate.c", - "external/lua/lua/lstate.h", - "external/lua/lua/lstring.c", - "external/lua/lua/lstring.h", - "external/lua/lua/lstrlib.c", - "external/lua/lua/ltable.c", - "external/lua/lua/ltable.h", - "external/lua/lua/ltablib.c", - "external/lua/lua/ltm.c", - "external/lua/lua/ltm.h", - "external/lua/lua/lua.c", - "external/lua/lua/lua.h", - "external/lua/lua/luaconf.h", - "external/lua/lua/lualib.h", - "external/lua/lua/lundump.c", - "external/lua/lua/lundump.h", - "external/lua/lua/lvm.c", - "external/lua/lua/lvm.h", - "external/lua/lua/lzio.c", - "external/lua/lua/lzio.h", - "external/lua/lua/prebuilt/ios/liblua.a", - "external/lua/lua/print.c", "external/lua/luajit/CMakeLists.txt", "external/lua/luajit/include/lauxlib.h", "external/lua/luajit/include/lua.h", From ac305862f47f07c504bde06e0da9ab86be429726 Mon Sep 17 00:00:00 2001 From: CHP Date: Mon, 11 Nov 2019 03:09:50 +0100 Subject: [PATCH 87/96] Support multiple build configurations (#20314) * MINSIZEREL_RELWITHDEBINFO_Support * Remove DEBUG_MODE --- cmake/Modules/CocosBuildSet.cmake | 3 +-- cmake/Modules/CocosConfigDefine.cmake | 14 -------------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/cmake/Modules/CocosBuildSet.cmake b/cmake/Modules/CocosBuildSet.cmake index 738127c270..0c063a4c71 100644 --- a/cmake/Modules/CocosBuildSet.cmake +++ b/cmake/Modules/CocosBuildSet.cmake @@ -22,8 +22,7 @@ message(STATUS "CMAKE_MODULE_PATH:" ${CMAKE_MODULE_PATH}) message(STATUS "PROJECT_BINARY_DIR:" ${PROJECT_BINARY_DIR}) message(STATUS "ENGINE_BINARY_PATH:" ${ENGINE_BINARY_PATH}) -# the default behavior of build module -option(DEBUG_MODE "Debug or Release?" ON) + option(BUILD_LUA_LIBS "Build lua libraries" OFF) # include helper functions diff --git a/cmake/Modules/CocosConfigDefine.cmake b/cmake/Modules/CocosConfigDefine.cmake index 63f2360af7..12f1300aea 100644 --- a/cmake/Modules/CocosConfigDefine.cmake +++ b/cmake/Modules/CocosConfigDefine.cmake @@ -45,20 +45,6 @@ elseif(CMAKE_GENERATOR MATCHES Visual) endif() message(STATUS "CMAKE_GENERATOR: ${CMAKE_GENERATOR}") -if(CMAKE_CONFIGURATION_TYPES) - set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Reset the configurations to what we need" FORCE) - message(STATUS "CMAKE_CONFIGURATION_TYPES: ${CMAKE_CONFIGURATION_TYPES}") -else() - if(NOT CMAKE_BUILD_TYPE) - if(DEBUG_MODE) # build mode, Debug is default value - set(CMAKE_BUILD_TYPE Debug) - else() - set(CMAKE_BUILD_TYPE Release) - endif() - endif() - message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") -endif() - # custom target property for lua/js link define_property(TARGET PROPERTY CC_JS_DEPEND From e03192b48c2c3a765eb358af1524e956f5f7cefc Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 12 Nov 2019 11:29:53 +0800 Subject: [PATCH 88/96] update 3rd bin (#20316) --- external/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/config.json b/external/config.json index 991e93f1ad..507ce0d567 100644 --- a/external/config.json +++ b/external/config.json @@ -1,5 +1,5 @@ { - "version": "metal-support-21", + "version": "metal-support-22", "zip_file_size": "146254799", "repo_name": "cocos2d-x-3rd-party-libs-bin", "repo_parent": "https://github.com/cocos2d/", From 6a53b31d0841e9d4f4394139bc03b660edb771b2 Mon Sep 17 00:00:00 2001 From: Arnold <40414978+PatriceJiang@users.noreply.github.com> Date: Wed, 13 Nov 2019 11:07:52 +0800 Subject: [PATCH 89/96] [bugfix] add pagezero_size link flags (#20321) --- templates/lua-template-default/CMakeLists.txt | 3 +++ tests/lua-empty-test/project/CMakeLists.txt | 3 +++ tests/lua-tests/project/CMakeLists.txt | 3 +++ 3 files changed, 9 insertions(+) diff --git a/templates/lua-template-default/CMakeLists.txt b/templates/lua-template-default/CMakeLists.txt index a972b6582d..4fdf2476b2 100644 --- a/templates/lua-template-default/CMakeLists.txt +++ b/templates/lua-template-default/CMakeLists.txt @@ -132,6 +132,9 @@ if(APPLE) set_target_properties(${APP_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${RUNTIME_SRC_ROOT}/proj.ios_mac/mac/Info.plist" ) + set_target_properties(${APP_NAME} PROPERTIES + LINK_FLAGS "-pagezero_size 10000 -image_base 100000000" + ) elseif(IOS) cocos_pak_xcode(${APP_NAME} INFO_PLIST "${RUNTIME_SRC_ROOT}/proj.ios_mac/ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon") diff --git a/tests/lua-empty-test/project/CMakeLists.txt b/tests/lua-empty-test/project/CMakeLists.txt index 549178f185..98a46bbe6b 100644 --- a/tests/lua-empty-test/project/CMakeLists.txt +++ b/tests/lua-empty-test/project/CMakeLists.txt @@ -108,6 +108,9 @@ if(APPLE) if(MACOSX) set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.mac/Info.plist") + set_target_properties(${APP_NAME} PROPERTIES + LINK_FLAGS "-pagezero_size 10000 -image_base 100000000" + ) elseif(IOS) set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon-${APP_NAME}") diff --git a/tests/lua-tests/project/CMakeLists.txt b/tests/lua-tests/project/CMakeLists.txt index d74fc2b35b..653bbc55b7 100644 --- a/tests/lua-tests/project/CMakeLists.txt +++ b/tests/lua-tests/project/CMakeLists.txt @@ -121,6 +121,9 @@ if(APPLE) if(MACOSX) set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios_mac/mac/Info.plist") + set_target_properties(${APP_NAME} PROPERTIES + LINK_FLAGS "-pagezero_size 10000 -image_base 100000000" + ) elseif(IOS) set_xcode_property(${APP_NAME} INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios_mac/ios/Info.plist") set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon-${APP_NAME}") From facf78a22bc281e9722f7f4235a68801e10b85b2 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Wed, 13 Nov 2019 17:46:40 +0800 Subject: [PATCH 90/96] add opengl header since Texture2D and Image will use opengl define (#20322) * add opengl header since Texture2D and Image will use opengl define * update review --- cocos/platform/CCImage.cpp | 1 + cocos/renderer/CCTexture2D.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/cocos/platform/CCImage.cpp b/cocos/platform/CCImage.cpp index fa35748a28..5fdc3a3dc3 100644 --- a/cocos/platform/CCImage.cpp +++ b/cocos/platform/CCImage.cpp @@ -32,6 +32,7 @@ THE SOFTWARE. #include "base/CCData.h" #include "base/ccConfig.h" // CC_USE_JPEG, CC_USE_WEBP +#include "platform/CCGL.h" extern "C" { diff --git a/cocos/renderer/CCTexture2D.cpp b/cocos/renderer/CCTexture2D.cpp index 9e3ab96702..7d6699a056 100644 --- a/cocos/renderer/CCTexture2D.cpp +++ b/cocos/renderer/CCTexture2D.cpp @@ -34,6 +34,7 @@ THE SOFTWARE. #include "renderer/CCTexture2D.h" #include "platform/CCImage.h" +#include "platform/CCGL.h" #include "base/ccUtils.h" #include "platform/CCDevice.h" #include "base/ccConfig.h" From d03411d6ebb3a99f57f11d1cca7d67853966edd7 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Thu, 14 Nov 2019 09:43:14 +0800 Subject: [PATCH 91/96] update submodule (#20324) --- tools/cocos2d-console | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cocos2d-console b/tools/cocos2d-console index 96768f3371..56f86f7331 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 96768f3371cff6545daed79b0c6d4a9ee5cc4b8e +Subproject commit 56f86f7331cdac89fbd19f6b75963a4c12f53089 From 56888524b7399af6127b80c59fd4d5a6a95e7cad Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Thu, 14 Nov 2019 09:43:37 +0800 Subject: [PATCH 92/96] set default minimum deployment target (#20323) --- CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7deb315259..856d9843e1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,13 @@ cmake_minimum_required(VERSION 3.6) project(Cocos2d-x) +# set default minimum deployment target +if(XCODE) + if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET) + SET (CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 8.0) + endif() +endif() + # cocos2dx root path set(COCOS2DX_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) set(CMAKE_MODULE_PATH ${COCOS2DX_ROOT_PATH}/cmake/Modules/) From 3a36e2d5c297fdffc2be774da80c1fdc55327c1e Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 14 Nov 2019 14:49:11 +0800 Subject: [PATCH 93/96] Fixing a crash in iOS 9.3.5 when we have a layer with WebView getting deallocated (#20285) (#20328) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * In case of iOS 9.3.5 when we show a web view and deallocate the layer it is trying to release memory associated with WKWebView instance, but it hadn’t retained it in the first place. This results in a crash. This commit fixes that crash. * Removing the autorelease and retain parts from the WKWebView instantiation. * Changes so that we can remove the retain from the property declaration and depend only on manual retain and release of memory --- cocos/ui/UIWebView/UIWebViewImpl-ios.mm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/ui/UIWebView/UIWebViewImpl-ios.mm b/cocos/ui/UIWebView/UIWebViewImpl-ios.mm index 2335e113fb..e2c448249e 100644 --- a/cocos/ui/UIWebView/UIWebViewImpl-ios.mm +++ b/cocos/ui/UIWebView/UIWebViewImpl-ios.mm @@ -82,7 +82,7 @@ @interface UIWebViewWrapper () -@property(nonatomic, retain) WKWebView *wkWebView; +@property(nonatomic) WKWebView *wkWebView; @property(nonatomic, copy) NSString *jsScheme; @end @@ -118,7 +118,7 @@ - (void)setupWebView { if (!self.wkWebView) { - self.wkWebView = [[[WKWebView alloc] init] autorelease]; + self.wkWebView = [[WKWebView alloc] init]; self.wkWebView.UIDelegate = self; self.wkWebView.navigationDelegate = self; } From bb5cf546f55b5eb6a45bc22e90febcef3664b022 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 14 Nov 2019 14:49:47 +0800 Subject: [PATCH 94/96] fix videoplayer crash in release mode (#20327) --- cocos/ui/UIVideoPlayer-ios.mm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cocos/ui/UIVideoPlayer-ios.mm b/cocos/ui/UIVideoPlayer-ios.mm index 6a787e8216..2c67a74d50 100644 --- a/cocos/ui/UIVideoPlayer-ios.mm +++ b/cocos/ui/UIVideoPlayer-ios.mm @@ -110,6 +110,7 @@ typedef NS_ENUM(NSInteger, PlayerbackState) { -(void) clean { + _videoPlayer = nullptr; [self stop]; [self removePlayerEventListener]; [self.playerController.view removeFromSuperview]; @@ -243,7 +244,11 @@ typedef NS_ENUM(NSInteger, PlayerbackState) { [self seekTo:0]; [self.playerController.player pause]; _state = PlayerbackStopped; - _videoPlayer->onPlayEvent((int)VideoPlayer::EventType::STOPPED); + + // stop() will be invoked in dealloc, which is invoked by _videoPlayer's destructor, + // so do't send the message when _videoPlayer is being deleted. + if (_videoPlayer) + _videoPlayer->onPlayEvent((int)VideoPlayer::EventType::STOPPED); } } From a6f73e2f5a834892d4a213e2718b69c11b37cd47 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Thu, 14 Nov 2019 15:13:20 +0800 Subject: [PATCH 95/96] adjust testItem relative position (#20331) --- .../lua-tests/src/PhysicsTest/PhysicsTest.lua | 43 +++++++++++++------ tests/lua-tests/src/helper.lua | 4 +- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua b/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua index 6f45ba2962..dd100d8c50 100644 --- a/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua +++ b/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua @@ -1154,26 +1154,33 @@ local function PhysicsContactTest() layer:addChild(root) local s = cc.size(VisibleRect:getVisibleRect().width, VisibleRect:getVisibleRect().height) - + local subtitleLabelPosX, subtitleLabelPosY = Helper.subtitleLabel:getPosition() + local restartTestItemPosX, restartTestItemPosY = Helper.restartTestItem:getPosition() + local prevMenuPos = subtitleLabelPosY - Helper.subtitleLabel:getContentSize().height; + local menuStep = (subtitleLabelPosY -restartTestItemPosY) * 0.25; + local label = cc.Label:createWithTTF(tostring(layer.yellowBoxNum), s_arialPath, 32) root:addChild(label, 1) label:setAnchorPoint(cc.p(0.5, 0.5)) - label:setPosition(cc.p(s.width/2, s.height-50)) + label:setPosition(cc.p(s.width/2, prevMenuPos)) + prevMenuPos = prevMenuPos - menuStep label = cc.Label:createWithTTF(tostring(layer.blueBoxNum), s_arialPath, 32) root:addChild(label, 1) label:setAnchorPoint(cc.p(0.5, 0.5)) - label:setPosition(cc.p(s.width/2, s.height-90)) + label:setPosition(cc.p(s.width/2, prevMenuPos)) + prevMenuPos = prevMenuPos - menuStep label = cc.Label:createWithTTF(tostring(layer.yellowTriangleNum), s_arialPath, 32) root:addChild(label, 1) label:setAnchorPoint(cc.p(0.5, 0.5)) - label:setPosition(cc.p(s.width/2, s.height-130)) + label:setPosition(cc.p(s.width/2, prevMenuPos)) + prevMenuPos = prevMenuPos - menuStep label = cc.Label:createWithTTF(tostring(layer.blueTriangleNum), s_arialPath, 32) root:addChild(label, 1) label:setAnchorPoint(cc.p(0.5, 0.5)) - label:setPosition(cc.p(s.width/2, s.height-170)) + label:setPosition(cc.p(s.width/2, prevMenuPos)) local wall = cc.Node:create() wall:setPhysicsBody(cc.PhysicsBody:createEdgeBox(s, cc.PhysicsMaterial(0.1, 1, 0.0))) @@ -1287,7 +1294,12 @@ local function PhysicsContactTest() resetTest() end - + + local subtitleLabelPosX, subtitleLabelPosY = Helper.subtitleLabel:getPosition() + local restartTestItemPosX, restartTestItemPosY = Helper.restartTestItem:getPosition() + local prevMenuPos = subtitleLabelPosY - Helper.subtitleLabel:getContentSize().height; + local menuStep = (subtitleLabelPosY -restartTestItemPosY) * 0.25; + cc.MenuItemFont:setFontSize(65) local decrease1 = cc.MenuItemFont:create(" - ") decrease1:setColor(cc.c3b(0,200,20)) @@ -1300,13 +1312,13 @@ local function PhysicsContactTest() local menu1 = cc.Menu:create(decrease1, increase1) menu1:alignItemsHorizontally() - menu1:setPosition(cc.p(s.width/2, s.height-50)) + menu1:setPosition(cc.p(s.width/2, prevMenuPos)) layer:addChild(menu1, 1) local label = cc.Label:createWithTTF("yellow box", s_arialPath, 32) layer:addChild(label, 1) label:setAnchorPoint(cc.p(0.5, 0.5)) - label:setPosition(cc.p(s.width/2 - 150, s.height-50)) + label:setPosition(cc.p(s.width/2 - 150, prevMenuPos)) local decrease2 = cc.MenuItemFont:create(" - ") decrease2:setColor(cc.c3b(0,200,20)) @@ -1317,15 +1329,16 @@ local function PhysicsContactTest() decrease2:registerScriptTapHandler(onDecrease) increase2:registerScriptTapHandler(onIncrease) + prevMenuPos = prevMenuPos - menuStep local menu2 = cc.Menu:create(decrease2, increase2) menu2:alignItemsHorizontally() - menu2:setPosition(cc.p(s.width/2, s.height-90)) + menu2:setPosition(cc.p(s.width/2, prevMenuPos)) layer:addChild(menu2, 1) label = cc.Label:createWithTTF("blue box", s_arialPath, 32) layer:addChild(label, 1) label:setAnchorPoint(cc.p(0.5, 0.5)) - label:setPosition(cc.p(s.width/2 - 150, s.height-90)) + label:setPosition(cc.p(s.width/2 - 150, prevMenuPos)) local decrease3 = cc.MenuItemFont:create(" - ") decrease3:setColor(cc.c3b(0,200,20)) @@ -1336,15 +1349,16 @@ local function PhysicsContactTest() decrease3:registerScriptTapHandler(onDecrease) increase3:registerScriptTapHandler(onIncrease) + prevMenuPos = prevMenuPos - menuStep local menu3 = cc.Menu:create(decrease3, increase3) menu3:alignItemsHorizontally() - menu3:setPosition(cc.p(s.width/2, s.height-130)) + menu3:setPosition(cc.p(s.width/2, prevMenuPos)) layer:addChild(menu3, 1) label = cc.Label:createWithTTF("yellow triangle", s_arialPath, 32) layer:addChild(label, 1) label:setAnchorPoint(cc.p(0.5, 0.5)) - label:setPosition(cc.p(s.width/2 - 150, s.height-130)) + label:setPosition(cc.p(s.width/2 - 150, prevMenuPos)) local decrease4 = cc.MenuItemFont:create(" - ") decrease4:setColor(cc.c3b(0,200,20)) @@ -1355,15 +1369,16 @@ local function PhysicsContactTest() decrease4:registerScriptTapHandler(onDecrease) increase4:registerScriptTapHandler(onIncrease) + prevMenuPos = prevMenuPos - menuStep local menu4 = cc.Menu:create(decrease4, increase4) menu4:alignItemsHorizontally() - menu4:setPosition(cc.p(s.width/2, s.height-170)) + menu4:setPosition(cc.p(s.width/2, prevMenuPos)) layer:addChild(menu4, 1) label = cc.Label:createWithTTF("blue triangle", s_arialPath, 32) layer:addChild(label, 1) label:setAnchorPoint(cc.p(0.5, 0.5)) - label:setPosition(cc.p(s.width/2 - 150, s.height-170)) + label:setPosition(cc.p(s.width/2 - 150, prevMenuPos)) local contactListener = cc.EventListenerPhysicsContact:create() diff --git a/tests/lua-tests/src/helper.lua b/tests/lua-tests/src/helper.lua index 8ff5132b0a..583fc0fb8a 100644 --- a/tests/lua-tests/src/helper.lua +++ b/tests/lua-tests/src/helper.lua @@ -33,7 +33,8 @@ Helper = { createFunctioinTable = nil, currentLayer = nil, titleLabel = nil, - subtitleLabel = nil + subtitleLabel = nil, + restartTestItem = nil } function Helper.nextAction() @@ -93,6 +94,7 @@ function Helper.initWithLayer(layer) item1:registerScriptTapHandler(Helper.backAction) item2:registerScriptTapHandler(Helper.restartAction) item3:registerScriptTapHandler(Helper.nextAction) + Helper.restartTestItem = item2 local menu = cc.Menu:create() menu:addChild(item1) From dde4780e14f211ebb858cf5c87b8c116dd524176 Mon Sep 17 00:00:00 2001 From: coulsonwang Date: Thu, 14 Nov 2019 18:11:15 +0800 Subject: [PATCH 96/96] decrease the font size or it will be conflict (#20333) --- tests/lua-tests/src/PhysicsTest/PhysicsTest.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua b/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua index dd100d8c50..16258d48f2 100644 --- a/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua +++ b/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua @@ -1300,7 +1300,7 @@ local function PhysicsContactTest() local prevMenuPos = subtitleLabelPosY - Helper.subtitleLabel:getContentSize().height; local menuStep = (subtitleLabelPosY -restartTestItemPosY) * 0.25; - cc.MenuItemFont:setFontSize(65) + cc.MenuItemFont:setFontSize(30) local decrease1 = cc.MenuItemFont:create(" - ") decrease1:setColor(cc.c3b(0,200,20)) local increase1 = cc.MenuItemFont:create(" + ")