[godot] SpineBoneNode debug rendering and enable flag.

This commit is contained in:
badlogic 2022-05-02 17:52:31 +02:00
parent 2a4adc282e
commit 1a0b243b63
3 changed files with 79 additions and 9 deletions

View File

@ -6,9 +6,11 @@
[node name="Node2D" type="Node2D"] [node name="Node2D" type="Node2D"]
[node name="SpineSprite" type="SpineSprite" parent="."] [node name="SpineSprite" type="SpineSprite" parent="."]
position = Vector2( 459.397, 501.236 )
scale = Vector2( 0.742335, 0.742335 )
skeleton_data_res = ExtResource( 1 ) skeleton_data_res = ExtResource( 1 )
preview_animation = "" preview_animation = "aim"
preview_frame = false preview_frame = true
preview_time = 0.0 preview_time = 0.0
[node name="SpineBoneNode" type="SpineBoneNode" parent="SpineSprite"] [node name="SpineBoneNode" type="SpineBoneNode" parent="SpineSprite"]
@ -16,6 +18,9 @@ position = Vector2( 40.8752, -276.036 )
rotation = 0.837234 rotation = 0.837234
bone_name = "gun" bone_name = "gun"
bone_mode = 1 bone_mode = 1
enabled = false
color = Color( 0, 1, 0.0627451, 0.466667 )
[node name="Sprite" type="Sprite" parent="SpineSprite/SpineBoneNode"] [node name="Sprite" type="Sprite" parent="SpineSprite/SpineBoneNode"]
visible = false
texture = ExtResource( 2 ) texture = ExtResource( 2 )

View File

@ -30,13 +30,24 @@
#include "SpineBoneNode.h" #include "SpineBoneNode.h"
#include "core/engine.h" #include "core/engine.h"
#include "editor/editor_about.h"
void SpineBoneNode::_bind_methods() { void SpineBoneNode::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_bone_mode"), &SpineBoneNode::set_bone_mode); ClassDB::bind_method(D_METHOD("set_bone_mode"), &SpineBoneNode::set_bone_mode);
ClassDB::bind_method(D_METHOD("get_bone_mode"), &SpineBoneNode::get_bone_mode); ClassDB::bind_method(D_METHOD("get_bone_mode"), &SpineBoneNode::get_bone_mode);
ClassDB::bind_method(D_METHOD("set_enabled"), &SpineBoneNode::set_enabled);
ClassDB::bind_method(D_METHOD("get_enabled"), &SpineBoneNode::get_enabled);
ClassDB::bind_method(D_METHOD("set_debug_thickness"), &SpineBoneNode::set_debug_thickness);
ClassDB::bind_method(D_METHOD("get_debug_thickness"), &SpineBoneNode::get_debug_thickness);
ClassDB::bind_method(D_METHOD("set_debug_color"), &SpineBoneNode::set_debug_color);
ClassDB::bind_method(D_METHOD("get_debug_color"), &SpineBoneNode::get_debug_color);
ClassDB::bind_method(D_METHOD("_on_world_transforms_changed", "spine_sprite"), &SpineBoneNode::on_world_transforms_changed); ClassDB::bind_method(D_METHOD("_on_world_transforms_changed", "spine_sprite"), &SpineBoneNode::on_world_transforms_changed);
ADD_PROPERTY(PropertyInfo(Variant::INT, "bone_mode", PROPERTY_HINT_ENUM, "Follow,Drive"), "set_bone_mode", "get_bone_mode"); ADD_PROPERTY(PropertyInfo(Variant::INT, "bone_mode", PROPERTY_HINT_ENUM, "Follow,Drive"), "set_bone_mode", "get_bone_mode");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "enabled"), "set_enabled", "get_enabled");
ADD_GROUP("Debug", "");
ADD_PROPERTY(PropertyInfo(VARIANT_FLOAT, "thickness"), "set_debug_thickness", "get_debug_thickness");
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "color"), "set_debug_color", "get_debug_color");
} }
void SpineBoneNode::_notification(int what) { void SpineBoneNode::_notification(int what) {
@ -130,6 +141,7 @@ void SpineBoneNode::on_world_transforms_changed(const Variant& _sprite) {
} }
void SpineBoneNode::update_transform(SpineSprite* sprite) { void SpineBoneNode::update_transform(SpineSprite* sprite) {
if (!enabled) return;
Ref<SpineBone> bone = find_bone(); Ref<SpineBone> bone = find_bone();
if (!bone.is_valid()) return; if (!bone.is_valid()) return;
@ -190,7 +202,19 @@ void SpineBoneNode::draw() {
Ref<SpineBone> bone = find_bone(); Ref<SpineBone> bone = find_bone();
if (!bone.is_valid()) return; if (!bone.is_valid()) return;
draw_circle(get_global_position(), 10, Color::hex(0xffff0000)); spine::Bone *spine_bone = bone->get_spine_object();
if (!spine_bone) return;
float bone_length = spine_bone->getData().getLength();
if (bone_length == 0) {
draw_circle(Vector2(0, 0), debug_thickness, debug_color);
} else {
Vector<Vector2> points;
points.push_back(Vector2(-debug_thickness, 0));
points.push_back(Vector2(0, debug_thickness));
points.push_back(Vector2(bone_length, 0));
points.push_back(Vector2(0, -debug_thickness));
draw_colored_polygon(points, debug_color);
}
} }
SpineConstant::BoneMode SpineBoneNode::get_bone_mode() { SpineConstant::BoneMode SpineBoneNode::get_bone_mode() {
@ -202,3 +226,33 @@ void SpineBoneNode::set_bone_mode(SpineConstant::BoneMode _bone_mode) {
SpineSprite *sprite = find_parent_sprite(); SpineSprite *sprite = find_parent_sprite();
init_transform(sprite); init_transform(sprite);
} }
void SpineBoneNode::set_debug_thickness(float _thickness) {
debug_thickness = _thickness;
}
float SpineBoneNode::get_debug_thickness() {
return debug_thickness;
}
void SpineBoneNode::set_debug_color(Color _color) {
debug_color = _color;
}
Color SpineBoneNode::get_debug_color() {
return debug_color;
}
void SpineBoneNode::set_enabled(bool _enabled) {
enabled = _enabled;
if (!enabled && Engine::get_singleton()->is_editor_hint()) {
auto sprite = find_parent_sprite();
if (!sprite) return;
sprite->get_skeleton()->set_to_setup_pose();
sprite->get_skeleton()->update_world_transform();
}
}
bool SpineBoneNode::get_enabled() {
return enabled;
}

View File

@ -39,6 +39,9 @@ class SpineBoneNode: public Node2D {
protected: protected:
String bone_name; String bone_name;
SpineConstant::BoneMode bone_mode; SpineConstant::BoneMode bone_mode;
bool enabled;
Color debug_color;
float debug_thickness;
static void _bind_methods(); static void _bind_methods();
void _notification(int what); void _notification(int what);
@ -50,16 +53,24 @@ protected:
void init_transform(SpineSprite *sprite); void init_transform(SpineSprite *sprite);
SpineSprite *find_parent_sprite() const; SpineSprite *find_parent_sprite() const;
Ref<SpineBone> find_bone() const; Ref<SpineBone> find_bone() const;
void draw();; void draw();
public: public:
SpineBoneNode(): bone_mode(SpineConstant::BoneMode_Follow) {} SpineBoneNode(): bone_mode(SpineConstant::BoneMode_Follow), enabled(true), debug_color(Color::hex(0xff000077)), debug_thickness(5) {}
String get_bone_name();
void set_bone_name(const String &_bone_name);
SpineConstant::BoneMode get_bone_mode(); SpineConstant::BoneMode get_bone_mode();
void set_bone_mode(SpineConstant::BoneMode bone_mode); void set_bone_mode(SpineConstant::BoneMode bone_mode);
void set_enabled(bool _enabled);
bool get_enabled();
void set_debug_thickness(float _thickness);
float get_debug_thickness();
void set_debug_color(Color _color);
Color get_debug_color();
}; };