Temporary repository used to save branch code
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

#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