static INT_PTR CALLBACK DefaultDlgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: theSCPUtil.Init(hWnd); break; case WM_DESTROY: theSCPUtil.Destroy(hWnd); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_CLOSE: theSCPUtil.iu->CloseUtility(); break; case IDC_BTN1: { // Open a material browser to find the material to inspect Interface *ip = theSCPUtil.ip; BOOL newMat,cancel; MtlBase *mtlb = ip->DoMaterialBrowseDlg(hWnd,BROWSE_MATSONLY|BROWSE_INSTANCEONLY,newMat,cancel); if(!cancel&&mtlb) { // Check to see if this is one of ours if(mtlb->ClassID() == GAMEMTL_CLASSID) { Mtl *scp = (Mtl*)mtlb; // Get the number of pblock2s and references on the mtl int num_pblock2 = scp->NumParamBlocks(); int num_refs = scp->NumRefs(); // Get the custom parameters // We defined two custom parameters in our scripted plugin // called GM_Custom1 and GM_Custom2 // When we walk through the retrieved paramblock2, we can // get access to the hardwired internal name and check that // against our own names, to see if its the parameter we want // This way, its position-independant : it doesn't matter // where the parameters ARE in the pblock2, we will find them. if(num_pblock2>0) { // Get the first paramblock2 (the only one in our scripted plugin) IParamBlock2 *pb2 = scp->GetParamBlock(0); // The the descriptor to 'decode' ParamBlockDesc2 *pdc = pb2->GetDesc(); // Loop through all the defined parameters therein for(int i=0;i<pdc->count;i++) { // Get a ParamDef structure for the parameter ParamDef pD = pdc->paramdefs[i]; // Now compare against our names // When we match against one we want, we get the // ParamID from the ParamDef and pass it to GetValue of ParamBlock2 // which will retrieve us the value if(stricmp(pD.int_name,"GM_Custom1")==0) { int itmp = pb2->GetInt(pD.ID,theSCPUtil.ip->GetTime()); char s[255]; sprintf(s,"%i",itmp); SetWindowText(GetDlgItem(hWnd,IDC_GM1),s); } if(stricmp(pD.int_name,"GM_Custom2")==0) { float ftmp = pb2->GetFloat(pD.ID,theSCPUtil.ip->GetTime()); char s[255]; sprintf(s,"%.1f%%",ftmp); SetWindowText(GetDlgItem(hWnd,IDC_GM2),s); } } // Mustn't forget to... pb2->ReleaseDesc(); } // With a scripted plugin that overrides/extends an existing plugin, // the original "delegate" is kept as Reference 0. // If the scripted plugin is a brand new one, Ref 0 will be the first // paramblock2, and ref n will be paramblock2 n, if applicable. // // In this case, we get a poitner back to the original Standard Material // that we override, and get its Diffuse color Mtl *delegate = (Mtl*)scp->GetReference(0); theSCPUtil.cs->SetColor(delegate->GetDiffuse()); } else { // The user chose something that wasn't a GameMtl class MessageBox(hWnd,"Chosen Material Is NOT a GAMEMTL!","Error",MB_OK); } } } break; } break; default: return FALSE; } return TRUE; }
bool mrShaderFilter::Include(MtlBase& mtlBase, DWORD flags) { Interface* ip = GetCOREInterface(); if (!ip) { return false; } // Validate using the class ID ClassDesc* classDesc = ip->GetDllDir().ClassDir().FindClass( mtlBase.SuperClassID(), mtlBase.ClassID() ); DbgAssert(classDesc != NULL); if(classDesc != NULL) { return Include(*classDesc, flags); } else { return true; } }