Example #1
0
        public static async System.Threading.Tasks.Task <GPrefab> CreatePrefab(List <GActor> actors, bool firstCoord = false)
        {
            GPrefab result = null;

            if (actors.Count == 1)
            {
                result = await actors[0].ConvertToPrefab(CEngine.Instance.RenderContext);
            }
            else
            {
                result         = new GPrefab();
                result.ActorId = Guid.NewGuid();
                var placement = new GamePlay.Component.GPlacementComponent();
                result.Placement = placement;
                for (int i = 0; i < actors.Count; ++i)
                {
                    if (actors[i] is GPrefab)
                    {
                        var prefab = actors[i] as GPrefab;
                        var actor  = await prefab.ConvertToActor(CEngine.Instance.RenderContext);

                        actor.SetParent(result, false);
                    }
                    else
                    {
                        actors[i].SetParent(result, false);
                    }
                }
            }
            return(result);
        }
Example #2
0
        public async override System.Threading.Tasks.Task <GActor> Clone(CRenderContext rc)
        {
            var result = new GPrefab();
            //var result = new GCloneActor();
            var init = Initializer.CloneObject() as GActorInitializer;

            init.ActorId = Guid.NewGuid();
            result.SetInitializer(init);

            if (CenterData != null)
            {
                Rtti.MetaClass.CopyData(CenterData, result.CenterData);
            }
            for (int i = 0; i < Components.Count; ++i)
            {
                var comp = await Components[i]?.CloneComponent(rc, result, result);
                result.AddComponent(comp);
            }

            for (int i = 0; i < Children.Count; ++i)
            {
                var actor = await Children[i].Clone(rc);
                actor.SetParent(result);
                actor.OnActorLoaded();
            }
            result.OnActorLoaded();
            result.OnPlacementChanged(result.Placement);
            result.WaitContext.Result = result;
            result.WaitContext.SetFinished(WaitContext.IsFinished);
            return(result);
        }
Example #3
0
        public async System.Threading.Tasks.Task <GActor> GetPrefabFistChild(CRenderContext rc, RName name, bool clone = false)
        {
            GPrefab result;
            bool    found = false;

            lock (Prefabs)
            {
                if (Prefabs.TryGetValue(name, out result) == false)
                {
                    result = new GPrefab();
                    Prefabs.Add(name, result);
                }
                else
                {
                    found = true;
                }
            }

            if (found)
            {
                await result.AwaitLoad();

                if (clone)
                {
                    GActor cloneprefab = await result.Children[0].Clone(EngineNS.CEngine.Instance.RenderContext);
                    //cloneprefab.Placement.Transform = cloneprefab.Placement.Transform * result.Placement.Transform;
                    return(cloneprefab);
                }
                return(result.Children[0]);
            }

            var xnd = await IO.XndHolder.LoadXND(name.Address);

            if (xnd == null)
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "IO", "Prefab RName error!");
                return(null);
            }
            if (false == await result.LoadXnd(rc, xnd.Node))
            {
                xnd.Node.TryReleaseHolder();
                return(null);
            }
            xnd.Node.TryReleaseHolder();
            result.Name = name;

            if (clone)
            {
                GActor cloneprefab = await result.Children[0].Clone(EngineNS.CEngine.Instance.RenderContext);
                //cloneprefab.Placement.Transform = cloneprefab.Placement.Transform * result.Placement.Transform;
                return(cloneprefab);
            }
            return(result.Children[0]);
        }
Example #4
0
        public async System.Threading.Tasks.Task <GPrefab> GetPrefab(CRenderContext rc, RName name, bool clone = false)
        {
            GPrefab result;
            bool    found = false;

            lock (Prefabs)
            {
                if (Prefabs.TryGetValue(name, out result) == false)
                {
                    result = new GPrefab();
                    Prefabs.Add(name, result);
                }
                else
                {
                    found = true;
                }
            }

            if (found)
            {
                await result.AwaitLoad();

                if (clone)
                {
                    GPrefab cloneprefab = await result.Clone(EngineNS.CEngine.Instance.RenderContext) as GPrefab;

                    //cloneprefab.Placement.Transform = cloneprefab.Placement.Transform * result.Placement.Transform;
                    return(cloneprefab);
                }
                return(result);
            }

            var xnd = await IO.XndHolder.LoadXND(name.Address);

            if (xnd == null)
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "IO", "Prefab RName error!");
                return(null);
            }
            if (false == await result.LoadXnd(rc, xnd.Node))
            {
                xnd.Node.TryReleaseHolder();
                return(null);
            }
            xnd.Node.TryReleaseHolder();
            result.Name = name;
            ///兼容以前的没有名字的prefab
            if (string.IsNullOrEmpty(result.SpecialName) && result.Children.Count == 0)
            {
                result.SpecialName = $"Prefab";
            }
            if (string.IsNullOrEmpty(result.SpecialName) && result.Children.Count > 0)
            {
                result.SpecialName = $"Prefab_{result.Children[0].SpecialName}";
            }
            /////兼容以前的没有名字的prefab
            //if (result.Children.Count == 1)
            //{
            //    result = await result.Children[0].ConvertToPrefab(EngineNS.CEngine.Instance.RenderContext);
            //    Prefabs[name] = result;
            //}
            if (clone)
            {
                GPrefab cloneprefab = await result.Clone(EngineNS.CEngine.Instance.RenderContext) as GPrefab;

                //cloneprefab.Placement.Transform = cloneprefab.Placement.Transform * result.Placement.Transform;
                return(cloneprefab);
            }

            return(result);
        }