std::shared_ptr<Texture> Scene::fetchTexture(JsonPtr value, TexelConversion conversion) const { // Note: TexelConversions are only honored by BitmapTexture. // This is inconsistent, but conversions do not really make sense for other textures, // unless the user expects e.g. a ConstantTexture with Vec3 argument to select the green // channel when used in a TransparencyBsdf. if (value.isString()) { return _textureCache->fetchTexture(fetchResource(value), conversion); } else if (value.isNumber()) { return std::make_shared<ConstantTexture>(value.cast<float>()); } else if (value.isArray()) { return std::make_shared<ConstantTexture>(value.cast<Vec3f>()); } else if (value.isObject()) { std::string type = value.castField<std::string>("type"); if (type == "bitmap") return _textureCache->fetchTexture(value, conversion, this); else if (type == "ies") return _textureCache->fetchIesTexture(value, this); else return instantiate<Texture>(value, *this); } else { value.parseError("Type mismatch: Expecting a texture here"); } return nullptr; }
void ConductorBsdf::fromJson(JsonPtr value, const Scene &scene) { Bsdf::fromJson(value, scene); if (value.getField("eta", _eta) && value.getField("k", _k)) _materialName.clear(); if (value.getField("material", _materialName) && !lookupMaterial()) value.parseError(tfm::format("Unable to find material with name '%s'", _materialName)); }
std::shared_ptr<T> findObject(const std::vector<std::shared_ptr<T>> &list, const std::string &name, JsonPtr value) { for (const std::shared_ptr<T> &t : list) if (t->name() == name) return t; value.parseError(tfm::format("Unable to find an object with name '%s'", name)); return nullptr; }
std::shared_ptr<T> fetchObject(const std::vector<std::shared_ptr<T>> &list, const Scene &scene, JsonPtr value) { if (value.isString()) { return findObject(list, value.cast<std::string>(), value); } else if (value.isObject()) { return instantiate<T>(value, scene); } else { value.parseError("Type mismatch: Expecting either an object or an object reference here"); return nullptr; } }
void MixedBsdf::fromJson(JsonPtr value, const Scene &scene) { Bsdf::fromJson(value, scene); _bsdf0 = scene.fetchBsdf(value.getRequiredMember("bsdf0")); _bsdf1 = scene.fetchBsdf(value.getRequiredMember("bsdf1")); if (_bsdf0.get() == this || _bsdf1.get() == this) value.parseError("Recursive mixed BSDF not supported"); if (auto ratio = value["ratio"]) _ratio = scene.fetchTexture(ratio, TexelConversion::REQUEST_AVERAGE); }