Browse Source

SkeletalModel rendering tests

Thomas Buck 9 years ago
parent
commit
2ada067d3c
4 changed files with 113 additions and 92 deletions
  1. 1
    0
      ChangeLog.md
  2. 10
    11
      include/SkeletalModel.h
  3. 92
    72
      src/SkeletalModel.cpp
  4. 10
    9
      src/loader/LoaderTR2.cpp

+ 1
- 0
ChangeLog.md View File

5
     [ 20140213 ]
5
     [ 20140213 ]
6
     * The menu can be navigated using a controller
6
     * The menu can be navigated using a controller
7
     * Vertical camera rotation is now also clamped when using a controller
7
     * Vertical camera rotation is now also clamped when using a controller
8
+    * Worked on rendering SkeletalModels, not yet working correctly
8
 
9
 
9
     [ 20140211 ]
10
     [ 20140211 ]
10
     * Updated imgui to version 1.32
11
     * Updated imgui to version 1.32

+ 10
- 11
include/SkeletalModel.h View File

13
 
13
 
14
 class BoneTag {
14
 class BoneTag {
15
   public:
15
   public:
16
-    BoneTag(int m, float o[3], float r[3], char f);
17
-    void display();
16
+    BoneTag(int m, glm::vec3 o, glm::vec3 r, char f) : mesh(m), off(o), rot(r), flag(f) { }
17
+    void display(glm::mat4 MVP);
18
 
18
 
19
-    void getOffset(float o[3]);
20
-    void getRotation(float r[3]);
21
-    char getFlag();
19
+    glm::vec3 getOffset() { return off; }
20
+    glm::vec3 getRotation() { return rot; }
21
+    char getFlag() { return flag; }
22
 
22
 
23
   private:
23
   private:
24
     int mesh;
24
     int mesh;
25
-    float off[3];
26
-    float rot[3];
25
+    glm::vec3 off, rot;
27
     char flag;
26
     char flag;
28
 };
27
 };
29
 
28
 
30
 class BoneFrame {
29
 class BoneFrame {
31
   public:
30
   public:
32
-    BoneFrame(float p[3]);
31
+    BoneFrame(glm::vec3 p) : pos(p) { }
33
     ~BoneFrame();
32
     ~BoneFrame();
34
 
33
 
35
-    void getPosition(float p[3]);
34
+    glm::vec3 getPosition() { return pos; }
36
 
35
 
37
     unsigned long size();
36
     unsigned long size();
38
     BoneTag& get(unsigned long i);
37
     BoneTag& get(unsigned long i);
39
     void add(BoneTag* t);
38
     void add(BoneTag* t);
40
 
39
 
41
   private:
40
   private:
42
-    float pos[3];
41
+    glm::vec3 pos;
43
     std::vector<BoneTag*> tag;
42
     std::vector<BoneTag*> tag;
44
 };
43
 };
45
 
44
 
46
 class AnimationFrame {
45
 class AnimationFrame {
47
   public:
46
   public:
48
-    AnimationFrame(char r);
47
+    AnimationFrame(char r) : rate(r) { }
49
     ~AnimationFrame();
48
     ~AnimationFrame();
50
 
49
 
51
     unsigned long size();
50
     unsigned long size();

+ 92
- 72
src/SkeletalModel.cpp View File

11
 #include "SkeletalModel.h"
11
 #include "SkeletalModel.h"
12
 #include "World.h"
12
 #include "World.h"
13
 
13
 
14
-BoneTag::BoneTag(int m, float o[3], float r[3], char f) {
15
-    mesh = m;
16
-    flag = f;
17
-    for (int i = 0; i < 3; i++) {
18
-        off[i] = o[i];
19
-        rot[i] = r[i];
20
-    }
21
-}
22
-
23
-void BoneTag::display() {
24
-    /*
25
-    if (getWorld().sizeMesh() > 0)
26
-        getWorld().getMesh(mesh).drawSolid(); // TODO ?
27
-    else
28
-        getWorld().getStaticMesh(mesh).display();
29
-    */
30
-}
31
-
32
-void BoneTag::getOffset(float o[3]) {
33
-    o[0] = off[0];
34
-    o[1] = off[1];
35
-    o[2] = off[2];
36
-}
37
-
38
-void BoneTag::getRotation(float r[3]) {
39
-    r[0] = rot[0];
40
-    r[1] = rot[1];
41
-    r[2] = rot[2];
42
-}
14
+#include <glm/gtc/matrix_transform.hpp>
43
 
15
 
44
-char BoneTag::getFlag() {
45
-    return flag;
16
+void BoneTag::display(glm::mat4 MVP) {
17
+    getWorld().getMesh(mesh).display(MVP);
46
 }
18
 }
47
 
19
 
48
 // ----------------------------------------------------------------------------
20
 // ----------------------------------------------------------------------------
49
 
21
 
50
-BoneFrame::BoneFrame(float p[3]) {
51
-    for (int i = 0; i < 3; i++)
52
-        pos[i] = p[i];
53
-}
54
-
55
 BoneFrame::~BoneFrame() {
22
 BoneFrame::~BoneFrame() {
56
     for (unsigned long i = 0; i < tag.size(); i++)
23
     for (unsigned long i = 0; i < tag.size(); i++)
57
         delete tag[i];
24
         delete tag[i];
70
     tag.push_back(t);
37
     tag.push_back(t);
71
 }
38
 }
72
 
39
 
73
-void BoneFrame::getPosition(float p[3]) {
74
-    p[0] = pos[0];
75
-    p[1] = pos[1];
76
-    p[2] = pos[2];
77
-}
78
-
79
 // ----------------------------------------------------------------------------
40
 // ----------------------------------------------------------------------------
80
 
41
 
81
-AnimationFrame::AnimationFrame(char r) {
82
-    rate = r;
83
-}
84
-
85
 AnimationFrame::~AnimationFrame() {
42
 AnimationFrame::~AnimationFrame() {
86
     for (unsigned long i = 0; i < frame.size(); i++)
43
     for (unsigned long i = 0; i < frame.size(); i++)
87
         delete frame[i];
44
         delete frame[i];
102
 
59
 
103
 // ----------------------------------------------------------------------------
60
 // ----------------------------------------------------------------------------
104
 
61
 
62
+class MatrixStack {
63
+  public:
64
+    MatrixStack(glm::mat4 start) : startVal(start) { stack.push_back(startVal); }
65
+
66
+    void push() {
67
+        //assert(stack.size() > 0);
68
+        if (stack.size() > 0)
69
+            stack.push_back(stack.at(stack.size() - 1));
70
+    }
71
+
72
+    void pop() {
73
+        //assert(stack.size() > 0);
74
+        if (stack.size() > 0)
75
+            stack.pop_back();
76
+    }
77
+
78
+    glm::mat4 get() {
79
+        //assert(stack.size() > 0);
80
+        if (stack.size() > 0)
81
+            return stack.at(stack.size() - 1);
82
+        return startVal;
83
+    }
84
+
85
+  private:
86
+    std::vector<glm::mat4> stack;
87
+    glm::mat4 startVal;
88
+};
89
+
90
+// ----------------------------------------------------------------------------
91
+
105
 SkeletalModel::~SkeletalModel() {
92
 SkeletalModel::~SkeletalModel() {
106
     for (unsigned long i = 0; i < animation.size(); i++)
93
     for (unsigned long i = 0; i < animation.size(); i++)
107
         delete animation[i];
94
         delete animation[i];
108
 }
95
 }
109
 
96
 
97
+//#define DEBUG_MODELS
98
+
99
+#ifdef DEBUG_MODELS
100
+#include <bitset>
101
+#endif
102
+
110
 void SkeletalModel::display(glm::mat4 MVP, int aframe, int bframe) {
103
 void SkeletalModel::display(glm::mat4 MVP, int aframe, int bframe) {
111
-    /*
112
     assert(aframe < size());
104
     assert(aframe < size());
113
     assert(bframe < get(aframe).size());
105
     assert(bframe < get(aframe).size());
114
 
106
 
115
     AnimationFrame& anim = get(aframe);
107
     AnimationFrame& anim = get(aframe);
116
     BoneFrame& boneframe = anim.get(bframe);
108
     BoneFrame& boneframe = anim.get(bframe);
117
 
109
 
118
-    float pos[3];
119
-    boneframe.getPosition(pos);
120
-    glTranslatef(pos[0], pos[1], pos[2]);
110
+    glm::vec3 pos = boneframe.getPosition();
111
+    glm::mat4 frameTrans = glm::translate(glm::mat4(1.0f), glm::vec3(pos.x, -pos.y, pos.z));
112
+
113
+    MatrixStack stack(MVP * frameTrans);
114
+
115
+#ifdef DEBUG_MODELS
116
+    Log::get(LOG_DEBUG) << "Starting SkeletalModel:" << Log::endl;
117
+    int cnt = 0;
118
+#endif
121
 
119
 
122
     for (unsigned int a = 0; a < boneframe.size(); a++) {
120
     for (unsigned int a = 0; a < boneframe.size(); a++) {
123
         BoneTag& tag = boneframe.get(a);
121
         BoneTag& tag = boneframe.get(a);
124
-        float rot[3], off[3];
125
-
126
-        tag.getRotation(rot);
127
-        tag.getOffset(off);
128
-
129
-        if (a == 0) {
130
-            glRotatef(rot[1], 0, 1, 0);
131
-            glRotatef(rot[0], 1, 0, 0);
132
-            glRotatef(rot[2], 0, 0, 1);
133
-        } else {
134
-            if (tag.getFlag() & 0x01)
135
-                glPopMatrix();
136
-
137
-            if (tag.getFlag() & 0x02)
138
-                glPushMatrix();
139
-
140
-            glTranslatef(off[0], off[1], off[2]);
141
-            glRotatef(rot[1], 0, 1, 0);
142
-            glRotatef(rot[0], 1, 0, 0);
143
-            glRotatef(rot[2], 0, 0, 1);
122
+
123
+        glm::mat4 translate(1.0f);
124
+
125
+        if (a != 0) {
126
+            if (tag.getFlag() & 0x01) {
127
+                stack.pop();
128
+#ifdef DEBUG_MODELS
129
+                Log::get(LOG_DEBUG) << "  --> pop" << Log::endl;
130
+                cnt--;
131
+#endif
132
+            }
133
+
134
+            if (tag.getFlag() & 0x02) {
135
+                stack.push();
136
+#ifdef DEBUG_MODELS
137
+                Log::get(LOG_DEBUG) << "  --> push" << Log::endl;
138
+                cnt++;
139
+#endif
140
+            }
141
+
142
+#ifdef DEBUG_MODELS
143
+            if (tag.getFlag() & ~0x03) {
144
+                std::bitset<8> bs(tag.getFlag());
145
+                Log::get(LOG_DEBUG) << "  Unexpected flag " << bs << Log::endl;
146
+            }
147
+#endif
148
+
149
+            glm::vec3 off = tag.getOffset();
150
+            translate = glm::translate(glm::mat4(1.0f), glm::vec3(off.x, -off.y, off.z));
144
         }
151
         }
145
 
152
 
146
-        tag.display();
153
+        glm::vec3 rot = tag.getRotation();
154
+        glm::mat4 rotY = glm::rotate(glm::mat4(1.0f), rot[1], glm::vec3(0.0f, 1.0f, 0.0f));
155
+        glm::mat4 rotX = glm::rotate(glm::mat4(1.0f), rot[0], glm::vec3(1.0f, 0.0f, 0.0f));
156
+        glm::mat4 rotZ = glm::rotate(glm::mat4(1.0f), rot[2], glm::vec3(0.0f, 0.0f, 1.0f));
157
+        glm::mat4 rotate = rotZ * rotX * rotY;
158
+
159
+        glm::mat4 mod = translate * rotate;
160
+        tag.display(stack.get() * mod);
161
+#ifdef DEBUG_MODELS
162
+        Log::get(LOG_DEBUG) << "  --> get (" << cnt << ")" << Log::endl;
163
+#endif
147
     }
164
     }
148
-    */
165
+
166
+#ifdef DEBUG_MODELS
167
+    Log::get(LOG_DEBUG) << "Done!" << Log::endl;
168
+#endif
149
 }
169
 }
150
 
170
 
151
 unsigned long SkeletalModel::size() {
171
 unsigned long SkeletalModel::size() {

+ 10
- 9
src/loader/LoaderTR2.cpp View File

833
         // Just add the frame indicated in frameOffset, nothing else
833
         // Just add the frame indicated in frameOffset, nothing else
834
         char* tmp = reinterpret_cast<char*>(&frames[0]) + frameOffset;
834
         char* tmp = reinterpret_cast<char*>(&frames[0]) + frameOffset;
835
         BinaryMemory frame(tmp + 12, (numFrames * 2) - frameOffset - 12); // skip two BBs
835
         BinaryMemory frame(tmp + 12, (numFrames * 2) - frameOffset - 12); // skip two BBs
836
-        float pos[3];
837
-        pos[0] = frame.read16();
838
-        pos[1] = frame.read16();
839
-        pos[2] = frame.read16();
836
+        glm::vec3 pos;
837
+        pos.x = frame.read16();
838
+        pos.y = frame.read16();
839
+        pos.z = frame.read16();
840
         BoneFrame* bf = new BoneFrame(pos);
840
         BoneFrame* bf = new BoneFrame(pos);
841
 
841
 
842
         for (int i = 0; i < numMeshes; i++) {
842
         for (int i = 0; i < numMeshes; i++) {
843
             int mesh = startingMesh + i;
843
             int mesh = startingMesh + i;
844
-            float offset[3] = { 0.0f, 0.0f, 0.0f };
844
+            glm::vec3 offset;
845
             float rotation[3] = { 0.0f, 0.0f, 0.0f };
845
             float rotation[3] = { 0.0f, 0.0f, 0.0f };
846
             char flag = (i == 0) ? 2 : 0;
846
             char flag = (i == 0) ? 2 : 0;
847
 
847
 
851
                 tmp += (i - 1) * 16; // TODO ?
851
                 tmp += (i - 1) * 16; // TODO ?
852
                 BinaryMemory tree(tmp, (numMeshTrees * 4) - meshTree - ((i - 1) * 16));
852
                 BinaryMemory tree(tmp, (numMeshTrees * 4) - meshTree - ((i - 1) * 16));
853
                 flag = (char)tree.readU32();
853
                 flag = (char)tree.readU32();
854
-                offset[0] = tree.read32();
855
-                offset[1] = tree.read32();
856
-                offset[2] = tree.read32();
854
+                offset.x = tree.read32();
855
+                offset.y = tree.read32();
856
+                offset.z = tree.read32();
857
 
857
 
858
                 uint16_t a = frame.readU16();
858
                 uint16_t a = frame.readU16();
859
                 if (a & 0xC000) {
859
                 if (a & 0xC000) {
875
                 }
875
                 }
876
             }
876
             }
877
 
877
 
878
-            BoneTag* bt = new BoneTag(mesh, offset, rotation, flag);
878
+            glm::vec3 rot(rotation[0], rotation[1], rotation[2]);
879
+            BoneTag* bt = new BoneTag(mesh, offset, rot, flag);
879
             bf->add(bt);
880
             bf->add(bt);
880
         }
881
         }
881
 
882
 

Loading…
Cancel
Save