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 HFBShader 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(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
00451 __FBClassDeclare( FBShader, FBBox );
00452
00453 public:
00458 FBShader( const char* pName, HIObject pObject=NULL);
00459
00460 IObject_Declare(Implementation);
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
00688 class FBSDK_DLL FBPropertyListShader : public FBPropertyListComponent
00689 {
00690 public:
00691 FBPropertyListShader();
00696 FBShader* operator[](int pIndex);
00697 };
00698
00700
00702 FB_FORWARD( FBShaderLighted );
00703 FB_DEFINE_COMPONENT( FBSDK_DLL, ShaderLighted );
00704
00771 class FBSDK_DLL FBShaderLighted : public FBShader
00772 {
00773
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
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
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