Object::Object() :
position(),
- type(0),
+ type(boxtype),
yaw(0),
pitch(0),
rotx(0),
{
}
-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;
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 {
}
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;
{
float maxdistance = 0;
float tempdist;
- for (int i = 0; i < objects.size(); i++) {
+ for (unsigned int i = 0; i < objects.size(); i++) {
tempdist = distsq(¢er, &objects[i]->position);
if (tempdist > maxdistance) {
maxdistance = tempdist;
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;
}
}
{
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);
}
}
}
}
+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();