mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-11 06:11:50 +09:00
116 lines
2.5 KiB
Kotlin
116 lines
2.5 KiB
Kotlin
package net.torvald.colourutil
|
|
|
|
import com.jme3.math.FastMath
|
|
import com.badlogic.gdx.graphics.Color
|
|
|
|
/**
|
|
* OBSOLETE; use CIELchUtil for natural-looking colour
|
|
*
|
|
* Created by minjaesong on 2016-01-16.
|
|
*/
|
|
object HSVUtil {
|
|
|
|
/**
|
|
* Convert HSV parameters to RGB color.
|
|
* @param H 0-359 Hue
|
|
* *
|
|
* @param S 0-1 Saturation
|
|
* *
|
|
* @param V 0-1 Value
|
|
* @link http://www.rapidtables.com/convert/color/hsv-to-rgb.htm
|
|
*/
|
|
fun toRGB(H: Float, S: Float, V: Float, alpha: Float = 1f): Color {
|
|
var H = H
|
|
H %= 360f
|
|
|
|
val C = V * S
|
|
val X = C * (1 - FastMath.abs(
|
|
H / 60f % 2 - 1))
|
|
val m = V - C
|
|
|
|
var R_prime = java.lang.Float.NaN
|
|
var G_prime = java.lang.Float.NaN
|
|
var B_prime = java.lang.Float.NaN
|
|
|
|
if (H < 60) {
|
|
R_prime = C
|
|
G_prime = X
|
|
B_prime = 0f
|
|
}
|
|
else if (H < 120) {
|
|
R_prime = X
|
|
G_prime = C
|
|
B_prime = 0f
|
|
}
|
|
else if (H < 180) {
|
|
R_prime = 0f
|
|
G_prime = C
|
|
B_prime = X
|
|
}
|
|
else if (H < 240) {
|
|
R_prime = 0f
|
|
G_prime = X
|
|
B_prime = C
|
|
}
|
|
else if (H < 300) {
|
|
R_prime = X
|
|
G_prime = 0f
|
|
B_prime = C
|
|
}
|
|
else if (H < 360) {
|
|
R_prime = C
|
|
G_prime = 0f
|
|
B_prime = X
|
|
}
|
|
|
|
return Color(R_prime + m, G_prime + m, B_prime + m, alpha)
|
|
}
|
|
|
|
fun toRGB(hsv: HSV): Color {
|
|
return toRGB(hsv.h * 360, hsv.s, hsv.v, hsv.alpha)
|
|
}
|
|
|
|
fun fromRGB(color: Color): HSV {
|
|
val r = color.r
|
|
val g = color.g
|
|
val b = color.b
|
|
|
|
val rgbMin = FastMath.min(r, g, b)
|
|
val rgbMax = FastMath.max(r, g, b)
|
|
|
|
var h: Float
|
|
val s: Float
|
|
val v = rgbMax
|
|
|
|
val delta = rgbMax - rgbMin
|
|
|
|
if (rgbMax != 0f)
|
|
s = delta / rgbMax
|
|
else {
|
|
h = 0f
|
|
s = 0f
|
|
return HSV(h, s, v)
|
|
}
|
|
|
|
if (r == rgbMax)
|
|
h = (g - b) / delta
|
|
else if (g == rgbMax)
|
|
h = 2 + (b - r) / delta
|
|
else
|
|
h = 4 + (r - g) / delta
|
|
|
|
h *= 60f
|
|
if (h < 0) h += 360f
|
|
|
|
return HSV(h.div(360f), s, v, color.a)
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* @param h : Hue in 0.0 - 1.0 (360 deg)
|
|
* @param s : Saturation in 0.0 - 1.0
|
|
* @param v : Value in 0.0 - 1.0
|
|
*/
|
|
data class HSV(var h: Float = 0f, var s: Float = 0f, var v: Float = 0f, var alpha: Float = 1f)
|