This repository has no description
3.0 kB
81 lines
1# SPDX-License-Identifier: MIT
2# SPDX-FileCopyrightText: 2023 MizunagiKB <mizukb@live.jp>
3extends Node2D
4
5
6const DEFAULT_ASSET: String = "res://addons/gd_cubism/example/res/live2d/mao_pro_jp/runtime/mao_pro.model3.json";
7
8var cubism_model: GDCubismUserModel
9var cubism_efx: GDCubismEffectCustom
10
11var first_time: bool = true
12var counter: float = 0.0
13var base_vct: Vector2
14var base_scale: Vector2
15@export var art_mesh_name: String = "ArtMesh278"
16@export var vector_index_0: int = 0
17@export var vector_index_1: int = 1
18
19
20func recalc_model_position(model: GDCubismUserModel) -> void:
21 if model.assets == "":
22 return
23
24 var canvas_info: Dictionary = model.get_canvas_info()
25
26 if canvas_info.is_empty() != true:
27 var vct_viewport_size = Vector2(get_viewport_rect().size)
28 var scale: float = vct_viewport_size.y / max(canvas_info.size_in_pixels.x, canvas_info.size_in_pixels.y)
29 model.position = vct_viewport_size / 2.0
30 model.scale = Vector2(scale, scale)
31
32
33func _ready() -> void:
34 self.cubism_efx = $GDCubismUserModel/GDCubismEffectCustom
35 # self.cubism_efx.connect("cubism_prologue", self._on_cubism_prologue)
36 # self.cubism_efx.connect("cubism_epilogue", self._on_cubism_epilogue)
37 # self.cubism_efx.connect("cubism_init", self._on_cubism_init)
38 # self.cubism_efx.connect("cubism_term", self._on_cubism_term)
39 self.cubism_efx.connect("cubism_process", self._on_cubism_process)
40
41 self.cubism_model = $GDCubismUserModel
42 if self.cubism_model.assets == "":
43 self.cubism_model.assets = DEFAULT_ASSET;
44
45 var dict_motion: Dictionary = self.cubism_model.get_motions()
46
47 for k in dict_motion.keys():
48 self.cubism_model.start_motion_loop(k, 0, GDCubismUserModel.PRIORITY_FORCE, true, true);
49 break
50
51
52func _process(delta: float) -> void:
53 self.recalc_model_position(self.cubism_model)
54
55
56func _on_cubism_process(model: GDCubismUserModel, delta: float):
57 var ref_sprite: Sprite2D = $GDCubismUserModel/GDCubismEffectCustom/Sprite2D
58 var dict_mesh: Dictionary = model.get_meshes()
59
60 if dict_mesh.has(art_mesh_name) == false:
61 return
62
63 var ary_mesh: MeshInstance2D = dict_mesh[self.art_mesh_name]
64 var ary_surface: Array = ary_mesh.mesh.surface_get_arrays(0)
65 var mesh_vertex: PackedVector2Array = ary_surface[ArrayMesh.ARRAY_VERTEX]
66
67 if self.first_time == true:
68 var fr = ary_surface[ArrayMesh.ARRAY_VERTEX][self.vector_index_0]
69 var to = ary_surface[ArrayMesh.ARRAY_VERTEX][self.vector_index_1]
70 self.base_vct = (to - fr)
71 self.base_scale = ref_sprite.scale
72 self.first_time = false
73
74 var fr = ary_surface[ArrayMesh.ARRAY_VERTEX][self.vector_index_0]
75 var to = ary_surface[ArrayMesh.ARRAY_VERTEX][self.vector_index_1]
76 var calc_vct = (to - fr)
77 var scale: float = calc_vct.length() / base_vct.length()
78
79 ref_sprite.position = model.to_global(fr)
80 ref_sprite.rotation = base_vct.normalized().cross(calc_vct.normalized())
81 ref_sprite.scale = base_scale * scale