ani
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"name": "Anime Maid Character",
|
||||
"author": "413 Games",
|
||||
"author_url": "https://413games.itch.io/",
|
||||
"license": "CC0 1.0 Universal / Public Domain",
|
||||
"license_url": "https://creativecommons.org/publicdomain/zero/1.0/",
|
||||
"source_url": "https://413games.itch.io/maid-character",
|
||||
"changes": "Original rig and materials retained, retargeted to the Papaya-Shooter animation library; game-native mecha equipment added at runtime."
|
||||
}
|
||||
@@ -0,0 +1,306 @@
|
||||
{
|
||||
"roles": {
|
||||
"hips": "mixamorig:Hips",
|
||||
"head": "mixamorig:Head",
|
||||
"neck": "mixamorig:Neck",
|
||||
"spine": [
|
||||
"mixamorig:Spine",
|
||||
"mixamorig:Spine1",
|
||||
"mixamorig:Spine2",
|
||||
"mixamorig:Neck",
|
||||
"mixamorig:Head"
|
||||
],
|
||||
"shoulder.L": "mixamorig:LeftShoulder",
|
||||
"shoulder.R": "mixamorig:RightShoulder",
|
||||
"toe.R": "mixamorig:RightToeBase",
|
||||
"toe.L": "mixamorig:LeftToeBase",
|
||||
"forearm.L": "mixamorig:LeftForeArm",
|
||||
"forearm.R": "mixamorig:RightForeArm",
|
||||
"thigh.R": "mixamorig:RightUpLeg",
|
||||
"thigh.L": "mixamorig:LeftUpLeg",
|
||||
"foot.R": "mixamorig:RightFoot",
|
||||
"foot.L": "mixamorig:LeftFoot",
|
||||
"hand.R": "mixamorig:RightHand",
|
||||
"hand.L": "mixamorig:LeftHand",
|
||||
"upper_arm.L": "mixamorig:LeftArm",
|
||||
"upper_arm.R": "mixamorig:RightArm",
|
||||
"shin.L": "mixamorig:LeftLeg",
|
||||
"shin.R": "mixamorig:RightLeg"
|
||||
},
|
||||
"fingers": {
|
||||
"thumb.L": [
|
||||
"mixamorig:LeftHandThumb1",
|
||||
"mixamorig:LeftHandThumb2",
|
||||
"mixamorig:LeftHandThumb3",
|
||||
"mixamorig:LeftHandThumb4",
|
||||
"mixamorig:LeftHandThumb4_end"
|
||||
],
|
||||
"index.L": [
|
||||
"mixamorig:LeftHandIndex1",
|
||||
"mixamorig:LeftHandIndex2",
|
||||
"mixamorig:LeftHandIndex3",
|
||||
"mixamorig:LeftHandIndex4",
|
||||
"mixamorig:LeftHandIndex4_end"
|
||||
],
|
||||
"middle.L": [
|
||||
"mixamorig:LeftHandMiddle1",
|
||||
"mixamorig:LeftHandMiddle2",
|
||||
"mixamorig:LeftHandMiddle3",
|
||||
"mixamorig:LeftHandMiddle4",
|
||||
"mixamorig:LeftHandMiddle4_end"
|
||||
],
|
||||
"ring.L": [
|
||||
"mixamorig:LeftHandRing1",
|
||||
"mixamorig:LeftHandRing2",
|
||||
"mixamorig:LeftHandRing3",
|
||||
"mixamorig:LeftHandRing4",
|
||||
"mixamorig:LeftHandRing4_end"
|
||||
],
|
||||
"pinky.L": [
|
||||
"mixamorig:LeftHandPinky1",
|
||||
"mixamorig:LeftHandPinky2",
|
||||
"mixamorig:LeftHandPinky3",
|
||||
"mixamorig:LeftHandPinky4",
|
||||
"mixamorig:LeftHandPinky4_end"
|
||||
],
|
||||
"thumb.R": [
|
||||
"mixamorig:RightHandThumb1",
|
||||
"mixamorig:RightHandThumb2",
|
||||
"mixamorig:RightHandThumb3",
|
||||
"mixamorig:RightHandThumb4",
|
||||
"mixamorig:RightHandThumb4_end"
|
||||
],
|
||||
"index.R": [
|
||||
"mixamorig:RightHandIndex1",
|
||||
"mixamorig:RightHandIndex2",
|
||||
"mixamorig:RightHandIndex3",
|
||||
"mixamorig:RightHandIndex4",
|
||||
"mixamorig:RightHandIndex4_end"
|
||||
],
|
||||
"middle.R": [
|
||||
"mixamorig:RightHandMiddle1",
|
||||
"mixamorig:RightHandMiddle2",
|
||||
"mixamorig:RightHandMiddle3",
|
||||
"mixamorig:RightHandMiddle4",
|
||||
"mixamorig:RightHandMiddle4_end"
|
||||
],
|
||||
"ring.R": [
|
||||
"mixamorig:RightHandRing1",
|
||||
"mixamorig:RightHandRing2",
|
||||
"mixamorig:RightHandRing3",
|
||||
"mixamorig:RightHandRing4",
|
||||
"mixamorig:RightHandRing4_end"
|
||||
],
|
||||
"pinky.R": [
|
||||
"mixamorig:RightHandPinky1",
|
||||
"mixamorig:RightHandPinky2",
|
||||
"mixamorig:RightHandPinky3",
|
||||
"mixamorig:RightHandPinky4",
|
||||
"mixamorig:RightHandPinky4_end"
|
||||
]
|
||||
},
|
||||
"chains": [],
|
||||
"twist": [],
|
||||
"surfaces": [
|
||||
{
|
||||
"mesh": "Body",
|
||||
"surface": 0,
|
||||
"material": "N00_000_00_Body_00_SKIN (Instance)",
|
||||
"class": "body",
|
||||
"detail": "skin",
|
||||
"why": "material name says 'skin'",
|
||||
"verts": 5452,
|
||||
"textured": false,
|
||||
"chain_share": {}
|
||||
},
|
||||
{
|
||||
"mesh": "Body",
|
||||
"surface": 1,
|
||||
"material": "N00_000_00_HairBack_00_HAIR (Instance)",
|
||||
"class": "hair",
|
||||
"detail": "hair",
|
||||
"why": "material name says 'hair'",
|
||||
"verts": 760,
|
||||
"textured": false,
|
||||
"chain_share": {}
|
||||
},
|
||||
{
|
||||
"mesh": "Body",
|
||||
"surface": 2,
|
||||
"material": "N00_002_03_Tops_01_CLOTH (Instance)",
|
||||
"class": "cloth",
|
||||
"detail": "garment",
|
||||
"why": "material name says 'garment'",
|
||||
"verts": 908,
|
||||
"textured": false,
|
||||
"chain_share": {}
|
||||
},
|
||||
{
|
||||
"mesh": "Body",
|
||||
"surface": 3,
|
||||
"material": "N00_001_01_Shoes_01_CLOTH (Instance)",
|
||||
"class": "cloth",
|
||||
"detail": "garment",
|
||||
"why": "material name says 'garment'",
|
||||
"verts": 390,
|
||||
"textured": false,
|
||||
"chain_share": {}
|
||||
},
|
||||
{
|
||||
"mesh": "Body",
|
||||
"surface": 4,
|
||||
"material": "N00_000_00_FaceMouth_00_FACE (Instance)",
|
||||
"class": "body",
|
||||
"detail": "face",
|
||||
"why": "material name says 'face'",
|
||||
"verts": 1053,
|
||||
"textured": false,
|
||||
"chain_share": {}
|
||||
},
|
||||
{
|
||||
"mesh": "Body",
|
||||
"surface": 5,
|
||||
"material": "N00_000_00_EyeIris_00_EYE (Instance)",
|
||||
"class": "body",
|
||||
"detail": "eyes",
|
||||
"why": "material name says 'eyes'",
|
||||
"verts": 214,
|
||||
"textured": false,
|
||||
"chain_share": {}
|
||||
},
|
||||
{
|
||||
"mesh": "Body",
|
||||
"surface": 6,
|
||||
"material": "N00_000_00_EyeHighlight_00_EYE (Instance)",
|
||||
"class": "body",
|
||||
"detail": "eyes",
|
||||
"why": "material name says 'eyes'",
|
||||
"verts": 38,
|
||||
"textured": false,
|
||||
"chain_share": {}
|
||||
},
|
||||
{
|
||||
"mesh": "Body",
|
||||
"surface": 7,
|
||||
"material": "N00_000_00_Face_00_SKIN (Instance)",
|
||||
"class": "body",
|
||||
"detail": "face",
|
||||
"why": "material name says 'face'",
|
||||
"verts": 2266,
|
||||
"textured": false,
|
||||
"chain_share": {}
|
||||
},
|
||||
{
|
||||
"mesh": "Body",
|
||||
"surface": 8,
|
||||
"material": "N00_000_00_EyeWhite_00_EYE (Instance)",
|
||||
"class": "body",
|
||||
"detail": "eyes",
|
||||
"why": "material name says 'eyes'",
|
||||
"verts": 290,
|
||||
"textured": false,
|
||||
"chain_share": {}
|
||||
},
|
||||
{
|
||||
"mesh": "Body",
|
||||
"surface": 9,
|
||||
"material": "N00_000_00_FaceBrow_00_FACE (Instance)",
|
||||
"class": "body",
|
||||
"detail": "face",
|
||||
"why": "material name says 'face'",
|
||||
"verts": 52,
|
||||
"textured": false,
|
||||
"chain_share": {}
|
||||
},
|
||||
{
|
||||
"mesh": "Body",
|
||||
"surface": 10,
|
||||
"material": "N00_000_00_FaceEyeline_00_FACE (Instance)",
|
||||
"class": "body",
|
||||
"detail": "face",
|
||||
"why": "material name says 'face'",
|
||||
"verts": 126,
|
||||
"textured": false,
|
||||
"chain_share": {}
|
||||
},
|
||||
{
|
||||
"mesh": "Body",
|
||||
"surface": 11,
|
||||
"material": "N00_000_Hair_00_HAIR (Instance)",
|
||||
"class": "hair",
|
||||
"detail": "hair",
|
||||
"why": "material name says 'hair'",
|
||||
"verts": 7355,
|
||||
"textured": false,
|
||||
"chain_share": {}
|
||||
}
|
||||
],
|
||||
"colliders": [
|
||||
{
|
||||
"bone": "mixamorig:Hips",
|
||||
"child": "mixamorig:Spine",
|
||||
"from": 0.0,
|
||||
"radius_head": 0.1341,
|
||||
"radius_tail": 0.1341,
|
||||
"radius": 0.1341,
|
||||
"lid": true
|
||||
},
|
||||
{
|
||||
"bone": "mixamorig:LeftUpLeg",
|
||||
"child": "mixamorig:LeftLeg",
|
||||
"from": 0.1,
|
||||
"radius_head": 0.0985,
|
||||
"radius_tail": 0.0605,
|
||||
"radius": 0.0605
|
||||
},
|
||||
{
|
||||
"bone": "mixamorig:RightUpLeg",
|
||||
"child": "mixamorig:RightLeg",
|
||||
"from": 0.1,
|
||||
"radius_head": 0.0985,
|
||||
"radius_tail": 0.0605,
|
||||
"radius": 0.0605
|
||||
},
|
||||
{
|
||||
"bone": "mixamorig:LeftLeg",
|
||||
"child": "mixamorig:LeftFoot",
|
||||
"from": 0.1,
|
||||
"radius_head": 0.1172,
|
||||
"radius_tail": 0.0507,
|
||||
"radius": 0.0507
|
||||
},
|
||||
{
|
||||
"bone": "mixamorig:RightLeg",
|
||||
"child": "mixamorig:RightFoot",
|
||||
"from": 0.1,
|
||||
"radius_head": 0.1172,
|
||||
"radius_tail": 0.0507,
|
||||
"radius": 0.0507
|
||||
}
|
||||
],
|
||||
"weights_authored": true,
|
||||
"driven_bones": [
|
||||
"mixamorig:Head",
|
||||
"mixamorig:Hips",
|
||||
"mixamorig:LeftArm",
|
||||
"mixamorig:LeftFoot",
|
||||
"mixamorig:LeftForeArm",
|
||||
"mixamorig:LeftHand",
|
||||
"mixamorig:LeftLeg",
|
||||
"mixamorig:LeftShoulder",
|
||||
"mixamorig:LeftToeBase",
|
||||
"mixamorig:LeftUpLeg",
|
||||
"mixamorig:Neck",
|
||||
"mixamorig:RightArm",
|
||||
"mixamorig:RightFoot",
|
||||
"mixamorig:RightForeArm",
|
||||
"mixamorig:RightHand",
|
||||
"mixamorig:RightLeg",
|
||||
"mixamorig:RightShoulder",
|
||||
"mixamorig:RightToeBase",
|
||||
"mixamorig:RightUpLeg",
|
||||
"mixamorig:Spine",
|
||||
"mixamorig:Spine1",
|
||||
"mixamorig:Spine2"
|
||||
]
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"name": "3D Anime Female Adventurer Character Model",
|
||||
"version": "1.2",
|
||||
"author": "Dawn to Dusk Games",
|
||||
"author_url": "https://dawn-to-dusk-games.itch.io/",
|
||||
"license": "CC0 1.0 Universal",
|
||||
"license_url": "https://creativecommons.org/publicdomain/zero/1.0/",
|
||||
"source_url": "https://dawn-to-dusk-games.itch.io/3d-anime-female-adventurer",
|
||||
"changes": "Outfit 01 retargeted to the Papaya-Shooter animation library; game-native mecha equipment added at runtime."
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -36,8 +36,10 @@ render_mode unshaded, fog_disabled, depth_draw_never, depth_test_disabled, cull_
|
||||
// away from the viewer) inks faintly. That is what an animator does — the
|
||||
// outside line of a shape is heavy, the contact line inside it is light.
|
||||
|
||||
uniform sampler2D screen_tex : hint_screen_texture, filter_linear;
|
||||
uniform sampler2D depth_tex : hint_depth_texture, filter_nearest;
|
||||
uniform sampler2D screen_tex : hint_screen_texture, filter_linear, repeat_disable;
|
||||
uniform sampler2D depth_tex : hint_depth_texture, filter_nearest, repeat_disable;
|
||||
uniform sampler2D normal_roughness_tex : hint_normal_roughness_texture,
|
||||
filter_nearest, repeat_disable;
|
||||
|
||||
group_uniforms ink;
|
||||
uniform vec4 ink_color : source_color = vec4(0.224, 0.196, 0.310, 1.0);
|
||||
@@ -163,8 +165,7 @@ vec3 painted_sky(vec3 dir) {
|
||||
|
||||
// Linear view depth, with the sky pinned to a finite value so the second
|
||||
// difference across a silhouette is large but never infinite.
|
||||
float linear_depth(vec2 uv, mat4 inv_proj) {
|
||||
float d = texture(depth_tex, uv).r;
|
||||
float linear_depth(vec2 uv, float d, mat4 inv_proj) {
|
||||
// Godot 4.3+ is reverse-Z: the far plane and the sky read exactly 0.
|
||||
if (d <= 0.000001) {
|
||||
return ink_sky_depth;
|
||||
@@ -175,6 +176,18 @@ float linear_depth(vec2 uv, mat4 inv_proj) {
|
||||
}
|
||||
|
||||
|
||||
vec3 view_position(vec2 uv, float raw_depth, mat4 inv_proj) {
|
||||
vec4 ndc = vec4(uv * 2.0 - 1.0, raw_depth, 1.0);
|
||||
vec4 view = inv_proj * ndc;
|
||||
return view.xyz / view.w;
|
||||
}
|
||||
|
||||
|
||||
vec3 screen_normal(vec2 uv) {
|
||||
return normalize(texture(normal_roughness_tex, uv).xyz * 2.0 - 1.0);
|
||||
}
|
||||
|
||||
|
||||
vec3 apply_grade(vec3 c, vec2 uv) {
|
||||
if (!grade_enabled) {
|
||||
return c;
|
||||
@@ -226,11 +239,15 @@ void fragment() {
|
||||
}
|
||||
|
||||
vec2 t = px * ink_thickness;
|
||||
float dc = linear_depth(uv, INV_PROJECTION_MATRIX);
|
||||
float dl = linear_depth(uv - vec2(t.x, 0.0), INV_PROJECTION_MATRIX);
|
||||
float dr = linear_depth(uv + vec2(t.x, 0.0), INV_PROJECTION_MATRIX);
|
||||
float du = linear_depth(uv + vec2(0.0, t.y), INV_PROJECTION_MATRIX);
|
||||
float dd = linear_depth(uv - vec2(0.0, t.y), INV_PROJECTION_MATRIX);
|
||||
float raw_l = texture(depth_tex, uv - vec2(t.x, 0.0)).r;
|
||||
float raw_r = texture(depth_tex, uv + vec2(t.x, 0.0)).r;
|
||||
float raw_u = texture(depth_tex, uv + vec2(0.0, t.y)).r;
|
||||
float raw_d = texture(depth_tex, uv - vec2(0.0, t.y)).r;
|
||||
float dc = linear_depth(uv, raw_depth, INV_PROJECTION_MATRIX);
|
||||
float dl = linear_depth(uv - vec2(t.x, 0.0), raw_l, INV_PROJECTION_MATRIX);
|
||||
float dr = linear_depth(uv + vec2(t.x, 0.0), raw_r, INV_PROJECTION_MATRIX);
|
||||
float du = linear_depth(uv + vec2(0.0, t.y), raw_u, INV_PROJECTION_MATRIX);
|
||||
float dd = linear_depth(uv - vec2(0.0, t.y), raw_d, INV_PROJECTION_MATRIX);
|
||||
|
||||
// Second difference of linear depth, normalised by distance so that a given
|
||||
// real-world crease inks with the same weight near and far.
|
||||
@@ -245,6 +262,44 @@ void fragment() {
|
||||
edge = max(edge, smoothstep(
|
||||
ink_concave, ink_concave * 3.4, concave) * ink_concave_amount);
|
||||
|
||||
// Depth precision forms a staircase on a flat floor viewed almost edge-on.
|
||||
// Its second difference looks like curvature even though every tapped point
|
||||
// belongs to the same plane; beyond a camera-dependent distance the old test
|
||||
// therefore inked the entire road as one dark band. Confirm that curvature
|
||||
// with the normal/depth prepass before drawing it. A true edge either changes
|
||||
// normal, leaves the centre tangent plane, or crosses from geometry to sky.
|
||||
if (edge > 0.0001) {
|
||||
float sky_edge = step(raw_depth, 0.000001)
|
||||
!= step(raw_l, 0.000001) || step(raw_depth, 0.000001)
|
||||
!= step(raw_r, 0.000001) || step(raw_depth, 0.000001)
|
||||
!= step(raw_u, 0.000001) || step(raw_depth, 0.000001)
|
||||
!= step(raw_d, 0.000001) ? 1.0 : 0.0;
|
||||
float geometry_evidence = sky_edge;
|
||||
if (raw_depth > 0.000001 && sky_edge < 0.5) {
|
||||
vec3 nc = screen_normal(uv);
|
||||
vec3 nl = screen_normal(uv - vec2(t.x, 0.0));
|
||||
vec3 nr = screen_normal(uv + vec2(t.x, 0.0));
|
||||
vec3 nu = screen_normal(uv + vec2(0.0, t.y));
|
||||
vec3 nd = screen_normal(uv - vec2(0.0, t.y));
|
||||
float normal_turn = max(max(1.0 - dot(nc, nl), 1.0 - dot(nc, nr)),
|
||||
max(1.0 - dot(nc, nu), 1.0 - dot(nc, nd)));
|
||||
|
||||
vec3 pc = view_position(uv, raw_depth, INV_PROJECTION_MATRIX);
|
||||
vec3 pl = view_position(uv - vec2(t.x, 0.0), raw_l, INV_PROJECTION_MATRIX);
|
||||
vec3 pr = view_position(uv + vec2(t.x, 0.0), raw_r, INV_PROJECTION_MATRIX);
|
||||
vec3 pu = view_position(uv + vec2(0.0, t.y), raw_u, INV_PROJECTION_MATRIX);
|
||||
vec3 pd = view_position(uv - vec2(0.0, t.y), raw_d, INV_PROJECTION_MATRIX);
|
||||
float off_plane = max(max(abs(dot(nc, normalize(pl - pc))),
|
||||
abs(dot(nc, normalize(pr - pc)))),
|
||||
max(abs(dot(nc, normalize(pu - pc))),
|
||||
abs(dot(nc, normalize(pd - pc)))));
|
||||
float normal_evidence = smoothstep(0.006, 0.045, normal_turn);
|
||||
float plane_evidence = smoothstep(0.012, 0.080, off_plane);
|
||||
geometry_evidence = max(normal_evidence, plane_evidence);
|
||||
}
|
||||
edge *= geometry_evidence;
|
||||
}
|
||||
|
||||
// Fade on the nearest real surface involved in the edge, not on dc: a sky
|
||||
// pixel beside a nearby roof would otherwise be measured at 900 m and its
|
||||
// half of the silhouette would fade out while the roof's half did not.
|
||||
|
||||
Reference in New Issue
Block a user