#pragma once #include #include #include // ====================================================================== // Blobtree // ====================================================================== // TODO: allows for holding an global transformation, and apply it to all primitives EXTERN_C struct BS_API blobtree_t { using node_type = internal::runtime_node_t; public: hive nodes{}; using iterator = typename hive::iterator; public: iterator push_primitive_node(const primitive* primitive_ptr); iterator push_operation_node(internal::eNodeOperation op, iterator lhs, iterator rhs); void pop_node(iterator node); }; // ====================================================================== // Baked Blobtree // ====================================================================== EXTERN_C struct BS_API baked_blobtree_t { using node_type = internal::node_t; public: std::vector nodes{}; std::vector leaf_indices{}; std::vector> primitives{}; std::vector> subfaces{}; std::vector> subfaces_of_primitives{}; std::vector subface_types{}; /// subface_type_offsets[i] is the starting index of surface_type(i) in subfaces. /// subface_type_offsets[max_count] equals subfaces.size(). /// Thus, the range of surface_type(i) is [subface_type_offsets[i], subface_type_offsets[i+1]). std::array(surface_type::max_count) + 1> subface_type_offsets{}; public: baked_blobtree_t() = default; baked_blobtree_t(const baked_blobtree_t&) = default; baked_blobtree_t(baked_blobtree_t&&) = default; baked_blobtree_t& operator=(const baked_blobtree_t&) = default; baked_blobtree_t& operator=(baked_blobtree_t&&) = default; ~baked_blobtree_t() = default; baked_blobtree_t(const blobtree_t&) noexcept; size_t get_node_count() const noexcept; size_t get_primitive_count() const noexcept; internal::node_t& get_node(uint32_t index) noexcept; pointer_wrapper get_primitive(uint32_t index) noexcept; };