Example #1
0
        public void Draw()
        {
            if (DynamoAsm.HasShutdown)
            {
                return;
            }

            if (this.RenderDescription == null)
            {
                this.RenderDescription = new RenderDescription();
            }
            else
            {
                this.RenderDescription.ClearAll();
            }

            foreach (GraphicItem g in _graphicItems)
            {
                FloatList point_vertices = g.point_vertices_threadsafe();

                for (int i = 0; i < point_vertices.Count; i += 3)
                {
                    this.RenderDescription.points.Add(new Point3D(point_vertices[i],
                                                                  point_vertices[i + 1], point_vertices[i + 2]));
                }

                SizeTList num_line_strip_vertices = g.num_line_strip_vertices_threadsafe();
                FloatList line_strip_vertices     = g.line_strip_vertices_threadsafe();

                int counter = 0;

                foreach (uint num_verts in num_line_strip_vertices)
                {
                    for (int i = 0; i < num_verts; ++i)
                    {
                        Point3D p = new Point3D(
                            line_strip_vertices[counter],
                            line_strip_vertices[counter + 1],
                            line_strip_vertices[counter + 2]);

                        this.RenderDescription.lines.Add(p);

                        counter += 3;

                        if (i == 0 || i == num_verts - 1)
                        {
                            continue;
                        }

                        this.RenderDescription.lines.Add(p);
                    }
                }

                FloatList triangle_vertices = g.triangle_vertices_threadsafe();

                List <int>     indices_front = new List <int>();
                List <int>     indices_back  = new List <int>();
                List <Point3D> vertices      = new List <Point3D>();

                for (int i = 0; i < triangle_vertices.Count / 9; ++i)
                {
                    for (int k = 0; k < 3; ++k)
                    {
                        int index = i * 9 + k * 3;

                        Point3D new_point = new Point3D(triangle_vertices[index],
                                                        triangle_vertices[index + 1],
                                                        triangle_vertices[index + 2]);

                        bool new_point_exists = false;
                        for (int l = 0; l < vertices.Count; ++l)
                        {
                            Point3D p = vertices[l];
                            if ((p.X == new_point.X) && (p.Y == new_point.Y) && (p.Z == new_point.Z))
                            {
                                indices_front.Add(l);
                                new_point_exists = true;
                                break;
                            }
                        }

                        if (new_point_exists)
                        {
                            continue;
                        }

                        indices_front.Add(vertices.Count);
                        vertices.Add(new_point);
                    }

                    int a = indices_front[indices_front.Count - 3];
                    int b = indices_front[indices_front.Count - 2];
                    int c = indices_front[indices_front.Count - 1];

                    indices_back.Add(c);
                    indices_back.Add(b);
                    indices_back.Add(a);
                }

                this.RenderDescription.meshes.Add(new Mesh3D(vertices, indices_front));
                this.RenderDescription.meshes.Add(new Mesh3D(vertices, indices_back));
            }
        }
        public static void DrawLibGGraphicItem(NodeModel node, object geom, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            var selected = DynamoSelection.Instance.Selection.Contains(node);
            var g        = geom as GraphicItem;

            if (g is CoordinateSystem)
            {
                #region draw coordinate systems

                var line_strip_vertices = g.line_strip_vertices_threadsafe();

                for (int i = 0; i < line_strip_vertices.Count; i += 6)
                {
                    var p1 = new Point3D(
                        line_strip_vertices[i],
                        line_strip_vertices[i + 1],
                        line_strip_vertices[i + 2]);

                    var p2 = new Point3D(
                        line_strip_vertices[i + 3],
                        line_strip_vertices[i + 4],
                        line_strip_vertices[i + 5]);

                    if (i < 6)
                    {
                        rd.XAxisPoints.Add(p1);
                        rd.XAxisPoints.Add(p2);
                    }
                    else if (i >= 6 && i < 12)
                    {
                        rd.YAxisPoints.Add(p1);
                        rd.YAxisPoints.Add(p2);
                    }
                    else
                    {
                        rd.ZAxisPoints.Add(p1);
                        rd.ZAxisPoints.Add(p2);
                    }
                }

                #endregion
            }
            else
            {
                #region draw points

                var point_vertices = g.point_vertices_threadsafe();

                for (int i = 0; i < point_vertices.Count; i += 3)
                {
                    if (selected)
                    {
                        rd.SelectedPoints.Add(new Point3D(point_vertices[i],
                                                          point_vertices[i + 1], point_vertices[i + 2]));
                    }
                    else
                    {
                        rd.Points.Add(new Point3D(point_vertices[i],
                                                  point_vertices[i + 1], point_vertices[i + 2]));
                    }
                }

                #endregion

                #region draw lines

                SizeTList num_line_strip_vertices = g.num_line_strip_vertices_threadsafe();
                FloatList line_strip_vertices     = g.line_strip_vertices_threadsafe();

                int counter = 0;

                foreach (uint num_verts in num_line_strip_vertices)
                {
                    for (int i = 0; i < num_verts; ++i)
                    {
                        var p = new Point3D(
                            line_strip_vertices[counter],
                            line_strip_vertices[counter + 1],
                            line_strip_vertices[counter + 2]);

                        if (selected)
                        {
                            rd.SelectedLines.Add(p);
                        }
                        else
                        {
                            rd.Lines.Add(p);
                        }

                        counter += 3;

                        if (i == 0 || i == num_verts - 1)
                        {
                            continue;
                        }

                        if (selected)
                        {
                            rd.SelectedLines.Add(p);
                        }
                        else
                        {
                            rd.Lines.Add(p);
                        }
                    }
                }

                #endregion

                #region draw surface

                //var sw = new Stopwatch();
                //sw.Start();

                var builder = new MeshBuilder();
                var points  = new Point3DCollection();
                var tex     = new PointCollection();
                var norms   = new Vector3DCollection();
                var tris    = new List <int>();

                FloatList triangle_vertices = g.triangle_vertices_threadsafe();
                FloatList triangle_normals  = g.triangle_normals_threadsafe();

                for (int i = 0; i < triangle_vertices.Count; i += 3)
                {
                    var new_point = new Point3D(triangle_vertices[i],
                                                triangle_vertices[i + 1],
                                                triangle_vertices[i + 2]);

                    var normal = new Vector3D(triangle_normals[i],
                                              triangle_normals[i + 1],
                                              triangle_normals[i + 2]);

                    //find a matching point
                    //compare the angle between the normals
                    //to discern a 'break' angle for adjacent faces
                    //int foundIndex = -1;
                    //for (int j = 0; j < points.Count; j++)
                    //{
                    //    var testPt = points[j];
                    //    var testNorm = norms[j];
                    //    var ang = Vector3D.AngleBetween(normal, testNorm);

                    //    if (new_point.X == testPt.X &&
                    //        new_point.Y == testPt.Y &&
                    //        new_point.Z == testPt.Z &&
                    //        ang > 90.0000)
                    //    {
                    //        foundIndex = j;
                    //        break;
                    //    }
                    //}

                    //if (foundIndex != -1)
                    //{
                    //    tris.Add(foundIndex);
                    //    continue;
                    //}

                    tris.Add(points.Count);
                    points.Add(new_point);
                    norms.Add(normal);
                    tex.Add(new System.Windows.Point(0, 0));

                    octree.AddNode(new_point.X, new_point.Y, new_point.Z, node.GUID.ToString());
                }

                //builder.AddTriangles(points, norms, tex);
                builder.Append(points, tris, norms, tex);

                //sw.Stop();
                //Debug.WriteLine(string.Format("{0} elapsed for drawing geometry.", sw.Elapsed));

                //don't add empty meshes
                if (builder.Positions.Count > 0)
                {
                    if (selected)
                    {
                        rd.SelectedMeshes.Add(builder.ToMesh(true));
                    }
                    else
                    {
                        rd.Meshes.Add(builder.ToMesh(true));
                    }
                }

                #endregion
            }
        }