public virtual bool SetAttributes(AttributeList attrList) { bool ret = true; // Minden attribútum sikeresen hozzáadódott. var attrNameList = attrList.GetAttributeList().Select(attr => attr.Name); // ha az attribute list nem tartalmazza az összes required attribute-ot, akkor default értéket kell használnunk. var intersection = requiredAttributes.Intersect(attrNameList); if (intersection.Count() != requiredAttributes.Count()) { ret = false; } foreach (var attr in attrList) { // Kötelező attribútumok hiánya mát kezelve van, ha olyan jön akkor nem érdekes az if blokk // Ha az adott attribútum nem része az opcionális attribútumok halmazának, az baj. if (!requiredAttributes.Contains(attr.Name) && !allowedAttributes.Contains(attr.Name)) { ret = false; } switch (attr.Name) { case "position": // new vec3, hogy a referenciákat megszüntessük a visitorral position = new vec3(attr.Value); break; case "rotation-angle": rotationAngles.Add(attr.Value); break; case "rotation-axis": rotationAxes.Add(new vec3(attr.Value)); break; case "scale": scale = new vec3(attr.Value); break; case "default": // ősosztály valósítja meg break; } } modelMatrixInverse.Translate(position); modelMatrixInverse.Scale(scale); for (int i = 0; i < rotationAngles.Count; ++i) { Matrix4 rotation = Matrix4.CreateRotationMatrix(rotationAxes[i], rotationAngles[i]); modelMatrixInverse *= rotation; } // TODO jövőre!! /*modelMatrixInverse.Invert(); * modelMatrixInverse.Transpose();*/ // kiírjuk a fejlesztőnek segítségül, hogy milyen attribútummokat használhat az objektumnál. // *-al jelöljük a kötelezőket. if (ret == false) { string wMsg = ""; foreach (var attrName in requiredAttributes) { wMsg += "*" + attrName + ", "; } allowedAttributes.ExceptWith(requiredAttributes); // allowed attributes most már csak a nem kötelező, de használható attribútumokat mutatja. foreach (var attrName in allowedAttributes) { wMsg += attrName + ", "; } wMsg = wMsg.Remove(wMsg.Length - 2); WarningMsg = wMsg; } return(ret); }