Skip to content

Commit 3c06705

Browse files
Remove unnecessary instantiations (#52)
* Add Vector and Matrix compare, equal and equals with epsilon parameter * Add Quaternion compare, equal and equals with epsilon parameter * Use normalized Quaternion when comparing them * Cleanup + Change to compareTo + Remove normalizing + Fixes * Remove unnecessary instantiations * Fix merging duplicate
1 parent 36e907c commit 3c06705

File tree

2 files changed

+165
-51
lines changed

2 files changed

+165
-51
lines changed

src/commonMain/kotlin/dev/romainguy/kotlin/math/Quaternion.kt

Lines changed: 128 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -263,21 +263,44 @@ data class Quaternion(
263263
inline operator fun minus(v: Float) = Quaternion(x - v, y - v, z - v, w - v)
264264
inline operator fun times(v: Float) = Quaternion(x * v, y * v, z * v, w * v)
265265
inline operator fun div(v: Float) = Quaternion(x / v, y / v, z / v, w / v)
266-
inline fun compareTo(v: Float, delta: Float = 0.0f) = xyzw.compareTo(v, delta)
267-
inline fun equals(v: Float, delta: Float = 0.0f) = xyzw.equals(v, delta)
266+
inline fun compareTo(v: Float, delta: Float = 0.0f) = Float4(
267+
x.compareTo(v, delta),
268+
y.compareTo(v, delta),
269+
z.compareTo(v, delta),
270+
w.compareTo(v, delta)
271+
)
272+
273+
inline fun equals(v: Float, delta: Float = 0.0f) = Bool4(
274+
x.equals(v, delta),
275+
y.equals(v, delta),
276+
z.equals(v, delta),
277+
w.equals(v, delta)
278+
)
268279

269280
inline operator fun times(v: Float3) = (this * Quaternion(v, 0.0f) * inverse(this)).xyz
270281

271282
inline operator fun plus(q: Quaternion) = Quaternion(x + q.x, y + q.y, z + q.z, w + q.w)
272283
inline operator fun minus(q: Quaternion) = Quaternion(x - q.x, y - q.y, z - q.z, w - q.w)
273284
inline operator fun times(q: Quaternion) = Quaternion(
274-
w * q.x + x * q.w + y * q.z - z * q.y,
275-
w * q.y - x * q.z + y * q.w + z * q.x,
276-
w * q.z + x * q.y - y * q.x + z * q.w,
277-
w * q.w - x * q.x - y * q.y - z * q.z)
278-
279-
inline fun compareTo(v: Float4, delta: Float = 0.0f) = xyzw.compareTo(v.xyzw, delta)
280-
inline fun equals(v: Float4, delta: Float = 0.0f) = xyzw.equals(v.xyzw, delta)
285+
w * q.x + x * q.w + y * q.z - z * q.y,
286+
w * q.y - x * q.z + y * q.w + z * q.x,
287+
w * q.z + x * q.y - y * q.x + z * q.w,
288+
w * q.w - x * q.x - y * q.y - z * q.z
289+
)
290+
291+
inline fun compareTo(v: Float4, delta: Float = 0.0f) = Float4(
292+
x.compareTo(v.x, delta),
293+
y.compareTo(v.y, delta),
294+
z.compareTo(v.z, delta),
295+
w.compareTo(v.w, delta)
296+
)
297+
298+
inline fun equals(v: Float4, delta: Float = 0.0f) = Bool4(
299+
x.equals(v.x, delta),
300+
y.equals(v.y, delta),
301+
z.equals(v.z, delta),
302+
w.equals(v.w, delta)
303+
)
281304

282305
inline fun transform(block: (Float) -> Float): Quaternion {
283306
x = block(x)
@@ -299,31 +322,102 @@ inline operator fun Float.minus(q: Quaternion) = Quaternion(this - q.x, this - q
299322
inline operator fun Float.times(q: Quaternion) = Quaternion(this * q.x, this * q.y, this * q.z, this * q.w)
300323
inline operator fun Float.div(q: Quaternion) = Quaternion(this / q.x, this / q.y, this / q.z, this / q.w)
301324

302-
inline fun lessThan(a: Quaternion, b: Float) = lessThan(a.xyzw, b)
303-
inline fun lessThan(a: Quaternion, b: Quaternion) = lessThan(a.xyzw, b.xyzw)
304-
inline fun lessThanEqual(a: Quaternion, b: Float) = lessThanEqual(a.xyzw, b)
305-
inline fun lessThanEqual(a: Quaternion, b: Quaternion) = lessThanEqual(a.xyzw, b.xyzw)
306-
inline fun greaterThan(a: Quaternion, b: Float) = greaterThan(a.xyzw, b)
307-
inline fun greaterThan(a: Quaternion, b: Quaternion) = greaterThan(a.xyzw, b.xyzw)
308-
inline fun greaterThanEqual(a: Quaternion, b: Float) = greaterThanEqual(a.xyzw, b)
309-
inline fun greaterThanEqual(a: Quaternion, b: Quaternion) = greaterThanEqual(a.xyzw, b.xyzw)
310-
inline fun equal(a: Quaternion, b: Float) = equal(a.xyzw, b)
311-
inline fun equal(a: Quaternion, b: Quaternion) = equal(a.xyzw, b.xyzw)
312-
inline fun notEqual(a: Quaternion, b: Float) = notEqual(a.xyzw, b)
313-
inline fun notEqual(a: Quaternion, b: Quaternion) = notEqual(a.xyzw, b.xyzw)
314-
315-
inline infix fun Quaternion.lt(b: Float) = xyzw.lt(b)
316-
inline infix fun Quaternion.lt(b: Float4) = xyzw.lt(b.xyzw)
317-
inline infix fun Quaternion.lte(b: Float) = xyzw.lte(b)
318-
inline infix fun Quaternion.lte(b: Float4) = xyzw.lte(b.xyzw)
319-
inline infix fun Quaternion.gt(b: Float) = xyzw.gt(b)
320-
inline infix fun Quaternion.gt(b: Float4) = xyzw.gt(b.xyzw)
321-
inline infix fun Quaternion.gte(b: Float) = xyzw.gte(b)
322-
inline infix fun Quaternion.gte(b: Float4) = xyzw.gte(b.xyzw)
323-
inline infix fun Quaternion.eq(b: Float) = xyzw.eq(b)
324-
inline infix fun Quaternion.eq(b: Float4) = xyzw.eq(b.xyzw)
325-
inline infix fun Quaternion.neq(b: Float) = xyzw.neq(b)
326-
inline infix fun Quaternion.neq(b: Float4) = xyzw.neq(b.xyzw)
325+
inline fun lessThan(a: Quaternion, b: Float) = Bool4(
326+
a.x < b,
327+
a.y < b,
328+
a.z < b,
329+
a.w < b
330+
)
331+
332+
inline fun lessThan(a: Quaternion, b: Quaternion) = Bool4(
333+
a.x < b.x,
334+
a.y < b.y,
335+
a.z < b.z,
336+
a.w < b.w
337+
)
338+
339+
inline fun lessThanEqual(a: Quaternion, b: Float) = Bool4(
340+
a.x <= b,
341+
a.y <= b,
342+
a.z <= b,
343+
a.w <= b
344+
)
345+
346+
inline fun lessThanEqual(a: Quaternion, b: Quaternion) = Bool4(
347+
a.x <= b.x,
348+
a.y <= b.y,
349+
a.z <= b.z,
350+
a.w <= b.w
351+
)
352+
353+
inline fun greaterThan(a: Quaternion, b: Float) = Bool4(
354+
a.x > b,
355+
a.y > b,
356+
a.z > b,
357+
a.w > b
358+
)
359+
360+
inline fun greaterThan(a: Quaternion, b: Quaternion) = Bool4(
361+
a.x > b.y,
362+
a.y > b.y,
363+
a.z > b.z,
364+
a.w > b.w
365+
)
366+
367+
inline fun greaterThanEqual(a: Quaternion, b: Float) = Bool4(
368+
a.x >= b,
369+
a.y >= b,
370+
a.z >= b,
371+
a.w >= b
372+
)
373+
374+
inline fun greaterThanEqual(a: Quaternion, b: Quaternion) = Bool4(
375+
a.x >= b.x,
376+
a.y >= b.y,
377+
a.z >= b.z,
378+
a.w >= b.w
379+
)
380+
381+
inline fun equal(a: Quaternion, b: Float, delta: Float = 0.0f) = Bool4(
382+
a.x.equals(b, delta),
383+
a.y.equals(b, delta),
384+
a.z.equals(b, delta),
385+
a.w.equals(b, delta)
386+
)
387+
388+
inline fun equal(a: Quaternion, b: Quaternion, delta: Float = 0.0f) = Bool4(
389+
a.x.equals(b.x, delta),
390+
a.y.equals(b.y, delta),
391+
a.z.equals(b.z, delta),
392+
a.w.equals(b.w, delta)
393+
)
394+
395+
inline fun notEqual(a: Quaternion, b: Float, delta: Float = 0.0f) = Bool4(
396+
!a.x.equals(b, delta),
397+
!a.y.equals(b, delta),
398+
!a.z.equals(b, delta),
399+
!a.w.equals(b, delta)
400+
)
401+
402+
inline fun notEqual(a: Quaternion, b: Quaternion, delta: Float = 0.0f) = Bool4(
403+
!a.x.equals(b.x, delta),
404+
!a.y.equals(b.y, delta),
405+
!a.z.equals(b.z, delta),
406+
!a.w.equals(b.w, delta)
407+
)
408+
409+
inline infix fun Quaternion.lt(b: Float) = Bool4(x < b, y < b, z < b, w < b)
410+
inline infix fun Quaternion.lt(b: Float4) = Bool4(x < b.x, y < b.y, z < b.z, w < b.w)
411+
inline infix fun Quaternion.lte(b: Float) = Bool4(x <= b, y <= b, z <= b, w <= b)
412+
inline infix fun Quaternion.lte(b: Float4) = Bool4(x <= b.x, y <= b.y, z <= b.z, w <= b.w)
413+
inline infix fun Quaternion.gt(b: Float) = Bool4(x > b, y > b, z > b, w > b)
414+
inline infix fun Quaternion.gt(b: Float4) = Bool4(x > b.x, y > b.y, z > b.z, w > b.w)
415+
inline infix fun Quaternion.gte(b: Float) = Bool4(x >= b, y >= b, z >= b, w >= b)
416+
inline infix fun Quaternion.gte(b: Float4) = Bool4(x >= b.x, y >= b.y, z >= b.z, w >= b.w)
417+
inline infix fun Quaternion.eq(b: Float) = Bool4(x == b, y == b, z == b, w == b)
418+
inline infix fun Quaternion.eq(b: Float4) = Bool4(x == b.x, y == b.y, z == b.z, w == b.w)
419+
inline infix fun Quaternion.neq(b: Float) = Bool4(x != b, y != b, z != b, w != b)
420+
inline infix fun Quaternion.neq(b: Float4) = Bool4(x != b.x, y != b.y, z != b.z, w != b.w)
327421

328422
inline fun abs(q: Quaternion) = Quaternion(abs(q.x), abs(q.y), abs(q.z), abs(q.w))
329423
inline fun length(q: Quaternion) = sqrt(q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w)

src/commonMain/kotlin/dev/romainguy/kotlin/math/Vector.kt

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -306,11 +306,13 @@ data class Float3(var x: Float = 0.0f, var y: Float = 0.0f, var z: Float = 0.0f)
306306
inline operator fun times(v: Float) = Float3(x * v, y * v, z * v)
307307
inline operator fun div(v: Float) = Float3(x / v, y / v, z / v)
308308
inline fun compareTo(v: Float, delta: Float = 0.0f) = Float3(
309-
xy.compareTo(v, delta),
309+
x.compareTo(v, delta),
310+
y.compareTo(v, delta),
310311
z.compareTo(v, delta)
311312
)
312313

313-
inline fun equals(v: Float, delta: Float = 0.0f) = xy.equals(v, delta) && z.equals(v, delta)
314+
inline fun equals(v: Float, delta: Float = 0.0f) =
315+
x.equals(v, delta) && y.equals(v, delta) && z.equals(v, delta)
314316

315317
inline operator fun plus(v: Float2) = Float3(x + v.x, y + v.y, z)
316318
inline operator fun minus(v: Float2) = Float3(x - v.x, y - v.y, z)
@@ -322,12 +324,13 @@ data class Float3(var x: Float = 0.0f, var y: Float = 0.0f, var z: Float = 0.0f)
322324
inline operator fun times(v: Float3) = Float3(x * v.x, y * v.y, z * v.z)
323325
inline operator fun div(v: Float3) = Float3(x / v.x, y / v.y, z / v.z)
324326
inline fun compareTo(v: Float3, delta: Float = 0.0f) = Float3(
325-
xy.compareTo(v.xy, delta),
327+
x.compareTo(v.x, delta),
328+
y.compareTo(v.y, delta),
326329
z.compareTo(v.z, delta)
327330
)
328331

329332
inline fun equals(v: Float3, delta: Float = 0.0f) =
330-
xy.equals(v.xy, delta) && z.equals(v.z, delta)
333+
x.equals(v.x, delta) && y.equals(v.y, delta) && z.equals(v.z, delta)
331334

332335
inline fun transform(block: (Float) -> Float): Float3 {
333336
x = block(x)
@@ -562,11 +565,14 @@ data class Float4(
562565
inline operator fun times(v: Float) = Float4(x * v, y * v, z * v, w * v)
563566
inline operator fun div(v: Float) = Float4(x / v, y / v, z / v, w / v)
564567
inline fun compareTo(v: Float, delta: Float = 0.0f) = Float4(
565-
xyz.compareTo(v, delta),
568+
x.compareTo(v, delta),
569+
y.compareTo(v, delta),
570+
z.compareTo(v, delta),
566571
w.compareTo(v, delta)
567572
)
568573

569-
inline fun equals(v: Float, delta: Float = 0.0f) = xyz.equals(v, delta) && w.equals(v, delta)
574+
inline fun equals(v: Float, delta: Float = 0.0f) =
575+
x.equals(v, delta) && y.equals(v, delta) && z.equals(v, delta) && w.equals(v, delta)
570576

571577
inline operator fun plus(v: Float2) = Float4(x + v.x, y + v.y, z, w)
572578
inline operator fun minus(v: Float2) = Float4(x - v.x, y - v.y, z, w)
@@ -583,12 +589,14 @@ data class Float4(
583589
inline operator fun times(v: Float4) = Float4(x * v.x, y * v.y, z * v.z, w * v.w)
584590
inline operator fun div(v: Float4) = Float4(x / v.x, y / v.y, z / v.z, w / v.w)
585591
inline fun compareTo(v: Float4, delta: Float = 0.0f) = Float4(
586-
xyz.compareTo(v.xyz, delta),
592+
x.compareTo(v.x, delta),
593+
y.compareTo(v.y, delta),
594+
z.compareTo(v.z, delta),
587595
w.compareTo(v.w, delta)
588596
)
589597

590598
inline fun equals(v: Float4, delta: Float = 0.0f) =
591-
xyz.equals(v.xyz, delta) && w.equals(v.w, delta)
599+
x.equals(v.x, delta) && y.equals(v.y, delta) && z.equals(v.z, delta) && w.equals(v.w, delta)
592600

593601
inline fun transform(block: (Float) -> Float): Float4 {
594602
x = block(x)
@@ -794,22 +802,26 @@ inline fun greaterThan(a: Float3, b: Float3) = Bool3(a.x > b.y, a.y > b.y, a.z >
794802
inline fun greaterThanEqual(a: Float3, b: Float) = Bool3(a.x >= b, a.y >= b, a.z >= b)
795803
inline fun greaterThanEqual(a: Float3, b: Float3) = Bool3(a.x >= b.x, a.y >= b.y, a.z >= b.z)
796804
inline fun equal(a: Float3, b: Float, delta: Float = 0.0f) = Bool3(
797-
equal(a.xy, b, delta),
805+
a.x.equals(b, delta),
806+
a.y.equals(b, delta),
798807
a.z.equals(b, delta)
799808
)
800809

801810
inline fun equal(a: Float3, b: Float3, delta: Float = 0.0f) = Bool3(
802-
equal(a.xy, b.xy, delta),
811+
a.x.equals(b.x, delta),
812+
a.y.equals(b.y, delta),
803813
a.z.equals(b.z, delta)
804814
)
805815

806816
inline fun notEqual(a: Float3, b: Float, delta: Float = 0.0f) = Bool3(
807-
notEqual(a.xy, b, delta),
817+
!a.x.equals(b, delta),
818+
!a.y.equals(b, delta),
808819
!a.z.equals(b, delta)
809820
)
810821

811822
inline fun notEqual(a: Float3, b: Float3, delta: Float = 0.0f) = Bool3(
812-
notEqual(a.xy, b.xy, delta),
823+
!a.x.equals(b.x, delta),
824+
!a.y.equals(b.y, delta),
813825
!a.z.equals(b.z, delta)
814826
)
815827

@@ -903,26 +915,34 @@ inline fun greaterThanEqual(a: Float4, b: Float4) =
903915
Bool4(a.x >= b.x, a.y >= b.y, a.z >= b.z, a.w >= b.w)
904916

905917
inline fun equal(a: Float4, b: Float, delta: Float = 0.0f) = Bool4(
906-
equal(a.xyz, b, delta),
918+
a.x.equals(b, delta),
919+
a.y.equals(b, delta),
920+
a.z.equals(b, delta),
907921
a.w.equals(b, delta)
908922
)
909923

910924
inline fun equal(a: Float4, b: Float4, delta: Float = 0.0f) = Bool4(
911-
equal(a.xyz, b.xyz, delta),
925+
a.x.equals(b.x, delta),
926+
a.y.equals(b.y, delta),
927+
a.z.equals(b.z, delta),
912928
a.w.equals(b.w, delta)
913929
)
914930

915931
inline fun notEqual(a: Float4, b: Float, delta: Float = 0.0f) = Bool4(
916-
notEqual(a.xyz, b, delta),
932+
!a.x.equals(b, delta),
933+
!a.y.equals(b, delta),
934+
!a.z.equals(b, delta),
917935
!a.w.equals(b, delta)
918936
)
919937

920938
inline fun notEqual(a: Float4, b: Float4, delta: Float = 0.0f) = Bool4(
921-
notEqual(a.xyz, b.xyz, delta),
939+
!a.x.equals(b.x, delta),
940+
!a.y.equals(b.y, delta),
941+
!a.z.equals(b.z, delta),
922942
!a.w.equals(b.w, delta)
923943
)
924944

925-
inline infix fun Float4.lt(b: Float) = Bool4(x < b, y < b, z < b, a < b)
945+
inline infix fun Float4.lt(b: Float) = Bool4(x < b, y < b, z < b, w < b)
926946
inline infix fun Float4.lt(b: Float4) = Bool4(x < b.x, y < b.y, z < b.z, w < b.w)
927947
inline infix fun Float4.lte(b: Float) = Bool4(x <= b, y <= b, z <= b, w <= b)
928948
inline infix fun Float4.lte(b: Float4) = Bool4(x <= b.x, y <= b.y, z <= b.z, w <= b.w)

0 commit comments

Comments
 (0)