@@ -17,7 +17,6 @@ CMaterial::CMaterial()
1717 : mpShader(nullptr )
1818 , mShaderStatus(EShaderStatus::NoShader)
1919 , mRecalcHash(true )
20- , mEnableBloom(false )
2120 , mVersion(EGame::Invalid)
2221 , mOptions(EMaterialOption::None)
2322 , mVtxDesc(EVertexAttribute::None)
@@ -27,57 +26,49 @@ CMaterial::CMaterial()
2726 , mEchoesUnknownA(0 )
2827 , mEchoesUnknownB(0 )
2928 , mpIndirectTexture(nullptr )
30- {
31- }
29+ , mpNextDrawPassMaterial(nullptr )
30+ , mpBloomMaterial(nullptr )
31+ {}
3232
3333CMaterial::CMaterial (EGame Version, FVertexDescription VtxDesc)
3434 : mpShader(nullptr )
3535 , mShaderStatus(EShaderStatus::NoShader)
3636 , mRecalcHash(true )
37- , mEnableBloom(Version == EGame::Corruption)
3837 , mVersion(Version)
39- , mOptions(EMaterialOption::DepthWrite)
38+ , mOptions(EMaterialOption::DepthWrite | EMaterialOption::ColorWrite )
4039 , mVtxDesc(VtxDesc)
4140 , mBlendSrcFac(GL_ONE)
4241 , mBlendDstFac(GL_ZERO)
4342 , mLightingEnabled(true )
4443 , mEchoesUnknownA(0 )
4544 , mEchoesUnknownB(0 )
4645 , mpIndirectTexture(nullptr )
47- {
48- mpShader = nullptr ;
49- mShaderStatus = EShaderStatus::NoShader;
50- mRecalcHash = true ;
51- mEnableBloom = (Version == EGame::Corruption);
52- mVersion = Version;
53- mOptions = EMaterialOption::DepthWrite;
54- mVtxDesc = VtxDesc;
55- mBlendSrcFac = GL_ONE;
56- mBlendDstFac = GL_ZERO;
57- mLightingEnabled = true ;
58- mEchoesUnknownA = 0 ;
59- mEchoesUnknownB = 0 ;
60- mpIndirectTexture = nullptr ;
61- }
46+ , mpNextDrawPassMaterial(nullptr )
47+ , mpBloomMaterial(nullptr )
48+ {}
6249
6350CMaterial::~CMaterial ()
6451{
6552 for (uint32 iPass = 0 ; iPass < mPasses .size (); iPass++)
6653 delete mPasses [iPass];
6754
55+ delete mpNextDrawPassMaterial;
56+ delete mpBloomMaterial;
57+
6858 ClearShader ();
6959}
7060
7161CMaterial* CMaterial::Clone ()
7262{
7363 CMaterial *pOut = new CMaterial ();
7464 pOut->mName = mName ;
75- pOut->mEnableBloom = mEnableBloom ;
7665 pOut->mVersion = mVersion ;
7766 pOut->mOptions = mOptions ;
7867 pOut->mVtxDesc = mVtxDesc ;
7968 for (uint32 iKonst = 0 ; iKonst < 4 ; iKonst++)
8069 pOut->mKonstColors [iKonst] = mKonstColors [iKonst];
70+ for (uint32 iTev = 0 ; iTev < 4 ; iTev++)
71+ pOut->mTevColors [iTev] = mTevColors [iTev];
8172 pOut->mBlendSrcFac = mBlendSrcFac ;
8273 pOut->mBlendDstFac = mBlendDstFac ;
8374 pOut->mLightingEnabled = mLightingEnabled ;
@@ -89,6 +80,12 @@ CMaterial* CMaterial::Clone()
8980 for (uint32 iPass = 0 ; iPass < mPasses .size (); iPass++)
9081 pOut->mPasses [iPass] = mPasses [iPass]->Clone (pOut);
9182
83+ if (mpNextDrawPassMaterial)
84+ pOut->mpNextDrawPassMaterial = mpNextDrawPassMaterial->Clone ();
85+
86+ if (mpBloomMaterial)
87+ pOut->mpBloomMaterial = mpBloomMaterial->Clone ();
88+
9289 return pOut;
9390}
9491
@@ -179,15 +176,12 @@ bool CMaterial::SetCurrent(FRenderOptions Options)
179176 dstRGB = mBlendDstFac ;
180177 }
181178
182- // Set alpha blend equation
183- bool AlphaBlended = ((mBlendSrcFac == GL_SRC_ALPHA) && (mBlendDstFac == GL_ONE_MINUS_SRC_ALPHA));
184-
185- if ((mEnableBloom ) && (Options & ERenderOption::EnableBloom) && (!AlphaBlended)) {
186- srcAlpha = mBlendSrcFac ;
187- dstAlpha = mBlendDstFac ;
188- } else {
179+ if (mOptions & EMaterialOption::ZeroDestAlpha) {
189180 srcAlpha = GL_ZERO;
190181 dstAlpha = GL_ZERO;
182+ } else {
183+ srcAlpha = mBlendSrcFac ;
184+ dstAlpha = mBlendDstFac ;
191185 }
192186
193187 glBlendFuncSeparate (srcRGB, dstRGB, srcAlpha, dstAlpha);
@@ -196,6 +190,11 @@ bool CMaterial::SetCurrent(FRenderOptions Options)
196190 for (uint32 iKonst = 0 ; iKonst < 4 ; iKonst++)
197191 CGraphics::sPixelBlock .Konst [iKonst] = mKonstColors [iKonst];
198192
193+ // Set TEV registers
194+ if (mVersion >= EGame::Corruption)
195+ for (uint32 iTev = 0 ; iTev < 4 ; iTev++)
196+ CGraphics::sPixelBlock .TevColor [iTev] = mTevColors [iTev];
197+
199198 // Set color channels
200199 // COLOR0_Amb is initialized by the node instead of by the material
201200 CGraphics::sVertexBlock .COLOR0_Mat = CColor::skWhite;
@@ -204,6 +203,11 @@ bool CMaterial::SetCurrent(FRenderOptions Options)
204203 if ((mOptions & EMaterialOption::DepthWrite) || (Options & ERenderOption::NoAlpha)) glDepthMask (GL_TRUE);
205204 else glDepthMask (GL_FALSE);
206205
206+ // Set color/alpha write
207+ GLboolean bColorWrite = mOptions .HasFlag (EMaterialOption::ColorWrite);
208+ GLboolean bAlphaWrite = mOptions .HasFlag (EMaterialOption::AlphaWrite);
209+ glColorMask (bColorWrite, bColorWrite, bColorWrite, bAlphaWrite);
210+
207211 // Load uniforms
208212 for (uint32 iPass = 0 ; iPass < mPasses .size (); iPass++)
209213 mPasses [iPass]->SetAnimCurrent (Options, iPass);
@@ -249,6 +253,7 @@ uint64 CMaterial::HashParameters()
249253 Hash.HashLong (mOptions );
250254 Hash.HashLong (mVtxDesc );
251255 Hash.HashData (mKonstColors , sizeof (CColor) * 4 );
256+ Hash.HashData (mTevColors , sizeof (CColor) * 4 );
252257 Hash.HashLong (mBlendSrcFac );
253258 Hash.HashLong (mBlendDstFac );
254259 Hash.HashByte (mLightingEnabled );
0 commit comments