Toast Engine
Loading...
Searching...
No Matches
volume_bounds.hpp
Go to the documentation of this file.
1
6
7#pragma once
8#include "voxel_constants.hpp"
9
10#include <algorithm>
11#include <cmath>
12#include <glm/glm.hpp>
13
14namespace voxel {
15
16[[nodiscard]]
17inline auto localExtent(glm::uvec3 brick_dims) noexcept -> glm::vec3 {
18 return glm::vec3(brick_dims) * k_brick_size;
19}
20
22[[nodiscard]]
23inline auto worldBoundingSphere(const glm::mat4& model, glm::uvec3 brick_dims) -> glm::vec4 {
24 const glm::vec3 extent = localExtent(brick_dims);
25 const glm::vec3 centre = glm::vec3(model * glm::vec4(extent * 0.5f, 1.0f));
26
27 float radius_squared = 0.0f;
28 for (int corner = 0; corner < 8; ++corner) {
29 const glm::vec3 local(
30 (corner & 1) != 0 ? extent.x : 0.0f, (corner & 2) != 0 ? extent.y : 0.0f, (corner & 4) != 0 ? extent.z : 0.0f
31 );
32 const glm::vec3 offset = glm::vec3(model * glm::vec4(local, 1.0f)) - centre;
33 radius_squared = std::max(radius_squared, glm::dot(offset, offset));
34 }
35 return {centre, std::sqrt(radius_squared)};
36}
37
39[[nodiscard]]
40inline auto containsPoint(const glm::mat4& inverse_model, glm::uvec3 brick_dims, glm::vec3 world_point, float margin = 0.0f)
41 -> bool {
42 const glm::vec3 local = glm::vec3(inverse_model * glm::vec4(world_point, 1.0f));
43 const float largest_scale = std::max(
44 {glm::length(glm::vec3(inverse_model[0])),
45 glm::length(glm::vec3(inverse_model[1])),
46 glm::length(glm::vec3(inverse_model[2]))}
47 );
48 const glm::vec3 guard(margin * largest_scale);
49 return glm::all(glm::greaterThanEqual(local, -guard)) && glm::all(glm::lessThanEqual(local, localExtent(brick_dims) + guard));
50}
51
52}
auto worldBoundingSphere(const glm::mat4 &model, glm::uvec3 brick_dims) -> glm::vec4
Definition volume_bounds.hpp:23
auto containsPoint(const glm::mat4 &inverse_model, glm::uvec3 brick_dims, glm::vec3 world_point, float margin=0.0f) -> bool
Pass the near plane distance as margin.
Definition volume_bounds.hpp:40