Ejemplo n.º 1
0
        private unsafe void OnBeginCameraRendering(ScriptableRenderContext ctx, UnityEngine.Camera cam)
        {
            //< -------- -------- -------- -------- -------- -------- -------- ------- //
            // Finish the current job
            //> -------- -------- -------- -------- -------- -------- -------- ------- //
            Profiler.BeginSample("SplineSystem +");
            m_LastJobHandle.Complete();

            var previousCount = -1;
            var array         = default(Vector3[]);
            var validSplines  = m_ValidSplinePerCamera[cam];
            var entities      = m_SplineQuery.ToEntityArray(Allocator.TempJob);

            Profiler.BeginSample("Loop");
            DSplineData spline;
            DynamicBuffer <DSplineResult> result;
            SplineRendererBehaviour       renderer;
            int resultCount;

            for (int i = 0, length = entities.Length; i < length; i++)
            {
                spline = EntityManager.GetComponentData <DSplineData>(entities[i]);
                if (spline.ActivationType == EActivationType.Bounds && !validSplines[i])
                {
                    // ignore spline...
                    continue;
                }

                result   = EntityManager.GetBuffer <DSplineResult>(entities[i]);
                renderer = EntityManager.GetComponentObject <SplineRendererBehaviour>(entities[i]);

                resultCount = result.Length;
                if (renderer.LastLineRendererPositionCount != resultCount)
                {
                    foreach (var lr in renderer.lineRendererArray)
                    {
                        lr.positionCount = resultCount;
                    }

                    renderer.LastLineRendererPositionCount = resultCount;
                }

                if (previousCount != resultCount)
                {
                    previousCount = resultCount;
                    if (!ArrayPoolBySize.RefFastTryGet(resultCount, ref array))
                    {
                        ArrayPoolBySize[resultCount] = array = new Vector3[resultCount];
                    }
                }

                if (array == null)
                {
                    continue;

                    fixed(void *buffer = array)
                    {
                        UnsafeUtility.MemCpy(buffer, result.GetUnsafePtr(), resultCount * sizeof(float3));
                    }

                    var scaling = math.abs(renderer.transform.lossyScale.x);
                    scaling *= renderer.CurveMultiplier;

                    foreach (var lr in renderer.lineRendererArray)
                    {
                        if (!renderer.KeepCurveScaling)
                        {
                            lr.widthMultiplier = scaling;
                        }
                        lr.SetPositions(array);
                    }
            }

            Profiler.EndSample();
            Profiler.EndSample();

            entities.Dispose();
        }