From 5ee2543a427708834cacc8c524ecf9f43f6b2a3c Mon Sep 17 00:00:00 2001 From: copygirl Date: Mon, 23 Jun 2025 20:31:12 +0200 Subject: [PATCH] Custom appearance for sticky hearts --- Resources/heart.gd | 33 ++++++++++++++-- Resources/heart.glb | Bin 16868 -> 16856 bytes Resources/heart.tscn | 16 +++++--- Resources/heart_inner.glb | Bin 0 -> 15896 bytes Resources/heart_inner.glb.import | 37 ++++++++++++++++++ copyThrower.gd | 64 ++++++++++++++----------------- 6 files changed, 105 insertions(+), 45 deletions(-) create mode 100644 Resources/heart_inner.glb create mode 100644 Resources/heart_inner.glb.import diff --git a/Resources/heart.gd b/Resources/heart.gd index 814bc8c..4c31d9d 100644 --- a/Resources/heart.gd +++ b/Resources/heart.gd @@ -22,9 +22,11 @@ var sticky := false # heart sticks to a character, it can return here once it unsticks. @onready var original_parent: Node = get_parent() -static var stream_normal: AudioStream = load("res://Mods/copyThrower/Resources/normal_randomizer.tres") static var stream_sticky: AudioStream = load("res://Mods/copyThrower/Resources/sticky_randomizer.tres") +# A cache of StandardMaterial3D materials created from colors and textures, with transparent variants. +static var material_cache: Dictionary[Variant, Dictionary] + func _ready() -> void: body_entered.connect(on_body_entered) @@ -42,11 +44,34 @@ func set_size(value: float) -> void: func set_sticky(value: bool) -> void: sticky = value + $Model/Inner.visible = value if value: $AudioStreamPlayer3D.stream = stream_sticky - else: $AudioStreamPlayer3D.stream = stream_normal -func set_material(material: StandardMaterial3D) -> void: - $Model/Heart.material_override = material +func set_material(value: Variant) -> void: + if not material_cache.has(value): + var material_normal: StandardMaterial3D + if value is Material: + material_normal = value + elif value is Color: + material_normal = StandardMaterial3D.new() + material_normal.albedo_color = value + elif value is Texture2D: + material_normal = StandardMaterial3D.new() + material_normal.albedo_texture = value + else: printerr("unsupported value type"); + + # Create an additional material that's semi-transparent. + var material_sticky := material_normal.duplicate() + material_sticky.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + material_sticky.albedo_color.a = 0.5 + + material_cache[value] = { normal = material_normal, sticky = material_sticky } + + var material := material_cache[value] + # NOTE: Assuming this function is called after set_sticky. + var sticky_str := "sticky" if sticky else "normal" + $Model/Outer/Heart.material_override = material[sticky_str] + $Model/Inner/Heart.material_override = material["normal"] func _process(delta: float) -> void: diff --git a/Resources/heart.glb b/Resources/heart.glb index cb06f9f1444709a261ef6c5190b65cc2ece7ee87..b8948d969dfec8691eac6678746fe22ecfcadb08 100644 GIT binary patch delta 1180 zcmYk4e^Aq99LF~p8+;E46bFp)Yh$xehQR^^zRx2+4sBCt!_Z5mxWviu#t%bI@E9B? zBxHh5IKt3_zytw*kjilTJm-mIT_6-HmZ6tenJ5S<-Qs3g|MdU+-uJ%O>pfY?9k1lN z>vnBSao}(`;|Uzj0y^pvuFJ=vM7V>Ka^ko_m2~~`I zemlfu&7wRpF$hJ>+H@6l(|wFCvE;B&<sqqsrD<>RK`ThNH z^iR^`Cvx#F{f521{uYSng(V@HLVpRvTyBGq6LB zD?Pck*?ebCjo+yfP|^AZH0Gnk<`F49lXeV!A6x1GiCEa7qg=IM2QN;33uvTrY5w|ZEj4M_DTKzlm zHGDZUo`%K|y?+%`Z41Y@Zpv|kFR}T{!&e-M#wq#;+-KI92cl1**~9|;%Ckpi5k7xl zi$(lPJ^IaV#9}wN)V{8nqy_l$JG^dNuYXDm0a22)wp8@tw18ect;LSqA+YTkf_Epi zv_R1X(-$USa*PZH7?_OD=Ri7OK?4SY0;`zUM|iOBMm4YvWH`{Em@f#SPdoR3CLxyY z@={QJiOf2#kE8xM9QwX}%#yop8;yBeO~Wb(tZ^XvAURX6{{k%=QDSu|X$q1nj*qFS zBtk&FWhVIF(}A0UE4gS*&0u}g9(#mmD2pSRrFdhQAtG04kl;QvyVH_iCz|F?RBe7BuQ*?3;^ zXAyCisU%l&MeJU8WF4$A(wuOQcuna;HdI?icSKo`CP+({-X=;3$k}qv&C;z#6*Uq{y|J*W@giXORT(CAG*Q!}>Zv9xsWIQ**g#90LfT9RvnkU@fa)P*#!{Wv)H zY|xZzQ~o)Gj720=u!UL1D`%VCDxv2jsTb6^IVZ?mVU|zju4pROYo^wcqe20%Q~d>u zB@hsXGOj6klzX!QS@)1TLd5%FxL<4DMswG@IzJ?PJ;(r{HX^#Ogw9fa9vya^IljarJfs}oQ z^j+K<(FkEiHMY8h5bqG7#=%$njBhc%P%Vk?cx_mFuF#AxZ4_xY`yuw*-DNnC3Bhbs z@)YZ>i(bOMS@AS`F3AqDF#Lznc=L5RUL_;5H*Og6>(liJQZ;eX nCDJsi7$8QOg?}|Q51$-vK&nD36wNT<<%>4h7o%22-V^*U+&lL> diff --git a/Resources/heart.tscn b/Resources/heart.tscn index 6ef9d54..0c99273 100644 --- a/Resources/heart.tscn +++ b/Resources/heart.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=5 format=3 uid="uid://m7kmum7ygiw2"] +[gd_scene load_steps=6 format=3 uid="uid://m7kmum7ygiw2"] [ext_resource type="Script" uid="uid://ba4w1hier1kps" path="res://Mods/copyThrower/Resources/heart.gd" id="1_h4gh1"] [ext_resource type="PackedScene" uid="uid://bryal7hhfonuv" path="res://Mods/copyThrower/Resources/heart.glb" id="1_liglp"] -[ext_resource type="AudioStream" uid="uid://jmgp1vmm5mdf" path="res://Mods/copyThrower/Resources/sticky_randomizer.tres" id="3_4n8sw"] +[ext_resource type="AudioStream" uid="uid://by5roe3uixyln" path="res://Mods/copyThrower/Resources/normal_randomizer.tres" id="3_4n8sw"] +[ext_resource type="PackedScene" uid="uid://ci53c7a5h2ew4" path="res://Mods/copyThrower/Resources/heart_inner.glb" id="4_2dw4y"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_rfhqb"] height = 0.04 @@ -13,9 +14,6 @@ contact_monitor = true max_contacts_reported = 1 script = ExtResource("1_h4gh1") -[node name="Model" parent="." instance=ExtResource("1_liglp")] -transform = Transform3D(0.6, 0, 0, 0, 0.6, 0, 0, 0, 0.6, 0, 0, 0) - [node name="CollisionShape3D" type="CollisionShape3D" parent="."] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0) shape = SubResource("CylinderShape3D_rfhqb") @@ -24,3 +22,11 @@ shape = SubResource("CylinderShape3D_rfhqb") stream = ExtResource("3_4n8sw") attenuation_model = 3 volume_db = -2.0 + +[node name="Model" type="Node3D" parent="."] +transform = Transform3D(0.6, 0, 0, 0, 0.6, 0, 0, 0, 0.6, 0, 0, 0) + +[node name="Outer" parent="Model" instance=ExtResource("1_liglp")] + +[node name="Inner" parent="Model" instance=ExtResource("4_2dw4y")] +visible = false diff --git a/Resources/heart_inner.glb b/Resources/heart_inner.glb new file mode 100644 index 0000000000000000000000000000000000000000..66545ac2f3a6a30e72870d7c68536599d26573ef GIT binary patch literal 15896 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 void: vel.y *= 0.25 # Less vertical influence. body_bump += vel * object.size * 0.05 -static func colored_heart(color: Color) -> StandardMaterial3D: - var material := StandardMaterial3D.new() - material.albedo_color = color - return material - -static func textured_heart(pride: String) -> StandardMaterial3D: - var texture: Texture2D = load("res://Mods/copyThrower/Resources/pride/" + pride + ".png") - var material := StandardMaterial3D.new() - material.albedo_texture = texture - return material +static func pride(value: String) -> Texture2D: + return load("res://Mods/copyThrower/Resources/pride/" + value + ".png")