소스 검색

Compiles up to Render

Thomas Buck 11 년 전
부모
커밋
fdd71891c0
10개의 변경된 파일235개의 추가작업 그리고 246개의 파일을 삭제
  1. 11
    2
      include/Entity.h
  2. 1
    5
      include/Render.h
  3. 3
    1
      include/SkeletalModel.h
  4. 0
    7
      include/World.h
  5. 31
    41
      src/Command.cpp
  6. 162
    2
      src/Entity.cpp
  7. 13
    12
      src/Game.cpp
  8. 1
    1
      src/OpenRaider.cpp
  9. 13
    2
      src/SkeletalModel.cpp
  10. 0
    173
      src/World.cpp

+ 11
- 2
include/Entity.h 파일 보기

9
 #define _ENTITY_H_
9
 #define _ENTITY_H_
10
 
10
 
11
 #include "math/math.h"
11
 #include "math/math.h"
12
+#include "SkeletalModel.h"
12
 #include "TombRaider.h"
13
 #include "TombRaider.h"
13
 
14
 
14
 class Entity {
15
 class Entity {
25
 
26
 
26
     bool operator<(Entity &o);
27
     bool operator<(Entity &o);
27
     void display();
28
     void display();
29
+    void move(char movement);
30
+    void print();
28
 
31
 
32
+    SkeletalModel &getModel();
29
     void setSkeletalModel(unsigned int model);
33
     void setSkeletalModel(unsigned int model);
34
+    void setMoveType(MoveType m);
35
+    int getObjectId();
36
+    void setAngles(vec_t yaw, vec_t pitch);
37
+    vec_t getPos(unsigned int i);
38
+    vec_t getAngle(unsigned int i);
30
 
39
 
31
     // Animation State
40
     // Animation State
32
-    unsigned int getAnimationFrame();
33
-    void setAnimationFrame(unsigned int index);
41
+    unsigned int getAnimation();
42
+    void setAnimation(unsigned int index);
34
     unsigned int getBoneFrame();
43
     unsigned int getBoneFrame();
35
     void setBoneFrame(unsigned int index);
44
     void setBoneFrame(unsigned int index);
36
     unsigned int getIdleAnimation();
45
     unsigned int getIdleAnimation();

+ 1
- 5
include/Render.h 파일 보기

15
 #include "math/Matrix.h"
15
 #include "math/Matrix.h"
16
 #include "ViewVolume.h"
16
 #include "ViewVolume.h"
17
 #include "World.h"
17
 #include "World.h"
18
-#include "SkeletalModel.h"
19
 #include "Mesh.h"
18
 #include "Mesh.h"
20
 #include "Texture.h"
19
 #include "Texture.h"
21
 #include "Camera.h"
20
 #include "Camera.h"
121
 
120
 
122
     void setSkyMesh(int index, bool rot);
121
     void setSkyMesh(int index, bool rot);
123
 
122
 
124
-    void addSkeletalModel(SkeletalModel *mdl);
125
-
126
     unsigned int getFlags();
123
     unsigned int getFlags();
127
 
124
 
128
     /*!
125
     /*!
157
     //! \fixme should be private
154
     //! \fixme should be private
158
 
155
 
159
     ViewVolume mViewVolume; //!< View Volume for frustum culling
156
     ViewVolume mViewVolume; //!< View Volume for frustum culling
160
-    std::vector<SkeletalModel *> mModels;
161
-    Texture mTexture;                     //!< Texture subsystem
157
+    Texture mTexture; //!< Texture subsystem
162
 
158
 
163
 private:
159
 private:
164
 
160
 

+ 3
- 1
include/SkeletalModel.h 파일 보기

56
 
56
 
57
 class SkeletalModel {
57
 class SkeletalModel {
58
 public:
58
 public:
59
-    SkeletalModel(TombRaider &tr, unsigned int index);
59
+    SkeletalModel(TombRaider &tr, unsigned int index, unsigned int i, int objectId);
60
     ~SkeletalModel();
60
     ~SkeletalModel();
61
     int getId();
61
     int getId();
62
+    void setPigTail(bool b);
63
+    void setPonyPos(vec_t x, vec_t y, vec_t z, vec_t angle);
62
 
64
 
63
     unsigned int size();
65
     unsigned int size();
64
     AnimationFrame &get(unsigned int i);
66
     AnimationFrame &get(unsigned int i);

+ 0
- 7
include/World.h 파일 보기

60
     model_mesh_t *getMesh(int index);
60
     model_mesh_t *getMesh(int index);
61
 
61
 
62
     /*!
62
     /*!
63
-     * \brief Move entity in given direction unless collision occurs
64
-     * \param e entity to move
65
-     * \param movement direction of movement ('f', 'b', 'l' or 'r')
66
-     */
67
-    void moveEntity(entity_t *e, char movement);
68
-
69
-    /*!
70
      * \brief Find room a location is in.
63
      * \brief Find room a location is in.
71
      *
64
      *
72
      * If it fails to be in a room it gives closest overlapping room.
65
      * If it fails to be in a room it gives closest overlapping room.

+ 31
- 41
src/Command.cpp 파일 보기

13
 
13
 
14
 #include "config.h"
14
 #include "config.h"
15
 #include "Console.h"
15
 #include "Console.h"
16
+#include "Entity.h"
16
 #include "Game.h"
17
 #include "Game.h"
17
 #include "main.h"
18
 #include "main.h"
18
 #include "math/math.h"
19
 #include "math/math.h"
131
             if (getGame().isLoaded()) {
132
             if (getGame().isLoaded()) {
132
                 char *move = args->at(0);
133
                 char *move = args->at(0);
133
                 if (strcmp(move, "walk") == 0) {
134
                 if (strcmp(move, "walk") == 0) {
134
-                    getGame().mLara->moveType = worldMoveType_walk;
135
+                    getGame().getLara().setMoveType(Entity::MoveTypeWalk);
135
                     getConsole().print("Lara is walking...");
136
                     getConsole().print("Lara is walking...");
136
                 } else if (strcmp(move, "fly") == 0) {
137
                 } else if (strcmp(move, "fly") == 0) {
137
-                    getGame().mLara->moveType = worldMoveType_fly;
138
+                    getGame().getLara().setMoveType(Entity::MoveTypeFly);
138
                     getConsole().print("Lara is flying...");
139
                     getConsole().print("Lara is flying...");
139
                 } else if (strcmp(move, "noclip") == 0) {
140
                 } else if (strcmp(move, "noclip") == 0) {
140
-                    getGame().mLara->moveType = worldMoveType_noClipping;
141
+                    getGame().getLara().setMoveType(Entity::MoveTypeNoClipping);
141
                     getConsole().print("Lara is noclipping...");
142
                     getConsole().print("Lara is noclipping...");
142
                 } else {
143
                 } else {
143
                     getConsole().print("Invalid use of move command (%s)!", move);
144
                     getConsole().print("Invalid use of move command (%s)!", move);
172
             if (c == 'n') {
173
             if (c == 'n') {
173
                 // Step all skeletal models to their next animation
174
                 // Step all skeletal models to their next animation
174
                 if (getRender().getFlags() & Render::fAnimateAllModels) {
175
                 if (getRender().getFlags() & Render::fAnimateAllModels) {
175
-                    for (unsigned int i = 0; i < getRender().mModels.size(); i++) {
176
-                        SkeletalModel *m = getRender().mModels[i];
177
-                        if (m->getAnimation() < ((int)m->model->animation.size() - 1))
178
-                            m->setAnimation(m->getAnimation() + 1);
176
+                    for (unsigned int i = 0; i < getWorld().sizeEntity(); i++) {
177
+                        Entity &e = getWorld().getEntity(i);
178
+                        SkeletalModel &m = e.getModel();
179
+                        if (e.getAnimation() < (m.size() - 1))
180
+                            e.setAnimation(e.getAnimation() + 1);
179
                         else
181
                         else
180
-                            if (m->getAnimation() != 0)
181
-                                m->setAnimation(0);
182
+                            e.setAnimation(0);
182
                     }
183
                     }
183
                 } else {
184
                 } else {
184
                     getConsole().print("Animations need to be enabled!");
185
                     getConsole().print("Animations need to be enabled!");
186
             } else if (c == 'p') {
187
             } else if (c == 'p') {
187
                 // Step all skeletal models to their previous animation
188
                 // Step all skeletal models to their previous animation
188
                 if (getRender().getFlags() & Render::fAnimateAllModels) {
189
                 if (getRender().getFlags() & Render::fAnimateAllModels) {
189
-                    for (unsigned int i = 0; i < getRender().mModels.size(); i++) {
190
-                        SkeletalModel *m = getRender().mModels[i];
191
-                        if (m->getAnimation() > 0)
192
-                            m->setAnimation(m->getAnimation() - 1);
190
+                    for (unsigned int i = 0; i < getWorld().sizeEntity(); i++) {
191
+                        Entity &e = getWorld().getEntity(i);
192
+                        SkeletalModel &m = e.getModel();
193
+                        if (e.getAnimation() > 0)
194
+                            e.setAnimation(e.getAnimation() - 1);
193
                         else
195
                         else
194
-                            if (m->model->animation.size() > 0)
195
-                                m->setAnimation(m->model->animation.size() - 1);
196
+                            if (m.size() > 0)
197
+                                e.setAnimation(m.size() - 1);
196
                     }
198
                     }
197
                 } else {
199
                 } else {
198
                     getConsole().print("Animations need to be enabled!");
200
                     getConsole().print("Animations need to be enabled!");
251
             getConsole().print("Use viewmodel command interactively!");
253
             getConsole().print("Use viewmodel command interactively!");
252
             return -999;
254
             return -999;
253
         }
255
         }
254
-        if (getGame().mLara) {
255
-            skeletal_model_t *mdl = getWorld().getModel(atoi(args->at(0)));
256
-            if (getGame().mLara->tmpHook)
257
-                getGame().mLara->tmpHook->setModel(mdl);
256
+        unsigned int n = atoi(args->at(0));
257
+        if (n < getWorld().sizeSkeletalModel())
258
+            getGame().getLara().setSkeletalModel(n);
259
+        else {
260
+            getConsole().print("Invalid SkeletalModel index!");
261
+            return -66;
258
         }
262
         }
259
-        //m_render.ViewModel(LARA, atoi(cmd));
260
     } else if (strcmp(command, "pos") == 0) {
263
     } else if (strcmp(command, "pos") == 0) {
261
-        if (getGame().mLara) {
262
-            getConsole().print("Position:");
263
-            getConsole().print("  Room %i (0x%X)", getGame().mLara->room, getWorld().getRoomInfo(getGame().mLara->room));
264
-            getConsole().print("  %.1fx %.1fy %.1fz", getGame().mLara->pos[0], getGame().mLara->pos[1], getGame().mLara->pos[2]);
265
-            getConsole().print("  %.1f Yaw %.1f Pitch", OR_RAD_TO_DEG(getGame().mLara->angles[1]), OR_RAD_TO_DEG(getGame().mLara->angles[2]));
266
-        } else {
267
-            getConsole().print("Load a level to get Laras position!");
264
+        if ((!mRunning) || (!getGame().isLoaded())) {
265
+            getConsole().print("Use pos command interactively!");
268
             return -21;
266
             return -21;
269
         }
267
         }
268
+        getGame().getLara().print();
270
     } else if (strcmp(command, "vmodel") == 0) {
269
     } else if (strcmp(command, "vmodel") == 0) {
271
         if (args->size() > 0) {
270
         if (args->size() > 0) {
272
             bool b;
271
             bool b;
406
                 getConsole().print("Pass BOOL to pigtail command!");
405
                 getConsole().print("Pass BOOL to pigtail command!");
407
                 return -46;
406
                 return -46;
408
             }
407
             }
409
-            SkeletalModel *tmp = getGame().mLara->tmpHook;
410
-            tmp->model->pigtails = b;
411
-            if (b) {
412
-                tmp->model->ponyOff -= 20;
413
-                tmp->model->ponytail[1] -= 32;
414
-            } else {
415
-                tmp->model->ponyOff += 20;
416
-                tmp->model->ponytail[1] += 32;
417
-            }
408
+            SkeletalModel &tmp = getGame().getLara().getModel();
409
+            tmp.setPigTail(b);
418
             getConsole().print("Pigtail is now %s", b ? "on" : "off");
410
             getConsole().print("Pigtail is now %s", b ? "on" : "off");
419
         } else {
411
         } else {
420
             getConsole().print("Invalid use of pigtail-command!");
412
             getConsole().print("Invalid use of pigtail-command!");
426
             return -999;
418
             return -999;
427
         }
419
         }
428
         if (args->size() > 3) {
420
         if (args->size() > 3) {
429
-            SkeletalModel *tmp = getGame().mLara->tmpHook;
430
-            tmp->model->ponytail[0] = (float)atof(args->at(0));
431
-            tmp->model->ponytail[1] = (float)atof(args->at(1));
432
-            tmp->model->ponytail[2] = (float)atof(args->at(2));
433
-            tmp->model->ponytailAngle = (float)atof(args->at(3));
421
+            SkeletalModel &tmp = getGame().getLara().getModel();
422
+            tmp.setPonyPos((float)atof(args->at(0)), (float)atof(args->at(1)),
423
+                    (float)atof(args->at(2)), (float)atof(args->at(3)));
434
         } else {
424
         } else {
435
             getConsole().print("Invalid use of ponypos-command!");
425
             getConsole().print("Invalid use of ponypos-command!");
436
             return -48;
426
             return -48;

+ 162
- 2
src/Entity.cpp 파일 보기

19
 #include "Entity.h"
19
 #include "Entity.h"
20
 #include "main.h"
20
 #include "main.h"
21
 
21
 
22
+#include "games/TombRaider1.h"
23
+
22
 Entity::Entity(TombRaider &tr, unsigned int index, unsigned int i, unsigned int model) {
24
 Entity::Entity(TombRaider &tr, unsigned int index, unsigned int i, unsigned int model) {
23
     tr2_moveable_t *moveable = tr.Moveable();
25
     tr2_moveable_t *moveable = tr.Moveable();
24
     tr2_item_t *item = tr.Item();
26
     tr2_item_t *item = tr.Item();
73
     */
75
     */
74
 }
76
 }
75
 
77
 
78
+void Entity::move(char movement) {
79
+    const float moved = 180.0f;
80
+    const float testd = 220.0f;
81
+    const float camHeight = 8.0f;
82
+    float x, y, z, pitch, h, floor, ceiling;
83
+    int roomNew, sector;
84
+    bool wall;
85
+    unsigned int roomFlags;
86
+
87
+    switch (moveType) {
88
+        case MoveTypeWalkNoSwim:
89
+        case MoveTypeWalk:
90
+            pitch = 0.0f; // in the future pitch could control jump up blocks here
91
+            break;
92
+
93
+        case MoveTypeNoClipping:
94
+        case MoveTypeFly:
95
+        case MoveTypeSwim:
96
+            pitch = angles[2];
97
+            break;
98
+    }
99
+
100
+    switch (movement) {
101
+        case 'f':
102
+            x = pos[0] + (testd * sinf(angles[1]));
103
+            y = pos[1] + (testd * sinf(pitch));
104
+            z = pos[2] + (testd * cosf(angles[1]));
105
+            break;
106
+        case 'b':
107
+            x = pos[0] - (testd * sinf(angles[1]));
108
+            y = pos[1] - (testd * sinf(pitch));
109
+            z = pos[2] - (testd * cosf(angles[1]));
110
+            break;
111
+        case 'l':
112
+            x = pos[0] - (testd * sinf(angles[1] + 90.0f));
113
+            y = pos[1];
114
+            z = pos[2] - (testd * cosf(angles[1] + 90.0f));
115
+            break;
116
+        case 'r':
117
+            x = pos[0] + (testd * sinf(angles[1] + 90.0f));
118
+            y = pos[1];
119
+            z = pos[2] + (testd * cosf(angles[1] + 90.0f));
120
+            break;
121
+        default:
122
+            return;
123
+    }
124
+
125
+    //room = getRoomByLocation(x, y, z);
126
+    roomNew = getWorld().getRoomByLocation(room, x, y, z);
127
+
128
+    if (roomNew == -1) { // Will we hit a portal?
129
+        roomNew = getWorld().getAdjoiningRoom(room,
130
+                pos[0],  pos[1], pos[2],
131
+                x, y, z);
132
+
133
+        if (roomNew > -1)
134
+            printf("Crossing from room %i to %i\n", room, roomNew);
135
+        else
136
+            //! \fixme mRooms, sectors, ... are now std::vector, but often upper bound checks are missing
137
+            return;
138
+    }
139
+
140
+    roomFlags = getWorld().getRoomInfo(roomNew);
141
+    sector = getWorld().getSector(roomNew, x, z, &floor, &ceiling);
142
+    wall = getWorld().isWall(roomNew, sector);
143
+
144
+    // If you're underwater you may want to swim  =)
145
+    // ...if you're worldMoveType_walkNoSwim, you better hope it's shallow
146
+    if ((roomFlags & RoomFlagUnderWater) && (moveType == MoveTypeWalk))
147
+        moveType = MoveTypeSwim;
148
+
149
+    // Don't swim on land
150
+    if (!(roomFlags & RoomFlagUnderWater) && (moveType == MoveTypeSwim))
151
+        moveType = MoveTypeWalk;
152
+
153
+    // Mongoose 2002.09.02, Add check for room -> room transition
154
+    // (Only allow by movement between rooms by using portals)
155
+    if (((moveType == MoveTypeNoClipping) ||
156
+                (moveType == MoveTypeFly) ||
157
+                (moveType == MoveTypeSwim)) ||
158
+            ((roomNew > -1) && (!wall))) {
159
+        room = roomNew;
160
+
161
+        switch (movement) {
162
+            case 'f':
163
+                x = pos[0] + (moved * sinf(angles[1]));
164
+                y = pos[1] + (moved * sinf(pitch));
165
+                z = pos[2] + (moved * cosf(angles[1]));
166
+                break;
167
+            case 'b':
168
+                x = pos[0] - (moved * sinf(angles[1]));
169
+                y = pos[1] - (moved * sinf(pitch));
170
+                z = pos[2] - (moved * cosf(angles[1]));
171
+                break;
172
+            case 'l':
173
+                x = pos[0] - (moved * sinf(angles[1] + 90.0f));
174
+                z = pos[2] - (moved * cosf(angles[1] + 90.0f));
175
+                break;
176
+            case 'r':
177
+                x = pos[0] + (moved * sinf(angles[1] + 90.0f));
178
+                z = pos[2] + (moved * cosf(angles[1] + 90.0f));
179
+                break;
180
+        }
181
+
182
+        /*! \fixme Test for vector (move vector) / plane (portal) collision here
183
+         * to see if we need to switch rooms... man...
184
+         */
185
+
186
+        h = y;
187
+        getWorld().getHeightAtPosition(room, x, &h, z);
188
+
189
+        switch (moveType) {
190
+            case MoveTypeFly:
191
+            case MoveTypeSwim:
192
+                // Don't fall out of world, avoid a movement that does
193
+                if (h > y - camHeight) {
194
+                    pos[0] = x;
195
+                    pos[1] = y;
196
+                    pos[2] = z;
197
+                }
198
+                break;
199
+
200
+            case MoveTypeWalk:
201
+            case MoveTypeWalkNoSwim:
202
+                y = pos[1];  // Override vector movement walking ( er, not pretty )
203
+
204
+                // Now fake gravity
205
+                // Mongoose 2002.08.14, Remember TR is upside down ( you fall 'up' )
206
+
207
+                //ddist = h - pos[1];
208
+
209
+                // This is to force false gravity, by making camera stay on ground
210
+                pos[1] = h; //roomFloor->bbox_min[1];
211
+
212
+                // Check for camera below terrian and correct
213
+                if (pos[1] < h - camHeight)
214
+                    pos[1] = h - camHeight;
215
+
216
+                pos[0] = x;
217
+                pos[2] = z;
218
+                break;
219
+
220
+            case MoveTypeNoClipping:
221
+                pos[0] = x;
222
+                pos[1] = y;
223
+                pos[2] = z;
224
+                break;
225
+        }
226
+    }
227
+}
228
+
229
+void Entity::print() {
230
+    getConsole().print("Entity %d:", objectId);
231
+    getConsole().print("  Room %i (0x%X)", room, getWorld().getRoomInfo(room));
232
+    getConsole().print("  %.1fx %.1fy %.1fz", pos[0], pos[1], pos[2]);
233
+    getConsole().print("  %.1f Yaw %.1f Pitch", OR_RAD_TO_DEG(angles[1]), OR_RAD_TO_DEG(angles[2]));
234
+}
235
+
76
 void Entity::setSkeletalModel(unsigned int model) {
236
 void Entity::setSkeletalModel(unsigned int model) {
77
     skeletalModel = model;
237
     skeletalModel = model;
78
     animationFrame = 0;
238
     animationFrame = 0;
80
     idleAnimation = 0;
240
     idleAnimation = 0;
81
 }
241
 }
82
 
242
 
83
-unsigned int Entity::getAnimationFrame() {
243
+unsigned int Entity::getAnimation() {
84
     return animationFrame;
244
     return animationFrame;
85
 }
245
 }
86
 
246
 
87
-void Entity::setAnimationFrame(unsigned int index) {
247
+void Entity::setAnimation(unsigned int index) {
88
     animationFrame = index;
248
     animationFrame = index;
89
     boneFrame = 0;
249
     boneFrame = 0;
90
 }
250
 }

+ 13
- 12
src/Game.cpp 파일 보기

17
 #include <algorithm>
17
 #include <algorithm>
18
 #include <map>
18
 #include <map>
19
 #include <cstdlib>
19
 #include <cstdlib>
20
+#include <assert.h>
20
 
21
 
21
 #include "main.h"
22
 #include "main.h"
22
 #include "Console.h"
23
 #include "Console.h"
64
 void Game::destroy() {
65
 void Game::destroy() {
65
     if (mName)
66
     if (mName)
66
         delete [] mName;
67
         delete [] mName;
67
-
68
+    mName = NULL;
68
     mLoaded = false;
69
     mLoaded = false;
69
-    mLara = NULL;
70
+    mLara = -1;
70
     getRender().setMode(Render::modeDisabled);
71
     getRender().setMode(Render::modeDisabled);
71
 
72
 
72
     getWorld().destroy();
73
     getWorld().destroy();
123
     mTombRaider.reset();
124
     mTombRaider.reset();
124
 
125
 
125
     // Check if the level contains Lara
126
     // Check if the level contains Lara
126
-    if (mLara == NULL) {
127
+    if (mLara == -1) {
127
         getConsole().print("Can't find Lara entity in level pak!");
128
         getConsole().print("Can't find Lara entity in level pak!");
128
         return -1;
129
         return -1;
129
     }
130
     }
137
 void Game::handleAction(ActionEvents action, bool isFinished) {
138
 void Game::handleAction(ActionEvents action, bool isFinished) {
138
     if (mLoaded) {
139
     if (mLoaded) {
139
         if (action == forwardAction) {
140
         if (action == forwardAction) {
140
-            getWorld().moveEntity(mLara, 'f');
141
+            getLara().move('f');
141
         } else if (action == backwardAction) {
142
         } else if (action == backwardAction) {
142
-            getWorld().moveEntity(mLara, 'b');
143
+            getLara().move('b');
143
         } else if (action == leftAction) {
144
         } else if (action == leftAction) {
144
-            getWorld().moveEntity(mLara, 'l');
145
+            getLara().move('l');
145
         } else if (action == rightAction) {
146
         } else if (action == rightAction) {
146
-            getWorld().moveEntity(mLara, 'r');
147
+            getLara().move('r');
147
         }
148
         }
148
     }
149
     }
149
 }
150
 }
167
                 getCamera().command(CAMERA_ROTATE_DOWN);
168
                 getCamera().command(CAMERA_ROTATE_DOWN);
168
 
169
 
169
         // Fix Laras rotation
170
         // Fix Laras rotation
170
-        mLara->angles[1] = getCamera().getRadianYaw();
171
-        mLara->angles[2] = getCamera().getRadianPitch();
171
+        getLara().setAngles(getCamera().getRadianYaw(), getCamera().getRadianPitch());
172
     }
172
     }
173
 }
173
 }
174
 
174
 
175
 Entity &Game::getLara() {
175
 Entity &Game::getLara() {
176
-    assert(mLara < getWorld().sizeEntity());
176
+    assert(mLara >= 0);
177
+    assert(mLara < (int)getWorld().sizeEntity());
177
     return getWorld().getEntity(mLara);
178
     return getWorld().getEntity(mLara);
178
 }
179
 }
179
 
180
 
385
     bool cached = false;
386
     bool cached = false;
386
     unsigned int mod = 0;
387
     unsigned int mod = 0;
387
     for (; mod < getWorld().sizeSkeletalModel(); mod++) {
388
     for (; mod < getWorld().sizeSkeletalModel(); mod++) {
388
-        if (getWorld().getSkeletalModel(mod).getId() == moveable[index].object_id) {
389
+        if (getWorld().getSkeletalModel(mod).getId() == object_id) {
389
             cached = true;
390
             cached = true;
390
             break;
391
             break;
391
         }
392
         }
392
     }
393
     }
393
 
394
 
394
     if (!cached) {
395
     if (!cached) {
395
-        getWorld().addSkeletalModel(*new SkeletalModel(mTombRaider, index, i));
396
+        getWorld().addSkeletalModel(*new SkeletalModel(mTombRaider, index, i, object_id));
396
     }
397
     }
397
 
398
 
398
     getWorld().addEntity(*new Entity(mTombRaider, index, i, mod));
399
     getWorld().addEntity(*new Entity(mTombRaider, index, i, mod));

+ 1
- 1
src/OpenRaider.cpp 파일 보기

493
     if (getGame().isLoaded()) {
493
     if (getGame().isLoaded()) {
494
         for (int i = 0; i < 3; i++) {
494
         for (int i = 0; i < 3; i++) {
495
             getWindow().drawText(10, getWindow().mHeight - ((4 - i) * 20), 0.5f, OR_BLUE, "%.2f (%.2f)",
495
             getWindow().drawText(10, getWindow().mHeight - ((4 - i) * 20), 0.5f, OR_BLUE, "%.2f (%.2f)",
496
-                getGame().mLara->pos[i] / 256.0f, getGame().mLara->angles[i]);
496
+                getGame().getLara().getPos(i) / 256.0f, getGame().getLara().getAngle(i));
497
         }
497
         }
498
     }
498
     }
499
 #endif
499
 #endif

+ 13
- 2
src/SkeletalModel.cpp 파일 보기

146
     frame.push_back(&b);
146
     frame.push_back(&b);
147
 }
147
 }
148
 
148
 
149
-SkeletalModel::SkeletalModel(TombRaider &tr, unsigned int index, unsigned int i) {
149
+SkeletalModel::SkeletalModel(TombRaider &tr, unsigned int index, unsigned int i, int objectId) {
150
     tr2_moveable_t *moveable = mTombRaider.Moveable();
150
     tr2_moveable_t *moveable = mTombRaider.Moveable();
151
     tr2_animation_t *anim = mTombRaider.Animation();
151
     tr2_animation_t *anim = mTombRaider.Animation();
152
 
152
 
153
-    id = moveable[index].object_id;
153
+    id = objectId;
154
 
154
 
155
     // Gather more info if this is lara
155
     // Gather more info if this is lara
156
     if (id == 0) {
156
     if (id == 0) {
244
     return id;
244
     return id;
245
 }
245
 }
246
 
246
 
247
+void SkeletalModel::setPigTail(bool b) {
248
+    pigtails = b;
249
+    if (b) {
250
+        ponyOff -= 20;
251
+        ponytail[1] -= 32;
252
+    } else {
253
+        ponyOff += 20;
254
+        ponytail[1] += 32;
255
+    }
256
+}
257
+
247
 unsigned int SkeletalModel::size() {
258
 unsigned int SkeletalModel::size() {
248
     return animation.size();
259
     return animation.size();
249
 }
260
 }

+ 0
- 173
src/World.cpp 파일 보기

27
         mMeshes.push_back(mesh);
27
         mMeshes.push_back(mesh);
28
 }
28
 }
29
 
29
 
30
-void World::moveEntity(entity_t *e, char movement)
31
-{
32
-    const float moved = 180.0f;
33
-    const float testd = 220.0f;
34
-    const float camHeight = 8.0f;
35
-    float x, y, z, pitch, h, floor, ceiling;
36
-    int room, sector;
37
-    bool wall;
38
-    unsigned int roomFlags;
39
-
40
-
41
-    if (!e)
42
-    {
43
-        return;
44
-    }
45
-
46
-    switch (e->moveType)
47
-    {
48
-        case worldMoveType_walkNoSwim:
49
-        case worldMoveType_walk:
50
-            pitch = 0.0f;  // in the future pitch could control jump up blocks here
51
-            break;
52
-
53
-        case worldMoveType_noClipping:
54
-        case worldMoveType_fly:
55
-        case worldMoveType_swim:
56
-            pitch = e->angles[2];
57
-            break;
58
-    }
59
-
60
-    switch (movement)
61
-    {
62
-        case 'f':
63
-            x = e->pos[0] + (testd * sinf(e->angles[1]));
64
-            y = e->pos[1] + (testd * sinf(pitch));
65
-            z = e->pos[2] + (testd * cosf(e->angles[1]));
66
-            break;
67
-        case 'b':
68
-            x = e->pos[0] - (testd * sinf(e->angles[1]));
69
-            y = e->pos[1] - (testd * sinf(pitch));
70
-            z = e->pos[2] - (testd * cosf(e->angles[1]));
71
-            break;
72
-        case 'l':
73
-            x = e->pos[0] - (testd * sinf(e->angles[1] + 90.0f));
74
-            y = e->pos[1];
75
-            z = e->pos[2] - (testd * cosf(e->angles[1] + 90.0f));
76
-            break;
77
-        case 'r':
78
-            x = e->pos[0] + (testd * sinf(e->angles[1] + 90.0f));
79
-            y = e->pos[1];
80
-            z = e->pos[2] + (testd * cosf(e->angles[1] + 90.0f));
81
-            break;
82
-        default:
83
-            return;
84
-    }
85
-
86
-    //room = getRoomByLocation(x, y, z);
87
-    room = getRoomByLocation(e->room, x, y, z);
88
-
89
-    if (room == -1) // Will we hit a portal?
90
-    {
91
-        room = getAdjoiningRoom(e->room,
92
-                e->pos[0],  e->pos[1], e->pos[2],
93
-                x, y, z);
94
-
95
-        if (room > -1)
96
-        {
97
-            printf("Crossing from room %i to %i\n", e->room, room);
98
-        } else {
99
-            //! \fixme mRooms, sectors, ... are now std::vector, but often upper bound checks are missing
100
-            return;
101
-        }
102
-    }
103
-
104
-    roomFlags = getRoomInfo(room);
105
-    sector = getSector(room, x, z, &floor, &ceiling);
106
-    wall = isWall(room, sector);
107
-
108
-    // If you're underwater you may want to swim  =)
109
-    // ...if you're worldMoveType_walkNoSwim, you better hope it's shallow
110
-    if (roomFlags & RoomFlagUnderWater && e->moveType == worldMoveType_walk)
111
-        e->moveType = worldMoveType_swim;
112
-
113
-    // Don't swim on land
114
-    if (!(roomFlags & RoomFlagUnderWater) && e->moveType == worldMoveType_swim)
115
-        e->moveType = worldMoveType_walk;
116
-
117
-    // Mongoose 2002.09.02, Add check for room -> room transition
118
-    //   ( Only allow by movement between rooms by using portals )
119
-    if (((e->moveType == worldMoveType_noClipping) ||
120
-                (e->moveType == worldMoveType_fly) ||
121
-                (e->moveType == worldMoveType_swim)) ||
122
-            ((room > -1) && (!wall)))
123
-    {
124
-        e->room = room;
125
-
126
-        switch (movement)
127
-        {
128
-            case 'f':
129
-                x = e->pos[0] + (moved * sinf(e->angles[1]));
130
-                y = e->pos[1] + (moved * sinf(pitch));
131
-                z = e->pos[2] + (moved * cosf(e->angles[1]));
132
-                break;
133
-            case 'b':
134
-                x = e->pos[0] - (moved * sinf(e->angles[1]));
135
-                y = e->pos[1] - (moved * sinf(pitch));
136
-                z = e->pos[2] - (moved * cosf(e->angles[1]));
137
-                break;
138
-            case 'l':
139
-                x = e->pos[0] - (moved * sinf(e->angles[1] + 90.0f));
140
-                z = e->pos[2] - (moved * cosf(e->angles[1] + 90.0f));
141
-                break;
142
-            case 'r':
143
-                x = e->pos[0] + (moved * sinf(e->angles[1] + 90.0f));
144
-                z = e->pos[2] + (moved * cosf(e->angles[1] + 90.0f));
145
-                break;
146
-        }
147
-
148
-        /*! \fixme Test for vector (move vector) / plane (portal) collision here
149
-         * to see if we need to switch rooms... man...
150
-         */
151
-
152
-        h = y;
153
-        getHeightAtPosition(room, x, &h, z);
154
-
155
-        switch (e->moveType)
156
-        {
157
-            case worldMoveType_fly:
158
-            case worldMoveType_swim:
159
-                // Don't fall out of world, avoid a movement that does
160
-                if (h > y - camHeight)
161
-                {
162
-                    e->pos[0] = x;
163
-                    e->pos[1] = y;
164
-                    e->pos[2] = z;
165
-                }
166
-                break;
167
-            case worldMoveType_walk:
168
-            case worldMoveType_walkNoSwim:
169
-                y = e->pos[1];  // Override vector movement walking ( er, not pretty )
170
-
171
-                // Now fake gravity
172
-                // Mongoose 2002.08.14, Remember TR is upside down ( you fall 'up' )
173
-
174
-                //ddist = h - e->pos[1];
175
-
176
-                // This is to force false gravity, by making camera stay on ground
177
-                e->pos[1] = h; //roomFloor->bbox_min[1];
178
-
179
-                // Check for camera below terrian and correct
180
-                if (e->pos[1] < h - camHeight)
181
-                {
182
-                    e->pos[1] = h - camHeight;
183
-                }
184
-
185
-                e->pos[0] = x;
186
-                e->pos[2] = z;
187
-                break;
188
-            case worldMoveType_noClipping:
189
-                e->pos[0] = x;
190
-                e->pos[1] = y;
191
-                e->pos[2] = z;
192
-        }
193
-    }
194
-    else
195
-    {
196
-        return;
197
-    }
198
-
199
-    e->room = room;
200
-}
201
-
202
-
203
 void World::addRoom(Room &room) {
30
 void World::addRoom(Room &room) {
204
     mRooms.push_back(&room);
31
     mRooms.push_back(&room);
205
 }
32
 }

Loading…
취소
저장