HifiExperimentsimage sampler prop75e2f851 year agoHistory
173 lines · 6.2 KB · C++
RawDownload
////  Sampler.cpp//  libraries/octree/src////  Created by HifiExperiments on 8/21/25//  Copyright 2025 Overte e.V.////  Distributed under the Apache License, Version 2.0.//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html// #include "Sampler.h" #include "QJsonObject" QString wrapModeToString(Sampler::WrapMode mode) {    switch (mode) {        case Sampler::WrapMode::WRAP_REPEAT:            return "repeat";        case Sampler::WrapMode::WRAP_MIRROR:            return "mirror";        case Sampler::WrapMode::WRAP_CLAMP:            return "clamp";        case Sampler::WrapMode::WRAP_BORDER:            return "border";        case Sampler::WrapMode::WRAP_MIRROR_ONCE:            return "mirrorOnce";        default:            return "";    }} Sampler::WrapMode wrapModeFromString(const QString& string) {    if (string == "repeat") {        return Sampler::WrapMode::WRAP_REPEAT;    } else if (string == "mirror") {        return Sampler::WrapMode::WRAP_MIRROR;    } else if (string == "clamp") {        return Sampler::WrapMode::WRAP_CLAMP;    } else if (string == "border") {        return Sampler::WrapMode::WRAP_BORDER;    } else if (string == "mirrorOnce") {        return Sampler::WrapMode::WRAP_MIRROR_ONCE;    }    return Sampler::WrapMode::WRAP_REPEAT;} Sampler Sampler::parseSampler(const QJsonObject& object) {    Sampler::Desc samplerDesc;     auto filterItr = object.constFind("filter");    if (filterItr != object.constEnd() && filterItr->isString()) {        auto filterStr = filterItr->toString();        if (filterStr == "point") {            samplerDesc._filter = Sampler::Filter::FILTER_MIN_MAG_POINT;        } else if (filterStr == "linear") {            samplerDesc._filter = Sampler::Filter::FILTER_MIN_MAG_LINEAR;        }    } else {        auto minFilterItr = object.constFind("minFilter");        auto magFilterItr = object.constFind("magFilter");        if (minFilterItr != object.constEnd() && minFilterItr->isString() && magFilterItr != object.constEnd() &&            magFilterItr->isString()) {            auto minFilterStr = minFilterItr->toString();            auto magFilterStr = magFilterItr->toString();            if (magFilterStr == "point") {                if (minFilterStr == "point") {                    samplerDesc._filter = Sampler::Filter::FILTER_MIN_MAG_POINT;                } else if (minFilterStr == "linear") {                    samplerDesc._filter = Sampler::Filter::FILTER_MIN_LINEAR_MAG_POINT;                } else if (minFilterStr == "mipmapPoint") {                    samplerDesc._filter = Sampler::Filter::FILTER_MIN_MAG_MIP_POINT;                } else if (minFilterStr == "mipmapLinear") {                    samplerDesc._filter = Sampler::Filter::FILTER_MIN_MAG_POINT_MIP_LINEAR;                } else if (minFilterStr == "linearMipmapPoint") {                    samplerDesc._filter = Sampler::Filter::FILTER_MIN_LINEAR_MAG_MIP_POINT;                } else if (minFilterStr == "linearMipmapLinear") {                    samplerDesc._filter = Sampler::Filter::FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR;                }            } else if (magFilterStr == "linear") {                if (minFilterStr == "point") {                    samplerDesc._filter = Sampler::Filter::FILTER_MIN_POINT_MAG_LINEAR;                } else if (minFilterStr == "linear") {                    samplerDesc._filter = Sampler::Filter::FILTER_MIN_MAG_LINEAR;                } else if (minFilterStr == "mipmapPoint") {                    samplerDesc._filter = Sampler::Filter::FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT;                } else if (minFilterStr == "mipmapLinear") {                    samplerDesc._filter = Sampler::Filter::FILTER_MIN_POINT_MAG_MIP_LINEAR;                } else if (minFilterStr == "linearMipmapPoint") {                    samplerDesc._filter = Sampler::Filter::FILTER_MIN_MAG_LINEAR_MIP_POINT;                } else if (minFilterStr == "linearMipmapLinear") {                    samplerDesc._filter = Sampler::Filter::FILTER_MIN_MAG_MIP_LINEAR;                }            }        }    }     auto wrapItr = object.constFind("wrap");    if (wrapItr != object.constEnd() && wrapItr->isString()) {        auto wrapStr = wrapItr->toString();        samplerDesc._wrapModeU = wrapModeFromString(wrapStr);        samplerDesc._wrapModeV = samplerDesc._wrapModeU;    } else {        auto wrapSItr = object.constFind("wrapS");        if (wrapSItr != object.constEnd() && wrapSItr->isString()) {            auto wrapSStr = wrapSItr->toString();            samplerDesc._wrapModeU = wrapModeFromString(wrapSStr);        }         auto wrapTItr = object.constFind("wrapT");        if (wrapTItr != object.constEnd() && wrapTItr->isString()) {            auto wrapTStr = wrapTItr->toString();            samplerDesc._wrapModeV = wrapModeFromString(wrapTStr);        }    }     auto borderColorItr = object.constFind("borderColor");    if (borderColorItr != object.constEnd()) {        samplerDesc._borderColor = vec4FromVariant(borderColorItr->toVariant());    }     return Sampler(samplerDesc);} QDebug& operator<<(QDebug& dbg, const Sampler& s) {    QString result = "[ ";     result += "borderColor: (";    result += s.getBorderColor().r;    result += ", ";    result += s.getBorderColor().g;    result += ", ";    result += s.getBorderColor().b;    result += ", ";    result += s.getBorderColor().a;    result += "), ";     result += "maxAnistropy: ";    result += s.getMaxAnisotropy();    result += ", ";     result += "filter: ";    result += s.getFilter();    result += ", ";     result += "comparisonFunction: ";    result += (uint8_t)s.getComparisonFunction();    result += ", ";     result += "wrap: (";    result += s.getWrapModeU();    result += ", ";    result += s.getWrapModeV();    result += ", ";    result += s.getWrapModeW();    result += "), ";     result += "mipOffset: ";    result += s.getMipOffset();    result += ", ";     result += "minMip: ";    result += s.getMinMip();    result += ", ";     result += "maxMip: ";    result += s.getMaxMip();    result += ", ";     result += "]";    dbg.nospace() << result;    return dbg;}