source: GTP/trunk/App/Demos/Illum/IBRBillboardCloudTrees/OGRE/IBRTreesOGRE/include/ExtendedCamera.h @ 1493

Revision 1493, 6.0 KB checked in by igarcia, 18 years ago (diff)
Line 
1// Generic Character class
2class Character {
3// Attributes ------------------------------------------------------------------------------
4        protected:
5                SceneNode *mMainNode; // Main character node
6                SceneNode *mSightNode; // "Sight" node - The character is supposed to be looking here
7                SceneNode *mCameraNode; // Node for the chase camera
8                Entity *mEntity; // Character entity
9                SceneManager *mSceneMgr;
10        public:
11// Methods ---------------------------------------------------------------------------------
12        protected:
13        public:
14                // Updates the character (movement...)
15                virtual void update (Real elapsedTime, InputReader *input) = 0;
16                // The three methods below returns the two camera-related nodes,
17                // and the current position of the character (for the 1st person camera)
18                SceneNode *getSightNode () {
19                        return mSightNode;
20                }
21                SceneNode *getCameraNode () {
22                        return mCameraNode;
23                }
24                Vector3 getWorldPosition () {
25                        return mMainNode->getWorldPosition ();
26                }
27
28                Entity* getEntity()
29                {
30                        return mEntity;
31                }
32};
33
34// Specialization of the Character class - Our dear Ogre :D
35class OgreCharacter : public Character {
36// Attributes ------------------------------------------------------------------------------
37        protected:
38                String mName;
39        public:
40// Methods ---------------------------------------------------------------------------------
41        protected:
42        public:
43                OgreCharacter (String name, SceneManager *sceneMgr) {
44                        // Setup basic member references
45                        mName = name;
46                        mSceneMgr = sceneMgr;
47
48                        // Setup basic node structure to handle 3rd person cameras
49                        mMainNode = mSceneMgr->getRootSceneNode ()->createChildSceneNode (mName);
50                        mSightNode = mMainNode->createChildSceneNode (mName + "_sight", Vector3 (0, 0, 100));
51                        mCameraNode = mMainNode->createChildSceneNode (mName + "_camera", Vector3 (0, 50, -100));
52                       
53
54                        // Give this character a shape :)
55                        mEntity = mSceneMgr->createEntity (mName, "butterfly_bones_animated.mesh");
56                        mMainNode->attachObject(mEntity);
57                       
58                }
59                ~OgreCharacter () {
60                        mMainNode->detachAllObjects ();
61                        delete mEntity;
62                        mMainNode->removeAndDestroyAllChildren ();
63                        mSceneMgr->destroySceneNode (mName);
64                }
65
66                void update (Real elapsedTime, InputReader *input) {
67                        // Handle movement
68                        if (input->isKeyDown (KC_W)) {
69                                mMainNode->translate (mMainNode->getOrientation () * Vector3 (0, 0, 100.0 * elapsedTime));
70                        }
71
72                        if (input->isKeyDown (KC_S)) {
73                                mMainNode->translate (mMainNode->getOrientation () * Vector3 (0, 0, -50.0 * elapsedTime));
74                        }
75
76                        if (input->isKeyDown (KC_PGUP)) {
77                                mMainNode->translate (mMainNode->getOrientation () * Vector3 (0, 50 * elapsedTime, 0));
78                        }
79
80                        if (input->isKeyDown (KC_PGDOWN)) {
81                                mMainNode->translate (mMainNode->getOrientation () * Vector3 (0, -50 * elapsedTime, 0));
82                        }
83
84                        if (input->isKeyDown (KC_A)) {
85                                mMainNode->yaw (Radian (2 * elapsedTime));
86                        }
87                        if (input->isKeyDown (KC_D)) {
88                                mMainNode->yaw (Radian (-2 * elapsedTime));
89                        }
90
91                        Degree mRotX = Degree(-input->getMouseRelativeX() * 0.13);
92                        Degree mRotY = Degree(-input->getMouseRelativeY() * 0.13);
93                        mMainNode->yaw(mRotX);
94                        mMainNode->pitch(mRotY);
95                }
96
97                // Change visibility - Useful for 1st person view ;)
98                void setVisible (bool visible) {
99                        mMainNode->setVisible (visible);
100                }
101};
102
103// Our extended camera class
104class ExtendedCamera {
105// Attributes ------------------------------------------------------------------------------
106        protected:
107                SceneNode *mTargetNode; // The camera target
108                SceneNode *mCameraNode; // The camera itself
109                Camera *mCamera; // Ogre camera
110
111                SceneManager *mSceneMgr;
112                String mName;
113
114                bool mOwnCamera; // To know if the ogre camera binded has been created outside or inside of this class
115
116                Real mTightness; // Determines the movement of the camera - 1 means tight movement, while 0 means no movement
117        public:
118// Methods ---------------------------------------------------------------------------------
119        protected:
120        public:
121                ExtendedCamera (String name, SceneManager *sceneMgr, Camera *camera = 0) {
122                        // Basic member references setup
123                        mName = name;
124                        mSceneMgr = sceneMgr;
125
126                        // Create the camera's node structure
127                        mCameraNode = mSceneMgr->getRootSceneNode ()->createChildSceneNode (mName);
128                        mTargetNode = mSceneMgr->getRootSceneNode ()->createChildSceneNode (mName + "_target");
129                        mCameraNode->setAutoTracking (true, mTargetNode); // The camera will always look at the camera target
130                        mCameraNode->setFixedYawAxis (true); // Needed because of auto tracking
131
132                        // Create our camera if it wasn't passed as a parameter
133                        if (camera == 0) {
134                                mCamera = mSceneMgr->createCamera (mName);
135                                mOwnCamera = true;
136                        }
137                        else {
138                                mCamera = camera;
139                                mOwnCamera = false;
140                        }
141
142                        mCamera->setFOVy(Radian(Degree(12.0)));
143                        // ... and attach the Ogre camera to the camera node
144                        mCameraNode->attachObject (mCamera);
145
146                        // Default tightness
147                        mTightness = 0.01f;
148                }
149                ~ExtendedCamera () {
150                        mCameraNode->detachAllObjects ();
151                        if (mOwnCamera)
152                                delete mCamera;
153                        mSceneMgr->destroySceneNode (mName);
154                        mSceneMgr->destroySceneNode (mName + "_target");
155                }
156
157                void setFOVy(Ogre::Radian fovy)
158                {
159                        mCamera->setFOVy(Radian(Degree(fovy)));
160                }
161
162                void setTightness (Real tightness) {
163                        mTightness = tightness;
164                }
165
166                Real getTightness () {
167                        return mTightness;
168                }
169
170                Vector3 getCameraPosition () {
171                        return mCameraNode->getPosition ();
172                }
173
174                void instantUpdate (Vector3 cameraPosition, Vector3 targetPosition) {
175                        mCameraNode->setPosition (cameraPosition);
176                        mTargetNode->setPosition (targetPosition);
177                }
178
179                void update (Real elapsedTime, Vector3 cameraPosition, Vector3 targetPosition) {
180                        // Handle movement
181                        Vector3 displacement;
182
183                        displacement = (cameraPosition - mCameraNode->getPosition ()) * mTightness;
184                        mCameraNode->translate (displacement);
185
186                        displacement = (targetPosition - mTargetNode->getPosition ()) * mTightness;
187                        mTargetNode->translate (displacement);
188                }
189};
190
Note: See TracBrowser for help on using the repository browser.