コード例 #1
0
ファイル: Fleuve.cs プロジェクト: leodar163/KWER
    public void AjouterNoeud(NoeudFleuve nf)
    {
        grapheNoeuds.Add(nf);
        nf.EstSelectionne(true);

        if (grapheNoeuds.Count == 2)
        {
            transform.position = Vector3.zero;
            for (int i = 0; i < grapheNoeuds.Count; i++)
            {
                Vector3 positionNoeud = grapheNoeuds[i].transform.position;
                positionNoeud.z = profondeur;

                spline.InsertPointAt(i, positionNoeud);
                spline.RemovePointAt(i + 1);
            }
        }
        else if (grapheNoeuds.Count > 2)
        {
            Vector3 positionNoeud = grapheNoeuds[grapheNoeuds.Count - 1].transform.position;
            positionNoeud.z = profondeur;
            spline.InsertPointAt(spline.GetPointCount(), positionNoeud);
            //print(spline.GetPointCount());
        }
    }
コード例 #2
0
ファイル: GeometryUtils.cs プロジェクト: jono-m/GameJams
    public static Vector3 SampleAlongSplineSegment(UnityEngine.U2D.Spline spline, int segmentNumber, float t)
    {
        int     b            = (int)Mathf.Repeat(segmentNumber + 1, spline.GetPointCount());
        Vector3 startPoint   = spline.GetPosition(segmentNumber);
        Vector3 startTangent = startPoint + spline.GetRightTangent(segmentNumber);
        Vector3 endPoint     = spline.GetPosition(b);
        Vector3 endTangent   = endPoint + spline.GetLeftTangent(b);

        return(UnityEngine.U2D.BezierUtility.BezierPoint(startPoint, startTangent, endTangent, endPoint, t));
    }
コード例 #3
0
        void BakeMesh(bool needUpdateSpriteArrays)
        {
            if (needUpdateSpriteArrays)
            {
                UpdateSpriteArrays();
            }

            List <ShapeControlPointExperimental> shapePoints   = new List <ShapeControlPointExperimental>();
            List <SpriteShapeMetaData>           shapeMetaData = new List <SpriteShapeMetaData>();

            for (int i = 0; i < m_Spline.GetPointCount(); ++i)
            {
                ShapeControlPointExperimental shapeControlPoint;
                shapeControlPoint.position     = m_Spline.GetPosition(i);
                shapeControlPoint.leftTangent  = m_Spline.GetLeftTangent(i);
                shapeControlPoint.rightTangent = m_Spline.GetRightTangent(i);
                shapeControlPoint.mode         = (int)m_Spline.GetTangentMode(i);
                shapePoints.Add(shapeControlPoint);

                SpriteShapeMetaData metaData;
                metaData.bevelCutoff = m_Spline.GetBevelCutoff(i);
                metaData.bevelSize   = m_Spline.GetBevelSize(i);
                metaData.corner      = m_Spline.GetCorner(i);
                metaData.height      = m_Spline.GetHeight(i);
                metaData.spriteIndex = (uint)m_Spline.GetSpriteIndex(i);
                shapeMetaData.Add(metaData);
            }

            if (spriteShapeRenderer != null && ValidatePoints(shapePoints))
            {
                SpriteShapeUtility.GenerateSpriteShape(spriteShapeRenderer, m_CurrentShapeParameters,
                                                       shapePoints.ToArray(), shapeMetaData.ToArray(), m_AngleRangeInfoArray, m_EdgeSpriteArray,
                                                       m_CornerSpriteArray);
            }

            if (m_DynamicOcclusionOverriden)
            {
                spriteShapeRenderer.allowOcclusionWhenDynamic = m_DynamicOcclusionLocal;
                m_DynamicOcclusionOverriden = false;
            }
        }
コード例 #4
0
ファイル: GeometryUtils.cs プロジェクト: jono-m/GameJams
    public static List <Vector2> ParameterizeSpline(UnityEngine.U2D.Spline spline, float resolution, bool closed)
    {
        resolution = Mathf.Abs(resolution);
        if (resolution == Mathf.Infinity)
        {
            return(null);
        }
        List <Vector2> path = new List <Vector2>();

        for (int i = 0; i < spline.GetPointCount() - (closed ? 0 : 1); i++)
        {
            for (float t = 0.0f; t < 1; t += 1.0f / resolution)
            {
                path.Add(SampleAlongSplineSegment(spline, i, t));
            }
        }
        return(path);
    }
コード例 #5
0
        unsafe JobHandle BakeMesh(bool needUpdateSpriteArrays)
        {
            JobHandle jobHandle = default;

            if (needUpdateSpriteArrays)
            {
                UpdateSprites();
            }

            int pointCount = m_Spline.GetPointCount();
            NativeArray <ShapeControlPoint>   shapePoints   = new NativeArray <ShapeControlPoint>(pointCount, Allocator.Temp);
            NativeArray <SpriteShapeMetaData> shapeMetaData = new NativeArray <SpriteShapeMetaData>(pointCount, Allocator.Temp);

            for (int i = 0; i < pointCount; ++i)
            {
                ShapeControlPoint shapeControlPoint;
                shapeControlPoint.position     = m_Spline.GetPosition(i);
                shapeControlPoint.leftTangent  = m_Spline.GetLeftTangent(i);
                shapeControlPoint.rightTangent = m_Spline.GetRightTangent(i);
                shapeControlPoint.mode         = (int)m_Spline.GetTangentMode(i);
                shapePoints[i] = shapeControlPoint;

                SpriteShapeMetaData metaData;
                metaData.corner      = m_Spline.GetCorner(i);
                metaData.height      = m_Spline.GetHeight(i);
                metaData.spriteIndex = (uint)m_Spline.GetSpriteIndex(i);
                metaData.bevelCutoff = 0;
                metaData.bevelSize   = 0;
                shapeMetaData[i]     = metaData;
            }

            if (spriteShapeRenderer != null && ValidatePoints(shapePoints))
            {
                if (m_LegacyGenerator)
                {
                    SpriteShapeUtility.GenerateSpriteShape(spriteShapeRenderer, m_ActiveShapeParameters,
                                                           shapePoints.ToArray(), shapeMetaData.ToArray(), m_AngleRangeInfoArray, m_EdgeSpriteArray,
                                                           m_CornerSpriteArray);
                }
                else
                {
                    bool  hasSprites    = false;
                    float smallestWidth = 99999.0f;
                    foreach (var sprite in m_SpriteArray)
                    {
                        if (sprite != null)
                        {
                            hasSprites = true;
                            float pixelWidth = BezierUtility.GetSpritePixelWidth(sprite);
                            smallestWidth = (smallestWidth > pixelWidth) ? pixelWidth : smallestWidth;
                        }
                    }

                    // Approximate vertex Array Count.
                    float shapeLength = BezierUtility.BezierLength(shapePoints, splineDetail * splineDetail);
                    int   adjustWidth = hasSprites ? ((int)(shapeLength / smallestWidth) * 6) + (pointCount * 6 * splineDetail) : 0;
                    int   adjustShape = pointCount * 4 * splineDetail;
#if !UNITY_EDITOR
                    adjustShape = (spriteShape != null && spriteShape.fillTexture != null) ? adjustShape : 0;
#endif
                    int maxArrayCount = adjustShape + adjustWidth;

                    // Collider Data
                    if (m_ColliderData.IsCreated)
                    {
                        m_ColliderData.Dispose();
                    }
                    m_ColliderData = new NativeArray <float2>(maxArrayCount, Allocator.Persistent);

                    // Tangent Data
                    if (!m_TangentData.IsCreated)
                    {
                        m_TangentData = new NativeArray <Vector4>(1, Allocator.Persistent);
                    }

                    NativeArray <ushort>             indexArray;
                    NativeSlice <Vector3>            posArray;
                    NativeSlice <Vector2>            uv0Array;
                    NativeArray <Bounds>             bounds    = spriteShapeRenderer.GetBounds();
                    NativeArray <SpriteShapeSegment> geomArray = spriteShapeRenderer.GetSegments(shapePoints.Length * 8);
                    NativeSlice <Vector4>            tanArray  = new NativeSlice <Vector4>(m_TangentData);

                    if (m_EnableTangents)
                    {
                        spriteShapeRenderer.GetChannels(maxArrayCount, out indexArray, out posArray, out uv0Array, out tanArray);
                    }
                    else
                    {
                        spriteShapeRenderer.GetChannels(maxArrayCount, out indexArray, out posArray, out uv0Array);
                    }

                    var spriteShapeJob = new SpriteShapeGenerator()
                    {
                        m_Bounds         = bounds,
                        m_PosArray       = posArray,
                        m_Uv0Array       = uv0Array,
                        m_TanArray       = tanArray,
                        m_GeomArray      = geomArray,
                        m_IndexArray     = indexArray,
                        m_ColliderPoints = m_ColliderData
                    };
                    spriteShapeJob.Prepare(this, m_ActiveShapeParameters, maxArrayCount, shapePoints, shapeMetaData, m_AngleRangeInfoArray, m_EdgeSpriteArray, m_CornerSpriteArray);
                    jobHandle = spriteShapeJob.Schedule();
                    spriteShapeRenderer.Prepare(jobHandle, m_ActiveShapeParameters, m_SpriteArray);
                    JobHandle.ScheduleBatchedJobs();
                }
            }

            if (m_DynamicOcclusionOverriden)
            {
                spriteShapeRenderer.allowOcclusionWhenDynamic = m_DynamicOcclusionLocal;
                m_DynamicOcclusionOverriden = false;
            }

            shapePoints.Dispose();
            shapeMetaData.Dispose();
            return(jobHandle);
        }
コード例 #6
0
        JobHandle BakeMesh(bool needUpdateSpriteArrays)
        {
            JobHandle jobHandle = default;

            if (needUpdateSpriteArrays)
            {
                UpdateSprites();
            }

            List <ShapeControlPointExperimental> shapePoints   = new List <ShapeControlPointExperimental>();
            List <SpriteShapeMetaData>           shapeMetaData = new List <SpriteShapeMetaData>();
            int pointCount = m_Spline.GetPointCount();

            for (int i = 0; i < pointCount; ++i)
            {
                ShapeControlPointExperimental shapeControlPoint;
                shapeControlPoint.position     = m_Spline.GetPosition(i);
                shapeControlPoint.leftTangent  = m_Spline.GetLeftTangent(i);
                shapeControlPoint.rightTangent = m_Spline.GetRightTangent(i);
                shapeControlPoint.mode         = (int)m_Spline.GetTangentMode(i);
                shapePoints.Add(shapeControlPoint);

                SpriteShapeMetaData metaData;
                metaData.corner      = m_Spline.GetCorner(i);
                metaData.height      = m_Spline.GetHeight(i);
                metaData.spriteIndex = (uint)m_Spline.GetSpriteIndex(i);
                metaData.bevelCutoff = 0;
                metaData.bevelSize   = 0;
                shapeMetaData.Add(metaData);
            }

            if (spriteShapeRenderer != null && ValidatePoints(shapePoints))
            {
                if (m_LegacyGenerator)
                {
                    SpriteShapeUtility.GenerateSpriteShape(spriteShapeRenderer, m_ActiveShapeParameters,
                                                           shapePoints.ToArray(), shapeMetaData.ToArray(), m_AngleRangeInfoArray, m_EdgeSpriteArray,
                                                           m_CornerSpriteArray);
                }
                else
                {
                    // Allow max quads for each segment to 128.
                    int maxArrayCount = (int)(pointCount * 256 * m_ActiveShapeParameters.splineDetail);
                    if (m_ColliderData.IsCreated)
                    {
                        m_ColliderData.Dispose();
                    }
                    m_ColliderData = new NativeArray <float2>(maxArrayCount, Allocator.Persistent);

                    NativeArray <ushort>  indexArray;
                    NativeSlice <Vector3> posArray;
                    NativeSlice <Vector2> uv0Array;
                    spriteShapeRenderer.GetChannels(maxArrayCount, out indexArray, out posArray, out uv0Array);
                    NativeArray <Bounds>             bounds    = spriteShapeRenderer.GetBounds();
                    NativeArray <SpriteShapeSegment> geomArray = spriteShapeRenderer.GetSegments(shapePoints.Count * 8);

                    var spriteShapeJob = new SpriteShapeGenerator()
                    {
                        m_GeomArray      = geomArray,
                        m_IndexArray     = indexArray,
                        m_PosArray       = posArray,
                        m_Uv0Array       = uv0Array,
                        m_ColliderPoints = m_ColliderData,
                        m_Bounds         = bounds
                    };
                    spriteShapeJob.Prepare(this, m_ActiveShapeParameters, maxArrayCount, shapePoints.ToArray(), shapeMetaData.ToArray(), m_AngleRangeInfoArray, m_EdgeSpriteArray, m_CornerSpriteArray);
                    jobHandle = spriteShapeJob.Schedule();
                    spriteShapeRenderer.Prepare(jobHandle, m_ActiveShapeParameters, m_SpriteArray);
                    JobHandle.ScheduleBatchedJobs();
                }
            }

            if (m_DynamicOcclusionOverriden)
            {
                spriteShapeRenderer.allowOcclusionWhenDynamic = m_DynamicOcclusionLocal;
                m_DynamicOcclusionOverriden = false;
            }
            return(jobHandle);
        }