Skip to content

Commit

Permalink
#5590: ASE importer is ignoring the *MATERIAL_COUNT now, like the eng…
Browse files Browse the repository at this point in the history
…ine loader
  • Loading branch information
codereader committed Apr 15, 2021
1 parent 0a468b1 commit 4b5ecaa
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 13 deletions.
23 changes: 12 additions & 11 deletions radiantcore/model/import/AseModel.cpp
Expand Up @@ -186,14 +186,15 @@ void AseModel::parseMaterialList(parser::StringTokeniser& tokeniser)
}
else if (token == "*material_count")
{
auto numMaterials = string::convert<std::size_t>(tokeniser.nextToken());
_materials.resize(numMaterials);
// Material count is ignored, we just add every *MATERIAL block we encounter
tokeniser.skipTokens(1);
}
else if (token == "*material")
{
auto index = string::convert<std::size_t>(tokeniser.nextToken());
// The next token must be numeric, but we ignore it
string::convert<std::size_t>(tokeniser.nextToken());

if (index >= _materials.size()) throw parser::ParseException("MATERIAL index out of bounds >= MATERIAL_COUNT");
auto& material = _materials.emplace_back();

tokeniser.assertNextToken("{");
int level = 1;
Expand All @@ -215,7 +216,7 @@ void AseModel::parseMaterialList(parser::StringTokeniser& tokeniser)
/* parse material name */
if (token == "*material_name")
{
_materials[index].materialName = string::trim_copy(tokeniser.nextToken(), "\"");
material.materialName = string::trim_copy(tokeniser.nextToken(), "\"");
}
/* material diffuse map */
else if (token == "*map_diffuse")
Expand All @@ -239,28 +240,28 @@ void AseModel::parseMaterialList(parser::StringTokeniser& tokeniser)
/* parse diffuse map bitmap */
if (token == "*bitmap")
{
_materials[index].diffuseBitmap = string::trim_copy(tokeniser.nextToken(), "\"");
material.diffuseBitmap = string::trim_copy(tokeniser.nextToken(), "\"");
}
else if (token == "*uvw_u_offset")
{
// Negate the u offset value
_materials[index].uOffset = -string::convert<float>(tokeniser.nextToken());
material.uOffset = -string::convert<float>(tokeniser.nextToken());
}
else if (token == "*uvw_v_offset")
{
_materials[index].vOffset = string::convert<float>(tokeniser.nextToken());
material.vOffset = string::convert<float>(tokeniser.nextToken());
}
else if (token == "*uvw_u_tiling")
{
_materials[index].uTiling = string::convert<float>(tokeniser.nextToken());
material.uTiling = string::convert<float>(tokeniser.nextToken());
}
else if (token == "*uvw_v_tiling")
{
_materials[index].vTiling = string::convert<float>(tokeniser.nextToken());
material.vTiling = string::convert<float>(tokeniser.nextToken());
}
else if (token == "*uvw_angle")
{
_materials[index].uvAngle = string::convert<float>(tokeniser.nextToken());
material.uvAngle = string::convert<float>(tokeniser.nextToken());
}
}
} // end map_diffuse block
Expand Down
8 changes: 6 additions & 2 deletions test/Models.cpp
Expand Up @@ -375,8 +375,12 @@ TEST_F(AseImportTest, LoadAseWithWrongMaterialCount)
auto model = GlobalModelCache().getModel("models/darkmod/test/cube_wrong_material_count.ase");
EXPECT_EQ(model->getSurfaceCount(), 4);

auto activeMaterials = model->getActiveMaterials();
std::set<std::string> materials{ activeMaterials.begin(), activeMaterials.end() };
std::set<std::string> materials;

for (auto i = 0; i < model->getSurfaceCount(); ++i)
{
materials.insert(model->getSurface(i).getDefaultMaterial());
}

EXPECT_EQ(materials.count("material01"), 1) << "material01 not found";
EXPECT_EQ(materials.count("material02"), 1) << "material02 not found";
Expand Down

0 comments on commit 4b5ecaa

Please sign in to comment.