コード例 #1
0
ファイル: HitBox2D.cs プロジェクト: spicysoft/h5-count-shape
        public bool MakeEntry(EntityManager em, ref DisplayListEntry de)
        {
            Assert.IsTrue(!em.HasComponent <Sprite2DRenderer>(de.e));
            Assert.IsTrue(!em.HasComponent <Shape2DRenderer>(de.e));
            var hb = em.GetComponentData <RectHitBox2D>(de.e);

            if (hb.box.IsEmpty())
            {
                return(false);
            }
            de.inBounds = hb.box;
            de.type     = DisplayListEntryType.HitBoxOnly;
            return(true);
        }
コード例 #2
0
        protected bool CanBatchWith(ref DisplayListEntry e0, ref DisplayListEntry ei)
        {
            var mgr = EntityManager;

            DisplayListEntryType det0 = e0.type;
            DisplayListEntryType deti = ei.type;

            if (det0 != deti)
            {
                return(false);
            }

            // special case tiled and sliced for now, they never batch (can check others as well!)
            switch (det0)
            {
            default:
            case DisplayListEntryType.TiledSprite:
            case DisplayListEntryType.SlicedSprite:
            case DisplayListEntryType.Shape:
            case DisplayListEntryType.GroupOnly:
            case DisplayListEntryType.HitBoxOnly:
            case DisplayListEntryType.Text:
                return(false);

            case DisplayListEntryType.Sprite: {
                // check blend mode
                Sprite2DRenderer sr0 = cachedGetSprite2DRenderer[e0.e];
                Sprite2DRenderer sri = cachedGetSprite2DRenderer[ei.e];
                if (sr0.blending != sri.blending)
                {
                    return(false);
                }
                // if we are depending on a texture, check that those match
                Sprite2D s0 = cachedGetSprite2D[sr0.sprite];
                Sprite2D si = cachedGetSprite2D[sri.sprite];
                if (s0.image != si.image)
                {
                    return(false);
                }
                // good!
                return(true);
            }
            }
        }
コード例 #3
0
        public bool MakeEntry(EntityManager em, ref DisplayListEntry de)
        {
            var textRenderer = em.GetComponentData <Text2DRenderer>(de.e);

            if (!em.Exists(textRenderer.style))
            {
                return(false);
            }

            if (!em.HasComponent <Text2DStyle>(textRenderer.style))
            {
                return(false);
            }

            if (em.HasComponent <Text2DStyleNativeFont>(de.e))
            {
                if (!em.HasComponent <Text2DPrivateNative>(de.e))
                {
                    return(false);
                }
                var textPrivate = em.GetComponentData <Text2DPrivateNative>(textRenderer.style);
                // System State component added once the texture atlas is loaded
                de.inBounds = textPrivate.bounds;
                de.type     = DisplayListEntryType.Text;
                return(true);
            }

            if (em.HasComponent <Text2DStyleBitmapFont>(de.e))
            {
                if (!em.HasComponent <Text2DPrivateBitmap>(de.e))
                {
                    return(false);
                }

                var textPrivate = em.GetComponentData <Text2DPrivateBitmap>(textRenderer.style);
                // System State component added once the texture atlas is loaded
                de.inBounds = textPrivate.bounds;
                de.type     = DisplayListEntryType.Text;
                return(true);
            }
            return(false);
        }
コード例 #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();
        }