protected FluidSimulationComponent(IEmbeddedResources embeddedResources) { this.embeddedResources = embeddedResources; //var size = new IntSize3(20, 20, 1); //var cellSize = 0.40f; //var particleRadius = 0.25f; fluidSimulation = new FluidSimulation(1f, 1f, 0.25f); visualElements = new List <IVisualElement>(); interactionElems = new IInteractionElement[] { //new SelectOnClickInteractionElement(this, viewService), new ActionOnEventInteractionElement( args => args is IMouseEvent m && m.IsRightClickEvent() && m.KeyModifiers == KeyModifiers.None, () => { if (simulationRunning) { fluidSimulation.Stop(); } else { if (firstTime) { fluidSimulation.Reset(CreateConfig()); Reset(); firstTime = false; } prevFrame = nextFrame = null; fluidSimulation.Run(simulationTimestamp + 5); } simulationRunning = !simulationRunning; }), new ActionOnEventInteractionElement( args => args is IMouseEvent m && m.IsRightClickEvent() && m.KeyModifiers == KeyModifiers.Shift, () => { Reset(); }), }; hittable = new SphereHittable <FluidSimulationComponent>(this, c => c.model.BoundingSphere * c.Node.GlobalTransform); Width = 20; Height = 20; CellSize = 0.8f; LevelSetScale = 16; SurfaceType = FluidSurfaceType.Hybrid; Reset(); }
private bool TryMoveToCorrectFrames() { while (nextFrame == null || simulationTimestamp > nextFrame.Timestamp) { if (!fluidSimulation.FrameQueue.TryDequeue(out var frame)) { return(false); } nextFrame = frame; prevQueue.Enqueue(frame); } while (prevQueue.Peek().Timestamp < simulationTimestamp) { prevFrame = prevQueue.Dequeue(); } return(true); }