Kaynağa Gözat

Can also click on Room Sprites

Thomas Buck 8 yıl önce
ebeveyn
işleme
b5f7ad321f
10 değiştirilmiş dosya ile 127 ekleme ve 55 silme
  1. 6
    0
      ChangeLog.md
  2. 4
    1
      include/Room.h
  3. 5
    0
      include/RoomData.h
  4. 4
    0
      include/Sprite.h
  5. 1
    0
      include/global.h
  6. 16
    0
      src/Room.cpp
  7. 18
    0
      src/RoomData.cpp
  8. 50
    52
      src/Selector.cpp
  9. 15
    0
      src/Sprite.cpp
  10. 8
    2
      src/World.cpp

+ 6
- 0
ChangeLog.md Dosyayı Görüntüle

2
 
2
 
3
 ## OpenRaider (0.1.4) xythobuz <xythobuz@xythobuz.de>
3
 ## OpenRaider (0.1.4) xythobuz <xythobuz@xythobuz.de>
4
 
4
 
5
+    [ 20150811 ]
6
+    * Can click on RoomModels and RoomSprites
7
+    * This will show their BoundingSpheres
8
+    * Fixed Mouse Selector Depth Sorting Issue
9
+    * Improved Room List UI
10
+
5
     [ 20150803 ]
11
     [ 20150803 ]
6
     * Started working on ray casting for mouse object selection
12
     * Started working on ray casting for mouse object selection
7
 
13
 

+ 4
- 1
include/Room.h Dosyayı Görüntüle

44
     int getNumZSectors() { return numZSectors; }
44
     int getNumZSectors() { return numZSectors; }
45
     int getIndex() { return roomIndex; }
45
     int getIndex() { return roomIndex; }
46
 
46
 
47
-    void addSprite(RoomSprite* s) { sprites.emplace_back(s); }
48
     void addSector(Sector* s) { sectors.emplace_back(s); }
47
     void addSector(Sector* s) { sectors.emplace_back(s); }
49
 
48
 
49
+    void addSprite(RoomSprite* s) { sprites.emplace_back(s); }
50
+    unsigned long sizeSprites() { return sprites.size(); }
51
+    RoomSprite& getSprite(unsigned long index) { return *sprites.at(index); }
52
+
50
     void addModel(StaticModel* s) { models.emplace_back(s); }
53
     void addModel(StaticModel* s) { models.emplace_back(s); }
51
     unsigned long sizeModels() { return models.size(); }
54
     unsigned long sizeModels() { return models.size(); }
52
     StaticModel& getModel(unsigned long index) { return *models.at(index); }
55
     StaticModel& getModel(unsigned long index) { return *models.at(index); }

+ 5
- 0
include/RoomData.h Dosyayı Görüntüle

34
   public:
34
   public:
35
     RoomSprite(glm::vec3 p, int s) : pos(p), sprite(s) { }
35
     RoomSprite(glm::vec3 p, int s) : pos(p), sprite(s) { }
36
     void display(glm::mat4 VP);
36
     void display(glm::mat4 VP);
37
+    void displayUI();
38
+
39
+    glm::vec3 getCenter();
40
+    float getRadius();
41
+    void displayBoundingSphere(glm::mat4 VP, glm::vec3 color);
37
 
42
 
38
   private:
43
   private:
39
     glm::vec3 pos;
44
     glm::vec3 pos;

+ 4
- 0
include/Sprite.h Dosyayı Görüntüle

10
 
10
 
11
 #include <vector>
11
 #include <vector>
12
 
12
 
13
+#include "BoundingSphere.h"
14
+
13
 class Sprite {
15
 class Sprite {
14
   public:
16
   public:
15
     Sprite(int tile, int x, int y, int width, int height);
17
     Sprite(int tile, int x, int y, int width, int height);
17
 
19
 
18
     int getTexture() { return texture; }
20
     int getTexture() { return texture; }
19
     glm::vec4 getUVs() { return uv2D; }
21
     glm::vec4 getUVs() { return uv2D; }
22
+    BoundingSphere& getBoundingSphere() { return boundingSphere; }
20
 
23
 
21
   private:
24
   private:
22
     int texture;
25
     int texture;
23
     std::vector<glm::vec3> vertexBuff;
26
     std::vector<glm::vec3> vertexBuff;
24
     std::vector<glm::vec2> uvBuff;
27
     std::vector<glm::vec2> uvBuff;
25
     glm::vec4 uv2D;
28
     glm::vec4 uv2D;
29
+    BoundingSphere boundingSphere;
26
 };
30
 };
27
 
31
 
28
 class SpriteSequence {
32
 class SpriteSequence {

+ 1
- 0
include/global.h Dosyayı Görüntüle

18
     spriteObject,
18
     spriteObject,
19
     meshObject,
19
     meshObject,
20
     modelObject,
20
     modelObject,
21
+    entityObject,
21
 
22
 
22
     WorldObjectCount // Should always be at the end
23
     WorldObjectCount // Should always be at the end
23
 } WorldObjects;
24
 } WorldObjects;

+ 16
- 0
src/Room.cpp Dosyayı Görüntüle

6
  */
6
  */
7
 
7
 
8
 #include "global.h"
8
 #include "global.h"
9
+#include "Camera.h"
9
 #include "Log.h"
10
 #include "Log.h"
10
 #include "Room.h"
11
 #include "Room.h"
11
 
12
 
139
         ImGui::Text("None");
140
         ImGui::Text("None");
140
     }
141
     }
141
     ImGui::NextColumn();
142
     ImGui::NextColumn();
143
+    if (sprites.size() > 0) {
144
+        if (ImGui::TreeNode("...##sprite")) {
145
+            for (auto& s : sprites) {
146
+                s->displayUI();
147
+            }
148
+            ImGui::TreePop();
149
+        }
150
+    } else {
151
+        ImGui::Text("None");
152
+    }
153
+    ImGui::NextColumn();
154
+    if (ImGui::Button("Warp")) {
155
+        Camera::setPosition(pos);
156
+    }
157
+    ImGui::NextColumn();
142
     ImGui::PopID();
158
     ImGui::PopID();
143
 }
159
 }
144
 
160
 

+ 18
- 0
src/RoomData.cpp Dosyayı Görüntüle

60
 
60
 
61
 // ----------------------------------------------------------------------------
61
 // ----------------------------------------------------------------------------
62
 
62
 
63
+glm::vec3 RoomSprite::getCenter() {
64
+    glm::vec3 center = World::getSprite(sprite).getBoundingSphere().getPosition();
65
+    glm::vec4 tmp = glm::translate(glm::mat4(1.0f), pos) * glm::vec4(center, 1.0f);
66
+    return glm::vec3(tmp) / tmp.w;
67
+}
68
+
69
+float RoomSprite::getRadius() {
70
+    return World::getSprite(sprite).getBoundingSphere().getRadius();
71
+}
72
+
73
+void RoomSprite::displayBoundingSphere(glm::mat4 VP, glm::vec3 color) {
74
+    World::getSprite(sprite).getBoundingSphere().display(VP * glm::translate(glm::mat4(1.0f), pos), color);
75
+}
76
+
63
 void RoomSprite::display(glm::mat4 VP) {
77
 void RoomSprite::display(glm::mat4 VP) {
64
     glm::mat4 translate = glm::translate(glm::mat4(1.0f), pos);
78
     glm::mat4 translate = glm::translate(glm::mat4(1.0f), pos);
65
 
79
 
70
     World::getSprite(sprite).display(VP * (translate * rotate));
84
     World::getSprite(sprite).display(VP * (translate * rotate));
71
 }
85
 }
72
 
86
 
87
+void RoomSprite::displayUI() {
88
+    ImGui::Text("Sprite %d", sprite);
89
+}
90
+
73
 // ----------------------------------------------------------------------------
91
 // ----------------------------------------------------------------------------
74
 
92
 
75
 bool Portal::showBoundingBox = false;
93
 bool Portal::showBoundingBox = false;

+ 50
- 52
src/Selector.cpp Dosyayı Görüntüle

20
 
20
 
21
 bool Selector::visible = false;
21
 bool Selector::visible = false;
22
 WorldObjects Selector::lastClickedObject = WorldObjectCount;
22
 WorldObjects Selector::lastClickedObject = WorldObjectCount;
23
-std::array<bool, WorldObjectCount> Selector::clickOnObject = {{ false, true, true, true, false, false }};
23
+
24
+// geometryObject, roomSpriteObject, roomModelObject, spriteObject, meshObject, modelObject, entityObject
25
+std::array<bool, WorldObjectCount> Selector::clickOnObject = {{ false, true, true, false, false, false, false }};
26
+
24
 glm::i32vec2 Selector::rayScreen(-1, -1);
27
 glm::i32vec2 Selector::rayScreen(-1, -1);
25
 glm::vec3 Selector::rayWorld, Selector::lastIntersectPos, Selector::lastIntersectNorm;
28
 glm::vec3 Selector::rayWorld, Selector::lastIntersectPos, Selector::lastIntersectNorm;
26
 unsigned long Selector::lastIndexA, Selector::lastIndexB;
29
 unsigned long Selector::lastIndexA, Selector::lastIndexB;
41
         bool foundSomething = false;
44
         bool foundSomething = false;
42
         float depth = -1.0f;
45
         float depth = -1.0f;
43
 
46
 
44
-        if (clickOnObject[modelObject]) {
45
-
46
-        }
47
-
48
-        if (clickOnObject[meshObject]) {
49
-
50
-        }
51
-
52
-        if (clickOnObject[spriteObject]) {
53
-
54
-        }
55
-
56
-        if (clickOnObject[roomModelObject]) {
47
+        if (clickOnObject[roomModelObject] || clickOnObject[roomSpriteObject]) {
57
             for (unsigned long i = 0; i < World::sizeRoom(); i++) {
48
             for (unsigned long i = 0; i < World::sizeRoom(); i++) {
58
-                Room &r = World::getRoom(i);
59
-                for (unsigned long j = 0; j < r.sizeModels(); j++) {
60
-                    StaticModel &sm = r.getModel(j);
61
-                    glm::vec3 pos, norm;
62
-                    if (glm::intersectRaySphere(Camera::getPosition(), rayWorld, sm.getCenter(), sm.getRadius(),
63
-                                                pos, norm)) {
64
-                        float newDepth = glm::abs(glm::distance(sm.getCenter(), Camera::getPosition()));
65
-                        if ((newDepth < depth) || (depth < 0.0f)) {
66
-                            depth = newDepth;
67
-                            lastIndexA = i;
68
-                            lastIndexB = j;
69
-                            lastIntersectPos = pos;
70
-                            lastIntersectNorm = norm;
71
-                            lastClickedObject = roomModelObject;
72
-                            foundSomething = true;
49
+                Room& r = World::getRoom(i);
50
+                glm::vec3 pos, norm;
51
+
52
+                if (clickOnObject[roomModelObject]) {
53
+                    for (unsigned long j = 0; j < r.sizeModels(); j++) {
54
+                        StaticModel& sm = r.getModel(j);
55
+                        if (glm::intersectRaySphere(Camera::getPosition(), rayWorld, sm.getCenter(), sm.getRadius(),
56
+                                                    pos, norm)) {
57
+                            float newDepth = glm::abs(glm::distance(sm.getCenter(), Camera::getPosition()));
58
+                            if ((newDepth < depth) || (depth < 0.0f)) {
59
+                                depth = newDepth;
60
+                                lastIndexA = i;
61
+                                lastIndexB = j;
62
+                                lastIntersectPos = pos;
63
+                                lastIntersectNorm = norm;
64
+                                lastClickedObject = roomModelObject;
65
+                                foundSomething = true;
66
+                            }
73
                         }
67
                         }
74
                     }
68
                     }
75
                 }
69
                 }
76
-            }
77
-        }
78
-
79
-        if (clickOnObject[roomSpriteObject]) {
80
-
81
-        }
82
-
83
-        if (clickOnObject[geometryObject]) {
84
-
85
 
70
 
71
+                if (clickOnObject[roomSpriteObject]) {
72
+                    for (unsigned long j = 0; j < r.sizeSprites(); j++) {
73
+                        RoomSprite& rs = r.getSprite(j);
74
+                        if (glm::intersectRaySphere(Camera::getPosition(), rayWorld, rs.getCenter(), rs.getRadius(), pos, norm)) {
75
+                            float newDepth = glm::abs(glm::distance(rs.getCenter(), Camera::getPosition()));
76
+                            if ((newDepth < depth) || (depth < 0.0f)) {
77
+                                depth = newDepth;
78
+                                lastIndexA = i;
79
+                                lastIndexB = j;
80
+                                lastIntersectPos = pos;
81
+                                lastIntersectNorm = norm;
82
+                                lastClickedObject = roomSpriteObject;
83
+                                foundSomething = true;
84
+                            }
85
+                        }
86
+                    }
87
+                }
88
+            }
86
         }
89
         }
87
 
90
 
88
         if (!foundSomething) {
91
         if (!foundSomething) {
94
 void Selector::displaySelection() {
97
 void Selector::displaySelection() {
95
     if (lastClickedObject == roomModelObject) {
98
     if (lastClickedObject == roomModelObject) {
96
         World::getRoom(lastIndexA).getModel(lastIndexB).displayBoundingSphere(Camera::getProjectionMatrix() * Camera::getViewMatrix(), glm::vec3(1.0f, 0.0f, 0.0f));
99
         World::getRoom(lastIndexA).getModel(lastIndexB).displayBoundingSphere(Camera::getProjectionMatrix() * Camera::getViewMatrix(), glm::vec3(1.0f, 0.0f, 0.0f));
100
+    } else if (lastClickedObject == roomSpriteObject) {
101
+        World::getRoom(lastIndexA).getSprite(lastIndexB).displayBoundingSphere(Camera::getProjectionMatrix() * Camera::getViewMatrix(), glm::vec3(1.0f, 0.0f, 0.0f));
102
+    } else {
103
+        lastClickedObject = WorldObjectCount;
97
     }
104
     }
98
 }
105
 }
99
 
106
 
106
         return;
113
         return;
107
     }
114
     }
108
 
115
 
109
-    ImGui::Checkbox("Geometry", &clickOnObject[geometryObject]);
110
-    ImGui::SameLine();
111
     ImGui::Checkbox("RoomModels", &clickOnObject[roomModelObject]);
116
     ImGui::Checkbox("RoomModels", &clickOnObject[roomModelObject]);
112
     ImGui::SameLine();
117
     ImGui::SameLine();
113
     ImGui::Checkbox("RoomSprites", &clickOnObject[roomSpriteObject]);
118
     ImGui::Checkbox("RoomSprites", &clickOnObject[roomSpriteObject]);
114
-    ImGui::Checkbox("Sprites", &clickOnObject[spriteObject]);
115
-    ImGui::SameLine();
116
-    ImGui::Checkbox("Meshes", &clickOnObject[meshObject]);
117
-    ImGui::SameLine();
118
-    ImGui::Checkbox("Models", &clickOnObject[modelObject]);
119
     ImGui::SameLine();
119
     ImGui::SameLine();
120
     if (ImGui::Button("Hide Selector")) {
120
     if (ImGui::Button("Hide Selector")) {
121
         visible = false;
121
         visible = false;
122
     }
122
     }
123
     ImGui::Separator();
123
     ImGui::Separator();
124
 
124
 
125
-    // Not yet implemented!
126
-    clickOnObject[modelObject] = false;
127
-    clickOnObject[meshObject] = false;
128
-    clickOnObject[spriteObject] = false;
129
-    clickOnObject[roomSpriteObject] = false;
130
-    clickOnObject[geometryObject] = false;
131
-
132
     ImGui::Text("Camera: (%.2f %.2f %.2f)", Camera::getPosition().x, Camera::getPosition().y, Camera::getPosition().z);
125
     ImGui::Text("Camera: (%.2f %.2f %.2f)", Camera::getPosition().x, Camera::getPosition().y, Camera::getPosition().z);
133
     ImGui::Text("Last click: (%d %d)", rayScreen.x, rayScreen.y);
126
     ImGui::Text("Last click: (%d %d)", rayScreen.x, rayScreen.y);
134
     if ((rayScreen.x >= 0) && (rayScreen.y >= 0)) {
127
     if ((rayScreen.x >= 0) && (rayScreen.y >= 0)) {
143
     if (lastClickedObject == roomModelObject) {
136
     if (lastClickedObject == roomModelObject) {
144
         ImGui::Text("Last Room: %lu", lastIndexA);
137
         ImGui::Text("Last Room: %lu", lastIndexA);
145
         ImGui::Text("Last RoomModel: %lu", lastIndexB);
138
         ImGui::Text("Last RoomModel: %lu", lastIndexB);
139
+    } else if (lastClickedObject == roomSpriteObject) {
140
+        ImGui::Text("Last Room: %lu", lastIndexA);
141
+        ImGui::Text("Last RoomSprite: %lu", lastIndexB);
142
+    } else {
143
+        lastClickedObject = WorldObjectCount;
146
     }
144
     }
147
 
145
 
148
     ImGui::End();
146
     ImGui::End();

+ 15
- 0
src/Sprite.cpp Dosyayı Görüntüle

38
     vertexBuff.emplace_back(vertexBuff.at(2));
38
     vertexBuff.emplace_back(vertexBuff.at(2));
39
 
39
 
40
     uv2D = glm::vec4(uvBuff.at(0), uvBuff.at(2));
40
     uv2D = glm::vec4(uvBuff.at(0), uvBuff.at(2));
41
+
42
+    glm::vec3 average(0.0f, 0.0f, 0.0f);
43
+    int averageCount = 0;
44
+    for (auto& vert : vertexBuff) {
45
+        average += vert;
46
+        averageCount++;
47
+    }
48
+    glm::vec3 center = average / float(averageCount);
49
+    float radius = 0.0f;
50
+    for (auto& vert : vertexBuff) {
51
+        float dist = glm::distance(center, vert);
52
+        if (dist > radius) radius = dist;
53
+    }
54
+    boundingSphere.setPosition(center);
55
+    boundingSphere.setRadius(radius);
41
 }
56
 }
42
 
57
 
43
 void Sprite::display(glm::mat4 MVP) {
58
 void Sprite::display(glm::mat4 MVP) {

+ 8
- 2
src/World.cpp Dosyayı Görüntüle

123
     // Rooms
123
     // Rooms
124
     static bool offsets = false;
124
     static bool offsets = false;
125
     if (ImGui::CollapsingHeader("Rooms")) {
125
     if (ImGui::CollapsingHeader("Rooms")) {
126
-        ImGui::Columns(6, "rooms");
126
+        ImGui::Columns(8, "rooms");
127
         ImGui::Text("No");
127
         ImGui::Text("No");
128
         ImGui::NextColumn();
128
         ImGui::NextColumn();
129
         ImGui::Text("Ind.");
129
         ImGui::Text("Ind.");
136
         ImGui::NextColumn();
136
         ImGui::NextColumn();
137
         ImGui::Text("Portals");
137
         ImGui::Text("Portals");
138
         ImGui::NextColumn();
138
         ImGui::NextColumn();
139
+        ImGui::Text("Sprites");
140
+        ImGui::NextColumn();
141
+        ImGui::Text("Tools");
142
+        ImGui::NextColumn();
139
         ImGui::Separator();
143
         ImGui::Separator();
140
         if (!offsets) {
144
         if (!offsets) {
141
             ImGui::SetColumnOffset(1, 40.0f);
145
             ImGui::SetColumnOffset(1, 40.0f);
142
             ImGui::SetColumnOffset(2, 80.0f);
146
             ImGui::SetColumnOffset(2, 80.0f);
143
             ImGui::SetColumnOffset(3, 120.0f);
147
             ImGui::SetColumnOffset(3, 120.0f);
144
             ImGui::SetColumnOffset(4, 180.0f);
148
             ImGui::SetColumnOffset(4, 180.0f);
145
-            ImGui::SetColumnOffset(5, 300.0f);
149
+            ImGui::SetColumnOffset(5, 250.0f);
150
+            ImGui::SetColumnOffset(6, 350.0f);
151
+            ImGui::SetColumnOffset(7, 400.0f);
146
             offsets = true;
152
             offsets = true;
147
         }
153
         }
148
         for (int i = 0; i < rooms.size(); i++) {
154
         for (int i = 0; i < rooms.size(); i++) {

Loading…
İptal
Kaydet