Now the CharacterSkeleton uses Arrays directly.

This commit is contained in:
Relintai 2020-05-23 19:56:03 +02:00
parent fbc1c056a1
commit 08c0c69aa7
2 changed files with 55 additions and 48 deletions

View File

@ -129,7 +129,6 @@ animation_player_path = NodePath("armature/AnimationPlayer")
animation_tree_path = NodePath("AnimationTree")
script = ExtResource( 8 )
automatic_build = true
use_threads = true
mesh_instance_path = NodePath("armature/Armature/Skeleton/MeshInstance")
skeleton_path = NodePath("armature/Armature/Skeleton")
materials = [ ExtResource( 3 ), ExtResource( 3 ), ExtResource( 7 ) ]
@ -142,7 +141,7 @@ viss = [ ExtResource( 1 ) ]
[node name="armature" parent="." instance=ExtResource( 6 )]
[node name="Skeleton" parent="armature/Armature" index="0"]
transform = Transform( 1, -4.89119e-19, -2.97968e-26, 4.89119e-19, 1, 4.1058e-43, 2.97968e-26, -4.24593e-43, 1, 0, -1.02549e-15, 0 )
transform = Transform( 1, 4.03225e-18, -1.60695e-25, -4.03225e-18, 1, 6.68419e-43, 1.60695e-25, -2.10195e-44, 1, 0, -1.7555e-15, 0 )
bones/0/bound_children = [ NodePath("RootAttachment") ]
bones/1/bound_children = [ NodePath("RightHipAttachment") ]
bones/10/bound_children = [ NodePath("BoneAttachment") ]
@ -153,7 +152,7 @@ bones/24/bound_children = [ NodePath("RightHandAttachment") ]
[node name="MeshInstance" type="MeshInstance" parent="armature/Armature/Skeleton" index="0"]
[node name="LeftHandAttachment" type="BoneAttachment" parent="armature/Armature/Skeleton" index="1"]
transform = Transform( 0.103158, 0.116365, -0.98781, 0.05663, -0.992148, -0.110935, -0.993045, -0.0444985, -0.108942, 0.230246, 0.767934, -0.00958773 )
transform = Transform( 0.10345, 0.112808, -0.988185, 0.0561394, -0.992553, -0.107388, -0.993041, -0.0443706, -0.109018, 0.23159, 0.765436, -0.00915625 )
bone_name = "left_hand"
[node name="LeftHandAP" type="Spatial" parent="armature/Armature/Skeleton/LeftHandAttachment"]
@ -161,7 +160,7 @@ transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.04, -0.09 )
script = ExtResource( 2 )
[node name="RightHandAttachment" type="BoneAttachment" parent="armature/Armature/Skeleton" index="2"]
transform = Transform( -0.0411806, -0.0329775, -0.998579, -0.126788, -0.991125, 0.0379445, -0.99109, 0.128176, 0.0366468, -0.231902, 0.769133, -0.00714437 )
transform = Transform( -0.0419076, -0.0392233, -0.998316, -0.126366, -0.990898, 0.0442205, -0.991117, 0.128014, 0.0365859, -0.235761, 0.769562, -0.00764265 )
bone_name = "right_hand"
[node name="RightHandAP" type="Spatial" parent="armature/Armature/Skeleton/RightHandAttachment"]
@ -177,7 +176,7 @@ transform = Transform( 1, 0, 0, 0, -1.62921e-07, 1, 0, -1, -1.62921e-07, 0, 0, 0
script = ExtResource( 2 )
[node name="NeckAttachment" type="BoneAttachment" parent="armature/Armature/Skeleton" index="4"]
transform = Transform( 0.999959, -0.0088956, -0.00102705, 0.00894264, 0.997195, 0.0731071, 0.000373855, -0.0731193, 0.997323, 0.00114021, 1.31441, 8.64493e-05 )
transform = Transform( 0.999941, -0.0107506, -0.00153485, 0.0108248, 0.997155, 0.0730699, 0.000744998, -0.0730893, 0.997325, 0.00121189, 1.31167, 0.000110133 )
bone_name = "neck"
[node name="TorsoAP" type="Spatial" parent="armature/Armature/Skeleton/NeckAttachment"]
@ -185,7 +184,7 @@ transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.04, -0.09 )
script = ExtResource( 2 )
[node name="RightHipAttachment" type="BoneAttachment" parent="armature/Armature/Skeleton" index="5"]
transform = Transform( 0.999795, 0.020248, 9.60409e-09, -0.020248, 0.999795, 4.71757e-07, -4.99805e-11, -4.71855e-07, 1, 0.00445231, 0.772908, 0 )
transform = Transform( 0.999925, 0.0122509, 5.81089e-09, -0.0122509, 0.999925, 4.71819e-07, -3.02633e-11, -4.71855e-07, 1, 0.00762171, 0.770191, 0 )
bone_name = "pelvis"
[node name="Spatial" type="Spatial" parent="armature/Armature/Skeleton/RightHipAttachment"]
@ -198,7 +197,7 @@ material/0 = null
material/1 = null
[node name="BoneAttachment" type="BoneAttachment" parent="armature/Armature/Skeleton" index="6"]
transform = Transform( 0.999957, -0.00921895, -0.000246357, 0.00921441, 0.999868, -0.00108139, 0.000256306, 0.00107972, 0.999999, 0.00286966, 1.12684, -0.000116092 )
transform = Transform( 0.999938, -0.0111065, -0.000615132, 0.0110965, 0.999825, -0.00111529, 0.000627457, 0.0011097, 0.999999, 0.00329544, 1.1241, -9.80367e-05 )
bone_name = "spine_2"
[node name="Spatial" type="Spatial" parent="armature/Armature/Skeleton/BoneAttachment"]

View File

@ -98,7 +98,6 @@ var _textures : Array
var _texture : Texture
#var mesh : ArrayMesh = null
var st : SurfaceTool = null
var _thread_done : bool = false
var _thread : Thread = null
@ -106,7 +105,6 @@ var _thread : Thread = null
var _editor_built : bool = false
func _enter_tree():
st = SurfaceTool.new()
_texture_packer = TexturePacker.new()
_texture_packer.texture_flags = 0
# _texture_packer.texture_flags = Texture.FLAG_FILTER
@ -190,11 +188,14 @@ func build_mesh(data) -> void:
meshes.clear()
st.clear()
st.set_material(_materials[0])
st.begin(Mesh.PRIMITIVE_TRIANGLES)
var vertex_count : int = 0
var vertices : PoolVector3Array = PoolVector3Array()
var normals : PoolVector3Array = PoolVector3Array()
var uvs : PoolVector2Array = PoolVector2Array()
var colors : PoolColorArray = PoolColorArray()
var indices : PoolIntArray = PoolIntArray()
var bone_array : PoolIntArray = PoolIntArray()
var weights_array : PoolRealArray = PoolRealArray()
for skele_point in range(EntityEnums.SKELETON_POINTS_MAX):
var bone_name : String = get_bone_name(skele_point)
@ -212,18 +213,11 @@ func build_mesh(data) -> void:
var arrays : Array = entry.entry.get_mesh(model_index).array
var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX] as PoolVector3Array
var normals : PoolVector3Array = arrays[ArrayMesh.ARRAY_NORMAL] as PoolVector3Array
var uvs : PoolVector2Array = arrays[ArrayMesh.ARRAY_TEX_UV] as PoolVector2Array
var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX] as PoolIntArray
var bone_array : PoolIntArray = PoolIntArray()
bone_array.append(bone_idx)
var weights_array : PoolRealArray = PoolRealArray()
weights_array.append(1.0)
var cvertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX] as PoolVector3Array
var cnormals : PoolVector3Array = arrays[ArrayMesh.ARRAY_NORMAL] as PoolVector3Array
var cuvs : PoolVector2Array = arrays[ArrayMesh.ARRAY_TEX_UV] as PoolVector2Array
var cindices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX] as PoolIntArray
var ta : AtlasTexture = _textures[skele_point]
var tx : float = 0
@ -240,38 +234,55 @@ func build_mesh(data) -> void:
tw = ta.region.size.x / otw
th = ta.region.size.y / oth
for i in range(len(vertices)):
st.add_normal(bt.basis.xform(normals[i]))
var orig_vert_size : int = vertices.size()
var uv : Vector2 = uvs[i]
vertices.resize(orig_vert_size + cvertices.size())
normals.resize(orig_vert_size + cvertices.size())
uvs.resize(orig_vert_size + cvertices.size())
colors.resize(orig_vert_size+ cvertices.size())
bone_array.resize(bone_array.size() + cvertices.size() * 4)
weights_array.resize(weights_array.size() + cvertices.size() * 4)
for i in range(len(cvertices)):
normals[orig_vert_size + i] = bt.basis.xform(normals[i])
var uv : Vector2 = cuvs[i]
uv.x = tw * uv.x + tx
uv.y = th * uv.y + ty
st.add_uv(uv)
st.add_bones(bone_array)
st.add_weights(weights_array)
uvs[orig_vert_size + i] = uv
bone_array[(orig_vert_size + i) * 4] = bone_idx
weights_array[(orig_vert_size + i) * 4] = 1
for j in range(1, 4):
bone_array[(orig_vert_size + i) * 4 + j] = 0
weights_array[(orig_vert_size + i) * 4 + j] = 0
st.add_color(Color(0.7, 0.7, 0.7))
st.add_vertex(bt.xform(vertices[i]))
# st.add_vertex(vertices[i])
for i in range(len(indices)):
st.add_index(vertex_count + indices[i])
vertex_count += len(vertices)
var arr : Array = st.commit_to_arrays()
colors[orig_vert_size + i] = Color(0.7, 0.7, 0.7)
vertices[orig_vert_size + i] = bt.xform(cvertices[i])
var orig_indices_count = indices.size()
indices.resize(indices.size() + cindices.size())
for i in range(len(cindices)):
indices[orig_indices_count + i] = orig_vert_size + cindices[i]
var arr : Array = Array()
arr.resize(Mesh.ARRAY_MAX)
arr[Mesh.ARRAY_VERTEX] = vertices
arr[Mesh.ARRAY_NORMAL] = normals
arr[Mesh.ARRAY_TEX_UV] = uvs
arr[Mesh.ARRAY_COLOR] = colors
arr[Mesh.ARRAY_INDEX] = indices
arr[Mesh.ARRAY_BONES] = bone_array
arr[Mesh.ARRAY_WEIGHTS] = weights_array
var mesh : ArrayMesh = ArrayMesh.new()
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arr)
mesh.surface_set_material(0, _materials[0])
meshes.append(mesh)
if use_lod:
arr = merge_mesh_array(arr)
var meshl2 : ArrayMesh = ArrayMesh.new()
meshl2.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arr)
@ -356,9 +367,6 @@ func editor_build(val : bool) -> void:
if not is_inside_tree():
return
if st == null:
st = SurfaceTool.new()
skeleton = get_node(skeleton_path) as Skeleton
mesh_instance = get_node(mesh_instance_path) as MeshInstance