Skip to content

Commit

Permalink
#5532: Parser is preserving the renderbump arguments after parsing.
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Feb 20, 2021
1 parent 29fc9a1 commit 2206a93
Show file tree
Hide file tree
Showing 7 changed files with 101 additions and 4 deletions.
3 changes: 3 additions & 0 deletions include/ishaders.h
Expand Up @@ -349,6 +349,9 @@ 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
virtual std::string getRenderBumpArguments() = 0;
};

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

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

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

void CShader::realise() {
Expand Down
2 changes: 2 additions & 0 deletions radiantcore/shaders/CShader.h
Expand Up @@ -103,6 +103,8 @@ class CShader
// returns the raw definition block
std::string getDefinition();

std::string getRenderBumpArguments() override;

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

void realise();
Expand Down
24 changes: 20 additions & 4 deletions radiantcore/shaders/ShaderTemplate.cpp
Expand Up @@ -320,23 +320,32 @@ bool ShaderTemplate::parseShaderFlags(parser::DefTokeniser& tokeniser,
{
if (next == "-size")
{
tokeniser.skipTokens(2); // skip width, height
// Store -size argument in the command arguments
_renderBumpArguments += !_renderBumpArguments.empty() ? " " : "";
auto width = tokeniser.nextToken();
auto height = tokeniser.nextToken();
_renderBumpArguments += fmt::format("{0} {1} {2}", next, width, height);
}
else if (next == "-aa")
{
tokeniser.skipTokens(1);
// Store -aa argument in the command arguments
_renderBumpArguments += !_renderBumpArguments.empty() ? " " : "";
_renderBumpArguments += fmt::format("{0} {1}", next, tokeniser.nextToken());
}
else if (next == "-trace")
{
tokeniser.skipTokens(1);
// Store -trace argument in the command arguments
_renderBumpArguments += !_renderBumpArguments.empty() ? " " : "";
_renderBumpArguments += fmt::format("{0} {1}", next, tokeniser.nextToken());
}

next = tokeniser.nextToken();
string::to_lower(next);
}

// The map token is already loaded in "next", skip the highpoly model name
tokeniser.skipTokens(1);
_renderBumpArguments += !_renderBumpArguments.empty() ? " " : "";
_renderBumpArguments += fmt::format("{0} {1}", next, tokeniser.nextToken());
}
else if (token == "renderbumpflat")
{
Expand Down Expand Up @@ -1339,5 +1348,12 @@ int ShaderTemplate::getParseFlags()
return _parseFlags;
}

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

return _renderBumpArguments;
}

} // namespace

5 changes: 5 additions & 0 deletions radiantcore/shaders/ShaderTemplate.h
Expand Up @@ -85,6 +85,8 @@ class ShaderTemplate
// Whether this material renders opaque, perforated, etc.
Material::Coverage _coverage;

std::string _renderBumpArguments;

// Raw material declaration
std::string _blockContents;

Expand Down Expand Up @@ -283,6 +285,9 @@ class ShaderTemplate
// Parser hints
int getParseFlags();

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

private:

// Add the given layer and assigns editor preview layer if applicable
Expand Down
36 changes: 36 additions & 0 deletions test/Materials.cpp
@@ -1,6 +1,10 @@
#include "RadiantTest.h"

#include "ishaders.h"
#include <algorithm>
#include "string/split.h"
#include "string/case_conv.h"
#include "string/trim.h"

namespace test
{
Expand Down Expand Up @@ -150,4 +154,36 @@ TEST_F(MaterialsTest, MaterialParserSpectrum)
EXPECT_EQ(material->getSpectrum(), 100);
}


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

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

auto renderBumpLine = std::find_if(lines.begin(), lines.end(),
[](const std::string& line) { return line.find("renderBump") != 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());

string::trim(args);

EXPECT_EQ(material->getRenderBumpArguments(), 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");
}

}
30 changes: 30 additions & 0 deletions test/resources/tdm/materials/parsertest.mtr
Expand Up @@ -53,3 +53,33 @@ textures/parsertest/spectrumPositive100
{
spectrum 100
}

textures/parsertest/renderBump1
{
renderBump textures/output.tga models/hipoly
}

textures/parsertest/renderBump2
{
renderBump -size 100 200 textures/output.tga models/hipoly
}

textures/parsertest/renderBump3
{
renderBump -aa 2 textures/output.tga models/hipoly
}

textures/parsertest/renderBump4
{
renderBump -aa 2 -size 10 10 textures/output.tga models/hipoly
}

textures/parsertest/renderBump5
{
renderBump -aa 2 -size 10 10 -trace 0.5 textures/output.tga models/hipoly
}

textures/parsertest/renderBump6
{
renderBump -aa 2 -trace 0.5 -size 10 10 textures/output.tga models/hipoly
}

0 comments on commit 2206a93

Please sign in to comment.