//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
//**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************//
#pragma once

#include "BsRenderBeastPrerequisites.h"
#include "BsRenderer.h"
#include "BsRenderQueue.h"

namespace BansheeEngine
{
	/** @addtogroup RenderBeast
	 *  @{
	 */

	/** Texture filtering options for RenderBeast. */
	enum class RenderBeastFiltering
	{
		Bilinear, /**< Sample linearly in X and Y directions within a texture mip level. */
		Trilinear, /**< Sample bilinearly and also between texture mip levels to hide the mip transitions. */
		Anisotropic /**< High quality dynamic filtering that improves quality of angled surfaces */
	};

	/** A set of options used for controlling the rendering of the RenderBeast renderer. */
	struct BS_BSRND_EXPORT RenderBeastOptions : public CoreRendererOptions
	{
		/**	Type of filtering to use for all textures on scene elements. */
		RenderBeastFiltering filtering = RenderBeastFiltering::Anisotropic;

		/**
		 * Maximum number of samples to be used when performing anisotropic filtering. Only relevant if #filtering is set to
		 * RenderBeastFiltering::Anisotropic.
		 */
		UINT32 anisotropyMax = 16;

		/**
		 * Number of samples per pixel. More samples means less aliasing but this may seriously increase fillrate and memory
		 * consumption on the GPU.
		 */
		UINT32 msaa = 1;

		/** 
		 * All colors output from shaders will be automatically converted to gamma space when written to render target(s). 
		 * Normally used when the renderer performs calculations in linear space.
		 */
		bool gammaCorrect = true; 

		/**
		 * High dynamic range allows light intensity to be more correctly recorded when rendering by allowing for a larger
		 * range of values. The stored light is then converted into visible colors using a tone mapping operator depending
		 * on average scene brightness.
		 */
		bool hdr = false;

		/**
		 * Controls if and how a render queue groups renderable objects by material in order to reduce number of state
		 * changes. Sorting by material can reduce CPU usage but could increase overdraw.
		 */
		StateReduction stateReductionMode = StateReduction::Distance;
	};

	/** @} */
}