bool MaterialUIHandler::SetupMtlSubNameCombo (HWND hWnd, EPolyMod *pMod) { INode *singleNode = GetNode(pMod); Mtl *nodeMtl = (singleNode) ? singleNode->GetMtl() : NULL; // check for scripted material if(nodeMtl){ MSPlugin* plugin = (MSPlugin*)((ReferenceTarget*)nodeMtl)->GetInterface(I_MAXSCRIPTPLUGIN); if(plugin) nodeMtl = dynamic_cast<Mtl*>( plugin->get_delegate() ); } if (nodeMtl == NULL || nodeMtl->ClassID() != Class_ID(MULTI_CLASS_ID, 0)) { //no UI for cloned nodes, and not MultiMtl SendMessage(GetDlgItem(hWnd, IDC_MTLID_NAMES_COMBO), CB_RESETCONTENT, 0, 0); EnableWindow(GetDlgItem(hWnd, IDC_MTLID_NAMES_COMBO), false); return false; } NumList mtlIDList; NumList mtlIDMeshList; GetMtlIDList (nodeMtl, mtlIDList); GetMtlIDList (pMod, singleNode, mtlIDMeshList); MultiMtl *nodeMulti = (MultiMtl*) nodeMtl; EnableWindow(GetDlgItem(hWnd, IDC_MTLID_NAMES_COMBO), true); SendMessage(GetDlgItem(hWnd, IDC_MTLID_NAMES_COMBO), CB_RESETCONTENT, 0, 0); for (int i=0; i<mtlIDList.Count(); i++){ TSTR idname, buf; if(mtlIDMeshList.Find(mtlIDList[i]) != -1) { nodeMulti->GetSubMtlName(mtlIDList[i], idname); if (idname.isNull()) idname = GetString(IDS_MTL_NONAME); //az: 042503 - FIGS buf.printf(_T("%s - ( %d )"), idname.data(), mtlIDList[i]+1); int ith = SendMessage(GetDlgItem(hWnd, IDC_MTLID_NAMES_COMBO), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)buf.data()); SendMessage(GetDlgItem(hWnd, IDC_MTLID_NAMES_COMBO), CB_SETITEMDATA, ith, (LPARAM)mtlIDList[i]); } } return true; }
int DxStdMtl2::GetMatIndex(Mtl * m_Mtl) { int i; Mtl *Std; StdMat2 * Shader; // MaxShader *Shader, *s; if(m_Mtl->IsMultiMtl()) { Shader = (StdMat2 *)GetRefTarg(); // I use the SubAnims here, as I do not want any NULL material introduced that are not visible to the user // this can happen when you have N materials and you select N+1 mat ID - the material will add a NULL material // to the list to compensate - this screws with the index into the paramblock for(i=0; i < m_Mtl->NumSubs(); i++) { Std = (Mtl*)m_Mtl->SubAnim(i); if(Std!=NULL) { if(Std->NumSubMtls()>0) { for(int j=0; j< Std->NumSubMtls();j++) { Mtl * subMtl = Std->GetSubMtl(j); if(subMtl == Shader) Std = subMtl; } } MSPlugin* plugin = (MSPlugin*)((ReferenceTarget*)Std)->GetInterface(I_MAXSCRIPTPLUGIN); ReferenceTarget * targ = NULL; if(plugin){ targ = plugin->get_delegate(); Std = (Mtl*)targ; } if(Std == Shader) { int id=0; // this gets interesting - the MatID are editable !! must get them from the PAramblock IParamBlock2 * pblock = m_Mtl->GetParamBlock(0); // there is only one if(pblock) { ParamBlockDesc2 * pd = pblock->GetDesc(); for(int j=0;j<pd->count;j++) { if(_tcsicmp(_T("materialIDList"),pd->paramdefs[j].int_name)==0) //not localised { //int id; pblock->GetValue(j,0,id,FOREVER,i); id = id+1; //for some reason this is stored as a zero index, when a 1's based index is used } } pblock->ReleaseDesc(); } return(id); } } } } return(0); }