public M2RenderInstance AddInstance(int uuid, Vector3 position, Vector3 rotation, Vector3 scaling) { M2RenderInstance inst; // ReSharper disable once InconsistentlySynchronizedField if (mFullInstances.TryGetValue(uuid, out inst)) { ++inst.NumReferences; return(inst); } var instance = new M2RenderInstance(uuid, position, rotation, scaling, this); lock (mFullInstances) { mFullInstances.Add(uuid, instance); if (!instance.IsVisible(WorldFrame.Instance.ActiveCamera)) { return(instance); } lock (VisibleInstances) VisibleInstances.Add(instance); return(instance); } }
public bool RemoveInstance(int uuid) { if (mFullInstances == null || VisibleInstances == null) { return(false); } lock (mFullInstances) { M2RenderInstance inst; if (mFullInstances.TryGetValue(uuid, out inst) == false) { return(false); } --inst.NumReferences; if (inst.NumReferences > 0) { ++inst.NumReferences; return(false); } mFullInstances.Remove(uuid); inst.Dispose(); } lock (VisibleInstances) VisibleInstances.RemoveAll(inst => inst.Uuid == uuid); return(mFullInstances.Count == 0); }
public void ViewChanged() { lock (VisibleInstances) VisibleInstances.Clear(); lock (mFullInstances) { foreach (var pair in mFullInstances) { pair.Value.IsUpdated = false; } } }
public void PushMapReference(M2Instance instance) { var renderInstance = instance.RenderInstance; if (Model.HasBlendPass) { renderInstance.UpdateDepth(); } renderInstance.IsUpdated = true; lock (VisibleInstances) VisibleInstances.Add(renderInstance); }