2021-15-03
+ GenericTransformation.InWorldSpace (Merges the object transformation and the last master transformation) + Ray class for Raycasting (may not work correctly) + Util.CallGarbageCollector() can call the garbage collector. + GLWindow.WindowFlags allow to easly switch between Window <-> Borderless Window (this will cause the window to fill the entire screen) <-> Exclusive Fullscreen. ~ Made the bloom-texture scale a constructor-parameter. SM.OGL: + OpenGL-GarbageCollector integration. + BoundingBox.GetBounds(Matrix4, out Vector3,out Vector3) allows for easy transformation of the bounding box. + GLObjects can now marked as not compiled. Where it always returns false at WasCompiled. SM2D: ~ Improved the Mouse2D.MouseOver Algorithm.
This commit is contained in:
parent
4efc47d75a
commit
5bb690e45f
18 changed files with 224 additions and 20 deletions
66
SMCode/SM.Base/Utility/Ray.cs
Normal file
66
SMCode/SM.Base/Utility/Ray.cs
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
using System;
|
||||
using System.Windows;
|
||||
using OpenTK;
|
||||
using SM.Base.Drawing;
|
||||
using SM.Base.Scene;
|
||||
using SM.OGL.Mesh;
|
||||
|
||||
namespace SM.Utility
|
||||
{
|
||||
public struct Ray
|
||||
{
|
||||
public Vector3 Position;
|
||||
public Vector3 Direction;
|
||||
|
||||
public Ray(Vector3 position, Vector3 direction)
|
||||
{
|
||||
Position = position;
|
||||
Direction = direction.Normalized();
|
||||
}
|
||||
|
||||
public bool ObjectIntersection(BoundingBox box, Matrix4 modelMatrix, out float distance)
|
||||
{
|
||||
distance = 0.0f;
|
||||
float tMin = 0.0f;
|
||||
float tMax = 100000.0f;
|
||||
|
||||
Vector3 delta = modelMatrix.Row3.Xyz - Position;
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
Vector3 axis = new Vector3(modelMatrix[i, 0], modelMatrix[i, 1], modelMatrix[i, 2]);
|
||||
|
||||
float e = Vector3.Dot(axis, delta);
|
||||
float f = Vector3.Dot(Direction, axis);
|
||||
|
||||
if (Math.Abs(f) > 0.001f)
|
||||
{
|
||||
|
||||
float t1 = (e + box.Min[i]) / f;
|
||||
float t2 = (e + box.Max[i]) / f;
|
||||
|
||||
if (t1 > t2)
|
||||
{
|
||||
float w = t1;
|
||||
t1 = t2;
|
||||
t2 = w;
|
||||
}
|
||||
|
||||
if (t2 < tMax) tMax = t2;
|
||||
if (t1 > tMin) tMin = t1;
|
||||
|
||||
if (tMax < tMin)
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (-e + box.Min[i] > 0.0f || -e + box.Max[i] < 0.0f)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
distance = tMin;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue