void Update() { //get the data from the GPU PullParticlesFromGPU(m_solverPtr, m_cntr, Flex.Memory.eFlexMemoryHostAsync); if (m_diffuseParticles && m_diffuseParticles.m_maxDiffuseParticlesCount > 0) { m_diffuseParticles.m_diffuseParticlesCount = Flex.GetDiffuseParticles(m_solverPtr, m_diffuseParticles.m_diffuseParticlesHndl.AddrOfPinnedObject(), m_diffuseParticles.m_diffuseVelocitiesHndl.AddrOfPinnedObject(), m_diffuseParticles.m_sortedDepthHndl.AddrOfPinnedObject(), Flex.Memory.eFlexMemoryHostAsync); } //update solver parameters //TODO check impact on performance m_parameters.GetParams(ref m_params); Flex.SetParams(m_solverPtr, ref m_params); //ensure memory transfers have finished Flex.SetFence(); Flex.WaitFence(); //for (int i = 0; i < m_cntr.m_particlesCount; i++) //{ // print("index:" + i + "velocity:" + m_cntr.m_velocities[i]); //} if (Input.GetKeyDown(KeyCode.Space)) { Debug.Log("uFlex Scene Reset"); for (int i = 0; i < m_cntr.m_particlesCount; i++) { m_cntr.m_particles[i] = m_cntr.m_restParticles[i]; m_cntr.m_velocities[i] = new Vector3(); } } //copy data to instances UpdateGameObjects(); //do the custom processing on flex gameobjects m_processors = FindObjectsOfType <FlexProcessor>(); foreach (FlexProcessor fp in m_processors) { fp.PreContainerUpdate(this, m_cntr, m_parameters); } //update container if (m_dynamic) { m_cntr.UpdateContainer(); } //do the custom processing on the container foreach (FlexProcessor fp in m_processors) { fp.PostContainerUpdate(this, m_cntr, m_parameters); } //copy the processed data back to the GPU PushParticlesToGPU(m_solverPtr, m_cntr, Flex.Memory.eFlexMemoryHostAsync); if (m_dynamic) { //Async transfers on unpinned arrays!? //PushConstraintsToGPU(m_solverPtr, m_cntr, Flex.Memory.eFlexMemoryHostAsync); //m_colliders.UpdateColliders(m_solverPtr, Flex.Memory.eFlexMemoryHostAsync); PushConstraintsToGPU(m_solverPtr, m_cntr, Flex.Memory.eFlexMemoryHost); m_colliders.UpdateColliders(m_solverPtr, Flex.Memory.eFlexMemoryHost); } //do not wait here for memory transfers to finish //Flex.SetFence(); //Flex.WaitFence(); //Debug.Log("Total Time: "+m_timers.mTotal); }