Example #1
0
        public bool ExecuteTask()
        {
            lock (mInstLock)
            {
                if (mIsHalted)
                {
                    return(true);
                }

                if (WaitingInstances.Count > 0)
                {
                    for (int i = 0; WaitingInstances.Count > 0; ++i)
                    {
                        var data = WaitingInstances.First();
                        ActiveInstances.Add(data);
                        WaitingInstances.Remove(data);
                    }
                    if (Renderer.InstanceDataBuffer != null)
                    {
                        Renderer.InstanceDataBuffer.Dispose();
                    }
                    int size = Marshal.SizeOf(typeof(Models.MDX.MdxInstanceData));
                    Renderer.InstanceDataBuffer = new VertexBuffer(Game.GameManager.GraphicsThread.GraphicsManager.Device, ActiveInstances.Count * size, Usage.WriteOnly, VertexFormat.Diffuse, Pool.Managed);
                    DataStream strm = Renderer.InstanceDataBuffer.Lock(0, 0, LockFlags.None);
                    Models.MDX.MdxInstanceData[] InstData = ActiveInstances.ToArray();
                    strm.WriteRange(InstData);
                    Renderer.InstanceDataBuffer.Unlock();
                    Renderer.numInstances = ActiveInstances.Count;
                }
            }
            return(WaitingInstances.Count == 0);
        }
Example #2
0
        override public void ForgetInstance(MudObject Object)
        {
            var instanceName = Object.Path + "@" + Object.Instance;

            if (ActiveInstances.ContainsKey(instanceName))
            {
                ActiveInstances.Remove(instanceName);
            }
            Object.IsPersistent = false;
        }
Example #3
0
        override public RMUD.MudObject GetObject(string Path)
        {
            Path = Path.Replace('\\', '/');

            String BasePath, InstanceName;

            SplitObjectName(Path, out BasePath, out InstanceName);

            if (!String.IsNullOrEmpty(InstanceName))
            {
                MudObject activeInstance = null;
                if (ActiveInstances.TryGetValue(Path, out activeInstance))
                {
                    return(activeInstance);
                }
                else
                {
                    return(CreateInstance(Path));
                }
            }
            else
            {
                MudObject r = null;

                if (NamedObjects.ContainsKey(BasePath))
                {
                    r = NamedObjects[BasePath];
                }
                else
                {
                    var typeName = BaseObjectName + "." + Path.Replace("/", ".");
                    var type     = SourceAssembly.GetType(typeName);
                    if (type == null)
                    {
                        return(null);
                    }
                    r = Activator.CreateInstance(type) as MudObject;
                    if (r != null)
                    {
                        r.Path  = Path;
                        r.State = ObjectState.Unitialized;
                        NamedObjects.Upsert(BasePath, r);
                    }
                }

                if (r != null && r.State == ObjectState.Unitialized)
                {
                    MudObject.InitializeObject(r);
                }

                return(r);
            }
        }
Example #4
0
        public void RemoveInstance(uint instanceId)
        {
            lock (mInstLock)
            {
                WaitingInstances.RemoveAll((inst) => inst.InstanceId == instanceId);
                ActiveInstances.RemoveAll((inst) => inst.InstanceId == instanceId);
                InvisibleInstances.RemoveAll((inst) => inst.InstanceId == instanceId);
            }

            lock (mIdLock)
            {
                mUsedInstances.Remove(instanceId);
                mFreeInstances.Add(instanceId);
            }
        }
Example #5
0
        override public MudObject GetObject(String Path)
        {
            Path = Path.Replace('\\', '/');

            String BasePath, InstanceName;

            SplitObjectName(Path, out BasePath, out InstanceName);

            if (!String.IsNullOrEmpty(InstanceName))
            {
                MudObject activeInstance = null;
                if (ActiveInstances.TryGetValue(Path, out activeInstance))
                {
                    return(activeInstance);
                }
                else
                {
                    return(CreateInstance(Path));
                }
            }
            else
            {
                MudObject r = null;

                if (NamedObjects.ContainsKey(BasePath))
                {
                    r = NamedObjects[BasePath];
                }
                else
                {
                    r = CompileObject(BasePath);
                    if (r != null)
                    {
                        NamedObjects.Upsert(BasePath, r);
                    }
                }

                if (r != null && r.State == ObjectState.Unitialized)
                {
                    Core.InitializeObject(r);
                }

                return(r);
            }
        }
Example #6
0
        public GameObject Pop()
        {
            if (ReservedInstances.Count == 0)
            {
                Generate();
            }

            var instance = ReservedInstances.Dequeue();

            ActiveInstances.Add(instance);

            if (EventPop != null)
            {
                EventPop(this, instance);
            }

            return(instance);
        }
Example #7
0
        public void Clear()
        {
            var listActive = new Queue <GameObject>(ActiveInstances.ToList());

            while (listActive.Count > 0)
            {
                GameObject.DestroyImmediate(listActive.Dequeue());
            }


            var listReserv = new Queue <GameObject>(ReservedInstances.ToList());

            while (listReserv.Count > 0)
            {
                GameObject.DestroyImmediate(listReserv.Dequeue());
            }

            ReservedInstances = null;
            ActiveInstances   = null;
        }
Example #8
0
 override public void PersistInstance(MudObject Object)
 {
     if (Object.IsPersistent)
     {
         return;                      //The object is already persistent.
     }
     if (ActiveInstances.ContainsKey(Object.GetFullName()))
     {
         throw new InvalidOperationException("An instance with this name is already persisted.");
     }
     if (Object.IsNamedObject)
     {
         Object.IsPersistent = true;
         ActiveInstances.Upsert(Object.GetFullName(), Object);
         ReadPersistentObject(Object);
     }
     else
     {
         throw new InvalidOperationException("Anonymous objects cannot be persisted.");
     }
 }
Example #9
0
        internal void UpdateVisibility()
        {
            lock (mInstLock)
            {
                if (mIsHalted)
                {
                    return;
                }

                List <Models.MDX.MdxInstanceData> VisibleInstances = new List <Models.MDX.MdxInstanceData>();
                List <Models.MDX.MdxInstanceData> TmpInvis         = new List <Models.MDX.MdxInstanceData>();
                bool changed = false;
                foreach (var inst in InvisibleInstances)
                {
                    if (IsInstanceVisible(new Vector3(inst.ModelMatrix.M41, inst.ModelMatrix.M42, inst.ModelMatrix.M43)))
                    {
                        changed = true;
                        VisibleInstances.Add(inst);
                    }
                    else
                    {
                        TmpInvis.Add(inst);
                    }
                }

                foreach (var inst in ActiveInstances)
                {
                    if (IsInstanceVisible(new Vector3(inst.ModelMatrix.M41, inst.ModelMatrix.M42, inst.ModelMatrix.M43)))
                    {
                        VisibleInstances.Add(inst);
                    }
                    else
                    {
                        changed = true;
                        TmpInvis.Add(inst);
                    }
                }

                ActiveInstances       = VisibleInstances;
                InvisibleInstances    = TmpInvis;
                Renderer.numInstances = ActiveInstances.Count;
                if (ActiveInstances.Count == 0)
                {
                    return;
                }

                if (changed == false && mUpdateLists == false)
                {
                    return;
                }

                if (Renderer.InstanceDataBuffer != null)
                {
                    Renderer.InstanceDataBuffer.Dispose();
                }

                int size = Marshal.SizeOf(typeof(Models.MDX.MdxInstanceData));
                Renderer.InstanceDataBuffer = new VertexBuffer(Game.GameManager.GraphicsThread.GraphicsManager.Device, ActiveInstances.Count * size, Usage.WriteOnly, VertexFormat.Diffuse, Pool.Managed);
                DataStream strm = Renderer.InstanceDataBuffer.Lock(0, 0, LockFlags.None);
                Models.MDX.MdxInstanceData[] InstData = ActiveInstances.ToArray();
                strm.WriteRange(InstData);
                Renderer.InstanceDataBuffer.Unlock();
                Renderer.numInstances = ActiveInstances.Count;

                mUpdateLists = false;
            }
        }
 public GRendererResourceManager()
 {
     billboardMeshes = new Dictionary <BillboardAsset, Mesh>();
     ActiveInstances.Add(this);
 }