/// <summary> /// Finds the decl with the given name and type; returning a default version if requested. /// </summary> /// <param name="type"></param> /// <param name="name"></param> /// <param name="makeDefault"> If true, a default decl of appropriate type will be created.</param> /// <returns>Decl with the given name or a default decl of the requested type if not found or null if makeDefault is false.</returns> public T FindType <T>(DeclType type, string name, bool makeDefault) where T : idDecl { if ((name == null) || (name == string.Empty)) { name = "_emptyName"; } idDecl decl = FindTypeWithoutParsing(type, name, makeDefault); if (decl == null) { return(null); } // if it hasn't been parsed yet, parse it now if (decl.State == DeclState.Unparsed) { decl.ParseLocal(); } // mark it as referenced decl.ReferencedThisLevel = true; decl.EverReferenced = true; if (_insideLevelLoad == true) { decl.ParsedOutsideLevelLoad = false; } return(decl as T); }
/// <summary> /// This finds or creates the decl, but does not cause a parse. This is only used internally. /// </summary> /// <param name="type"></param> /// <param name="name"></param> /// <param name="makeDefault"></param> /// <returns></returns> internal idDecl FindTypeWithoutParsing(DeclType type, string name, bool makeDefault) { if (_declTypes.ContainsKey(type) == false) { idConsole.FatalError("find type without parsing: bad type {0}", type.ToString().ToLower()); } else { string canonicalName = name; foreach (idDecl decl in _declsByType[type]) { if (decl.Name.Equals(canonicalName, StringComparison.OrdinalIgnoreCase) == true) { // only print these when decl_show is set to 2, because it can be a lot of clutter if (idE.CvarSystem.GetInteger("decl_show") > 1) { MediaPrint("referencing {0} {1}", type.ToString().ToLower(), name); } return(decl); } } if (makeDefault == true) { idDecl newDecl = _declTypes[type].Allocator.Create(); newDecl.Name = canonicalName; newDecl.Type = type; newDecl.State = DeclState.Unparsed; newDecl.SourceFile = _implicitDecls; newDecl.ParsedOutsideLevelLoad = !_insideLevelLoad; newDecl.Index = _declsByType[type].Count; _declsByType[type].Add(newDecl); return(newDecl); } } return(null); }
public idDecl DeclByIndex(DeclType type, int index, bool forceParse) { if (_declTypes.ContainsKey(type) == false) { idConsole.FatalError("idDeclManager.DeclByIndex: bad type: {0}", type.ToString().ToLower()); } if ((index < 0) || (index >= _declsByType[type].Count)) { idConsole.Error("idDeclManager.DeclByIndex: out of range [{0}: {1} < {2}]", type, index, _declsByType[type].Count); } idDecl decl = _declsByType[type][index]; if ((forceParse == true) && (decl.State == DeclState.Unparsed)) { decl.ParseLocal(); } return(decl); }
private void ParseDeform(idLexer lexer) { idToken token = lexer.ExpectAnyToken(); if(token == null) { return; } string tokenValue = token.ToString(); string tokenLower = tokenValue.ToLower(); if(tokenLower == "sprite") { _deformType = DeformType.Sprite; _cullType = CullType.TwoSided; this.MaterialFlag = MaterialFlags.NoShadows; } else if(tokenLower == "tube") { _deformType = DeformType.Tube; _cullType = CullType.TwoSided; this.MaterialFlag = MaterialFlags.NoShadows; } else if(tokenLower == "flare") { _deformType = DeformType.Flare; _cullType = CullType.TwoSided; _deformRegisters[0] = ParseExpression(lexer); this.MaterialFlag = MaterialFlags.NoShadows; } else if(tokenLower == "expand") { _deformType = DeformType.Expand; _deformRegisters[0] = ParseExpression(lexer); } else if(tokenLower == "move") { _deformType = DeformType.Move; _deformRegisters[0] = ParseExpression(lexer); } else if(tokenLower == "turbulent") { _deformType = DeformType.Turbulent; if((token = lexer.ExpectAnyToken()) == null) { lexer.Warning("deform particle missing particle name"); this.MaterialFlag = MaterialFlags.Defaulted; } else { _deformDecl = idE.DeclManager.FindType(DeclType.Table, token.ToString(), true); _deformRegisters[0] = ParseExpression(lexer); _deformRegisters[1] = ParseExpression(lexer); _deformRegisters[2] = ParseExpression(lexer); } } else if(tokenLower == "eyeball") { _deformType = DeformType.Eyeball; } else if(tokenLower == "particle") { _deformType = DeformType.Particle; if((token = lexer.ExpectAnyToken()) == null) { lexer.Warning("deform particle missing particle name"); this.MaterialFlag = MaterialFlags.Defaulted; } else { _deformDecl = idE.DeclManager.FindType(DeclType.Particle, token.ToString(), true); } } else if(tokenLower == "particle2") { _deformType = DeformType.Particle2; if((token = lexer.ExpectAnyToken()) == null) { lexer.Warning("deform particle missing particle name"); this.MaterialFlag = MaterialFlags.Defaulted; } else { _deformDecl = idE.DeclManager.FindType(DeclType.Table, token.ToString(), true); _deformRegisters[0] = ParseExpression(lexer); _deformRegisters[1] = ParseExpression(lexer); _deformRegisters[2] = ParseExpression(lexer); } } else { lexer.Warning("Bad deform type '{0}'", tokenValue); this.MaterialFlag = MaterialFlags.Defaulted; } }