PuzzleSDK
Camera3DTest.cpp
浏览该文件的文档.
1/****************************************************************************
2Copyright (c) 2012 cocos2d-x.org
3Copyright (c) 2013-2016 Chukong Technologies Inc.
4Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
5
6http://www.cocos2d-x.org
7
8Permission is hereby granted, free of charge, to any person obtaining a copy
9of this software and associated documentation files (the "Software"), to deal
10in the Software without restriction, including without limitation the rights
11to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12copies of the Software, and to permit persons to whom the Software is
13furnished to do so, subject to the following conditions:
14
15The above copyright notice and this permission notice shall be included in
16all copies or substantial portions of the Software.
17
18THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24THE SOFTWARE.
25****************************************************************************/
26
27#include "Camera3DTest.h"
28#include "testResource.h"
29#include "ui/UISlider.h"
30#include "platform/CCFileUtils.h"
31#include "renderer/backend/Device.h"
32
34
35#define SET_UNIFORM(name, addr, size) do { \
36 auto _loc_ = _programState1->getUniformLocation(name); \
37 _programState1->setUniform(_loc_, (addr), (size)); \
38 _loc_ = _programState2->getUniformLocation(name); \
39 _programState2->setUniform(_loc_, (addr), (size)); \
40 } while(false)
41
42enum
43{
44 IDC_NEXT = 100,
47};
48
49Camera3DTests::Camera3DTests()
50{
56 //ADD_TEST_CASE(CameraFrameBufferTest); //TODO render target
58}
59
60//------------------------------------------------------------------
61//
62// Camera Rotation Test
63//
64//------------------------------------------------------------------
66{
67
68 auto s = Director::getInstance()->getWinSize();
69
70 _camControlNode = Node::create();
71 _camControlNode->setPositionNormalized(Vec2(0.5f,0.5f));
72 addChild(_camControlNode);
73
74 _camNode = Node::create();
75 _camNode->setPositionZ(Camera::getDefaultCamera()->getPosition3D().z);
76 _camControlNode->addChild(_camNode);
77
78 auto sp3d = Sprite3D::create();
79 sp3d->setPosition(s.width/2, s.height/2);
80 addChild(sp3d);
81
82 auto lship = Label::create();
83 lship->setString("Ship");
84 lship->setPosition(0, 20);
85 sp3d->addChild(lship);
86
87 //Billboards
88 //Yellow is at the back
89 bill1 = BillBoard::create("Images/Icon.png");
90 bill1->setPosition3D(Vec3(50.0f, 10.0f, -10.0f));
91 bill1->setColor(Color3B::YELLOW);
92 bill1->setScale(0.6f);
93 sp3d->addChild(bill1);
94
95 l1 = Label::create();
96 l1->setPosition(Vec2(0.0f,-10.0f));
97 l1->setString("Billboard1");
98 l1->setColor(Color3B::WHITE);
99 l1->setScale(3);
100 bill1->addChild(l1);
101
102 auto p1 = ParticleSystemQuad::create("Particles/SmallSun.plist");
103 p1->setPosition(30.0f,80.0f);
104 bill1->addChild(p1);
105
106 bill2 = BillBoard::create("Images/Icon.png");
107 bill2->setPosition3D(Vec3(-50.0f, -10.0f, 10.0f));
108 bill2->setScale(0.6f);
109 sp3d->addChild(bill2);
110
111 l2 = Label::create();
112 l2->setString("Billboard2");
113 l2->setPosition(Vec2(0.0f,-10.0f));
114 l2->setColor(Color3B::WHITE);
115 l2->setScale(3);
116 bill2->addChild(l2);
117
118 auto p2 = ParticleSystemQuad::create("Particles/SmallSun.plist");
119 p2->setPosition(30,80);
120 bill2->addChild(p2);
121
122 //3D models
123 auto model = Sprite3D::create("Sprite3DTest/boss1.obj");
124 model->setScale(4);
125 model->setTexture("Sprite3DTest/boss.png");
126 model->setPosition3D(Vec3(s.width/2, s.height/2, 0));
127 addChild(model);
128
129 //Listener
130 _lis = EventListenerTouchOneByOne::create();
131 _lis->onTouchBegan = [](Touch* t, Event* e) {
132 return true;
133 };
134
135 _lis->onTouchMoved = [this](Touch* t, Event* e) {
136 float dx = t->getDelta().x;
137 Vec3 rot = _camControlNode->getRotation3D();
138 rot.y += dx;
139 _camControlNode->setRotation3D(rot);
140
141 Vec3 worldPos;
142 _camNode->getNodeToWorldTransform().getTranslation(&worldPos);
143
144 Camera::getDefaultCamera()->setPosition3D(worldPos);
145 Camera::getDefaultCamera()->lookAt(_camControlNode->getPosition3D());
146 };
147
148 Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(_lis, this);
149
150 schedule(CC_SCHEDULE_SELECTOR(CameraRotationTest::update));
151}
152
154{
155 Director::getInstance()->getEventDispatcher()->removeEventListener(_lis);
156}
157
158std::string CameraRotationTest::title() const
159{
160 return "Camera Rotation Test";
161}
162
164{
165 return "Slide to rotate";
166}
167
169{
171}
172
174{
175 CameraBaseTest::onExit();
176}
177
179{
180}
181
182//------------------------------------------------------------------
183//
184// Camera3DTestDemo
185//
186//------------------------------------------------------------------
188: _cameraType(CameraType::Free)
189, _incRot(nullptr)
190, _decRot(nullptr)
191, _camera(nullptr)
192, _bZoomOut(false)
193, _bZoomIn(false)
194, _bRotateLeft(false)
195, _bRotateRight(false)
196{
197}
199{
200}
202{
203}
204std::string Camera3DTestDemo::title() const
205{
206 return "Testing Camera";
207}
208
209void Camera3DTestDemo::scaleCameraCallback(Ref* sender,float value)
210{
212 {
213 Vec3 cameraPos= _camera->getPosition3D();
214 cameraPos+= cameraPos.getNormalized()*value;
215 _camera->setPosition3D(cameraPos);
216 }
217}
218void Camera3DTestDemo::rotateCameraCallback(Ref* sender,float value)
219{
221 {
222 Vec3 rotation3D= _camera->getRotation3D();
223 rotation3D.y+= value;
224 _camera->setRotation3D(rotation3D);
225 }
226}
228{
229 if(_cameraType==cameraType)
230 {
231 return ;
232 }
233 _cameraType = cameraType;
235 {
236 _camera->setPosition3D(Vec3(0, 130, 130) + _sprite3D->getPosition3D());
237 _camera->lookAt(_sprite3D->getPosition3D());
238
239 _RotateRightlabel->setColor(Color3B::WHITE);
240 _RotateLeftlabel->setColor(Color3B::WHITE);
241 _ZoomInlabel->setColor(Color3B::WHITE);
242 _ZoomOutlabel->setColor(Color3B::WHITE);
243 }
245 {
246 Vec3 newFaceDir;
247 _sprite3D->getWorldToNodeTransform().getForwardVector(&newFaceDir);
248 newFaceDir.normalize();
249 _camera->setPosition3D(Vec3(0,35,0) + _sprite3D->getPosition3D());
250 _camera->lookAt(_sprite3D->getPosition3D() + newFaceDir*50);
251
252 _RotateRightlabel->setColor(Color3B::WHITE);
253 _RotateLeftlabel->setColor(Color3B::WHITE);
254 _ZoomInlabel->setColor(Color3B::GRAY);
255 _ZoomOutlabel->setColor(Color3B::GRAY);
256 }
258 {
259 _camera->setPosition3D(Vec3(0, 130, 130) + _sprite3D->getPosition3D());
260 _camera->lookAt(_sprite3D->getPosition3D());
261
262 _RotateRightlabel->setColor(Color3B::GRAY);
263 _RotateLeftlabel->setColor(Color3B::GRAY);
264 _ZoomInlabel->setColor(Color3B::WHITE);
265 _ZoomOutlabel->setColor(Color3B::WHITE);
266 }
267}
269{
271 _sprite3D=nullptr;
272 auto s = Director::getInstance()->getWinSize();
273 auto listener = EventListenerTouchAllAtOnce::create();
274 listener->onTouchesBegan = CC_CALLBACK_2(Camera3DTestDemo::onTouchesBegan, this);
275 listener->onTouchesMoved = CC_CALLBACK_2(Camera3DTestDemo::onTouchesMoved, this);
276 listener->onTouchesEnded = CC_CALLBACK_2(Camera3DTestDemo::onTouchesEnded, this);
277 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
278 auto layer3D=Layer::create();
279 addChild(layer3D,0);
280 _layer3D=layer3D;
282 addNewSpriteWithCoords( Vec3(0,0,0),"Sprite3DTest/girl.c3b",true,0.2f,true);
283 TTFConfig ttfConfig("fonts/arial.ttf", 20);
284
285 auto containerForLabel1 = Node::create();
286 _ZoomOutlabel = Label::createWithTTF(ttfConfig,"zoom out");
287 _ZoomOutlabel->setPosition(s.width-50, VisibleRect::top().y-20);
288 containerForLabel1->addChild(_ZoomOutlabel);
289 addChild(containerForLabel1, 10);
290
291 auto listener1 = EventListenerTouchOneByOne::create();
292 listener1->setSwallowTouches(true);
293
294 listener1->onTouchBegan = CC_CALLBACK_2(Camera3DTestDemo::onTouchesZoomOut, this);
295 listener1->onTouchEnded = CC_CALLBACK_2(Camera3DTestDemo::onTouchesZoomOutEnd, this);
296
297 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, _ZoomOutlabel);
298
299 auto containerForLabel2 = Node::create();
300 _ZoomInlabel = Label::createWithTTF(ttfConfig,"zoom in");
301 _ZoomInlabel->setPosition(s.width-50, VisibleRect::top().y-70);
302 containerForLabel2->addChild(_ZoomInlabel);
303 addChild(containerForLabel2, 10);
304
305 auto listener2 = EventListenerTouchOneByOne::create();
306 listener2->setSwallowTouches(true);
307
308 listener2->onTouchBegan = CC_CALLBACK_2(Camera3DTestDemo::onTouchesZoomIn, this);
309 listener2->onTouchEnded = CC_CALLBACK_2(Camera3DTestDemo::onTouchesZoomInEnd, this);
310
311 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener2, _ZoomInlabel);
312
313 auto containerForLabel3 = Node::create();
314 _RotateLeftlabel = Label::createWithTTF(ttfConfig,"rotate left");
315 _RotateLeftlabel->setPosition(s.width-50, VisibleRect::top().y-120);
316 containerForLabel3->addChild(_RotateLeftlabel);
317 addChild(containerForLabel3, 10);
318
319 auto listener3 = EventListenerTouchOneByOne::create();
320 listener3->setSwallowTouches(true);
321
322 listener3->onTouchBegan = CC_CALLBACK_2(Camera3DTestDemo::onTouchesRotateLeft, this);
323 listener3->onTouchEnded = CC_CALLBACK_2(Camera3DTestDemo::onTouchesRotateLeftEnd, this);
324
325 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener3, _RotateLeftlabel);
326
327 auto containerForLabel4 = Node::create();
328 _RotateRightlabel = Label::createWithTTF(ttfConfig,"rotate right");
329 _RotateRightlabel->setPosition(s.width-50, VisibleRect::top().y-170);
330 containerForLabel4->addChild(_RotateRightlabel);
331 addChild(containerForLabel4, 10);
332
333 auto listener4 = EventListenerTouchOneByOne::create();
334 listener4->setSwallowTouches(true);
335
336 listener4->onTouchBegan = CC_CALLBACK_2(Camera3DTestDemo::onTouchesRotateRight, this);
337 listener4->onTouchEnded = CC_CALLBACK_2(Camera3DTestDemo::onTouchesRotateRightEnd, this);
338
339 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener4, _RotateRightlabel);
340
341 auto label1 = Label::createWithTTF(ttfConfig,"free ");
342 auto menuItem1 = MenuItemLabel::create(label1, CC_CALLBACK_1(Camera3DTestDemo::SwitchViewCallback,this,CameraType::Free));
343 auto label2 = Label::createWithTTF(ttfConfig,"third person");
344 auto menuItem2 = MenuItemLabel::create(label2, CC_CALLBACK_1(Camera3DTestDemo::SwitchViewCallback,this,CameraType::ThirdPerson));
345 auto label3 = Label::createWithTTF(ttfConfig,"first person");
346 auto menuItem3 = MenuItemLabel::create(label3, CC_CALLBACK_1(Camera3DTestDemo::SwitchViewCallback,this,CameraType::FirstPerson));
347 auto menu = Menu::create(menuItem1, menuItem2, menuItem3, nullptr);
348
349 menu->setPosition(Vec2::ZERO);
350
351 menuItem1->setPosition(VisibleRect::left().x+100, VisibleRect::top().y-50);
352 menuItem2->setPosition(VisibleRect::left().x+100, VisibleRect::top().y -100);
353 menuItem3->setPosition(VisibleRect::left().x+100, VisibleRect::top().y -150);
354 addChild(menu, 0);
355 schedule(CC_SCHEDULE_SELECTOR(Camera3DTestDemo::updateCamera), 0.0f);
356 if (_camera == nullptr)
357 {
358 _camera=Camera::createPerspective(60, (float)s.width/s.height, 1, 1000);
359 _camera->setCameraFlag(CameraFlag::USER1);
360 _layer3D->addChild(_camera);
361 }
364 //draw x
365 for( int j =-20; j<=20 ;j++)
366 {
367 line->drawLine(Vec3(-100.0f, 0.0f, 5.0f*j),Vec3(100.0f,0.0f,5.0f*j),Color4F(1,0,0,1));
368 }
369 //draw z
370 for( int j =-20; j<=20 ;j++)
371 {
372 line->drawLine(Vec3(5.0f*j, 0.0f, -100.0f),Vec3(5.0f*j,0.0f,100.0f),Color4F(0,0,1,1));
373 }
374 //draw y
375 line->drawLine(Vec3(0.0f, -50.0f, 0.0f),Vec3(0,0,0),Color4F(0,0.5,0,1));
376 line->drawLine(Vec3(0, 0, 0),Vec3(0,50.0f,0),Color4F(0,1,0,1));
377 _layer3D->addChild(line);
378
379 _layer3D->setCameraMask(2);
380}
382{
383 CameraBaseTest::onExit();
384 if (_camera)
385 {
386 _camera = nullptr;
387 }
388}
389
390void Camera3DTestDemo::addNewSpriteWithCoords(Vec3 p,std::string fileName,bool playAnimation,float scale,bool bindCamera)
391{
392 auto sprite = Sprite3D::create(fileName);
393 _layer3D->addChild(sprite);
394 float globalZOrder=sprite->getGlobalZOrder();
395 sprite->setPosition3D( Vec3( p.x, p.y,p.z) );
396 sprite->setGlobalZOrder(globalZOrder);
397 if(playAnimation)
398 {
399 auto animation = Animation3D::create(fileName,"Take 001");
400 if (animation)
401 {
402 auto animate = Animate3D::create(animation);
403 sprite->runAction(RepeatForever::create(animate));
404 }
405 }
406 if(bindCamera)
407 {
408 _sprite3D=sprite;
409 }
410 sprite->setScale(scale);
411}
412void Camera3DTestDemo::onTouchesBegan(const std::vector<Touch*>& touches, cocos2d::Event *event)
413{
414}
415void Camera3DTestDemo::onTouchesMoved(const std::vector<Touch*>& touches, cocos2d::Event *event)
416{
417 if(touches.size()==1)
418 {
419 auto touch = touches[0];
420 auto location = touch->getLocation();
421 Point newPos = touch->getPreviousLocation()-location;
423 {
424 Vec3 cameraDir;
425 Vec3 cameraRightDir;
426 _camera->getNodeToWorldTransform().getForwardVector(&cameraDir);
427 cameraDir.normalize();
428 cameraDir.y=0;
429 _camera->getNodeToWorldTransform().getRightVector(&cameraRightDir);
430 cameraRightDir.normalize();
431 cameraRightDir.y=0;
432 Vec3 cameraPos= _camera->getPosition3D();
433 cameraPos+=cameraDir*newPos.y*0.1f;
434 cameraPos+=cameraRightDir*newPos.x*0.1f;
435 _camera->setPosition3D(cameraPos);
437 {
438 _sprite3D->setPosition3D(Vec3(_camera->getPositionX(),0,_camera->getPositionZ()));
439 _targetPos=_sprite3D->getPosition3D();
440 }
441 }
442 }
443}
444void Camera3DTestDemo::move3D(float elapsedTime)
445{
446 if(_sprite3D)
447 {
448 Vec3 curPos= _sprite3D->getPosition3D();
449 Vec3 newFaceDir = _targetPos - curPos;
450 newFaceDir.y = 0.0f;
451 newFaceDir.normalize();
452 Vec3 offset = newFaceDir * 25.0f * elapsedTime;
453 curPos+=offset;
454 _sprite3D->setPosition3D(curPos);
456 {
457 Vec3 cameraPos= _camera->getPosition3D();
458 cameraPos.x+=offset.x;
459 cameraPos.z+=offset.z;
460 _camera->setPosition3D(cameraPos);
461 }
462 }
463}
464void Camera3DTestDemo::updateState(float elapsedTime)
465{
466 if(_sprite3D)
467 {
468 Vec3 curPos= _sprite3D->getPosition3D();
469 Vec3 curFaceDir;
470 _sprite3D->getNodeToWorldTransform().getForwardVector(&curFaceDir);
471 curFaceDir=-curFaceDir;
472 curFaceDir.normalize();
473 Vec3 newFaceDir = _targetPos - curPos;
474 newFaceDir.y = 0.0f;
475 newFaceDir.normalize();
476 float cosAngle = std::fabs(Vec3::dot(curFaceDir,newFaceDir) - 1.0f);
477 float dist = curPos.distanceSquared(_targetPos);
478 if(dist<=4.0f)
479 {
480 if(cosAngle<=0.01f)
482 else
484 }
485 else
486 {
487 if(cosAngle>0.01f)
489 else
491 }
492 }
493}
494void Camera3DTestDemo::onTouchesEnded(const std::vector<Touch*>& touches, cocos2d::Event *event)
495{
496 for ( auto &item: touches )
497 {
498 auto touch = item;
499 auto location = touch->getLocationInView();
500 if(_camera)
501 {
502 if(_sprite3D && _cameraType==CameraType::ThirdPerson && _bZoomOut == false && _bZoomIn == false && _bRotateLeft == false && _bRotateRight == false)
503 {
504 Vec3 nearP(location.x, location.y, -1.0f), farP(location.x, location.y, 1.0f);
505
506 auto size = Director::getInstance()->getWinSize();
507 nearP = _camera->unproject(nearP);
508 farP = _camera->unproject(farP);
509 Vec3 dir(farP - nearP);
510 float dist=0.0f;
511 float ndd = Vec3::dot(Vec3(0,1,0),dir);
512 if(ndd == 0)
513 dist=0.0f;
514 float ndo = Vec3::dot(Vec3(0,1,0),nearP);
515 dist= (0 - ndo) / ndd;
516 Vec3 p = nearP + dist * dir;
517
518 if( p.x > 100)
519 p.x = 100;
520 if( p.x < -100)
521 p.x = -100;
522 if( p.z > 100)
523 p.z = 100;
524 if( p.z < -100)
525 p.z = -100;
526
527 _targetPos=p;
528 }
529 }
530 }
531}
532void onTouchesCancelled(const std::vector<Touch*>& touches, cocos2d::Event *event)
533{
534}
536{
537 if(_sprite3D)
538 {
540 {
541 updateState(fDelta);
543 {
544 move3D(fDelta);
546 {
547 Vec3 curPos = _sprite3D->getPosition3D();
548
549 Vec3 newFaceDir = _targetPos - curPos;
550 newFaceDir.y = 0;
551 newFaceDir.normalize();
552 Vec3 up;
553 _sprite3D->getNodeToWorldTransform().getUpVector(&up);
554 up.normalize();
555 Vec3 right;
556 Vec3::cross(-newFaceDir,up,&right);
557 right.normalize();
558 Vec3 pos = Vec3(0,0,0);
559 Mat4 mat;
560 mat.m[0] = right.x;
561 mat.m[1] = right.y;
562 mat.m[2] = right.z;
563 mat.m[3] = 0.0f;
564
565 mat.m[4] = up.x;
566 mat.m[5] = up.y;
567 mat.m[6] = up.z;
568 mat.m[7] = 0.0f;
569
570 mat.m[8] = newFaceDir.x;
571 mat.m[9] = newFaceDir.y;
572 mat.m[10] = newFaceDir.z;
573 mat.m[11] = 0.0f;
574
575 mat.m[12] = pos.x;
576 mat.m[13] = pos.y;
577 mat.m[14] = pos.z;
578 mat.m[15] = 1.0f;
579 _sprite3D->setAdditionalTransform(&mat);
580 }
581 }
582 }
583 if(_bZoomOut == true)
584 {
585 if(_camera)
586 {
588 {
589 Vec3 lookDir = _camera->getPosition3D() - _sprite3D->getPosition3D();
590 Vec3 cameraPos = _camera->getPosition3D();
591 if(lookDir.length() <= 300)
592 {
593 cameraPos += lookDir.getNormalized();
594 _camera->setPosition3D(cameraPos);
595 }
596 }
597 else if(_cameraType == CameraType::Free)
598 {
599 Vec3 cameraPos = _camera->getPosition3D();
600 if(cameraPos.length() <= 300)
601 {
602 cameraPos += cameraPos.getNormalized();
603 _camera->setPosition3D(cameraPos);
604 }
605 }
606 }
607 }
608 if(_bZoomIn == true)
609 {
610 if(_camera)
611 {
613 {
614 Vec3 lookDir = _camera->getPosition3D() - _sprite3D->getPosition3D();
615 Vec3 cameraPos = _camera->getPosition3D();
616 if(lookDir.length() >= 50)
617 {
618 cameraPos -= lookDir.getNormalized();
619 _camera->setPosition3D(cameraPos);
620 }
621 }
622 else if(_cameraType == CameraType::Free)
623 {
624 Vec3 cameraPos = _camera->getPosition3D();
625 if(cameraPos.length() >= 50)
626 {
627 cameraPos -= cameraPos.getNormalized();
628 _camera->setPosition3D(cameraPos);
629 }
630 }
631 }
632 }
633 if(_bRotateLeft == true)
634 {
636 {
637 Vec3 rotation3D= _camera->getRotation3D();
638 rotation3D.y+= 1;
639 _camera->setRotation3D(rotation3D);
640 }
641 }
642 if(_bRotateRight == true)
643 {
645 {
646 Vec3 rotation3D= _camera->getRotation3D();
647 rotation3D.y-= 1;
648 _camera->setRotation3D(rotation3D);
649 }
650 }
651 }
652}
653bool Camera3DTestDemo::onTouchesCommon(Touch* touch, Event* event, bool* touchProperty)
654{
655 auto target = static_cast<Label*>(event->getCurrentTarget());
656
657 Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation());
658 Size s = target->getContentSize();
659 Rect rect = Rect(0, 0, s.width, s.height);
660
661 if (rect.containsPoint(locationInNode))
662 {
663 *touchProperty = true;
664 return true;
665 }
666 return false;
667}
668bool Camera3DTestDemo::isState(unsigned int state,unsigned int bit) const
669{
670 return (state & bit) == bit;
671}
672bool Camera3DTestDemo::onTouchesZoomOut(Touch* touch, Event* event)
673{
674 return Camera3DTestDemo::onTouchesCommon(touch, event, &_bZoomOut);
675}
676void Camera3DTestDemo::onTouchesZoomOutEnd(Touch* touch, Event* event)
677{
678 _bZoomOut = false;
679}
680bool Camera3DTestDemo::onTouchesZoomIn(Touch* touch, Event* event)
681{
682 return Camera3DTestDemo::onTouchesCommon(touch, event, &_bZoomIn);
683}
684void Camera3DTestDemo::onTouchesZoomInEnd(Touch* touch, Event* event)
685{
686 _bZoomIn = false;
687}
688bool Camera3DTestDemo::onTouchesRotateLeft(Touch* touch, Event* event)
689{
690 return Camera3DTestDemo::onTouchesCommon(touch, event, &_bRotateLeft);
691}
692void Camera3DTestDemo::onTouchesRotateLeftEnd(Touch* touch, Event* event)
693{
694 _bRotateLeft = false;
695}
696bool Camera3DTestDemo::onTouchesRotateRight(Touch* touch, Event* event)
697{
699}
700void Camera3DTestDemo::onTouchesRotateRightEnd(Touch* touch, Event* event)
701{
702 _bRotateRight = false;
703}
704
706// CameraCullingDemo
708: _layer3D(nullptr)
709, _cameraType(CameraType::FirstPerson)
710, _cameraFirst(nullptr)
711, _cameraThird(nullptr)
712, _moveAction(nullptr)
713, _drawAABB(nullptr)
714, _drawFrustum(nullptr)
715, _row(3)
716{
717}
719{
720}
721
722std::string CameraCullingDemo::title() const
723{
724 return "Camera Frustum Clipping";
725}
726
728{
730
731 schedule(CC_SCHEDULE_SELECTOR(CameraCullingDemo::update), 0.0f);
732
733 auto s = Director::getInstance()->getWinSize();
734 /*auto listener = EventListenerTouchAllAtOnce::create();
735 listener->onTouchesBegan = CC_CALLBACK_2(Camera3DTestDemo::onTouchesBegan, this);
736 listener->onTouchesMoved = CC_CALLBACK_2(Camera3DTestDemo::onTouchesMoved, this);
737 listener->onTouchesEnded = CC_CALLBACK_2(Camera3DTestDemo::onTouchesEnded, this);
738 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);*/
739 auto layer3D=Layer::create();
740 addChild(layer3D,0);
741 _layer3D=layer3D;
742
743 // switch camera
744 MenuItemFont::setFontName("fonts/arial.ttf");
745 MenuItemFont::setFontSize(20);
746
747 auto menuItem1 = MenuItemFont::create("Switch Camera", CC_CALLBACK_1(CameraCullingDemo::switchViewCallback,this));
748 menuItem1->setColor(Color3B(0,200,20));
749 auto menu = Menu::create(menuItem1,NULL);
750 menu->setPosition(Vec2::ZERO);
751 menuItem1->setPosition(VisibleRect::left().x + 80, VisibleRect::top().y -70);
752 addChild(menu, 1);
753
754 // + -
755 MenuItemFont::setFontSize(40);
756 auto decrease = MenuItemFont::create(" - ", CC_CALLBACK_1(CameraCullingDemo::delSpriteCallback, this));
757 decrease->setColor(Color3B(0,200,20));
758 auto increase = MenuItemFont::create(" + ", CC_CALLBACK_1(CameraCullingDemo::addSpriteCallback, this));
759 increase->setColor(Color3B(0,200,20));
760
761 menu = Menu::create(decrease, increase, nullptr);
762 menu->alignItemsHorizontally();
763 menu->setPosition(Vec2(s.width - 60, VisibleRect::top().y -70));
764 addChild(menu, 1);
765
766 TTFConfig ttfCount("fonts/Marker Felt.ttf", 30);
767 _labelSprite3DCount = Label::createWithTTF(ttfCount,"0 sprits");
768 _labelSprite3DCount->setColor(Color3B(0,200,20));
769 _labelSprite3DCount->setPosition(Vec2(s.width/2, VisibleRect::top().y -70));
770 addChild(_labelSprite3DCount);
771
772 // aabb drawNode3D
774 _drawAABB->setCameraMask((unsigned short) CameraFlag::USER1);
775 addChild(_drawAABB);
776
777 // frustum drawNode3D
779 _drawFrustum->setCameraMask((unsigned short) CameraFlag::USER1);
780 addChild(_drawFrustum);
781
782 // set camera
783 switchViewCallback(this);
784
785 // add sprite
786 addSpriteCallback(nullptr);
787}
788
790{
791 CameraBaseTest::onExit();
792 if (_cameraFirst)
793 {
794 _cameraFirst = nullptr;
795 }
796 if (_cameraThird)
797 {
798 _cameraThird = nullptr;
799 }
800}
801
803{
804 _drawAABB->clear();
805
808
809 Vector<Node*>& children = _layer3D->getChildren();
810 Vec3 corners[8];
811
812 for (const auto& iter: children)
813 {
814 const AABB& aabb = static_cast<Sprite3D*>(iter)->getAABB();
815 if (_cameraFirst->isVisibleInFrustum(&aabb))
816 {
817 aabb.getCorners(corners);
818 _drawAABB->drawCube(corners, Color4F(0, 1, 0, 1));
819 }
820 }
821}
822
824{
825 _cameraFirst->stopActionByTag(100);
826 auto inverse = MoveTo::create(4.f, Vec2(-_cameraFirst->getPositionX(), 0.0f));
827 inverse->retain();
828
829 _moveAction->release();
830 _moveAction = inverse;
831 auto rot = RotateBy::create(1.f, Vec3(0.f, 180.f, 0.f));
832 auto seq = Sequence::create(rot, _moveAction, CallFunc::create(CC_CALLBACK_0(CameraCullingDemo::reachEndCallBack, this)), nullptr);
833 seq->setTag(100);
834 _cameraFirst->runAction(seq);
835}
836
838{
839 auto s = Director::getInstance()->getWinSize();
840
841 if (_cameraFirst == nullptr)
842 {
843 _cameraFirst = Camera::createPerspective(30.0f, (float)s.width/s.height, 10.0f, 200.0f);
844 _cameraFirst->setCameraFlag(CameraFlag::USER8);
845 _cameraFirst->setPosition3D(Vec3(-100.0f,0.0f,0.0f));
846 _cameraFirst->lookAt(Vec3(1000.0f,0.0f,0.0f));
847 _moveAction = MoveTo::create(4.f, Vec2(-_cameraFirst->getPositionX(), 0.0f));
848 _moveAction->retain();
849 auto seq = Sequence::create(_moveAction, CallFunc::create(CC_CALLBACK_0(CameraCullingDemo::reachEndCallBack, this)), nullptr);
850 seq->setTag(100);
851 _cameraFirst->runAction(seq);
852 addChild(_cameraFirst);
853 }
854
855 if (_cameraThird == nullptr)
856 {
857 _cameraThird = Camera::createPerspective(60, (float)s.width/s.height, 1, 1000);
858 _cameraThird->setCameraFlag(CameraFlag::USER8);
859 _cameraThird->setPosition3D(Vec3(0.0f, 130.0f, 130.0f));
860 _cameraThird->lookAt(Vec3(0,0,0));
861 addChild(_cameraThird);
862 }
863
865 {
867 _cameraThird->setCameraFlag(CameraFlag::USER1);
868 _cameraFirst->setCameraFlag(CameraFlag::USER8);
869 }
871 {
873 _cameraFirst->setCameraFlag(CameraFlag::USER1);
874 _cameraThird->setCameraFlag(CameraFlag::USER8);
875 _drawFrustum->clear();
876 }
877}
878
880{
881 _layer3D->removeAllChildren();
882 _objects.clear();
883 _drawAABB->clear();
884
885 ++_row;
886 for (int x = -_row; x < _row; x++)
887 {
888 for (int z = -_row; z < _row; z++)
889 {
890 auto sprite = Sprite3D::create("Sprite3DTest/orc.c3b");
891 sprite->setPosition3D(Vec3(x * 30.0f, 0.0f, z * 30.0f));
892 sprite->setRotation3D(Vec3(0.0f,180.0f,0.0f));
893 _objects.push_back(sprite);
894 _layer3D->addChild(sprite);
895 }
896 }
897
898 // set layer mask.
899 _layer3D->setCameraMask( (unsigned short) CameraFlag::USER1);
900
901 // update sprite number
902 char szText[16];
903 sprintf(szText,"%ld sprits", static_cast<long>(_layer3D->getChildrenCount()));
904 _labelSprite3DCount->setString(szText);
905}
906
908{
909 if (_row == 0) return;
910
911 _layer3D->removeAllChildren();
912 _objects.clear();
913
914 --_row;
915 for (int x = -_row; x < _row; x++)
916 {
917 for (int z = -_row; z < _row; z++)
918 {
919 auto sprite = Sprite3D::create("Sprite3DTest/orc.c3b");
920 sprite->setPosition3D(Vec3(x * 30.0f, 0.0f, z * 30.0f));
921 _objects.push_back(sprite);
922 _layer3D->addChild(sprite);
923 }
924 }
925
926 // set layer mask.
927 _layer3D->setCameraMask((unsigned short) CameraFlag::USER1);
928
929 // update sprite number
930 char szText[16];
931 sprintf(szText,"%ld sprits", static_cast<long>(_layer3D->getChildrenCount()));
932 _labelSprite3DCount->setString(szText);
933}
934
936{
937 _drawFrustum->clear();
938 auto size = Director::getInstance()->getWinSize();
939
940 Color4F color(1.f, 1.f, 0.f, 1);
941
942 // top-left
943 Vec3 tl_0,tl_1;
944 Vec3 src(0,0,0);
945 tl_0 = _cameraFirst->unproject(src);
946 src = Vec3(0,0,1);
947 tl_1 = _cameraFirst->unproject(src);
948
949 // top-right
950 Vec3 tr_0,tr_1;
951 src = Vec3(size.width,0,0);
952 tr_0 = _cameraFirst->unproject(src);
953 src = Vec3(size.width,0,1);
954 tr_1 = _cameraFirst->unproject(src);
955
956 // bottom-left
957 Vec3 bl_0,bl_1;
958 src = Vec3(0,size.height,0);
959 bl_0 = _cameraFirst->unproject(src);
960 src = Vec3(0,size.height,1);
961 bl_1 = _cameraFirst->unproject(src);
962
963 // bottom-right
964 Vec3 br_0,br_1;
965 src = Vec3(size.width,size.height,0);
966 br_0 = _cameraFirst->unproject(src);
967 src = Vec3(size.width,size.height,1);
968 br_1 = _cameraFirst->unproject(src);
969
970 _drawFrustum->drawLine(tl_0, tl_1, color);
971 _drawFrustum->drawLine(tr_0, tr_1, color);
972 _drawFrustum->drawLine(bl_0, bl_1, color);
973 _drawFrustum->drawLine(br_0, br_1, color);
974
975 _drawFrustum->drawLine(tl_0, tr_0, color);
976 _drawFrustum->drawLine(tr_0, br_0, color);
977 _drawFrustum->drawLine(br_0, bl_0, color);
978 _drawFrustum->drawLine(bl_0, tl_0, color);
979
980 _drawFrustum->drawLine(tl_1, tr_1, color);
981 _drawFrustum->drawLine(tr_1, br_1, color);
982 _drawFrustum->drawLine(br_1, bl_1, color);
983 _drawFrustum->drawLine(bl_1, tl_1, color);
984}
985
987// CameraArcBallDemo
990, _layer3D(nullptr)
991, _cameraType(CameraType::Free)
992, _camera(nullptr)
993, _drawGrid(nullptr)
994, _radius(1.0f)
995, _distanceZ(50.0f)
996, _operate(OperateCamType::RotateCamera)
997, _center(Vec3(0,0,0))
998, _target(0)
999, _sprite3D1(nullptr)
1000, _sprite3D2(nullptr)
1001{
1002}
1004{
1005}
1006
1007std::string CameraArcBallDemo::title() const
1008{
1009 return "Camera ArcBall Moving";
1010}
1011
1013{
1015 _rotationQuat.set(0.0f, 0.0f, 0.0f, 1.0f);
1016 schedule(CC_SCHEDULE_SELECTOR(CameraArcBallDemo::update), 0.0f);
1017 auto s = Director::getInstance()->getWinSize();
1018 auto listener = EventListenerTouchAllAtOnce::create();
1019 listener->onTouchesMoved = CC_CALLBACK_2(CameraArcBallDemo::onTouchsMoved, this);
1020 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
1021
1022 // switch camera
1023 MenuItemFont::setFontName("fonts/arial.ttf");
1024 MenuItemFont::setFontSize(20);
1025
1026 auto menuItem1 = MenuItemFont::create("Switch Operation", CC_CALLBACK_1(CameraArcBallDemo::switchOperateCallback,this));
1027 menuItem1->setColor(Color3B(0,200,20));
1028 auto menuItem2 = MenuItemFont::create("Switch Target", CC_CALLBACK_1(CameraArcBallDemo::switchTargetCallback,this));
1029 menuItem2->setColor(Color3B(0,200,20));
1030 auto menu = Menu::create(menuItem1,menuItem2,NULL);
1031 menu->setPosition(Vec2::ZERO);
1032 menuItem1->setPosition(VisibleRect::left().x + 80, VisibleRect::top().y -70);
1033 menuItem2->setPosition(VisibleRect::left().x + 80, VisibleRect::top().y -100);
1034 addChild(menu, 1);
1035
1036 auto layer3D=Layer::create();
1037 addChild(layer3D,0);
1038 _layer3D=layer3D;
1039
1040 if (_camera == nullptr)
1041 {
1042 _camera=Camera::createPerspective(60, (float)s.width/s.height, 1, 1000);
1043 _camera->setCameraFlag(CameraFlag::USER1);
1044 _camera->setPosition3D(Vec3(0.0f, 10.0f, 50.0f));
1045 _camera->lookAt(Vec3(0, 0, 0), Vec3(0.0f, 1.0f, 0.0f));
1046 _camera->retain();
1047 _layer3D->addChild(_camera);
1048 }
1049
1050 _sprite3D1 = Sprite3D::create("Sprite3DTest/orc.c3b");
1051 _sprite3D1->setScale(0.5);
1052 _sprite3D1->setRotation3D(Vec3(0.0f,180.0f,0.0f));
1053 _sprite3D1->setPosition3D(Vec3(0,0,0));
1054 _layer3D->addChild(_sprite3D1);
1055
1056 _sprite3D2 = Sprite3D::create("Sprite3DTest/boss.c3b");
1057 _sprite3D2->setScale(0.6f);
1058 _sprite3D2->setRotation3D(Vec3(-90.0f,0.0f,0.0f));
1059 _sprite3D2->setPosition3D(Vec3(20.0f,0.0f,0.0f));
1060 _layer3D->addChild(_sprite3D2);
1061
1063
1064 //draw x
1065 for( int j =-20; j<=20 ;j++)
1066 {
1067 _drawGrid->drawLine(Vec3(-100.0f, 0, 5.0f*j),Vec3(100.0f,0,5.0f*j),Color4F(1,0,0,1));
1068 }
1069 //draw z
1070 for( int j =-20; j<=20 ;j++)
1071 {
1072 _drawGrid->drawLine(Vec3(5.0f*j, 0, -100.0f),Vec3(5.0f*j,0,100.0f),Color4F(0,0,1,1));
1073 }
1074 //draw y
1075 _drawGrid->drawLine(Vec3(0, 0, 0),Vec3(0,50.0f,0),Color4F(0,1,0,1));
1076 _layer3D->addChild(_drawGrid);
1077
1078 _layer3D->setCameraMask(2);
1079
1081
1082}
1083
1085{
1086 CameraBaseTest::onExit();
1087 if (_camera)
1088 {
1089 _camera = nullptr;
1090 }
1091}
1092
1093void CameraArcBallDemo::onTouchsMoved( const std::vector<Touch*> &touchs, Event *event )
1094{
1095 if (!touchs.empty())
1096 {
1097 if(_operate == OperateCamType::RotateCamera) //arc ball rotate
1098 {
1099 Size visibleSize = Director::getInstance()->getVisibleSize();
1100 Vec2 prelocation = touchs[0]->getPreviousLocationInView();
1101 Vec2 location = touchs[0]->getLocationInView();
1102 location.x = 2.0f * (location.x) / (visibleSize.width) - 1.0f;
1103 location.y = 2.0f * (visibleSize.height - location.y) / (visibleSize.height) - 1.0f;
1104 prelocation.x = 2.0f * (prelocation.x) / (visibleSize.width) - 1.0f;
1105 prelocation.y = 2.0f * (visibleSize.height - prelocation.y) / (visibleSize.height) - 1.0f;
1106
1107 Vec3 axes;
1108 float angle;
1109 calculateArcBall(axes, angle, prelocation.x, prelocation.y, location.x, location.y); //calculate rotation quaternion parameters
1110 Quaternion quat(axes, angle); //get rotation quaternion
1112
1113 updateCameraTransform(); //update camera Transform
1114 }
1115 else if(_operate == OperateCamType::MoveCamera) //camera zoom
1116 {
1117 Point newPos = touchs[0]->getPreviousLocation() - touchs[0]->getLocation();
1118 _distanceZ -= newPos.y*0.1f;
1119
1121 }
1122 }
1123}
1124
1125void CameraArcBallDemo::calculateArcBall( cocos2d::Vec3 & axis, float & angle, float p1x, float p1y, float p2x, float p2y )
1126{
1127 Mat4 rotation_matrix;
1128 Mat4::createRotation(_rotationQuat, &rotation_matrix);
1129
1130 Vec3 uv = rotation_matrix * Vec3(0.0f,1.0f,0.0f); //rotation y
1131 Vec3 sv = rotation_matrix * Vec3(1.0f,0.0f,0.0f); //rotation x
1132 Vec3 lv = rotation_matrix * Vec3(0.0f,0.0f,-1.0f);//rotation z
1133
1134 Vec3 p1 = sv * p1x + uv * p1y - lv * projectToSphere(_radius, p1x, p1y); //start point screen transform to 3d
1135 Vec3 p2 = sv * p2x + uv * p2y - lv * projectToSphere(_radius, p2x, p2y); //end point screen transform to 3d
1136
1137 Vec3::cross(p2, p1, &axis); //calculate rotation axis
1138 axis.normalize();
1139
1140 float t = (p2 - p1).length() / (2.0f * _radius);
1141 //clamp -1 to 1
1142 if (t > 1.0) t = 1.0;
1143 if (t < -1.0) t = -1.0;
1144 angle = asin(t); //rotation angle
1145}
1146
1147/* project an x,y pair onto a sphere of radius r or a
1148hyperbolic sheet if we are away from the center of the sphere. */
1149float CameraArcBallDemo::projectToSphere( float r, float x, float y )
1150{
1151 float d, t, z;
1152 d = sqrt(x*x + y*y);
1153 if (d < r * 0.70710678118654752440)//inside sphere
1154 {
1155 z = sqrt(r*r - d*d);
1156 }
1157 else //on hyperbola
1158 {
1159 t = r / 1.41421356237309504880f;
1160 z = t*t / d;
1161 }
1162 return z;
1163}
1164
1166{
1167 Mat4 trans, rot, center;
1168 Mat4::createTranslation(Vec3(0.0f, 10.0f, _distanceZ), &trans);
1169 Mat4::createRotation(_rotationQuat, &rot);
1170 Mat4::createTranslation(_center, &center);
1171 Mat4 result = center * rot * trans;
1172 _camera->setNodeToParentTransform(result);
1173}
1174
1176{
1178 {
1180 }
1182 {
1184 }
1185}
1186
1188{
1189 if(_target == 0)
1190 {
1191 _target = 1;
1192 _center = _sprite3D2->getPosition3D();
1194 }
1195 else if(_target == 1)
1196 {
1197 _target = 0;
1198 _center = _sprite3D1->getPosition3D();
1200 }
1201}
1202
1204{
1205 //updateCameraTransform();
1206}
1207
1209// FogTestDemo
1212{
1213}
1215{
1216 CC_SAFE_RELEASE_NULL(_programState1);
1217 CC_SAFE_RELEASE_NULL(_programState2);
1218}
1219
1220std::string FogTestDemo::title() const
1221{
1222 return "Fog Test Demo";
1223}
1224
1226{
1228 schedule(CC_SCHEDULE_SELECTOR(FogTestDemo::update), 0.0f);
1229 Director::getInstance()->setClearColor(Color4F(0.5,0.5,0.5,1));
1230
1231 auto s = Director::getInstance()->getWinSize();
1232 auto listener = EventListenerTouchAllAtOnce::create();
1233 listener->onTouchesMoved = CC_CALLBACK_2(FogTestDemo::onTouchesMoved, this);
1234 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
1235
1236 // switch fog type
1237 TTFConfig ttfConfig("fonts/arial.ttf", 20);
1238
1239 auto label1 = Label::createWithTTF(ttfConfig,"Linear ");
1240 auto menuItem1 = MenuItemLabel::create(label1, CC_CALLBACK_1(FogTestDemo::switchTypeCallback,this,0));
1241 auto label2 = Label::createWithTTF(ttfConfig,"Exp");
1242 auto menuItem2 = MenuItemLabel::create(label2, CC_CALLBACK_1(FogTestDemo::switchTypeCallback,this,1));
1243 auto label3 = Label::createWithTTF(ttfConfig,"Exp2");
1244 auto menuItem3 = MenuItemLabel::create(label3, CC_CALLBACK_1(FogTestDemo::switchTypeCallback,this,2));
1245 auto menu = Menu::create(menuItem1, menuItem2, menuItem3, nullptr);
1246
1247 menu->setPosition(Vec2::ZERO);
1248
1249 menuItem1->setPosition(VisibleRect::left().x+60, VisibleRect::top().y-50);
1250 menuItem2->setPosition(VisibleRect::left().x+60, VisibleRect::top().y -100);
1251 menuItem3->setPosition(VisibleRect::left().x+60, VisibleRect::top().y -150);
1252 addChild(menu, 0);
1253
1254
1255 auto layer3D=Layer::create();
1256 addChild(layer3D,0);
1257 _layer3D=layer3D;
1258
1259 CC_SAFE_RELEASE_NULL(_programState1);
1260 CC_SAFE_RELEASE_NULL(_programState2);
1261
1262 auto vertexSource = FileUtils::getInstance()->getStringFromFile("Sprite3DTest/fog.vert");
1263 auto fragSource = FileUtils::getInstance()->getStringFromFile("Sprite3DTest/fog.frag");
1264 auto program = backend::Device::getInstance()->newProgram(vertexSource, fragSource);
1265 _programState1 = new backend::ProgramState(program);
1266 _programState2 = new backend::ProgramState(program);
1267 CC_SAFE_RELEASE(program);
1268
1269 _sprite3D1 = Sprite3D::create("Sprite3DTest/teapot.c3b");
1270 _sprite3D2 = Sprite3D::create("Sprite3DTest/teapot.c3b");
1271
1272 _sprite3D1->setProgramState(_programState1);
1273 _sprite3D2->setProgramState(_programState2);
1274
1275 auto fogColor = Vec4(0.5, 0.5, 0.5, 1.0);
1276 float fogStart = 10;
1277 float fogEnd = 60;
1278 int fogEquation = 0;
1279
1280 SET_UNIFORM("u_fogColor", &fogColor, sizeof(fogColor));
1281 SET_UNIFORM("u_fogStart", &fogStart, sizeof(fogStart));
1282 SET_UNIFORM("u_fogEnd", &fogEnd, sizeof(fogEnd));
1283 SET_UNIFORM("u_fogEquation", &fogEquation, sizeof(fogEquation));
1284
1285 _layer3D->addChild(_sprite3D1);
1286 _sprite3D1->setPosition3D( Vec3( 0, 0,0 ) );
1287 _sprite3D1->setScale(2.0f);
1288 _sprite3D1->setRotation3D(Vec3(-90.0f,180.0f,0.0f));
1289
1290 _layer3D->addChild(_sprite3D2);
1291 _sprite3D2->setPosition3D( Vec3( 0.0f, 0.0f,-20.0f) );
1292 _sprite3D2->setScale(2.0f);
1293 _sprite3D2->setRotation3D(Vec3(-90.0f,180.0f,0.0f));
1294
1295 if (_camera == nullptr)
1296 {
1297 _camera=Camera::createPerspective(60, (float)s.width/s.height, 1, 1000);
1298 _camera->setCameraFlag(CameraFlag::USER1);
1299 _camera->setPosition3D(Vec3(0.0f, 30.0f, 40.0f));
1300 _camera->lookAt(Vec3(0,0,0), Vec3(0.0f, 1.0f, 0.0f));
1301
1302 _layer3D->addChild(_camera);
1303 }
1304 _layer3D->setCameraMask(2);
1305
1306
1307#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
1308 _backToForegroundListener = EventListenerCustom::create(EVENT_RENDERER_RECREATED,
1309 [this](EventCustom*)
1310 {
1311 Director::getInstance()->setClearColor(Color4F(0.5,0.5,0.5,1));
1312 CC_SAFE_RELEASE_NULL(_programState1);
1313 CC_SAFE_RELEASE_NULL(_programState2);
1314
1315 auto vertexSource = FileUtils::getInstance()->getStringFromFile("Sprite3DTest/fog.vert");
1316 auto fragSource = FileUtils::getInstance()->getStringFromFile("Sprite3DTest/fog.frag");
1317 auto program = backend::Device::getInstance()->newProgram(vertexSource, fragSource);
1318 _programState1 = new backend::ProgramState(program);
1319 _programState2 = new backend::ProgramState(program);
1320
1321 _sprite3D1->setProgramState(_programState1);
1322 _sprite3D2->setProgramState(_programState2);
1323 CC_SAFE_RELEASE(program);
1324
1325 auto fogColor = Vec4(0.5, 0.5, 0.5, 1.0);
1326 float fogStart = 10;
1327 float fogEnd = 60;
1328 int fogEquation = 0;
1329
1330 SET_UNIFORM("u_fogColor", &fogColor, sizeof(fogColor));
1331 SET_UNIFORM("u_fogStart", &fogStart, sizeof(fogStart));
1332 SET_UNIFORM("u_fogEnd", &fogEnd, sizeof(fogEnd));
1333 SET_UNIFORM("u_fogEquation", &fogEquation, sizeof(fogEquation));
1334 }
1335 );
1336 Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_backToForegroundListener, -1);
1337#endif
1338
1339}
1340
1341void FogTestDemo::switchTypeCallback(Ref* sender,int type)
1342{
1343 if(type == 0)
1344 {
1345 auto fogColor = Vec4(0.5, 0.5, 0.5, 1.0);
1346 float fogStart = 10;
1347 float fogEnd = 60;
1348 int fogEquation = 0;
1349
1350 SET_UNIFORM("u_fogColor", &fogColor, sizeof(fogColor));
1351 SET_UNIFORM("u_fogStart", &fogStart, sizeof(fogStart));
1352 SET_UNIFORM("u_fogEnd", &fogEnd, sizeof(fogEnd));
1353 SET_UNIFORM("u_fogEquation", &fogEquation, sizeof(fogEquation));
1354
1355 }
1356 else if(type == 1)
1357 {
1358 auto fogColor = Vec4(0.5, 0.5, 0.5, 1.0);
1359 float fogDensity = 0.03f;
1360 int fogEquation = 1;
1361
1362 SET_UNIFORM("u_fogColor", &fogColor, sizeof(fogColor));
1363 SET_UNIFORM("u_fogDensity", &fogDensity, sizeof(fogDensity));
1364 SET_UNIFORM("u_fogEquation", &fogEquation, sizeof(fogEquation));
1365 }
1366 else if(type == 2)
1367 {
1368 auto fogColor = Vec4(0.5, 0.5, 0.5, 1.0);
1369 float fogDensity = 0.03f;
1370 int fogEquation = 2;
1371
1372 SET_UNIFORM("u_fogColor", &fogColor, sizeof(fogColor));
1373 SET_UNIFORM("u_fogDensity", &fogDensity, sizeof(fogDensity));
1374 SET_UNIFORM("u_fogEquation", &fogEquation, sizeof(fogEquation));
1375 }
1376}
1377
1379{
1380 CameraBaseTest::onExit();
1381 Director::getInstance()->setClearColor(Color4F(0,0,0,1));
1382 if (_camera)
1383 {
1384 _camera = nullptr;
1385 }
1386
1387#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
1388 Director::getInstance()->getEventDispatcher()->removeEventListener(_backToForegroundListener);
1389#endif
1390}
1391
1393{
1394}
1395
1396void FogTestDemo::onTouchesMoved(const std::vector<Touch*>& touches, cocos2d::Event *event)
1397{
1398 if(touches.size()==1)
1399 {
1400 Vec2 prelocation = touches[0]->getPreviousLocationInView();
1401 Vec2 location = touches[0]->getLocationInView();
1402 Vec2 newPos = prelocation - location;
1404 {
1405 Vec3 cameraDir;
1406 Vec3 cameraRightDir;
1407 _camera->getNodeToWorldTransform().getForwardVector(&cameraDir);
1408 cameraDir.normalize();
1409 cameraDir.y=0;
1410 _camera->getNodeToWorldTransform().getRightVector(&cameraRightDir);
1411 cameraRightDir.normalize();
1412 cameraRightDir.y=0;
1413 Vec3 cameraPos= _camera->getPosition3D();
1414 cameraPos-=cameraDir*newPos.y*0.1f;
1415 cameraPos+=cameraRightDir*newPos.x*0.1f;
1416 _camera->setPosition3D(cameraPos);
1417 }
1418 }
1419}
1420
1421//CameraFrameBufferTest::CameraFrameBufferTest()
1422//{
1423//
1424//}
1425//
1426//CameraFrameBufferTest::~CameraFrameBufferTest()
1427//{
1428//
1429//}
1430//
1431//std::string CameraFrameBufferTest::title() const
1432//{
1433// return "Camera FrameBuffer Object Test";
1434//}
1435//
1436//void CameraFrameBufferTest::onEnter()
1437//{
1438// auto sizeInpixels = Director::getInstance()->getWinSizeInPixels();
1439// auto size = Director::getInstance()->getWinSize();
1440// auto fboSize = Size(sizeInpixels.width * 1, sizeInpixels.height * 1.5);
1441// auto fbo = experimental::FrameBuffer::create(1, fboSize.width, fboSize.height);
1442//
1443// CameraBaseTest::onEnter();
1444// //auto sprite = Sprite::createWithTexture(fbo);
1445// //sprite->setPosition(Vec2(100,100));
1446// //std::string filename = "Sprite3DTest/girl.c3b";
1447// //auto sprite = Sprite3D::create(filename);
1448// //sprite->setScale(1.0);
1449// //auto animation = Animation3D::create(filename);
1450// //if (animation)
1451// //{
1452// // auto animate = Animate3D::create(animation);
1453//
1454// // sprite->runAction(RepeatForever::create(animate));
1455// //}
1456// //sprite->setPosition(Vec2(100,100));
1457// auto rt = experimental::RenderTarget::create(fboSize.width, fboSize.height);
1458// auto rtDS = experimental::RenderTargetDepthStencil::create(fboSize.width, fboSize.height);
1459// fbo->attachRenderTarget(rt);
1460// fbo->attachDepthStencilTarget(rtDS);
1461// auto sprite = Sprite::createWithTexture(fbo->getRenderTarget()->getTexture());
1462// sprite->setScale(0.3f);
1463// sprite->runAction(RepeatForever::create(RotateBy::create(1, 90)));
1464// sprite->setPosition(size.width/2, size.height/2);
1465// addChild(sprite);
1466//
1467// auto sprite2 = Sprite::create(s_pathGrossini);
1468// sprite2->setPosition(Vec2(size.width/5,size.height/5));
1469// addChild(sprite2);
1470// sprite2->setCameraMask((unsigned short)CameraFlag::USER1);
1471// auto move = MoveBy::create(1.0, Vec2(100,100));
1472// sprite2->runAction(
1473// RepeatForever::create(
1474// Sequence::createWithTwoActions(
1475// move, move->reverse())
1476// )
1477// );
1478//
1479// auto camera = Camera::create();
1480// camera->setCameraFlag(CameraFlag::USER1);
1481// camera->setDepth(-1);
1482// camera->setFrameBufferObject(fbo);
1483// fbo->setClearColor(Color4F(1,1,1,1));
1484// addChild(camera);
1485//}
1486
1488{
1489}
1490
1492{
1493}
1494
1496{
1497 return "CameraBackgroundColorBrush Test";
1498}
1499
1501{
1502 return "right side object colored by CameraBG";
1503}
1504
1506{
1508
1509 auto s = Director::getInstance()->getWinSize();
1510
1511 {
1512 // 1st Camera
1513 auto camera = Camera::createPerspective(60.0f, (float)s.width/s.height, 1.0f, 1000.0f);
1514 camera->setPosition3D(Vec3(0.0f, 0.0f, 200.0f));
1515 camera->lookAt(Vec3::ZERO);
1516 camera->setDepth(-2);
1517 camera->setCameraFlag(CameraFlag::USER1);
1518 addChild(camera);
1519
1520 // 3D model
1521 auto model = Sprite3D::create("Sprite3DTest/boss1.obj");
1522 model->setScale(4);
1523 model->setPosition3D(Vec3(20.0f, 0.0f, 0.0f));
1524 model->setTexture("Sprite3DTest/boss.png");
1525 model->setCameraMask(static_cast<unsigned short>(CameraFlag::USER1));
1526 addChild(model);
1527 model->runAction(RepeatForever::create(RotateBy::create(1.f, Vec3(10.0f, 20.0f, 30.0f))));
1528 }
1529
1530 {
1531 auto base = Node::create();
1532 base->setContentSize(s);
1533 base->setCameraMask(static_cast<unsigned short>(CameraFlag::USER2));
1534 addChild(base);
1535
1536 // 2nd Camera
1537 auto camera = Camera::createPerspective(60, (float)s.width/s.height, 1, 1000);
1538 auto colorBrush = CameraBackgroundBrush::createColorBrush(Color4F(.1f, .1f, 1.f, .5f), 1.f);
1539 camera->setBackgroundBrush(colorBrush);
1540 camera->setPosition3D(Vec3(0.0f, 0.0f, 200.0f));
1541 camera->lookAt(Vec3::ZERO);
1542 camera->setDepth(-1);
1543 camera->setCameraFlag(CameraFlag::USER2);
1544 base->addChild(camera);
1545
1546 // for alpha setting
1547 auto slider = ui::Slider::create();
1548 slider->loadBarTexture("cocosui/sliderTrack.png");
1549 slider->loadSlidBallTextures("cocosui/sliderThumb.png", "cocosui/sliderThumb.png", "");
1550 slider->loadProgressBarTexture("cocosui/sliderProgress.png");
1551 slider->setPosition(Vec2(s.width/2, s.height/4));
1552 slider->setPercent(50);
1553 slider->addEventListener([slider, colorBrush](Ref*, ui::Slider::EventType){
1554 colorBrush->setColor(Color4F(.1f, .1f, 1.f, (float)slider->getPercent()/100.f));
1555 });
1556 addChild(slider);
1557
1558 // 3D model for 2nd camera
1559 auto model = Sprite3D::create("Sprite3DTest/boss1.obj");
1560 model->setScale(4);
1561 model->setPosition3D(Vec3(-20.0f, 0.0f, 0.0f));
1562 model->setTexture("Sprite3DTest/boss.png");
1563 model->setCameraMask(static_cast<unsigned short>(CameraFlag::USER2));
1564 base->addChild(model);
1565 model->runAction(RepeatForever::create(RotateBy::create(1.f, Vec3(10.0f, 20.0f, 30.0f))));
1566 }
1567}
#define ADD_TEST_CASE(__className__)
Definition: BaseTest.h:211
#define SET_UNIFORM(name, addr, size)
@ IDC_RESTART
@ IDC_NEXT
@ IDC_BACK
void onTouchesCancelled(const std::vector< Touch * > &touches, cocos2d::Event *event)
USING_NS_CC
@ State_None
Definition: Camera3DTest.h:43
@ State_Rotate
Definition: Camera3DTest.h:46
@ State_Idle
Definition: Camera3DTest.h:44
@ State_Move
Definition: Camera3DTest.h:45
OperateCamType
Definition: Camera3DTest.h:60
CameraType
Definition: Camera3DTest.h:53
virtual void onEnter() override
virtual std::string title() const override
virtual std::string subtitle() const override
void SwitchViewCallback(cocos2d::Ref *sender, CameraType cameraType)
bool onTouchesZoomIn(cocos2d::Touch *touch, cocos2d::Event *event)
cocos2d::Label * _ZoomOutlabel
Definition: Camera3DTest.h:155
bool onTouchesRotateLeft(cocos2d::Touch *touch, cocos2d::Event *event)
bool onTouchesZoomOut(cocos2d::Touch *touch, cocos2d::Event *event)
unsigned int _curState
Definition: Camera3DTest.h:145
void updateState(float elapsedTime)
bool onTouchesCommon(cocos2d::Touch *touch, cocos2d::Event *event, bool *touchProperty)
bool isState(unsigned int state, unsigned int bit) const
virtual ~Camera3DTestDemo()
cocos2d::Label * _ZoomInlabel
Definition: Camera3DTest.h:154
cocos2d::Vec3 _targetPos
Definition: Camera3DTest.h:141
virtual void onEnter() override
cocos2d::Layer * _layer3D
Definition: Camera3DTest.h:139
void addNewSpriteWithCoords(cocos2d::Vec3 p, std::string fileName, bool playAnimation=false, float scale=1.0f, bool bindCamera=false)
cocos2d::Camera * _camera
Definition: Camera3DTest.h:146
void onTouchesBegan(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
void onTouchesEnded(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
cocos2d::Label * _RotateLeftlabel
Definition: Camera3DTest.h:153
void scaleCameraCallback(cocos2d::Ref *sender, float value)
cocos2d::Sprite3D * _sprite3D
Definition: Camera3DTest.h:140
void rotateCameraCallback(cocos2d::Ref *sender, float value)
virtual std::string title() const override
CameraType _cameraType
Definition: Camera3DTest.h:142
void updateCamera(float fDelta)
void onTouchesRotateRightEnd(cocos2d::Touch *touch, cocos2d::Event *event)
void onTouchesZoomOutEnd(cocos2d::Touch *touch, cocos2d::Event *event)
void move3D(float elapsedTime)
void onTouchesRotateLeftEnd(cocos2d::Touch *touch, cocos2d::Event *event)
bool onTouchesRotateRight(cocos2d::Touch *touch, cocos2d::Event *event)
void onTouchesZoomInEnd(cocos2d::Touch *touch, cocos2d::Event *event)
virtual void onExit() override
void onTouchesMoved(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
cocos2d::Label * _RotateRightlabel
Definition: Camera3DTest.h:152
void onTouchsMoved(const std::vector< cocos2d::Touch * > &touchs, cocos2d::Event *event)
cocos2d::Quaternion _rotationQuat
Definition: Camera3DTest.h:219
float projectToSphere(float r, float x, float y)
virtual void onEnter() override
OperateCamType _operate
Definition: Camera3DTest.h:222
cocos2d::Camera * _camera
Definition: Camera3DTest.h:217
void switchTargetCallback(cocos2d::Ref *sender)
cocos2d::DrawNode3D * _drawGrid
Definition: Camera3DTest.h:218
virtual std::string title() const override
cocos2d::Vec3 _center
Definition: Camera3DTest.h:223
void switchOperateCallback(cocos2d::Ref *sender)
cocos2d::Layer * _layer3D
Definition: Camera3DTest.h:215
void calculateArcBall(cocos2d::Vec3 &axis, float &angle, float p1x, float p1y, float p2x, float p2y)
virtual void onExit() override
cocos2d::Sprite3D * _sprite3D2
Definition: Camera3DTest.h:226
virtual ~CameraArcBallDemo()
virtual void update(float dt) override
cocos2d::Sprite3D * _sprite3D1
Definition: Camera3DTest.h:225
cocos2d::BillBoard * bill1
Definition: Camera3DTest.h:72
cocos2d::Label * l2
Definition: Camera3DTest.h:75
cocos2d::Label * l1
Definition: Camera3DTest.h:74
cocos2d::BillBoard * bill2
Definition: Camera3DTest.h:73
cocos2d::DrawNode3D * _drawFrustum
Definition: Camera3DTest.h:188
cocos2d::Layer * _layer3D
Definition: Camera3DTest.h:181
cocos2d::Camera * _cameraFirst
Definition: Camera3DTest.h:184
virtual ~CameraCullingDemo()
void addSpriteCallback(cocos2d::Ref *sender)
virtual void update(float dt) override
void switchViewCallback(cocos2d::Ref *sender)
virtual void onEnter() override
CameraType _cameraType
Definition: Camera3DTest.h:183
void delSpriteCallback(cocos2d::Ref *sender)
cocos2d::DrawNode3D * _drawAABB
Definition: Camera3DTest.h:187
cocos2d::Camera * _cameraThird
Definition: Camera3DTest.h:185
virtual void onExit() override
cocos2d::Label * _labelSprite3DCount
Definition: Camera3DTest.h:180
virtual std::string title() const override
std::vector< cocos2d::Sprite3D * > _objects
Definition: Camera3DTest.h:182
cocos2d::MoveBy * _moveAction
Definition: Camera3DTest.h:186
cocos2d::Node * _camControlNode
Definition: Camera3DTest.h:96
cocos2d::Node * _camNode
Definition: Camera3DTest.h:97
virtual ~CameraRotationTest()
cocos2d::EventListenerTouchOneByOne * _lis
Definition: Camera3DTest.h:98
virtual void update(float dt) override
virtual void onExit() override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual void onEnter() override
static cocos2d::DrawNode3D * create()
Definition: DrawNode3D.cpp:42
void drawLine(const cocos2d::Vec3 &from, const cocos2d::Vec3 &to, const Color4F &color)
Definition: DrawNode3D.cpp:157
cocos2d::backend::ProgramState * _programState1
Definition: Camera3DTest.h:254
virtual ~FogTestDemo()
void switchTypeCallback(cocos2d::Ref *sender, int type)
cocos2d::Layer * _layer3D
Definition: Camera3DTest.h:250
virtual std::string title() const override
cocos2d::Camera * _camera
Definition: Camera3DTest.h:251
cocos2d::EventListenerCustom * _backToForegroundListener
Definition: Camera3DTest.h:258
cocos2d::Sprite3D * _sprite3D1
Definition: Camera3DTest.h:252
cocos2d::Sprite3D * _sprite3D2
Definition: Camera3DTest.h:253
cocos2d::backend::ProgramState * _programState2
Definition: Camera3DTest.h:255
void onTouchesMoved(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
virtual void onEnter() override
virtual void update(float dt) override
CameraType _cameraType
Definition: Camera3DTest.h:249
virtual void onExit() override
virtual void onEnter() override
Definition: BaseTest.cpp:430
static cocos2d::Vec2 top()
Definition: VisibleRect.cpp:57
static cocos2d::Vec2 left()
Definition: VisibleRect.cpp:45