|
@@ -281,61 +281,64 @@ void SpringBoneSimulator3D::_get_property_list(List<PropertyInfo> *p_list) const
|
|
enum_hint = skeleton->get_concatenated_bone_names();
|
|
enum_hint = skeleton->get_concatenated_bone_names();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ LocalVector<PropertyInfo> props;
|
|
|
|
+
|
|
for (int i = 0; i < settings.size(); i++) {
|
|
for (int i = 0; i < settings.size(); i++) {
|
|
String path = "settings/" + itos(i) + "/";
|
|
String path = "settings/" + itos(i) + "/";
|
|
- p_list->push_back(PropertyInfo(Variant::STRING, path + "root_bone_name", PROPERTY_HINT_ENUM_SUGGESTION, enum_hint));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::INT, path + "root_bone", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::STRING, path + "end_bone_name", PROPERTY_HINT_ENUM_SUGGESTION, enum_hint));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::INT, path + "end_bone", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::BOOL, path + "extend_end_bone"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::INT, path + "end_bone/direction", PROPERTY_HINT_ENUM, "+X,-X,+Y,-Y,+Z,-Z,FromParent"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::FLOAT, path + "end_bone/length", PROPERTY_HINT_RANGE, "0,1,0.001,or_greater,suffix:m"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::INT, path + "center_from", PROPERTY_HINT_ENUM, "WorldOrigin,Node,Bone"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::NODE_PATH, path + "center_node"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::STRING, path + "center_bone_name", PROPERTY_HINT_ENUM_SUGGESTION, enum_hint));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::INT, path + "center_bone", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::BOOL, path + "individual_config"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::INT, path + "rotation_axis", PROPERTY_HINT_ENUM, "X,Y,Z,All"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::FLOAT, path + "radius/value", PROPERTY_HINT_RANGE, "0,1,0.001,or_greater,suffix:m"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::OBJECT, path + "radius/damping_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::FLOAT, path + "stiffness/value", PROPERTY_HINT_RANGE, "0,4,0.01,or_greater"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::OBJECT, path + "stiffness/damping_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::FLOAT, path + "drag/value", PROPERTY_HINT_RANGE, "0,1,0.01,or_greater"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::OBJECT, path + "drag/damping_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::FLOAT, path + "gravity/value", PROPERTY_HINT_RANGE, "0,1,0.01,or_greater,or_less,suffix:m/s"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::OBJECT, path + "gravity/damping_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::VECTOR3, path + "gravity/direction"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::INT, path + "joint_count", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_ARRAY, "Joints," + path + "joints/,static,const"));
|
|
|
|
|
|
+ props.push_back(PropertyInfo(Variant::STRING, path + "root_bone_name", PROPERTY_HINT_ENUM_SUGGESTION, enum_hint));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::INT, path + "root_bone", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::STRING, path + "end_bone_name", PROPERTY_HINT_ENUM_SUGGESTION, enum_hint));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::INT, path + "end_bone", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::BOOL, path + "extend_end_bone"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::INT, path + "end_bone/direction", PROPERTY_HINT_ENUM, "+X,-X,+Y,-Y,+Z,-Z,FromParent"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::FLOAT, path + "end_bone/length", PROPERTY_HINT_RANGE, "0,1,0.001,or_greater,suffix:m"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::INT, path + "center_from", PROPERTY_HINT_ENUM, "WorldOrigin,Node,Bone"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::NODE_PATH, path + "center_node"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::STRING, path + "center_bone_name", PROPERTY_HINT_ENUM_SUGGESTION, enum_hint));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::INT, path + "center_bone", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::BOOL, path + "individual_config"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::INT, path + "rotation_axis", PROPERTY_HINT_ENUM, "X,Y,Z,All"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::FLOAT, path + "radius/value", PROPERTY_HINT_RANGE, "0,1,0.001,or_greater,suffix:m"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::OBJECT, path + "radius/damping_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::FLOAT, path + "stiffness/value", PROPERTY_HINT_RANGE, "0,4,0.01,or_greater"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::OBJECT, path + "stiffness/damping_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::FLOAT, path + "drag/value", PROPERTY_HINT_RANGE, "0,1,0.01,or_greater"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::OBJECT, path + "drag/damping_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::FLOAT, path + "gravity/value", PROPERTY_HINT_RANGE, "0,1,0.01,or_greater,or_less,suffix:m/s"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::OBJECT, path + "gravity/damping_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::VECTOR3, path + "gravity/direction"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::INT, path + "joint_count", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_ARRAY, "Joints," + path + "joints/,static,const"));
|
|
for (int j = 0; j < settings[i]->joints.size(); j++) {
|
|
for (int j = 0; j < settings[i]->joints.size(); j++) {
|
|
String joint_path = path + "joints/" + itos(j) + "/";
|
|
String joint_path = path + "joints/" + itos(j) + "/";
|
|
- p_list->push_back(PropertyInfo(Variant::STRING, joint_path + "bone_name", PROPERTY_HINT_ENUM_SUGGESTION, enum_hint, PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_READ_ONLY | PROPERTY_USAGE_STORAGE));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::INT, joint_path + "bone", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_READ_ONLY));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::INT, joint_path + "rotation_axis", PROPERTY_HINT_ENUM, "X,Y,Z,All"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::FLOAT, joint_path + "radius", PROPERTY_HINT_RANGE, "0,1,0.001,or_greater,suffix:m"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::FLOAT, joint_path + "stiffness", PROPERTY_HINT_RANGE, "0,4,0.01,or_greater"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::FLOAT, joint_path + "drag", PROPERTY_HINT_RANGE, "0,1,0.01,or_greater"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::FLOAT, joint_path + "gravity", PROPERTY_HINT_RANGE, "0,1,0.01,or_greater,or_less,suffix:m/s"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::VECTOR3, joint_path + "gravity_direction"));
|
|
|
|
|
|
+ props.push_back(PropertyInfo(Variant::STRING, joint_path + "bone_name", PROPERTY_HINT_ENUM_SUGGESTION, enum_hint, PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_READ_ONLY | PROPERTY_USAGE_STORAGE));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::INT, joint_path + "bone", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_READ_ONLY));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::INT, joint_path + "rotation_axis", PROPERTY_HINT_ENUM, "X,Y,Z,All"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::FLOAT, joint_path + "radius", PROPERTY_HINT_RANGE, "0,1,0.001,or_greater,suffix:m"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::FLOAT, joint_path + "stiffness", PROPERTY_HINT_RANGE, "0,4,0.01,or_greater"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::FLOAT, joint_path + "drag", PROPERTY_HINT_RANGE, "0,1,0.01,or_greater"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::FLOAT, joint_path + "gravity", PROPERTY_HINT_RANGE, "0,1,0.01,or_greater,or_less,suffix:m/s"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::VECTOR3, joint_path + "gravity_direction"));
|
|
}
|
|
}
|
|
- p_list->push_back(PropertyInfo(Variant::BOOL, path + "enable_all_child_collisions"));
|
|
|
|
- p_list->push_back(PropertyInfo(Variant::INT, path + "exclude_collision_count", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_ARRAY, "Exclude Collisions," + path + "exclude_collisions/"));
|
|
|
|
|
|
+ props.push_back(PropertyInfo(Variant::BOOL, path + "enable_all_child_collisions"));
|
|
|
|
+ props.push_back(PropertyInfo(Variant::INT, path + "exclude_collision_count", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_ARRAY, "Exclude Collisions," + path + "exclude_collisions/"));
|
|
for (int j = 0; j < settings[i]->exclude_collisions.size(); j++) {
|
|
for (int j = 0; j < settings[i]->exclude_collisions.size(); j++) {
|
|
String collision_path = path + "exclude_collisions/" + itos(j);
|
|
String collision_path = path + "exclude_collisions/" + itos(j);
|
|
- p_list->push_back(PropertyInfo(Variant::NODE_PATH, collision_path, PROPERTY_HINT_NODE_PATH_VALID_TYPES, "SpringBoneCollision3D"));
|
|
|
|
|
|
+ props.push_back(PropertyInfo(Variant::NODE_PATH, collision_path, PROPERTY_HINT_NODE_PATH_VALID_TYPES, "SpringBoneCollision3D"));
|
|
}
|
|
}
|
|
- p_list->push_back(PropertyInfo(Variant::INT, path + "collision_count", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_ARRAY, "Collisions," + path + "collisions/"));
|
|
|
|
|
|
+ props.push_back(PropertyInfo(Variant::INT, path + "collision_count", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_ARRAY, "Collisions," + path + "collisions/"));
|
|
for (int j = 0; j < settings[i]->collisions.size(); j++) {
|
|
for (int j = 0; j < settings[i]->collisions.size(); j++) {
|
|
String collision_path = path + "collisions/" + itos(j);
|
|
String collision_path = path + "collisions/" + itos(j);
|
|
- p_list->push_back(PropertyInfo(Variant::NODE_PATH, collision_path, PROPERTY_HINT_NODE_PATH_VALID_TYPES, "SpringBoneCollision3D"));
|
|
|
|
|
|
+ props.push_back(PropertyInfo(Variant::NODE_PATH, collision_path, PROPERTY_HINT_NODE_PATH_VALID_TYPES, "SpringBoneCollision3D"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- for (PropertyInfo &E : *p_list) {
|
|
|
|
- _validate_property(E);
|
|
|
|
|
|
+ for (PropertyInfo &p : props) {
|
|
|
|
+ _validate_dynamic_prop(p);
|
|
|
|
+ p_list->push_back(p);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-void SpringBoneSimulator3D::_validate_property(PropertyInfo &p_property) const {
|
|
|
|
|
|
+void SpringBoneSimulator3D::_validate_dynamic_prop(PropertyInfo &p_property) const {
|
|
PackedStringArray split = p_property.name.split("/");
|
|
PackedStringArray split = p_property.name.split("/");
|
|
if (split.size() > 2 && split[0] == "settings") {
|
|
if (split.size() > 2 && split[0] == "settings") {
|
|
int which = split[1].to_int();
|
|
int which = split[1].to_int();
|