Цветовая палитра

Настройки:
"Панель управления" - "Шрифты", скопировать шрифт "Arial" в папку "Assets". В инспекторе Unity перенести шрифт "Arial" на переменную "TextFontStyle".
Создать папку "Resources" в папке "Assets" и перенести туда папку с изображениями "Colors".
Выделить изображения в инспекторе Unity и во вкладке "Advanced" поставить галочку "Read/Write".
Чтобы сжать изображения, выбрать в выпадающем списке "Non power of 2" -> "ToNearest". Применить "Apply"

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO; // Используем библиотеку ввода вывода
public class Draw_ColorPalette : MonoBehaviour {
[HideInInspector]
 public Texture2D VirtualBrightTexture; // Треугольник яркости
 [HideInInspector]
 public Texture2D VirtualDrawContrast; // Линии
 private Color[] ClearPixels1; // Для быстрой очистки изображений
 private Color brushColor,brushColor2; // цвет кисти
private Texture2D [] ChangeTexture; // Чтобы не создавать каждый раз новую текстуру
 private bool Options,Options2; // true- показать настройки
 private int iOptions; // Вывести элементы за пределы экрана
 private Rect boxOfGUI_Options; // Положение чекбокса - Показать настройки настройки
 private bool GUIStep1; 
private int Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast, // Яркость, Оттенок, Контрастность
 Main_NumOfBright2, Main_NumOfShade2, Main_NumOfShade3,
 Main_NumOfContrast2, Main_NumOfContrast3, // Яркость2, Оттенок2, Контрастность2
 Main_R, Main_G, Main_B, Main_R2, Main_G2, Main_B2;
// Переменные для отрисовки цветных треугольников ------------------------------------------------------------------  
 [HideInInspector]
 public Texture2D[] VirtualTexture; // копия изображений
 private int Q,i,j,Zazor,Xdraw,Ydraw;
 private float R,G,B,A,Zmax,E,E2,L2,D,D2,X2,RGBmax, RGBmin, RGBmid,Light,Light1,cW, Qt,Qq, Qp,Qrgbmax, Qrgbmin, Qrgbmid;
 // ------------------------------------------------------------------------------------------------------
// Для выбора цвета на изображении
 private Color Mouse_Color;
 private int Mouse_X, Mouse_Y, Mouse_InvertImageTop, Mouse_R, Mouse_G, Mouse_B,
 Mouse_InTriangle, // 1,3 - левая,правая кнопка была нажата на цветных треугольниках. 2,4 - левая,правая кнопка была нажата на треугольнике яркости. 0 - кнопка мыши не нажата
 Mouse_1,Mouse_Zazor, Mouse_Bright1, Mouse_Shade1, Mouse_Contrast1;
 private float Mouse_D, Mouse_Yout, Mouse_Lc;
private Texture2D MakeTex(int p, int width, int height, Color col) // Создать текстуру определенного цвета
 {
 Color[] pix = new Color[width*height];
 for(int i = 0; i < pix.Length; i++)
 pix[i] = col;
 ChangeTexture [p].Resize(width,height); // Чтобы не создавать каждый раз новую текстуру
 //Texture2D result = new Texture2D(width, height);
 ChangeTexture [p].SetPixels(pix);
 ChangeTexture [p].Apply();
 return ChangeTexture [p];
 }
// Кнопка /////////////////////////////////////////////
 private Rect boxOfGUI_Button_1; // Положение кнопки (+ оттенок)
 // Текстовые поля
 private GUIStyle largeFont_RGB; // Стиль текстовых полей RGB
 private bool RGB1_Changed; // Если RGB1 изменен
 private string sToEdit_Check_R1,sToEdit_Check_G1,sToEdit_Check_B1; // Для проверки изменения текста
 private string stringToEdit_R1; // Текст "R" (Указываемый цвет)
 private Rect boxOfGUI_Edit_R1; // Положение текстового поля "R" (Указываемый цвет)
 private string stringToEdit_G1; // Текст "G" (Указываемый цвет)
 private Rect boxOfGUI_Edit_G1; // Положение текстового поля "G" (Указываемый цвет)
 private string stringToEdit_B1; // Текст "B" (Указываемый цвет)
 private Rect boxOfGUI_Edit_B1; // Положение текстового поля "B" (Указываемый цвет)
 private string stringToEdit_R2; // Текст "R" (Результат)
 private Rect boxOfGUI_Edit_R2; // Положение текстового поля "R" (Результат)
 private string stringToEdit_G2; // Текст "G" (Результат)
 private Rect boxOfGUI_Edit_G2; // Положение текстового поля "G" (Результат)
 private string stringToEdit_B2; // Текст "B" (Результат)
 private Rect boxOfGUI_Edit_B2; // Положение текстового поля "B" (Результат)
 private string stringToEdit_PlusShade; // Текст (+ Оттенок)
 private Rect boxOfGUI_Edit_PlusShade; // Положение текстового поля  (+ Оттенок)
 private float R_timeLeft, G_timeLeft, B_timeLeft, PS_timeLeft; // Таймер чтобы не прокручивать значения слишком быстро
 // Изображения
 private GUIStyle styleColor_Image_1; // Изображение (Указываемый цвет)
 private GUIStyle styleColor_Image_2; // Изображение (Результат)
 private Rect boxOfGUI_Image_1; // Положение изображения (Указываемый цвет)
 private Rect boxOfGUI_Image_2; // Положение изображения (Результат)
 private GUIStyle Color_Image_1; // Изображение (цветные треугольники)
 private GUIStyle Color_Image_2; // Изображение (треугольник яркости)
 private GUIStyle Color_Image_3; // Изображение (линии)
 private Rect boxOfGUI_Image_3; // Положение изображений с треугольниками
 // Ползунки
 private Rect boxOfGUI_TrackBar_1; // Положение ползунка яркости (Указываемый цвет)
 private Rect boxOfGUI_TrackBar_2; // Положение ползунка оттенка (Указываемый цвет)
 private Rect boxOfGUI_TrackBar_3; // Положение ползунка контрастности (Указываемый цвет)
 private Rect boxOfGUI_TrackBar_4; // Положение ползунка яркости (Результат)
 private Rect boxOfGUI_TrackBar_5; // Положение ползунка оттенка (Результат)
 private Rect boxOfGUI_TrackBar_6; // Положение ползунка контрастности (Результат)
 float TrackBar_1, TrackBar_2, TrackBar_3, // Ползунки яркости, оттенка, контрастности (Указываемый цвет)
 TrackBar_4, TrackBar_5, TrackBar_6,       // Ползунки яркости, оттенка, контрастности (Результат)
 TrackBar_1_Check, TrackBar_2_Check, TrackBar_3_Check, // Для проверки изменения позиций (указать TrackBar_1_Check перед изменением TrackBar_1, чтобы не применять изменения)
 TrackBar_4_Check, TrackBar_5_Check, TrackBar_6_Check;
 private float TrackBar_1_timeLeft, TrackBar_2_timeLeft, TrackBar_3_timeLeft,
 TrackBar_4_timeLeft, TrackBar_5_timeLeft, TrackBar_6_timeLeft; // Таймер чтобы не прокручивать значения слишком быстро
 private bool TrackBar_WheelChanged; // true - TrackBar изменен колесиком мыши
 // Label
 private GUIStyle styleColor_Label; // Стиль
 private GUIStyle styleColor_Label_4; // Стиль
 private Rect boxOfGUI_Label_1; // Положение Label - яркость RGB (Указываемый цвет)
 private Rect boxOfGUI_Label_2; // Положение Label - оттенок RGB (Указываемый цвет)
 private Rect boxOfGUI_Label_3; // Положение Label - контрастность RGB (Указываемый цвет)
 private Rect boxOfGUI_Label_4; // Положение Label - RGB (Указываемый цвет)
 private Rect boxOfGUI_Label_5; // Положение Label - яркость RGB (Результат)
 private Rect boxOfGUI_Label_6; // Положение Label - оттенок RGB (Результат)
 private Rect boxOfGUI_Label_7; // Положение Label - контрастность RGB (Результат)
 private Rect boxOfGUI_Label_8; // Положение Label - RGB (Результат)
 // Чекбоксы
 private bool CheckBox_1, // true - не сохранять пропорции (яркость - контрастность) , false - сохранять пропорции        
 CheckBox_2, // true - рисовать линию контрастности на треугольнике с яркостью
 CheckBox_3, // true - рисовать точку на треугольнике яркости
 CheckBox_4, // true - рисовать, ч/б линию яркости , под треугольником яркости
 CheckBox_5, // true - рисовать линию контрастности на цветных треугольниках
 CheckBox_6, // true - рисовать точку на цветных треугольниках
 CheckBox_7, // true - заполнить квадрат с цветом
 CheckBox_Even, // true - четная яркость
 CheckBox_Odd; // true - нечетная яркость (если Even и Odd = false, то учитываются все виды яркости)
 private Rect boxOfGUI_CheckBox_1; // Положение чекбокса - Не сохранять пропорции (яркость - контрастность)
 private Rect boxOfGUI_CheckBox_2; // Положение чекбокса - Линия контрастности на треугольнике яркости
 private Rect boxOfGUI_CheckBox_3; // Положение чекбокса - Точка на треугольнике яркости
 private Rect boxOfGUI_CheckBox_4; // Положение чекбокса - Ч/б линия, под треугольником яркости
 private Rect boxOfGUI_CheckBox_5; // Положение чекбокса - Линия контраст. на цветных треугольниках
 private Rect boxOfGUI_CheckBox_6; // Положение чекбокса - Точка на цветных треугольниках
 private Rect boxOfGUI_CheckBox_7; // Положение чекбокса - Заполнять квадрат с цветом
 private Rect boxOfGUI_CheckBox_Even; // Положение чекбокса - Четная яркость
 private Rect boxOfGUI_CheckBox_Odd; // Положение чекбокса - Нечетная яркость
 ///////////////////////////////////////////////////////////////
// (Не обязательно) Для отображения кириллицы в WebGL (Перенести файл шрифт Windows типа "Arial" в папку "Assets" и прикрепить к переменной)
 public Font TextFontStyle;
void OnGUI () {
if (GUIStep1 == false) {
 GUIStep1 = true;
VirtualTexture = new Texture2D[509]; // копия изображений
stringToEdit_R1 = "127"; // Текст "R" (Указываемый цвет)
 stringToEdit_G1 = "0"; // Текст "G" (Указываемый цвет)
 stringToEdit_B1 = "0"; // Текст "B" (Указываемый цвет)
 stringToEdit_R2 = "127"; // Текст "R" (Результат)
 stringToEdit_G2 = "0"; // Текст "G" (Результат)
 stringToEdit_B2 = "0"; // Текст "B" (Результат)
 stringToEdit_PlusShade = "1"; // Текст (+ Оттенок)
iOptions = 0; // Вывести элементы за пределы экрана
 boxOfGUI_Image_3 = new Rect (10, 220, 514, 259); // Положение изображений с треугольниками
 boxOfGUI_Options = new Rect (10, 550, 280, 25); // Положение чекбокса - Показать настройки настройки
Mouse_InvertImageTop = Mathf.FloorToInt (Screen.height - boxOfGUI_Image_3.yMin) + 2; // "Y" позиция изображения с треугольниками, относительно верхней части экрана
// Кнопка /////////////////////////////////////////////
 boxOfGUI_Button_1 = new Rect (600 + iOptions, 160, 80, 30); // Положение кнопки (+ оттенок)
 // Текстовые поля
 boxOfGUI_Edit_R1 = new Rect (328 + iOptions, 23, 40, 20); // Положение текстового поля "R" (Указываемый цвет)
 boxOfGUI_Edit_G1 = new Rect (392 + iOptions, 23, 40, 20); // Положение текстового поля "G" (Указываемый цвет)
 boxOfGUI_Edit_B1 = new Rect (457 + iOptions, 23, 40, 20); // Положение текстового поля "B" (Указываемый цвет)
 boxOfGUI_Edit_R2 = new Rect (38 + iOptions, 168, 40, 20); // Положение текстового поля "R" (Результат)
 boxOfGUI_Edit_G2 = new Rect (102 + iOptions, 168, 40, 20); // Положение текстового поля "G" (Результат)
 boxOfGUI_Edit_B2 = new Rect (167 + iOptions, 168, 40, 20); // Положение текстового поля "B" (Результат)
 boxOfGUI_Edit_PlusShade = new Rect (540 + iOptions, 165, 50, 20); // Положение текстового поля  (+ Оттенок)
 // Изображения
 boxOfGUI_Image_1 = new Rect (328 + iOptions, 53, 169, 70); // Положение изображения (Указываемый цвет)
 boxOfGUI_Image_2 = new Rect (328 + iOptions, 122, 169, 70); // Положение изображения (Результат)
 // Ползунки
 boxOfGUI_TrackBar_1 = new Rect (540 + iOptions, 40, 211, 22); // Положение ползунка яркости (Указываемый цвет)
 boxOfGUI_TrackBar_2 = new Rect (540 + iOptions, 89, 211, 22); // Положение ползунка оттенка (Указываемый цвет)
 boxOfGUI_TrackBar_3 = new Rect (540 + iOptions, 131, 211, 22); // Положение ползунка контрастности (Указываемый цвет)
 boxOfGUI_TrackBar_4 = new Rect (32 + iOptions, 40, 211, 22); // Положение ползунка яркости (Результат)
 boxOfGUI_TrackBar_5 = new Rect (32 + iOptions, 89, 211, 22); // Положение ползунка оттенка (Результат)
 boxOfGUI_TrackBar_6 = new Rect (32 + iOptions, 131, 211, 22); // Положение ползунка контрастности (Результат)
 // Label
 boxOfGUI_Label_1 = new Rect (540 + iOptions, 14, 156, 23); // Положение Label - яркость RGB (Указываемый цвет)
 boxOfGUI_Label_2 = new Rect (540 + iOptions, 62, 119, 23); // Положение Label - оттенок RGB (Указываемый цвет)
 boxOfGUI_Label_3 = new Rect (540 + iOptions, 107, 140, 23); // Положение Label - контрастность RGB (Указываемый цвет)
 boxOfGUI_Label_4 = new Rect (340 + iOptions, 7, 145, 13); // Положение Label - RGB (Указываемый цвет)
 boxOfGUI_Label_5 = new Rect (32 + iOptions, 14, 156, 23); // Положение Label - яркость RGB (Результат)
 boxOfGUI_Label_6 = new Rect (32 + iOptions, 62, 119, 23); // Положение Label - оттенок RGB (Результат)
 boxOfGUI_Label_7 = new Rect (32 + iOptions, 107, 140, 23); // Положение Label - контрастность RGB (Результат)
 boxOfGUI_Label_8 = new Rect (50 + iOptions, 151, 145, 13); // Положение Label - RGB (Результат)
 // Чекбоксы
 boxOfGUI_CheckBox_1 = new Rect (38 + iOptions, 200, 280, 25); // Положение чекбокса - Не сохранять пропорции (яркость - контрастность)
 boxOfGUI_CheckBox_2 = new Rect (10 + iOptions, 490, 260, 25); // Положение чекбокса - Линия контрастности на треугольнике яркости
 boxOfGUI_CheckBox_3 = new Rect (10 + iOptions, 510, 260, 25); // Положение чекбокса - Точка на треугольнике яркости
 boxOfGUI_CheckBox_4 = new Rect (10 + iOptions, 530, 260, 25); // Положение чекбокса - Ч/б линия, под треугольником яркости
 boxOfGUI_CheckBox_5 = new Rect (280 + iOptions, 490, 260, 25); // Положение чекбокса - Линия контраст. на цветных треугольниках
 boxOfGUI_CheckBox_6 = new Rect (280 + iOptions, 510, 260, 25); // Положение чекбокса - Точка на цветных треугольниках
 boxOfGUI_CheckBox_7 = new Rect (280 + iOptions, 530, 260, 25); // Положение чекбокса - Заполнять квадрат с цветом
 boxOfGUI_CheckBox_Even = new Rect (250 + iOptions, 14, 100, 25); // Положение чекбокса - Четная яркость
 boxOfGUI_CheckBox_Odd = new Rect (250 + iOptions, 39, 100, 25); // Положение чекбокса - Нечетная яркость 
 ///////////////////////////////////////////////////////////////
Options = true; // true- показать настройки
 Options2 = true; // true- показать настройки
 iOptions = -1000; // Вывести элементы за пределы экрана
 boxOfGUI_Options = new Rect (10, 550, 280, 25); // Положение чекбокса - Показать настройки настройки
ChangeTexture = new Texture2D[12]; // Чтобы не создавать каждый раз новую текстуру
 for (int i = 0; i < 12; i++) {
 ChangeTexture [i] = new Texture2D (1, 1); // Чтобы не создавать каждый раз новую текстуру
 ChangeTexture [i].filterMode = FilterMode.Point; // Для четкой отрисовки     
//ChangeTexture [i] = new Texture2D (1, 1,TextureFormat.RGB565, false); // Чтобы не создавать каждый раз новую текстуру
 //ChangeTexture [i].filterMode = FilterMode.Point; // Для четкой отрисовки     
 }
largeFont_RGB = new GUIStyle ("textField"); // Стиль текстовых полей RGB
 largeFont_RGB.font = TextFontStyle; // Для отображения кириллицы в WebGL
 styleColor_Image_1 = new GUIStyle ("textField"); // Изображение (Указываемый цвет)
 styleColor_Image_1.font = TextFontStyle; // Для отображения кириллицы в WebGL
 styleColor_Image_2 = new GUIStyle ("textField"); // Изображение (Результат)
 styleColor_Image_2.font = TextFontStyle; // Для отображения кириллицы в WebGL
 Color_Image_1 = new GUIStyle ("textField"); // Изображение (цветные треугольники)
 Color_Image_1.font = TextFontStyle; // Для отображения кириллицы в WebGL
 Color_Image_2 = new GUIStyle ("textField"); // Изображение (треугольник яркости)
 Color_Image_2.font = TextFontStyle; // Для отображения кириллицы в WebGL
 Color_Image_3 = new GUIStyle ("textField"); // Изображение (линии)
 Color_Image_3.font = TextFontStyle; // Для отображения кириллицы в WebGL
 styleColor_Label = new GUIStyle ("textField"); // Стиль
 styleColor_Label.font = TextFontStyle; // Для отображения кириллицы в WebGL
 styleColor_Label_4 = new GUIStyle ("textField"); // Стиль
 styleColor_Label_4.font = TextFontStyle; // Для отображения кириллицы в WebGL
 GUI.skin.toggle.font = TextFontStyle; // Для отображения кириллицы в WebGL
Mouse_InvertImageTop = Mathf.FloorToInt (Screen.height - boxOfGUI_Image_3.yMin) + 2; // "Y" позиция изображения с треугольниками, относительно верхней части экрана
if ((Resources.Load<Texture2D>("Colors/0")==null) &  // Если файл не найден, в ресурсах
 (File.Exists ("Colors/0.png")==null))  // Если файл не найден, в папке с проектом  
 CreateBrightTriangles (); // Создать цветные треугольники
//VirtualBrightTexture = new Texture2D (514, 259); // Треугольник яркости
 //VirtualBrightTexture.filterMode = FilterMode.Point; // Для четкой отрисовки 
 //VirtualDrawContrast = new Texture2D (514, 259); // Линии
 //VirtualDrawContrast.filterMode = FilterMode.Point;
VirtualBrightTexture = new Texture2D (514, 259,TextureFormat.RGB565, false); // Треугольник яркости
 VirtualDrawContrast = new Texture2D (514, 259,TextureFormat.RGB565, false); // Линии
// Очистить изображения
 VirtualBrightTexture = MakeTex (0, 514, 259, new Color (1, 1, 1, 0));
 VirtualDrawContrast = MakeTex (1, 514, 259, new Color (1, 1, 1, 0));
ClearPixels1 = VirtualBrightTexture.GetPixels (0, 0, 514, 259); // Для быстрой очистки изображений
CheckBox_1 = false; // true - не сохранять пропорции (яркость - контрастность) , false - сохранять пропорции
 CheckBox_2 = true; // true - рисовать линию контрастности на треугольнике с яркостью
 CheckBox_3 = true; // true - рисовать точку на треугольнике яркости
 CheckBox_4 = true; // true - рисовать, ч/б линию яркости , под треугольником яркости
 CheckBox_5 = true; // true - рисовать линию контрастности на цветных треугольниках
 CheckBox_6 = true; // true - рисовать точку на цветных треугольниках
 CheckBox_7 = true; // true - заполнить квадрат с цветом
 CheckBox_Even = false; // true - четная яркость
 CheckBox_Odd = false; // true - нечетная яркость (если Even и Odd = false, то учитываются все виды яркости)
Main_NumOfBright = 254; // Яркость
 Main_NumOfShade = 128;  // Оттенок
 Main_NumOfContrast = 0; // Контрастность
 Main_NumOfBright2 = 254; // Яркость2
 Main_NumOfShade2 = 128;  // Оттенок2
 Main_NumOfContrast2 = 0; // Контрастность2
 Main_NumOfShade3 = 128;  // Оттенок2 (для контрастности)
 Main_NumOfContrast3 = 0; // Контрастность2 (для яркости)
Main_R = 255;
 Main_G = 0;
 Main_B = 0;
 Main_R2 = 255;
 Main_G2 = 0;
 Main_B2 = 0;
TrackBar_1 = 254; // Яркость
 TrackBar_2 = 128;  // Оттенок
 TrackBar_3 = 0; // Контрастность
 TrackBar_4 = 254; // Яркость2
 TrackBar_5 = 128;  // Оттенок2
 TrackBar_6 = 0; // Контрастность2
TrackBar_1_Check = TrackBar_1;
 TrackBar_2_Check = TrackBar_2;
 TrackBar_3_Check = TrackBar_3;
 TrackBar_4_Check = TrackBar_4;
 TrackBar_5_Check = TrackBar_5;
 TrackBar_6_Check = TrackBar_6;
// Стиль для текстовых полей 
 largeFont_RGB.normal.background = MakeTex (2, 130, 70, new Color (1, 1, 1, 1));
 largeFont_RGB.fontSize = 14;
 largeFont_RGB.normal.textColor = Color.black;
 styleColor_Label.normal.background = MakeTex (3, 130, 70, new Color (1, 1, 1, 1));
 styleColor_Label.fontSize = 14;
 styleColor_Label.normal.textColor = Color.black;
 styleColor_Label_4.normal.background = MakeTex (4, 130, 70, new Color (1, 1, 1, 1));
 styleColor_Label_4.fontSize = 9;
 styleColor_Label_4.normal.textColor = Color.black;
// Нарисовать треугольник яркости
 DrawBrightTriangle (Main_NumOfBright2, Main_NumOfBright2, Main_NumOfShade2,
 Main_NumOfContrast2, Main_NumOfContrast2);
 }
// Текстовые поля /////////////////////////////////////////////
// Текстовые поля "RGB" (Указываемый цвет)
 stringToEdit_R1 = GUI.TextField (boxOfGUI_Edit_R1, Main_R.ToString(), 3, largeFont_RGB);  
 stringToEdit_G1 = GUI.TextField (boxOfGUI_Edit_G1, Main_G.ToString(), 3, largeFont_RGB);  
 stringToEdit_B1 = GUI.TextField (boxOfGUI_Edit_B1, Main_B.ToString(), 3, largeFont_RGB);  
 // Текстовые поля "RGB" (Результат)
 stringToEdit_R2 = GUI.TextField (boxOfGUI_Edit_R2, Main_R2.ToString(), 3, largeFont_RGB);  
 stringToEdit_G2 = GUI.TextField (boxOfGUI_Edit_G2, Main_G2.ToString(), 3, largeFont_RGB);  
 stringToEdit_B2 = GUI.TextField (boxOfGUI_Edit_B2, Main_B2.ToString(), 3, largeFont_RGB);  
 // Текстовое поле (+ Оттенок)
 stringToEdit_PlusShade = GUI.TextField (boxOfGUI_Edit_PlusShade, stringToEdit_PlusShade, 5, largeFont_RGB);  
if (boxOfGUI_Edit_R1.Contains (Event.current.mousePosition)) { // Если курсор над R1
 if (Time.fixedTime > R_timeLeft) {
 if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
 R_timeLeft = Time.fixedTime + 0.01f; 
 if (Main_R < 255) {
 Main_R = Main_R + 1;
 stringToEdit_R1 = GUI.TextField (boxOfGUI_Edit_R1, Main_R.ToString (), 15, largeFont_RGB);  
 RGB1_Changed = true; // true - RGB1 изменен
 }
 } else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
 R_timeLeft = Time.fixedTime + 0.01f;  
 if (Main_R > 0) {     
 Main_R = Main_R - 1;
 stringToEdit_R1 = GUI.TextField (boxOfGUI_Edit_R1, Main_R.ToString (), 15, largeFont_RGB);  
 RGB1_Changed = true; // true - RGB1 изменен
 }
 }
 }
 }
 else
 if (boxOfGUI_Edit_G1.Contains (Event.current.mousePosition)) { // Если курсор над G1
 if (Time.fixedTime > G_timeLeft) {
 if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
 G_timeLeft = Time.fixedTime + 0.01f; 
 if (Main_G < 255) {
 Main_G = Main_G + 1;
 stringToEdit_G1 = GUI.TextField (boxOfGUI_Edit_G1, Main_G.ToString (), 15, largeFont_RGB);  
 RGB1_Changed = true; // true - RGB1 изменен
 }
 } else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
 G_timeLeft = Time.fixedTime + 0.01f;  
 if (Main_G > 0) {     
 Main_G = Main_G - 1;
 stringToEdit_G1 = GUI.TextField (boxOfGUI_Edit_G1, Main_G.ToString (), 15, largeFont_RGB);  
 RGB1_Changed = true; // true - RGB1 изменен
 }
 }
 }
 }
 else
 if (boxOfGUI_Edit_B1.Contains (Event.current.mousePosition)) { // Если курсор над B1
 if (Time.fixedTime > B_timeLeft) {
 if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
 B_timeLeft = Time.fixedTime + 0.01f; 
 if (Main_B < 255) {
 Main_B = Main_B + 1;
 stringToEdit_B1 = GUI.TextField (boxOfGUI_Edit_B1, Main_B.ToString (), 15, largeFont_RGB);  
 RGB1_Changed = true; // true - RGB1 изменен
 }
 } else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
 B_timeLeft = Time.fixedTime + 0.01f;  
 if (Main_B > 0) {     
 Main_B = Main_B - 1;
 stringToEdit_B1 = GUI.TextField (boxOfGUI_Edit_B1, Main_B.ToString (), 15, largeFont_RGB);  
 RGB1_Changed = true; // true - RGB1 изменен
 }
 }
 }
 }    
 else
 if (boxOfGUI_Edit_PlusShade.Contains (Event.current.mousePosition)) { // Если курсор над (+ Оттенок)
 if (Time.fixedTime > PS_timeLeft) {
 if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
 PS_timeLeft = Time.fixedTime + 0.01f; 
 int textnumber1;
 int.TryParse(stringToEdit_PlusShade, out textnumber1); // Строку в число
 if (textnumber1 < 1529) {
 textnumber1 = textnumber1 + 1;
 stringToEdit_PlusShade = GUI.TextField (boxOfGUI_Edit_PlusShade, textnumber1.ToString (), 5, largeFont_RGB);  
 }
 } else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
 PS_timeLeft = Time.fixedTime + 0.01f;  
 int textnumber1;
 int.TryParse(stringToEdit_PlusShade, out textnumber1); // Строку в число
 if (textnumber1 > -1529) {     
 textnumber1 = textnumber1 - 1;
 stringToEdit_PlusShade = GUI.TextField (boxOfGUI_Edit_PlusShade, textnumber1.ToString (), 5, largeFont_RGB);  
 }
 }
 }
 }
// Изображения /////////////////////////////////////////////
GUI.Label (boxOfGUI_Image_1, "", styleColor_Image_1); // Изображение (Указываемый цвет)
 GUI.Label (boxOfGUI_Image_2, "", styleColor_Image_2); // Изображение (Результат)
 // Изображения /////////////////////////////////////////////
 GUI.Label (boxOfGUI_Image_3, "", Color_Image_1); // Цветные треугольники
 GUI.Label (boxOfGUI_Image_3, "", Color_Image_2); // Треугольник яркости
 GUI.Label (boxOfGUI_Image_3, "", Color_Image_3); // Линии
if (boxOfGUI_Image_3.Contains (Event.current.mousePosition)) { // Если курсор над Color_Image_3
if (Input.GetMouseButton (0)) { // Если зажата левая кнопка мыши
 Mouse_1 = 1;
 } else if (Input.GetMouseButton (1)) { // Если зажата правая кнопка мыши
 Mouse_1 = 3;
 } else {
 Mouse_1 = 0;
 }
if ((Mouse_1 > 0)) {
 Mouse_X = Mathf.FloorToInt (Input.mousePosition.x - boxOfGUI_Image_3.xMin); // X относительно изображения
 Mouse_Y = Mathf.FloorToInt (Mouse_InvertImageTop - Input.mousePosition.y); // Y относительно изображения
 if (Mouse_X < 0)
 Mouse_X = 0;
 if (Mouse_Y < 0)
 Mouse_Y = 0;
 if (Mouse_X > 513)
 Mouse_X = 513;
 if (Mouse_Y > 258)
 Mouse_X = 258;
if (Mouse_InTriangle == 0) {
 Mouse_Bright1 = Main_NumOfBright2; // Яркость (от 0 до 508)
Mouse_Zazor = 1;  // Устанавливаем зазор
 Mouse_D = ((Mouse_Bright1 / 2f) - Mathf.FloorToInt (Mouse_Bright1 / 2f)) * 2; // Четная (D=0) или нечетная (D=1) яркость
 // ТРЕУГОЛЬНИК ЯРКОСТИ
 // Если Mouse_Y>127 то Mouse_Yout=0, если Mouse_Y<=127 то Mouse_Yout=1
 Mouse_Yout = (1 - Mathf.CeilToInt (Mathf.FloorToInt (Mouse_Y / 128f) / 10f));
 // Определяем положение треугольника, если Mouse_Lc=1, то координаты в пределах
 // треугольника яркости, если Mouse_Lc=0 - за пределами
 Mouse_Lc = (1 - Mathf.CeilToInt (Mathf.FloorToInt (Mathf.Abs ((Mouse_X - 128 - Mouse_D * (2 - Mathf.FloorToInt (Mouse_X / 257f) * Mouse_D) - Mouse_Zazor) - 127) / (Mouse_Y + 1)) / 1530f)) * Mouse_Yout;
Mouse_InTriangle = Mathf.FloorToInt (Mouse_1 + Mouse_Lc); //1,3 - левая,правая кнопка была нажата на цветных треугольниках. 2,4 - левая,правая кнопка была нажата на треугольнике яркости. 0 - кнопка мыши не нажата
 }
if (Mouse_1 == 1) { // Если левая кнопка мыши
 if (Mouse_InTriangle == 1) { // Если цветные треугольники
 Mouse_Color = Color_Image_1.normal.background.GetPixel (Mouse_X, 258 - Mouse_Y); // цвет кисти  
 Mouse_R = Mathf.FloorToInt (Mouse_Color.r * 255);
 Mouse_G = Mathf.FloorToInt (Mouse_Color.g * 255);
 Mouse_B = Mathf.FloorToInt (Mouse_Color.b * 255);
if ((Mouse_R != Mouse_G) | (Mouse_R != Mouse_B)) { // Исключить прозрачный цвет
 // Яркость, оттенок, контрастность, по RGB - Delphi
 BSC_ByRGB (Mouse_R, Mouse_G, Mouse_B, out Mouse_Bright1, out Mouse_Shade1, out Mouse_Contrast1);
if (//((TrackBar_5_Check != TrackBar_5) | (TrackBar_6_Check != TrackBar_6)) & // Если Яркость, оттенок, контрастность меняются вручную
 ((Mouse_Shade1 != Main_NumOfShade2) |
 (Mouse_Contrast1 != Main_NumOfContrast2))) { // Выполнить процедуру только 1 раз        
 TrackBar_5_Check = Mouse_Shade1;
 TrackBar_6_Check = Mouse_Contrast1;
 TrackBar_5 = Mouse_Shade1;
 TrackBar_6 = Mouse_Contrast1;
// Поменять цвет RGB - Delphi
 Change_RGB (Main_R, Main_G, Main_B,
 Main_NumOfBright2, Main_NumOfBright2,
 Main_NumOfShade2, Mouse_Shade1,
 Main_NumOfContrast2,
 out Main_R2, out Main_G2, out Main_B2);
Main_NumOfShade2 = Mouse_Shade1; // Оттенок
 Main_NumOfContrast2 = Mouse_Contrast1; // Контрастность
Show_Changed_Color (); // Установить значения нижних текстовых полей
 }
 }
} else if (Mouse_InTriangle == 2) { // Если треугольник яркости
 Mouse_D = ((Main_NumOfBright2 / 2f) - Mathf.FloorToInt (Main_NumOfBright2 / 2f)); // Четная (Mouse_D=0) или нечетная (Mouse_D=1) яркость
if ((Mouse_X <= (129 + Mouse_D * 2)))
 Mouse_Bright1 = Mathf.FloorToInt (0 + Mouse_D * 2);
 else if ((Mouse_X >= (384 + Mouse_D * 2)))
 Mouse_Bright1 = Mathf.FloorToInt (508 - Mouse_D * 2);
 else
 Mouse_Bright1 = Mathf.FloorToInt ((Mathf.Abs (Mouse_X - (129 + Mouse_D * 2)) - Mouse_D) * 2); // Яркость (от 0 до 508)
if (//(TrackBar_4_Check != TrackBar_4) & // Если Яркость, оттенок, контрастность меняются вручную
 (Mouse_Bright1 != Main_NumOfBright2)) { // Выполнить процедуру только 1 раз       
 TrackBar_4_Check = Mouse_Bright1;
 TrackBar_4 = Mouse_Bright1;
// Поменять цвет RGB - Delphi
 Change_RGB (Main_R, Main_G, Main_B,
 Main_NumOfBright2, Mouse_Bright1,
 Main_NumOfShade3, Main_NumOfShade3,
 Main_NumOfContrast3,
 out Main_R2, out Main_G2, out Main_B2);
Main_NumOfBright2 = Mouse_Bright1; // Яркость
Show_Changed_Color (); // Установить значения нижних текстовых полей
 }
 }
 } else { // Если правая кнопка мыши
 if (Mouse_InTriangle == 3) { // Если цветные треугольники
 Mouse_Color = Color_Image_1.normal.background.GetPixel (Mouse_X, 258 - Mouse_Y); // цвет кисти  
 Mouse_R = Mathf.FloorToInt (Mouse_Color.r * 255);
 Mouse_G = Mathf.FloorToInt (Mouse_Color.g * 255);
 Mouse_B = Mathf.FloorToInt (Mouse_Color.b * 255);
if ((Mouse_R != Mouse_G) | (Mouse_R != Mouse_B)) { // Исключить прозрачный цвет
 Main_R = Mouse_R;
 Main_G = Mouse_G;
 Main_B = Mouse_B;
 sToEdit_Check_R1 = Main_R.ToString ();
 sToEdit_Check_G1 = Main_G.ToString ();
 sToEdit_Check_B1 = Main_B.ToString ();
 stringToEdit_R1 = Main_R.ToString ();
 stringToEdit_G1 = Main_G.ToString ();
 stringToEdit_B1 = Main_B.ToString ();
Find_BSC_AndMake_TheSameColor (); // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 }
} else if (Mouse_InTriangle == 4) { // Если треугольник яркости
Mouse_D = ((Main_NumOfBright2 / 2f) - Mathf.FloorToInt (Main_NumOfBright2 / 2f)); // Четная (Mouse_D=0) или нечетная (Mouse_D=1) яркость
if (Mouse_X <= (129 + Mouse_D * 2))
 Mouse_Bright1 = Mathf.FloorToInt (0 + Mouse_D * 2);
 else if (Mouse_X >= (384 + Mouse_D * 2))
 Mouse_Bright1 = Mathf.FloorToInt (508 - Mouse_D * 2);
 else
 Mouse_Bright1 = Mathf.FloorToInt ((Mathf.Abs (Mouse_X - (129 + Mouse_D * 2)) - Mouse_D) * 2); // Яркость (от 0 до 508)
if (Mouse_Y > 127)
 Mouse_Contrast1 = 127;
 else {
 Mouse_Contrast1 = 127 - (Mathf.FloorToInt (Mathf.Abs (127 - Mathf.Abs ((127 - (Mouse_Bright1 / 2f)) - Mouse_D)))); // Максимальное количество рядов, на заданной яркости 'Mouse_Bright1/2f'
 }
// Найти RGB по яркости, оттенку и контрастности - Delphi
 RGB_ByBSC (Mouse_Bright1, Main_NumOfShade3, Mouse_Contrast1, out Main_R, out Main_G, out Main_B);
if (//((TrackBar_1_Check != TrackBar_1) | (TrackBar_4_Check != TrackBar_4)) & // Если Яркость, оттенок, контрастность меняются вручную
 (Mouse_Bright1 != Main_NumOfBright2)) { // Выполнить процедуру только 1 раз       
 TrackBar_1_Check = Mouse_Bright1;
 TrackBar_4_Check = Mouse_Bright1;
 TrackBar_1 = Mouse_Bright1;
 TrackBar_4 = Mouse_Bright1;
// Поменять цвет RGB - Delphi
 Change_RGB (Main_R, Main_G, Main_B,
 Main_NumOfBright2, Mouse_Bright1,
 Main_NumOfShade3, Main_NumOfShade3,
 Mouse_Contrast1,
 out Main_R2, out Main_G2, out Main_B2);
Main_NumOfBright2 = Mouse_Bright1; // Яркость
Main_R = Main_R2;
 Main_G = Main_G2;
 Main_B = Main_B2;
 sToEdit_Check_R1 = Main_R2.ToString ();
 sToEdit_Check_G1 = Main_G2.ToString ();
 sToEdit_Check_B1 = Main_B2.ToString ();
 stringToEdit_R1 = Main_R2.ToString ();
 stringToEdit_G1 = Main_G2.ToString ();
 stringToEdit_B1 = Main_B2.ToString ();
 stringToEdit_R2 = Main_R2.ToString ();
 stringToEdit_G2 = Main_G2.ToString ();
 stringToEdit_B2 = Main_B2.ToString ();
Main_NumOfBright = Main_NumOfBright2;
 Main_NumOfShade = Main_NumOfShade2;
 Main_NumOfContrast = Main_NumOfContrast2;
styleColor_Image_1.normal.background = MakeTex (6, 
 Mathf.FloorToInt (boxOfGUI_Image_1.width), Mathf.FloorToInt (boxOfGUI_Image_1.height), 
 new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f)); // Заполнить изображение 1 цветом R,G,B
Show_Changed_Color (); // Установить значения нижних текстовых полей
 }
 }
 }
 } else
 Mouse_InTriangle = 0; //1,3 - левая,правая кнопка была нажата на цветных треугольниках. 2,4 - левая,правая кнопка была нажата на треугольнике яркости. 0 - кнопка мыши не нажата
 }
 // Ползунки /////////////////////////////////////////////
 TrackBar_1 = GUI.HorizontalSlider (boxOfGUI_TrackBar_1, TrackBar_1, 0.0F, 508.0F); // Ползунок яркости (Указываемый цвет)
 TrackBar_2 = GUI.HorizontalSlider (boxOfGUI_TrackBar_2, TrackBar_2, 0.0F, 1531.0F); // Ползунок оттенка (Указываемый цвет)
 TrackBar_3 = GUI.HorizontalSlider (boxOfGUI_TrackBar_3, TrackBar_3, 0.0F, 127.0F); // Ползунок контрастности (Указываемый цвет)
 TrackBar_4 = GUI.HorizontalSlider (boxOfGUI_TrackBar_4, TrackBar_4, 0.0F, 508.0F); // Ползунок яркости (Результат)
 TrackBar_5 = GUI.HorizontalSlider (boxOfGUI_TrackBar_5, TrackBar_5, 0.0F, 1531.0F); // Ползунок оттенка (Результат)
 TrackBar_6 = GUI.HorizontalSlider (boxOfGUI_TrackBar_6, TrackBar_6, 0.0F, 127.0F); // Ползунок контрастности (Результат)
if (boxOfGUI_TrackBar_1.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_1
 if (Time.fixedTime > TrackBar_1_timeLeft) {
 if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
 TrackBar_1_timeLeft = Time.fixedTime + 0.01f; 
 if (TrackBar_1 > 0) {     
 TrackBar_1 = TrackBar_1 - 1;
 if ((CheckBox_Even) | (CheckBox_Odd))   // Если нужна только четная или нечетная яркость       
 TrackBar_1 = TrackBar_1 - 1;
 TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
 }
 } else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
 TrackBar_1_timeLeft = Time.fixedTime + 0.01f;  
 if (TrackBar_1 < 508) {
 TrackBar_1 = TrackBar_1 + 1;
 if ((CheckBox_Even) | (CheckBox_Odd))  // Если нужна только четная или нечетная яркость       
 TrackBar_1 = TrackBar_1 + 1;
 TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
 }
 }
 } 
 }
 else
 if (boxOfGUI_TrackBar_2.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_2
 if (Time.fixedTime > TrackBar_2_timeLeft) {
 if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
 TrackBar_2_timeLeft = Time.fixedTime + 0.01f; 
 if (TrackBar_2 > 0) {     
 TrackBar_2 = TrackBar_2 - 1;
 TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
 }
 }  else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
 TrackBar_2_timeLeft = Time.fixedTime + 0.01f;  
 if (TrackBar_2 < 1531) {
 TrackBar_2 = TrackBar_2 + 1;
 TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
 }
 }
 } 
 }
 else
 if (boxOfGUI_TrackBar_3.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_3
 if (Time.fixedTime > TrackBar_3_timeLeft) {
 if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
 TrackBar_3_timeLeft = Time.fixedTime + 0.01f; 
 if (TrackBar_3 > 0) {     
 TrackBar_3 = TrackBar_3 - 1;
 TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
 }
 }  else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
 TrackBar_3_timeLeft = Time.fixedTime + 0.01f;  
 if (TrackBar_3 < 127) {
 TrackBar_3 = TrackBar_3 + 1;
 TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
 }
 }
 } 
 }
 else
 if (boxOfGUI_TrackBar_4.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_4
 if (Time.fixedTime > TrackBar_4_timeLeft) {
 if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
 TrackBar_4_timeLeft = Time.fixedTime + 0.01f; 
 if (TrackBar_4 > 0) {     
 TrackBar_4 = TrackBar_4 - 1;
 if ((CheckBox_Even) | (CheckBox_Odd))  // Если нужна только четная или нечетная яркость       
 TrackBar_4 = TrackBar_4 - 1;
 TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
 }
 }  else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
 TrackBar_4_timeLeft = Time.fixedTime + 0.01f;  
 if (TrackBar_4 < 508) {
 TrackBar_4 = TrackBar_4 + 1;
 if ((CheckBox_Even) | (CheckBox_Odd))  // Если нужна только четная или нечетная яркость       
 TrackBar_4 = TrackBar_4 + 1;
 TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
 }
 }
 } 
 }
 else
 if (boxOfGUI_TrackBar_5.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_5
 if (Time.fixedTime > TrackBar_5_timeLeft) {
 if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
 TrackBar_5_timeLeft = Time.fixedTime + 0.01f; 
 if (TrackBar_5 > 0) {     
 TrackBar_5 = TrackBar_5 - 1;
 TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
 }
 }  else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
 TrackBar_5_timeLeft = Time.fixedTime + 0.01f;  
 if (TrackBar_5 < 1531) {
 TrackBar_5 = TrackBar_5 + 1;
 TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
 }
 }
 } 
 }
 else
 if (boxOfGUI_TrackBar_6.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_6
 if (Time.fixedTime > TrackBar_6_timeLeft) {
 if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
 TrackBar_6_timeLeft = Time.fixedTime + 0.01f; 
 if (TrackBar_6 > 0) {     
 TrackBar_6 = TrackBar_6 - 1;
 TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
 }
 }  else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
 TrackBar_6_timeLeft = Time.fixedTime + 0.01f;  
 if (TrackBar_6 < 127) {
 TrackBar_6 = TrackBar_6 + 1;
 TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
 }
 }
 } 
 }
 if ((GUI.changed == true) | (TrackBar_WheelChanged)) { // Если были произведены изменения или TrackBar изменен колесиком мыши
 TrackBar_WheelChanged = false; // true - TrackBar изменен колесиком мыши
if (sToEdit_Check_R1 != stringToEdit_R1) { // Если R1 изменен
 int.TryParse (stringToEdit_R1, out Main_R); // Перевести текст в число
 if (Main_R < 0)
 Main_R = 0;
 else if (Main_R > 255)
 Main_R = 255;
 stringToEdit_R1 = GUI.TextField (boxOfGUI_Edit_R1, Main_R.ToString (), 15, largeFont_RGB);  
 sToEdit_Check_R1 = stringToEdit_R1;
 RGB1_Changed = true; // true - RGB1 изменен
 }
if (sToEdit_Check_G1 != stringToEdit_G1) { // Если G1 изменен
 int.TryParse (stringToEdit_G1, out Main_G); // Перевести текст в число
 if (Main_G < 0)
 Main_G = 0;
 else if (Main_G > 255)
 Main_G = 255;
 stringToEdit_G1 = GUI.TextField (boxOfGUI_Edit_G1, Main_G.ToString (), 15, largeFont_RGB);  
 sToEdit_Check_G1 = stringToEdit_G1;
 RGB1_Changed = true; // true - RGB1 изменен
 }
if (sToEdit_Check_B1 != stringToEdit_B1) { // Если B1 изменен
 int.TryParse (stringToEdit_B1, out Main_B); // Перевести текст в число
 if (Main_B < 0)
 Main_B = 0;
 else if (Main_B > 255)
 Main_B = 255;
 stringToEdit_B1 = GUI.TextField (boxOfGUI_Edit_B1, Main_B.ToString (), 15, largeFont_RGB);  
 sToEdit_Check_B1 = stringToEdit_B1;
 RGB1_Changed = true; // true - RGB1 изменен
 }
if (TrackBar_1_Check != TrackBar_1) { 
 if (TrackBar_1 > TrackBar_1_Check)
 TrackBar_1 = Mathf.CeilToInt (TrackBar_1); // Получить целое число
 else TrackBar_1 = Mathf.FloorToInt (TrackBar_1);
if (CheckBox_Even) { // Если нужна только четная яркость
 if (TrackBar_1 % 2 != 0) // Если нечетное число
 TrackBar_1 = TrackBar_1 - 1;
 } else if (CheckBox_Odd) { // Если нужна только нечетная яркость
 if (TrackBar_1 % 2 == 0) // Если четное число
 TrackBar_1 = TrackBar_1 + 1;    
 if (TrackBar_1 < 0) TrackBar_1 = 1;
 else if (TrackBar_1 > 508) TrackBar_1 = 507;
 }
TrackBar_1_Check = TrackBar_1;
if (TrackBar_1 != Main_NumOfBright) { // Выполнить процедуру только 1 раз   
Main_NumOfBright = Mathf.FloorToInt(TrackBar_1); // Яркость
 Find_RGB_AndMake_TheSameColor (); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 }
 }
if (TrackBar_2_Check != TrackBar_2) {
 if (TrackBar_2 > TrackBar_2_Check)
 TrackBar_2 = Mathf.CeilToInt (TrackBar_2); // Получить целое число
 else TrackBar_2 = Mathf.FloorToInt (TrackBar_2);
 TrackBar_2_Check = TrackBar_2;
if (TrackBar_2 != Main_NumOfShade) { // Выполнить процедуру только 1 раз   
Main_NumOfShade = Mathf.FloorToInt(TrackBar_2); // Оттенок
 Find_RGB_AndMake_TheSameColor (); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 }
 }
if (TrackBar_3_Check != TrackBar_3) { 
 if (TrackBar_3 > TrackBar_3_Check)
 TrackBar_3 = Mathf.CeilToInt (TrackBar_3); // Получить целое число
 else TrackBar_3 = Mathf.FloorToInt (TrackBar_3);
 TrackBar_3_Check = TrackBar_3;
if (TrackBar_3 != Main_NumOfContrast) { // Выполнить процедуру только 1 раз   
Main_NumOfContrast = Mathf.FloorToInt(TrackBar_3); // Контрастность
 Find_RGB_AndMake_TheSameColor (); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 }
 }
if (TrackBar_4_Check != TrackBar_4) {
 if (TrackBar_4 > TrackBar_4_Check)
 TrackBar_4 = Mathf.CeilToInt (TrackBar_4); // Получить целое число
 else TrackBar_4 = Mathf.FloorToInt (TrackBar_4);
if (CheckBox_Even) { // Если нужна только четная яркость
 if (TrackBar_4 % 2 != 0) // Если нечетное число
 TrackBar_4 = TrackBar_4 - 1;
 } else if (CheckBox_Odd) { // Если нужна только нечетная яркость
 if (TrackBar_4 % 2 == 0) // Если четное число
 TrackBar_4 = TrackBar_4 + 1;        
 if (TrackBar_4 < 0) TrackBar_4 = 1;
 else if (TrackBar_4 > 508) TrackBar_4 = 507;
 }
TrackBar_4_Check = TrackBar_4;
if (TrackBar_4 != Main_NumOfBright2) // Выполнить процедуру только 1 раз   
 {
 // Поменять цвет RGB - Delphi
 Change_RGB(Main_R,Main_G,Main_B,
 Main_NumOfBright2, Mathf.FloorToInt(TrackBar_4),
 Main_NumOfShade3, Main_NumOfShade3,
 Main_NumOfContrast3,
 out Main_R2, out Main_G2, out Main_B2);
Main_NumOfBright2 = Mathf.FloorToInt(TrackBar_4); // Яркость
 // Main_NumOfShade2 = Mathf.FloorToInt(TrackBar_5); // Оттенок
 // Main_NumOfContrast2 = Mathf.FloorToInt(TrackBar_6); // Контрастность
Show_Changed_Color(); // Установить значения нижних текстовых полей
 }
}
if (TrackBar_5_Check != TrackBar_5) { 
 if (TrackBar_5 > TrackBar_5_Check)
 TrackBar_5 = Mathf.CeilToInt (TrackBar_5); // Получить целое число
 else TrackBar_5 = Mathf.FloorToInt (TrackBar_5);
 TrackBar_5_Check = TrackBar_5;
if (TrackBar_5 != Main_NumOfShade2) // Выполнить процедуру только 1 раз   
 {
 // Поменять цвет RGB - Delphi
 Change_RGB(Main_R,Main_G,Main_B,
 Main_NumOfBright2, Main_NumOfBright2,
 Main_NumOfShade2, Mathf.FloorToInt(TrackBar_5),
 Main_NumOfContrast2,
 out Main_R2, out Main_G2, out Main_B2);
Main_NumOfShade2 = Mathf.FloorToInt(TrackBar_5); // Оттенок
Show_Changed_Color(); // Установить значения нижних текстовых полей
 }
}
if (TrackBar_6_Check != TrackBar_6) { 
 if (TrackBar_6 > TrackBar_6_Check)
 TrackBar_6 = Mathf.CeilToInt (TrackBar_6); // Получить целое число
 else TrackBar_6 = Mathf.FloorToInt (TrackBar_6);
 TrackBar_6_Check = TrackBar_6;
if (TrackBar_6 != Main_NumOfContrast2) // Выполнить процедуру только 1 раз   
 {
 // Поменять цвет RGB - Delphi
 Change_RGB(Main_R,Main_G,Main_B,
 Main_NumOfBright2, Main_NumOfBright2,
 Main_NumOfShade3, Main_NumOfShade3,
 Mathf.FloorToInt(TrackBar_6),
 out Main_R2, out Main_G2, out Main_B2);
Main_NumOfContrast2 = Mathf.FloorToInt(TrackBar_6); // Контрастность
Show_Changed_Color(); // Установить значения нижних текстовых полей
 }
}
 }
if (RGB1_Changed) { // Если RGB1 изменен
 RGB1_Changed = false; // true - RGB1 изменен
 Find_BSC_AndMake_TheSameColor (); // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 }
// Label /////////////////////////////////////////////
GUI.Label (boxOfGUI_Label_1, "Яркость: "+TrackBar_1.ToString()+" ("+(TrackBar_1/2).ToString()+")", styleColor_Label); // Label - яркость RGB (Указываемый цвет)
 GUI.Label (boxOfGUI_Label_2, "Оттенок: "+(TrackBar_2-1).ToString(), styleColor_Label); // Label - оттенок RGB (Указываемый цвет)
 GUI.Label (boxOfGUI_Label_3, "Контрастность: "+TrackBar_3.ToString(), styleColor_Label); // Label - контрастность RGB (Указываемый цвет)
 GUI.Label (boxOfGUI_Label_4, "R                   G                    B", styleColor_Label_4); // Label - RGB (Указываемый цвет)
 GUI.Label (boxOfGUI_Label_5, "Яркость: "+TrackBar_4.ToString()+" ("+(TrackBar_4/2).ToString()+")", styleColor_Label); // Label - яркость RGB (Результат)
 GUI.Label (boxOfGUI_Label_6, "Оттенок: "+(TrackBar_5-1).ToString(), styleColor_Label); // Label - оттенок RGB (Результат)
 GUI.Label (boxOfGUI_Label_7, "Контрастность: "+TrackBar_6.ToString(), styleColor_Label); // Label - контрастность RGB (Результат)
 GUI.Label (boxOfGUI_Label_8, "R                   G                    B", styleColor_Label_4); // Label - RGB (Результат)
// Чекбокс /////////////////////////////////////////////
 CheckBox_1 = GUI.Toggle (boxOfGUI_CheckBox_1, CheckBox_1, "<color=white><size=11>Не сохранять пропорции (яркость - контрастность)</size></color>",GUI.skin.toggle);
 CheckBox_2 = GUI.Toggle (boxOfGUI_CheckBox_2, CheckBox_2, "<color=white><size=11>Линия контрастности на треугольнике яркости</size></color>",GUI.skin.toggle);
 CheckBox_3 = GUI.Toggle (boxOfGUI_CheckBox_3, CheckBox_3, "<color=white><size=11>Точка на треугольнике яркости</size></color>",GUI.skin.toggle);
 CheckBox_4 = GUI.Toggle (boxOfGUI_CheckBox_4, CheckBox_4, "<color=white><size=11>Ч/б линия, под треугольником яркости</size></color>",GUI.skin.toggle);
 CheckBox_5 = GUI.Toggle (boxOfGUI_CheckBox_5, CheckBox_5, "<color=white><size=11>Линия контраст. на цветных треугольниках</size></color>",GUI.skin.toggle);
 CheckBox_6 = GUI.Toggle (boxOfGUI_CheckBox_6, CheckBox_6, "<color=white><size=11>Точка на цветных треугольниках</size></color>",GUI.skin.toggle);
 CheckBox_7 = GUI.Toggle (boxOfGUI_CheckBox_7, CheckBox_7, "<color=white><size=11>Заполнять квадрат с цветом</size></color>",GUI.skin.toggle);
CheckBox_Even = GUI.Toggle (boxOfGUI_CheckBox_Even, CheckBox_Even, "<color=white><size=11>Четное</size></color>",GUI.skin.toggle);
 CheckBox_Odd = GUI.Toggle (boxOfGUI_CheckBox_Odd, CheckBox_Odd, "<color=white><size=11>Нечетное</size></color>",GUI.skin.toggle);
// Кнопка /////////////////////////////////////////////
 if ((GUI.Button (boxOfGUI_Button_1, "+ Оттенок",GUI.skin.button)) |  // Если нажата кнопка "+ Оттенок"
 (Event.current.keyCode == KeyCode.Return)) {     // Или нажата клавиша "Enter"
 if (Time.fixedTime > PS_timeLeft) {
 PS_timeLeft = Time.fixedTime + 0.01f; 
int textnumber1;
 int.TryParse (stringToEdit_PlusShade, out textnumber1); // Строку в число
 if (textnumber1 < -1529) {
 textnumber1 = -1529;
 stringToEdit_PlusShade = GUI.TextField (boxOfGUI_Edit_PlusShade, textnumber1.ToString (), 5, largeFont_RGB);  
 }
 if (textnumber1 > 1529) {
 textnumber1 = 1529;
 stringToEdit_PlusShade = GUI.TextField (boxOfGUI_Edit_PlusShade, textnumber1.ToString (), 5, largeFont_RGB);  
 }
// Поменять цвет RGB - Delphi
 Change_RGB (Main_R, Main_G, Main_B,
 Main_NumOfBright2, Main_NumOfBright2,
 Main_NumOfShade2, Mathf.FloorToInt (TrackBar_5 + textnumber1),
 Main_NumOfContrast2,
 out Main_R2, out Main_G2, out Main_B2);
Main_NumOfShade2 = Mathf.FloorToInt (TrackBar_5); // Оттенок
Show_Changed_Color (); // Установить значения нижних текстовых полей     
 }
 }
// Чекбокс /////////////////////////////////////////////
 Options = GUI.Toggle (boxOfGUI_Options, Options, "<color=white><size=11>Показать настройки</size></color>",GUI.skin.toggle);
 if (Options2 != Options) {
 Options2 = Options;
 if (Options == false) { 
 boxOfGUI_Image_3 = new Rect (10, 10, 514, 259); // Положение изображений с треугольниками
 boxOfGUI_Options = new Rect (10, 279, 280, 25); // Положение чекбокса - Показать настройки настройки
 iOptions = -1000; // Вывести элементы за пределы экрана
 } else {
 boxOfGUI_Image_3 = new Rect (10, 220, 514, 259); // Положение изображений с треугольниками
 boxOfGUI_Options = new Rect (10, 550, 280, 25); // Положение чекбокса - Показать настройки настройки
 iOptions = 0; // Вывести элементы за пределы экрана
 }
 Mouse_InvertImageTop = Mathf.FloorToInt(Screen.height - boxOfGUI_Image_3.yMin)+2; // "Y" позиция изображения с треугольниками, относительно верхней части экрана
// Кнопка /////////////////////////////////////////////
 boxOfGUI_Button_1 = new Rect (600+iOptions, 160, 80, 30); // Положение кнопки (+ оттенок)
 // Текстовые поля
 boxOfGUI_Edit_R1 = new Rect (328+iOptions, 23, 40, 20); // Положение текстового поля "R" (Указываемый цвет)
 boxOfGUI_Edit_G1 = new Rect (392+iOptions, 23, 40, 20); // Положение текстового поля "G" (Указываемый цвет)
 boxOfGUI_Edit_B1 = new Rect (457+iOptions, 23, 40, 20); // Положение текстового поля "B" (Указываемый цвет)
 boxOfGUI_Edit_R2 = new Rect (38+iOptions, 168, 40, 20); // Положение текстового поля "R" (Результат)
 boxOfGUI_Edit_G2 = new Rect (102+iOptions, 168, 40, 20); // Положение текстового поля "G" (Результат)
 boxOfGUI_Edit_B2 = new Rect (167+iOptions, 168, 40, 20); // Положение текстового поля "B" (Результат)
 boxOfGUI_Edit_PlusShade = new Rect (540+iOptions, 165, 50, 20); // Положение текстового поля  (+ Оттенок)
 // Изображения
 boxOfGUI_Image_1 = new Rect (328+iOptions, 53, 169, 70); // Положение изображения (Указываемый цвет)
 boxOfGUI_Image_2 = new Rect (328+iOptions, 122, 169, 70); // Положение изображения (Результат)
 // Ползунки
 boxOfGUI_TrackBar_1 = new Rect (540+iOptions, 40, 211, 22); // Положение ползунка яркости (Указываемый цвет)
 boxOfGUI_TrackBar_2 = new Rect (540+iOptions, 89, 211, 22); // Положение ползунка оттенка (Указываемый цвет)
 boxOfGUI_TrackBar_3 = new Rect (540+iOptions, 131, 211, 22); // Положение ползунка контрастности (Указываемый цвет)
 boxOfGUI_TrackBar_4 = new Rect (32+iOptions, 40, 211, 22); // Положение ползунка яркости (Результат)
 boxOfGUI_TrackBar_5 = new Rect (32+iOptions, 89, 211, 22); // Положение ползунка оттенка (Результат)
 boxOfGUI_TrackBar_6 = new Rect (32+iOptions, 131, 211, 22); // Положение ползунка контрастности (Результат)
 // Label
 boxOfGUI_Label_1 = new Rect (540+iOptions, 14, 156, 23); // Положение Label - яркость RGB (Указываемый цвет)
 boxOfGUI_Label_2 = new Rect (540+iOptions, 62, 119, 23); // Положение Label - оттенок RGB (Указываемый цвет)
 boxOfGUI_Label_3 = new Rect (540+iOptions, 107, 140, 23); // Положение Label - контрастность RGB (Указываемый цвет)
 boxOfGUI_Label_4 = new Rect (340+iOptions, 7, 145, 13); // Положение Label - RGB (Указываемый цвет)
 boxOfGUI_Label_5 = new Rect (32+iOptions, 14, 156, 23); // Положение Label - яркость RGB (Результат)
 boxOfGUI_Label_6 = new Rect (32+iOptions, 62, 119, 23); // Положение Label - оттенок RGB (Результат)
 boxOfGUI_Label_7 = new Rect (32+iOptions, 107, 140, 23); // Положение Label - контрастность RGB (Результат)
 boxOfGUI_Label_8 = new Rect (50+iOptions, 151, 145, 13); // Положение Label - RGB (Результат)
 // Чекбоксы
 boxOfGUI_CheckBox_1 = new Rect (38+iOptions, 200, 280, 25); // Положение чекбокса - Не сохранять пропорции (яркость - контрастность)
 boxOfGUI_CheckBox_2 = new Rect (10+iOptions, 490, 260, 25); // Положение чекбокса - Линия контрастности на треугольнике яркости
 boxOfGUI_CheckBox_3 = new Rect (10+iOptions, 510, 260, 25); // Положение чекбокса - Точка на треугольнике яркости
 boxOfGUI_CheckBox_4 = new Rect (10+iOptions, 530, 260, 25); // Положение чекбокса - Ч/б линия, под треугольником яркости
 boxOfGUI_CheckBox_5 = new Rect (280+iOptions, 490, 260, 25); // Положение чекбокса - Линия контраст. на цветных треугольниках
 boxOfGUI_CheckBox_6 = new Rect (280+iOptions, 510, 260, 25); // Положение чекбокса - Точка на цветных треугольниках
 boxOfGUI_CheckBox_7 = new Rect (280+iOptions, 530, 260, 25); // Положение чекбокса - Заполнять квадрат с цветом
 boxOfGUI_CheckBox_Even = new Rect (250+iOptions, 14, 100, 25); // Положение чекбокса - Четная яркость
 boxOfGUI_CheckBox_Odd = new Rect (250+iOptions, 39, 100, 25); // Положение чекбокса - Нечетная яркость 
 ///////////////////////////////////////////////////////////////
 } 
 }
public bool Show_Changed_Color() // Установить значения нижних текстовых полей
 {
 stringToEdit_R1 = Main_R2.ToString();
 stringToEdit_G1 = Main_G2.ToString();
 stringToEdit_B1 = Main_B2.ToString();
styleColor_Image_2.normal.background = MakeTex (7, 
 Mathf.FloorToInt(boxOfGUI_Image_2.width), Mathf.FloorToInt(boxOfGUI_Image_2.height), 
 new Color (Main_R2 / 255f, Main_G2 / 255f, Main_B2 / 255f)); // Заполнить изображение 2 цветом R,G,B
return true;
 }
public bool Find_BSC_AndMake_TheSameColor() // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 {
 // Яркость, оттенок, контрастность, по RGB - C# Unity3D
 BSC_ByRGB(Main_R,Main_G,Main_B, out Main_NumOfBright, out Main_NumOfShade, out Main_NumOfContrast);
 TrackBar_1_Check = Main_NumOfBright;
 TrackBar_2_Check = Main_NumOfShade;
 TrackBar_3_Check = Main_NumOfContrast;
 TrackBar_1 = Main_NumOfBright;
 TrackBar_2 = Main_NumOfShade;
 TrackBar_3 = Main_NumOfContrast;
styleColor_Image_1.normal.background = MakeTex (8, 
 Mathf.FloorToInt(boxOfGUI_Image_1.width), Mathf.FloorToInt(boxOfGUI_Image_1.height), 
 new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f)); // Заполнить изображение 1 цветом R,G,B
stringToEdit_R2 = Main_R.ToString();
 stringToEdit_G2 = Main_G.ToString();
 stringToEdit_B2 = Main_B.ToString();
 Main_R2 = Main_R;
 Main_G2 = Main_G;
 Main_B2 = Main_B;
styleColor_Image_2.normal.background = MakeTex (9, 
 Mathf.FloorToInt(boxOfGUI_Image_2.width), Mathf.FloorToInt(boxOfGUI_Image_2.height), 
 new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f)); // Заполнить изображение 2 цветом R,G,B
TrackBar_4_Check = TrackBar_1;
 TrackBar_5_Check = TrackBar_2;
 TrackBar_6_Check = TrackBar_3;
 TrackBar_4 = TrackBar_1;
 TrackBar_5 = TrackBar_2;
 TrackBar_6 = TrackBar_3;
 Main_NumOfBright2 = Mathf.FloorToInt(TrackBar_1);
 Main_NumOfShade2 = Mathf.FloorToInt(TrackBar_2);
 Main_NumOfShade3 = Mathf.FloorToInt(TrackBar_2);
 Main_NumOfContrast2 = Mathf.FloorToInt(TrackBar_3);
 Main_NumOfContrast3 = Mathf.FloorToInt(TrackBar_3);
// Поменять цвет RGB - Delphi
 Change_RGB(Main_R,Main_G,Main_B,
 Main_NumOfBright2, Main_NumOfBright2,
 Main_NumOfShade2, Main_NumOfShade2,
 Main_NumOfContrast2,
 out Main_R2, out Main_G2, out Main_B2);
return true;
 }
 public bool Find_RGB_AndMake_TheSameColor() // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 {
 // Найти RGB по яркости, оттенку и контрастности - Delphi
 RGB_ByBSC(Main_NumOfBright,Main_NumOfShade,Main_NumOfContrast, out Main_R, out Main_G, out Main_B);
 sToEdit_Check_R1 = Main_R.ToString();
 sToEdit_Check_G1 = Main_G.ToString();
 sToEdit_Check_B1 = Main_B.ToString();
 stringToEdit_R1 = Main_R.ToString();
 stringToEdit_G1 = Main_G.ToString();
 stringToEdit_B1 = Main_B.ToString();
styleColor_Image_1.normal.background = MakeTex (10, 
 Mathf.FloorToInt(boxOfGUI_Image_1.width), Mathf.FloorToInt(boxOfGUI_Image_1.height), 
 new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f)); // Заполнить изображение 1 цветом R,G,B
stringToEdit_R2 = Main_R.ToString();
 stringToEdit_G2 = Main_G.ToString();
 stringToEdit_B2 = Main_B.ToString();
 Main_R2 = Main_R;
 Main_G2 = Main_G;
 Main_B2 = Main_B;
styleColor_Image_2.normal.background = MakeTex (11, 
 Mathf.FloorToInt(boxOfGUI_Image_2.width), Mathf.FloorToInt(boxOfGUI_Image_2.height), 
 new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f)); // Заполнить изображение 2 цветом R,G,B
TrackBar_4_Check = TrackBar_1;
 TrackBar_5_Check = TrackBar_2;
 TrackBar_6_Check = TrackBar_3;
 TrackBar_4 = TrackBar_1;
 TrackBar_5 = TrackBar_2;
 TrackBar_6 = TrackBar_3;
 Main_NumOfBright2 = Mathf.FloorToInt(TrackBar_1);
 Main_NumOfShade2 = Mathf.FloorToInt(TrackBar_2);
 Main_NumOfShade3 = Mathf.FloorToInt(TrackBar_2);
 Main_NumOfContrast2 = Mathf.FloorToInt(TrackBar_3);
 Main_NumOfContrast3 = Mathf.FloorToInt(TrackBar_3);
// Поменять цвет RGB - Delphi
 Change_RGB(Main_R,Main_G,Main_B,
 Main_NumOfBright2, Main_NumOfBright2,
 Main_NumOfShade2, Main_NumOfShade2,
 Main_NumOfContrast2,
 out Main_R2, out Main_G2, out Main_B2);
return true;
 }
public bool BSC_ByRGB(int R, int G, int B,
 out int NumOfBright, out int NumOfShade, out int NumOfContrast) // Яркость, оттенок, контрастность, по RGB - Delphi
 {
 // Переменные
 //int NumOfBright1,NumOfContrast1,NumOfShade1;
 //int R, G, B;
 float RGBmax, RGBmin, RGBmid, Rm, Gm, Bm,
 Light, BGW, D, E, Q, Zmax, Z, Qp,  LR, Y1, Xc, Xmain;
//R = … ;  G = … ;  B = … ;
 // Найти максимальное, минимальное и среднее значение из заданных R,G,B
 RGBmax=(((((R+G)/2f)+(Mathf.Abs(R-G)/2f))+B)/2f)+(Mathf.Abs((((R+G)/2f)+(Mathf.Abs(R-G)/2f))-B)/2f);
 RGBmin=(((((R+G)/2f)-(Mathf.Abs(R-G)/2f))+B)/2f)-(Mathf.Abs((((R+G)/2f)-(Mathf.Abs(R-G)/2f))-B)/2f);
 RGBmid=(R+G+B)-(RGBmax+RGBmin);
 // Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
 Rm=Mathf.Abs((Mathf.FloorToInt((R+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(R+1))-1);
 Gm=Mathf.Abs((Mathf.FloorToInt((G+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(G+1))-1);
 Bm=Mathf.Abs((Mathf.FloorToInt((B+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(B+1))-1);
 BGW=1-Mathf.FloorToInt((Rm+Gm+Bm)/9f);            // Если (R=G=B), то BGW=0, иначе BGW=1
 D=((RGBmax-RGBmin+1)/2f)-Mathf.FloorToInt((RGBmax-RGBmin+1)/2f); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
 Light=((253+((RGBmax-127)-(127-RGBmin)))/2f)-D+(1-BGW); // Яркость выбранного цвета
 E = Mathf.CeilToInt((RGBmid-Light)/129f); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
 // Номер треугольника
 Q = ((1-E)*(Mathf.FloorToInt(Rm/2f)+Mathf.FloorToInt(Gm/2f)*3+Mathf.FloorToInt(Bm/2f)*5)+E*((1-Mathf.CeilToInt(Bm/2f))*2+(1-Mathf.CeilToInt(Rm/2f))*4+(1-Mathf.CeilToInt(Gm/2f))*6))*BGW;
 Zmax = Mathf.FloorToInt(Mathf.Abs(127-Mathf.Abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости 'Light'
 Z = (127-((RGBmax-Light)-1-(D*2)))*BGW; // Контрастность (Номер ряда с цветом)
 Y1 = (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Z'
 Qp = Q-Mathf.FloorToInt(Q/4f)*3; // Приравниваем 6 треугольников к виду 1,2,3 (1-4,2-5,3-6)
 // Если выделена левая сторона треугольника, или центр, LR=0. Если правая, LR=1
 LR = (1-Mathf.Abs(Bm-1))*Mathf.FloorToInt((Qp-1)/2f)+      // Если Bm = RGBmid, и Qp = 3(6), то LR=1
 (1-Mathf.Abs(Rm-1))*(1-Mathf.Abs(Qp-2))+          // Если Rm = RGBmid, и Qp = 2(5), то LR=1
 (1-Mathf.Abs(Gm-1))*(1-Mathf.CeilToInt((Qp-1)/2f));   // Если Gm = RGBmid, и Qp = 1(4), то LR=1
 Xc = Mathf.Abs((Light-RGBmin)*(1-LR*2)-Mathf.Abs(RGBmid-RGBmin*(1-E)-RGBmax*E)+(D*2)*E*(1-LR*2));  // Порядковый № ячейки
 Xmain = ((127-Y1/2f)+Xc+(Q-1)*255)*BGW;// // Оттенок (Координата по оси X, на общей сетке координат)
NumOfBright = Mathf.FloorToInt((Light+D)*2); // Яркость, от 0 до 508
 NumOfContrast = Mathf.FloorToInt(Z); // Контрастность, от 0 до 127
 NumOfShade = Mathf.FloorToInt(Xmain+1); // Оттенок, от 0 до 1529 +1
 return true;   
 }
public bool RGB_ByBSC(int NumOfBright, int NumOfShade, int NumOfContrast,
 out int R, out int G, out int B) // Найти RGB по яркости, оттенку и контрастности - Delphi
 {
 // Переменные:
 //int R, G, B;
 float Rm, Gm, Bm, BGW, D, E, Q, Qp, Qa, LR, Y1, Xc,
 Zero2, k, Y2, Xc2, Zcontrast, Yarkost, Lc, Zmax, NoRow254,
 RGBmax2, RGBmin2, RGBmid2, Xall, Xall2, Xx, Xx2, Xborder, Xout, 
 SkipRow1, Qrgbmax, Qrgbmin, Qrgbmid;
Yarkost = NumOfBright/2f; // Яркость
 Zcontrast = NumOfContrast; // Контрастность
BGW = 1; // 1- Все цвета, кроме Ч/Б.  0 - Только Ч/Б цвета
 D = Yarkost - Mathf.FloorToInt (Yarkost); // Четная (D=0) или нечетная (D=0.5) яркость
 Yarkost = Mathf.FloorToInt (Yarkost);
 Zmax = Mathf.FloorToInt (Mathf.Abs (127 - Mathf.Abs ((127 - Yarkost) - D))) * BGW; // Максимальное количество рядов, на заданной яркости 'Yarkost'
 Lc = 1 - Mathf.CeilToInt (((127 - Zcontrast) - Zmax) / 128f);  // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
 Zcontrast = (Zcontrast) * Lc + (127 - Zmax) * (1 - Lc); // Если выбранная контраст., за пределами Zmax, то Zcontrast=Zmax
 //------------------Поменять «Цвет» --------------------------------------
 // Xall = (от 0 до 1531), где 0 - координата для переброса из начала 1 треуг. в конец 6| 1531 - из конца 6 тр. в начало 1
 // а координаты от 1 до 1530, то же что и координаты с ячейками от 0 до 1529
Xall = NumOfShade; // Оттенок - Координата выбранной ячейки с цветом, по оси X
// Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
 Xout = Mathf.CeilToInt ((765 - Xall) / 766f) * ((1 - Mathf.CeilToInt (Xall / 1531f)) + Mathf.FloorToInt (Xall / 1531f)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
 Xall2 = Xall + Xout - 1; // Выравниваем значение координаты Xall
 Q = Mathf.CeilToInt ((Xall2 + 1) / 255f);    // Номер выбранного треугольника
 E = 1 - (Q / 2f - Mathf.FloorToInt (Q / 2f)) * 2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
 Y1 = (((127 - Zcontrast) * 2) + (D * 4) * E) * BGW; // Количество ячеек в ряду 'Zcontrast'
 Xborder = 127 - (Y1 / 2f); // Количество пустых ячеек, слева от треугольника
 Qa = (Q - 1) * 255;       // Координаты квадрата с выбранным треугольником
 Xc = Xall2 - Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
 LR = Mathf.CeilToInt ((Xc / 254f) - 0.5f); // Если ячейка находится левее центра, то LR=0 , иначе LR=1
 // КОРРЕКТИРОВКА
 // Если координата в пределах треугольника, то Lc=1, если за пределами, то Lc=0
 Lc = 1 - Mathf.CeilToInt (Mathf.FloorToInt (Mathf.Abs ((Xall2 - Qa) - 127) / ((Y1 / 2f) + 1)) / 128f);
 Xc = (Xc - Xborder) * Lc + (Y1 * LR) * (1 - Lc); // Порядковый номер выбранной ячейки в треугольнике
 // т.к. в 1 ряду, при D=0,5, только 1 пустая ячейка, то стандартный переброс
 // между ячейками невозможен, поэтому следует сделать сплошной переход (включая в рассчеты пустую ячейку)
 SkipRow1 = Mathf.FloorToInt ((127 - Zcontrast) / 126f) * (D * 2) * (1 - Lc); // При D=0,5 и Z=1, SkipRow1=1, иначе 0
 // Координата по оси X, на общей сетке координат
 Xx = Mathf.FloorToInt (((1530 * (1 - Mathf.CeilToInt ((Q - 1) / 6f)) + Qa - Xborder - 1 + (1 - 2 * E) * (D * 2)) * (1 - LR) +
 (Qa + 255 + Xborder - (1 - 2 * E) * (D * 2) - 1530 * Mathf.FloorToInt (Q / 6f)) * LR) *
 (1 - Lc - SkipRow1 + Mathf.Abs (Xout)) + (Xall - 1) * (Lc + SkipRow1 - Mathf.Abs (Xout)));
 //+++++++++++++++++++++++++++++++++++++++++++
 // = 0- R, 1- G, 2- B,  К какому из цветов отнести максимальное значение RGBmax
 Qrgbmax = Mathf.FloorToInt ((Q + ((1 - LR) * (-E) + LR * E) - (LR * Mathf.FloorToInt (Q / 6f) * 6)) / 2f);
 // = 0- B, 1- R, 2- G,  К какому из цветов отнести минимальное значение RGBmin
 Qrgbmin = ((Q + ((1 - LR) * (-(1 - E)) + LR * (1 - E)) + ((1 - LR) * ((1 - Mathf.CeilToInt ((Q - 1) / 6f)) * 6))) / 2f) - 1;
 Qp = Q - Mathf.FloorToInt (Q / 4f) * 3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
 // = 0- B, 1- G, 2- R ,  К какому из цветов отнести среднее значение RGBmid
 Qrgbmid = (Qp + LR - (LR * Mathf.FloorToInt (Qp / 3f) * 3)) - 1;
 // Приравниваем RGB(min,max,mid) к соответствующим R, G, B
 Rm = (1 - Mathf.CeilToInt (Qrgbmax / 2f)) * 2 + Mathf.FloorToInt (Qrgbmid / 2f);
 Gm = (1 - Mathf.Abs (Qrgbmax - 1)) * 2 + (1 - Mathf.Abs (Qrgbmid - 1));
 Bm = Mathf.FloorToInt (Qrgbmax / 2f) * 2 + (1 - Mathf.CeilToInt (Qrgbmid / 2f));
//// Цвет RGB //////////////////////////////////////////////////////////////// 
 Zero2 = 1-Mathf.CeilToInt(Y1/254f);
 k = (1/(Y1+Zero2))*Xc;
 Y2 = ((127-Zcontrast)*2)+(D*4)*E;
 Xc2 = Mathf.Abs((Y2*LR)-Mathf.RoundToInt(Mathf.Abs(k-LR)*Y2));
 //Xx2 = (127-Y2/2f)+Xc2+(Q-1)*255; // Координата по оси X, на общей сетке координат (При измененной яркости-контр.)
// Поменять значение оттенка, контрастности (если за пределами) ******************************
 TrackBar_2_Check = Xx+1;
 TrackBar_3_Check = Zcontrast;
 TrackBar_5_Check = Xx+1;
 TrackBar_6_Check = Zcontrast;
TrackBar_2 = Xx+1; // Новый оттенок
 TrackBar_3 = Zcontrast; // Новая контрастность
 TrackBar_5 = Xx+1; // Новый оттенок 2
 TrackBar_6 = Zcontrast; // Новая контрастность 2
 // ****************************************************************************
// NoRow254= 0 если Yarkost=254, иначе NoRow254= 1.  «на 254 яркости, при D=0.5, нет ячеек с цветом»
 NoRow254 = 1-Mathf.FloorToInt(Yarkost/254f);
 // Вычислить максимальное, минимальное и среднее значение
 RGBmax2 = Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;
 RGBmin2 = Yarkost-(127-Zcontrast);
 RGBmid2 = Mathf.Abs(Mathf.Abs((Y2/2f)-Xc2)+(RGBmin2*(1-E)-RGBmax2*E));
// Сопоставить полученные результаты  (RGBmid, RGBmin, RGBmax) с (R_main, G_main, B_main)
 R=Mathf.FloorToInt (Mathf.Abs((Mathf.FloorToInt(Rm/2f)*(RGBmax2+RGBmid2))+
 (Mathf.FloorToInt(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 G=Mathf.FloorToInt (Mathf.Abs((Mathf.FloorToInt(Gm/2f)*(RGBmax2+RGBmid2))+
 (Mathf.FloorToInt(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 B=Mathf.FloorToInt (Mathf.Abs((Mathf.FloorToInt(Bm/2f)*(RGBmax2+RGBmid2))+
 (Mathf.FloorToInt(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 return true;
 }
public bool Change_RGB(int R, int G, int B,
 int NumOfBright_Before, int NumOfBright_New,
 int NumOfShade_Before, int NumOfShade_New,
 int NumOfContrast, out int R2, out int G2, out int B2) // Поменять цвет RGB - Delphi
 {
 // Переменные
 float RGBmax, RGBmin, RGBmid, Rm, Gm, Bm,
 Light, BGW, D, E, Q, Qp, Qa, LR,
 Y1, Xc, Y2, Xc2, Zero, Zero2, k, Z, Xx2,
 Lc,  Zmax, NoRow254, Yarkost, Zcontrast, Zmax2,
 RGBmax2, RGBmin2, RGBmid2, Xmain,
 Xall, Xall2, Xx, Xborder, Xout,
 SkipRow1, Qrgbmax, Qrgbmin, Qrgbmid;
RGBmax=(((((R+G)/2f)+(Mathf.Abs(R-G)/2f))+B)/2f)+(Mathf.Abs((((R+G)/2f)+(Mathf.Abs(R-G)/2f))-B)/2f);
 RGBmin=(((((R+G)/2f)-(Mathf.Abs(R-G)/2f))+B)/2f)-(Mathf.Abs((((R+G)/2f)-(Mathf.Abs(R-G)/2f))-B)/2f);
 RGBmid=(R+G+B)-(RGBmax+RGBmin);
 // Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
 Rm=Mathf.Abs((Mathf.FloorToInt((R+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(R+1))-1);
 Gm=Mathf.Abs((Mathf.FloorToInt((G+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(G+1))-1);
 Bm=Mathf.Abs((Mathf.FloorToInt((B+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(B+1))-1);
 BGW=1-Mathf.FloorToInt((Rm+Gm+Bm)/9f);            // Если (R=G=B), то BGW=0, иначе BGW=1
 D=((RGBmax-RGBmin+1)/2f)-Mathf.FloorToInt((RGBmax-RGBmin+1)/2f); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
 Light=((253+((RGBmax-127)-(127-RGBmin)))/2f)-D+(1-BGW); // Яркость выбранного цвета
//-------------Поменять значения «Яркость» ------------------------------------------------
 // Чтобы оставить знач. яркости в прежнем состоянии, можно закомментировать 3 нижние строки и поменять 4-ую  "Zmax2 = Zmax;"
 Yarkost = NumOfBright_New / 2f; // Яркость
 D = Yarkost-Mathf.FloorToInt(Yarkost); // Четная (D2=0) или нечетная (D2=0.5) яркость
 Yarkost = Mathf.FloorToInt(Yarkost);
 Zmax2 = Mathf.FloorToInt(Mathf.Abs(127-Mathf.Abs((127-Yarkost)-D)))*BGW; // Максимальное количество рядов, на заданной яркости 'Yarkost'
 //-------------------------------------------------------------------------------------------------------------
E = Mathf.CeilToInt((RGBmid-Light)/129f); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
 // Номер треугольника
 Q = ((1-E)*(Mathf.FloorToInt(Rm/2f)+Mathf.FloorToInt(Gm/2f)*3+Mathf.FloorToInt(Bm/2f)*5)+E*((1-Mathf.CeilToInt(Bm/2f))*2+(1-Mathf.CeilToInt(Rm/2f))*4+(1-Mathf.CeilToInt(Gm/2f))*6))*BGW;
if (!CheckBox_1) // Если нужно сохранять пропорции (яркость - контрастность)
 {
 Zmax = Mathf.FloorToInt(Mathf.Abs(127-Mathf.Abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости 'Light'
 Z = (127-((RGBmax-Light)-1-(D*2)))*BGW; // Контрастность (Номер ряда с цветом)
 }
 else
 {
 Zmax = (127-D*2)*BGW; // Максимальное количество рядов на яркости 'Light'
 Z = (127-Zmax)*BGW; // Контрастность (Номер ряда с цветом)
 }
// ^ 1.^ - Противоположное значение цвета -------------------------------------------------------------
 if (NumOfShade_New<0) Lc = 1; else Lc = 0;
 // 'не обязательно' Чтобы найти значение цвета через определенный промежуток - прибавить число от +-1 до +-1529
 Xmain = NumOfShade_Before + (Lc*1530)+ (NumOfShade_New-NumOfShade_Before);
 Lc = Mathf.FloorToInt(Xmain/1530f); // Если Xmain>1529, то Lc=1, иначе Lc=0
 Xmain = Xmain - Lc*1530; // Установить значение цвета в пределах от 0 до 1529. Ниже поменять Xall = Xmain+1;
//--------------Поменять «Цвет» -----------------------------------------------------------------------
 // Xall = (от 0 до 1531), где 0 - координата для переброса из начала 1 треуг. в конец 6| 1531 - из конца 6 тр. в начало 1
 //                                                      а координаты от 1 до 1530, то же что и координаты с ячейками от 0 до 1529
 // Чтобы оставить знач. Цвета в прежнем состоянии, можно поставить переменную (Xmain+1) и выполнить шаг ^ 1.^
 Xall = Xmain; // Координата выбранной ячейки с цветом, по оси X
 //Xall = NumOfShade_New; // Координата выбранной ячейки с цветом, по оси X
 // Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
 Xout =  Mathf.CeilToInt((765-Xall)/766f)*((1-Mathf.CeilToInt(Xall/1531f))+Mathf.FloorToInt(Xall/1531f)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
 Xall2 = Xall + Xout - 1; // Выравниваем значение координаты Xall
 Q = Mathf.CeilToInt((Xall2+1)/255f);    // Номер выбранного треугольника
 E = 1-(Q/2f-Mathf.FloorToInt(Q/2f))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
 Y1 = (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Z'
 Xborder = 127-(Y1/2f); // Количество пустых ячеек, слева от треугольника
 Qa = (Q-1)*255;       // Координаты квадрата с выбранным треугольником
 Xc = Xall2-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
 LR = Mathf.CeilToInt((Xc/254f)-0.5f) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
 Lc = 1-Mathf.CeilToInt(Mathf.FloorToInt(Mathf.Abs((Xall2-Qa)-127)/((Y1/2f)+1))/128f); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
 Xc = (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
//-------------Поменять значение «Контрастность» ------------------------------------------------
 // Чтобы оставить знач. контрастности в прежнем состоянии (Zcontrast = Z)
 Zcontrast = NumOfContrast; // Контрастность
Lc = 1-Mathf.CeilToInt(((127-Zcontrast)-Zmax)/128f); // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
 Zcontrast = Zcontrast*Lc + (127-Zmax)*(1-Lc); // Если выбранная контрастность, за пределами Zmax, то Zcontrast=Zmax
if (NumOfBright_Before != NumOfBright_New) // Если яркость меняется вручную
 {
 Lc = 1-Mathf.CeilToInt((Zmax2-Zmax)/128f); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
 // Чтобы узнать контрастность в ряду Zmax, относительно Zmax2, можно поменять их местами, в 2-х формулах ниже
 Zero = 1-Mathf.CeilToInt(Zmax/127f); // Переменная, для исключения деления на ноль
 Zcontrast = 127 - (Mathf.RoundToInt((Zmax2/(Zmax+Zero))*(127-Zcontrast))*Lc + (127-Zcontrast)*(1-Lc));  // Ряд-Контрастность , при «Yarkost»
 }
 else // Если яркость меняется программно
 {
 Lc = 1-Mathf.CeilToInt(((127-Zcontrast)-Zmax2)/128f); // Если Zcontrast меньше или равен Zmax2 , то Lc=1, иначе Lc=0
 Zcontrast = Zcontrast*Lc + (127-Zmax2)*(1-Lc); // Если выбранная контрастность, за пределами Zmax2, то Z=Zmax2
Lc = 1-Mathf.CeilToInt((Zmax2-Zmax)/128f); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
 // Чтобы узнать контрастность в ряду Zmax, относительно Zmax2, можно поменять их местами, в 2-х формулах ниже
 Zero = 1-Mathf.CeilToInt(Zmax2/127f); // Переменная, для исключения деления на ноль
 Main_NumOfContrast3 = Mathf.FloorToInt(127 - (Mathf.RoundToInt((Zmax/(Zmax2+Zero))*(127-Zcontrast))*Lc + (127-Zcontrast)*(1-Lc)));  // Ряд-Контрастность , при «Yarkost»
 }
 //-------------------------------------------------------------------------------------------------------------
 Zero2 = 1-Mathf.CeilToInt(Y1/254f); // Переменная, для исключения деления на ноль
 //  (Xc+Zero2) Можно поменять на  (Xc+Zero2/2f)- чтобы 'k' в 127 ряду (0 ячейка), был =  0,5. Или только (Xc), 'k'=0
 k = (1/(Y1+Zero2))*(Xc+Zero2);   // Коэффициент положения ячейки в Основном ряду (Zcontrast)
 Y1 = ((127-Zcontrast)*2)+(D*4)*E; // Количество ячеек в Целевом ряду (Zcontrast)
 Xc = Mathf.Abs((Y1*LR)-Mathf.RoundToInt(Mathf.Abs(k-LR)*Y1)); // Порядковый номер ячейки в Целевом ряду (Zcontrast)
 Xx = (127-Y1/2f)+Xc+(Q-1)*255; // Цвет - на контрастности Zcontrast
//------------------- Если оттенок меняется вручную ----------------------------------------------------------------
 if (NumOfShade_Before != NumOfShade_New)
 {
 // ^ 1.^ - Противоположное значение цвета -------------------------------------------------------------
 if (NumOfShade_New<0) Lc = 1; else Lc = 0;
 // 'не обязательно' Чтобы найти значение цвета через определенный промежуток - прибавить число от +-1 до +-1529
 Xmain = NumOfShade_Before + (Lc*1530)+ (NumOfShade_New-NumOfShade_Before);
 Lc = Mathf.FloorToInt(Xmain/1530f); // Если Xmain>1529, то Lc=1, иначе Lc=0
 Xmain = Xmain - Lc*1530; // Установить значение цвета в пределах от 0 до 1529. Ниже поменять Xall = Xmain+1;
Xall = Xmain; // Координата выбранной ячейки с цветом, по оси X
 // Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
 Xout =  Mathf.CeilToInt((765-Xall)/766f)*((1-Mathf.CeilToInt(Xall/1531f))+Mathf.FloorToInt(Xall/1531f)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
 Xall2 = Xall + Xout - 1; // Выравниваем значение координаты Xall
 Q = Mathf.CeilToInt((Xall2+1)/255f);    // Номер выбранного треугольника
 E = 1-(Q/2f-Mathf.FloorToInt(Q/2f))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
 Y1 = (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
 Xborder = 127-(Y1/2f); // Количество пустых ячеек, слева от треугольника
 Qa = (Q-1)*255;       // Координаты квадрата с выбранным треугольником
 Xc = Xall2-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
 LR = Mathf.CeilToInt((Xc/254f)-0.5f) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
 Lc = 1-Mathf.CeilToInt(Mathf.FloorToInt(Mathf.Abs((Xall2-Qa)-127)/((Y1/2f)+1))/128f); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
 Xc = (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
 // т.к. в 1 ряду, при D=0,5, только 1 пустая ячейка, то делаем сплошной переход (включая в рассчеты эту ячейку)
 SkipRow1 = Mathf.FloorToInt((127-Zcontrast)/126f)*(D*2)*(1-Lc);  // При D=0,5 и Zcontrast=1, SkipRow1=1, иначе 0
// Оттенок относительно контрастности Zcontrast
 Xx= Mathf.FloorToInt(((1530*(1-Mathf.CeilToInt((Q-1)/6f))+Qa-Xborder-1+(1-2*E)*(D*2))*(1-LR)+ (Qa+255+Xborder-(1-2*E)*(D*2)-1530*Mathf.FloorToInt(Q/6f))*
 LR)*(1-Lc-SkipRow1+Mathf.Abs(Xout))+ (Xall-1)*(Lc+SkipRow1-Mathf.Abs(Xout))); // Цвет - на контрастности Zcontrast
Xx = (Mathf.Abs(Xx)+Xx)/2f; // Если Xx меньше 0, то Xx = 0, иначе оставить то же число
 if (Xx>1529) Xx = 0;
Q = Mathf.CeilToInt((Xx+1)/255f);    // Номер выбранного треугольника
 E = 1-(Q/2f-Mathf.FloorToInt(Q/2f))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
 Y1 = (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
 Xborder = 127-(Y1/2f); // Количество пустых ячеек, слева от треугольника
 Qa = (Q-1)*255;       // Координаты квадрата с выбранным треугольником
 Xc = Xx-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
 LR = Mathf.CeilToInt((Xc/254f)-0.5f) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
 Lc = 1-Mathf.CeilToInt(Mathf.FloorToInt(Mathf.Abs((Xx-Qa)-127)/((Y1/2f)+1))/128f); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
 Xc = (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
// Оттенок относительно контрастности Zcontrast
 Zero2 = 1-Mathf.CeilToInt(Y1/254f); // Переменная, для исключения деления на ноль
//  (Xc+Zero2) Можно поменять на  (Xc+Zero2/2f)- чтобы 'k' в 127 ряду (0 ячейка), был =  0,5. Или только (Xc), 'k'=0
 k = (1/(Y1+Zero2))*(Xc+Zero2);   // Коэффициент положения ячейки в Основном ряду (Zcontrast)
 Y2 = ((127-Z)*2)+(D*4)*E; // Количество ячеек в Целевом ряду (Zcontrast)
 Xc2 = Mathf.Abs((Y2*LR)-Mathf.RoundToInt(Mathf.Abs(k-LR)*Y2)); // Порядковый номер ячейки в Целевом ряду (Zcontrast)
 Xx2 = (127-Y2/2f)+Xc2+(Q-1)*255; // Цвет - на контрастности Zcontrast
 Main_NumOfShade3 = Mathf.FloorToInt(Xx2+1);
 }
 else // Если оттенок меняется программно
 {
 Q = Mathf.CeilToInt((Xx+1)/255f);    // Номер выбранного треугольника
 E = 1-(Q/2f-Mathf.FloorToInt(Q/2f))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
 Y1 = (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
 Xborder = 127-(Y1/2f); // Количество пустых ячеек, слева от треугольника
 Qa = (Q-1)*255;       // Координаты квадрата с выбранным треугольником
 Xc = Xx-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
 LR = Mathf.CeilToInt((Xc/254f)-0.5f) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
 Lc = 1-Mathf.CeilToInt(Mathf.FloorToInt(Mathf.Abs((Xx-Qa)-127)/((Y1/2f)+1))/128f); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
 Xc = (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
 }
 //---------------------------------------------------------------------------------------------------------------------
Qrgbmax = Mathf.FloorToInt((Q+((1-LR)*(-E)+LR*E)-(LR*Mathf.FloorToInt(Q/6f)*6))/2f); // = 0- R, 1- G, 2- B .  К какому из цветов отнести RGBmax
 Qrgbmin = ((Q+((1-LR)*(-(1-E))+LR*(1-E))+((1-LR)*((1-Mathf.CeilToInt((Q-1)/6f))*6)))/2f)-1;   // = 0- B, 1- R, 2- G .                            - RGBmin
 Qp = Q - Mathf.FloorToInt(Q/4f)*3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
 Qrgbmid = (Qp+LR-(LR*Mathf.FloorToInt(Qp/3f)*3))-1;  //  = 0- B, 1- G, 2- R .  К какому из цветов отнести RGBmid
 // Приравниваем RGB(min,max,mid) к соответствующим Rm, Gm, Bm
 Rm = (1-Mathf.CeilToInt(Qrgbmax/2f))*2 + Mathf.FloorToInt(Qrgbmid/2f);
 Gm = (1-Mathf.Abs(Qrgbmax-1))*2 + (1-Mathf.Abs(Qrgbmid-1));
 Bm = Mathf.FloorToInt(Qrgbmax/2f)*2 + (1-Mathf.CeilToInt(Qrgbmid/2f));
// NoRow254= 0 если Yarkost=254, иначе NoRow254= 1.  «на 254 яркости, при D=0.5, нет ячеек с цветом»
 NoRow254 = 1-Mathf.FloorToInt(Yarkost/254f);
 // Вычислить максимальное, минимальное и среднее значение
 RGBmax2 = Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;
 RGBmin2 = Yarkost-(127-Zcontrast);
 RGBmid2 = Mathf.Abs(Mathf.Abs((Y1/2f)-Xc)+(RGBmin2*(1-E)-RGBmax2*E));
 //---------------------------- Полученный цвет RGB -----------------------------------------------
 // Сопоставить полученные результаты  (RGBmid, RGBmin, RGBmax) с (R, G, B)
 R2=Mathf.FloorToInt(Mathf.Abs((Mathf.FloorToInt(Rm/2f)*(RGBmax2+RGBmid2))+
 (Mathf.FloorToInt(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 G2=Mathf.FloorToInt(Mathf.Abs((Mathf.FloorToInt(Gm/2f)*(RGBmax2+RGBmid2))+
 (Mathf.FloorToInt(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 B2=Mathf.FloorToInt(Mathf.Abs((Mathf.FloorToInt(Bm/2f)*(RGBmax2+RGBmid2))+
 (Mathf.FloorToInt(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
//---------------------------- Указать новый оттенок, контрастность -----------------------------------------------
 // Чтобы процедура выполнялась только один раз
 Main_NumOfShade2 = Mathf.FloorToInt(Xx*BGW+1);
 Main_NumOfContrast2 = Mathf.FloorToInt(Zcontrast*BGW);
 ///////////////////////////////////////////////
 TrackBar_5_Check = Mathf.FloorToInt(Xx*BGW+1);
 TrackBar_6_Check = Mathf.FloorToInt(Zcontrast*BGW);
 TrackBar_5 = Mathf.FloorToInt(Xx*BGW+1); // Новый оттенок (Xx=0..1529, +1 для переброса между значениями)
 TrackBar_6 = Mathf.FloorToInt(Zcontrast*BGW); // Новая контрастность
if (!CheckBox_1) // Если нужно сохранять пропорции (яркость - контрастность)
 {
 DrawBrightTriangle(Mathf.FloorToInt((Light+D)*2),Mathf.FloorToInt((Yarkost+D)*2),
 Mathf.FloorToInt(Main_NumOfShade3*BGW),Mathf.FloorToInt(Z),Mathf.FloorToInt(Main_NumOfContrast3*BGW)); // Нарисовать треугольник яркости
 }
 else DrawBrightTriangle(Mathf.FloorToInt(254+D*2),Mathf.FloorToInt((Yarkost+D)*2),
 Mathf.FloorToInt(Main_NumOfShade3*BGW),Mathf.FloorToInt(Z),Mathf.FloorToInt(Main_NumOfContrast3*BGW)); // Нарисовать треугольник яркости
return true;
 }
public bool DrawBrightTriangle(int NumOfBright_1, int NumOfBright_2, int NumOfShade, 
 int NumOfContrast_1, int NumOfContrast_2) // Нарисовать треугольник яркости
 {
 // Очистить изображения 
 VirtualBrightTexture.SetPixels (ClearPixels1);
 VirtualDrawContrast.SetPixels (ClearPixels1);
// Переменные:
 //NumOfBright,NumOfShade,NumOfContrast,
 int i,j,X,Y,R,G,B;
 float RGBmin2,RGBmax2,RGBmid2,Rm,Gm,Bm,
 D,Xout,Xall2,Xx,k,Y1,Y2,Xc,Xc2,SkipRow1,Qrgbmax,Qrgbmin,Qrgbmid,Qp,
 E,Yarkost,Zcontrast,Xall,Xborder,LR,Zmax,Zmax2,Zero,Zero2,Q,Qa,BGW,Zazor,Lc,NoRow254;
 int Xdraw, Ydraw;
 float X2, Z;
//NumOfBright = ...; // яркость (от 0 до 508)
 //NumOfShade = ...; // оттенок (от 0 до 1529) либо (от 0 до 1531 - поменять формулу «Xall = NumOfShade;»)
 //NumOfContrast = ...; // контрастность (от 0 до 127)
if (VirtualTexture[NumOfBright_2]==null) { // Если изображение не загружено в массив
 VirtualTexture [NumOfBright_2] = new Texture2D (514, 259,TextureFormat.RGB565, false);
 //VirtualTexture [NumOfBright_2].filterMode = FilterMode.Point; // Для четкой отрисовки
if (Resources.Load<Texture2D>("Colors/"+NumOfBright_2.ToString ())!=null) { // Если файл найден, в ресурсах
 VirtualTexture [NumOfBright_2] = Resources.Load<Texture2D>("Colors/"+NumOfBright_2.ToString ());
 } else if (File.Exists ("Colors/"+NumOfBright_2.ToString () + ".png")) { // Если файл найден, в папке с проектом
 byte[] fileData; 
 fileData = File.ReadAllBytes ("Colors/"+NumOfBright_2.ToString () + ".png");
 VirtualTexture [NumOfBright_2].LoadImage (fileData);
 }  
 }
// Поменять цветные треугольники
 Color_Image_1.normal.background = VirtualTexture[NumOfBright_2];
if (NumOfBright_2 > 199)
 brushColor2 = new Color (0, 0, 0); // цвет кисти для линий 
 else // Поменять цвет кисти
 brushColor2 = new Color (0.9f,0.9f,0.9f,1);
Yarkost = NumOfBright_1 /2f; // Яркость (От 0 до 254)
 Zcontrast = NumOfContrast_1; // Контрастность
BGW = 1; //1f- Все цвета, кроме Ч/Б.  0 - Только Ч/Б цвета
 D = Yarkost-Mathf.FloorToInt(Yarkost); // Четная (D=0) или нечетная (D=0.5f) яркость
 Yarkost = Mathf.FloorToInt(Yarkost);
 Zmax = Mathf.FloorToInt(Mathf.Abs(127 - Mathf.Abs((127 - Yarkost) - D))) * BGW; // Максимальное количество рядов, на заданной яркости 'Yarkost'
 Lc = 1 - Mathf.CeilToInt(((127 - Zcontrast) - Zmax) /128f);  // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
 Zcontrast = (Zcontrast) * Lc + (127 - Zmax) * (1 - Lc); // Если выбранная контраст., за пределами Zmax, то Zcontrast=Zmax
 //------------------Поменять «Цвет» --------------------------------------
 // Xall = (от 0 до 1531), где 0 - координата для переброса из начала 1 треуг. в конец 6| 1531 - из конца 6 тр. в начало 1
 // а координаты от 1 до 1530, то же что и координаты с ячейками от 0 до 1529
 Xall = NumOfShade; // Координата выбранной ячейки с цветом, по оси X
 // Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
 Xout = Mathf.CeilToInt((765 - Xall) /766f) * ((1 - Mathf.CeilToInt(Xall /1531f)) + Mathf.FloorToInt(Xall /1531f)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
 Xall2 = Xall + Xout - 1; // Выравниваем значение координаты Xall
 Q = Mathf.CeilToInt((Xall2 + 1) /255f);    // Номер выбранного треугольника
 E = 1 - (Q /2f - Mathf.FloorToInt(Q /2f)) * 2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
 Y1 = (((127 - Zcontrast) * 2) + (D * 4) * E) * BGW; // Количество ячеек в ряду 'Zcontrast'
 Xborder = 127 - (Y1 /2f); // Количество пустых ячеек, слева от треугольника
 Qa = (Q - 1) * 255;       // Координаты квадрата с выбранным треугольником
 Xc = Xall2 - Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
 LR = Mathf.CeilToInt((Xc /254f) - 0.5f); // Если ячейка находится левее центра, то LR=0 , иначе LR=1
 Zero = 1 - Mathf.CeilToInt(Zmax /127f); // Переменная, для исключения деления на ноль
 // КОРРЕКТИРОВКА
 // Если координата в пределах треугольника, то Lc=1, если за пределами, то Lc=0
 Lc = 1-Mathf.CeilToInt(Mathf.FloorToInt(Mathf.Abs((Xall2-Qa)-127)/((Y1/2f)+1))/128f);
 Xc = (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc); // Порядковый номер выбранной ячейки в треугольнике
 // т.к. в 1 ряду, при D=0,5f, только 1 пустая ячейка, то стандартный переброс
 // между ячейками невозможен, поэтому следует сделать сплошной переход (включая в рассчеты пустую ячейку)
 SkipRow1 = Mathf.FloorToInt((127-Zcontrast)/126f)*(D*2)*(1-Lc); // При D=0,5f и Z=1, SkipRow1=1, иначе 0
 // Координата по оси X, на общей сетке координат
 Xx = Mathf.FloorToInt(((1530*(1-Mathf.CeilToInt((Q-1)/6f))+Qa-Xborder-1+(1-2*E)*(D*2))*(1-LR)+
 (Qa+255+Xborder-(1-2*E)*(D*2)-1530*Mathf.FloorToInt(Q/6f))*LR)*
 (1-Lc-SkipRow1+Mathf.Abs(Xout))+ (Xall-1)*(Lc+SkipRow1-Mathf.Abs(Xout)));
 //        = 0- R, 1- G, 2- B,  К какому из цветов отнести максимальное значение RGBmax
 Qrgbmax = Mathf.FloorToInt((Q+((1-LR)*(-E)+LR*E)-(LR*Mathf.FloorToInt(Q/6f)*6))/2f);
 //        = 0- B, 1- R, 2- G,  К какому из цветов отнести минимальное значение RGBmin
 Qrgbmin = ((Q+((1-LR)*(-(1-E))+LR*(1-E))+((1-LR)*((1-Mathf.CeilToInt((Q-1)/6f))*6)))/2f)-1;
 Qp = Q - Mathf.FloorToInt(Q/4f)*3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
 //        = 0- B, 1- G, 2- R ,  К какому из цветов отнести среднее значение RGBmid
 Qrgbmid = (Qp+LR-(LR*Mathf.FloorToInt(Qp/3f)*3))-1;
 // Приравниваем RGB(min,max,mid) к соответствующим R, G, B
 Rm = (1-Mathf.CeilToInt(Qrgbmax/2f))*2 + Mathf.FloorToInt(Qrgbmid/2f);
 Gm = (1-Mathf.Abs(Qrgbmax-1))*2 + (1-Mathf.Abs(Qrgbmid-1));
 Bm = Mathf.FloorToInt(Qrgbmax/2f)*2 + (1-Mathf.CeilToInt(Qrgbmid/2f));
Zazor = 1;  // Зазор между треугольниками
 for (j = 0; j <=(254-Mathf.FloorToInt(D*2)); j++) // Яркость от 0 до 254
 {
 // Яркость
 Yarkost = j;
 Zmax2 = Mathf.FloorToInt(Mathf.Abs(127-Mathf.Abs((127-Yarkost)-D)));
for (i = 0; i <=Mathf.FloorToInt(Zmax2); i++) // Контрастность
 {
 // Контрастность
 Zcontrast = 127-i;
Zero2 = 1-Mathf.CeilToInt(Y1/254f);
 k = (1/(Y1+Zero2))*Xc;
 Y2 = ((127-Zcontrast)*2)+(D*4)*E;
 Xc2 = Mathf.Abs((Y2*LR)-Mathf.RoundToInt(Mathf.Abs(k-LR)*Y2));
// нужно т.к. на 254 яркости, при D=0.5f, нет ячеек с цветом
 NoRow254 = 1-Mathf.FloorToInt(Yarkost/254f); //0f если TheYarkost=254, иначе 1
RGBmin2 = Yarkost-(127-Zcontrast);
 RGBmax2 = Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;
 RGBmid2 = Mathf.Abs(Mathf.Abs((Y2/2f)-Xc2)+(RGBmin2*(1-E)-RGBmax2*E));
// Сопоставить полученные результаты  (RGBmid, RGBmin, RGBmax) с (R, G, B)
 R=Mathf.FloorToInt(Mathf.Abs((Mathf.FloorToInt(Rm/2f)*(RGBmax2+RGBmid2))+(Mathf.FloorToInt(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 G=Mathf.FloorToInt(Mathf.Abs((Mathf.FloorToInt(Gm/2f)*(RGBmax2+RGBmid2))+(Mathf.FloorToInt(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 B=Mathf.FloorToInt(Mathf.Abs((Mathf.FloorToInt(Bm/2f)*(RGBmax2+RGBmid2))+(Mathf.FloorToInt(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
// Нарисовать точку с цветом по координатам: X = (j+128)+Mathf.FloorToInt(D*4+Zazor) , Y = Mathf.FloorToInt(127-i);
 brushColor = new Color (R / 255f, G / 255f, B / 255f); // цвет кисти  
 VirtualBrightTexture.SetPixel ((j+128)+Mathf.FloorToInt(D*4+Zazor), 258 - Mathf.FloorToInt(127-i), brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
 }
///////////////////////////////////////////////////////////////////////////////
 if (CheckBox_2) // Если нужно рисовать линию контрастности на треугольнике с яркостью
 {
 // Линия контрастности на треугольнике с яркостью
 Zcontrast = NumOfContrast_2; // Контрастность
Lc = 1-Mathf.CeilToInt(((127-Zcontrast)-Zmax)/128f); // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
 Zcontrast = (127-Zcontrast)*Lc + Zmax*(1-Lc); // Если выбранная контрастность, за пределами Zmax, то Zcontrast=Zmax
 Lc = 1-Mathf.CeilToInt((Zmax2-Zmax)/128f); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
 Zero = 1-Mathf.CeilToInt(Zmax/127f); // Переменная, для исключения деления на ноль
 Zcontrast = 127 - (Mathf.RoundToInt((Zmax2/(Zmax+Zero))*Zcontrast)*Lc + Zcontrast*(1-Lc));  // Ряд-Контрастность , при «Yarkost»
// Нарисовать точку по координатам: X = (j+128)+Mathf.FloorToInt(D*4+Zazor) , Y = Mathf.FloorToInt(Zcontrast);         
 VirtualDrawContrast.SetPixel ((j+128)+Mathf.FloorToInt(D*4+Zazor), 258 - Mathf.FloorToInt(Zcontrast), brushColor2); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
 }
 ///////////////////////////////////////////////////////////////////////////////
if (CheckBox_4) // Если нужно рисовать, ч/б линию яркости , под треугольником яркости
 {
 // Рисуем ч/б линию яркости, по координатам: X = (j+128)+Mathf.FloorToInt(D*4+Zazor) , Y = 129;
 brushColor = new Color (j / 255f, j / 255f, j / 255f); // цвет кисти  
 VirtualBrightTexture.SetPixel ((j+128)+Mathf.FloorToInt(D*4+Zazor), 258 - 129, brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
 }
 else // Иначе закрасить линию белым
 {
 brushColor = new Color (1, 1, 1, 0); // цвет кисти  
 VirtualBrightTexture.SetPixel ((j+128)+Mathf.FloorToInt(D*4+Zazor), 258 - 129, brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
 }
}
 ////////////////////////////////////////////////////////////////////////
 // Точка на треугольнике с Яркостью
 Yarkost = NumOfBright_2 /2f; // Яркость (От 0 до 254)
 D = Yarkost-Mathf.FloorToInt(Yarkost); // Четная (D2=0) или нечетная (D2=0.5f) яркость
 Yarkost = Mathf.FloorToInt(Yarkost);
 Zcontrast = NumOfContrast_2; // Контрастность
Zmax2 = Mathf.FloorToInt(Mathf.Abs(127-Mathf.Abs((127-Yarkost)-D)))*BGW;
Lc = 1-Mathf.CeilToInt(((127-Zcontrast)-Zmax)/128f); // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
 Zcontrast = Zcontrast*Lc + (127-Zmax)*(1-Lc); // Если выбранная контрастность, за пределами Zmax, то Zcontrast=Zmax
 Lc = 1-Mathf.CeilToInt((Zmax2-Zmax)/128f); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
 Zero = 1-Mathf.CeilToInt(Zmax/127f); // Переменная, для исключения деления на ноль
 // Zcontrast = 127 - (Mathf.RoundToInt((Zmax2/(Zmax+Zero))*Zcontrast)*Lc + Zcontrast*(1-Lc));  // Ряд-Контрастность , при «Yarkost»
 Zcontrast = 127 - (Mathf.RoundToInt((Zmax2/(Zmax+Zero))*(127-Zcontrast))*Lc + (127-Zcontrast)*(1-Lc));  // Ряд-Контрастность , при «Yarkost»
X = Mathf.FloorToInt((Yarkost+128)+Mathf.FloorToInt(D*4+Zazor));
 Y = Mathf.FloorToInt(Zcontrast);
if (CheckBox_3) // Если нужно рисовать точку на треугольнике яркости
 {
 for (i = 0; i <=2; i++)
 {
 for (j = 0; j <=2; j++)
 if (((Y-1)+i>=0) & ((Y-1)+i<=258))
 if (((X-1)+j>=0) & ((X-1)+j<=1529))
 if (((X-1)+j!=X) | ((Y-1)+i!=Y))
 {
 // Нарисовать точку по координатам: X = (X-1)+j , Y = (Y-1)+i;
 VirtualDrawContrast.SetPixel ((X-1)+j, 258 - ((Y-1)+i), brushColor2); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
 }
 }
 // Создать прозрачный пиксель, по центру созданного квадрата
 brushColor = new Color (1, 1, 1, 0); // цвет кисти  
 VirtualDrawContrast.SetPixel (X, 258 - Y, brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
 }
 ////////////////////////////////////////////////////////////////////////
 // Линия контрастности на цветных треугольниках
 Zmax2 = Zmax;
 Zazor = 1;
if (CheckBox_5) // Если нужно рисовать линию контрастности на цветных треугольниках
 {
 Zero2 = 1 - Mathf.CeilToInt (Y1 / 254f);
 k = (1 / (Y1 + Zero2)) * Xc;
for (i = 0; i <=Mathf.FloorToInt(Zmax); i++)
 {
 Z = 127 - i;
Lc = 1 - Mathf.CeilToInt(((127 - Z) - Zmax) /128f); // Если Z<=Zmax , то Lc=1, Если Z>Zmax, то Lc=0
 Z = (127 - Z) * Lc + Zmax * (1 - Lc); // Если выбранная контрастность, за пределами Zmax, то Z=Zmax
 Lc = 1 - Mathf.CeilToInt((Zmax2 - Zmax) /128f); // Если Zmax2<=Zmax , то Lc=1, Если Zmax2>Zmax, то Lc=0
 Z = 127 - (Mathf.RoundToInt((Zmax2 / (Zmax + Zero)) * Z) * Lc + Z * (1 - Lc));
Y2 = ((127 - Z) * 2) + (D * 4) * E;
 Xc2 = Mathf.Abs((Y2 * LR) - Mathf.RoundToInt(Mathf.Abs(k - LR) * Y2));
 //X2 = Qq + Z - (D * 2) * E + Xc2; // Положение относительно реальной сетки координат
 X2 = (127-Y2/2f)+Xc2+(Q-1)*255; // Координата по оси X, на общей сетке координат (При измененной яркости-контр.)
if (Q == 1)
 {
 Xdraw = Mathf.CeilToInt (Z);    // Координата для отрисовки на картинку, по оси X
 Ydraw = Mathf.CeilToInt ((254 - X2 + 1) + Zazor); // Координата для отрисовки на картинку, по оси Y
 }
 else if (Q == 2)
 {
 Xdraw = Mathf.CeilToInt (X2 - 255 + D * 2); // Координата для отрисовки на картинку, по оси X
 Ydraw = Mathf.CeilToInt (Z);    // Координата для отрисовки на картинку, по оси Y
 }
 else if (Q == 3)
 {
 Xdraw = Mathf.CeilToInt (X2 - 255 + 1 + Zazor * 2 + D * 2); // Координата для отрисовки на картинку, по оси X
 Ydraw = Mathf.CeilToInt (Z);    // Координата для отрисовки на картинку, по оси Y
 }
 else if (Q == 4)
 {
 Xdraw = Mathf.CeilToInt (127 - Z + 382 + D * 2 + 1 + Zazor * 2 + D * 2);    // Координата для отрисовки на картинку, по оси X
 Ydraw = Mathf.CeilToInt ((X2 - ((Q - 1) * 255 - 1)) + Zazor); // Координата для отрисовки на картинку, по оси Y
 }
 else if (Q == 5)
 {
 Xdraw = Mathf.CeilToInt (509 - (X2 - 1020) + 1 + Zazor * 2 + D * 2); // Координата для отрисовки на картинку, по оси X
 Ydraw = Mathf.CeilToInt ((127 - Z + 129) + Zazor * 2);    // Координата для отрисовки на картинку, по оси Y
 }
 else
 {
 Xdraw = Mathf.CeilToInt (254 - (X2 - 1275) + (D * 2)); // Координата для отрисовки на картинку, по оси X
 Ydraw = Mathf.CeilToInt ((127 - Z + 129) + Zazor * 2);    // Координата для отрисовки на картинку, по оси Y
 }
// Линия контрастности
 VirtualDrawContrast.SetPixel (Xdraw, 258 - Ydraw, brushColor2); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
 }
 }
 //+++++++++++++++++++++++++++++++++++++++++++
if (CheckBox_6) // Если нужно рисовать точку на цветных треугольниках
 {
 // Нарисовать точку контрастности на цветных треугольниках +++++++++++++++++++++++++
 Zero2 = 1 - Mathf.CeilToInt(Y1 /254f);
 k = (1 / (Y1 + Zero2)) * Xc;
 Y2 = ((127 - Zcontrast) * 2) + (D * 4) * E;
 Xc2 = Mathf.Abs((Y2 * LR) - Mathf.RoundToInt(Mathf.Abs(k - LR) * Y2));
 X2 = (127-Y2/2f)+Xc2+(Q-1)*255; // Координата по оси X, на общей сетке координат (При измененной яркости-контр.)
Zazor = 1;
if (Q == 1)
 {
 Xdraw = Mathf.FloorToInt (Zcontrast);    // Координата для отрисовки на картинку, по оси X
 Ydraw = Mathf.FloorToInt ((254 - X2 + 1) + Zazor); // Координата для отрисовки на картинку, по оси Y
 }
 else if (Q == 2)
 {
 Xdraw = Mathf.CeilToInt (X2 - 255 + D * 2); // Координата для отрисовки на картинку, по оси X
 Ydraw = Mathf.CeilToInt (Zcontrast);    // Координата для отрисовки на картинку, по оси Y
 }
 else if (Q == 3)
 {
 Xdraw = Mathf.FloorToInt (X2 - 255 + 1 + Zazor * 2 + D * 2); // Координата для отрисовки на картинку, по оси X
 Ydraw = Mathf.FloorToInt (Zcontrast);    // Координата для отрисовки на картинку, по оси Y
 }
 else if (Q == 4)
 {
 Xdraw = Mathf.FloorToInt (127 - Zcontrast + 382 + D * 2 + 1 + Zazor * 2 + D * 2);    // Координата для отрисовки на картинку, по оси X
 Ydraw = Mathf.FloorToInt ((X2 - ((Q - 1) * 255 - 1)) + Zazor); // Координата для отрисовки на картинку, по оси Y
 }
 else if (Q == 5)
 {
 Xdraw = Mathf.FloorToInt (509 - (X2 - 1020) + 1 + Zazor * 2 + D * 2); // Координата для отрисовки на картинку, по оси X
 Ydraw = Mathf.FloorToInt ((127 - Zcontrast + 129) + Zazor * 2);    // Координата для отрисовки на картинку, по оси Y
 }
 else
 {
 Xdraw = Mathf.FloorToInt (254 - (X2 - 1275) + (D * 2)); // Координата для отрисовки на картинку, по оси X
 Ydraw = Mathf.FloorToInt ((127 - Zcontrast + 129) + Zazor * 2);    // Координата для отрисовки на картинку, по оси Y
 }
for (i = 0; i <=2; i++)
 {
 for (j = 0; j <=2; j++)
 {
 if (((Ydraw - 1) + i >= 0) & ((Ydraw - 1) + i <= 258))
 if (((Xdraw - 1) + j >= 0) & ((Xdraw - 1) + j <= 1529))
 if (((Xdraw - 1) + j != Xdraw) | ((Ydraw - 1) + i != Ydraw))
 {
 // Нарисовать точку по координатам: Xdraw , Ydraw;
 VirtualDrawContrast.SetPixel ((Xdraw - 1) + j, 258 - ((Ydraw - 1) + i), brushColor2); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
 }
 else
 { // Создать прозрачный пиксель, по центру созданного квадрата
 brushColor = new Color (1, 1, 1, 0); // цвет кисти  
 VirtualDrawContrast.SetPixel ((Xdraw - 1) + j, 258 - ((Ydraw - 1) + i), brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
 }
 }
 }
 }
if (CheckBox_7) // Если нужно заполнять квадрат с цветом
 {
 // Заполняем КВАДРАТ с выбранным цветом
 for (j = 215+Mathf.FloorToInt(D*2); j <=296+Mathf.FloorToInt(D*2); j++)
 { // Яркость от 0 до 254
 for (i = 131; i <=212; i++)
 { // Контрастность
 if ((j > 215+Mathf.FloorToInt(D*2)) & (j < 255+Mathf.FloorToInt(D*2)) & (i > 131) & (i < 212))
 { // Цвет
 // Нарисовать точку с цветом по координатам: X = j , Y = i;
 brushColor = new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f); // цвет кисти  
 VirtualBrightTexture.SetPixel (j, 258 - i, brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
 }
 else
 if ((j > 255+Mathf.FloorToInt(D*2)) & (j < 296+Mathf.FloorToInt(D*2)) & (i > 131) & (i < 212))
 { // Цвет
 // Нарисовать точку с цветом по координатам: X = j , Y = i;
 brushColor = new Color (Main_R2 / 255f, Main_G2 / 255f, Main_B2 / 255f); // цвет кисти  
 VirtualBrightTexture.SetPixel (j, 258 - i, brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
 }
 else // Черная рамка
 {
 // Нарисовать точку с цветом по координатам: X = j , Y = i;
 brushColor = new Color (0, 0, 0); // цвет кисти  
 VirtualBrightTexture.SetPixel (j, 258 - i, brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
 }
 }
 }
 }
// Для цветных треугольников 
 VirtualBrightTexture.Apply ();
 // Для линий и точек
 VirtualDrawContrast.Apply ();
Color_Image_2.normal.background = VirtualBrightTexture; // Показать треугольник яркости
 Color_Image_3.normal.background = VirtualDrawContrast; // Показать линии
return true; 
 }
public bool CreateBrightTriangles() // Создать цветные треугольники
 {
 int w2 = 514; // Ширина текстуры
 int h2 = 259; // Высота текстуры
System.IO.Directory.CreateDirectory("Colors");
for (int D0 = 0; D0 < 2; D0++) {
 for (int StepLight = 0; StepLight < 255; StepLight++)
 if (D0 + StepLight < 255) { 
int StepLight2 = Mathf.FloorToInt ((StepLight + (D0 / 2f)) * 2); // Яркость от 0 до 508 (Поделить на 2, чтобы определить значение яркости в пределах от 0 до 254)
//VirtualTexture [StepLight2] = new Texture2D (w2, h2);
 //VirtualTexture [StepLight2].filterMode = FilterMode.Point; // Для четкой отрисовки
VirtualTexture [StepLight2] = new Texture2D (w2, h2,TextureFormat.RGB565, false);
 //VirtualTexture [StepLight2].filterMode = FilterMode.Point; // Для четкой отрисовки
Color[] pixels = new Color[w2*h2]; // Создать пустой массив для изображения
for (Q = 1; Q < 7; Q++) {  // № Треугольника (от 1 до 6)
 // Построить цветной треугольник ------------------------------------------------------------------  
 Light1 = (StepLight * 2 + D0) / 2f; // Яркость
 D = Light1 - Mathf.FloorToInt (Light1); // Если число дробное, то D=0.5, иначе D=0
 Light = Light1 - D;
 D2 = Mathf.FloorToInt (Light / 254f);  // Исключается 254 и 255 яркость (D=0)
 A = Mathf.FloorToInt (Light / 127f) - D2;  // Если яркость «Light» >=128, то A=1 , иначе A=0
 Zmax = (127 - Mathf.Abs (Light - 127) - ((D * 2) * A)) * (1 - D2);  // Максимальное кол-во рядов на заданной яркости «Light»
 cW = (127 - (127 - Zmax)) * 2 + (D * 2) + 1;  // Количество ячеек в самом верхнем ряду «Zmax»
 Qq = 255 * (Q - 1);  // Отступ, от координат первого треугольника
 E = (Q / 2f);  // Целое или дробное число, для подсчета ниже
 E = (E - Mathf.FloorToInt (E)) * 4 - 1;  // Если выбран цвет типа 255 255 0, то E=-1 , если 255 0 0 , то E=1
 E2 = Mathf.Abs (E - 1) / 2;  // Если выбран цвет типа 255 255 0, то E2=1 , если 255 0 0 , то E2=0
// Начать цикл
 for (i = 127; i > Mathf.FloorToInt (127 - Zmax) - 1; i--) { // Снизу вверх, (от 127 до 0), где вместо 0 ставится макс. кол-во рядов Zmax
 cW = (127 - i) * 2; // Кол-во ячеек в ряду - i ((-1), т.к. 0 считается за единицу)
 for (j = Mathf.FloorToInt (i - (D * 2) * E2); j < Mathf.FloorToInt ((i + cW) + (D * 2) * E2) + 1; j++) { // Цикл от i ячейки , до макс. количества ячеек в ряду (-1)
 // Найти максимальное, минимальное и среднее значение (R,G,B)
 RGBmax = Light + 1 + (D * 2) + (127 - i);
 RGBmid = Mathf.Abs (Light - (127 - i) * E + Mathf.Abs (127 - j) * E) + E2 * (1 + D * 2) + (Mathf.CeilToInt (Mathf.Abs (127 - j) / 130f)) * (1 - Mathf.CeilToInt (Light / 256f)) * E * (D * 4);
 RGBmin = Light - (127 - i);
 L2 = Mathf.CeilToInt ((j / 254f) - 0.5f); // Если ячейка находится левее центра, то L2=0 , иначе L2=1
 Qt = 1 - (Q / 2f - Mathf.FloorToInt (Q / 2f)) * 2; // Если треугольник = четному числу, то E = 1 иначе E = 0
 Qrgbmax = Mathf.FloorToInt ((Q + ((1 - L2) * (-Qt) + L2 * Qt) - (L2 * Mathf.FloorToInt (Q / 6f) * 6)) / 2); // = 0- R, 1- G, 2- B .  К какому из цветов отнести RGBmax
 Qrgbmin = ((Q + ((1 - L2) * (-(1 - Qt)) + L2 * (1 - Qt)) + ((1 - L2) * ((1 - Mathf.CeilToInt ((Q - 1) / 6f)) * 6))) / 2) - 1; // = 0- B, 1- R, 2- G .                            - RGBmin
 Qp = Q - Mathf.FloorToInt (Q / 4f) * 3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
 Qrgbmid = (Qp + L2 - (L2 * Mathf.FloorToInt (Qp / 3f) * 3)) - 1; //  = 0- B, 1- G, 2- R .  К какому из цветов отнести RGBmid
 // Приравниваем RGB(min,max,mid) к соответствующим R, G, B
 R = (1 - Mathf.CeilToInt (Qrgbmax / 2f)) * RGBmax + (1 - Mathf.Abs (Qrgbmin - 1)) * RGBmin + Mathf.FloorToInt (Qrgbmid / 2f) * RGBmid;
 G = (1 - Mathf.Abs (Qrgbmax - 1)) * RGBmax + Mathf.FloorToInt (Qrgbmin / 2f) * RGBmin + (1 - Mathf.Abs (Qrgbmid - 1)) * RGBmid;
 B = Mathf.FloorToInt (Qrgbmax / 2f) * RGBmax + (1 - Mathf.CeilToInt (Qrgbmin / 2f)) * RGBmin + (1 - Mathf.CeilToInt (Qrgbmid / 2f)) * RGBmid;
 X2 = j + Qq; // Основная координата ячейки по оси X
Zazor = 1;  // Если нужен зазор между треугольниками
 if (Q == 1) { // Для 1 треугольника// Координаты цвета на картинке, по оси X, Y
 Xdraw = Mathf.FloorToInt (i);
 Ydraw = Mathf.FloorToInt (254 - X2 + 1) + Zazor;
 } else if (Q == 2) {  // Для 2 треугольника// Координаты цвета на картинке, по оси X, Y
 Xdraw = Mathf.FloorToInt (X2 - 255 + D * 2);
 Ydraw = Mathf.FloorToInt (i);
 } else if (Q == 3) { // Для 3 треугольника// Координаты цвета на картинке, по оси X, Y
 Xdraw = Mathf.FloorToInt (X2 - 255 + 1 + Zazor * 2 + D * 2);
 Ydraw = Mathf.FloorToInt (i);
 } else if (Q == 4) { // Для 4 треугольника// Координаты цвета на картинке, по оси X, Y
 Xdraw = Mathf.FloorToInt (127 - i + 382 + D * 2 + 1 + Zazor * 2 + D * 2);
 Ydraw = Mathf.FloorToInt (X2 - ((Q - 1) * 255 - 1)) + Zazor;
 } else if (Q == 5) { // Для 5 треугольника// Координаты цвета на картинке, по оси X, Y
 Xdraw = Mathf.FloorToInt (509 - (X2 - 1020) + 1 + Zazor * 2 + D * 2);
 Ydraw = Mathf.FloorToInt (127 - i + 129) + Zazor * 2;
 } else {     // Для 6 треугольника// Координаты цвета на картинке, по оси X, Y
 Xdraw = Mathf.FloorToInt (254 - (X2 - 1275) + (D * 2));
 Ydraw = Mathf.FloorToInt (127 - i + 129) + Zazor * 2;
 }
// Отрисовать цвет (RGB), по координатам - X=Xdraw; Y=Ydraw
 pixels[(h2-1-Ydraw)*w2+Xdraw] = new Color (R / 255f, G / 255f, B / 255f); // '(h2-1) = (высота текстуры-1)', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'
 }
 }
 } 
 // Сохранить текстуру в памяти 
 VirtualTexture [StepLight2].SetPixels (pixels);
 VirtualTexture [StepLight2].Apply ();
// Сохранить текстуру в папку
 byte[] bytes = VirtualTexture [StepLight2].EncodeToPNG ();
 string finalPath = "Colors/"+StepLight2.ToString () + ".png";
 File.WriteAllBytes (finalPath, bytes);
 }  
 }
 return true;
 }
}
StatusReleased
CategoryTool
PlatformsHTML5
AuthorUchenik_333
Made withUnity

Download

Download
Script.7z 16 kB

Leave a comment

Log in with itch.io to leave a comment.