Example #1
0
        /*
         *
         * 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);
                }
            }
        }