public void AppendOneToAnother() { VertexBuffer buffer = new VertexBuffer(2); buffer.Resize(2); buffer[0] = new DrawVertex { pos = new Point(0, 0) }; buffer[1] = new DrawVertex { pos = new Point(1, 0) }; VertexBuffer bufferToAppend = new VertexBuffer(3); bufferToAppend.Resize(3); bufferToAppend[0] = new DrawVertex { pos = new Point(2, 0) }; bufferToAppend[1] = new DrawVertex { pos = new Point(3, 0) }; bufferToAppend[2] = new DrawVertex { pos = new Point(4, 0) }; buffer.Append(bufferToAppend); Assert.Equal(5, buffer.Count); Assert.Equal(2, buffer[2].pos.x); Assert.Equal(3, buffer[3].pos.x); Assert.Equal(4, buffer[4].pos.x); }
public QuadMesh() { this.CommandBuffer.Add(new DrawCommand { }); this.PrimReserve(6, 4); var vertex0 = new DrawVertex { pos = new Point(-1, 1), uv = new Point(0, 1), color = Color.White }; var vertex1 = new DrawVertex { pos = new Point(1, 1), uv = new Point(1, 1), color = Color.White }; var vertex2 = new DrawVertex { pos = new Point(1, -1), uv = new Point(1, 0), color = Color.White }; var vertex3 = new DrawVertex { pos = new Point(-1, -1), uv = new Point(0, 0), color = Color.White }; this.AppendVertex(vertex0); this.AppendVertex(vertex1); this.AppendVertex(vertex2); this.AppendVertex(vertex3); this.AppendIndex(0); this.AppendIndex(1); this.AppendIndex(2); this.AppendIndex(0); this.AppendIndex(2); this.AppendIndex(3); this.currentIdx += 4; }
public QuadMesh(Rect rect, Color color) { PrimReserve(6, 4); var min = rect.Min; var max = rect.Max; var vertex0 = new DrawVertex { pos = new Point(min.X, max.Y), uv = new Point(0, 1), color = color }; var vertex1 = new DrawVertex { pos = new Point(max.X, max.Y), uv = new Point(1, 1), color = color }; var vertex2 = new DrawVertex { pos = new Point(max.X, min.Y), uv = new Point(1, 0), color = color }; var vertex3 = new DrawVertex { pos = new Point(min.X, min.Y), uv = new Point(0, 0), color = color }; AppendVertex(vertex0); AppendVertex(vertex1); AppendVertex(vertex2); AppendVertex(vertex3); AppendIndex(0); AppendIndex(1); AppendIndex(2); AppendIndex(0); AppendIndex(2); AppendIndex(3); currentIdx += 4; }
/// <summary> /// Add a poly line with offset. /// </summary> /// <param name="points">points</param> /// <param name="offset">offset that applies to every point</param> /// <param name="color">color</param> /// <param name="close">Should this method close the polyline for you? A line segment from the last point to first point will be added if this is true.</param> /// <param name="thickness">thickness</param> /// <param name="antiAliased">anti-aliased</param> public void AddPolyline(IList <Point> points, Vector offset, Color color, bool close, double thickness, bool antiAliased = false) { var pointsCount = points.Count; if (pointsCount < 2) { return; } int count = pointsCount; if (!close) { count = pointsCount - 1; } if (antiAliased) { throw new NotImplementedException(); } else { // Non Anti-aliased Stroke int idxCount = count * 6; int vtxCount = count * 4; // FIXME: Not sharing edges this.ShapeMesh.PrimReserve(idxCount, vtxCount); for (int i1 = 0; i1 < count; i1++) { int i2 = (i1 + 1) == pointsCount ? 0 : i1 + 1; Point p1 = points[i1]; Point p2 = points[i2]; double dx = p2.x - p1.x; double dy = p2.y - p1.y; MathEx.NORMALIZE2F_OVER_ZERO(ref dx, ref dy); dx *= (thickness * 0.5); dy *= (thickness * 0.5); p1 += offset; p2 += offset; var vertex0 = new DrawVertex { pos = new Point(p1.X + dy, p1.Y - dx), uv = Point.Zero, color = color }; var vertex1 = new DrawVertex { pos = new Point(p2.X + dy, p2.Y - dx), uv = Point.Zero, color = color }; var vertex2 = new DrawVertex { pos = new Point(p2.X - dy, p2.Y + dx), uv = Point.Zero, color = color }; var vertex3 = new DrawVertex { pos = new Point(p1.X - dy, p1.Y + dx), uv = Point.Zero, color = color }; this.ShapeMesh.AppendVertex(vertex0); this.ShapeMesh.AppendVertex(vertex1); this.ShapeMesh.AppendVertex(vertex2); this.ShapeMesh.AppendVertex(vertex3); this.ShapeMesh.AppendIndex(0); this.ShapeMesh.AppendIndex(1); this.ShapeMesh.AppendIndex(2); this.ShapeMesh.AppendIndex(0); this.ShapeMesh.AppendIndex(2); this.ShapeMesh.AppendIndex(3); this.ShapeMesh.currentIdx += 4; } } }
/// <summary> /// Add a poly line. /// </summary> /// <param name="points">points</param> /// <param name="color">color</param> /// <param name="close">Should this method close the polyline for you? A line segment from the last point to first point will be added if this is true.</param> /// <param name="thickness">thickness</param> /// <param name="antiAliased">anti-aliased</param> public void AddPolyline(IList <Point> points, Color color, bool close, double thickness, bool antiAliased = false) { var pointsCount = points.Count; if (pointsCount < 2) { return; } int count = pointsCount; if (!close) { count = pointsCount - 1; } if (antiAliased) { throw new NotImplementedException(); } else { // Non Anti-aliased Stroke int idxCount = count * 6; int vtxCount = count * 4; // FIXME: Not sharing edges this.ShapeMesh.PrimReserve(idxCount, vtxCount); for (int i1 = 0; i1 < count; i1++) { int i2 = (i1 + 1) == pointsCount ? 0 : i1 + 1; Point p1 = points[i1]; Point p2 = points[i2]; Vector diff = p2 - p1; diff *= MathEx.InverseLength(diff, 1.0f); float dx = (float)(diff.X * (thickness * 0.5f)); float dy = (float)(diff.Y * (thickness * 0.5f)); var vertex0 = new DrawVertex { pos = new Point(p1.X + dy, p1.Y - dx), uv = Point.Zero, color = color }; var vertex1 = new DrawVertex { pos = new Point(p2.X + dy, p2.Y - dx), uv = Point.Zero, color = color }; var vertex2 = new DrawVertex { pos = new Point(p2.X - dy, p2.Y + dx), uv = Point.Zero, color = color }; var vertex3 = new DrawVertex { pos = new Point(p1.X - dy, p1.Y + dx), uv = Point.Zero, color = color }; this.ShapeMesh.AppendVertex(vertex0); this.ShapeMesh.AppendVertex(vertex1); this.ShapeMesh.AppendVertex(vertex2); this.ShapeMesh.AppendVertex(vertex3); this.ShapeMesh.AppendIndex(0); this.ShapeMesh.AppendIndex(1); this.ShapeMesh.AppendIndex(2); this.ShapeMesh.AppendIndex(0); this.ShapeMesh.AppendIndex(2); this.ShapeMesh.AppendIndex(3); this.ShapeMesh.currentIdx += 4; } } }
private static void NodeDrawCommand(Mesh mesh, int cmdIndex) { DrawCommand cmd = mesh.CommandBuffer[cmdIndex]; if (cmd.ElemCount == 0) { return; } var tex = cmd.TextureData; var texId = 0; if (tex != null) { texId = tex.GetNativeTextureId(); } var clipRect = cmd.ClipRect; var minX = clipRect.Min.X; var minY = clipRect.Min.Y; var maxX = clipRect.Max.X; var maxY = clipRect.Max.Y; if (TreeNode($"Draw {cmd.ElemCount/3,4} triangles," + $" tex 0x{texId:X8}," + $" clip_rect ({minX,7:.0},{minY,7:.0})-({maxX,7:.0},{maxY,7:.0})")) { Text($"Mesh: ElemCount: {cmd.ElemCount}, ElemCount/3: {cmd.ElemCount/3}"); if (IsItemHovered()) { var pen = new Pen(Color.Yellow, 1); var g = GetCurrentContext(); for (int i = 0; i < cmd.ElemCount; i += 3) { var v0 = mesh.VertexBuffer[i].pos; var v1 = mesh.VertexBuffer[i + 1].pos; var v2 = mesh.VertexBuffer[i + 2].pos; Form.current.ForegroundDrawingContext.DrawLine(pen, v0, v1); Form.current.ForegroundDrawingContext.DrawLine(pen, v1, v2); Form.current.ForegroundDrawingContext.DrawLine(pen, v2, v0); } } var indexBuffer = mesh.IndexBuffer; var triangles_pos = new Point[3]; for (int elemIndex = 0, idx_i = 0; elemIndex < cmd.ElemCount; elemIndex++) { string str = ""; for (int n = 0; n < 3; n++, idx_i++) { var vtx_i = indexBuffer[idx_i]; DrawVertex v = mesh.VertexBuffer[vtx_i]; triangles_pos[n] = v.pos; str += string.Format( "{0} {1:0000}: pos ({2,8:F2},{3,8:F2}), uv ({4:F6}, {5:F6}), col {6}\n", (n == 0) ? "elem" : " ", idx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.color); } str = str.TrimEnd('\n'); Selectable(str, false); if (IsItemHovered()) { var pen = new Pen(Color.Yellow, 1); var g = GetCurrentContext(); Form.current.ForegroundDrawingContext.DrawLine(pen, triangles_pos[0], triangles_pos[1]); Form.current.ForegroundDrawingContext.DrawLine(pen, triangles_pos[1], triangles_pos[2]); Form.current.ForegroundDrawingContext.DrawLine(pen, triangles_pos[2], triangles_pos[0]); } } TreePop(); } }