Navigation Menu

Skip to content

Commit

Permalink
Optimize a little bit isBlockInSight, adjustDist & collisions (#7193)
Browse files Browse the repository at this point in the history
* Use constexpr + unroll some calculations to cache definitively some calculations
* Unroll some calls in collision code & use a constref instead of a copy in one occurence
  • Loading branch information
nerzhul committed Apr 3, 2018
1 parent 05fe3b0 commit a90d27e
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 10 deletions.
9 changes: 6 additions & 3 deletions src/collision.cpp
Expand Up @@ -322,9 +322,12 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
}
std::vector<aabb3f> nodeboxes;
n.getCollisionBoxes(gamedef->ndef(), &nodeboxes, neighbors);

// Calculate float position only once
v3f posf = intToFloat(p, BS);
for (auto box : nodeboxes) {
box.MinEdge += intToFloat(p, BS);
box.MaxEdge += intToFloat(p, BS);
box.MinEdge += posf;
box.MaxEdge += posf;
cinfo.emplace_back(false, false, n_bouncy_value, p, box);
}
} else {
Expand Down Expand Up @@ -437,7 +440,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
Go through every nodebox, find nearest collision
*/
for (u32 boxindex = 0; boxindex < cinfo.size(); boxindex++) {
NearbyCollisionInfo box_info = cinfo[boxindex];
const NearbyCollisionInfo &box_info = cinfo[boxindex];
// Ignore if already stepped up this nodebox.
if (box_info.is_step_up)
continue;
Expand Down
15 changes: 8 additions & 7 deletions src/util/numeric.cpp
Expand Up @@ -108,7 +108,7 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
{
// Maximum radius of a block. The magic number is
// sqrt(3.0) / 2.0 in literal form.
const f32 block_max_radius = 0.866025403784 * MAP_BLOCKSIZE * BS;
static constexpr const f32 block_max_radius = 0.866025403784f * MAP_BLOCKSIZE * BS;

v3s16 blockpos_nodes = blockpos_b * MAP_BLOCKSIZE;

Expand All @@ -125,16 +125,16 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
// Total distance
f32 d = MYMAX(0, blockpos_relative.getLength() - block_max_radius);

if(distance_ptr)
if (distance_ptr)
*distance_ptr = d;

// If block is far away, it's not in sight
if(d > range)
if (d > range)
return false;

// If block is (nearly) touching the camera, don't
// bother validating further (that is, render it anyway)
if(d == 0)
if (d == 0)
return true;

// Adjust camera position, for purposes of computing the angle,
Expand Down Expand Up @@ -166,12 +166,13 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
s16 adjustDist(s16 dist, float zoom_fov)
{
// 1.775 ~= 72 * PI / 180 * 1.4, the default on the client
const float default_fov = 1.775f;
static constexpr const float default_fov = 1.775f / 2.0f;

This comment has been minimized.

Copy link
@paramat

paramat Apr 4, 2018

Contributor

default_fov is indeed 1.775 not 1.775 / 2.0.

This comment has been minimized.

Copy link
@paramat

paramat Apr 4, 2018

Contributor

@nerzhul
Ok i see why this is done, for performance, but the variable name needs changing.
threshold_fov?

// heuristic cut-off for zooming
if (zoom_fov > default_fov / 2.0f)
if (zoom_fov > default_fov)

This comment has been minimized.

Copy link
@paramat

paramat Apr 4, 2018

Contributor

The intention of this code is to assume normal viewing when zoom_fov > default_fov / 2.0f, these changes obscure that intention.

This comment has been minimized.

Copy link
@paramat

paramat Apr 4, 2018

Contributor

default_fov should be renamed to threshold_fov or something similar.

return dist;

// new_dist = dist * ((1 - cos(FOV / 2)) / (1-cos(zoomFOV /2))) ^ (1/3)
return round(dist * std::cbrt((1.0f - std::cos(default_fov / 2.0f)) /
// note: FOV is calculated at compilation time
return round(dist * std::cbrt((1.0f - std::cos(default_fov)) /

This comment has been minimized.

Copy link
@paramat

paramat Apr 4, 2018

Contributor

See above.

This comment has been minimized.

Copy link
@nerzhul

nerzhul Apr 5, 2018

Author Member

@paramat i'm okay with what you wanted, can you do the trivial commit for that ?

This comment has been minimized.

Copy link
@paramat

paramat Apr 5, 2018

Contributor

Yes ok.

This comment has been minimized.

Copy link
@paramat

paramat Apr 5, 2018

Contributor
(1.0f - std::cos(zoom_fov / 2.0f))));
}

0 comments on commit a90d27e

Please sign in to comment.