[Scummvm-git-logs] scummvm master -> da29ae539e45bc7fe70c16e1902806e7b377b726
mduggan
noreply at scummvm.org
Mon Jan 30 08:48:02 UTC 2023
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
da29ae539e TETRAEDGE: Fix janks in pathfinding
Commit: da29ae539e45bc7fe70c16e1902806e7b377b726
https://github.com/scummvm/scummvm/commit/da29ae539e45bc7fe70c16e1902806e7b377b726
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-01-30T17:45:54+09:00
Commit Message:
TETRAEDGE: Fix janks in pathfinding
The first and last points of the pathfinding result should not be used as they
are grid-rounded versions of the start and end points.
Changed paths:
engines/tetraedge/te/te_free_move_zone.cpp
engines/tetraedge/te/te_free_move_zone.h
diff --git a/engines/tetraedge/te/te_free_move_zone.cpp b/engines/tetraedge/te/te_free_move_zone.cpp
index 7051e06ed31..96286d61579 100644
--- a/engines/tetraedge/te/te_free_move_zone.cpp
+++ b/engines/tetraedge/te/te_free_move_zone.cpp
@@ -65,7 +65,7 @@ class TeFreeMoveZoneGraph : micropather::Graph {
TeFreeMoveZone::TeFreeMoveZone() : _actzones(nullptr), _blockers(nullptr), _rectBlockers(nullptr),
_transformedVerticiesDirty(true), _bordersDirty(true), _pickMeshDirty(true), _projectedPointsDirty(true),
-_loadedFromBin(false), _gridWorldY(0.0), _gridOffsetSomething(5.0f, 5.0f), _gridDirty(true)
+_loadedFromBin(false), _gridWorldY(0.0), _gridSquareSize(5.0f, 5.0f), _gridDirty(true)
{
_graph = new TeFreeMoveZoneGraph();
_graph->_bordersDistance = 2048.0f;
@@ -86,8 +86,8 @@ float TeFreeMoveZone::bordersDistance() const {
}
TeVector2s32 TeFreeMoveZone::aStarResolution() const {
- TeVector2f32 diff = (_someGridVec2 - _someGridVec1);
- TeVector2s32 retval = TeVector2s32(diff / _gridOffsetSomething) + TeVector2s32(1, 1);
+ TeVector2f32 diff = (_gridBottomRight - _gridTopLeft);
+ TeVector2s32 retval = TeVector2s32(diff / _gridSquareSize) + TeVector2s32(1, 1);
if (retval._x > 2000)
retval._x = 200;
if (retval._y > 2000)
@@ -112,13 +112,13 @@ void TeFreeMoveZone::buildAStar() {
_graph->_flags[_graph->_size._x * y + x] = 1;
} else {
if (!hasCellBorderIntersection(TeVector2s32(x, y))) {
- const float gridOffX = _gridOffsetSomething.getX();
- const float gridOffY = _gridOffsetSomething.getY();
+ const float gridSquareX = _gridSquareSize.getX();
+ const float gridSquareY = _gridSquareSize.getY();
TeVector3f32 vout;
float fout;
- TeVector3f32 gridPt(x * gridOffX + _someGridVec1.getX() + gridOffX * 0.5,
+ TeVector3f32 gridPt(x * gridSquareX + _gridTopLeft.getX() + gridSquareX / 2,
1000000.0,
- gridOffY * 0.5 + y * gridOffY + _someGridVec1.getY());
+ y * gridSquareY + _gridTopLeft.getY() + gridSquareY / 2);
bool doesIntersect = intersect(gridPt, TeVector3f32(0.0, -1.0, 0.0), vout, fout, true, nullptr);
if (!doesIntersect)
doesIntersect = intersect(gridPt, TeVector3f32(0.0, 1.0, 0.0), vout, fout, true, nullptr);
@@ -220,8 +220,9 @@ TeIntrusivePtr<TeBezierCurve> TeFreeMoveZone::curve(const TeVector3f32 &startpt,
}
Common::Array<TeVector3f32> pts3d;
- for (auto &pt : points) {
- pts3d.push_back(transformAStarGridInWorldSpace(pt));
+ // Skip first and last points, we will use the exact values.
+ for (uint i = 1; i < points.size() - 1; i++) {
+ pts3d.push_back(transformAStarGridInWorldSpace(points[i]));
}
pts3d.front() = startpt;
@@ -245,7 +246,7 @@ void TeFreeMoveZone::deserialize(Common::ReadStream &stream, TeFreeMoveZone &des
Common::Array<TeRectBlocker> *rectblockers, Common::Array<TeActZone> *actzones) {
dest.clear();
TePickMesh2::deserialize(stream, dest);
- TeVector2f32::deserialize(stream, dest._gridOffsetSomething);
+ TeVector2f32::deserialize(stream, dest._gridSquareSize);
dest._transformedVerticiesDirty = (stream.readByte() != 0);
dest._bordersDirty = (stream.readByte() != 0);
dest._pickMeshDirty = (stream.readByte() != 0);
@@ -259,13 +260,13 @@ void TeFreeMoveZone::deserialize(Common::ReadStream &stream, TeFreeMoveZone &des
TeOBP::deserialize(stream, dest._obp);
- TeVector2f32::deserialize(stream, dest._someGridVec1);
- TeVector2f32::deserialize(stream, dest._someGridVec2);
+ TeVector2f32::deserialize(stream, dest._gridTopLeft);
+ TeVector2f32::deserialize(stream, dest._gridBottomRight);
dest._gridWorldY = stream.readFloatLE();
dest._graph->deserialize(stream);
if (dest.name().contains("19000")) {
- dest._gridOffsetSomething = TeVector2f32(2.0, 2.0);
+ dest._gridSquareSize = TeVector2f32(2.0f, 2.0f);
dest._gridDirty = true;
}
dest._blockers = blockers;
@@ -336,16 +337,16 @@ static int segmentIntersection(const TeVector2f32 &s1start, const TeVector2f32 &
byte TeFreeMoveZone::hasBlockerIntersection(const TeVector2s32 &pt) {
TeVector2f32 borders[4];
- const float gridOffsetX = _gridOffsetSomething.getX();
- const float gridOffsetY = _gridOffsetSomething.getX();
- borders[0] = TeVector2f32(pt._x * gridOffsetX + _someGridVec1.getX(),
- pt._y * gridOffsetY + _someGridVec1.getY());
- borders[1] = TeVector2f32(pt._x * gridOffsetX + _someGridVec1.getX() + gridOffsetX,
- pt._y * gridOffsetY + _someGridVec1.getY());
- borders[2] = TeVector2f32(pt._x * gridOffsetX + _someGridVec1.getX(),
- pt._y * gridOffsetY + _someGridVec1.getY() + gridOffsetY);
- borders[3] = TeVector2f32(pt._x * gridOffsetX + _someGridVec1.getX() + gridOffsetX,
- pt._y * gridOffsetY + _someGridVec1.getY() + gridOffsetY);
+ const float gridSquareX = _gridSquareSize.getX();
+ const float gridSquareY = _gridSquareSize.getY();
+ borders[0] = TeVector2f32(pt._x * gridSquareX + _gridTopLeft.getX(),
+ pt._y * gridSquareY + _gridTopLeft.getY());
+ borders[1] = TeVector2f32(pt._x * gridSquareX + _gridTopLeft.getX() + gridSquareX,
+ pt._y * gridSquareY + _gridTopLeft.getY());
+ borders[2] = TeVector2f32(pt._x * gridSquareX + _gridTopLeft.getX(),
+ pt._y * gridSquareY + _gridTopLeft.getY() + gridSquareY);
+ borders[3] = TeVector2f32(pt._x * gridSquareX + _gridTopLeft.getX() + gridSquareX,
+ pt._y * gridSquareY + _gridTopLeft.getY() + gridSquareY);
for (uint i = 0; i < _blockers->size(); i++) {
const TeBlocker &blocker = (*_blockers)[i];
@@ -375,16 +376,16 @@ byte TeFreeMoveZone::hasBlockerIntersection(const TeVector2s32 &pt) {
bool TeFreeMoveZone::hasCellBorderIntersection(const TeVector2s32 &pt) {
TeVector2f32 borders[4];
- const float gridOffsetX = _gridOffsetSomething.getX();
- const float gridOffsetY = _gridOffsetSomething.getX();
- borders[0] = TeVector2f32(pt._x * gridOffsetX + _someGridVec1.getX(),
- pt._y * gridOffsetY + _someGridVec1.getY());
- borders[1] = TeVector2f32(pt._x * gridOffsetX + _someGridVec1.getX() + gridOffsetX,
- pt._y * gridOffsetY + _someGridVec1.getY());
- borders[2] = TeVector2f32(pt._x * gridOffsetX + _someGridVec1.getX(),
- pt._y * gridOffsetY + _someGridVec1.getY() + gridOffsetY);
- borders[3] = TeVector2f32(pt._x * gridOffsetX + _someGridVec1.getX() + gridOffsetX,
- pt._y * gridOffsetY + _someGridVec1.getY() + gridOffsetY);
+ const float gridSquareX = _gridSquareSize.getX();
+ const float gridSquareY = _gridSquareSize.getY();
+ borders[0] = TeVector2f32(pt._x * gridSquareX + _gridTopLeft.getX(),
+ pt._y * gridSquareY + _gridTopLeft.getY());
+ borders[1] = TeVector2f32(pt._x * gridSquareX + _gridTopLeft.getX() + gridSquareX,
+ pt._y * gridSquareY + _gridTopLeft.getY());
+ borders[2] = TeVector2f32(pt._x * gridSquareX + _gridTopLeft.getX(),
+ pt._y * gridSquareY + _gridTopLeft.getY() + gridSquareY);
+ borders[3] = TeVector2f32(pt._x * gridSquareX + _gridTopLeft.getX() + gridSquareX,
+ pt._y * gridSquareY + _gridTopLeft.getY() + gridSquareY);
int iresult = 0;
for (uint border = 0; border < _borders.size() / 2; border++) {
@@ -443,8 +444,8 @@ void TeFreeMoveZone::preUpdateGrid() {
else
newVec = gridInverse * _freeMoveZoneVerticies[_pickMesh[0]];
- _someGridVec1.setX(newVec.x());
- _someGridVec1.setY(newVec.z());
+ _gridTopLeft.setX(newVec.x());
+ _gridTopLeft.setY(newVec.z());
_gridWorldY = newVec.y();
}
@@ -456,18 +457,18 @@ void TeFreeMoveZone::preUpdateGrid() {
else
newVec = gridInverse * _freeMoveZoneVerticies[vertNo];
- if (_someGridVec1.getX() <= newVec.x()) {
- if (_someGridVec2.getX() < newVec.x())
- _someGridVec2.setX(newVec.x());
+ if (_gridTopLeft.getX() <= newVec.x()) {
+ if (_gridBottomRight.getX() < newVec.x())
+ _gridBottomRight.setX(newVec.x());
} else {
- _someGridVec1.setX(newVec.x());
+ _gridTopLeft.setX(newVec.x());
}
- if (_someGridVec1.getY() <= newVec.z()) {
- if (_someGridVec2.getY() < newVec.z())
- _someGridVec2.setY(newVec.z());
+ if (_gridTopLeft.getY() <= newVec.z()) {
+ if (_gridBottomRight.getY() < newVec.z())
+ _gridBottomRight.setY(newVec.z());
} else {
- _someGridVec1.setY(newVec.z());
+ _gridTopLeft.setY(newVec.z());
}
if (newVec.y() < _gridWorldY)
@@ -476,14 +477,14 @@ void TeFreeMoveZone::preUpdateGrid() {
if (!_loadedFromBin) {
if (!name().contains("19000"))
- _gridOffsetSomething = TeVector2f32(5.0f, 5.0f);
+ _gridSquareSize = TeVector2f32(5.0f, 5.0f);
else
- _gridOffsetSomething = TeVector2f32(2.0f, 2.0f);
+ _gridSquareSize = TeVector2f32(2.0f, 2.0f);
} else {
- const TeVector2f32 gridVecDiff = _someGridVec2 - _someGridVec1;
+ const TeVector2f32 gridVecDiff = _gridBottomRight - _gridTopLeft;
float minSide = MIN(gridVecDiff.getX(), gridVecDiff.getY()) / 20.0f;
- _gridOffsetSomething.setX(minSide);
- _gridOffsetSomething.setY(minSide);
+ _gridSquareSize.setX(minSide);
+ _gridSquareSize.setY(minSide);
error("FIXME: Finish preUpdateGrid for loaded-from-bin case.");
/*
@@ -499,13 +500,13 @@ void TeFreeMoveZone::preUpdateGrid() {
}
TeVector2s32 TeFreeMoveZone::projectOnAStarGrid(const TeVector3f32 &pt) {
- TeVector2f32 otherpt;
+ TeVector2f32 offsetpt;
if (!_loadedFromBin) {
- otherpt = TeVector2f32(pt.x() - _someGridVec1.getX(), pt.z() - _someGridVec1.getY());
+ offsetpt = TeVector2f32(pt.x() - _gridTopLeft.getX(), pt.z() - _gridTopLeft.getY());
} else {
error("TODO: Implement TeFreeMoveZone::projectOnAStarGrid for _loadedFromBin");
}
- TeVector2f32 projected = otherpt / _gridOffsetSomething;
+ const TeVector2f32 projected = offsetpt / _gridSquareSize;
return TeVector2s32((int)projected.getX(), (int)projected.getY());
}
@@ -587,10 +588,10 @@ void TeFreeMoveZone::setVertex(uint offset, const TeVector3f32 &vertex) {
}
TeVector3f32 TeFreeMoveZone::transformAStarGridInWorldSpace(const TeVector2s32 &gridpt) {
- float offsety = (float)gridpt._y * _gridOffsetSomething.getY() + _someGridVec1.getY() +
- _gridOffsetSomething.getY() * 0.5;
- float offsetx = (float)gridpt._x * _gridOffsetSomething.getX() + _someGridVec1.getX() +
- _gridOffsetSomething.getX() * 0.5;
+ float offsetx = (float)gridpt._x * _gridSquareSize.getX() + _gridTopLeft.getX() +
+ _gridSquareSize.getX() / 2;
+ float offsety = (float)gridpt._y * _gridSquareSize.getY() + _gridTopLeft.getY() +
+ _gridSquareSize.getY() / 2;
if (!_loadedFromBin) {
return TeVector3f32(offsetx, _gridWorldY, offsety);
} else {
@@ -600,7 +601,7 @@ TeVector3f32 TeFreeMoveZone::transformAStarGridInWorldSpace(const TeVector2s32 &
}
float TeFreeMoveZone::transformHeightMin(float minval) {
- TeVector3f32 vec = worldTransformationMatrix() * TeVector3f32(_someGridVec1.getX(), minval, _someGridVec1.getY());
+ TeVector3f32 vec = worldTransformationMatrix() * TeVector3f32(_gridTopLeft.getX(), minval, _gridTopLeft.getY());
return vec.y();
}
diff --git a/engines/tetraedge/te/te_free_move_zone.h b/engines/tetraedge/te/te_free_move_zone.h
index 4f36d085541..3dd60bd6f52 100644
--- a/engines/tetraedge/te/te_free_move_zone.h
+++ b/engines/tetraedge/te/te_free_move_zone.h
@@ -128,10 +128,9 @@ private:
Common::Array<TeVector3f32> _transformedVerticies;
Common::Array<uint> _borders;
- // TODO: Find better names..
- TeVector2f32 _gridOffsetSomething;
- TeVector2f32 _someGridVec1;
- TeVector2f32 _someGridVec2;
+ TeVector2f32 _gridSquareSize;
+ TeVector2f32 _gridTopLeft;
+ TeVector2f32 _gridBottomRight;
TeMatrix4x4 _gridMatrix;
TeMatrix4x4 _inverseWorldTransform;
More information about the Scummvm-git-logs
mailing list