#include struct CustomPosition3D { rerun::Position3D position; }; template <> struct rerun::Loggable { static constexpr const ComponentDescriptor Descriptor = ComponentDescriptor( "user.CustomArchetype", "user.CustomArchetype:custom_positions", "user.CustomPosition3D" ); static const std::shared_ptr& arrow_datatype() { return rerun::Loggable::arrow_datatype(); } // TODO(#4257) should take a rerun::Collection instead of pointer and size. static rerun::Result> to_arrow( const CustomPosition3D* instances, size_t num_instances ) { return rerun::Loggable::to_arrow( reinterpret_cast(instances), num_instances ); } }; int main(int argc, char* argv[]) { const auto rec = rerun::RecordingStream("rerun_example_descriptors_custom_component"); rec.spawn().exit_on_failure(); rec.log_static( "data", rerun::ComponentBatch::from_loggable( {1.0f, 2.0f, 3.0f}, rerun::Loggable::Descriptor ) ); // The tags are indirectly checked by the Rust version (have a look over there for more info). }