
class Camera:
	def __init__(self):
		self.params = {}

		# Number of additional samples on each axis to average and improve image quality.
		# NOTE: This will slow down rendering quadratically.
		# Recommended Range: 1 to 8 (integer)
		self.params['ANTIALIASING_SAMPLES'] = 1

		# The strength of the ambient occlusion.
		# Recommended Range: 0.0 to 0.05
		self.params['AMBIENT_OCCLUSION_STRENGTH'] = 0.01

		# Represents the maximum RGB color shift that can result from ambient occlusion.
		# Typically use positive values for 'glow' effects and negative for 'darkness'.
		# Recommended Range: All values between -1.0 and 1.0
		self.params['AMBIENT_OCCLUSION_COLOR_DELTA'] = (0.8, 0.8, 0.8)

		# Color of the background when the ray doesn't hit anything
		# Recommended Range: All values between 0.0 and 1.0
		self.params['BACKGROUND_COLOR'] = (0.6, 0.6, 0.9)

		# The strength of the depth of field effect.
		# NOTE: ANTIALIASING_SAMPLES must be larger than 1 to use depth of field effects.
		# Recommended Range: 0.0 to 20.0
		self.params['DEPTH_OF_FIELD_STRENGTH'] = 0.0

		# The distance from the camera where objects will appear in focus.
		# NOTE: ANTIALIASING_SAMPLES must be larger than 1 to use depth of field effects.
		# Recommended Range: 0.0 to 100.0
		self.params['DEPTH_OF_FIELD_DISTANCE'] = 1.0

		# Determines if diffuse lighting should be enabled.
		# NOTE: This flag will be ignored if DIFFUSE_ENHANCED_ENABLED is set.
		# NOTE: SHADOW_DARKNESS is also used to change diffuse intensity.
		self.params['DIFFUSE_ENABLED'] = False

		# This is a 'less correct' but more aesthetically pleasing diffuse variant.
		# NOTE: This will override the DIFFUSE_ENABLED flag.
		# NOTE: SHADOW_DARKNESS is also used to change diffuse intensity.
		self.params['DIFFUSE_ENHANCED_ENABLED'] = True

		# Amount of light captured by the camera.
		# Can be used to increase/decrease brightness in case pixels are over-saturated.
		# Recommended Range: 0.1 to 10.0
		self.params['EXPOSURE'] = 1.0

		# Field of view of the camera in degrees
		# NOTE: This will have no effect if ORTHOGONAL_PROJECTION or ODS is enabled.
		# Recommended Range: 20.0 to 120.0
		self.params['FIELD_OF_VIEW'] = 60.0

		# When enabled, adds a distance-based fog to the scene
		# NOTE: Fog strength is determined by MAX_DIST and fog color is always BACKGROUND_COLOR.
		# NOTE: If enabled, you usually also want VIGNETTE_FOREGROUND=True and SUN_ENABLED=False.
		self.params['FOG_ENABLED'] = False

		# When enabled, adds object glow to the background layer.
		self.params['GLOW_ENABLED'] = False

		# Represents the maximum RGB color shift that can result from glow.
		# Recommended Range: All values between -1.0 and 1.0
		self.params['GLOW_COLOR_DELTA'] = (-0.2, 0.5, -0.2)

		# The sharpness of the glow.
		# Recommended Range: 1.0 to 100.0
		self.params['GLOW_SHARPNESS'] = 4.0

		# Color of the sunlight in RGB format.
		# Recommended Range: All values between 0.0 and 1.0
		self.params['LIGHT_COLOR'] = (1.0, 0.9, 0.6)

		# Direction of the sunlight.
		# NOTE: This must be a normalized quantity (magnitude = 1.0)
		self.params['LIGHT_DIRECTION'] = (-0.36, 0.48, 0.80)

		# Level of detail multiplier to improve speed and performance.
		# When this value is large, distant objects become less detailed.
		# Recommended Range: 0.0 to 100.0
		self.params['LOD_MULTIPLIER'] = 10.0

		# Maximum number of marches before a ray is considered a non-intersection.
		# Recommended Range: 10 to 10000 (integer)
		self.params['MAX_MARCHES'] = 1000

		# Maximum distance before a ray is considered a non-intersection.
		# Recommended Range: 0.5 to 200.0
		self.params['MAX_DIST'] = 50.0

		# Minimum march distance until a ray is considered intersecting.
		# Recommended Range: 0.000001 to 0.01
		self.params['MIN_DIST'] = 0.00001

		# Number of additional renderings between frames.
		# NOTE: This will slow down rendering linearly.
		# Recommended Range: 0 to 10 (integer)
		self.params['MOTION_BLUR_LEVEL'] = 0

		# Proportion of time the shutter is open during a frame
		# NOTE: Only applys when MOTION_BLUR_LEVEL is greater than 0
		# Recommended Range: 0.0 to 1.0
		self.params['MOTION_BLUR_RATIO'] = 1.0

		# If true will render an omnidirectional stereo 360 projection.
		self.params['ODS'] = False

		# Determines if the projection view should be orthographic instead of perspective.
		self.params['ORTHOGONAL_PROJECTION'] = False

		# When ORTHOGONAL_PROJECTION is enabled, this will determine the size of the view.
		# NOTE: Larger numbers mean the view will appear more zoomed out.
		# Recommended Range: 0.5 to 50.0
		self.params['ORTHOGONAL_ZOOM'] = 5.0

		# Number of additional bounces after a ray collides with the geometry.
		# Recommended Range: 0 to 8 (integer)
		self.params['REFLECTION_LEVEL'] = 0

		# Proportion of light lost each time a reflection occurs.
		# NOTE: This will only be relevant if REFLECTION_LEVEL is greater than 0.
		# Recommended Range: 0.25 to 1.0
		self.params['REFLECTION_ATTENUATION'] = 0.6

		# When enabled, uses an additional ray march to the light source to check for shadows.
		self.params['SHADOWS_ENABLED'] = True

		# Proportion of the light that is 'blocked' by the shadow or diffuse light.
		# Recommended Range: 0.0 to 1.0
		self.params['SHADOW_DARKNESS'] = 0.8

		# How sharp the shadows should appear.
		# Recommended Range: 1.0 to 100.0
		self.params['SHADOW_SHARPNESS'] = 16.0

		# Used to determine how sharp specular reflections are.
		# NOTE: This is the 'shininess' parameter in the phong illumination model.
		# NOTE: To disable specular highlights, use the value 0.
		# Recommended Range: 0 to 1000 (integer)
		self.params['SPECULAR_HIGHLIGHT'] = 40

		# Determines if the sun should be drawn in the sky.
		self.params['SUN_ENABLED'] = True

		# Size of the sun to draw in the sky.
		# NOTE: This only takes effect when SUN_ENABLED is enabled.
		# Recommended Range: 0.0001 to 0.05
		self.params['SUN_SIZE'] = 0.005

		# How sharp the sun should appear in the sky.
		# NOTE: This only takes effect when SUN_ENABLED is enabled.
		# Recommended Range: 0.1 to 10.0
		self.params['SUN_SHARPNESS'] = 2.0

		# When enabled, vignetting will also effect foreground objects.
		self.params['VIGNETTE_FOREGROUND'] = False

		# The strength of the vignetting effect.
		# Recommended Range: 0.0 to 1.5
		self.params['VIGNETTE_STRENGTH'] = 0.5

	def __getitem__(self, k):
		return self.params[k]

	def __setitem__(self, k, x):
		self.params[k] = x
