diff --git a/src/chapter9/Chapter9.cpp b/src/chapter9/Chapter9.cpp index 7c1e54d..66c623d 100644 --- a/src/chapter9/Chapter9.cpp +++ b/src/chapter9/Chapter9.cpp @@ -8,6 +8,7 @@ #include "Chapter9_7.h" #include "Chapter9_8.h" #include "Chapter9_9.h" +#include "Chapter9_10.h" USING_NS_CC; @@ -73,7 +74,7 @@ bool Chapter9::init() mainmenu->addChild(menuItem,2); mainmenu->setPosition(Vec2::ZERO); - + // add "Sprite3D skeleton animation" itemlabel = LabelTTF::create("3D skeleton animation", "Arial", 24); menuItem = MenuItemLabel::create(itemlabel); @@ -85,7 +86,7 @@ bool Chapter9::init() mainmenu->addChild(menuItem,2); mainmenu->setPosition(Vec2::ZERO); - + // add "Attach weapon" itemlabel = LabelTTF::create("Attach weapon", "Arial", 24); @@ -110,7 +111,7 @@ bool Chapter9::init() mainmenu->addChild(menuItem,2); mainmenu->setPosition(Vec2::ZERO); - + // add "Test camera" itemlabel = LabelTTF::create("Camera", "Arial", 24); menuItem = MenuItemLabel::create(itemlabel); @@ -122,7 +123,7 @@ bool Chapter9::init() mainmenu->addChild(menuItem,2); mainmenu->setPosition(Vec2::ZERO); - + // add "Test AABB" itemlabel = LabelTTF::create("AABB", "Arial", 24); menuItem = MenuItemLabel::create(itemlabel); @@ -146,7 +147,7 @@ bool Chapter9::init() mainmenu->addChild(menuItem,2); mainmenu->setPosition(Vec2::ZERO); - + // add "Test BillBoard" itemlabel = LabelTTF::create("BillBoard", "Arial", 24); menuItem = MenuItemLabel::create(itemlabel); @@ -158,7 +159,7 @@ bool Chapter9::init() mainmenu->addChild(menuItem,2); mainmenu->setPosition(Vec2::ZERO); - + // add "Test BillBoard" itemlabel = LabelTTF::create("Light", "Arial", 24); menuItem = MenuItemLabel::create(itemlabel); @@ -171,6 +172,18 @@ bool Chapter9::init() mainmenu->addChild(menuItem,2); mainmenu->setPosition(Vec2::ZERO); + // add "Frustum Clipping" + itemlabel = LabelTTF::create("Frustum Clipping", "Arial", 24); + menuItem = MenuItemLabel::create(itemlabel); + menuItem->setCallback([&](cocos2d::Ref *sender) { + Director::getInstance()->replaceScene(Chapter9_10::createScene()); + }); + menuItem->setPosition(Vec2(origin.x+visibleSize.width/2, origin.y+visibleSize.height/2).x, + (Vec2(origin.x+visibleSize.width/2, origin.y+visibleSize.height).y - (++index) * 40)); + + mainmenu->addChild(menuItem,2); + mainmenu->setPosition(Vec2::ZERO); + // add main menu this->addChild(mainmenu, 1); diff --git a/src/chapter9/Chapter9_10.cpp b/src/chapter9/Chapter9_10.cpp new file mode 100644 index 0000000..bdfa145 --- /dev/null +++ b/src/chapter9/Chapter9_10.cpp @@ -0,0 +1,133 @@ +#include "Chapter9_10.h" +#include "Chapter9.h" +#include "DrawNode3D.h" + +USING_NS_CC; + +Scene* Chapter9_10::createScene() +{ + Size visibleSize = Director::getInstance()->getVisibleSize(); + Vec2 origin = Director::getInstance()->getVisibleOrigin(); + auto winSize = Director::getInstance()->getWinSize(); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // show draw call + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Director::getInstance()->setDisplayStats(true); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // create a scene + // 'scene' is an autorelease object + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + auto scene = Scene::create(); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // add title + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + auto label = LabelTTF::create("Frustum Clipping", "Arial", 24); + label->setPosition(Vec2(origin.x+visibleSize.width/2, origin.y+visibleSize.height/2).x, + Vec2(origin.x+visibleSize.width/2, origin.y+visibleSize.height).y - 30); + scene->addChild(label, 0); + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // add zoom in button + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + label = LabelTTF::create("zoom in", "Arial", 24); + label->setPosition(winSize.width - 50, origin.y - 100); + scene->addChild(label, 0); + + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // add 3d layer + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + auto layer3D = Layer::create(); + scene->addChild(layer3D,2); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // add camera + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + static Camera* camera = nullptr; + if (camera == nullptr) { + camera = Camera::createPerspective(60, (GLfloat)winSize.width/winSize.height, 1, 500); + camera->setCameraFlag(CameraFlag::USER1);// set camera flag + camera->setPosition3D(Vec3(0, 100, 200)); + camera->lookAt(Vec3(0, 0, 0), Vec3(0, 1, 0)); + layer3D->addChild(camera); + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // open frustum clipping + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + camera->enableFrustumCulling(true, true); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // add the menu item for back to main menu + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + label = LabelTTF::create("MainMenu", "Arial", 24); + auto menuItemMain = MenuItemLabel::create(label); + menuItemMain->setPosition( Vec2(origin.x + visibleSize.width - 80, origin.y + 25) ); + menuItemMain->setCallback([&](cocos2d::Ref *sender) { + Director::getInstance()->replaceScene(Chapter9::createScene()); + Director::getInstance()->setDisplayStats(false); + camera = nullptr; + }); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // add zoom out button + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + label = LabelTTF::create("Zoom Out", "Arial", 34); + auto menuItemZoomOut = MenuItemLabel::create(label); + menuItemZoomOut->setPosition( winSize.width - 80, origin.y + visibleSize.height - 100 ); + menuItemZoomOut->setCallback([&](cocos2d::Ref *sender) { + Vec3 dir = camera->getPosition3D() - Vec3::ZERO; + Vec3 cameraPos = camera->getPosition3D(); + if(dir.length() <= 300) + { + dir.normalize(); + cameraPos += dir * 5; + camera->setPosition3D(cameraPos); + } + }); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // add zoom in button + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + label = LabelTTF::create("Zoom In", "Arial", 34); + auto menuItemZoomIn = MenuItemLabel::create(label); + menuItemZoomIn->setPosition( winSize.width - 80, origin.y + visibleSize.height - 140 ); + menuItemZoomIn->setCallback([&](cocos2d::Ref *sender) { + Vec3 dir = camera->getPosition3D() - Vec3::ZERO; + Vec3 cameraPos = camera->getPosition3D(); + if(cameraPos.length() >= 50) + { + dir.normalize(); + cameraPos -= dir * 5; + camera->setPosition3D(cameraPos); + } + }); + + auto menuMain = Menu::create(menuItemMain, menuItemZoomOut, menuItemZoomIn, nullptr); + menuMain->setPosition( Vec2::ZERO ); + scene->addChild(menuMain, 1); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // add sprite3D + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + const int NUM(5); + for (int x = -NUM; x < NUM; x++) + { + for (int z = -NUM; z < NUM; z++) + { + auto sprite = Sprite3D::create("orc.c3b"); + sprite->setPosition3D(Vec3(x * 30, 0, z * 30)); + sprite->setRotation3D(Vec3(0, 180, 0)); + layer3D->addChild(sprite); + } + } + + layer3D->setCameraMask((unsigned short)CameraFlag::USER1); + + // return the scene + return scene; +} \ No newline at end of file diff --git a/src/chapter9/Chapter9_10.h b/src/chapter9/Chapter9_10.h new file mode 100644 index 0000000..ceaa571 --- /dev/null +++ b/src/chapter9/Chapter9_10.h @@ -0,0 +1,14 @@ +#ifndef __CHAPTER_9_10_H__ +#define __CHAPTER_9_10_H__ + +#include "cocos2d.h" + +USING_NS_CC; + +class Chapter9_10 : public Ref +{ + public: + static cocos2d::Scene* createScene(); +}; + +#endif // __CHAPTER_9_10_H__