DMZ Skin Layer Generator

Paint ONE hue-coded skin → generate DragonMineZ grayscale layer PNGs. Grayscale = shading; DMZ multiplies each layer by a player-chosen channel color at render time.

Body
Face
Drop a PNG here, or click to pick.
Current mode: Body. Each mode keeps its own image.

Naming

Gender infix is only used if the race config has hasGender:true. Bodytypes other than 0 fall back to _0 in-game.

Classification

Output grayscale value = HSV V (max of R,G,B). Hue only picks the channel, it never changes the shading value, so paint any hue and let brightness carry the AO.

Layers & filenames

Preview channel colors

These simulate a player's DMZ color choices; skin (nose/mouth) uses body1.

Export

Zip root mirrors deploy layout: <race>/… with faces/ subfolder.

Live render preview

Generated layers

Help: hue convention, mechanism & deploy

How DMZ colorizes a layered race. With isLayered:true, DMZ renders the model once per layer. Each layer PNG is pure grayscale; at render time DMZ does a per-channel multiply out = grayscaleTexel × channelColor. The grayscale value therefore acts purely as shading / ambient occlusion, and the player's chosen color supplies the hue. Layers stack layer1→layerN with a hard-alpha cutout (no blending) over the same UV mesh; later layers overwrite where opaque.

Why V (value) for the gray. This tool classifies each opaque pixel by hue to decide which layer/channel it belongs to, then writes gray = max(R,G,B) (HSV V). So the artist can paint any hue for a region and the shading stays exactly as painted. Low-saturation pixels (below the threshold) are unassigned and left out of every output (transparent).

Body layers (<race>[_male|_female]_<bodytype>_layerN.png): layer1→body color 1 (skin), layer2→body color 2, layer3→body color 3, optional layer4→hair color (namekian-style, only emitted if painted). Gender infix appears only if hasGender:true. Missing bodytypes fall back to _0, so bodytype 0 is the essential set.

Face overlays (in <race>/faces/, head-region UVs matching the body):
<faceKey>_eye_E_0.png = sclera, rendered untinted (original RGB kept, NOT grayscaled).
_eye_E_1.png tinted by eye1, _eye_E_2.png by eye2, _eye_E_3.png eyebrows tinted by hair.
<faceKey>_nose_N.png and <faceKey>_mouth_M.png tinted by skin (body1).

Deploy. Drop the files (mirroring the zip layout) into assets/dragonminez/textures/entity/races/<race>/ inside a resource pack or your mod's resources. Note the dragonminez namespace. The geo model's UV layout must match these PNGs; layer pixel size is independent of the geo's texture_width and only needs to match the UV layout.

character.json requirements: isLayered:true, useVanillaSkin:false, a customModel, and hasGender set to match your file naming.

Output guarantees: every non-sclera PNG is pure grayscale (R=G=B) with hard alpha (0 or 255; input alpha thresholded at 128). Best in-jar reference: namekian, full 0-255 range on layer1, sparse high-value detail on layer2/3.