/********************************************************************
*
* File: fsCNative3dScene.h
*
* Purpose: cocos2d-x implementation of 3d sprite.
*
* left hand rule, thumb up, index right, middle towards
* x - right
* y - up
* z - out
*
*********************************************************************/
#ifndef fsCNative3dScenehdr
#define fsCNative3dScenehdr
#include <fsCore/fsBaseTypes.h>
#if defined fs3d
#include "fsINative.h"
#include <fs3d/fsI3dScene.h>
#include <2d/CCCamera.h>
#include <3d/CCRay.h>
namespace cocos2d { class Scene; }
namespace cocos2d { class Sprite3D; }
class fsC3dCamera;
class fsI3dLight;
class fsC3dSprite;
class fsC3dLight;
struct fsPoint;
class fsC3dModelData;
class fsCNative3dScene : public fsINative
{
friend class fsCNative3dSceneRenderData;
public:
void pick(const fsPoint& pScreenPos, fsI3dScene::fsTPickCallback pPickCallback);
void spriteAdd(fsC3dSprite* const);
void spriteRemove(fsC3dSprite* const);
void ligthtAdd(fsI3dLight* const pLight);
void ligthtRemove(fsI3dLight* const pLight);
void cameraSet(fsC3dCamera* const pCamera);
virtual ~fsCNative3dScene();<--- Destructor in derived class
protected:
virtual void renderDo() override;
virtual void matrixApplyDo(const fsAffineMtx2d& pRenderMatrix) override;
fsCNative3dScene();
private:
enum class eSCENE_FLAG
{
// cocos2d-x uses 1 for the default camera so we start above that
WORLD_MODELS = static_cast<fsS32>(cocos2d::CameraFlag::USER1),
DYNAMIC_MODELS = WORLD_MODELS << 1,
ALL_MODELS = WORLD_MODELS | DYNAMIC_MODELS,
};
void nodeProcess(cocos2d::Node* const pNode);
void nodeProcessRecursive(cocos2d::Node* const pNode);
void calculateRayByLocationInView(cocos2d::Ray* ray, const cocos2d::Vec2& location);
void unproject(const cocos2d::Mat4& viewProjection, const cocos2d::Size* viewport, cocos2d::Vec3* src, cocos2d::Vec3* dst);
fsBool worldModelGet(cocos2d::Sprite3D* pModel) const;
fsBool worldModelGet(cocos2d::Node* pNode) const;
fsF32 fovCalculate(fsF32 pFOV) const;
void cameraCreate(fsF32 pFOV, fsF32 pNearClip, fsF32 pFarClip);
virtual cocos2d::Node* implGet() const override;
cocos2d::Mat4 mRenderMatrix;
cocos2d::Mat4 mDisplayMatrix;
cocos2d::Scene* mScene;
cocos2d::Camera* mWorldCamera;
cocos2d::Node* mSceneDisplayRoot;
cocos2d::Node* mSceneRoot;
fsBool mExplicitCameraSet;
std::vector<std::shared_ptr<fsI3dLight>> mLights;
std::vector<fsC3dSprite*> mDynamicModels;
};
#endif
#endif