mirror of
https://github.com/GayPizzaSpecifications/voxelotl-engine.git
synced 2025-08-03 13:11:33 +00:00
slight refactor
This commit is contained in:
@ -46,21 +46,16 @@ public extension Color where T: FixedWidthInteger {
|
|||||||
init(r newR: T, g newG: T, b newB: T) {
|
init(r newR: T, g newG: T, b newB: T) {
|
||||||
self.init(r: newR, g: newG, b: newB, a: Self.one)
|
self.init(r: newR, g: newG, b: newB, a: Self.one)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public extension Color where T: UnsignedInteger & FixedWidthInteger {
|
||||||
init<U: BinaryFloatingPoint>(_ other: Color<U>) {
|
init<U: BinaryFloatingPoint>(_ other: Color<U>) {
|
||||||
self.init(
|
self.init(
|
||||||
r: T((other.r * U(0xFF)).clamp(0, 0xFF)),
|
r: T((other.r * U(T.max)).clamp(0, U(T.max))),
|
||||||
g: T((other.g * U(0xFF)).clamp(0, 0xFF)),
|
g: T((other.g * U(T.max)).clamp(0, U(T.max))),
|
||||||
b: T((other.b * U(0xFF)).clamp(0, 0xFF)),
|
b: T((other.b * U(T.max)).clamp(0, U(T.max))),
|
||||||
a: T((other.a * U(0xFF)).clamp(0, 0xFF)))
|
a: T((other.a * U(T.max)).clamp(0, U(T.max))))
|
||||||
}
|
}
|
||||||
|
|
||||||
func mix(_ other: Self, _ n: Float) -> Self {
|
|
||||||
Self(Color<Float>(self).mix(Color<Float>(other), n.saturated))
|
|
||||||
}
|
|
||||||
|
|
||||||
var linear: Self { Self(Color<Float>(self).linear) }
|
|
||||||
var sRGB: Self { Self(Color<Float>(self).sRGB) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension Color where T == UInt8 {
|
public extension Color where T == UInt8 {
|
||||||
@ -79,27 +74,13 @@ public extension Color where T == UInt8 {
|
|||||||
b: UInt8((c & 0x0000FF) >> 0))
|
b: UInt8((c & 0x0000FF) >> 0))
|
||||||
}
|
}
|
||||||
|
|
||||||
var sRGB: Self {
|
func mix(_ other: Self, _ n: Float) -> Self {
|
||||||
return Self(
|
Self(Color<Float>(self).mix(Color<Float>(other), n.saturated))
|
||||||
r: sRGB8FromLinear8Table[Int(r)],
|
|
||||||
g: sRGB8FromLinear8Table[Int(g)],
|
|
||||||
b: sRGB8FromLinear8Table[Int(b)],
|
|
||||||
a: a)
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
fileprivate var sRGB8FromLinear8Table: [UInt8] = {
|
var linear: Self { Self(Color<Float>(self).linear) }
|
||||||
(0..<0x100).map { i in
|
var sRGB: Self { Self(Color<Float>(self).sRGB) }
|
||||||
var x = Double(i) / 0xFF
|
}
|
||||||
if x < 0.0031308 {
|
|
||||||
x *= 12.92
|
|
||||||
} else {
|
|
||||||
x = 1.055 * pow(abs(x), 1 / 2.4) - 0.055
|
|
||||||
}
|
|
||||||
x = floor((x * 0xFF) + 0.5)
|
|
||||||
return UInt8(truncating: NSNumber(value: x))
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
public extension Color where T: BinaryFloatingPoint {
|
public extension Color where T: BinaryFloatingPoint {
|
||||||
@inline(__always) static var one: T { T(1) }
|
@inline(__always) static var one: T { T(1) }
|
||||||
@ -166,12 +147,7 @@ public extension Color where T: BinaryFloatingPoint {
|
|||||||
} else if x < 0.0031308 {
|
} else if x < 0.0031308 {
|
||||||
x * 12.92
|
x * 12.92
|
||||||
} else {
|
} else {
|
||||||
#if false
|
|
||||||
// Approximation
|
|
||||||
1.13005 * sqrt(abs(x - 0.00228)) - 0.13448 * x + 0.005719
|
|
||||||
#else
|
|
||||||
T(1.055 * pow(Double(abs(x)), 1 / 2.4) - 0.055)
|
T(1.055 * pow(Double(abs(x)), 1 / 2.4) - 0.055)
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user