27#include "ui/CocosGUI.h"
28#include "renderer/CCRenderState.h"
29#include <spine/spine-cocos2dx.h>
31#include "../testResource.h"
32#include "../TerrainTest/TerrainTest.h"
44 virtual void draw(cocos2d::Renderer* renderer,
const cocos2d::Mat4& transform, uint32_t transformFlags)
override
46 glDisable(GL_CULL_FACE);
47 SkeletonAnimation::draw(renderer, transform, transformFlags);
48 RenderState::StateBlock::invalidate(cocos2d::RenderState::StateBlock::RS_ALL_ONES);
54 spAtlas* atlas = spAtlas_createFromFile(atlasFile.c_str(), 0);
55 node->initWithJsonFile(skeletonDataFile, atlas, scale);
131 std::vector<std::string>
_skins[(int)SkinType::MAX_TYPE];
195 (
unsigned short)
s_CF[0],
196 (
unsigned short)
s_CF[1],
197 (
unsigned short)
s_CF[2],
198 (
unsigned short)
s_CF[3],
226: _worldScene(nullptr)
229, _textureCube(nullptr)
233, _playerItem(nullptr)
234, _detailItem(nullptr)
253 CC_BREAK_IF(
false == TestCase::init());
257 auto visibleSize = Director::getInstance()->getVisibleSize();
258 Camera *ca =
nullptr;
265 Camera::createPerspective(60,
266 visibleSize.width / visibleSize.height,
272 ca->setPosition3D(Vec3(0.f, 0.f, 50.f));
276 Camera::createPerspective(60,
277 visibleSize.width/visibleSize.height,
291 ca->setPosition3D(
_player->getPosition3D()+Vec3(0, 45, 60));
292 ca->setRotation3D(Vec3(-45,0,0));
368 auto listener = EventListenerTouchOneByOne::create();
371 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,
this);
383 auto shader = GLProgram::createWithFilenames(
"Sprite3DTest/cube_map.vert",
384 "Sprite3DTest/cube_map.frag");
385 auto state = GLProgramState::create(shader);
388 _textureCube = TextureCube::create(
"Sprite3DTest/skybox/left.jpg",
389 "Sprite3DTest/skybox/right.jpg",
390 "Sprite3DTest/skybox/top.jpg",
391 "Sprite3DTest/skybox/bottom.jpg",
392 "Sprite3DTest/skybox/front.jpg",
393 "Sprite3DTest/skybox/back.jpg");
395 Texture2D::TexParams tRepeatParams;
396 tRepeatParams.magFilter = GL_LINEAR;
397 tRepeatParams.minFilter = GL_LINEAR;
398 tRepeatParams.sAddressMode = GL_MIRRORED_REPEAT;
399 tRepeatParams.tAddressMode = GL_MIRRORED_REPEAT;
411 Terrain::DetailMap r(
"TerrainTest/dirt.jpg");
412 Terrain::DetailMap g(
"TerrainTest/Grass2.jpg",10);
413 Terrain::DetailMap b(
"TerrainTest/road.jpg");
414 Terrain::DetailMap a(
"TerrainTest/GreenSkin.jpg",20);
415 Terrain::TerrainData data(
"TerrainTest/heightmap16.jpg",
416 "TerrainTest/alphamap.png",
417 r,g,b,a,Size(32,32),40.0f,2);
418 _terrain = Terrain::create(data,Terrain::CrackFixedType::SKIRT);
423 _terrain->setLODDistance(64,128,192);
433 auto animation = Animation3D::create(
"Sprite3DTest/girl.c3b",
"Take 001");
436 auto animate = Animate3D::create(animation);
437 _player->runAction(RepeatForever::create(animate));
441 PUParticleSystem3D::create(
"Particle3D/scripts/blackHole.pu",
442 "Particle3D/materials/pu_mediapack_01.material");
444 rootps->setPosition3D(Vec3(0, 150, 0));
445 auto moveby = MoveBy::create(2.0f, Vec2(50.0f, 0.0f));
446 auto moveby1 = MoveBy::create(2.0f, Vec2(-50.0f, 0.0f));
447 rootps->runAction(RepeatForever::create(Sequence::create(moveby, moveby1,
nullptr)));
448 rootps->startParticleSystem();
453 auto billboard = BillBoard::create(
"Images/btn-play-normal.png");
454 billboard->setPosition3D(Vec3(0,180,0));
458 auto monster = Sprite3D::create(
"Sprite3DTest/orc.c3b");
459 monster->setRotation3D(Vec3(0,180,0));
460 monster->setPosition3D(
_player->getPosition3D() + Vec3(50, -10, 0));
461 monster->setOpacity(128);
463 monster = Sprite3D::create(
"Sprite3DTest/orc.c3b");
464 monster->setRotation3D(Vec3(0,180,0));
465 monster->setPosition3D(
_player->getPosition3D() + Vec3(-50, -5, 0));
471 _ui = Layer::create();
475 auto showPlayerDlgItem = MenuItemImage::create(
"Images/Pea.png",
480 showPlayerDlgItem->setName(
"showPlayerDlgItem");
484 TTFConfig ttfConfig(
"fonts/arial.ttf", 20);
485 auto descItem = MenuItemLabel::create(Label::createWithTTF(ttfConfig,
"Description"),
491 _descDlg->setVisible(false);
496 _descDlg->setVisible(true);
497 _descDlg->setScale(0);
498 _descDlg->runAction(ScaleTo::create(2, 1.0));
501 descItem->setName(
"descItem");
504 auto menu = Menu::create(showPlayerDlgItem,
507 menu->setPosition(Vec2::ZERO);
511 auto createCameraButton = [
this](
int tag,
const char* text)-> Node *
513 auto cb = ui::CheckBox::create(
"cocosui/check_box_normal.png",
514 "cocosui/check_box_normal_press.png",
515 "cocosui/check_box_active.png",
516 "cocosui/check_box_normal_disable.png",
517 "cocosui/check_box_active_disable.png");
519 cb->setSelected(
true);
520 if (text) cb->setName(text);
521 cb->setAnchorPoint(Vec2(0, 0.5));
523 cb->addClickEventListener([
this](Ref* sender)
525 auto index =
static_cast<Node *
>(sender)->getTag();
527 camera->setVisible(!camera->isVisible());
531 auto label = ui::Text::create();
532 label->setString(text);
533 label->setAnchorPoint(Vec2(0, 0));
534 label->setPositionX(cb->getContentSize().width);
552 cameraBtn->setPosition(pos);
553 _ui->addChild(cameraBtn);
556 auto labelCameras = ui::Text::create();
557 labelCameras->setString(
"Cameras");
558 labelCameras->setAnchorPoint(Vec2(0, 0));
559 labelCameras->setPosition(pos);
560 _ui->addChild(labelCameras);
565 SpriteFrameCache::getInstance()->addSpriteFramesWithFile(
s_s9s_ui_plist);
567 Size dlgSize(190, 240);
572 _playerDlg = ui::Scale9Sprite::createWithSpriteFrameName(
"button_actived.png");
580 auto title = Label::createWithTTF(
"Player Dialog",
"fonts/arial.ttf",16);
581 title->setPosition(dlgSize.width / 2, dlgSize.height - margin * 2);
585 Size bgSize(110, 180);
586 Vec2 bgPos(margin, dlgSize.height / 2 - margin);
587 auto playerBg = ui::Scale9Sprite::createWithSpriteFrameName(
"item_bg.png");
588 playerBg->setContentSize(bgSize);
589 playerBg->setAnchorPoint(Vec2(0, 0.5));
590 playerBg->setPosition(bgPos);
594 Size itemSize(48, 48);
595 Vec2 itemAnchor(0, 1);
596 Vec2 itemPos(bgPos.x + bgSize.width + margin, bgPos.y + bgSize.height / 2);
597 auto itemBg = ui::Scale9Sprite::createWithSpriteFrameName(
"item_bg.png");
598 itemBg->setContentSize(itemSize);
599 itemBg->setAnchorPoint(itemAnchor);
600 itemBg->setPosition(itemPos);
603 auto item = ui::Button::create(
"crystal.png",
"",
"", ui::Widget::TextureResType::PLIST);
604 item->setTitleText(
"Crystal");
606 item->setAnchorPoint(itemAnchor);
607 item->setPosition(itemPos);
608 item->addClickEventListener([
this](Ref* sender){
614 std::string filename =
"Sprite3DTest/girl.c3b";
615 auto girl = Sprite3D::create(filename);
617 girl->setPosition(bgSize.width / 2, margin * 2);
619 playerBg->addChild(girl);
622 ui::Button* zoomIn = ui::Button::create(
"cocosui/animationbuttonnormal.png",
623 "cocosui/animationbuttonpressed.png");
624 zoomIn->setScale(0.5);
625 zoomIn->setAnchorPoint(Vec2(1, 1));
626 zoomIn->setPosition(Vec2(bgSize.width / 2 - margin / 2, bgSize.height - margin));
627 zoomIn->addClickEventListener([girl](Ref* sender){
628 girl->setScale(girl->getScale() * 2);
630 zoomIn->setTitleText(
"Zoom In");
631 zoomIn->setName(
"Zoom In");
633 playerBg->addChild(zoomIn);
635 ui::Button* zoomOut = ui::Button::create(
"cocosui/animationbuttonnormal.png",
636 "cocosui/animationbuttonpressed.png");
637 zoomOut->setScale(0.5);
638 zoomOut->setAnchorPoint(Vec2(0, 1));
639 zoomOut->setPosition(Vec2(bgSize.width / 2 + margin / 2, bgSize.height - margin));
640 zoomOut->addClickEventListener([girl](Ref* sender){
641 girl->setScale(girl->getScale() / 2);
643 zoomOut->setTitleText(
"Zoom Out");
644 zoomOut->setName(
"Zoom Out");
646 playerBg->addChild(zoomOut);
649 ui::Slider* slider = ui::Slider::create(
"cocosui/slidbar.png",
"cocosui/sliderballnormal.png");
650 slider->setScale9Enabled(
true);
651 slider->setPosition(Vec2(bgSize.width / 2, margin));
652 slider->setContentSize(Size(bgSize.width - margin, slider->getContentSize().height));
653 slider->addEventListener([girl, slider](Ref* sender,ui::Slider::EventType type)
655 girl->setRotation3D(Vec3(0, 360 * slider->getPercent() / 100, 0));
657 slider->setName(
"Slider");
659 playerBg->addChild(slider);
664 SpriteFrameCache::getInstance()->addSpriteFramesWithFile(
s_s9s_ui_plist);
666 Size dlgSize(190, 240);
672 _detailDlg = ui::Scale9Sprite::createWithSpriteFrameName(
"button_actived.png");
681 auto title = Label::createWithTTF(
"Detail Dialog",
"fonts/arial.ttf",16);
682 title->setPosition(dlgSize.width / 2, dlgSize.height - margin * 2);
687 ui::Button* capture = ui::Button::create(
"cocosui/animationbuttonnormal.png",
688 "cocosui/animationbuttonpressed.png");
689 capture->setScale(0.5);
690 capture->setAnchorPoint(Vec2(0.5, 0));
691 capture->setPosition(Vec2(dlgSize.width / 3, margin));
692 capture->addClickEventListener([
this](Ref* sender)
694 Director::getInstance()->getTextureCache()->removeTextureForKey(
_snapshotFile);
697 utils::captureScreen([
this](
bool succeed,
const std::string& outputFile)
701 log(
"Capture screen failed.");
704 auto sp = Sprite::create(outputFile);
706 Size s = Director::getInstance()->getWinSize();
707 sp->setPosition(s.width / 2, s.height / 2);
712 capture->setTitleText(
"Take Snapshot");
713 capture->setName(
"Take Snapshot");
716 ui::Button* remove = ui::Button::create(
"cocosui/animationbuttonnormal.png",
717 "cocosui/animationbuttonpressed.png");
718 remove->setScale(0.5);
719 remove->setAnchorPoint(Vec2(0.5, 0));
720 remove->setPosition(Vec2(dlgSize.width * 2 / 3, margin));
721 remove->addClickEventListener([
this](Ref* sender)
725 remove->setTitleText(
"Del Snapshot");
726 remove->setName(
"Del Snapshot");
732 skeletonNode->setAnimation(0,
"walk",
true);
733 skeletonNode->setSkin(
"goblin");
735 skeletonNode->setScale(0.25);
736 Size windowSize = Director::getInstance()->getWinSize();
737 skeletonNode->setPosition(Vec2(dlgSize.width / 2, remove->getContentSize().height / 2 + 2 * margin));
743 SpriteFrameCache::getInstance()->addSpriteFramesWithFile(
s_s9s_ui_plist);
745 Size dlgSize(440, 240);
751 auto desdDlg = ui::Layout::create();
752 desdDlg->setBackGroundImageScale9Enabled(
true);
753 desdDlg->setBackGroundImage(
"button_actived.png", ui::Widget::TextureResType::PLIST);
754 desdDlg->setContentSize(dlgSize);
755 desdDlg->setAnchorPoint(Vec2(0.5f, 0.5f));
756 desdDlg->setOpacity(224);
757 desdDlg->setPosition(pos);
758 desdDlg->setTouchEnabled(
true);
763 auto title = Label::createWithTTF(
"Description Dialog",
"fonts/arial.ttf",16);
764 title->setPosition(dlgSize.width / 2, dlgSize.height - margin * 2);
768 Size textSize(400, 220);
769 Vec2 textPos(margin, dlgSize.height - (20 + margin));
770 std::string desc = std::string(
771 " Scene 3D test for 2D and 3D mix rendering.\n"
772 "- Game world composite with terrain, skybox and 3D objects.\n"
773 "- UI composite with 2D nodes.\n"
774 "- Click the icon at the topleft conner, will show a player dialog which "
775 "there is a 3D sprite on it.\n"
776 "- There are two button to zoom the player model, which should keep above "
778 " - This description dialog should above all other elements.\n"
780 " Game scene composite with root scene and three sub scene. These scene "
781 " located at different location, they can't see each other.\n"
782 "- Root scene contains ui layer\n"
783 "- World scene contains skybox and 3d scene.\n"
784 "- Dialog scene contains actor dialog and detail dialog.\n"
785 "- OSD scene contains description dialog.\n"
787 "Click \"Description\" button to hide this dialog.\n");
788 auto text = Label::createWithSystemFont(desc,
"", 9, textSize);
789 text->setAnchorPoint(Vec2(0, 1));
790 text->setPosition(textPos);
794 std::string fileName =
"Sprite3DTest/ReskinGirl.c3b";
795 Vec2 girlPos(textPos.x + textSize.width - 40, margin);
801 auto animation = Animation3D::create(fileName);
804 auto animate = Animate3D::create(animation);
806 _reskinGirl->runAction(RepeatForever::create(animate));
809 auto& body =
_skins[(int)SkinType::UPPER_BODY];
810 body.push_back(
"Girl_UpperBody01");
811 body.push_back(
"Girl_UpperBody02");
813 auto& pants =
_skins[(int)SkinType::PANTS];
814 pants.push_back(
"Girl_LowerBody01");
815 pants.push_back(
"Girl_LowerBody02");
817 auto& shoes =
_skins[(int)SkinType::SHOES];
818 shoes.push_back(
"Girl_Shoes01");
819 shoes.push_back(
"Girl_Shoes02");
821 auto& hair =
_skins[(int)SkinType::HAIR];
822 hair.push_back(
"Girl_Hair01");
823 hair.push_back(
"Girl_Hair02");
825 auto& face =
_skins[(int)SkinType::FACE];
826 face.push_back(
"Girl_Face01");
827 face.push_back(
"Girl_Face02");
829 auto& hand =
_skins[(int)SkinType::HAND];
830 hand.push_back(
"Girl_Hand01");
831 hand.push_back(
"Girl_Hand02");
833 auto& glasses =
_skins[(int)SkinType::GLASSES];
834 glasses.push_back(
"");
835 glasses.push_back(
"Girl_Glasses01");
837 memset(
_curSkin, 0, (
int)SkinType::MAX_TYPE *
sizeof(
int));
839 auto applyCurSkin = [
this]()
841 for (ssize_t i = 0; i < this->
_reskinGirl->getMeshCount(); i++) {
842 auto mesh = this->
_reskinGirl->getMeshByIndex(
static_cast<int>(i));
843 bool isVisible =
false;
844 for (
int j = 0; j < (int)SkinType::MAX_TYPE; j++) {
851 this->
_reskinGirl->getMeshByIndex(
static_cast<int>(i))->setVisible(isVisible);
857 static const std::string btnTexts[SkinType::MAX_TYPE] =
867 Vec2 btnPos(dlgSize.width - margin, margin);
868 for (
int i = SkinType::MAX_TYPE - 1; i >= 0; --i) {
869 auto btn = ui::Button::create(
"cocosui/animationbuttonnormal.png",
870 "cocosui/animationbuttonpressed.png");
873 btn->setAnchorPoint(Vec2(1, 0));
874 btn->setPosition(btnPos);
876 btn->addClickEventListener([
this, applyCurSkin](Ref* sender)
878 auto index =
static_cast<Node *
>(sender)->getTag();
879 if (index < SkinType::MAX_TYPE)
885 btn->setTitleText(btnTexts[i]);
893 auto location = touch->getLocation();
895 if(camera != Camera::getVisitingCamera())
902 Vec3 nearP(location.x, location.y, 0.0f), farP(location.x, location.y, 1.0f);
904 auto size = Director::getInstance()->getWinSize();
905 camera->unprojectGL(size, &nearP, &nearP);
906 camera->unprojectGL(size, &farP, &farP);
907 Vec3 dir = farP - nearP;
910 bool isInTerrain =
_terrain->getIntersectionPoint(Ray(nearP, dir), collisionPoint);
917 dir = collisionPoint -
_player->getPosition3D();
926 event->stopPropagation();
931Scene3DTests::Scene3DTests()
#define ADD_TEST_CASE(__className__)
static const char * s_CameraNames[CAMERA_COUNT]
static Vec3 s_scenePositons[SCENE_COUNT]
static unsigned short s_CM[LAYER_COUNT]
static CameraFlag s_CF[LAYER_COUNT]
static Player * create(const char *file, cocos2d::Camera *cam, cocos2d::Terrain *terrain)
cocos2d::Vec3 _headingAxis
bool onTouchBegan(Touch *touch, Event *event)
void onTouchEnd(Touch *, Event *)
std::vector< Camera * > _gameCameras
cocos2d::Sprite3D * _reskinGirl
CREATE_FUNC(Scene3DTestScene)
int _curSkin[(int) SkinType::MAX_TYPE]
std::string _snapshotFile
cocos2d::Terrain * _terrain
virtual ~Scene3DTestScene()
TextureCube * _textureCube
static const int SNAPSHOT_TAG
std::vector< std::string > _skins[(int) SkinType::MAX_TYPE]
SkeletonAnimationCullingFix()
static SkeletonAnimationCullingFix * createWithFile(const std::string &skeletonDataFile, const std::string &atlasFile, float scale=1)
virtual void draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t transformFlags) override
virtual std::string title() const
static cocos2d::Vec2 top()
static cocos2d::Vec2 center()
static cocos2d::Vec2 left()
static cocos2d::Vec2 leftBottom()
static cocos2d::Vec2 right()
static const char s_s9s_ui_plist[]