123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- //-----------------------------------------------------------------------------
- // Copyright (c) 2012 GarageGames, LLC
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to
- // deal in the Software without restriction, including without limitation the
- // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- // sell copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- // IN THE SOFTWARE.
- //-----------------------------------------------------------------------------
- #ifndef _MATERIALS_PROCESSEDSHADERMATERIAL_H_
- #define _MATERIALS_PROCESSEDSHADERMATERIAL_H_
- #ifndef _MATERIALS_PROCESSEDMATERIAL_H_
- #include "processedMaterial.h"
- #endif
- #ifndef _GFXSHADER_H_
- #include "gfx/gfxShader.h"
- #endif
- #ifndef CUSTOMSHADERBINDINGDATA_H
- #include "materials/customShaderBindingData.h"
- #endif
- class GenericConstBufferLayout;
- class ShaderData;
- class LightInfo;
- class ShaderMaterialParameterHandle;
- class ShaderFeatureConstHandles;
- class CustomMaterial;
- class ShaderConstHandles
- {
- public:
- GFXShaderConstHandle* mDiffuseColorSC;
- GFXShaderConstHandle* mToneMapTexSC;
- GFXShaderConstHandle* mTexMatSC;
- GFXShaderConstHandle* mORMConfigSC;
- GFXShaderConstHandle* mRoughnessSC;
- GFXShaderConstHandle* mMetalnessSC;
- GFXShaderConstHandle* mGlowMulSC;
- GFXShaderConstHandle* mParallaxInfoSC;
- GFXShaderConstHandle* mAccuScaleSC;
- GFXShaderConstHandle* mAccuDirectionSC;
- GFXShaderConstHandle* mAccuStrengthSC;
- GFXShaderConstHandle* mAccuCoverageSC;
- GFXShaderConstHandle* mAccuSpecularSC;
- GFXShaderConstHandle* mFogDataSC;
- GFXShaderConstHandle* mFogColorSC;
- GFXShaderConstHandle* mDetailScaleSC;
- GFXShaderConstHandle* mVisiblitySC;
- GFXShaderConstHandle* mColorMultiplySC;
- GFXShaderConstHandle* mAlphaTestValueSC;
- GFXShaderConstHandle* mModelViewProjSC;
- GFXShaderConstHandle* mWorldViewOnlySC;
- GFXShaderConstHandle* mWorldToCameraSC;
- GFXShaderConstHandle* mCameraToWorldSC;
- GFXShaderConstHandle* mWorldToObjSC;
- GFXShaderConstHandle* mViewToObjSC;
- GFXShaderConstHandle* mInvCameraTransSC;
- GFXShaderConstHandle* mCameraToScreenSC;
- GFXShaderConstHandle* mScreenToCameraSC;
- GFXShaderConstHandle* mCubeTransSC;
- GFXShaderConstHandle* mCubeMipsSC;
- GFXShaderConstHandle* mObjTransSC;
- GFXShaderConstHandle* mCubeEyePosSC;
- GFXShaderConstHandle* mEyePosSC;
- GFXShaderConstHandle* mEyePosWorldSC;
- GFXShaderConstHandle* m_vEyeSC;
- GFXShaderConstHandle* mEyeMatSC;
- GFXShaderConstHandle* mOneOverFarplane;
- GFXShaderConstHandle* mAccumTimeSC;
- GFXShaderConstHandle* mDampnessSC;
- GFXShaderConstHandle* mMinnaertConstantSC;
- GFXShaderConstHandle* mSubSurfaceParamsSC;
- GFXShaderConstHandle* mDiffuseAtlasParamsSC;
- GFXShaderConstHandle* mBumpAtlasParamsSC;
- GFXShaderConstHandle* mDiffuseAtlasTileSC;
- GFXShaderConstHandle* mBumpAtlasTileSC;
- GFXShaderConstHandle *mRTSizeSC;
- GFXShaderConstHandle *mOneOverRTSizeSC;
- GFXShaderConstHandle* mDetailBumpStrength;
- GFXShaderConstHandle* mViewProjSC;
- GFXShaderConstHandle *mImposterUVs;
- GFXShaderConstHandle *mImposterLimits;
- // Deferred Shading : Material Info Flags
- GFXShaderConstHandle* mMatInfoFlagsSC;
- GFXShaderConstHandle* mTexHandlesSC[Material::MAX_TEX_PER_PASS];
- GFXShaderConstHandle* mRTParamsSC[GFX_TEXTURE_STAGE_COUNT];
- GFXShaderConstHandle* mNodeTransforms;
- struct customHandleData
- {
- StringTableEntry handleName;
- GFXShaderConstHandle* handle;
- };
- Vector<customHandleData> mCustomHandles;
- void init( GFXShader* shader, CustomMaterial* mat = NULL);
-
- };
- class ShaderRenderPassData : public RenderPassData
- {
- typedef RenderPassData Parent;
- public:
- virtual ~ShaderRenderPassData() { reset(); }
- GFXShaderRef shader;
- ShaderConstHandles shaderHandles;
- Vector<ShaderFeatureConstHandles*> featureShaderHandles;
- virtual void reset();
- virtual String describeSelf() const;
- };
- class ProcessedShaderMaterial : public ProcessedMaterial
- {
- typedef ProcessedMaterial Parent;
- public:
- ProcessedShaderMaterial();
- ProcessedShaderMaterial(Material &mat);
- ~ProcessedShaderMaterial();
- // ProcessedMaterial
- virtual bool init( const FeatureSet &features,
- const GFXVertexFormat *vertexFormat,
- const MatFeaturesDelegate &featuresDelegate );
- virtual bool setupPass(SceneRenderState *, const SceneData& sgData, U32 pass);
- virtual void setTextureStages(SceneRenderState *, const SceneData &sgData, U32 pass );
- virtual void setTransforms(const MatrixSet &matrixSet, SceneRenderState *state, const U32 pass);
- virtual void setNodeTransforms(const MatrixF *address, const U32 numTransforms, const U32 pass);
- virtual void setCustomShaderData(Vector<CustomShaderBindingData> &shaderData, const U32 pass);
- virtual void setSceneInfo(SceneRenderState *, const SceneData& sgData, U32 pass);
- virtual void setBuffers(GFXVertexBufferHandleBase* vertBuffer, GFXPrimitiveBufferHandle* primBuffer);
- virtual bool stepInstance();
- virtual void dumpMaterialInfo();
- virtual void getMaterialInfo(GuiTreeViewCtrl* tree, U32 item);
- virtual MaterialParameters* allocMaterialParameters();
- virtual MaterialParameters* getDefaultMaterialParameters() { return mDefaultParameters; }
- virtual MaterialParameterHandle* getMaterialParameterHandle(const String& name);
- virtual U32 getNumStages();
- protected:
- Vector<GFXShaderConstDesc> mShaderConstDesc;
- MaterialParameters* mDefaultParameters;
- Vector<ShaderMaterialParameterHandle*> mParameterHandles;
- /// Hold the instancing state data for the material.
- class InstancingState
- {
- const static U32 COUNT = 200;
- public:
- InstancingState()
- : mInstFormat( NULL ),
- mBuffer( NULL ),
- mCount( -1 )
- {
- }
- ~InstancingState()
- {
- delete [] mBuffer;
- }
- void setFormat( const GFXVertexFormat *instFormat, const GFXVertexFormat *vertexFormat )
- {
- mInstFormat = instFormat;
- mDeclFormat.copy( *vertexFormat );
- mDeclFormat.append( *mInstFormat, 1 );
- // Let the declaration know we have instancing.
- mDeclFormat.enableInstancing();
- mDeclFormat.getDecl();
- delete [] mBuffer;
- mBuffer = new U8[ mInstFormat->getSizeInBytes() * COUNT ];
- mCount = -1;
- }
- bool step( U8 **outPtr )
- {
- // Are we starting a new draw call?
- if ( mCount < 0 )
- {
- *outPtr = mBuffer;
- mCount = 0;
- }
- else
- {
- // Increment to the next instance.
- *outPtr += mInstFormat->getSizeInBytes();
- mCount++;
- }
- return mCount < COUNT;
- }
- void resetStep() { mCount = -1; }
- U8* getBuffer() const { return mBuffer; }
- S32 getCount() const { return mCount; }
- const GFXVertexFormat* getFormat() const { return mInstFormat; }
- const GFXVertexFormat* getDeclFormat() const { return &mDeclFormat; }
- protected:
- GFXVertexFormat mDeclFormat;
- const GFXVertexFormat *mInstFormat;
- U8 *mBuffer;
- S32 mCount;
- };
- /// The instancing state if this material
- /// supports instancing.
- InstancingState *mInstancingState;
-
- /// @name Internal functions
- ///
- /// @{
- /// Adds a pass for the given stage.
- virtual bool _addPass( ShaderRenderPassData &rpd,
- U32 &texIndex,
- MaterialFeatureData &fd,
- U32 stageNum,
- const FeatureSet &features);
- /// Chooses a blend op for the given pass
- virtual void _setPassBlendOp( ShaderFeature *sf,
- ShaderRenderPassData &passData,
- U32 &texIndex,
- MaterialFeatureData &stageFeatures,
- U32 stageNum,
- const FeatureSet &features);
- /// Creates passes for the given stage
- virtual bool _createPasses( MaterialFeatureData &fd, U32 stageNum, const FeatureSet &features );
- /// Fills in the MaterialFeatureData for the given stage
- virtual void _determineFeatures( U32 stageNum,
- MaterialFeatureData &fd,
- const FeatureSet &features );
- /// Do we have a cubemap on pass?
- virtual bool _hasCubemap(U32 pass);
- /// Used by setTextureTransforms
- F32 _getWaveOffset( U32 stage );
- /// Sets texture transformation matrices for texture animations such as scale and wave
- virtual void _setTextureTransforms(const U32 pass);
- /// Sets all of the necessary shader constants for the given pass
- virtual void _setShaderConstants(SceneRenderState *, const SceneData &sgData, U32 pass);
- /// @}
- void _setPrimaryLightConst(const LightInfo* light, const MatrixF& objTrans, const U32 stageNum);
- /// This is here to deal with the differences between ProcessedCustomMaterials and ProcessedShaderMaterials.
- public:
- virtual GFXShaderConstBuffer* _getShaderConstBuffer(const U32 pass);
- virtual ShaderConstHandles* _getShaderConstHandles(const U32 pass);
- protected:
- ///
- virtual void _initMaterialParameters();
- ShaderRenderPassData* _getRPD(const U32 pass) { return static_cast<ShaderRenderPassData*>(mPasses[pass]); }
- };
- #endif // _MATERIALS_PROCESSEDSHADERMATERIAL_H_
|