bool mrShaderFilter::ValidateReturnType(ClassDesc& classDesc) { SClass_ID superClassID = classDesc.SuperClassID(); if(superClassID == MATERIAL_CLASS_ID) { // Validate if we want a TYPE_MTL return type //return ValidType(TYPE_MTL); // Do not validate types for materials. Only use the apply type for validatoin. return true; } else if(superClassID == TEXMAP_CLASS_ID) { imrShaderClassDesc* shaderClassDesc = Get_mrShaderClassDesc(&classDesc); if(shaderClassDesc == NULL) { // Assume that the texture returns a color return ValidType(static_cast<ParamType2>(TYPE_RGBA)); } else { // Go through the results structure ParamBlockDesc2* pbDesc = shaderClassDesc->GetResultPBDesc(); if((pbDesc != NULL) && ValidateReturnType(*pbDesc)) { return true; } // Go through the sub-structures, is allowed if(m_acceptStructs) { Tab<ParamBlockDesc2*>& resultDescs = shaderClassDesc->GetResultPBDescs(); int count = resultDescs.Count(); for(int i = 0; i < count; ++i) { ParamBlockDesc2* pbDesc = resultDescs[i]; if((pbDesc != NULL) && ValidateReturnType(*pbDesc)) { return true; } } } return false; } } else { // Shouldn't occur DbgAssert(false); return false; } }
bool mrShaderFilter::ValidateApplyType(ClassDesc& classDesc) { SClass_ID superClassID = classDesc.SuperClassID(); if(superClassID == MATERIAL_CLASS_ID) { // Validate if materials are accepted return ((m_applyTypes & imrShaderClassDesc::kApplyFlag_MtlPhen) != 0); } else if(superClassID == TEXMAP_CLASS_ID) { // First, query for a possible custom apply type imrShaderTranslation_ClassInfo* customClassInfo = Get_imrShaderTranslation_ClassInfo(classDesc); if(customClassInfo != NULL) { unsigned int customApplyType = customClassInfo->GetApplyTypes(); return ((customApplyType & m_applyTypes) != 0); } else { imrShaderClassDesc* shaderClassDesc = Get_mrShaderClassDesc(&classDesc); if(shaderClassDesc == NULL) { // Not a mr shader. Validate if texture shaders are accepted. return ((m_applyTypes & imrShaderClassDesc::kApplyFlag_Texture) != 0); } else { // Depends on the apply type of the shader unsigned int shaderApplyTypes = shaderClassDesc->GetApplyTypes(); return ((shaderApplyTypes & m_applyTypes) != 0); } } } else { // Shouldn't occur DbgAssert(false); return false; } }
BOOL plComponentDlg::DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: fhDlg = hDlg; IAddComponentsRecur(GetDlgItem(hDlg, IDC_TREE), (plMaxNode*)GetCOREInterface()->GetRootNode()); ICreateMenu(); ICreateRightClickMenu(); return TRUE; case WM_SIZING: IPositionControls((RECT*)lParam, wParam); return TRUE; case WM_ACTIVATE: if (LOWORD(wParam) == WA_INACTIVE) plMaxAccelerators::Enable(); else plMaxAccelerators::Disable(); return TRUE; case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDCANCEL) { ShowWindow(hDlg, SW_HIDE); fInterface->UnRegisterDlgWnd(hDlg); return TRUE; } else if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_ATTACH) { IAttachTreeSelection(); return TRUE; } else if (HIWORD(wParam) == EN_KILLFOCUS && LOWORD(wParam) == IDC_COMMENTS) { IGetComment(); return TRUE; } // "Refresh" menu item else if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == ID_REFRESH) { IRefreshTree(); return TRUE; } // "Remove unused components" menu item else if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == ID_REMOVE_UNUSED) { IRemoveUnusedComps(); return TRUE; } // Item selected from 'New' menu else if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) >= MENU_ID_START) { ClassDesc *desc = plComponentMgr::Inst().Get(LOWORD(wParam)-MENU_ID_START); // If this is a component type (not a category) if (desc) { // Create an object of that type and a node to reference it Object *obj = (Object*)GetCOREInterface()->CreateInstance(desc->SuperClassID(), desc->ClassID()); INode *node = GetCOREInterface()->CreateObjectNode(obj); plComponentBase *comp = (plComponentBase*)obj; node->Hide(!comp->AllowUnhide()); node->Freeze(TRUE); // Add the new component to the tree HWND hTree = GetDlgItem(hDlg, IDC_TREE); HTREEITEM item = IAddComponent(hTree, (plMaxNode*)node); TreeView_SelectItem(hTree, item); TreeView_EnsureVisible(hTree, item); } } break; case WM_NOTIFY: NMHDR *nmhdr = (NMHDR*)lParam; if (nmhdr->idFrom == IDC_TREE) { switch (nmhdr->code) { case TVN_SELCHANGED: { NMTREEVIEW *tv = (NMTREEVIEW*)lParam; IGetComment(); bool isComponent = IIsComponent(tv->itemNew.lParam); // If the new selection is a component, enable the attach button and comment field EnableWindow(GetDlgItem(hDlg, IDC_ATTACH), isComponent); SendDlgItemMessage(hDlg, IDC_COMMENTS, EM_SETREADONLY, !isComponent, 0); if (isComponent) { fCommentNode = (plMaxNode*)tv->itemNew.lParam; TSTR buf; fCommentNode->GetUserPropBuffer(buf); SetDlgItemText(hDlg, IDC_COMMENTS, buf); } else { fCommentNode = nil; SetDlgItemText(hDlg, IDC_COMMENTS, ""); } return TRUE; } break; case TVN_BEGINLABELEDIT: // If this isn't a component, don't allow the edit if (!IIsComponent(((NMTVDISPINFO*)lParam)->item.lParam)) { SetWindowLong(hDlg, DWL_MSGRESULT, TRUE); return TRUE; } // The edit box this creates kills the focus on our window, causing // accelerators to be enabled. Add an extra disable to counteract that. plMaxAccelerators::Disable(); return TRUE; // Finishing changing the name of a component case TVN_ENDLABELEDIT: { NMTVDISPINFO *di = (NMTVDISPINFO*)lParam; char* text = di->item.pszText; // If the name was changed... if (text && *text != '\0') { // Update the name of the node plMaxNode *node = IGetTreeSelection(); node->SetName(text); // Update the name in the panel too if (plComponentUtil::Instance().IsOpen()) plComponentUtil::Instance().IUpdateNodeName(node); // Make sure Max knows the file was changed SetSaveRequiredFlag(); // Return true to keep the changes SetWindowLong(hDlg, DWL_MSGRESULT, TRUE); } plMaxAccelerators::Enable(); } return TRUE; // User double-clicked. Select the objects the selected component is attached to. case NM_DBLCLK: ISelectTreeSelection(); return TRUE; case NM_RCLICK: IOpenRightClickMenu(); return TRUE; case TVN_KEYDOWN: // User pressed delete if (((NMTVKEYDOWN*)lParam)->wVKey == VK_DELETE) { IDeleteComponent(IGetTreeSelection()); return TRUE; } break; } } break; } return FALSE; }