84 lines
3.9 KiB
C++
84 lines
3.9 KiB
C++
#include <render_3D/Render_3D.hpp>
|
|
#include <gtest/gtest.h>
|
|
#include <algorithm>
|
|
namespace aethera::render_3d {
|
|
namespace {
|
|
template <typename Visual, typename Item>
|
|
void verify_visual(Item valid, Item) {
|
|
using Object = Visual;
|
|
auto built = typename Object::template Builder<Object>{}.build();
|
|
ASSERT_TRUE(built.has_value());
|
|
auto object = std::move(built).value();
|
|
object->template pending_buffer<typename Visual::Frame_Tag>().items =
|
|
std::vector<Item>{valid};
|
|
object->advance();
|
|
EXPECT_EQ(object->template current_buffer<typename Visual::Frame_Tag>()
|
|
.items.size(), 1U);
|
|
}
|
|
}
|
|
TEST(Render_3D_Visual, Migrated_Families_Build_And_Validate) {
|
|
verify_visual<Point_Visual>(Point{}, Point{.diameter_px = 0.0F});
|
|
verify_visual<Splat_Visual>(Splat{}, Splat{.sigma = {0.0F, 0.0F}});
|
|
verify_visual<Pixel_Visual>(Pixel{}, Pixel{.size_px = 0.0F});
|
|
verify_visual<Marker_Visual>(Marker{}, Marker{.diameter_px = 0.0F});
|
|
verify_visual<Sphere_Visual>(Sphere{}, Sphere{.radius = 0.0F});
|
|
verify_visual<Segment_Visual>(Segment{}, Segment{.width_px = 0.0F});
|
|
verify_visual<Vector_Visual>(Vector_Glyph{}, Vector_Glyph{.width_px = 0.0F});
|
|
verify_visual<Primitive_Visual>(Primitive_Vertex{}, Primitive_Vertex{.position = {NAN, 0.0F, 0.0F}});
|
|
verify_visual<Mesh_Visual>(Mesh_Vertex{}, Mesh_Vertex{.normal = {NAN, 0.0F, 0.0F}});
|
|
verify_visual<Path_Visual>(Path_Vertex{}, Path_Vertex{.width_px = 0.0F});
|
|
verify_visual<Image_Visual>(Image{}, Image{.extent = {0.0F, 0.0F}});
|
|
verify_visual<Labels_Visual>(Label{}, Label{.extent = {0.0F, 0.0F}});
|
|
verify_visual<Glyph_Visual>(Glyph{}, Glyph{.angle = NAN});
|
|
verify_visual<Text_Visual>(Text_Label{.text = "A"}, Text_Label{});
|
|
verify_visual<Volume_Visual>(Voxel{}, Voxel{.value = NAN});
|
|
}
|
|
TEST(Render_3D_Scene, Builder_Instantiates_Async_Paint_Contract) {
|
|
using Visual_Object = Point_Visual;
|
|
using Scene_Object = Render_Scene_3D;
|
|
auto visual_result = typename Visual_Object::template Builder<Visual_Object>{}.build();
|
|
ASSERT_TRUE(visual_result.has_value());
|
|
auto visual = std::move(visual_result).value();
|
|
auto camera = *Camera_3D::Builder<Camera_3D>{}.build();
|
|
auto axes = *Axes_3D::Builder<Axes_3D>{}.build();
|
|
typename Scene_Object::template Builder<Scene_Object> scene_builder;
|
|
scene_builder.add_renderable(not_null{visual.get()})
|
|
.add_camera(not_null{camera.get()})
|
|
.add_axes(not_null{axes.get()});
|
|
static_assert(std::same_as<decltype(scene_builder.build()), std::expected<std::unique_ptr<Scene_Object>, Dependency_Graph_Error>>);
|
|
}
|
|
TEST(Render_3D_Visual, Prepared_Data_Preserves_Datoviz_Attributes) {
|
|
detail::Mesh_Prepared_Data mesh;
|
|
detail::Mesh_Spec::prepare(
|
|
std::vector<Mesh_Vertex>{{.texture_coordinate = {0.25F, 0.75F}}},
|
|
mesh);
|
|
ASSERT_EQ(mesh.texture_coordinates.size(), 1U);
|
|
EXPECT_EQ(mesh.texture_coordinates.front(),
|
|
(std::array<float, 2>{0.25F, 0.75F}));
|
|
|
|
detail::Image_Prepared_Data image;
|
|
detail::Image_Spec::prepare(
|
|
std::vector<Image>{{.texture_rectangle = {0.1F, 0.2F, 0.8F, 0.9F}}},
|
|
image);
|
|
EXPECT_EQ(image.texture_rectangles.front(),
|
|
(std::array<float, 4>{0.1F, 0.2F, 0.8F, 0.9F}));
|
|
|
|
detail::Glyph_Prepared_Data glyph;
|
|
detail::Glyph_Spec::prepare(std::vector<Glyph>{{
|
|
.bounds = {-1.0F, -2.0F, 3.0F, 4.0F},
|
|
.texture_coordinates = {0.0F, 0.1F, 0.9F, 1.0F},
|
|
.angle = 0.5F}}, glyph);
|
|
EXPECT_EQ(glyph.bounds.front(),
|
|
(std::array<float, 4>{-1.0F, -2.0F, 3.0F, 4.0F}));
|
|
EXPECT_EQ(glyph.texture_coordinates.front(),
|
|
(std::array<float, 4>{0.0F, 0.1F, 0.9F, 1.0F}));
|
|
|
|
detail::Text_Prepared_Data text;
|
|
detail::Text_Spec::prepare(
|
|
std::vector<Text_Label>{{.text = "dynamic", .size_px = 23.0F}}, text);
|
|
ASSERT_EQ(text.strings.size(), 1U);
|
|
EXPECT_EQ(text.strings.front(), "dynamic");
|
|
EXPECT_FLOAT_EQ(text.sizes.front(), 23.0F);
|
|
}
|
|
}
|