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         FBShader* 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(FBShader* pShader, HKModelRenderInfo pInfo, int pSubRegionIndex);
00304         virtual ~FBShaderModelInfo();
00305 
00307         virtual void UpdateModelShaderInfo(int pShader_Version);
00308 
00310         FBModel* GetFBModel() { return mFBModel; }
00311 
00313         FBMaterial* 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( FBViewingOptions );
00342     FB_FORWARD( FBRenderOptions );
00343 
00344     class FBSDK_DLL FBRenderOptions
00345     {
00346     public:
00347         FBRenderOptions(HKRenderOptions pOptions);
00348 
00350         FBCamera* GetRenderingCamera();
00351 
00355         int GetRenderFrameId() const;
00356 
00361         K_DEPRECATED_2014 bool IsIDBufferPicking() const;
00362 
00366         bool IsIDBufferRendering() const;
00367 
00371         float GetIDBufferPickingAlphaThreshold() const;
00372 
00376         bool IsOfflineRendering() const;
00377 
00378         FBViewingOptions* GetViewerOptions() const;
00379 
00380 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00381 
00382         HKRenderOptions mRenderOptions;
00383 #endif
00384     };
00385 
00387 
00390     enum FBRenderingPass {
00391         kFBPassInvalid                  = 0,        
00392         kFBPassPreRender                = 1 << 0,   
00393         kFBPassFlat                     = 1 << 1,   
00394         kFBPassLighted                  = 1 << 2,   
00395         kFBPassMatte                    = 1 << 3,   
00396         kFBPassZTranslucent             = 1 << 4,   
00397         kFBPassZTranslucentAlphaTest    = 1 << 5,   
00398         kFBPassTranslucent              = 1 << 6,   
00399         kFBPassAddColor                 = 1 << 7,   
00400         kFBPassTranslucentZSort         = 1 << 8,   
00401         kFBPassPostRender               = 1 << 9    
00402     };
00403     FB_DEFINE_ENUM( FBSDK_DLL, RenderingPass );
00404 
00409     enum FBAlphaSource
00410     {
00411         kFBAlphaSourceNoAlpha               ,   
00412         kFBAlphaSourceAccurateAlpha         ,   
00413         kFBAlphaSourceTransluscentAlpha     ,   
00414         kFBAlphaSourceMatteAlpha            ,   
00415         kFBAlphaSource2DTransparency        ,   
00416         kFBAlphaSourceAdditiveAlpha         ,   
00417         kFBAlphaSourceTransluscentZSortAlpha,   
00418     };
00419     FB_DEFINE_ENUM( FBSDK_DLL, AlphaSource );
00420 
00423     enum FBShaderCapacity
00424     { 
00425         kFBShaderCapacityNone            = 0,
00426         kFBShaderCapacityMaterialEffect  = 1 << 0,     
00427         kFBShaderCapacityDrawInstanced   = 1 << 1,     
00428         kFBShaderCapacityDrawShadow      = 1 << 2,     
00429         kFBShaderCapactiyDrawTextureLayer= 1 << 3      
00430     };
00431     FB_DEFINE_ENUM( FBSDK_DLL, ShaderCapacity );
00432 
00436     enum FBShaderPassActionCallback
00437     {
00438         kFBShaderPassActionNone         = 0,  
00439         kFBShaderPassTypeBegin          = 1 << 0,
00440         kFBShaderPassTypeEnd            = 1 << 1,
00441         kFBShaderPassInstanceBegin      = 1 << 2, 
00442         kFBShaderPassInstanceEnd        = 1 << 3, 
00443         kFBShaderPassMaterialBegin      = 1 << 4, 
00444         kFBShaderPassMaterialEnd        = 1 << 5,
00445         kFBShaderPassGeometryBegin      = 1 << 6,
00446         kFBShaderPassGeometryEnd        = 1 << 7,
00447         kFBShaderPassModelsDraw         = 1 << 8,
00448         kFBShaderPassModelDraw          = 1 << 9
00449     };
00450     FB_DEFINE_ENUM( FBSDK_DLL, ShaderPassActionCallback );
00451 
00452     FB_FORWARD( FBRenderer );
00453     __FB_FORWARD( FBShader );
00454     FB_DEFINE_COMPONENT ( FBSDK_DLL, Shader );
00455     FB_DEFINE_LIST      ( FBSDK_DLL, Shader );
00456 
00458     class FBSDK_DLL FBShader : public FBBox
00459     {
00460         //--- Open Reality declaration.
00461         __FBClassDeclare( FBShader, FBBox );
00462 
00463     public:
00468         FBShader( const char* pName, HIObject pObject=NULL);
00469 
00470         IObject_Declare(K_IMPLEMENTATION);      // Interface to IObject.
00471 
00477         virtual FBShaderModelInfo* NewShaderModelInfo(HKModelRenderInfo pModelRenderInfo, int pSubRegionIndex);
00478 
00483         virtual void UpdateModelShaderInfo( FBRenderOptions* pOptions, FBShaderModelInfo* pInfo );
00484 
00489         virtual void DestroyShaderModelInfo( FBRenderOptions* pOptions, FBShaderModelInfo* pInfo );
00490 
00494         virtual void ReplaceAll( FBModel* pModel );
00495 
00499         virtual void Append( FBModel* pModel );
00500 
00504         virtual bool ShaderNeedBeginRender();
00505 
00511         virtual void ShaderBeginRender( FBRenderOptions* pOptions, FBShaderModelInfo* pInfo );
00512 
00518         virtual void ShadeModel( FBRenderOptions* pOptions, FBShaderModelInfo* pInfo, FBRenderingPass pPass );
00519 
00524         virtual void ShadeModelShadow(FBRenderOptions* pRenderOptions, FBShaderModelInfo* pInfo);
00525 
00530 
00535         virtual void ShaderPassTypeBegin    ( FBRenderOptions* pRenderOptions, FBRenderingPass pPass);  
00536 
00541         virtual void ShaderPassTypeEnd      ( FBRenderOptions* pRenderOptions, FBRenderingPass pPass);     
00542 
00547         virtual void ShaderPassInstanceBegin( FBRenderOptions* pRenderOptions, FBRenderingPass pPass);  
00548 
00553         virtual void ShaderPassInstanceEnd  ( FBRenderOptions* pRenderOptions, FBRenderingPass pPass);  
00554 
00560         virtual void ShaderPassMaterialBegin( FBRenderOptions* pRenderOptions, FBRenderingPass pPass, FBShaderModelInfo* pInfo);  
00561 
00567         virtual void ShaderPassMaterialEnd  ( FBRenderOptions* pRenderOptions, FBRenderingPass pPass, FBShaderModelInfo* pInfo);  
00568 
00574         virtual void ShaderPassGeometryBegin( FBRenderOptions* pRenderOptions, FBRenderingPass pPass, FBShaderModelInfo* pInfo);  
00575 
00581         virtual void ShaderPassGeometryEnd  ( FBRenderOptions* pRenderOptions, FBRenderingPass pPass, FBShaderModelInfo* pInfo);
00582     
00588         virtual void ShaderPassModelsDraw ( FBRenderOptions* pRenderOptions, FBRenderingPass pPass, const FBArrayTemplate<FBShaderModelInfo*>& pInfoArray);
00589 
00595         virtual void ShaderPassModelDraw ( FBRenderOptions* pRenderOptions, FBRenderingPass pPass, FBShaderModelInfo* pInfo);
00596 
00600         virtual void ShaderPassDrawShadowBegin( FBRenderOptions* pRenderOptions);
00601 
00605         virtual void ShaderPassDrawShadowEnd ( FBRenderOptions* pRenderOptions);
00606 
00608         FBShaderPassActionCallback   GetShaderPassActionCallback() const;
00610         void         SetShaderPassActionCallback( FBShaderPassActionCallback pCallback);
00611    
00613 
00617         virtual void CloneShaderParameter( FBShader* pNewShader );
00618 
00623         virtual void DetachDisplayContext( FBRenderOptions* pOptions, FBShaderModelInfo* pInfo );
00624 
00629         virtual bool FbxStore   (FBFbxObject* pFbxObject);
00630 
00636         virtual bool FbxRetrieve(FBFbxObject* pFbxObject, FBRenderer* pRenderer);
00637 
00638         const char* ShaderDescription;  
00639 
00641         void    InvalidateShaderVersion ();
00642 
00644         int     GetShaderVersion        ()  const;
00645 
00647         FBShaderCapacity GetShaderCapacity( ) const;
00648 
00650         bool         HasShaderCapacity    (FBShaderCapacity pCapacity);  
00651 
00655         void         SetShaderCapacity    (FBShaderCapacity pCapacity, bool pOn);
00656 
00658         int          GetDrawInstancedMaximumSize() const;
00659 
00661         void         SetDrawInstancedMaximumSize(int pMaxSize);
00662 
00667         virtual void UploadModelViewMatrixArrayForDrawInstanced(const double* pModelViewMatrixArray, int pCount);
00668 
00669 
00670     public:
00673         FBPropertyBool              Enable;
00674 
00680         FBPropertyRenderingPass     RenderingPass;
00681 
00682     protected:
00689         static FBRenderingPass GetRenderingPassNeededForAlpha(FBAlphaSource pTransparency);
00690     };
00691 
00693     // FBPropertyListShader - List of shaders
00696     class FBSDK_DLL FBPropertyListShader : public FBPropertyListComponent
00697     {
00698     public:
00699         FBPropertyListShader();
00704         FBShader* operator[](int pIndex);
00705     };
00706 
00708     // FBShaderLighted
00710     FB_FORWARD( FBShaderLighted );
00711     FB_DEFINE_COMPONENT( FBSDK_DLL, ShaderLighted );
00712 
00779     class FBSDK_DLL FBShaderLighted : public FBShader
00780     {
00781         //--- Open Reality declaration.
00782         FBClassDeclare( FBShaderLighted, FBShader );
00783 
00784     public:
00789         FBShaderLighted( const char* pName, HIObject pObject=NULL );
00790 
00791         FBPropertyBool             UseContrast;   
00792         FBPropertyDouble           Contrast;      
00793 
00794         FBPropertyBool             UseLuminosity; 
00795         FBPropertyDouble           Luminosity;    
00796 
00797         FBPropertyBool             UseSpecular;   
00798         FBPropertyDouble           Specular;      
00799 
00800         FBPropertyAlphaSource      Transparency;  
00801         FBPropertyAnimatableDouble Alpha;         
00802     };
00803 
00804 
00806     // FBShaderShadowLive
00808     FB_FORWARD( FBShaderShadowLive );
00809     FB_DEFINE_COMPONENT( FBSDK_DLL, ShaderShadowLive );
00810 
00814     enum FBShadowType
00815     { 
00816         kFBShadowTypeShadowPlanar              ,    
00817         kFBShadowTypeShadowProjectiveTexture   ,    
00818         kFBShadowTypeLightMapProjectiveTexture ,    
00819         kFBShadowTypeZShadowProjectiveTexture  ,    
00820         kFBShadowTypeZLightMapProjectiveTexture,    
00821     };
00822     FB_DEFINE_ENUM( FBSDK_DLL, ShadowType );
00823 
00826     enum FBShadowFrameType
00827     {
00828         kFBShadowFrameTypeShadowReceiver,   
00829         kFBShadowFrameTypeShadowCaster  ,   
00830         kFBShadowFrameTypeShadowCubeMap ,   
00831     };
00832     FB_DEFINE_ENUM( FBSDK_DLL, ShadowFrameType );
00833 
00834 
00883     class FBSDK_DLL FBShaderShadowLive : public FBShader
00884     {
00885         //--- Open Reality declaration.
00886         FBClassDeclare( FBShaderShadowLive, FBShader );
00887 
00888     public:
00893         FBShaderShadowLive( const char* pName, HIObject pObject=NULL );
00894 
00895         FBPropertyShadowType       ShadowType;      
00896         FBPropertyAnimatableDouble ShadowIntensity; 
00897         FBPropertyBool             LocalShadow;     
00898         FBPropertyBool             UseGobo;         
00899         FBPropertyDouble           ShadowZOffset;   
00900         FBPropertyShadowFrameType  ShadowFrameType; 
00901 
00902         FBPropertyListObject       Lights;          
00903         FBPropertyListObject       Models;          
00904 
00905     };
00906 
00907 
00908 #ifdef FBSDKUseNamespace
00909 }
00910 #endif
00911 #endif /* _FB_SHADER_H_ */