#ifndef __STRINGS_H__
#define __STRINGS_H__

#include "configg.h"

__BEGIN_BRDFLIB_SOURCE

namespace BrdfStrings {

// BRDF models descriptions
const char* KPhongDesc				= "phong";
const char* KPhongPhysicalDesc		= "phong_physical";
const char* KAnisoPhongDesc			= "phong_anisotropic";
const char* KPhongPhysicalDRDesc	= "phong_physical_dr";
const char* KPhongGrazingMirrorDesc	= "phong_grazing_mirror";
const char* KMicrofacetDesc			= "microfacet";
const char* KAnisoWardDesc			= "ward_aniso";
const char* KIsoWardDesc			= "ward_iso";
const char* KAnisoWardDuerDesc		= "ward_duer_aniso";
const char* KIsoWardDuerDesc		= "ward_duer_iso";
const char* KAnisoMoroderDuerDesc	= "moroder_duer_aniso";
const char* KIsoMoroderDuerDesc		= "moroder_duer_iso";
const char* KBeardMaxwellDesc		= "beard_maxwell";
const char* KCookTorranceDesc		= "cook_torrance";
const char* KSchlickSurveyDesc		= "schlick";
const char* KSimpleCookTorranceDesc	= "cook_torrance_simplified";
const char* KCoupledModelDesc		= "coupled_model";
const char* KLafortuneDesc   		= "lafortune";
const char* K_MGF_Desc   			= "mgf";
const char* KIdealDiffuseReflDesc	= "ideal_diffuse_reflector";
const char* KIdealMirrorReflDesc	= "ideal_mirror_reflector";
const char* KIdealMetalDesc			= "ideal_metal";
const char* KSpecularReflectorDesc	= "specular_reflector";
const char* KIdealDiffuseRefrDesc	= "ideal_diffuse_refractor";
const char* KIdealRefractorDesc		= "ideal_refractor";
const char* KIdealDielectricDesc	= "ideal_dielectric";
const char* KOrenNayarDesc			= "oren_nayar";
const char* KMinnaertDesc			= "minnaert";
const char* KKurtKalosAnisoDesc		= "kurt_kalos_anisotropic";
const char* KKurtKalosIsoDesc		= "kurt_kalos_isotropic";
const char* KNeumannDesc			= "neumann";
const char* KLayeredMixtureDesc		= "layered_mixture";


// BRDF model parameters titles & descriptions
const char* KInvalidParameter		= "Invalid parameter";

//const char* KAmbientTitle			= "Ambient";
const char* KDiffuseTitle			= "Diffuse";
const char* KSpecularTitle			= "Specular";
const char* KShininessTitle			= "Shininess";
const char* KDiffuseReflTitle		= "Diffuse reflection";
const char* KSpecularReflTitle		= "Specular reflection";
const char* KShininessReflTitle		= "Shininess (reflect)";
const char* KDiffuseRefrTitle		= "Diffuse refraction";
const char* KSpecularRefrTitle		= "Specular refraction";
const char* KShininessRefrTitle		= "Shininess (refract)";
const char* KRefractionTitle		= "Refraction coefficient";
const char* KIORTitle				= "Index of refraction";
const char* KExtinctionCoefTitle	= "Extinction Coefficient";
const char* KMaxPhongTitle			= "Use MaxPhong";
const char* KMaxWardTitle			= "Use MaxWard";
const char* KWardDuerTitle			= "Use Ward-Dür BRDF";
const char* KMoroderDuerTitle		= "Use Moroder-Dür BRDF";
const char* KMaxLafTitle			= "Use MaxLafortune";
const char* KBlinnNormalsTitle		= "Use Blinn normals";
const char* KRetroReflectiveTitle	= "Use retro-reflective";
const char* KSlopeTitle				= "Slope";
const char* KSlopeXTitle			= "Slope X";
const char* KSlopeYTitle			= "Slope Y";
const char* KSlopeWeightTitle		= "Weight of slope";
const char* KSlopeWeightXTitle		= "Weight of slope X";
const char* KSlopeWeightYTitle		= "Weight of slope Y";
const char* KVolumeTitle			= "Volume";
const char* KFresnelTitle			= "Fresnel term";
const char* KLobeTitle				= "Lobe";
const char* KAlbedoTitle 			= "Albedo";
const char* KSchlickApproxTitle 	= "Schlick approximation";
const char* KAnisotropyTitle 		= "Anisotropic";
const char* KAlphaTitle 			= "Alpha";
const char* KLimbDarkTitle 			= "k";
const char* KLayerTitle 			= "Layer";

//const char* KAmbientDesc				= "This is an ambient part of the materials color";
const char* KAlbedoDesc 			= "An albedo of the surface. Albedo, or reflection coefficient, is the diffuse reflectivity or reflecting power of a surface. It is defined as the ratio of reflected radiation from the surface to incident radiation upon it. Being a dimensionless fraction, it may also be expressed as a percentage, and is measured on a scale from zero for no reflecting power of a perfectly black surface, to 1 for perfect reflection of a white surface. For RGB colors, we can specify albedo for each of the component colors.";
const char* KDiffuseDesc 			= "A diffuse component of the materials color. Diffuse reflection can be considered as a special case of sub-surface scattering within the material - one where the light enters and leaves at the same point due to very small-scale internal scattering.\n          It is also important to realise that diffuse reflection is view-independent which further simplifies its evaluation. If the surface layer generates a very strong specular reflection then little or no energy may penetrate the surface thus not all materials exhibit inner-scattering. Metals, for example, often demonstrate this characteristic.";
const char* KSpecularDesc 			= "A specular component of the materials color. It is responsible for sharp mirror-like reflection from a surface. Specular reflection occurs on the surface of the material and is view-dependent.\n          This component of a BRDF is closer to the concept of reflected energy as, unlike diffuse reflection, it hasn’t been absorbed by the material before being reflected.";
const char* KShininessDesc			= "A shininess of the material. It is the coefficient of specular reflectivity associated with the surface of an object being displayed.";
const char* KDiffuseReflDesc		= "A diffuse component of the materials color. Diffuse reflection can be considered as a special case of sub-surface scattering within the material; one where the light enters and leaves at the same point due to very small-scale internal scattering.\n          It is also important to realise that diffuse reflection is view-independent which further simplifies its evaluation. If the surface layer generates a very strong specular reflection then little or no energy may penetrate the surface thus not all materials exhibit inner-scattering. Metals, for example, often demonstrate this characteristic.\n          This parameter will be used only for REFLECTION part of the ray-surface interaction.";
const char* KSpecularReflDesc 		= "A specular component of the materials color. It is responsible for sharp mirror-like reflection from a surface. Specular reflection occurs on the surface of the material and is view-dependent. This component of a BRDF is closer to the concept of reflected energy as, unlike diffuse reflection, it hasn’t been absorbed by the material before being reflected. This parameter will be used only for REFLECTION part of the ray-surface interaction.";
const char* KShininessReflDesc		= "A shininess of the material. It is the coefficient of specular reflectivity associated with the surface of an object being displayed. This parameter will be used only for REFLECTION part of the ray-surface interaction.";
const char* KDiffuseRefrDesc 		= "A diffuse component of the materials color. Diffuse reflection can be considered as a special case of sub-surface scattering within the material; one where the light enters and leaves at the same point due to very small-scale internal scattering.\n          It is also important to realise that diffuse reflection is view-independent which further simplifies its evaluation. If the surface layer generates a very strong specular reflection then little or no energy may penetrate the surface thus not all materials exhibit inner-scattering. Metals, for example, often demonstrate this characteristic.\n          This parameter will be used only for REFRACTION part of the ray-surface interaction.";
const char* KSpecularRefrDesc 		= "A specular component of the materials color. It is responsible for sharp mirror-like reflection from a surface. Specular reflection occurs on the surface of the material and is view-dependent. This component of a BRDF is closer to the concept of reflected energy as, unlike diffuse reflection, it hasn’t been absorbed by the material before being reflected. This parameter will be used only for REFRACTION part of the ray-surface interaction.";
const char* KShininessRefrDesc		= "A shininess of the material. It is the coefficient of specular reflectivity associated with the surface of an object being displayed. This parameter will be used only for REFRACTION part of the ray-surface interaction.";
const char* KRefractionDesc			= "A refraction coefficient of the material also known as transmittance. Possible values are between 0.0 and 1.0. It represents how much of incoming illumination is refracted into the material.\n          The amount of light reflected and refracted at an interface is a function of the wavelength of the incident light, the geometry of the surface and light, and the angle of incidence. These efects are summarized by a set of formulas known as Fresnel's formulae.";
const char* KIORDesc		    	= "The refractive index or index of refraction of a substance is a measure of the speed of light in that substance. It is expressed as a ratio of the speed of light in vacuum relative to that in the considered medium.\n          For example, the refractive index of water is 1.33, meaning that in a vacuum, light travels 1.33 times as fast as it does in water. As light exits a medium, such as air, water, or glass, it may also change its propagation direction in proportion to the refractive index (see Snell's law).\n          By measuring the angle of incidence and angle of refraction of the light beam, the refractive index n can be determined. Refractive index of materials varies with the frequency of radiated light. This results in a slightly different refractive index for each color.";
const char* KExtinctionCoefDesc		= "In physics, the \"extinction coefficient\" is the imaginary part of the complex index of refraction, which also relates to light absorption.\n          Real materials has comples index of refraction n' = n + i*k, where real part of the refractive index n indicates the phase speed, while the imaginary part k (extinction coefficient) indicates the amount of absorption loss when the electromagnetic wave propagates through the material. Both n and k are dependent on the frequency (wavelength). In most circumstances k > 0 (light is absorbed) or k = 0 (light travels forever without loss). In special situations, especially lasers, it is also possible that k < 0 (light is amplified).";
const char* KMaxPhongDesc			= "MaxPhong refers to the albedo pumping correction. Examining the albedo functions of the plausible Phong and Blinn models, we can realize that they are too small for higher incident angles, thus they cannot provide, for example, metallic appearance. For this reason, additional correction was proposed.\n          With this option turned on, specular component of the BRDF model will be pumped(multiplied) by the max(cos(incident direction),cos(light direction)). For more info, see description of the model.";
const char* KMaxWardDesc			= "MaxWard refers to the albedo pumping correction. Examining the albedo functions of the plausible Ward model, we can realize that they are too small for higher incident angles, thus they cannot provide, for example, metallic appearance. For this reason, additional correction was proposed.\n          With this option turned on, sqrt(cos(incident direction) * cos(light direction)) term of the BRDF's specular component will be substituted by the max(cos(incident direction),cos(light direction)). For more info, see description of the model.";
const char* KMaxLafDesc				= "MaxLafortune refers to the albedo pumping correction. Examining the albedo functions of the plausible Lafortune model, we can realize that they are too small for higher incident angles, thus they cannot provide, for example, metallic appearance. For this reason, additional correction was proposed.\n          With this option turned on, specular component of the BRDF model will be pumped(multiplied) by the max(cos(incident direction),cos(light direction)). For more info, see description of the model.";
const char* KBlinnNormalsDesc		= "When the angle between viewing direction and outgoing direction is greater than 90 degrees, it is not modeled correctly by Phong shading model. The Blinn model uses a different set of vectors for its computations, one that are less than 90 degrees in all valid cases and it requires computing the half-angle vector. The half-angle vector is the direction halfway between the view direction and the light direction.\n          By the turning this option on, Blinn's vectors for computation will be used instead of classic Phong ones resulting into better results, when angle between the outgoing direction and viewing direction exceeds 90 degrees.";
const char* KRetroReflectiveDesc 	= "Use brdf for retro-reflective materials. Retro-reflective BRDF has the maximum at the direction of the incident illumination. For retro-reflective materials, mirror direction vector R should be replaced by the illumination direction L. Retro-reflection occurs when the incident energy is reflected in direction close to the incident direction, over a wide range of incident directions. Practical examples of retro-reflective objects are a projection screen, a traffic sign, etc.\n          For more info, see [Neumann, \"Compact Metallic Reflectance Models\", EUROGRAPHICS, 1999]";
const char* KSlopeDesc	 			= "Standard deviation of the surface slope of the material. This parameter is a measure of the roughness of a surface. The assumption is that a surface is made up of tiny microfacets that reflect in a specular fashion. For a mirrorlike surface, all the microfacets line up with the surface. For a rougher surface, some random orientation of these microfacets causes the specular highlight to spread out more.\n          Setting up this parameter means setting up the vector of the standard deviation. For isotropic BSDF models, standard slope deviation of the microfacets in both X and Y directions is the same.\n          Value in radians (0-Pi/2)"; 
const char* KSlopeXDesc 	    	= "Standard deviation of the surface slope of the material in the X direction (tangent to the surface). This parameter is a measure of the roughness of a surface in the direction of the tangent to the surface. The assumption is that a surface is made up of tiny microfacets that reflect in a specular fashion. For a mirrorlike surface, all the microfacets line up with the surface. For a rougher surface, some random orientation of these microfacets causes the specular highlight to spread out more.\n          Setting up this parameter means setting up the vector of the standard deviation. Together with slope in Y direction, sum of their weight has to be equal to 1.0. Change of weights which will cause this sum to be more or less than 1.0 will be automatically trimmed to make sum of all weights being equal to 1.0.\n          Value in radians (0-Pi/2)";
const char* KSlopeYDesc  			= "Standard deviation of the surface slope of the material in the Y direction (direction perpendicular to the surface tangent and surface normal). This parameter is a measure of the roughness of a surface in the direction of the surface binormal. The assumption is that a surface is made up of tiny microfacets that reflect in a specular fashion. For a mirrorlike surface, all the microfacets line up with the surface. For a rougher surface, some random orientation of these microfacets causes the specular highlight to spread out more.\n          Setting up this parameter means setting up the vector of the standard deviation. Together with slope in X direction, sum of their weight has to be equal to 1.0. Change of weights which will cause this sum to be more or less than 1.0 will be automatically trimmed to make sum of all weights being equal to 1.0.\n          Value in radians (0-Pi/2)";
const char* KVolumeDesc				= "A volume color of the material. In Beard Maxwell model, reflected light is the result of only two physical occurrences. Light is reflected off one of the micro-facets (first surface reflectance - specular) and light is scattered out of the surface after having first entered the sub-surface medium (volumetric reflectance).";
const char* KFresnelDesc			= "The Fresnel term calculates the ratio between reflected and refracted rays in function of the angle between the incident ray and the normal of the point where the ray hits the transparent object.\n          If you shoot several rays of light to a refractive (transparent) object, then some of the rays will be reflected and others will be refracted. On the other hand, reflective surfaces become more and more reflective as the angle of view approaches a grazing angle. Even a partially reflective surface theoretically becomes 100% reflective when the angle of view is parallel to the surface.";
const char* KLobeDesc				= "A cosine lobe. Each cosine lobe can be set manually to create its own lobe of the BRDF. Settings up the cosine lobe means setting up the vector, where the lobe has its maximum. Coordinates of the lobe are related to the local coordinate system, aligned to the normal and to the principal directions of anisotropy, if any.";
const char* KSchlickApproxDesc 		= "Fresnel equations are computational expensive and for amount of rendering applications a simple approximation could be enough. Schlick developed such an accurate approximation for dielectrics with the almost identical results. Turning this option on, rendering should be faster, but not 100% exact.";
const char* KAnisotropyDesc 		= "Anisotropy is the property of being directionally dependent, as opposed to isotropy, which implies identical properties in all directions. It can be defined as a difference, when measured along different axes, in a material's physical or mechanical properties (absorbance, refractive index, conductivity, tensile strength, etc.)\n          An example of an anisotropic material is wood, which is easier to split along its grain than against it. In the field of computer graphics, an anisotropic surface will change in appearance as it is rotated about its geometric normal, as is the case with velvet. Therefore, if 2 slopes are specified and parameter anisotropic is true, model is considered as anisotropic and slopes are oriented along the tangent and binormal directions. Otherwise, model is considered isotropic and slopes are oriented in random directions.";
const char* KSlopeONDesc	 		= "Standard deviation of the surface slope of the material. This parameter is a measure of the roughness of a surface. The assumption is that a surface is made up of tiny microfacets that reflect in a specular fashion. For a mirrorlike surface, all the microfacets line up with the surface. For a rougher surface, some random orientation of these microfacets causes the specular highlight to spread out more.\n          Through this parameter, standard deviation (in radians : 0 - Pi/2) of the angle between microfacet normals and the surface normal is set. So slope = 0 (all facets facing `upwards') should yield a perfect diffuse reflector - and indeed the Oren-Nayar model reduces to Lambert's model in this case.";
const char* KAlphaDesc	 			= "Alpha is non-linear specular lobe parameter, which optimizes shadowing/masking term for particular materials.\n          Shadowing/masking term is used for energy conservation of BRDF model. Shadowing/masking term is used e.g. in Cook-Torrance, Asikhmin-Shirley or Ward model. However, they are not optimized for one material and do not vary from material to material. Kurt-Kalos BRDF optimizes this shadowing/masking term for target material with an additional alpha parameter. In this way, it more closely matches the measured BRDF data than existing BRDF models. Alpha has to be set by the user according to other BRDF parameters (standard deviations of surface slopes) to keep energy conservation.\n          Usual value i between 0.0 - 1.0. For more info see alpha parameter in detailed BRDF description.";
const char* KLimbDarkDesc	 		= "This is non-linear limb darkening parameter, which controls extra lightening towards the horizons.\n          Note that for k=1 the BRDF is Lambertian (see detailed description of the model for more info).";
const char* KLayerDesc	 			= "Layer of the surface. Layer is material of defined non-zero thickness and wavelength dependent absorbtion.";

}

__END_BRDFLIB_SOURCE

#endif // __STRINGS_H__
