Beispiel #1
0
        private void RT_Thread(object par)
        {
            Scene3D MyScene = (Scene3D)par;

            try
            {
                Log("Thread created " + MyScene.Tag);
                MyScene.AllRays = RecursiveTracing(MyScene, MyScene.InitialRays, 0);
                object O = new object();
                lock (O)
                {
                    if (CurrentScene != null)
                    {
                        CurrentScene.AllRays.AddRange(MyScene.AllRays);
                    }
                }
                Log("Thread completed " + MyScene.Tag);
            }
            catch (Exception Ex)
            {
                MessageBox.Show("Exception! " + Ex.Message + "\n\r" + Ex.StackTrace);
                Log("Exception! " + Ex.Message + "\n\r" + Ex.StackTrace);
            }
            finally
            {
                UpdateProgress(MyScene.Tag, true);
            }
        }
Beispiel #2
0
    static public void Load(Rays._3D.Scene3D s)
    {
        string sf = "";
        var    dr = Utils.InputBox("What?", "Ololo", ref sf);

        s.BeginFigure();
        s.PlaneType  = PlaneType.Normal;
        s.InnerDelta = 0;


        Tube3D tube = new Tube3D();

        tube.Rays[0].Begin = new Vector3(-10, -100, 20);
        tube.Rays[1].Begin = new Vector3(20, -100, -40);
        tube.Rays[2].Begin = new Vector3(20, -100, 20);

        tube.Rays[0].End = new Vector3(-10, -10, 20);
        tube.Rays[1].End = new Vector3(20, -10, -40);
        tube.Rays[2].End = new Vector3(20, -10, 20);

        tube.Rayize();

        s.InitialRays.Add(tube);

        s.InnerN = 3.5;


        s.EndFigure();
        //	s.Figs[0].Rotate(-10, 'x');
        s.Figs[0].Transpose(0, -40, 0);
    }
Beispiel #3
0
    static public void Load(Rays._3D.Scene3D s)
    {
        ss = s;
        s.BeginFigure();
        s.PlaneType  = PlaneType.Antireflection;
        s.InnerDelta = 0;
        s.InnerN     = 2;


        /*AddQuad(s,
         *      new Vector3(-50, 0, -50),
         *      new Vector3(-50, 0, 50),
         *      new Vector3(50, 0, -50),
         *      new Vector3(50, 0, 50));
         */
        DrawFan(new Vector3(0, 0, 0), 10, 100);
        s.EndFigure();
        //	if(!Debug)

        s.BeginFigure();
        DrawFan(new Vector3(10, 0, 0), 10, 100, -10);
        s.EndFigure();


        //s.Figs[0].Rotate(-1, 'x');


        InitRays(new Vector3(-100, 0, 0), 10, 50);
    }
Beispiel #4
0
        public void ApplyTransform(Scene3D s)
        {
            TransformedFaces.Clear();
            MyAABB = new AABB();

            Matrix TrfM = TransformToMatrix();

            Figure3D ParrentF = s.Figs.Find(f => f.ID == this.ParrentID);
            Matrix   ParrentM = ParrentF != null?ParrentF.GetTrasnformRecursive(s, 0) : null;

            foreach (Plane3D F in Faces)
            {
                Plane3D newF = new Plane3D(F);
                for (int i = 0; i < 3; ++i)
                {
                    if (ParrentF != null)
                    {
                        newF.Vertex[i] = newF.Vertex[i].MultMatrix(ParrentM);
                    }
                    newF.Vertex[i] = newF.Vertex[i].MultMatrix(TrfM);
                    MyAABB.Extend(newF.Vertex[i]);
                }
                newF.ID = ID;
                newF.CalcNormal();
                TransformedFaces.Add(newF);
            }
        }
Beispiel #5
0
 public Figure3D(Scene3D s)
 {
     if (ID == 0)
     {
         ID = s.GenerateFreeID();
     }
 }
Beispiel #6
0
    static public void Load(Rays._3D.Scene3D s)
    {
        ss = s;
        s.BeginFigure();


        Model model = new ThreeDSFile(@"SampleScripts\fachwerk40T.3ds").ThreeDSModel;

        foreach (Entity e in model.Entities)
        {
            foreach (Triangle t in e.indices)
            {
                s.ModelAdd(
                    new Vector3[3] {
                    new Vector3(e.vertices[t.vertex1].X, e.vertices[t.vertex1].Y, e.vertices[t.vertex1].Z),
                    new Vector3(e.vertices[t.vertex2].X, e.vertices[t.vertex2].Y, e.vertices[t.vertex2].Z),
                    new Vector3(e.vertices[t.vertex3].X, e.vertices[t.vertex3].Y, e.vertices[t.vertex3].Z)
                },
                    new Vector3[3] {
                    new Vector3(e.normals[t.vertex1].X, e.normals[t.vertex1].Y, e.normals[t.vertex1].Z),
                    new Vector3(e.normals[t.vertex2].X, e.normals[t.vertex2].Y, e.normals[t.vertex2].Z),
                    new Vector3(e.normals[t.vertex3].X, e.normals[t.vertex3].Y, e.normals[t.vertex3].Z)
                });
            }
        }
        s.EndFigure();
        s.Figs[0].Scale1(new Vector3(10, 10, 10));

        InitRays(new Vector3(-100, 0, 0), 10, 50);

        /*s.Add(-50, 0, -50, 50, 10, -50, 50, 20, 50);
         * s.Add(-50, 0, -50, 50, 20, 50, -50, 10, 50);
         */
    }
Beispiel #7
0
 public void RayTracing(Scene3D MyScene)
 {
     try
     {
         MyScene.ProgressPercent = 0;
         MyScene.RayCnt          = 0;
         InWork          = true;
         MyScene.AllRays = RecursiveTracing(MyScene, MyScene.InitialRays, 0);
         InWork          = false;
     }
     catch (Exception Ex)
     {
         Log("Exception! " + Ex.Message + "\n\r" + Ex.StackTrace);
     }
 }
Beispiel #8
0
    static public void Load(Rays._3D.Scene3D s)
    {
        s.BeginFigure();


        Model model = new ThreeDSFile(@"SampleScripts\12column-model-3d.3DS").ThreeDSModel;

        foreach (Entity e in model.Entities)
        {
            foreach (Triangle t in e.indices)
            {
                s.ModelAdd(
                    new Vector3[3] {
                    new Vector3(e.vertices[t.vertex1].X, e.vertices[t.vertex1].Y, e.vertices[t.vertex1].Z),
                    new Vector3(e.vertices[t.vertex2].X, e.vertices[t.vertex2].Y, e.vertices[t.vertex2].Z),
                    new Vector3(e.vertices[t.vertex3].X, e.vertices[t.vertex3].Y, e.vertices[t.vertex3].Z)
                },
                    new Vector3[3] {
                    new Vector3(e.normals[t.vertex1].X, e.normals[t.vertex1].Y, e.normals[t.vertex1].Z),
                    new Vector3(e.normals[t.vertex2].X, e.normals[t.vertex2].Y, e.normals[t.vertex2].Z),
                    new Vector3(e.normals[t.vertex3].X, e.normals[t.vertex3].Y, e.normals[t.vertex3].Z)
                });
            }
        }
        s.EndFigure();
        s.Figs[0].Rotate1(Math.PI / 2, 'x');
        s.Figs[0].Transpose1(new Vector3(0, 0, 0));

        Tube3D tube = new Tube3D();

        tube.Rays[0].Begin = new Vector3(3, -100, 2);
        tube.Rays[1].Begin = new Vector3(20, -100, 2);
        tube.Rays[2].Begin = new Vector3(1, -100, 20);

        tube.Rays[0].End = new Vector3(3, -11, 2);
        tube.Rays[1].End = new Vector3(20, -11, 2);
        tube.Rays[2].End = new Vector3(1, -11, 20);

        tube.Rayize();

        s.InnerN = 1.5;

        s.InitialRays.Add(tube);

        /*s.Add(-50, 0, -50, 50, 10, -50, 50, 20, 50);
         * s.Add(-50, 0, -50, 50, 20, 50, -50, 10, 50);
         */
    }
Beispiel #9
0
        public void RayTracingThreaded(Scene3D MyScene, uint ThrNum = 4)
        {
            if (ThrNum < 1)
            {
                ThrNum = 1;
            }
            if (ThrNum > MaxThrN)
            {
                ThrNum = MaxThrN;
            }

            uint IR_C = (uint)MyScene.InitialRays.Count;

            if (IR_C < ThrNum)
            {
                ThrNum = (uint)IR_C;
            }


            MyScene.AllRays = new List <Tube3D>();
            CurrentScene    = MyScene;
            InWork          = true;
            Scene_List      = new Scene3D[ThrNum];
            Thr_List        = new Thread[ThrNum];

            double d = (double)(IR_C) / ThrNum;

            d = Math.Floor(d);
            int RangeSz = (int)d;

            for (int i = 0; i < ThrNum; ++i)
            {
                Scene_List[i]                 = new Scene3D();
                Scene_List[i].Figs            = MyScene.Figs;
                Scene_List[i].Tag             = i;
                Scene_List[i].RayCnt          = 0;
                Scene_List[i].Ready           = false;
                Scene_List[i].ShouldTerminate = false;
                Scene_List[i].InitialRays     = MyScene.InitialRays.GetRange(i * RangeSz, i != ((int)ThrNum) - 1 ? RangeSz : (int)IR_C - i * RangeSz);

                Log("Thread " + i + " RaysNum = " + Scene_List[i].InitialRays.Count);

                Thr_List[i] = new Thread(RT_Thread);
                Thr_List[i].Start(Scene_List[i]);
            }
        }
Beispiel #10
0
        public void BuildTree(Scene3D Scene)
        {
            Root = new OctreeNode();
            foreach (Figure3D F in Scene.Figs)
            {
                Root.Faces.AddRange(F.Faces);
                foreach (Plane3D Face in F.Faces)
                {
                    Root.MyAABB.Extend(Face.Vertex[0]);
                    Root.MyAABB.Extend(Face.Vertex[1]);
                    Root.MyAABB.Extend(Face.Vertex[2]);
                }
            }
            Root.MyAABB.Cubize();

            BuildTreeRecursive(Root);
            Built = true;
        }
Beispiel #11
0
        public Matrix GetTrasnformRecursive(Scene3D s, int Call = 0)
        {
            if (Call > 10)
            {
                return(new Matrix(Matrix.Identity(4)));
            }

            Figure3D ParrentF = s.Figs.Find(f => f.ID == this.ParrentID);

            if (ParrentF == null)
            {
                return(TransformToMatrix());
            }
            else
            {
                return(TransformToMatrix() * ParrentF.GetTrasnformRecursive(s, Call + 1));
            }
        }
Beispiel #12
0
    static public void Load(Rays._3D.Scene3D s)
    {
        s.BeginFigure();
        s.PlaneType  = PlaneType.Normal;
        s.InnerDelta = 0;


        Tube3D tube = new Tube3D();

        tube.Rays[0].Begin = new Vector3(-10, -100, 20);
        tube.Rays[1].Begin = new Vector3(20, -100, -40);
        tube.Rays[2].Begin = new Vector3(20, -100, 20);

        tube.Rays[0].End = new Vector3(-10, -10, 20);
        tube.Rays[1].End = new Vector3(20, -10, -40);
        tube.Rays[2].End = new Vector3(20, -10, 20);

        tube.Rayize();



        s.InitialRays.Add(tube);

        //s.Add(-50, 0, -50, 50, 10, -50, 50, 20, 50);
        //s.Add(-45, 0, -45, 55, 20, 55, -45, 10, 55);
        s.InnerN = 3.5;

        /*AddQuad(s,
         *      new Vector3(-10, -50, -10),
         *      new Vector3(-10, -50, 10),
         *      new Vector3(10, -50, -10),
         *      new Vector3(10, -50, 10));*/

        double mn = -100, mx = 100;

        //	s.Add( RD(mn, mx), 0, RD(mn, mx), RD(mn, mx), 0, RD(mn, mx), RD(mn, mx), 0, RD(mn, mx));
        s.Add(-10, 0, 20, 20, 0, -40, 30, 0, 30);

        s.EndFigure();
        //	s.Figs[0].Rotate1(-10, 'x');
        s.Figs[0].Transpose1(0, -40, 0);
    }
Beispiel #13
0
 static public void AddQuad(Rays._3D.Scene3D s, Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4)
 {
     s.Add(v1.X, v1.Y, v1.Z, v2.X, v2.Y, v2.Z, v3.X, v3.Y, v3.Z);
     //s.Add(v3.X, v3.Y, v3.Z, v2.X, v2.Y, v2.Z, v4.X, v4.Y, v4.Z);
 }
Beispiel #14
0
 static public void AddPapiped(Rays._3D.Scene3D s, Vector3 v1, Vector3 v2)
 {
 }
Beispiel #15
0
        public List <Tube3D> RecursiveTracing(Scene3D MyScene, List <Tube3D> Rays, uint Call = 0, uint AddCnt = 0)
        {
            // Список лучей
            List <Tube3D> Result = new List <Tube3D>();

            if (MyScene.ShouldTerminate)
            {
                MyScene.Ready = true;
                return(Result);
            }

            // Если достигли максимального шага вернем пустой список
            if (Call >= MaxTraceSteps || AddCnt >= 5)
            {
                if (AddCnt >= 5)
                {
                    Log("Stack overflow???");
                }
                Rays.ForEach(R => R.SetLenght(InfinityMVisible));
                return(Rays);
            }

            // Для каждого луча из предложенных на данный шаг
            foreach (Tube3D Ray in Rays)
            {
                // Заморочки многопоточности
                if (MyScene.ShouldTerminate)
                {
                    MyScene.Ready = true;
                    return(Result);
                }
                if (Call == 0 && AddCnt == 0)
                {
                    MyScene.RayCnt++;

                    MyScene.ProgressPercent = 100 * MyScene.RayCnt / MyScene.InitialRays.Count;

                    if (MyScene.ProgressPercent != MyScene.ProgressPercentOld)
                    {
                        UpdateProgress(MyScene.Tag, false);
                        MyScene.ProgressPercentOld = MyScene.ProgressPercent;
                    }
                }

                Log("Call = " + Call + " comment = {{" + Ray.Comment + "}}" + " Area = " + Ray.AreaTop().ToString());

                if (Call == 1)
                {
                    Log("stop call 1");
                }

                // Если мощность трубки исчезающе мала, проигнорируем ее, чтобы не плодить лишних
                // или если площадь нулевая
                if (Ray.Power < MinimumPower || Ray.AreaTopC < MinAreaTop)
                {
                    continue;
                }

                // Устремим концы лучей в бесконечность
                Ray.Rayize();

                // Данные о ближайшем пересечении
                TubeProcessingData MinTpd      = null;
                double             MinDistance = 1e10;
                Plane3D            MinPlane    = null;

                // Для всех граней в сцене
                int fc = -1;
                foreach (Figure3D Fig in MyScene.Figs)
                {
                    foreach (Plane3D Plane in Fig.TransformedFaces)
                    {
                        fc++;
                        // Нам запрещено взаимодействовать с этим треугольником, пропускаем его
                        if (Ray.Prohibit == Plane)
                        {
                            continue;
                        }

                        // Данные о столковении
                        TubeProcessingData Tpd = Plane.ProcessTubeStageOne(Ray);

                        // Если оно имело место и оказалось ближе предыдущего, сохраним эти данные
                        if (Tpd.cs != TTCase.CaseNo && MinDistance > Tpd.Distance)
                        {
                            MinDistance = Tpd.Distance;
                            MinTpd      = Tpd;
                            MinPlane    = Plane;
                        }
                    }
                }

                // Список трубок, которые отправят на следующий этап алгоритма
                List <Tube3D> ToNextCall = new List <Tube3D>();
                // Список трубок, которые получены из падающей трубки путем ее разбиения
                List <Tube3D> SplitTubes = new List <Tube3D>();
                // Список трубок, отсчеченных
                List <Tube3D> ToThisCall = new List <Tube3D>();

                // Если нет никаких пересечений пересечение
                if (MinPlane == null)
                {
                    // Просто сохраним эту трубку с результатах
                    Ray.SetLenght(InfinityMVisible);
                    Result.Add(Ray);
                }
                else
                {
                    Log("Stage 2: " + MinTpd.cs);
                    if (MinTpd.cs == TTCase.CaseUnknown)
                    {
                        Log("Stage 2: Unknown case details: ");
                        Log("   Ic = " + MinTpd.Intersections.Count);
                        Log("   PinT = " + MinTpd.PinT);
                        Log("   TinP = " + MinTpd.TinP);
                    }

                    // Второй этап обработки трубки и треугольника дает нам уже все производные трубки
                    TubeProcessResult Tpr = MinPlane.ProcessTubeStageTwo(MinTpd, Ray, ToNextCall, SplitTubes, ToThisCall);

                    // Добавим трубки составляющее все, что осталось от исходной при отсечке
                    Result.AddRange(SplitTubes);

                    // Добавим результат рекурсивного вызова трассировки для следующего шага (это прел./отр. трубки)
                    Result.AddRange(RecursiveTracing(MyScene, ToNextCall, Call + 2));

                    // Добавим результат рекурсивного вызова трассировки для текущего шага (отсечка)
                    Result.AddRange(RecursiveTracing(MyScene, ToThisCall, Call, AddCnt + 1));
                }
            }

            return(Result);
        }