Skip to content

Commit

Permalink
#5532: Parser is preserving the renderbumpflat arguments after parsing.
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Feb 20, 2021
1 parent 43c377f commit 7870ee9
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 16 deletions.
5 changes: 4 additions & 1 deletion include/ishaders.h
Expand Up @@ -350,8 +350,11 @@ class Material
// Returns the flags set by the material parser
virtual int getParseFlags() const = 0;

// Returns the argument string after the renderbump keyword, or an empty string if no renderbump statement is present
// Returns the argument string after the renderbump keyword, or an empty string if no statement is present
virtual std::string getRenderBumpArguments() = 0;

// Returns the argument string after the renderbumpflat keyword, or an empty string if no statement is present
virtual std::string getRenderBumpFlatArguments() = 0;
};

typedef std::shared_ptr<Material> MaterialPtr;
Expand Down
5 changes: 5 additions & 0 deletions radiantcore/shaders/CShader.cpp
Expand Up @@ -208,6 +208,11 @@ std::string CShader::getRenderBumpArguments()
return _template->getRenderBumpArguments();
}

std::string CShader::getRenderBumpFlatArguments()
{
return _template->getRenderBumpFlagArguments();
}

// -----------------------------------------

void CShader::realise() {
Expand Down
1 change: 1 addition & 0 deletions radiantcore/shaders/CShader.h
Expand Up @@ -104,6 +104,7 @@ class CShader
std::string getDefinition();

std::string getRenderBumpArguments() override;
std::string getRenderBumpFlatArguments() override;

// -----------------------------------------

Expand Down
21 changes: 19 additions & 2 deletions radiantcore/shaders/ShaderTemplate.cpp
Expand Up @@ -343,9 +343,10 @@ bool ShaderTemplate::parseShaderFlags(parser::DefTokeniser& tokeniser,
string::to_lower(next);
}

// The map token is already loaded in "next", skip the highpoly model name
// The map token is already loaded in "next", add the highpoly model name
_renderBumpArguments += !_renderBumpArguments.empty() ? " " : "";
_renderBumpArguments += fmt::format("{0} {1}", next, tokeniser.nextToken());
string::trim(_renderBumpArguments);
}
else if (token == "renderbumpflat")
{
Expand All @@ -357,8 +358,17 @@ bool ShaderTemplate::parseShaderFlags(parser::DefTokeniser& tokeniser,
// Skip over the optional args
if (next == "-size")
{
tokeniser.skipTokens(3); // skip width, height and model
auto width = tokeniser.nextToken();
auto height = tokeniser.nextToken();
_renderBumpFlatArguments += fmt::format("{0} {1} {2}", next, width, height);

next = tokeniser.nextToken();
}

// The highpoly model token is already loaded in "next"
_renderBumpFlatArguments += !_renderBumpFlatArguments.empty() ? " " : "";
_renderBumpFlatArguments += next;
string::trim(_renderBumpFlatArguments);
}
else if (token == "ambientrimcolor")
{
Expand Down Expand Up @@ -1355,5 +1365,12 @@ std::string ShaderTemplate::getRenderBumpArguments()
return _renderBumpArguments;
}

std::string ShaderTemplate::getRenderBumpFlagArguments()
{
if (!_parsed) parseDefinition();

return _renderBumpFlatArguments;
}

} // namespace

4 changes: 4 additions & 0 deletions radiantcore/shaders/ShaderTemplate.h
Expand Up @@ -86,6 +86,7 @@ class ShaderTemplate
Material::Coverage _coverage;

std::string _renderBumpArguments;
std::string _renderBumpFlatArguments;

// Raw material declaration
std::string _blockContents;
Expand Down Expand Up @@ -287,6 +288,9 @@ class ShaderTemplate

// renderbump argument string
std::string getRenderBumpArguments();

// renderbumpflat argument string
std::string getRenderBumpFlagArguments();

private:

Expand Down
39 changes: 26 additions & 13 deletions test/Materials.cpp
Expand Up @@ -154,36 +154,49 @@ TEST_F(MaterialsTest, MaterialParserSpectrum)
EXPECT_EQ(material->getSpectrum(), 100);
}


inline void checkRenderBumpArguments(const std::string& materialName)
inline void checkRenderBumpArguments(const std::string& materialName, const std::string& keyword)
{
auto material = GlobalMaterialManager().getMaterialForName(materialName);

auto fullDefinition = material->getDefinition();
std::vector<std::string> lines;
string::split(lines, fullDefinition, "\n", true);

std::string keywordLower = string::to_lower_copy(keyword);
auto renderBumpLine = std::find_if(lines.begin(), lines.end(),
[](const std::string& line) { return line.find("renderBump") != std::string::npos; });
[&](const std::string& line) { return string::to_lower_copy(line).find(keywordLower) != std::string::npos; });

EXPECT_NE(renderBumpLine, lines.end());
string::to_lower(*renderBumpLine);

std::string renderBumpKeyword = "renderbump";
auto args = renderBumpLine->substr(renderBumpLine->find(renderBumpKeyword) + renderBumpKeyword.size());
std::string line = *renderBumpLine;
auto args = line.substr(string::to_lower_copy(line).find(keywordLower) + keywordLower.size());

string::trim(args);

EXPECT_EQ(material->getRenderBumpArguments(), args);
if (keyword == "renderbump")
{
EXPECT_EQ(material->getRenderBumpArguments(), args);
}
else
{
EXPECT_EQ(material->getRenderBumpFlatArguments(), args);
}
}

TEST_F(MaterialsTest, MaterialParserRenderbump)
{
checkRenderBumpArguments("textures/parsertest/renderBump1");
checkRenderBumpArguments("textures/parsertest/renderBump2");
checkRenderBumpArguments("textures/parsertest/renderBump3");
checkRenderBumpArguments("textures/parsertest/renderBump4");
checkRenderBumpArguments("textures/parsertest/renderBump5");
checkRenderBumpArguments("textures/parsertest/renderBump6");
checkRenderBumpArguments("textures/parsertest/renderBump1", "renderbump");
checkRenderBumpArguments("textures/parsertest/renderBump2", "renderbump");
checkRenderBumpArguments("textures/parsertest/renderBump3", "renderbump");
checkRenderBumpArguments("textures/parsertest/renderBump4", "renderbump");
checkRenderBumpArguments("textures/parsertest/renderBump5", "renderbump");
checkRenderBumpArguments("textures/parsertest/renderBump6", "renderbump");
}

TEST_F(MaterialsTest, MaterialParserRenderbumpFlat)
{
checkRenderBumpArguments("textures/parsertest/renderBumpFlat1", "renderbumpflat");
checkRenderBumpArguments("textures/parsertest/renderBumpFlat2", "renderbumpflat");
}

}
11 changes: 11 additions & 0 deletions test/resources/tdm/materials/parsertest.mtr
Expand Up @@ -83,3 +83,14 @@ textures/parsertest/renderBump6
{
renderBump -aa 2 -trace 0.5 -size 10 10 textures/output.tga models/hipoly
}

textures/parsertest/renderBumpFlat1
{
renderBumpflat -size 200 100 models/hipoly
}

textures/parsertest/renderBumpFlat2
{
renderBumpflat models/hipoly
}

0 comments on commit 7870ee9

Please sign in to comment.