diff options
author | Juan Linietsky <reduzio@gmail.com> | 2014-02-19 11:57:14 -0300 |
---|---|---|
committer | Juan Linietsky <reduzio@gmail.com> | 2014-02-19 11:57:14 -0300 |
commit | d7d65fa2f2b51d03f7bdfcbceedca99188ce979c (patch) | |
tree | fecdf1bfa39ba5a4895b4dbf340a3b68098c109a /servers/physics_2d/physics_2d_server_sw.cpp | |
parent | 8c1731b67995add31361ae526b0e6af76346181e (diff) | |
download | redot-engine-d7d65fa2f2b51d03f7bdfcbceedca99188ce979c.tar.gz |
-improved physics ccd
-html5 exporter works again
-disable repeat on image loader by default
-can change shape offset en tileset, texture offset was broken
Diffstat (limited to 'servers/physics_2d/physics_2d_server_sw.cpp')
-rw-r--r-- | servers/physics_2d/physics_2d_server_sw.cpp | 96 |
1 files changed, 81 insertions, 15 deletions
diff --git a/servers/physics_2d/physics_2d_server_sw.cpp b/servers/physics_2d/physics_2d_server_sw.cpp index 70e3d843b4..0fbd461f46 100644 --- a/servers/physics_2d/physics_2d_server_sw.cpp +++ b/servers/physics_2d/physics_2d_server_sw.cpp @@ -29,6 +29,7 @@ #include "physics_2d_server_sw.h" #include "broad_phase_2d_basic.h" #include "broad_phase_2d_hash_grid.h" +#include "collision_solver_2d_sw.h" RID Physics2DServerSW::shape_create(ShapeType p_shape) { @@ -81,6 +82,9 @@ RID Physics2DServerSW::shape_create(ShapeType p_shape) { return id; }; + + + void Physics2DServerSW::shape_set_data(RID p_shape, const Variant& p_data) { Shape2DSW *shape = shape_owner.get(p_shape); @@ -126,6 +130,63 @@ real_t Physics2DServerSW::shape_get_custom_solver_bias(RID p_shape) const { } +void Physics2DServerSW::_shape_col_cbk(const Vector2& p_point_A,const Vector2& p_point_B,void *p_userdata) { + + CollCbkData *cbk=(CollCbkData *)p_userdata; + + if (cbk->amount == cbk->max) { + //find least deep + float min_depth=1e20; + int min_depth_idx=0; + for(int i=0;i<cbk->amount;i++) { + + float d = cbk->ptr[i*2+0].distance_squared_to(cbk->ptr[i*2+1]); + if (d<min_depth) { + min_depth=d; + min_depth_idx=i; + } + + } + + float d = p_point_A.distance_squared_to(p_point_B); + if (d<min_depth) + return; + cbk->ptr[min_depth_idx*2+0]=p_point_A; + cbk->ptr[min_depth_idx*2+1]=p_point_B; + + + } else { + + cbk->ptr[cbk->amount*2+0]=p_point_A; + cbk->ptr[cbk->amount*2+1]=p_point_B; + } +} + +bool Physics2DServerSW::shape_collide(RID p_shape_A, const Matrix32& p_xform_A,const Vector2& p_motion_A,RID p_shape_B, const Matrix32& p_xform_B, const Vector2& p_motion_B,Vector2 *r_results,int p_result_max,int &r_result_count) { + + + Shape2DSW *shape_A = shape_owner.get(p_shape_A); + ERR_FAIL_COND_V(!shape_A,false); + Shape2DSW *shape_B = shape_owner.get(p_shape_B); + ERR_FAIL_COND_V(!shape_B,false); + + if (p_result_max==0) { + + return CollisionSolver2DSW::solve(shape_A,p_xform_A,p_motion_A,shape_B,p_xform_B,p_motion_B,NULL,NULL); + } + + CollCbkData cbk; + cbk.max=p_result_max; + cbk.amount=0; + cbk.ptr=r_results; + + bool res= CollisionSolver2DSW::solve(shape_A,p_xform_A,p_motion_A,shape_B,p_xform_B,p_motion_B,_shape_col_cbk,&cbk); + r_result_count=cbk.amount; + return res; + +} + + RID Physics2DServerSW::space_create() { Space2DSW *space = memnew( Space2DSW ); @@ -442,7 +503,7 @@ void Physics2DServerSW::body_set_mode(RID p_body, BodyMode p_mode) { body->set_mode(p_mode); }; -Physics2DServer::BodyMode Physics2DServerSW::body_get_mode(RID p_body, BodyMode p_mode) const { +Physics2DServer::BodyMode Physics2DServerSW::body_get_mode(RID p_body) const { Body2DSW *body = body_owner.get(p_body); ERR_FAIL_COND_V(!body,BODY_MODE_STATIC); @@ -550,23 +611,25 @@ bool Physics2DServerSW::body_is_shape_set_as_trigger(RID p_body, int p_shape_idx } -void Physics2DServerSW::body_set_enable_continuous_collision_detection(RID p_body,bool p_enable) { +void Physics2DServerSW::body_set_continuous_collision_detection_mode(RID p_body,CCDMode p_mode) { Body2DSW *body = body_owner.get(p_body); ERR_FAIL_COND(!body); - - body->set_continuous_collision_detection(p_enable); + body->set_continuous_collision_detection_mode(p_mode); } -bool Physics2DServerSW::body_is_continuous_collision_detection_enabled(RID p_body) const { +Physics2DServerSW::CCDMode Physics2DServerSW::body_get_continuous_collision_detection_mode(RID p_body) const{ - Body2DSW *body = body_owner.get(p_body); - ERR_FAIL_COND_V(!body,false); + const Body2DSW *body = body_owner.get(p_body); + ERR_FAIL_COND_V(!body,CCD_MODE_DISABLED); + + return body->get_continuous_collision_detection_mode(); - return body->is_continuous_collision_detection_enabled(); } + + void Physics2DServerSW::body_attach_object_instance_ID(RID p_body,uint32_t p_ID) { Body2DSW *body = body_owner.get(p_body); @@ -617,13 +680,6 @@ float Physics2DServerSW::body_get_param(RID p_body, BodyParameter p_param) const }; -void Physics2DServerSW::body_static_simulate_motion(RID p_body,const Matrix32& p_new_transform) { - - Body2DSW *body = body_owner.get(p_body); - ERR_FAIL_COND(!body); - body->simulate_motion(p_new_transform,last_step); - -}; void Physics2DServerSW::body_set_state(RID p_body, BodyState p_state, const Variant& p_variant) { @@ -775,6 +831,16 @@ void Physics2DServerSW::body_set_force_integration_callback(RID p_body,Object *p } +bool Physics2DServerSW::body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,Vector2 *r_results,int p_result_max,int &r_result_count) { + + Body2DSW *body = body_owner.get(p_body); + ERR_FAIL_COND_V(!body,false); + ERR_FAIL_INDEX_V(p_body_shape,body->get_shape_count(),false); + + return shape_collide(body->get_shape(p_body_shape)->get_self(),body->get_transform() * body->get_shape_transform(p_body_shape),Vector2(),p_shape,p_shape_xform,p_motion,r_results,p_result_max,r_result_count); + +} + /* JOINT API */ |