private void ProcessColors(Texture2D palette, int colorX, int colorY, Func <Color, Color, int, Color> action) { int x0, y0, x1, y1; PaletteEditMode mode = (PaletteEditMode)_guiEditMode.value; switch (mode) { default: case PaletteEditMode.Single: x0 = colorX; x1 = colorX + 1; y0 = colorY; y1 = colorY + 1; break; case PaletteEditMode.Row: x0 = 0; x1 = palette.width; y0 = colorY; y1 = colorY + 1; break; case PaletteEditMode.Column: x0 = colorX; x1 = colorX + 1; y0 = 0; y1 = palette.height; break; case PaletteEditMode.All: x0 = 0; x1 = palette.width; y0 = 0; y1 = palette.height; break; } int rootColorY = palette.height - 1; for (int y = y0; y < y1; y++) { for (int x = x0; x < x1; x++) { int shade = rootColorY - y; Color rootColor = palette.GetPixel(x, rootColorY); Color inputColor = palette.GetPixel(x, y); Color output = action(rootColor, inputColor, shade); palette.SetPixel(x, y, output); _guiColorFields[shade * palette.width + x].color = output; } } palette.Apply(); _paletteDirty = true; }
private void GenerateShadesClicked(GUIBase sender) { Texture2D texture = _guiTexture.texture; if (texture == null) { return; } if (IsTextureReadWrite(texture)) { Undo.RecordObject(texture, "Edit Palette"); int lastShadeIndex = texture.height - 1; float h = _guiHue.value; float s = _guiSaturation.value; float l = _guiLuminance.value; PaletteEditMode mode = (PaletteEditMode)_guiEditMode.value; if (mode == PaletteEditMode.Single || mode == PaletteEditMode.Row) { ProcessColors(texture, _selectedColorX, _selectedColorY, (root, input, shade) => { return(OffsetColorHSL(input, 1.0f, h, s, l)); }); } else { ProcessColors(texture, _selectedColorX, _selectedColorY, (root, input, shade) => { float a = (float)shade / (float)lastShadeIndex; return(OffsetColorHSL(root, a, h, s, l)); }); } } else { HandleTextureNotReadWrite(); } }