fix exception if model having invalid variable texture passed to modelviewer
This commit is contained in:
parent
417521e94f
commit
98a3971e13
@ -79,6 +79,33 @@ void ModelViewer::act(float delta) {
|
|||||||
camera.position = center - camera.front * distance;
|
camera.position = center - camera.front * distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static util::TextureRegion determine_texture_region(
|
||||||
|
const Assets& assets, const std::string& texture
|
||||||
|
) {
|
||||||
|
static std::array<std::string, 6> faces {
|
||||||
|
"blocks:dbg_north",
|
||||||
|
"blocks:dbg_south",
|
||||||
|
"blocks:dbg_top",
|
||||||
|
"blocks:dbg_bottom",
|
||||||
|
"blocks:dbg_west",
|
||||||
|
"blocks:dbg_east",
|
||||||
|
};
|
||||||
|
|
||||||
|
if (texture.length() < 2 || texture.at(0) != '$') {
|
||||||
|
return util::get_texture_region(assets, texture, "blocks:notfound");
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char sideIndex = texture.at(1) - '0';
|
||||||
|
if (sideIndex < faces.size()) {
|
||||||
|
return util::get_texture_region(
|
||||||
|
assets,
|
||||||
|
faces.at(texture.at(1) - '0'),
|
||||||
|
"blocks:notfound"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return util::get_texture_region(assets, "blocks:notfound", "");
|
||||||
|
}
|
||||||
|
|
||||||
void ModelViewer::draw(const DrawContext& pctx, const Assets& assets) {
|
void ModelViewer::draw(const DrawContext& pctx, const Assets& assets) {
|
||||||
camera.setAspectRatio(size.x / size.y);
|
camera.setAspectRatio(size.x / size.y);
|
||||||
camera.updateVectors();
|
camera.updateVectors();
|
||||||
@ -104,26 +131,10 @@ void ModelViewer::draw(const DrawContext& pctx, const Assets& assets) {
|
|||||||
ui3dShader.uniformMatrix("u_apply", glm::mat4(1.0f));
|
ui3dShader.uniformMatrix("u_apply", glm::mat4(1.0f));
|
||||||
ui3dShader.uniformMatrix("u_projview", camera.getProjView());
|
ui3dShader.uniformMatrix("u_projview", camera.getProjView());
|
||||||
batch->begin();
|
batch->begin();
|
||||||
|
|
||||||
for (const auto& mesh : model->meshes) {
|
for (const auto& mesh : model->meshes) {
|
||||||
util::TextureRegion region;
|
auto region = determine_texture_region(assets, mesh.texture);
|
||||||
if (!mesh.texture.empty() && mesh.texture[0] == '$') {
|
|
||||||
// todo: refactor
|
|
||||||
static std::array<std::string, 6> faces {
|
|
||||||
"blocks:dbg_north",
|
|
||||||
"blocks:dbg_south",
|
|
||||||
"blocks:dbg_top",
|
|
||||||
"blocks:dbg_bottom",
|
|
||||||
"blocks:dbg_west",
|
|
||||||
"blocks:dbg_east",
|
|
||||||
};
|
|
||||||
region = util::get_texture_region(
|
|
||||||
assets,
|
|
||||||
faces.at(mesh.texture.at(1) - '0'),
|
|
||||||
"blocks:notfound"
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
region = util::get_texture_region(assets, mesh.texture, "blocks:notfound");
|
|
||||||
}
|
|
||||||
batch->texture(region.texture);
|
batch->texture(region.texture);
|
||||||
batch->setRegion(region.region);
|
batch->setRegion(region.region);
|
||||||
for (const auto& vertex : mesh.vertices) {
|
for (const auto& vertex : mesh.vertices) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user