Skip to content

Commit

Permalink
#5565: OpenGLShaders remember their name, to be able to reconstruct t…
Browse files Browse the repository at this point in the history
…hemselves without the OpenGLRenderSystem parent having to pass down the name every time.

Remove now unneeded OpenGLShaderRenderSystem::onMaterialChanged interface.
  • Loading branch information
codereader committed Mar 25, 2021
1 parent 74bd344 commit a0db37e
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 65 deletions.
3 changes: 0 additions & 3 deletions include/irender.h
Expand Up @@ -562,9 +562,6 @@ class RenderSystem

// Subscription to get notified as soon as the openGL extensions have been initialised
virtual sigc::signal<void> signal_extensionsInitialised() = 0;

// Notification about a material change, tries to refresh any constructed shaders basing on it
virtual void onMaterialChanged(const std::string& materialName) = 0;
};
typedef std::shared_ptr<RenderSystem> RenderSystemPtr;
typedef std::weak_ptr<RenderSystem> RenderSystemWeakPtr;
Expand Down
20 changes: 3 additions & 17 deletions radiantcore/rendersystem/OpenGLRenderSystem.cpp
Expand Up @@ -91,13 +91,13 @@ ShaderPtr OpenGLRenderSystem::capture(const std::string& name)
// Either the shader was not found, or the weak pointer failed to lock
// because the shader had been deleted. Either way, create a new shader
// and insert into the cache.
OpenGLShaderPtr shd(new OpenGLShader(*this));
OpenGLShaderPtr shd(new OpenGLShader(name, *this));
_shaders[name] = shd;

// Realise the shader if the cache is realised
if (_realised)
{
shd->realise(name);
shd->realise();
}

// Return the new shader
Expand Down Expand Up @@ -231,7 +231,7 @@ void OpenGLRenderSystem::realise()
OpenGLShaderPtr sp = i->second;
assert(sp);

sp->realise(i->first);
sp->realise();
}
}

Expand Down Expand Up @@ -261,20 +261,6 @@ void OpenGLRenderSystem::unrealise()
}
}

void OpenGLRenderSystem::onMaterialChanged(const std::string& materialName)
{
auto existingShader = _shaders.find(materialName);

if (existingShader == _shaders.end() || !_realised)
{
return;
}

// Re-realise this shader
existingShader->second->unrealise();
existingShader->second->realise(materialName);
}

GLProgramFactory& OpenGLRenderSystem::getGLProgramFactory()
{
return *_glProgramFactory;
Expand Down
2 changes: 0 additions & 2 deletions radiantcore/rendersystem/OpenGLRenderSystem.h
Expand Up @@ -69,8 +69,6 @@ class OpenGLRenderSystem
void realise() override;
void unrealise() override;

void onMaterialChanged(const std::string& materialName) override;

GLProgramFactory& getGLProgramFactory();

std::size_t getTime() const override;
Expand Down
77 changes: 39 additions & 38 deletions radiantcore/rendersystem/backend/OpenGLShader.cpp
Expand Up @@ -40,7 +40,8 @@ struct OpenGLShader::DBSTriplet
}
};

OpenGLShader::OpenGLShader(OpenGLRenderSystem& renderSystem) :
OpenGLShader::OpenGLShader(const std::string& name, OpenGLRenderSystem& renderSystem) :
_name(name),
_renderSystem(renderSystem),
_isVisible(true),
_useCount(0)
Expand Down Expand Up @@ -163,15 +164,15 @@ bool OpenGLShader::isRealised()
return _material != 0;
}

void OpenGLShader::realise(const std::string& name)
void OpenGLShader::realise()
{
// Construct the shader passes based on the name
construct(name);
construct();

if (_material != NULL)
if (_material)
{
// greebo: Check the filtersystem whether we're filtered
_material->setVisible(GlobalFilterSystem().isVisible(FilterRule::TYPE_TEXTURE, name));
_material->setVisible(GlobalFilterSystem().isVisible(FilterRule::TYPE_TEXTURE, _name));

if (_useCount != 0)
{
Expand Down Expand Up @@ -606,10 +607,10 @@ void OpenGLShader::appendBlendLayer(const IShaderLayer::Ptr& layer)
}

// Construct a normal shader
void OpenGLShader::constructNormalShader(const std::string& name)
void OpenGLShader::constructNormalShader()
{
// Obtain the Material
_material = GlobalMaterialManager().getMaterial(name);
_material = GlobalMaterialManager().getMaterial(_name);
assert(_material);

_materialChanged = _material->sig_materialChanged().connect(
Expand All @@ -630,7 +631,7 @@ void OpenGLShader::constructNormalShader(const std::string& name)
}

// Main shader construction entry point
void OpenGLShader::construct(const std::string& name)
void OpenGLShader::construct()
{
// Retrieve the highlight colour from the colourschemes (once)
const static Colour4 highLightColour(
Expand All @@ -639,15 +640,15 @@ void OpenGLShader::construct(const std::string& name)

// Check the first character of the name to see if this is a special built-in
// shader
switch (name[0])
switch (_name[0])
{
case '(': // fill shader
{
OpenGLState& state = appendDefaultPass();
state.setName(name);
state.setName(_name);

Colour4 colour;
sscanf(name.c_str(), "(%lf %lf %lf)", &colour[0], &colour[1], &colour[2]);
sscanf(_name.c_str(), "(%lf %lf %lf)", &colour[0], &colour[1], &colour[2]);
colour[3] = 1.0f;
state.setColour(colour);

Expand All @@ -663,10 +664,10 @@ void OpenGLShader::construct(const std::string& name)
case '[':
{
OpenGLState& state = appendDefaultPass();
state.setName(name);
state.setName(_name);

Colour4 colour;
sscanf(name.c_str(), "[%lf %lf %lf]", &colour[0], &colour[1], &colour[2]);
sscanf(_name.c_str(), "[%lf %lf %lf]", &colour[0], &colour[1], &colour[2]);
colour[3] = 0.5f;
state.setColour(colour);

Expand All @@ -683,10 +684,10 @@ void OpenGLShader::construct(const std::string& name)
case '<': // wireframe shader
{
OpenGLState& state = appendDefaultPass();
state.setName(name);
state.setName(_name);

Colour4 colour;
sscanf(name.c_str(), "<%lf %lf %lf>", &colour[0], &colour[1], &colour[2]);
sscanf(_name.c_str(), "<%lf %lf %lf>", &colour[0], &colour[1], &colour[2]);
colour[3] = 1;
state.setColour(colour);

Expand All @@ -701,58 +702,58 @@ void OpenGLShader::construct(const std::string& name)
case '$':
{
OpenGLState& state = appendDefaultPass();
state.setName(name);
state.setName(_name);

if (name == "$POINT")
if (_name == "$POINT")
{
state.setRenderFlag(RENDER_POINT_COLOUR);
state.setRenderFlag(RENDER_DEPTHWRITE);

state.setSortPosition(OpenGLState::SORT_POINT_FIRST);
state.m_pointsize = 4;
}
else if (name == "$SELPOINT")
else if (_name == "$SELPOINT")
{
state.setRenderFlag(RENDER_POINT_COLOUR);
state.setRenderFlag(RENDER_DEPTHWRITE);

state.setSortPosition(OpenGLState::SORT_POINT_LAST);
state.m_pointsize = 4;
}
else if (name == "$BIGPOINT")
else if (_name == "$BIGPOINT")
{
state.setRenderFlag(RENDER_POINT_COLOUR);
state.setRenderFlag(RENDER_DEPTHWRITE);

state.setSortPosition(OpenGLState::SORT_POINT_FIRST);
state.m_pointsize = 6;
}
else if (name == "$PIVOT")
else if (_name == "$PIVOT")
{
state.setRenderFlags(RENDER_DEPTHTEST | RENDER_DEPTHWRITE);
state.setSortPosition(OpenGLState::SORT_GUI0);
state.m_linewidth = 2;
state.setDepthFunc(GL_LEQUAL);

OpenGLState& hiddenLine = appendDefaultPass();
hiddenLine.setName(name + "_Hidden");
hiddenLine.setName(_name + "_Hidden");
hiddenLine.setRenderFlags(RENDER_DEPTHTEST | RENDER_LINESTIPPLE);
hiddenLine.setSortPosition(OpenGLState::SORT_GUI0);
hiddenLine.m_linewidth = 2;
hiddenLine.setDepthFunc(GL_GREATER);
}
else if (name == "$LATTICE")
else if (_name == "$LATTICE")
{
state.setColour(1, 0.5, 0, 1);
state.setRenderFlag(RENDER_DEPTHWRITE);
state.setSortPosition(OpenGLState::SORT_POINT_FIRST);
}
else if (name == "$WIREFRAME")
else if (_name == "$WIREFRAME")
{
state.setRenderFlags(RENDER_DEPTHTEST | RENDER_DEPTHWRITE);
state.setSortPosition(OpenGLState::SORT_FULLBRIGHT);
}
else if (name == "$CAM_HIGHLIGHT")
else if (_name == "$CAM_HIGHLIGHT")
{
// This is the shader drawing a coloured overlay
// over faces/polys. Its colour is configurable,
Expand All @@ -767,7 +768,7 @@ void OpenGLShader::construct(const std::string& name)
state.polygonOffset = 0.5f;
state.setDepthFunc(GL_LEQUAL);
}
else if (name == "$CAM_OVERLAY")
else if (_name == "$CAM_OVERLAY")
{
// This is the shader drawing a solid line to outline
// a selected item. The first pass has its depth test
Expand All @@ -788,7 +789,7 @@ void OpenGLShader::construct(const std::string& name)
hiddenLine.setDepthFunc(GL_GREATER);
hiddenLine.m_linestipple_factor = 2;
}
else if (name == "$XY_OVERLAY")
else if (_name == "$XY_OVERLAY")
{
Vector3 colorSelBrushes = GlobalColourSchemeManager().getColour("selected_brush");
state.setColour(static_cast<float>(colorSelBrushes[0]),
Expand All @@ -800,7 +801,7 @@ void OpenGLShader::construct(const std::string& name)
state.m_linewidth = 2;
state.m_linestipple_factor = 3;
}
else if (name == "$XY_OVERLAY_GROUP")
else if (_name == "$XY_OVERLAY_GROUP")
{
Vector3 colorSelBrushes = GlobalColourSchemeManager().getColour("selected_group_items");
state.setColour(static_cast<float>(colorSelBrushes[0]),
Expand All @@ -812,19 +813,19 @@ void OpenGLShader::construct(const std::string& name)
state.m_linewidth = 2;
state.m_linestipple_factor = 3;
}
else if (name == "$DEBUG_CLIPPED")
else if (_name == "$DEBUG_CLIPPED")
{
state.setRenderFlag(RENDER_DEPTHWRITE);
state.setSortPosition(OpenGLState::SORT_LAST);
}
else if (name == "$POINTFILE")
else if (_name == "$POINTFILE")
{
state.setColour(1, 0, 0, 1);
state.setRenderFlags(RENDER_DEPTHTEST | RENDER_DEPTHWRITE);
state.setSortPosition(OpenGLState::SORT_FULLBRIGHT);
state.m_linewidth = 4;
}
else if (name == "$WIRE_OVERLAY")
else if (_name == "$WIRE_OVERLAY")
{
state.setRenderFlags(RENDER_DEPTHWRITE
| RENDER_DEPTHTEST
Expand All @@ -834,7 +835,7 @@ void OpenGLShader::construct(const std::string& name)
state.setDepthFunc(GL_LEQUAL);

OpenGLState& hiddenLine = appendDefaultPass();
hiddenLine.setName(name + "_Hidden");
hiddenLine.setName(_name + "_Hidden");
hiddenLine.setRenderFlags(RENDER_DEPTHWRITE
| RENDER_DEPTHTEST
| RENDER_OVERRIDE
Expand All @@ -843,7 +844,7 @@ void OpenGLShader::construct(const std::string& name)
hiddenLine.setSortPosition(OpenGLState::SORT_GUI0);
hiddenLine.setDepthFunc(GL_GREATER);
}
else if (name == "$FLATSHADE_OVERLAY")
else if (_name == "$FLATSHADE_OVERLAY")
{
state.setRenderFlags(RENDER_CULLFACE
| RENDER_LIGHTING
Expand All @@ -857,7 +858,7 @@ void OpenGLShader::construct(const std::string& name)
state.setDepthFunc(GL_LEQUAL);

OpenGLState& hiddenLine = appendDefaultPass();
hiddenLine.setName(name + "_Hidden");
hiddenLine.setName(_name + "_Hidden");
hiddenLine.setRenderFlags(RENDER_CULLFACE
| RENDER_LIGHTING
| RENDER_SMOOTH
Expand All @@ -870,7 +871,7 @@ void OpenGLShader::construct(const std::string& name)
hiddenLine.setSortPosition(OpenGLState::SORT_GUI0);
hiddenLine.setDepthFunc(GL_GREATER);
}
else if (name == "$CLIPPER_OVERLAY")
else if (_name == "$CLIPPER_OVERLAY")
{
state.setColour(GlobalColourSchemeManager().getColour("clipper"));
state.setRenderFlags(RENDER_CULLFACE
Expand All @@ -879,7 +880,7 @@ void OpenGLShader::construct(const std::string& name)
| RENDER_POLYGONSTIPPLE);
state.setSortPosition(OpenGLState::SORT_OVERLAY_FIRST);
}
else if (name == "$AAS_AREA")
else if (_name == "$AAS_AREA")
{
state.setColour(1, 1, 1, 1);
state.setRenderFlags(RENDER_DEPTHWRITE
Expand Down Expand Up @@ -907,21 +908,21 @@ void OpenGLShader::construct(const std::string& name)
default:
{
// This is not a hard-coded shader, construct from the shader system
constructNormalShader(name);
constructNormalShader();
}
} // switch (name[0])

// If there is no Material, create an internal one for debug/testing etc
if (!_material)
{
_material = GlobalMaterialManager().createDefaultMaterial(name);
_material = GlobalMaterialManager().createDefaultMaterial(_name);
}
}

void OpenGLShader::onMaterialChanged()
{
unrealise();
realise(_material->getName());
realise();
}

}
Expand Down
12 changes: 7 additions & 5 deletions radiantcore/rendersystem/backend/OpenGLShader.h
Expand Up @@ -21,6 +21,8 @@ class OpenGLShader final :
public Shader
{
private:
std::string _name;

// The state manager we will be inserting/removing OpenGL states from
OpenGLRenderSystem& _renderSystem;

Expand All @@ -44,11 +46,11 @@ class OpenGLShader final :
private:

// Start point for constructing shader passes from the shader name
void construct(const std::string& name);
void construct();

// Construct shader passes from a regular shader (as opposed to a special
// built-in shader)
void constructNormalShader(const std::string& name);
void constructNormalShader();

// Shader pass construction helpers
void appendBlendLayer(const IShaderLayer::Ptr& layer);
Expand Down Expand Up @@ -78,7 +80,7 @@ class OpenGLShader final :

public:
/// Construct and initialise
OpenGLShader(OpenGLRenderSystem& renderSystem);
OpenGLShader(const std::string& name, OpenGLRenderSystem& renderSystem);

~OpenGLShader();

Expand All @@ -101,9 +103,9 @@ class OpenGLShader final :
bool isRealised() override;

/**
* Realise this shader, setting the name in the process.
* Realise this shader
*/
void realise(const std::string& name);
void realise();

void unrealise();

Expand Down

0 comments on commit a0db37e

Please sign in to comment.