mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 13:01:52 +00:00
Raycasting world now returns intersection location and face
This commit is contained in:
@@ -380,7 +380,7 @@ namespace Sandbox.VoxelFun
|
|||||||
Renderer.Submit(_quadGeometryBinding, _effect, transform);
|
Renderer.Submit(_quadGeometryBinding, _effect, transform);
|
||||||
}
|
}
|
||||||
|
|
||||||
_effect.Variables["BaseColor"].SetData(_squareColor1);
|
//_effect.Variables["BaseColor"].SetData(_squareColor1);
|
||||||
|
|
||||||
_texture.Bind();
|
_texture.Bind();
|
||||||
Renderer.Submit(_quadGeometryBinding, _textureEffect, .Scaling(1.5f));
|
Renderer.Submit(_quadGeometryBinding, _textureEffect, .Scaling(1.5f));
|
||||||
@@ -392,8 +392,6 @@ namespace Sandbox.VoxelFun
|
|||||||
|
|
||||||
//Ray ray = .(.(0.5f, 128.5f, 0.5f), .(0, -0.1f, -0.1f));
|
//Ray ray = .(.(0.5f, 128.5f, 0.5f), .(0, -0.1f, -0.1f));
|
||||||
|
|
||||||
_effect.Variables["BaseColor"].SetData(.Red);
|
|
||||||
|
|
||||||
_texture.Bind();
|
_texture.Bind();
|
||||||
|
|
||||||
Matrix mat = .Translation(ray.Start);
|
Matrix mat = .Translation(ray.Start);
|
||||||
@@ -415,15 +413,21 @@ namespace Sandbox.VoxelFun
|
|||||||
Renderer.Submit(_lineGeometryBinding, _textureEffect, mat3);
|
Renderer.Submit(_lineGeometryBinding, _textureEffect, mat3);
|
||||||
|
|
||||||
//Point3 lookedAtBlock = _world.RaycastBlock(ray, 10, _cubeGeo, _textureEffect);
|
//Point3 lookedAtBlock = _world.RaycastBlock(ray, 10, _cubeGeo, _textureEffect);
|
||||||
Point3 lookedAtBlock = _world.RaycastBlock(.(_camera.Position, _camera.Transform.Forward), 10, _cubeGeo, _textureEffect);
|
Point3 lookedAtBlock = _world.RaycastBlock(.(_camera.Position, _camera.Transform.Forward), 10, _cubeGeo, _textureEffect, let intersection, let intersectFace);
|
||||||
|
|
||||||
|
intersectFace.ToString(intersectedFaceName..Clear());
|
||||||
|
|
||||||
Renderer.Submit(_cubeGeo, _textureEffect, .Translation((Vector3)lookedAtBlock));
|
Renderer.Submit(_cubeGeo, _textureEffect, .Translation((Vector3)lookedAtBlock));
|
||||||
|
|
||||||
|
Renderer.Submit(_cubeGeo, _textureEffect, .Translation(intersection) * .Scaling(0.1f) * .Translation(-0.5f, -0.5f, -0.5f));
|
||||||
|
|
||||||
_world.ChunkManager.Draw();
|
_world.ChunkManager.Draw();
|
||||||
|
|
||||||
Renderer.EndScene();
|
Renderer.EndScene();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String intersectedFaceName = new String() ~ delete _;
|
||||||
|
|
||||||
ColorRGBA _squareColor0 = ColorRGBA.CornflowerBlue;
|
ColorRGBA _squareColor0 = ColorRGBA.CornflowerBlue;
|
||||||
ColorRGBA _squareColor1;
|
ColorRGBA _squareColor1;
|
||||||
|
|
||||||
@@ -450,6 +454,8 @@ namespace Sandbox.VoxelFun
|
|||||||
|
|
||||||
ImGui.Begin("Test");
|
ImGui.Begin("Test");
|
||||||
|
|
||||||
|
ImGui.LabelText("Intersected Face", intersectedFaceName);
|
||||||
|
|
||||||
ImGui.DragFloat("Slow Speed", &movementSpeed, 1.0f, 0.01f, 100.0f);
|
ImGui.DragFloat("Slow Speed", &movementSpeed, 1.0f, 0.01f, 100.0f);
|
||||||
ImGui.DragFloat("Fast Speed", &movementSpeedFast, 1.0f, 1f, 10000.0f);
|
ImGui.DragFloat("Fast Speed", &movementSpeedFast, 1.0f, 1f, 10000.0f);
|
||||||
|
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ namespace Sandbox.VoxelFun
|
|||||||
return Vector3.Floor(chunkPosition);
|
return Vector3.Floor(chunkPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Point3 RaycastBlock(Ray ray, float maxDistance, GeometryBinding geo, Effect effect)
|
public Point3 RaycastBlock(Ray ray, float maxDistance, GeometryBinding geo, Effect effect, out Vector3 intersectionPosition, out BlockFace intersectionFace)
|
||||||
{
|
{
|
||||||
Vector3 start = ray.Start;
|
Vector3 start = ray.Start;
|
||||||
Vector3 dir = ray.Direction.Normalized();
|
Vector3 dir = ray.Direction.Normalized();
|
||||||
@@ -194,35 +194,45 @@ namespace Sandbox.VoxelFun
|
|||||||
|
|
||||||
Point3 step;
|
Point3 step;
|
||||||
|
|
||||||
|
BlockFace xFace;
|
||||||
|
BlockFace yFace;
|
||||||
|
BlockFace zFace;
|
||||||
|
|
||||||
if(dir.X < 0)
|
if(dir.X < 0)
|
||||||
{
|
{
|
||||||
|
xFace = .Right;
|
||||||
step.X = -1;
|
step.X = -1;
|
||||||
rayLengths.X = (start.X - (float)(walker.X)) * unitStepSize.X;
|
rayLengths.X = (start.X - (float)(walker.X)) * unitStepSize.X;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
xFace = .Left;
|
||||||
step.X = 1;
|
step.X = 1;
|
||||||
rayLengths.X = ((float)(walker.X + 1) - start.X) * unitStepSize.X;
|
rayLengths.X = ((float)(walker.X + 1) - start.X) * unitStepSize.X;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(dir.Y < 0)
|
if(dir.Y < 0)
|
||||||
{
|
{
|
||||||
|
yFace = .Top;
|
||||||
step.Y = -1;
|
step.Y = -1;
|
||||||
rayLengths.Y = (start.Y - (float)(walker.Y)) * unitStepSize.Y;
|
rayLengths.Y = (start.Y - (float)(walker.Y)) * unitStepSize.Y;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
yFace = .Bottom;
|
||||||
step.Y = 1;
|
step.Y = 1;
|
||||||
rayLengths.Y = ((float)(walker.Y + 1) - start.Y) * unitStepSize.Y;
|
rayLengths.Y = ((float)(walker.Y + 1) - start.Y) * unitStepSize.Y;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(dir.Z < 0)
|
if(dir.Z < 0)
|
||||||
{
|
{
|
||||||
|
zFace = .Back;
|
||||||
step.Z = -1;
|
step.Z = -1;
|
||||||
rayLengths.Z = (start.Z - (float)(walker.Z)) * unitStepSize.Z;
|
rayLengths.Z = (start.Z - (float)(walker.Z)) * unitStepSize.Z;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
zFace = .Front;
|
||||||
step.Z = 1;
|
step.Z = 1;
|
||||||
rayLengths.Z = ((float)(walker.Z + 1) - start.Z) * unitStepSize.Z;
|
rayLengths.Z = ((float)(walker.Z + 1) - start.Z) * unitStepSize.Z;
|
||||||
}
|
}
|
||||||
@@ -238,12 +248,16 @@ namespace Sandbox.VoxelFun
|
|||||||
walker.X += step.X;
|
walker.X += step.X;
|
||||||
distance = rayLengths.X;
|
distance = rayLengths.X;
|
||||||
rayLengths.X += unitStepSize.X;
|
rayLengths.X += unitStepSize.X;
|
||||||
|
|
||||||
|
intersectionFace = xFace;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
walker.Z += step.Z;
|
walker.Z += step.Z;
|
||||||
distance = rayLengths.Z;
|
distance = rayLengths.Z;
|
||||||
rayLengths.Z += unitStepSize.Z;
|
rayLengths.Z += unitStepSize.Z;
|
||||||
|
|
||||||
|
intersectionFace = zFace;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -253,12 +267,16 @@ namespace Sandbox.VoxelFun
|
|||||||
walker.Y += step.Y;
|
walker.Y += step.Y;
|
||||||
distance = rayLengths.Y;
|
distance = rayLengths.Y;
|
||||||
rayLengths.Y += unitStepSize.Y;
|
rayLengths.Y += unitStepSize.Y;
|
||||||
|
|
||||||
|
intersectionFace = yFace;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
walker.Z += step.Z;
|
walker.Z += step.Z;
|
||||||
distance = rayLengths.Z;
|
distance = rayLengths.Z;
|
||||||
rayLengths.Z += unitStepSize.Z;
|
rayLengths.Z += unitStepSize.Z;
|
||||||
|
|
||||||
|
intersectionFace = zFace;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,11 +290,15 @@ namespace Sandbox.VoxelFun
|
|||||||
|
|
||||||
if(blockData != 0)
|
if(blockData != 0)
|
||||||
{
|
{
|
||||||
|
intersectionPosition = start + distance * dir;
|
||||||
|
|
||||||
return walker;
|
return walker;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
intersectionFace = .None;
|
||||||
|
intersectionPosition = .(float.NaN);
|
||||||
return .(int.MaxValue, int.MaxValue, int.MaxValue);
|
return .(int.MaxValue, int.MaxValue, int.MaxValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user