/* * * OBJECT_TYPE CURLY_O object_content CURLY_C; */ public override object VisitObject_block([NotNull] DDD_layout_scriptParser.Object_blockContext context) { DDDObject dddObject = null; switch (context.OBJECT_TYPE().GetText()) { case "circle": dddObject = new Circle(); break; case "cone": dddObject = new Cone(); break; case "cube": dddObject = new Cube(); break; case "cuboid": dddObject = new Cuboid(); break; case "cylinder": dddObject = new Cylinder(); break; case "hemisphere": dddObject = new Hemisphere(); break; case "quad": dddObject = new Quad(); break; case "sphere": dddObject = new Sphere(); break; case "triangle": dddObject = new Triangle(); break; default: alerts.Add(new error(context.Start.Line, $"Undefined object type {context.OBJECT_TYPE().GetText()}")); return(null); } AttributeList attributeList = (AttributeList)VisitObject_content(context.object_content()); if (attributeList == null) { return(null); } if (dddObject.SetAttributes(attributeList) == false) { alerts.Add(new warning(context.Start.Line, $"For '{context.OBJECT_TYPE().GetText()}' [{dddObject.WarningMsg}] attributes are defined. Others will be ignored. " + $"Missing required(*) attributes will default to 0 or [0, 0, 0]")); } if (dddObject != null) { DDDObjects.Add(dddObject); } return(null); }
/* Feladata, hogy összemossa az összes kódban kreált 3D objektum .obj template fájlát egyetlen egy .obj fájllá. * * Mindegyik 3D objektum rendelkezik egy saját .obj template-tel. Ebben az objektum az origóban áll, és minden mérete egység. * Először ezeket a megadott atrribútumok segítségével áttranszformáljuk. * * Megnézzük, hogy a listában az első objektum mennyi vertex-szel és normálvektorral rendelkezik. * Ez ezért fontos mert a rá következő objektum esetében az 'f' előtagos sorok indexelése innen kell, hogy kezdődjön. * */ public override void Export(List <DDDObject> objects) { if (objects.Count == 0) { return; } // Többszálúság ezen a ponton??? TODO ObjFile finalObj = objects[0].GenerateStandaloneObj(); int vertIndex = finalObj.Vertices.Count; int normIndex = finalObj.Normals.Count; for (int i = 1; i < objects.Count; ++i) { DDDObject obj = objects[i]; ObjFile objFile = obj.GenerateStandaloneObj(); List <string> faces = objFile.Faces; List <string> newFaces = new List <string>(faces.Count); foreach (string faceLine in faces) { string face = faceLine + " "; // hozzáteszünk egy space-t a végére így tudjuk, hogy mikor olvastuk végig az összes számot (foreach) int[] VNTriangle = new int[6]; // V//N V//N V//N int tmpNum = 0; int indexToFill = 0; foreach (char c in face) { if (Char.IsDigit(c)) { tmpNum = tmpNum * 10 + int.Parse(c.ToString()); } else { // ha nem számot olvastunk és még várunk számokat if (tmpNum != 0 && indexToFill <= 5) { VNTriangle[indexToFill] = tmpNum; tmpNum = 0; indexToFill++; } } } for (int j = 0; j < 3; ++j) { VNTriangle[2 * j] += vertIndex; VNTriangle[2 * j + 1] += normIndex; } string newFace = $"f {VNTriangle[0]}//{VNTriangle[1]} {VNTriangle[2]}//{VNTriangle[3]} {VNTriangle[4]}//{VNTriangle[5]}"; newFaces.Add(newFace); } finalObj.Vertices.AddRange(objFile.Vertices); finalObj.Normals.AddRange(objFile.Normals); finalObj.Faces.AddRange(newFaces); vertIndex += objFile.Vertices.Count; normIndex += objFile.Normals.Count; } using (StreamWriter sw = new StreamWriter(filename)) { foreach (var vertex in finalObj.Vertices) { sw.WriteLine(vertex); } foreach (var normal in finalObj.Normals) { sw.WriteLine(normal); } foreach (var face in finalObj.Faces) { sw.WriteLine(face); } } }