Optimized finding nearest plane
This commit is contained in:
parent
5dc3e727e0
commit
f945e21bbd
1 changed files with 9 additions and 1 deletions
10
src/Game.cpp
10
src/Game.cpp
|
@ -137,16 +137,24 @@ void Game::run(int delta) {
|
|||
ok = true;
|
||||
|
||||
MathUtil::Plane nearestPlane;
|
||||
float nearestDistance;
|
||||
|
||||
for(std::vector<TriangleRecord>::iterator t = triangles.begin(); t != triangles.end(); ++t) {
|
||||
if(Collision::test(t->getTriangle(), playerPos, PLAYER_RADIUS, playerMove)) {
|
||||
vmml::vec3f normal = t->getTriangle().computeNormal();
|
||||
if(normal.dot(playerMove) >= 0)
|
||||
continue;
|
||||
|
||||
MathUtil::Plane p(normal, vmml::dot(normal, t->getTriangle().getVertex(0)+PLAYER_RADIUS*normal));
|
||||
if(p.isInFront(playerPos) || p.contains(playerPos)) {
|
||||
if(ok || p.distance(playerPos) < nearestPlane.distance(playerPos)) {
|
||||
vmml::vec3f intersection = p.intersection(MathUtil::Ray(playerPos, playerMove));
|
||||
float distance = intersection.squared_distance(playerPos);
|
||||
|
||||
if(ok || distance < nearestDistance) {
|
||||
ok = false;
|
||||
|
||||
nearestPlane = p;
|
||||
nearestDistance = distance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Reference in a new issue