Skip to content

Commit 9b05f59

Browse files
author
Shengjie Xu
committed
[Core][Asset] Add first character sprite set; Allow recolor tester to use builtin assets
1 parent 42bedf2 commit 9b05f59

32 files changed

+108
-15
lines changed
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
选区:
2+
M1-头发:
3+
基础颜色: "#886F64"
4+
适用于: L7-头发
5+
M2-衣服:
6+
基础颜色: "#8C6E5F"
7+
适用于: ["L3-衣服","L5-裙蝴蝶结","L10-帽蝴蝶结"]
8+
M3-裙子:
9+
基础颜色: "#FCFAF9"
10+
适用于: ["L2-裙子","L4-内搭","L6-衣扣蝴蝶结","L9-帽子"]
11+
M4-围巾装饰:
12+
基础颜色: "#FFBCC3"
13+
适用于: L8-围巾装饰
14+
生成:
15+
charactersprite_parts_based:
16+
部件类型:
17+
B1: preset_kind_base
18+
B2: preset_kind_base
19+
M: preset_kind_eyebrow
20+
#Y: preset_kind_eye
21+
K: preset_kind_mouth
22+
#Q: preset_kind_fullface
23+
DA: preset_kind_decoration
24+
DB: preset_kind_decoration
25+
标签:
26+
通用: preset_tag_general
27+
笑容: preset_tag_smile
28+
愤怒: preset_tag_angry
29+
悲伤: preset_tag_sad
30+
惊讶: preset_tag_surprised
31+
困惑: preset_tag_confused
32+
害怕: preset_tag_scared
33+
基底: preset_tag_base
34+
部件:
35+
B1:
36+
L1-底图: 基底
37+
L2-裙子: 基底
38+
L3-衣服: 基底
39+
L4-内搭: 基底
40+
L5-裙蝴蝶结: 基底
41+
L6-衣扣蝴蝶结: 基底
42+
M:
43+
M0-正常: ["通用", "笑容", "惊讶", "困惑", "害怕"]
44+
M1-悲伤: 悲伤
45+
M2-生气: 愤怒
46+
K:
47+
K0-正常: ["通用","害怕","愤怒","惊讶","困惑","笑容"]
48+
K1-圆张嘴: ["通用","害怕","困惑","笑容"]
49+
K2-闭嘴: ["通用","害怕","愤怒","困惑","笑容"]
50+
K3-纠结: 害怕
51+
K4-欢呼: 笑容
52+
K5-撇嘴: 愤怒
53+
K6-尴尬嘴: 害怕
54+
K7-张嘴扁: 笑容
55+
K8-悲伤嘴: 悲伤
56+
K9-嘟嘴: ["通用","愤怒"]
57+
B2:
58+
L7-头发: 基底
59+
L8-围巾装饰: 基底
60+
L9-帽子: 基底
61+
L10-帽蝴蝶结: 基底
62+
DA:
63+
D1-眼泪: {标签: ["害怕","悲伤"], 互斥: ["K0"], 依赖: ["K8"]}
64+
D2-流汗: ["通用","害怕","笑容"]
65+
DB:
66+
D3-眼镜框: ["通用","害怕","愤怒","悲伤","惊讶","困惑","笑容"]
67+
基底简写:
68+
B0: L1L2L3L4L5L6L7L8L9L10
69+
元数据:
70+
author: "秋襟"
71+
overview_scale: 0.2
72+
diff_croprect: [1885, 905, 2685, 1705]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
kind: CHARACTER
2+
reference:
3+
en: "DT1"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
imagepack:
2+
A0DT1:
3+
yamlpath: "{srcpath}/A0-秋襟/DT1-短发女生/config.yml"

assets/preppipe_asset_manifest.yml

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
subdirs:
2+
- imagepack/charactersprite/charactersprites.yml
23
- imagepack/background/backgrounds.yml
34
- thirdparty/thirdparty.yml
45
- gui/gui.yml

src/preppipe/util/imagepack.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class ImagePack(NamedAssetClassBase):
101101

102102
class MaskInfo:
103103
mask : ImageWrapper | None # 如果为 None 则表示该 mask 覆盖所有适用的基底图层
104-
basename : str # 保存时使用的名称(不含后缀)
104+
basename : str | None # 保存时使用的名称(不含后缀)
105105
offset_x : int
106106
offset_y : int
107107
width : int
@@ -117,7 +117,7 @@ def __init__(self, mask : ImageWrapper | None, mask_color : Color,
117117
offset_x : int = 0, offset_y : int = 0,
118118
width : int = 0, height : int = 0,
119119
projective_vertices : tuple[tuple[int,int],tuple[int,int],tuple[int,int],tuple[int,int]] | None = None,
120-
basename : str = '', applyon : typing.Iterable[int] | None = None) -> None:
120+
basename : str | None = None, applyon : typing.Iterable[int] | None = None) -> None:
121121
self.mask = mask
122122
self.mask_color = mask_color
123123
self.offset_x = offset_x
@@ -266,7 +266,7 @@ def check_filename(filename : str):
266266
json_masks = []
267267
for m in self.masks:
268268
basename = m.basename
269-
if basename != "None":
269+
if basename is not None:
270270
if len(basename) == 0:
271271
basename = 'm' + str(len(json_masks))
272272
filename = basename + ".png"
@@ -917,7 +917,7 @@ def check_base_cover(l : ImagePack.LayerInfo) -> bool:
917917
break
918918
if isFullyCovers:
919919
m.mask = None
920-
m.basename = "None"
920+
m.basename = None
921921

922922
def get_summary_no_variations(self, descriptor : 'ImagePackDescriptor') -> 'ImagePackSummary':
923923
# 在该图片组没有使用基底图变体时生成 ImagePackSummary

src/preppipe/util/imagepackrecolortester.py

+25-11
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from ..language import *
2424
from ..tooldecl import ToolClassDecl
2525
from .imagepack import *
26+
from ..assets.assetmanager import AssetManager
2627

2728
@ToolClassDecl("imagepackrecolortester")
2829
class ImagePackRecolorTester:
@@ -407,6 +408,7 @@ def tool_main(args : list[str] | None = None):
407408
parser.add_argument("--psd", type=str, help="PSD file to load")
408409
parser.add_argument("--loaddir", type=str, help="Directory to load images")
409410
parser.add_argument("--yaml", type=str, help="ImagePack YAML file to load")
411+
parser.add_argument("--asset", type=str, help="Asset ID to load")
410412
parser.add_argument("--srcscale", type=float, default=1.0, help="Scale factor for source images")
411413
parser.add_argument("--mask", type=str, nargs="+", help="Layer names to use as masks")
412414
parser.add_argument("--minimal", action="store_true", help="Use narrow color range")
@@ -432,6 +434,20 @@ def tool_main(args : list[str] | None = None):
432434
basecolors[name] = Color.get(parts[1])
433435

434436
imagepacks = []
437+
def add_forkable_pack(pack : ImagePack):
438+
nonlocal imagepacks
439+
if len(pack.masks) > 1:
440+
# 给每个选区都生成一个独立的图片包
441+
nummasks = len(pack.masks)
442+
fork_args = [None] * nummasks
443+
for i in range(0, nummasks):
444+
curpack = pack.fork_applying_mask(fork_args) # type: ignore
445+
curpack.masks.append(pack.masks[i])
446+
imagepacks.append(curpack)
447+
elif len(pack.masks) == 1:
448+
imagepacks.append(pack)
449+
else:
450+
raise ValueError("No mask found in ImagePack")
435451
if parsed_args.psd or parsed_args.loaddir:
436452
if len(baselayernames) == 0:
437453
raise ValueError("No mask layers specified")
@@ -474,18 +490,16 @@ def tool_main(args : list[str] | None = None):
474490
pack = pack.fork_and_shrink(decimal.Decimal(parsed_args.srcscale))
475491
else:
476492
pack = pack.shrink_for_overview()
477-
if len(pack.masks) > 1:
478-
# 给每个选区都生成一个独立的图片包
479-
nummasks = len(pack.masks)
480-
fork_args = [None] * nummasks
481-
for i in range(0, nummasks):
482-
curpack = pack.fork_applying_mask(fork_args) # type: ignore
483-
curpack.masks.append(pack.masks[i])
484-
imagepacks.append(curpack)
485-
elif len(pack.masks) == 1:
486-
imagepacks.append(pack)
493+
add_forkable_pack(pack)
494+
elif parsed_args.asset:
495+
am = AssetManager.get_instance()
496+
if pack := am.get_asset(parsed_args.asset):
497+
add_forkable_pack(pack)
487498
else:
488-
raise ValueError("No mask found in ImagePack")
499+
am.load_all_assets()
500+
json_dump = am.get_assets_json()
501+
available_assets = [k for k in json_dump.keys() if k.startswith("imagepack")]
502+
raise ValueError("Cannot find asset " + parsed_args.asset + ". Available assets: " + ", ".join(available_assets))
489503
else:
490504
size = (600, 200)
491505
for color in dest_colors:

0 commit comments

Comments
 (0)