예제 #1
0
 static private extern unsafe void RenderSpriteBatchNative(IntPtr emr, int n, DisplayListEntry *batch);
예제 #2
0
 protected abstract unsafe void RenderSpriteBatch(int n, DisplayListEntry *batch);
예제 #3
0
 protected override unsafe void RenderSpriteBatch(int n, DisplayListEntry *batch)
 {
     RenderSpriteBatchNative(wrapper, n, batch);
 }
예제 #4
0
        protected override void OnUpdate()
        {
            var mgr = EntityManager;

            var    env        = World.TinyEnvironment();
            var    config     = env.GetConfigData <DisplayInfo>();
            float2 targetSize = new float2(config.framebufferWidth, config.framebufferHeight);

            if (targetSize.x <= 0.0f || targetSize.y <= 0.0f)
            {
                return;
            }

            BeginScene(targetSize);

            // gather all cameras
            int nSortedCamera = 0;

            Entities.ForEach((Entity e, ref Camera2D cam, ref DisplayListCamera dlc) =>
            {
                if (nSortedCamera < sMaxCameras)
                {
                    sortedCameras[nSortedCamera++] = new SortedCameraEntity {
                        e = e, depth = cam.depth
                    }
                }
                ;
            });

            if (nSortedCamera > 1)
            {
                var slice = new NativeSlice <SortedCameraEntity>(sortedCameras, 0, nSortedCamera);
                slice.Sort();
            }

            cachedGetSprite2DRenderer = GetComponentDataFromEntity <Sprite2DRenderer>();
            cachedGetSprite2D         = GetComponentDataFromEntity <Sprite2D>();

            for (int j = 0; j < nSortedCamera; j++)
            {
                var  cam = sortedCameras[j];
                bool inRtt;
                Camera2DRenderToTexture rtt;
                if (mgr.HasComponent <Camera2DRenderToTexture>(cam.e))
                {
                    rtt = mgr.GetComponentData <Camera2DRenderToTexture>(cam.e);
                    // fixup none rtt target to self
                    if (rtt.target == Entity.Null)
                    {
                        rtt.target = cam.e;
                    }

                    inRtt = true;
                    BeginRTT(cam.e, ref rtt);
                    BeginCamera(cam.e, new float2(rtt.width, rtt.height));
                }
                else
                {
                    rtt   = default(Camera2DRenderToTexture);
                    inRtt = false;
                    BeginCamera(cam.e, targetSize);
                }
                // gather items
                var dc          = mgr.GetComponentData <DisplayListCamera>(cam.e);
                var displayList = mgr.GetBuffer <DisplayListEntry>(cam.e);
                var sorted      = mgr.GetBuffer <SortedEntity>(cam.e);

                if (sorted.Length > 0)
                {
                    unsafe
                    {
                        DisplayListEntry *displayListArray = (DisplayListEntry *)displayList.AsNativeArray().GetUnsafeReadOnlyPtr();
                        SortedEntity *    sortedArray      = (SortedEntity *)sorted.AsNativeArray().GetUnsafeReadOnlyPtr();
                        int nSorted = sorted.Length;
                        DisplayListEntry *sortedBatch = (DisplayListEntry *)sortedBatchBuffer.GetUnsafePtr();

                        // render batches
                        int n = 1;
                        sortedBatch[0] = displayListArray[sortedArray[0].idx];
                        //Assert(verifyDisplayListEntry(man, mSortedbatch[0].e, mSortedbatch[0].type));
                        for (int i = 1; i < nSorted; i++)
                        {
                            DisplayListEntry denew = displayList[sorted[i].idx];
                            //Assert(verifyDisplayListEntry(man, denew.e, denew.type));
                            //Assert(sorted[i].e == denew.e);
                            if (n < sMaxBatchSize && CanBatchWith(ref sortedBatch[0], ref denew))
                            {
                                sortedBatch[n] = denew;
                                n++;
                            }
                            else
                            {
                                // draw batch, all entries have the same DisplayEntryType and passed a canBatchWith test
                                RenderSpriteBatch(n, sortedBatch);
                                sortedBatch[0] = denew;
                                n = 1;
                            }
                        }
                        if (n > 0) // draw final batch
                        {
                            RenderSpriteBatch(n, sortedBatch);
                        }
                    }
                }
                EndCamera(cam.e);
                if (inRtt)
                {
                    EndRTT(cam.e, ref rtt);
                }
            }
            EndScene();
        }