예제 #1
0
        // NOTE: The boot up flow is inside the MainLoop as we want to be able to load configuration files
        // before executing any systems, however for web builds we must do such loading inside the mainloop to ensure
        // the browser doesn't hang while we wait on async work to complete
        private static void Main()
        {
            // Create main world
            m_World       = DefaultTinyWorldInitialization.InitializeWorld("main");
            m_Environment = m_World.GetOrCreateSystem <TinyEnvironment>();
            m_BootPhase   = BootPhase.Booting;

            // Setup systems
            DefaultTinyWorldInitialization.InitializeSystems(m_World);

            // Run program
            NativeLeakDetection.Mode = NativeLeakDetectionMode.Enabled;
            var windowSystem = m_World.GetExistingSystem <WindowSystem>();

            if (windowSystem != null)
            {
                windowSystem.InfiniteMainLoop(MainLoop);
            }
            else
            {
                Debug.Log("No window system found.");
            }

            // Free world and all systems/managers in it
            m_World.Dispose();
        }
예제 #2
0
        protected override void OnUpdate()
        {
            Entities.WithAll <CameraAutoAspectFromDisplay>().ForEach((ref Camera c) =>
            {
                TinyEnvironment env = World.TinyEnvironment();
                DisplayInfo di      = env.GetConfigData <DisplayInfo>();
                c.aspect            = (float)di.width / (float)di.height;
            });

            // add camera matrices if needed
            EntityCommandBuffer ecb = new EntityCommandBuffer(Allocator.Temp);

            Entities.WithNone <CameraMatrices>().WithAll <Camera>().ForEach((Entity e) =>
            {
                ecb.AddComponent <CameraMatrices>(e);
            });
            ecb.Playback(EntityManager);
            ecb.Dispose();

            // update
            Entities.ForEach((ref Camera c, ref LocalToWorld tx, ref CameraMatrices cm, ref Frustum f) =>
            { // with frustum
                cm.projection = ProjectionMatrixFromCamera(ref c);
                cm.view       = math.inverse(tx.Value);
                FrustumFromCamera(ref cm, ref f);
            });
            Entities.WithNone <Frustum>().ForEach((ref Camera c, ref LocalToWorld tx, ref CameraMatrices cm) =>
            { // no frustum
                cm.projection = ProjectionMatrixFromCamera(ref c);
                cm.view       = math.inverse(tx.Value);
            });
        }
예제 #3
0
        protected override bool PlaySource(Entity e)
        {
            var mgr = EntityManager;

            if (mgr.HasComponent <AudioSource>(e))
            {
                AudioSource audioSource = mgr.GetComponentData <AudioSource>(e);

                Entity clipEntity = audioSource.clip;
                if (mgr.HasComponent <AudioHTMLClip>(clipEntity))
                {
                    AudioHTMLClip clip = mgr.GetComponentData <AudioHTMLClip>(clipEntity);
                    if (clip.clipID > 0)
                    {
                        if (!unlocked)
                        {
                            AudioHTMLNativeCalls.Unlock();
                            unlocked = AudioHTMLNativeCalls.IsUnlocked();
                            if (unlocked)
                            {
                                TinyEnvironment env = World.TinyEnvironment();
                                AudioConfig     ac  = env.GetConfigData <AudioConfig>();
                                ac.unlocked = unlocked;
                                env.SetConfigData(ac);
                            }
                        }

                        if (unlocked)
                        {
                            // If there is an existing source, it should re-start.
                            // Do this with a Stop() and let it play below.
                            if (mgr.HasComponent <AudioHTMLSource>(e))
                            {
                                AudioHTMLSource ans = mgr.GetComponentData <AudioHTMLSource>(e);
                                AudioHTMLNativeCalls.Stop(ans.sourceID, true);
                            }

                            int sourceID = ++IDPool.sourceID;
                            AudioHTMLNativeCalls.Play(clip.clipID, sourceID, audioSource.volume, audioSource.loop);
                            AudioHTMLSource audioNativeSource = new AudioHTMLSource()
                            {
                                sourceID = sourceID
                            };
                            // Need a native source as well.
                            if (mgr.HasComponent <AudioHTMLSource>(e))
                            {
                                mgr.SetComponentData(e, audioNativeSource);
                            }
                            else
                            {
                                PostUpdateCommands.AddComponent(e, audioNativeSource);
                            }

                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
예제 #4
0
        protected override void InitAudioSystem()
        {
            AudioNativeCalls.InitAudio();

            TinyEnvironment env = World.TinyEnvironment();
            AudioConfig     ac  = env.GetConfigData <AudioConfig>();

            ac.initialized = true;
            ac.unlocked    = true;
            env.SetConfigData(ac);
        }
예제 #5
0
        protected override void InitAudioSystem()
        {
            //Console.WriteLine("InitAudioSystem()");
            AudioHTMLNativeCalls.Init();
            unlocked = AudioHTMLNativeCalls.IsUnlocked();
            //Console.WriteLine("(re) checking un-locked: ");
            //Console.WriteLine(unlocked ? "true" : "false");

            TinyEnvironment env = World.TinyEnvironment();
            AudioConfig     ac  = env.GetConfigData <AudioConfig>();

            ac.initialized = true;
            ac.unlocked    = unlocked;
            env.SetConfigData(ac);
        }
예제 #6
0
        static public void Initialize(int width, int height, RenderMode renderMode = RenderMode.Auto, bool DisableSwitchRenderingSystem = false)
        {
            NativeLeakDetection.Mode = NativeLeakDetectionMode.Enabled;

            world   = DefaultTinyWorldInitialization.InitializeWorld("main");
            tinyEnv = world.TinyEnvironment();

            SetDisplaySize(width, height, renderMode);

            DefaultTinyWorldInitialization.InitializeSystems(world);

            entityManager = world.EntityManager;
            var srs = World.Active.GetExistingSystem <SwitchRenderingSystem>();

            srs.Disable = DisableSwitchRenderingSystem;
        }
예제 #7
0
        protected override void OnUpdate()
        {
            base.OnUpdate();
            TinyEnvironment env = World.TinyEnvironment();
            AudioConfig     ac  = env.GetConfigData <AudioConfig>();

            if (ac.paused != paused)
            {
                paused = ac.paused;
                if (paused)
                {
                    AudioHTMLNativeCalls.Pause();
                }
                else
                {
                    AudioHTMLNativeCalls.Resume();
                }
            }
        }
예제 #8
0
        protected override void OnUpdate()
        {
            base.OnUpdate();

            TinyEnvironment env = World.TinyEnvironment();
            AudioConfig     ac  = env.GetConfigData <AudioConfig>();

            AudioNativeCalls.PauseAudio(ac.paused);

            EntityCommandBuffer ecb = new EntityCommandBuffer(Allocator.Temp);

            Entities
            .WithNone <AudioClipLoadFromFileAudioFile>()
            .ForEach((Entity e, ref AudioNativeClip tag) =>
            {
                AudioNativeCalls.FreeAudio(tag.clipID);
                ecb.RemoveComponent <AudioNativeClip>(e);
            });
            ecb.Playback(EntityManager);
            ecb.Dispose();
        }
예제 #9
0
        protected override bool PlaySource(Entity e)
        {
            var mgr = EntityManager;

            if (mgr.HasComponent <AudioSource>(e))
            {
                AudioSource audioSource = mgr.GetComponentData <AudioSource>(e);

                if (mgr.HasComponent <AudioHTMLSource>(e))
                {
                    // If there is a native source and it is IsPlaying() then
                    // can't play another, but we are done. (So return true.)
                    // Note that IsPlaying() is synchronous (which is what we want)
                    // as opposed to isPlaying which is async.
                    AudioHTMLSource ans = mgr.GetComponentData <AudioHTMLSource>(e);
                    if (AudioHTMLNativeCalls.IsPlaying(ans.sourceID))
                    {
                        return(true);
                    }
                }


                Entity clipEntity = audioSource.clip;
                if (mgr.HasComponent <AudioHTMLClip>(clipEntity))
                {
                    AudioHTMLClip clip = mgr.GetComponentData <AudioHTMLClip>(clipEntity);
                    if (clip.clipID > 0)
                    {
                        if (!unlocked)
                        {
                            AudioHTMLNativeCalls.Unlock();
                            unlocked = AudioHTMLNativeCalls.IsUnlocked();
                            if (unlocked)
                            {
                                TinyEnvironment env = World.TinyEnvironment();
                                AudioConfig     ac  = env.GetConfigData <AudioConfig>();
                                ac.unlocked = unlocked;
                                env.SetConfigData(ac);
                            }
                        }

                        if (unlocked)
                        {
                            int sourceID = ++IDPool.sourceID;
                            AudioHTMLNativeCalls.Play(clip.clipID, sourceID, audioSource.volume, audioSource.loop);
                            AudioHTMLSource audioNativeSource = new AudioHTMLSource()
                            {
                                sourceID = sourceID
                            };
                            // Need a native source as well.
                            if (mgr.HasComponent <AudioHTMLSource>(e))
                            {
                                mgr.SetComponentData(e, audioNativeSource);
                            }
                            else
                            {
                                PostUpdateCommands.AddComponent(e, audioNativeSource);
                            }

                            return(true);
                        }
                    }
                }
            }
            return(false);
        }