예제 #1
0
            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);
            }
예제 #2
0
        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;
        }
예제 #3
0
파일: QuadMesh.cs 프로젝트: zwcloud/ImGui
        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;
        }
예제 #4
0
        /// <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;
                }
            }
        }
예제 #5
0
        /// <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;
                }
            }
        }
예제 #6
0
        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();
            }
        }