]> git.jsancho.org Git - lugaru.git/blobdiff - Source/Objects/Object.cpp
Small cleanups
[lugaru.git] / Source / Objects / Object.cpp
index 3a49c9c43e16d821a70dda19aa4e13d3434fa1a3..06665de39c645f74bddf07ff155b0a594e4a6121 100644 (file)
@@ -49,7 +49,7 @@ Texture Object::rocktextureptr;
 
 Object::Object() :
     position(),
-    type(0),
+    type(boxtype),
     yaw(0),
     pitch(0),
     rotx(0),
@@ -70,7 +70,7 @@ Object::Object() :
 {
 }
 
-Object::Object(int _type, XYZ _position, float _yaw, float _pitch, float _scale) : Object()
+Object::Object(object_type _type, XYZ _position, float _yaw, float _pitch, float _scale) : Object()
 {
     scale = _scale;
     type = _type;
@@ -80,35 +80,35 @@ Object::Object(int _type, XYZ _position, float _yaw, float _pitch, float _scale)
 
     switch(type) {
         case boxtype:
-            model.loaddecal("Models/Box.solid", 0);
+            model.loaddecal("Models/Box.solid");
             friction = 1.5;
             break;
         case cooltype:
-            model.loaddecal("Models/Cool.solid", 0);
+            model.loaddecal("Models/Cool.solid");
             friction = 1.5;
             break;
         case walltype:
-            model.loaddecal("Models/Wall.solid", 0);
+            model.loaddecal("Models/Wall.solid");
             friction = 1.5;
             break;
         case tunneltype:
-            model.loaddecal("Models/Tunnel.solid", 0);
+            model.loaddecal("Models/Tunnel.solid");
             friction = 1.5;
             break;
         case chimneytype:
-            model.loaddecal("Models/Chimney.solid", 0);
+            model.loaddecal("Models/Chimney.solid");
             friction = 1.5;
             break;
         case spiketype:
-            model.load("Models/Spike.solid", 0);
+            model.load("Models/Spike.solid");
             friction = .4;
             break;
         case weirdtype:
-            model.loaddecal("Models/Weird.solid", 0);
+            model.loaddecal("Models/Weird.solid");
             friction = 1.5;
             break;
         case rocktype:
-            model.loaddecal("Models/Rock.solid", 0);
+            model.loaddecal("Models/Rock.solid");
             if (scale > .5) {
                 friction = 1.5;
             } else {
@@ -116,20 +116,20 @@ Object::Object(int _type, XYZ _position, float _yaw, float _pitch, float _scale)
             }
             break;
         case treetrunktype:
-            model.load("Models/TreeTrunk.solid", 0);
+            model.load("Models/TreeTrunk.solid");
             friction = .4;
             break;
         case treeleavestype:
             scale += fabs((float)(Random() % 100) / 900) * scale;
-            model.load("Models/Leaves.solid", 0);
+            model.load("Models/Leaves.solid");
             friction = 0;
             break;
         case bushtype:
             position.y = terrain.getHeight(position.x, position.z) - .3;
-            model.load("Models/Bush.solid", 0);
+            model.load("Models/Bush.solid");
             break;
         case platformtype:
-            model.loaddecal("Models/Platform.solid", 0);
+            model.loaddecal("Models/Platform.solid");
             model.Rotate(90, 0, 0);
             friction = 1.5;
             break;
@@ -689,7 +689,7 @@ void Object::ComputeRadius()
 {
     float maxdistance = 0;
     float tempdist;
-    for (int i = 0; i < objects.size(); i++) {
+    for (unsigned int i = 0; i < objects.size(); i++) {
         tempdist = distsq(&center, &objects[i]->position);
         if (tempdist > maxdistance) {
             maxdistance = tempdist;
@@ -714,7 +714,7 @@ void Object::LoadObjectsFromFile(FILE* tfile, bool skip)
             if (type == treeleavestype) {
                 scale = lastscale;
             }
-            objects.emplace_back(new Object(type, position, yaw, pitch, scale));
+            objects.emplace_back(new Object(object_type(type), position, yaw, pitch, scale));
             lastscale = scale;
         }
     }
@@ -788,8 +788,7 @@ void Object::MakeObject(int atype, XYZ where, float ayaw, float apitch, float as
 {
     if ((atype != treeleavestype && atype != bushtype) || foliage == 1) {
         unsigned nextid = objects.size();
-        cout << "Adding object " << nextid << endl;
-        objects.emplace_back(new Object(atype, where, ayaw, apitch, ascale));
+        objects.emplace_back(new Object(object_type(atype), where, ayaw, apitch, ascale));
         objects.back()->addToTerrain(nextid);
     }
 }
@@ -815,6 +814,70 @@ void Object::DoShadows()
     }
 }
 
+int Object::checkcollide(XYZ startpoint, XYZ endpoint)
+{
+    float minx, minz, maxx, maxz, miny, maxy;
+
+    minx = min(startpoint.x, endpoint.x) - 1;
+    miny = min(startpoint.y, endpoint.y) - 1;
+    minz = min(startpoint.z, endpoint.z) - 1;
+    maxx = max(startpoint.x, endpoint.x) + 1;
+    maxy = max(startpoint.y, endpoint.y) + 1;
+    maxz = max(startpoint.z, endpoint.z) + 1;
+
+    for (unsigned int i = 0; i < objects.size(); i++) {
+        if (checkcollide(startpoint, endpoint, i, minx, miny, minz, maxx, maxy, maxz) != -1) {
+            return (int) i;
+        }
+    }
+
+    return -1;
+}
+
+int Object::checkcollide(XYZ startpoint, XYZ endpoint, int what)
+{
+    float minx, minz, maxx, maxz, miny, maxy;
+
+    minx = min(startpoint.x, endpoint.x) - 1;
+    miny = min(startpoint.y, endpoint.y) - 1;
+    minz = min(startpoint.z, endpoint.z) - 1;
+    maxx = max(startpoint.x, endpoint.x) + 1;
+    maxy = max(startpoint.y, endpoint.y) + 1;
+    maxz = max(startpoint.z, endpoint.z) + 1;
+
+    return checkcollide(startpoint, endpoint, what, minx, miny, minz, maxx, maxy, maxz);
+}
+
+int Object::checkcollide(XYZ startpoint, XYZ endpoint, int what, float minx, float miny, float minz, float maxx, float maxy, float maxz)
+{
+    XYZ colpoint, colviewer, coltarget;
+
+    if (what == 1000) {
+        if (terrain.lineTerrain(startpoint, endpoint, &colpoint) != -1) {
+            return what;
+        }
+    } else {
+        if (     objects[what]->position.x > minx - objects[what]->model.boundingsphereradius &&
+                 objects[what]->position.x < maxx + objects[what]->model.boundingsphereradius &&
+                 objects[what]->position.y > miny - objects[what]->model.boundingsphereradius &&
+                 objects[what]->position.y < maxy + objects[what]->model.boundingsphereradius &&
+                 objects[what]->position.z > minz - objects[what]->model.boundingsphereradius &&
+                 objects[what]->position.z < maxz + objects[what]->model.boundingsphereradius) {
+            if (     objects[what]->type != treeleavestype &&
+                     objects[what]->type != bushtype &&
+                     objects[what]->type != firetype) {
+                colviewer = startpoint;
+                coltarget = endpoint;
+                if (objects[what]->model.LineCheck(&colviewer, &coltarget, &colpoint, &objects[what]->position, &objects[what]->yaw) != -1) {
+                    return what;
+                }
+            }
+        }
+    }
+
+    return -1;
+}
+
 //~ Object::~Objects()
 //~ {
     //~ boxtextureptr.destroy();