-Added an optimization so physics shapes are configured later, speeds up grid map loading and editing
This commit is contained in:
parent
29db531fc8
commit
adde89e8b1
@ -88,7 +88,7 @@ void MeshLibraryEditor::_import_scene(Node *p_scene, Ref<MeshLibrary> p_library,
|
|||||||
if (mesh.is_null())
|
if (mesh.is_null())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int id = p_library->find_item_name(mi->get_name());
|
int id = p_library->find_item_by_name(mi->get_name());
|
||||||
if (id < 0) {
|
if (id < 0) {
|
||||||
|
|
||||||
id = p_library->get_last_unused_item_id();
|
id = p_library->get_last_unused_item_id();
|
||||||
|
@ -972,6 +972,14 @@ void ScriptEditor::_menu_option(int p_option) {
|
|||||||
EditorNode::get_singleton()->show_warning("Can't obtain the script for running");
|
EditorNode::get_singleton()->show_warning("Can't obtain the script for running");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
current->apply_code();
|
||||||
|
Error err = scr->reload(false); //hard reload script before running always
|
||||||
|
|
||||||
|
if (err != OK) {
|
||||||
|
EditorNode::get_singleton()->show_warning("Script failed reloading, check console for errors.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!scr->is_tool()) {
|
if (!scr->is_tool()) {
|
||||||
|
|
||||||
EditorNode::get_singleton()->show_warning("Script is not in tool mode, will not be able to run");
|
EditorNode::get_singleton()->show_warning("Script is not in tool mode, will not be able to run");
|
||||||
|
@ -396,8 +396,6 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
|
|||||||
|
|
||||||
Map<int, List<Pair<Transform, IndexKey> > > multimesh_items;
|
Map<int, List<Pair<Transform, IndexKey> > > multimesh_items;
|
||||||
|
|
||||||
print_line("updating octant " + itos(p_key.x) + ", " + itos(p_key.y) + ", " + itos(p_key.z) + " cells: " + itos(g.cells.size()));
|
|
||||||
|
|
||||||
for (Set<IndexKey>::Element *E = g.cells.front(); E; E = E->next()) {
|
for (Set<IndexKey>::Element *E = g.cells.front(); E; E = E->next()) {
|
||||||
|
|
||||||
ERR_CONTINUE(!cell_map.has(E->get()));
|
ERR_CONTINUE(!cell_map.has(E->get()));
|
||||||
@ -464,7 +462,6 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
|
|||||||
|
|
||||||
//update multimeshes
|
//update multimeshes
|
||||||
for (Map<int, List<Pair<Transform, IndexKey> > >::Element *E = multimesh_items.front(); E; E = E->next()) {
|
for (Map<int, List<Pair<Transform, IndexKey> > >::Element *E = multimesh_items.front(); E; E = E->next()) {
|
||||||
print_line("multimesh item " + itos(E->key()) + " transforms " + itos(E->get().size()));
|
|
||||||
Octant::MultimeshInstance mmi;
|
Octant::MultimeshInstance mmi;
|
||||||
|
|
||||||
RID mm = VS::get_singleton()->multimesh_create();
|
RID mm = VS::get_singleton()->multimesh_create();
|
||||||
|
@ -214,7 +214,7 @@ Vector<int> MeshLibrary::get_item_list() const {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int MeshLibrary::find_item_name(const String &p_name) const {
|
int MeshLibrary::find_item_by_name(const String &p_name) const {
|
||||||
|
|
||||||
for (Map<int, Item>::Element *E = item_map.front(); E; E = E->next()) {
|
for (Map<int, Item>::Element *E = item_map.front(); E; E = E->next()) {
|
||||||
|
|
||||||
@ -275,6 +275,9 @@ void MeshLibrary::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("get_item_shapes", "id"), &MeshLibrary::_get_item_shapes);
|
ClassDB::bind_method(D_METHOD("get_item_shapes", "id"), &MeshLibrary::_get_item_shapes);
|
||||||
ClassDB::bind_method(D_METHOD("get_item_preview", "id"), &MeshLibrary::get_item_preview);
|
ClassDB::bind_method(D_METHOD("get_item_preview", "id"), &MeshLibrary::get_item_preview);
|
||||||
ClassDB::bind_method(D_METHOD("remove_item", "id"), &MeshLibrary::remove_item);
|
ClassDB::bind_method(D_METHOD("remove_item", "id"), &MeshLibrary::remove_item);
|
||||||
|
ClassDB::bind_method(D_METHOD("remove_item", "id"), &MeshLibrary::remove_item);
|
||||||
|
ClassDB::bind_method(D_METHOD("find_item_by_name", "name"), &MeshLibrary::find_item_by_name);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("clear"), &MeshLibrary::clear);
|
ClassDB::bind_method(D_METHOD("clear"), &MeshLibrary::clear);
|
||||||
ClassDB::bind_method(D_METHOD("get_item_list"), &MeshLibrary::get_item_list);
|
ClassDB::bind_method(D_METHOD("get_item_list"), &MeshLibrary::get_item_list);
|
||||||
ClassDB::bind_method(D_METHOD("get_last_unused_item_id"), &MeshLibrary::get_last_unused_item_id);
|
ClassDB::bind_method(D_METHOD("get_last_unused_item_id"), &MeshLibrary::get_last_unused_item_id);
|
||||||
|
@ -84,7 +84,7 @@ public:
|
|||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
int find_item_name(const String &p_name) const;
|
int find_item_by_name(const String &p_name) const;
|
||||||
|
|
||||||
Vector<int> get_item_list() const;
|
Vector<int> get_item_list() const;
|
||||||
int get_last_unused_item_id() const;
|
int get_last_unused_item_id() const;
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
#include "collision_object_sw.h"
|
#include "collision_object_sw.h"
|
||||||
|
#include "servers/physics/physics_server_sw.h"
|
||||||
#include "space_sw.h"
|
#include "space_sw.h"
|
||||||
|
|
||||||
void CollisionObjectSW::add_shape(ShapeSW *p_shape, const Transform &p_transform) {
|
void CollisionObjectSW::add_shape(ShapeSW *p_shape, const Transform &p_transform) {
|
||||||
@ -39,8 +40,12 @@ void CollisionObjectSW::add_shape(ShapeSW *p_shape, const Transform &p_transform
|
|||||||
s.bpid = 0; //needs update
|
s.bpid = 0; //needs update
|
||||||
shapes.push_back(s);
|
shapes.push_back(s);
|
||||||
p_shape->add_owner(this);
|
p_shape->add_owner(this);
|
||||||
_update_shapes();
|
|
||||||
_shapes_changed();
|
if (!pending_shape_update_list.in_list()) {
|
||||||
|
PhysicsServerSW::singleton->pending_shape_update_list.add(&pending_shape_update_list);
|
||||||
|
}
|
||||||
|
//_update_shapes();
|
||||||
|
//_shapes_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CollisionObjectSW::set_shape(int p_index, ShapeSW *p_shape) {
|
void CollisionObjectSW::set_shape(int p_index, ShapeSW *p_shape) {
|
||||||
@ -50,8 +55,11 @@ void CollisionObjectSW::set_shape(int p_index, ShapeSW *p_shape) {
|
|||||||
shapes[p_index].shape = p_shape;
|
shapes[p_index].shape = p_shape;
|
||||||
|
|
||||||
p_shape->add_owner(this);
|
p_shape->add_owner(this);
|
||||||
_update_shapes();
|
if (!pending_shape_update_list.in_list()) {
|
||||||
_shapes_changed();
|
PhysicsServerSW::singleton->pending_shape_update_list.add(&pending_shape_update_list);
|
||||||
|
}
|
||||||
|
//_update_shapes();
|
||||||
|
//_shapes_changed();
|
||||||
}
|
}
|
||||||
void CollisionObjectSW::set_shape_transform(int p_index, const Transform &p_transform) {
|
void CollisionObjectSW::set_shape_transform(int p_index, const Transform &p_transform) {
|
||||||
|
|
||||||
@ -59,8 +67,11 @@ void CollisionObjectSW::set_shape_transform(int p_index, const Transform &p_tran
|
|||||||
|
|
||||||
shapes[p_index].xform = p_transform;
|
shapes[p_index].xform = p_transform;
|
||||||
shapes[p_index].xform_inv = p_transform.affine_inverse();
|
shapes[p_index].xform_inv = p_transform.affine_inverse();
|
||||||
_update_shapes();
|
if (!pending_shape_update_list.in_list()) {
|
||||||
_shapes_changed();
|
PhysicsServerSW::singleton->pending_shape_update_list.add(&pending_shape_update_list);
|
||||||
|
}
|
||||||
|
//_update_shapes();
|
||||||
|
//_shapes_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CollisionObjectSW::remove_shape(ShapeSW *p_shape) {
|
void CollisionObjectSW::remove_shape(ShapeSW *p_shape) {
|
||||||
@ -90,7 +101,11 @@ void CollisionObjectSW::remove_shape(int p_index) {
|
|||||||
shapes[p_index].shape->remove_owner(this);
|
shapes[p_index].shape->remove_owner(this);
|
||||||
shapes.remove(p_index);
|
shapes.remove(p_index);
|
||||||
|
|
||||||
_shapes_changed();
|
if (!pending_shape_update_list.in_list()) {
|
||||||
|
PhysicsServerSW::singleton->pending_shape_update_list.add(&pending_shape_update_list);
|
||||||
|
}
|
||||||
|
//_update_shapes();
|
||||||
|
//_shapes_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CollisionObjectSW::_set_static(bool p_static) {
|
void CollisionObjectSW::_set_static(bool p_static) {
|
||||||
@ -202,7 +217,8 @@ void CollisionObjectSW::_shape_changed() {
|
|||||||
_shapes_changed();
|
_shapes_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
CollisionObjectSW::CollisionObjectSW(Type p_type) {
|
CollisionObjectSW::CollisionObjectSW(Type p_type)
|
||||||
|
: pending_shape_update_list(this) {
|
||||||
|
|
||||||
_static = true;
|
_static = true;
|
||||||
type = p_type;
|
type = p_type;
|
||||||
|
@ -75,6 +75,8 @@ private:
|
|||||||
Transform inv_transform;
|
Transform inv_transform;
|
||||||
bool _static;
|
bool _static;
|
||||||
|
|
||||||
|
SelfList<CollisionObjectSW> pending_shape_update_list;
|
||||||
|
|
||||||
void _update_shapes();
|
void _update_shapes();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -763,6 +763,8 @@ void PhysicsServerSW::body_apply_impulse(RID p_body, const Vector3 &p_pos, const
|
|||||||
BodySW *body = body_owner.get(p_body);
|
BodySW *body = body_owner.get(p_body);
|
||||||
ERR_FAIL_COND(!body);
|
ERR_FAIL_COND(!body);
|
||||||
|
|
||||||
|
_update_shapes();
|
||||||
|
|
||||||
body->apply_impulse(p_pos, p_impulse);
|
body->apply_impulse(p_pos, p_impulse);
|
||||||
body->wakeup();
|
body->wakeup();
|
||||||
};
|
};
|
||||||
@ -772,6 +774,8 @@ void PhysicsServerSW::body_apply_torque_impulse(RID p_body, const Vector3 &p_imp
|
|||||||
BodySW *body = body_owner.get(p_body);
|
BodySW *body = body_owner.get(p_body);
|
||||||
ERR_FAIL_COND(!body);
|
ERR_FAIL_COND(!body);
|
||||||
|
|
||||||
|
_update_shapes();
|
||||||
|
|
||||||
body->apply_torque_impulse(p_impulse);
|
body->apply_torque_impulse(p_impulse);
|
||||||
body->wakeup();
|
body->wakeup();
|
||||||
};
|
};
|
||||||
@ -781,6 +785,8 @@ void PhysicsServerSW::body_set_axis_velocity(RID p_body, const Vector3 &p_axis_v
|
|||||||
BodySW *body = body_owner.get(p_body);
|
BodySW *body = body_owner.get(p_body);
|
||||||
ERR_FAIL_COND(!body);
|
ERR_FAIL_COND(!body);
|
||||||
|
|
||||||
|
_update_shapes();
|
||||||
|
|
||||||
Vector3 v = body->get_linear_velocity();
|
Vector3 v = body->get_linear_velocity();
|
||||||
Vector3 axis = p_axis_velocity.normalized();
|
Vector3 axis = p_axis_velocity.normalized();
|
||||||
v -= axis * axis.dot(v);
|
v -= axis * axis.dot(v);
|
||||||
@ -793,6 +799,7 @@ void PhysicsServerSW::body_set_axis_lock(RID p_body, BodyAxisLock p_lock) {
|
|||||||
|
|
||||||
BodySW *body = body_owner.get(p_body);
|
BodySW *body = body_owner.get(p_body);
|
||||||
ERR_FAIL_COND(!body);
|
ERR_FAIL_COND(!body);
|
||||||
|
|
||||||
body->set_axis_lock(p_lock);
|
body->set_axis_lock(p_lock);
|
||||||
body->wakeup();
|
body->wakeup();
|
||||||
}
|
}
|
||||||
@ -902,6 +909,8 @@ bool PhysicsServerSW::body_test_motion(RID p_body, const Transform &p_from, cons
|
|||||||
ERR_FAIL_COND_V(!body->get_space(), false);
|
ERR_FAIL_COND_V(!body->get_space(), false);
|
||||||
ERR_FAIL_COND_V(body->get_space()->is_locked(), false);
|
ERR_FAIL_COND_V(body->get_space()->is_locked(), false);
|
||||||
|
|
||||||
|
_update_shapes();
|
||||||
|
|
||||||
return body->get_space()->test_body_motion(body, p_from, p_motion, p_margin, r_result);
|
return body->get_space()->test_body_motion(body, p_from, p_motion, p_margin, r_result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1209,6 +1218,8 @@ bool PhysicsServerSW::generic_6dof_joint_get_flag(RID p_joint, Vector3::Axis p_a
|
|||||||
|
|
||||||
void PhysicsServerSW::free(RID p_rid) {
|
void PhysicsServerSW::free(RID p_rid) {
|
||||||
|
|
||||||
|
_update_shapes(); //just in case
|
||||||
|
|
||||||
if (shape_owner.owns(p_rid)) {
|
if (shape_owner.owns(p_rid)) {
|
||||||
|
|
||||||
ShapeSW *shape = shape_owner.get(p_rid);
|
ShapeSW *shape = shape_owner.get(p_rid);
|
||||||
@ -1312,6 +1323,8 @@ void PhysicsServerSW::step(real_t p_step) {
|
|||||||
if (!active)
|
if (!active)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
_update_shapes();
|
||||||
|
|
||||||
doing_sync = false;
|
doing_sync = false;
|
||||||
|
|
||||||
last_step = p_step;
|
last_step = p_step;
|
||||||
@ -1409,6 +1422,14 @@ int PhysicsServerSW::get_process_info(ProcessInfo p_info) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PhysicsServerSW::_update_shapes() {
|
||||||
|
|
||||||
|
while (pending_shape_update_list.first()) {
|
||||||
|
pending_shape_update_list.first()->self()->_shape_changed();
|
||||||
|
pending_shape_update_list.remove(pending_shape_update_list.first());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PhysicsServerSW::_shape_col_cbk(const Vector3 &p_point_A, const Vector3 &p_point_B, void *p_userdata) {
|
void PhysicsServerSW::_shape_col_cbk(const Vector3 &p_point_A, const Vector3 &p_point_B, void *p_userdata) {
|
||||||
|
|
||||||
CollCbkData *cbk = (CollCbkData *)p_userdata;
|
CollCbkData *cbk = (CollCbkData *)p_userdata;
|
||||||
|
@ -62,6 +62,10 @@ class PhysicsServerSW : public PhysicsServer {
|
|||||||
mutable RID_Owner<JointSW> joint_owner;
|
mutable RID_Owner<JointSW> joint_owner;
|
||||||
|
|
||||||
//void _clear_query(QuerySW *p_query);
|
//void _clear_query(QuerySW *p_query);
|
||||||
|
friend class CollisionObjectSW;
|
||||||
|
SelfList<CollisionObjectSW>::List pending_shape_update_list;
|
||||||
|
void _update_shapes();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static PhysicsServerSW *singleton;
|
static PhysicsServerSW *singleton;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user