private void DoRender(IntPtr surface, bool isNewSurface) { if (DisableRendering) { return; } var w = _outputWidth; var h = _outputHeight; if (w <= 0 || h <= 0) { return; } if (_activeSystem == null && ActiveSystem != null) { _activeSystem = ParticleSystem.FromSpec(ActiveSystem.ToSpec()); } if (_timeSinceLastSimul.HasValue) { var simulTime = (float)(_lastRender.TotalSeconds - _timeSinceLastSimul.Value.TotalSeconds); if (simulTime > 1 / 60.0f) { _previewModel?.AdvanceTime(simulTime); if (!_model.Paused) { if (_activeSystem != null) { _activeSystem.Simulate(simulTime); UpdateParticleStatistics(); } } _timeSinceLastSimul = _lastRender; } } else { _timeSinceLastSimul = _lastRender; } _templeDll.SetRenderTarget(surface); _templeDll.Scale = _model.Scale; _templeDll.CenterOn(0, 0, 0); _previewModel?.Render(TempleDll.Instance); _activeSystem?.Render(); _templeDll.Flush(); }
/// <summary> /// Add a new system to the storage. /// </summary> public void Add(BlockPosition position, BotSystem system) { _systems.Add(position, system); if (system is PropulsionSystem propulsion) { _propulsions.Add(propulsion); } else if (system is WeaponSystem weapon) { if (WeaponType == WeaponSystem.Type.None) { WeaponType = weapon.Constants.Type; } _weapons.Add(weapon); } else { Assert.IsNull(_active, "The active system can only be set once."); _active = system as ActiveSystem; } }
/// <summary> /// If a system is present at a position, remove it. Returns whether a system was removed. /// </summary> public bool TryRemove(BlockPosition position) { if (!_systems.TryGetValue(position, out BotSystem system)) { return(false); } _systems.Remove(position); if (system is PropulsionSystem propulsion) { _propulsions.Remove(propulsion); } else if (system is WeaponSystem weapon) { _weapons.Remove(weapon); } else { _active = null; } return(true); }