49. 用于 DECS 的 Boost 包

DECS_BOOST 模块实现 DECS 的查询、阶段和模板。 在正常情况下,这是 DECS 的主要 require 模块。

所有函数和符号都在 “decs_boost” 模块中,使用 require 来访问它。

require daslib/desc_boost

49.1. 类型别名

ItCheck is a variant type

yes

string

no

bool

DECS 前缀检查。

49.2. 函数注释

REQUIRE

此注释提供了实体所需的组件列表。

REQUIRE_NOT

此注释提供了组件列表,这些组件不需要属于实体。

decs

此宏将函数转换为 DECS pass 阶段查询。可能的参数是 stage, ‘REQUIRE’, 和 REQUIRE_NOT。 它具有 query 的所有其他属性(例如对模板进行作的能力)。例如:

[decs(stage=update_ai, REQUIRE=ai_turret)]
    def update_ai ( eid:EntityId; var turret:Turret; pos:float3 )
        ...

在上面的示例中,查询被添加到 update_ai 阶段。该查询还要求传递给它的每个实体都有一个 ai_turret 属性。

49.3. 调用宏

query
此宏实现 query 功能。有 2 种类型的查询:
  • query(…) - 返回与查询匹配的实体列表

  • query(eid) - 返回与 eid 匹配的单个实体

例如:

query() <| $ ( eid:EntityId; pos, vel : float3 )
    print("[{eid}] pos={pos} vel={vel}\n")

上面的查询将打印所有具有 position 和 velocity 的实体。 这是另一个例子:

query(kaboom) <| $ ( var pos:float3&; vel:float3; col:uint=13u )
    pos += vel

上面的查询会将速度添加到具有 eid kaboom 的实体的位置。

查询可以有 REQUIREREQUIRE_NOT 子句:

var average : float3
query <| $ [REQUIRE(tank)] ( pos:float3 )
    average += pos

上面的查询将添加所有实体的 pos 组件,这些实体也有一个 tank 组件。

此外,查询可以扩展实体的组件。例如:

[decs_template(prefix="particle")]
struct Particle
    pos, vel : float3
...
query <| $ ( var q : Particle )
    q.pos += q.vel                  // 这实际上是 particlepos += particlevel

在上面的示例中,结构 q : Particle 不作为变量存在。相反,它被扩展为访问实体的各个组件。 REQURE 部分会自动填充模板的所有组件。 如果未指定 template prefix,则 prefix 取自模板的名称(将为 “Particle_”)。 指定空前缀 [decs_template(prefix)] 将导致不添加前缀。

注意:除了将 structure 标记为模板外,该宏还会生成 apply_decs_templateremove_decs_template 函数。 apply_decs_template 用于将模板添加到实体,remove_decs_template 用于从实体中删除模板的所有组件:

for i in range(3)
create_entity <| @ ( eid, cmp )

apply_decs_template(cmp, [[Particle pos=float3(i), vel=float3(i+1)]])

find_query

此宏实现 find_query 功能。 它在大多数方面类似于 query,主要区别在于:

  • 没有基于 EID 的 FIND 查询

  • 找到第一个匹配项后,find_query停止

例如:

let found = find_query <| $ ( pos,dim:float3; obstacle:Obstacle )
if !obstacle.wall
    return false
let aabb = [[AABB min=pos-dim*0.5, max=pos+dim*0.5 ]]
if is_intersecting(ray, aabb, 0.1, dist)
    return true

在上面的示例中,一旦找到第一个外find_query,它将返回 true。 注意:如果缺少 return 或到达 find_query 块的末尾 - 则假定 find_query 没有找到任何内容,并将返回 false。

49.4. 结构宏

decs_template

此宏为给定结构创建模板。 为结构类型生成 apply_decs_templateremove_decs_template 函数。