From 4f02de36d9f090d269d09a99ec7d28ab07de7e7f Mon Sep 17 00:00:00 2001 From: Relintai Date: Thu, 26 Aug 2021 00:15:30 +0200 Subject: [PATCH] Material cache support for the character. --- .../species/Human/models/armature_huf.tscn | 23 +++--- game/player/CharacterSkeletonGD.gd | 24 ++++--- game/player/CharacterSkeletonMeshJob.gd | 72 ++++++++----------- game/project.godot | 2 + 4 files changed, 57 insertions(+), 64 deletions(-) diff --git a/game/modules/species/Human/models/armature_huf.tscn b/game/modules/species/Human/models/armature_huf.tscn index e9fb8769..29cb60ed 100644 --- a/game/modules/species/Human/models/armature_huf.tscn +++ b/game/modules/species/Human/models/armature_huf.tscn @@ -1,12 +1,10 @@ -[gd_scene load_steps=44 format=2] +[gd_scene load_steps=42 format=2] [ext_resource path="res://modules/core/model_visuals/test_base_v3.tres" type="ModelVisual" id=1] [ext_resource path="res://player/CharacterSkeletonAttachPoint.gd" type="Script" id=2] -[ext_resource path="res://modules/core/materials/3_standard_character_material.tres" type="Material" id=3] [ext_resource path="res://modules/species/Human/models/dead.tres" type="Animation" id=4] [ext_resource path="res://modules/species/Human/models/armature.gd" type="Script" id=5] [ext_resource path="res://modules/species/Human/models/armature.gltf" type="PackedScene" id=6] -[ext_resource path="res://modules/core/materials/9_standard_character_material_notex.tres" type="Material" id=7] [ext_resource path="res://player/CharacterSkeletonGD.gd" type="Script" id=8] [ext_resource path="res://modules/species/Human/models/idle-loop.tres" type="Animation" id=9] [ext_resource path="res://modules/species/Human/models/rest.tres" type="Animation" id=10] @@ -133,7 +131,7 @@ attach_point_paths/2_torso = NodePath("armature/Armature/Skeleton/NeckAttachment attach_point_paths/3_root = NodePath("armature/Armature/Skeleton/RootAttachment/RootAP") attach_point_paths/4_right_hip = NodePath("armature/Armature/Skeleton/RightHipAttachment/Spatial") attach_point_paths/5_left_hip = NodePath("") -attach_point_paths/6_spine_2 = NodePath("armature/Armature/Skeleton/BoneAttachment/Spine2AP") +attach_point_paths/6_spine_2 = NodePath("") attach_point_paths/7_weapon_left = NodePath("armature/Armature/Skeleton/LeftWeapon") attach_point_paths/8_weapon_right = NodePath("armature/Armature/Skeleton/RightWeapon") attach_point_paths/9_weapon_left_back = NodePath("armature/Armature/Skeleton/LeftWeaponBack") @@ -143,7 +141,6 @@ script = ExtResource( 8 ) automatic_build = true mesh_instance_path = NodePath("armature/Armature/Skeleton/MeshInstance") skeleton_path = NodePath("armature/Armature/Skeleton") -materials = [ ExtResource( 3 ), ExtResource( 3 ), ExtResource( 7 ) ] viss = [ ExtResource( 1 ) ] [node name="armature" parent="." instance=ExtResource( 6 )] @@ -163,7 +160,7 @@ bones/27/bound_children = [ NodePath("NeckAttachment") ] visible = false [node name="LeftHandAttachment" type="BoneAttachment" parent="armature/Armature/Skeleton" index="1"] -transform = Transform( 0.166537, 0.128508, -0.977625, 0.0478394, -0.991356, -0.122164, -0.984873, -0.0264241, -0.171246, 0.236768, 0.767375, -0.00607332 ) +transform = Transform( 0.190725, 0.147102, -0.970559, 0.0931773, -0.986957, -0.131278, -0.97721, -0.065396, -0.201944, 0.244939, 0.774361, -0.0217047 ) bone_name = "left_hand" [node name="LeftHandAP" type="Spatial" parent="armature/Armature/Skeleton/LeftHandAttachment"] @@ -171,14 +168,14 @@ transform = Transform( -0.0646502, 0.683772, 0.726832, -0.148514, -0.726783, 0.6 script = ExtResource( 2 ) [node name="ShieldAttachment" type="BoneAttachment" parent="armature/Armature/Skeleton" index="2"] -transform = Transform( -0.0184403, 0.10685, 0.994104, -0.034023, -0.993765, 0.106183, 0.99925, -0.0318643, 0.0219607, 0.211053, 1.00654, 0.00159548 ) +transform = Transform( -0.0433176, 0.125638, 0.99113, -0.0774754, -0.989496, 0.122045, 0.996052, -0.0715015, 0.0525965, 0.214702, 1.0125, -0.00449639 ) bone_name = "left_forearm" [node name="LeftHandShield" type="Spatial" parent="armature/Armature/Skeleton/ShieldAttachment"] transform = Transform( 0.122585, 0.992132, -0.0242311, 0.987746, -0.124342, -0.0941345, -0.0964273, -0.0123912, -0.995239, 0.0157415, 0.108918, 0.0213161 ) [node name="RightHandAttachment" type="BoneAttachment" parent="armature/Armature/Skeleton" index="3"] -transform = Transform( -0.123816, -0.0747699, -0.989484, -0.0158104, -0.996882, 0.0773075, -0.99218, 0.025216, 0.122248, -0.247354, 0.768532, 0.00305579 ) +transform = Transform( -0.0270232, -0.0924788, -0.995348, -0.0997119, -0.990496, 0.0947352, -0.99465, 0.101808, 0.0175453, -0.248237, 0.77238, -0.0111511 ) bone_name = "right_hand" [node name="RightHandAP" type="Spatial" parent="armature/Armature/Skeleton/RightHandAttachment"] @@ -194,7 +191,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="5"] -transform = Transform( 0.999962, -0.008224, -0.00275978, 0.00839928, 0.99744, 0.0710206, 0.00216864, -0.0710411, 0.997471, 0.000932109, 1.31296, -0.00128597 ) +transform = Transform( 0.999992, 0.00218317, -0.00333621, -0.00195909, 0.997835, 0.0657461, 0.00347252, -0.065739, 0.997831, 0.000876503, 1.31821, 0.00123351 ) bone_name = "neck" [node name="TorsoAP" type="Spatial" parent="armature/Armature/Skeleton/NeckAttachment"] @@ -202,28 +199,28 @@ 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="6"] -transform = Transform( 0.999866, 0.0163955, 7.77678e-09, -0.0163955, 0.999866, 4.71791e-07, -4.04814e-11, -4.71855e-07, 1, 0.00597917, 0.771599, 0 ) +transform = Transform( 0.999504, 0.0314799, 1.49316e-08, -0.0314799, 0.999504, 4.7162e-07, -7.76685e-11, -4.71856e-07, 1, 0, 0.776724, 0 ) bone_name = "pelvis" [node name="Spatial" type="Spatial" parent="armature/Armature/Skeleton/RightHipAttachment"] transform = Transform( 0.993372, -0.0110498, 0.114411, 0.0109836, 0.999939, 0.00120905, -0.114417, 5.56017e-05, 0.993433, -0.141825, 0.176866, 0.16621 ) [node name="LeftHipAttachment" type="BoneAttachment" parent="armature/Armature/Skeleton" index="7"] -transform = Transform( 0.999866, 0.0163955, 7.77678e-09, -0.0163955, 0.999866, 4.71791e-07, -4.04814e-11, -4.71855e-07, 1, 0.00597917, 0.771599, 0 ) +transform = Transform( 0.999504, 0.0314799, 1.49316e-08, -0.0314799, 0.999504, 4.7162e-07, -7.76685e-11, -4.71856e-07, 1, 0, 0.776724, 0 ) bone_name = "pelvis" [node name="Spatial" type="Spatial" parent="armature/Armature/Skeleton/LeftHipAttachment"] transform = Transform( 0.99343, -0.00240871, -0.114417, 0.00240855, 0.999997, -0.000139626, 0.114417, -0.00013687, 0.993433, 0.144429, 0.18077, 0.165634 ) [node name="RightBackAttachment" type="BoneAttachment" parent="armature/Armature/Skeleton" index="8"] -transform = Transform( 0.99996, -0.00867777, -0.00202415, 0.00867132, 0.999957, -0.00318031, 0.00205166, 0.00316263, 0.999993, 0.00256003, 1.12537, -0.00187927 ) +transform = Transform( 0.999993, 0.00165794, -0.00337115, -0.00168643, 0.999963, -0.00847085, 0.00335698, 0.00847647, 0.999959, 0.000565477, 1.13062, -0.000356666 ) bone_name = "spine_2" [node name="RightBackAP" type="Spatial" parent="armature/Armature/Skeleton/RightBackAttachment"] transform = Transform( 0.999997, -0.00244424, -0.000479204, 0.00243884, 0.999966, -3.47705e-05, 0.000479292, 3.44458e-05, 1, 0.000560207, -0.00363708, -0.120332 ) [node name="LeftBackAttachment" type="BoneAttachment" parent="armature/Armature/Skeleton" index="9"] -transform = Transform( 0.99996, -0.00867777, -0.00202415, 0.00867132, 0.999957, -0.00318031, 0.00205166, 0.00316263, 0.999993, 0.00256003, 1.12537, -0.00187927 ) +transform = Transform( 0.999993, 0.00165794, -0.00337115, -0.00168643, 0.999963, -0.00847085, 0.00335698, 0.00847647, 0.999959, 0.000565477, 1.13062, -0.000356666 ) bone_name = "spine_2" [node name="LeftBackAP" type="Spatial" parent="armature/Armature/Skeleton/LeftBackAttachment"] diff --git a/game/player/CharacterSkeletonGD.gd b/game/player/CharacterSkeletonGD.gd index a774adc2..3b2949d9 100644 --- a/game/player/CharacterSkeletonGD.gd +++ b/game/player/CharacterSkeletonGD.gd @@ -36,9 +36,6 @@ var mesh_instance : MeshInstance = null export(NodePath) var skeleton_path : NodePath var skeleton : Skeleton -export(Array, Material) var materials : Array -var _materials : Array = Array() - export(Array, ModelVisual) var viss : Array var meshes : Array @@ -48,6 +45,7 @@ var _current_lod_level : int = 0 var _generating : bool = false var _mesh_job : ThreadPoolJob = null +var _material_cache : ESSMaterialCache = null var bone_names = { 0: "root", @@ -102,12 +100,6 @@ func _enter_tree(): skeleton = get_node(skeleton_path) as Skeleton mesh_instance = get_node(mesh_instance_path) as MeshInstance - if _materials.size() != materials.size(): - for m in materials: - _materials.append(m.duplicate()) - - _mesh_job.materials = _materials - set_process(false) if Engine.editor_hint: @@ -219,6 +211,19 @@ func build(): data.append(ddict) _mesh_job.data = data + _material_cache= ESS.material_cache_get(data.hash()) + + if _material_cache.material_get_num() == 0: + #lock just in case + _material_cache.mutex_lock() + + if _material_cache.material_get_num() == 0: + #this has to be done on the main thread! + _material_cache.initial_setup_default() + + _material_cache.mutex_unlock() + + _mesh_job.material_cache = _material_cache finish_build_mesh() @@ -250,7 +255,6 @@ func finish_build_mesh() -> void: func job_finished(): meshes = _mesh_job.meshes - _texture = _mesh_job._texture mesh_instance.mesh = meshes[_current_lod_level] if !mesh_instance.is_software_skinning_enabled(): diff --git a/game/player/CharacterSkeletonMeshJob.gd b/game/player/CharacterSkeletonMeshJob.gd index 758607a9..4ed65eef 100644 --- a/game/player/CharacterSkeletonMeshJob.gd +++ b/game/player/CharacterSkeletonMeshJob.gd @@ -30,21 +30,14 @@ var meshes : Array var _generating : bool = false -var _texture_packer : TexturePacker var _textures : Array -var _texture : Texture +var material_cache : ESSMaterialCache = null var materials : Array = Array() var data : Array signal finished -func _init(): - _texture_packer = TexturePacker.new() - _texture_packer.texture_flags = 0 -# _texture_packer.texture_flags = Texture.FLAG_FILTER - _texture_packer.max_atlas_size = 512 - func _execute(): prepare_textures() @@ -69,20 +62,11 @@ func _execute(): var bone_name : String = ddict["bone_name"] var bone_idx : int = ddict["bone_idx"] var texture : Texture = ddict["texture"] - var atlas_texture : AtlasTexture = ddict["atlas_texture"] + #var atlas_texture : AtlasTexture = ddict["atlas_texture"] var transform : Transform = ddict["transform"] var mesh : MeshDataResource = ddict["mesh"] - var rect : Rect2 - - if atlas_texture != null and texture != null: - var otw : float = _texture.get_width() - var oth : float = _texture.get_height() - - rect.position.x = atlas_texture.region.position.x / otw - rect.position.y = atlas_texture.region.position.y / oth - rect.size.x = atlas_texture.region.size.x / otw - rect.size.y = atlas_texture.region.size.y / oth + var rect : Rect2 = material_cache.texture_get_uv_rect(texture) bones[0] = bone_idx @@ -92,21 +76,32 @@ func _execute(): var mesh : ArrayMesh = ArrayMesh.new() mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arr) - mesh.surface_set_material(0, materials[0]) + mesh.surface_set_material(0, material_cache.material_lod_get(0)) meshes.append(mesh) if use_lod: arr = MeshUtils.merge_mesh_array(arr) var meshl2 : ArrayMesh = ArrayMesh.new() meshl2.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arr) - meshl2.surface_set_material(0, materials[1]) + meshl2.surface_set_material(0, material_cache.material_lod_get(1)) meshes.append(meshl2) + + var texture : Texture = null + + var ml : Material = material_cache.material_lod_get(0) - arr = MeshUtils.bake_mesh_array_uv(arr, _texture) + if ml is SpatialMaterial: + var spml : SpatialMaterial = ml + texture = spml.get_texture(SpatialMaterial.TEXTURE_ALBEDO) + elif ml is ShaderMaterial: + var sm : ShaderMaterial = ml + texture = sm.get_shader_param("texture_albedo") + + arr = MeshUtils.bake_mesh_array_uv(arr, texture) arr[VisualServer.ARRAY_TEX_UV] = null var meshl3 : ArrayMesh = ArrayMesh.new() meshl3.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arr) - meshl3.surface_set_material(0, materials[2]) + meshl3.surface_set_material(0, material_cache.material_lod_get(2)) meshes.append(meshl3) emit_signal("finished") @@ -114,7 +109,13 @@ func _execute(): complete = true func prepare_textures() -> void: - _texture_packer.clear() + if !material_cache.initialized: + material_cache.mutex_lock() + + #got initialized before we got the lock + #No need to have the lock anymore + if material_cache.initialized: + material_cache.mutex_unlock() var lmerger : TextureLayerMerger = TextureLayerMerger.new() @@ -146,22 +147,11 @@ func prepare_textures() -> void: ddict["texture"] = texture if texture != null: - ddict["atlas_texture"] = _texture_packer.add_texture(texture) - + if !material_cache.initialized: + material_cache.texture_add(texture) + data[i] = ddict - _texture_packer.merge() - - var tex : Texture = _texture_packer.get_generated_texture(0) - -# var mat : SpatialMaterial = _material as SpatialMaterial -# mat.albedo_texture = tex - var mat : ShaderMaterial = materials[0] as ShaderMaterial - mat.set_shader_param("texture_albedo", tex) - - if use_lod: - var mat2 : ShaderMaterial = materials[1] as ShaderMaterial - mat2.set_shader_param("texture_albedo", tex) - -# mat.albedo_texture = tex - _texture = tex + if !material_cache.initialized: + material_cache.refresh_rects() + material_cache.mutex_unlock() diff --git a/game/project.godot b/game/project.godot index f6ab43aa..10cbdb00 100644 --- a/game/project.godot +++ b/game/project.godot @@ -302,6 +302,8 @@ enums/stats="Agility,Strength,Stamina,Intellect,Spirit,Health,Mana,Speed,Global enums/skeletons_bones=PoolStringArray( "", "root,pelvis,spine,spine_1,spine_2,neck,head,left_clavicle,left_upper_arm,left_forearm,left_hand,left_thumb_base,left_thumb_end,left_fingers_base,left_fingers_end,right_clavicle,right_upper_arm,right_forearm,right_hand,right_thumb_base,right_thumb_end,right_fingers_base,right_fingers_end,left_thigh,left_calf,left_foot,right_thigh,right_calf,right_foot" ) enums/skeletons_bone_attachment_points=PoolStringArray( "", "left_hand,right_hand,torso,root,right_hip,left_hip,spine_2,weapon_left,weapon_right,weapon_left_back,weapon_right_back,weapon_shield_left" ) xp/character_xps=PoolIntArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) +material_cache/texture_flags=1 +material_cache/material_paths=PoolStringArray( "res://modules/core/materials/3_standard_character_material.tres", "res://modules/core/materials/3_standard_character_material.tres", "res://modules/core/materials/9_standard_character_material_notex.tres" ) profiles/automatic_save=true data/ess_entity_spawner_path="res://player/bs_entity_spawner.tres" level/max_character_level=60