local wea_c = worldeditadditions_core
local Vector3 = wea_c.Vector3


--- Converts a 2d heightmap into slope values in radians.
-- Convert a radians to degrees by doing (radians*math.pi) / 180 for display,
-- but it is STRONGLY recommended to keep all internal calculations in radians.
-- @param	heightmap		table	A ZERO indexed flat heightmap. See worldeditadditions.terrain.make_heightmap().
-- @param	heightmap_size	int[]	The size of the heightmap in the form [ z, x ]
-- @return	Vector[]		The calculated slope map, in the same form as the input heightmap. Each element of the array is a (floating-point) number representing the slope in that cell in radians.
local function calculate_slopes(heightmap, heightmap_size)
	local normals = wea_c.terrain.calculate_normals(heightmap, heightmap_size)
	local slopes = {  }
	
	local up = Vector3.new(0, 1, 0) -- Z & Y are flipped
	
	for z = heightmap_size.z-1, 0, -1 do
		for x = heightmap_size.x-1, 0, -1 do
			local hi = z*heightmap_size.x + x
			
			-- Ref https://stackoverflow.com/a/16669463/1460422
			-- slopes[hi] = wea.Vector3.dot_product(normals[hi], up)
			slopes[hi] = math.acos(normals[hi].y)
		end
	end
	
	return slopes
end

return calculate_slopes
