上回我们从main函数开始,讲了GUI外壳。现在到了Simulator文件夹下的SimulatorBase.cpp文件的timeStep()函数。
上回链接:【读splishsplash源代码】一步步调试概览1–GUI外壳
本文将继续讲解一步步的调试流程
文章目录
SimulatorBase::timeStep()
part 1: 进入SimulatorBase::timeStep()函数
该文件位于
\Simulator\SimulatorBase.cpp
的第842行开始
stopAt获取模拟停止时间,如果没有设定就为-1.0,表示不停止。
pauseAt同理,-1.0表示不停止。
假如PAUSE为true,直接返回。
这里要注意,默认是自动开始的时候pause的,所以我们要提前传入一个参数:–no-initial-pause,方法见附录
part 2: //Simulation code
继续走到注释//Simulation code处
表示这里才是关键。
传入一个sim指针,是当前模拟的一大堆参数。
传入一个bool值判断是否是2D模拟。假如是,下面有个if(sim2D),强行令z轴的速度位置为0。
传入numSteps即每渲染一帧需要模拟多少个时间步。
我们看到sim2D为false,numSteps为4
而sim指针所指向的是这一大堆东西。内涵非常丰富:包括核函数的信息、时间步的信息、非压力力的方法、邻域的信息、流体本身的信息等等。
part 3: for循环
接下来进入一个for循环。这个循环是在每个渲染帧之内的循环。这个循环是关键
START_TIMING开始计时。
其中Simulation::getCurrent()->getTimeStep()->step()应是重点中的中的。我们跳入。
跳入之后为:
TimeStepDFSPH::step()
位于
\SPlisHSPlasH\DFSPH\TimeStepDFSPH.cpp
本文结束,请听下回分解。
附录:为VS debug程序传入参数的方法
右键工程文件->属性
调试->命令参数。输入–no-initial-pause,其他参数见官方文档。
代码流回顾
至此我们的调用顺序为:
- main()中调用base->run()
- SimulatorBase::run()中调用runSimulation()
- SimulatorBase::runSimulation()中调用m_gui->run()
- Simulator_GUI_imgui::run()中调用MiniGL::mainLoop()
- MiniGL::mainLoop()中调用idlefunc()
- SimulatorBase::timeStep()中调用Simulation::getCurrent()->getTimeStep()->step()