Skip to content

Commit 082dbcc

Browse files
committed
🚧 Clarified refract valid range of the indices of refraction, between -1 and 1 inclusively #806
1 parent 6440704 commit 082dbcc

File tree

1 file changed

+38
-30
lines changed

1 file changed

+38
-30
lines changed

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

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -263,68 +263,76 @@ interface func_geometric {
263263

264264

265265
fun refract(i: Float, n: Float, eta: Float): Float {
266+
assert(eta >= -1f && eta <= 1f)
266267
val dot = dot(n, i)
267268
val k = 1f - eta * eta * (1f - dot * dot)
268269
return (eta * i - (eta * dot + sqrt(k)) * n) * if (k >= 0f) 1f else 0f
269270
}
270271

271272
fun refract(i: Double, n: Double, eta: Double): Double {
273+
assert(eta >= -1.0 && eta <= 1.0)
272274
val dot = dot(n, i)
273275
val k = 1.0 - eta * eta * (1.0 - dot * dot)
274276
return (eta * i - (eta * dot + sqrt(k)) * n) * if (k >= 0.0) 1.0 else 0.0
275277
}
276278

277-
fun refract(i: Vec2, n: Vec2, eta: Number, res: Vec2 = Vec2()): Vec2 {
279+
fun refract(i: Vec2, n: Vec2, eta: Float, res: Vec2 = Vec2()): Vec2 {
280+
assert(eta >= -1f && eta <= 1f)
278281
val dot = dot(n, i)
279-
val k = 1f - eta.f * eta.f * (1f - dot * dot)
280-
res.x = eta.f * i.x - (eta.f * dot + sqrt(k)) * n.x * if (k >= 0f) 1f else 0f
281-
res.y = eta.f * i.y - (eta.f * dot + sqrt(k)) * n.y * if (k >= 0f) 1f else 0f
282+
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
282285
return res
283286
}
284287

285-
fun refract(i: Vec2d, n: Vec2d, eta: Number, res: Vec2d = Vec2d()): Vec2d {
288+
fun refract(i: Vec2d, n: Vec2d, eta: Double, res: Vec2d = Vec2d()): Vec2d {
289+
assert(eta >= -1.0 && eta <= 1.0)
286290
val dot = dot(n, i)
287-
val k = 1.0 - eta.d * eta.d * (1.0 - dot * dot)
288-
res.x = eta.d * i.x - (eta.d * dot + sqrt(k)) * n.x * if (k >= 0.0) 1.0 else 0.0
289-
res.y = eta.d * i.y - (eta.d * dot + sqrt(k)) * n.y * if (k >= 0.0) 1.0 else 0.0
291+
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
290294
return res
291295
}
292296

293-
fun refract(i: Vec3, n: Vec3, eta: Number, res: Vec3 = Vec3()): Vec3 {
297+
fun refract(i: Vec3, n: Vec3, eta: Float, res: Vec3 = Vec3()): Vec3 {
298+
assert(eta >= -1f && eta <= 1f)
294299
val dot = dot(n, i)
295-
val k = 1f - eta.f * eta.f * (1f - dot * dot)
296-
res.x = eta.f * i.x - (eta.f * dot + sqrt(k)) * n.x * if (k >= 0f) 1f else 0f
297-
res.y = eta.f * i.y - (eta.f * dot + sqrt(k)) * n.y * if (k >= 0f) 1f else 0f
298-
res.z = eta.f * i.z - (eta.f * dot + sqrt(k)) * n.z * if (k >= 0f) 1f else 0f
300+
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
299304
return res
300305
}
301306

302-
fun refract(i: Vec3d, n: Vec3d, eta: Number, res: Vec3d = Vec3d()): Vec3d {
307+
fun refract(i: Vec3d, n: Vec3d, eta: Double, res: Vec3d = Vec3d()): Vec3d {
308+
assert(eta >= -1.0 && eta <= 1.0)
303309
val dot = dot(n, i)
304-
val k = 1.0 - eta.d * eta.d * (1.0 - dot * dot)
305-
res.x = eta.d * i.x - (eta.d * dot + sqrt(k)) * n.x * if (k >= 0.0) 1.0 else 0.0
306-
res.y = eta.d * i.y - (eta.d * dot + sqrt(k)) * n.y * if (k >= 0.0) 1.0 else 0.0
307-
res.z = eta.d * i.z - (eta.d * dot + sqrt(k)) * n.z * if (k >= 0.0) 1.0 else 0.0
310+
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
308314
return res
309315
}
310316

311-
fun refract(i: Vec4, n: Vec4, eta: Number, res: Vec4 = Vec4()): Vec4 {
317+
fun refract(i: Vec4, n: Vec4, eta: Float, res: Vec4 = Vec4()): Vec4 {
318+
assert(eta >= -1f && eta <= 1f)
312319
val dot = dot(n, i)
313-
val k = 1f - eta.f * eta.f * (1f - dot * dot)
314-
res.x = eta.f * i.x - (eta.f * dot + sqrt(k)) * n.x * if (k >= 0f) 1f else 0f
315-
res.y = eta.f * i.y - (eta.f * dot + sqrt(k)) * n.y * if (k >= 0f) 1f else 0f
316-
res.z = eta.f * i.z - (eta.f * dot + sqrt(k)) * n.z * if (k >= 0f) 1f else 0f
317-
res.w = eta.f * i.w - (eta.f * dot + sqrt(k)) * n.w * if (k >= 0f) 1f else 0f
320+
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
318325
return res
319326
}
320327

321-
fun refract(i: Vec4d, n: Vec4d, eta: Number, res: Vec4d = Vec4d()): Vec4d {
328+
fun refract(i: Vec4d, n: Vec4d, eta: Double, res: Vec4d = Vec4d()): Vec4d {
329+
assert(eta >= -1.0 && eta <= 1.0)
322330
val dot = dot(n, i)
323-
val k = 1.0 - eta.d * eta.d * (1.0 - dot * dot)
324-
res.x = eta.d * i.x - (eta.d * dot + sqrt(k)) * n.x * if (k >= 0.0) 1.0 else 0.0
325-
res.y = eta.d * i.y - (eta.d * dot + sqrt(k)) * n.y * if (k >= 0.0) 1.0 else 0.0
326-
res.z = eta.d * i.z - (eta.d * dot + sqrt(k)) * n.z * if (k >= 0.0) 1.0 else 0.0
327-
res.w = eta.d * i.w - (eta.d * dot + sqrt(k)) * n.w * if (k >= 0.0) 1.0 else 0.0
331+
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
328336
return res
329337
}
330338
}

0 commit comments

Comments
 (0)