Advertisement
Guest User

URCL Ray Tracer by Verlio_H for IRIS

a guest
Apr 26th, 2024
779
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.92 KB | Source Code | 0 0
  1. // URCL Path Tracer written by Verlio_H
  2. // Designed to run on IRIS Minecraft CPU
  3.  
  4. MINSTACK 0
  5.  
  6. @DEFINE @MAX_REFLECT 10
  7. //iris size
  8. //@DEFINE @INC 0.0208333333f
  9. //@DEFINE @STARTX -0.666666
  10. //@DEFINE @MAXX 64
  11. //@DEFINE @MAXY 48
  12.  
  13. //arbitrary size
  14. //MINHEAP 65510
  15.  
  16. @DEFINE @INC 0.02083333333
  17. @DEFINE @STARTX -0.666666
  18. @DEFINE @MAXX 64
  19. @DEFINE @MAXY 48
  20.  
  21. IMM R24 1
  22. IMM R19 0.0
  23. HPSH R19
  24. HPSH R0
  25. HPSH R0
  26. //OUT %BUFFER 1
  27. .SampleLoop
  28. MOV R1 @STARTX
  29. IMM R2 0.5
  30. IMM R3 0
  31. IMM R4 0
  32. OUT %COLORY 0
  33. HPOP R0
  34. HPOP R0
  35. HPOP R19
  36. FADD R19 R19 1.0
  37. HPSH R19
  38. FDIV R24 1.0 R19
  39. HPSH M0
  40. HPSH R24
  41. .Loop
  42. HCAL .xorshift
  43. OUT %COLORX R3
  44. MOV R18 R0
  45. ITOF R8 R24
  46. HCAL .xorshift
  47. FMLT R8 R8 @INC
  48. FDIV R8 R8 32768.0
  49. FMLT R8 R8 0.5
  50. FADD R5 R1 R8
  51. ITOF R8 R24
  52. HCAL .xorshift
  53. FMLT R8 R8 @INC
  54. FDIV R8 R8 32768.0
  55. FMLT R8 R8 0.5
  56. FADD R6 R2 R8
  57. MOV R7 1.0
  58. HCAL .prenormalize
  59. HCAL .normalize
  60. MOV R20 R0 //ro
  61. MOV R21 R0
  62. MOV R22 R0
  63. HCAL .intersect
  64. FMLT R20 R5 R15
  65. FMLT R21 R6 R15
  66. FMLT R22 R7 R15
  67. JMP .getLight
  68. .getLightRet
  69.  
  70. HPOP R25
  71. HPOP R18
  72. FMLT R15 R8 R25
  73. LOD R8 R18
  74. FSUB R23 1.0 R25
  75. FMLT R8 R8 R23
  76. FADD R8 R8 R15
  77. STR R18 R8
  78. INC R18 R18
  79. HPSH R18
  80. HPSH R25
  81. //gamma correction
  82. FSQRT R8 R8
  83. //convert to display color
  84. FMLT R15 R8 15.0
  85. FTOI R15 R15
  86. BLE ~+2 R15 15
  87. IMM R15 15
  88. OUT %COLOR R15
  89. INC R3 R3
  90. FADD R1 R1 @INC
  91. BRL .Loop R3 @MAXX
  92. INC R4 R4
  93. FSUB R2 R2 @INC
  94. OUT %COLORY R4
  95. IMM R3 0
  96. IMM R1 @STARTX
  97. //OUT %BUFFER 2
  98. BRL .Loop R4 @MAXY
  99. JMP .SampleLoop
  100. //181.019335984
  101.  
  102. .Objtbl
  103. DW .Sky
  104. DW .Sphere
  105. DW .Sphere2
  106. DW .Plane
  107. DW 0
  108. .Properties
  109. DW 2
  110. DW 0
  111. DW 1
  112. DW 3
  113.  
  114. .Sky
  115. DW 0
  116. DW 0.97
  117.  
  118. .Sphere
  119. DW 1
  120. DW 0.3
  121. DW [0.4 0.0 2.1]
  122. DW 0.5
  123.  
  124. .Sphere2
  125. DW 1
  126. DW 0.7
  127. DW [-0.6 0.5 2.2]
  128. DW 0.5
  129.  
  130. .Plane
  131. DW 2
  132. DW 1000.0
  133. DW -0.5
  134.  
  135. .getLight
  136. MOV R23 R15
  137. IMM R8 -1 //refcnt
  138. IMM R12 1.0 //colMlt
  139. .getLightLoop
  140. INC R8 R8
  141. BGE .getLightBounceExceeded R8 @MAX_REFLECT
  142. LOD R13 R11
  143. LOD R14 R13
  144. SUB R15 R11 .Objtbl
  145. LLOD R18 R15 .Properties
  146. BRE .checkerboard R18 3
  147. .checkerboardret
  148. BRZ ~+2 R14
  149. BNE .getLightNotLight R18 2
  150. LLOD R13 R13 1
  151. FMLT R8 R12 R13
  152. JMP .getLightRet
  153. .getLightNotLight
  154. HPSH R18
  155. //get normal
  156. BRE .getNormalSphere R14 1
  157. IMM R15 0.0
  158. IMM R16 1.0
  159. IMM R17 0.0
  160. .getNormalRet
  161. HPOP R18
  162. //diffuse lighting
  163. BRE .specular R18 1
  164. .randPointLoop
  165. //get rand on sphere
  166. ITOF R5 R24
  167. HCAL .xorshift
  168. ITOF R6 R24
  169. HCAL .xorshift
  170. ITOF R7 R24
  171. HCAL .xorshift
  172. FDIV R5 R5 32768.0
  173. FDIV R6 R6 32768.0
  174. FDIV R7 R7 32768.0
  175. FMLT R18 R5 R5
  176. FMLT R19 R6 R6
  177. FADD R18 R18 R19
  178. FMLT R19 R7 R7
  179. FADD R18 R18 R19
  180. BRG .randPointLoop R18 1.0
  181. HPSH R8
  182. HCAL .prenormalize
  183. HCAL .normalize
  184. FADD R5 R15 R5
  185. FADD R6 R16 R6
  186. FADD R7 R17 R7
  187. HCAL .prenormalize
  188. HCAL .normalize
  189. //
  190. .specularRet
  191. LLOD R13 R13 1
  192. BRE .checkerboardCol R13 1000.0
  193. .checkerboardColRet
  194. FMLT R12 R12 R13
  195. HPSH R12
  196. HCAL .intersect
  197. HPOP R12
  198. HPOP R8
  199. FMLT R13 R5 R15
  200. FADD R20 R20 R13
  201. FMLT R13 R6 R15
  202. FADD R21 R21 R13
  203. FMLT R13 R7 R15
  204. FADD R22 R22 R13
  205. JMP .getLightLoop
  206.  
  207. .specular
  208. FMLT R18 R5 R15
  209. FMLT R19 R6 R16
  210. FADD R18 R18 R19
  211. FMLT R19 R7 R17
  212. FADD R18 R18 R19
  213. FMLT R18 R18 2.0
  214. FMLT R15 R15 R18
  215. FMLT R16 R16 R18
  216. FMLT R17 R17 R18
  217. FSUB R5 R5 R15
  218. FSUB R6 R6 R16
  219. FSUB R7 R7 R17
  220. HPSH R8
  221. JMP .specularRet
  222.  
  223. .checkerboard
  224. FMLT R18 R20 3.0
  225. FTOI R18 R18
  226. FMLT R19 R22 3.0
  227. FTOI R19 R19
  228. AND R18 R18 1
  229. AND R19 R19 1
  230. XOR R18 R18 R19
  231. JMP .checkerboardret
  232.  
  233. .checkerboardCol
  234. FMLT R18 R20 3.0
  235. FTOI R18 R18
  236. FMLT R19 R22 3.0
  237. FTOI R19 R19
  238. AND R18 R18 1
  239. AND R19 R19 1
  240. XOR R18 R18 R19
  241. XOR R18 R18 1
  242. INC R18 R18
  243. ITOF R18 R18
  244. FMLT R13 0.3 R18
  245. JMP .checkerboardColRet
  246.  
  247. .getNormalSphere
  248. LLOD R18 R13 5
  249. LLOD R15 R13 2
  250. FSUB R15 R20 R15
  251. FDIV R15 R15 R18
  252. LLOD R16 R13 3
  253. FSUB R16 R21 R16
  254. FDIV R16 R16 R18
  255. LLOD R17 R13 4
  256. FSUB R17 R22 R17
  257. FDIV R17 R17 R18
  258. JMP .getNormalRet
  259.  
  260. .getLightBounceExceeded
  261. MOV R8 R0
  262. JMP .getLightRet
  263.  
  264. .intersect
  265. IMM R13 .Objtbl //i
  266. IMM R11 .Objtbl //o
  267. IMM R15 100.0 //dist1
  268. IMM R16 100.0 //dist2
  269. .intersect_loop
  270. LOD R12 R13
  271. BNZ ~+2 R12
  272. HRET
  273. LOD R14 R12
  274. INC R13 R13
  275. BRZ .intersect_loop R14
  276. BRE .intersect_plane R14 2
  277. //sphere
  278. //vec3 oc = ro - thing.pos;
  279. //R17 R18 R19
  280. LLOD R17 R12 2
  281. FSUB R17 R20 R17
  282. LLOD R18 R12 3
  283. FSUB R18 R21 R18
  284. LLOD R19 R12 4
  285. FSUB R19 R22 R19
  286.  
  287. //R23 = length(oc)
  288. HPSH R5
  289. HPSH R6
  290. HPSH R7
  291. MOV R5 R17
  292. MOV R6 R18
  293. MOV R7 R19
  294. HCAL .prenormalize
  295. FDIV R23 1.0 R8
  296. HPOP R7
  297. HPOP R6
  298. HPOP R5
  299.  
  300. //float hb = dot(oc, rd);
  301. //R17
  302.  
  303.  
  304. FMLT R17 R17 R5
  305. FMLT R8 R18 R6
  306. FADD R17 R17 R8
  307. FMLT R8 R19 R7
  308. FADD R17 R17 R8
  309.  
  310. //float c = R23*R23 - thing.r*thing.r;
  311. //R18
  312. LLOD R18 R12 5
  313. FMLT R18 R18 R18
  314. FMLT R19 R23 R23
  315. FSUB R18 R19 R18
  316. //float discriminant = hb*hb - c;
  317. //R8
  318. FMLT R8 R17 R17
  319.  
  320. FSUB R8 R8 R18
  321. //if (discriminant > 0.) {
  322. BRN .intersect_loop R8
  323. //dist2 = -hb - sqrt(discriminant);
  324. //R16
  325. NOT R17 R17
  326. //inverse sqrt
  327. HCAL .invsqrt
  328. //inverse inverse sqrt
  329. FDIV R8 1.0 R8
  330. FSUB R16 R17 R8
  331. //if (dist2 < dist && dist2 > 0.) {
  332. BRN .intersect_loop R16
  333. BGE .intersect_loop R16 R15
  334. //o = i;
  335. DEC R11 R13
  336.  
  337. //dist = dist2;
  338. MOV R15 R16
  339. //}
  340. //}
  341. JMP .intersect_loop
  342.  
  343. .intersect_plane
  344. //if (thing.pos.y < ro.y && rd.y < 0.) {
  345. SBRG .intersect_loop R6 -0.0019
  346. LLOD R8 R12 2
  347. SBGE .intersect_loop R8 R21
  348. //float mfactor = (ro.y - thing.pos.y)/rd.y;
  349. //R17
  350. FSUB R17 R21 R8
  351. FDIV R17 R17 R6
  352. //dist2 = length(rd*mfactor);
  353. HPSH R5
  354. HPSH R6
  355. HPSH R7
  356. FMLT R5 R5 R17
  357. FMLT R6 R6 R17
  358. FMLT R7 R7 R17
  359. HCAL .prenormalize
  360. FDIV R16 1.0 R8
  361. HPOP R7
  362. HPOP R6
  363. HPOP R5
  364. //if (dist2 < dist) {
  365. BGE .intersect_loop R16 R15
  366. //o = i;
  367. DEC R11 R13
  368. //dist = dist2;
  369. MOV R15 R16
  370. JMP .intersect_loop
  371. //}
  372. //}
  373.  
  374.  
  375. .xorshift
  376. BSL R25 R24 7
  377. XOR R24 R24 R25
  378. BSR R25 R24 9
  379. XOR R24 R24 R25
  380. BSL R25 R24 8
  381. XOR R24 R24 R25
  382. HRET
  383.  
  384. //inputs/outputs: R5 R6 R7
  385. //used: R8 R9 R10
  386. .prenormalize
  387. //calc len
  388. FMLT R8 R5 R5
  389. FMLT R9 R6 R6
  390. FADD R8 R8 R9
  391. FMLT R9 R7 R7
  392. FADD R8 R8 R9
  393. .invsqrt
  394. //inverse sqrt
  395. FSQRT R8 R8
  396. FDIV R8 1.0 R8
  397.  
  398.  
  399. HRET
  400. .normalize
  401. //actually normalize
  402. FMLT R5 R5 R8
  403. FMLT R6 R6 R8
  404. FMLT R7 R7 R8
  405. HRET
  406.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement