GLS.Color.pas 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048
  1. //
  2. // The graphics engine GLScene
  3. //
  4. unit GLS.Color;
  5. (* All color types, constants and utilities should go here *)
  6. interface
  7. {$I Stage.Defines.inc}
  8. uses
  9. System.Types,
  10. System.SysUtils,
  11. System.Classes,
  12. System.UITypes, // Colors
  13. Stage.VectorTypes,
  14. Stage.VectorGeometry,
  15. Stage.Utils,
  16. GLS.PersistentClasses,
  17. GLS.BaseClasses;
  18. type
  19. PGLColorVector = ^TGLColorVector;
  20. TGLColorVector = TVector4f;
  21. PRGBColor = ^TRGBColor;
  22. TRGBColor = TVector3b;
  23. // Wraps an OpenGL color.
  24. TGLColor = class(TGLUpdateAbleObject)
  25. private
  26. FColor: TGLColorVector;
  27. FPDefaultColor: PGLColorVector;
  28. procedure SetColorVector(const aColor: TGLColorVector); overload;
  29. procedure SetColorComponent(index: Integer; value: Single);
  30. function GetColorComponent(const index: Integer): Single;
  31. procedure SetAsWinColor(const val: TColor);
  32. function GetAsWinColor: TColor;
  33. procedure SetDirectColorVector(const aColor: TGLColorVector);
  34. protected
  35. procedure DefineProperties(Filer: TFiler); override;
  36. procedure ReadData(Stream: TStream);
  37. procedure WriteData(Stream: TStream);
  38. function GetHSVA: TGLVector;
  39. procedure SetHSVA(const hsva: TGLVector);
  40. public
  41. constructor Create(AOwner: TPersistent); override;
  42. constructor CreateInitialized(AOwner: TPersistent;
  43. const Color: TGLColorVector; changeEvent: TNotifyEvent = nil);
  44. destructor Destroy; override;
  45. procedure NotifyChange(Sender: TObject); override;
  46. procedure Assign(Source: TPersistent); override;
  47. procedure Initialize(const color: TGLColorVector);
  48. function AsAddress: PSingle;
  49. procedure RandomColor;
  50. procedure SetColor(Red, Green, Blue: Single; Alpha: Single = 1); overload;
  51. property Color: TGLColorVector read FColor write SetColorVector;
  52. property DirectColor: TGLColorVector read FColor write SetDirectColorVector;
  53. property AsWinColor: TColor read GetAsWinColor write SetAsWinColor;
  54. property hsva: TGLVector read GetHSVA write SetHSVA;
  55. property DefaultColor: TGLColorVector read FColor;
  56. published
  57. property Red: Single index 0 read GetColorComponent write SetColorComponent
  58. stored False;
  59. property Green: Single index 1 read GetColorComponent
  60. write SetColorComponent stored False;
  61. property Blue: Single index 2 read GetColorComponent write SetColorComponent
  62. stored False;
  63. property Alpha: Single index 3 read GetColorComponent
  64. write SetColorComponent stored False;
  65. end;
  66. PGLColorEntry = ^TGLColorEntry;
  67. TGLColorEntry = record
  68. Name: String;
  69. Color: TGLColorVector;
  70. end;
  71. TGLColorManager = class(TList)
  72. public
  73. destructor Destroy; override;
  74. procedure AddColor(const aName: String; const aColor: TGLColorVector);
  75. procedure EnumColors(Proc: TGetStrProc); overload;
  76. procedure EnumColors(AValues: TStrings); overload;
  77. function FindColor(const aName: String): TGLColorVector;
  78. // Convert a clrXxxx or a '<Red Green Blue Alpha> to a color vector
  79. function GetColor(const aName: String): TGLColorVector;
  80. function GetColorName(const aColor: TGLColorVector): String;
  81. procedure RegisterDefaultColors;
  82. procedure RemoveColor(const aName: String);
  83. end;
  84. // Builds a TColor from Red Green Blue components.
  85. function RGB2Color(const r, g, b: Byte): TColor; inline;
  86. function ColorManager: TGLColorManager;
  87. procedure RegisterColor(const aName: String; const aColor: TGLColorVector);
  88. procedure UnRegisterColor(const aName: String);
  89. function GetRValue(rgb: DWORD): Byte; {$NODEFINE GetRValue}
  90. function GetGValue(rgb: DWORD): Byte; {$NODEFINE GetGValue}
  91. function GetBValue(rgb: DWORD): Byte; {$NODEFINE GetBValue}
  92. procedure InitGLSceneColors;
  93. // Converts a delphi color into its RGB fragments and correct range.
  94. function ConvertWinColor(aColor: TColor; Alpha: Single = 1): TGLColorVector;
  95. // Converts a color vector (containing float values)
  96. function ConvertColorVector(const aColor: TGLColorVector): TColor; overload;
  97. (* Converts a color vector (containing float values) and alter intensity.
  98. intensity is in [0..1] *)
  99. function ConvertColorVector(const aColor: TGLColorVector; intensity: Single): TColor; overload;
  100. // Converts RGB components into a color vector with correct range
  101. function ConvertRGBColor(const aColor: array of Byte): TGLColorVector;
  102. // color definitions
  103. const
  104. // Some extra colors, not declared in Vcl.Graphics.pas
  105. clForeground = TColor(-1);
  106. clButton = TColor(-2);
  107. clLight = TColor(-3);
  108. clMidlight = TColor(-4);
  109. clDark = TColor(-5);
  110. clMid = TColor(-6);
  111. clText = TColor(-7);
  112. clBrightText = TColor(-8);
  113. clButtonText = TColor(-9);
  114. clBase = TColor(-10);
  115. clBackground = TColor(-11);
  116. clShadow = TColor(-12);
  117. clHighlight = TColor(-13);
  118. clHighlightedText = TColor(-14);
  119. // Mapped role offsets
  120. cloNormal = 32;
  121. cloDisabled = 64;
  122. cloActive = 96;
  123. // Normal, mapped, pseudo, rgb values
  124. clNormalForeground = TColor(clForeground - cloNormal);
  125. clNormalButton = TColor(clButton - cloNormal);
  126. clNormalLight = TColor(clLight - cloNormal);
  127. clNormalMidlight = TColor(clMidlight - cloNormal);
  128. clNormalDark = TColor(clDark - cloNormal);
  129. clNormalMid = TColor(clMid - cloNormal);
  130. clNormalText = TColor(clText - cloNormal);
  131. clNormalBrightText = TColor(clBrightText - cloNormal);
  132. clNormalButtonText = TColor(clButtonText - cloNormal);
  133. clNormalBase = TColor(clBase - cloNormal);
  134. clNormalBackground = TColor(clBackground - cloNormal);
  135. clNormalShadow = TColor(clShadow - cloNormal);
  136. clNormalHighlight = TColor(clHighlight - cloNormal);
  137. clNormalHighlightedText = TColor(clHighlightedText - cloNormal);
  138. // Disabled, mapped, pseudo, rgb values
  139. clDisabledForeground = TColor(clForeground - cloDisabled);
  140. clDisabledButton = TColor(clButton - cloDisabled);
  141. clDisabledLight = TColor(clLight - cloDisabled);
  142. clDisabledMidlight = TColor(clMidlight - cloDisabled);
  143. clDisabledDark = TColor(clDark - cloDisabled);
  144. clDisabledMid = TColor(clMid - cloDisabled);
  145. clDisabledText = TColor(clText - cloDisabled);
  146. clDisabledBrightText = TColor(clBrightText - cloDisabled);
  147. clDisabledButtonText = TColor(clButtonText - cloDisabled);
  148. clDisabledBase = TColor(clBase - cloDisabled);
  149. clDisabledBackground = TColor(clBackground - cloDisabled);
  150. clDisabledShadow = TColor(clShadow - cloDisabled);
  151. clDisabledHighlight = TColor(clHighlight - cloDisabled);
  152. clDisabledHighlightedText = TColor(clHighlightedText - cloDisabled);
  153. // Active, mapped, pseudo, rgb values
  154. clActiveForeground = TColor(clForeground - cloActive);
  155. clActiveButton = TColor(clButton - cloActive);
  156. clActiveLight = TColor(clLight - cloActive);
  157. clActiveMidlight = TColor(clMidlight - cloActive);
  158. clActiveDark = TColor(clDark - cloActive);
  159. clActiveMid = TColor(clMid - cloActive);
  160. clActiveText = TColor(clText - cloActive);
  161. clActiveBrightText = TColor(clBrightText - cloActive);
  162. clActiveButtonText = TColor(clButtonText - cloActive);
  163. clActiveBase = TColor(clBase - cloActive);
  164. clActiveBackground = TColor(clBackground - cloActive);
  165. clActiveShadow = TColor(clShadow - cloActive);
  166. clActiveHighlight = TColor(clHighlight - cloActive);
  167. clActiveHighlightedText = TColor(clHighlightedText - cloActive);
  168. clFirstSpecialColor = clActiveHighlightedText;
  169. clMask = TColor($000000); //clWhite;
  170. clDontMask = TColor($FFFFFF); // clBlack;
  171. // Window's colors (must be filled at program startup,
  172. // since they depend on the desktop scheme)
  173. const
  174. {$J+ - allow change of the following typed constants}
  175. clrScrollBar: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  176. clrBackground: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  177. clrActiveCaption: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  178. clrInactiveCaption: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  179. clrMenu: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  180. clrWindow: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  181. clrWindowFrame: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  182. clrMenuText: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  183. clrWindowText: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  184. clrCaptionText: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  185. clrActiveBorder: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  186. clrInactiveBorder: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  187. clrAppWorkSpace: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  188. clrHighlight: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  189. clrHighlightText: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  190. clrBtnFace: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  191. clrBtnShadow: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  192. clrGrayText: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  193. clrBtnText: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  194. clrInactiveCaptionText: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  195. clrBtnHighlight: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  196. clr3DDkShadow: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  197. clr3DLight: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  198. clrInfoText: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  199. clrInfoBk: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  200. {$J- - disable change of other typed constants}
  201. // 'static' color definitions sort of grays
  202. clrTransparent: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 0);
  203. clrBlack: TGLColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  204. clrGray05: TGLColorVector = (X: 0.05; Y: 0.05; Z: 0.05; W: 1);
  205. clrGray10: TGLColorVector = (X: 0.10; Y: 0.10; Z: 0.10; W: 1);
  206. clrGray15: TGLColorVector = (X: 0.15; Y: 0.15; Z: 0.15; W: 1);
  207. clrGray20: TGLColorVector = (X: 0.20; Y: 0.20; Z: 0.20; W: 1);
  208. clrGray25: TGLColorVector = (X: 0.25; Y: 0.25; Z: 0.25; W: 1);
  209. clrGray30: TGLColorVector = (X: 0.30; Y: 0.30; Z: 0.30; W: 1);
  210. clrGray35: TGLColorVector = (X: 0.35; Y: 0.35; Z: 0.35; W: 1);
  211. clrGray40: TGLColorVector = (X: 0.40; Y: 0.40; Z: 0.40; W: 1);
  212. clrGray45: TGLColorVector = (X: 0.45; Y: 0.45; Z: 0.45; W: 1);
  213. clrGray50: TGLColorVector = (X: 0.50; Y: 0.50; Z: 0.50; W: 1);
  214. clrGray55: TGLColorVector = (X: 0.55; Y: 0.55; Z: 0.55; W: 1);
  215. clrGray60: TGLColorVector = (X: 0.60; Y: 0.60; Z: 0.60; W: 1);
  216. clrGray65: TGLColorVector = (X: 0.65; Y: 0.65; Z: 0.65; W: 1);
  217. clrGray70: TGLColorVector = (X: 0.70; Y: 0.70; Z: 0.70; W: 1);
  218. clrGray75: TGLColorVector = (X: 0.75; Y: 0.75; Z: 0.75; W: 1);
  219. clrGray80: TGLColorVector = (X: 0.80; Y: 0.80; Z: 0.80; W: 1);
  220. clrGray85: TGLColorVector = (X: 0.85; Y: 0.85; Z: 0.85; W: 1);
  221. clrGray90: TGLColorVector = (X: 0.90; Y: 0.90; Z: 0.90; W: 1);
  222. clrGray95: TGLColorVector = (X: 0.95; Y: 0.95; Z: 0.95; W: 1);
  223. clrWhite: TGLColorVector = (X: 1; Y: 1; Z: 1; W: 1);
  224. // other grays
  225. clrDimGray: TGLColorVector = (X: 0.329412; Y: 0.329412; Z: 0.329412; W: 1);
  226. clrGray: TGLColorVector = (X: 0.752941; Y: 0.752941; Z: 0.752941; W: 1);
  227. clrLightGray: TGLColorVector = (X: 0.658824; Y: 0.658824; Z: 0.658824; W: 1);
  228. // colors en masse
  229. clrAqua: TGLColorVector = (X: 0; Y: 1; Z: 1; W: 1);
  230. clrAquamarine: TGLColorVector = (X: 0.439216; Y: 0.858824; Z: 0.576471; W: 1);
  231. clrBakersChoc: TGLColorVector = (X: 0.36; Y: 0.20; Z: 0.09; W: 1);
  232. clrBlue: TGLColorVector = (X: 0; Y: 0; Z: 1; W: 1);
  233. clrBlueViolet: TGLColorVector = (X: 0.62352; Y: 0.372549; Z: 0.623529; W: 1);
  234. clrBrown: TGLColorVector = (X: 0.647059; Y: 0.164706; Z: 0.164706; W: 1);
  235. clrCadetBlue: TGLColorVector = (X: 0.372549; Y: 0.623529; Z: 0.623529; W: 1);
  236. clrCoral: TGLColorVector = (X: 1; Y: 0.498039; Z: 0.0; W: 1);
  237. clrCornflowerBlue: TGLColorVector = (X: 0.258824; Y: 0.258824; Z: 0.435294; W: 1);
  238. clrDarkGreen: TGLColorVector = (X: 0.184314; Y: 0.309804; Z: 0.184314; W: 1);
  239. clrDarkOliveGreen: TGLColorVector = (X: 0.309804; Y: 0.309804; Z: 0.184314; W: 1);
  240. clrDarkOrchid: TGLColorVector = (X: 0.6; Y: 0.196078; Z: 0.8; W: 1);
  241. clrDarkSlateBlue: TGLColorVector = (X: 0.419608; Y: 0.137255; Z: 0.556863; W: 1);
  242. clrDarkSlateGray: TGLColorVector = (X: 0.184314; Y: 0.309804; Z: 0.309804; W: 1);
  243. clrDarkSlateGrey: TGLColorVector = (X: 0.184314; Y: 0.309804; Z: 0.309804; W: 1);
  244. clrDarkTurquoise: TGLColorVector = (X: 0.439216; Y: 0.576471; Z: 0.858824; W: 1);
  245. clrFirebrick: TGLColorVector = (X: 0.556863; Y: 0.137255; Z: 0.137255; W: 1);
  246. clrForestGreen: TGLColorVector = (X: 0.137255; Y: 0.556863; Z: 0.137255; W: 1);
  247. clrFuchsia: TGLColorVector = (X: 1; Y: 0; Z: 1; W: 1);
  248. clrGold: TGLColorVector = (X: 0.8; Y: 0.498039; Z: 0.196078; W: 1);
  249. clrGoldenrod: TGLColorVector = (X: 0.858824; Y: 0.858824; Z: 0.439216; W: 1);
  250. clrGreenYellow: TGLColorVector = (X: 0.576471; Y: 0.858824; Z: 0.439216; W: 1);
  251. clrIndian: TGLColorVector = (X: 0.309804; Y: 0.184314; Z: 0.184314; W: 1);
  252. clrKhaki: TGLColorVector = (X: 0.623529; Y: 0.623529; Z: 0.372549; W: 1);
  253. clrLightBlue: TGLColorVector = (X: 0.74902; Y: 0.847059; Z: 0.847059; W: 1);
  254. clrLightSteelBlue: TGLColorVector = (X: 0.560784; Y: 0.560784; Z: 0.737255; W: 1);
  255. clrLime: TGLColorVector = (X: 0; Y: 1; Z: 0; W: 1);
  256. clrLimeGreen: TGLColorVector = (X: 0.196078; Y: 0.8; Z: 0.196078; W: 1);
  257. clrMaroon: TGLColorVector = (X: 0.556863; Y: 0.137255; Z: 0.419608; W: 1);
  258. clrMediumAquamarine: TGLColorVector = (X: 0.196078; Y: 0.8; Z: 0.6; W: 1);
  259. clrMediumBlue: TGLColorVector = (X: 0.196078; Y: 0.196078; Z: 0.8; W: 1);
  260. clrMediumForestGreen: TGLColorVector = (X: 0.419608; Y: 0.556863; Z: 0.137255; W: 1);
  261. clrMediumGoldenrod: TGLColorVector = (X: 0.917647; Y: 0.917647; Z: 0.678431; W: 1);
  262. clrMediumOrchid: TGLColorVector = (X: 0.576471; Y: 0.439216; Z: 0.858824; W: 1);
  263. clrMediumSeaGreen: TGLColorVector = (X: 0.258824; Y: 0.435294; Z: 0.258824; W: 1);
  264. clrMediumSlateBlue: TGLColorVector = (X: 0.498039; Y: 0; Z: 1; W: 1);
  265. clrMediumSpringGreen: TGLColorVector = (X: 0.498039; Y: 1; Z: 0; W: 1);
  266. clrMediumTurquoise: TGLColorVector = (X: 0.439216; Y: 0.858824; Z: 0.858824; W: 1);
  267. clrMediumViolet: TGLColorVector = (X: 0.858824; Y: 0.439216; Z: 0.576471; W: 1);
  268. clrMediumPurple: TGLColorVector = (X: 0.73; Y: 0.16; Z: 0.96; W: 1);
  269. clrMidnightBlue: TGLColorVector = (X: 0.184314; Y: 0.184314; Z: 0.309804; W: 1);
  270. clrNavy: TGLColorVector = (X: 0.137255; Y: 0.137255; Z: 0.556863; W: 1);
  271. clrNavyBlue: TGLColorVector = (X: 0.137255; Y: 0.137255; Z: 0.556863; W: 1);
  272. clrOrange: TGLColorVector = (X: 1; Y: 0.5; Z: 0.0; W: 1);
  273. clrOrangeRed: TGLColorVector = (X: 1; Y: 0.25; Z: 0; W: 1);
  274. clrOrchid: TGLColorVector = (X: 0.858824; Y: 0.439216; Z: 0.858824; W: 1);
  275. clrPaleGreen: TGLColorVector = (X: 0.560784; Y: 0.737255; Z: 0.560784; W: 1);
  276. clrPink: TGLColorVector = (X: 0.737255; Y: 0.560784; Z: 0.560784; W: 1);
  277. clrPlum: TGLColorVector = (X: 0.917647; Y: 0.678431; Z: 0.917647; W: 1);
  278. clrSalmon: TGLColorVector = (X: 0.435294; Y: 0.258824; Z: 0.258824; W: 1);
  279. clrSeaGreen: TGLColorVector = (X: 0.137255; Y: 0.556863; Z: 0.419608; W: 1);
  280. clrSienna: TGLColorVector = (X: 0.556863; Y: 0.419608; Z: 0.137255; W: 1);
  281. clrSkyBlue: TGLColorVector = (X: 0.196078; Y: 0.6; Z: 0.8; W: 1);
  282. clrSlateBlue: TGLColorVector = (X: 0; Y: 0.498039; Z: 1; W: 1);
  283. clrSpringGreen: TGLColorVector = (X: 0; Y: 1; Z: 0.498039; W: 1);
  284. clrSteelBlue: TGLColorVector = (X: 0.137255; Y: 0.419608; Z: 0.556863; W: 1);
  285. clrTan: TGLColorVector = (X: 0.858824; Y: 0.576471; Z: 0.439216; W: 1);
  286. clrThistle: TGLColorVector = (X: 0.847059; Y: 0.74902; Z: 0.847059; W: 1);
  287. clrTurquoise: TGLColorVector = (X: 0.678431; Y: 0.917647; Z: 0.917647; W: 1);
  288. clrViolet: TGLColorVector = (X: 0.309804; Y: 0.184314; Z: 0.309804; W: 1);
  289. clrVioletRed: TGLColorVector = (X: 0.8; Y: 0.196078; Z: 0.6; W: 1);
  290. clrYellowGreen: TGLColorVector = (X: 0.6; Y: 0.8; Z: 0.196078; W: 1);
  291. clrSummerSky: TGLColorVector = (X: 0.22; Y: 0.69; Z: 0.87; W: 1);
  292. clrRichBlue: TGLColorVector = (X: 0.35; Y: 0.35; Z: 0.67; W: 1);
  293. clrBrass: TGLColorVector = (X: 0.71; Y: 0.65; Z: 0.26; W: 1);
  294. clrCopper: TGLColorVector = (X: 0.72; Y: 0.45; Z: 0.20; W: 1);
  295. clrBronze: TGLColorVector = (X: 0.55; Y: 0.47; Z: 0.14; W: 1);
  296. clrBronze2: TGLColorVector = (X: 0.65; Y: 0.49; Z: 0.24; W: 1);
  297. clrSilver: TGLColorVector = (X: 0.90; Y: 0.91; Z: 0.98; W: 1);
  298. clrBrightGold: TGLColorVector = (X: 0.85; Y: 0.85; Z: 0.10; W: 1);
  299. clrOldGold: TGLColorVector = (X: 0.81; Y: 0.71; Z: 0.23; W: 1);
  300. clrFeldspar: TGLColorVector = (X: 0.82; Y: 0.57; Z: 0.46; W: 1);
  301. clrQuartz: TGLColorVector = (X: 0.85; Y: 0.85; Z: 0.95; W: 1);
  302. clrNeonPink: TGLColorVector = (X: 1.00; Y: 0.43; Z: 0.78; W: 1);
  303. clrDarkPurple: TGLColorVector = (X: 0.53; Y: 0.12; Z: 0.47; W: 1);
  304. clrNeonBlue: TGLColorVector = (X: 0.30; Y: 0.30; Z: 1.00; W: 1);
  305. clrCoolCopper: TGLColorVector = (X: 0.85; Y: 0.53; Z: 0.10; W: 1);
  306. clrMandarinOrange: TGLColorVector = (X: 0.89; Y: 0.47; Z: 0.20; W: 1);
  307. clrLightWood: TGLColorVector = (X: 0.91; Y: 0.76; Z: 0.65; W: 1);
  308. clrMediumWood: TGLColorVector = (X: 0.65; Y: 0.50; Z: 0.39; W: 1);
  309. clrDarkWood: TGLColorVector = (X: 0.52; Y: 0.37; Z: 0.26; W: 1);
  310. clrSpicyPink: TGLColorVector = (X: 1.00; Y: 0.11; Z: 0.68; W: 1);
  311. clrSemiSweetChoc: TGLColorVector = (X: 0.42; Y: 0.26; Z: 0.15; W: 1);
  312. clrFlesh: TGLColorVector = (X: 0.96; Y: 0.80; Z: 0.69; W: 1);
  313. clrNewTan: TGLColorVector = (X: 0.92; Y: 0.78; Z: 0.62; W: 1);
  314. clrNewMidnightBlue: TGLColorVector = (X: 0.00; Y: 0.00; Z: 0.61; W: 1);
  315. clrVeryDarkBrown: TGLColorVector = (X: 0.35; Y: 0.16; Z: 0.14; W: 1);
  316. clrDarkBrown: TGLColorVector = (X: 0.36; Y: 0.25; Z: 0.20; W: 1);
  317. clrDarkTan: TGLColorVector = (X: 0.59; Y: 0.41; Z: 0.31; W: 1);
  318. clrGreenCopper: TGLColorVector = (X: 0.32; Y: 0.49; Z: 0.46; W: 1);
  319. clrDkGreenCopper: TGLColorVector = (X: 0.29; Y: 0.46; Z: 0.43; W: 1);
  320. clrDustyRose: TGLColorVector = (X: 0.52; Y: 0.39; Z: 0.39; W: 1);
  321. clrHuntersGreen: TGLColorVector = (X: 0.13; Y: 0.37; Z: 0.31; W: 1);
  322. clrScarlet: TGLColorVector = (X: 0.55; Y: 0.09; Z: 0.09; W: 1);
  323. clrLightPurple: TGLColorVector = (X: 0.87; Y: 0.58; Z: 0.98; W: 1);
  324. clrVeryLightPurple: TGLColorVector = (X: 0.94; Y: 0.81; Z: 0.99; W: 1);
  325. clrGreen: TGLColorVector = (X: 0; Y: 0.5; Z: 0; W: 1);
  326. clrOlive: TGLColorVector = (X: 0.5; Y: 0.5; Z: 1; W: 1);
  327. clrPurple: TGLColorVector = (X: 1; Y: 0; Z: 1; W: 1);
  328. clrTeal: TGLColorVector = (X: 0; Y: 0.5; Z: 0.5; W: 1);
  329. clrRed: TGLColorVector = (X: 1; Y: 0; Z: 0; W: 1);
  330. clrYellow: TGLColorVector = (X: 1; Y: 1; Z: 0; W: 1);
  331. clrWheat: TGLColorVector = (X: 0.847059; Y: 0.847059; Z: 0.74902; W: 1);
  332. cDefaultNormalMapScale = 0.125;
  333. {$J- - disallow change of the following typed constants}
  334. var
  335. // Specifies if TGLColor should allocate memory for
  336. // their default values (ie. design-time) or not (run-time)
  337. vUseDefaultColorSets: Boolean = False;
  338. implementation //-------------------------------------------------------------
  339. var
  340. vColorManager: TGLColorManager;
  341. function RGB2Color(const r, g, b: Byte): TColor;
  342. begin
  343. Result := r or (g shl 8) or (b shl 16);
  344. end;
  345. function ColorManager: TGLColorManager;
  346. begin
  347. if not Assigned(vColorManager) then
  348. begin
  349. vColorManager := TGLColorManager.Create;
  350. vColorManager.RegisterDefaultColors;
  351. end;
  352. Result := vColorManager;
  353. end;
  354. function ConvertWinColor(aColor: TColor; alpha: Single = 1): TGLColorVector;
  355. var
  356. winColor: Integer;
  357. begin
  358. // Delphi color to Windows color
  359. winColor := TColorRec.ColorToRGB(aColor);
  360. // convert 0..255 range into 0..1 range
  361. Result.X := (winColor and $FF) * (1 / 255);
  362. Result.Y := ((winColor shr 8) and $FF) * (1 / 255);
  363. Result.Z := ((winColor shr 16) and $FF) * (1 / 255);
  364. Result.W := alpha;
  365. end;
  366. function GetRValue(rgb: DWORD): Byte;
  367. begin
  368. Result := Byte(rgb);
  369. end;
  370. function GetGValue(rgb: DWORD): Byte;
  371. begin
  372. Result := Byte(rgb shr 8);
  373. end;
  374. function GetBValue(rgb: DWORD): Byte;
  375. begin
  376. Result := Byte(rgb shr 16);
  377. end;
  378. procedure InitGLSceneColors;
  379. begin
  380. clrScrollBar := ConvertWinColor(TColorRec.cSCROLLBAR);
  381. clrActiveCaption := ConvertWinColor(TColorRec.cACTIVECAPTION);
  382. clrInactiveCaption := ConvertWinColor(TColorRec.cINACTIVECAPTION);
  383. clrMenu := ConvertWinColor(TColorRec.cMENU);
  384. clrWindow := ConvertWinColor(TColorRec.cWINDOW);
  385. clrWindowFrame := ConvertWinColor(TColorRec.cWINDOWFRAME);
  386. clrMenuText := ConvertWinColor(TColorRec.cMENUTEXT);
  387. clrWindowText := ConvertWinColor(TColorRec.cWINDOWTEXT);
  388. clrCaptionText := ConvertWinColor(TColorRec.cCAPTIONTEXT);
  389. clrActiveBorder := ConvertWinColor(TColorRec.cACTIVEBORDER);
  390. clrInactiveBorder := ConvertWinColor(TColorRec.cINACTIVEBORDER);
  391. clrAppWorkSpace := ConvertWinColor(TColorRec.cAPPWORKSPACE);
  392. clrHighlightText := ConvertWinColor(TColorRec.cHIGHLIGHTTEXT);
  393. clrBtnFace := ConvertWinColor(TColorRec.cBTNFACE);
  394. clrBtnShadow := ConvertWinColor(TColorRec.cBTNSHADOW);
  395. clrGrayText := ConvertWinColor(TColorRec.cGRAYTEXT);
  396. clrBtnText := ConvertWinColor(TColorRec.cBTNTEXT);
  397. clrInactiveCaptionText := ConvertWinColor(TColorRec.cINACTIVECAPTIONTEXT);
  398. clrBtnHighlight := ConvertWinColor(TColorRec.cBTNHIGHLIGHT);
  399. clr3DDkShadow := ConvertWinColor(TColorRec.c3DDKSHADOW);
  400. clr3DLight := ConvertWinColor(TColorRec.c3DLIGHT);
  401. clrInfoText := ConvertWinColor(TColorRec.cINFOTEXT);
  402. clrInfoBk := ConvertWinColor(TColorRec.cINFOBK);
  403. clrHighlight := ConvertWinColor(clHighlight);
  404. clrBackground := ConvertWinColor(clBackground);
  405. end;
  406. function ConvertColorVector(const aColor: TGLColorVector): TColor;
  407. begin
  408. Result := RGB2Color(Round(255 * aColor.X), Round(255 * aColor.Y),
  409. Round(255 * aColor.Z));
  410. end;
  411. function ConvertColorVector(const aColor: TGLColorVector;
  412. intensity: Single): TColor;
  413. begin
  414. intensity := 255 * intensity;
  415. Result := RGB2Color(Round(intensity * aColor.X), Round(intensity * aColor.Y),
  416. Round(intensity * aColor.Z));
  417. end;
  418. function ConvertRGBColor(const aColor: array of Byte): TGLColorVector;
  419. var
  420. n: Integer;
  421. begin
  422. // convert 0..255 range into 0..1 range
  423. n := High(aColor);
  424. Result.X := aColor[0] * (1 / 255);
  425. if n > 0 then
  426. Result.Y := aColor[1] * (1 / 255)
  427. else
  428. Result.Y := 0;
  429. if n > 1 then
  430. Result.Z := aColor[2] * (1 / 255)
  431. else
  432. Result.Z := 0;
  433. if n > 2 then
  434. Result.W := aColor[3] * (1 / 255)
  435. else
  436. Result.W := 1;
  437. end;
  438. // ------------------
  439. // ------------------ TGLColor ------------------
  440. // ------------------
  441. constructor TGLColor.Create(AOwner: TPersistent);
  442. begin
  443. inherited;
  444. Initialize(clrBlack);
  445. end;
  446. constructor TGLColor.CreateInitialized(AOwner: TPersistent;
  447. const color: TGLColorVector; changeEvent: TNotifyEvent = nil);
  448. begin
  449. Create(AOwner);
  450. Initialize(color);
  451. OnNotifyChange := changeEvent;
  452. end;
  453. destructor TGLColor.Destroy;
  454. begin
  455. if Assigned(FPDefaultColor) then
  456. Dispose(FPDefaultColor);
  457. inherited;
  458. end;
  459. procedure TGLColor.Initialize(const color: TGLColorVector);
  460. begin
  461. SetVector(FColor, color);
  462. if vUseDefaultColorSets then
  463. begin
  464. if not Assigned(FPDefaultColor) then
  465. New(FPDefaultColor);
  466. SetVector(FPDefaultColor^, color);
  467. end;
  468. end;
  469. procedure TGLColor.SetColorVector(const aColor: TGLColorVector);
  470. begin
  471. SetVector(FColor, aColor);
  472. NotifyChange(Self);
  473. end;
  474. procedure TGLColor.SetDirectColorVector(const aColor: TGLColorVector);
  475. begin
  476. SetVector(FColor, aColor);
  477. end;
  478. procedure TGLColor.SetColorComponent(index: Integer; value: Single);
  479. begin
  480. if FColor.V[index] <> value then
  481. begin
  482. FColor.V[index] := value;
  483. NotifyChange(Self);
  484. end;
  485. end;
  486. procedure TGLColor.SetAsWinColor(const val: TColor);
  487. begin
  488. FColor := ConvertWinColor(val);
  489. NotifyChange(Self);
  490. end;
  491. function TGLColor.GetAsWinColor: TColor;
  492. begin
  493. Result := ConvertColorVector(FColor);
  494. end;
  495. function TGLColor.GetColorComponent(const index: Integer): Single;
  496. begin
  497. Result := FColor.V[Index];
  498. end;
  499. procedure TGLColor.Assign(Source: TPersistent);
  500. begin
  501. if Assigned(Source) and (Source is TGLColor) then
  502. begin
  503. FColor := TGLColor(Source).FColor;
  504. NotifyChange(Self);
  505. end
  506. else
  507. inherited;
  508. end;
  509. procedure TGLColor.DefineProperties(Filer: TFiler);
  510. begin
  511. inherited;
  512. Filer.DefineBinaryProperty('Color', ReadData, WriteData,
  513. not(Assigned(FPDefaultColor) and VectorEquals(FColor, FPDefaultColor^)));
  514. end;
  515. procedure TGLColor.ReadData(Stream: TStream);
  516. begin
  517. Stream.Read(FColor, SizeOf(FColor));
  518. end;
  519. procedure TGLColor.WriteData(Stream: TStream);
  520. begin
  521. Stream.Write(FColor, SizeOf(FColor));
  522. end;
  523. procedure TGLColor.NotifyChange(Sender: TObject);
  524. var
  525. intf: IGLNotifyAble;
  526. begin
  527. if Assigned(Owner) then
  528. begin
  529. if Supports(Owner, IGLNotifyAble, intf) then
  530. intf.NotifyChange(Self);
  531. // if Owner is TGLBaseSceneObject then
  532. // TGLBaseSceneObject(Owner).StructureChanged;
  533. inherited;
  534. end;
  535. end;
  536. function TGLColor.AsAddress: PSingle;
  537. begin
  538. Result := @FColor;
  539. end;
  540. procedure TGLColor.RandomColor;
  541. begin
  542. Red := Random;
  543. Green := Random;
  544. Blue := Random;
  545. end;
  546. procedure TGLColor.SetColor(Red, Green, Blue: Single; Alpha: Single = 1);
  547. begin
  548. FColor.X := Red;
  549. FColor.Y := Green;
  550. FColor.Z := Blue;
  551. FColor.W := Alpha;
  552. NotifyChange(Self);
  553. end;
  554. function TGLColor.GetHSVA: TGLVector;
  555. var
  556. delta, min: Single;
  557. const
  558. H = 0;
  559. S = 1;
  560. V = 2;
  561. begin
  562. min := MinFloat(PFloatVector(@FColor), 3);
  563. Result.V[V] := MaxFloat(PFloatVector(@FColor), 3);
  564. delta := Result.V[V] - min;
  565. // saturation is zero if R, G & B are zero
  566. // hue undefined (zero) if saturation is zero or color is gray (delta=zero)
  567. if (Result.V[V] = 0) or (delta = 0) then
  568. begin
  569. Result.V[S] := 0;
  570. Result.V[H] := 0;
  571. end
  572. else
  573. begin
  574. Result.V[S] := delta / Result.V[V];
  575. if red = Result.V[V] then
  576. // between yellow and magenta
  577. Result.V[H] := 60 * (green - blue) / delta
  578. else if green = Result.V[V] then
  579. // between cyan and yellow
  580. Result.V[H] := 120 + 60 * (blue - red) / delta
  581. else // between magenta and cyan
  582. Result.V[H] := 240 + 60 * (red - green) / delta;
  583. if Result.V[H] < 0 then // normalize H
  584. Result.V[H] := Result.V[H] + 360;
  585. end;
  586. Result.W := Alpha;
  587. end;
  588. procedure TGLColor.SetHSVA(const hsva: TGLVector);
  589. var
  590. f, hTemp, p, q, t: Single;
  591. const
  592. H = 0;
  593. S = 1;
  594. V = 2;
  595. begin
  596. if hsva.V[S] = 0 then
  597. begin
  598. // gray (ignore hue)
  599. FColor.X := hsva.V[V];
  600. FColor.Y := hsva.V[V];
  601. FColor.Z := hsva.V[V];
  602. end
  603. else
  604. begin
  605. hTemp := hsva.V[H] * (1 / 60);
  606. f := Frac(hTemp);
  607. p := hsva.V[V] * (1 - hsva.V[S]);
  608. q := hsva.V[V] * (1 - (hsva.V[S] * f));
  609. t := hsva.V[V] * (1 - (hsva.V[S] * (1 - f)));
  610. case Trunc(hTemp) mod 6 of
  611. 0:
  612. begin
  613. FColor.X := hsva.V[V];
  614. FColor.Y := t;
  615. FColor.Z := p;
  616. end;
  617. 1:
  618. begin
  619. FColor.X := q;
  620. FColor.Y := hsva.V[V];
  621. FColor.Z := p;
  622. end;
  623. 2:
  624. begin
  625. FColor.X := p;
  626. FColor.Y := hsva.V[V];
  627. FColor.Z := t;
  628. end;
  629. 3:
  630. begin
  631. FColor.X := p;
  632. FColor.Y := q;
  633. FColor.Z := hsva.V[V];
  634. end;
  635. 4:
  636. begin
  637. FColor.X := t;
  638. FColor.Y := p;
  639. FColor.Z := hsva.V[V];
  640. end;
  641. 5:
  642. begin
  643. FColor.X := hsva.V[V];
  644. FColor.Y := p;
  645. FColor.Z := q;
  646. end;
  647. end
  648. end;
  649. FColor.W := hsva.W;
  650. NotifyChange(Self);
  651. end;
  652. // ------------------
  653. // ------------------ TGLColorManager ------------------
  654. // ------------------
  655. function TGLColorManager.FindColor(const aName: String): TGLColorVector;
  656. var
  657. i: Integer;
  658. begin
  659. Result := clrBlack;
  660. for i := 0 to Count - 1 do
  661. if CompareText(string(TGLColorEntry(Items[i]^).Name), aName) = 0 then
  662. begin
  663. SetVector(Result, TGLColorEntry(Items[i]^).color);
  664. Break;
  665. end;
  666. end;
  667. function TGLColorManager.GetColor(const aName: String): TGLColorVector;
  668. var
  669. workCopy: String;
  670. delimiter: Integer;
  671. begin
  672. if aName = '' then
  673. Result := clrBlack
  674. else
  675. begin
  676. workCopy := Trim(aName);
  677. if CharInSet(aName[1], ['(', '[', '<']) then
  678. workCopy := Copy(workCopy, 2, Length(aName) - 2);
  679. if CompareText(Copy(workCopy, 1, 3), 'clr') = 0 then
  680. SetVector(Result, FindColor(workCopy))
  681. else
  682. try
  683. // initialize result
  684. Result := clrBlack;
  685. workCopy := Trim(workCopy);
  686. delimiter := Pos(' ', workCopy);
  687. if (Length(workCopy) > 0) and (delimiter > 0) then
  688. begin
  689. Result.X := GLStrToFloatDef(Copy(workCopy, 1, delimiter - 1));
  690. System.Delete(workCopy, 1, delimiter);
  691. workCopy := TrimLeft(workCopy);
  692. delimiter := Pos(' ', workCopy);
  693. if (Length(workCopy) > 0) and (delimiter > 0) then
  694. begin
  695. Result.Y := GLStrToFloatDef(Copy(workCopy, 1, delimiter - 1));
  696. System.Delete(workCopy, 1, delimiter);
  697. workCopy := TrimLeft(workCopy);
  698. delimiter := Pos(' ', workCopy);
  699. if (Length(workCopy) > 0) and (delimiter > 0) then
  700. begin
  701. Result.Z := GLStrToFloatDef(Copy(workCopy, 1, delimiter - 1));
  702. System.Delete(workCopy, 1, delimiter);
  703. workCopy := TrimLeft(workCopy);
  704. Result.W := GLStrToFloatDef(workCopy);
  705. end
  706. else
  707. Result.Z := GLStrToFloatDef(workCopy);
  708. end
  709. else
  710. Result.Y := GLStrToFloatDef(workCopy);
  711. end
  712. else
  713. Result.X := GLStrToFloatDef(workCopy);
  714. except
  715. Write('Wrong vector format. Use: ''<red green blue alpha>''!');
  716. Abort;
  717. end;
  718. end;
  719. end;
  720. // ------------------------------------------------------------------------------
  721. function TGLColorManager.GetColorName(const aColor: TGLColorVector): String;
  722. const
  723. MinDiff = 1E-6;
  724. var
  725. i: Integer;
  726. begin
  727. for i := 0 to Count - 1 do
  728. with TGLColorEntry(Items[i]^) do
  729. if (Abs(Color.X - aColor.X) < MinDiff) and
  730. (Abs(Color.Y - aColor.Y) < MinDiff) and
  731. (Abs(Color.Z - aColor.Z) < MinDiff) and
  732. (Abs(Color.W - aColor.W) < MinDiff) then
  733. Break;
  734. if i < Count then
  735. Result := string(TGLColorEntry(Items[i]^).Name)
  736. else
  737. Result := Format('<%.3f %.3f %.3f %.3f>', [aColor.X, aColor.Y, aColor.Z,
  738. aColor.W]);
  739. end;
  740. // ------------------------------------------------------------------------------
  741. destructor TGLColorManager.Destroy;
  742. var
  743. i: Integer;
  744. begin
  745. for i := 0 to Count - 1 do
  746. FreeMem(Items[i], SizeOf(TGLColorEntry));
  747. inherited Destroy;
  748. end;
  749. // ------------------------------------------------------------------------------
  750. procedure TGLColorManager.AddColor(const aName: String;
  751. const aColor: TGLColorVector);
  752. var
  753. newEntry: PGLColorEntry;
  754. begin
  755. New(newEntry);
  756. if newEntry = nil then
  757. raise Exception.Create('Could not allocate memory for color registration!');
  758. with newEntry^ do
  759. begin
  760. Name := aName;
  761. SetVector(color, aColor);
  762. end;
  763. Add(newEntry);
  764. end;
  765. procedure TGLColorManager.EnumColors(Proc: TGetStrProc);
  766. var
  767. i: Integer;
  768. begin
  769. for i := 0 to Count - 1 do
  770. Proc(string(TGLColorEntry(Items[i]^).Name));
  771. end;
  772. procedure TGLColorManager.EnumColors(AValues: TStrings);
  773. var
  774. i: Integer;
  775. begin
  776. for i := 0 to Count - 1 do
  777. AValues.Add(string(TGLColorEntry(Items[i]^).Name));
  778. end;
  779. procedure TGLColorManager.RegisterDefaultColors;
  780. begin
  781. Capacity := 150;
  782. AddColor('clrTransparent', clrTransparent);
  783. AddColor('clrBlack', clrBlack);
  784. AddColor('clrGray05', clrGray05);
  785. AddColor('clrGray10', clrGray10);
  786. AddColor('clrGray15', clrGray15);
  787. AddColor('clrGray20', clrGray20);
  788. AddColor('clrGray25', clrGray25);
  789. AddColor('clrGray30', clrGray30);
  790. AddColor('clrGray35', clrGray35);
  791. AddColor('clrGray40', clrGray40);
  792. AddColor('clrGray45', clrGray45);
  793. AddColor('clrGray50', clrGray50);
  794. AddColor('clrGray55', clrGray55);
  795. AddColor('clrGray60', clrGray60);
  796. AddColor('clrGray65', clrGray65);
  797. AddColor('clrGray70', clrGray70);
  798. AddColor('clrGray75', clrGray75);
  799. AddColor('clrGray80', clrGray80);
  800. AddColor('clrGray85', clrGray85);
  801. AddColor('clrGray90', clrGray90);
  802. AddColor('clrGray95', clrGray95);
  803. AddColor('clrWhite', clrWhite);
  804. AddColor('clrDimGray', clrDimGray);
  805. AddColor('clrGray', clrGray);
  806. AddColor('clrLightGray', clrLightGray);
  807. AddColor('clrAquamarine', clrAquamarine);
  808. AddColor('clrBakersChoc', clrBakersChoc);
  809. AddColor('clrBlueViolet', clrBlueViolet);
  810. AddColor('clrBrass', clrBrass);
  811. AddColor('clrBrightGold', clrBrightGold);
  812. AddColor('clrBronze', clrBronze);
  813. AddColor('clrBronze2', clrBronze2);
  814. AddColor('clrBrown', clrBrown);
  815. AddColor('clrCadetBlue', clrCadetBlue);
  816. AddColor('clrCoolCopper', clrCoolCopper);
  817. AddColor('clrCopper', clrCopper);
  818. AddColor('clrCoral', clrCoral);
  819. AddColor('clrCornflowerBlue', clrCornflowerBlue);
  820. AddColor('clrDarkBrown', clrDarkBrown);
  821. AddColor('clrDarkGreen', clrDarkGreen);
  822. AddColor('clrDarkOliveGreen', clrDarkOliveGreen);
  823. AddColor('clrDarkOrchid', clrDarkOrchid);
  824. AddColor('clrDarkPurple', clrDarkPurple);
  825. AddColor('clrDarkSlateBlue', clrDarkSlateBlue);
  826. AddColor('clrDarkSlateGray', clrDarkSlateGray);
  827. AddColor('clrDarkSlateGrey', clrDarkSlateGrey);
  828. AddColor('clrDarkTan', clrDarkTan);
  829. AddColor('clrDarkTurquoise', clrDarkTurquoise);
  830. AddColor('clrDarkWood', clrDarkWood);
  831. AddColor('clrDkGreenCopper', clrDkGreenCopper);
  832. AddColor('clrDustyRose', clrDustyRose);
  833. AddColor('clrFeldspar', clrFeldspar);
  834. AddColor('clrFirebrick', clrFirebrick);
  835. AddColor('clrFlesh', clrFlesh);
  836. AddColor('clrForestGreen', clrForestGreen);
  837. AddColor('clrGold', clrGold);
  838. AddColor('clrGoldenrod', clrGoldenrod);
  839. AddColor('clrGreenCopper', clrGreenCopper);
  840. AddColor('clrGreenYellow', clrGreenYellow);
  841. AddColor('clrHuntersGreen', clrHuntersGreen);
  842. AddColor('clrIndian', clrIndian);
  843. AddColor('clrKhaki', clrKhaki);
  844. AddColor('clrLightBlue', clrLightBlue);
  845. AddColor('clrLightPurple', clrLightPurple);
  846. AddColor('clrLightSteelBlue', clrLightSteelBlue);
  847. AddColor('clrLightWood', clrLightWood);
  848. AddColor('clrLimeGreen', clrLimeGreen);
  849. AddColor('clrMandarinOrange', clrMandarinOrange);
  850. AddColor('clrMaroon', clrMaroon);
  851. AddColor('clrMediumAquamarine', clrMediumAquamarine);
  852. AddColor('clrMediumBlue', clrMediumBlue);
  853. AddColor('clrMediumForestGreen', clrMediumForestGreen);
  854. AddColor('clrMediumGoldenrod', clrMediumGoldenrod);
  855. AddColor('clrMediumOrchid', clrMediumOrchid);
  856. AddColor('clrMediumPurple', clrMediumPurple);
  857. AddColor('clrMediumSeaGreen', clrMediumSeaGreen);
  858. AddColor('clrMediumSlateBlue', clrMediumSlateBlue);
  859. AddColor('clrMediumSpringGreen', clrMediumSpringGreen);
  860. AddColor('clrMediumTurquoise', clrMediumTurquoise);
  861. AddColor('clrMediumViolet', clrMediumViolet);
  862. AddColor('clrMediumWood', clrMediumWood);
  863. AddColor('clrMidnightBlue', clrMidnightBlue);
  864. AddColor('clrNavy', clrNavy);
  865. AddColor('clrNavyBlue', clrNavyBlue);
  866. AddColor('clrNeonBlue', clrNeonBlue);
  867. AddColor('clrNeonPink', clrNeonPink);
  868. AddColor('clrNewMidnightBlue', clrNewMidnightBlue);
  869. AddColor('clrNewTan', clrNewTan);
  870. AddColor('clrOldGold', clrOldGold);
  871. AddColor('clrOrange', clrOrange);
  872. AddColor('clrOrangeRed', clrOrangeRed);
  873. AddColor('clrOrchid', clrOrchid);
  874. AddColor('clrPaleGreen', clrPaleGreen);
  875. AddColor('clrPink', clrPink);
  876. AddColor('clrPlum', clrPlum);
  877. AddColor('clrQuartz', clrQuartz);
  878. AddColor('clrRichBlue', clrRichBlue);
  879. AddColor('clrSalmon', clrSalmon);
  880. AddColor('clrScarlet', clrScarlet);
  881. AddColor('clrSeaGreen', clrSeaGreen);
  882. AddColor('clrSemiSweetChoc', clrSemiSweetChoc);
  883. AddColor('clrSienna', clrSienna);
  884. AddColor('clrSilver', clrSilver);
  885. AddColor('clrSkyBlue', clrSkyBlue);
  886. AddColor('clrSlateBlue', clrSlateBlue);
  887. AddColor('clrSpicyPink', clrSpicyPink);
  888. AddColor('clrSpringGreen', clrSpringGreen);
  889. AddColor('clrSteelBlue', clrSteelBlue);
  890. AddColor('clrSummerSky', clrSummerSky);
  891. AddColor('clrTan', clrTan);
  892. AddColor('clrThistle', clrThistle);
  893. AddColor('clrTurquoise', clrTurquoise);
  894. AddColor('clrViolet', clrViolet);
  895. AddColor('clrVioletRed', clrVioletRed);
  896. AddColor('clrVeryDarkBrown', clrVeryDarkBrown);
  897. AddColor('clrVeryLightPurple', clrVeryLightPurple);
  898. AddColor('clrWheat', clrWheat);
  899. AddColor('clrYellowGreen', clrYellowGreen);
  900. AddColor('clrGreen', clrGreen);
  901. AddColor('clrOlive', clrOlive);
  902. AddColor('clrPurple', clrPurple);
  903. AddColor('clrTeal', clrTeal);
  904. AddColor('clrRed', clrRed);
  905. AddColor('clrLime', clrLime);
  906. AddColor('clrYellow', clrYellow);
  907. AddColor('clrBlue', clrBlue);
  908. AddColor('clrFuchsia', clrFuchsia);
  909. AddColor('clrAqua', clrAqua);
  910. AddColor('clrScrollBar', clrScrollBar);
  911. AddColor('clrBackground', clrBackground);
  912. AddColor('clrActiveCaption', clrActiveCaption);
  913. AddColor('clrInactiveCaption', clrInactiveCaption);
  914. AddColor('clrMenu', clrMenu);
  915. AddColor('clrWindow', clrWindow);
  916. AddColor('clrWindowFrame', clrWindowFrame);
  917. AddColor('clrMenuText', clrMenuText);
  918. AddColor('clrWindowText', clrWindowText);
  919. AddColor('clrCaptionText', clrCaptionText);
  920. AddColor('clrActiveBorder', clrActiveBorder);
  921. AddColor('clrInactiveBorder', clrInactiveBorder);
  922. AddColor('clrAppWorkSpace', clrAppWorkSpace);
  923. AddColor('clrHighlight', clrHighlight);
  924. AddColor('clrHighlightText', clrHighlightText);
  925. AddColor('clrBtnFace', clrBtnFace);
  926. AddColor('clrBtnShadow', clrBtnShadow);
  927. AddColor('clrGrayText', clrGrayText);
  928. AddColor('clrBtnText', clrBtnText);
  929. AddColor('clrInactiveCaptionText', clrInactiveCaptionText);
  930. AddColor('clrBtnHighlight', clrBtnHighlight);
  931. AddColor('clr3DDkShadow', clr3DDkShadow);
  932. AddColor('clr3DLight', clr3DLight);
  933. AddColor('clrInfoText', clrInfoText);
  934. AddColor('clrInfoBk', clrInfoBk);
  935. end;
  936. procedure TGLColorManager.RemoveColor(const aName: String);
  937. var
  938. i: Integer;
  939. begin
  940. for i := 0 to Count - 1 do
  941. begin
  942. if CompareText(string(TGLColorEntry(Items[i]^).Name), aName) = 0 then
  943. begin
  944. Delete(i);
  945. Break;
  946. end;
  947. end;
  948. end;
  949. procedure RegisterColor(const aName: String; const aColor: TGLColorVector);
  950. begin
  951. ColorManager.AddColor(aName, aColor);
  952. end;
  953. procedure UnRegisterColor(const aName: String);
  954. begin
  955. ColorManager.RemoveColor(aName);
  956. end;
  957. initialization //-----------------------------------------------------------
  958. InitGLSceneColors;
  959. finalization //-------------------------------------------------------------
  960. vColorManager.Free;
  961. end.