Guest User

Untitled

a guest
Dec 10th, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.73 KB | None | 0 0
  1. func Init(cfg : Kuin@CCfg)
  2. do cfg.Title :: "AOBench"
  3. do cfg.FullScr :: false
  4. do cfg.PadNum :: 1
  5. do cfg.WaitTime :: 60
  6. end func
  7.  
  8. func Main()
  9. var ao : AOBench@AOBench
  10. do ao :: @new AOBench@AOBench
  11. do ao.Init(256, 256)
  12. do ao.Calc()
  13. while (true)
  14. do Kuin@Act()
  15. do ao.Render()
  16. end while
  17. do Kuin@Stop()
  18. end func
  19.  
  20. class Vector3
  21. var X : float
  22. var Y : float
  23. var Z : float
  24. func Init(x : float, y : float, z : float)
  25. do this.X :: x
  26. do this.Y :: y
  27. do this.Z :: z
  28. end func
  29. func Clone() : AOBench@Vector3
  30. var v : AOBench@Vector3 :: @new AOBench@Vector3
  31. do v.Init(this.X, this.Y, this.Z)
  32. return v
  33. end func
  34. end class
  35. func VecAdd(a : AOBench@Vector3, b : AOBench@Vector3) : AOBench@Vector3
  36. var v : AOBench@Vector3 :: @new AOBench@Vector3
  37. do v.X :: a.X + b.X
  38. do v.Y :: a.Y + b.Y
  39. do v.Z :: a.Z + b.Z
  40. return v
  41. end func
  42. func VecSub(a : AOBench@Vector3, b : AOBench@Vector3) : AOBench@Vector3
  43. var v : AOBench@Vector3 :: @new AOBench@Vector3
  44. do v.X :: a.X - b.X
  45. do v.Y :: a.Y - b.Y
  46. do v.Z :: a.Z - b.Z
  47. return v
  48. end func
  49. func VecCross(a : AOBench@Vector3, b : AOBench@Vector3) : AOBench@Vector3
  50. var v : AOBench@Vector3 :: @new AOBench@Vector3
  51. do v.X :: a.Y * b.Z - a.Z * b.Y
  52. do v.Y :: a.Z * b.X - a.X * b.Z
  53. do v.Z :: a.X * b.Y - a.Y * b.X
  54. return v
  55. end func
  56. func VecDot(a : AOBench@Vector3, b : AOBench@Vector3) : float
  57. return a.X * b.X + a.Y * b.Y + a.Z * b.Z
  58. end func
  59. func VecLength(a : AOBench@Vector3) : float
  60. return Math@Sqrt(a.X * a.X + a.Y * a.Y + a.Z * a.Z)
  61. end func
  62. func VecNormalize(a : AOBench@Vector3) : AOBench@Vector3
  63. var len : float :: AOBench@VecLength(a)
  64. var v : AOBench@Vector3 :: a.Clone()
  65. if (len > 0.00000000000000001)
  66. do v.X :/ len
  67. do v.Y :/ len
  68. do v.Z :/ len
  69. end if
  70. return v
  71. end func
  72.  
  73. class AOBench
  74.  
  75. class Isect
  76. var T : float
  77. var Hit : bool
  78. var Pos : AOBench@Vector3
  79. var Norm : AOBench@Vector3
  80. func Init()
  81. do this.T :: 1000000.0
  82. do this.Hit :: false
  83. do this.Pos :: @new AOBench@Vector3
  84. do this.Pos.Init(0.0, 0.0, 0.0)
  85. do this.Norm :: @new AOBench@Vector3
  86. do this.Norm.Init(0.0, 0.0, 0.0)
  87. end func
  88. end class
  89.  
  90. class Ray
  91. var Org : AOBench@Vector3
  92. var Dir : AOBench@Vector3
  93. func Init(o : AOBench@Vector3, d : AOBench@Vector3)
  94. do this.Org :: o.Clone()
  95. do this.Dir :: d.Clone()
  96. end func
  97. end class
  98.  
  99. class Sphere
  100. var Center : AOBench@Vector3
  101. var Radius : float
  102. func Init(c : AOBench@Vector3, r : float)
  103. do this.Center :: c.Clone()
  104. do this.Radius :: r
  105. end func
  106. func Intersect(ray : Ray, isect : Isect)
  107. var rs : AOBench@Vector3 :: AOBench@VecSub(ray.Org, this.Center)
  108. var B : float :: AOBench@VecDot(rs, ray.Dir)
  109. var C : float :: AOBench@VecDot(rs, rs) - (this.Radius * this.Radius)
  110. var D : float :: B * B - C
  111.  
  112. if (D > 0.0)
  113. var t : float :: -B - Math@Sqrt(D)
  114. if ((t > 0.0) & (t < isect.T))
  115. do isect.T :: t
  116. do isect.Hit :: true
  117. do isect.Pos :: @new AOBench@Vector3
  118. do isect.Pos.X :: ray.Org.X + ray.Dir.X * t
  119. do isect.Pos.Y :: ray.Org.Y + ray.Dir.Y * t
  120. do isect.Pos.Z :: ray.Org.Z + ray.Dir.Z * t
  121. var n : AOBench@Vector3 :: AOBench@VecSub(isect.Pos, this.Center)
  122. do isect.Norm :: AOBench@VecNormalize(n)
  123. end if
  124. end if
  125. end func
  126. end class
  127.  
  128. class Plane
  129. var Pos : AOBench@Vector3
  130. var Norm : AOBench@Vector3
  131. func Init(p : AOBench@Vector3, n : AOBench@Vector3)
  132. do this.Pos :: p.Clone()
  133. do this.Norm :: n.Clone()
  134. end func
  135. func Intersect(ray : Ray, isect : Isect)
  136. var d : float :: - AOBench@VecDot(this.Pos, this.Norm)
  137. var v : float :: AOBench@VecDot(ray.Dir, this.Norm)
  138. if ((-0.00000000000000001 < v) & (v < 0.00000000000000001))
  139. return
  140. end if
  141. var t : float :: - (AOBench@VecDot(ray.Org, this.Norm) + d) / v
  142. if ((t > 0.0) & (t < isect.T))
  143. do isect.Hit :: true
  144. do isect.T :: t
  145. do isect.Norm :: this.Norm.Clone()
  146. do isect.Pos.X :: ray.Org.X + ray.Dir.X * t
  147. do isect.Pos.Y :: ray.Org.Y + ray.Dir.Y * t
  148. do isect.Pos.Z :: ray.Org.Z + ray.Dir.Z * t
  149. end if
  150. end func
  151. end class
  152.  
  153. var Width : int
  154. var Height : int
  155. var SubSamples : int
  156. var AoSamples : int
  157. var Eps : float
  158. var Phi : int
  159. var Theta : int
  160. var AllRay : int
  161.  
  162. var Spheres : []Sphere
  163. var Floor : Plane
  164.  
  165. var Output : [][]float
  166.  
  167. func Init(x : int, y : int)
  168. do this.Width :: x
  169. do this.Height :: y
  170. do this.SubSamples :: 2
  171. do this.AoSamples :: 8
  172. do this.Eps :: 0.0001
  173. do this.Phi :: this.AoSamples
  174. do this.Theta :: this.AoSamples
  175. do this.AllRay :: this.AoSamples * this.AoSamples
  176.  
  177. do this.Spheres :: @new [3]Sphere
  178. for i(0, 2)
  179. do this.Spheres[i] :: @new Sphere
  180. end for
  181. var rad : float :: 0.5
  182. var center : AOBench@Vector3 :: @new AOBench@Vector3
  183. do center.Init(-2.0, 0.0, -3.5)
  184. do this.Spheres[0].Init(center, rad)
  185. do center.Init(-0.5, 0.0, -3.0)
  186. do this.Spheres[1].Init(center, rad)
  187. do center.Init(1.0, 0.0, -2.2)
  188. do this.Spheres[2].Init(center, rad)
  189.  
  190. var pos : AOBench@Vector3 :: @new AOBench@Vector3
  191. do pos.Init(0.0, -0.5, 0.0)
  192. var norm : AOBench@Vector3 :: @new AOBench@Vector3
  193. do norm.Init(0.0, 1.0, 0.0)
  194. do this.Floor :: @new Plane
  195. do this.Floor.Init(pos, norm)
  196.  
  197. do this.Output :: @new [this.Width][]float
  198. for i(0, this.Width - 1)
  199. do this.Output[i] :: @new [this.Height]float
  200. for j(0, this.Height - 1)
  201. do this.Output[i][j] :: 0.0
  202. end for
  203. end for
  204. end func
  205.  
  206. func OrthoBasis(basis : []Vector3, n : AOBench@Vector3)
  207. for i(0, 2)
  208. do basis[i] :: @new AOBench@Vector3
  209. do basis[i].Init(0.0, 0.0, 0.0)
  210. end for
  211. do basis[2] :: n.Clone()
  212. if ((n.X < 0.6) & (n.X > -0.6))
  213. do basis[1].X :: 1.0
  214. elif ((n.Y < 0.6) & (n.Y > -0.6))
  215. do basis[1].Y :: 1.0
  216. elif ((n.Z < 0.6) & (n.Z > -0.6))
  217. do basis[1].Z :: 1.0
  218. else
  219. do basis[1].X :: 1.0
  220. end if
  221. do basis[0] :: AOBench@VecNormalize(AOBench@VecCross(basis[1], basis[2]))
  222. do basis[1] :: AOBench@VecNormalize(AOBench@VecCross(basis[2], basis[0]))
  223. end func
  224.  
  225. func Random() : float
  226. var r : float :: Kuin@Rand(0, 1000)$float
  227. do r :/ 1000.0
  228. return r
  229. end func
  230.  
  231. var OcculusionResult : float
  232.  
  233. func AmbientOcculusion(isect : Isect) : float
  234. var basis : []Vector3 :: @new [3]Vector3
  235. do this.OrthoBasis(basis, isect.Norm)
  236. var p : AOBench@Vector3 :: @new AOBench@Vector3
  237. do p.X :: isect.Pos.X + this.Eps * isect.Norm.X
  238. do p.Y :: isect.Pos.Y + this.Eps * isect.Norm.Y
  239. do p.Z :: isect.Pos.Z + this.Eps * isect.Norm.Z
  240.  
  241. var occlusion : int :: 0
  242.  
  243. for j(0, this.Phi)
  244. for i(0, this.Theta)
  245. var theta : float :: Math@Sqrt(this.Random())
  246. var phi : float :: 2.0 * Math@Pi * this.Random()
  247. var x : float :: Math@Cos(phi) * theta
  248. var y : float :: Math@Sin(phi) * theta
  249. var z : float :: Math@Sqrt(1.0 - theta * theta)
  250.  
  251. { local -> global }
  252. var rx : float :: x * basis[0].X + y * basis[1].X + z * basis[2].X
  253. var ry : float :: x * basis[0].Y + y * basis[1].Y + z * basis[2].Y
  254. var rz : float :: x * basis[0].Z + y * basis[1].Z + z * basis[2].Z
  255.  
  256. var rayDir : AOBench@Vector3 :: @new AOBench@Vector3
  257. do rayDir.Init(rx, ry, rz)
  258. var ray : Ray :: @new Ray
  259. do ray.Init(p, rayDir)
  260.  
  261. var occIsect : Isect :: @new Isect
  262. do occIsect.Init()
  263. for i(0, 2)
  264. do this.Spheres[i].Intersect(ray, occIsect)
  265. end for
  266. do this.Floor.Intersect(ray, occIsect)
  267.  
  268. if (occIsect.Hit)
  269. do occlusion :+ 1
  270. end if
  271. end for
  272. end for
  273.  
  274. var occ : float :: (this.AllRay - occlusion)$float / this.AllRay$float
  275.  
  276. do this.OcculusionResult :: occ
  277. return occ
  278. end func
  279.  
  280. func Calc()
  281. var half_w : float :: this.Width$float * 0.5
  282. var half_h : float :: this.Height$float * 0.5
  283. for y(0, this.Height - 1)
  284. for x(0, this.Width - 1)
  285. var px : float :: (x$float - half_w)/half_w
  286. var py : float :: -(y$float - half_h)/half_h
  287.  
  288. var eye : AOBench@Vector3 :: @new AOBench@Vector3
  289. do eye.Init(px, py, -1.0)
  290. do eye :: AOBench@VecNormalize(eye)
  291. var zero : AOBench@Vector3 :: @new AOBench@Vector3
  292. do zero.Init(0.0, 0.0, 0.0)
  293. var ray : Ray :: @new Ray
  294. do ray.Init(zero, eye)
  295.  
  296. var isect : Isect :: @new Isect
  297. do isect.Init()
  298. for i(0, 2)
  299. do this.Spheres[i].Intersect(ray, isect)
  300. end for
  301. do this.Floor.Intersect(ray, isect)
  302.  
  303. var col : float :: 0.0
  304. if (isect.Hit)
  305. do this.AmbientOcculusion(isect)
  306. {
  307. AmbientOcclusion() 関数の返り値が返ってこない。
  308. }
  309. do col :: this.OcculusionResult
  310. end if
  311. do this.Output[x][y] :: col
  312. end for
  313. do Kuin@Dbg(y.ToStr() ~ "/" ~ (this.Height - 1).ToStr())
  314. end for
  315. end func
  316.  
  317. func Render()
  318. var half_w : float :: this.Width$float * 0.5
  319. var half_h : float :: this.Height$float * 0.5
  320. for y(0, this.Height - 1)
  321. for x(0, this.Width - 1)
  322. var x0 : float :: x$float
  323. var y0 : float :: y$float
  324. var x1 : float :: x$float + 1.0
  325. var y1 : float :: y$float + 1.0
  326. var col : float :: this.Output[x][y]
  327. do D3D@DrawRect(x0, y0, x1, y1, col, col, col, 1.0)
  328. end for
  329. end for
  330. end func
  331.  
  332. end class
Add Comment
Please, Sign In to add comment