2011-07-30 12:55:38 +04:00
/****************************************************************************
Copyright ( c ) 2008 - 2010 Ricardo Quesada
2014-01-07 07:25:07 +04:00
Copyright ( c ) 2010 - 2012 cocos2d - x . org
2011-07-30 12:55:38 +04:00
Copyright ( c ) 2011 Zynga Inc .
2017-02-14 09:36:57 +03:00
Copyright ( c ) 2013 - 2017 Chukong Technologies Inc .
2011-07-30 12:55:38 +04:00
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 __CCSCENE_H__
# define __CCSCENE_H__
2014-06-25 07:27:48 +04:00
# include <string>
2014-04-26 21:11:22 +04:00
# include "2d/CCNode.h"
2011-07-30 12:55:38 +04:00
2012-04-18 14:43:45 +04:00
NS_CC_BEGIN
2011-07-30 12:55:38 +04:00
2014-08-07 11:23:31 +04:00
class Camera ;
2014-09-28 12:02:12 +04:00
class BaseLight ;
2014-09-26 05:36:43 +04:00
class Renderer ;
2014-08-26 14:19:28 +04:00
class EventListenerCustom ;
class EventCustom ;
2014-08-27 09:39:50 +04:00
# if CC_USE_PHYSICS
class PhysicsWorld ;
# endif
2015-05-11 10:34:37 +03:00
# if CC_USE_3D_PHYSICS && CC_ENABLE_BULLET_INTEGRATION
2015-05-08 10:49:33 +03:00
class Physics3DWorld ;
# endif
2015-05-29 11:45:33 +03:00
# if CC_USE_NAVMESH
class NavMesh ;
# endif
2012-06-20 14:09:11 +04:00
/**
2015-03-24 05:34:41 +03:00
* @ addtogroup _2d
2012-06-20 14:09:11 +04:00
* @ {
*/
2015-03-18 15:40:29 +03:00
/** @class Scene
* @ brief Scene is a subclass of Node that is used only as an abstract concept .
2011-07-30 12:55:38 +04:00
2013-09-22 22:39:42 +04:00
Scene and Node are almost identical with the difference that Scene has its
2011-07-30 12:55:38 +04:00
anchor point ( by default ) at the center of the screen .
2013-06-20 10:13:12 +04:00
For the moment Scene has no other logic than that , but in future releases it might have
2011-07-30 12:55:38 +04:00
additional logic .
2013-09-22 13:07:21 +04:00
It is a good practice to use a Scene as the parent of all your nodes .
2014-11-13 12:30:49 +03:00
Scene will create a default camera for you .
2011-07-30 12:55:38 +04:00
*/
2013-06-20 10:13:12 +04:00
class CC_DLL Scene : public Node
2011-07-30 12:55:38 +04:00
{
public :
2015-03-18 15:40:29 +03:00
/** Creates a new Scene object.
*
* @ return An autoreleased Scene object .
*/
2013-09-10 13:38:47 +04:00
static Scene * create ( ) ;
2013-07-15 23:43:22 +04:00
2015-03-18 15:40:29 +03:00
/** Creates a new Scene object with a predefined Size.
*
* @ param size The predefined size of scene .
* @ return An autoreleased Scene object .
2015-03-19 16:44:44 +03:00
* @ js NA
2015-03-18 15:40:29 +03:00
*/
2014-05-31 03:42:05 +04:00
static Scene * createWithSize ( const Size & size ) ;
2013-12-23 12:58:26 +04:00
using Node : : addChild ;
2013-12-13 02:30:22 +04:00
virtual std : : string getDescription ( ) const override ;
2014-03-21 09:44:29 +04:00
2015-03-18 15:40:29 +03:00
/** Get all cameras.
*
2015-06-18 05:23:52 +03:00
* @ return The vector of all cameras , ordered by camera depth .
2015-03-19 16:44:44 +03:00
* @ js NA
2015-03-18 15:40:29 +03:00
*/
2015-06-18 05:23:52 +03:00
const std : : vector < Camera * > & getCameras ( ) ;
2014-08-15 10:51:23 +04:00
2015-03-18 15:40:29 +03:00
/** Get the default camera.
2015-05-29 11:45:33 +03:00
* @ js NA
2015-03-18 15:40:29 +03:00
* @ return The default camera of scene .
*/
2015-01-09 03:30:00 +03:00
Camera * getDefaultCamera ( ) const { return _defaultCamera ; }
2015-03-18 15:40:29 +03:00
/** Get lights.
* @ return The vector of lights .
2015-03-19 16:44:44 +03:00
* @ js NA
2015-03-18 15:40:29 +03:00
*/
2014-09-28 12:02:12 +04:00
const std : : vector < BaseLight * > & getLights ( ) const { return _lights ; }
2016-10-28 04:33:31 +03:00
2015-03-18 15:40:29 +03:00
/** Render the scene.
* @ param renderer The renderer use to render the scene .
2016-10-28 04:33:31 +03:00
* @ param eyeTransform The AdditionalTransform of camera .
* @ param eyeProjection The projection matrix of camera .
2015-03-19 16:44:44 +03:00
* @ js NA
2015-03-18 15:40:29 +03:00
*/
2016-06-15 21:33:25 +03:00
virtual void render ( Renderer * renderer , const Mat4 & eyeTransform , const Mat4 * eyeProjection = nullptr ) ;
2016-10-28 04:33:31 +03:00
/** Render the scene.
* @ param renderer The renderer use to render the scene .
* @ param eyeTransforms The AdditionalTransform List of camera of multiView .
* @ param eyeProjections The projection matrix List of camera of multiView .
* @ param multiViewCount The number of multiView .
* @ js NA
*/
virtual void render ( Renderer * renderer , const Mat4 * eyeTransforms , const Mat4 * eyeProjections , unsigned int multiViewCount ) ;
2015-03-12 05:39:21 +03:00
/** override function */
virtual void removeAllChildren ( ) override ;
2014-03-21 09:44:29 +04:00
CC_CONSTRUCTOR_ACCESS :
2013-11-14 03:55:36 +04:00
Scene ( ) ;
virtual ~ Scene ( ) ;
2013-12-26 19:55:05 +04:00
2015-03-14 21:33:15 +03:00
bool init ( ) override ;
2014-05-31 03:42:05 +04:00
bool initWithSize ( const Size & size ) ;
2014-08-12 10:42:08 +04:00
2015-02-11 13:14:22 +03:00
void setCameraOrderDirty ( ) { _cameraOrderDirty = true ; }
2014-08-12 10:42:08 +04:00
void onProjectionChanged ( EventCustom * event ) ;
2014-03-21 09:44:29 +04:00
protected :
2014-05-02 03:42:35 +04:00
friend class Node ;
friend class ProtectedNode ;
2013-10-10 14:31:43 +04:00
friend class SpriteBatchNode ;
2014-08-07 11:23:31 +04:00
friend class Camera ;
2014-09-28 12:02:12 +04:00
friend class BaseLight ;
2014-08-27 08:09:23 +04:00
friend class Renderer ;
2014-08-07 11:23:31 +04:00
std : : vector < Camera * > _cameras ; //weak ref to Camera
2014-08-12 10:42:08 +04:00
Camera * _defaultCamera ; //weak ref, default camera created by scene, _cameras[0], Caution that the default camera can not be added to _cameras before onEnter is called
2015-02-11 13:14:22 +03:00
bool _cameraOrderDirty ; // order is dirty, need sort
2014-08-12 10:42:08 +04:00
EventListenerCustom * _event ;
2014-08-15 10:51:23 +04:00
2014-09-28 12:02:12 +04:00
std : : vector < BaseLight * > _lights ;
2013-12-26 19:55:05 +04:00
2013-11-14 03:55:36 +04:00
private :
CC_DISALLOW_COPY_AND_ASSIGN ( Scene ) ;
2014-05-02 03:42:35 +04:00
2015-05-11 10:34:37 +03:00
# if (CC_USE_PHYSICS || (CC_USE_3D_PHYSICS && CC_ENABLE_BULLET_INTEGRATION))
2014-05-02 03:42:35 +04:00
public :
2015-05-08 10:49:33 +03:00
# if CC_USE_PHYSICS
2015-03-18 15:40:29 +03:00
/** Get the physics world of the scene.
* @ return The physics world of the scene .
2015-03-19 16:44:44 +03:00
* @ js NA
2015-03-18 15:40:29 +03:00
*/
2016-09-12 04:44:21 +03:00
PhysicsWorld * getPhysicsWorld ( ) const { return _physicsWorld ; }
2015-05-08 10:49:33 +03:00
# endif
2015-05-11 10:34:37 +03:00
# if CC_USE_3D_PHYSICS && CC_ENABLE_BULLET_INTEGRATION
2015-05-08 10:49:33 +03:00
/** Get the 3d physics world of the scene.
* @ return The 3 d physics world of the scene .
* @ js NA
*/
2016-09-12 04:44:21 +03:00
Physics3DWorld * getPhysics3DWorld ( ) { return _physics3DWorld ; }
2015-05-08 10:49:33 +03:00
/**
* Set Physics3D debug draw camera .
*/
void setPhysics3DDebugCamera ( Camera * camera ) ;
# endif
2015-03-18 15:40:29 +03:00
/** Create a scene with physics.
* @ return An autoreleased Scene object with physics .
2015-03-19 16:44:44 +03:00
* @ js NA
2015-03-18 15:40:29 +03:00
*/
2014-05-02 03:42:35 +04:00
static Scene * createWithPhysics ( ) ;
CC_CONSTRUCTOR_ACCESS :
bool initWithPhysics ( ) ;
protected :
void addChildToPhysicsWorld ( Node * child ) ;
2015-05-08 10:49:33 +03:00
# if CC_USE_PHYSICS
2014-05-02 03:42:35 +04:00
PhysicsWorld * _physicsWorld ;
2015-05-08 10:49:33 +03:00
# endif
2015-05-11 10:34:37 +03:00
# if CC_USE_3D_PHYSICS && CC_ENABLE_BULLET_INTEGRATION
2015-05-08 10:49:33 +03:00
Physics3DWorld * _physics3DWorld ;
Camera * _physics3dDebugCamera ; //
# endif
# endif // (CC_USE_PHYSICS || CC_USE_3D_PHYSICS)
2015-05-29 11:45:33 +03:00
# if CC_USE_NAVMESH
public :
/** set navigation mesh */
void setNavMesh ( NavMesh * navMesh ) ;
/** get navigation mesh */
NavMesh * getNavMesh ( ) const { return _navMesh ; }
/**
* Set NavMesh debug draw camera .
*/
void setNavMeshDebugCamera ( Camera * camera ) ;
protected :
2015-09-08 04:54:01 +03:00
NavMesh * _navMesh ;
Camera * _navMeshDebugCamera ;
2015-05-29 11:45:33 +03:00
# endif
2015-06-09 08:49:07 +03:00
# if (CC_USE_PHYSICS || (CC_USE_3D_PHYSICS && CC_ENABLE_BULLET_INTEGRATION) || CC_USE_NAVMESH)
public :
void stepPhysicsAndNavigation ( float deltaTime ) ;
# endif
2011-07-30 12:55:38 +04:00
} ;
2012-04-18 14:43:45 +04:00
2015-03-24 05:34:41 +03:00
// end of _2d group
2012-06-20 14:09:11 +04:00
/// @}
2012-04-18 14:43:45 +04:00
NS_CC_END
2011-07-30 12:55:38 +04:00
# endif // __CCSCENE_H__