added camera move by keyboard

This commit is contained in:
ikpil 2023-03-23 00:03:32 +09:00
parent 708f9a0aef
commit 7206449253
1 changed files with 121 additions and 63 deletions

View File

@ -19,6 +19,7 @@ freely, subject to the following restrictions:
*/ */
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Diagnostics; using System.Diagnostics;
@ -98,6 +99,17 @@ public class RecastDemo
private readonly float[] rayStart = new float[3]; private readonly float[] rayStart = new float[3];
private readonly float[] rayEnd = new float[3]; private readonly float[] rayEnd = new float[3];
private float[] projectionMatrix = new float[16];
private float[] modelviewMatrix = new float[16];
private float _moveFront;
private float _moveLeft;
private float _moveBack;
private float _moveRight;
private float _moveUp;
private float _moveDown;
private float _moveAccel;
private bool markerPositionSet; private bool markerPositionSet;
private readonly float[] markerPosition = new float[3]; private readonly float[] markerPosition = new float[3];
private ToolsView toolsUI; private ToolsView toolsUI;
@ -241,6 +253,7 @@ public class RecastDemo
} }
} }
private IWindow CreateWindow() private IWindow CreateWindow()
{ {
SdlWindowing.Use(); SdlWindowing.Use();
@ -374,6 +387,8 @@ public class RecastDemo
_sdl = SdlWindowing.GetExistingApi(window); _sdl = SdlWindowing.GetExistingApi(window);
_input = window.CreateInput(); _input = window.CreateInput();
// mouse input
foreach (var mice in _input.Mice) foreach (var mice in _input.Mice)
{ {
mice.Scroll += OnMouseScrolled; mice.Scroll += OnMouseScrolled;
@ -382,6 +397,7 @@ public class RecastDemo
mice.MouseMove += OnMouseMoved; mice.MouseMove += OnMouseMoved;
} }
_gl = window.CreateOpenGL(); _gl = window.CreateOpenGL();
dd = new RecastDebugDraw(_gl); dd = new RecastDebugDraw(_gl);
@ -428,26 +444,68 @@ public class RecastDemo
sample = new Sample(geom, ImmutableArray<RecastBuilderResult>.Empty, null, settingsUI, dd); sample = new Sample(geom, ImmutableArray<RecastBuilderResult>.Empty, null, settingsUI, dd);
} }
private void UpdateKeyboard(float dt)
{
// keyboard input
foreach (var keyboard in _input.Keyboards)
{
var tempMoveFront = keyboard.IsKeyPressed(Key.W) || keyboard.IsKeyPressed(Key.Up) ? 1.0f : -1f;
var tempMoveLeft = keyboard.IsKeyPressed(Key.A) || keyboard.IsKeyPressed(Key.Left) ? 1.0f : -1f;
var tempMoveBack = keyboard.IsKeyPressed(Key.S) || keyboard.IsKeyPressed(Key.Down) ? 1.0f : -1f;
var tempMoveRight = keyboard.IsKeyPressed(Key.D) || keyboard.IsKeyPressed(Key.Right) ? 1.0f : -1f;
var tempMoveUp = keyboard.IsKeyPressed(Key.Q) || keyboard.IsKeyPressed(Key.PageUp) ? 1.0f : -1f;
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 = DemoMath.clamp(_moveFront + tempMoveFront * dt * 4.0f, 0, 2.0f);
_moveLeft = DemoMath.clamp(_moveLeft + tempMoveLeft * dt * 4.0f, 0, 2.0f);
_moveBack = DemoMath.clamp(_moveBack + tempMoveBack * dt * 4.0f, 0, 2.0f);
_moveRight = DemoMath.clamp(_moveRight + tempMoveRight * dt * 4.0f, 0, 2.0f);
_moveUp = DemoMath.clamp(_moveUp + tempMoveUp * dt * 4.0f, 0, 2.0f);
_moveDown = DemoMath.clamp(_moveDown + tempMoveDown * dt * 4.0f, 0, 2.0f);
_moveAccel = DemoMath.clamp(_moveAccel + tempMoveAccel * dt * 4.0f, 0, 2.0f);
}
}
private void OnWindowOnUpdate(double dt) private void OnWindowOnUpdate(double dt)
{ {
/* /*
* try (MemoryStack stack = stackPush()) { int[] w = stack.mallocInt(1); int[] h = * try (MemoryStack stack = stackPush()) { int[] w = stack.mallocInt(1); int[] h =
* stack.mallocInt(1); glfwGetWindowSize(win, w, h); width = w[0]; height = h[0]; } * stack.mallocInt(1); glfwGetWindowSize(win, w, h); width = w[0]; height = h[0]; }
*/ */
// if (sample.getInputGeom() != null) if (sample.getInputGeom() != null)
// { {
// float[] bmin = sample.getInputGeom().getMeshBoundsMin(); float[] bmin = sample.getInputGeom().getMeshBoundsMin();
// float[] bmax = sample.getInputGeom().getMeshBoundsMax(); float[] bmax = sample.getInputGeom().getMeshBoundsMax();
// int[] voxels = Recast.calcGridSize(bmin, bmax, settingsUI.getCellSize()); int[] voxels = Recast.calcGridSize(bmin, bmax, settingsUI.getCellSize());
// settingsUI.setVoxels(voxels); settingsUI.setVoxels(voxels);
// settingsUI.setTiles(tileNavMeshBuilder.getTiles(sample.getInputGeom(), settingsUI.getCellSize(), settingsUI.getTileSize())); settingsUI.setTiles(tileNavMeshBuilder.getTiles(sample.getInputGeom(), settingsUI.getCellSize(), settingsUI.getTileSize()));
// settingsUI.setMaxTiles(tileNavMeshBuilder.getMaxTiles(sample.getInputGeom(), settingsUI.getCellSize(), settingsUI.getTileSize())); settingsUI.setMaxTiles(tileNavMeshBuilder.getMaxTiles(sample.getInputGeom(), settingsUI.getCellSize(), settingsUI.getTileSize()));
// settingsUI.setMaxPolys(tileNavMeshBuilder.getMaxPolysPerTile(sample.getInputGeom(), settingsUI.getCellSize(), settingsUI.getTileSize())); settingsUI.setMaxPolys(tileNavMeshBuilder.getMaxPolysPerTile(sample.getInputGeom(), settingsUI.getCellSize(), settingsUI.getTileSize()));
// } }
//_viewSys.inputBegin(); UpdateKeyboard((float)dt);
// window.DoEvents();
// _viewSys.inputEnd(window); // camera move
float keySpeed = 22.0f;
if (0 < _moveAccel)
{
keySpeed *= _moveAccel * 2.0f;
}
double movex = (_moveRight - _moveLeft) * keySpeed * dt;
double movey = (_moveBack - _moveFront) * keySpeed * dt + scrollZoom * 2.0f;
scrollZoom = 0;
cameraPos[0] += (float)(movex * modelviewMatrix[0]);
cameraPos[1] += (float)(movex * modelviewMatrix[4]);
cameraPos[2] += (float)(movex * modelviewMatrix[8]);
cameraPos[0] += (float)(movey * modelviewMatrix[2]);
cameraPos[1] += (float)(movey * modelviewMatrix[6]);
cameraPos[2] += (float)(movey * modelviewMatrix[10]);
cameraPos[1] += (float)((_moveUp - _moveDown) * keySpeed * dt);
// long time = Stopwatch.GetTimestamp() / 1000; // long time = Stopwatch.GetTimestamp() / 1000;
// //float dt = (time - prevFrameTime) / 1000000.0f; // //float dt = (time - prevFrameTime) / 1000000.0f;
@ -507,54 +565,54 @@ public class RecastDemo
// } // }
// } // }
// } // }
// else if (settingsUI.isBuildTriggered() && sample.getInputGeom() != null) if (settingsUI.isBuildTriggered() && sample.getInputGeom() != null)
// { {
// if (!building) if (!building)
// { {
// float m_cellSize = settingsUI.getCellSize(); float m_cellSize = settingsUI.getCellSize();
// float m_cellHeight = settingsUI.getCellHeight(); float m_cellHeight = settingsUI.getCellHeight();
// float m_agentHeight = settingsUI.getAgentHeight(); float m_agentHeight = settingsUI.getAgentHeight();
// float m_agentRadius = settingsUI.getAgentRadius(); float m_agentRadius = settingsUI.getAgentRadius();
// float m_agentMaxClimb = settingsUI.getAgentMaxClimb(); float m_agentMaxClimb = settingsUI.getAgentMaxClimb();
// float m_agentMaxSlope = settingsUI.getAgentMaxSlope(); float m_agentMaxSlope = settingsUI.getAgentMaxSlope();
// int m_regionMinSize = settingsUI.getMinRegionSize(); int m_regionMinSize = settingsUI.getMinRegionSize();
// int m_regionMergeSize = settingsUI.getMergedRegionSize(); int m_regionMergeSize = settingsUI.getMergedRegionSize();
// float m_edgeMaxLen = settingsUI.getEdgeMaxLen(); float m_edgeMaxLen = settingsUI.getEdgeMaxLen();
// float m_edgeMaxError = settingsUI.getEdgeMaxError(); float m_edgeMaxError = settingsUI.getEdgeMaxError();
// int m_vertsPerPoly = settingsUI.getVertsPerPoly(); int m_vertsPerPoly = settingsUI.getVertsPerPoly();
// float m_detailSampleDist = settingsUI.getDetailSampleDist(); float m_detailSampleDist = settingsUI.getDetailSampleDist();
// float m_detailSampleMaxError = settingsUI.getDetailSampleMaxError(); float m_detailSampleMaxError = settingsUI.getDetailSampleMaxError();
// int m_tileSize = settingsUI.getTileSize(); int m_tileSize = settingsUI.getTileSize();
// long t = Stopwatch.GetTimestamp(); long t = Stopwatch.GetTimestamp();
//
// Tuple<IList<RecastBuilderResult>, NavMesh> buildResult; Tuple<IList<RecastBuilderResult>, NavMesh> buildResult;
// if (settingsUI.isTiled()) if (settingsUI.isTiled())
// { {
// buildResult = tileNavMeshBuilder.build(sample.getInputGeom(), settingsUI.getPartitioning(), m_cellSize, buildResult = tileNavMeshBuilder.build(sample.getInputGeom(), settingsUI.getPartitioning(), m_cellSize,
// m_cellHeight, m_agentHeight, m_agentRadius, m_agentMaxClimb, m_agentMaxSlope, m_regionMinSize, m_cellHeight, m_agentHeight, m_agentRadius, m_agentMaxClimb, m_agentMaxSlope, m_regionMinSize,
// m_regionMergeSize, m_edgeMaxLen, m_edgeMaxError, m_vertsPerPoly, m_detailSampleDist, m_regionMergeSize, m_edgeMaxLen, m_edgeMaxError, m_vertsPerPoly, m_detailSampleDist,
// m_detailSampleMaxError, settingsUI.isFilterLowHangingObstacles(), settingsUI.isFilterLedgeSpans(), m_detailSampleMaxError, settingsUI.isFilterLowHangingObstacles(), settingsUI.isFilterLedgeSpans(),
// settingsUI.isFilterWalkableLowHeightSpans(), m_tileSize); settingsUI.isFilterWalkableLowHeightSpans(), m_tileSize);
// } }
// else else
// { {
// buildResult = soloNavMeshBuilder.build(sample.getInputGeom(), settingsUI.getPartitioning(), m_cellSize, buildResult = soloNavMeshBuilder.build(sample.getInputGeom(), settingsUI.getPartitioning(), m_cellSize,
// m_cellHeight, m_agentHeight, m_agentRadius, m_agentMaxClimb, m_agentMaxSlope, m_regionMinSize, m_cellHeight, m_agentHeight, m_agentRadius, m_agentMaxClimb, m_agentMaxSlope, m_regionMinSize,
// m_regionMergeSize, m_edgeMaxLen, m_edgeMaxError, m_vertsPerPoly, m_detailSampleDist, m_regionMergeSize, m_edgeMaxLen, m_edgeMaxError, m_vertsPerPoly, m_detailSampleDist,
// m_detailSampleMaxError, settingsUI.isFilterLowHangingObstacles(), settingsUI.isFilterLedgeSpans(), m_detailSampleMaxError, settingsUI.isFilterLowHangingObstacles(), settingsUI.isFilterLedgeSpans(),
// settingsUI.isFilterWalkableLowHeightSpans()); settingsUI.isFilterWalkableLowHeightSpans());
// } }
//
// sample.update(sample.getInputGeom(), buildResult.Item1, buildResult.Item2); sample.update(sample.getInputGeom(), buildResult.Item1, buildResult.Item2);
// sample.setChanged(false); sample.setChanged(false);
// settingsUI.setBuildTime((Stopwatch.GetTimestamp() - t) / 1_000_000); settingsUI.setBuildTime((Stopwatch.GetTimestamp() - t) / 1_000_000);
// toolsUI.setSample(sample); toolsUI.setSample(sample);
// } }
// } }
// else else
// { {
// building = false; building = false;
// } }
// if (!mouseOverMenu) // if (!mouseOverMenu)
// { // {
@ -696,8 +754,8 @@ public class RecastDemo
// Clear the screen // Clear the screen
dd.clear(); dd.clear();
float[] projectionMatrix = dd.projectionMatrix(50f, (float)width / (float)height, 1.0f, camr); projectionMatrix = dd.projectionMatrix(50f, (float)width / (float)height, 1.0f, camr);
float[] modelviewMatrix = dd.viewMatrix(cameraPos, cameraEulers); modelviewMatrix = dd.viewMatrix(cameraPos, cameraEulers);
dd.fog(camr * 0.1f, camr * 1.25f); dd.fog(camr * 0.1f, camr * 1.25f);
renderer.render(sample); renderer.render(sample);