/** * @brief Get a property from a behaviour or his inheritance * @param[in] behaviour Context behaviour * @param[in] name Property name we search * @return A value_t with the requested name, else NULL */ const value_t *UI_GetPropertyFromBehaviour (const uiBehaviour_t *behaviour, const char* name) { for (; behaviour; behaviour = behaviour->super) { const value_t *result; if (behaviour->properties == NULL) continue; result = UI_FindPropertyByName(behaviour->properties, name); if (result) return result; } return NULL; }
bool UI_ParseSprite (const char* name, const char** text) { uiSprite_t* icon; const char* token; /* search for icons with same name */ icon = UI_AllocStaticSprite(name); /* get it's body */ token = Com_Parse(text); assert(token[0] == '{'); /* read properties */ while (true) { const value_t* property; token = Com_Parse(text); if (*text == nullptr) return false; if (token[0] == '}') break; property = UI_FindPropertyByName(ui_spriteProperties, token); if (!property) { Com_Printf("UI_ParseIcon: unknown options property: '%s' - ignore it\n", token); return false; } /* get parameter values */ const bool result = UI_ParseProperty(icon, property, icon->name, text, &token); if (!result) { Com_Printf("UI_ParseIcon: Parsing for sprite '%s'. See upper\n", icon->name); return false; } } return true; }
/** * @brief parses the models.ufo and all files where UI models (menu_model) are defined * @sa CL_ParseClientData */ bool UI_ParseUIModel (const char* name, const char** text) { const char* errhead = "UI_ParseUIModel: unexpected end of file (names "; /* search for a UI models with same name */ for (int i = 0; i < ui_global.numModels; i++) if (Q_streq(ui_global.models[i].id, name)) { Com_Printf("UI_ParseUIModel: menu_model \"%s\" with same name found, second ignored\n", name); return false; } if (ui_global.numModels >= UI_MAX_MODELS) { Com_Printf("UI_ParseUIModel: Max UI models reached\n"); return false; } /* initialize the model */ uiModel_t* model = &ui_global.models[ui_global.numModels]; OBJZERO(*model); Vector4Set(model->color, 1, 1, 1, 1); model->id = Mem_PoolStrDup(name, ui_sysPool, 0); Com_DPrintf(DEBUG_CLIENT, "Found UI model %s (%i)\n", model->id, ui_global.numModels); /* get it's body */ const char* token = Com_Parse(text); if (!*text || token[0] != '{') { Com_Printf("UI_ParseUIModel: Model \"%s\" without body ignored\n", model->id); return false; } ui_global.numModels++; do { const value_t* v = nullptr; /* get the name type */ token = Com_EParse(text, errhead, name); if (!*text) return false; if (token[0] == '}') break; v = UI_FindPropertyByName(uiModelProperties, token); if (!v) { Com_Printf("UI_ParseUIModel: unknown token \"%s\" ignored (UI model %s)\n", token, name); return false; } if (v->type == V_NULL) { if (Q_streq(v->string, "need")) { token = Com_EParse(text, errhead, name); if (!*text) return false; if (model->next != nullptr) Sys_Error("UI_ParseUIModel: second 'need' token found in model %s", name); model->next = UI_GetUIModel(token); if (!model->next) Com_Printf("Could not find UI model %s", token); } } else { token = Com_EParse(text, errhead, name); if (!*text) return false; switch (v->type) { case V_HUNK_STRING: Mem_PoolStrDupTo(token, &Com_GetValue<char*>(model, v), ui_sysPool, 0); break; default: Com_EParseValue(model, token, v->type, v->ofs, v->size); break; } } } while (*text); return true; }
static void UI_MaterialEditorChangeValue_f (void) { image_t* image; int id, stageType; const char* var, *value; size_t bytes; if (Cmd_Argc() < 5) { Com_Printf("Usage: %s <image index> <stage index> <variable> <value>\n", Cmd_Argv(0)); return; } id = atoi(Cmd_Argv(1)); if (id < 0 || id >= r_numImages) { Com_Printf("Given image index (%i) is out of bounds\n", id); return; } var = Cmd_Argv(3); value = Cmd_Argv(4); image = R_GetImageAtIndex(id); stageType = UI_MaterialEditorNameToStage(var); if (stageType == -1) { const value_t* val = UI_FindPropertyByName(materialValues, var); if (!val) { Com_Printf("Could not find material variable for '%s'\n", var); return; } Com_ParseValue(&image->material, value, val->type, val->ofs, val->size, &bytes); } else { materialStage_t* stage; int stageID; const value_t* val = UI_FindPropertyByName(materialStageValues, var); if (!val) { Com_Printf("Could not find material stage variable for '%s'\n", var); return; } stageID = atoi(Cmd_Argv(2)); if (stageID < 0 || stageID >= image->material.num_stages) { Com_Printf("Given stage index (%i) is out of bounds\n", stageID); return; } stage = UI_MaterialEditorGetStage(&image->material, stageID); assert(stage); stage->flags |= stageType; Com_ParseValue(stage, value, val->type, val->ofs, val->size, &bytes); /* a texture or envmap means render it */ if (stage->flags & (STAGE_TEXTURE | STAGE_ENVMAP)) stage->flags |= STAGE_RENDER; if (stage->flags & (STAGE_TAPE | STAGE_TERRAIN | STAGE_DIRTMAP)) stage->flags |= STAGE_LIGHTING; } R_ModReloadSurfacesArrays(); }