fbshader.h

Go to the documentation of this file.
00001 #ifndef _FB_SHADER_H_
00002 #define _FB_SHADER_H_
00003 /**************************************************************************
00004 Copyright (c) 1994 - 2009 Autodesk, Inc. and/or its licensors.
00005 All Rights Reserved.
00006 
00007 The coded instructions, statements, computer programs, and/or related 
00008 material (collectively the "Data") in these files contain unpublished 
00009 information proprietary to Autodesk, Inc. and/or its licensors, which is 
00010 protected by Canada and United States of America federal copyright law 
00011 and by international treaties.
00012 
00013 The Data may not be disclosed or distributed to third parties, in whole 
00014 or in part, without the prior written consent of Autodesk, Inc. 
00015 ("Autodesk").
00016 
00017 THE DATA IS PROVIDED "AS IS" AND WITHOUT WARRANTY.
00018 ALL WARRANTIES ARE EXPRESSLY EXCLUDED AND DISCLAIMED. AUTODESK MAKES NO 
00019 WARRANTY OF ANY KIND WITH RESPECT TO THE DATA, EXPRESS, IMPLIED OR 
00020 ARISING BY CUSTOM OR TRADE USAGE, AND DISCLAIMS ANY IMPLIED WARRANTIES 
00021 OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR 
00022 PURPOSE OR USE. WITHOUT LIMITING THE FOREGOING, AUTODESK DOES NOT 
00023 WARRANT THAT THE OPERATION OF THE DATA WILL BE UNINTERRUPTED OR ERROR 
00024 FREE.
00025 
00026 IN NO EVENT SHALL AUTODESK, ITS AFFILIATES, PARENT COMPANIES, LICENSORS 
00027 OR SUPPLIERS ("AUTODESK GROUP") BE LIABLE FOR ANY LOSSES, DAMAGES OR 
00028 EXPENSES OF ANY KIND (INCLUDING WITHOUT LIMITATION PUNITIVE OR MULTIPLE 
00029 DAMAGES OR OTHER SPECIAL, DIRECT, INDIRECT, EXEMPLARY, INCIDENTAL, LOSS 
00030 OF PROFITS, REVENUE OR DATA, COST OF COVER OR CONSEQUENTIAL LOSSES OR 
00031 DAMAGES OF ANY KIND), HOWEVER CAUSED, AND REGARDLESS OF THE THEORY OF 
00032 LIABILITY, WHETHER DERIVED FROM CONTRACT, TORT (INCLUDING, BUT NOT 
00033 LIMITED TO, NEGLIGENCE), OR OTHERWISE, ARISING OUT OF OR RELATING TO THE 
00034 DATA OR ITS USE OR ANY OTHER PERFORMANCE, WHETHER OR NOT AUTODESK HAS 
00035 BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE.
00036 
00037 **************************************************************************/
00038 
00045 #include <kaydaradef.h>
00046 #ifndef FBSDK_DLL 
00047 
00050 #define FBSDK_DLL K_DLLIMPORT
00051 #endif
00052 
00053 #include <fbsdk/fbcomponent.h>
00054 #include <fbsdk/fbcore.h>
00055 
00056 K_FORWARD( KRenderOptions );
00057 K_FORWARD( KModelRenderInfo );
00058 K_FORWARD( KShaderModelInfo );
00059 
00060 #ifdef FBSDKUseNamespace
00061 namespace FBSDKNamespace {
00062 #endif
00063 
00071 #define FBRegisterShader( UniqueNameStr, ClassName, Label, Description, IconFilename ) \
00072     HIObject RegisterShader##ClassName( HIObject /*pOwner*/,const char* pName,void * /*pData*/) \
00073     { \
00074     ClassName *Class = new ClassName( pName ); \
00075     Class->UniqueName = UniqueNameStr; \
00076     Class->ShaderDescription = Description; \
00077     if (Class->FBCreate()) { \
00078     return Class->GetHIObject(); \
00079     } else { \
00080     delete Class; \
00081     return NULL; \
00082     } \
00083 } \
00084     FBLibraryModule( ClassName )    \
00085     {   \
00086     FBRegisterObject( ClassName##R1,"renderer/usershader/ogl",Label,Description,RegisterShader##ClassName,true, IconFilename ); \
00087     FBRegisterObject( ClassName##R2,"FbxStorable/Shader",UniqueNameStr,Description,RegisterShader##ClassName,true, IconFilename );  \
00088 }
00089 
00094 #define FBShaderDeclare( ClassName, Parent  ) \
00095     FBClassDeclare( ClassName,Parent); \
00096 public: \
00097     ClassName(const char* pName):Parent(pName) { FBClassInit; } \
00098 private:
00099 
00103 #define FBShaderImplementation( ThisComponent ) \
00104     FBClassImplementation( ThisComponent )
00105 
00107     // FBShaderManager
00109     FB_FORWARD( FBShaderManager );
00110     FB_FORWARD( FBShader );
00111     FB_FORWARD( FBMaterial );
00112     FB_FORWARD( FBCamera );
00113 
00221     class FBSDK_DLL FBShaderManager
00222     {
00227         FBShaderManager( const FBShaderManager& );
00228 
00233         FBShaderManager& operator=( const FBShaderManager& );
00234 
00235     public:
00236 
00238         FBShaderManager();
00239 
00245         ~FBShaderManager();
00246 
00258         HFBShader CreateShader( const char* pShaderTypeName );
00259 
00268         FBStringList ShaderTypeNames;
00269 
00291         FBStringList ShaderTypeNamesLocalized;
00292     };
00293 
00294 
00296     // FBShader - Shader layer on top of internals.
00298 
00299     FB_FORWARD( FBShaderModelInfo );
00300     class FBSDK_DLL FBShaderModelInfo
00301     {
00302     public:
00303         FBShaderModelInfo(HFBShader pShader, HKModelRenderInfo pInfo, int pSubRegionIndex);
00304         virtual ~FBShaderModelInfo();
00305 
00307         virtual void UpdateModelShaderInfo(int pShader_Version);
00308 
00310         FBModel* GetFBModel() { return mFBModel; }
00311 
00313         HFBMaterial GetFBMaterial();
00314 
00315         int GetSubRegionIndex();
00316 
00318         KShaderModelInfo* GetShaderModelInfo() const { return mLocalPtr; }
00319 
00321         int GetModelVersion() const;
00322 
00324         int GetShaderVersion() const;
00325 
00327         bool GetOriginalTextureFlag() const;
00328 
00330         unsigned int GetGeometryArrayIds() const; 
00331 
00333         void SetGeometryArrayIds(unsigned int pArrayIds); 
00334 
00335     private:
00336         KShaderModelInfo* mLocalPtr;
00337         FBModel*    mFBModel;
00338     };
00339 
00341     FB_FORWARD( FBRenderOptions );
00342     class FBSDK_DLL FBRenderOptions
00343     {
00344     public:
00345         FBRenderOptions(HKRenderOptions pOptions);
00346 
00348         FBCamera* GetRenderingCamera();
00349 
00353         int GetRenderFrameId() const;
00354 
00358         bool IsIDBufferPicking() const;
00359 
00363         float GetIDBufferPickingAlphaThreshold() const;
00364 
00368         bool IsOfflineRendering() const;
00369 
00370 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00371 
00372         HKRenderOptions mRenderOptions;
00373 #endif
00374     };
00375 
00377 
00380     enum FBRenderingPass {
00381         kFBPassInvalid                  = 0,        
00382         kFBPassPreRender                = 1 << 0,   
00383         kFBPassFlat                     = 1 << 1,   
00384         kFBPassLighted                  = 1 << 2,   
00385         kFBPassMatte                    = 1 << 3,   
00386         kFBPassZTranslucent             = 1 << 4,   
00387         kFBPassZTranslucentAlphaTest    = 1 << 5,   
00388         kFBPassTranslucent              = 1 << 6,   
00389         kFBPassAddColor                 = 1 << 7,   
00390         kFBPassTranslucentZSort         = 1 << 8,   
00391         kFBPassPostRender               = 1 << 9    
00392     };
00393     FB_DEFINE_ENUM( FBSDK_DLL, RenderingPass );
00394 
00399     enum FBAlphaSource
00400     {
00401         kFBAlphaSourceNoAlpha               ,   
00402         kFBAlphaSourceAccurateAlpha         ,   
00403         kFBAlphaSourceTransluscentAlpha     ,   
00404         kFBAlphaSourceMatteAlpha            ,   
00405         kFBAlphaSource2DTransparency        ,   
00406         kFBAlphaSourceAdditiveAlpha         ,   
00407         kFBAlphaSourceTransluscentZSortAlpha,   
00408     };
00409     FB_DEFINE_ENUM( FBSDK_DLL, AlphaSource );
00410 
00413     enum FBShaderCapacity
00414     { 
00415         kFBShaderCapacityNone            = 0,
00416         kFBShaderCapacityMaterialEffect  = 1 << 0,     
00417         kFBShaderCapacityDrawInstanced   = 1 << 1,     
00418         kFBShaderCapacityDrawShadow      = 1 << 2,     
00419         kFBShaderCapactiyDrawTextureLayer= 1 << 3      
00420     };
00421     FB_DEFINE_ENUM( FBSDK_DLL, ShaderCapacity );
00422 
00426     enum FBShaderPassActionCallback
00427     {
00428         kFBShaderPassActionNone         = 0,  
00429         kFBShaderPassTypeBegin          = 1 << 0,
00430         kFBShaderPassTypeEnd            = 1 << 1,
00431         kFBShaderPassInstanceBegin      = 1 << 2, 
00432         kFBShaderPassInstanceEnd        = 1 << 3, 
00433         kFBShaderPassMaterialBegin      = 1 << 4, 
00434         kFBShaderPassMaterialEnd        = 1 << 5,
00435         kFBShaderPassGeometryBegin      = 1 << 6,
00436         kFBShaderPassGeometryEnd        = 1 << 7,
00437         kFBShaderPassModelsDraw         = 1 << 8,
00438         kFBShaderPassModelDraw          = 1 << 9
00439     };
00440     FB_DEFINE_ENUM( FBSDK_DLL, ShaderPassActionCallback );
00441 
00442     FB_FORWARD( FBRenderer );
00443     __FB_FORWARD( FBShader );
00444     FB_DEFINE_COMPONENT ( FBSDK_DLL, Shader );
00445     FB_DEFINE_LIST      ( FBSDK_DLL, Shader );
00446 
00448     class FBSDK_DLL FBShader : public FBBox
00449     {
00450         //--- Open Reality declaration.
00451         __FBClassDeclare( FBShader, FBBox );
00452 
00453     public:
00458         FBShader( const char* pName, HIObject pObject=NULL);
00459 
00460         IObject_Declare(Implementation);        // Interface to IObject.
00461 
00467         virtual HFBShaderModelInfo NewShaderModelInfo(HKModelRenderInfo pModelRenderInfo, int pSubRegionIndex);
00468 
00473         virtual void UpdateModelShaderInfo( FBRenderOptions* pOptions, HFBShaderModelInfo pInfo );
00474 
00479         virtual void DestroyShaderModelInfo( FBRenderOptions* pOptions, HFBShaderModelInfo pInfo );
00480 
00484         virtual void ReplaceAll( FBModel* pModel );
00485 
00489         virtual void Append( FBModel* pModel );
00490 
00494         virtual bool ShaderNeedBeginRender();
00495 
00501         virtual void ShaderBeginRender( FBRenderOptions* pOptions, HFBShaderModelInfo pInfo );
00502 
00508         virtual void ShadeModel( FBRenderOptions* pOptions, HFBShaderModelInfo pInfo, FBRenderingPass pPass );
00509 
00514         virtual void ShadeModelShadow(FBRenderOptions* pRenderOptions, HFBShaderModelInfo pInfo);
00515 
00520 
00526         virtual void ShaderPassTypeBegin    ( FBRenderOptions* pRenderOptions, FBRenderingPass pPass);  
00527 
00532         virtual void ShaderPassTypeEnd      ( FBRenderOptions* pRenderOptions, FBRenderingPass pPass);     
00533 
00538         virtual void ShaderPassInstanceBegin( FBRenderOptions* pRenderOptions, FBRenderingPass pPass);  
00539 
00544         virtual void ShaderPassInstanceEnd  ( FBRenderOptions* pRenderOptions, FBRenderingPass pPass);  
00545 
00551         virtual void ShaderPassMaterialBegin( FBRenderOptions* pRenderOptions, FBRenderingPass pPass, HFBShaderModelInfo pInfo);  
00552 
00558         virtual void ShaderPassMaterialEnd  ( FBRenderOptions* pRenderOptions, FBRenderingPass pPass, HFBShaderModelInfo pInfo);  
00559 
00565         virtual void ShaderPassGeometryBegin( FBRenderOptions* pRenderOptions, FBRenderingPass pPass, HFBShaderModelInfo pInfo);  
00566 
00572         virtual void ShaderPassGeometryEnd  ( FBRenderOptions* pRenderOptions, FBRenderingPass pPass, HFBShaderModelInfo pInfo);
00573     
00579         virtual void ShaderPassModelsDraw ( FBRenderOptions* pRenderOptions, FBRenderingPass pPass, const FBArrayTemplate<HFBShaderModelInfo>& pInfoArray);
00580 
00586         virtual void ShaderPassModelDraw ( FBRenderOptions* pRenderOptions, FBRenderingPass pPass, HFBShaderModelInfo pInfo);
00587 
00592         virtual void ShaderPassDrawShadowBegin( FBRenderOptions* pRenderOptions);
00593 
00597         virtual void ShaderPassDrawShadowEnd ( FBRenderOptions* pRenderOptions);
00598 
00600         FBShaderPassActionCallback   GetShaderPassActionCallback() const;
00602         void         SetShaderPassActionCallback( FBShaderPassActionCallback pCallback);
00603    
00605 
00609         virtual void CloneShaderParameter( HFBShader pNewShader );
00610 
00615         virtual void DetachDisplayContext( FBRenderOptions* pOptions, HFBShaderModelInfo pInfo );
00616 
00621         virtual bool FbxStore   (FBFbxObject* pFbxObject);
00622 
00628         virtual bool FbxRetrieve(FBFbxObject* pFbxObject, HFBRenderer pRenderer);
00629 
00630         const char* ShaderDescription;  
00631 
00633         void    InvalidateShaderVersion ();
00634 
00636         int     GetShaderVersion        ()  const;
00637 
00639         FBShaderCapacity GetShaderCapacity( ) const;
00640 
00642         bool         HasShaderCapacity    (FBShaderCapacity pCapacity);  
00643 
00647         void         SetShaderCapacity    (FBShaderCapacity pCapacity, bool pOn);
00648 
00650         int          GetDrawInstancedMaximumSize() const;
00651 
00653         void         SetDrawInstancedMaximumSize(int pMaxSize);
00654 
00659         virtual void UploadModelViewMatrixArrayForDrawInstanced(const double* pModelViewMatrixArray, int pCount);
00660 
00661 
00662     public:
00665         FBPropertyBool              Enable;
00666 
00672         FBPropertyRenderingPass     RenderingPass;
00673 
00674     protected:
00681         static FBRenderingPass GetRenderingPassNeededForAlpha(FBAlphaSource pTransparency);
00682     };
00683 
00685     // FBPropertyListShader - List of shaders
00688     class FBSDK_DLL FBPropertyListShader : public FBPropertyListComponent
00689     {
00690     public:
00691         FBPropertyListShader();
00696         FBShader* operator[](int pIndex);
00697     };
00698 
00700     // FBShaderLighted
00702     FB_FORWARD( FBShaderLighted );
00703     FB_DEFINE_COMPONENT( FBSDK_DLL, ShaderLighted );
00704 
00771     class FBSDK_DLL FBShaderLighted : public FBShader
00772     {
00773         //--- Open Reality declaration.
00774         FBClassDeclare( FBShaderLighted, FBShader );
00775 
00776     public:
00781         FBShaderLighted( const char* pName, HIObject pObject=NULL );
00782 
00783         FBPropertyBool             UseContrast;   
00784         FBPropertyDouble           Contrast;      
00785 
00786         FBPropertyBool             UseLuminosity; 
00787         FBPropertyDouble           Luminosity;    
00788 
00789         FBPropertyBool             UseSpecular;   
00790         FBPropertyDouble           Specular;      
00791 
00792         FBPropertyAlphaSource      Transparency;  
00793         FBPropertyAnimatableDouble Alpha;         
00794     };
00795 
00796 
00798     // FBShaderShadowLive
00800     FB_FORWARD( FBShaderShadowLive );
00801     FB_DEFINE_COMPONENT( FBSDK_DLL, ShaderShadowLive );
00802 
00806     enum FBShadowType
00807     { 
00808         kFBShadowTypeShadowPlanar              ,    
00809         kFBShadowTypeShadowProjectiveTexture   ,    
00810         kFBShadowTypeLightMapProjectiveTexture ,    
00811         kFBShadowTypeZShadowProjectiveTexture  ,    
00812         kFBShadowTypeZLightMapProjectiveTexture,    
00813     };
00814     FB_DEFINE_ENUM( FBSDK_DLL, ShadowType );
00815 
00818     enum FBShadowFrameType
00819     {
00820         kFBShadowFrameTypeShadowReceiver,   
00821         kFBShadowFrameTypeShadowCaster  ,   
00822         kFBShadowFrameTypeShadowCubeMap ,   
00823     };
00824     FB_DEFINE_ENUM( FBSDK_DLL, ShadowFrameType );
00825 
00826 
00875     class FBSDK_DLL FBShaderShadowLive : public FBShader
00876     {
00877         //--- Open Reality declaration.
00878         FBClassDeclare( FBShaderShadowLive, FBShader );
00879 
00880     public:
00885         FBShaderShadowLive( const char* pName, HIObject pObject=NULL );
00886 
00887         FBPropertyShadowType       ShadowType;      
00888         FBPropertyAnimatableDouble ShadowIntensity; 
00889         FBPropertyBool             LocalShadow;     
00890         FBPropertyBool             UseGobo;         
00891         FBPropertyDouble           ShadowZOffset;   
00892         FBPropertyShadowFrameType  ShadowFrameType; 
00893 
00894         FBPropertyListObject       Lights;          
00895         FBPropertyListObject       Models;          
00896 
00897     };
00898 
00899 
00900 #ifdef FBSDKUseNamespace
00901 }
00902 #endif
00903 #endif /* _FB_SHADER_H_ */