模块

1、功能简介

模块为节点内部独立的算法单元,由输入数据输出数据控制变量构成。模块与节点最大的差别在于输入输出类型。模块只接受Field类型的数据。

2、如何实现一个模块功能

实现一个模块功能的步骤如下:

  • 定义输入数据(通常至少要求一个):

    与节点中定义类似,采用DEF_{*}_IN的宏定义完成。

  • 定义输出数据(可选):

    与节点中定义类似,采用DEF_{*}_OUT的宏定义完成。

  • 定义控制变量:

    与节点中定义类似,采用DEF_VAR的宏定义完成。

    控制变量必须在模块执行之前完成初始化。

  • 重载模块函数:

    重载接口有特定模块类型决定,详情参加Module相应模块。

3、模块样例

	/**
	 * @brief The standard summation density
	 * 
	 * @tparam TDataType 
	 */
	template<typename TDataType>
	class SummationDensity : public virtual ParticleApproximation<TDataType>
	{
		DECLARE_TCLASS(SummationDensity, TDataType)
	public:
		typedef typename TDataType::Real Real;
		typedef typename TDataType::Coord Coord;

		SummationDensity();
		~SummationDensity() override {};

		void compute() override;
	
	public:
		void compute(
			DArray<Real>& rho,
			DArray<Coord>& pos,
			DArrayList<int>& neighbors,
			Real smoothingLength,
			Real mass);

		void compute(
			DArray<Real>& rho,
			DArray<Coord>& pos,
			DArray<Coord>& posQueried,
			DArrayList<int>& neighbors,
			Real smoothingLength,
			Real mass);

	public:
		DEF_VAR(Real, RestDensity, 1000, "Rest Density");

		///Define inputs
		/**
		 * @brief Particle positions
		 */
		DEF_ARRAY_IN(Coord, Position, DeviceType::GPU, "Particle position");

		/**
		 * @brief Particle positions
		 */
		DEF_ARRAY_IN(Coord, Other, DeviceType::GPU, "Particle position");

		/**
		 * @brief Neighboring particles
		 *
		 */
		DEF_ARRAYLIST_IN(int, NeighborIds, DeviceType::GPU, "Neighboring particles' ids");

		///Define outputs
		/**
		 * @brief Particle densities
		 */
		DEF_ARRAY_OUT(Real, Density, DeviceType::GPU, "Return the particle density");

	private:
		void calculateParticleMass();

		Real m_particle_mass;
		Real m_factor;
	};

	IMPLEMENT_TCLASS(SummationDensity, TDataType)

4、Qt GUI中的模块视图

鼠标双击Node Editor窗口中的节点,会出现该节点的详细属性信息。例如,双击ParticleFluid节点后,其详细的属性信息如下图所示: