diff --git a/client/assets/characters/animations/ual_extended.glb b/client/assets/characters/animations/ual_extended.glb new file mode 100644 index 000000000..dc684c2a6 Binary files /dev/null and b/client/assets/characters/animations/ual_extended.glb differ diff --git a/client/assets/characters/animations/ual_standard.glb b/client/assets/characters/animations/ual_standard.glb new file mode 100644 index 000000000..410b30c61 Binary files /dev/null and b/client/assets/characters/animations/ual_standard.glb differ diff --git a/client/assets/characters/shaders/outline.gdshader b/client/assets/characters/shaders/outline.gdshader new file mode 100644 index 000000000..645b0b7e8 --- /dev/null +++ b/client/assets/characters/shaders/outline.gdshader @@ -0,0 +1,14 @@ +shader_type spatial; +render_mode unshaded, cull_front; + +uniform vec4 outline_color : source_color = vec4(0.1, 0.1, 0.15, 1.0); +uniform float outline_width : hint_range(0.0, 0.1) = 0.03; + +void vertex() { + // Inverted hull outline: push vertices along normals, render back faces only + VERTEX += NORMAL * outline_width; +} + +void fragment() { + ALBEDO = outline_color.rgb; +} diff --git a/client/assets/characters/shaders/toon.gdshader b/client/assets/characters/shaders/toon.gdshader new file mode 100644 index 000000000..874a0cc0c --- /dev/null +++ b/client/assets/characters/shaders/toon.gdshader @@ -0,0 +1,16 @@ +shader_type spatial; +render_mode unshaded; + +uniform vec4 base_color : source_color = vec4(0.8, 0.6, 0.4, 1.0); +uniform vec4 shadow_color : source_color = vec4(0.4, 0.3, 0.2, 1.0); +uniform float shadow_threshold : hint_range(0.0, 1.0) = 0.5; + +void fragment() { + // Simple toon shading: use normal dot light to pick between base and shadow + vec3 light_dir = normalize(vec3(0.3, -1.0, 0.5)); + float ndl = dot(NORMAL, -light_dir); + float toon = step(shadow_threshold, ndl); + vec3 color = mix(shadow_color.rgb, base_color.rgb, toon); + ALBEDO = color; + ALPHA = base_color.a; +} diff --git a/client/assets/characters/shaders/toon_masked.gdshader b/client/assets/characters/shaders/toon_masked.gdshader new file mode 100644 index 000000000..51be10d98 --- /dev/null +++ b/client/assets/characters/shaders/toon_masked.gdshader @@ -0,0 +1,31 @@ +shader_type spatial; +render_mode unshaded, cull_disabled; + +// Original Trellis atlas texture +uniform sampler2D albedo_tex : source_color; +// Recolor mask: white = replaceable, black = keep original +uniform sampler2D recolor_mask : hint_default_black; +// Runtime tint color set by game code +uniform vec4 tint_color : source_color = vec4(0.8, 0.8, 0.8, 1.0); +// Subtle darkening on shadow side (0.0 = no shadow, 1.0 = full black) +uniform float shadow_strength : hint_range(0.0, 1.0) = 0.15; +uniform float shadow_threshold : hint_range(0.0, 1.0) = 0.3; + +void fragment() { + vec4 original = texture(albedo_tex, UV); + float mask = texture(recolor_mask, UV).r; + + // Recolor: blend tint with original, preserving luminance in masked regions + // This keeps texture detail (shadows, edges, highlights) while changing the hue + float luma = dot(original.rgb, vec3(0.299, 0.587, 0.114)); + vec3 tinted = tint_color.rgb * (luma * 1.5 + 0.2); // scale luma to avoid too-dark + vec3 base = mix(original.rgb, tinted, mask); + + // Gentle toon shadow — just a subtle darkening, not a color replacement + vec3 light_dir = normalize(vec3(0.3, -1.0, 0.5)); + float ndl = dot(NORMAL, -light_dir); + float toon = smoothstep(shadow_threshold - 0.1, shadow_threshold + 0.1, ndl); + vec3 color = base * mix(1.0 - shadow_strength, 1.0, toon); + + ALBEDO = color; +} diff --git a/client/assets/characters/skeleton/armature.glb b/client/assets/characters/skeleton/armature.glb new file mode 100644 index 000000000..24bb236a1 Binary files /dev/null and b/client/assets/characters/skeleton/armature.glb differ diff --git a/client/assets/characters/skin_tones/deep_brown.png b/client/assets/characters/skin_tones/deep_brown.png new file mode 100644 index 000000000..67d6f6463 Binary files /dev/null and b/client/assets/characters/skin_tones/deep_brown.png differ diff --git a/client/assets/characters/skin_tones/light_olive.png b/client/assets/characters/skin_tones/light_olive.png new file mode 100644 index 000000000..977875b40 Binary files /dev/null and b/client/assets/characters/skin_tones/light_olive.png differ diff --git a/client/assets/characters/skin_tones/medium_brown.png b/client/assets/characters/skin_tones/medium_brown.png new file mode 100644 index 000000000..983b12b46 Binary files /dev/null and b/client/assets/characters/skin_tones/medium_brown.png differ diff --git a/client/assets/characters/skin_tones/medium_golden.png b/client/assets/characters/skin_tones/medium_golden.png new file mode 100644 index 000000000..3ef47a2a6 Binary files /dev/null and b/client/assets/characters/skin_tones/medium_golden.png differ diff --git a/client/assets/characters/skin_tones/olive_warm.png b/client/assets/characters/skin_tones/olive_warm.png new file mode 100644 index 000000000..54cf06b33 Binary files /dev/null and b/client/assets/characters/skin_tones/olive_warm.png differ diff --git a/client/assets/characters/skin_tones/pale_cool.png b/client/assets/characters/skin_tones/pale_cool.png new file mode 100644 index 000000000..bc8cec326 Binary files /dev/null and b/client/assets/characters/skin_tones/pale_cool.png differ diff --git a/client/assets/characters/skin_tones/pale_warm.png b/client/assets/characters/skin_tones/pale_warm.png new file mode 100644 index 000000000..d28b58d6d Binary files /dev/null and b/client/assets/characters/skin_tones/pale_warm.png differ diff --git a/client/assets/characters/skin_tones/very_deep_cool.png b/client/assets/characters/skin_tones/very_deep_cool.png new file mode 100644 index 000000000..70ee7587a Binary files /dev/null and b/client/assets/characters/skin_tones/very_deep_cool.png differ diff --git a/client/assets/characters/skin_tones/very_deep_warm.png b/client/assets/characters/skin_tones/very_deep_warm.png new file mode 100644 index 000000000..b2b102e6b Binary files /dev/null and b/client/assets/characters/skin_tones/very_deep_warm.png differ diff --git a/client/project.godot b/client/project.godot index 4d65afa64..f04e59ef1 100644 --- a/client/project.godot +++ b/client/project.godot @@ -152,6 +152,10 @@ quickload={ ] } +[gltf] + +embedded_image_handling=3 + [rendering] renderer/rendering_method="gl_compatibility"