void CollisionPolygon2D::_notification(int p_what) { switch(p_what) { case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { if (!is_inside_tree()) break; _update_parent(); } break; case NOTIFICATION_DRAW: { for(int i=0;i<polygon.size();i++) { Vector2 p = polygon[i]; Vector2 n = polygon[(i+1)%polygon.size()]; draw_line(p,n,Color(0,0.6,0.7,0.5),3); } Vector< Vector<Vector2> > decomp = Geometry::decompose_polygon(polygon); #define DEBUG_DECOMPOSE #ifdef DEBUG_DECOMPOSE Color c(0.4,0.9,0.1); for(int i=0;i<decomp.size();i++) { c.set_hsv( Math::fmod(c.get_h() + 0.738,1),c.get_s(),c.get_v(),0.5); draw_colored_polygon(decomp[i],c); } #endif } break; } }
void CollisionShape2D::_notification(int p_what) { switch(p_what) { case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { if (!is_inside_scene()) break; _update_parent(); } break; /* case NOTIFICATION_TRANSFORM_CHANGED: { if (!is_inside_scene()) break; _update_parent(); } break;*/ case NOTIFICATION_DRAW: { rect=Rect2(); Color draw_col=Color(0,0.6,0.7,0.5); if (shape->cast_to<LineShape2D>()) { LineShape2D *l = shape->cast_to<LineShape2D>(); Vector2 point = l->get_d() * l->get_normal(); Vector2 l1[2]={point-l->get_normal().tangent()*100,point+l->get_normal().tangent()*100}; draw_line(l1[0],l1[1],draw_col,3); Vector2 l2[2]={point,point+l->get_normal()*30}; draw_line(l2[0],l2[1],draw_col,3); rect.pos=l1[0]; rect.expand_to(l1[1]); rect.expand_to(l2[0]); rect.expand_to(l2[1]); } else if (shape->cast_to<SegmentShape2D>()) { SegmentShape2D *s = shape->cast_to<SegmentShape2D>(); draw_line(s->get_a(),s->get_b(),draw_col,3); rect.pos=s->get_a(); rect.expand_to(s->get_b()); } else if (shape->cast_to<RayShape2D>()) { RayShape2D *s = shape->cast_to<RayShape2D>(); Vector2 tip = Vector2(0,s->get_length()); draw_line(Vector2(),tip,draw_col,3); Vector<Vector2> pts; float tsize=4; pts.push_back(tip+Vector2(0,tsize)); pts.push_back(tip+Vector2(0.707*tsize,0)); pts.push_back(tip+Vector2(-0.707*tsize,0)); Vector<Color> cols; for(int i=0;i<3;i++) cols.push_back(draw_col); draw_primitive(pts,cols,Vector<Vector2>()); //small arrow rect.pos=Vector2(); rect.expand_to(tip); rect=rect.grow(0.707*tsize); } else if (shape->cast_to<CircleShape2D>()) { CircleShape2D *s = shape->cast_to<CircleShape2D>(); Vector<Vector2> points; for(int i=0;i<24;i++) { points.push_back(Vector2(Math::cos(i*Math_PI*2/24.0),Math::sin(i*Math_PI*2/24.0))*s->get_radius()); } draw_colored_polygon(points,draw_col); rect.pos=-Point2(s->get_radius(),s->get_radius()); rect.size=Point2(s->get_radius(),s->get_radius())*2.0; } else if (shape->cast_to<RectangleShape2D>()) { RectangleShape2D *s = shape->cast_to<RectangleShape2D>(); Vector2 he = s->get_extents(); rect=Rect2(-he,he*2.0); draw_rect(rect,draw_col);; } else if (shape->cast_to<CapsuleShape2D>()) { CapsuleShape2D *s = shape->cast_to<CapsuleShape2D>(); Vector<Vector2> points; for(int i=0;i<24;i++) { Vector2 ofs = Vector2(0,(i>6 && i<=18) ? -s->get_height()*0.5 : s->get_height()*0.5); points.push_back(Vector2(Math::sin(i*Math_PI*2/24.0),Math::cos(i*Math_PI*2/24.0))*s->get_radius() + ofs); if (i==6 || i==18) points.push_back(Vector2(Math::sin(i*Math_PI*2/24.0),Math::cos(i*Math_PI*2/24.0))*s->get_radius() - ofs); } draw_colored_polygon(points,draw_col); Vector2 he=Point2(s->get_radius(),s->get_radius()+s->get_height()*0.5); rect.pos=-he; rect.size=he*2.0; } else if (shape->cast_to<ConvexPolygonShape2D>()) { ConvexPolygonShape2D *s = shape->cast_to<ConvexPolygonShape2D>(); Vector<Vector2> points = s->get_points(); for(int i=0;i<points.size();i++) { if (i==0) rect.pos=points[i]; else rect.expand_to(points[i]); } draw_colored_polygon(points,draw_col); } rect=rect.grow(3); } break; } }
void CollisionPolygon2D::_notification(int p_what) { switch(p_what) { case NOTIFICATION_ENTER_TREE: { unparenting=false; can_update_body=get_tree()->is_editor_hint(); if (!get_tree()->is_editor_hint()) { //display above all else set_z_as_relative(false); set_z(VS::CANVAS_ITEM_Z_MAX-1); } } break; case NOTIFICATION_EXIT_TREE: { can_update_body=false; } break; case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { if (!is_inside_tree()) break; if (can_update_body) { _update_parent(); } else if (shape_from>=0 && shape_to>=0) { CollisionObject2D *co = get_parent()->cast_to<CollisionObject2D>(); for(int i=shape_from;i<=shape_to;i++) { co->set_shape_transform(i,get_transform()); } } } break; case NOTIFICATION_DRAW: { if (!get_tree()->is_editor_hint() && !get_tree()->is_debugging_collisions_hint()) { break; } for(int i=0;i<polygon.size();i++) { Vector2 p = polygon[i]; Vector2 n = polygon[(i+1)%polygon.size()]; draw_line(p,n,Color(0.9,0.2,0.0,0.8),3); } #define DEBUG_DECOMPOSE #if defined(TOOLS_ENABLED) && defined (DEBUG_DECOMPOSE) Vector< Vector<Vector2> > decomp = _decompose_in_convex(); Color c(0.4,0.9,0.1); for(int i=0;i<decomp.size();i++) { c.set_hsv( Math::fmod(c.get_h() + 0.738,1),c.get_s(),c.get_v(),0.5); draw_colored_polygon(decomp[i],c); } #else draw_colored_polygon(polygon,get_tree()->get_debug_collisions_color()); #endif } break; case NOTIFICATION_UNPARENTED: { unparenting = true; _update_parent(); } break; } }