public Segment(Planet planetInfo, TriangleD noElevationRange, Segment parentChunk, ulong id, ChildPosition childPosition = ChildPosition.NoneNoParent) { ID = id; this.planetInfo = planetInfo; this.parent = parentChunk; this.childPosition = childPosition; this.NoElevationRange = noElevationRange; this.rangeToCalculateScreenSizeOn = noElevationRange; }
void AddRootChunk(ulong id, List <Vector3d> vertices, int A, int B, int C) { var range = new TriangleD() { a = vertices[A], b = vertices[B], c = vertices[C] }; var child = new Segment(this, range, null, id); this.rootSegments.Add(child); }
void AddChild(Vector3d a, Vector3d b, Vector3d c, ChildPosition cp, ulong id) { var range = new TriangleD() { a = a, b = b, c = c }; var child = new Segment(planetInfo, range, this, this.ID << 2 | id); Children.Add(child); child.subdivisionDepth = subdivisionDepth + 1; child.rangeToCalculateScreenSizeOn = range; }
/// <summary> /// Queues a single triangle billboard for rendering /// </summary> public static void AddTriangle(ref TriMaterial mat, ref TriangleD triangle, MatrixD[] matrixRef = null) { var bbPool = instance.bbPoolBack; var bbDataBack = instance.triangleList; int index = bbDataBack.Count; var matList = instance.matrixBuf; var matTable = instance.matrixTable; // Find matrix index in table or add it int matrixID = -1; if (matrixRef != null && !matTable.TryGetValue(matrixRef, out matrixID)) { matrixID = matList.Count; matList.Add(matrixRef[0]); matTable.Add(matrixRef, matrixID); } var bb = new TriangleBillboardData { Item1 = BlendTypeEnum.PostPP, Item2 = new Vector2I(index, matrixID), Item3 = mat.textureID, Item4 = mat.bbColor, Item5 = new MyTuple <Vector2, Vector2, Vector2> ( mat.texCoords.Point0, mat.texCoords.Point1, mat.texCoords.Point2 ), Item6 = new MyTuple <Vector3D, Vector3D, Vector3D> ( triangle.Point0, triangle.Point1, triangle.Point2 ), }; bbDataBack.Add(bb); if (index >= bbPool.Count) { instance.AddNewBB(index - (bbPool.Count - 1)); } MyTransparentGeometry.AddBillboard(bbPool[index], false); }
public void CalculateRealVisibleRange() { if (occluderTringles.Count != 0) { return; } var a = RendererSurface.Mesh.Vertices[planetInfo.AIndexReal]; var b = RendererSurface.Mesh.Vertices[planetInfo.BIndexReal]; var c = RendererSurface.Mesh.Vertices[planetInfo.CIndexReal]; var o = RendererSurface.Offset.ToVector3d(); realVisibleRange.a = a.ToVector3d() + o; realVisibleRange.b = b.ToVector3d() + o; realVisibleRange.c = c.ToVector3d() + o; rangeToCalculateScreenSizeOn = realVisibleRange; var z = a.Distance(b) / 10.0f * -realVisibleRange.Normal.ToVector3(); var sinkDir = a.Distance(b) / 20.0f * -realVisibleRange.Normal.ToVector3(); a += sinkDir; b += sinkDir; c += sinkDir; occluderTringles.Add(a); occluderTringles.Add(z); occluderTringles.Add(b); occluderTringles.Add(b); occluderTringles.Add(z); occluderTringles.Add(c); occluderTringles.Add(c); occluderTringles.Add(z); occluderTringles.Add(a); }
/// <summary>Fills a triangle using the specified brush.</summary> public void FillTriangle(Brush brush, TriangleD triangle) { FillTriangle(brush, triangle.V1, triangle.V2, triangle.V3); }
/// <summary>Draws a triangle using the specified pen.</summary> public void DrawTriangle(Pen pen, TriangleD triangle) { DrawTriangle(pen, triangle.V1, triangle.V2, triangle.V3); }