#pragma once

#include "GLSLShader.h"
#include "VectorFwd.h"
#include "Mat4Fwd.h"

namespace Aftr
{
   class Model;

   class GLSLShaderDefaultOrthoWOGUI_GL32_GL_REDtoLuminance : public GLSLShader
   {
   public:
      static GLSLShaderDefaultOrthoWOGUI_GL32_GL_REDtoLuminance* New();
      virtual ~GLSLShaderDefaultOrthoWOGUI_GL32_GL_REDtoLuminance();
      virtual void bind( const Mat4& MVPMatrix, const ModelMeshSkin& skin );
      virtual void bind() const override;

      GLSLShaderDefaultOrthoWOGUI_GL32_GL_REDtoLuminance& operator=( const GLSLShaderDefaultOrthoWOGUI_GL32_GL_REDtoLuminance& shader );
     
      void setTex0Matrix( const Mat4& tex0Matrix ) const;
      void setMVPMatrix( const Mat4& mvpMatrix ) const;
      void setMaterialAmbient( const aftrColor4f& materialAmbient ) const;
      void setMaterialDiffuse( const aftrColor4f& materialDiffuse ) const;
      void setMaterialSpecular( const aftrColor4f&  materialSpecular ) const;
      void setSpecularCoefficient( const float specularCoefficient ) const;

      /**
      Returns a copy of this instance. This is identical to invoking the copy constructor with
      the addition that this preserves the polymorphic type. That is, if this was a subclass
      of GLSLShader with additional members and methods, this will internally create the
      shader instance as that subclass, thereby preserving polymorphic behavior, members, and
      methods.

      This is in contrast with a copy constructor in the case where one performs:
      GLSLShader* myCopy = new GLSLShader( shaderToBeCopied );
      This will always create a GLSLShader* instance, not a subclass corresponding to the exact
      type of shaderToBeCopied.
      */
      virtual GLSLShader* getCopyOfThisInstance() override;
   protected:
      GLSLShaderDefaultOrthoWOGUI_GL32_GL_REDtoLuminance( GLSLShaderDataShared* dataShared );
      GLSLShaderDefaultOrthoWOGUI_GL32_GL_REDtoLuminance( const GLSLShaderDefaultOrthoWOGUI_GL32_GL_REDtoLuminance& );
   };
}

