From a15e2e23de262c496641dd3c4d4fcc66b699c5dc Mon Sep 17 00:00:00 2001 From: Charles Pigott Date: Wed, 31 Dec 2014 02:25:07 +0000 Subject: [PATCH 02/14] Change PositionedTrackPiece --- src/coaster.cpp | 28 +++++++++++++--------------- src/coaster.h | 2 +- src/coaster_build.h | 2 +- src/coaster_gui.cpp | 37 ++++++++++++++++++------------------- src/track_piece.cpp | 38 +++++++++++++------------------------- src/track_piece.h | 38 ++++++++++---------------------------- 6 files changed, 56 insertions(+), 89 deletions(-) diff --git a/src/coaster.cpp b/src/coaster.cpp index 9c7a426..f9e829b 100644 --- a/src/coaster.cpp +++ b/src/coaster.cpp @@ -383,9 +383,9 @@ void CoasterTrain::OnAnimate(int delay) while (ptp->distance_base + ptp->piece->piece_length < position) ptp++; /* Get position of the back of the car. */ - int32 xpos_back = ptp->piece->car_xpos->GetValue(position - ptp->distance_base) + (ptp->x_base << 8); - int32 ypos_back = ptp->piece->car_ypos->GetValue(position - ptp->distance_base) + (ptp->y_base << 8); - int32 zpos_back = ptp->piece->car_zpos->GetValue(position - ptp->distance_base) * 2 + (ptp->z_base << 8); + int32 xpos_back = ptp->piece->car_xpos->GetValue(position - ptp->distance_base) + (ptp->base_voxel.x << 8); + int32 ypos_back = ptp->piece->car_ypos->GetValue(position - ptp->distance_base) + (ptp->base_voxel.y << 8); + int32 zpos_back = ptp->piece->car_zpos->GetValue(position - ptp->distance_base) * 2 + (ptp->base_voxel.z << 8); /* Get roll from the center of the car. */ position += car_length / 2; @@ -403,9 +403,9 @@ void CoasterTrain::OnAnimate(int delay) ptp = this->coaster->pieces; } while (ptp->distance_base + ptp->piece->piece_length < position) ptp++; - int32 xpos_front = ptp->piece->car_xpos->GetValue(position - ptp->distance_base) + (ptp->x_base << 8); - int32 ypos_front = ptp->piece->car_ypos->GetValue(position - ptp->distance_base) + (ptp->y_base << 8); - int32 zpos_front = ptp->piece->car_zpos->GetValue(position - ptp->distance_base) * 2 + (ptp->z_base << 8); + int32 xpos_front = ptp->piece->car_xpos->GetValue(position - ptp->distance_base) + (ptp->base_voxel.x << 8); + int32 ypos_front = ptp->piece->car_ypos->GetValue(position - ptp->distance_base) + (ptp->base_voxel.y << 8); + int32 zpos_front = ptp->piece->car_zpos->GetValue(position - ptp->distance_base) * 2 + (ptp->base_voxel.z << 8); int32 xder = xpos_front - xpos_back; int32 yder = ypos_front - ypos_back; @@ -652,20 +652,18 @@ int CoasterInstance::GetFirstPlacedTrackPiece() const /** * Find the first placed track piece at a given position with a given entry connection. - * @param x Required X position. - * @param y Required Y position. - * @param z Required Z position. + * @param vox Required voxel position. * @param entry_connect Required entry connection. * @param start First index to search. * @param end End of the search (one beyond the last positioned track piece to search). * @return Index of the requested positioned track piece if it exists, else \c -1. */ -int CoasterInstance::FindSuccessorPiece(uint16 x, uint16 y, uint8 z, uint8 entry_connect, int start, int end) +int CoasterInstance::FindSuccessorPiece(const XYZPoint16 &vox, uint8 entry_connect, int start, int end) { if (start < 0) start = 0; if (end > MAX_PLACED_TRACK_PIECES) end = MAX_PLACED_TRACK_PIECES; for (; start < end; start++) { - if (this->pieces[start].CanBeSuccessor(x, y, z, entry_connect)) return start; + if (this->pieces[start].CanBeSuccessor(vox, entry_connect)) return start; } return -1; } @@ -677,7 +675,7 @@ int CoasterInstance::FindSuccessorPiece(uint16 x, uint16 y, uint8 z, uint8 entry */ int CoasterInstance::FindSuccessorPiece(const PositionedTrackPiece &placed) { - return this->FindSuccessorPiece(placed.GetEndX(), placed.GetEndY(), placed.GetEndZ(), placed.piece->exit_connect); + return this->FindSuccessorPiece(placed.GetEndXYZ(), placed.piece->exit_connect); } /** @@ -733,7 +731,7 @@ bool CoasterInstance::MakePositionedPiecesLooping(bool *modified) distance += ptp->piece->piece_length; for (int i = 1; i < count; i++) { - int j = this->FindSuccessorPiece(ptp->GetEndX(), ptp->GetEndY(), ptp->GetEndZ(), ptp->piece->exit_connect, i, count); + int j = this->FindSuccessorPiece(ptp->GetEndXYZ(), ptp->piece->exit_connect, i, count); if (j < 0) return false; ptp++; // Now points to pieces[i]. if (i != j) { @@ -793,7 +791,7 @@ void CoasterInstance::PlaceTrackPieceInAdditions(const PositionedTrackPiece &pla const CoasterType *ct = this->GetCoasterType(); const TrackVoxel *tvx = placed.piece->track_voxels; for (int i = 0; i < placed.piece->voxel_count; i++) { - Voxel *vx = _additions.GetCreateVoxel(placed.x_base + tvx->dx, placed.y_base + tvx->dy, placed.z_base + tvx->dz, true); + Voxel *vx = _additions.GetCreateVoxel(placed.base_voxel.x + tvx->dx, placed.base_voxel.y + tvx->dy, placed.base_voxel.z + tvx->dz, true); // assert(vx->CanPlaceInstance()): Checked by this->CanBePlaced(). vx->SetInstance(ride_number); vx->SetInstanceData(ct->GetTrackVoxelIndex(tvx)); @@ -809,7 +807,7 @@ void CoasterInstance::RemoveTrackPieceInAdditions(const PositionedTrackPiece &pl { const TrackVoxel *tvx = placed.piece->track_voxels; for (int i = 0; i < placed.piece->voxel_count; i++) { - Voxel *vx = _additions.GetCreateVoxel(placed.x_base + tvx->dx, placed.y_base + tvx->dy, placed.z_base + tvx->dz, false); + Voxel *vx = _additions.GetCreateVoxel(placed.base_voxel.x + tvx->dx, placed.base_voxel.y + tvx->dy, placed.base_voxel.z + tvx->dz, false); assert(vx->GetInstance() == (SmallRideInstance)this->GetIndex()); vx->SetInstance(SRI_FREE); vx->SetInstanceData(0); // Not really needed. diff --git a/src/coaster.h b/src/coaster.h index 1bb0e11..7646f57 100644 --- a/src/coaster.h +++ b/src/coaster.h @@ -204,7 +204,7 @@ public: int AddPositionedPiece(const PositionedTrackPiece &placed); void RemovePositionedPiece(PositionedTrackPiece &piece); - int FindSuccessorPiece(uint16 x, uint16 y, uint8 z, uint8 entry_connect, int start = 0, int end = MAX_PLACED_TRACK_PIECES); + int FindSuccessorPiece(const XYZPoint16 &vox, uint8 entry_connect, int start = 0, int end = MAX_PLACED_TRACK_PIECES); int FindSuccessorPiece(const PositionedTrackPiece &placed); int FindPredecessorPiece(const PositionedTrackPiece &placed); diff --git a/src/coaster_build.h b/src/coaster_build.h index 141b456..0c44308 100644 --- a/src/coaster_build.h +++ b/src/coaster_build.h @@ -49,7 +49,7 @@ public: void CloseWindow(uint16 instance); void ShowNoPiece(uint16 instance); void SelectPosition(uint16 instance, ConstTrackPiecePtr piece, TileEdge direction); - void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, int x, int y, int z, TileEdge direction); + void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, const XYZPoint16 &vox, TileEdge direction); bool MayActivateMode() override; void ActivateMode(const Point16 &pos) override; diff --git a/src/coaster_gui.cpp b/src/coaster_gui.cpp index 18b2489..644488e 100644 --- a/src/coaster_gui.cpp +++ b/src/coaster_gui.cpp @@ -570,8 +570,7 @@ void CoasterBuildWindow::SetupSelection() } else { if (this->cur_after) { TileEdge dir = (TileEdge)(this->cur_piece->piece->exit_connect & 3); /// \todo Define this in the data format - _coaster_builder.DisplayPiece(this->wnumber, this->sel_piece, this->cur_piece->GetEndX(), - this->cur_piece->GetEndY(), this->cur_piece->GetEndZ(), dir); + _coaster_builder.DisplayPiece(this->wnumber, this->sel_piece, this->cur_piece->GetEndXYZ(), dir); } // XXX else: display before start. } @@ -587,8 +586,8 @@ void CoasterBuildWindow::SetupSelection() int CoasterBuildWindow::BuildTrackPiece() { if (this->sel_piece == nullptr) return -1; - PositionedTrackPiece ptp(_coaster_builder.track_xpos, _coaster_builder.track_ypos, - _coaster_builder.track_zpos, this->sel_piece); + PositionedTrackPiece ptp(XYZPoint16(_coaster_builder.track_xpos, _coaster_builder.track_ypos, _coaster_builder.track_zpos), + this->sel_piece); if (!ptp.CanBePlaced()) return -1; /* Add the piece to the coaster instance. */ @@ -719,7 +718,7 @@ public: * @param z Z position of the piece. * @param direction Direction of building (to use with a cursor). */ - virtual void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, int x, int y, int z, TileEdge direction) const = 0; + virtual void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, const XYZPoint16 &vox, TileEdge direction) const = 0; CoasterBuildMode * const mode; ///< Coaster build mouse mode. }; @@ -782,7 +781,7 @@ public: { } - void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, int x, int y, int z, TileEdge direction) const override + void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, const XYZPoint16 &vox, TileEdge direction) const override { } }; @@ -860,10 +859,10 @@ public: mode->SetSelectPosition(piece, direction); } - void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, int x, int y, int z, TileEdge direction) const override + void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, const XYZPoint16 &vox, TileEdge direction) const override { if (mode->instance != instance) return; - mode->SetFixedPiece(piece, x, y, z, direction); + mode->SetFixedPiece(piece, vox.x, vox.y, vox.z, direction); } }; @@ -937,10 +936,10 @@ public: mode->SetState(BS_MOUSE); } - void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, int x, int y, int z, TileEdge direction) const override + void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, const XYZPoint16 &vox, TileEdge direction) const override { if (mode->instance != instance) return; - mode->SetFixedPiece(piece, x, y, z, direction); + mode->SetFixedPiece(piece, vox.x, vox.y, vox.z, direction); mode->UpdateDisplay(false); mode->SetState(BS_FIXED); } @@ -989,7 +988,7 @@ public: void OnMouseButtonEvent(Viewport *vp, uint8 state) const override { - PositionedTrackPiece ptp(mode->track_xpos, mode->track_ypos, mode->track_zpos, mode->cur_piece); + PositionedTrackPiece ptp(XYZPoint16(mode->track_xpos, mode->track_ypos, mode->track_zpos), mode->cur_piece); if (ptp.CanBePlaced()) { mode->SetNoPiece(); mode->UpdateDisplay(false); @@ -1025,10 +1024,10 @@ public: mode->UpdateDisplay(false); } - void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, int x, int y, int z, TileEdge direction) const override + void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, const XYZPoint16 &vox, TileEdge direction) const override { if (mode->instance != instance) return; - mode->SetFixedPiece(piece, x, y, z, direction); + mode->SetFixedPiece(piece, vox.x, vox.y, vox.z, direction); mode->UpdateDisplay(false); mode->SetState(BS_FIXED); } @@ -1103,10 +1102,10 @@ public: mode->SetState(BS_MOUSE); } - void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, int x, int y, int z, TileEdge direction) const override + void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, const XYZPoint16 &vox, TileEdge direction) const override { if (mode->instance != instance) return; - mode->SetFixedPiece(piece, x, y, z, direction); + mode->SetFixedPiece(piece, vox.x, vox.y, vox.z, direction); mode->UpdateDisplay(false); } }; @@ -1171,7 +1170,7 @@ public: { } - void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, int x, int y, int z, TileEdge direction) const override + void DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, const XYZPoint16 &vox, TileEdge direction) const override { } }; @@ -1248,9 +1247,9 @@ void CoasterBuildMode::SelectPosition(uint16 instance, ConstTrackPiecePtr piece, * @param z Z position of the piece. * @param direction Direction of building (to use with a cursor). */ -void CoasterBuildMode::DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, int x, int y, int z, TileEdge direction) +void CoasterBuildMode::DisplayPiece(uint16 instance, ConstTrackPiecePtr piece, const XYZPoint16 &vox, TileEdge direction) { - _coaster_build_states[this->state]->DisplayPiece(instance, piece, x, y, z, direction); + _coaster_build_states[this->state]->DisplayPiece(instance, piece, vox, direction); } /** @@ -1350,7 +1349,7 @@ void CoasterBuildMode::UpdateDisplay(bool mousepos_changed) } _additions.Clear(); EnableWorldAdditions(); - PositionedTrackPiece ptp(this->track_xpos, this->track_ypos, this->track_zpos, this->cur_piece); + PositionedTrackPiece ptp(XYZPoint16(this->track_xpos, this->track_ypos, this->track_zpos), this->cur_piece); CoasterInstance *ci = static_cast(_rides_manager.GetRideInstance(this->instance)); if (ptp.CanBePlaced()) ci->PlaceTrackPieceInAdditions(ptp); vp->arrow_cursor.SetCursor(XYZPoint16(this->track_xpos, this->track_ypos, this->track_zpos), (CursorType)(CUR_TYPE_ARROW_NE + this->direction)); diff --git a/src/track_piece.cpp b/src/track_piece.cpp index 5c0e915..1705474 100644 --- a/src/track_piece.cpp +++ b/src/track_piece.cpp @@ -226,24 +226,14 @@ bool TrackPiece::Load(RcdFileReader *rcd_file, const ImageMap &sprites) return length == 0; } -/** Default constructor. */ -PositionedTrackPiece::PositionedTrackPiece() -{ - this->piece = nullptr; -} - /** * Constructor taking values for all its fields. - * @param xpos X position of the positioned track piece. - * @param ypos Y position of the positioned track piece. - * @param zpos Z position of the positioned track piece. + * @param vox_pos Position of the positioned track piece. * @param piece Track piece to use. */ -PositionedTrackPiece::PositionedTrackPiece(uint16 xpos, uint16 ypos, uint8 zpos, ConstTrackPiecePtr piece) +PositionedTrackPiece::PositionedTrackPiece(const XYZPoint16 &vox_pos, ConstTrackPiecePtr piece) { - this->x_base = xpos; - this->y_base = ypos; - this->z_base = zpos; + this->base_voxel = vox_pos; this->piece = piece; } @@ -255,12 +245,12 @@ PositionedTrackPiece::PositionedTrackPiece(uint16 xpos, uint16 ypos, uint8 zpos, bool PositionedTrackPiece::IsOnWorld() const { assert(this->piece != nullptr); - if (!IsVoxelInsideWorld(this->x_base, this->y_base, this->z_base)) return false; - if (!IsVoxelInsideWorld(this->x_base + this->piece->exit_dx, this->y_base + this->piece->exit_dy, - this->z_base + this->piece->exit_dz)) return false; + if (!IsVoxelInsideWorld(this->base_voxel.x, this->base_voxel.y, this->base_voxel.z)) return false; + if (!IsVoxelInsideWorld(this->base_voxel.x + this->piece->exit_dx, this->base_voxel.y + this->piece->exit_dy, + this->base_voxel.z + this->piece->exit_dz)) return false; const TrackVoxel *tvx = this->piece->track_voxels; for (int i = 0; i < this->piece->voxel_count; i++) { - if (!IsVoxelInsideWorld(this->x_base + tvx->dx, this->y_base + tvx->dy, this->z_base + tvx->dz)) return false; + if (!IsVoxelInsideWorld(this->base_voxel.x + tvx->dx, this->base_voxel.y + tvx->dy, this->base_voxel.z + tvx->dz)) return false; tvx++; } return true; @@ -277,8 +267,8 @@ bool PositionedTrackPiece::CanBePlaced() const const TrackVoxel *tvx = this->piece->track_voxels; for (int i = 0; i < this->piece->voxel_count; i++) { /* Is the voxel above ground level? */ - if (_world.GetGroundHeight(this->x_base + tvx->dx, this->y_base + tvx->dy) > this->z_base + tvx->dz) return false; - const Voxel *vx = _world.GetVoxel(this->x_base + tvx->dx, this->y_base + tvx->dy, this->z_base + tvx->dz); + if (_world.GetGroundHeight(this->base_voxel.x + tvx->dx, this->base_voxel.y + tvx->dy) > this->base_voxel.z + tvx->dz) return false; + const Voxel *vx = _world.GetVoxel(this->base_voxel.x + tvx->dx, this->base_voxel.y + tvx->dy, this->base_voxel.z + tvx->dz); if (vx != nullptr && !vx->CanPlaceInstance()) return false; } return true; @@ -286,15 +276,13 @@ bool PositionedTrackPiece::CanBePlaced() const /** * Can this positioned track piece function as a successor for the given exit conditions? - * @param x Required X position. - * @param y Required Y position. - * @param z Required Z position. + * @param vox Required coordinate position. * @param connect Required entry connection. * @return This positioned track piece can be used as successor. */ -bool PositionedTrackPiece::CanBeSuccessor(uint16 x, uint16 y, uint8 z, uint8 connect) const +bool PositionedTrackPiece::CanBeSuccessor(const XYZPoint16 &vox, uint8 connect) const { - return this->piece != nullptr && this->x_base == x && this->y_base == y && this->z_base == z && this->piece->entry_connect == connect; + return this->piece != nullptr && this->base_voxel == vox && this->piece->entry_connect == connect; } /** @@ -305,5 +293,5 @@ bool PositionedTrackPiece::CanBeSuccessor(uint16 x, uint16 y, uint8 z, uint8 con bool PositionedTrackPiece::CanBeSuccessor(const PositionedTrackPiece &pred) const { if (pred.piece == nullptr) return false; - return this->CanBeSuccessor(pred.GetEndX(), pred.GetEndY(), pred.GetEndZ(), pred.piece->exit_connect); + return this->CanBeSuccessor(pred.GetEndXYZ(), pred.piece->exit_connect); } diff --git a/src/track_piece.h b/src/track_piece.h index f280167..2b5bfec 100644 --- a/src/track_piece.h +++ b/src/track_piece.h @@ -279,44 +279,26 @@ typedef std::shared_ptr ConstTrackPiecePtr; */ class PositionedTrackPiece { public: - PositionedTrackPiece(); - PositionedTrackPiece(uint16 xpos, uint16 ypos, uint8 zpos, ConstTrackPiecePtr piece); + PositionedTrackPiece() = default; + PositionedTrackPiece(const XYZPoint16 &vox_pos, ConstTrackPiecePtr piece); bool IsOnWorld() const; bool CanBePlaced() const; - bool CanBeSuccessor(uint16 x, uint16 y, uint8 z, uint8 connect) const; + bool CanBeSuccessor(const XYZPoint16 &vox, uint8 connect) const; bool CanBeSuccessor(const PositionedTrackPiece &pred) const; /** - * Get the X position of the exit voxel. - * @return The X position of the exit voxel. + * Get the position of the exit voxel. + * @return The position of the exit voxel. */ - inline uint16 GetEndX() const + inline XYZPoint16 GetEndXYZ() const { - return this->x_base + this->piece->exit_dx; + return XYZPoint16(this->base_voxel.x + this->piece->exit_dx, + this->base_voxel.y + this->piece->exit_dy, + this->base_voxel.z + this->piece->exit_dz); } - /** - * Get the Y position of the exit voxel. - * @return The Y position of the exit voxel. - */ - inline uint16 GetEndY() const - { - return this->y_base + this->piece->exit_dy; - } - - /** - * Get the Z position of the exit voxel. - * @return The Z position of the exit voxel. - */ - inline uint8 GetEndZ() const - { - return this->z_base + this->piece->exit_dz; - } - - uint16 x_base; ///< X position of the entry point of the track piece. - uint16 y_base; ///< Y position of the entry point of the track piece. - uint8 z_base; ///< Z position of the entry point of the track piece. + XYZPoint16 base_voxel; ///< Position (in voxels) of the entry point of the track piece. uint32 distance_base; ///< Base distance of this track piece in its roller coaster. ConstTrackPiecePtr piece; ///< Track piece placed at the given position, may be \c nullptr. -- 2.2.1