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") {
set_bone_name(p_value);
changed = true;
return true;
}
@ -87,9 +88,9 @@ void InverseKinematics::_check_bind()
int idx = sk->find_bone(ik_bone);
if (idx!=-1) {
ik_bone_no = idx;
skel = sk;
bound=true;
}
skel = sk;
}
}
@ -101,10 +102,12 @@ void InverseKinematics::_check_unbind()
if (get_parent() && get_parent()->cast_to<Skeleton>()) {
Skeleton *sk = get_parent()->cast_to<Skeleton>();
int idx = sk->find_bone(ik_bone);
if (idx!=-1) {
if (idx!=-1)
ik_bone_no = idx;
skel = sk;
}
else
ik_bone_no = 0;
skel = sk;
}
bound=false;
}
@ -121,6 +124,7 @@ void InverseKinematics::set_bone_name(const String& p_name)
if (is_inside_tree())
_check_bind();
changed = true;
}
String InverseKinematics::get_bone_name() const
@ -139,6 +143,7 @@ void InverseKinematics::set_iterations(int itn)
if (is_inside_tree())
_check_bind();
changed = true;
}
int InverseKinematics::get_iterations() const
@ -149,27 +154,17 @@ int InverseKinematics::get_iterations() const
void InverseKinematics::set_chain_size(int cs)
{
if (is_inside_tree())
_check_unbind();
chain_size=cs;
chain.clear();
int cur_bone = ik_bone_no;
int its = chain_size;
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 (bound)
update_parameters();
if (is_inside_tree())
_check_bind();
changed = true;
}
int InverseKinematics::get_chain_size() const
@ -188,6 +183,7 @@ void InverseKinematics::set_precision(float p)
if (is_inside_tree())
_check_bind();
changed = true;
}
float InverseKinematics::get_precision() const
@ -206,6 +202,7 @@ void InverseKinematics::set_speed(float p)
if (is_inside_tree())
_check_bind();
changed = true;
}
float InverseKinematics::get_speed() const
@ -214,7 +211,20 @@ float InverseKinematics::get_speed() const
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)
{
@ -224,18 +234,9 @@ void InverseKinematics::_notification(int p_what)
case NOTIFICATION_ENTER_TREE: {
_check_bind();
tail_bone = -1;
if (bound) {
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--;
}
update_parameters();
changed = false;
set_process(true);
}
} break;
@ -246,6 +247,10 @@ void InverseKinematics::_notification(int p_what)
break;
if (!sksp)
break;
if (changed) {
update_parameters();
changed = false;
}
Vector3 to = get_translation();
for (int hump = 0; hump < iterations; hump++) {
int depth = 0;

View file

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