static private extern unsafe void RenderSpriteBatchNative(IntPtr emr, int n, DisplayListEntry *batch);
protected abstract unsafe void RenderSpriteBatch(int n, DisplayListEntry *batch);
protected override unsafe void RenderSpriteBatch(int n, DisplayListEntry *batch) { RenderSpriteBatchNative(wrapper, n, batch); }
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(); }