1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-05 12:10:55 +00:00

Now parameters can be changed real time

This commit is contained in:
Sergey Lapin
2016-03-30 16:55:54 +03:00
parent e4fea5d5f9
commit eae5169dfd
2 changed files with 36 additions and 29 deletions

View File

@@ -48,6 +48,7 @@ bool InverseKinematics::_set(const StringName& p_name, const Variant& p_value)
if (String(p_name)=="ik_bone") { if (String(p_name)=="ik_bone") {
set_bone_name(p_value); set_bone_name(p_value);
changed = true;
return true; return true;
} }
@@ -87,9 +88,9 @@ void InverseKinematics::_check_bind()
int idx = sk->find_bone(ik_bone); int idx = sk->find_bone(ik_bone);
if (idx!=-1) { if (idx!=-1) {
ik_bone_no = idx; ik_bone_no = idx;
skel = sk;
bound=true; bound=true;
} }
skel = sk;
} }
} }
@@ -101,10 +102,12 @@ void InverseKinematics::_check_unbind()
if (get_parent() && get_parent()->cast_to<Skeleton>()) { if (get_parent() && get_parent()->cast_to<Skeleton>()) {
Skeleton *sk = get_parent()->cast_to<Skeleton>(); Skeleton *sk = get_parent()->cast_to<Skeleton>();
int idx = sk->find_bone(ik_bone); int idx = sk->find_bone(ik_bone);
if (idx!=-1) { if (idx!=-1)
ik_bone_no = idx; ik_bone_no = idx;
else
ik_bone_no = 0;
skel = sk; skel = sk;
}
} }
bound=false; bound=false;
} }
@@ -121,6 +124,7 @@ void InverseKinematics::set_bone_name(const String& p_name)
if (is_inside_tree()) if (is_inside_tree())
_check_bind(); _check_bind();
changed = true;
} }
String InverseKinematics::get_bone_name() const String InverseKinematics::get_bone_name() const
@@ -139,6 +143,7 @@ void InverseKinematics::set_iterations(int itn)
if (is_inside_tree()) if (is_inside_tree())
_check_bind(); _check_bind();
changed = true;
} }
int InverseKinematics::get_iterations() const int InverseKinematics::get_iterations() const
@@ -149,27 +154,17 @@ int InverseKinematics::get_iterations() const
void InverseKinematics::set_chain_size(int cs) void InverseKinematics::set_chain_size(int cs)
{ {
if (is_inside_tree()) if (is_inside_tree())
_check_unbind(); _check_unbind();
chain_size=cs; chain_size=cs;
chain.clear(); chain.clear();
int cur_bone = ik_bone_no; if (bound)
int its = chain_size; update_parameters();
set_process(false);
print_line("wtf clean: " + itos(chain.size()) + "/" + itos(chain_size) + " wtf ik bone: " + itos(ik_bone_no));
while (its > 0 && cur_bone >= 0) {
print_line("wtf pushing: " + itos(chain.size()));
chain.push_back(cur_bone);
cur_bone = skel->get_bone_parent(cur_bone);
its--;
}
set_process(true);
print_line("wtf size: " + itos(chain.size()));
if (is_inside_tree()) if (is_inside_tree())
_check_bind(); _check_bind();
changed = true;
} }
int InverseKinematics::get_chain_size() const int InverseKinematics::get_chain_size() const
@@ -188,6 +183,7 @@ void InverseKinematics::set_precision(float p)
if (is_inside_tree()) if (is_inside_tree())
_check_bind(); _check_bind();
changed = true;
} }
float InverseKinematics::get_precision() const float InverseKinematics::get_precision() const
@@ -206,6 +202,7 @@ void InverseKinematics::set_speed(float p)
if (is_inside_tree()) if (is_inside_tree())
_check_bind(); _check_bind();
changed = true;
} }
float InverseKinematics::get_speed() const float InverseKinematics::get_speed() const
@@ -214,18 +211,9 @@ float InverseKinematics::get_speed() const
return speed; return speed;
} }
void InverseKinematics::update_parameters()
void InverseKinematics::_notification(int p_what)
{ {
switch(p_what) {
case NOTIFICATION_ENTER_TREE: {
_check_bind();
tail_bone = -1; tail_bone = -1;
if (bound) {
for (int i = 0; i < skel->get_bone_count(); i++) for (int i = 0; i < skel->get_bone_count(); i++)
if (skel->get_bone_parent(i) == ik_bone_no) if (skel->get_bone_parent(i) == ik_bone_no)
tail_bone = i; tail_bone = i;
@@ -236,6 +224,19 @@ void InverseKinematics::_notification(int p_what)
cur_bone = skel->get_bone_parent(cur_bone); cur_bone = skel->get_bone_parent(cur_bone);
its--; its--;
} }
}
void InverseKinematics::_notification(int p_what)
{
switch(p_what) {
case NOTIFICATION_ENTER_TREE: {
_check_bind();
if (bound) {
update_parameters();
changed = false;
set_process(true); set_process(true);
} }
} break; } break;
@@ -246,6 +247,10 @@ void InverseKinematics::_notification(int p_what)
break; break;
if (!sksp) if (!sksp)
break; break;
if (changed) {
update_parameters();
changed = false;
}
Vector3 to = get_translation(); Vector3 to = get_translation();
for (int hump = 0; hump < iterations; hump++) { for (int hump = 0; hump < iterations; hump++) {
int depth = 0; int depth = 0;

View File

@@ -45,6 +45,7 @@ class InverseKinematics : public Spatial {
int iterations; int iterations;
float precision; float precision;
float speed; float speed;
bool changed;
protected: protected:
bool _set(const StringName& p_name, const Variant& p_value); bool _set(const StringName& p_name, const Variant& p_value);
@@ -53,6 +54,7 @@ protected:
void _notification(int p_what); void _notification(int p_what);
static void _bind_methods(); static void _bind_methods();
void update_parameters();
public: public:
Skeleton *get_skeleton(); Skeleton *get_skeleton();
void set_bone_name(const String& p_name); void set_bone_name(const String& p_name);