바탕화면 바닷속 방치형 위젯 첫 커밋

화면 아래 가장자리에 가로로 깔리는 Godot 4.7 위젯.
거품을 모아 바다를 꾸미고, 꾸밀수록 거품이 더 빨리 모인다.

- 도킹 창: 투명·테두리 없음, 화면 폭 전체, 위/아래 가장자리 스냅,
  높이 프리셋, 클릭 통과(모서리로 복귀), DPI 배율 보정
- 3/4 부감 격자: 구역당 9x6, 전체 45x6 = 270칸.
  바닥은 위에서, 물체는 서 있는 모습으로 그리고 Y 정렬로 앞뒤를 가린다
- 구역 5개(얕은 바다 -> 열수구): 앞 구역을 꾸며야 다음이 열린다
- 칸이 곧 한계인 경제: 배치/이동/치우기(절반 환불), 여러 칸짜리 장식
- 저장: 30초 자동 저장, 백업 한 세대, 8시간 상한 오프라인 보상,
  격자 이전 형식 저장본 자동 이전
- 스모크 테스트 60여 개 (test.ps1)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-01 17:59:50 +09:00
commit 446d8d177c
48 changed files with 3584 additions and 0 deletions
+32
View File
@@ -0,0 +1,32 @@
shader_type canvas_item;
// 탑다운 바다의 물빛 오버레이. 바닥 위에 덮여서 "물을 통해 내려다본다"는 느낌을 만든다.
// 구역 하나를 담당하고, 좌우 끝 색을 이웃과 공유해 이음매 없이 이어진다.
uniform vec4 tint_left : source_color = vec4(0.27, 0.70, 0.80, 1.0);
uniform vec4 tint_right : source_color = vec4(0.16, 0.51, 0.57, 1.0);
// 깊을수록 물이 두꺼워 바닥이 흐려진다.
uniform float murk_left : hint_range(0.0, 1.0) = 0.20;
uniform float murk_right : hint_range(0.0, 1.0) = 0.30;
// 물결 무늬가 구역 경계에서 끊기지 않도록 스트립 전체에서의 위치를 넘겨받는다.
uniform float x_offset = 0.0;
uniform vec2 rect_size = vec2(300.0, 220.0);
uniform float caustic_strength : hint_range(0.0, 0.4) = 0.13;
void fragment() {
vec2 px = vec2(x_offset, 0.0) + UV * rect_size;
vec3 tint = mix(tint_left.rgb, tint_right.rgb, UV.x);
float murk = mix(murk_left, murk_right, UV.x);
// 수면에서 갈라진 빛이 바닥에 드리우는 그물 무늬.
vec2 p = px / 78.0;
float c = sin(p.x + TIME * 0.45) * sin(p.y * 1.3 - TIME * 0.31);
c += sin(p.x * 1.7 - TIME * 0.38) * sin(p.y * 0.8 + TIME * 0.44);
float caustic = pow(max(c * 0.5 + 0.5, 0.0), 3.0);
// 밝은 물결 자리는 물이 얇아 보이도록 살짝 걷어낸다.
float alpha = clamp(murk - caustic * caustic_strength * 0.5, 0.0, 1.0);
vec3 col = tint + caustic * caustic_strength;
COLOR = vec4(col, alpha);
}