VisuTwin Canvas
C++ 3D Engine — Metal Backend
Loading...
Searching...
No Matches
plane.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2025-2026 Arnis Lektauers
3//
4// Created by Arnis Lektauers on 13.02.2026.
5//
6#include "plane.h"
7
8namespace visutwin::canvas
9{
10 Plane::Plane() : _normal(0.0f, 1.0f, 0.0f), _distance(0.0f)
11 {
12 }
13
14 Plane::Plane(const Vector3& normal, const float distance) : _normal(normal), _distance(distance)
15 {
16 }
17
18 Plane& Plane::copy(const Plane& src)
19 {
20 _normal = src._normal;
21 _distance = src._distance;
22 return *this;
23 }
24
26 {
27 return Plane(_normal, _distance);
28 }
29
30 bool Plane::intersectsLine(const Vector3& start, const Vector3& end, Vector3* point) const
31 {
32 const float d0 = _normal.dot(start) + _distance;
33 const float d1 = _normal.dot(end) + _distance;
34 const float t = d0 / (d0 - d1);
35 const bool intersects = t >= 0.0f && t <= 1.0f;
36 if (intersects && point) {
37 *point = start + (end - start) * t;
38 }
39 return intersects;
40 }
41
42 bool Plane::intersectsRay(const Ray& ray, Vector3* point) const
43 {
44 const float denominator = _normal.dot(ray.direction());
45 if (denominator == 0.0f) {
46 return false;
47 }
48
49 const float t = -(_normal.dot(ray.origin()) + _distance) / denominator;
50 if (t >= 0.0f && point) {
51 *point = ray.origin() + ray.direction() * t;
52 }
53 return t >= 0.0f;
54 }
55
57 {
58 const float invLength = 1.0f / _normal.length();
59 _normal = _normal * invLength;
60 _distance *= invLength;
61 return *this;
62 }
63
64 Plane& Plane::set(const float nx, const float ny, const float nz, const float d)
65 {
66 _normal = Vector3(nx, ny, nz);
67 _distance = d;
68 return *this;
69 }
70
72 {
73 _normal = normal;
74 _distance = -_normal.dot(point);
75 return *this;
76 }
77}
78
float distance() const
Definition plane.h:18
const Vector3 & normal() const
Definition plane.h:16
bool intersectsLine(const Vector3 &start, const Vector3 &end, Vector3 *point=nullptr) const
Definition plane.cpp:30
Plane clone() const
Definition plane.cpp:25
Plane & setFromPointNormal(const Vector3 &point, const Vector3 &normal)
Definition plane.cpp:71
bool intersectsRay(const Ray &ray, Vector3 *point=nullptr) const
Definition plane.cpp:42
Plane & set(float nx, float ny, float nz, float d)
Definition plane.cpp:64
Plane & copy(const Plane &src)
Definition plane.cpp:18
Infinite ray defined by origin and direction for raycasting and picking.
Definition ray.h:14
const Vector3 & origin() const
Definition ray.h:19
const Vector3 & direction() const
Definition ray.h:21
3D vector for positions, directions, and normals with multi-backend SIMD acceleration.
Definition vector3.h:29