TEXTURE.C 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466
  1. /****************************************************************************
  2. * texture.c
  3. *
  4. * This module implements texturing functions such as noise, turbulence and
  5. * texture transformation functions. The actual texture routines are in the
  6. * files pigment.c & normal.c.
  7. * The noise function used here is the one described by Ken Perlin in
  8. * "Hypertexture", SIGGRAPH '89 Conference Proceedings page 253.
  9. *
  10. * from Persistence of Vision(tm) Ray Tracer
  11. * Copyright 1996,1999 Persistence of Vision Team
  12. *---------------------------------------------------------------------------
  13. * NOTICE: This source code file is provided so that users may experiment
  14. * with enhancements to POV-Ray and to port the software to platforms other
  15. * than those supported by the POV-Ray Team. There are strict rules under
  16. * which you are permitted to use this file. The rules are in the file
  17. * named POVLEGAL.DOC which should be distributed with this file.
  18. * If POVLEGAL.DOC is not available or for more info please contact the POV-Ray
  19. * Team Coordinator by email to team-coord@povray.org or visit us on the web at
  20. * http://www.povray.org. The latest version of POV-Ray may be found at this site.
  21. *
  22. * This program is based on the popular DKB raytracer version 2.12.
  23. * DKBTrace was originally written by David K. Buck.
  24. * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
  25. *
  26. *****************************************************************************/
  27. /*
  28. Some texture ideas garnered from SIGGRAPH '85 Volume 19 Number 3,
  29. "An Image Synthesizer" By Ken Perlin.
  30. Further Ideas Garnered from "The RenderMan Companion" (Addison Wesley)
  31. */
  32. #include "frame.h"
  33. #include "povray.h"
  34. #include "vector.h"
  35. #include "povproto.h"
  36. #include "texture.h"
  37. #include "image.h"
  38. #include "matrices.h"
  39. #include "normal.h"
  40. #include "pigment.h"
  41. /*****************************************************************************
  42. * Local preprocessor defines
  43. ******************************************************************************/
  44. /* Ridiculously large scaling values */
  45. #define MINX (-10000)
  46. #define MINY MINX
  47. #define MINZ MINX
  48. #define SINTABSIZE 1000
  49. #define REALSCALE (2.0 / 65535.0)
  50. #define SCURVE(a) ((a)*(a)*(3.0-2.0*(a)))
  51. /*****************************************************************************
  52. * Local typedefs
  53. ******************************************************************************/
  54. /*****************************************************************************
  55. * Local variables
  56. ******************************************************************************/
  57. static DBL *sintab;
  58. unsigned int Number_Of_Waves = 10; /* dmf */
  59. DBL *frequency; /* dmf */
  60. VECTOR *Wave_Sources; /* dmf */
  61. short *hashTable;
  62. DBL RTable[267] =
  63. {
  64. -1, 0.604974, -0.937102, 0.414115, 0.576226, -0.0161593,
  65. 0.432334, 0.103685, 0.590539, 0.0286412, 0.46981, -0.84622,
  66. -0.0734112, -0.304097, -0.40206, -0.210132, -0.919127, 0.652033,
  67. -0.83151, -0.183948, -0.671107, 0.852476, 0.043595, -0.404532,
  68. 0.75494, -0.335653, 0.618433, 0.605707, 0.708583, -0.477195,
  69. 0.899474, 0.490623, 0.221729, -0.400381, -0.853727, -0.932586,
  70. 0.659113, 0.961303, 0.325948, -0.750851, 0.842466, 0.734401,
  71. -0.649866, 0.394491, -0.466056, -0.434073, 0.109026, 0.0847028,
  72. -0.738857, 0.241505, 0.16228, -0.71426, -0.883665, -0.150408,
  73. -0.90396, -0.686549, -0.785214, 0.488548, 0.0246433, 0.142473,
  74. -0.602136, 0.375845, -0.00779736, 0.498955, -0.268147, 0.856382,
  75. -0.386007, -0.596094, -0.867735, -0.570977, -0.914366, 0.28896,
  76. 0.672206, -0.233783, 0.94815, 0.895262, 0.343252, -0.173388,
  77. -0.767971, -0.314748, 0.824308, -0.342092, 0.721431, -0.24004,
  78. -0.63653, 0.553277, 0.376272, 0.158984, -0.452659, 0.396323,
  79. -0.420676, -0.454154, 0.122179, 0.295857, 0.0664225, -0.202075,
  80. -0.724788, 0.453513, 0.224567, -0.908812, 0.176349, -0.320516,
  81. -0.697139, 0.742702, -0.900786, 0.471489, -0.133532, 0.119127,
  82. -0.889769, -0.23183, -0.669673, -0.046891, -0.803433, -0.966735,
  83. 0.475578, -0.652644, 0.0112459, -0.730007, 0.128283, 0.145647,
  84. -0.619318, 0.272023, 0.392966, 0.646418, -0.0207675, -0.315908,
  85. 0.480797, 0.535668, -0.250172, -0.83093, -0.653773, -0.443809,
  86. 0.119982, -0.897642, 0.89453, 0.165789, 0.633875, -0.886839,
  87. 0.930877, -0.537194, 0.587732, 0.722011, -0.209461, -0.0424659,
  88. -0.814267, -0.919432, 0.280262, -0.66302, -0.558099, -0.537469,
  89. -0.598779, 0.929656, -0.170794, -0.537163, 0.312581, 0.959442,
  90. 0.722652, 0.499931, 0.175616, -0.534874, -0.685115, 0.444999,
  91. 0.17171, 0.108202, -0.768704, -0.463828, 0.254231, 0.546014,
  92. 0.869474, 0.875212, -0.944427, 0.130724, -0.110185, 0.312184,
  93. -0.33138, -0.629206, 0.0606546, 0.722866, -0.0979477, 0.821561,
  94. 0.0931258, -0.972808, 0.0318151, -0.867033, -0.387228, 0.280995,
  95. -0.218189, -0.539178, -0.427359, -0.602075, 0.311971, 0.277974,
  96. 0.773159, 0.592493, -0.0331884, -0.630854, -0.269947, 0.339132,
  97. 0.581079, 0.209461, -0.317433, -0.284993, 0.181323, 0.341634,
  98. 0.804959, -0.229572, -0.758907, -0.336721, 0.605463, -0.991272,
  99. -0.0188754, -0.300191, 0.368307, -0.176135, -0.3832, -0.749569,
  100. 0.62356, -0.573938, 0.278309, -0.971313, 0.839994, -0.830686,
  101. 0.439078, 0.66128, 0.694514, 0.0565042, 0.54342, -0.438804,
  102. -0.0228428, -0.687068, 0.857267, 0.301991, -0.494255, -0.941039,
  103. 0.775509, 0.410575, -0.362081, -0.671534, -0.348379, 0.932433,
  104. 0.886442, 0.868681, -0.225666, -0.062211, -0.0976425, -0.641444,
  105. -0.848112, 0.724697, 0.473503, 0.998749, 0.174701, 0.559625,
  106. -0.029099, -0.337392, -0.958129, -0.659785, 0.236042, -0.246937,
  107. 0.659449, -0.027512, 0.821897, -0.226215, 0.0181735, 0.500481,
  108. -0.420127, -0.427878, 0.566186
  109. };
  110. static unsigned long int next_rand = 1;
  111. /*****************************************************************************
  112. * Static functions
  113. ******************************************************************************/
  114. static void InitTextureTable (void);
  115. static TEXTURE *Copy_Materials (TEXTURE *Old);
  116. /*****************************************************************************
  117. *
  118. * FUNCTION
  119. *
  120. * Initialize_Noise()
  121. *
  122. * INPUT
  123. *
  124. * OUTPUT
  125. *
  126. * RETURNS
  127. *
  128. * AUTHOR
  129. *
  130. * POV-Ray Team
  131. *
  132. * DESCRIPTION
  133. *
  134. * CHANGES
  135. *
  136. ******************************************************************************/
  137. void Initialize_Noise()
  138. {
  139. register unsigned int i;
  140. VECTOR point;
  141. InitTextureTable();
  142. sintab = (DBL *)POV_MALLOC(SINTABSIZE * sizeof(DBL), "sine table");
  143. /* dmf */
  144. frequency = (DBL *)POV_MALLOC(Number_Of_Waves * sizeof(DBL), "wave frequency table: use lower Number_Of_Waves");
  145. /* dmf */
  146. Wave_Sources = (VECTOR *)POV_MALLOC(Number_Of_Waves * sizeof(VECTOR), "wave sources table: use lower Number_Of_Waves");
  147. for (i = 0 ; i < SINTABSIZE ; i++)
  148. {
  149. sintab[i] = sin((DBL)i / SINTABSIZE * TWO_M_PI);
  150. }
  151. for (i = 0 ; i < Number_Of_Waves ; i++)
  152. {
  153. Make_Vector(point,(DBL)i,0.0,0.0);
  154. DNoise(point, point);
  155. VNormalize(Wave_Sources[i], point);
  156. frequency[i] = FRAND() + 0.01;
  157. }
  158. }
  159. /*****************************************************************************
  160. *
  161. * FUNCTION
  162. *
  163. * InitTextureTable()
  164. *
  165. * INPUT
  166. *
  167. * OUTPUT
  168. *
  169. * RETURNS
  170. *
  171. * AUTHOR
  172. *
  173. * POV-Ray Team
  174. *
  175. * DESCRIPTION
  176. *
  177. * CHANGES
  178. *
  179. ******************************************************************************/
  180. static void InitTextureTable()
  181. {
  182. short int i, j, temp;
  183. POV_SRAND(0);
  184. hashTable = (short int *)POV_MALLOC(4096*sizeof(short int), "hash table");
  185. for (i = 0; i < 4096; i++)
  186. {
  187. hashTable[i] = i;
  188. }
  189. for (i = 4095; i >= 0; i--)
  190. {
  191. j = POV_RAND() % 4096;
  192. temp = hashTable[i];
  193. hashTable[i] = hashTable[j];
  194. hashTable[j] = temp;
  195. }
  196. }
  197. /*****************************************************************************
  198. *
  199. * FUNCTION
  200. *
  201. * Free_Noise_Tables()
  202. *
  203. * INPUT
  204. *
  205. * OUTPUT
  206. *
  207. * RETURNS
  208. *
  209. * AUTHOR
  210. *
  211. * POV-Ray Team
  212. *
  213. * DESCRIPTION
  214. *
  215. * CHANGES
  216. *
  217. ******************************************************************************/
  218. void Free_Noise_Tables()
  219. {
  220. if (sintab != NULL)
  221. {
  222. POV_FREE(sintab);
  223. POV_FREE(hashTable);
  224. POV_FREE(frequency);
  225. POV_FREE(Wave_Sources);
  226. sintab = NULL;
  227. hashTable = NULL;
  228. frequency = NULL;
  229. Wave_Sources = NULL;
  230. }
  231. }
  232. /*****************************************************************************
  233. *
  234. * FUNCTION
  235. *
  236. * Noise
  237. *
  238. * INPUT
  239. *
  240. * EPoint -- 3-D point at which noise is evaluated
  241. *
  242. * OUTPUT
  243. *
  244. * RETURNS
  245. *
  246. * DBL noise value
  247. *
  248. * AUTHOR
  249. *
  250. * Robert Skinner based on Ken Perlin
  251. *
  252. * DESCRIPTION
  253. *
  254. * CHANGES
  255. * Modified by AAC to ensure uniformly distributed clamped values
  256. * between 0 and 1.0...
  257. *
  258. ******************************************************************************/
  259. DBL Noise(VECTOR EPoint)
  260. {
  261. DBL x, y, z;
  262. DBL *mp;
  263. long ix, iy, iz, jx, jy, jz;
  264. int ixiy_hash, ixjy_hash, jxiy_hash, jxjy_hash;
  265. DBL sx, sy, sz, tx, ty, tz;
  266. DBL sum;
  267. DBL x_ix, x_jx, y_iy, y_jy, z_iz, z_jz, txty, sxty, txsy, sxsy;
  268. Increase_Counter(stats[Calls_To_Noise]);
  269. x = EPoint[X]-MINX;
  270. y = EPoint[Y]-MINY;
  271. z = EPoint[Z]-MINZ;
  272. /* its equivalent integer lattice point. */
  273. ix = (long)x; iy = (long)y; iz = (long)z;
  274. jx = ix + 1; jy = iy + 1; jz = iz + 1;
  275. sx = SCURVE(x - ix); sy = SCURVE(y - iy); sz = SCURVE(z - iz);
  276. /* the complement values of sx,sy,sz */
  277. tx = 1.0 - sx; ty = 1.0 - sy; tz = 1.0 - sz;
  278. /*
  279. * interpolate!
  280. */
  281. x_ix = x - ix;
  282. x_jx = x - jx;
  283. y_iy = y - iy;
  284. y_jy = y - jy;
  285. z_iz = z - iz;
  286. z_jz = z - jz;
  287. txty = tx * ty;
  288. sxty = sx * ty;
  289. txsy = tx * sy;
  290. sxsy = sx * sy;
  291. ixiy_hash = Hash2d(ix, iy);
  292. jxiy_hash = Hash2d(jx, iy);
  293. ixjy_hash = Hash2d(ix, jy);
  294. jxjy_hash = Hash2d(jx, jy);
  295. mp = &RTable[(int) Hash1d(ixiy_hash, iz) & 0xFF];
  296. sum = INCRSUMP(mp, (txty*tz), x_ix, y_iy, z_iz);
  297. mp = &RTable[(int) Hash1d(jxiy_hash, iz) & 0xFF];
  298. sum += INCRSUMP(mp, (sxty*tz), x_jx, y_iy, z_iz);
  299. mp = &RTable[(int) Hash1d(ixjy_hash, iz) & 0xFF];
  300. sum += INCRSUMP(mp, (txsy*tz), x_ix, y_jy, z_iz);
  301. mp = &RTable[(int) Hash1d(jxjy_hash, iz) & 0xFF];
  302. sum += INCRSUMP(mp, (sxsy*tz), x_jx, y_jy, z_iz);
  303. mp = &RTable[(int) Hash1d(ixiy_hash, jz) & 0xFF];
  304. sum += INCRSUMP(mp, (txty*sz), x_ix, y_iy, z_jz);
  305. mp = &RTable[(int) Hash1d(jxiy_hash, jz) & 0xFF];
  306. sum += INCRSUMP(mp, (sxty*sz), x_jx, y_iy, z_jz);
  307. mp = &RTable[(int) Hash1d(ixjy_hash, jz) & 0xFF];
  308. sum += INCRSUMP(mp, (txsy*sz), x_ix, y_jy, z_jz);
  309. mp = &RTable[(int) Hash1d(jxjy_hash, jz) & 0xFF];
  310. sum += INCRSUMP(mp, (sxsy*sz), x_jx, y_jy, z_jz);
  311. sum = sum + 0.5; /* range at this point -0.5 - 0.5... */
  312. if (sum < 0.0)
  313. sum = 0.0;
  314. if (sum > 1.0)
  315. sum = 1.0;
  316. return (sum);
  317. }
  318. /*****************************************************************************
  319. *
  320. * FUNCTION
  321. *
  322. * DNoise
  323. *
  324. * INPUT
  325. *
  326. * EPoint -- 3-D point at which noise is evaluated
  327. *
  328. * OUTPUT
  329. *
  330. * VECTOR result
  331. *
  332. * RETURNS
  333. *
  334. * AUTHOR
  335. *
  336. * Robert Skinner based on Ken Perlin
  337. *
  338. * DESCRIPTION
  339. * Vector-valued version of "Noise"
  340. *
  341. * CHANGES
  342. * Modified by AAC to ensure uniformly distributed clamped values
  343. * between 0 and 1.0...
  344. *
  345. ******************************************************************************/
  346. void DNoise(VECTOR result, VECTOR EPoint)
  347. {
  348. DBL x, y, z;
  349. DBL *mp;
  350. long ix, iy, iz, jx, jy, jz;
  351. int ixiy_hash, ixjy_hash, jxiy_hash, jxjy_hash;
  352. DBL px, py, pz, s;
  353. DBL sx, sy, sz, tx, ty, tz;
  354. DBL txty, sxty, txsy, sxsy;
  355. Increase_Counter(stats[Calls_To_DNoise]);
  356. x = EPoint[X]-MINX;
  357. y = EPoint[Y]-MINY;
  358. z = EPoint[Z]-MINZ;
  359. /* its equivalent integer lattice point. */
  360. ix = (long)x; iy = (long)y; iz = (long)z;
  361. jx = ix + 1; jy = iy + 1; jz = iz + 1;
  362. sx = SCURVE(x - ix); sy = SCURVE(y - iy); sz = SCURVE(z - iz);
  363. /* the complement values of sx,sy,sz */
  364. tx = 1.0 - sx; ty = 1.0 - sy; tz = 1.0 - sz;
  365. /*
  366. * interpolate!
  367. */
  368. txty = tx * ty;
  369. sxty = sx * ty;
  370. txsy = tx * sy;
  371. sxsy = sx * sy;
  372. ixiy_hash = Hash2d(ix, iy);
  373. jxiy_hash = Hash2d(jx, iy);
  374. ixjy_hash = Hash2d(ix, jy);
  375. jxjy_hash = Hash2d(jx, jy);
  376. mp = &RTable[(int) Hash1d(ixiy_hash, iz) & 0xFF];
  377. px = x - ix; py = y - iy; pz = z - iz;
  378. s = txty*tz;
  379. result[X] = INCRSUMP(mp, s, px, py, pz);
  380. mp += 4;
  381. result[Y] = INCRSUMP(mp, s, px, py, pz);
  382. mp += 4;
  383. result[Z] = INCRSUMP(mp, s, px, py, pz);
  384. mp = &RTable[(int) Hash1d(jxiy_hash, iz) & 0xFF];
  385. px = x - jx;
  386. s = sxty*tz;
  387. result[X] += INCRSUMP(mp, s, px, py, pz);
  388. mp += 4;
  389. result[Y] += INCRSUMP(mp, s, px, py, pz);
  390. mp += 4;
  391. result[Z] += INCRSUMP(mp, s, px, py, pz);
  392. mp = &RTable[(int) Hash1d(jxjy_hash, iz) & 0xFF];
  393. py = y - jy;
  394. s = sxsy*tz;
  395. result[X] += INCRSUMP(mp, s, px, py, pz);
  396. mp += 4;
  397. result[Y] += INCRSUMP(mp, s, px, py, pz);
  398. mp += 4;
  399. result[Z] += INCRSUMP(mp, s, px, py, pz);
  400. mp = &RTable[(int) Hash1d(ixjy_hash, iz) & 0xFF];
  401. px = x - ix;
  402. s = txsy*tz;
  403. result[X] += INCRSUMP(mp, s, px, py, pz);
  404. mp += 4;
  405. result[Y] += INCRSUMP(mp, s, px, py, pz);
  406. mp += 4;
  407. result[Z] += INCRSUMP(mp, s, px, py, pz);
  408. mp = &RTable[(int) Hash1d(ixjy_hash, jz) & 0xFF];
  409. pz = z - jz;
  410. s = txsy*sz;
  411. result[X] += INCRSUMP(mp, s, px, py, pz);
  412. mp += 4;
  413. result[Y] += INCRSUMP(mp, s, px, py, pz);
  414. mp += 4;
  415. result[Z] += INCRSUMP(mp, s, px, py, pz);
  416. mp = &RTable[(int) Hash1d(jxjy_hash, jz) & 0xFF];
  417. px = x - jx;
  418. s = sxsy*sz;
  419. result[X] += INCRSUMP(mp, s, px, py, pz);
  420. mp += 4;
  421. result[Y] += INCRSUMP(mp, s, px, py, pz);
  422. mp += 4;
  423. result[Z] += INCRSUMP(mp, s, px, py, pz);
  424. mp = &RTable[(int) Hash1d(jxiy_hash, jz) & 0xFF];
  425. py = y - iy;
  426. s = sxty*sz;
  427. result[X] += INCRSUMP(mp, s, px, py, pz);
  428. mp += 4;
  429. result[Y] += INCRSUMP(mp, s, px, py, pz);
  430. mp += 4;
  431. result[Z] += INCRSUMP(mp, s, px, py, pz);
  432. mp = &RTable[(int) Hash1d(ixiy_hash, jz) & 0xFF];
  433. px = x - ix;
  434. s = txty*sz;
  435. result[X] += INCRSUMP(mp, s, px, py, pz);
  436. mp += 4;
  437. result[Y] += INCRSUMP(mp, s, px, py, pz);
  438. mp += 4;
  439. result[Z] += INCRSUMP(mp, s, px, py, pz);
  440. }
  441. /*****************************************************************************
  442. *
  443. * FUNCTION
  444. *
  445. * Turbulence
  446. *
  447. * INPUT
  448. *
  449. * EPoint -- Point at which turb is evaluated.
  450. * Turb -- Parameters for fbm calculations.
  451. *
  452. * OUTPUT
  453. *
  454. * RETURNS
  455. *
  456. * DBL result
  457. *
  458. * AUTHOR
  459. *
  460. * POV-Ray Team
  461. *
  462. * DESCRIPTION : Computes a Fractal Brownian Motion turbulence value
  463. * using repeated calls to a Perlin Noise function.
  464. *
  465. * CHANGES
  466. * ??? ???? : Updated with varible Octaves, Lambda, & Omega by [DMF]
  467. *
  468. ******************************************************************************/
  469. DBL Turbulence(VECTOR EPoint,TURB *Turb)
  470. {
  471. int i;
  472. DBL Lambda, Omega, l, o, value;
  473. VECTOR temp;
  474. int Octaves=Turb->Octaves;
  475. value = Noise(EPoint);
  476. l = Lambda = Turb->Lambda;
  477. o = Omega = Turb->Omega;
  478. for (i = 2; i <= Octaves; i++)
  479. {
  480. VScale(temp,EPoint,l);
  481. value += o * Noise(temp);
  482. if (i < Octaves)
  483. {
  484. l *= Lambda;
  485. o *= Omega;
  486. }
  487. }
  488. return (value);
  489. }
  490. /*****************************************************************************
  491. *
  492. * FUNCTION
  493. *
  494. * DTurbulence
  495. *
  496. * INPUT
  497. *
  498. * EPoint -- Point at which turb is evaluated.
  499. * Turb -- Parameters for fmb calculations.
  500. *
  501. * OUTPUT
  502. *
  503. * result -- Vector valued turbulence
  504. *
  505. * RETURNS
  506. *
  507. * AUTHOR
  508. *
  509. * POV-Ray Team
  510. *
  511. * DESCRIPTION : Computes a Fractal Brownian Motion turbulence value
  512. * using repeated calls to a Perlin DNoise function.
  513. *
  514. * CHANGES
  515. * ??? ???? : Updated with varible Octaves, Lambda, & Omega by [DMF]
  516. *
  517. ******************************************************************************/
  518. void DTurbulence(VECTOR result, VECTOR EPoint, TURB *Turb)
  519. {
  520. DBL Omega, Lambda;
  521. int i;
  522. DBL l, o;
  523. VECTOR value, temp;
  524. int Octaves=Turb->Octaves;
  525. result[X] = result[Y] = result[Z] = 0.0;
  526. value[X] = value[Y] = value[Z] = 0.0;
  527. DNoise(result, EPoint);
  528. l = Lambda = Turb->Lambda;
  529. o = Omega = Turb->Omega;
  530. for (i = 2; i <= Octaves; i++)
  531. {
  532. VScale(temp,EPoint,l);
  533. DNoise(value, temp);
  534. result[X] += o * value[X];
  535. result[Y] += o * value[Y];
  536. result[Z] += o * value[Z];
  537. if (i < Octaves)
  538. {
  539. l *= Lambda;
  540. o *= Omega;
  541. }
  542. }
  543. }
  544. /*****************************************************************************
  545. *
  546. * FUNCTION
  547. *
  548. * cycloidal
  549. *
  550. * INPUT
  551. *
  552. * DBL value
  553. *
  554. * OUTPUT
  555. *
  556. * RETURNS
  557. *
  558. * DBL result
  559. *
  560. * AUTHOR
  561. *
  562. * POV-Ray Team
  563. *
  564. * DESCRIPTION
  565. *
  566. * CHANGES
  567. *
  568. ******************************************************************************/
  569. DBL cycloidal(DBL value)
  570. {
  571. register int indx;
  572. if (value >= 0.0)
  573. {
  574. indx = (int)((value - floor(value)) * SINTABSIZE);
  575. return (sintab [indx]);
  576. }
  577. else
  578. {
  579. indx = (int)((0.0 - (value + floor(0.0 - value))) * SINTABSIZE);
  580. return (0.0 - sintab [indx]);
  581. }
  582. }
  583. /*****************************************************************************
  584. *
  585. * FUNCTION
  586. *
  587. * Triangle_Wave
  588. *
  589. * INPUT
  590. *
  591. * DBL value
  592. *
  593. * OUTPUT
  594. *
  595. * RETURNS
  596. *
  597. * DBL result
  598. *
  599. * AUTHOR
  600. *
  601. * POV-Ray Team
  602. *
  603. * DESCRIPTION
  604. *
  605. * CHANGES
  606. *
  607. ******************************************************************************/
  608. DBL Triangle_Wave(DBL value)
  609. {
  610. register DBL offset;
  611. if (value >= 0.0)
  612. {
  613. offset = value - floor(value);
  614. }
  615. else
  616. {
  617. offset = value + 1.0 + floor(fabs(value));
  618. }
  619. if (offset >= 0.5)
  620. {
  621. return (2.0 * (1.0 - offset));
  622. }
  623. else
  624. {
  625. return (2.0 * offset);
  626. }
  627. }
  628. /*****************************************************************************
  629. *
  630. * FUNCTION
  631. *
  632. * INPUT
  633. *
  634. * OUTPUT
  635. *
  636. * RETURNS
  637. *
  638. * AUTHOR
  639. *
  640. * POV-Ray Team
  641. *
  642. * DESCRIPTION
  643. *
  644. * CHANGES
  645. *
  646. ******************************************************************************/
  647. void Transform_Textures(TEXTURE *Textures, TRANSFORM *Trans)
  648. {
  649. TEXTURE *Layer;
  650. for (Layer = Textures; Layer != NULL; Layer = (TEXTURE *)Layer->Next)
  651. {
  652. if (Layer->Type == PLAIN_PATTERN)
  653. {
  654. Transform_Tpattern((TPATTERN *)Layer->Pigment, Trans);
  655. Transform_Tpattern((TPATTERN *)Layer->Tnormal, Trans);
  656. }
  657. else
  658. {
  659. Transform_Tpattern((TPATTERN *)Layer, Trans);
  660. }
  661. }
  662. }
  663. /*****************************************************************************
  664. *
  665. * FUNCTION
  666. *
  667. * INPUT
  668. *
  669. * OUTPUT
  670. *
  671. * RETURNS
  672. *
  673. * AUTHOR
  674. *
  675. * POV-Ray Team
  676. *
  677. * DESCRIPTION
  678. *
  679. * CHANGES
  680. *
  681. ******************************************************************************/
  682. FINISH *Create_Finish()
  683. {
  684. FINISH *New;
  685. New = (FINISH *)POV_MALLOC(sizeof (FINISH), "finish");
  686. Make_RGB(New->Ambient, 0.1, 0.1, 0.1);
  687. Make_RGB(New->Reflection, 0.0, 0.0, 0.0);
  688. New->Diffuse = 0.6;
  689. New->Brilliance = 1.0;
  690. New->Phong = 0.0;
  691. New->Phong_Size = 40.0;
  692. New->Specular = 0.0;
  693. New->Roughness = 1.0 / 0.05;
  694. New->Crand = 0.0;
  695. New->Metallic = 0.0;
  696. New->Irid = 0.0;
  697. New->Irid_Film_Thickness = 0.0;
  698. New->Irid_Turb = 0.0;
  699. New->Temp_Caustics = -1.0;
  700. New->Temp_IOR = -1.0;
  701. New->Temp_Refract = 1.0;
  702. New->Reflect_Exp = 1.0;
  703. return(New);
  704. }
  705. /*****************************************************************************
  706. *
  707. * FUNCTION
  708. *
  709. * INPUT
  710. *
  711. * OUTPUT
  712. *
  713. * RETURNS
  714. *
  715. * AUTHOR
  716. *
  717. * POV-Ray Team
  718. *
  719. * DESCRIPTION
  720. *
  721. * CHANGES
  722. *
  723. ******************************************************************************/
  724. FINISH *Copy_Finish(FINISH *Old)
  725. {
  726. FINISH *New;
  727. if (Old != NULL)
  728. {
  729. New = Create_Finish();
  730. *New = *Old;
  731. }
  732. else
  733. New = NULL;
  734. return (New);
  735. }
  736. /*****************************************************************************
  737. *
  738. * FUNCTION
  739. *
  740. * INPUT
  741. *
  742. * OUTPUT
  743. *
  744. * RETURNS
  745. *
  746. * AUTHOR
  747. *
  748. * POV-Ray Team
  749. *
  750. * DESCRIPTION
  751. *
  752. * CHANGES
  753. *
  754. ******************************************************************************/
  755. TEXTURE *Create_Texture()
  756. {
  757. TEXTURE *New;
  758. New = (TEXTURE *)POV_MALLOC(sizeof (TEXTURE), "texture");
  759. Init_TPat_Fields((TPATTERN *)New);
  760. New->References = 1;
  761. New->Type = PLAIN_PATTERN;
  762. New->Flags = NO_FLAGS;
  763. New->Pigment = NULL;
  764. New->Tnormal = NULL;
  765. New->Finish = NULL;
  766. New->Next = NULL;
  767. New->Next_Material = NULL;
  768. return (New);
  769. }
  770. /*****************************************************************************
  771. *
  772. * FUNCTION
  773. *
  774. * INPUT
  775. *
  776. * OUTPUT
  777. *
  778. * RETURNS
  779. *
  780. * AUTHOR
  781. *
  782. * POV-Ray Team
  783. *
  784. * DESCRIPTION
  785. *
  786. * CHANGES
  787. *
  788. ******************************************************************************/
  789. TEXTURE *Copy_Texture_Pointer(TEXTURE *Texture)
  790. {
  791. if (Texture != NULL)
  792. {
  793. Texture->References++;
  794. }
  795. return(Texture);
  796. }
  797. /*****************************************************************************
  798. *
  799. * FUNCTION
  800. *
  801. * INPUT
  802. *
  803. * OUTPUT
  804. *
  805. * RETURNS
  806. *
  807. * AUTHOR
  808. *
  809. * POV-Ray Team
  810. *
  811. * DESCRIPTION
  812. *
  813. * CHANGES
  814. *
  815. ******************************************************************************/
  816. TEXTURE *Copy_Textures(TEXTURE *Textures)
  817. {
  818. TEXTURE *New, *First, *Previous, *Layer;
  819. Previous = First = NULL;
  820. for (Layer = Textures; Layer != NULL; Layer = (TEXTURE *)Layer->Next)
  821. {
  822. New = Create_Texture();
  823. Copy_TPat_Fields ((TPATTERN *)New, (TPATTERN *)Layer);
  824. /* Mesh copies a texture pointer that already has multiple
  825. references. We just want a clean copy, not a copy
  826. that's multply referenced.
  827. */
  828. New->References = 1;
  829. switch (Layer->Type)
  830. {
  831. case PLAIN_PATTERN:
  832. New->Pigment = Copy_Pigment(Layer->Pigment);
  833. New->Tnormal = Copy_Tnormal(Layer->Tnormal);
  834. New->Finish = Copy_Finish(Layer->Finish);
  835. break;
  836. case BITMAP_PATTERN:
  837. New->Materials = Copy_Materials(Layer->Materials);
  838. New->Num_Of_Mats = Layer->Num_Of_Mats;
  839. /* Not needed. Copied by Copy_TPat_Fields */
  840. /* New->Vals.Image = Copy_Image(Layer->Vals.Image);*/
  841. break;
  842. }
  843. if (First == NULL)
  844. {
  845. First = New;
  846. }
  847. if (Previous != NULL)
  848. {
  849. Previous->Next = (TPATTERN *)New;
  850. }
  851. Previous = New;
  852. }
  853. return (First);
  854. }
  855. /*****************************************************************************
  856. *
  857. * FUNCTION
  858. *
  859. * INPUT
  860. *
  861. * OUTPUT
  862. *
  863. * RETURNS
  864. *
  865. * AUTHOR
  866. *
  867. * POV-Ray Team
  868. *
  869. * DESCRIPTION
  870. *
  871. * CHANGES
  872. *
  873. ******************************************************************************/
  874. static TEXTURE *Copy_Materials(TEXTURE *Old)
  875. {
  876. TEXTURE *New, *First, *Previous, *Material;
  877. Previous = First = NULL;
  878. for (Material = Old; Material != NULL; Material = Material->Next_Material)
  879. {
  880. New = Copy_Textures(Material);
  881. if (First == NULL)
  882. {
  883. First = New;
  884. }
  885. if (Previous != NULL)
  886. {
  887. Previous->Next_Material = New;
  888. }
  889. Previous = New;
  890. }
  891. return (First);
  892. }
  893. /*****************************************************************************
  894. *
  895. * FUNCTION
  896. *
  897. * INPUT
  898. *
  899. * OUTPUT
  900. *
  901. * RETURNS
  902. *
  903. * AUTHOR
  904. *
  905. * POV-Ray Team
  906. *
  907. * DESCRIPTION
  908. *
  909. * CHANGES
  910. *
  911. ******************************************************************************/
  912. void Destroy_Textures(TEXTURE *Textures)
  913. {
  914. TEXTURE *Layer = Textures;
  915. TEXTURE *Mats;
  916. TEXTURE *Temp;
  917. if ((Textures == NULL) || (--(Textures->References) > 0))
  918. {
  919. return;
  920. }
  921. while (Layer != NULL)
  922. {
  923. Mats = Layer->Next_Material;
  924. while (Mats != NULL)
  925. {
  926. Temp = Mats->Next_Material;
  927. Mats->Next_Material = NULL;
  928. Destroy_Textures(Mats);
  929. Mats = Temp;
  930. }
  931. Destroy_TPat_Fields((TPATTERN *)Layer);
  932. switch (Layer->Type)
  933. {
  934. case PLAIN_PATTERN:
  935. Destroy_Pigment(Layer->Pigment);
  936. Destroy_Tnormal(Layer->Tnormal);
  937. Destroy_Finish(Layer->Finish);
  938. break;
  939. case BITMAP_PATTERN:
  940. Destroy_Textures(Layer->Materials);
  941. /*taken care of by Destroy_TPat_Fields*/
  942. /*Destroy_Image(Layer->Vals.Image);*/
  943. break;
  944. }
  945. Temp = (TEXTURE *)Layer->Next;
  946. POV_FREE(Layer);
  947. Layer = Temp;
  948. }
  949. }
  950. /*****************************************************************************
  951. *
  952. * FUNCTION
  953. *
  954. * INPUT
  955. *
  956. * OUTPUT
  957. *
  958. * RETURNS
  959. *
  960. * AUTHOR
  961. *
  962. * POV-Ray Team
  963. *
  964. * DESCRIPTION
  965. *
  966. * CHANGES
  967. *
  968. ******************************************************************************/
  969. void Post_Textures(TEXTURE *Textures)
  970. {
  971. TEXTURE *Layer, *Material;
  972. int i;
  973. BLEND_MAP *Map;
  974. if (Textures == NULL)
  975. {
  976. return;
  977. }
  978. for (Layer = Textures; Layer != NULL; Layer = (TEXTURE *)Layer->Next)
  979. {
  980. if (!((Layer->Flags) & POST_DONE))
  981. {
  982. switch (Layer->Type)
  983. {
  984. case PLAIN_PATTERN:
  985. Post_Pigment(Layer->Pigment);
  986. Post_Tnormal(Layer->Tnormal);
  987. break;
  988. case BITMAP_PATTERN:
  989. for (Material = Layer->Materials; Material != NULL; Material = Material->Next_Material)
  990. Post_Textures(Material);
  991. break;
  992. }
  993. if ((Map=Layer->Blend_Map) != NULL)
  994. {
  995. for (i = 0; i < Map->Number_Of_Entries; i++)
  996. {
  997. Post_Textures(Map->Blend_Map_Entries[i].Vals.Texture);
  998. }
  999. }
  1000. else
  1001. {
  1002. if (Layer->Type == AVERAGE_PATTERN)
  1003. {
  1004. Error("No texture map in averaged texture.");
  1005. }
  1006. }
  1007. }
  1008. }
  1009. }
  1010. /*****************************************************************************
  1011. *
  1012. * FUNCTION
  1013. *
  1014. * Test_Opacity
  1015. *
  1016. * INPUT
  1017. *
  1018. * Object - Pointer to object
  1019. *
  1020. * OUTPUT
  1021. *
  1022. * RETURNS
  1023. *
  1024. * int - TRUE, if opaque
  1025. *
  1026. * AUTHOR
  1027. *
  1028. * Dieter Bayer
  1029. *
  1030. * DESCRIPTION
  1031. *
  1032. * Test wether an object is opaque or not, i.e. wether the texture contains
  1033. * a non-zero filter or alpha channel.
  1034. *
  1035. * CHANGES
  1036. *
  1037. * Aug 1994 : Creation.
  1038. *
  1039. * Oct 1994 : Added code to check for opaque image maps. [DB]
  1040. *
  1041. * Jun 1995 : Added code to check for alpha channel image maps. [DB]
  1042. *
  1043. ******************************************************************************/
  1044. int Test_Opacity(TEXTURE *Texture)
  1045. {
  1046. int x, y;
  1047. int Opaque, Help;
  1048. IMAGE *Image;
  1049. TEXTURE *Layer, *Material;
  1050. if (Texture == NULL)
  1051. {
  1052. return(FALSE);
  1053. }
  1054. /* We assume that the object is not opaque. */
  1055. Opaque = FALSE;
  1056. /* Test all layers. If at least one layer is opaque the object is opaque. */
  1057. for (Layer = Texture; Layer != NULL; Layer = (TEXTURE *)Layer->Next)
  1058. {
  1059. switch (Layer->Type)
  1060. {
  1061. case PLAIN_PATTERN:
  1062. /* Test image map for opacity. */
  1063. if ((Layer->Pigment->Type == BITMAP_PATTERN) &&
  1064. (Layer->Pigment->Vals.Image != NULL))
  1065. {
  1066. /* Layer is not opaque if the image map is used just once. */
  1067. if (Layer->Pigment->Vals.Image->Once_Flag)
  1068. {
  1069. break;
  1070. }
  1071. /* Layer is not opaque if there's at least one non-opaque color. */
  1072. Image = Layer->Pigment->Vals.Image;
  1073. Help = FALSE;
  1074. if (Image->Colour_Map != NULL)
  1075. {
  1076. /* Test color map. */
  1077. for (x = 0; x < (int)Image->Colour_Map_Size; x++)
  1078. {
  1079. if (fabs(Image->Colour_Map[x].Filter) > EPSILON)
  1080. {
  1081. Help = TRUE;
  1082. break;
  1083. }
  1084. }
  1085. }
  1086. else
  1087. {
  1088. /* Test image. */
  1089. if (Image->data.rgb_lines[0].transm != NULL)
  1090. {
  1091. for (y = 0; y < Image->iheight; y++)
  1092. {
  1093. for (x = 0; x < Image->iwidth; x++)
  1094. {
  1095. if (fabs(Image->data.rgb_lines[y].transm[x]) > EPSILON)
  1096. {
  1097. Help = TRUE;
  1098. break;
  1099. }
  1100. }
  1101. if (Help)
  1102. {
  1103. break;
  1104. }
  1105. }
  1106. }
  1107. }
  1108. if (Help)
  1109. {
  1110. break;
  1111. }
  1112. }
  1113. if (!(Layer->Pigment->Flags & HAS_FILTER))
  1114. {
  1115. Opaque = TRUE;
  1116. }
  1117. break;
  1118. case BITMAP_PATTERN:
  1119. /* Layer is not opaque if the image map is used just once. */
  1120. if (Layer->Vals.Image != NULL)
  1121. {
  1122. if (Layer->Vals.Image->Once_Flag)
  1123. {
  1124. break;
  1125. }
  1126. }
  1127. /* Layer is opaque if all materials are opaque. */
  1128. Help = TRUE;
  1129. for (Material = Layer->Materials; Material != NULL; Material = Material->Next_Material)
  1130. {
  1131. if (!Test_Opacity(Material))
  1132. {
  1133. /* Material is not opaque --> layer is not opaque. */
  1134. Help = FALSE;
  1135. break;
  1136. }
  1137. }
  1138. if (Help)
  1139. {
  1140. Opaque = TRUE;
  1141. }
  1142. break;
  1143. }
  1144. }
  1145. return(Opaque);
  1146. }
  1147. /*****************************************************************************
  1148. *
  1149. * FUNCTION
  1150. *
  1151. * POV_RAND
  1152. *
  1153. * INPUT
  1154. *
  1155. * OUTPUT
  1156. *
  1157. * RETURNS
  1158. *
  1159. * int - random value
  1160. *
  1161. * AUTHOR
  1162. *
  1163. * POV-Ray Team
  1164. *
  1165. * DESCRIPTION
  1166. *
  1167. * Standard pseudo-random function.
  1168. *
  1169. * CHANGES
  1170. *
  1171. * Feb 1995 : Creation.
  1172. *
  1173. ******************************************************************************/
  1174. int POV_RAND()
  1175. {
  1176. next_rand = next_rand * 1812433253L + 12345L;
  1177. return((int)(next_rand >> 16) & RNDMASK);
  1178. }
  1179. int POV_GET_OLD_RAND()
  1180. {
  1181. return(next_rand);
  1182. }
  1183. /*****************************************************************************
  1184. *
  1185. * FUNCTION
  1186. *
  1187. * POV_SRAND
  1188. *
  1189. * INPUT
  1190. *
  1191. * seed - Pseudo-random generator start value
  1192. *
  1193. * OUTPUT
  1194. *
  1195. * RETURNS
  1196. *
  1197. * AUTHOR
  1198. *
  1199. * POV-Ray Team
  1200. *
  1201. * DESCRIPTION
  1202. *
  1203. * Set start value for pseudo-random generator.
  1204. *
  1205. * CHANGES
  1206. *
  1207. * Feb 1995 : Creation.
  1208. *
  1209. ******************************************************************************/
  1210. void POV_SRAND(int seed)
  1211. {
  1212. next_rand = (unsigned long int)seed;
  1213. }