]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/object.cpp
Avoid negative values of wait_time
[r2c2.git] / source / libr2c2 / object.cpp
index d7c7db25e68beaeac81923f5eb2e6258b10e2e7d..7a896b6581b40c849e5a3296c513260038b4c230 100644 (file)
@@ -2,9 +2,15 @@
 #include "object.h"
 
 using namespace std;
+using namespace Msp;
 
 namespace R2C2 {
 
+Object::Object(Layout &l):
+       layout(l),
+       shape(0)
+{ }
+
 Snap Object::get_snap_node(unsigned) const
 {
        throw out_of_range("Object::get_snap_node");
@@ -83,26 +89,42 @@ void Object::break_links()
                break_link(i);
 }
 
-bool Object::collide_ray(const Ray &ray) const
+const Shape *Object::get_shape() const
+{
+       if(shape)
+               return shape;
+       return get_type().get_shape();
+}
+
+bool Object::collide_ray(const Ray &ray, float *d) const
 {
-       const Shape *shape = get_type().get_shape();
-       if(!shape)
+       const Shape *s = get_shape();
+       if(!s)
                return false;
 
        Transform reverse_trans = Transform::rotation(rotation, Vector(0, 0, -1))*
                Transform::translation(-position);
-       return shape->check_intersection(reverse_trans.transform(ray));
+       if(d)
+       {
+               vector<Geometry::SurfacePoint<float, 3> > points = s->get_intersections(reverse_trans.transform(ray));
+               if(points.empty())
+                       return false;
+               *d = points.front().distance;
+               return true;
+       }
+       else
+               return s->check_intersection(reverse_trans.transform(ray));
 }
 
 BoundingBox Object::get_bounding_box() const
 {
-       const Shape *shape = get_type().get_shape();
-       if(!shape)
+       const Shape *s = get_shape();
+       if(!s)
                return BoundingBox();
 
        Transform trans = Transform::translation(position)*
                Transform::rotation(rotation, Vector(0, 0, 1));
-       return trans.transform(shape->get_axis_aligned_bounding_box());
+       return trans.transform(s->get_axis_aligned_bounding_box());
 }
 
 } // namespace R2C2