Skip to content

Commit dfc9d1d

Browse files
committed
Merge remote-tracking branch 'origin/mp3-materials'
2 parents cfea90e + 55c4a58 commit dfc9d1d

39 files changed

+1595
-374
lines changed

.idea/codeStyles/Project.xml

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ endif()
1616

1717
# Ensure submodules checked out
1818
if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/externals/LibCommon/CMakeLists.txt)
19-
message(FATAL_ERROR "Please run 'git submodules update --init --recursive' to fetch submodules.")
19+
message(FATAL_ERROR "Please run 'git submodule update --init --recursive' to fetch submodules.")
2020
endif()
2121

2222
include(./dew.cmake)

src/Core/GameProject/AssetNameGeneration.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ void GenerateAssetNames(CGameProject *pProj)
172172

173173
for (uint32 iMat = 0; iMat < pSet->NumMaterials(); iMat++)
174174
{
175-
CMaterial *pMat = pSet->MaterialByIndex(iMat);
175+
CMaterial *pMat = pSet->MaterialByIndex(iMat, true);
176176

177177
for (uint32 iPass = 0; iPass < pMat->PassCount(); iPass++)
178178
{
@@ -239,7 +239,7 @@ void GenerateAssetNames(CGameProject *pProj)
239239

240240
for (uint32 iMat = 0; iMat < pMaterials->NumMaterials(); iMat++)
241241
{
242-
CMaterial *pMat = pMaterials->MaterialByIndex(iMat);
242+
CMaterial *pMat = pMaterials->MaterialByIndex(iMat, true);
243243
bool FoundLightmap = false;
244244

245245
for (uint32 iPass = 0; iPass < pMat->PassCount(); iPass++)
@@ -415,7 +415,7 @@ void GenerateAssetNames(CGameProject *pProj)
415415

416416
for (uint32 iMat = 0; iMat < pSet->NumMaterials(); iMat++)
417417
{
418-
CMaterial *pMat = pSet->MaterialByIndex(iMat);
418+
CMaterial *pMat = pSet->MaterialByIndex(iMat, true);
419419

420420
for (uint32 iPass = 0; iPass < pMat->PassCount(); iPass++)
421421
{

src/Core/OpenGL/CShaderGenerator.cpp

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,36 @@ bool CShaderGenerator::CreateVertexShader(const CMaterial& rkMat)
366366
return mpShader->CompileVertexSource(ShaderCode.str().c_str());
367367
}
368368

369+
static TString GetColorInputExpression(const CMaterialPass* pPass, ETevColorInput iInput)
370+
{
371+
if (iInput == ETevColorInput::kTextureRGB)
372+
{
373+
TString Ret("Tex.");
374+
for (uint32 i = 0; i < 3; ++i)
375+
Ret += pPass->TexSwapComp(i);
376+
return Ret;
377+
}
378+
else if (iInput == ETevColorInput::kTextureAAA)
379+
{
380+
TString Ret("Tex.");
381+
for (uint32 i = 0; i < 3; ++i)
382+
Ret += pPass->TexSwapComp(3);
383+
return Ret;
384+
}
385+
return gkTevColor[iInput];
386+
}
387+
388+
static TString GetAlphaInputExpression(const CMaterialPass* pPass, ETevAlphaInput iInput)
389+
{
390+
if (iInput == ETevAlphaInput::kTextureAlpha)
391+
{
392+
TString Ret("Tex.");
393+
Ret += pPass->TexSwapComp(3);
394+
return Ret;
395+
}
396+
return gkTevAlpha[iInput];
397+
}
398+
369399
bool CShaderGenerator::CreatePixelShader(const CMaterial& rkMat)
370400
{
371401
std::stringstream ShaderCode;
@@ -391,7 +421,7 @@ bool CShaderGenerator::CreatePixelShader(const CMaterial& rkMat)
391421
<< "\n"
392422
<< "layout(std140) uniform PixelBlock {\n"
393423
<< " vec4 KonstColors[4];\n"
394-
<< " vec4 TevColor;\n"
424+
<< " vec4 TevColor[4];\n"
395425
<< " vec4 TintColor;\n"
396426
<< " float LightmapMultiplier;\n"
397427
<< "};\n\n";
@@ -405,7 +435,7 @@ bool CShaderGenerator::CreatePixelShader(const CMaterial& rkMat)
405435
ShaderCode << "void main()\n"
406436
<< "{\n"
407437
<< " vec4 TevInA = vec4(0, 0, 0, 0), TevInB = vec4(0, 0, 0, 0), TevInC = vec4(0, 0, 0, 0), TevInD = vec4(0, 0, 0, 0);\n"
408-
<< " vec4 Prev = vec4(0, 0, 0, 0), C0 = TevColor, C1 = C0, C2 = C0;\n"
438+
<< " vec4 Prev = TevColor[0], C0 = TevColor[1], C1 = TevColor[2], C2 = TevColor[3];\n"
409439
<< " vec4 Ras = vec4(0, 0, 0, 1), Tex = vec4(0, 0, 0, 0);\n"
410440
<< " vec4 Konst = vec4(1, 1, 1, 1);\n";
411441

@@ -430,18 +460,13 @@ bool CShaderGenerator::CreatePixelShader(const CMaterial& rkMat)
430460
if (pPass->TexCoordSource() != 0xFF)
431461
ShaderCode << " TevCoord = (Tex" << iPass << ".z == 0.0 ? Tex" << iPass << ".xy : Tex" << iPass << ".xy / Tex" << iPass << ".z);\n";
432462

433-
if (pPass->Texture() != nullptr)
463+
if (pPass->Texture())
434464
ShaderCode << " Tex = texture(Texture" << iPass << ", TevCoord)";
435465

436-
// A couple pass types require special swizzles to access different texture color channels as alpha
437-
if ((PassType == "TRAN") || (PassType == "INCA") || (PassType == "BLOI"))
438-
ShaderCode << ".rgbr";
439-
else if (PassType == "BLOL")
440-
ShaderCode << ".rgbg";
441-
442466
// Apply lightmap multiplier
443-
if ( (PassType == "DIFF") ||
444-
(PassType == "CUST" && (rkMat.Options() & EMaterialOption::Lightmap) && iPass == 0) )
467+
bool UseLightmapMultiplier = (PassType == "DIFF") ||
468+
(PassType == "CUST" && (rkMat.Options() & EMaterialOption::Lightmap) && iPass == 0);
469+
if (UseLightmapMultiplier && pPass->Texture())
445470
ShaderCode << " * LightmapMultiplier";
446471

447472
ShaderCode << ";\n";
@@ -456,27 +481,29 @@ bool CShaderGenerator::CreatePixelShader(const CMaterial& rkMat)
456481
char TevChar = iInput + 0x41; // the current stage number represented as an ASCII letter; eg 0 is 'A'
457482

458483
ShaderCode << " TevIn" << TevChar << " = vec4("
459-
<< gkTevColor[pPass->ColorInput(iInput) & 0xF]
484+
<< GetColorInputExpression(pPass, ETevColorInput(pPass->ColorInput(iInput) & 0xF))
460485
<< ", "
461-
<< gkTevAlpha[pPass->AlphaInput(iInput) & 0x7]
462-
<< ");\n";
486+
<< GetAlphaInputExpression(pPass, ETevAlphaInput(pPass->AlphaInput(iInput) & 0x7))
487+
<< ")";
488+
if (UseLightmapMultiplier && !pPass->Texture() && iInput == 1)
489+
ShaderCode << " * LightmapMultiplier";
490+
ShaderCode << ";\n";
463491
}
464492

465493
ShaderCode << " // RGB Combine\n"
466494
<< " "
467495
<< gkTevRigid[pPass->ColorOutput()]
468496
<< ".rgb = ";
469497

470-
ShaderCode << "clamp(vec3(TevInD.rgb + ((1.0 - TevInC.rgb) * TevInA.rgb + TevInC.rgb * TevInB.rgb))";
471-
if ((PassType == "CLR ") && (Lightmap)) ShaderCode << "* (2.0 - (1.0 - LightmapMultiplier))"; // Apply tevscale 2.0 on the color pass if lightmap is present. Scale so we don't apply if lightmaps are off.
498+
ShaderCode << "clamp(vec3(TevInD.rgb + ((1.0 - TevInC.rgb) * TevInA.rgb + TevInC.rgb * TevInB.rgb)) * " << pPass->TevColorScale();
472499
ShaderCode << ", vec3(0, 0, 0), vec3(1.0, 1.0, 1.0));\n";
473500

474501
ShaderCode << " // Alpha Combine\n"
475502
<< " "
476503
<< gkTevRigid[pPass->AlphaOutput()]
477504
<< ".a = ";
478505

479-
ShaderCode << "clamp(TevInD.a + ((1.0 - TevInC.a) * TevInA.a + TevInC.a * TevInB.a), 0.0, 1.0);\n\n";
506+
ShaderCode << "clamp((TevInD.a + ((1.0 - TevInC.a) * TevInA.a + TevInC.a * TevInB.a)) * " << pPass->TevAlphaScale() << ", 0.0, 1.0);\n\n";
480507
}
481508

482509
if (rkMat.Options() & EMaterialOption::Masked)

src/Core/Render/CGraphics.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ CGraphics::SLightBlock CGraphics::sLightBlock;
2222

2323
CGraphics::ELightingMode CGraphics::sLightMode;
2424
uint32 CGraphics::sNumLights;
25-
const CColor CGraphics::skDefaultAmbientColor = CColor(0.5f, 0.5f, 0.5f, 1.f);
25+
const CColor CGraphics::skDefaultAmbientColor = CColor(0.5f, 0.5f, 0.5f, 0.5f);
2626
CColor CGraphics::sAreaAmbientColor = CColor::skBlack;
2727
float CGraphics::sWorldLightMultiplier;
2828
CLight CGraphics::sDefaultDirectionalLights[3] = {
29-
CLight::BuildDirectional(CVector3f(0), CVector3f (0.f, -0.866025f, -0.5f), CColor(0.3f, 0.3f, 0.3f, 1.f)),
30-
CLight::BuildDirectional(CVector3f(0), CVector3f(-0.75f, 0.433013f, -0.5f), CColor(0.3f, 0.3f, 0.3f, 1.f)),
31-
CLight::BuildDirectional(CVector3f(0), CVector3f( 0.75f, 0.433013f, -0.5f), CColor(0.3f, 0.3f, 0.3f, 1.f))
29+
CLight::BuildDirectional(CVector3f(0), CVector3f (0.f, -0.866025f, -0.5f), CColor(0.3f, 0.3f, 0.3f, 0.3f)),
30+
CLight::BuildDirectional(CVector3f(0), CVector3f(-0.75f, 0.433013f, -0.5f), CColor(0.3f, 0.3f, 0.3f, 0.3f)),
31+
CLight::BuildDirectional(CVector3f(0), CVector3f( 0.75f, 0.433013f, -0.5f), CColor(0.3f, 0.3f, 0.3f, 0.3f))
3232
};
3333

3434
// ************ FUNCTIONS ************
@@ -167,9 +167,11 @@ void CGraphics::SetDefaultLighting()
167167
sDefaultDirectionalLights[0].Load();
168168
sDefaultDirectionalLights[1].Load();
169169
sDefaultDirectionalLights[2].Load();
170+
sNumLights = 0;
170171
UpdateLightBlock();
171172

172173
sVertexBlock.COLOR0_Amb = CColor::skGray;
174+
sVertexBlock.COLOR0_Amb.A = 0.5f;
173175
UpdateVertexBlock();
174176
}
175177

src/Core/Render/CGraphics.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,15 @@ class CGraphics
5656
struct SPixelBlock
5757
{
5858
CColor Konst[4];
59-
CColor TevColor;
59+
CColor TevColor[4];
6060
CColor TintColor;
6161
float LightmapMultiplier;
62+
float Padding[3];
63+
64+
void SetAllTevColors(const CColor& color)
65+
{
66+
std::fill(std::begin(TevColor), std::end(TevColor), color);
67+
}
6268
};
6369
static SPixelBlock sPixelBlock;
6470

src/Core/Render/CRenderer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ void CRenderer::RenderSky(CModel *pSkyboxModel, const SViewInfo& rkViewInfo)
270270

271271
CGraphics::sMVPBlock.ModelMatrix = CMatrix4f::skIdentity;
272272
CGraphics::sVertexBlock.COLOR0_Amb = CColor::skWhite;
273-
CGraphics::sPixelBlock.TevColor = CColor::skWhite;
273+
CGraphics::sPixelBlock.SetAllTevColors(CColor::skWhite);
274274
CGraphics::sPixelBlock.TintColor = CColor::skWhite;
275275
CGraphics::sNumLights = 0;
276276
CGraphics::UpdateVertexBlock();

src/Core/Resource/Area/CGameArea.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ void CGameArea::MergeTerrain()
7979
for (uint32 iSurf = 0; iSurf < SubmeshCount; iSurf++)
8080
{
8181
SSurface *pSurf = pMdl->GetSurface(iSurf);
82-
CMaterial *pMat = mpMaterialSet->MaterialByIndex(pSurf->MaterialID);
82+
CMaterial *pMat = mpMaterialSet->MaterialByIndex(pSurf->MaterialID, false);
8383

8484
bool NewMat = true;
8585
for (std::vector<CStaticModel*>::iterator it = mStaticWorldModels.begin(); it != mStaticWorldModels.end(); it++)

src/Core/Resource/CMaterial.cpp

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3333
CMaterial::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

6350
CMaterial::~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

7161
CMaterial* 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

Comments
 (0)