00001 #ifndef _FB_SHADER_H_
00002 #define _FB_SHADER_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
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 ,const char* pName,void * ) \
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
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
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
00461 __FBClassDeclare( FBShader, FBBox );
00462
00463 public:
00468 FBShader( const char* pName, HIObject pObject=NULL);
00469
00470 IObject_Declare(K_IMPLEMENTATION);
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
00696 class FBSDK_DLL FBPropertyListShader : public FBPropertyListComponent
00697 {
00698 public:
00699 FBPropertyListShader();
00704 FBShader* operator[](int pIndex);
00705 };
00706
00708
00710 FB_FORWARD( FBShaderLighted );
00711 FB_DEFINE_COMPONENT( FBSDK_DLL, ShaderLighted );
00712
00779 class FBSDK_DLL FBShaderLighted : public FBShader
00780 {
00781
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
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
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