

#░█████╗░██╗░░░░░████████╗░░░░░░░██████╗░░████████╗░█████╗░░██████╗░██╗░░░██╗███╗░░██╗
#██╔══██╗██║░░░░░╚══██╔══╝░░██╗░░██╔══██╗░╚══██╔══╝██╔══██╗░██╔══██╗██║░░░██║████╗░██║
#███████║██║░░░░░░░░██║░░░██████╗██████╔╝░░░░██║░░░██║░░██║░██████╔╝██║░░░██║██╔██╗██║
#██╔══██║██║░░░░░░░░██║░░░╚═██╔═╝██╔═══╝░░░░░██║░░░██║░░██║░██╔══██╗██║░░░██║██║╚████║
#██║░░██║███████╗░░░██║░░░░░╚═╝░░██║░░░░░░░░░██║░░░╚█████╔╝░██║░░██║╚██████╔╝██║░╚███║
#╚═╝░░╚═╝╚══════╝░░░╚═╝░░░░░░░░░░╚═╝░░░░░░░░░╚═╝░░░░╚════╝░░╚═╝░░╚═╝░╚═════╝░╚═╝░░╚══╝

#░██████╗░█████╗░██████╗░██╗██████╗░████████╗
#██╔════╝██╔══██╗██╔══██╗██║██╔══██╗╚══██╔══╝
#╚█████╗░██║░░╚═╝██████╔╝██║██████╔╝░░░██║░░░
#░╚═══██╗██║░░██╗██╔══██╗██║██╔═══╝░░░░██║░░░
#██████╔╝╚█████╔╝██║░░██║██║██║░░░░░░░░██║░░░
#╚═════╝░░╚════╝░╚═╝░░╚═╝╚═╝╚═╝░░░░░░░░╚═╝░░░






# INPUTS VVVVV

skinColourValue = -858062849
eyeColourValue = 2138744831
_random = True

celshading = True

forceRandomSkin = 0
forceRandomEye = 0

# SKIN: 0 = random, 1 = periwinkle, 2 pink, 3 = blue, 4 = peach.

# EYES: 0 = random, 1 = cyan, 2 = green, 3 = green, 3 = brown, 4 = blue/pink, 5 = yellow/orange

# INPUTS ^^^^^













# SCRIPT DOWN THERE VVV
























import random
import colorsys
import bpy




skinColourRanges = [
    {"min": {"r": 0.8, "g": 0.81725633, "b": 1, "a": 1}, "max": {"r": 0.8307908, "g": 0.8, "b": 1, "a": 1}},
    {"min": {"r": 1, "g": 0.7411765, "b": 0.9969143, "a": 1}, "max": {"r": 1, "g": 0.7411765, "b": 0.9290943, "a": 1}},
    {"min": {"r": 0.8, "g": 0.87806493, "b": 1, "a": 1}, "max": {"r": 0.8, "g": 0.8408454, "b": 1, "a": 1}},
    {"min": {"r": 1, "g": 0.80334073, "b": 0.7607843, "a": 1}, "max": {"r": 1, "g": 0.7607843, "b": 0.7607843, "a": 1}},
]

eyeColourRanges = [
    {"min": {"r": 0.48235294, "g": 0.85882354, "b": 0.8307632, "a": 1}, "max": {"r": 0.48235294, "g": 0.72335815, "b": 0.85882354, "a": 1}},
    {"min": {"r": 0.56977385, "g": 0.8509804, "b": 0.44313723, "a": 1}, "max": {"r": 0.6431501, "g": 0.8490566, "b": 0.34042364, "a": 1}},
    {"min": {"r": 0.4245283, "g": 0.36967742, "b": 0.35444108, "a": 1}, "max": {"r": 0.5283019, "g": 0.41842294, "b": 0.41117838, "a": 1}},
    {"min": {"r": 0.6153358, "g": 0.5254902, "b": 0.7176471, "a": 1}, "max": {"r": 0.45616764, "g": 0.46082655, "b": 0.6320754, "a": 1}},
    {"min": {"r": 0.83721256, "g": 0.8392157, "b": 0.43137252, "a": 1}, "max": {"r": 0.8392157, "g": 0.7169183, "b": 0.43137252, "a": 1}},
]





def bit32_to_rgba(packed):
    r = ((packed >> 24) & 0xFF) / 255.0
    g = ((packed >> 16) & 0xFF) / 255.0
    b = ((packed >> 8) & 0xFF) / 255.0
    a = (packed & 0xFF) / 255.0
    return r, g, b, a



def random_colour_from_range(range_list, roll_max):
    if roll_max == 0:
        index = random.randint(0, len(range_list) - 1)
    else:
        roll_max = max(1, min(roll_max, len(range_list)))
        index = roll_max - 1

    choice = range_list[index]
    r = random.uniform(choice["min"]["r"], choice["max"]["r"])
    g = random.uniform(choice["min"]["g"], choice["max"]["g"])
    b = random.uniform(choice["min"]["b"], choice["max"]["b"])
    return (r, g, b, 1)



def saturate_color(color, factor=2.0):
    r, g, b = color[:3]
    h, s, v = colorsys.rgb_to_hsv(r, g, b)
    s = min(1.0, s * factor)
    r, g, b = colorsys.hsv_to_rgb(h, s, v)
    return (r, g, b, color[3]) if len(color) == 4 else (r, g, b)



def darken_color(color, factor=0.5):
    r, g, b = color[:3]
    h, s, v = colorsys.rgb_to_hsv(r, g, b)
    v = max(0.0, v * factor)
    r, g, b = colorsys.hsv_to_rgb(h, s, v)
    return (r, g, b, color[3]) if len(color) == 4 else (r, g, b)




if _random:
    skin_colour = saturate_color(random_colour_from_range(skinColourRanges, forceRandomSkin), 2)
    eye_colour = random_colour_from_range(eyeColourRanges, forceRandomEye)
    
else:
    skin_colour = saturate_color(bit32_to_rgba(skinColourValue), 2)
    eye_colour = bit32_to_rgba(eyeColourValue)
    
skin = bpy.data.materials["Skin"]
iris = bpy.data.materials["Iris"]

temp1 = bpy.data.materials["Mouth"].node_tree.nodes.get("Mix Shader")
temp1.inputs["Fac"].default_value = 0

temp2 = bpy.data.materials["Skin"].node_tree.nodes.get("Mix Shader")
temp2.inputs["Fac"].default_value = 0

temp3 = bpy.data.materials["Tounge"].node_tree.nodes.get("Mix Shader")
temp3.inputs["Fac"].default_value = 0

temp4 = bpy.data.materials["Zipper"].node_tree.nodes.get("Mix Shader")
temp4.inputs["Fac"].default_value = 0

temp5 = bpy.data.materials["Stomach"].node_tree.nodes.get("Mix Shader")
temp5.inputs["Fac"].default_value = 0 #kill me

skinMixShader = skin.node_tree.nodes.get("Mix Shader")
skinMixShader.inputs["Fac"].default_value = 0

skinBsdf = skin.node_tree.nodes.get("Principled BSDF")
skinBsdf.inputs["Base Color"].default_value = skin_colour

eyeBsdf = iris.node_tree.nodes.get("RGB")
eyeBsdf.outputs[0].default_value = eye_colour


if celshading:
    
    temp1.inputs["Fac"].default_value = 1
    temp2.inputs["Fac"].default_value = 1
    temp3.inputs["Fac"].default_value = 1
    temp4.inputs["Fac"].default_value = 1
    temp5.inputs["Fac"].default_value = 1
    
    skinColorRamp = skin.node_tree.nodes.get("Color Ramp")
    
    ramp = skinColorRamp.color_ramp

    while len(ramp.elements) > 1:
        ramp.elements.remove(ramp.elements[0])
    
    ramp.elements[0].position = 0.0
    ramp.elements[0].color = darken_color(skin_colour, 0.33)

    new_colors = [
        (0.33, darken_color(skin_colour, 0.66)),
        (0.66, skin_colour)
    ]

    for pos, col in new_colors:
        el = ramp.elements.new(pos)
        el.color = col