mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
media: add "options" cvar abstraction
This commit is contained in:
parent
3b5245f974
commit
e9f5a75d4a
3 changed files with 171 additions and 0 deletions
|
|
@ -2,6 +2,8 @@ target_sources(SRB2SDL2 PRIVATE
|
||||||
audio_encoder.hpp
|
audio_encoder.hpp
|
||||||
container.hpp
|
container.hpp
|
||||||
encoder.hpp
|
encoder.hpp
|
||||||
|
options.cpp
|
||||||
|
options.hpp
|
||||||
video_encoder.hpp
|
video_encoder.hpp
|
||||||
video_frame.hpp
|
video_frame.hpp
|
||||||
)
|
)
|
||||||
|
|
|
||||||
118
src/media/options.cpp
Normal file
118
src/media/options.cpp
Normal file
|
|
@ -0,0 +1,118 @@
|
||||||
|
// RING RACERS
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Copyright (C) 2023 by James Robert Roman
|
||||||
|
//
|
||||||
|
// This program is free software distributed under the
|
||||||
|
// terms of the GNU General Public License, version 2.
|
||||||
|
// See the 'LICENSE' file for more details.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
|
#include "../cxxutil.hpp"
|
||||||
|
#include "../m_fixed.h"
|
||||||
|
#include "options.hpp"
|
||||||
|
|
||||||
|
using namespace srb2::media;
|
||||||
|
|
||||||
|
static std::vector<consvar_t*> g_cvars;
|
||||||
|
|
||||||
|
Options::Options(const char* prefix, map_t map) : prefix_(prefix), map_(map)
|
||||||
|
{
|
||||||
|
for (auto& [suffix, cvar] : map_)
|
||||||
|
{
|
||||||
|
cvar.name = strdup(fmt::format("{}_{}", prefix_, suffix).c_str());
|
||||||
|
g_cvars.emplace_back(&cvar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const consvar_t& Options::cvar(const char* option) const
|
||||||
|
{
|
||||||
|
const consvar_t& cvar = map_.at(option);
|
||||||
|
|
||||||
|
SRB2_ASSERT(cvar.string != nullptr);
|
||||||
|
|
||||||
|
return cvar;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
int Options::get<int>(const char* option) const
|
||||||
|
{
|
||||||
|
return cvar(option).value;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
float Options::get<float>(const char* option) const
|
||||||
|
{
|
||||||
|
return FixedToFloat(cvar(option).value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static consvar_t range_cvar(const char* default_value, int32_t min, int32_t max, int32_t flags = 0)
|
||||||
|
{
|
||||||
|
return CVAR_INIT(
|
||||||
|
nullptr,
|
||||||
|
default_value,
|
||||||
|
CV_SAVE | flags,
|
||||||
|
new CV_PossibleValue_t[] {{min, "MIN"}, {max, "MAX"}, {}},
|
||||||
|
nullptr
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
consvar_t Options::range<float>(const char* default_value, float min, float max)
|
||||||
|
{
|
||||||
|
return range_cvar(default_value, FloatToFixed(min), FloatToFixed(max), CV_FLOAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
consvar_t Options::range_min<float>(const char* default_value, float min)
|
||||||
|
{
|
||||||
|
return range_cvar(default_value, FloatToFixed(min), INT32_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
consvar_t Options::range<int>(const char* default_value, int min, int max)
|
||||||
|
{
|
||||||
|
return range_cvar(default_value, min, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
consvar_t Options::range_min<int>(const char* default_value, int min)
|
||||||
|
{
|
||||||
|
return range_cvar(default_value, min, INT32_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
consvar_t Options::value_map<int>(const char* default_value, std::map<const char*, int> values)
|
||||||
|
{
|
||||||
|
auto* arr = new CV_PossibleValue_t[values.size() + 1];
|
||||||
|
|
||||||
|
std::size_t i = 0;
|
||||||
|
|
||||||
|
for (const auto& [k, v] : values)
|
||||||
|
{
|
||||||
|
arr[i].value = v;
|
||||||
|
arr[i].strvalue = k;
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
arr[i].value = 0;
|
||||||
|
arr[i].strvalue = nullptr;
|
||||||
|
|
||||||
|
return CVAR_INIT(nullptr, default_value, CV_SAVE, arr, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void srb2::media::register_options()
|
||||||
|
{
|
||||||
|
for (auto cvar : g_cvars)
|
||||||
|
{
|
||||||
|
CV_RegisterVar(cvar);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_cvars = {};
|
||||||
|
}
|
||||||
51
src/media/options.hpp
Normal file
51
src/media/options.hpp
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
// RING RACERS
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Copyright (C) 2023 by James Robert Roman
|
||||||
|
//
|
||||||
|
// This program is free software distributed under the
|
||||||
|
// terms of the GNU General Public License, version 2.
|
||||||
|
// See the 'LICENSE' file for more details.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifndef __SRB2_MEDIA_OPTIONS_HPP__
|
||||||
|
#define __SRB2_MEDIA_OPTIONS_HPP__
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
#include "../command.h"
|
||||||
|
|
||||||
|
namespace srb2::media
|
||||||
|
{
|
||||||
|
|
||||||
|
class Options
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using map_t = std::unordered_map<const char*, consvar_t>;
|
||||||
|
|
||||||
|
Options(const char* prefix, map_t map);
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T get(const char* option) const;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
static consvar_t range(const char* default_value, T min, T max);
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
static consvar_t range_min(const char* default_value, T min);
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
static consvar_t value_map(const char* default_value, std::map<const char*, T> values);
|
||||||
|
|
||||||
|
private:
|
||||||
|
const char* prefix_;
|
||||||
|
map_t map_;
|
||||||
|
|
||||||
|
const consvar_t& cvar(const char* option) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
void register_options();
|
||||||
|
|
||||||
|
}; // namespace srb2::media
|
||||||
|
|
||||||
|
#endif // __SRB2_MEDIA_OPTIONS_HPP__
|
||||||
Loading…
Add table
Reference in a new issue