PIGMENT.C 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  1. /****************************************************************************
  2. * pigment.c
  3. *
  4. * This module implements solid texturing functions that modify the color
  5. * transparency of an object's surface.
  6. *
  7. * from Persistence of Vision(tm) Ray Tracer
  8. * Copyright 1996,1999 Persistence of Vision Team
  9. *---------------------------------------------------------------------------
  10. * NOTICE: This source code file is provided so that users may experiment
  11. * with enhancements to POV-Ray and to port the software to platforms other
  12. * than those supported by the POV-Ray Team. There are strict rules under
  13. * which you are permitted to use this file. The rules are in the file
  14. * named POVLEGAL.DOC which should be distributed with this file.
  15. * If POVLEGAL.DOC is not available or for more info please contact the POV-Ray
  16. * Team Coordinator by email to team-coord@povray.org or visit us on the web at
  17. * http://www.povray.org. The latest version of POV-Ray may be found at this site.
  18. *
  19. * This program is based on the popular DKB raytracer version 2.12.
  20. * DKBTrace was originally written by David K. Buck.
  21. * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
  22. *
  23. *****************************************************************************/
  24. /*
  25. Some texture ideas garnered from SIGGRAPH '85 Volume 19 Number 3,
  26. "An Image Synthesizer" By Ken Perlin.
  27. Further Ideas Garnered from "The RenderMan Companion" (Addison Wesley).
  28. */
  29. #include "frame.h"
  30. #include "vector.h"
  31. #include "povproto.h"
  32. #include "texture.h"
  33. #include "colour.h"
  34. #include "image.h"
  35. #include "matrices.h"
  36. #include "pigment.h"
  37. #include "txttest.h"
  38. /*****************************************************************************
  39. * Local preprocessor defines
  40. ******************************************************************************/
  41. /*****************************************************************************
  42. * Local typedefs
  43. ******************************************************************************/
  44. /*****************************************************************************
  45. * Local variables
  46. ******************************************************************************/
  47. static BLEND_MAP_ENTRY Black_White_Entries[2] /* =
  48. {{0.0, FALSE, {{0.0, 0.0, 0.0, 0.0, 0.0}}},
  49. {1.0, FALSE, {{1.0, 1.0, 1.0, 0.0, 0.0}}}} */ ;
  50. static BLEND_MAP Gray_Default_Map =
  51. { 2, FALSE, COLOUR_TYPE, -1, Black_White_Entries};
  52. static BLEND_MAP_ENTRY Bozo_Entries[6] /* =
  53. {{0.4, FALSE, {{1.0, 1.0, 1.0, 0.0, 0.0}}},
  54. {0.4, FALSE, {{0.0, 1.0, 0.0, 0.0, 0.0}}},
  55. {0.6, FALSE, {{0.0, 1.0, 0.0, 0.0, 0.0}}},
  56. {0.6, FALSE, {{0.0, 0.0, 1.0, 0.0, 0.0}}},
  57. {0.8, FALSE, {{0.0, 0.0, 1.0, 0.0, 0.0}}},
  58. {0.8, FALSE, {{1.0, 0.0, 0.0, 0.0, 0.0}}}} */ ;
  59. static BLEND_MAP Bozo_Default_Map =
  60. { 6, FALSE, COLOUR_TYPE, -1, Bozo_Entries};
  61. static BLEND_MAP_ENTRY Wood_Entries[2] /* =
  62. {{0.6, FALSE, {{0.666, 0.312, 0.2, 0.0, 0.0}}},
  63. {0.6, FALSE, {{0.4, 0.1333, 0.066, 0.0, 0.0}}}} */ ;
  64. static BLEND_MAP Wood_Default_Map =
  65. { 2, FALSE, COLOUR_TYPE, -1, Wood_Entries};
  66. static BLEND_MAP_ENTRY Mandel_Entries[5] /* =
  67. {{0.001, FALSE, {{0.0, 0.0, 0.0, 0.0, 0.0}}},
  68. {0.001, FALSE, {{0.0, 1.0, 1.0, 0.0, 0.0}}},
  69. {0.012, FALSE, {{1.0, 1.0, 0.0, 0.0, 0.0}}},
  70. {0.015, FALSE, {{1.0, 0.0, 1.0, 0.0, 0.0}}},
  71. {0.1, FALSE, {{0.0, 1.0, 1.0, 0.0, 0.0}}}} */ ;
  72. static BLEND_MAP Mandel_Default_Map =
  73. { 5, FALSE, COLOUR_TYPE, -1, Mandel_Entries};
  74. static BLEND_MAP_ENTRY Agate_Entries[6] /* =
  75. {{0.0, FALSE, {{1.0, 1.0, 1.0, 0.0, 0.0}}},
  76. {0.5, FALSE, {{0.95, 0.75, 0.5, 0.0, 0.0}}},
  77. {0.5, FALSE, {{0.9, 0.7, 0.5, 0.0, 0.0}}},
  78. {0.6, FALSE, {{0.9, 0.7, 0.4, 0.0, 0.0}}},
  79. {0.6, FALSE, {{1.0, 0.7, 0.4, 0.0, 0.0}}},
  80. {1.0, FALSE, {{0.6, 0.3, 0.0, 0.0, 0.0}}}} */ ;
  81. static BLEND_MAP Agate_Default_Map =
  82. { 6, FALSE, COLOUR_TYPE, -1, Agate_Entries};
  83. static BLEND_MAP_ENTRY Radial_Entries[4] /* =
  84. {{0.0, FALSE, {{0.0, 1.0, 1.0, 0.0, 0.0}}},
  85. {0.333, FALSE, {{1.0, 1.0, 0.0, 0.0, 0.0}}},
  86. {0.666, FALSE, {{1.0, 0.0, 1.0, 0.0, 0.0}}},
  87. {1.0, FALSE, {{0.0, 1.0, 1.0, 0.0, 0.0}}}} */ ;
  88. static BLEND_MAP Radial_Default_Map =
  89. { 4, FALSE, COLOUR_TYPE, -1, Radial_Entries};
  90. static BLEND_MAP_ENTRY Marble_Entries[3] /* =
  91. {{0.0, FALSE, {{0.9, 0.8, 0.8, 0.0, 0.0}}},
  92. {0.9, FALSE, {{0.9, 0.08, 0.08, 0.0, 0.0}}},
  93. {0.9, FALSE, {{0.0, 0.0, 0.0, 0.0, 0.0}}}} */ ;
  94. static BLEND_MAP Marble_Default_Map =
  95. { 3, FALSE, COLOUR_TYPE, -1, Marble_Entries};
  96. static BLEND_MAP_ENTRY Brick_Entries[2] /* =
  97. {{0.0, FALSE, {{0.5, 0.5, 0.5, 0.0, 0.0}}},
  98. {1.0, FALSE, {{0.6, 0.15, 0.15, 0.0, 0.0}}}} */ ;
  99. BLEND_MAP Brick_Default_Map =
  100. { 2, FALSE, COLOUR_TYPE, -1, Brick_Entries};
  101. static BLEND_MAP_ENTRY Hex_Entries[3] /*=
  102. {{0.0, FALSE, {{0.0, 0.0, 1.0, 0.0, 0.0}}},
  103. {1.0, FALSE, {{0.0, 1.0, 0.0, 0.0, 0.0}}},
  104. {2.0, FALSE, {{1.0, 0.0, 0.0, 0.0, 0.0}}}} */;
  105. BLEND_MAP Hex_Default_Map =
  106. { 3, FALSE,COLOUR_TYPE, -1, Hex_Entries};
  107. BLEND_MAP Check_Default_Map =
  108. { 2, FALSE,COLOUR_TYPE, -1, Hex_Entries}; /* Yes... Hex_Entries, not Check [CY] */
  109. /*****************************************************************************
  110. * Static functions
  111. ******************************************************************************/
  112. static void Do_Average_Pigments (COLOUR Colour, PIGMENT *Pigment, VECTOR EPoint);
  113. /*****************************************************************************
  114. *
  115. * FUNCTION
  116. *
  117. * Create_Pigment
  118. *
  119. * INPUT
  120. *
  121. * OUTPUT
  122. *
  123. * RETURNS
  124. *
  125. * pointer to the created pigment
  126. *
  127. * AUTHOR
  128. *
  129. * POV-Ray Team
  130. *
  131. * DESCRIPTION : Allocate memory for new pigment and initialize it to
  132. * system default values.
  133. *
  134. * CHANGES
  135. *
  136. ******************************************************************************/
  137. PIGMENT *Create_Pigment ()
  138. {
  139. PIGMENT *New;
  140. New = (PIGMENT *)POV_MALLOC(sizeof (PIGMENT), "pigment");
  141. Init_TPat_Fields((TPATTERN *)New);
  142. Make_Colour(New->Colour, 0.0,0.0,0.0) ;
  143. New->Blend_Map = NULL;
  144. return (New);
  145. }
  146. /*****************************************************************************
  147. *
  148. * FUNCTION
  149. *
  150. * Copy_Pigment
  151. *
  152. * INPUT
  153. *
  154. * Old -- point to pigment to be copied
  155. *
  156. * RETURNS
  157. *
  158. * pointer to the created pigment
  159. *
  160. * AUTHOR
  161. *
  162. * POV-Ray Team
  163. *
  164. * DESCRIPTION : Allocate memory for new pigment and initialize it to
  165. * values in existing pigment Old.
  166. *
  167. * CHANGES
  168. *
  169. ******************************************************************************/
  170. PIGMENT *Copy_Pigment (PIGMENT *Old)
  171. {
  172. PIGMENT *New;
  173. if (Old != NULL)
  174. {
  175. New = Create_Pigment ();
  176. Copy_TPat_Fields ((TPATTERN *)New, (TPATTERN *)Old);
  177. if (Old->Type == PLAIN_PATTERN)
  178. {
  179. Assign_Colour(New->Colour,Old->Colour);
  180. }
  181. New->Next = (TPATTERN *)Copy_Pigment((PIGMENT *)Old->Next);
  182. }
  183. else
  184. {
  185. New = NULL;
  186. }
  187. return (New);
  188. }
  189. /*****************************************************************************
  190. *
  191. * FUNCTION
  192. *
  193. * Destroy_Pigment
  194. *
  195. * INPUT
  196. *
  197. * pointer to pigment to destroied
  198. *
  199. * OUTPUT
  200. *
  201. * RETURNS
  202. *
  203. * AUTHOR
  204. *
  205. * POV-Ray Team
  206. *
  207. * DESCRIPTION : free all memory associated with given pigment
  208. *
  209. * CHANGES
  210. *
  211. ******************************************************************************/
  212. void Destroy_Pigment (PIGMENT *Pigment)
  213. {
  214. if (Pigment != NULL)
  215. {
  216. Destroy_Pigment((PIGMENT *)Pigment->Next);
  217. Destroy_TPat_Fields ((TPATTERN *)Pigment);
  218. POV_FREE(Pigment);
  219. }
  220. }
  221. /*****************************************************************************
  222. *
  223. * FUNCTION
  224. *
  225. * Post_Pigment
  226. *
  227. * INPUT
  228. *
  229. * OUTPUT
  230. *
  231. * RETURNS
  232. *
  233. * AUTHOR
  234. *
  235. * Chris Young
  236. *
  237. * DESCRIPTION
  238. *
  239. * CHANGES
  240. *
  241. ******************************************************************************/
  242. int Post_Pigment(PIGMENT *Pigment)
  243. {
  244. int i, Has_Filter;
  245. BLEND_MAP *Map;
  246. if (Pigment == NULL)
  247. {
  248. Error("Missing pigment");
  249. }
  250. if (Pigment->Flags & POST_DONE)
  251. {
  252. return(Pigment->Flags & HAS_FILTER);
  253. }
  254. if (Pigment->Type == NO_PATTERN)
  255. {
  256. Pigment->Type = PLAIN_PATTERN;
  257. Make_Colour(Pigment->Colour, 0.0, 0.0, 0.0) ;
  258. Warning(1.5, "No pigment type given.\n");
  259. }
  260. Pigment->Flags |= POST_DONE;
  261. switch (Pigment->Type)
  262. {
  263. case PLAIN_PATTERN:
  264. Destroy_Warps (Pigment->Warps);
  265. Pigment->Warps = NULL;
  266. break;
  267. case NO_PATTERN:
  268. case BITMAP_PATTERN:
  269. break;
  270. default:
  271. if (Pigment->Blend_Map == NULL)
  272. {
  273. switch (Pigment->Type)
  274. {
  275. case BOZO_PATTERN: Pigment->Blend_Map = &Bozo_Default_Map; break;
  276. case BRICK_PATTERN: Pigment->Blend_Map = &Brick_Default_Map; break;
  277. case WOOD_PATTERN: Pigment->Blend_Map = &Wood_Default_Map; break;
  278. case MANDEL_PATTERN: Pigment->Blend_Map = &Mandel_Default_Map;break;
  279. case RADIAL_PATTERN: Pigment->Blend_Map = &Radial_Default_Map;break;
  280. case AGATE_PATTERN: Pigment->Blend_Map = &Agate_Default_Map; break;
  281. case MARBLE_PATTERN: Pigment->Blend_Map = &Marble_Default_Map;break;
  282. case HEXAGON_PATTERN: Pigment->Blend_Map = &Hex_Default_Map; break;
  283. case CHECKER_PATTERN: Pigment->Blend_Map = &Check_Default_Map; break;
  284. case AVERAGE_PATTERN: Error("Missing pigment_map in average pigment"); break;
  285. default: Pigment->Blend_Map = &Gray_Default_Map; break;
  286. }
  287. }
  288. break;
  289. }
  290. /* Now we test wether this pigment is opaque or not. [DB 8/94] */
  291. Has_Filter = FALSE;
  292. if ((fabs(Pigment->Colour[FILTER]) > EPSILON) ||
  293. (fabs(Pigment->Colour[TRANSM]) > EPSILON))
  294. {
  295. Has_Filter = TRUE;
  296. }
  297. if ((Map = Pigment->Blend_Map) != NULL)
  298. {
  299. if ((Map->Type == PIGMENT_TYPE) || (Map->Type == DENSITY_TYPE))
  300. {
  301. for (i = 0; i < Map->Number_Of_Entries; i++)
  302. {
  303. Has_Filter |= Post_Pigment(Map->Blend_Map_Entries[i].Vals.Pigment);
  304. }
  305. }
  306. else
  307. {
  308. for (i = 0; i < Map->Number_Of_Entries; i++)
  309. {
  310. Has_Filter |= fabs(Map->Blend_Map_Entries[i].Vals.Colour[FILTER])>EPSILON;
  311. Has_Filter |= fabs(Map->Blend_Map_Entries[i].Vals.Colour[TRANSM])>EPSILON;
  312. }
  313. }
  314. }
  315. if (Has_Filter)
  316. {
  317. Pigment->Flags |= HAS_FILTER;
  318. }
  319. if (Pigment->Next != NULL)
  320. {
  321. Post_Pigment((PIGMENT *)Pigment->Next);
  322. }
  323. return(Has_Filter);
  324. }
  325. /*****************************************************************************
  326. *
  327. * FUNCTION
  328. *
  329. * Compute_Pigment
  330. *
  331. * INPUT
  332. *
  333. * Pigment - Info about this pigment
  334. * EPoint - 3-D point at which pattern is evaluated
  335. *
  336. * OUTPUT
  337. *
  338. * Colour - Resulting color is returned here.
  339. *
  340. * RETURNS
  341. *
  342. * int - TRUE, if a color was found for the given point
  343. * FALSE, if no color was found (e.g. areas outside an image map
  344. * that has the once option)
  345. *
  346. * AUTHOR
  347. *
  348. * POV-Ray Team
  349. *
  350. * DESCRIPTION
  351. * Given a 3d point and a pigment, compute colour from that layer.
  352. * (Formerly called "Colour_At", or "Add_Pigment")
  353. *
  354. * CHANGES
  355. * Added pigment map support [CY 11/94]
  356. *
  357. ******************************************************************************/
  358. int Compute_Pigment (COLOUR Colour, PIGMENT *Pigment, VECTOR EPoint)
  359. {
  360. int Colour_Found;
  361. VECTOR TPoint;
  362. DBL value;
  363. register DBL fraction;
  364. BLEND_MAP_ENTRY *Cur, *Prev;
  365. COLOUR Temp_Colour;
  366. BLEND_MAP *Blend_Map = Pigment->Blend_Map;
  367. if (Pigment->Type <= LAST_SPECIAL_PATTERN)
  368. {
  369. Colour_Found = TRUE;
  370. switch (Pigment->Type)
  371. {
  372. case NO_PATTERN:
  373. Make_Colour(Colour, 0.0, 0.0, 0.0);
  374. break;
  375. case PLAIN_PATTERN:
  376. Assign_Colour(Colour,Pigment->Colour);
  377. break;
  378. case AVERAGE_PATTERN:
  379. Warp_EPoint (TPoint, EPoint, (TPATTERN *)Pigment);
  380. Do_Average_Pigments(Colour,Pigment,TPoint);
  381. break;
  382. case BITMAP_PATTERN:
  383. Warp_EPoint (TPoint, EPoint, (TPATTERN *)Pigment);
  384. Make_Colour(Colour, 0.0, 0.0, 0.0);
  385. Colour_Found = image_map (TPoint, Pigment, Colour);
  386. break;
  387. default:
  388. Error("Pigment type %d not yet implemented",Pigment->Type);
  389. }
  390. return(Colour_Found);
  391. }
  392. Colour_Found = FALSE;
  393. value = Evaluate_TPat ((TPATTERN *)Pigment,EPoint);
  394. Search_Blend_Map (value, Blend_Map, &Prev, &Cur);
  395. if (Blend_Map->Type == COLOUR_TYPE)
  396. {
  397. Colour_Found = TRUE;
  398. Assign_Colour(Colour, Cur->Vals.Colour);
  399. }
  400. else
  401. {
  402. Warp_EPoint (TPoint, EPoint, (TPATTERN *)Pigment);
  403. if (Compute_Pigment(Colour, Cur->Vals.Pigment,TPoint))
  404. {
  405. Colour_Found = TRUE;
  406. }
  407. }
  408. if (Prev != Cur)
  409. {
  410. if (Blend_Map->Type == COLOUR_TYPE)
  411. {
  412. Colour_Found = TRUE;
  413. Assign_Colour(Temp_Colour, Prev->Vals.Colour);
  414. }
  415. else
  416. {
  417. if (Compute_Pigment(Temp_Colour, Prev->Vals.Pigment, TPoint))
  418. {
  419. Colour_Found = TRUE;
  420. }
  421. }
  422. fraction = (value - Prev->value) / (Cur->value - Prev->value);
  423. Colour[RED] = Temp_Colour[RED] + fraction * (Colour[RED] - Temp_Colour[RED]);
  424. Colour[GREEN] = Temp_Colour[GREEN] + fraction * (Colour[GREEN] - Temp_Colour[GREEN]);
  425. Colour[BLUE] = Temp_Colour[BLUE] + fraction * (Colour[BLUE] - Temp_Colour[BLUE]);
  426. Colour[FILTER] = Temp_Colour[FILTER] + fraction * (Colour[FILTER] - Temp_Colour[FILTER]);
  427. Colour[TRANSM] = Temp_Colour[TRANSM] + fraction * (Colour[TRANSM] - Temp_Colour[TRANSM]);
  428. }
  429. return(Colour_Found);
  430. }
  431. /*****************************************************************************
  432. *
  433. * FUNCTION
  434. *
  435. * INPUT
  436. *
  437. * OUTPUT
  438. *
  439. * RETURNS
  440. *
  441. * AUTHOR
  442. *
  443. * DESCRIPTION
  444. *
  445. * CHANGES
  446. *
  447. ******************************************************************************/
  448. static void Do_Average_Pigments (COLOUR Colour, PIGMENT *Pigment, VECTOR EPoint)
  449. {
  450. int i;
  451. COLOUR LC;
  452. BLEND_MAP *Map = Pigment->Blend_Map;
  453. SNGL Value;
  454. SNGL Total = 0.0;
  455. Make_Colour (Colour, 0.0, 0.0, 0.0);
  456. for (i = 0; i < Map->Number_Of_Entries; i++)
  457. {
  458. Value = Map->Blend_Map_Entries[i].value;
  459. Compute_Pigment (LC,Map->Blend_Map_Entries[i].Vals.Pigment,EPoint);
  460. Colour[RED] += LC[RED] *Value;
  461. Colour[GREEN] += LC[GREEN] *Value;
  462. Colour[BLUE] += LC[BLUE] *Value;
  463. Colour[FILTER]+= LC[FILTER]*Value;
  464. Colour[TRANSM]+= LC[TRANSM]*Value;
  465. Total += Value;
  466. }
  467. Colour[RED] /= Total;
  468. Colour[GREEN] /= Total;
  469. Colour[BLUE] /= Total;
  470. Colour[FILTER]/= Total;
  471. Colour[TRANSM]/= Total;
  472. }
  473. /*****************************************************************************
  474. *
  475. * FUNCTION Make_Pigment_Entries
  476. *
  477. * INPUT None
  478. *
  479. * OUTPUT Initializes default pigment blend_map values.
  480. *
  481. * RETURNS None
  482. *
  483. * AUTHOR Steve Demlow, Dec. '95
  484. *
  485. * DESCRIPTION Some pre-ANSI compilers won't auto-initialize unions, so these
  486. * have to be done in regular code.
  487. *
  488. * CHANGES
  489. *
  490. ******************************************************************************/
  491. void Make_Pigment_Entries()
  492. {
  493. static unsigned char Made = FALSE;
  494. if (Made) {
  495. return;
  496. }
  497. Made = TRUE;
  498. Make_Blend_Map_Entry(Black_White_Entries[0] , 0.0, FALSE, 0.0, 0.0, 0.0, 0.0, 0.0);
  499. Make_Blend_Map_Entry(Black_White_Entries[1] , 1.0, FALSE, 1.0, 1.0, 1.0, 0.0, 0.0);
  500. Make_Blend_Map_Entry(Bozo_Entries[0], 0.4, FALSE, 1.0, 1.0, 1.0, 0.0, 0.0);
  501. Make_Blend_Map_Entry(Bozo_Entries[1], 0.4, FALSE, 0.0, 1.0, 0.0, 0.0, 0.0);
  502. Make_Blend_Map_Entry(Bozo_Entries[2], 0.6, FALSE, 0.0, 1.0, 0.0, 0.0, 0.0);
  503. Make_Blend_Map_Entry(Bozo_Entries[3], 0.6, FALSE, 0.0, 0.0, 1.0, 0.0, 0.0);
  504. Make_Blend_Map_Entry(Bozo_Entries[4], 0.8, FALSE, 0.0, 0.0, 1.0, 0.0, 0.0);
  505. Make_Blend_Map_Entry(Bozo_Entries[5], 0.8, FALSE, 1.0, 0.0, 0.0, 0.0, 0.0);
  506. Make_Blend_Map_Entry(Wood_Entries[0], 0.6, FALSE, 0.666, 0.312, 0.2, 0.0, 0.0);
  507. Make_Blend_Map_Entry(Wood_Entries[1], 0.6, FALSE, 0.4, 0.1333, 0.066, 0.0, 0.0);
  508. Make_Blend_Map_Entry(Mandel_Entries[0], 0.001, FALSE, 0.0, 0.0, 0.0, 0.0, 0.0);
  509. Make_Blend_Map_Entry(Mandel_Entries[1], 0.001, FALSE, 0.0, 1.0, 1.0, 0.0, 0.0);
  510. Make_Blend_Map_Entry(Mandel_Entries[2], 0.012, FALSE, 1.0, 1.0, 0.0, 0.0, 0.0);
  511. Make_Blend_Map_Entry(Mandel_Entries[3], 0.015, FALSE, 1.0, 0.0, 1.0, 0.0, 0.0);
  512. Make_Blend_Map_Entry(Mandel_Entries[4], 0.1, FALSE, 0.0, 1.0, 1.0, 0.0, 0.0);
  513. Make_Blend_Map_Entry(Agate_Entries[0], 0.0, FALSE, 1.0, 1.0, 1.0, 0.0, 0.0);
  514. Make_Blend_Map_Entry(Agate_Entries[1], 0.5, FALSE, 0.95, 0.75, 0.5, 0.0, 0.0);
  515. Make_Blend_Map_Entry(Agate_Entries[2], 0.5, FALSE, 0.9, 0.7, 0.5, 0.0, 0.0);
  516. Make_Blend_Map_Entry(Agate_Entries[3], 0.6, FALSE, 0.9, 0.7, 0.4, 0.0, 0.0);
  517. Make_Blend_Map_Entry(Agate_Entries[4], 0.6, FALSE, 1.0, 0.7, 0.4, 0.0, 0.0);
  518. Make_Blend_Map_Entry(Agate_Entries[5], 1.0, FALSE, 0.6, 0.3, 0.0, 0.0, 0.0);
  519. Make_Blend_Map_Entry(Radial_Entries[0], 0.0, FALSE, 0.0, 1.0, 1.0, 0.0, 0.0);
  520. Make_Blend_Map_Entry(Radial_Entries[1], 0.333, FALSE, 1.0, 1.0, 0.0, 0.0, 0.0);
  521. Make_Blend_Map_Entry(Radial_Entries[2], 0.666, FALSE, 1.0, 0.0, 1.0, 0.0, 0.0);
  522. Make_Blend_Map_Entry(Radial_Entries[3], 1.0, FALSE, 0.0, 1.0, 1.0, 0.0, 0.0);
  523. Make_Blend_Map_Entry(Marble_Entries[0], 0.0, FALSE, 0.9, 0.8, 0.8, 0.0, 0.0);
  524. Make_Blend_Map_Entry(Marble_Entries[1], 0.9, FALSE, 0.9, 0.08, 0.08, 0.0, 0.0);
  525. Make_Blend_Map_Entry(Marble_Entries[2], 0.9, FALSE, 0.0, 0.0, 0.0, 0.0, 0.0);
  526. Make_Blend_Map_Entry(Brick_Entries[0], 0.0, FALSE, 0.5, 0.5, 0.5, 0.0, 0.0);
  527. Make_Blend_Map_Entry(Brick_Entries[1], 1.0, FALSE, 0.6, 0.15, 0.15, 0.0, 0.0);
  528. Make_Blend_Map_Entry(Hex_Entries[0], 0.0, FALSE, 0.0, 0.0, 1.0, 0.0, 0.0);
  529. Make_Blend_Map_Entry(Hex_Entries[1], 1.0, FALSE, 0.0, 1.0, 0.0, 0.0, 0.0);
  530. Make_Blend_Map_Entry(Hex_Entries[2], 2.0, FALSE, 1.0, 0.0, 0.0, 0.0, 0.0);
  531. }