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
|