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