MathUtils.smali

.class public Lorg/jbox2d/common/MathUtils;
.super Lorg/jbox2d/common/PlatformMathUtils;
.source "MathUtils.java"


# static fields
.field public static final DEG2RAD:F = 0.017453292f

.field public static final HALF_PI:F = 1.5707964f

.field public static final INV_PI:F = 0.31830987f

.field public static final PI:F = 3.1415927f

.field public static final QUARTER_PI:F = 0.7853982f

.field public static final RAD2DEG:F = 57.295776f

.field public static final THREE_HALVES_PI:F = 4.712389f

.field public static final TWOPI:F = 6.2831855f

.field public static final sinLUT:[F


# direct methods
.method static constructor <clinit>()V
    .registers 4

    .prologue
    .line 72
    sget v0, Lorg/jbox2d/common/Settings;->SINCOS_LUT_LENGTH:I

    new-array v0, v0, [F

    sput-object v0, Lorg/jbox2d/common/MathUtils;->sinLUT:[F

    .line 75
    const/4 v0, 0x0

    :goto_7
    sget v1, Lorg/jbox2d/common/Settings;->SINCOS_LUT_LENGTH:I

    if-ge v0, v1, :cond_1d

    .line 76
    sget-object v1, Lorg/jbox2d/common/MathUtils;->sinLUT:[F

    int-to-float v2, v0

    const v3, 0x38e6afcd    # 1.1E-4f

    mul-float/2addr v2, v3

    float-to-double v2, v2

    invoke-static {v2, v3}, Ljava/lang/Math;->sin(D)D

    move-result-wide v2

    double-to-float v2, v2

    aput v2, v1, v0

    .line 75
    add-int/lit8 v0, v0, 0x1

    goto :goto_7

    .line 78
    :cond_1d
    return-void
.end method

.method public constructor <init>()V
    .registers 1

    .prologue
    .line 54
    invoke-direct {p0}, Lorg/jbox2d/common/PlatformMathUtils;-><init>()V

    return-void
.end method

.method public static final abs(F)F
    .registers 2

    .prologue
    .line 126
    sget-boolean v0, Lorg/jbox2d/common/Settings;->FAST_ABS:Z

    if-eqz v0, :cond_c

    .line 127
    const/4 v0, 0x0

    cmpl-float v0, p0, v0

    if-lez v0, :cond_a

    .line 129
    :goto_9
    return p0

    .line 127
    :cond_a
    neg-float p0, p0

    goto :goto_9

    .line 129
    :cond_c
    invoke-static {p0}, Ljava/lang/StrictMath;->abs(F)F

    move-result p0

    goto :goto_9
.end method

.method public static final abs(I)I
    .registers 3

    .prologue
    .line 138
    shr-int/lit8 v0, p0, 0x1f

    .line 139
    xor-int v1, p0, v0

    sub-int v0, v1, v0

    return v0
.end method

.method public static final atan2(FF)F
    .registers 6

    .prologue
    .line 268
    sget-boolean v0, Lorg/jbox2d/common/Settings;->FAST_ATAN2:Z

    if-eqz v0, :cond_9

    .line 269
    invoke-static {p0, p1}, Lorg/jbox2d/common/MathUtils;->fastAtan2(FF)F

    move-result v0

    .line 271
    :goto_8
    return v0

    :cond_9
    float-to-double v0, p0

    float-to-double v2, p1

    invoke-static {v0, v1, v2, v3}, Ljava/lang/StrictMath;->atan2(DD)D

    move-result-wide v0

    double-to-float v0, v0

    goto :goto_8
.end method

.method public static final ceil(F)I
    .registers 3

    .prologue
    .line 159
    sget-boolean v0, Lorg/jbox2d/common/Settings;->FAST_CEIL:Z

    if-eqz v0, :cond_9

    .line 160
    invoke-static {p0}, Lorg/jbox2d/common/MathUtils;->fastCeil(F)I

    move-result v0

    .line 162
    :goto_8
    return v0

    :cond_9
    float-to-double v0, p0

    invoke-static {v0, v1}, Ljava/lang/StrictMath;->ceil(D)D

    move-result-wide v0

    double-to-int v0, v0

    goto :goto_8
.end method

.method public static final ceilPowerOf2(I)I
    .registers 2

    .prologue
    .line 189
    const/4 v0, 0x1

    .line 190
    :goto_1
    if-ge v0, p0, :cond_6

    .line 191
    shl-int/lit8 v0, v0, 0x1

    goto :goto_1

    .line 193
    :cond_6
    return v0
.end method

.method public static final clamp(FFF)F
    .registers 4

    .prologue
    .line 221
    invoke-static {p0, p2}, Lorg/jbox2d/common/MathUtils;->min(FF)F

    move-result v0

    invoke-static {p1, v0}, Lorg/jbox2d/common/MathUtils;->max(FF)F

    move-result v0

    return v0
.end method

.method public static final clamp(Lorg/jbox2d/common/Vec2;Lorg/jbox2d/common/Vec2;Lorg/jbox2d/common/Vec2;)Lorg/jbox2d/common/Vec2;
    .registers 6

    .prologue
    .line 225
    new-instance v1, Lorg/jbox2d/common/Vec2;

    invoke-direct {v1}, Lorg/jbox2d/common/Vec2;-><init>()V

    .line 226
    iget v0, p0, Lorg/jbox2d/common/Vec2;->x:F

    iget v2, p2, Lorg/jbox2d/common/Vec2;->x:F

    cmpg-float v0, v0, v2

    if-gez v0, :cond_36

    iget v0, p0, Lorg/jbox2d/common/Vec2;->x:F

    :goto_f
    iput v0, v1, Lorg/jbox2d/common/Vec2;->x:F

    .line 227
    iget v0, p0, Lorg/jbox2d/common/Vec2;->y:F

    iget v2, p2, Lorg/jbox2d/common/Vec2;->y:F

    cmpg-float v0, v0, v2

    if-gez v0, :cond_39

    iget v0, p0, Lorg/jbox2d/common/Vec2;->y:F

    :goto_1b
    iput v0, v1, Lorg/jbox2d/common/Vec2;->y:F

    .line 228
    iget v0, p1, Lorg/jbox2d/common/Vec2;->x:F

    iget v2, v1, Lorg/jbox2d/common/Vec2;->x:F

    cmpl-float v0, v0, v2

    if-lez v0, :cond_3c

    iget v0, p1, Lorg/jbox2d/common/Vec2;->x:F

    :goto_27
    iput v0, v1, Lorg/jbox2d/common/Vec2;->x:F

    .line 229
    iget v0, p1, Lorg/jbox2d/common/Vec2;->y:F

    iget v2, v1, Lorg/jbox2d/common/Vec2;->y:F

    cmpl-float v0, v0, v2

    if-lez v0, :cond_3f

    iget v0, p1, Lorg/jbox2d/common/Vec2;->y:F

    :goto_33
    iput v0, v1, Lorg/jbox2d/common/Vec2;->y:F

    .line 230
    return-object v1

    .line 226
    :cond_36
    iget v0, p2, Lorg/jbox2d/common/Vec2;->x:F

    goto :goto_f

    .line 227
    :cond_39
    iget v0, p2, Lorg/jbox2d/common/Vec2;->y:F

    goto :goto_1b

    .line 228
    :cond_3c
    iget v0, v1, Lorg/jbox2d/common/Vec2;->x:F

    goto :goto_27

    .line 229
    :cond_3f
    iget v0, v1, Lorg/jbox2d/common/Vec2;->y:F

    goto :goto_33
.end method

.method public static final clampToOut(Lorg/jbox2d/common/Vec2;Lorg/jbox2d/common/Vec2;Lorg/jbox2d/common/Vec2;Lorg/jbox2d/common/Vec2;)V
    .registers 6

    .prologue
    .line 234
    iget v0, p0, Lorg/jbox2d/common/Vec2;->x:F

    iget v1, p2, Lorg/jbox2d/common/Vec2;->x:F

    cmpg-float v0, v0, v1

    if-gez v0, :cond_31

    iget v0, p0, Lorg/jbox2d/common/Vec2;->x:F

    :goto_a
    iput v0, p3, Lorg/jbox2d/common/Vec2;->x:F

    .line 235
    iget v0, p0, Lorg/jbox2d/common/Vec2;->y:F

    iget v1, p2, Lorg/jbox2d/common/Vec2;->y:F

    cmpg-float v0, v0, v1

    if-gez v0, :cond_34

    iget v0, p0, Lorg/jbox2d/common/Vec2;->y:F

    :goto_16
    iput v0, p3, Lorg/jbox2d/common/Vec2;->y:F

    .line 236
    iget v0, p1, Lorg/jbox2d/common/Vec2;->x:F

    iget v1, p3, Lorg/jbox2d/common/Vec2;->x:F

    cmpl-float v0, v0, v1

    if-lez v0, :cond_37

    iget v0, p1, Lorg/jbox2d/common/Vec2;->x:F

    :goto_22
    iput v0, p3, Lorg/jbox2d/common/Vec2;->x:F

    .line 237
    iget v0, p1, Lorg/jbox2d/common/Vec2;->y:F

    iget v1, p3, Lorg/jbox2d/common/Vec2;->y:F

    cmpl-float v0, v0, v1

    if-lez v0, :cond_3a

    iget v0, p1, Lorg/jbox2d/common/Vec2;->y:F

    :goto_2e
    iput v0, p3, Lorg/jbox2d/common/Vec2;->y:F

    .line 238
    return-void

    .line 234
    :cond_31
    iget v0, p2, Lorg/jbox2d/common/Vec2;->x:F

    goto :goto_a

    .line 235
    :cond_34
    iget v0, p2, Lorg/jbox2d/common/Vec2;->y:F

    goto :goto_16

    .line 236
    :cond_37
    iget v0, p3, Lorg/jbox2d/common/Vec2;->x:F

    goto :goto_22

    .line 237
    :cond_3a
    iget v0, p3, Lorg/jbox2d/common/Vec2;->y:F

    goto :goto_2e
.end method

.method public static final cos(F)F
    .registers 3

    .prologue
    .line 118
    sget-boolean v0, Lorg/jbox2d/common/Settings;->SINCOS_LUT_ENABLED:Z

    if-eqz v0, :cond_d

    .line 119
    const v0, 0x3fc90fdb

    sub-float/2addr v0, p0

    invoke-static {v0}, Lorg/jbox2d/common/MathUtils;->sinLUT(F)F

    move-result v0

    .line 121
    :goto_c
    return v0

    :cond_d
    float-to-double v0, p0

    invoke-static {v0, v1}, Ljava/lang/StrictMath;->cos(D)D

    move-result-wide v0

    double-to-float v0, v0

    goto :goto_c
.end method

.method public static final distance(Lorg/jbox2d/common/Vec2;Lorg/jbox2d/common/Vec2;)F
    .registers 3

    .prologue
    .line 326
    invoke-static {p0, p1}, Lorg/jbox2d/common/MathUtils;->distanceSquared(Lorg/jbox2d/common/Vec2;Lorg/jbox2d/common/Vec2;)F

    move-result v0

    invoke-static {v0}, Lorg/jbox2d/common/MathUtils;->sqrt(F)F

    move-result v0

    return v0
.end method

.method public static final distanceSquared(Lorg/jbox2d/common/Vec2;Lorg/jbox2d/common/Vec2;)F
    .registers 5

    .prologue
    .line 320
    iget v0, p0, Lorg/jbox2d/common/Vec2;->x:F

    iget v1, p1, Lorg/jbox2d/common/Vec2;->x:F

    sub-float/2addr v0, v1

    .line 321
    iget v1, p0, Lorg/jbox2d/common/Vec2;->y:F

    iget v2, p1, Lorg/jbox2d/common/Vec2;->y:F

    sub-float/2addr v1, v2

    .line 322
    mul-float/2addr v0, v0

    mul-float/2addr v1, v1

    add-float/2addr v0, v1

    return v0
.end method

.method public static final fastAbs(F)F
    .registers 2

    .prologue
    .line 134
    const/4 v0, 0x0

    cmpl-float v0, p0, v0

    if-lez v0, :cond_6

    :goto_5
    return p0

    :cond_6
    neg-float p0, p0

    goto :goto_5
.end method

.method public static final fastAtan2(FF)F
    .registers 9

    .prologue
    const v0, 0x3fc90fdb

    const/high16 v6, 0x3f800000    # 1.0f

    const v5, 0x3e8f5c29    # 0.28f

    const v4, 0x40490fdb    # (float)Math.PI

    const/4 v1, 0x0

    .line 276
    cmpl-float v2, p1, v1

    if-nez v2, :cond_1f

    .line 277
    cmpl-float v2, p0, v1

    if-lez v2, :cond_15

    .line 293
    :cond_14
    :goto_14
    return v0

    .line 278
    :cond_15
    cmpl-float v0, p0, v1

    if-nez v0, :cond_1b

    move v0, v1

    goto :goto_14

    .line 279
    :cond_1b
    const v0, -0x4036f025

    goto :goto_14

    .line 282
    :cond_1f
    div-float v2, p0, p1

    .line 283
    invoke-static {v2}, Lorg/jbox2d/common/MathUtils;->abs(F)F

    move-result v3

    cmpg-float v3, v3, v6

    if-gez v3, :cond_3b

    .line 284
    mul-float v0, v5, v2

    mul-float/2addr v0, v2

    add-float/2addr v0, v6

    div-float v0, v2, v0

    .line 285
    cmpg-float v2, p1, v1

    if-gez v2, :cond_14

    .line 286
    cmpg-float v1, p0, v1

    if-gez v1, :cond_39

    sub-float/2addr v0, v4

    goto :goto_14

    .line 287
    :cond_39
    add-float/2addr v0, v4

    goto :goto_14

    .line 290
    :cond_3b
    mul-float v3, v2, v2

    add-float/2addr v3, v5

    div-float/2addr v2, v3

    sub-float/2addr v0, v2

    .line 291
    cmpg-float v1, p0, v1

    if-gez v1, :cond_14

    sub-float/2addr v0, v4

    goto :goto_14
.end method

.method public static final fastCeil(F)I
    .registers 3

    .prologue
    .line 167
    float-to-int v0, p0

    .line 168
    int-to-float v1, v0

    cmpl-float v1, p0, v1

    if-lez v1, :cond_8

    .line 169
    add-int/lit8 v0, v0, 0x1

    .line 171
    :cond_8
    return v0
.end method

.method public static final fastFloor(F)I
    .registers 3

    .prologue
    .line 151
    float-to-int v0, p0

    .line 152
    int-to-float v1, v0

    cmpg-float v1, p0, v1

    if-gez v1, :cond_8

    .line 153
    add-int/lit8 v0, v0, -0x1

    .line 155
    :cond_8
    return v0
.end method

.method public static final floor(F)I
    .registers 3

    .prologue
    .line 143
    sget-boolean v0, Lorg/jbox2d/common/Settings;->FAST_FLOOR:Z

    if-eqz v0, :cond_9

    .line 144
    invoke-static {p0}, Lorg/jbox2d/common/MathUtils;->fastFloor(F)I

    move-result v0

    .line 146
    :goto_8
    return v0

    :cond_9
    float-to-double v0, p0

    invoke-static {v0, v1}, Ljava/lang/StrictMath;->floor(D)D

    move-result-wide v0

    double-to-int v0, v0

    goto :goto_8
.end method

.method public static final isPowerOfTwo(I)Z
    .registers 2

    .prologue
    .line 256
    if-lez p0, :cond_9

    add-int/lit8 v0, p0, -0x1

    and-int/2addr v0, p0

    if-nez v0, :cond_9

    const/4 v0, 0x1

    :goto_8
    return v0

    :cond_9
    const/4 v0, 0x0

    goto :goto_8
.end method

.method public static final map(FFFFF)F
    .registers 7

    .prologue
    .line 214
    sub-float v0, p0, p1

    sub-float v1, p2, p1

    div-float/2addr v0, v1

    .line 215
    sub-float v1, p4, p3

    mul-float/2addr v0, v1

    add-float/2addr v0, p3

    .line 216
    return v0
.end method

.method public static final max(FF)F
    .registers 3

    .prologue
    .line 197
    cmpl-float v0, p0, p1

    if-lez v0, :cond_5

    :goto_4
    return p0

    :cond_5
    move p0, p1

    goto :goto_4
.end method

.method public static final max(II)I
    .registers 2

    .prologue
    .line 201
    if-le p0, p1, :cond_3

    :goto_2
    return p0

    :cond_3
    move p0, p1

    goto :goto_2
.end method

.method public static final min(FF)F
    .registers 3

    .prologue
    .line 205
    cmpg-float v0, p0, p1

    if-gez v0, :cond_5

    :goto_4
    return p0

    :cond_5
    move p0, p1

    goto :goto_4
.end method

.method public static final min(II)I
    .registers 2

    .prologue
    .line 209
    if-ge p0, p1, :cond_3

    :goto_2
    return p0

    :cond_3
    move p0, p1

    goto :goto_2
.end method

.method public static final nextPowerOfTwo(I)I
    .registers 3

    .prologue
    .line 247
    shr-int/lit8 v0, p0, 0x1

    or-int/2addr v0, p0

    .line 248
    shr-int/lit8 v1, v0, 0x2

    or-int/2addr v0, v1

    .line 249
    shr-int/lit8 v1, v0, 0x4

    or-int/2addr v0, v1

    .line 250
    shr-int/lit8 v1, v0, 0x8

    or-int/2addr v0, v1

    .line 251
    shr-int/lit8 v1, v0, 0x10

    or-int/2addr v0, v1

    .line 252
    add-int/lit8 v0, v0, 0x1

    return v0
.end method

.method public static final pow(FF)F
    .registers 6

    .prologue
    .line 260
    sget-boolean v0, Lorg/jbox2d/common/Settings;->FAST_POW:Z

    if-eqz v0, :cond_9

    .line 261
    invoke-static {p0, p1}, Lorg/jbox2d/common/MathUtils;->fastPow(FF)F

    move-result v0

    .line 263
    :goto_8
    return v0

    :cond_9
    float-to-double v0, p0

    float-to-double v2, p1

    invoke-static {v0, v1, v2, v3}, Ljava/lang/StrictMath;->pow(DD)D

    move-result-wide v0

    double-to-float v0, v0

    goto :goto_8
.end method

.method public static final randomFloat(FF)F
    .registers 4

    .prologue
    .line 308
    invoke-static {}, Ljava/lang/Math;->random()D

    move-result-wide v0

    double-to-float v0, v0

    sub-float v1, p1, p0

    mul-float/2addr v0, v1

    add-float/2addr v0, p0

    return v0
.end method

.method public static final randomFloat(Ljava/util/Random;FF)F
    .registers 5

    .prologue
    .line 312
    invoke-virtual {p0}, Ljava/util/Random;->nextFloat()F

    move-result v0

    sub-float v1, p2, p1

    mul-float/2addr v0, v1

    add-float/2addr v0, p1

    return v0
.end method

.method public static final reduceAngle(F)F
    .registers 5

    .prologue
    const v2, 0x40c90fdb

    const v3, 0x40490fdb    # (float)Math.PI

    .line 297
    rem-float v0, p0, v2

    .line 298
    invoke-static {v0}, Lorg/jbox2d/common/MathUtils;->abs(F)F

    move-result v1

    cmpl-float v1, v1, v3

    if-lez v1, :cond_11

    .line 299
    sub-float/2addr v0, v2

    .line 301
    :cond_11
    invoke-static {v0}, Lorg/jbox2d/common/MathUtils;->abs(F)F

    move-result v1

    const v2, 0x3fc90fdb

    cmpl-float v1, v1, v2

    if-lez v1, :cond_1e

    .line 302
    sub-float v0, v3, v0

    .line 304
    :cond_1e
    return v0
.end method

.method public static final round(F)I
    .registers 2

    .prologue
    .line 175
    sget-boolean v0, Lorg/jbox2d/common/Settings;->FAST_ROUND:Z

    if-eqz v0, :cond_c

    .line 176
    const/high16 v0, 0x3f000000    # 0.5f

    add-float/2addr v0, p0

    invoke-static {v0}, Lorg/jbox2d/common/MathUtils;->floor(F)I

    move-result v0

    .line 178
    :goto_b
    return v0

    :cond_c
    invoke-static {p0}, Ljava/lang/StrictMath;->round(F)I

    move-result v0

    goto :goto_b
.end method

.method public static final sin(F)F
    .registers 3

    .prologue
    .line 81
    sget-boolean v0, Lorg/jbox2d/common/Settings;->SINCOS_LUT_ENABLED:Z

    if-eqz v0, :cond_9

    .line 82
    invoke-static {p0}, Lorg/jbox2d/common/MathUtils;->sinLUT(F)F

    move-result v0

    .line 84
    :goto_8
    return v0

    :cond_9
    float-to-double v0, p0

    invoke-static {v0, v1}, Ljava/lang/StrictMath;->sin(D)D

    move-result-wide v0

    double-to-float v0, v0

    goto :goto_8
.end method

.method public static final sinLUT(F)F
    .registers 6

    .prologue
    const v4, 0x40c90fdb

    const/high16 v3, 0x3f800000    # 1.0f

    const v2, 0x38e6afcd    # 1.1E-4f

    .line 89
    rem-float v0, p0, v4

    .line 91
    const/4 v1, 0x0

    cmpg-float v1, v0, v1

    if-gez v1, :cond_10

    .line 92
    add-float/2addr v0, v4

    .line 95
    :cond_10
    sget-boolean v1, Lorg/jbox2d/common/Settings;->SINCOS_LUT_LERP:Z

    if-eqz v1, :cond_3f

    .line 97
    div-float/2addr v0, v2

    .line 99
    float-to-int v1, v0

    .line 101
    if-eqz v1, :cond_1a

    .line 102
    int-to-float v2, v1

    rem-float/2addr v0, v2

    .line 106
    :cond_1a
    sget v2, Lorg/jbox2d/common/Settings;->SINCOS_LUT_LENGTH:I

    add-int/lit8 v2, v2, -0x1

    if-ne v1, v2, :cond_2f

    .line 107
    sub-float v2, v3, v0

    sget-object v3, Lorg/jbox2d/common/MathUtils;->sinLUT:[F

    aget v1, v3, v1

    mul-float/2addr v1, v2

    sget-object v2, Lorg/jbox2d/common/MathUtils;->sinLUT:[F

    const/4 v3, 0x0

    aget v2, v2, v3

    mul-float/2addr v0, v2

    add-float/2addr v0, v1

    .line 113
    :goto_2e
    return v0

    .line 109
    :cond_2f
    sub-float v2, v3, v0

    sget-object v3, Lorg/jbox2d/common/MathUtils;->sinLUT:[F

    aget v3, v3, v1

    mul-float/2addr v2, v3

    sget-object v3, Lorg/jbox2d/common/MathUtils;->sinLUT:[F

    add-int/lit8 v1, v1, 0x1

    aget v1, v3, v1

    mul-float/2addr v0, v1

    add-float/2addr v0, v2

    goto :goto_2e

    .line 113
    :cond_3f
    sget-object v1, Lorg/jbox2d/common/MathUtils;->sinLUT:[F

    div-float/2addr v0, v2

    invoke-static {v0}, Lorg/jbox2d/common/MathUtils;->round(F)I

    move-result v0

    sget v2, Lorg/jbox2d/common/Settings;->SINCOS_LUT_LENGTH:I

    rem-int/2addr v0, v2

    aget v0, v1, v0

    goto :goto_2e
.end method

.method public static final sqrt(F)F
    .registers 3

    .prologue
    .line 316
    float-to-double v0, p0

    invoke-static {v0, v1}, Ljava/lang/StrictMath;->sqrt(D)D

    move-result-wide v0

    double-to-float v0, v0

    return v0
.end method