fbsdk/fbshader.h Source File
 
 
 
fbsdk/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_ */