Esempio n. 1
0
        public unsafe void CalcNormals(ref GeometryLinePosition result)
        {
            fixed(GeometryLinePosition *tempPtr = &result)
            {
                float *vertPtr = (float *)tempPtr;

                for (int i = 0; i < 3; i++)
                {
                    var Vert0 = new Vector3(vertPtr[i * 3], vertPtr[i * 3 + 1], vertPtr[i * 3 + 2]);
                    var Vert1 = new Vector3(vertPtr[(i + 1) * 3], vertPtr[(i + 1) * 3 + 1], vertPtr[(i + 1) * 3 + 2]);
                    var Vert2 = new Vector3(vertPtr[(i + 2) * 3], vertPtr[(i + 2) * 3 + 1], vertPtr[(i + 2) * 3 + 2]);

                    var v2 = Vert2 - Vert0;
                    var v1 = Vert1 - Vert0;
                    if (v1 == Vector3.Zero)
                    {
                        Vert0 = Vector3.UnitZ;
                    }
                    else
                    {
                        Vert0 = Vector3.Cross(v2, v1);
                        Vert0.Normalize();
                    }

                    vertPtr[(i + 1) * 3]     = Vert0.X;
                    vertPtr[(i + 1) * 3 + 1] = Vert0.Y;
                    vertPtr[(i + 1) * 3 + 2] = Vert0.Z;

                    vertPtr[(i + 2) * 3]     = Vert0.X;
                    vertPtr[(i + 2) * 3 + 1] = Vert0.Y;
                    vertPtr[(i + 2) * 3 + 2] = Vert0.Z;

                    vertPtr[(i + 3) * 3]     = Vert0.X;
                    vertPtr[(i + 3) * 3 + 1] = Vert0.Y;
                    vertPtr[(i + 3) * 3 + 2] = Vert0.Z;

                    vertPtr[(i + 4) * 3]     = Vert0.X;
                    vertPtr[(i + 4) * 3 + 1] = Vert0.Y;
                    vertPtr[(i + 4) * 3 + 2] = Vert0.Z;

                    vertPtr[(i + 5) * 3]     = Vert0.X;
                    vertPtr[(i + 5) * 3 + 1] = Vert0.Y;
                    vertPtr[(i + 5) * 3 + 2] = Vert0.Z;
                }
            }
        }
Esempio n. 2
0
        public void BuildGraph(Support.NativeList <GeometryLinePosition> position, Support.NativeList <GeometryLineUV> uv, float halfWidth)
        {
            BeforeGraph(position);

            var rectUV = new GeometryLineUV();

            rectUV.SetUV();

            Vector3 cur, tar;
            bool    drawing      = true;
            float   remainLength = GetSegment(position);
            bool    isContinued  = false;

            do
            {
                var normal = GetNormalDir();
                NextStartPoint(out cur);
                isContinued = NextEndPoint(out tar); //NextStartPoint(out tar);
                float dist = Vector3.Distance(ref cur, ref tar);
                var   dir  = tar - cur;
                dir.Normalize();
                Vector3 extDir = Vector3.Cross(dir, normal);
                extDir.Normalize();
                while (dist >= remainLength)
                {
                    if (drawing)
                    {
                        var end = cur + dir * remainLength;
                        var l   = new GeometryLinePosition();
                        l.SetLine(ref cur, ref end, ref extDir, halfWidth);
                        //position.Add(l);
                        //uv.Add(rectUV);
                        unsafe
                        {
                            position.Add(l);
                            uv.Add(rectUV);
                        }

                        drawing      = false;
                        dist        -= remainLength;
                        remainLength = GetInterval(position);

                        cur = end;
                    }
                    else
                    {
                        drawing      = true;
                        dist        -= remainLength;
                        cur          = cur + dir * remainLength;
                        remainLength = GetSegment(position);

                        extDir = Vector3.Cross(dir, normal);
                        extDir.Normalize();
                    }
                }

                if (drawing)
                {
                    var end = cur + dir * dist;
                    var l   = new GeometryLinePosition();
                    l.SetLine(ref cur, ref end, ref extDir, halfWidth);
                    remainLength = remainLength - dist;
                    //position.Add(l);
                    //uv.Add(rectUV);
                    unsafe
                    {
                        position.Add(l);
                        uv.Add(rectUV);
                    }
                    dist = 0;
                }
                else
                {
                    remainLength = remainLength - dist;
                    dist         = 0;
                }
            } while (isContinued);
        }