-
Notifications
You must be signed in to change notification settings - Fork 10
/
colorFormulaInstructions.js
190 lines (135 loc) · 5.52 KB
/
colorFormulaInstructions.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
// Variables for body R G B values
var bodyRed;
var bodyBlue;
var bodyGreen;
// Variables for body H S B values
var bodyHue;
var bodySaturation;
var bodyBrightness;
// Variable for body perceived brightness
var bodyPerceivedBrightness;
var bodyPerceivedBrightness255;
// Variable for body shadow opacity
var bodyShadowOpacity;
var blk29AccessoryOpacity;
// Variables for hair R G B values
var hairRed;
var hairGreen;
var hairBlue;
// Variables for hair H S B values
var hairHue;
var hairSaturation;
var hairBrightness;
// Variable for hair perceived brightness
var hairPerceivedBrightness;
var hairPerceivedBrightness255;
// Variable for hair shadow opacity
var hairShadowOpacity;
// Limits that will be used on hairBrightness depending on the hairSaturation
var hairBrightnessDynamicMax = 90;
var hairSaturationDynamicMin = 10;
// Min and max perceivedBrightness values (between 0 and 100)
var minPerceivedBrightness = 18;
var maxPerceivedBrightness = 95;
// Min and max perceivedBrightness values (between 0 and 255)
var minPerceivedBrightness255 = minPerceivedBrightness / 100 * 255;
var maxPerceivedBrightness255 = maxPerceivedBrightness / 100 * 255;
// Variable for body and hair hue distance
var bodyAndHairHueDistance = 90;
// Min total saturation (bodySaturation + hairSaturation shouldn't be below this value)
var minTotalSaturation = 60;
// Min total brightness
var minTotalBrightness = 130;
// Min hair brightness
var minHairBrightness = 40;
// Red, green and blue multipliers to be used on perceived brightness calculations
var redPBMultiplier = 0.241;
var greenPBMultiplier = 0.691;
var bluePBMultiplier = 0.068;
// Min and max shadow opacity
var minShadowOpacity = 0.075;
var maxShadowOpacity = 0.4
// Min and max for _blk29 tagged accessory opacity
var minBlk29AccessoryOpacity = 0.2
var maxBlk29AccessoryOpacity = 0.5
// Light-Dark switch for Natricon body (depends on perceived brightness of 0-100)
var lightToDarkSwitchPoint = 30
////////////////////////////////
// BODY COLOR PICKING PROCESS //
////////////////////////////////
// STEP 1 //
// Pick a random bodyRed value to satisfy 0 <= bodyRed <= 255
bodyRed = Math.floor(Math.random() * 256);
// STEP 1 //
// Pick a random bodyGreen value to satisfy 0 <= bodyRed <= 255
bodyGreen = Math.floor(Math.random() * 256);
// STEP 3 //
// Pick a random bodyBlue value between
Math.max(
Math.sqrt(
Math.max(
(minPerceivedBrightness255 * minPerceivedBrightness255 - redPBMultiplier * bodyRed * bodyRed - greenPBMultiplier * bodyGreen * bodyGreen) / bluePBMultiplier,
0
)
),
0
)
// and
Math.min(
Math.sqrt(
Math.max(
(maxPerceivedBrightness255 * maxPerceivedBrightness255 - redPBMultiplier * bodyRed * bodyRed - greenPBMultiplier * bodyGreen * bodyGreen) / bluePBMultiplier,
0
)
),
255
)
// STEP 4 //
// Convert these RGB values so that we have hairHue, hairSaturation and hairBrightness as well (to be used on hair color picking process)
// STEP 5 //
// Perceived brightness for body (0,255)
bodyPerceivedBrightness255 = Math.sqrt(redPBMultiplier * bodyRed * bodyRed + greenPBMultiplier * bodyGreen * bodyGreen + bluePBMultiplier * bodyBlue * bodyBlue);
// Perceived brightness for body (0,100)
bodyPerceivedBrightness = bodyPerceivedBrightness255 / 255 * 100;
////////////////////////////////
// BODY SHADOW OPACITY PICKING PROCESS //
////////////////////////////////
bodyShadowOpacity = minShadowOpacity + (1 - bodyPerceivedBrightness / 100) * (maxShadowOpacity - minShadowOpacity)
////////////////////////////////
// BLK29 ACCESSORY OPACITY PICKING PROCESS //
// If body is dark, just ignore this process all together
// With the accessories that have _blk29 tag, search for fill-opacity="0.299" and replace its opacity with blk29AccessoryOpacity
////////////////////////////////
blk29AccessoryOpacity = minBlk29AccessoryOpacity + (1 - bodyPerceivedBrightness / 100) * (maxBlk29AccessoryOpacity - minBlk29AccessoryOpacity)
////////////////////////////////
// HAIR COLOR PICKING PROCESS //
////////////////////////////////
// STEP 1 //
// Pick a random hair hue between
bodyHue - 180 - bodyAndHairHueDistance
// and
bodyHue - 180 + bodyAndHairHueDistance
if (hairHue < 0) {
hairHue += 360;
}
// STEP 2 //
// Pick a random hair saturation between
Math.max(minTotalSaturation - bodySaturation, 0) // When body saturation is high enough, hair saturation can end up being less than 0 here, so we're making sure that hair saturation's minimum value never goes below 0
// and
100
// STEP 3 //
// Pick a random hair brightness between
Math.min(Math.max(minTotalBrightness - bodyBrightness, minHairBrightness), 100) // When the perceived brightness of body is low enough, hair brightness can end up being more than 100 here, so we're making sure that hair brightness's minimum value never goes above 100
// and
hairSaturation > hairSaturationDynamicMin ? 100 : hairBrightnessDynamicMax
// STEP 4 //
// Convert these HSB values to RGB so that we have hairRed, hairGreen and hairBlue as well
// STEP 5 //
// Perceived brightness for hair (0,255)
hairPerceivedBrightness255 = Math.sqrt(redPBMultiplier * hairRed * hairRed + greenPBMultiplier * hairGreen * hairGreen + bluePBMultiplier * hairBlue * hairBlue);
// Perceived brightness for hair (0,100)
hairPerceivedBrightness = hairPerceivedBrightness255 / 255 * 100;
////////////////////////////////
// HAIR SHADOW OPACITY PICKING PROCESS //
////////////////////////////////
hairShadowOpacity = minShadowOpacity + (1 - hairPerceivedBrightness / 100) * (maxShadowOpacity - minShadowOpacity)