All pastes #1939904 Raw Edit

Unnamed

public text v1 · immutable
#1939904 ·published 2010-09-13 18:23 UTC
rendered paste body
Index: src/object/physical_obj.cpp
===================================================================
--- src/object/physical_obj.cpp	(revision 8450)
+++ src/object/physical_obj.cpp	(working copy)
@@ -643,14 +643,15 @@
     return NULL;
 
   Rectanglei rect(position.x + m_test_left, position.y + m_test_top,
-                 m_width - m_test_right - m_test_left, m_height - m_test_bottom - m_test_top);
+                  m_width - m_test_right - m_test_left, m_height - m_test_bottom - m_test_top);
 
   if (m_collides_with_characters) {
     FOR_ALL_LIVING_CHARACTERS(team,character) {
       // We check both objet if one overlapse the other
       if (&(*character) != this && !IsOverlapping(&(*character)) &&
-          !character->IsOverlapping(this) && character->GetTestRect().Intersect(rect))
+          !character->IsOverlapping(this) && Intersect(&(*character), rect)) {
         return (PhysicalObj*) &(*character);
+      }
     }
   }
 
@@ -658,16 +659,42 @@
     FOR_EACH_OBJECT(it) {
       PhysicalObj * object=*it;
       // We check both objet if one overlapse the other
-      if (object != this && !IsOverlapping(object) && !object->IsOverlapping(this) &&
-          object->m_collides_with_objects && object->GetTestRect().Intersect(rect)) {
-        if (!m_is_character || object->m_collides_with_characters)
-          return object;
-      }
+      if (!m_is_character || object->m_collides_with_characters)
+	if (object != this && !IsOverlapping(object) && !object->IsOverlapping(this) &&
+	    object->m_collides_with_objects && Intersect(object, rect)) {
+	  return object;
+	}
     }
   }
   return NULL;
 }
 
+inline bool PhysicalObj::Intersect(const PhysicalObj *object, const Rectanglei & rect) const
+{
+  int obj_width = object->m_width - object->m_test_right - object->m_test_left;
+  obj_width  =  !obj_width ? 1 : obj_width;
+  Rectanglei obj_rect(object->GetX() + object->m_test_left, 1, obj_width, 1);
+
+  int obj_test_left = obj_rect.GetTopLeftPoint().x;
+  int obj_test_right = obj_rect.GetBottomRightPoint().x;
+  int test_left = rect.GetTopLeftPoint().x ;
+  int test_right = rect.GetBottomRightPoint().x;
+  if (!((obj_test_right < test_left) || (obj_test_left > test_right))) { //if inside
+    int obj_height = object->m_height - object->m_test_bottom - object->m_test_top;
+    obj_height = !obj_height ? 1 : obj_height;
+    obj_rect.SetPositionY(object->GetY() + object->m_test_top);
+    obj_rect.SetSizeY(obj_height);
+    int obj_test_top = obj_rect.GetTopLeftPoint().y;
+    int obj_test_bottom = obj_rect.GetBottomRightPoint().y;
+    int test_top = rect.GetTopLeftPoint().y;
+    int test_bottom = rect.GetBottomRightPoint().y;
+
+    if (!((obj_test_top > test_bottom) || (obj_test_bottom < test_top)))
+      return true;
+  }
+  return false;
+}
+
 bool PhysicalObj::FootsInVacuumXY(const Point2i &position) const
 {
   if (IsOutsideWorldXY(position)) {
Index: src/object/physical_obj.h
===================================================================
--- src/object/physical_obj.h	(revision 8450)
+++ src/object/physical_obj.h	(working copy)
@@ -130,6 +130,8 @@
     height = !height ? 1 : height;
     return Rectanglei(GetX() + m_test_left, GetY() + m_test_top, width, height);
   }
+
+  inline bool Intersect(const PhysicalObj* object, const Rectanglei & position) const;
   int GetTestWidth() const { return m_width -m_test_left -m_test_right; };
   int GetTestHeight() const { return m_height -m_test_top -m_test_bottom; };