Pathfinding visualization WIP -- add many controls for x-ray render, add lighting, and better combat z-fighting and noise from wireframes and overlays
parent
0cce43aefe
commit
817f1629bd
|
|
@ -13519,7 +13519,7 @@
|
|||
<key>PathfindingNavMeshClear</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>yay!</string>
|
||||
<string>Background color</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -13535,7 +13535,7 @@
|
|||
<key>PathfindingWalkable</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>yay!</string>
|
||||
<string>Walkable color</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -13551,7 +13551,7 @@
|
|||
<key>PathfindingObstacle</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>yay!</string>
|
||||
<string>Obstacle color</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -13567,7 +13567,7 @@
|
|||
<key>PathfindingMaterial</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>yay!</string>
|
||||
<string>Material volume color</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -13583,7 +13583,7 @@
|
|||
<key>PathfindingExclusion</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>yay!</string>
|
||||
<string>Exclusion volume color</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -13599,7 +13599,7 @@
|
|||
<key>PathfindingConnectedEdge</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>yay!</string>
|
||||
<string>Connected edge color</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -13615,7 +13615,7 @@
|
|||
<key>PathfindingBoundaryEdge</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>yay!</string>
|
||||
<string>Boundary edge color</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -13631,7 +13631,7 @@
|
|||
<key>PathfindingHeatColorBase</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>yay!</string>
|
||||
<string>Least walkable heat map color</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -13647,7 +13647,7 @@
|
|||
<key>PathfindingHeatColorMax</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>yay!</string>
|
||||
<string>Most walkable heat map color</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -13663,7 +13663,7 @@
|
|||
<key>PathfindingFaceColor</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>yay!</string>
|
||||
<string>Nav mesh color?</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -13724,6 +13724,66 @@
|
|||
<real>1.0</real>
|
||||
</array>
|
||||
</map>
|
||||
<key>PathfindingAmbiance</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Ambiance of lit pathfinding displays.</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.5</real>
|
||||
</map>
|
||||
|
||||
<key>PathfindingXRayTint</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Amount to darken/lighten x-ray lines in pathfinding display</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.8</real>
|
||||
</map>
|
||||
|
||||
<key>PathfindingXRayOpacity</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Opacity of xray lines in pathfinding display.</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.25</real>
|
||||
</map>
|
||||
|
||||
<key>PathfindingLineWidth</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Width of volume outlines in pathfinding display.</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>2.0</real>
|
||||
</map>
|
||||
|
||||
<key>PathfindingLineOffset</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Depth offset of volume outlines in pathfinding display.</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>1.6</real>
|
||||
</map>
|
||||
|
||||
<key>PathfindingDisablePermanentObjects</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -13746,5 +13806,7 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
</map>
|
||||
|
||||
|
||||
</map>
|
||||
</llsd>
|
||||
|
|
|
|||
|
|
@ -27,14 +27,28 @@ uniform mat4 modelview_projection_matrix;
|
|||
|
||||
ATTRIBUTE vec3 position;
|
||||
ATTRIBUTE vec4 diffuse_color;
|
||||
ATTRIBUTE vec3 normal;
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
|
||||
uniform float tint;
|
||||
|
||||
uniform float ambiance;
|
||||
uniform float alpha_scale;
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
vertex_color = diffuse_color * tint;
|
||||
|
||||
vec3 l1 = vec3(-0.75, 1, 1.0);
|
||||
vec3 l2 = vec3(0.5, -0.6, 0.4)*0.25;
|
||||
vec3 l3 = vec3(0.5, -0.8, 0.3)*0.5;
|
||||
|
||||
float lit = max(dot(normal, l1), 0.0);
|
||||
lit += max(dot(normal, l2), 0.0);
|
||||
lit += max(dot(normal, l3), 0.0);
|
||||
|
||||
lit = clamp(lit, ambiance, 1.0);
|
||||
|
||||
vertex_color = vec4(diffuse_color.rgb * tint * lit, diffuse_color.a*alpha_scale);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -96,6 +96,10 @@ BOOL LLFloaterPathfindingConsole::postBuild()
|
|||
llassert(mShowWorldCheckBox != NULL);
|
||||
mShowWorldCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowWorldToggle, this));
|
||||
|
||||
mShowXRayCheckBox = findChild<LLCheckBoxCtrl>("x-ray");
|
||||
llassert(mShowXRayCheckBox != NULL);
|
||||
mShowXRayCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowXRayToggle, this));
|
||||
|
||||
mViewCharactersButton = findChild<LLButton>("view_characters_floater");
|
||||
llassert(mViewCharactersButton != NULL);
|
||||
mViewCharactersButton->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onViewCharactersClicked, this));
|
||||
|
|
@ -219,6 +223,7 @@ void LLFloaterPathfindingConsole::onClose(bool pIsAppQuitting)
|
|||
mShowStaticObstaclesCheckBox->set( false );
|
||||
mShowExclusionVolumesCheckBox->set( false );
|
||||
mShowWorldCheckBox->set( false );
|
||||
mShowXRayCheckBox->set(false);
|
||||
}
|
||||
|
||||
BOOL LLFloaterPathfindingConsole::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down)
|
||||
|
|
@ -340,6 +345,17 @@ void LLFloaterPathfindingConsole::setRenderWorld(BOOL pIsRenderWorld)
|
|||
mShowWorldCheckBox->set(pIsRenderWorld);
|
||||
}
|
||||
|
||||
BOOL LLFloaterPathfindingConsole::isRenderXRay() const
|
||||
{
|
||||
return mShowXRayCheckBox->get();
|
||||
}
|
||||
|
||||
void LLFloaterPathfindingConsole::setRenderXRay(BOOL pIsRenderXRay)
|
||||
{
|
||||
mShowXRayCheckBox->set(pIsRenderXRay);
|
||||
}
|
||||
|
||||
|
||||
LLFloaterPathfindingConsole::ERenderHeatmapType LLFloaterPathfindingConsole::getRenderHeatmapType() const
|
||||
{
|
||||
ERenderHeatmapType renderHeatmapType;
|
||||
|
|
@ -593,6 +609,12 @@ void LLFloaterPathfindingConsole::onShowWorldToggle()
|
|||
}
|
||||
}
|
||||
|
||||
void LLFloaterPathfindingConsole::onShowXRayToggle()
|
||||
{
|
||||
//nothing to do (xray parameter not stored in pathing lib
|
||||
}
|
||||
|
||||
|
||||
void LLFloaterPathfindingConsole::onCharacterWidthSet()
|
||||
{
|
||||
generatePath();
|
||||
|
|
|
|||
|
|
@ -96,6 +96,9 @@ public:
|
|||
|
||||
BOOL isRenderWorld() const;
|
||||
void setRenderWorld(BOOL pIsRenderWorld);
|
||||
|
||||
BOOL isRenderXRay() const;
|
||||
void setRenderXRay(BOOL pIsRenderXRay);
|
||||
|
||||
BOOL isRenderAnyShapes() const;
|
||||
U32 getRenderShapeFlags();
|
||||
|
|
@ -135,6 +138,7 @@ private:
|
|||
|
||||
void onShowWalkabilitySet();
|
||||
void onShowWorldToggle();
|
||||
void onShowXRayToggle();
|
||||
void onCharacterWidthSet();
|
||||
void onCharacterTypeSwitch();
|
||||
void onViewCharactersClicked();
|
||||
|
|
@ -167,6 +171,7 @@ private:
|
|||
LLCheckBoxCtrl *mShowMaterialVolumesCheckBox;
|
||||
LLCheckBoxCtrl *mShowExclusionVolumesCheckBox;
|
||||
LLCheckBoxCtrl *mShowWorldCheckBox;
|
||||
LLCheckBoxCtrl *mShowXRayCheckBox;
|
||||
LLTextBase *mPathfindingViewerStatus;
|
||||
LLTextBase *mPathfindingSimulatorStatus;
|
||||
LLButton *mViewCharactersButton;
|
||||
|
|
|
|||
|
|
@ -4322,6 +4322,10 @@ void LLPipeline::renderDebug()
|
|||
if (LLGLSLShader::sNoFixedFunction)
|
||||
{
|
||||
gPathfindingProgram.bind();
|
||||
|
||||
gPathfindingProgram.uniform1f("tint", 1.f);
|
||||
gPathfindingProgram.uniform1f("ambiance", 1.f);
|
||||
gPathfindingProgram.uniform1f("alpha_scale", 1.f);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -4338,11 +4342,10 @@ void LLPipeline::renderDebug()
|
|||
LLFloaterPathfindingConsole *pathfindingConsole = pathfindingConsoleHandle.get();
|
||||
//NavMesh
|
||||
if ( pathfindingConsole->isRenderNavMesh() )
|
||||
{
|
||||
gPathfindingProgram.uniform1f("tint", 1.f);
|
||||
{ gGL.flush();
|
||||
glLineWidth(2.0f);
|
||||
LLGLEnable cull(GL_CULL_FACE);
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
LLGLDisable blend(GL_BLEND);
|
||||
if ( pathfindingConsole->isRenderWorld() )
|
||||
{
|
||||
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
|
||||
|
|
@ -4354,54 +4357,78 @@ void LLPipeline::renderDebug()
|
|||
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
|
||||
}
|
||||
|
||||
int materialIndex = pathfindingConsole->getHeatMapType();
|
||||
llPathingLibInstance->renderNavMesh( materialIndex );
|
||||
gGL.flush();
|
||||
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
|
||||
glLineWidth(1.0f);
|
||||
gGL.flush();
|
||||
}
|
||||
//physics/exclusion shapes
|
||||
if ( pathfindingConsole->isRenderAnyShapes() )
|
||||
{
|
||||
gPathfindingProgram.uniform1f("tint", 1.f);
|
||||
gGL.flush();
|
||||
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
|
||||
//render to depth first to avoid blending artifacts
|
||||
gGL.setColorMask(false, false);
|
||||
llPathingLibInstance->renderNavMeshShapesVBO( pathfindingConsole->getRenderShapeFlags() );
|
||||
gGL.setColorMask(true, false);
|
||||
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
{
|
||||
gGL.flush();
|
||||
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
|
||||
|
||||
{
|
||||
//get rid of some z-fighting
|
||||
LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
|
||||
glPolygonOffset(-1.0f, -1.0f);
|
||||
glPolygonOffset(1.0f, 1.0f);
|
||||
|
||||
{ //draw solid overlay
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_LEQUAL);
|
||||
llPathingLibInstance->renderNavMeshShapesVBO( pathfindingConsole->getRenderShapeFlags() );
|
||||
gGL.flush();
|
||||
}
|
||||
//render to depth first to avoid blending artifacts
|
||||
gGL.setColorMask(false, false);
|
||||
llPathingLibInstance->renderNavMeshShapesVBO( pathfindingConsole->getRenderShapeFlags() );
|
||||
gGL.setColorMask(true, false);
|
||||
|
||||
//get rid of some z-fighting
|
||||
glPolygonOffset(0.f, 0.f);
|
||||
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
|
||||
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
|
||||
{
|
||||
F32 ambiance = gSavedSettings.getF32("PathfindingAmbiance");
|
||||
|
||||
{ //draw hidden wireframe as darker and less opaque
|
||||
gPathfindingProgram.uniform1f("tint", 0.25f);
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER);
|
||||
llPathingLibInstance->renderNavMeshShapesVBO( pathfindingConsole->getRenderShapeFlags() );
|
||||
}
|
||||
gPathfindingProgram.uniform1f("ambiance", ambiance);
|
||||
|
||||
{ //draw visible wireframe as brighter and more opaque
|
||||
gPathfindingProgram.uniform1f("tint", 1.f);
|
||||
LLGLDisable blendOut(GL_BLEND);
|
||||
llPathingLibInstance->renderNavMeshShapesVBO( pathfindingConsole->getRenderShapeFlags() );
|
||||
gGL.flush();
|
||||
}
|
||||
{ //draw solid overlay
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_LEQUAL);
|
||||
llPathingLibInstance->renderNavMeshShapesVBO( pathfindingConsole->getRenderShapeFlags() );
|
||||
gGL.flush();
|
||||
}
|
||||
|
||||
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
|
||||
}
|
||||
LLGLEnable lineOffset(GL_POLYGON_OFFSET_LINE);
|
||||
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
|
||||
|
||||
F32 offset = gSavedSettings.getF32("PathfindingLineOffset");
|
||||
|
||||
if (pathfindingConsole->isRenderXRay())
|
||||
{
|
||||
{ //draw hidden wireframe as darker and less opaque
|
||||
glPolygonOffset(offset, -offset);
|
||||
gPathfindingProgram.uniform1f("tint", gSavedSettings.getF32("PathfindingXRayTint"));
|
||||
gPathfindingProgram.uniform1f("alpha_scale", gSavedSettings.getF32("PathfindingXRayOpacity"));
|
||||
gPathfindingProgram.uniform1f("ambiance", 1.f);
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER);
|
||||
llPathingLibInstance->renderNavMeshShapesVBO( pathfindingConsole->getRenderShapeFlags() );
|
||||
}
|
||||
}
|
||||
|
||||
{ //draw visible wireframe as brighter, thicker and more opaque
|
||||
glPolygonOffset(offset, offset);
|
||||
gPathfindingProgram.uniform1f("ambiance", 1.f);
|
||||
gPathfindingProgram.uniform1f("tint", 1.f);
|
||||
gPathfindingProgram.uniform1f("alpha_scale", 1.f);
|
||||
|
||||
glLineWidth(gSavedSettings.getF32("PathfindingLineWidth"));
|
||||
LLGLDisable blendOut(GL_BLEND);
|
||||
llPathingLibInstance->renderNavMeshShapesVBO( pathfindingConsole->getRenderShapeFlags() );
|
||||
gGL.flush();
|
||||
glLineWidth(1.f);
|
||||
}
|
||||
|
||||
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
|
||||
}
|
||||
}
|
||||
//User designated path
|
||||
if ( pathfindingConsole->isRenderPath() )
|
||||
|
|
@ -4414,7 +4441,7 @@ void LLPipeline::renderDebug()
|
|||
gGL.flush();
|
||||
if (LLGLSLShader::sNoFixedFunction)
|
||||
{
|
||||
gUIProgram.unbind();
|
||||
gPathfindingProgram.unbind();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -139,6 +139,14 @@
|
|||
name="show_world"
|
||||
top_pad="4"
|
||||
width="90" />
|
||||
<check_box
|
||||
height="19"
|
||||
label="X-Ray"
|
||||
layout="topleft"
|
||||
left="14"
|
||||
name="x-ray"
|
||||
top_pad="4"
|
||||
width="90" />
|
||||
<view_border
|
||||
bevel_style="none"
|
||||
follows="top|left"
|
||||
|
|
|
|||
Loading…
Reference in New Issue