| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  body_sw.cpp                                                          */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2019-01-01 12:53:14 +01:00
										 |  |  | /* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)    */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | #include "body_sw.h"
 | 
					
						
							|  |  |  | #include "area_sw.h"
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | #include "space_sw.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | void BodySW::_update_inertia() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (get_space() && !inertia_update_list.in_list()) | 
					
						
							|  |  |  | 		get_space()->body_add_to_inertia_update_list(&inertia_update_list); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | void BodySW::_update_transform_dependant() { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | 	center_of_mass = get_transform().basis.xform(center_of_mass_local); | 
					
						
							|  |  |  | 	principal_inertia_axes = get_transform().basis * principal_inertia_axes_local; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// update inertia tensor
 | 
					
						
							| 
									
										
										
										
											2017-01-11 00:52:51 -03:00
										 |  |  | 	Basis tb = principal_inertia_axes; | 
					
						
							|  |  |  | 	Basis tbt = tb.transposed(); | 
					
						
							| 
									
										
										
										
											2017-09-16 17:50:46 +01:00
										 |  |  | 	Basis diag; | 
					
						
							|  |  |  | 	diag.scale(_inv_inertia); | 
					
						
							|  |  |  | 	_inv_inertia_tensor = tb * diag * tbt; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BodySW::update_inertias() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//update shapes and motions
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	switch (mode) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_MODE_RIGID: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | 			//update tensor for all shapes, not the best way but should be somehow OK. (inspired from bullet)
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			real_t total_area = 0; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			for (int i = 0; i < get_shape_count(); i++) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				total_area += get_shape_area(i); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | 			// We have to recompute the center of mass
 | 
					
						
							|  |  |  | 			center_of_mass_local.zero(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			for (int i = 0; i < get_shape_count(); i++) { | 
					
						
							|  |  |  | 				real_t area = get_shape_area(i); | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-13 17:25:05 -06:00
										 |  |  | 				real_t mass = area * this->mass / total_area; | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// NOTE: we assume that the shape origin is also its center of mass
 | 
					
						
							|  |  |  | 				center_of_mass_local += mass * get_shape_transform(i).origin; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | 			center_of_mass_local /= mass; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// Recompute the inertia tensor
 | 
					
						
							| 
									
										
										
										
											2017-01-11 00:52:51 -03:00
										 |  |  | 			Basis inertia_tensor; | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | 			inertia_tensor.set_zero(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			for (int i = 0; i < get_shape_count(); i++) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-08 00:09:39 +03:00
										 |  |  | 				if (is_shape_disabled(i)) { | 
					
						
							|  |  |  | 					continue; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				const ShapeSW *shape = get_shape(i); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				real_t area = get_shape_area(i); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-13 17:25:05 -06:00
										 |  |  | 				real_t mass = area * this->mass / total_area; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				Basis shape_inertia_tensor = shape->get_moment_of_inertia(mass).to_diagonal_matrix(); | 
					
						
							|  |  |  | 				Transform shape_transform = get_shape_transform(i); | 
					
						
							| 
									
										
										
										
											2017-01-11 00:52:51 -03:00
										 |  |  | 				Basis shape_basis = shape_transform.basis.orthonormalized(); | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// NOTE: we don't take the scale of collision shapes into account when computing the inertia tensor!
 | 
					
						
							|  |  |  | 				shape_inertia_tensor = shape_basis * shape_inertia_tensor * shape_basis.transposed(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				Vector3 shape_origin = shape_transform.origin - center_of_mass_local; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				inertia_tensor += shape_inertia_tensor + (Basis() * shape_origin.dot(shape_origin) - shape_origin.outer(shape_origin)) * mass; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | 			// Compute the principal axes of inertia
 | 
					
						
							|  |  |  | 			principal_inertia_axes_local = inertia_tensor.diagonalize().transposed(); | 
					
						
							|  |  |  | 			_inv_inertia = inertia_tensor.get_main_diagonal().inverse(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			if (mass) | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				_inv_mass = 1.0 / mass; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 			else | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				_inv_mass = 0; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_MODE_KINEMATIC: | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_MODE_STATIC: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | 			_inv_inertia_tensor.set_zero(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			_inv_mass = 0; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_MODE_CHARACTER: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | 			_inv_inertia_tensor.set_zero(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			_inv_mass = 1.0 / mass; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	//_update_shapes();
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | 	_update_transform_dependant(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BodySW::set_active(bool p_active) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (active == p_active) | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	active = p_active; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	if (!p_active) { | 
					
						
							|  |  |  | 		if (get_space()) | 
					
						
							|  |  |  | 			get_space()->body_remove_from_active_list(&active_list); | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		if (mode == PhysicsServer::BODY_MODE_STATIC) | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 			return; //static bodies can't become active
 | 
					
						
							|  |  |  | 		if (get_space()) | 
					
						
							|  |  |  | 			get_space()->body_add_to_active_list(&active_list); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		//still_time=0;
 | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	/*
 | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	if (!space) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for(int i=0;i<get_shape_count();i++) { | 
					
						
							|  |  |  | 		Shape &s=shapes[i]; | 
					
						
							|  |  |  | 		if (s.bpid>0) { | 
					
						
							|  |  |  | 			get_space()->get_broadphase()->set_active(s.bpid,active); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-13 17:25:05 -06:00
										 |  |  | void BodySW::set_param(PhysicsServer::BodyParameter p_param, real_t p_value) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	switch (p_param) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		case PhysicsServer::BODY_PARAM_BOUNCE: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			bounce = p_value; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_PARAM_FRICTION: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			friction = p_value; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_PARAM_MASS: { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			ERR_FAIL_COND(p_value <= 0); | 
					
						
							|  |  |  | 			mass = p_value; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 			_update_inertia(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2015-08-30 18:57:17 -03:00
										 |  |  | 		case PhysicsServer::BODY_PARAM_GRAVITY_SCALE: { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			gravity_scale = p_value; | 
					
						
							| 
									
										
										
										
											2015-08-30 18:57:17 -03:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_PARAM_LINEAR_DAMP: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			linear_damp = p_value; | 
					
						
							| 
									
										
										
										
											2015-08-30 18:57:17 -03:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_PARAM_ANGULAR_DAMP: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			angular_damp = p_value; | 
					
						
							| 
									
										
										
										
											2015-08-30 18:57:17 -03:00
										 |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2019-04-09 17:08:36 +02:00
										 |  |  | 		default: { | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-13 17:25:05 -06:00
										 |  |  | real_t BodySW::get_param(PhysicsServer::BodyParameter p_param) const { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	switch (p_param) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		case PhysicsServer::BODY_PARAM_BOUNCE: { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			return bounce; | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_PARAM_FRICTION: { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			return friction; | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_PARAM_MASS: { | 
					
						
							|  |  |  | 			return mass; | 
					
						
							|  |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2015-08-30 18:57:17 -03:00
										 |  |  | 		case PhysicsServer::BODY_PARAM_GRAVITY_SCALE: { | 
					
						
							|  |  |  | 			return gravity_scale; | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_PARAM_LINEAR_DAMP: { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			return linear_damp; | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_PARAM_ANGULAR_DAMP: { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			return angular_damp; | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-09 17:08:36 +02:00
										 |  |  | 		default: { | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BodySW::set_mode(PhysicsServer::BodyMode p_mode) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	PhysicsServer::BodyMode prev = mode; | 
					
						
							|  |  |  | 	mode = p_mode; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	switch (p_mode) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		//CLEAR UP EVERYTHING IN CASE IT NOT WORKS!
 | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_MODE_STATIC: | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_MODE_KINEMATIC: { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			_set_inv_transform(get_transform().affine_inverse()); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			_inv_mass = 0; | 
					
						
							|  |  |  | 			_set_static(p_mode == PhysicsServer::BODY_MODE_STATIC); | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 			//set_active(p_mode==PhysicsServer::BODY_MODE_KINEMATIC);
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			set_active(p_mode == PhysicsServer::BODY_MODE_KINEMATIC && contacts.size()); | 
					
						
							|  |  |  | 			linear_velocity = Vector3(); | 
					
						
							|  |  |  | 			angular_velocity = Vector3(); | 
					
						
							|  |  |  | 			if (mode == PhysicsServer::BODY_MODE_KINEMATIC && prev != mode) { | 
					
						
							|  |  |  | 				first_time_kinematic = true; | 
					
						
							| 
									
										
										
										
											2014-10-14 01:01:25 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_MODE_RIGID: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			_inv_mass = mass > 0 ? (1.0 / mass) : 0; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 			_set_static(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_MODE_CHARACTER: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			_inv_mass = mass > 0 ? (1.0 / mass) : 0; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 			_set_static(false); | 
					
						
							| 
									
										
										
										
											2019-08-15 19:34:47 +08:00
										 |  |  | 			angular_velocity = Vector3(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_update_inertia(); | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 	/*
 | 
					
						
							|  |  |  | 	if (get_space()) | 
					
						
							|  |  |  | 		_update_queries(); | 
					
						
							|  |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | } | 
					
						
							|  |  |  | PhysicsServer::BodyMode BodySW::get_mode() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return mode; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BodySW::_shapes_changed() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_update_inertia(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void BodySW::set_state(PhysicsServer::BodyState p_state, const Variant &p_variant) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	switch (p_state) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		case PhysicsServer::BODY_STATE_TRANSFORM: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			if (mode == PhysicsServer::BODY_MODE_KINEMATIC) { | 
					
						
							|  |  |  | 				new_transform = p_variant; | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 				//wakeup_neighbours();
 | 
					
						
							|  |  |  | 				set_active(true); | 
					
						
							| 
									
										
										
										
											2014-10-14 01:01:25 -03:00
										 |  |  | 				if (first_time_kinematic) { | 
					
						
							|  |  |  | 					_set_transform(p_variant); | 
					
						
							|  |  |  | 					_set_inv_transform(get_transform().affine_inverse()); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					first_time_kinematic = false; | 
					
						
							| 
									
										
										
										
											2014-10-14 01:01:25 -03:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			} else if (mode == PhysicsServer::BODY_MODE_STATIC) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 				_set_transform(p_variant); | 
					
						
							|  |  |  | 				_set_inv_transform(get_transform().affine_inverse()); | 
					
						
							|  |  |  | 				wakeup_neighbours(); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				Transform t = p_variant; | 
					
						
							|  |  |  | 				t.orthonormalize(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				new_transform = get_transform(); //used as old to compute motion
 | 
					
						
							|  |  |  | 				if (new_transform == t) | 
					
						
							| 
									
										
										
										
											2015-05-16 17:54:36 -03:00
										 |  |  | 					break; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 				_set_transform(t); | 
					
						
							|  |  |  | 				_set_inv_transform(get_transform().inverse()); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-04-26 16:20:00 -03:00
										 |  |  | 			wakeup(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_STATE_LINEAR_VELOCITY: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 			/*
 | 
					
						
							|  |  |  | 			if (mode==PhysicsServer::BODY_MODE_STATIC) | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			*/ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			linear_velocity = p_variant; | 
					
						
							| 
									
										
										
										
											2015-04-26 16:20:00 -03:00
										 |  |  | 			wakeup(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_STATE_ANGULAR_VELOCITY: { | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 			/*
 | 
					
						
							|  |  |  | 			if (mode!=PhysicsServer::BODY_MODE_RIGID) | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			*/ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			angular_velocity = p_variant; | 
					
						
							| 
									
										
										
										
											2015-04-26 16:20:00 -03:00
										 |  |  | 			wakeup(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_STATE_SLEEPING: { | 
					
						
							|  |  |  | 			//?
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			if (mode == PhysicsServer::BODY_MODE_STATIC || mode == PhysicsServer::BODY_MODE_KINEMATIC) | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			bool do_sleep = p_variant; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 			if (do_sleep) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				linear_velocity = Vector3(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 				//biased_linear_velocity=Vector3();
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				angular_velocity = Vector3(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 				//biased_angular_velocity=Vector3();
 | 
					
						
							|  |  |  | 				set_active(false); | 
					
						
							|  |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2019-06-20 16:59:48 +02:00
										 |  |  | 				set_active(true); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_STATE_CAN_SLEEP: { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			can_sleep = p_variant; | 
					
						
							|  |  |  | 			if (mode == PhysicsServer::BODY_MODE_RIGID && !active && !can_sleep) | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 				set_active(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | Variant BodySW::get_state(PhysicsServer::BodyState p_state) const { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	switch (p_state) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		case PhysicsServer::BODY_STATE_TRANSFORM: { | 
					
						
							|  |  |  | 			return get_transform(); | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_STATE_LINEAR_VELOCITY: { | 
					
						
							|  |  |  | 			return linear_velocity; | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_STATE_ANGULAR_VELOCITY: { | 
					
						
							|  |  |  | 			return angular_velocity; | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_STATE_SLEEPING: { | 
					
						
							|  |  |  | 			return !is_active(); | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 		case PhysicsServer::BODY_STATE_CAN_SLEEP: { | 
					
						
							|  |  |  | 			return can_sleep; | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return Variant(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void BodySW::set_space(SpaceSW *p_space) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (get_space()) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (inertia_update_list.in_list()) | 
					
						
							|  |  |  | 			get_space()->body_remove_from_inertia_update_list(&inertia_update_list); | 
					
						
							|  |  |  | 		if (active_list.in_list()) | 
					
						
							|  |  |  | 			get_space()->body_remove_from_active_list(&active_list); | 
					
						
							|  |  |  | 		if (direct_state_query_list.in_list()) | 
					
						
							|  |  |  | 			get_space()->body_remove_from_state_query_list(&direct_state_query_list); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_set_space(p_space); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (get_space()) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		_update_inertia(); | 
					
						
							|  |  |  | 		if (active) | 
					
						
							|  |  |  | 			get_space()->body_add_to_active_list(&active_list); | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 		/*
 | 
					
						
							|  |  |  | 		_update_queries(); | 
					
						
							|  |  |  | 		if (is_active()) { | 
					
						
							|  |  |  | 			active=false; | 
					
						
							|  |  |  | 			set_active(true); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		*/ | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	first_integration = true; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-08 18:44:29 +01:00
										 |  |  | void BodySW::_compute_area_gravity_and_dampenings(const AreaSW *p_area) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (p_area->is_gravity_point()) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		if (p_area->get_gravity_distance_scale() > 0) { | 
					
						
							| 
									
										
										
										
											2015-03-19 14:10:07 +00:00
										 |  |  | 			Vector3 v = p_area->get_transform().xform(p_area->get_gravity_vector()) - get_transform().get_origin(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			gravity += v.normalized() * (p_area->get_gravity() / Math::pow(v.length() * p_area->get_gravity_distance_scale() + 1, 2)); | 
					
						
							| 
									
										
										
										
											2015-03-19 14:10:07 +00:00
										 |  |  | 		} else { | 
					
						
							|  |  |  | 			gravity += (p_area->get_transform().xform(p_area->get_gravity_vector()) - get_transform().get_origin()).normalized() * p_area->get_gravity(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2015-03-20 03:38:12 +00:00
										 |  |  | 		gravity += p_area->get_gravity_vector() * p_area->get_gravity(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-12-08 18:44:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	area_linear_damp += p_area->get_linear_damp(); | 
					
						
							|  |  |  | 	area_angular_damp += p_area->get_angular_damp(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-10 17:21:14 +01:00
										 |  |  | void BodySW::set_axis_lock(PhysicsServer::BodyAxis p_axis, bool lock) { | 
					
						
							|  |  |  | 	if (lock) { | 
					
						
							|  |  |  | 		locked_axis |= p_axis; | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		locked_axis &= ~p_axis; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool BodySW::is_axis_locked(PhysicsServer::BodyAxis p_axis) const { | 
					
						
							|  |  |  | 	return locked_axis & p_axis; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | void BodySW::integrate_forces(real_t p_step) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (mode == PhysicsServer::BODY_MODE_STATIC) | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-20 03:38:12 +00:00
										 |  |  | 	AreaSW *def_area = get_space()->get_default_area(); | 
					
						
							| 
									
										
										
										
											2015-12-14 02:56:11 +01:00
										 |  |  | 	// AreaSW *damp_area = def_area;
 | 
					
						
							| 
									
										
										
										
											2015-08-30 18:57:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-20 03:38:12 +00:00
										 |  |  | 	ERR_FAIL_COND(!def_area); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	int ac = areas.size(); | 
					
						
							| 
									
										
										
										
											2015-12-14 02:56:11 +01:00
										 |  |  | 	bool stopped = false; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	gravity = Vector3(0, 0, 0); | 
					
						
							| 
									
										
										
										
											2015-12-08 18:44:29 +01:00
										 |  |  | 	area_linear_damp = 0; | 
					
						
							|  |  |  | 	area_angular_damp = 0; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	if (ac) { | 
					
						
							| 
									
										
										
										
											2015-03-24 04:05:56 +00:00
										 |  |  | 		areas.sort(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		const AreaCMP *aa = &areas[0]; | 
					
						
							| 
									
										
										
										
											2015-12-14 02:56:11 +01:00
										 |  |  | 		// damp_area = aa[ac-1].area;
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		for (int i = ac - 1; i >= 0 && !stopped; i--) { | 
					
						
							|  |  |  | 			PhysicsServer::AreaSpaceOverrideMode mode = aa[i].area->get_space_override_mode(); | 
					
						
							| 
									
										
										
										
											2015-12-14 02:56:11 +01:00
										 |  |  | 			switch (mode) { | 
					
						
							|  |  |  | 				case PhysicsServer::AREA_SPACE_OVERRIDE_COMBINE: | 
					
						
							|  |  |  | 				case PhysicsServer::AREA_SPACE_OVERRIDE_COMBINE_REPLACE: { | 
					
						
							|  |  |  | 					_compute_area_gravity_and_dampenings(aa[i].area); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					stopped = mode == PhysicsServer::AREA_SPACE_OVERRIDE_COMBINE_REPLACE; | 
					
						
							| 
									
										
										
										
											2015-12-14 02:56:11 +01:00
										 |  |  | 				} break; | 
					
						
							|  |  |  | 				case PhysicsServer::AREA_SPACE_OVERRIDE_REPLACE: | 
					
						
							|  |  |  | 				case PhysicsServer::AREA_SPACE_OVERRIDE_REPLACE_COMBINE: { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					gravity = Vector3(0, 0, 0); | 
					
						
							| 
									
										
										
										
											2015-12-14 02:56:11 +01:00
										 |  |  | 					area_angular_damp = 0; | 
					
						
							|  |  |  | 					area_linear_damp = 0; | 
					
						
							|  |  |  | 					_compute_area_gravity_and_dampenings(aa[i].area); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					stopped = mode == PhysicsServer::AREA_SPACE_OVERRIDE_REPLACE; | 
					
						
							| 
									
										
										
										
											2015-12-14 02:56:11 +01:00
										 |  |  | 				} break; | 
					
						
							| 
									
										
										
										
											2019-04-09 17:08:36 +02:00
										 |  |  | 				default: { | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-20 03:38:12 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-08-30 18:57:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (!stopped) { | 
					
						
							| 
									
										
										
										
											2015-12-08 18:44:29 +01:00
										 |  |  | 		_compute_area_gravity_and_dampenings(def_area); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	gravity *= gravity_scale; | 
					
						
							| 
									
										
										
										
											2015-08-30 18:57:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-08 18:44:29 +01:00
										 |  |  | 	// If less than 0, override dampenings with that of the Body
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (angular_damp >= 0) | 
					
						
							|  |  |  | 		area_angular_damp = angular_damp; | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 	/*
 | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		area_angular_damp=damp_area->get_angular_damp(); | 
					
						
							|  |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											2015-08-30 18:57:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (linear_damp >= 0) | 
					
						
							|  |  |  | 		area_linear_damp = linear_damp; | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 	/*
 | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		area_linear_damp=damp_area->get_linear_damp(); | 
					
						
							|  |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											2015-08-30 18:57:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 	Vector3 motion; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	bool do_motion = false; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (mode == PhysicsServer::BODY_MODE_KINEMATIC) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 		//compute motion, angular and etc. velocities from prev transform
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		linear_velocity = (new_transform.origin - get_transform().origin) / p_step; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 		//compute a FAKE angular velocity, not so easy
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		Basis rot = new_transform.basis.orthonormalized().transposed() * get_transform().basis.orthonormalized(); | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 		Vector3 axis; | 
					
						
							| 
									
										
										
										
											2017-02-13 17:25:05 -06:00
										 |  |  | 		real_t angle; | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-05 17:47:13 -05:00
										 |  |  | 		rot.get_axis_angle(axis, angle); | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 		axis.normalize(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		angular_velocity = axis.normalized() * (angle / p_step); | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		motion = new_transform.origin - get_transform().origin; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		do_motion = true; | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2016-01-02 13:28:18 -03:00
										 |  |  | 		if (!omit_force_integration && !first_integration) { | 
					
						
							| 
									
										
										
										
											2017-03-24 21:45:31 +01:00
										 |  |  | 			//overridden by direct state query
 | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			Vector3 force = gravity * mass; | 
					
						
							|  |  |  | 			force += applied_force; | 
					
						
							|  |  |  | 			Vector3 torque = applied_torque; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 18:57:17 -03:00
										 |  |  | 			real_t damp = 1.0 - p_step * area_linear_damp; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			if (damp < 0) // reached zero in the given time
 | 
					
						
							|  |  |  | 				damp = 0; | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 18:57:17 -03:00
										 |  |  | 			real_t angular_damp = 1.0 - p_step * area_angular_damp; | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			if (angular_damp < 0) // reached zero in the given time
 | 
					
						
							|  |  |  | 				angular_damp = 0; | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			linear_velocity *= damp; | 
					
						
							|  |  |  | 			angular_velocity *= angular_damp; | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			linear_velocity += _inv_mass * force * p_step; | 
					
						
							|  |  |  | 			angular_velocity += _inv_inertia_tensor.xform(torque) * p_step; | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (continuous_cd) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			motion = linear_velocity * p_step; | 
					
						
							|  |  |  | 			do_motion = true; | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	applied_force = Vector3(); | 
					
						
							|  |  |  | 	applied_torque = Vector3(); | 
					
						
							|  |  |  | 	first_integration = false; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	//motion=linear_velocity*p_step;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	biased_angular_velocity = Vector3(); | 
					
						
							|  |  |  | 	biased_linear_velocity = Vector3(); | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (do_motion) { //shapes temporarily extend for raycast
 | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 		_update_shapes_with_motion(motion); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	def_area = NULL; // clear the area, so it is set in the next frame
 | 
					
						
							|  |  |  | 	contact_count = 0; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BodySW::integrate_velocities(real_t p_step) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (mode == PhysicsServer::BODY_MODE_STATIC) | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 	if (fi_callback) | 
					
						
							|  |  |  | 		get_space()->body_add_to_state_query_list(&direct_state_query_list); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-10 17:21:14 +01:00
										 |  |  | 	//apply axis lock linear
 | 
					
						
							|  |  |  | 	for (int i = 0; i < 3; i++) { | 
					
						
							|  |  |  | 		if (is_axis_locked((PhysicsServer::BodyAxis)(1 << i))) { | 
					
						
							|  |  |  | 			linear_velocity[i] = 0; | 
					
						
							|  |  |  | 			biased_linear_velocity[i] = 0; | 
					
						
							|  |  |  | 			new_transform.origin[i] = get_transform().origin[i]; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	//apply axis lock angular
 | 
					
						
							|  |  |  | 	for (int i = 0; i < 3; i++) { | 
					
						
							|  |  |  | 		if (is_axis_locked((PhysicsServer::BodyAxis)(1 << (i + 3)))) { | 
					
						
							|  |  |  | 			angular_velocity[i] = 0; | 
					
						
							|  |  |  | 			biased_angular_velocity[i] = 0; | 
					
						
							| 
									
										
										
										
											2014-05-14 01:22:15 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-08 22:35:47 +01:00
										 |  |  | 	if (mode == PhysicsServer::BODY_MODE_KINEMATIC) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		_set_transform(new_transform, false); | 
					
						
							|  |  |  | 		_set_inv_transform(new_transform.affine_inverse()); | 
					
						
							|  |  |  | 		if (contacts.size() == 0 && linear_velocity == Vector3() && angular_velocity == Vector3()) | 
					
						
							|  |  |  | 			set_active(false); //stopped moving, deactivate
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Vector3 total_angular_velocity = angular_velocity + biased_angular_velocity; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-13 17:25:05 -06:00
										 |  |  | 	real_t ang_vel = total_angular_velocity.length(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	Transform transform = get_transform(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (ang_vel != 0.0) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		Vector3 ang_vel_axis = total_angular_velocity / ang_vel; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		Basis rot(ang_vel_axis, ang_vel * p_step); | 
					
						
							| 
									
										
										
										
											2017-01-11 00:52:51 -03:00
										 |  |  | 		Basis identity3(1, 0, 0, 0, 1, 0, 0, 0, 1); | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | 		transform.origin += ((identity3 - rot) * transform.basis).xform(center_of_mass_local); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		transform.basis = rot * transform.basis; | 
					
						
							|  |  |  | 		transform.orthonormalize(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Vector3 total_linear_velocity = linear_velocity + biased_linear_velocity; | 
					
						
							| 
									
										
										
										
											2014-05-14 01:22:15 -03:00
										 |  |  | 	/*for(int i=0;i<3;i++) {
 | 
					
						
							|  |  |  | 		if (axis_lock&(1<<i)) { | 
					
						
							|  |  |  | 			transform.origin[i]=0.0; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}*/ | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	transform.origin += total_linear_velocity * p_step; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	_set_transform(transform); | 
					
						
							|  |  |  | 	_set_inv_transform(get_transform().inverse()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 14:39:25 +00:00
										 |  |  | 	_update_transform_dependant(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 	/*
 | 
					
						
							|  |  |  | 	if (fi_callback) { | 
					
						
							|  |  |  | 		get_space()->body_add_to_state_query_list(&direct_state_query_list); | 
					
						
							|  |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | void BodySW::simulate_motion(const Transform& p_xform,real_t p_step) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Transform inv_xform = p_xform.affine_inverse(); | 
					
						
							|  |  |  | 	if (!get_space()) { | 
					
						
							|  |  |  | 		_set_transform(p_xform); | 
					
						
							|  |  |  | 		_set_inv_transform(inv_xform); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//compute a FAKE linear velocity - this is easy
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	linear_velocity=(p_xform.origin - get_transform().origin)/p_step; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//compute a FAKE angular velocity, not so easy
 | 
					
						
							| 
									
										
										
										
											2019-02-09 00:24:02 -05:00
										 |  |  | 	Basis rot=get_transform().basis.orthonormalized().transposed() * p_xform.basis.orthonormalized(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	Vector3 axis; | 
					
						
							| 
									
										
										
										
											2017-02-13 17:25:05 -06:00
										 |  |  | 	real_t angle; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-05 17:47:13 -05:00
										 |  |  | 	rot.get_axis_angle(axis,angle); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	axis.normalize(); | 
					
						
							|  |  |  | 	angular_velocity=axis.normalized() * (angle/p_step); | 
					
						
							|  |  |  | 	linear_velocity = (p_xform.origin - get_transform().origin)/p_step; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!direct_state_query_list.in_list())// - callalways, so lv and av are cleared && (state_query || direct_state_query))
 | 
					
						
							|  |  |  | 		get_space()->body_add_to_state_query_list(&direct_state_query_list); | 
					
						
							|  |  |  | 	simulated_motion=true; | 
					
						
							|  |  |  | 	_set_transform(p_xform); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | */ | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | void BodySW::wakeup_neighbours() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (Map<ConstraintSW *, int>::Element *E = constraint_map.front(); E; E = E->next()) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		const ConstraintSW *c = E->key(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		BodySW **n = c->get_body_ptr(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		int bc = c->get_body_count(); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		for (int i = 0; i < bc; i++) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			if (i == E->get()) | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 				continue; | 
					
						
							|  |  |  | 			BodySW *b = n[i]; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			if (b->mode != PhysicsServer::BODY_MODE_RIGID) | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 				continue; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (!b->is_active()) | 
					
						
							|  |  |  | 				b->set_active(true); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BodySW::call_queries() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (fi_callback) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		PhysicsDirectBodyStateSW *dbs = PhysicsDirectBodyStateSW::singleton; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		dbs->body = this; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		Variant v = dbs; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		Object *obj = ObjectDB::get_instance(fi_callback->id); | 
					
						
							|  |  |  | 		if (!obj) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			set_force_integration_callback(0, StringName()); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			const Variant *vp[2] = { &v, &fi_callback->udata }; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			Variant::CallError ce; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			int argc = (fi_callback->udata.get_type() == Variant::NIL) ? 1 : 2; | 
					
						
							|  |  |  | 			obj->call(fi_callback->method, vp, argc, ce); | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | bool BodySW::sleep_test(real_t p_step) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (mode == PhysicsServer::BODY_MODE_STATIC || mode == PhysicsServer::BODY_MODE_KINEMATIC) | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		return true; //
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	else if (mode == PhysicsServer::BODY_MODE_CHARACTER) | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		return !active; // characters don't sleep unless asked to sleep
 | 
					
						
							|  |  |  | 	else if (!can_sleep) | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-08 22:12:18 +07:00
										 |  |  | 	if (Math::abs(angular_velocity.length()) < get_space()->get_body_angular_velocity_sleep_threshold() && Math::abs(linear_velocity.length_squared()) < get_space()->get_body_linear_velocity_sleep_threshold() * get_space()->get_body_linear_velocity_sleep_threshold()) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		still_time += p_step; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		return still_time > get_space()->get_body_time_to_sleep(); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		still_time = 0; //maybe this should be set to 0 on set_active?
 | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void BodySW::set_force_integration_callback(ObjectID p_id, const StringName &p_method, const Variant &p_udata) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (fi_callback) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		memdelete(fi_callback); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		fi_callback = NULL; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (p_id != 0) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		fi_callback = memnew(ForceIntegrationCallback); | 
					
						
							|  |  |  | 		fi_callback->id = p_id; | 
					
						
							|  |  |  | 		fi_callback->method = p_method; | 
					
						
							|  |  |  | 		fi_callback->udata = p_udata; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-07 15:22:09 +01:00
										 |  |  | void BodySW::set_kinematic_margin(real_t p_margin) { | 
					
						
							|  |  |  | 	kinematic_safe_margin = p_margin; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-06 21:36:34 +01:00
										 |  |  | BodySW::BodySW() : | 
					
						
							|  |  |  | 		CollisionObjectSW(TYPE_BODY), | 
					
						
							| 
									
										
										
										
											2018-09-28 17:17:38 +02:00
										 |  |  | 		locked_axis(0), | 
					
						
							| 
									
										
										
										
											2017-12-06 21:36:34 +01:00
										 |  |  | 		active_list(this), | 
					
						
							|  |  |  | 		inertia_update_list(this), | 
					
						
							| 
									
										
										
										
											2018-09-28 17:17:38 +02:00
										 |  |  | 		direct_state_query_list(this) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	mode = PhysicsServer::BODY_MODE_RIGID; | 
					
						
							|  |  |  | 	active = true; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	mass = 1; | 
					
						
							| 
									
										
										
										
											2017-11-07 15:22:09 +01:00
										 |  |  | 	kinematic_safe_margin = 0.01; | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 	//_inv_inertia=Transform();
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	_inv_mass = 1; | 
					
						
							|  |  |  | 	bounce = 0; | 
					
						
							|  |  |  | 	friction = 1; | 
					
						
							|  |  |  | 	omit_force_integration = false; | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 	//applied_torque=0;
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	island_step = 0; | 
					
						
							|  |  |  | 	island_next = NULL; | 
					
						
							|  |  |  | 	island_list_next = NULL; | 
					
						
							|  |  |  | 	first_time_kinematic = false; | 
					
						
							|  |  |  | 	first_integration = false; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 	_set_static(false); | 
					
						
							| 
									
										
										
										
											2015-08-30 18:57:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	contact_count = 0; | 
					
						
							|  |  |  | 	gravity_scale = 1.0; | 
					
						
							| 
									
										
										
										
											2017-07-25 04:20:32 +02:00
										 |  |  | 	linear_damp = -1; | 
					
						
							|  |  |  | 	angular_damp = -1; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	area_angular_damp = 0; | 
					
						
							|  |  |  | 	area_linear_damp = 0; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	still_time = 0; | 
					
						
							|  |  |  | 	continuous_cd = false; | 
					
						
							|  |  |  | 	can_sleep = false; | 
					
						
							|  |  |  | 	fi_callback = NULL; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | BodySW::~BodySW() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (fi_callback) | 
					
						
							|  |  |  | 		memdelete(fi_callback); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | PhysicsDirectBodyStateSW *PhysicsDirectBodyStateSW::singleton = NULL; | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | PhysicsDirectSpaceState *PhysicsDirectBodyStateSW::get_space_state() { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:57:14 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return body->get_space()->get_direct_state(); | 
					
						
							|  |  |  | } |