0

some bugs found in MeshBuilder

Anonymous 10 years ago 0
This discussion was imported from CodePlex

jpg99 wrote at 2012-08-15 15:17:

hello,

i'm using your toolkit for a project at work . I  have to draw 3d houses from a 2D polygon (plane section of the house), so i experimented with AddExtrudedGeometry, and encountered several difficulties. Eventually i wrote my own function for building the 3d houses, and i don't remember precisely what the problems were (sorry it was a few weeks ago), mostly problems with triangles defined in the wrong sense so that the outside / inside were  inversed.

Here is the code i corrected in MeshBuilder.cs :

    public void AddExtrudedGeometry(IList points, Vector3D xaxis, Point3D p0, Point3D p1)
        {
            var ydirection = Vector3D.CrossProduct(xaxis, p0 - p1);
            ydirection.Normalize();
            xaxis.Normalize();

            int np = 2 * points.Count;
            foreach (var p in points)
            {
                int i0 = this.positions.Count;
                var v = (xaxis * p.X) + (ydirection * p.Y);
                this.positions.Add(p0 + v);
                this.positions.Add(p1 + v);
                v.Normalize();
                if (this.normals != null)
                {
                    this.normals.Add(v);
                    this.normals.Add(v);
                }

                if (this.textureCoordinates != null)
                {
                    this.textureCoordinates.Add(new Point(0, 0));
                    this.textureCoordinates.Add(new Point(1, 0));
                }
               
                int i1 = i0 + 1;
                int i2 = (i0 + 2) % np;
                int i3 = i2 + 1;

                this.triangleIndices.Add(i0);
                this.triangleIndices.Add(i2);
                this.triangleIndices.Add(i1);

                this.triangleIndices.Add(i2);
                this.triangleIndices.Add(i3);
                this.triangleIndices.Add(i1);
            }
        }

    
   public void AddTriangleFan(
            IList fanPositions, IList fanNormals = null, IList fanTextureCoordinates = null)
        {
            if (this.positions == null)
            {
                throw new ArgumentNullException("fanPositions");
            }

            if (fanNormals != null && this.normals == null)
            {
                throw new ArgumentNullException("fanNormals");
            }

            if (fanTextureCoordinates != null && this.textureCoordinates == null)
            {
                throw new ArgumentNullException("fanTextureCoordinates");
            }

            int index0 = this.positions.Count;
            foreach (var p in fanPositions)
            {
                this.positions.Add(p);
            }

            if (this.textureCoordinates != null && fanTextureCoordinates != null)
            {
                foreach (var tc in fanTextureCoordinates)
                {
                    this.textureCoordinates.Add(tc);
                }
            }

            if (this.normals != null && fanNormals != null)
            {
                foreach (var n in fanNormals)
                {
                    this.normals.Add(n);
                }
            }

            int indexEnd = this.positions.Count;
            for (int i = index0; i + 2 < indexEnd; i += 3)
            {
                this.triangleIndices.Add(i);
                this.triangleIndices.Add(i + 1);
                this.triangleIndices.Add(i + 2);
            }
        }


objo wrote at 2012-08-24 09:49:

Thanks for the code! I added http://helixtoolkit.codeplex.com/workitem/9964