handleClick
TOOLMODE_TOGGLE_POLYS
以点击的点为中心用navquery->findNearestPoly(p, halfExtents,&filter, &ref, tgt);
找到最近的poly和poly上面距离p最近的点tgt
如果找到了
flags ^= SAMPLE_POLYFLAGS_DISABLED;
nav->setPolyFlags(ref, flags);
改变这个poly的flag
关于flag:
CrowdToolState::init的时候会
crowd->getEditableFilter(0)->setExcludeFlags(SAMPLE_POLYFLAGS_DISABLED);
从而让有disabled的flag的polygon失效也就是这种polygon不可通过
注意 crowd可以支持不同种类的fileter
getEditableFilter(0)是获取的m_filters[0]
这种filter目前就包含这么几种:
enumSamplePolyFlags
{
SAMPLE_POLYFLAGS_WALK = 0x01, //Ability to walk (ground, grass, road)
SAMPLE_POLYFLAGS_SWIM = 0x02, //Ability to swim (water).
SAMPLE_POLYFLAGS_DOOR = 0x04, //Ability to move through doors.
SAMPLE_POLYFLAGS_JUMP = 0x08, //Ability to jump.
SAMPLE_POLYFLAGS_DISABLED = 0x10, //Disabled polygon
SAMPLE_POLYFLAGS_ALL = 0xffff //All abilities.
};
真正使用的时候passFilter会检查(poly->flags& m_includeFlags) != 0 && (poly->flags& m_excludeFlags) == 0
可是,如果是door, flags会被设置成SAMPLE_POLYFLAGS_WALK | SAMPLE_POLYFLAGS_DOOR
如果m_includeFlags中只有SAMPLE_POLYFLAGS_WALK,岂不是也会通过成功??
====
ConvexVolumeTool::handleMenu()
创建convex volume的工具
m_boxHeight控制volume的高度
m_boxDescent上下移动
m_polyOffset?
选择Area Type --> water
m_areaType = SAMPLE_POLYAREA_WATER;
然后再buildTileMesh的时候会:
m_pmesh->flags[i]= SAMPLE_POLYFLAGS_SWIM;
其他的Ground,Grass,Road也类似,会:
m_pmesh->flags[i]= SAMPLE_POLYFLAGS_WALK;
SAMPLE_POLYAREA_DOOR比较特殊:
m_pmesh->flags[i]= SAMPLE_POLYFLAGS_WALK | SAMPLE_POLYFLAGS_DOOR;
理解上就是,area属性表示polygon的地表类型
而flags是用户自定义的可以通过什么样的方式去通过
比如ground可以以walk的方式通过