mirror of
https://github.com/orange-cpp/omath.git
synced 2026-02-13 07:03:25 +00:00
added trace line
This commit is contained in:
1
source/collision/CMakeLists.txt
Normal file
1
source/collision/CMakeLists.txt
Normal file
@@ -0,0 +1 @@
|
||||
target_sources(omath PRIVATE LineTracer.cpp)
|
||||
40
source/collision/LineTracer.cpp
Normal file
40
source/collision/LineTracer.cpp
Normal file
@@ -0,0 +1,40 @@
|
||||
//
|
||||
// Created by Orange on 11/13/2024.
|
||||
//
|
||||
#pragma once
|
||||
#include "omath/collision/LineTracer.hpp"
|
||||
|
||||
namespace omath::collision
|
||||
{
|
||||
bool LineTracer::CanTraceLine(const Ray &ray, const Triangle3d &triangle)
|
||||
{
|
||||
const auto sideA = triangle.SideAVector();
|
||||
const auto sideB = triangle.SideBVector();
|
||||
|
||||
const auto rayDir = ray.end - ray.start;
|
||||
|
||||
const auto p = rayDir.Cross(sideB);
|
||||
|
||||
const auto det = sideA.Dot(p);
|
||||
|
||||
if (std::abs(det) < 1e-6)
|
||||
return true;
|
||||
|
||||
const auto invDet = 1 / det;
|
||||
|
||||
const auto t = ray.start - triangle.m_vertex2;
|
||||
|
||||
const auto u = t.Dot(p) * invDet;
|
||||
|
||||
if (u < 0.f || u > 1.f)
|
||||
return true;
|
||||
|
||||
const auto q = t.Cross(sideA);
|
||||
const auto v = rayDir.Dot(q) * invDet;
|
||||
|
||||
if (v < 0.f || u + v > 1.f)
|
||||
return true;
|
||||
|
||||
return sideB.Dot(q) * invDet <= 0.f;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user