#include "stdafx.h" #define GETMATERIALSHADERPARAMETERS_GUID CKGUID(0x512a6b7c,0xc12f6ab6) //----------------------------------------------------------------------------- extern CKParameterLocal* FindParameterByNameAndType( const XArray& params, char* paramName, CKGUID paramType ); //----------------------------------------------------------------------------- int FindParameterIndexByNameAndType(const XArray& params, char* paramName, CKGUID paramType ) { const int shaderParamCount = params.Size(); for( int a=0; aGetGUID() == paramType ){ if( !strcmp( shaderParam->GetName(), paramName ) ){ return a; } } } return -1; } //----------------------------------------------------------------------------- void BuildParameters(CKBehavior* beh,const XArray& params) { XArray poutToBuild; BOOL rebuild = FALSE; int ocount = beh->GetOutputParameterCount(); int scount = params.Size(); poutToBuild.Resize(scount); poutToBuild.Memset(0); if (ocount!=scount) rebuild=TRUE; for (int i=ocount-1;i>=0;--i) { CKParameterOut* pout = beh->GetOutputParameter(i); int index = FindParameterIndexByNameAndType(params,pout->GetName(),pout->GetGUID()); if (index>=0) { if (index!=i) //pout not rightly placed { beh->RemoveOutputParameter( i ); poutToBuild[index]=pout; rebuild=TRUE; } else poutToBuild[index]=(CKParameterOut*)-1;//already rightly placed } else { CKDestroyObject( beh->RemoveOutputParameter( i ) ); } } if (rebuild) { for (int i=0;iInsertOutputParameter(i,pout); else if (pout!=(CKParameterOut*)-1) { CKParameterLocal* plocal = params[i]; pout = beh->GetCKContext()->CreateCKParameterOut(plocal->GetName(),plocal->GetGUID()); beh->InsertOutputParameter(i,pout); } } } } //----------------------------------------------------------------------------- void FillShaderParameters(CKBehavior* beh,XArray& params) { const int paramCount = beh->GetOutputParameterCount(); for( int a=0 ; aGetOutputParameter(a); CKParameterLocal* shaderParam = FindParameterByNameAndType( params, pout->GetName(), pout->GetGUID() ); if( shaderParam ) pout->CopyValue( shaderParam ); } } /***********************************************/ // MAIN /***********************************************/ int GetMaterialShaderParameters( const CKBehaviorContext& behcontext ) { CKBehavior* beh = behcontext.Behavior; beh->ActivateInput(0, FALSE); beh->ActivateOutput(0); CKMaterial* mat = (CKMaterial*)beh->GetTarget(); if( !mat ) return CKBR_PARAMETERERROR; //--- Gets MaterialShader CKMaterialShader* mfx = mat->GetMaterialShader(); if( !mfx ) return CKBR_PARAMETERERROR; //--- Fill Shader Parameters FillShaderParameters( beh, mfx->m_Params ); return CKBR_OK; } /***********************************************/ // CALLBACK /***********************************************/ CKERROR GetMaterialShaderParametersCallback(const CKBehaviorContext& behcontext) { CKBehavior* beh = behcontext.Behavior; switch( behcontext.CallbackMessage ){ case CKM_BEHAVIORSETTINGSEDITED: { BOOL buildExposedParams = FALSE; beh->GetLocalParameterValue( 0, &buildExposedParams ); if( buildExposedParams ) { //--- Reset buildExposedParams Flag buildExposedParams = FALSE; beh->SetLocalParameterValue( 0, &buildExposedParams ); CKMaterial* mat = (CKMaterial*)beh->GetTarget(); if( !mat ) return CKBR_PARAMETERERROR; //--- Gets MaterialShader CKMaterialShader* mfx = mat->GetMaterialShader(); if( !mfx ) return CKBR_PARAMETERERROR; BuildParameters(beh,mfx->m_Params); } } break; } return CKBR_OK; } /***********************************************/ // PROTO /***********************************************/ CKERROR CreateGetMaterialShaderParametersProto(CKBehaviorPrototype **pproto) { CKBehaviorPrototype *proto = CreateCKBehaviorPrototype("Get Shader Parameters"); if(!proto) return CKERR_OUTOFMEMORY; proto->DeclareInput("In"); proto->DeclareOutput("Out"); proto->DeclareSetting("Build Exposed Params",CKPGUID_BOOL, "FALSE"); proto->SetFlags(CK_BEHAVIORPROTOTYPE_NORMAL); proto->SetFunction(GetMaterialShaderParameters); proto->SetBehaviorFlags( (CK_BEHAVIOR_FLAGS)( CKBEHAVIOR_VARIABLEPARAMETEROUTPUTS | CKBEHAVIOR_TARGETABLE) ); proto->SetBehaviorCallbackFct( GetMaterialShaderParametersCallback,CKCB_BEHAVIORSETTINGSEDITED ); *pproto = proto; return CK_OK; } /***********************************************/ // DECLARATION /***********************************************/ CKObjectDeclaration *FillBehaviorGetMaterialShaderParameters() { CKObjectDeclaration *od = CreateCKObjectDeclaration("Get Shader Parameters"); od->SetDescription("Gets parameters of the material's shader."); od->SetCategory("Shaders/General"); od->SetType(CKDLL_BEHAVIORPROTOTYPE); od->SetGuid(GETMATERIALSHADERPARAMETERS_GUID); od->SetAuthorGuid(VIRTOOLS_GUID); od->SetAuthorName("Virtools"); od->SetVersion(0x00010000); od->SetCreationFunction(CreateGetMaterialShaderParametersProto); od->SetCompatibleClassId(CKCID_MATERIAL); return od; }