00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OGRE 00004 (Object-oriented Graphics Rendering Engine) 00005 For the latest info, see http://www.ogre3d.org/ 00006 00007 Copyright (c) 2000-2013 Torus Knot Software Ltd 00008 00009 Permission is hereby granted, free of charge, to any person obtaining a copy 00010 of this software and associated documentation files (the "Software"), to deal 00011 in the Software without restriction, including without limitation the rights 00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00013 copies of the Software, and to permit persons to whom the Software is 00014 furnished to do so, subject to the following conditions: 00015 00016 The above copyright notice and this permission notice shall be included in 00017 all copies or substantial portions of the Software. 00018 00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00025 THE SOFTWARE. 00026 ----------------------------------------------------------------------------- 00027 */ 00028 #ifndef __GLSLProgramCommon_H__ 00029 #define __GLSLProgramCommon_H__ 00030 00031 #include "OgreGL3PlusPrerequisites.h" 00032 #include "OgreGpuProgram.h" 00033 #include "OgreHardwareVertexBuffer.h" 00034 #include "OgreGL3PlusHardwareUniformBuffer.h" 00035 #include "OgreGL3PlusVertexArrayObject.h" 00036 00037 namespace Ogre { 00038 00039 class GLSLGpuProgram; 00040 00042 struct GLUniformReference 00043 { 00045 GLint mLocation; 00047 GpuProgramType mSourceProgType; 00049 const GpuConstantDefinition* mConstantDef; 00050 }; 00051 00052 typedef vector<GLUniformReference>::type GLUniformReferenceList; 00053 typedef GLUniformReferenceList::iterator GLUniformReferenceIterator; 00054 typedef vector<HardwareUniformBufferSharedPtr>::type GLUniformBufferList; 00055 typedef GLUniformBufferList::iterator GLUniformBufferIterator; 00056 00061 class _OgreGL3PlusExport GLSLProgramCommon 00062 { 00063 protected: 00065 GLUniformReferenceList mGLUniformReferences; 00066 00068 GLUniformBufferList mGLUniformBufferReferences; 00069 00071 GLSLGpuProgram* mVertexProgram; 00073 GLSLGpuProgram* mFragmentProgram; 00075 GLSLGpuProgram* mGeometryProgram; 00077 GLSLGpuProgram* mHullProgram; 00079 GLSLGpuProgram* mDomainProgram; 00081 GLSLGpuProgram* mComputeProgram; 00083 GL3PlusVertexArrayObject *mVertexArrayObject; 00084 00086 bool mUniformRefsBuilt; 00088 GLuint mGLProgramHandle; 00090 GLint mLinked; 00092 bool mTriedToLinkAndFailed; 00094 bool mSkeletalAnimation; 00095 00097 void buildGLUniformReferences(void); 00098 typedef set<GLuint>::type AttributeSet; 00099 00101 GLint mCustomAttributesIndexes[VES_COUNT][OGRE_MAX_TEXTURE_COORD_SETS]; 00103 #define NULL_CUSTOM_ATTRIBUTES_INDEX -2 00104 00105 #define NOT_FOUND_CUSTOM_ATTRIBUTES_INDEX -1 00106 00107 Ogre::String getCombinedName(void); 00109 void getMicrocodeFromCache(void); 00111 virtual void compileAndLink(void) = 0; 00113 virtual void _useProgram(void) = 0; 00114 00115 typedef map<String, VertexElementSemantic>::type SemanticToStringMap; 00116 SemanticToStringMap mSemanticTypeMap; 00117 00118 VertexElementSemantic getAttributeSemanticEnum(String type); 00119 const char * getAttributeSemanticString(VertexElementSemantic semantic); 00120 00121 public: 00123 GLSLProgramCommon(GLSLGpuProgram* vertexProgram, GLSLGpuProgram* geometryProgram, GLSLGpuProgram* fragmentProgram, GLSLGpuProgram* hullProgram, GLSLGpuProgram* domainProgram, GLSLGpuProgram* computeProgram); 00124 virtual ~GLSLProgramCommon(void); 00125 00128 virtual void activate(void) = 0; 00129 00133 virtual void updateUniforms(GpuProgramParametersSharedPtr params, uint16 mask, GpuProgramType fromProgType) = 0; 00137 virtual void updateUniformBlocks(GpuProgramParametersSharedPtr params, uint16 mask, GpuProgramType fromProgType) = 0; 00141 virtual void updatePassIterationUniforms(GpuProgramParametersSharedPtr params) = 0; 00143 virtual void extractLayoutQualifiers(void); 00145 GLuint getGLProgramHandle(void) const { return mGLProgramHandle; } 00152 void setSkeletalAnimationIncluded(bool included) { mSkeletalAnimation = included; } 00153 00160 bool isSkeletalAnimationIncluded(void) const { return mSkeletalAnimation; } 00161 00163 virtual GLint getAttributeIndex(VertexElementSemantic semantic, uint index); 00165 bool isAttributeValid(VertexElementSemantic semantic, uint index); 00166 00167 GLSLGpuProgram* getVertexProgram() const { return mVertexProgram; } 00168 GLSLGpuProgram* getFragmentProgram() const { return mFragmentProgram; } 00169 GLSLGpuProgram* getGeometryProgram() const { return mGeometryProgram; } 00170 GLSLGpuProgram* getHullProgram() const { return mHullProgram; } 00171 GLSLGpuProgram* getDomainProgram() const { return mDomainProgram; } 00172 GLSLGpuProgram* getComputeProgram() const { return mComputeProgram; } 00173 GL3PlusVertexArrayObject* getVertexArrayObject() { return mVertexArrayObject; } 00174 }; 00175 } 00176 00177 #endif // __GLSLProgramCommon_H__
Copyright © 2012 Torus Knot Software Ltd

This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Mon Jul 27 2020 13:40:43