本文整理汇总了C++中Matrix32::affine_inverse方法的典型用法代码示例。如果您正苦于以下问题:C++ Matrix32::affine_inverse方法的具体用法?C++ Matrix32::affine_inverse怎么用?C++ Matrix32::affine_inverse使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Matrix32
的用法示例。
在下文中一共展示了Matrix32::affine_inverse方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1:
bool CollisionSolver2DSW::solve_raycast(const Shape2DSW *p_shape_A, const Matrix32 &p_transform_A, const Shape2DSW *p_shape_B, const Matrix32 &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result, Vector2 *sep_axis) {
const RayShape2DSW *ray = static_cast<const RayShape2DSW *>(p_shape_A);
if (p_shape_B->get_type() == Physics2DServer::SHAPE_RAY)
return false;
Vector2 from = p_transform_A.get_origin();
Vector2 to = from + p_transform_A[1] * ray->get_length();
Vector2 support_A = to;
Matrix32 invb = p_transform_B.affine_inverse();
from = invb.xform(from);
to = invb.xform(to);
Vector2 p, n;
if (!p_shape_B->intersect_segment(from, to, p, n)) {
if (sep_axis)
*sep_axis = p_transform_A[1].normalized();
return false;
}
Vector2 support_B = p_transform_B.xform(p);
if (p_result_callback) {
if (p_swap_result)
p_result_callback(support_B, support_A, p_userdata);
else
p_result_callback(support_A, support_B, p_userdata);
}
return true;
}
示例2:
void Area2DSW::set_transform(const Matrix32& p_transform) {
if (!moved_list.in_list() && get_space())
get_space()->area_add_to_moved_list(&moved_list);
_set_transform(p_transform);
_set_inv_transform(p_transform.affine_inverse());
}
示例3:
void CollisionObject2DSW::set_shape_transform(int p_index,const Matrix32& p_transform) {
ERR_FAIL_INDEX(p_index,shapes.size());
shapes[p_index].xform=p_transform;
shapes[p_index].xform_inv=p_transform.affine_inverse();
_update_shapes();
_shapes_changed();
}
示例4: _collision_rectangle_convex_polygon
static void _collision_rectangle_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
const RectangleShape2DSW *rectangle_A = static_cast<const RectangleShape2DSW*>(p_a);
const ConvexPolygonShape2DSW *convex_B = static_cast<const ConvexPolygonShape2DSW*>(p_b);
SeparatorAxisTest2D<RectangleShape2DSW,ConvexPolygonShape2DSW,castA,castB,withMargin> separator(rectangle_A,p_transform_a,convex_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
if (!separator.test_previous_axis())
return;
if (!separator.test_cast())
return;
//box faces
if (!separator.test_axis(p_transform_a.elements[0].normalized()))
return;
if (!separator.test_axis(p_transform_a.elements[1].normalized()))
return;
//convex faces
Matrix32 boxinv;
if (withMargin) {
boxinv=p_transform_a.affine_inverse();
}
for(int i=0;i<convex_B->get_point_count();i++) {
if (!separator.test_axis( convex_B->get_xformed_segment_normal(p_transform_b,i)))
return;
if (withMargin) {
//all points vs all points need to be tested if margin exist
if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a,boxinv,p_transform_b.xform(convex_B->get_point(i)))))
return;
if (castA) {
if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a,boxinv,p_transform_b.xform(convex_B->get_point(i))-p_motion_a)))
return;
}
if (castB) {
if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a,boxinv,p_transform_b.xform(convex_B->get_point(i))+p_motion_b)))
return;
}
if (castA && castB) {
if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a,boxinv,p_transform_b.xform(convex_B->get_point(i))+p_motion_b-p_motion_a)))
return;
}
}
}
separator.generate_contacts();
}
示例5:
bool BodyPair2DSW::_test_ccd(float p_step,Body2DSW *p_A, int p_shape_A,const Matrix32& p_xform_A,Body2DSW *p_B, int p_shape_B,const Matrix32& p_xform_B,bool p_swap_result) {
Vector2 motion = p_A->get_linear_velocity()*p_step;
real_t mlen = motion.length();
if (mlen<CMP_EPSILON)
return false;
Vector2 mnormal = motion / mlen;
real_t min,max;
p_A->get_shape(p_shape_A)->project_rangev(mnormal,p_xform_A,min,max);
bool fast_object = mlen > (max-min)*0.3; //going too fast in that direction
if (!fast_object) { //did it move enough in this direction to even attempt raycast? let's say it should move more than 1/3 the size of the object in that axis
return false;
}
//cast a segment from support in motion normal, in the same direction of motion by motion length
//support is the worst case collision point, so real collision happened before
int a;
Vector2 s[2];
p_A->get_shape(p_shape_A)->get_supports(p_xform_A.basis_xform(mnormal).normalized(),s,a);
Vector2 from = p_xform_A.xform(s[0]);
Vector2 to = from + motion;
Matrix32 from_inv = p_xform_B.affine_inverse();
Vector2 local_from = from_inv.xform(from-mnormal*mlen*0.1); //start from a little inside the bounding box
Vector2 local_to = from_inv.xform(to);
Vector2 rpos,rnorm;
if (!p_B->get_shape(p_shape_B)->intersect_segment(local_from,local_to,rpos,rnorm))
return false;
//ray hit something
Vector2 hitpos = p_xform_B.xform(rpos);
Vector2 contact_A = to;
Vector2 contact_B = hitpos;
//create a contact
if (p_swap_result)
_contact_added_callback(contact_B,contact_A);
else
_contact_added_callback(contact_A,contact_B);
return true;
}
示例6: _collision_circle_rectangle
static void _collision_circle_rectangle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
const CircleShape2DSW *circle_A = static_cast<const CircleShape2DSW*>(p_a);
const RectangleShape2DSW *rectangle_B = static_cast<const RectangleShape2DSW*>(p_b);
SeparatorAxisTest2D<CircleShape2DSW,RectangleShape2DSW,castA,castB,withMargin> separator(circle_A,p_transform_a,rectangle_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
if (!separator.test_previous_axis())
return;
if (!separator.test_cast())
return;
const Vector2 &sphere=p_transform_a.elements[2];
const Vector2 *axis=&p_transform_b.elements[0];
// const Vector2& half_extents = rectangle_B->get_half_extents();
if (!separator.test_axis(axis[0].normalized()))
return;
if (!separator.test_axis(axis[1].normalized()))
return;
Matrix32 binv = p_transform_b.affine_inverse();
{
if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,binv,sphere ) ) )
return;
}
if (castA) {
Vector2 sphereofs = sphere + p_motion_a;
if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,binv, sphereofs) ) )
return;
}
if (castB) {
Vector2 sphereofs = sphere - p_motion_b;
if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,binv, sphereofs) ) )
return;
}
if (castA && castB) {
Vector2 sphereofs = sphere - p_motion_b + p_motion_a;
if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,binv, sphereofs) ) )
return;
}
separator.generate_contacts();
}
示例7:
bool CollisionSolver2DSW::solve_static_line(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result) {
const LineShape2DSW *line = static_cast<const LineShape2DSW*>(p_shape_A);
if (p_shape_B->get_type()==Physics2DServer::SHAPE_LINE)
return false;
Vector2 n = p_transform_A.basis_xform(line->get_normal()).normalized();
Vector2 p = p_transform_A.xform(line->get_normal()*line->get_d());
real_t d = n.dot(p);
Vector2 supports[2];
int support_count;
p_shape_B->get_supports(p_transform_A.affine_inverse().basis_xform(-n).normalized(),supports,support_count);
bool found=false;
for(int i=0;i<support_count;i++) {
supports[i] = p_transform_B.xform( supports[i] );
real_t pd = n.dot(supports[i]);
if (pd>=d)
continue;
found=true;
Vector2 support_A = supports[i] - n*(pd-d);
if (p_result_callback) {
if (p_swap_result)
p_result_callback(supports[i],support_A,p_userdata);
else
p_result_callback(support_A,supports[i],p_userdata);
}
}
return found;
}
示例8: _region_input
void SpriteRegionEditor::_region_input(const InputEvent& p_input)
{
Matrix32 mtx;
mtx.elements[2]=-draw_ofs;
mtx.scale_basis(Vector2(draw_zoom,draw_zoom));
Vector2 endpoints[8]={
mtx.xform(rect.pos)+Vector2(-4,-4),
mtx.xform(rect.pos+Vector2(rect.size.x/2,0))+Vector2(0,-4),
mtx.xform(rect.pos+Vector2(rect.size.x,0))+Vector2(4,-4),
mtx.xform(rect.pos+Vector2(rect.size.x,rect.size.y/2))+Vector2(4,0),
mtx.xform(rect.pos+rect.size)+Vector2(4,4),
mtx.xform(rect.pos+Vector2(rect.size.x/2,rect.size.y))+Vector2(0,4),
mtx.xform(rect.pos+Vector2(0,rect.size.y))+Vector2(-4,4),
mtx.xform(rect.pos+Vector2(0,rect.size.y/2))+Vector2(-4,0)
};
if (p_input.type==InputEvent::MOUSE_BUTTON) {
const InputEventMouseButton &mb=p_input.mouse_button;
if (mb.button_index==BUTTON_LEFT) {
if (mb.pressed) {
drag_from=mtx.affine_inverse().xform(Vector2(mb.x,mb.y));
drag_from=snap_point(drag_from);
drag=true;
rect_prev=node->get_region_rect();
drag_index=-1;
for(int i=0;i<8;i++) {
Vector2 tuv=endpoints[i];
if (tuv.distance_to(Vector2(mb.x,mb.y))<8) {
drag_index=i;
creating = false;
}
}
if (drag_index==-1) {
creating = true;
rect = Rect2(drag_from,Size2());
}
} else if (drag) {
undo_redo->create_action(TTR("Set region_rect"));
undo_redo->add_do_method(node,"set_region_rect",node->get_region_rect());
undo_redo->add_undo_method(node,"set_region_rect",rect_prev);
undo_redo->add_do_method(edit_draw,"update");
undo_redo->add_undo_method(edit_draw,"update");
undo_redo->commit_action();
drag=false;
}
} else if (mb.button_index==BUTTON_RIGHT && mb.pressed) {
if (drag) {
drag=false;
node->set_region_rect(rect_prev);
rect=rect_prev;
edit_draw->update();
}
} else if (mb.button_index==BUTTON_WHEEL_UP && mb.pressed) {
zoom->set_val( zoom->get_val()/0.9 );
} else if (mb.button_index==BUTTON_WHEEL_DOWN && mb.pressed) {
zoom->set_val( zoom->get_val()*0.9);
}
} else if (p_input.type==InputEvent::MOUSE_MOTION) {
const InputEventMouseMotion &mm=p_input.mouse_motion;
if (mm.button_mask&BUTTON_MASK_MIDDLE || Input::get_singleton()->is_key_pressed(KEY_SPACE)) {
Vector2 draged(mm.relative_x,mm.relative_y);
hscroll->set_val( hscroll->get_val()-draged.x );
vscroll->set_val( vscroll->get_val()-draged.y );
} else if (drag) {
Vector2 new_pos = mtx.affine_inverse().xform(Vector2(mm.x,mm.y));
new_pos = snap_point(new_pos);
if (creating) {
rect = Rect2(drag_from,Size2());
rect.expand_to(new_pos);
node->set_region_rect(rect);
edit_draw->update();
return;
}
switch(drag_index) {
//.........这里部分代码省略.........
示例9: _canvas_draw
void TileMapEditor::_canvas_draw() {
if (!node)
return;
Size2 cell_size=node->get_cell_size();
Matrix32 cell_xf = node->get_cell_transform();
Matrix32 xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * node->get_global_transform();
Matrix32 xform_inv = xform.affine_inverse();
Size2 screen_size=canvas_item_editor->get_size();
{
Rect2 aabb;
aabb.pos=node->world_to_map(xform_inv.xform(Vector2()));
aabb.expand_to(node->world_to_map(xform_inv.xform(Vector2(0,screen_size.height))));
aabb.expand_to(node->world_to_map(xform_inv.xform(Vector2(screen_size.width,0))));
aabb.expand_to(node->world_to_map(xform_inv.xform(screen_size)));
Rect2i si=aabb.grow(1.0);
if (node->get_half_offset()!=TileMap::HALF_OFFSET_X) {
for(int i=(si.pos.x)-1;i<=(si.pos.x+si.size.x);i++) {
Vector2 from = xform.xform(node->map_to_world(Vector2(i,si.pos.y)));
Vector2 to = xform.xform(node->map_to_world(Vector2(i,si.pos.y+si.size.y+1)));
Color col=i==0?Color(1,0.8,0.2,0.5):Color(1,0.3,0.1,0.2);
canvas_item_editor->draw_line(from,to,col,1);
}
} else {
for(int i=(si.pos.x)-1;i<=(si.pos.x+si.size.x);i++) {
for(int j=(si.pos.y)-1;j<=(si.pos.y+si.size.y);j++) {
Vector2 ofs;
if (ABS(j)&1) {
ofs=cell_xf[0]*0.5;
}
Vector2 from = xform.xform(node->map_to_world(Vector2(i,j),true)+ofs);
Vector2 to = xform.xform(node->map_to_world(Vector2(i,j+1),true)+ofs);
Color col=i==0?Color(1,0.8,0.2,0.5):Color(1,0.3,0.1,0.2);
canvas_item_editor->draw_line(from,to,col,1);
}
}
}
if (node->get_half_offset()!=TileMap::HALF_OFFSET_Y) {
for(int i=(si.pos.y)-1;i<=(si.pos.y+si.size.y);i++) {
Vector2 from = xform.xform(node->map_to_world(Vector2(si.pos.x,i)));
Vector2 to = xform.xform(node->map_to_world(Vector2(si.pos.x+si.size.x+1,i)));
Color col=i==0?Color(1,0.8,0.2,0.5):Color(1,0.3,0.1,0.2);
canvas_item_editor->draw_line(from,to,col,1);
}
} else {
for(int i=(si.pos.y)-1;i<=(si.pos.y+si.size.y);i++) {
for(int j=(si.pos.x)-1;j<=(si.pos.x+si.size.x);j++) {
Vector2 ofs;
if (ABS(j)&1) {
ofs=cell_xf[1]*0.5;
}
Vector2 from = xform.xform(node->map_to_world(Vector2(j,i),true)+ofs);
Vector2 to = xform.xform(node->map_to_world(Vector2(j+1,i),true)+ofs);
Color col=i==0?Color(1,0.8,0.2,0.5):Color(1,0.3,0.1,0.2);
canvas_item_editor->draw_line(from,to,col,1);
}
}
}
/*
for(int i=(si.pos.y/cell_size.y)-1;i<=(si.pos.y+si.size.y)/cell_size.y;i++) {
int ofs = i*cell_size.y;
Color col=i==0?Color(1,0.8,0.2,0.5):Color(1,0.3,0.1,0.2);
canvas_item_editor->draw_line(xform.xform(Point2(si.pos.x,ofs)),xform.xform(Point2(si.pos.x+si.size.x,ofs)),col,1);*/
}
if (selection_active) {
Vector<Vector2> points;
points.push_back( xform.xform( node->map_to_world(( selection.pos ) )));
//.........这里部分代码省略.........
示例10: forward_input_event
bool TileMapEditor::forward_input_event(const InputEvent& p_event) {
if (!node || !node->get_tileset().is_valid())
return false;
Matrix32 xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * node->get_global_transform();
Matrix32 xform_inv = xform.affine_inverse();
Vector2 snap = node->get_cell_size();
switch(p_event.type) {
case InputEvent::MOUSE_BUTTON: {
const InputEventMouseButton &mb=p_event.mouse_button;
if (mb.button_index==BUTTON_LEFT) {
if (mb.pressed && tool==TOOL_DUPLICATING) {
List<_TileMapEditorCopyData> dupdata;
Point2 ofs = over_tile-selection.pos;
for(int i=selection.pos.y;i<=selection.pos.y+selection.size.y;i++) {
for(int j=selection.pos.x;j<=selection.pos.x+selection.size.x;j++) {
_TileMapEditorCopyData tcd;
tcd.pos=Point2i(j,i);
tcd.cell=node->get_cell(j,i);
tcd.flip_h=node->is_cell_x_flipped(j,i);
tcd.flip_v=node->is_cell_y_flipped(j,i);
tcd.transpose=node->is_cell_transposed(j,i);
dupdata.push_back(tcd);
}
}
undo_redo->create_action("Duplicate");
for (List<_TileMapEditorCopyData>::Element *E=dupdata.front();E;E=E->next()) {
_set_cell(E->get().pos+ofs,E->get().cell,E->get().flip_h,E->get().flip_v,E->get().transpose,true);
}
undo_redo->commit_action();
tool=TOOL_NONE;
canvas_item_editor->update();
selection.pos=over_tile;
} else if (mb.pressed && tool==TOOL_NONE) {
if (Input::get_singleton()->is_key_pressed(KEY_SPACE))
return false; //drag
if (mb.mod.shift) {
tool=TOOL_SELECTING;
selection_begin =node->world_to_map(xform_inv.xform(Point2(mb.x,mb.y)));
selection.pos=selection_begin;
selection.size=Point2(0,0);
selection_active=true;
canvas_item_editor->update();
return true;
} else if (mb.mod.control) {
tool=TOOL_PICKING;
set_selected_tile(node->get_cell(over_tile.x, over_tile.y));
mirror_x->set_pressed(node->is_cell_x_flipped(over_tile.x, over_tile.y));
mirror_y->set_pressed(node->is_cell_y_flipped(over_tile.x, over_tile.y));
transpose->set_pressed(node->is_cell_transposed(over_tile.x, over_tile.y));
_update_transform_buttons();
canvas_item_editor->update();
return true;
} else {
int id = get_selected_tile();
if (id!=TileMap::INVALID_CELL) {
tool=TOOL_PAINTING;
Point2i local =node->world_to_map((xform_inv.xform(Point2(mb.x,mb.y))));
paint_undo.clear();
paint_undo[local]=_get_op_from_cell(local);
node->set_cell(local.x,local.y,id,mirror_x->is_pressed(),mirror_y->is_pressed(),transpose->is_pressed());
return true;
}
}
} else {
if (tool==TOOL_PAINTING || tool == TOOL_SELECTING || tool == TOOL_PICKING) {
if (tool==TOOL_PAINTING) {
if (paint_undo.size()) {
undo_redo->create_action("Paint TileMap");
for(Map<Point2i,CellOp>::Element *E=paint_undo.front();E;E=E->next()) {
Point2i p=E->key();
undo_redo->add_do_method(this,"_set_cell_shortened",Point2(p),node->get_cell(p.x,p.y),node->is_cell_x_flipped(p.x,p.y),node->is_cell_y_flipped(p.x,p.y),node->is_cell_transposed(p.x,p.y));
undo_redo->add_undo_method(this,"_set_cell_shortened",Point2(p),E->get().idx,E->get().xf,E->get().yf,E->get().tr);
//.........这里部分代码省略.........
示例11: if
bool Path2DEditor::forward_input_event(const InputEvent& p_event) {
if (!node)
return false;
if (!node->is_visible())
return false;
if (!node->get_curve().is_valid())
return false;
switch(p_event.type) {
case InputEvent::MOUSE_BUTTON: {
const InputEventMouseButton &mb=p_event.mouse_button;
Matrix32 xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
Vector2 gpoint = Point2(mb.x,mb.y);
Vector2 cpoint = !mb.mod.alt? canvas_item_editor->snap_point(xform.affine_inverse().xform(gpoint))
: node->get_global_transform().affine_inverse().xform( canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint)) );
//first check if a point is to be added (segment split)
real_t grab_treshold=EDITOR_DEF("poly_editor/point_grab_radius",8);
// Test move point!!
if ( mb.pressed && action==ACTION_NONE ) {
Ref<Curve2D> curve = node->get_curve();
for(int i=0;i<curve->get_point_count();i++) {
bool pointunder=false;
{
Point2 p = xform.xform( curve->get_point_pos(i) );
if (gpoint.distance_to(p) < grab_treshold ) {
if (mb.button_index==BUTTON_LEFT && !mb.mod.shift && mode==MODE_EDIT) {
action=ACTION_MOVING_POINT;
action_point=i;
moving_from=curve->get_point_pos(i);
moving_screen_from=gpoint;
return true;
} else if ((mb.button_index==BUTTON_RIGHT && mode==MODE_EDIT) || (mb.button_index==BUTTON_LEFT && mode==MODE_DELETE)) {
undo_redo->create_action(TTR("Remove Point from Curve"));
undo_redo->add_do_method(curve.ptr(),"remove_point",i);
undo_redo->add_undo_method(curve.ptr(),"add_point",curve->get_point_pos(i),curve->get_point_in(i),curve->get_point_out(i),i);
undo_redo->add_do_method(canvas_item_editor->get_viewport_control(),"update");
undo_redo->add_undo_method(canvas_item_editor->get_viewport_control(),"update");
undo_redo->commit_action();
return true;
} else
pointunder=true;
}
}
if (mb.button_index==BUTTON_LEFT && i<(curve->get_point_count()-1)) {
Point2 p = xform.xform( curve->get_point_pos(i)+curve->get_point_out(i) );
if (gpoint.distance_to(p) < grab_treshold && (mode == MODE_EDIT || mode==MODE_EDIT_CURVE) ) {
action=ACTION_MOVING_OUT;
action_point=i;
moving_from=curve->get_point_out(i);
moving_screen_from=gpoint;
return true;
}
}
if (mb.button_index==BUTTON_LEFT && i>0) {
Point2 p = xform.xform( curve->get_point_pos(i)+curve->get_point_in(i) );
if (gpoint.distance_to(p) < grab_treshold && (mode == MODE_EDIT || mode==MODE_EDIT_CURVE)) {
action=ACTION_MOVING_IN;
action_point=i;
moving_from=curve->get_point_in(i);
moving_screen_from=gpoint;
return true;
}
}
if (pointunder)
return true;
}
}
// Test add point in empty space!
if ( mb.pressed && mb.button_index==BUTTON_LEFT && ((mb.mod.command && mode == MODE_EDIT) || mode == MODE_CREATE)) {
Ref<Curve2D> curve = node->get_curve();
//.........这里部分代码省略.........
示例12: _collision_rectangle_capsule
static void _collision_rectangle_capsule(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) {
const RectangleShape2DSW *rectangle_A = static_cast<const RectangleShape2DSW*>(p_a);
const CapsuleShape2DSW *capsule_B = static_cast<const CapsuleShape2DSW*>(p_b);
SeparatorAxisTest2D<RectangleShape2DSW,CapsuleShape2DSW,castA,castB> separator(rectangle_A,p_transform_a,capsule_B,p_transform_b,p_collector,p_motion_a,p_motion_b);
if (!separator.test_previous_axis())
return;
if (!separator.test_cast())
return;
//box faces
if (!separator.test_axis(p_transform_a.elements[0].normalized()))
return;
if (!separator.test_axis(p_transform_a.elements[1].normalized()))
return;
//capsule axis
if (!separator.test_axis(p_transform_b.elements[0].normalized()))
return;
//box endpoints to capsule circles
Matrix32 boxinv = p_transform_a.affine_inverse();
for(int i=0;i<2;i++) {
{
Vector2 capsule_endpoint = p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*(i==0?0.5:-0.5);
const Vector2& half_extents = rectangle_A->get_half_extents();
Vector2 local_v = boxinv.xform(capsule_endpoint);
Vector2 he(
(local_v.x<0) ? -half_extents.x : half_extents.x,
(local_v.y<0) ? -half_extents.y : half_extents.y
);
if (!separator.test_axis(p_transform_a.xform(he-capsule_endpoint).normalized()))
return;
}
if (castA) {
Vector2 capsule_endpoint = p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*(i==0?0.5:-0.5);
capsule_endpoint-=p_motion_a;
const Vector2& half_extents = rectangle_A->get_half_extents();
Vector2 local_v = boxinv.xform(capsule_endpoint);
Vector2 he(
(local_v.x<0) ? -half_extents.x : half_extents.x,
(local_v.y<0) ? -half_extents.y : half_extents.y
);
if (!separator.test_axis(p_transform_a.xform(he-capsule_endpoint).normalized()))
return;
}
if (castB) {
Vector2 capsule_endpoint = p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*(i==0?0.5:-0.5);
capsule_endpoint+=p_motion_b;
const Vector2& half_extents = rectangle_A->get_half_extents();
Vector2 local_v = boxinv.xform(capsule_endpoint);
Vector2 he(
(local_v.x<0) ? -half_extents.x : half_extents.x,
(local_v.y<0) ? -half_extents.y : half_extents.y
);
if (!separator.test_axis(p_transform_a.xform(he-capsule_endpoint).normalized()))
return;
}
if (castA && castB) {
Vector2 capsule_endpoint = p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*(i==0?0.5:-0.5);
capsule_endpoint-=p_motion_a;
capsule_endpoint+=p_motion_b;
const Vector2& half_extents = rectangle_A->get_half_extents();
Vector2 local_v = boxinv.xform(capsule_endpoint);
Vector2 he(
(local_v.x<0) ? -half_extents.x : half_extents.x,
(local_v.y<0) ? -half_extents.y : half_extents.y
);
if (!separator.test_axis(p_transform_a.xform(he-capsule_endpoint).normalized()))
return;
}
//.........这里部分代码省略.........
示例13: _canvas_draw
void TileMapEditor::_canvas_draw() {
if (!node)
return;
Matrix32 cell_xf = node->get_cell_transform();
Matrix32 xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * node->get_global_transform();
Matrix32 xform_inv = xform.affine_inverse();
Size2 screen_size=canvas_item_editor->get_size();
{
Rect2 aabb;
aabb.pos=node->world_to_map(xform_inv.xform(Vector2()));
aabb.expand_to(node->world_to_map(xform_inv.xform(Vector2(0,screen_size.height))));
aabb.expand_to(node->world_to_map(xform_inv.xform(Vector2(screen_size.width,0))));
aabb.expand_to(node->world_to_map(xform_inv.xform(screen_size)));
Rect2i si=aabb.grow(1.0);
if (node->get_half_offset()!=TileMap::HALF_OFFSET_X) {
int max_lines=2000; //avoid crash if size too smal
for (int i=(si.pos.x)-1;i<=(si.pos.x+si.size.x);i++) {
Vector2 from = xform.xform(node->map_to_world(Vector2(i,si.pos.y)));
Vector2 to = xform.xform(node->map_to_world(Vector2(i,si.pos.y+si.size.y+1)));
Color col=i==0?Color(1,0.8,0.2,0.5):Color(1,0.3,0.1,0.2);
canvas_item_editor->draw_line(from,to,col,1);
if (max_lines--==0)
break;
}
} else {
int max_lines=10000; //avoid crash if size too smal
for (int i=(si.pos.x)-1;i<=(si.pos.x+si.size.x);i++) {
for (int j=(si.pos.y)-1;j<=(si.pos.y+si.size.y);j++) {
Vector2 ofs;
if (ABS(j)&1) {
ofs=cell_xf[0]*0.5;
}
Vector2 from = xform.xform(node->map_to_world(Vector2(i,j),true)+ofs);
Vector2 to = xform.xform(node->map_to_world(Vector2(i,j+1),true)+ofs);
Color col=i==0?Color(1,0.8,0.2,0.5):Color(1,0.3,0.1,0.2);
canvas_item_editor->draw_line(from,to,col,1);
if (max_lines--==0)
break;
}
}
}
int max_lines=10000; //avoid crash if size too smal
if (node->get_half_offset()!=TileMap::HALF_OFFSET_Y) {
for (int i=(si.pos.y)-1;i<=(si.pos.y+si.size.y);i++) {
Vector2 from = xform.xform(node->map_to_world(Vector2(si.pos.x,i)));
Vector2 to = xform.xform(node->map_to_world(Vector2(si.pos.x+si.size.x+1,i)));
Color col=i==0?Color(1,0.8,0.2,0.5):Color(1,0.3,0.1,0.2);
canvas_item_editor->draw_line(from,to,col,1);
if (max_lines--==0)
break;
}
} else {
for (int i=(si.pos.y)-1;i<=(si.pos.y+si.size.y);i++) {
for (int j=(si.pos.x)-1;j<=(si.pos.x+si.size.x);j++) {
Vector2 ofs;
if (ABS(j)&1) {
ofs=cell_xf[1]*0.5;
}
Vector2 from = xform.xform(node->map_to_world(Vector2(j,i),true)+ofs);
Vector2 to = xform.xform(node->map_to_world(Vector2(j+1,i),true)+ofs);
Color col=i==0?Color(1,0.8,0.2,0.5):Color(1,0.3,0.1,0.2);
canvas_item_editor->draw_line(from,to,col,1);
if (max_lines--==0)
break;
}
}
}
}
//.........这里部分代码省略.........
示例14: _collision_circle_rectangle
static void _collision_circle_rectangle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b) {
const CircleShape2DSW *circle_A = static_cast<const CircleShape2DSW*>(p_a);
const RectangleShape2DSW *rectangle_B = static_cast<const RectangleShape2DSW*>(p_b);
SeparatorAxisTest2D<CircleShape2DSW,RectangleShape2DSW,castA,castB> separator(circle_A,p_transform_a,rectangle_B,p_transform_b,p_collector,p_motion_a,p_motion_b);
if (!separator.test_previous_axis())
return;
if (!separator.test_cast())
return;
const Vector2 &sphere=p_transform_a.elements[2];
const Vector2 *axis=&p_transform_b.elements[0];
const Vector2& half_extents = rectangle_B->get_half_extents();
if (!separator.test_axis(axis[0].normalized()))
return;
if (!separator.test_axis(axis[1].normalized()))
return;
{
Vector2 local_v = p_transform_b.affine_inverse().xform(p_transform_a.get_origin());
Vector2 he(
(local_v.x<0) ? -half_extents.x : half_extents.x,
(local_v.y<0) ? -half_extents.y : half_extents.y
);
if (!separator.test_axis((p_transform_b.xform(he)-sphere).normalized()))
return;
}
if (castA) {
Vector2 sphereofs = sphere + p_motion_a;
Vector2 local_v = p_transform_b.affine_inverse().xform(sphereofs);
Vector2 he(
(local_v.x<0) ? -half_extents.x : half_extents.x,
(local_v.y<0) ? -half_extents.y : half_extents.y
);
if (!separator.test_axis((p_transform_b.xform(he)-sphereofs).normalized()))
return;
}
if (castB) {
Vector2 sphereofs = sphere - p_motion_b;
Vector2 local_v = p_transform_b.affine_inverse().xform(sphereofs);
Vector2 he(
(local_v.x<0) ? -half_extents.x : half_extents.x,
(local_v.y<0) ? -half_extents.y : half_extents.y
);
if (!separator.test_axis((p_transform_b.xform(he)-sphereofs).normalized()))
return;
}
if (castA && castB) {
Vector2 sphereofs = sphere - p_motion_b + p_motion_a;
Vector2 local_v = p_transform_b.affine_inverse().xform(sphereofs);
Vector2 he(
(local_v.x<0) ? -half_extents.x : half_extents.x,
(local_v.y<0) ? -half_extents.y : half_extents.y
);
if (!separator.test_axis((p_transform_b.xform(he)-sphereofs).normalized()))
return;
}
separator.generate_contacts();
}
示例15: _collision_rectangle_rectangle
static void _collision_rectangle_rectangle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
const RectangleShape2DSW *rectangle_A = static_cast<const RectangleShape2DSW*>(p_a);
const RectangleShape2DSW *rectangle_B = static_cast<const RectangleShape2DSW*>(p_b);
SeparatorAxisTest2D<RectangleShape2DSW,RectangleShape2DSW,castA,castB,withMargin> separator(rectangle_A,p_transform_a,rectangle_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
if (!separator.test_previous_axis())
return;
if (!separator.test_cast())
return;
//box faces A
if (!separator.test_axis(p_transform_a.elements[0].normalized()))
return;
if (!separator.test_axis(p_transform_a.elements[1].normalized()))
return;
//box faces B
if (!separator.test_axis(p_transform_b.elements[0].normalized()))
return;
if (!separator.test_axis(p_transform_b.elements[1].normalized()))
return;
if (withMargin) {
Matrix32 invA=p_transform_a.affine_inverse();
Matrix32 invB=p_transform_b.affine_inverse();
if (!separator.test_axis( rectangle_A->get_box_axis(p_transform_a,invA,rectangle_B,p_transform_b,invB) ) )
return;
if (castA || castB) {
Matrix32 aofs = p_transform_a;
aofs.elements[2]+=p_motion_a;
Matrix32 bofs = p_transform_b;
bofs.elements[2]+=p_motion_b;
Matrix32 aofsinv = aofs.affine_inverse();
Matrix32 bofsinv = bofs.affine_inverse();
if (castA) {
if (!separator.test_axis( rectangle_A->get_box_axis(aofs,aofsinv,rectangle_B,p_transform_b,invB) ) )
return;
}
if (castB) {
if (!separator.test_axis( rectangle_A->get_box_axis(p_transform_a,invA,rectangle_B,bofs,bofsinv) ) )
return;
}
if (castA && castB) {
if (!separator.test_axis( rectangle_A->get_box_axis(aofs,aofsinv,rectangle_B,bofs,bofsinv) ) )
return;
}
}
}
separator.generate_contacts();
}