Pathfinding visualization WIP -- add many controls for x-ray render, add lighting, and better combat z-fighting and noise from wireframes and overlays

meow-7.2.2
Dave Parks 2012-04-03 02:52:34 -05:00
parent 0cce43aefe
commit 817f1629bd
6 changed files with 187 additions and 49 deletions

View File

@ -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>

View File

@ -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);
}

View File

@ -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();

View File

@ -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;

View File

@ -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();
}
}

View File

@ -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"