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); } }
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); }
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); }
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); } }
public Figure3D(Scene3D s) { if (ID == 0) { ID = s.GenerateFreeID(); } }
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); */ }
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); } }
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); */ }
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]); } }
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; }
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)); } }
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); }
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); }
static public void AddPapiped(Rays._3D.Scene3D s, Vector3 v1, Vector3 v2) { }
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); }