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; }
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; } }