/** * Initializes the property tree with the data from the currently selected material. */ void MaterialPropTreeView::RefreshProperties() { MaterialDefList* propList = MaterialDefManager::GetMaterialDefs(currentListType); if(!propList) return; MaterialDoc* materialDoc = materialDocManager->GetCurrentMaterialDoc(); for(int i = 0; i < propList->Num(); i++) { switch((*propList)[i]->type) { case MaterialDef::MATERIAL_DEF_TYPE_BOOL: { bool val = materialDoc->GetAttributeBool(currentStage, (*propList)[i]->dictName); CPropTreeItemCheck* item = (CPropTreeItemCheck*)m_Tree.FindItem((*propList)[i]->GetViewData(PROP_TREE_VIEW)); item->SetCheckState(val ? TRUE:FALSE); } break; case MaterialDef::MATERIAL_DEF_TYPE_STRING: { idStr val = materialDoc->GetAttribute(currentStage, (*propList)[i]->dictName); CPropTreeItemEdit* item = (CPropTreeItemEdit*)m_Tree.FindItem((*propList)[i]->GetViewData(PROP_TREE_VIEW)); item->SetItemValue((LPARAM)val.c_str()); } break; } } Invalidate(); }
/** * Initializes the list of properties based on the type (material, stage, special stage). * @param listType The type of list (material, stage, special stage) * @param stageNum The stage from which to get the attributes. */ void MaterialPropTreeView::SetPropertyListType(int listType, int stageNum) { currentListType = listType; currentStage = stageNum; m_Tree.DeleteAllItems(); //idList<MaterialProp_t*>* propList = NULL; MaterialDefList* propList = MaterialDefManager::GetMaterialDefs(currentListType); currentPropDefs = propList; if(!propList) return; CPropTreeItem* pCurrentGroup = NULL; CPropTreeItem* pCurrentNode = NULL; for(int i = 0; i < propList->Num(); i++) { switch((*propList)[i]->type) { case MaterialDef::MATERIAL_DEF_TYPE_GROUP: { pCurrentGroup = m_Tree.InsertItem(new CPropTreeItem()); pCurrentNode = pCurrentGroup; if(!registry.GetBool(va("Expand%d%s", currentListType, (*propList)[i]->displayName.c_str()))) pCurrentGroup->Expand(); } break; case MaterialDef::MATERIAL_DEF_TYPE_BOOL: { CPropTreeItemCheck* pCheck; pCheck = (CPropTreeItemCheck*)m_Tree.InsertItem(new CPropTreeItemCheck(), pCurrentGroup); pCheck->CreateCheckBox(); pCurrentNode = pCheck; } break; case MaterialDef::MATERIAL_DEF_TYPE_STRING: { //pCurrentNode = m_Tree.InsertItem(new CPropTreeItemEdit(), pCurrentGroup); pCurrentNode = m_Tree.InsertItem(new CPropTreeItemFileEdit(), pCurrentGroup); } break; } if(pCurrentNode) { (*propList)[i]->SetViewData(PROP_TREE_VIEW, pCurrentNode->GetCtrlID()); pCurrentNode->SetLabelText((*propList)[i]->displayName); pCurrentNode->SetInfoText((*propList)[i]->displayInfo); } } RefreshProperties(); }
/** * Finds the appropriate material definition for the supplied token and initializes the * internal dictionary data. * @param token The token to lookup * @param src The idLexer that contains the material source text. * @param type The type of attribute grouping to use material, stage or special stage. * @param dict The dictionary to initialize. */ bool MaterialDoc::ParseMaterialDef(idToken* token, idLexer* src, int type, idDict* dict) { MaterialDefList* defs = MaterialDefManager::GetMaterialDefs(type); for(int i = 0; i < defs->Num(); i++) { if(!token->Icmp((*defs)[i]->dictName)) { switch((*defs)[i]->type) { case MaterialDef::MATERIAL_DEF_TYPE_STRING: { idStr str; src->ReadRestOfLine( str ); if((*defs)[i]->quotes) { str.StripTrailing('\"'); str.StripLeading('\"'); } dict->Set((*defs)[i]->dictName, str); } break; case MaterialDef::MATERIAL_DEF_TYPE_BOOL: { src->SkipRestOfLine(); dict->SetBool((*defs)[i]->dictName, true); } break; case MaterialDef::MATERIAL_DEF_TYPE_FLOAT: { idStr str; src->ReadRestOfLine( str ); dict->Set((*defs)[i]->dictName, str); } break; case MaterialDef::MATERIAL_DEF_TYPE_INT: { idStr str; src->ReadRestOfLine( str ); dict->Set((*defs)[i]->dictName, str); } break; } return true; } } return false; }
/** * Writes a set of material attributes to a file. * @param stage The stage to write or -1 for the material. * @param file The file where the stage should be wirtten. * @param type The attribute grouping to use. * @param indent The number of tabs to indent the text. */ void MaterialDoc::WriteMaterialDef(int stage, idFile_Memory* file, int type, int indent) { idStr prefix = ""; for(int i = 0; i < indent; i++) { prefix += "\t"; } MaterialDefList* defs = MaterialDefManager::GetMaterialDefs(type); for(int i = 0; i < defs->Num(); i++) { switch((*defs)[i]->type) { case MaterialDef::MATERIAL_DEF_TYPE_STRING: { idStr attrib = GetAttribute(stage, (*defs)[i]->dictName); if(attrib.Length() > 0) { if((*defs)[i]->quotes) file->WriteFloatString("%s%s\t\"%s\"\n", prefix.c_str(), (*defs)[i]->dictName.c_str(), attrib.c_str()); else file->WriteFloatString("%s%s\t%s\n", prefix.c_str(), (*defs)[i]->dictName.c_str(), attrib.c_str()); } } break; case MaterialDef::MATERIAL_DEF_TYPE_BOOL: { if(GetAttributeBool(stage, (*defs)[i]->dictName)) file->WriteFloatString("%s%s\t\n",prefix.c_str(), (*defs)[i]->dictName.c_str()); } break; case MaterialDef::MATERIAL_DEF_TYPE_FLOAT: { float val = GetAttributeFloat(stage, (*defs)[i]->dictName); file->WriteFloatString("%s%s\t%f\n", prefix.c_str(), (*defs)[i]->dictName.c_str(), val); } break; case MaterialDef::MATERIAL_DEF_TYPE_INT: { int val = GetAttributeInt(stage, (*defs)[i]->dictName); file->WriteFloatString("%s%s\t%d\n", prefix.c_str(), (*defs)[i]->dictName.c_str(), val); } break; } } }