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;
skel = sk; else
} ik_bone_no = 0;
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,7 +211,20 @@ float InverseKinematics::get_speed() const
return speed; return speed;
} }
void InverseKinematics::update_parameters()
{
tail_bone = -1;
for (int i = 0; i < skel->get_bone_count(); i++)
if (skel->get_bone_parent(i) == ik_bone_no)
tail_bone = i;
int cur_bone = ik_bone_no;
int its = chain_size;
while (its > 0 && cur_bone >= 0) {
chain.push_back(cur_bone);
cur_bone = skel->get_bone_parent(cur_bone);
its--;
}
}
void InverseKinematics::_notification(int p_what) void InverseKinematics::_notification(int p_what)
{ {
@ -224,18 +234,9 @@ void InverseKinematics::_notification(int p_what)
case NOTIFICATION_ENTER_TREE: { case NOTIFICATION_ENTER_TREE: {
_check_bind(); _check_bind();
tail_bone = -1;
if (bound) { if (bound) {
for (int i = 0; i < skel->get_bone_count(); i++) update_parameters();
if (skel->get_bone_parent(i) == ik_bone_no) changed = false;
tail_bone = i;
int cur_bone = ik_bone_no;
int its = chain_size;
while (its > 0 && cur_bone >= 0) {
chain.push_back(cur_bone);
cur_bone = skel->get_bone_parent(cur_bone);
its--;
}
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);