Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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));
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
    }
}
Ejemplo n.º 5
0
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);
}