OverviewFilesCommitsIssuesDocsReleasesPeers

cyber-world / addons / jc.godot.time-of-day / Code / Sky / ScatterLib.gd

60 lines · gd ref:
class_name ScatterLib
"""========================================================
°                         TimeOfDay.
°                   ======================
°
°   Category: Sky.
°   -----------------------------------------------------
°   Description:
°       Atmospheric Scattering Lib.
°   -----------------------------------------------------
°   Copyright:
°               J. Cuellar 2021. MIT License.
°                   See: LICENSE File.
========================================================"""

"""===============================================
° References:
° - Preetham and Hoffman Paper:
° See: https://developer.amd.com/wordpress/media/2012/10/ATI-LightScattering.pdf
==============================================="""
const n: float = 1.0003 # Index of the air refraction
const n2: float = 1.00060009 # Index of the air refraction ˆ 2
const N: float = 2.545e25 # Molecular Density
const pn: float = 0.035 # Depolatization factor for standard air.

static func compute_wavelenghts_lambda(value: Vector3) -> Vector3:
	return value * 1e-9

static func compute_wavlenghts(lambda: Vector3) -> Vector3:
	var k = 4.0
	var ret: Vector3 = lambda
	ret.x = pow(lambda.x, k)
	ret.y = pow(lambda.y, k)
	ret.z = pow(lambda.z, k)
	
	return ret

static func compute_beta_ray(wavelenghts: Vector3) -> Vector3:
	var kr: float =  (8.0 * pow(PI, 3.0) * pow(n2 - 1.0, 2.0) * (6.0 + 3.0 * pn))
	var ret: Vector3 = 3.0 * N * wavelenghts * (6.0 - 7.0 * pn)
	ret.x = kr / ret.x
	ret.y = kr / ret.y 
	ret.z = kr / ret.z
	
	return ret

static func compute_beta_mie(mie: float, turbidity: float) -> Vector3:
	var k: float = 434e-6
	return Vector3.ONE * mie * turbidity * k

static func get_partial_mie_phase(g: float) -> Vector3:
	var g2: float = g * g
	var ret: Vector3
	# ret.x = ((1.0 - g2) / (2.0 + g2))
	ret.x = 1.0 - g2
	ret.y = 1.0 + g2
	ret.z = 2.0 * g 
	
	return ret