You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
3.6 KiB
64 lines
3.6 KiB
#pragma once
|
|
|
|
#include <macros.h>
|
|
|
|
#include "primitive/simple/sphere.hpp"
|
|
#include "primitive/simple/cylinder.hpp"
|
|
#include "primitive/simple/extrude.hpp"
|
|
#include "subface/simple/extrude_polyline_side_face.hpp"
|
|
#include "subface/simple/extrude_helixline_side_face.hpp"
|
|
|
|
using plane_container_t = flat_object_set_mp<internal::plane_t>;
|
|
using sphere_container_t = flat_object_set_mp<internal::sphere_face_t>;
|
|
using cylinder_container_t = flat_object_set_mp<internal::cylinder_face_t>;
|
|
using extrude_polyline_side_container_t = flat_object_set_mp<internal::extrude_polyline_side_face_t>;
|
|
using extrude_helixline_side_container_t = flat_object_set_mp<internal::extrude_helixline_side_face_t>;
|
|
|
|
using plane_geometry_container_t = flat_object_set_mp<plane_descriptor_t>;
|
|
using cylinder_geometry_container_t = flat_object_set_mp<cylinder_descriptor_t>;
|
|
using extrude_polyline_geometry_container_t = flat_object_set_mp<internal::extrude_polyline_geometry_t>;
|
|
using extrude_helixline_geometry_container_t = flat_object_set_mp<internal::extrude_helixline_geometry_t>;
|
|
|
|
EXTERN_C struct PE_API primitive_data_center_t {
|
|
// all other data depend on cached transform_blocks
|
|
using surface_containers = std::variant<plane_container_t, sphere_container_t, cylinder_container_t, extrude_polyline_side_container_t, extrude_helixline_side_container_t>;
|
|
std::array<surface_containers, static_cast<uint8_t>(surface_type::max_count)> surfaces{
|
|
surface_containers{std::in_place_index<0>, plane_container_t{} }, // plane
|
|
surface_containers{std::in_place_index<1>, sphere_container_t{} }, // sphere
|
|
surface_containers{std::in_place_index<2>, cylinder_container_t{} }, // cylinder
|
|
surface_containers{std::in_place_index<0>, plane_container_t{} }, // cone(占位)
|
|
surface_containers{std::in_place_index<3>, extrude_polyline_side_container_t{} }, // extrude_poly
|
|
surface_containers{std::in_place_index<4>, extrude_helixline_side_container_t{}}, // extrude_helix
|
|
};
|
|
|
|
struct geometry_containers {
|
|
plane_geometry_container_t planes{};
|
|
cylinder_geometry_container_t cylinders{};
|
|
extrude_polyline_geometry_container_t extrude_polyline_geoms{};
|
|
extrude_helixline_geometry_container_t extrude_helixline_geoms{};
|
|
}geometries;
|
|
|
|
const plane_descriptor_t* acquire_plane_geometry(const void* geometry);
|
|
void release_plane_geometry(const void* geometry);
|
|
|
|
const cylinder_descriptor_t* acquire_cylinder_geometry(const void* geometry);
|
|
void release_cylinder_geometry(const void* geometry);
|
|
|
|
const internal::extrude_polyline_geometry_t* acquire_extrude_polyline_geometry(const void* geometry);
|
|
void release_extrude_polyline_geometry(const void* geometry);
|
|
|
|
const internal::extrude_helixline_geometry_t* acquire_extrude_helixline_geometry(const void* geometry);
|
|
void release_extrude_helixline_geometry(const void* geometry);
|
|
|
|
void require_surface(surface_type type,
|
|
const internal::paired_model_matrix& matrix,
|
|
const void* geometry_ptr,
|
|
marked_subface_ptr_t<subface>& subface);
|
|
void release_surface(surface_type type, const marked_subface_ptr_t<subface>& subface);
|
|
};
|
|
|
|
namespace internal
|
|
{
|
|
PE_API primitive* new_primitive(primitive_type type, primitive_data_center_t* data_center_ptr);
|
|
PE_API primitive* copy_primitive(primitive* ptr);
|
|
} // namespace internal
|