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