1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
/********************************************************************
 *
 *    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