本文整理汇总了C++中Voxel::SetInstanceData方法的典型用法代码示例。如果您正苦于以下问题:C++ Voxel::SetInstanceData方法的具体用法?C++ Voxel::SetInstanceData怎么用?C++ Voxel::SetInstanceData使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Voxel
的用法示例。
在下文中一共展示了Voxel::SetInstanceData方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: AddRemovePathEdges
/**
* Add edges of the neighbouring path tiles.
* @param xpos X coordinate of the central voxel with a path tile.
* @param ypos Y coordinate of the central voxel with a path tile.
* @param zpos Z coordinate of the central voxel with a path tile.
* @param slope Imploded path slope of the central voxel.
* @param dirs Edge directions to change (bitset of #TileEdge), usually #EDGE_ALL.
* @param use_additions Use #_additions rather than #_world.
* @param add_edges If set, add edges (else, remove them).
* @return Updated (imploded) slope at the central voxel.
*/
uint8 AddRemovePathEdges(uint16 xpos, uint16 ypos, uint8 zpos, uint8 slope, uint8 dirs, bool use_additions, bool add_edges)
{
for (TileEdge edge = EDGE_BEGIN; edge < EDGE_COUNT; edge++) {
if ((dirs & (1 << edge)) == 0) continue; // Skip directions that should not be updated.
int delta_z = 0;
if (slope >= PATH_FLAT_COUNT) {
if (_path_down_from_edge[edge] == slope) {
delta_z = 1;
} else if (_path_up_from_edge[edge] != slope) {
continue;
}
}
Point16 dxy = _tile_dxy[edge];
if ((dxy.x < 0 && xpos == 0) || (dxy.x > 0 && xpos == _world.GetXSize() - 1)) continue;
if ((dxy.y < 0 && ypos == 0) || (dxy.y > 0 && ypos == _world.GetYSize() - 1)) continue;
TileEdge edge2 = (TileEdge)((edge + 2) % 4);
bool modified = false;
if (delta_z <= 0 || zpos < WORLD_Z_SIZE - 1) {
Voxel *v;
if (use_additions) {
v = _additions.GetCreateVoxel(xpos + dxy.x, ypos + dxy.y, zpos + delta_z, false);
} else {
v = _world.GetCreateVoxel(xpos + dxy.x, ypos + dxy.y, zpos + delta_z, false);
}
if (v != nullptr) {
uint16 number = v->GetInstance();
if (number == SRI_PATH) { // Valid path.
v->SetInstanceData(SetPathEdge(v->GetInstanceData(), edge2, add_edges));
MarkVoxelDirty(xpos + dxy.x, ypos + dxy.y, zpos + delta_z);
modified = true;
} else if (number >= SRI_FULL_RIDES) { // A ride instance. Does it have an entrance here?
if ((v->GetInstanceData() & (1 << edge2)) != 0) modified = true;
}
}
}
delta_z--;
if (delta_z >= 0 || zpos > 0) {
Voxel *v;
if (use_additions) {
v = _additions.GetCreateVoxel(xpos + dxy.x, ypos + dxy.y, zpos + delta_z, false);
} else {
v = _world.GetCreateVoxel(xpos + dxy.x, ypos + dxy.y, zpos + delta_z, false);
}
if (v != nullptr) {
uint16 number = v->GetInstance();
if (number == SRI_PATH) { // Valid path.
v->SetInstanceData(SetPathEdge(v->GetInstanceData(), edge2, add_edges));
MarkVoxelDirty(xpos + dxy.x, ypos + dxy.y, zpos + delta_z);
modified = true;
} else if (number >= SRI_FULL_RIDES) { // A ride instance. Does it have an entrance here?
if ((v->GetInstanceData() & (1 << edge2)) != 0) modified = true;
}
}
}
if (modified && slope < PATH_FLAT_COUNT) slope = SetPathEdge(slope, edge, add_edges);
}
return slope;
}
示例2: RemovePathAtTile
/**
* Remove a path from a tile, and free the voxels above it as well.
* @param voxel_pos Coordinate of the voxel.
* @param path_spr Imploded sprite number.
* @see BuildPathAtTile
*/
static void RemovePathAtTile(const XYZPoint16 &voxel_pos, uint8 path_spr)
{
VoxelStack *avs = _additions.GetModifyStack(voxel_pos.x, voxel_pos.y);
Voxel *av = avs->GetCreate(voxel_pos.z, false);
av->SetInstance(SRI_FREE);
av->SetInstanceData(0);
AddRemovePathEdges(voxel_pos, path_spr, EDGE_ALL, true, PAS_UNUSED);
MarkVoxelDirty(voxel_pos);
av = avs->GetCreate(voxel_pos.z + 1, false);
av->SetInstance(SRI_FREE);
av->SetInstanceData(0);
if (path_spr >= PATH_FLAT_COUNT) {
av = avs->GetCreate(voxel_pos.z + 2, false);
av->SetInstance(SRI_FREE);
av->SetInstanceData(0);
}
}
示例3: BuildPathAtTile
/**
* Build a path at a tile, and claim the voxels above it as well.
* @param voxel_pos Coordinate of the voxel.
* @param path_type The type of path to build.
* @param path_spr Imploded sprite number.
* @see RemovePathAtTile
*/
static void BuildPathAtTile(const XYZPoint16 &voxel_pos, PathType path_type, uint8 path_spr)
{
VoxelStack *avs = _additions.GetModifyStack(voxel_pos.x, voxel_pos.y);
Voxel *av = avs->GetCreate(voxel_pos.z, true);
av->SetInstance(SRI_PATH);
uint8 slope = AddRemovePathEdges(voxel_pos, path_spr, EDGE_ALL, true, _sprite_manager.GetPathStatus(path_type));
av->SetInstanceData(MakePathInstanceData(slope, path_type));
av = avs->GetCreate(voxel_pos.z + 1, true);
av->ClearVoxel();
av->SetInstance(SRI_PATH);
av->SetInstanceData(PATH_INVALID);
if (path_spr >= PATH_FLAT_COUNT) { // For non-flat sprites, add another voxel.
av = avs->GetCreate(voxel_pos.z + 2, true);
av->ClearVoxel();
av->SetInstance(SRI_PATH);
av->SetInstanceData(PATH_INVALID);
}
MarkVoxelDirty(voxel_pos);
}
示例4: ChangePathAtTile
/**
* Change the path type of a currently existing path.
* @param voxel_pos Coordinate of the voxel.
* @param path_type The type of path to change to.
* @param path_spr Imploded sprite number.
*/
static void ChangePathAtTile(const XYZPoint16 &voxel_pos, PathType path_type, uint8 path_spr)
{
VoxelStack *avs = _additions.GetModifyStack(voxel_pos.x, voxel_pos.y);
Voxel *av = avs->GetCreate(voxel_pos.z, false);
AddRemovePathEdges(voxel_pos, path_spr, EDGE_ALL, true, PAS_UNUSED);
/* Reset flat path to one without edges or corners. */
if (path_spr < PATH_FLAT_COUNT)
path_spr = PATH_EMPTY;
uint8 slope = AddRemovePathEdges(voxel_pos, path_spr, EDGE_ALL, true, _sprite_manager.GetPathStatus(path_type));
av->SetInstanceData(MakePathInstanceData(slope, path_type));
MarkVoxelDirty(voxel_pos);
}
示例5: SelectorMouseButtonEvent
void RideBuildWindow::SelectorMouseButtonEvent(uint8 state)
{
if (!IsLeftClick(state)) return;
if (this->selector.area.width != 1 || this->selector.area.height != 1) return;
ShopInstance *si = static_cast<ShopInstance *>(this->instance);
SmallRideInstance inst_number = static_cast<SmallRideInstance>(this->instance->GetIndex());
uint8 entrances = si->GetEntranceDirections(si->vox_pos);
Voxel *v = _world.GetCreateVoxel(si->vox_pos, true);
assert(v != nullptr && v->GetInstance() == SRI_FREE);
v->SetInstance(inst_number);
v->SetInstanceData(entrances);
_rides_manager.NewInstanceAdded(inst_number);
AddRemovePathEdges(si->vox_pos, PATH_EMPTY, entrances, false, PAS_QUEUE_PATH);
this->instance = nullptr; // Delete this window, and
si = nullptr; // (Also clean the copy of the pointer.)
delete this;
ShowShopManagementGui(inst_number); // Open gui for the new shop.
}