Skip to content

Commit 024e59f

Browse files
committed
🚧 Modify glm::refract according to GLSL man page: return vector zero when full reflection happens #806
1 parent 082dbcc commit 024e59f

File tree

1 file changed

+80
-27
lines changed

1 file changed

+80
-27
lines changed

glm/src/main/kotlin/glm_/func/func_geometric.kt

Lines changed: 80 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -263,76 +263,129 @@ interface func_geometric {
263263

264264

265265
fun refract(i: Float, n: Float, eta: Float): Float {
266-
assert(eta >= -1f && eta <= 1f)
267266
val dot = dot(n, i)
268267
val k = 1f - eta * eta * (1f - dot * dot)
269-
return (eta * i - (eta * dot + sqrt(k)) * n) * if (k >= 0f) 1f else 0f
268+
return when {
269+
k >= 0 -> eta * i - (eta * dot + sqrt(k)) * n
270+
else -> 0f
271+
}
270272
}
271273

272274
fun refract(i: Double, n: Double, eta: Double): Double {
273-
assert(eta >= -1.0 && eta <= 1.0)
274275
val dot = dot(n, i)
275276
val k = 1.0 - eta * eta * (1.0 - dot * dot)
276-
return (eta * i - (eta * dot + sqrt(k)) * n) * if (k >= 0.0) 1.0 else 0.0
277+
return when {
278+
k >= 0 -> eta * i - (eta * dot + sqrt(k)) * n
279+
else -> 0.0
280+
}
277281
}
278282

279283
fun refract(i: Vec2, n: Vec2, eta: Float, res: Vec2 = Vec2()): Vec2 {
280-
assert(eta >= -1f && eta <= 1f)
281284
val dot = dot(n, i)
282285
val k = 1f - eta * eta * (1f - dot * dot)
283-
res.x = eta * i.x - (eta * dot + sqrt(k)) * n.x * if (k >= 0f) 1f else 0f
284-
res.y = eta * i.y - (eta * dot + sqrt(k)) * n.y * if (k >= 0f) 1f else 0f
286+
when {
287+
k >= 0 -> {
288+
res.x = eta * i.x - (eta * dot + sqrt(k)) * n.x
289+
res.y = eta * i.y - (eta * dot + sqrt(k)) * n.y
290+
}
291+
else -> {
292+
res.x = 0f
293+
res.y = 0f
294+
}
295+
}
285296
return res
286297
}
287298

288299
fun refract(i: Vec2d, n: Vec2d, eta: Double, res: Vec2d = Vec2d()): Vec2d {
289-
assert(eta >= -1.0 && eta <= 1.0)
290300
val dot = dot(n, i)
291301
val k = 1.0 - eta * eta * (1.0 - dot * dot)
292-
res.x = eta * i.x - (eta * dot + sqrt(k)) * n.x * if (k >= 0.0) 1.0 else 0.0
293-
res.y = eta * i.y - (eta * dot + sqrt(k)) * n.y * if (k >= 0.0) 1.0 else 0.0
302+
when {
303+
k >= 0 -> {
304+
res.x = eta * i.x - (eta * dot + sqrt(k)) * n.x
305+
res.y = eta * i.y - (eta * dot + sqrt(k)) * n.y
306+
}
307+
else -> {
308+
res.x = 0.0
309+
res.y = 0.0
310+
}
311+
}
294312
return res
295313
}
296314

297315
fun refract(i: Vec3, n: Vec3, eta: Float, res: Vec3 = Vec3()): Vec3 {
298-
assert(eta >= -1f && eta <= 1f)
299316
val dot = dot(n, i)
300317
val k = 1f - eta * eta * (1f - dot * dot)
301-
res.x = eta * i.x - (eta * dot + sqrt(k)) * n.x * if (k >= 0f) 1f else 0f
302-
res.y = eta * i.y - (eta * dot + sqrt(k)) * n.y * if (k >= 0f) 1f else 0f
303-
res.z = eta * i.z - (eta * dot + sqrt(k)) * n.z * if (k >= 0f) 1f else 0f
318+
when {
319+
k >= 0 -> {
320+
res.x = eta * i.x - (eta * dot + sqrt(k)) * n.x
321+
res.y = eta * i.y - (eta * dot + sqrt(k)) * n.y
322+
res.z = eta * i.z - (eta * dot + sqrt(k)) * n.z
323+
}
324+
else -> {
325+
res.x = 0f
326+
res.y = 0f
327+
res.z = 0f
328+
}
329+
}
304330
return res
305331
}
306332

307333
fun refract(i: Vec3d, n: Vec3d, eta: Double, res: Vec3d = Vec3d()): Vec3d {
308-
assert(eta >= -1.0 && eta <= 1.0)
309334
val dot = dot(n, i)
310335
val k = 1.0 - eta * eta * (1.0 - dot * dot)
311-
res.x = eta * i.x - (eta * dot + sqrt(k)) * n.x * if (k >= 0.0) 1.0 else 0.0
312-
res.y = eta * i.y - (eta * dot + sqrt(k)) * n.y * if (k >= 0.0) 1.0 else 0.0
313-
res.z = eta * i.z - (eta * dot + sqrt(k)) * n.z * if (k >= 0.0) 1.0 else 0.0
336+
when {
337+
k >= 0 -> {
338+
res.x = eta * i.x - (eta * dot + sqrt(k)) * n.x
339+
res.y = eta * i.y - (eta * dot + sqrt(k)) * n.y
340+
res.z = eta * i.z - (eta * dot + sqrt(k)) * n.z
341+
}
342+
else -> {
343+
res.x = 0.0
344+
res.y = 0.0
345+
res.z = 0.0
346+
}
347+
}
314348
return res
315349
}
316350

317351
fun refract(i: Vec4, n: Vec4, eta: Float, res: Vec4 = Vec4()): Vec4 {
318-
assert(eta >= -1f && eta <= 1f)
319352
val dot = dot(n, i)
320353
val k = 1f - eta * eta * (1f - dot * dot)
321-
res.x = eta * i.x - (eta * dot + sqrt(k)) * n.x * if (k >= 0f) 1f else 0f
322-
res.y = eta * i.y - (eta * dot + sqrt(k)) * n.y * if (k >= 0f) 1f else 0f
323-
res.z = eta * i.z - (eta * dot + sqrt(k)) * n.z * if (k >= 0f) 1f else 0f
324-
res.w = eta * i.w - (eta * dot + sqrt(k)) * n.w * if (k >= 0f) 1f else 0f
354+
when {
355+
k >= 0 -> {
356+
res.x = eta * i.x - (eta * dot + sqrt(k)) * n.x
357+
res.y = eta * i.y - (eta * dot + sqrt(k)) * n.y
358+
res.z = eta * i.z - (eta * dot + sqrt(k)) * n.z
359+
res.w = eta * i.w - (eta * dot + sqrt(k)) * n.w
360+
}
361+
else -> {
362+
res.x = 0f
363+
res.y = 0f
364+
res.z = 0f
365+
res.w = 0f
366+
}
367+
}
325368
return res
326369
}
327370

328371
fun refract(i: Vec4d, n: Vec4d, eta: Double, res: Vec4d = Vec4d()): Vec4d {
329372
assert(eta >= -1.0 && eta <= 1.0)
330373
val dot = dot(n, i)
331374
val k = 1.0 - eta * eta * (1.0 - dot * dot)
332-
res.x = eta * i.x - (eta * dot + sqrt(k)) * n.x * if (k >= 0.0) 1.0 else 0.0
333-
res.y = eta * i.y - (eta * dot + sqrt(k)) * n.y * if (k >= 0.0) 1.0 else 0.0
334-
res.z = eta * i.z - (eta * dot + sqrt(k)) * n.z * if (k >= 0.0) 1.0 else 0.0
335-
res.w = eta * i.w - (eta * dot + sqrt(k)) * n.w * if (k >= 0.0) 1.0 else 0.0
375+
when {
376+
k >= 0 -> {
377+
res.x = eta * i.x - (eta * dot + sqrt(k)) * n.x
378+
res.y = eta * i.y - (eta * dot + sqrt(k)) * n.y
379+
res.z = eta * i.z - (eta * dot + sqrt(k)) * n.z
380+
res.w = eta * i.w - (eta * dot + sqrt(k)) * n.w
381+
}
382+
else -> {
383+
res.x = 0.0
384+
res.y = 0.0
385+
res.z = 0.0
386+
res.w = 0.0
387+
}
388+
}
336389
return res
337390
}
338391
}

0 commit comments

Comments
 (0)