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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/********************************************************************
 *
 *    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>

#ifdef AXMOL_V3
	#include <scene/Camera.h>
	#include <math/Ray.h>
#else
	#include <2d/Camera.h>
	#include <3d/Ray.h>
#endif
#include <fs3d/fsI3dLight.h>

namespace ax { class Scene; }
namespace ax { class MeshRenderer; }

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>(ax::CameraFlag::USER1),
		DYNAMIC_MODELS = WORLD_MODELS << 1,

		ALL_MODELS = WORLD_MODELS | DYNAMIC_MODELS,
	};

    void nodeProcess(ax::Node* const pNode);
	void nodeProcessRecursive(ax::Node* const pNode);
	void calculateRayByLocationInView(ax::Ray* ray, const ax::Vec2& location);
	void unproject(const ax::Mat4& viewProjection, const ax::Size* viewport, ax::Vec3* src, ax::Vec3* dst);

	fsBool worldModelGet(ax::MeshRenderer* pModel) const;
	fsBool worldModelGet(ax::Node* pNode) const;
	fsF32 fovCalculate(fsF32 pFOV) const;
	fsF32 effectiveFovGet() const;
	void cameraCreate(fsF32 pFOV, fsF32 pNearClip, fsF32 pFarClip);
	void cameraBaseStore(const ax::Mat4& pWorldTransform, const ax::Vec3& pPosition);
	void cameraBaseStore(const ax::Vec3& pPosition, ax::Vec3 pForward, ax::Vec3 pUp);
	void sceneTransformsApply(fsBool pDesktopFixedAspectActive);
	void cameraFixedAspectApply(const ax::Viewport& pLogicalViewport);

	virtual ax::Node* implGet() const override;

	ax::Mat4 mDisplayMatrix;
	ax::Mat4 mEyeMatrix;
	ax::Mat4 mProjectionMatrix;
	ax::Mat4 mRenderMatrix;
	ax::Scene* mScene;
	ax::Camera* mWorldCamera;
	ax::Node* mSceneDisplayRoot;
	ax::Node* mSceneRoot;
	fsBool mExplicitCameraSet;
	fsBool mCameraBaseSet;
	fsBool mEyeBaseSet;
	ax::Vec3 mCameraBasePosition;
	ax::Vec3 mCameraBaseForward;
	ax::Vec3 mCameraBaseUp;
	fsVec2d mSceneBaseTranslate;
	fsVec2d mScreenBaseTranslate;
	fsF32 mEyeBaseZoomScale;
	fsF32 mZoomScale;
	fsF32 mCameraFov;
	fsF32 mCameraNear;
	fsF32 mCameraFar;

	std::vector<std::shared_ptr<fsI3dLight>> mLights;

	std::vector<fsC3dSprite*> mDynamicModels;
};

#endif

#endif