Files
Aethera/render_3D/render_3D/visual/Splat_Visual.hpp
T
2026-08-29 00:38:34 +08:00

52 lines
1.7 KiB
C++

#pragma once
#include "Basic_Visual.hpp"
#include <vector>
namespace aethera::render_3d {
struct Splat {
Vec3 position{};
Color color{Color::white()};
Vec2 sigma{0.05F, 0.05F};
Coordinate_3D angle{};
bool operator==(const Splat&) const = default;
};
struct Splat_Frame_Tag {};
struct Splat_Frame {
std::vector<Splat> items{}; /* 本次提交的完整 Splat 集合。 */
bool operator==(const Splat_Frame&) const;
};
namespace detail {
struct Splat_Prepared_Data {
std::vector<Prepared_Position> positions{};
std::vector<Prepared_Color> colors{};
std::vector<std::array<float, 2>> sigmas{};
std::vector<float> angles{};
};
struct Splat_Spec {
using Item = Splat;
using Prepared_Data = Splat_Prepared_Data;
[[nodiscard]] static const Datoviz_Visual_Operations& datoviz_operations();
[[nodiscard]] static bool valid(const Item&) noexcept;
static void prepare(const std::vector<Item>&, Prepared_Data&);
};
}
struct Splat_Visual : Def<Splat_Visual, Basic_Visual,
Tagged_Buffer<Splat_Frame_Tag, Splat_Frame>> {
using Visual_Base = Splat_Visual;
using Frame_Tag = Splat_Frame_Tag;
using Frame = Splat_Frame;
using Specification = detail::Splat_Spec;
using Item = typename Specification::Item;
struct Prop : Prev_Prop { bool operator==(const Prop&) const; };
struct State : Prev_State {
std::size_t item_count{}; /* 最近一次发布的输入项数。 */
std::size_t prepared_item_count{}; /* 最近一次 Prepare 的后端项数。 */
std::uint64_t prepared_revision{}; /* 最近一次 Prepare 的提交版本。 */
bool operator==(const State&) const;
};
struct Private;
};
}
#include "Splat_Visual.ipp"