/* * Copyright 2010 Inalogic® Inc. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License, as * published by the Free Software Foundation; either version 2.1 or 3.0 * of the License. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR * PURPOSE. See the applicable version of the GNU Lesser General Public * License for more details. * * You should have received a copy of both the GNU Lesser General Public * License along with this program. If not, see * * Authored by: Jay Taoko * */ #ifndef IOPENGLASMSHADER_H #define IOPENGLASMSHADER_H namespace nux { typedef enum { VTXATTRIB_INVALID = -1, VTXATTRIB_POSITION = 0, VTXATTRIB_WEIGHT = 1, VTXATTRIB_NORMAL = 2, VTXATTRIB_COLOR = 3, VTXATTRIB_COLOR_PRIMARY = 3, VTXATTRIB_COLOR_SECONDARY = 4, VTXATTRIB_FOGCOORD = 5, VTXATTRIB_TEXCOORD = 8, VTXATTRIB_TEXCOORD0 = 8, VTXATTRIB_TEXCOORD1 = 9, VTXATTRIB_TEXCOORD2 = 10, VTXATTRIB_TEXCOORD3 = 11, VTXATTRIB_TEXCOORD4 = 12, VTXATTRIB_TEXCOORD5 = 13, VTXATTRIB_TEXCOORD6 = 14, VTXATTRIB_TEXCOORD7 = 15, } VtxAttributeIndex; class IOpenGLResource; class IOpenGLAsmShader: public IOpenGLResource { NUX_DECLARE_OBJECT_TYPE (IOpenGLAsmShader, IOpenGLResource); IOpenGLAsmShader (NString ShaderName, OpenGLResourceType ResourceType); virtual ~IOpenGLAsmShader(); public: virtual void SetShaderCode (const ANSICHAR *ShaderCode) = 0; virtual bool Compile() = 0; virtual bool IsValid() = 0; NString _ShaderName; NString _ShaderCode; }; class IOpenGLAsmVertexShader: public IOpenGLAsmShader { NUX_DECLARE_OBJECT_TYPE (IOpenGLAsmVertexShader, IOpenGLAsmShader); public: virtual ~IOpenGLAsmVertexShader(); virtual void SetShaderCode (const ANSICHAR *ShaderCode); virtual bool Compile(); virtual bool IsValid(); private: IOpenGLAsmVertexShader (NString ShaderName = NString ("VertexProgram") ); bool m_CompiledAndReady; friend class GpuDevice; }; class IOpenGLAsmPixelShader: public IOpenGLAsmShader { NUX_DECLARE_OBJECT_TYPE (IOpenGLAsmPixelShader, IOpenGLAsmShader); public: virtual ~IOpenGLAsmPixelShader(); virtual void SetShaderCode (const ANSICHAR *ShaderCode); virtual bool Compile(); virtual bool IsValid(); private: IOpenGLAsmPixelShader (NString ShaderName = NString ("PixelProgram") ); bool m_CompiledAndReady; friend class GpuDevice; }; class IOpenGLAsmShaderProgram: public IOpenGLResource { NUX_DECLARE_OBJECT_TYPE (IOpenGLAsmShaderProgram, IOpenGLResource); public: virtual ~IOpenGLAsmShaderProgram(); void LoadVertexShader (const TCHAR *glslshader); void LoadPixelShader (const TCHAR *glslshader); void LoadIShaderFile (const TCHAR *ShaderFileName); void LoadIShader (const TCHAR *ShaderCode); void Link(); bool IsValid(); void Begin(); void End(); void SetVertexEnvParameter4dARB (t_uint32 index, double x, double y, double z, double w); void SetVertexEnvParameter4dvARB (t_uint32 index, const double *params); void SetVertexEnvParameter4fARB (t_uint32 index, float x, float y, float z, float w); void SetVertexEnvParameter4fvARB (t_uint32 index, const float *params); void SetVertexLocalParameter4dARB (t_uint32 index, double x, double y, double z, double w); void SetVertexLocalParameter4dvARB (t_uint32 index, const double *params); void SetVertexLocalParameter4fARB (t_uint32 index, float x, float y, float z, float w); void SetVertexLocalParameter4fvARB (t_uint32 index, const float *params); void SetFragmentEnvParameter4dARB (t_uint32 index, double x, double y, double z, double w); void SetFragmentEnvParameter4dvARB (t_uint32 index, const double *params); void SetFragmentEnvParameter4fARB (t_uint32 index, float x, float y, float z, float w); void SetFragmentEnvParameter4fvARB (t_uint32 index, const float *params); void SetFragmentLocalParameter4dARB (t_uint32 index, double x, double y, double z, double w); void SetFragmentLocalParameter4dvARB (t_uint32 index, const double *params); void SetFragmentLocalParameter4fARB (t_uint32 index, float x, float y, float z, float w); void SetFragmentLocalParameter4fvARB (t_uint32 index, const float *params); private: IOpenGLAsmShaderProgram (NString ShaderProgramName = NString ("AsmShaderProgram") ); std::vector > ShaderObjectList; NString _ShaderProgramName; ObjectPtr m_AsmVertexProgram; ObjectPtr m_AsmFragmentProgram; friend class GpuDevice; }; } #endif // IOPENGLASMSHADER_H