Skip to content

Commit 728188b

Browse files
committed
Move Push/Pop Layer stuff to pl3DPipeline
This is what calls `Eval()` to make layer animations work, so that's now hooked up for plGLPipeline. I don't love this approach because it feels weird doing it in the shader class, and I suspect we need to know about layer overrides when the shader is being generated, but... for now it sorta works.
1 parent d5aef25 commit 728188b

6 files changed

Lines changed: 125 additions & 97 deletions

File tree

Sources/Plasma/FeatureLib/pfDXPipeline/plDXPipeline.cpp

Lines changed: 0 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -5280,88 +5280,6 @@ void plDXPipeline::IBottomLayer()
52805280

52815281
// Special effects /////////////////////////////////////////////////////////////
52825282

5283-
// IPushOverBaseLayer /////////////////////////////////////////////////////////
5284-
// Sets fOverBaseLayer (if any) as a wrapper on top of input layer.
5285-
// This allows the OverBaseLayer to intercept and modify queries of
5286-
// the real current layer's properties (e.g. color or state).
5287-
// fOverBaseLayer is set to only get applied to the base layer during
5288-
// multitexturing.
5289-
// Must be matched with call to IPopOverBaseLayer.
5290-
plLayerInterface* plDXPipeline::IPushOverBaseLayer(plLayerInterface* li)
5291-
{
5292-
if( !li )
5293-
return nullptr;
5294-
5295-
fOverLayerStack.push_back(li);
5296-
5297-
if( !fOverBaseLayer )
5298-
return fOverBaseLayer = li;
5299-
5300-
fForceMatHandle = true;
5301-
fOverBaseLayer = fOverBaseLayer->Attach(li);
5302-
fOverBaseLayer->Eval(fTime, fFrame, 0);
5303-
return fOverBaseLayer;
5304-
}
5305-
5306-
// IPopOverBaseLayer /////////////////////////////////////////////////////////
5307-
// Removes fOverBaseLayer as wrapper on top of input layer.
5308-
// Should match calls to IPushOverBaseLayer.
5309-
plLayerInterface* plDXPipeline::IPopOverBaseLayer(plLayerInterface* li)
5310-
{
5311-
if( !li )
5312-
return nullptr;
5313-
5314-
fForceMatHandle = true;
5315-
5316-
plLayerInterface* pop = fOverLayerStack.back();
5317-
fOverLayerStack.pop_back();
5318-
fOverBaseLayer = fOverBaseLayer->Detach(pop);
5319-
5320-
return pop;
5321-
}
5322-
5323-
// IPushOverAllLayer ///////////////////////////////////////////////////
5324-
// Push fOverAllLayer (if any) as wrapper around the input layer.
5325-
// fOverAllLayer is set to be applied to each layer during multitexturing.
5326-
// Must be matched by call to IPopOverAllLayer
5327-
plLayerInterface* plDXPipeline::IPushOverAllLayer(plLayerInterface* li)
5328-
{
5329-
if( !li )
5330-
return nullptr;
5331-
5332-
fOverLayerStack.push_back(li);
5333-
5334-
if( !fOverAllLayer )
5335-
{
5336-
fOverAllLayer = li;
5337-
fOverAllLayer->Eval(fTime, fFrame, 0);
5338-
return fOverAllLayer;
5339-
}
5340-
5341-
fForceMatHandle = true;
5342-
fOverAllLayer = fOverAllLayer->Attach(li);
5343-
fOverAllLayer->Eval(fTime, fFrame, 0);
5344-
5345-
return fOverAllLayer;
5346-
}
5347-
5348-
// IPopOverAllLayer //////////////////////////////////////////////////
5349-
// Remove fOverAllLayer as wrapper on top of input layer.
5350-
// Should match calls to IPushOverAllLayer.
5351-
plLayerInterface* plDXPipeline::IPopOverAllLayer(plLayerInterface* li)
5352-
{
5353-
if( !li )
5354-
return nullptr;
5355-
5356-
fForceMatHandle = true;
5357-
5358-
plLayerInterface* pop = fOverLayerStack.back();
5359-
fOverLayerStack.pop_back();
5360-
fOverAllLayer = fOverAllLayer->Detach(pop);
5361-
5362-
return pop;
5363-
}
5364-
53655283
// PiggyBacks - used in techniques like projective lighting.
53665284
// PiggyBacks are layers appended to each drawprimitive pass.
53675285
// For example, if a material has 3 layers which will be drawn

Sources/Plasma/FeatureLib/pfDXPipeline/plDXPipeline.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -341,11 +341,6 @@ class plDXPipeline : public pl3DPipeline<plDXDevice>
341341
void IBottomLayer();
342342

343343
// Push special effects
344-
plLayerInterface* IPushOverBaseLayer(plLayerInterface* li);
345-
plLayerInterface* IPopOverBaseLayer(plLayerInterface* li);
346-
plLayerInterface* IPushOverAllLayer(plLayerInterface* li);
347-
plLayerInterface* IPopOverAllLayer(plLayerInterface* li);
348-
349344
int ISetNumActivePiggyBacks();
350345
void IPushPiggyBacks(hsGMaterial* mat);
351346
void IPopPiggyBacks();

Sources/Plasma/FeatureLib/pfGLPipeline/plGLMaterialShaderRef.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,14 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
4242

4343
#include "plGLMaterialShaderRef.h"
4444
#include "plGLDevice.h"
45+
#include "plGLPipeline.h"
4546

4647
#include <epoxy/gl.h>
4748

4849
#include "HeadSpin.h"
4950
#include "hsBitVector.h"
5051

5152
#include "hsGMatState.inl"
52-
#include "plPipeline.h"
5353
#include "plPipeDebugFlags.h"
5454

5555
#include "plDrawable/plGBufferGroup.h"
@@ -230,7 +230,7 @@ void main() {
230230
fragColor = vec4(currColor, currAlpha);
231231
})";
232232

233-
plGLMaterialShaderRef::plGLMaterialShaderRef(hsGMaterial* mat, plPipeline* pipe)
233+
plGLMaterialShaderRef::plGLMaterialShaderRef(hsGMaterial* mat, plGLPipeline* pipe)
234234
: plGLDeviceRef(), fMaterial(mat), fPipeline(pipe), fVertShaderRef(0), fFragShaderRef(0)
235235
{
236236
ISetupShaderContexts();
@@ -274,16 +274,22 @@ void plGLMaterialShaderRef::SetupTextureRefs()
274274
if (!layer)
275275
continue;
276276

277+
layer = fPipeline->IPushOverAllLayer(layer);
278+
277279
// Load the image
278280
plBitmap* img = plBitmap::ConvertNoRef(layer->GetTexture());
279281

280-
if (!img)
282+
if (!img) {
283+
layer = fPipeline->IPopOverAllLayer(layer);
281284
continue;
285+
}
282286

283287
plGLTextureRef* texRef = static_cast<plGLTextureRef*>(img->GetDeviceRef());
284288

285-
if (!texRef->fRef)
289+
if (!texRef->fRef) {
290+
layer = fPipeline->IPopOverAllLayer(layer);
286291
continue;
292+
}
287293

288294
fPipeline->CheckTextureRef(layer);
289295

@@ -325,6 +331,7 @@ void plGLMaterialShaderRef::SetupTextureRefs()
325331
glUniform1i(this->uTexture[i], numTextures);
326332
LOG_GL_ERROR_CHECK("Uniform Texture failed")
327333

334+
layer = fPipeline->IPopOverAllLayer(layer);
328335
numTextures++;
329336
}
330337
}
@@ -580,12 +587,12 @@ uint32_t plGLMaterialShaderRef::IHandleMaterial(uint32_t layer, std::shared_ptr<
580587

581588
// Ignoring the bit about self-rendering cube maps
582589

583-
plLayerInterface* currLay = /*IPushOverBaseLayer*/ fMaterial->GetLayer(layer);
590+
plLayerInterface* currLay = fPipeline->IPushOverBaseLayer(fMaterial->GetLayer(layer));
584591

585592
if (fPipeline->IsDebugFlagSet(plPipeDbg::kFlagBumpW) && (currLay->GetMiscFlags() & hsGMatState::kMiscBumpDu))
586593
currLay = fMaterial->GetLayer(++layer);
587594

588-
//currLay = IPushOverAllLayer(currLay);
595+
currLay = fPipeline->IPushOverAllLayer(currLay);
589596

590597
hsGMatState state = ICompositeLayerState(currLay);
591598

@@ -627,6 +634,9 @@ uint32_t plGLMaterialShaderRef::IHandleMaterial(uint32_t layer, std::shared_ptr<
627634
//ISetBumpMatrices(currLay);
628635
}
629636

637+
currLay = fPipeline->IPopOverAllLayer(currLay);
638+
currLay = fPipeline->IPopOverBaseLayer(currLay);
639+
630640
std::shared_ptr<plVaryingNode> vVtxColor = IFindVariable<plVaryingNode>("vVtxColor", "vec4");
631641

632642
std::shared_ptr<plTempVariableNode> fBaseAlpha = std::make_shared<plTempVariableNode>("baseAlpha", "float");

Sources/Plasma/FeatureLib/pfGLPipeline/plGLMaterialShaderRef.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
5252
#include "hsGMatState.h"
5353

5454
class hsGMaterial;
55-
class plPipeline;
55+
class plGLPipeline;
5656
class plLayerInterface;
5757

5858
enum plGLShaderConstants : GLuint {
@@ -100,7 +100,7 @@ class plGLMaterialShaderRef : public plGLDeviceRef
100100

101101
protected:
102102
hsGMaterial* fMaterial;
103-
plPipeline* fPipeline;
103+
plGLPipeline* fPipeline;
104104
GLuint fVertShaderRef;
105105
GLuint fFragShaderRef;
106106

@@ -142,7 +142,7 @@ class plGLMaterialShaderRef : public plGLDeviceRef
142142
void Link(plGLMaterialShaderRef** back) { plGLDeviceRef::Link((plGLDeviceRef**)back); }
143143
plGLMaterialShaderRef* GetNext() { return (plGLMaterialShaderRef*)fNext; }
144144

145-
plGLMaterialShaderRef(hsGMaterial* mat, plPipeline* pipe);
145+
plGLMaterialShaderRef(hsGMaterial* mat, plGLPipeline* pipe);
146146
virtual ~plGLMaterialShaderRef();
147147

148148
void Release();

Sources/Plasma/FeatureLib/pfGLPipeline/plGLPipeline.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class plGLPipeline : public pl3DPipeline<plGLDevice>
6666
{
6767
friend class plGLPlateManager;
6868
friend class plGLDevice;
69+
friend class plGLMaterialShaderRef;
6970

7071
protected:
7172
typedef void(*blend_vert_buffer_ptr)(plSpan*, hsMatrix44*, int, const uint8_t*, uint8_t , uint32_t, uint8_t*, uint32_t, uint32_t, uint16_t);

Sources/Plasma/PubUtilLib/plPipeline/pl3DPipeline.h

Lines changed: 105 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -680,7 +680,6 @@ class pl3DPipeline : public plPipeline
680680
/** Removes a layer wrapper installed by AppendLayerInterface. */
681681
plLayerInterface* RemoveLayerInterface(plLayerInterface* li, bool onAllLayers = false) override;
682682

683-
684683
/**
685684
* Return the current bits set to be always on for the given category
686685
* (e.g. ZFlags).
@@ -851,6 +850,39 @@ class pl3DPipeline : public plPipeline
851850
plRenderTarget* IGetNextAvRT();
852851
void IFreeAvRT(plRenderTarget* tex);
853852

853+
/**
854+
* Sets fOverBaseLayer (if any) as a wrapper on top of input layer.
855+
* This allows the OverBaseLayer to intercept and modify queries of
856+
* the real current layer's properties (e.g. color or state).
857+
* fOverBaseLayer is set to only get applied to the base layer during
858+
* multitexturing.
859+
*
860+
* Must be matched with call to IPopOverBaseLayer.
861+
*/
862+
plLayerInterface* IPushOverBaseLayer(plLayerInterface* li);
863+
864+
/**
865+
* Removes fOverBaseLayer as wrapper on top of input layer.
866+
*
867+
* Should match calls to IPushOverBaseLayer.
868+
*/
869+
plLayerInterface* IPopOverBaseLayer(plLayerInterface* li);
870+
871+
/**
872+
* Push fOverAllLayer (if any) as wrapper around the input layer.
873+
*
874+
* fOverAllLayer is set to be applied to each layer during multitexturing.
875+
*
876+
* Must be matched by call to IPopOverAllLayer
877+
*/
878+
plLayerInterface* IPushOverAllLayer(plLayerInterface* li);
879+
880+
/**
881+
* Remove fOverAllLayer as wrapper on top of input layer.
882+
*
883+
* Should match calls to IPushOverAllLayer.
884+
*/
885+
plLayerInterface* IPopOverAllLayer(plLayerInterface* li);
854886

855887
/**
856888
* For every span in the list of visible span indices, find the list of
@@ -1745,6 +1777,78 @@ void pl3DPipeline<DeviceType>::IFreeAvRT(plRenderTarget* tex)
17451777
}
17461778

17471779

1780+
template <class DeviceType>
1781+
plLayerInterface* pl3DPipeline<DeviceType>::IPushOverBaseLayer(plLayerInterface* li)
1782+
{
1783+
if (!li)
1784+
return nullptr;
1785+
1786+
fOverLayerStack.push_back(li);
1787+
1788+
if (!fOverBaseLayer)
1789+
return fOverBaseLayer = li;
1790+
1791+
fForceMatHandle = true;
1792+
fOverBaseLayer = fOverBaseLayer->Attach(li);
1793+
fOverBaseLayer->Eval(fTime, fFrame, 0);
1794+
return fOverBaseLayer;
1795+
}
1796+
1797+
1798+
template <class DeviceType>
1799+
plLayerInterface* pl3DPipeline<DeviceType>::IPopOverBaseLayer(plLayerInterface* li)
1800+
{
1801+
if (!li)
1802+
return nullptr;
1803+
1804+
fForceMatHandle = true;
1805+
1806+
plLayerInterface* pop = fOverLayerStack.back();
1807+
fOverLayerStack.pop_back();
1808+
fOverBaseLayer = fOverBaseLayer->Detach(pop);
1809+
1810+
return pop;
1811+
}
1812+
1813+
1814+
template <class DeviceType>
1815+
plLayerInterface* pl3DPipeline<DeviceType>::IPushOverAllLayer(plLayerInterface* li)
1816+
{
1817+
if (!li)
1818+
return nullptr;
1819+
1820+
fOverLayerStack.push_back(li);
1821+
1822+
if (!fOverAllLayer) {
1823+
fOverAllLayer = li;
1824+
fOverAllLayer->Eval(fTime, fFrame, 0);
1825+
return fOverAllLayer;
1826+
}
1827+
1828+
fForceMatHandle = true;
1829+
fOverAllLayer = fOverAllLayer->Attach(li);
1830+
fOverAllLayer->Eval(fTime, fFrame, 0);
1831+
1832+
return fOverAllLayer;
1833+
}
1834+
1835+
1836+
template <class DeviceType>
1837+
plLayerInterface* pl3DPipeline<DeviceType>::IPopOverAllLayer(plLayerInterface* li)
1838+
{
1839+
if (!li)
1840+
return nullptr;
1841+
1842+
fForceMatHandle = true;
1843+
1844+
plLayerInterface* pop = fOverLayerStack.back();
1845+
fOverLayerStack.pop_back();
1846+
fOverAllLayer = fOverAllLayer->Detach(pop);
1847+
1848+
return pop;
1849+
}
1850+
1851+
17481852
template <class DeviceType>
17491853
void pl3DPipeline<DeviceType>::ICheckLighting(plDrawableSpans* drawable, std::vector<int16_t>& visList, plVisMgr* visMgr)
17501854
{

0 commit comments

Comments
 (0)