From 320215d4e326bf99a064d7e0d9893706e29cac2e Mon Sep 17 00:00:00 2001 From: Tokage Date: Mon, 11 Jan 2021 22:55:42 +0900 Subject: [PATCH] Make all secondary node entries to internal --- Alicia.gd | 5 +- Alicia.tscn | 509 ++++++++++++++++++++++++++++++-- addons/vrm/vrm_collidergroup.gd | 26 +- addons/vrm/vrm_secondary.gd | 66 ++--- addons/vrm/vrm_springbone.gd | 58 ++-- 5 files changed, 558 insertions(+), 106 deletions(-) diff --git a/Alicia.gd b/Alicia.gd index 2331b20..04226d7 100644 --- a/Alicia.gd +++ b/Alicia.gd @@ -3,8 +3,5 @@ extends Spatial # Called when the node enters the scene tree for the first time. func _ready(): $"AliciaSolid_vrm-051/anim".play("wiggle4") + $"AliciaSolid_vrm-052/anim".play("wiggle") return # Replace with function body. - -# Called every frame. 'delta' is the elapsed time since the previous frame. -#func _process(_delta): -# return diff --git a/Alicia.tscn b/Alicia.tscn index 878ca35..841a27d 100644 --- a/Alicia.tscn +++ b/Alicia.tscn @@ -1,11 +1,10 @@ -[gd_scene load_steps=14 format=2] +[gd_scene load_steps=38 format=2] [ext_resource path="res://vrm/thirdparty/alicia/AliciaSolid_vrm-0.51.vrm" type="PackedScene" id=1] [ext_resource path="res://vrm/thirdparty/sky/compatible_skybox.exr" type="Texture" id=2] [ext_resource path="res://Alicia.gd" type="Script" id=3] [sub_resource type="Animation" id=1] -resource_name = "idle" loop = true tracks/0/type = "transform" tracks/0/path = NodePath("Root/Skeleton:hips") @@ -49,7 +48,6 @@ tracks/0/enabled = true tracks/0/keys = PoolRealArray( 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0.5, 1, 0, 0, 0, 0, 0.707, 0, -0.707, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 3, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 3.5, 1, 0, 0, 0, 0, 0.707, 0, 0.707, 1, 1, 1, 4, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 ) [sub_resource type="Animation" id=5] -resource_name = "wiggle4" length = 10.0 loop = true tracks/0/type = "value" @@ -77,22 +75,419 @@ tracks/1/keys = { "values": [ Vector3( 0, 0, 0 ), Vector3( 0, 0, 0 ), Vector3( 0, 360, 0 ), Vector3( 0, 360, 0 ) ] } -[sub_resource type="PanoramaSky" id=6] +[sub_resource type="Animation" id=6] +tracks/0/type = "value" +tracks/0/path = NodePath("Root/Skeleton/face:blend_shapes/morph_0") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} + +[sub_resource type="Animation" id=7] +tracks/0/type = "value" +tracks/0/path = NodePath("Root/Skeleton/face:blend_shapes/morph_34") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Root/Skeleton/face:blend_shapes/morph_39") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} + +[sub_resource type="Animation" id=8] +tracks/0/type = "value" +tracks/0/path = NodePath("Root/Skeleton/face:blend_shapes/morph_24") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} + +[sub_resource type="Animation" id=9] +tracks/0/type = "value" +tracks/0/path = NodePath("Root/Skeleton/face:blend_shapes/morph_28") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} + +[sub_resource type="Animation" id=10] +tracks/0/type = "value" +tracks/0/path = NodePath("Root/Skeleton/face:blend_shapes/morph_29") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} + +[sub_resource type="Animation" id=11] +tracks/0/type = "value" +tracks/0/path = NodePath("Root/Skeleton/face:blend_shapes/morph_3") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} + +[sub_resource type="Animation" id=12] +tracks/0/type = "value" +tracks/0/path = NodePath("Root/Skeleton/face:blend_shapes/morph_33") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Root/Skeleton/face:blend_shapes/morph_38") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Root/Skeleton/other:blend_shapes/morph_0") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} + +[sub_resource type="Animation" id=13] +tracks/0/type = "method" +tracks/0/path = NodePath(".") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ NodePath("Root/Skeleton"), "head", 0.0 ], +"method": "TODO_scale_bone" +} ] +} + +[sub_resource type="Animation" id=14] +tracks/0/type = "value" +tracks/0/path = NodePath("Root/Skeleton/face:blend_shapes/morph_1") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} + +[sub_resource type="Animation" id=15] +tracks/0/type = "value" +tracks/0/path = NodePath("Root/Skeleton/face:blend_shapes/morph_25") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Root/Skeleton/face:blend_shapes/morph_38") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} + +[sub_resource type="Animation" id=16] +tracks/0/type = "transform" +tracks/0/path = NodePath("Root/Skeleton:eye_l") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = PoolRealArray( 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0.222222, 1, 0, 0, 0, -0.0436193, 0, 0, 0.999048, 1, 1, 1 ) +tracks/1/type = "transform" +tracks/1/path = NodePath("Root/Skeleton:eye_r") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = PoolRealArray( 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0.222222, 1, 0, 0, 0, -0.0436193, 0, 0, 0.999048, 1, 1, 1 ) + +[sub_resource type="Animation" id=17] +tracks/0/type = "transform" +tracks/0/path = NodePath("Root/Skeleton:eye_l") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = PoolRealArray( 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0.222222, 1, 0, 0, 0, 0, 0.0436193, 0, 0.999048, 1, 1, 1 ) +tracks/1/type = "transform" +tracks/1/path = NodePath("Root/Skeleton:eye_r") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = PoolRealArray( 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0.222222, 1, 0, 0, 0, 0, 0.0436193, 0, 0.999048, 1, 1, 1 ) + +[sub_resource type="Animation" id=18] +tracks/0/type = "transform" +tracks/0/path = NodePath("Root/Skeleton:eye_l") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = PoolRealArray( 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0.222222, 1, 0, 0, 0, 0, -0.0436193, 0, 0.999048, 1, 1, 1 ) +tracks/1/type = "transform" +tracks/1/path = NodePath("Root/Skeleton:eye_r") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = PoolRealArray( 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0.222222, 1, 0, 0, 0, 0, -0.0436193, 0, 0.999048, 1, 1, 1 ) + +[sub_resource type="Animation" id=19] +tracks/0/type = "transform" +tracks/0/path = NodePath("Root/Skeleton:eye_l") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = PoolRealArray( 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0.222222, 1, 0, 0, 0, 0.0436193, 0, 0, 0.999048, 1, 1, 1 ) +tracks/1/type = "transform" +tracks/1/path = NodePath("Root/Skeleton:eye_r") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = PoolRealArray( 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0.222222, 1, 0, 0, 0, 0.0436193, 0, 0, 0.999048, 1, 1, 1 ) + +[sub_resource type="Animation" id=20] + +[sub_resource type="Animation" id=21] +tracks/0/type = "value" +tracks/0/path = NodePath("Root/Skeleton/face:blend_shapes/morph_4") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} + +[sub_resource type="Animation" id=22] +tracks/0/type = "value" +tracks/0/path = NodePath("Root/Skeleton/face:blend_shapes/morph_30") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Root/Skeleton/face:blend_shapes/morph_37") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} + +[sub_resource type="Animation" id=23] +tracks/0/type = "method" +tracks/0/path = NodePath(".") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ NodePath("Root/Skeleton"), "head", 1.0 ], +"method": "TODO_scale_bone" +} ] +} + +[sub_resource type="Animation" id=24] +tracks/0/type = "value" +tracks/0/path = NodePath("Root/Skeleton/face:blend_shapes/morph_2") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.99999 ] +} + +[sub_resource type="Animation" id=25] +loop = true +tracks/0/type = "transform" +tracks/0/path = NodePath("Root/Skeleton:hips") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = PoolRealArray( 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 ) + +[sub_resource type="Animation" id=26] +length = 4.0 +loop = true +tracks/0/type = "transform" +tracks/0/path = NodePath("Root/Skeleton:hips") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = PoolRealArray( 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1.5, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2.5, 1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 3, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 ) + +[sub_resource type="Animation" id=27] +length = 5.0 +loop = true +tracks/0/type = "transform" +tracks/0/path = NodePath("Root/Skeleton:hips") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = PoolRealArray( 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0.924, 0, 0.383, 0, 1, 1, 1, 3, 1, 0, 0, 0, 0.924, 0, 0.383, 0, 1, 1, 1, 4, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 ) + +[sub_resource type="Animation" id=28] +length = 6.0 +loop = true +tracks/0/type = "transform" +tracks/0/path = NodePath("Root/Skeleton:hips") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = PoolRealArray( 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0.5, 1, 0, 0, 0, 0, 0.707, 0, -0.707, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 3, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 3.5, 1, 0, 0, 0, 0, 0.707, 0, 0.707, 1, 1, 1, 4, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 ) + +[sub_resource type="Animation" id=29] +length = 10.0 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath(".:translation") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 2, 2.5, 3.5, 4, 6, 6.5, 7.5, 8, 10 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector3( 0, 0, 0 ), Vector3( 0, 0, 0 ), Vector3( -1, 0, 0 ), Vector3( 1, 0, 0 ), Vector3( 0, 0, 0 ), Vector3( 0, 0, 0 ), Vector3( 0, 0, 1 ), Vector3( 0, 0, -1 ), Vector3( 0, 0, 0 ), Vector3( 0, 0, 0 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath(".:rotation_degrees") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 4, 6, 10 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector3( 0, 0, 0 ), Vector3( 0, 0, 0 ), Vector3( 0, 360, 0 ), Vector3( 0, 360, 0 ) ] +} + +[sub_resource type="PanoramaSky" id=30] panorama = ExtResource( 2 ) -[sub_resource type="Environment" id=7] +[sub_resource type="Environment" id=31] background_mode = 2 -background_sky = SubResource( 6 ) +background_sky = SubResource( 30 ) -[sub_resource type="CylinderMesh" id=8] +[sub_resource type="CylinderMesh" id=32] -[sub_resource type="SpatialMaterial" id=9] +[sub_resource type="SpatialMaterial" id=33] flags_transparent = true params_blend_mode = 1 albedo_color = Color( 1, 1, 1, 0 ) roughness = 0.0 -[sub_resource type="CubeMesh" id=10] +[sub_resource type="CubeMesh" id=34] [node name="Spatial" type="Spatial"] script = ExtResource( 3 ) @@ -105,9 +500,6 @@ shadow_bias = 0.0 [node name="AliciaSolid_vrm-051" parent="." instance=ExtResource( 1 )] -[node name="Skeleton" parent="AliciaSolid_vrm-051/Root" index="0"] -bones/1/bound_children = [ NodePath("BoneAttachment") ] - [node name="body_top" parent="AliciaSolid_vrm-051/Root/Skeleton" index="0"] extra_cull_margin = 16384.0 @@ -144,25 +536,93 @@ extra_cull_margin = 16384.0 [node name="other02" parent="AliciaSolid_vrm-051/Root/Skeleton" index="11"] extra_cull_margin = 16384.0 -[node name="BoneAttachment" type="BoneAttachment" parent="AliciaSolid_vrm-051/Root/Skeleton" index="12"] +[node name="anim" parent="AliciaSolid_vrm-051" index="3"] +anims/idle = SubResource( 1 ) +anims/wiggle = SubResource( 2 ) +anims/wiggle2 = SubResource( 3 ) +anims/wiggle3 = SubResource( 4 ) +anims/wiggle4 = SubResource( 5 ) + +[node name="AliciaSolid_vrm-052" parent="." instance=ExtResource( 1 )] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1.24263, 0, 0 ) + +[node name="Skeleton" parent="AliciaSolid_vrm-052/Root" index="0"] +bones/1/bound_children = [ NodePath("BoneAttachment") ] + +[node name="body_top" parent="AliciaSolid_vrm-052/Root/Skeleton" index="0"] +extra_cull_margin = 16384.0 + +[node name="body_under" parent="AliciaSolid_vrm-052/Root/Skeleton" index="1"] +extra_cull_margin = 16384.0 + +[node name="cloth" parent="AliciaSolid_vrm-052/Root/Skeleton" index="2"] +extra_cull_margin = 16384.0 + +[node name="cloth1" parent="AliciaSolid_vrm-052/Root/Skeleton" index="3"] +extra_cull_margin = 16384.0 + +[node name="cloth2" parent="AliciaSolid_vrm-052/Root/Skeleton" index="4"] +extra_cull_margin = 16384.0 + +[node name="cloth_ribbon" parent="AliciaSolid_vrm-052/Root/Skeleton" index="5"] +extra_cull_margin = 16384.0 + +[node name="eye" parent="AliciaSolid_vrm-052/Root/Skeleton" index="6"] +extra_cull_margin = 16384.0 + +[node name="face" parent="AliciaSolid_vrm-052/Root/Skeleton" index="7"] +extra_cull_margin = 16384.0 + +[node name="flonthair" parent="AliciaSolid_vrm-052/Root/Skeleton" index="8"] +extra_cull_margin = 16384.0 + +[node name="neck" parent="AliciaSolid_vrm-052/Root/Skeleton" index="9"] +extra_cull_margin = 16384.0 + +[node name="other" parent="AliciaSolid_vrm-052/Root/Skeleton" index="10"] +extra_cull_margin = 16384.0 + +[node name="other02" parent="AliciaSolid_vrm-052/Root/Skeleton" index="11"] +extra_cull_margin = 16384.0 + +[node name="BoneAttachment" type="BoneAttachment" parent="AliciaSolid_vrm-052/Root/Skeleton" index="12"] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0603868, 0.885984, -0.000916982 ) visible = false bone_name = "left_up_leg" -[node name="CSGSphere" type="CSGSphere" parent="AliciaSolid_vrm-051/Root/Skeleton/BoneAttachment"] +[node name="CSGSphere" type="CSGSphere" parent="AliciaSolid_vrm-052/Root/Skeleton/BoneAttachment"] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.012, -0.045, 0.004 ) visible = false radius = 0.05 -[node name="anim" parent="AliciaSolid_vrm-051" index="3"] -anims/idle = SubResource( 1 ) -anims/wiggle = SubResource( 2 ) -anims/wiggle2 = SubResource( 3 ) -anims/wiggle3 = SubResource( 4 ) -anims/wiggle4 = SubResource( 5 ) +[node name="anim" parent="AliciaSolid_vrm-052" index="3"] +anims/A = SubResource( 6 ) +anims/ANGRY = SubResource( 7 ) +anims/BLINK = SubResource( 8 ) +anims/BLINK_L = SubResource( 9 ) +anims/BLINK_R = SubResource( 10 ) +anims/E = SubResource( 11 ) +anims/FUN = SubResource( 12 ) +anims/FirstPerson = SubResource( 13 ) +anims/I = SubResource( 14 ) +anims/JOY = SubResource( 15 ) +anims/LOOKDOWN = SubResource( 16 ) +anims/LOOKLEFT = SubResource( 17 ) +anims/LOOKRIGHT = SubResource( 18 ) +anims/LOOKUP = SubResource( 19 ) +anims/NEUTRAL = SubResource( 20 ) +anims/O = SubResource( 21 ) +anims/SORROW = SubResource( 22 ) +anims/ThirdPerson = SubResource( 23 ) +anims/U = SubResource( 24 ) +anims/idle = SubResource( 25 ) +anims/wiggle = SubResource( 26 ) +anims/wiggle2 = SubResource( 27 ) +anims/wiggle3 = SubResource( 28 ) +anims/wiggle4 = SubResource( 29 ) [node name="WorldEnvironment" type="WorldEnvironment" parent="."] -environment = SubResource( 7 ) +environment = SubResource( 31 ) [node name="Camera" type="Camera" parent="."] transform = Transform( -1, 0, -3.25841e-07, 0, 1, 0, 3.25841e-07, 0, -1, 0, 1, -2 ) @@ -175,13 +635,13 @@ visible = false [node name="MeshInstance" type="MeshInstance" parent="."] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0246786, 1.43094, 1.86018 ) visible = false -mesh = SubResource( 8 ) -material/0 = SubResource( 9 ) +mesh = SubResource( 32 ) +material/0 = SubResource( 33 ) [node name="MeshInstance2" type="MeshInstance" parent="."] visible = false extra_cull_margin = 16384.0 -mesh = SubResource( 10 ) +mesh = SubResource( 34 ) material/0 = null [node name="OmniLight" type="OmniLight" parent="."] @@ -203,3 +663,4 @@ spot_attenuation = 0.75 spot_angle_attenuation = 10.0 [editable path="AliciaSolid_vrm-051"] +[editable path="AliciaSolid_vrm-052"] diff --git a/addons/vrm/vrm_collidergroup.gd b/addons/vrm/vrm_collidergroup.gd index 40dd1c2..2bed486 100644 --- a/addons/vrm/vrm_collidergroup.gd +++ b/addons/vrm/vrm_collidergroup.gd @@ -23,46 +23,42 @@ export var gizmo_color: Color = Color.magenta # Props var colliders: Array = [] -var skeleton_or_node_spatial: Spatial var bone_idx: int -func setup(): - if skeleton_or_node_spatial != null: +func setup(parent: Spatial): + if parent != null: colliders.clear() for collider in sphere_colliders: - colliders.append(SphereCollider.new(skeleton_or_node_spatial, bone_idx, collider.normal, collider.d)) + colliders.append(SphereCollider.new(bone_idx, collider.normal, collider.d)) -func _ready(skeleton_or_node_ref): - skeleton_or_node_spatial = skeleton_or_node_ref - bone_idx = skeleton_or_node_spatial.find_bone(bone) - setup() +func _ready(parent: Spatial): + bone_idx = parent.find_bone(bone) + setup(parent) -func _process(): +func _process(parent: Spatial): for collider in colliders: - collider.update() + collider.update(parent) class SphereCollider: - var parent: Spatial var idx: int var offset: Vector3 var radius: float var position: Vector3 - func _init(parent_ref: Spatial, bone_idx: int, collider_offset: Vector3 = Vector3.ZERO, collider_radius: float = 0.1): - parent = parent_ref + func _init(bone_idx: int, collider_offset: Vector3 = Vector3.ZERO, collider_radius: float = 0.1): idx = bone_idx offset = VRMTopLevel.VRMUtil.coordinate_u2g(collider_offset) radius = collider_radius return - func update(): + func update(parent: Spatial): if parent.get_class() == "Skeleton" && idx != -1: var skeleton: Skeleton = parent as Skeleton - position = VRMTopLevel.VRMUtil.transform_point((skeleton.global_transform * skeleton.get_bone_global_pose(idx)), offset) + position = VRMTopLevel.VRMUtil.transform_point((skeleton.global_transform * skeleton.get_bone_global_pose_without_override(idx)), offset) else: position = VRMTopLevel.VRMUtil.transform_point(parent.global_transform, offset) return diff --git a/addons/vrm/vrm_secondary.gd b/addons/vrm/vrm_secondary.gd index b637f3e..1bde1de 100644 --- a/addons/vrm/vrm_secondary.gd +++ b/addons/vrm/vrm_secondary.gd @@ -5,38 +5,42 @@ export var spring_bones: Array export var collider_groups: Array # Props +var spring_bones_internal: Array = [] +var collider_groups_internal: Array = [] var secondary_gizmo: SecondaryGizmo # Called when the node enters the scene tree for the first time. func _ready(): secondary_gizmo = SecondaryGizmo.new(self) add_child(secondary_gizmo) - if not Engine.editor_hint: for collider_group in collider_groups: - collider_group._ready(get_node(collider_group.skeleton_or_node)) - for bg in spring_bones: - bg._ready(get_node(bg.skeleton)) + var new_collider_group = collider_group.duplicate(true) + new_collider_group._ready(get_node(new_collider_group.skeleton_or_node)) + collider_groups_internal.append(new_collider_group) + for spring_bone in spring_bones: + var new_spring_bone = spring_bone.duplicate(true) + var tmp_colliders: Array = [] + for i in range(collider_groups.size()): + if new_spring_bone.collider_groups.has(collider_groups[i]): + tmp_colliders.append_array(collider_groups_internal[i].colliders) + new_spring_bone._ready(get_node(new_spring_bone.skeleton), tmp_colliders) + spring_bones_internal.append(new_spring_bone) return # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): if get_parent() != null && not get_parent().update_secondary_fixed: if not Engine.editor_hint: - # HACK: Force update skeleton before call "ALL" springbones process - for bg in spring_bones: # HACK - var skeleton = get_node(bg.skeleton) # HACK - skeleton.set_bone_rest(0, skeleton.get_bone_rest(0)) # HACK - - for collider_group in collider_groups: - collider_group._process() - - for bg in spring_bones: - bg._process(delta, bg.skeleton) - + # force update skeleton + for spring_bone in spring_bones_internal: + get_node(spring_bone.skeleton).get_bone_global_pose_without_override(0, true) + for collider_group in collider_groups_internal: + collider_group._process(get_node(collider_group.skeleton_or_node)) + for spring_bone in spring_bones_internal: + spring_bone._process(delta, get_node(spring_bone.skeleton)) if secondary_gizmo != null: secondary_gizmo.draw_in_game() - if Engine.editor_hint: if secondary_gizmo != null: secondary_gizmo.draw_in_editor() @@ -46,23 +50,19 @@ func _process(delta): func _physics_process(delta): if get_parent() != null && get_parent().update_secondary_fixed: if not Engine.editor_hint: - # HACK: Force update skeleton before call "ALL" springbones process - for bg in spring_bones: # HACK - var skeleton = get_node(bg.skeleton) # HACK - skeleton.set_bone_rest(0, skeleton.get_bone_rest(0)) # HACK - - for collider_group in collider_groups: - collider_group._process() - - for bg in spring_bones: - bg._process(delta, bg.skeleton) - + # force update skeleton + for spring_bone in spring_bones_internal: + get_node(spring_bone.skeleton).get_bone_global_pose_without_override(0, true) + for collider_group in collider_groups_internal: + collider_group._process(get_node(collider_group.skeleton_or_node)) + for spring_bone in spring_bones_internal: + spring_bone._process(delta, get_node(spring_bone.skeleton)) if secondary_gizmo != null: secondary_gizmo.draw_in_game() - if Engine.editor_hint: if secondary_gizmo != null: secondary_gizmo.draw_in_editor() + return @@ -84,7 +84,7 @@ class SecondaryGizmo: m.flags_use_point_size = true m.flags_no_depth_test = true m.vertex_color_use_as_albedo = true - + func draw_in_editor(): clear() var selected: Array = EditorPlugin.new().get_editor_interface().get_selection().get_selected_nodes() @@ -99,10 +99,10 @@ class SecondaryGizmo: func draw_spring_bones(color: Color): set_material_override(m) # Spring bones - for spring_bone in secondary_node.spring_bones: + for spring_bone in secondary_node.spring_bones_internal: for v in spring_bone.verlets: - var s_sk: Skeleton = v.skeleton - var s_tr: Transform = s_sk.get_bone_global_pose(v.bone_idx) + var s_sk: Skeleton = secondary_node.get_node(spring_bone.skeleton) + var s_tr: Transform = s_sk.get_bone_global_pose_without_override(v.bone_idx) draw_line( s_tr.origin, VRMTopLevel.VRMUtil.inv_transform_point(s_sk.global_transform, v.current_tail), @@ -120,7 +120,7 @@ class SecondaryGizmo: set_material_override(m) for collider_group in secondary_node.collider_groups: var c_sk: Skeleton = secondary_node.get_node(collider_group.skeleton_or_node) - var c_tr: Transform = c_sk.get_bone_global_pose(c_sk.find_bone(collider_group.bone)) + var c_tr: Transform = c_sk.get_bone_global_pose_without_override(c_sk.find_bone(collider_group.bone)) for collider in collider_group.sphere_colliders: var c_ps: Vector3 = VRMTopLevel.VRMUtil.coordinate_u2g(collider.normal) draw_sphere(c_tr, VRMTopLevel.VRMUtil.transform_point(c_tr, c_ps), collider.d, collider_group.gizmo_color) diff --git a/addons/vrm/vrm_springbone.gd b/addons/vrm/vrm_springbone.gd index 31d95e7..9eade01 100644 --- a/addons/vrm/vrm_springbone.gd +++ b/addons/vrm/vrm_springbone.gd @@ -56,22 +56,21 @@ func setup_recursive(skeleton: Skeleton, id: int, center_tr) -> void: if skeleton.get_bone_children(id).empty(): var delta: Vector3 = skeleton.get_bone_rest(id).origin var child_position: Vector3 = delta.normalized() * 0.07 - verlets.append(VRMSpringBoneLogic.new(skeleton, id, center_tr, child_position, skeleton.get_bone_global_pose(id))) + verlets.append(VRMSpringBoneLogic.new(skeleton, id, center_tr, child_position, skeleton.get_bone_global_pose_without_override(id, true))) else: var first_child: int = skeleton.get_bone_children(id)[0] var local_position: Vector3 = skeleton.get_bone_rest(first_child).origin var sca: Vector3 = skeleton.get_bone_rest(first_child).basis.get_scale() var pos: Vector3 = Vector3(local_position.x * sca.x, local_position.y * sca.y, local_position.z * sca.z) - verlets.append(VRMSpringBoneLogic.new(skeleton, id, center_tr, pos, skeleton.get_bone_global_pose(id))) + verlets.append(VRMSpringBoneLogic.new(skeleton, id, center_tr, pos, skeleton.get_bone_global_pose_without_override(id, true))) for child in skeleton.get_bone_children(id): setup_recursive(skeleton, child, center_tr) return # Called when the node enters the scene tree for the first time. -func _ready(skel: Skeleton): +func _ready(skel: Skeleton, colliders_ref: Array): setup(skel) - for collider_group in collider_groups: - colliders.append_array(collider_group.colliders) + colliders = colliders_ref.duplicate(true) return # Called every frame. 'delta' is the elapsed time since the previous frame. @@ -86,7 +85,7 @@ func _process(delta, skel: Skeleton): for verlet in verlets: verlet.radius = hit_radius - verlet.update(center, stiffness, drag_force, external, colliders) + verlet.update(skel, center, stiffness, drag_force, external, colliders) return @@ -95,7 +94,7 @@ func _process(delta, skel: Skeleton): # Individual spring bone entries. class VRMSpringBoneLogic: - var skeleton: Skeleton + var force_update: bool = true var bone_idx: int var radius: float @@ -107,25 +106,24 @@ class VRMSpringBoneLogic: var initial_transform: Transform - func get_transform() -> Transform: - return skeleton.global_transform * skeleton.get_bone_global_pose(bone_idx) - func get_rotation() -> Quat: - return get_transform().basis.get_rotation_quat() + func get_transform(skel: Skeleton) -> Transform: + return skel.global_transform * skel.get_bone_global_pose_without_override(bone_idx) + func get_rotation(skel: Skeleton) -> Quat: + return get_transform(skel).basis.get_rotation_quat() - func get_local_transform() -> Transform: - return skeleton.get_bone_global_pose(bone_idx) - func get_local_rotation() -> Quat: - return get_local_transform().basis.get_rotation_quat() + func get_local_transform(skel: Skeleton) -> Transform: + return skel.get_bone_global_pose_without_override(bone_idx) + func get_local_rotation(skel: Skeleton) -> Quat: + return get_local_transform(skel).basis.get_rotation_quat() - func reset(transform: Transform) -> void: - skeleton.set_bone_global_pose_override(bone_idx, initial_transform, 1.0) + func reset(skel: Skeleton, transform: Transform) -> void: + skel.set_bone_global_pose_override(bone_idx, initial_transform, 1.0) return func _init(skel: Skeleton, idx: int, center, local_child_position: Vector3, default_pose: Transform) -> void: initial_transform = default_pose - skeleton = skel bone_idx = idx - var world_child_position: Vector3 = VRMTopLevel.VRMUtil.transform_point(get_transform(), local_child_position) + var world_child_position: Vector3 = VRMTopLevel.VRMUtil.transform_point(get_transform(skel), local_child_position) if center != null: current_tail = VRMTopLevel.VRMUtil.inv_transform_point(center, world_child_position) else: @@ -135,7 +133,7 @@ class VRMSpringBoneLogic: length = local_child_position.length() return - func update(center, stiffness_force: float, drag_force: float, external: Vector3, colliders: Array) -> void: + func update(skel: Skeleton, center, stiffness_force: float, drag_force: float, external: Vector3, colliders: Array) -> void: var tmp_current_tail: Vector3 var tmp_prev_tail: Vector3 if center != null: @@ -146,13 +144,13 @@ class VRMSpringBoneLogic: tmp_prev_tail = prev_tail # Integration of velocity verlet - var next_tail: Vector3 = tmp_current_tail + (tmp_current_tail - tmp_prev_tail) * (1.0 - drag_force) + get_rotation().xform(bone_axis) * stiffness_force + external + var next_tail: Vector3 = tmp_current_tail + (tmp_current_tail - tmp_prev_tail) * (1.0 - drag_force) + get_rotation(skel).xform(bone_axis) * stiffness_force + external # Limiting bone length - next_tail = get_transform().origin + (next_tail - get_transform().origin).normalized() * length + next_tail = get_transform(skel).origin + (next_tail - get_transform(skel).origin).normalized() * length # Collision movement - next_tail = collision(colliders, next_tail) + next_tail = collision(skel, colliders, next_tail) # Recording current tails for next process if center != null: @@ -163,17 +161,17 @@ class VRMSpringBoneLogic: current_tail = next_tail # Apply rotation - var ft = VRMTopLevel.VRMUtil.from_to_rotation(get_rotation().xform(bone_axis), next_tail - get_transform().origin) + var ft = VRMTopLevel.VRMUtil.from_to_rotation(get_rotation(skel).xform(bone_axis), next_tail - get_transform(skel).origin) if ft != null: - ft = skeleton.global_transform.basis.get_rotation_quat().inverse() * ft - var qt: Quat = ft * get_rotation() - var tr: Transform = get_local_transform() + ft = skel.global_transform.basis.get_rotation_quat().inverse() * ft + var qt: Quat = ft * get_rotation(skel) + var tr: Transform = get_local_transform(skel) tr.basis = Basis(qt.normalized()) - skeleton.set_bone_global_pose_override(bone_idx, tr, 1.0) + skel.set_bone_global_pose_override(bone_idx, tr, 1.0) return - func collision(colliders: Array, _next_tail: Vector3) -> Vector3: + func collision(skel: Skeleton, colliders: Array, _next_tail: Vector3) -> Vector3: var out: Vector3 = _next_tail for collider in colliders: var r = radius + collider.get_radius() @@ -183,5 +181,5 @@ class VRMSpringBoneLogic: var normal: Vector3 = (out - collider.get_position()).normalized() var pos_from_collider = collider.get_position() + normal * (radius + collider.get_radius()) # Limiting bone length - out = get_transform().origin + (pos_from_collider - get_transform().origin).normalized() * length + out = get_transform(skel).origin + (pos_from_collider - get_transform(skel).origin).normalized() * length return out