All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.bixilon.kotlinglm.gtx.gtx_Normal.kt Maven / Gradle / Ivy

package de.bixilon.kotlinglm.gtx

import de.bixilon.kotlinglm.GLM
import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.kotlinglm.vec4.Vec4

interface gtx_Normal {

    fun triangleNormal(p1: Vec3, p2: Vec3, p3: Vec3): Vec3 = triangleNormal(Vec3(), p1, p2, p3)

    fun triangleNormal(res: Vec3, p1: Vec3, p2: Vec3, p3: Vec3): Vec3 {
        // a = p1 - p2
        val aX = p1.x - p2.x
        val aY = p1.y - p2.y
        val aZ = p1.z - p2.z
        // b = p1 - p3
        val bX = p1.x - p3.x
        val bY = p1.y - p3.y
        val bZ = p1.z - p3.z
        // a cross b
        val crossX = aY * bZ - bY * aZ
        val crossY = aZ * bX - bZ * aX
        val crossZ = aX * bY - bX * aY
        // normalize(cross)
        val dot = crossX * crossX + crossY * crossY + crossZ * crossZ
        val invSqrt = GLM.inverseSqrt(dot)
        res.x = crossX * invSqrt
        res.y = crossY * invSqrt
        res.z = crossZ * invSqrt
        return res
    }

    fun triangleNormal(p1: Vec4, p2: Vec4, p3: Vec4): Vec4 = triangleNormal(Vec4(), p1, p2, p3)

    fun triangleNormal(res: Vec4, p1: Vec4, p2: Vec4, p3: Vec4): Vec4 {
        // a = p1 - p2
        val aX = p1.x - p2.x
        val aY = p1.y - p2.y
        val aZ = p1.z - p2.z
        // b = p1 - p3
        val bX = p1.x - p3.x
        val bY = p1.y - p3.y
        val bZ = p1.z - p3.z
        // a cross b
        val crossX = aY * bZ - bY * aZ
        val crossY = aZ * bX - bZ * aX
        val crossZ = aX * bY - bX * aY
        // normalize(cross)
        val dot = crossX * crossX + crossY * crossY + crossZ * crossZ
        val invSqrt = GLM.inverseSqrt(dot)
        res.x = crossX * invSqrt
        res.y = crossY * invSqrt
        res.z = crossZ * invSqrt
        return res
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy