added hit

This commit is contained in:
ikpil 2023-03-25 22:02:44 +09:00
parent 6ea72a1f9f
commit a64d731ee4
2 changed files with 106 additions and 113 deletions

View File

@ -67,8 +67,7 @@ public class GLU
matrix[15] = 0.0f;
}
public static int glhUnProjectf(float winx, float winy, float winz, float[] modelview, float[] projection,
int[] viewport, float[] objectCoordinate)
public static int glhUnProjectf(float winx, float winy, float winz, float[] modelview, float[] projection, int[] viewport, float[] objectCoordinate)
{
// Transformation matrices
float[] m = new float[16], A = new float[16];
@ -97,50 +96,33 @@ public class GLU
static void MultiplyMatrices4by4OpenGL_FLOAT(float[] result, float[] matrix1, float[] matrix2)
{
result[0] = matrix1[0] * matrix2[0] + matrix1[4] * matrix2[1] + matrix1[8] * matrix2[2]
+ matrix1[12] * matrix2[3];
result[4] = matrix1[0] * matrix2[4] + matrix1[4] * matrix2[5] + matrix1[8] * matrix2[6]
+ matrix1[12] * matrix2[7];
result[8] = matrix1[0] * matrix2[8] + matrix1[4] * matrix2[9] + matrix1[8] * matrix2[10]
+ matrix1[12] * matrix2[11];
result[12] = matrix1[0] * matrix2[12] + matrix1[4] * matrix2[13] + matrix1[8] * matrix2[14]
+ matrix1[12] * matrix2[15];
result[1] = matrix1[1] * matrix2[0] + matrix1[5] * matrix2[1] + matrix1[9] * matrix2[2]
+ matrix1[13] * matrix2[3];
result[5] = matrix1[1] * matrix2[4] + matrix1[5] * matrix2[5] + matrix1[9] * matrix2[6]
+ matrix1[13] * matrix2[7];
result[9] = matrix1[1] * matrix2[8] + matrix1[5] * matrix2[9] + matrix1[9] * matrix2[10]
+ matrix1[13] * matrix2[11];
result[13] = matrix1[1] * matrix2[12] + matrix1[5] * matrix2[13] + matrix1[9] * matrix2[14]
+ matrix1[13] * matrix2[15];
result[2] = matrix1[2] * matrix2[0] + matrix1[6] * matrix2[1] + matrix1[10] * matrix2[2]
+ matrix1[14] * matrix2[3];
result[6] = matrix1[2] * matrix2[4] + matrix1[6] * matrix2[5] + matrix1[10] * matrix2[6]
+ matrix1[14] * matrix2[7];
result[10] = matrix1[2] * matrix2[8] + matrix1[6] * matrix2[9] + matrix1[10] * matrix2[10]
+ matrix1[14] * matrix2[11];
result[14] = matrix1[2] * matrix2[12] + matrix1[6] * matrix2[13] + matrix1[10] * matrix2[14]
+ matrix1[14] * matrix2[15];
result[3] = matrix1[3] * matrix2[0] + matrix1[7] * matrix2[1] + matrix1[11] * matrix2[2]
+ matrix1[15] * matrix2[3];
result[7] = matrix1[3] * matrix2[4] + matrix1[7] * matrix2[5] + matrix1[11] * matrix2[6]
+ matrix1[15] * matrix2[7];
result[11] = matrix1[3] * matrix2[8] + matrix1[7] * matrix2[9] + matrix1[11] * matrix2[10]
+ matrix1[15] * matrix2[11];
result[15] = matrix1[3] * matrix2[12] + matrix1[7] * matrix2[13] + matrix1[11] * matrix2[14]
+ matrix1[15] * matrix2[15];
result[0] = matrix1[0] * matrix2[0] + matrix1[4] * matrix2[1] + matrix1[8] * matrix2[2] + matrix1[12] * matrix2[3];
result[4] = matrix1[0] * matrix2[4] + matrix1[4] * matrix2[5] + matrix1[8] * matrix2[6] + matrix1[12] * matrix2[7];
result[8] = matrix1[0] * matrix2[8] + matrix1[4] * matrix2[9] + matrix1[8] * matrix2[10] + matrix1[12] * matrix2[11];
result[12] = matrix1[0] * matrix2[12] + matrix1[4] * matrix2[13] + matrix1[8] * matrix2[14] + matrix1[12] * matrix2[15];
result[1] = matrix1[1] * matrix2[0] + matrix1[5] * matrix2[1] + matrix1[9] * matrix2[2] + matrix1[13] * matrix2[3];
result[5] = matrix1[1] * matrix2[4] + matrix1[5] * matrix2[5] + matrix1[9] * matrix2[6] + matrix1[13] * matrix2[7];
result[9] = matrix1[1] * matrix2[8] + matrix1[5] * matrix2[9] + matrix1[9] * matrix2[10] + matrix1[13] * matrix2[11];
result[13] = matrix1[1] * matrix2[12] + matrix1[5] * matrix2[13] + matrix1[9] * matrix2[14] + matrix1[13] * matrix2[15];
result[2] = matrix1[2] * matrix2[0] + matrix1[6] * matrix2[1] + matrix1[10] * matrix2[2] + matrix1[14] * matrix2[3];
result[6] = matrix1[2] * matrix2[4] + matrix1[6] * matrix2[5] + matrix1[10] * matrix2[6] + matrix1[14] * matrix2[7];
result[10] = matrix1[2] * matrix2[8] + matrix1[6] * matrix2[9] + matrix1[10] * matrix2[10] + matrix1[14] * matrix2[11];
result[14] = matrix1[2] * matrix2[12] + matrix1[6] * matrix2[13] + matrix1[10] * matrix2[14] + matrix1[14] * matrix2[15];
result[3] = matrix1[3] * matrix2[0] + matrix1[7] * matrix2[1] + matrix1[11] * matrix2[2] + matrix1[15] * matrix2[3];
result[7] = matrix1[3] * matrix2[4] + matrix1[7] * matrix2[5] + matrix1[11] * matrix2[6] + matrix1[15] * matrix2[7];
result[11] = matrix1[3] * matrix2[8] + matrix1[7] * matrix2[9] + matrix1[11] * matrix2[10] + matrix1[15] * matrix2[11];
result[15] = matrix1[3] * matrix2[12] + matrix1[7] * matrix2[13] + matrix1[11] * matrix2[14] + matrix1[15] * matrix2[15];
}
static void MultiplyMatrixByVector4by4OpenGL_FLOAT(float[] resultvector, float[] matrix, float[] pvector)
{
resultvector[0] = matrix[0] * pvector[0] + matrix[4] * pvector[1] + matrix[8] * pvector[2]
+ matrix[12] * pvector[3];
resultvector[1] = matrix[1] * pvector[0] + matrix[5] * pvector[1] + matrix[9] * pvector[2]
+ matrix[13] * pvector[3];
resultvector[2] = matrix[2] * pvector[0] + matrix[6] * pvector[1] + matrix[10] * pvector[2]
+ matrix[14] * pvector[3];
resultvector[3] = matrix[3] * pvector[0] + matrix[7] * pvector[1] + matrix[11] * pvector[2]
+ matrix[15] * pvector[3];
resultvector[0] = matrix[0] * pvector[0] + matrix[4] * pvector[1] + matrix[8] * pvector[2] + matrix[12] * pvector[3];
resultvector[1] = matrix[1] * pvector[0] + matrix[5] * pvector[1] + matrix[9] * pvector[2] + matrix[13] * pvector[3];
resultvector[2] = matrix[2] * pvector[0] + matrix[6] * pvector[1] + matrix[10] * pvector[2] + matrix[14] * pvector[3];
resultvector[3] = matrix[3] * pvector[0] + matrix[7] * pvector[1] + matrix[11] * pvector[2] + matrix[15] * pvector[3];
}
// This code comes directly from GLU except that it is for float

View File

@ -110,6 +110,7 @@ public class RecastDemo
private float _moveDown;
private float _moveAccel;
private int[] viewport;
private bool markerPositionSet;
private readonly float[] markerPosition = new float[3];
private ToolsView toolsUI;
@ -292,6 +293,7 @@ public class RecastDemo
float aspect = 16.0f / 9.0f;
width = Math.Min(resolution.X, (int)(resolution.Y * aspect)) - 100;
height = resolution.Y - 100;
viewport = new int[] { 0, 0, width, height };
// glfwWindowHint(GLFW_RED_BITS, mode.redBits());
// glfwWindowHint(GLFW_GREEN_BITS, mode.greenBits());
@ -379,6 +381,7 @@ public class RecastDemo
private void OnWindowFramebufferSizeChanged(Vector2D<int> size)
{
_gl.Viewport(size);
viewport = new int[] { 0, 0, width, height };
}
@ -457,13 +460,14 @@ public class RecastDemo
var tempMoveDown = keyboard.IsKeyPressed(Key.E) || keyboard.IsKeyPressed(Key.PageDown) ? 1.0f : -1f;
var tempMoveAccel = keyboard.IsKeyPressed(Key.ShiftLeft) || keyboard.IsKeyPressed(Key.ShiftRight) ? 1.0f : -1f;
_moveFront = RecastMath.clamp(_moveFront + tempMoveFront * dt * 4.0f, 0, 2.0f);
_moveLeft = RecastMath.clamp(_moveLeft + tempMoveLeft * dt * 4.0f, 0, 2.0f);
_moveBack = RecastMath.clamp(_moveBack + tempMoveBack * dt * 4.0f, 0, 2.0f);
_moveRight = RecastMath.clamp(_moveRight + tempMoveRight * dt * 4.0f, 0, 2.0f);
_moveUp = RecastMath.clamp(_moveUp + tempMoveUp * dt * 4.0f, 0, 2.0f);
_moveDown = RecastMath.clamp(_moveDown + tempMoveDown * dt * 4.0f, 0, 2.0f);
_moveAccel = RecastMath.clamp(_moveAccel + tempMoveAccel * dt * 4.0f, 0, 2.0f);
modState = keyboard.IsKeyPressed(Key.ControlLeft) || keyboard.IsKeyPressed(Key.ShiftRight) ? 1 : 0;
_moveFront = clamp(_moveFront + tempMoveFront * dt * 4.0f, 0, 2.0f);
_moveLeft = clamp(_moveLeft + tempMoveLeft * dt * 4.0f, 0, 2.0f);
_moveBack = clamp(_moveBack + tempMoveBack * dt * 4.0f, 0, 2.0f);
_moveRight = clamp(_moveRight + tempMoveRight * dt * 4.0f, 0, 2.0f);
_moveUp = clamp(_moveUp + tempMoveUp * dt * 4.0f, 0, 2.0f);
_moveDown = clamp(_moveDown + tempMoveDown * dt * 4.0f, 0, 2.0f);
_moveAccel = clamp(_moveAccel + tempMoveAccel * dt * 4.0f, 0, 2.0f);
}
}
@ -510,7 +514,7 @@ public class RecastDemo
long time = Stopwatch.GetTimestamp();
// float dt = (time - prevFrameTime) / TimeSpan.TicksPerMillisecond;
prevFrameTime = time;
// Update sample simulation.
float SIM_RATE = 20;
float DELTA_TIME = 1.0f / SIM_RATE;
@ -523,7 +527,7 @@ public class RecastDemo
{
toolsUI.handleUpdate((float)dt);
}
simIter++;
}
@ -532,6 +536,7 @@ public class RecastDemo
var bytes = Loader.ToBytes(settingsUI.GetMeshInputFilePath());
sample.update(loadInputMesh(bytes), null, null);
}
// else if (settingsUI.isNavMeshInputTrigerred())
// {
// try (MemoryStack stack = stackPush()) {
@ -606,68 +611,74 @@ public class RecastDemo
building = false;
}
// if (!mouseOverMenu)
// {
// GLU.glhUnProjectf(mousePos[0], viewport[3] - 1 - mousePos[1], 0.0f, modelviewMatrix, projectionMatrix, viewport,
// rayStart);
// GLU.glhUnProjectf(mousePos[0], viewport[3] - 1 - mousePos[1], 1.0f, modelviewMatrix, projectionMatrix, viewport,
// rayEnd);
if (!_mouseOverMenu)
{
GLU.glhUnProjectf(mousePos[0], viewport[3] - 1 - mousePos[1], 0.0f, modelviewMatrix, projectionMatrix, viewport, rayStart);
GLU.glhUnProjectf(mousePos[0], viewport[3] - 1 - mousePos[1], 1.0f, modelviewMatrix, projectionMatrix, viewport, rayEnd);
// Hit test mesh.
// DemoInputGeomProvider inputGeom = sample.getInputGeom();
// if (processHitTest && sample != null)
// {
// float? hit = null;
// if (inputGeom != null)
// {
// hit = inputGeom.raycastMesh(rayStart, rayEnd);
// }
//
// if (!hit.HasValue && sample.getNavMesh() != null)
// {
// hit = NavMeshRaycast.raycast(sample.getNavMesh(), rayStart, rayEnd);
// }
//
// if (!hit.HasValue && sample.getRecastResults() != null)
// {
// hit = PolyMeshRaycast.raycast(sample.getRecastResults(), rayStart, rayEnd);
// }
//
// float[] rayDir = new float[] { rayEnd[0] - rayStart[0], rayEnd[1] - rayStart[1], rayEnd[2] - rayStart[2] };
// Tool rayTool = toolsUI.getTool();
// vNormalize(rayDir);
// if (rayTool != null)
// {
// rayTool.handleClickRay(rayStart, rayDir, processHitTestShift);
// }
// // TODO : 잠시 주석
// // if (hit.HasValue) {
// // float hitTime = hit.Value;
// // if ((modState & GLFW_MOD_CONTROL) != 0) {
// // // Marker
// // markerPositionSet = true;
// // markerPosition[0] = rayStart[0] + (rayEnd[0] - rayStart[0]) * hitTime;
// // markerPosition[1] = rayStart[1] + (rayEnd[1] - rayStart[1]) * hitTime;
// // markerPosition[2] = rayStart[2] + (rayEnd[2] - rayStart[2]) * hitTime;
// // } else {
// // float[] pos = new float[3];
// // pos[0] = rayStart[0] + (rayEnd[0] - rayStart[0]) * hitTime;
// // pos[1] = rayStart[1] + (rayEnd[1] - rayStart[1]) * hitTime;
// // pos[2] = rayStart[2] + (rayEnd[2] - rayStart[2]) * hitTime;
// // if (rayTool != null) {
// // rayTool.handleClick(rayStart, pos, processHitTestShift);
// // }
// // }
// // } else {
// // if ((modState & GLFW_MOD_CONTROL) != 0) {
// // // Marker
// // markerPositionSet = false;
// // }
// // }
// }
// Hit test mesh.
DemoInputGeomProvider inputGeom = sample.getInputGeom();
if (processHitTest && sample != null)
{
float? hit = null;
if (inputGeom != null)
{
hit = inputGeom.raycastMesh(rayStart, rayEnd);
}
// processHitTest = false;
// }
if (!hit.HasValue && sample.getNavMesh() != null)
{
hit = NavMeshRaycast.raycast(sample.getNavMesh(), rayStart, rayEnd);
}
if (!hit.HasValue && sample.getRecastResults() != null)
{
hit = PolyMeshRaycast.raycast(sample.getRecastResults(), rayStart, rayEnd);
}
float[] rayDir = new float[] { rayEnd[0] - rayStart[0], rayEnd[1] - rayStart[1], rayEnd[2] - rayStart[2] };
Tool rayTool = toolsUI.getTool();
vNormalize(rayDir);
if (rayTool != null)
{
rayTool.handleClickRay(rayStart, rayDir, processHitTestShift);
}
if (hit.HasValue)
{
float hitTime = hit.Value;
if (0 != modState)
{
// Marker
markerPositionSet = true;
markerPosition[0] = rayStart[0] + (rayEnd[0] - rayStart[0]) * hitTime;
markerPosition[1] = rayStart[1] + (rayEnd[1] - rayStart[1]) * hitTime;
markerPosition[2] = rayStart[2] + (rayEnd[2] - rayStart[2]) * hitTime;
}
else
{
float[] pos = new float[3];
pos[0] = rayStart[0] + (rayEnd[0] - rayStart[0]) * hitTime;
pos[1] = rayStart[1] + (rayEnd[1] - rayStart[1]) * hitTime;
pos[2] = rayStart[2] + (rayEnd[2] - rayStart[2]) * hitTime;
if (rayTool != null)
{
rayTool.handleClick(rayStart, pos, processHitTestShift);
}
}
}
else
{
if (0 != modState)
{
// Marker
markerPositionSet = false;
}
}
}
processHitTest = false;
}
if (sample.isChanged())
{
@ -708,7 +719,7 @@ public class RecastDemo
if (bmin != null && bmax != null)
{
camr = (float)(Math.Sqrt(
RecastMath.sqr(bmax[0] - bmin[0]) + RecastMath.sqr(bmax[1] - bmin[1]) + RecastMath.sqr(bmax[2] - bmin[2]))
sqr(bmax[0] - bmin[0]) + sqr(bmax[1] - bmin[1]) + sqr(bmax[2] - bmin[2]))
/ 2);
cameraPos[0] = (bmax[0] + bmin[0]) / 2 + camr;
cameraPos[1] = (bmax[1] + bmin[1]) / 2 + camr;
@ -741,7 +752,7 @@ public class RecastDemo
// Set the viewport.
// glViewport(0, 0, width, height);
//_gl.Viewport(0, 0, (uint)width, (uint)height);
int[] viewport = new int[] { 0, 0, width, height };
//viewport = new int[] { 0, 0, width, height };
// glGetIntegerv(GL_VIEWPORT, viewport);
// Clear the screen