diff --git a/.gitignore b/.gitignore index cfd415d..cb98e60 100644 --- a/.gitignore +++ b/.gitignore @@ -89,6 +89,8 @@ StyleCopReport.xml *.ilk *.meta *.obj +# Exception: track 3D mesh files in resources +!resources/**/*.obj *.idb *.iobj *.pch diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a00788..2d0bd4d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,15 +3,13 @@ cmake_minimum_required(VERSION 3.16) project(circus VERSION 0.1.0 LANGUAGES CXX) add_compile_definitions(_LIBCPP_DISABLE_AVAILABILITY) -set(LIBRARY ${PROJECT_NAME}) -set(EXECUTABLE ${PROJECT_NAME}-main) +set(LIBRARY ${PROJECT_NAME}-lib) +set(EXECUTABLE ${PROJECT_NAME}) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/.clangd" - "CompileFlags:\n CompilationDatabase: ${CMAKE_CURRENT_BINARY_DIR}\n") add_compile_definitions(PROJECT_ROOT="${CMAKE_SOURCE_DIR}") include(FetchContent) @@ -36,6 +34,11 @@ find_package(Qt6 REQUIRED COMPONENTS Core Widgets OpenGLWidgets) find_package(nlohmann_json QUIET) find_package(CURL QUIET) +# Generate .clangd configuration after dependencies are found +get_target_property(EIGEN_INCLUDE_DIR Eigen3::Eigen INTERFACE_INCLUDE_DIRECTORIES) +file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/.clangd" + "CompileFlags:\n CompilationDatabase: ${CMAKE_CURRENT_BINARY_DIR}\n Add:\n - -I${CMAKE_CURRENT_SOURCE_DIR}/include\n - -isystem${EIGEN_INCLUDE_DIR}\n") + # -------------------- yaml-cpp (config -> module -> manual) [robust] set(_YAML_HINT "/opt/homebrew/opt/yaml-cpp") find_package(yaml-cpp CONFIG QUIET) @@ -119,8 +122,8 @@ endif() # ======================= CIRCUS LIBRARY ============================================================ # -------------------- Collect sources and split into: core, main, bindings -set(_src_dir "${CMAKE_SOURCE_DIR}/Src") -set(_include_dir "${CMAKE_SOURCE_DIR}/Include") +set(_src_dir "${CMAKE_SOURCE_DIR}/src") +set(_include_dir "${CMAKE_SOURCE_DIR}/include") # Source files file(GLOB_RECURSE SOURCES ${_src_dir}/*.cpp) @@ -201,16 +204,20 @@ include(CMakePackageConfigHelpers) include(GNUInstallDirs) # 1. Install the library target and headers -set_target_properties(${LIBRARY} PROPERTIES PUBLIC_HEADER "${HEADERS}") install(TARGETS ${LIBRARY} EXPORT ${LIBRARY}Targets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} ) +# Install headers preserving directory structure +install(DIRECTORY ${_include_dir}/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} + FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" +) + # 2. Generate the relocatable package config file in the build directory configure_package_config_file( # creates config file for find_package "cmake/config.cmake.in" diff --git a/Include/Robot.h b/Include/Robot.h deleted file mode 100644 index 606a8e5..0000000 --- a/Include/Robot.h +++ /dev/null @@ -1,456 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Camera.h" -#include "Constants.h" -#include "Container.h" -#include "Imu.h" -#include "Joint.h" -#include "MujocoContext.h" -#include "Pose.h" - -#define MAX_MSG_SIZE 1048576 // 1MB -namespace spqr { - -struct Team; // Forward declaration - -class Robot { - public: - Robot(const std::string& name, const std::string& type, uint8_t number, - const Eigen::Vector3d& initPosition, const Eigen::Vector3d& initOrientation, - const std::shared_ptr& team) - : name(name), - type(type), - number(number), - initPosition(initPosition), - initOrientation(initOrientation), - team(team) {} - virtual ~Robot() = default; - virtual void bindMujoco(MujocoContext* mujContext) = 0; - virtual void update() = 0; - virtual void receiveMessage(const std::map& message) = 0; - virtual std::map sendMessage() = 0; - - std::string name; - std::string type; - uint8_t number; - Eigen::Vector3d initPosition; - Eigen::Vector3d initOrientation; // Euler angles - std::unique_ptr container; - std::shared_ptr team; - - msgpack::zone buffer_zone_; -}; - -class T1 : public Robot { - public: - Pose* pose = nullptr; - Imu* imu = nullptr; - Joints* joints = nullptr; - std::array cameras = {}; - - T1(const std::string& name, const std::string& type, uint8_t number, const Eigen::Vector3d& initPosition, - const Eigen::Vector3d& initOrientation, const std::shared_ptr& team) - : Robot(name, type, number, initPosition, initOrientation, team), - joint_map{{JointValue::HEAD_YAW, name + "_AAHead_yaw"}, - {JointValue::HEAD_PITCH, name + "_Head_pitch"}, - {JointValue::SHOULDER_LEFT_PITCH, name + "_Left_Shoulder_Pitch"}, - {JointValue::SHOULDER_LEFT_ROLL, name + "_Left_Shoulder_Roll"}, - {JointValue::ELBOW_LEFT_PITCH, name + "_Left_Elbow_Pitch"}, - {JointValue::ELBOW_LEFT_YAW, name + "_Left_Elbow_Yaw"}, - {JointValue::SHOULDER_RIGHT_PITCH, name + "_Right_Shoulder_Pitch"}, - {JointValue::SHOULDER_RIGHT_ROLL, name + "_Right_Shoulder_Roll"}, - {JointValue::ELBOW_RIGHT_PITCH, name + "_Right_Elbow_Pitch"}, - {JointValue::ELBOW_RIGHT_YAW, name + "_Right_Elbow_Yaw"}, - {JointValue::WAIST, name + "_Waist"}, - {JointValue::HIP_LEFT_PITCH, name + "_Left_Hip_Pitch"}, - {JointValue::HIP_LEFT_ROLL, name + "_Left_Hip_Roll"}, - {JointValue::HIP_LEFT_YAW, name + "_Left_Hip_Yaw"}, - {JointValue::KNEE_LEFT_PITCH, name + "_Left_Knee_Pitch"}, - {JointValue::ANKLE_LEFT_PITCH, name + "_Left_Ankle_Pitch"}, - {JointValue::ANKLE_LEFT_ROLL, name + "_Left_Ankle_Roll"}, - {JointValue::HIP_RIGHT_PITCH, name + "_Right_Hip_Pitch"}, - {JointValue::HIP_RIGHT_ROLL, name + "_Right_Hip_Roll"}, - {JointValue::HIP_RIGHT_YAW, name + "_Right_Hip_Yaw"}, - {JointValue::KNEE_RIGHT_PITCH, name + "_Right_Knee_Pitch"}, - {JointValue::ANKLE_RIGHT_PITCH, name + "_Right_Ankle_Pitch"}, - {JointValue::ANKLE_RIGHT_ROLL, name + "_Right_Ankle_Roll"}} {} - - void bindMujoco(MujocoContext* mujCtx) override { - pose = new Pose(mujCtx->model, mujCtx->data, (name + "_position").c_str(), - (name + "_orientation").c_str()); - imu = new Imu(mujCtx->model, mujCtx->data, (name + "_linear-acceleration").c_str(), - (name + "_angular-velocity").c_str()); - joints = new Joints(mujCtx->model, mujCtx->data, joint_map); - cameras[0] = new Camera(mujCtx, (name + "_left_cam").c_str()); - cameras[1] = new Camera(mujCtx, (name + "_right_cam").c_str()); - } - - void receiveMessage(const std::map& message) override { - auto it = message.find("joint_torques"); - if (it == message.end()) { - throw std::runtime_error("Error: 'joint_torques' key not found in message"); - return; - } - - std::vector joint_torques = it->second.as>(); - - if (joint_torques.size() != joint_map.size()) { - throw std::runtime_error("Error: joint_torques size (" + std::to_string(joint_torques.size()) - + ") doesn't match number of joints (" + std::to_string(joint_map.size()) - + ")"); - } - - std::unordered_map torque_map; - size_t i = 0; - for (const auto& [joint_value, joint_name] : joint_map) { - torque_map[joint_value] = joint_torques[i++]; - } - - joints->set_torque(torque_map); - } - - std::map sendMessage() override { - buffer_zone_.clear(); - std::map msg; - msg["robot_name"] = msgpack::object(name, buffer_zone_); - msg["pose"] = pose->serialize(buffer_zone_); - msg["imu"] = imu->serialize(buffer_zone_); - msg["joints"] = joints->serialize(buffer_zone_); - - return msg; - } - - void update() override { - pose->update(); - imu->update(); - joints->update(); - /* - cameras[0]->update(); - cameras[1]->update(); - */ - } - - ~T1() = default; - - private: - std::map joint_map; -}; - -class K1 : public Robot { - public: - Pose* pose = nullptr; - Imu* imu; - Joints* joints = nullptr; - std::array cameras = {}; - - K1(const std::string& name, const std::string& type, uint8_t number, const Eigen::Vector3d& initPosition, - const Eigen::Vector3d& initOrientation, const std::shared_ptr& team) - : Robot(name, type, number, initPosition, initOrientation, team), - joint_map{{JointValue::HEAD_YAW, name + "_AAHead_yaw"}, - {JointValue::HEAD_PITCH, name + "_Head_pitch"}, - {JointValue::SHOULDER_LEFT_PITCH, name + "_ALeft_Shoulder_Pitch"}, - {JointValue::SHOULDER_LEFT_ROLL, name + "_Left_Shoulder_Roll"}, - {JointValue::ELBOW_LEFT_PITCH, name + "_Left_Elbow_Pitch"}, - {JointValue::ELBOW_LEFT_YAW, name + "_Left_Elbow_Yaw"}, - {JointValue::SHOULDER_RIGHT_ROLL, name + "_Right_Shoulder_Roll"}, - {JointValue::SHOULDER_RIGHT_PITCH, name + "_ARight_Shoulder_Pitch"}, - {JointValue::ELBOW_RIGHT_PITCH, name + "_Right_Elbow_Pitch"}, - {JointValue::ELBOW_RIGHT_YAW, name + "_Right_Elbow_Yaw"}, - {JointValue::HIP_LEFT_PITCH, name + "_Left_Hip_Pitch"}, - {JointValue::HIP_LEFT_ROLL, name + "_Left_Hip_Roll"}, - {JointValue::HIP_LEFT_YAW, name + "_Left_Hip_Yaw"}, - {JointValue::KNEE_LEFT_PITCH, name + "_Left_Knee_Pitch"}, - {JointValue::ANKLE_LEFT_PITCH, name + "_Left_Ankle_Pitch"}, - {JointValue::ANKLE_LEFT_ROLL, name + "_Left_Ankle_Roll"}, - {JointValue::HIP_RIGHT_PITCH, name + "_Right_Hip_Pitch"}, - {JointValue::HIP_RIGHT_ROLL, name + "_Right_Hip_Roll"}, - {JointValue::HIP_RIGHT_YAW, name + "_Right_Hip_Yaw"}, - {JointValue::KNEE_RIGHT_PITCH, name + "_Right_Knee_Pitch"}, - {JointValue::ANKLE_RIGHT_PITCH, name + "_Right_Ankle_Pitch"}, - {JointValue::ANKLE_RIGHT_ROLL, name + "_Right_Ankle_Roll"}} {} - - void bindMujoco(MujocoContext* mujCtx) override { - pose = new Pose(mujCtx->model, mujCtx->data, (name + "_position").c_str(), - (name + "_orientation").c_str()); - imu = new Imu(mujCtx->model, mujCtx->data, (name + "_linear-acceleration").c_str(), - (name + "_angular-velocity").c_str()); - joints = new Joints(mujCtx->model, mujCtx->data, joint_map); - cameras[0] = new Camera(mujCtx, (name + "_left_cam").c_str()); - cameras[1] = new Camera(mujCtx, (name + "_right_cam").c_str()); - } - - void receiveMessage(const std::map& message) override { - std::cout << "Hi I'm " << name << " message received: {"; - bool first = true; - for (const auto& [key, val] : message) { - if (!first) - std::cout << ", "; - std::cout << key << ": " << val; - first = false; - } - std::cout << "}" << std::endl; - } - - std::map sendMessage() override { - buffer_zone_.clear(); - std::map msg; - msg["robot_name"] = msgpack::object(name, buffer_zone_); - msg["pose"] = pose->serialize(buffer_zone_); - msg["imu"] = imu->serialize(buffer_zone_); - msg["joints"] = joints->serialize(buffer_zone_); - - return msg; - } - - void update() override { - pose->update(); - imu->update(); - joints->update(); - /* - cameras[0]->update(); - cameras[1]->update(); - */ - } - - ~K1() = default; - - private: - std::map joint_map; -}; - -class RobotManager { - public: - // Singleton class - static RobotManager& instance() { - static RobotManager mgr; - return mgr; - } - - void registerRobot(std::shared_ptr robot) { - std::lock_guard lock(mutex_); - - robots_.push_back(std::move(robot)); - } - - std::vector> getRobots() const { - std::lock_guard lock(mutex_); - return robots_; - } - - size_t count() const { - std::lock_guard lock(mutex_); - return robots_.size(); - } - - void update() { - std::lock_guard lock(mutex_); - for (std::shared_ptr r : robots_) { - r->update(); - } - } - - void clear() { - std::lock_guard lock(mutex_); - for (std::shared_ptr r : robots_) { - // Drop ownership first - r->container.reset(); - r->team.reset(); - } - robots_.clear(); - } - - void bindMujoco(MujocoContext* mujContext) { - for (std::shared_ptr r : robots_) - r->bindMujoco(mujContext); - } - - std::shared_ptr create(const std::string& name, const std::string& type, uint8_t number, - const Eigen::Vector3d& pos, const Eigen::Vector3d& ori, - const std::shared_ptr team) { - auto it = robotFactory.find(type); - if (it != robotFactory.end()) - return it->second(name, type, number, pos, ori, team); - return nullptr; - } - - void startContainers() { - startCommunicationServer(frameworkCommunicationPort); - - YAML::Node configRoot; - try { - configRoot = YAML::LoadFile(frameworkConfigPath); - } catch (const YAML::BadFile& e) { - throw std::runtime_error("Failed to open YAML file: " + std::string(frameworkConfigPath)); - } catch (const YAML::ParserException& e) { - throw std::runtime_error("Failed to parse YAML file: " + std::string(e.what())); - } - - if (!configRoot["image"]) - throw std::runtime_error("Missing 'image' key in YAML file"); - - std::string image; - try { - image = configRoot["image"].as(); - } catch (const YAML::Exception& e) { - throw std::runtime_error("'image' must be a string: " + std::string(e.what())); - } - - if (!configRoot["volumes"] || !configRoot["volumes"].IsSequence()) - throw std::runtime_error("'volumes' key missing or not a sequence"); - - std::vector binds; - for (const auto& v : configRoot["volumes"]) { - try { - binds.push_back(v.as()); - } catch (const YAML::Exception& e) { - throw std::runtime_error("Volume entry must be a string: " + std::string(e.what())); - } - } - - for (std::shared_ptr r : robots_) { - r->container = std::make_unique(r->name + "_container"); - r->container->create(r->name, image, binds); - r->container->start(); - } - } - - void startCommunicationServer(int port) { - if (serverRunning_) - throw std::runtime_error("Server already running"); - serverRunning_ = true; - serverThread_ = std::thread(&RobotManager::_serverInternal, this, port); - } - - void stopCommunicationServer() { - if (!serverRunning_) - return; - - serverRunning_ = false; - - if (serverThread_.joinable()) - serverThread_.join(); - } - - private: - RobotManager() = default; - ~RobotManager() = default; - - RobotManager(const RobotManager&) = delete; - RobotManager& operator=(const RobotManager&) = delete; - - void _serverInternal(int port) { - int server_fd = socket(AF_INET, SOCK_STREAM, 0); - if (server_fd < 0) - throw std::runtime_error("Failed to create socket"); - - int opt = 1; - setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); - - sockaddr_in address{}; - address.sin_family = AF_INET; - address.sin_addr.s_addr = INADDR_ANY; - address.sin_port = htons(port); - - if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) - throw std::runtime_error("Socket bind failed"); - if (listen(server_fd, robots_.size()) < 0) - throw std::runtime_error("Listen failed"); - - std::vector fds; - fds.push_back({server_fd, POLLIN, 0}); - - // Using a polling server. It isn't immediately intuitive, but it is efficient for this use case. - while (serverRunning_) { - // the poll blocks until a new connection arrives on server_fd or data arrives in one of the - // monitored fd or a socket closes or the timeout expires. - int ret = poll(fds.data(), fds.size(), 100); - if (ret <= 0) - continue; // Timeout, skip iteration (timeout necessary to check whether serverRunning_ is - // still true) - - for (size_t i = 0; i < fds.size(); ++i) { - // An event occured for the i-th fd - if (fds[i].revents & POLLIN) { - if (fds[i].fd == server_fd) { - // The only event for the server is someone knocking - int client_fd = accept(server_fd, nullptr, nullptr); - if (client_fd >= 0) - fds.push_back({client_fd, POLLIN, 0}); - } else { - // The events for other fds indicate either an incoming message or a closed connection - // the read call disambiguates the two cases - char buffer[MAX_MSG_SIZE]; - int n = read(fds[i].fd, buffer, sizeof(buffer) - 1); - if (n <= 0) { - close(fds[i].fd); - fds.erase(fds.begin() + i); - --i; - continue; - } - - msgpack::object_handle oh = msgpack::unpack(buffer, n); - auto data_map = oh.get().as>(); - auto it = data_map.find("robot_name"); - if (it == data_map.end()) - continue; - - std::string messageRecipient = it->second.as(); - - std::unique_lock lock(mutex_); - for (auto& r : robots_) { - if (r->name == messageRecipient) { - r->receiveMessage(data_map); - auto answ = r->sendMessage(); - msgpack::sbuffer sbuf; - msgpack::pack(sbuf, answ); - send(fds[i].fd, sbuf.data(), sbuf.size(), 0); - break; - } - } - } - } - } - } - - for (auto& fd : fds) - close(fd.fd); - } - - std::atomic serverRunning_ = false; - std::thread serverThread_; - - mutable std::mutex mutex_; - std::vector> robots_; - - using RobotCreator = std::function(const std::string&, const std::string&, uint8_t, - const Eigen::Vector3d&, const Eigen::Vector3d&, - const std::shared_ptr&)>; - - std::unordered_map robotFactory = { - {"Booster-K1", [](auto&& name, auto&& type, uint8_t number, auto&& pos, auto&& ori, - auto&& team) { return std::make_shared(name, type, number, pos, ori, team); }}, - {"Booster-T1", [](auto&& name, auto&& type, uint8_t number, auto&& pos, auto&& ori, auto&& team) { - return std::make_shared(name, type, number, pos, ori, team); - }}}; -}; - -} // namespace spqr diff --git a/README.md b/README.md index 4c3fabd..2d4d1ce 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # circus
- circus Logo + circus Logo
**circus** is a multi-platform humanoid robot soccer simulator built on top of MuJoCo. It supports mixed teams of robots, enabling realistic and flexible RoboCup simulations. Designed for research and development, circus provides accurate physics, advanced robot models, and seamless integration across operating systems. @@ -13,7 +13,7 @@ This project uses pixi to declare and reproduce the build/runtime dependency env #### Overview - pixi manages the environment and dependencies defined in [pixi.toml](pixi.toml). - CMake is used to configure and build the native C++ targets defined in [CMakeLists.txt](CMakeLists.txt). -- The main executable target is `main` (entrypoint: [Src/main.cpp](Src/main.cpp)) and is placed in the build directory. +- The main executable target is `main` (entrypoint: [src/main.cpp](src/main.cpp)) and is placed in the build directory. #### Prerequisites - pixi installed (install following pixi project documentation). @@ -34,4 +34,4 @@ pixi run main ### Links - pixi configuration: [pixi.toml](pixi.toml) - Build configuration: [CMakeLists.txt](CMakeLists.txt) -- C++ entrypoint: [Src/main.cpp](Src/main.cpp) +- C++ entrypoint: [src/main.cpp](src/main.cpp) diff --git a/Assets/logo.png b/assets/logo.png similarity index 100% rename from Assets/logo.png rename to assets/logo.png diff --git a/Include/AppWindow.h b/include/AppWindow.h similarity index 100% rename from Include/AppWindow.h rename to include/AppWindow.h diff --git a/Include/CircusApplication.h b/include/CircusApplication.h similarity index 100% rename from Include/CircusApplication.h rename to include/CircusApplication.h diff --git a/Include/Constants.h b/include/Constants.h similarity index 80% rename from Include/Constants.h rename to include/Constants.h index ca70fa2..8d82b80 100644 --- a/Include/Constants.h +++ b/include/Constants.h @@ -4,6 +4,6 @@ namespace spqr { constexpr const char* appName = "Circus Simulator"; constexpr unsigned initialWindowWidth = 800; constexpr unsigned initialWindowHeight = 600; -constexpr const char* frameworkConfigPath = "Resources/config/framework_config.yaml"; +constexpr const char* frameworkConfigPath = "resources/config/framework_config.yaml"; constexpr int frameworkCommunicationPort = 5555; } // namespace spqr diff --git a/Include/Container.h b/include/Container.h similarity index 100% rename from Include/Container.h rename to include/Container.h diff --git a/Include/MujocoContext.h b/include/MujocoContext.h similarity index 100% rename from Include/MujocoContext.h rename to include/MujocoContext.h diff --git a/include/RobotManager.h b/include/RobotManager.h new file mode 100644 index 0000000..0400fc8 --- /dev/null +++ b/include/RobotManager.h @@ -0,0 +1,249 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Constants.h" +#include "MujocoContext.h" +#include "robots/BoosterK1.h" +#include "robots/BoosterT1.h" +#include "robots/Robot.h" + +#define MAX_MSG_SIZE 1048576 // 1MB +namespace spqr { + +struct Team; // Forward declaration + +class RobotManager { + public: + // Singleton class + static RobotManager& instance() { + static RobotManager mgr; + return mgr; + } + + void registerRobot(std::shared_ptr robot) { + std::lock_guard lock(mutex_); + + robots_.push_back(std::move(robot)); + } + + std::vector> getRobots() const { + std::lock_guard lock(mutex_); + return robots_; + } + + size_t count() const { + std::lock_guard lock(mutex_); + return robots_.size(); + } + + void update() { + std::lock_guard lock(mutex_); + for (std::shared_ptr r : robots_) { + r->update(); + } + } + + void clear() { + std::lock_guard lock(mutex_); + for (std::shared_ptr r : robots_) { + // Drop ownership first + r->container.reset(); + r->team.reset(); + } + robots_.clear(); + } + + void bindMujoco(MujocoContext* mujContext) { + for (std::shared_ptr r : robots_) + r->bindMujoco(mujContext); + } + + std::shared_ptr create(const std::string& name, const std::string& type, uint8_t number, + const Eigen::Vector3d& pos, const Eigen::Vector3d& ori, + const std::shared_ptr team) { + auto it = robotFactory.find(type); + if (it != robotFactory.end()) + return it->second(name, type, number, pos, ori, team); + return nullptr; + } + + void startContainers() { + startCommunicationServer(frameworkCommunicationPort); + + YAML::Node configRoot; + try { + configRoot = YAML::LoadFile(frameworkConfigPath); + } catch (const YAML::BadFile& e) { + throw std::runtime_error("Failed to open YAML file: " + std::string(frameworkConfigPath)); + } catch (const YAML::ParserException& e) { + throw std::runtime_error("Failed to parse YAML file: " + std::string(e.what())); + } + + if (!configRoot["image"]) + throw std::runtime_error("Missing 'image' key in YAML file"); + + std::string image; + try { + image = configRoot["image"].as(); + } catch (const YAML::Exception& e) { + throw std::runtime_error("'image' must be a string: " + std::string(e.what())); + } + + if (!configRoot["volumes"] || !configRoot["volumes"].IsSequence()) + throw std::runtime_error("'volumes' key missing or not a sequence"); + + std::vector binds; + for (const auto& v : configRoot["volumes"]) { + try { + binds.push_back(v.as()); + } catch (const YAML::Exception& e) { + throw std::runtime_error("Volume entry must be a string: " + std::string(e.what())); + } + } + + for (std::shared_ptr r : robots_) { + r->container = std::make_unique(r->name + "_container"); + r->container->create(r->name, image, binds); + r->container->start(); + } + } + + void startCommunicationServer(int port) { + if (serverRunning_) + throw std::runtime_error("Server already running"); + serverRunning_ = true; + serverThread_ = std::thread(&RobotManager::_serverInternal, this, port); + } + + void stopCommunicationServer() { + if (!serverRunning_) + return; + + serverRunning_ = false; + + if (serverThread_.joinable()) + serverThread_.join(); + } + + private: + RobotManager() = default; + ~RobotManager() = default; + + RobotManager(const RobotManager&) = delete; + RobotManager& operator=(const RobotManager&) = delete; + + void _serverInternal(int port) { + int server_fd = socket(AF_INET, SOCK_STREAM, 0); + if (server_fd < 0) + throw std::runtime_error("Failed to create socket"); + + int opt = 1; + setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + + sockaddr_in address{}; + address.sin_family = AF_INET; + address.sin_addr.s_addr = INADDR_ANY; + address.sin_port = htons(port); + + if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) + throw std::runtime_error("Socket bind failed"); + if (listen(server_fd, robots_.size()) < 0) + throw std::runtime_error("Listen failed"); + + std::vector fds; + fds.push_back({server_fd, POLLIN, 0}); + + // Using a polling server. It isn't immediately intuitive, but it is efficient for this use case. + while (serverRunning_) { + // the poll blocks until a new connection arrives on server_fd or data arrives in one of the + // monitored fd or a socket closes or the timeout expires. + int ret = poll(fds.data(), fds.size(), 100); + if (ret <= 0) + continue; // Timeout, skip iteration (timeout necessary to check whether serverRunning_ is + // still true) + + for (size_t i = 0; i < fds.size(); ++i) { + // An event occured for the i-th fd + if (fds[i].revents & POLLIN) { + if (fds[i].fd == server_fd) { + // The only event for the server is someone knocking + int client_fd = accept(server_fd, nullptr, nullptr); + if (client_fd >= 0) + fds.push_back({client_fd, POLLIN, 0}); + } else { + // The events for other fds indicate either an incoming message or a closed connection + // the read call disambiguates the two cases + char buffer[MAX_MSG_SIZE]; + int n = read(fds[i].fd, buffer, sizeof(buffer) - 1); + if (n <= 0) { + close(fds[i].fd); + fds.erase(fds.begin() + i); + --i; + continue; + } + + msgpack::object_handle oh = msgpack::unpack(buffer, n); + auto data_map = oh.get().as>(); + auto it = data_map.find("robot_name"); + if (it == data_map.end()) + continue; + + std::string messageRecipient = it->second.as(); + + std::unique_lock lock(mutex_); + for (auto& r : robots_) { + if (r->name == messageRecipient) { + r->receiveMessage(data_map); + auto answ = r->sendMessage(); + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, answ); + send(fds[i].fd, sbuf.data(), sbuf.size(), 0); + break; + } + } + } + } + } + } + + for (auto& fd : fds) + close(fd.fd); + } + + std::atomic serverRunning_ = false; + std::thread serverThread_; + + mutable std::mutex mutex_; + std::vector> robots_; + + using RobotCreator = std::function(const std::string&, const std::string&, uint8_t, + const Eigen::Vector3d&, const Eigen::Vector3d&, + const std::shared_ptr&)>; + + std::unordered_map robotFactory + = {{"Booster-K1", + [](auto&& name, auto&& type, uint8_t number, auto&& pos, auto&& ori, auto&& team) { + return std::make_shared(name, type, number, pos, ori, team); + }}, + {"Booster-T1", [](auto&& name, auto&& type, uint8_t number, auto&& pos, auto&& ori, auto&& team) { + return std::make_shared(name, type, number, pos, ori, team); + }}}; +}; + +} // namespace spqr diff --git a/Include/SceneParser.h b/include/SceneParser.h similarity index 97% rename from Include/SceneParser.h rename to include/SceneParser.h index 14d2cb2..75a8b08 100644 --- a/Include/SceneParser.h +++ b/include/SceneParser.h @@ -8,8 +8,8 @@ #include #include -#include "Robot.h" #include "Team.h" +#include "robots/Robot.h" using namespace pugi; using namespace std; diff --git a/Include/SimulationThread.h b/include/SimulationThread.h similarity index 100% rename from Include/SimulationThread.h rename to include/SimulationThread.h diff --git a/Include/SimulationViewport.h b/include/SimulationViewport.h similarity index 100% rename from Include/SimulationViewport.h rename to include/SimulationViewport.h diff --git a/Include/Team.h b/include/Team.h similarity index 96% rename from Include/Team.h rename to include/Team.h index 4743c25..d80f852 100644 --- a/Include/Team.h +++ b/include/Team.h @@ -3,7 +3,8 @@ #include #include -#include "Robot.h" +#include "RobotManager.h" +#include "robots/Robot.h" namespace spqr { diff --git a/include/robots/BoosterK1.h b/include/robots/BoosterK1.h new file mode 100644 index 0000000..e8e0d22 --- /dev/null +++ b/include/robots/BoosterK1.h @@ -0,0 +1,113 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "MujocoContext.h" +#include "robots/Robot.h" +#include "sensors/Camera.h" +#include "sensors/Imu.h" +#include "sensors/Joint.h" +#include "sensors/Pose.h" + +#define MAX_MSG_SIZE 1048576 // 1MB +namespace spqr { + +struct Team; // Forward declaration + +class BoosterK1 : public Robot { + public: + Pose* pose = nullptr; + Imu* imu; + Joints* joints = nullptr; + std::array cameras = {}; + + BoosterK1(const std::string& name, const std::string& type, uint8_t number, + const Eigen::Vector3d& initPosition, const Eigen::Vector3d& initOrientation, + const std::shared_ptr& team) + : Robot(name, type, number, initPosition, initOrientation, team), + joint_map{{JointValue::HEAD_YAW, name + "_AAHead_yaw"}, + {JointValue::HEAD_PITCH, name + "_Head_pitch"}, + {JointValue::SHOULDER_LEFT_PITCH, name + "_ALeft_Shoulder_Pitch"}, + {JointValue::SHOULDER_LEFT_ROLL, name + "_Left_Shoulder_Roll"}, + {JointValue::ELBOW_LEFT_PITCH, name + "_Left_Elbow_Pitch"}, + {JointValue::ELBOW_LEFT_YAW, name + "_Left_Elbow_Yaw"}, + {JointValue::SHOULDER_RIGHT_ROLL, name + "_Right_Shoulder_Roll"}, + {JointValue::SHOULDER_RIGHT_PITCH, name + "_ARight_Shoulder_Pitch"}, + {JointValue::ELBOW_RIGHT_PITCH, name + "_Right_Elbow_Pitch"}, + {JointValue::ELBOW_RIGHT_YAW, name + "_Right_Elbow_Yaw"}, + {JointValue::HIP_LEFT_PITCH, name + "_Left_Hip_Pitch"}, + {JointValue::HIP_LEFT_ROLL, name + "_Left_Hip_Roll"}, + {JointValue::HIP_LEFT_YAW, name + "_Left_Hip_Yaw"}, + {JointValue::KNEE_LEFT_PITCH, name + "_Left_Knee_Pitch"}, + {JointValue::ANKLE_LEFT_PITCH, name + "_Left_Ankle_Pitch"}, + {JointValue::ANKLE_LEFT_ROLL, name + "_Left_Ankle_Roll"}, + {JointValue::HIP_RIGHT_PITCH, name + "_Right_Hip_Pitch"}, + {JointValue::HIP_RIGHT_ROLL, name + "_Right_Hip_Roll"}, + {JointValue::HIP_RIGHT_YAW, name + "_Right_Hip_Yaw"}, + {JointValue::KNEE_RIGHT_PITCH, name + "_Right_Knee_Pitch"}, + {JointValue::ANKLE_RIGHT_PITCH, name + "_Right_Ankle_Pitch"}, + {JointValue::ANKLE_RIGHT_ROLL, name + "_Right_Ankle_Roll"}} {} + + void bindMujoco(MujocoContext* mujCtx) override { + pose = new Pose(mujCtx->model, mujCtx->data, (name + "_position").c_str(), + (name + "_orientation").c_str()); + imu = new Imu(mujCtx->model, mujCtx->data, (name + "_linear-acceleration").c_str(), + (name + "_angular-velocity").c_str()); + joints = new Joints(mujCtx->model, mujCtx->data, joint_map); + cameras[0] = new Camera(mujCtx, (name + "_left_cam").c_str()); + cameras[1] = new Camera(mujCtx, (name + "_right_cam").c_str()); + } + + void receiveMessage(const std::map& message) override { + std::cout << "Hi I'm " << name << " message received: {"; + bool first = true; + for (const auto& [key, val] : message) { + if (!first) + std::cout << ", "; + std::cout << key << ": " << val; + first = false; + } + std::cout << "}" << std::endl; + } + + std::map sendMessage() override { + buffer_zone_.clear(); + std::map msg; + msg["robot_name"] = msgpack::object(name, buffer_zone_); + msg["pose"] = pose->serialize(buffer_zone_); + msg["imu"] = imu->serialize(buffer_zone_); + msg["joints"] = joints->serialize(buffer_zone_); + + return msg; + } + + void update() override { + pose->update(); + imu->update(); + joints->update(); + /* + cameras[0]->update(); + cameras[1]->update(); + */ + } + + ~BoosterK1() = default; + + private: + std::map joint_map; +}; + +} // namespace spqr diff --git a/include/robots/BoosterT1.h b/include/robots/BoosterT1.h new file mode 100644 index 0000000..dc6e706 --- /dev/null +++ b/include/robots/BoosterT1.h @@ -0,0 +1,126 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "MujocoContext.h" +#include "robots/Robot.h" +#include "sensors/Camera.h" +#include "sensors/Imu.h" +#include "sensors/Joint.h" +#include "sensors/Pose.h" + +#define MAX_MSG_SIZE 1048576 // 1MB +namespace spqr { + +struct Team; // Forward declaration + +class BoosterT1 : public Robot { + public: + Pose* pose = nullptr; + Imu* imu = nullptr; + Joints* joints = nullptr; + std::array cameras = {}; + + BoosterT1(const std::string& name, const std::string& type, uint8_t number, + const Eigen::Vector3d& initPosition, const Eigen::Vector3d& initOrientation, + const std::shared_ptr& team) + : Robot(name, type, number, initPosition, initOrientation, team), + joint_map{{JointValue::HEAD_YAW, name + "_AAHead_yaw"}, + {JointValue::HEAD_PITCH, name + "_Head_pitch"}, + {JointValue::SHOULDER_LEFT_PITCH, name + "_Left_Shoulder_Pitch"}, + {JointValue::SHOULDER_LEFT_ROLL, name + "_Left_Shoulder_Roll"}, + {JointValue::ELBOW_LEFT_PITCH, name + "_Left_Elbow_Pitch"}, + {JointValue::ELBOW_LEFT_YAW, name + "_Left_Elbow_Yaw"}, + {JointValue::SHOULDER_RIGHT_PITCH, name + "_Right_Shoulder_Pitch"}, + {JointValue::SHOULDER_RIGHT_ROLL, name + "_Right_Shoulder_Roll"}, + {JointValue::ELBOW_RIGHT_PITCH, name + "_Right_Elbow_Pitch"}, + {JointValue::ELBOW_RIGHT_YAW, name + "_Right_Elbow_Yaw"}, + {JointValue::WAIST, name + "_Waist"}, + {JointValue::HIP_LEFT_PITCH, name + "_Left_Hip_Pitch"}, + {JointValue::HIP_LEFT_ROLL, name + "_Left_Hip_Roll"}, + {JointValue::HIP_LEFT_YAW, name + "_Left_Hip_Yaw"}, + {JointValue::KNEE_LEFT_PITCH, name + "_Left_Knee_Pitch"}, + {JointValue::ANKLE_LEFT_PITCH, name + "_Left_Ankle_Pitch"}, + {JointValue::ANKLE_LEFT_ROLL, name + "_Left_Ankle_Roll"}, + {JointValue::HIP_RIGHT_PITCH, name + "_Right_Hip_Pitch"}, + {JointValue::HIP_RIGHT_ROLL, name + "_Right_Hip_Roll"}, + {JointValue::HIP_RIGHT_YAW, name + "_Right_Hip_Yaw"}, + {JointValue::KNEE_RIGHT_PITCH, name + "_Right_Knee_Pitch"}, + {JointValue::ANKLE_RIGHT_PITCH, name + "_Right_Ankle_Pitch"}, + {JointValue::ANKLE_RIGHT_ROLL, name + "_Right_Ankle_Roll"}} {} + + void bindMujoco(MujocoContext* mujCtx) override { + pose = new Pose(mujCtx->model, mujCtx->data, (name + "_position").c_str(), + (name + "_orientation").c_str()); + imu = new Imu(mujCtx->model, mujCtx->data, (name + "_linear-acceleration").c_str(), + (name + "_angular-velocity").c_str()); + joints = new Joints(mujCtx->model, mujCtx->data, joint_map); + cameras[0] = new Camera(mujCtx, (name + "_left_cam").c_str()); + cameras[1] = new Camera(mujCtx, (name + "_right_cam").c_str()); + } + + void receiveMessage(const std::map& message) override { + auto it = message.find("joint_torques"); + if (it == message.end()) { + throw std::runtime_error("Error: 'joint_torques' key not found in message"); + return; + } + + std::vector joint_torques = it->second.as>(); + + if (joint_torques.size() != joint_map.size()) { + throw std::runtime_error("Error: joint_torques size (" + std::to_string(joint_torques.size()) + + ") doesn't match number of joints (" + std::to_string(joint_map.size()) + + ")"); + } + + std::unordered_map torque_map; + size_t i = 0; + for (const auto& [joint_value, joint_name] : joint_map) { + torque_map[joint_value] = joint_torques[i++]; + } + + joints->set_torque(torque_map); + } + + std::map sendMessage() override { + buffer_zone_.clear(); + std::map msg; + msg["robot_name"] = msgpack::object(name, buffer_zone_); + msg["pose"] = pose->serialize(buffer_zone_); + msg["imu"] = imu->serialize(buffer_zone_); + msg["joints"] = joints->serialize(buffer_zone_); + + return msg; + } + + void update() override { + pose->update(); + imu->update(); + joints->update(); + /* + cameras[0]->update(); + cameras[1]->update(); + */ + } + + ~BoosterT1() = default; + + private: + std::map joint_map; +}; + +} // namespace spqr diff --git a/include/robots/Robot.h b/include/robots/Robot.h new file mode 100644 index 0000000..f319591 --- /dev/null +++ b/include/robots/Robot.h @@ -0,0 +1,52 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "Container.h" +#include "MujocoContext.h" + +#define MAX_MSG_SIZE 1048576 // 1MB +namespace spqr { + +struct Team; // Forward declaration + +class Robot { + public: + Robot(const std::string& name, const std::string& type, uint8_t number, + const Eigen::Vector3d& initPosition, const Eigen::Vector3d& initOrientation, + const std::shared_ptr& team) + : name(name), + type(type), + number(number), + initPosition(initPosition), + initOrientation(initOrientation), + team(team) {} + virtual ~Robot() = default; + virtual void bindMujoco(MujocoContext* mujContext) = 0; + virtual void update() = 0; + virtual void receiveMessage(const std::map& message) = 0; + virtual std::map sendMessage() = 0; + + std::string name; + std::string type; + uint8_t number; + Eigen::Vector3d initPosition; + Eigen::Vector3d initOrientation; // Euler angles + std::unique_ptr container; + std::shared_ptr team; + + msgpack::zone buffer_zone_; +}; + +} // namespace spqr diff --git a/Include/Camera.h b/include/sensors/Camera.h similarity index 97% rename from Include/Camera.h rename to include/sensors/Camera.h index 9d0ae37..4e65b84 100644 --- a/Include/Camera.h +++ b/include/sensors/Camera.h @@ -5,7 +5,8 @@ #include #include "MujocoContext.h" -#include "Sensor.h" +#include "sensors/Sensor.h" + namespace spqr { class Camera : public Sensor { diff --git a/Include/Imu.h b/include/sensors/Imu.h similarity index 98% rename from Include/Imu.h rename to include/sensors/Imu.h index e44081b..fa9c071 100644 --- a/Include/Imu.h +++ b/include/sensors/Imu.h @@ -4,7 +4,7 @@ #include -#include "Sensor.h" +#include "sensors/Sensor.h" namespace spqr { diff --git a/Include/Joint.h b/include/sensors/Joint.h similarity index 99% rename from Include/Joint.h rename to include/sensors/Joint.h index 8ec6153..82dd6ad 100644 --- a/Include/Joint.h +++ b/include/sensors/Joint.h @@ -8,7 +8,7 @@ #include #include -#include "Sensor.h" +#include "sensors/Sensor.h" namespace spqr { diff --git a/Include/Pose.h b/include/sensors/Pose.h similarity index 99% rename from Include/Pose.h rename to include/sensors/Pose.h index 8ca7414..9f5c284 100644 --- a/Include/Pose.h +++ b/include/sensors/Pose.h @@ -4,7 +4,7 @@ #include -#include "Sensor.h" +#include "sensors/Sensor.h" namespace spqr { diff --git a/Include/Sensor.h b/include/sensors/Sensor.h similarity index 99% rename from Include/Sensor.h rename to include/sensors/Sensor.h index 8faabac..013dd1c 100644 --- a/Include/Sensor.h +++ b/include/sensors/Sensor.h @@ -3,6 +3,7 @@ #include #include #include + class Sensor { public: virtual ~Sensor() = default; diff --git a/pixi.lock b/pixi.lock index 510e401..437a9b3 100644 --- a/pixi.lock +++ b/pixi.lock @@ -11,7 +11,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://prefix.dev/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda - conda: https://prefix.dev/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda - conda: https://prefix.dev/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda @@ -22,59 +22,59 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - conda: https://prefix.dev/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://prefix.dev/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda - conda: https://prefix.dev/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/harfbuzz-12.1.0-h15599e2_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/harfbuzz-12.2.0-h15599e2_0.conda - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://prefix.dev/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-h1aa0949_0.conda - conda: https://prefix.dev/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libboost-1.88.0-hed09d94_5.conda + - conda: https://prefix.dev/conda-forge/linux-64/libboost-1.88.0-hed09d94_6.conda - conda: https://prefix.dev/conda-forge/linux-64/libccd-double-2.1-h59595ed_3.conda - - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.3-default_h99862b1_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libclang13-21.1.3-default_h746c552_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.5-default_h99862b1_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libclang13-21.1.5-default_h746c552_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda - - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.16.0-h4e3cde8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda - conda: https://prefix.dev/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libglib-2.86.0-h1fed272_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libglib-2.86.1-h32235b2_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.4-hf7376ad_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.5-hf7376ad_0.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/libmujoco-3.3.2-h31df9c7_4.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmujoco-3.3.3-h31df9c7_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libpq-18.0-h3675c94_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda - - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda - - conda: https://prefix.dev/conda-forge/linux-64/libtiff-4.7.1-h8261f1e_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.1-he9a06e4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libvulkan-loader-1.4.328.1-h5279c79_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libxkbcommon-1.12.2-hca5e8e5_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxkbcommon-1.13.0-hca5e8e5_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda @@ -82,37 +82,37 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/msgpack-cxx-7.0.0-h2285874_1.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://prefix.dev/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda - conda: https://prefix.dev/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - conda: https://prefix.dev/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://prefix.dev/conda-forge/linux-64/pugixml-1.15-h3f63f65_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.12.12-hd63d673_1_cpython.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://prefix.dev/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://prefix.dev/conda-forge/linux-64/qt6-main-6.9.3-h5c1c036_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/qt6-main-6.9.3-h5c1c036_1.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://prefix.dev/conda-forge/linux-64/tinyxml2-11.0.0-h3f2d84a_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/wayland-1.24.0-h3e06ad9_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda - conda: https://prefix.dev/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda - - conda: https://prefix.dev/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xcb-util-cursor-0.1.6-hb03c661_0.conda - conda: https://prefix.dev/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda - conda: https://prefix.dev/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda - conda: https://prefix.dev/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda - conda: https://prefix.dev/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/xkeyboard-config-2.45-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xkeyboard-config-2.46-hb03c661_0.conda - conda: https://prefix.dev/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda - conda: https://prefix.dev/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda @@ -121,11 +121,11 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda - conda: . - subdir: linux-64 + build: hb0f4dca_0 osx-arm64: - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://prefix.dev/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cairo-1.18.4-h6a3b0d2_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/cyrus-sasl-2.1.28-ha1cbb27_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/double-conversion-3.3.1-h286801f_0.conda @@ -135,48 +135,50 @@ environments: - conda: https://prefix.dev/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/fontconfig-2.15.0-h1383a14_1.conda - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://prefix.dev/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/freetype-2.14.1-hce30654_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/harfbuzz-12.1.0-haf38c7b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/harfbuzz-12.2.0-haf38c7b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libboost-1.88.0-h18cd856_6.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libccd-double-2.1-h9a09cb3_2.tar.bz2 - conda: https://prefix.dev/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_h73dfc95_5.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libclang13-21.1.4-default_h6e8f826_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.16.0-hdece5d2_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.4-hf598326_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libdeflate-1.24-h5773f1b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libclang13-21.1.5-default_h6e8f826_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.5-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libfreetype-2.14.1-hce30654_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libfreetype6-2.14.1-h6da58f4_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.1-he69a767_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.1-he69a767_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libjpeg-turbo-3.1.0-h5505292_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm21-21.1.4-h8e0c9ce_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm21-21.1.5-h8e0c9ce_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libmujoco-3.3.2-hba1c1e0_4.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libmujoco-3.3.3-h2f9c0ae_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libntlm-1.8-h5505292_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libpng-1.6.50-h280e0eb_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libpq-18.0-h31f7a3a_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.0-h8adb53f_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libtiff-4.7.1-h7dc4979_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/lodepng-20220109-hf86a087_0.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-arm64/msgpack-cxx-7.0.0-h33cdd7a_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openldap-2.6.10-hbe55e7a_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.5.4-h5503f6c_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.46-h7125dd6_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/pugixml-1.15-hd3d436d_0.conda @@ -186,12 +188,12 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/qt6-main-6.9.3-hb266e41_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tinyxml2-11.0.0-ha1acc90_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-cpp-0.8.0-ha1acc90_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda - conda: . - subdir: osx-arm64 + build: h60d57d3_0 packages: - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 @@ -260,22 +262,14 @@ packages: license_family: MIT size: 179696 timestamp: 1744128058734 -- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda - sha256: 3b5ad78b8bb61b6cdc0978a6a99f8dfb2cc789a451378d054698441005ecbdb6 - md5: f9e5fbc24009179e8b0409624691758a +- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + sha256: b986ba796d42c9d3265602bc038f6f5264095702dd546c14bc684e60c385e773 + md5: f0991f0f84902f6b6009b4d2350a83aa depends: - __unix license: ISC - size: 155907 - timestamp: 1759649036195 -- conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda - sha256: 837b795a2bb39b75694ba910c13c15fa4998d4bb2a622c214a6a5174b2ae53d1 - md5: 74784ee3d225fc3dca89edb635b4e5cc - depends: - - __unix - license: ISC - size: 154402 - timestamp: 1754210968730 + size: 152432 + timestamp: 1762967197890 - conda: https://prefix.dev/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda sha256: 3bd6a391ad60e471de76c0e9db34986c4b5058587fbf2efa5a7f54645e28c2c7 md5: 09262e66b19567aff4f592fb53b28760 @@ -322,38 +316,41 @@ packages: - conda: . name: circus version: 0.1.0 - build: hbf21a9e_0 - subdir: linux-64 + build: h60d57d3_0 + subdir: osx-arm64 depends: - - libstdcxx >=15 - - libgcc >=15 + - libcxx >=21 + - libcurl >=8.14.1,<9.0a0 - pugixml >=1.15,<1.16.0a0 - python_abi 3.12.* *_cp312 - yaml-cpp >=0.8.0,<0.9.0a0 - - libcurl >=8.16.0,<9.0a0 - - qt6-main >=6.9.3,<6.10.0a0 - - libmujoco >=3.3.2,<3.3.3.0a0 - - libgl >=1.7.0,<2.0a0 + - qt6-main >=6.9.2,<6.10.0a0 + - libmujoco >=3.3.3,<3.3.4.0a0 - msgpack-cxx >=7.0.0,<8.0a0 - libboost >=1.88.0,<1.89.0a0 input: - hash: e5f397e18171cf3b88087aacde98fa17dc2c573f0ee2125ac60821667fbee362 + hash: 437c06546add47ddca9e551d94285b5132628f0499d716ab173f5ff45291aa8b globs: [] - conda: . name: circus version: 0.1.0 - build: hbf21a9e_0 - subdir: osx-arm64 + build: hb0f4dca_0 + subdir: linux-64 depends: - - libcxx >=21 + - libstdcxx >=15 + - libgcc >=15 + - libmujoco >=3.3.3,<3.3.4.0a0 + - libcurl >=8.14.1,<9.0a0 - pugixml >=1.15,<1.16.0a0 - python_abi 3.12.* *_cp312 - yaml-cpp >=0.8.0,<0.9.0a0 - - libcurl >=8.16.0,<9.0a0 - - qt6-main >=6.9.3,<6.10.0a0 - - libmujoco >=3.3.2,<3.3.3.0a0 + - qt6-main >=6.9.2,<6.10.0a0 + - msgpack-cxx >=7.0.0,<8.0a0 + - libboost >=1.88.0,<1.89.0a0 + - libgl >=1.7.0,<2.0a0 + - libegl >=1.7.0,<2.0a0 input: - hash: e5f397e18171cf3b88087aacde98fa17dc2c573f0ee2125ac60821667fbee362 + hash: 437c06546add47ddca9e551d94285b5132628f0499d716ab173f5ff45291aa8b globs: [] - conda: https://prefix.dev/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda sha256: ee09ad7610c12c7008262d713416d0b58bf365bc38584dce48950025850bdf3f @@ -482,18 +479,18 @@ packages: license_family: BSD size: 3667 timestamp: 1566974674465 -- conda: https://prefix.dev/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - sha256: 53f23a3319466053818540bcdf2091f253cbdbab1e0e9ae7b9e509dcaa2a5e38 - md5: f766549260d6815b0c52253f1fb1bb29 +- conda: https://prefix.dev/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 + md5: a7970cd949a077b7cb9696379d338681 depends: - - font-ttf-dejavu-sans-mono + - font-ttf-ubuntu - font-ttf-inconsolata + - font-ttf-dejavu-sans-mono - font-ttf-source-code-pro - - font-ttf-ubuntu license: BSD-3-Clause license_family: BSD - size: 4102 - timestamp: 1566932280397 + size: 4059 + timestamp: 1762351264405 - conda: https://prefix.dev/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda sha256: bf8e4dffe46f7d25dc06f31038cacb01672c47b9f45201f065b0f4d00ab0a83e md5: 4afc585cd97ba8a23809406cd8a9eda8 @@ -533,9 +530,9 @@ packages: license_family: LGPL size: 81202 timestamp: 1755102333712 -- conda: https://prefix.dev/conda-forge/linux-64/harfbuzz-12.1.0-h15599e2_0.conda - sha256: df2a964f5b7dd652b59da018f1d2d9ae402b815c4e5d849384344df358d2a565 - md5: 7704b1edaa8316b8792424f254c1f586 +- conda: https://prefix.dev/conda-forge/linux-64/harfbuzz-12.2.0-h15599e2_0.conda + sha256: 6bd8b22beb7d40562b2889dc68232c589ff0d11a5ad3addd41a8570d11f039d9 + md5: b8690f53007e9b5ee2c2178dd4ac778c depends: - __glibc >=2.17,<3.0.a0 - cairo >=1.18.4,<2.0a0 @@ -545,16 +542,16 @@ packages: - libfreetype >=2.14.1 - libfreetype6 >=2.14.1 - libgcc >=14 - - libglib >=2.86.0,<3.0a0 + - libglib >=2.86.1,<3.0a0 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT - size: 2058414 - timestamp: 1759365674184 -- conda: https://prefix.dev/conda-forge/osx-arm64/harfbuzz-12.1.0-haf38c7b_0.conda - sha256: 8f2fac3e74608af55334ab9e77e9db9112c9078858aa938d191481d873a902d3 - md5: 3fd0b257d246ddedd1f1496e5246958d + size: 2411408 + timestamp: 1762372726141 +- conda: https://prefix.dev/conda-forge/osx-arm64/harfbuzz-12.2.0-haf38c7b_0.conda + sha256: 2f8d95fe1cb655fe3bac114062963f08cc77b31b042027ef7a04ebde3ce21594 + md5: 1c7ff9d458dd8220ac2ee71dd4af1be5 depends: - __osx >=11.0 - cairo >=1.18.4,<2.0a0 @@ -564,12 +561,12 @@ packages: - libexpat >=2.7.1,<3.0a0 - libfreetype >=2.14.1 - libfreetype6 >=2.14.1 - - libglib >=2.86.0,<3.0a0 + - libglib >=2.86.1,<3.0a0 - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT - size: 1548996 - timestamp: 1759366687572 + size: 1537764 + timestamp: 1762373922469 - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e md5: 8b189310083baabfb622af68fd9d3ae3 @@ -626,17 +623,18 @@ packages: license_family: MIT size: 1155530 timestamp: 1719463474401 -- conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda - sha256: 1a620f27d79217c1295049ba214c2f80372062fd251b569e9873d4a953d27554 - md5: 0be7c6e070c19105f966d3758448d018 +- conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45-h1aa0949_0.conda + sha256: 32321d38b8785ef8ddcfef652ee370acee8d944681014d47797a18637ff16854 + md5: 1450224b3e7d17dfeb985364b77a4d47 depends: - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 constrains: - - binutils_impl_linux-64 2.44 + - binutils_impl_linux-64 2.45 license: GPL-3.0-only license_family: GPL - size: 676044 - timestamp: 1752032747103 + size: 753744 + timestamp: 1763060439129 - conda: https://prefix.dev/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda sha256: 412381a43d5ff9bbed82cd52a0bbca5b90623f62e41007c9c42d3870c60945ff md5: 9344155d33912347b37f0ae6c410a835 @@ -658,9 +656,9 @@ packages: license_family: Apache size: 188306 timestamp: 1745264362794 -- conda: https://prefix.dev/conda-forge/linux-64/libboost-1.88.0-hed09d94_5.conda - sha256: b3815809af2439731caac4c373e3d7e41992ec6be5ad4627096fc438d82502dc - md5: f0cb6133ea736a8aa0feca310894caf0 +- conda: https://prefix.dev/conda-forge/linux-64/libboost-1.88.0-hed09d94_6.conda + sha256: 40b334d77229fcceb51d911a153d7ab9ff4f6a6f90e938387bf29129ab956c58 + md5: 70675d70a76e1b5539b1f464fd5f02ba depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 @@ -673,8 +671,24 @@ packages: constrains: - boost-cpp <0.0a0 license: BSL-1.0 - size: 3004589 - timestamp: 1757631816458 + size: 2978265 + timestamp: 1763017293494 +- conda: https://prefix.dev/conda-forge/osx-arm64/libboost-1.88.0-h18cd856_6.conda + sha256: 717fbfa249f14fb1c6ce564cd0f242460cbc1703b584ad4063366ee349b22325 + md5: 605e24dba1de926ae54fc01ab557dfa8 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - icu >=75.1,<76.0a0 + - libcxx >=19 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - boost-cpp <0.0a0 + license: BSL-1.0 + size: 1954928 + timestamp: 1763019429173 - conda: https://prefix.dev/conda-forge/linux-64/libccd-double-2.1-h59595ed_3.conda sha256: 4695ce68eda595b4f53146bea1096a9f2e0d33290618ba83a246b5ed8871ebc9 md5: 6a3d962d34385e0a511b859d679f6ea2 @@ -709,41 +723,41 @@ packages: license_family: Apache size: 14064272 timestamp: 1759435091038 -- conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.3-default_h99862b1_0.conda - sha256: a882d8aed8625a3cdf9d4062a437f17aa5628cc3b3d8984a5b2ba79abe4a9404 - md5: 351153facc71be73b27482c6ec2204b4 +- conda: https://prefix.dev/conda-forge/linux-64/libclang-cpp21.1-21.1.5-default_h99862b1_1.conda + sha256: 23c005625fcffb36c36d13e45ccf35355b3306eff53c4f83649566f2caf05608 + md5: 0351db6d39dd57e63309dabf6d5629c0 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libllvm21 >=21.1.3,<21.2.0a0 + - libllvm21 >=21.1.5,<21.2.0a0 - libstdcxx >=14 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 21041961 - timestamp: 1760315552873 -- conda: https://prefix.dev/conda-forge/linux-64/libclang13-21.1.3-default_h746c552_0.conda - sha256: 45a8dbd9a7a4eed4da300e692a6f87d39aecd105eec15977cf6cc78091b48be7 - md5: 8e9dbb05e5f7105e265d5775d44e6160 + size: 21065809 + timestamp: 1762471342921 +- conda: https://prefix.dev/conda-forge/linux-64/libclang13-21.1.5-default_h746c552_1.conda + sha256: 070871a19d7a1bc750284721a1f722c527ef466b1461e0de84abbdbb755f4221 + md5: dd39147d65f5edf3b3ebb06f5a0ef43e depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libllvm21 >=21.1.3,<21.2.0a0 + - libllvm21 >=21.1.5,<21.2.0a0 - libstdcxx >=14 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 12341791 - timestamp: 1760315971541 -- conda: https://prefix.dev/conda-forge/osx-arm64/libclang13-21.1.4-default_h6e8f826_0.conda - sha256: 7617c3092e3ee55c386e2b08b64c7ad51f9233751124bddf25f9a7244fd33283 - md5: 019a130ab0aba3a2cefa4e89c3ed7e9e + size: 12340532 + timestamp: 1762471521823 +- conda: https://prefix.dev/conda-forge/osx-arm64/libclang13-21.1.5-default_h6e8f826_1.conda + sha256: 77f286be324935f374c173450fa0907699cf0db4ccf608dfebddfb268b2ddd66 + md5: e2b315924582f4b949539325a34e0cc0 depends: - __osx >=11.0 - - libcxx >=21.1.4 - - libllvm21 >=21.1.4,<21.2.0a0 + - libcxx >=21.1.5 + - libllvm21 >=21.1.5,<21.2.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 8513089 - timestamp: 1761210461072 + size: 8513295 + timestamp: 1762470070416 - conda: https://prefix.dev/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda sha256: cb83980c57e311783ee831832eb2c20ecb41e7dee6e86e8b70b8cef0e43eab55 md5: d4a250da4737ee127fb1fa6452a9002e @@ -757,9 +771,9 @@ packages: license_family: Apache size: 4523621 timestamp: 1749905341688 -- conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.16.0-h4e3cde8_0.conda - sha256: f21af777602d17ced05f168898e759fb0bac5af09ba72c5ece245dd0f14e0fec - md5: a401aa9329350320c7d3809a7a5a1640 +- conda: https://prefix.dev/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda + sha256: 100e29ca864c32af15a5cc354f502d07b2600218740fdf2439fa7d66b50b3529 + md5: 01e149d4a53185622dc2e788281961f2 depends: - __glibc >=2.17,<3.0.a0 - krb5 >=1.21.3,<1.22.0a0 @@ -771,11 +785,11 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT - size: 459851 - timestamp: 1760977209182 -- conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.16.0-hdece5d2_0.conda - sha256: f20ce8db8c62f1cdf4d7a9f92cabcc730b1212a7165f4b085e45941cc747edac - md5: 0537c38a90d179dcb3e46727ccc5bcc1 + size: 460366 + timestamp: 1762333743748 +- conda: https://prefix.dev/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda + sha256: 2980c5de44ac3ca2ecbd4a00756da1648ea2945d9e4a2ad9f216c7787df57f10 + md5: 791003efe92c17ed5949b309c61a5ab1 depends: - __osx >=11.0 - krb5 >=1.21.3,<1.22.0a0 @@ -786,36 +800,36 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT - size: 394279 - timestamp: 1760977967042 -- conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.4-hf598326_2.conda - sha256: 0a0765cc8b6000e7f7be879c12825583d046ef22ab95efc7c5f8622e4b3302d5 - md5: 4346830dcc0c0e930328fddb0b829f63 + size: 394183 + timestamp: 1762334288445 +- conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.5-hf598326_0.conda + sha256: cb441b85669eec99a593f59e6bb18c1d8a46d13eebadfc6a55f0b298109bf510 + md5: fbfdbf6e554275d2661c4541f45fed53 depends: - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 568742 - timestamp: 1761852287381 -- conda: https://prefix.dev/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda - sha256: 8420748ea1cc5f18ecc5068b4f24c7a023cc9b20971c99c824ba10641fb95ddf - md5: 64f0c503da58ec25ebd359e4d990afa8 + size: 569449 + timestamp: 1762258167196 +- conda: https://prefix.dev/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 + md5: 6c77a605a7a689d17d4819c0f8ac9a00 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libgcc >=14 license: MIT license_family: MIT - size: 72573 - timestamp: 1747040452262 -- conda: https://prefix.dev/conda-forge/osx-arm64/libdeflate-1.24-h5773f1b_0.conda - sha256: 417d52b19c679e1881cce3f01cad3a2d542098fa2d6df5485aac40f01aede4d1 - md5: 3baf58a5a87e7c2f4d243ce2f8f2fe5c + size: 73490 + timestamp: 1761979956660 +- conda: https://prefix.dev/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + sha256: 5e0b6961be3304a5f027a8c00bd0967fc46ae162cffb7553ff45c70f51b8314c + md5: a6130c709305cd9828b4e1bd9ba0000c depends: - __osx >=11.0 license: MIT license_family: MIT - size: 54790 - timestamp: 1747040549847 + size: 55420 + timestamp: 1761980066242 - conda: https://prefix.dev/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda sha256: c076a213bd3676cc1ef22eeff91588826273513ccc6040d9bea68bccdc849501 md5: 9314bc5a1fe7d1044dc9dfd3ef400535 @@ -898,16 +912,16 @@ packages: license_family: MIT size: 65971 timestamp: 1752719657566 -- conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda - sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab - md5: ede4673863426c0883c0063d853bbd85 +- conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 + md5: 35f29eec58405aaf55e01cb470d8c26a depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libgcc >=14 license: MIT license_family: MIT - size: 57433 - timestamp: 1743434498161 + size: 57821 + timestamp: 1760295480630 - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda sha256: 9b8acdf42df61b7bfe8bdc545c016c29e61985e79748c64ad66df47dbc2e295f md5: 411ff7cd5d1472bba0f55c0faf04453b @@ -958,28 +972,28 @@ packages: license: GPL-2.0-only OR FTL size: 346703 timestamp: 1757947166116 -- conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda - sha256: 0caed73aac3966bfbf5710e06c728a24c6c138605121a3dacb2e03440e8baa6a - md5: 264fbfba7fb20acf3b29cde153e345ce +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + sha256: 08f9b87578ab981c7713e4e6a7d935e40766e10691732bba376d4964562bcb45 + md5: c0374badb3a5d4b1372db28d19462c53 depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 constrains: - - libgomp 15.1.0 h767d61c_5 - - libgcc-ng ==15.1.0=*_5 + - libgomp 15.2.0 h767d61c_7 + - libgcc-ng ==15.2.0=*_7 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 824191 - timestamp: 1757042543820 -- conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda - sha256: f54bb9c3be12b24be327f4c1afccc2969712e0b091cdfbd1d763fb3e61cda03f - md5: 069afdf8ea72504e48d23ae1171d951c + size: 822552 + timestamp: 1759968052178 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda + sha256: 2045066dd8e6e58aaf5ae2b722fb6dfdbb57c862b5f34ac7bfb58c40ef39b6ad + md5: 280ea6eee9e2ddefde25ff799c4f0363 depends: - - libgcc 15.1.0 h767d61c_5 + - libgcc 15.2.0 h767d61c_7 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 29187 - timestamp: 1757042549554 + size: 29313 + timestamp: 1759968065504 - conda: https://prefix.dev/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda sha256: dc2752241fa3d9e40ce552c1942d0a4b5eeb93740c9723873f6fcf8d39ef8d2d md5: 928b8be80851f5d8ffb016f9c81dae7a @@ -990,24 +1004,24 @@ packages: license: LicenseRef-libglvnd size: 134712 timestamp: 1731330998354 -- conda: https://prefix.dev/conda-forge/linux-64/libglib-2.86.0-h1fed272_0.conda - sha256: 33336bd55981be938f4823db74291e1323454491623de0be61ecbe6cf3a4619c - md5: b8e4c93f4ab70c3b6f6499299627dbdc +- conda: https://prefix.dev/conda-forge/linux-64/libglib-2.86.1-h32235b2_2.conda + sha256: fc82277d0d6340743732c48dcbac3f4e9ee36902649a7d9a02622b0713ce3666 + md5: 986dcf488a1aced411da84753d93d078 depends: - __glibc >=2.17,<3.0.a0 - - libffi >=3.4.6,<3.5.0a0 + - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - libiconv >=1.18,<2.0a0 - libzlib >=1.3.1,<2.0a0 - pcre2 >=10.46,<10.47.0a0 constrains: - - glib 2.86.0 *_0 + - glib 2.86.1 *_2 license: LGPL-2.1-or-later - size: 3978602 - timestamp: 1757403291664 -- conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.1-he69a767_1.conda - sha256: 253ac4eca90006b19571f8c4766e8ebdad0f01f44de1bfa0472d3df9be9c8ac8 - md5: acff031bb5b97602d2b7ef913a8ea076 + size: 3933707 + timestamp: 1762787455198 +- conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.1-he69a767_2.conda + sha256: ea49abd747b91cddf555f4ccd184cee8c1916363a78d4a7fe24b24d1163423c6 + md5: 6d6f8c7d3a52e2c193fb2f9ba2e0ef0b depends: - __osx >=11.0 - libffi >=3.5.2,<3.6.0a0 @@ -1016,10 +1030,10 @@ packages: - libzlib >=1.3.1,<2.0a0 - pcre2 >=10.46,<10.47.0a0 constrains: - - glib 2.86.1 *_1 + - glib 2.86.1 *_2 license: LGPL-2.1-or-later - size: 3677659 - timestamp: 1761875607047 + size: 3661248 + timestamp: 1762789184977 - conda: https://prefix.dev/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850 md5: 434ca7e50e40f4918ab701e3facd59a0 @@ -1038,15 +1052,15 @@ packages: license: LicenseRef-libglvnd size: 75504 timestamp: 1731330988898 -- conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda - sha256: 125051d51a8c04694d0830f6343af78b556dd88cc249dfec5a97703ebfb1832d - md5: dcd5ff1940cd38f6df777cac86819d60 +- conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + sha256: e9fb1c258c8e66ee278397b5822692527c5f5786d372fe7a869b900853f3f5ca + md5: f7b4d76975aac7e5d9e6ad13845f92fe depends: - __glibc >=2.17,<3.0.a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 447215 - timestamp: 1757042483384 + size: 447919 + timestamp: 1759967942498 - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f md5: 915f5995e94f60e9a4826e0b0920ee88 @@ -1073,27 +1087,27 @@ packages: license: LGPL-2.1-or-later size: 90957 timestamp: 1751558394144 -- conda: https://prefix.dev/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda - sha256: 98b399287e27768bf79d48faba8a99a2289748c65cd342ca21033fab1860d4a4 - md5: 9fa334557db9f63da6c9285fd2a48638 +- conda: https://prefix.dev/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda + sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32 + md5: 8397539e3a0bbd1695584fb4f927485a depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libgcc >=14 constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib - size: 628947 - timestamp: 1745268527144 -- conda: https://prefix.dev/conda-forge/osx-arm64/libjpeg-turbo-3.1.0-h5505292_0.conda - sha256: 78df2574fa6aa5b6f5fc367c03192f8ddf8e27dc23641468d54e031ff560b9d4 - md5: 01caa4fbcaf0e6b08b3aef1151e91745 + size: 633710 + timestamp: 1762094827865 +- conda: https://prefix.dev/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda + sha256: 6c061c56058bb10374daaef50e81b39cf43e8aee21f0037022c0c39c4f31872f + md5: f0695fbecf1006f27f4395d64bd0c4b8 depends: - __osx >=11.0 constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib - size: 553624 - timestamp: 1745268405713 + size: 551197 + timestamp: 1762095054358 - conda: https://prefix.dev/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda sha256: 46f8ff3d86438c0af1bebe0c18261ce5de9878d58b4fe399a3a125670e4f0af5 md5: d1d9b233830f6631800acc1e081a9444 @@ -1108,9 +1122,9 @@ packages: license_family: Apache size: 26914852 timestamp: 1757353228286 -- conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.4-hf7376ad_0.conda - sha256: 5be6d2c4d931bd32aec92d27854d1f46d6fcfefa772e5ceadfa150e8ff5d4442 - md5: da21f286c4466912cc579911068034b6 +- conda: https://prefix.dev/conda-forge/linux-64/libllvm21-21.1.5-hf7376ad_0.conda + sha256: 180d77016c2eb5c8722f31a4750496b773e810529110d370ffc6d0cbbf6d15bb + md5: 9d476d7712c3c78ace006017c83d3889 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -1121,11 +1135,11 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 44344723 - timestamp: 1761083791644 -- conda: https://prefix.dev/conda-forge/osx-arm64/libllvm21-21.1.4-h8e0c9ce_0.conda - sha256: 269fd7005a30958fccdbec91cb411e8277eb431af7b92b9005e08d28cedbd186 - md5: 8fd7e7215ff8e4f1900a8f07e08469b9 + size: 44350262 + timestamp: 1762289424598 +- conda: https://prefix.dev/conda-forge/osx-arm64/libllvm21-21.1.5-h8e0c9ce_0.conda + sha256: f8aec81419eb1d2acbddc7a328d73340b591b3ac5e40bb7f5d366eca64516328 + md5: 75f026077311f5e37189a0de80afb6ed depends: - __osx >=11.0 - libcxx >=19 @@ -1135,8 +1149,8 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 29394614 - timestamp: 1761078970340 + size: 29400991 + timestamp: 1762285527190 - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 md5: 1a580f7796c7bf6393fddb8bbbde58dc @@ -1158,39 +1172,39 @@ packages: license: 0BSD size: 92286 timestamp: 1749230283517 -- conda: https://prefix.dev/conda-forge/linux-64/libmujoco-3.3.2-h31df9c7_4.conda - sha256: bb3ff868cc74a2412ffeff4fdcb9a5e9f525d4580fa79d6088d39cd1c7b7abc1 - md5: d71adc99dac121fa7a67070f642374b5 +- conda: https://prefix.dev/conda-forge/linux-64/libmujoco-3.3.3-h31df9c7_0.conda + sha256: b2ce3c2362ab2cdbc73301044686ffd4ea62aefb35c582dd66425fad0ef21c17 + md5: 91b6a83573c5e0c3a7880fd5b9615310 depends: + - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - lodepng >=20220109,<20220110.0a0 - - tinyxml2 >=11.0.0,<11.1.0a0 - qhull >=2020.2,<2020.3.0a0 + - tinyxml2 >=11.0.0,<11.1.0a0 - libccd-double >=2.1,<2.2.0a0 constrains: - mujoco-cxx <0 license: Apache-2.0 license_family: APACHE - size: 10995635 - timestamp: 1753454980696 -- conda: https://prefix.dev/conda-forge/osx-arm64/libmujoco-3.3.2-hba1c1e0_4.conda - sha256: 7b88233dc1afc8c9e7f6d591a4989c0e92bfa4711694ff3e4333fefe0f6edbdd - md5: ba88148d67de3896f255bd6d8ae0e499 + size: 10995296 + timestamp: 1763340000999 +- conda: https://prefix.dev/conda-forge/osx-arm64/libmujoco-3.3.3-h2f9c0ae_0.conda + sha256: ddfe164f32a19b04ce07953d8b5b59c64cd2aca07f01ddeac670df0ba427503f + md5: 0d316313cd28742cd8d8cfb7f2038889 depends: - libcxx >=19 - __osx >=11.0 - - tinyxml2 >=11.0.0,<11.1.0a0 - lodepng >=20220109,<20220110.0a0 - - qhull >=2020.2,<2020.3.0a0 - libccd-double >=2.1,<2.2.0a0 + - tinyxml2 >=11.0.0,<11.1.0a0 + - qhull >=2020.2,<2020.3.0a0 constrains: - mujoco-cxx <0 license: Apache-2.0 license_family: APACHE - size: 10838572 - timestamp: 1753454988917 + size: 10838380 + timestamp: 1763340016189 - conda: https://prefix.dev/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda sha256: a4a7dab8db4dc81c736e9a9b42bdfd97b087816e029e221380511960ac46c690 md5: b499ce4b026493a13774bcf0f4c33849 @@ -1303,26 +1317,27 @@ packages: license: PostgreSQL size: 2648192 timestamp: 1758821565273 -- conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda - sha256: 6d9c32fc369af5a84875725f7ddfbfc2ace795c28f246dc70055a79f9b2003da - md5: 0b367fad34931cb79e0d6b7e5c06bb1c +- conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda + sha256: 4c992dcd0e34b68f843e75406f7f303b1b97c248d18f3c7c330bdc0bc26ae0b3 + md5: 729a572a3ebb8c43933b30edcc628ceb depends: - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: blessing - size: 932581 - timestamp: 1753948484112 -- conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda - sha256: 802ebe62e6bc59fc26b26276b793e0542cfff2d03c086440aeaf72fb8bbcec44 - md5: 1dcb0468f5146e38fae99aef9656034b + size: 945576 + timestamp: 1762299687230 +- conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.51.0-h8adb53f_0.conda + sha256: b43d198f147f46866e5336c4a6b91668beef698bfba69d1706158460eadb2c1b + md5: 5fb1945dbc6380e6fe7e939a62267772 depends: - __osx >=11.0 - icu >=75.1,<76.0a0 - libzlib >=1.3.1,<2.0a0 license: blessing - size: 902645 - timestamp: 1753948599139 + size: 909508 + timestamp: 1762300078624 - conda: https://prefix.dev/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 md5: eecce068c7e4eddeb169591baac20ac4 @@ -1345,32 +1360,34 @@ packages: license_family: BSD size: 279193 timestamp: 1745608793272 -- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda - sha256: 0f5f61cab229b6043541c13538d75ce11bd96fb2db76f94ecf81997b1fde6408 - md5: 4e02a49aaa9d5190cb630fa43528fbe6 +- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + sha256: 1b981647d9775e1cdeb2fab0a4dd9cd75a6b0de2963f6c3953dbd712f78334b3 + md5: 5b767048b1b3ee9a954b06f4084f93dc depends: - __glibc >=2.17,<3.0.a0 - - libgcc 15.1.0 h767d61c_5 + - libgcc 15.2.0 h767d61c_7 + constrains: + - libstdcxx-ng ==15.2.0=*_7 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 3896432 - timestamp: 1757042571458 -- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda - sha256: 7b8cabbf0ab4fe3581ca28fe8ca319f964078578a51dd2ca3f703c1d21ba23ff - md5: 8bba50c7f4679f08c861b597ad2bda6b + size: 3898269 + timestamp: 1759968103436 +- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + sha256: 024fd46ac3ea8032a5ec3ea7b91c4c235701a8bf0e6520fe5e6539992a6bd05f + md5: f627678cf829bd70bccf141a19c3ad3e depends: - - libstdcxx 15.1.0 h8f9b012_5 + - libstdcxx 15.2.0 h8f9b012_7 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 29233 - timestamp: 1757042603319 -- conda: https://prefix.dev/conda-forge/linux-64/libtiff-4.7.1-h8261f1e_0.conda - sha256: ddda0d7ee67e71e904a452010c73e32da416806f5cb9145fb62c322f97e717fb - md5: 72b531694ebe4e8aa6f5745d1015c1b4 + size: 29343 + timestamp: 1759968157195 +- conda: https://prefix.dev/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda + sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 + md5: cd5a90476766d53e901500df9215e927 depends: - __glibc >=2.17,<3.0.a0 - lerc >=4.0.0,<5.0a0 - - libdeflate >=1.24,<1.25.0a0 + - libdeflate >=1.25,<1.26.0a0 - libgcc >=14 - libjpeg-turbo >=3.1.0,<4.0a0 - liblzma >=5.8.1,<6.0a0 @@ -1379,34 +1396,34 @@ packages: - libzlib >=1.3.1,<2.0a0 - zstd >=1.5.7,<1.6.0a0 license: HPND - size: 437211 - timestamp: 1758278398952 -- conda: https://prefix.dev/conda-forge/osx-arm64/libtiff-4.7.1-h7dc4979_0.conda - sha256: 6bc1b601f0d3ee853acd23884a007ac0a0290f3609dabb05a47fc5a0295e2b53 - md5: 2bb9e04e2da869125e2dc334d665f00d + size: 435273 + timestamp: 1762022005702 +- conda: https://prefix.dev/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda + sha256: e9248077b3fa63db94caca42c8dbc6949c6f32f94d1cafad127f9005d9b1507f + md5: e2a72ab2fa54ecb6abab2b26cde93500 depends: - __osx >=11.0 - lerc >=4.0.0,<5.0a0 - libcxx >=19 - - libdeflate >=1.24,<1.25.0a0 + - libdeflate >=1.25,<1.26.0a0 - libjpeg-turbo >=3.1.0,<4.0a0 - liblzma >=5.8.1,<6.0a0 - libwebp-base >=1.6.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - zstd >=1.5.7,<1.6.0a0 license: HPND - size: 373640 - timestamp: 1758278641520 -- conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.1-he9a06e4_0.conda - sha256: 776e28735cee84b97e4d05dd5d67b95221a3e2c09b8b13e3d6dbe6494337d527 - md5: af930c65e9a79a3423d6d36e265cef65 + size: 373892 + timestamp: 1762022345545 +- conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + sha256: e5ec6d2ad7eef538ddcb9ea62ad4346fde70a4736342c4ad87bd713641eb9808 + md5: 80c07c68d2f6870250959dcc95b209d1 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: BSD-3-Clause license_family: BSD - size: 37087 - timestamp: 1757334557450 + size: 37135 + timestamp: 1758626800002 - conda: https://prefix.dev/conda-forge/linux-64/libvulkan-loader-1.4.328.1-h5279c79_0.conda sha256: bbabc5c48b63ff03f440940a11d4648296f5af81bb7630d98485405cd32ac1ce md5: 372a62464d47d9e966b630ffae3abe73 @@ -1466,9 +1483,9 @@ packages: license: LGPL-2.1-or-later size: 100393 timestamp: 1702724383534 -- conda: https://prefix.dev/conda-forge/linux-64/libxkbcommon-1.12.2-hca5e8e5_0.conda - sha256: e11e8890a097c9e16a3fc40f2540d887ef2497e7f31f6e5a744aa951f82dbeea - md5: 3c3e5ccbb2d96ac75e1b8b028586db5c +- conda: https://prefix.dev/conda-forge/linux-64/libxkbcommon-1.13.0-hca5e8e5_0.conda + sha256: 576ce5378cc6a2b722ff33d2359ccb74dea1e6465daa45116e57550f1eb4ba7e + md5: aa65b4add9574bb1d23c76560c5efd4c depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -1480,8 +1497,8 @@ packages: - xorg-libxau >=1.0.12,<2.0a0 license: MIT/X11 Derivative license_family: MIT - size: 830418 - timestamp: 1760990182307 + size: 843995 + timestamp: 1762341607312 - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda sha256: ec0735ae56c3549149eebd7dc22c0bed91fd50c02eaa77ff418613ddda190aa8 md5: e512be7dc1f84966d50959e900ca121f @@ -1594,6 +1611,17 @@ packages: license: BSL-1.0 size: 258866 timestamp: 1756194974156 +- conda: https://prefix.dev/conda-forge/osx-arm64/msgpack-cxx-7.0.0-h33cdd7a_1.conda + sha256: cf8815bbeee477ea19e0bec137308633b7d77314bce91f2b53c31aed758cb01e + md5: 5c46c6b6d25be37714ef15acb9e21ae4 + depends: + - __osx >=11.0 + - libboost >=1.88.0,<1.89.0a0 + - libcxx >=19 + - libzlib >=1.3.1,<2.0a0 + license: BSL-1.0 + size: 259872 + timestamp: 1753278625902 - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 md5: 47e340acb35de30501a76c7c799c41d7 @@ -1638,27 +1666,27 @@ packages: license_family: BSD size: 843597 timestamp: 1748010484231 -- conda: https://prefix.dev/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda - sha256: e807f3bad09bdf4075dbb4168619e14b0c0360bacb2e12ef18641a834c8c5549 - md5: 14edad12b59ccbfa3910d42c72adc2a0 +- conda: https://prefix.dev/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d + md5: 9ee58d5c534af06558933af3c845a780 depends: - __glibc >=2.17,<3.0.a0 - ca-certificates - libgcc >=14 license: Apache-2.0 license_family: Apache - size: 3119624 - timestamp: 1759324353651 -- conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.5.4-h5503f6c_0.conda - sha256: f0512629f9589392c2fb9733d11e753d0eab8fc7602f96e4d7f3bd95c783eb07 - md5: 71118318f37f717eefe55841adb172fd + size: 3165399 + timestamp: 1762839186699 +- conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + sha256: ebe93dafcc09e099782fe3907485d4e1671296bc14f8c383cb6f3dfebb773988 + md5: b34dc4172653c13dcf453862f251af2b depends: - __osx >=11.0 - ca-certificates license: Apache-2.0 license_family: Apache - size: 3067808 - timestamp: 1759324763146 + size: 3108371 + timestamp: 1762839712322 - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda sha256: 5c7380c8fd3ad5fc0f8039069a45586aa452cf165264bc5a437ad80397b32934 md5: 7fa07cb0fb1b625a089ccc01218ee5b1 @@ -1735,32 +1763,33 @@ packages: license_family: MIT size: 91283 timestamp: 1736601509593 -- conda: https://prefix.dev/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda - sha256: 6cca004806ceceea9585d4d655059e951152fc774a471593d4f5138e6a54c81d - md5: 94206474a5608243a10c92cefbe0908f +- conda: https://prefix.dev/conda-forge/linux-64/python-3.12.12-hd63d673_1_cpython.conda + build_number: 1 + sha256: 39898d24769a848c057ab861052e50bdc266310a7509efa3514b840e85a2ae98 + md5: 5c00c8cea14ee8d02941cab9121dce41 depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.7.0,<3.0a0 - - libffi >=3.4.6,<3.5.0a0 - - libgcc >=13 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 - liblzma >=5.8.1,<6.0a0 - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.50.0,<4.0a0 - - libuuid >=2.38.1,<3.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libuuid >=2.41.2,<3.0a0 - libxcrypt >=4.4.36 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.5.0,<4.0a0 + - openssl >=3.5.4,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata constrains: - python_abi 3.12.* *_cp312 license: Python-2.0 - size: 31445023 - timestamp: 1749050216615 + size: 31537229 + timestamp: 1761176876216 - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.12.12-h18782d2_1_cpython.conda build_number: 1 sha256: 626da9bb78459ce541407327d1e22ee673fd74e9103f1a0e0f4e3967ad0a23a7 @@ -1812,9 +1841,9 @@ packages: license: LicenseRef-Qhull size: 516376 timestamp: 1720814307311 -- conda: https://prefix.dev/conda-forge/linux-64/qt6-main-6.9.3-h5c1c036_0.conda - sha256: 999ce4a6af5f9570373047f7c61ccc86d17bef294b402b7297b8efc25ec3b5e9 - md5: cc0bffcaf6410aba9c6581dfdc18012d +- conda: https://prefix.dev/conda-forge/linux-64/qt6-main-6.9.3-h5c1c036_1.conda + sha256: 51537408ce1493d267b375b33ec02a060d77c4e00c7bef5e2e1c6724e08a23e3 + md5: 762af6d08fdfa7a45346b1466740bacd depends: - __glibc >=2.17,<3.0.a0 - alsa-lib >=1.2.14,<1.3.0a0 @@ -1822,11 +1851,11 @@ packages: - double-conversion >=3.3.1,<3.4.0a0 - fontconfig >=2.15.0,<3.0a0 - fonts-conda-ecosystem - - harfbuzz >=12.0.0 + - harfbuzz >=12.1.0 - icu >=75.1,<76.0a0 - krb5 >=1.21.3,<1.22.0a0 - - libclang-cpp21.1 >=21.1.2,<21.2.0a0 - - libclang13 >=21.1.2 + - libclang-cpp21.1 >=21.1.4,<21.2.0a0 + - libclang13 >=21.1.4 - libcups >=2.3.3,<2.4.0a0 - libdrm >=2.4.125,<2.5.0a0 - libegl >=1.7.0,<2.0a0 @@ -1836,20 +1865,20 @@ packages: - libgl >=1.7.0,<2.0a0 - libglib >=2.86.0,<3.0a0 - libjpeg-turbo >=3.1.0,<4.0a0 - - libllvm21 >=21.1.2,<21.2.0a0 + - libllvm21 >=21.1.4,<21.2.0a0 - libpng >=1.6.50,<1.7.0a0 - libpq >=18.0,<19.0a0 - libsqlite >=3.50.4,<4.0a0 - libstdcxx >=14 - libtiff >=4.7.1,<4.8.0a0 - - libvulkan-loader >=1.4.313.0,<2.0a0 + - libvulkan-loader >=1.4.328.1,<2.0a0 - libwebp-base >=1.6.0,<2.0a0 - libxcb >=1.17.0,<2.0a0 - - libxkbcommon >=1.11.0,<2.0a0 + - libxkbcommon >=1.12.2,<2.0a0 - libxml2 - libxml2-16 >=2.14.6 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.3,<4.0a0 + - openssl >=3.5.4,<4.0a0 - pcre2 >=10.46,<10.47.0a0 - wayland >=1.24.0,<2.0a0 - xcb-util >=0.4.1,<0.5.0a0 @@ -1873,8 +1902,8 @@ packages: - qt 6.9.3 license: LGPL-3.0-only license_family: LGPL - size: 54537863 - timestamp: 1759251856141 + size: 54785664 + timestamp: 1761308850008 - conda: https://prefix.dev/conda-forge/osx-arm64/qt6-main-6.9.3-hb266e41_0.conda sha256: d00722613930f7b048417dcd8335b7525d105350376976f60c734385ad11e854 md5: 9c4c7c477173f43b4239d85bcf1df658 @@ -1944,46 +1973,48 @@ packages: license: Zlib size: 122269 timestamp: 1742246179980 -- conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda - sha256: a84ff687119e6d8752346d1d408d5cf360dee0badd487a472aa8ddedfdc219e1 - md5: a0116df4f4ed05c303811a837d5b39d8 +- conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + sha256: 1544760538a40bcd8ace2b1d8ebe3eb5807ac268641f8acdc18c69c5ebfeaf64 + md5: 86bc20552bf46075e3d92b67f089172d depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 + constrains: + - xorg-libx11 >=1.8.12,<2.0a0 license: TCL license_family: BSD - size: 3285204 - timestamp: 1748387766691 -- conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda - sha256: cb86c522576fa95c6db4c878849af0bccfd3264daf0cc40dd18e7f4a7bfced0e - md5: 7362396c170252e7b7b0c8fb37fe9c78 + size: 3284905 + timestamp: 1763054914403 +- conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + sha256: ad0c67cb03c163a109820dc9ecf77faf6ec7150e942d1e8bb13e5d39dc058ab7 + md5: a73d54a5abba6543cb2f0af1bfbd6851 depends: - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 license: TCL license_family: BSD - size: 3125538 - timestamp: 1748388189063 + size: 3125484 + timestamp: 1763055028377 - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 md5: 4222072737ccff51314b5ece9c7d6f5a license: LicenseRef-Public-Domain size: 122968 timestamp: 1742727099393 -- conda: https://prefix.dev/conda-forge/linux-64/wayland-1.24.0-h3e06ad9_0.conda - sha256: ba673427dcd480cfa9bbc262fd04a9b1ad2ed59a159bd8f7e750d4c52282f34c - md5: 0f2ca7906bf166247d1d760c3422cb8a +- conda: https://prefix.dev/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda + sha256: 3aa04ae8e9521d9b56b562376d944c3e52b69f9d2a0667f77b8953464822e125 + md5: 035da2e4f5770f036ff704fa17aace24 depends: - __glibc >=2.17,<3.0.a0 - - libexpat >=2.7.0,<3.0a0 - - libffi >=3.4.6,<3.5.0a0 - - libgcc >=13 - - libstdcxx >=13 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - libstdcxx >=14 license: MIT license_family: MIT - size: 330474 - timestamp: 1751817998141 + size: 329779 + timestamp: 1761174273487 - conda: https://prefix.dev/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda sha256: ad8cab7e07e2af268449c2ce855cbb51f43f4664936eff679b1f3862e6e4b01d md5: fdc27cb255a7a2cc73b7919a968b48f0 @@ -1995,20 +2026,20 @@ packages: license_family: MIT size: 20772 timestamp: 1750436796633 -- conda: https://prefix.dev/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda - sha256: c7b35db96f6e32a9e5346f97adc968ef2f33948e3d7084295baebc0e33abdd5b - md5: eb44b3b6deb1cab08d72cb61686fe64c +- conda: https://prefix.dev/conda-forge/linux-64/xcb-util-cursor-0.1.6-hb03c661_0.conda + sha256: c2be9cae786fdb2df7c2387d2db31b285cf90ab3bfabda8fa75a596c3d20fc67 + md5: 4d1fc190b99912ed557a8236e958c559 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libgcc >=14 - libxcb >=1.13 - - libxcb >=1.16,<2.0.0a0 + - libxcb >=1.17.0,<2.0a0 - xcb-util-image >=0.4.0,<0.5.0a0 - xcb-util-renderutil >=0.3.10,<0.4.0a0 license: MIT license_family: MIT - size: 20296 - timestamp: 1726125844850 + size: 20829 + timestamp: 1763366954390 - conda: https://prefix.dev/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda sha256: 94b12ff8b30260d9de4fd7a28cca12e028e572cbc504fd42aa2646ec4a5bded7 md5: a0901183f08b6c7107aab109733a3c91 @@ -2050,17 +2081,17 @@ packages: license_family: MIT size: 51689 timestamp: 1718844051451 -- conda: https://prefix.dev/conda-forge/linux-64/xkeyboard-config-2.45-hb9d3cd8_0.conda - sha256: a5d4af601f71805ec67403406e147c48d6bad7aaeae92b0622b7e2396842d3fe - md5: 397a013c2dc5145a70737871aaa87e98 +- conda: https://prefix.dev/conda-forge/linux-64/xkeyboard-config-2.46-hb03c661_0.conda + sha256: aa03b49f402959751ccc6e21932d69db96a65a67343765672f7862332aa32834 + md5: 71ae752a748962161b4740eaff510258 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libgcc >=14 - xorg-libx11 >=1.8.12,<2.0a0 license: MIT license_family: MIT - size: 392406 - timestamp: 1749375847832 + size: 396975 + timestamp: 1759543819846 - conda: https://prefix.dev/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b md5: fb901ff28063514abb6046c9ec2c4a45 @@ -2094,16 +2125,16 @@ packages: license_family: MIT size: 835896 timestamp: 1741901112627 -- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda - sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 - md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda + sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b + md5: b2895afaf55bf96a8c8282a2e47a5de0 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libgcc >=14 license: MIT license_family: MIT - size: 14780 - timestamp: 1734229004433 + size: 15321 + timestamp: 1762976464266 - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda sha256: 753f73e990c33366a91fd42cc17a3d19bb9444b9ca5ff983605fa9e953baf57f md5: d3c295b50f092ab525ffe3c2aa4b7413 @@ -2142,16 +2173,16 @@ packages: license_family: MIT size: 13217 timestamp: 1727891438799 -- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda - sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee - md5: 8035c64cb77ed555e3f150b7b3972480 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda + sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142 + md5: 1dafce8548e38671bea82e3f5c6ce22f depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libgcc >=14 license: MIT license_family: MIT - size: 19901 - timestamp: 1727794976192 + size: 20591 + timestamp: 1762976546182 - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda sha256: da5dc921c017c05f38a38bd75245017463104457b63a1ce633ed41f214159c14 md5: febbab7d15033c913d53c7a2c102309d @@ -2163,17 +2194,17 @@ packages: license_family: MIT size: 50060 timestamp: 1727752228921 -- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda - sha256: 2fef37e660985794617716eb915865ce157004a4d567ed35ec16514960ae9271 - md5: 4bdb303603e9821baf5fe5fdff1dc8f8 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4 + md5: ba231da7fccf9ea1e768caf5c7099b84 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 license: MIT license_family: MIT - size: 19575 - timestamp: 1727794961233 + size: 20071 + timestamp: 1759282564045 - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a md5: 17dcc85db3c7886650b8908b183d6876 diff --git a/pixi.toml b/pixi.toml index d4953a2..2fa5ee9 100644 --- a/pixi.toml +++ b/pixi.toml @@ -15,7 +15,7 @@ name = "circus" version = "0.1.0" [package.build] -backend = { name = "pixi-build-cmake", version = "==0.3.4" } +backend = { name = "pixi-build-cmake", version = "==0.3.5" } [package.build-dependencies] cmake = ">=3.27,<4" @@ -23,19 +23,19 @@ cmake = ">=3.27,<4" [package.host-dependencies] python = "3.12.*" nanobind = "2.8.*" -eigen = ">=3.4.0,<4" -yaml-cpp = ">=0.8.0,<0.9" -nlohmann_json = ">=3.12.0,<4" -pugixml = ">=1.15,<2" -libcurl = ">=8.14.1,<9" -qt6-main = ">=6.9.2,<7" -libmujoco = ">=3.3.2,<4" +eigen = "==3.4.0" +yaml-cpp = "==0.8.0" +nlohmann_json = "==3.12.0" +pugixml = "==1.15" +libcurl = "==8.14.1" +qt6-main = "==6.9.2" +libmujoco = "==3.3.3" +msgpack-cxx = "==7.0.0" +libboost-devel = "==1.88.0" [package.target.linux-64.host-dependencies] -libgl-devel = ">=1.7.0,<2" -msgpack-cxx = ">=7.0.0,<8" -libboost-devel = ">=1.88.0,<2" - +libgl-devel = "==1.7.0" +libegl-devel = "==1.7.0" [package.target.osx-arm64.host-dependencies] diff --git a/Resources/config/framework_config.yaml b/resources/config/framework_config.yaml similarity index 100% rename from Resources/config/framework_config.yaml rename to resources/config/framework_config.yaml diff --git a/Resources/includes/ball.xml b/resources/includes/ball.xml similarity index 100% rename from Resources/includes/ball.xml rename to resources/includes/ball.xml diff --git a/Resources/includes/fieldKidSize.xml b/resources/includes/fieldKidSize.xml similarity index 100% rename from Resources/includes/fieldKidSize.xml rename to resources/includes/fieldKidSize.xml diff --git a/Resources/includes/fieldRCAP.xml b/resources/includes/fieldRCAP.xml similarity index 100% rename from Resources/includes/fieldRCAP.xml rename to resources/includes/fieldRCAP.xml diff --git a/Resources/includes/fieldSPL.xml b/resources/includes/fieldSPL.xml similarity index 100% rename from Resources/includes/fieldSPL.xml rename to resources/includes/fieldSPL.xml diff --git a/Resources/meshes/Booster-K1/Head_1.STL b/resources/meshes/Booster-K1/Head_1.STL similarity index 100% rename from Resources/meshes/Booster-K1/Head_1.STL rename to resources/meshes/Booster-K1/Head_1.STL diff --git a/Resources/meshes/Booster-K1/Head_2.STL b/resources/meshes/Booster-K1/Head_2.STL similarity index 100% rename from Resources/meshes/Booster-K1/Head_2.STL rename to resources/meshes/Booster-K1/Head_2.STL diff --git a/Resources/meshes/Booster-K1/Head_2_ZED.STL b/resources/meshes/Booster-K1/Head_2_ZED.STL similarity index 100% rename from Resources/meshes/Booster-K1/Head_2_ZED.STL rename to resources/meshes/Booster-K1/Head_2_ZED.STL diff --git a/Resources/meshes/Booster-K1/L1_XX_Ball.STL b/resources/meshes/Booster-K1/L1_XX_Ball.STL similarity index 100% rename from Resources/meshes/Booster-K1/L1_XX_Ball.STL rename to resources/meshes/Booster-K1/L1_XX_Ball.STL diff --git a/Resources/meshes/Booster-K1/L1_X_Ball.STL b/resources/meshes/Booster-K1/L1_X_Ball.STL similarity index 100% rename from Resources/meshes/Booster-K1/L1_X_Ball.STL rename to resources/meshes/Booster-K1/L1_X_Ball.STL diff --git a/Resources/meshes/Booster-K1/L1_Y_Ball.STL b/resources/meshes/Booster-K1/L1_Y_Ball.STL similarity index 100% rename from Resources/meshes/Booster-K1/L1_Y_Ball.STL rename to resources/meshes/Booster-K1/L1_Y_Ball.STL diff --git a/Resources/meshes/Booster-K1/L2_XX_Ball.STL b/resources/meshes/Booster-K1/L2_XX_Ball.STL similarity index 100% rename from Resources/meshes/Booster-K1/L2_XX_Ball.STL rename to resources/meshes/Booster-K1/L2_XX_Ball.STL diff --git a/Resources/meshes/Booster-K1/L2_X_Ball.STL b/resources/meshes/Booster-K1/L2_X_Ball.STL similarity index 100% rename from Resources/meshes/Booster-K1/L2_X_Ball.STL rename to resources/meshes/Booster-K1/L2_X_Ball.STL diff --git a/Resources/meshes/Booster-K1/L2_Y_Ball.STL b/resources/meshes/Booster-K1/L2_Y_Ball.STL similarity index 100% rename from Resources/meshes/Booster-K1/L2_Y_Ball.STL rename to resources/meshes/Booster-K1/L2_Y_Ball.STL diff --git a/Resources/meshes/Booster-K1/Left_Ankle_Cross.STL b/resources/meshes/Booster-K1/Left_Ankle_Cross.STL similarity index 100% rename from Resources/meshes/Booster-K1/Left_Ankle_Cross.STL rename to resources/meshes/Booster-K1/Left_Ankle_Cross.STL diff --git a/Resources/meshes/Booster-K1/Left_Arm_1.STL b/resources/meshes/Booster-K1/Left_Arm_1.STL similarity index 100% rename from Resources/meshes/Booster-K1/Left_Arm_1.STL rename to resources/meshes/Booster-K1/Left_Arm_1.STL diff --git a/Resources/meshes/Booster-K1/Left_Arm_2.STL b/resources/meshes/Booster-K1/Left_Arm_2.STL similarity index 100% rename from Resources/meshes/Booster-K1/Left_Arm_2.STL rename to resources/meshes/Booster-K1/Left_Arm_2.STL diff --git a/Resources/meshes/Booster-K1/Left_Arm_3.STL b/resources/meshes/Booster-K1/Left_Arm_3.STL similarity index 100% rename from Resources/meshes/Booster-K1/Left_Arm_3.STL rename to resources/meshes/Booster-K1/Left_Arm_3.STL diff --git a/Resources/meshes/Booster-K1/Left_Arm_4.STL b/resources/meshes/Booster-K1/Left_Arm_4.STL similarity index 100% rename from Resources/meshes/Booster-K1/Left_Arm_4.STL rename to resources/meshes/Booster-K1/Left_Arm_4.STL diff --git a/Resources/meshes/Booster-K1/Left_Crank_Down.STL b/resources/meshes/Booster-K1/Left_Crank_Down.STL similarity index 100% rename from Resources/meshes/Booster-K1/Left_Crank_Down.STL rename to resources/meshes/Booster-K1/Left_Crank_Down.STL diff --git a/Resources/meshes/Booster-K1/Left_Crank_Up.STL b/resources/meshes/Booster-K1/Left_Crank_Up.STL similarity index 100% rename from Resources/meshes/Booster-K1/Left_Crank_Up.STL rename to resources/meshes/Booster-K1/Left_Crank_Up.STL diff --git a/Resources/meshes/Booster-K1/Left_Foot.STL b/resources/meshes/Booster-K1/Left_Foot.STL similarity index 100% rename from Resources/meshes/Booster-K1/Left_Foot.STL rename to resources/meshes/Booster-K1/Left_Foot.STL diff --git a/Resources/meshes/Booster-K1/Left_Hip_Pitch.STL b/resources/meshes/Booster-K1/Left_Hip_Pitch.STL similarity index 100% rename from Resources/meshes/Booster-K1/Left_Hip_Pitch.STL rename to resources/meshes/Booster-K1/Left_Hip_Pitch.STL diff --git a/Resources/meshes/Booster-K1/Left_Hip_Roll.STL b/resources/meshes/Booster-K1/Left_Hip_Roll.STL similarity index 100% rename from Resources/meshes/Booster-K1/Left_Hip_Roll.STL rename to resources/meshes/Booster-K1/Left_Hip_Roll.STL diff --git a/Resources/meshes/Booster-K1/Left_Hip_Yaw.STL b/resources/meshes/Booster-K1/Left_Hip_Yaw.STL similarity index 100% rename from Resources/meshes/Booster-K1/Left_Hip_Yaw.STL rename to resources/meshes/Booster-K1/Left_Hip_Yaw.STL diff --git a/Resources/meshes/Booster-K1/Left_Link_Long.STL b/resources/meshes/Booster-K1/Left_Link_Long.STL similarity index 100% rename from Resources/meshes/Booster-K1/Left_Link_Long.STL rename to resources/meshes/Booster-K1/Left_Link_Long.STL diff --git a/Resources/meshes/Booster-K1/Left_Link_Short.STL b/resources/meshes/Booster-K1/Left_Link_Short.STL similarity index 100% rename from Resources/meshes/Booster-K1/Left_Link_Short.STL rename to resources/meshes/Booster-K1/Left_Link_Short.STL diff --git a/Resources/meshes/Booster-K1/Left_Shank.STL b/resources/meshes/Booster-K1/Left_Shank.STL similarity index 100% rename from Resources/meshes/Booster-K1/Left_Shank.STL rename to resources/meshes/Booster-K1/Left_Shank.STL diff --git a/Resources/meshes/Booster-K1/R1_XX_Ball.STL b/resources/meshes/Booster-K1/R1_XX_Ball.STL similarity index 100% rename from Resources/meshes/Booster-K1/R1_XX_Ball.STL rename to resources/meshes/Booster-K1/R1_XX_Ball.STL diff --git a/Resources/meshes/Booster-K1/R1_X_Ball.STL b/resources/meshes/Booster-K1/R1_X_Ball.STL similarity index 100% rename from Resources/meshes/Booster-K1/R1_X_Ball.STL rename to resources/meshes/Booster-K1/R1_X_Ball.STL diff --git a/Resources/meshes/Booster-K1/R1_Y_Ball.STL b/resources/meshes/Booster-K1/R1_Y_Ball.STL similarity index 100% rename from Resources/meshes/Booster-K1/R1_Y_Ball.STL rename to resources/meshes/Booster-K1/R1_Y_Ball.STL diff --git a/Resources/meshes/Booster-K1/R2_XX_Ball.STL b/resources/meshes/Booster-K1/R2_XX_Ball.STL similarity index 100% rename from Resources/meshes/Booster-K1/R2_XX_Ball.STL rename to resources/meshes/Booster-K1/R2_XX_Ball.STL diff --git a/Resources/meshes/Booster-K1/R2_X_Ball.STL b/resources/meshes/Booster-K1/R2_X_Ball.STL similarity index 100% rename from Resources/meshes/Booster-K1/R2_X_Ball.STL rename to resources/meshes/Booster-K1/R2_X_Ball.STL diff --git a/Resources/meshes/Booster-K1/R2_Y_Ball.STL b/resources/meshes/Booster-K1/R2_Y_Ball.STL similarity index 100% rename from Resources/meshes/Booster-K1/R2_Y_Ball.STL rename to resources/meshes/Booster-K1/R2_Y_Ball.STL diff --git a/Resources/meshes/Booster-K1/Right_Ankle_Cross.STL b/resources/meshes/Booster-K1/Right_Ankle_Cross.STL similarity index 100% rename from Resources/meshes/Booster-K1/Right_Ankle_Cross.STL rename to resources/meshes/Booster-K1/Right_Ankle_Cross.STL diff --git a/Resources/meshes/Booster-K1/Right_Arm_1.STL b/resources/meshes/Booster-K1/Right_Arm_1.STL similarity index 100% rename from Resources/meshes/Booster-K1/Right_Arm_1.STL rename to resources/meshes/Booster-K1/Right_Arm_1.STL diff --git a/Resources/meshes/Booster-K1/Right_Arm_2.STL b/resources/meshes/Booster-K1/Right_Arm_2.STL similarity index 100% rename from Resources/meshes/Booster-K1/Right_Arm_2.STL rename to resources/meshes/Booster-K1/Right_Arm_2.STL diff --git a/Resources/meshes/Booster-K1/Right_Arm_3.STL b/resources/meshes/Booster-K1/Right_Arm_3.STL similarity index 100% rename from Resources/meshes/Booster-K1/Right_Arm_3.STL rename to resources/meshes/Booster-K1/Right_Arm_3.STL diff --git a/Resources/meshes/Booster-K1/Right_Arm_4.STL b/resources/meshes/Booster-K1/Right_Arm_4.STL similarity index 100% rename from Resources/meshes/Booster-K1/Right_Arm_4.STL rename to resources/meshes/Booster-K1/Right_Arm_4.STL diff --git a/Resources/meshes/Booster-K1/Right_Crank_Down.STL b/resources/meshes/Booster-K1/Right_Crank_Down.STL similarity index 100% rename from Resources/meshes/Booster-K1/Right_Crank_Down.STL rename to resources/meshes/Booster-K1/Right_Crank_Down.STL diff --git a/Resources/meshes/Booster-K1/Right_Crank_Up.STL b/resources/meshes/Booster-K1/Right_Crank_Up.STL similarity index 100% rename from Resources/meshes/Booster-K1/Right_Crank_Up.STL rename to resources/meshes/Booster-K1/Right_Crank_Up.STL diff --git a/Resources/meshes/Booster-K1/Right_Foot.STL b/resources/meshes/Booster-K1/Right_Foot.STL similarity index 100% rename from Resources/meshes/Booster-K1/Right_Foot.STL rename to resources/meshes/Booster-K1/Right_Foot.STL diff --git a/Resources/meshes/Booster-K1/Right_Hip_Pitch.STL b/resources/meshes/Booster-K1/Right_Hip_Pitch.STL similarity index 100% rename from Resources/meshes/Booster-K1/Right_Hip_Pitch.STL rename to resources/meshes/Booster-K1/Right_Hip_Pitch.STL diff --git a/Resources/meshes/Booster-K1/Right_Hip_Roll.STL b/resources/meshes/Booster-K1/Right_Hip_Roll.STL similarity index 100% rename from Resources/meshes/Booster-K1/Right_Hip_Roll.STL rename to resources/meshes/Booster-K1/Right_Hip_Roll.STL diff --git a/Resources/meshes/Booster-K1/Right_Hip_Yaw.STL b/resources/meshes/Booster-K1/Right_Hip_Yaw.STL similarity index 100% rename from Resources/meshes/Booster-K1/Right_Hip_Yaw.STL rename to resources/meshes/Booster-K1/Right_Hip_Yaw.STL diff --git a/Resources/meshes/Booster-K1/Right_Link_Long.STL b/resources/meshes/Booster-K1/Right_Link_Long.STL similarity index 100% rename from Resources/meshes/Booster-K1/Right_Link_Long.STL rename to resources/meshes/Booster-K1/Right_Link_Long.STL diff --git a/Resources/meshes/Booster-K1/Right_Link_Short.STL b/resources/meshes/Booster-K1/Right_Link_Short.STL similarity index 100% rename from Resources/meshes/Booster-K1/Right_Link_Short.STL rename to resources/meshes/Booster-K1/Right_Link_Short.STL diff --git a/Resources/meshes/Booster-K1/Right_Shank.STL b/resources/meshes/Booster-K1/Right_Shank.STL similarity index 100% rename from Resources/meshes/Booster-K1/Right_Shank.STL rename to resources/meshes/Booster-K1/Right_Shank.STL diff --git a/Resources/meshes/Booster-K1/Trunk.STL b/resources/meshes/Booster-K1/Trunk.STL similarity index 100% rename from Resources/meshes/Booster-K1/Trunk.STL rename to resources/meshes/Booster-K1/Trunk.STL diff --git a/Resources/meshes/Booster-T1/AL1.STL b/resources/meshes/Booster-T1/AL1.STL similarity index 100% rename from Resources/meshes/Booster-T1/AL1.STL rename to resources/meshes/Booster-T1/AL1.STL diff --git a/Resources/meshes/Booster-T1/AL2.STL b/resources/meshes/Booster-T1/AL2.STL similarity index 100% rename from Resources/meshes/Booster-T1/AL2.STL rename to resources/meshes/Booster-T1/AL2.STL diff --git a/Resources/meshes/Booster-T1/AL3.STL b/resources/meshes/Booster-T1/AL3.STL similarity index 100% rename from Resources/meshes/Booster-T1/AL3.STL rename to resources/meshes/Booster-T1/AL3.STL diff --git a/Resources/meshes/Booster-T1/AR1.STL b/resources/meshes/Booster-T1/AR1.STL similarity index 100% rename from Resources/meshes/Booster-T1/AR1.STL rename to resources/meshes/Booster-T1/AR1.STL diff --git a/Resources/meshes/Booster-T1/AR2.STL b/resources/meshes/Booster-T1/AR2.STL similarity index 100% rename from Resources/meshes/Booster-T1/AR2.STL rename to resources/meshes/Booster-T1/AR2.STL diff --git a/Resources/meshes/Booster-T1/AR3.STL b/resources/meshes/Booster-T1/AR3.STL similarity index 100% rename from Resources/meshes/Booster-T1/AR3.STL rename to resources/meshes/Booster-T1/AR3.STL diff --git a/Resources/meshes/Booster-T1/Ankle_Cross_Left.STL b/resources/meshes/Booster-T1/Ankle_Cross_Left.STL similarity index 100% rename from Resources/meshes/Booster-T1/Ankle_Cross_Left.STL rename to resources/meshes/Booster-T1/Ankle_Cross_Left.STL diff --git a/Resources/meshes/Booster-T1/Ankle_Cross_Right.STL b/resources/meshes/Booster-T1/Ankle_Cross_Right.STL similarity index 100% rename from Resources/meshes/Booster-T1/Ankle_Cross_Right.STL rename to resources/meshes/Booster-T1/Ankle_Cross_Right.STL diff --git a/Resources/meshes/Booster-T1/Crank_Down_Left.STL b/resources/meshes/Booster-T1/Crank_Down_Left.STL similarity index 100% rename from Resources/meshes/Booster-T1/Crank_Down_Left.STL rename to resources/meshes/Booster-T1/Crank_Down_Left.STL diff --git a/Resources/meshes/Booster-T1/Crank_Down_Right.STL b/resources/meshes/Booster-T1/Crank_Down_Right.STL similarity index 100% rename from Resources/meshes/Booster-T1/Crank_Down_Right.STL rename to resources/meshes/Booster-T1/Crank_Down_Right.STL diff --git a/Resources/meshes/Booster-T1/Crank_Up_Left.STL b/resources/meshes/Booster-T1/Crank_Up_Left.STL similarity index 100% rename from Resources/meshes/Booster-T1/Crank_Up_Left.STL rename to resources/meshes/Booster-T1/Crank_Up_Left.STL diff --git a/Resources/meshes/Booster-T1/Crank_Up_Right.STL b/resources/meshes/Booster-T1/Crank_Up_Right.STL similarity index 100% rename from Resources/meshes/Booster-T1/Crank_Up_Right.STL rename to resources/meshes/Booster-T1/Crank_Up_Right.STL diff --git a/Resources/meshes/Booster-T1/Down_Left_XX_Ball.STL b/resources/meshes/Booster-T1/Down_Left_XX_Ball.STL similarity index 100% rename from Resources/meshes/Booster-T1/Down_Left_XX_Ball.STL rename to resources/meshes/Booster-T1/Down_Left_XX_Ball.STL diff --git a/Resources/meshes/Booster-T1/Down_Left_X_Ball.STL b/resources/meshes/Booster-T1/Down_Left_X_Ball.STL similarity index 100% rename from Resources/meshes/Booster-T1/Down_Left_X_Ball.STL rename to resources/meshes/Booster-T1/Down_Left_X_Ball.STL diff --git a/Resources/meshes/Booster-T1/Down_Left_Y_Ball.STL b/resources/meshes/Booster-T1/Down_Left_Y_Ball.STL similarity index 100% rename from Resources/meshes/Booster-T1/Down_Left_Y_Ball.STL rename to resources/meshes/Booster-T1/Down_Left_Y_Ball.STL diff --git a/Resources/meshes/Booster-T1/Down_Right_XX_Ball.STL b/resources/meshes/Booster-T1/Down_Right_XX_Ball.STL similarity index 100% rename from Resources/meshes/Booster-T1/Down_Right_XX_Ball.STL rename to resources/meshes/Booster-T1/Down_Right_XX_Ball.STL diff --git a/Resources/meshes/Booster-T1/Down_Right_X_Ball.STL b/resources/meshes/Booster-T1/Down_Right_X_Ball.STL similarity index 100% rename from Resources/meshes/Booster-T1/Down_Right_X_Ball.STL rename to resources/meshes/Booster-T1/Down_Right_X_Ball.STL diff --git a/Resources/meshes/Booster-T1/Down_Right_Y_Ball.STL b/resources/meshes/Booster-T1/Down_Right_Y_Ball.STL similarity index 100% rename from Resources/meshes/Booster-T1/Down_Right_Y_Ball.STL rename to resources/meshes/Booster-T1/Down_Right_Y_Ball.STL diff --git a/Resources/meshes/Booster-T1/H1.STL b/resources/meshes/Booster-T1/H1.STL similarity index 100% rename from Resources/meshes/Booster-T1/H1.STL rename to resources/meshes/Booster-T1/H1.STL diff --git a/Resources/meshes/Booster-T1/H2.STL b/resources/meshes/Booster-T1/H2.STL similarity index 100% rename from Resources/meshes/Booster-T1/H2.STL rename to resources/meshes/Booster-T1/H2.STL diff --git a/Resources/meshes/Booster-T1/Hip_Pitch_Left.STL b/resources/meshes/Booster-T1/Hip_Pitch_Left.STL similarity index 100% rename from Resources/meshes/Booster-T1/Hip_Pitch_Left.STL rename to resources/meshes/Booster-T1/Hip_Pitch_Left.STL diff --git a/Resources/meshes/Booster-T1/Hip_Pitch_Right.STL b/resources/meshes/Booster-T1/Hip_Pitch_Right.STL similarity index 100% rename from Resources/meshes/Booster-T1/Hip_Pitch_Right.STL rename to resources/meshes/Booster-T1/Hip_Pitch_Right.STL diff --git a/Resources/meshes/Booster-T1/Hip_Roll_Left.STL b/resources/meshes/Booster-T1/Hip_Roll_Left.STL similarity index 100% rename from Resources/meshes/Booster-T1/Hip_Roll_Left.STL rename to resources/meshes/Booster-T1/Hip_Roll_Left.STL diff --git a/Resources/meshes/Booster-T1/Hip_Roll_Right.STL b/resources/meshes/Booster-T1/Hip_Roll_Right.STL similarity index 100% rename from Resources/meshes/Booster-T1/Hip_Roll_Right.STL rename to resources/meshes/Booster-T1/Hip_Roll_Right.STL diff --git a/Resources/meshes/Booster-T1/Hip_Yaw_Left.STL b/resources/meshes/Booster-T1/Hip_Yaw_Left.STL similarity index 100% rename from Resources/meshes/Booster-T1/Hip_Yaw_Left.STL rename to resources/meshes/Booster-T1/Hip_Yaw_Left.STL diff --git a/Resources/meshes/Booster-T1/Hip_Yaw_Right.STL b/resources/meshes/Booster-T1/Hip_Yaw_Right.STL similarity index 100% rename from Resources/meshes/Booster-T1/Hip_Yaw_Right.STL rename to resources/meshes/Booster-T1/Hip_Yaw_Right.STL diff --git a/Resources/meshes/Booster-T1/Link_Long_Left.STL b/resources/meshes/Booster-T1/Link_Long_Left.STL similarity index 100% rename from Resources/meshes/Booster-T1/Link_Long_Left.STL rename to resources/meshes/Booster-T1/Link_Long_Left.STL diff --git a/Resources/meshes/Booster-T1/Link_Long_Right.STL b/resources/meshes/Booster-T1/Link_Long_Right.STL similarity index 100% rename from Resources/meshes/Booster-T1/Link_Long_Right.STL rename to resources/meshes/Booster-T1/Link_Long_Right.STL diff --git a/Resources/meshes/Booster-T1/Link_Short_Left.STL b/resources/meshes/Booster-T1/Link_Short_Left.STL similarity index 100% rename from Resources/meshes/Booster-T1/Link_Short_Left.STL rename to resources/meshes/Booster-T1/Link_Short_Left.STL diff --git a/Resources/meshes/Booster-T1/Link_Short_Right.STL b/resources/meshes/Booster-T1/Link_Short_Right.STL similarity index 100% rename from Resources/meshes/Booster-T1/Link_Short_Right.STL rename to resources/meshes/Booster-T1/Link_Short_Right.STL diff --git a/Resources/meshes/Booster-T1/Shank_Left.STL b/resources/meshes/Booster-T1/Shank_Left.STL similarity index 100% rename from Resources/meshes/Booster-T1/Shank_Left.STL rename to resources/meshes/Booster-T1/Shank_Left.STL diff --git a/Resources/meshes/Booster-T1/Shank_Right.STL b/resources/meshes/Booster-T1/Shank_Right.STL similarity index 100% rename from Resources/meshes/Booster-T1/Shank_Right.STL rename to resources/meshes/Booster-T1/Shank_Right.STL diff --git a/Resources/meshes/Booster-T1/Trunk.STL b/resources/meshes/Booster-T1/Trunk.STL similarity index 100% rename from Resources/meshes/Booster-T1/Trunk.STL rename to resources/meshes/Booster-T1/Trunk.STL diff --git a/Resources/meshes/Booster-T1/Up_Left_XX_Ball.STL b/resources/meshes/Booster-T1/Up_Left_XX_Ball.STL similarity index 100% rename from Resources/meshes/Booster-T1/Up_Left_XX_Ball.STL rename to resources/meshes/Booster-T1/Up_Left_XX_Ball.STL diff --git a/Resources/meshes/Booster-T1/Up_Left_X_Ball.STL b/resources/meshes/Booster-T1/Up_Left_X_Ball.STL similarity index 100% rename from Resources/meshes/Booster-T1/Up_Left_X_Ball.STL rename to resources/meshes/Booster-T1/Up_Left_X_Ball.STL diff --git a/Resources/meshes/Booster-T1/Up_Left_Y_Ball.STL b/resources/meshes/Booster-T1/Up_Left_Y_Ball.STL similarity index 100% rename from Resources/meshes/Booster-T1/Up_Left_Y_Ball.STL rename to resources/meshes/Booster-T1/Up_Left_Y_Ball.STL diff --git a/Resources/meshes/Booster-T1/Up_Right_XX_Ball.STL b/resources/meshes/Booster-T1/Up_Right_XX_Ball.STL similarity index 100% rename from Resources/meshes/Booster-T1/Up_Right_XX_Ball.STL rename to resources/meshes/Booster-T1/Up_Right_XX_Ball.STL diff --git a/Resources/meshes/Booster-T1/Up_Right_X_Ball.STL b/resources/meshes/Booster-T1/Up_Right_X_Ball.STL similarity index 100% rename from Resources/meshes/Booster-T1/Up_Right_X_Ball.STL rename to resources/meshes/Booster-T1/Up_Right_X_Ball.STL diff --git a/Resources/meshes/Booster-T1/Up_Right_Y_Ball.STL b/resources/meshes/Booster-T1/Up_Right_Y_Ball.STL similarity index 100% rename from Resources/meshes/Booster-T1/Up_Right_Y_Ball.STL rename to resources/meshes/Booster-T1/Up_Right_Y_Ball.STL diff --git a/Resources/meshes/Booster-T1/Waist.STL b/resources/meshes/Booster-T1/Waist.STL similarity index 100% rename from Resources/meshes/Booster-T1/Waist.STL rename to resources/meshes/Booster-T1/Waist.STL diff --git a/Resources/meshes/Booster-T1/left_foot_link.STL b/resources/meshes/Booster-T1/left_foot_link.STL similarity index 100% rename from Resources/meshes/Booster-T1/left_foot_link.STL rename to resources/meshes/Booster-T1/left_foot_link.STL diff --git a/Resources/meshes/Booster-T1/left_hand_link.STL b/resources/meshes/Booster-T1/left_hand_link.STL similarity index 100% rename from Resources/meshes/Booster-T1/left_hand_link.STL rename to resources/meshes/Booster-T1/left_hand_link.STL diff --git a/Resources/meshes/Booster-T1/right_foot_link.STL b/resources/meshes/Booster-T1/right_foot_link.STL similarity index 100% rename from Resources/meshes/Booster-T1/right_foot_link.STL rename to resources/meshes/Booster-T1/right_foot_link.STL diff --git a/Resources/meshes/Booster-T1/right_hand_link.STL b/resources/meshes/Booster-T1/right_hand_link.STL similarity index 100% rename from Resources/meshes/Booster-T1/right_hand_link.STL rename to resources/meshes/Booster-T1/right_hand_link.STL diff --git a/Resources/meshes/ball/Cafusa_Bump.png b/resources/meshes/ball/Cafusa_Bump.png similarity index 100% rename from Resources/meshes/ball/Cafusa_Bump.png rename to resources/meshes/ball/Cafusa_Bump.png diff --git a/Resources/meshes/ball/Cafusa_Diffuse.png b/resources/meshes/ball/Cafusa_Diffuse.png similarity index 100% rename from Resources/meshes/ball/Cafusa_Diffuse.png rename to resources/meshes/ball/Cafusa_Diffuse.png diff --git a/Resources/meshes/ball/ball.obj b/resources/meshes/ball/ball.obj similarity index 99% rename from Resources/meshes/ball/ball.obj rename to resources/meshes/ball/ball.obj index 0a35801..adccca1 100644 --- a/Resources/meshes/ball/ball.obj +++ b/resources/meshes/ball/ball.obj @@ -17601,4 +17601,4 @@ f 4281/258/258 4156/3472/3265 4158/4544/4250 4282/2069/1964 f 4283/2425/2295 4160/4280/4016 4159/2765/2614 4284/2764/2613 f 4285/3084/2912 4162/3083/2911 4164/3042/2873 4286/3041/2872 f 267/2277/299 269/4365/295 2031/4368/4086 2035/2274/2153 -f 567/524/522 2460/1464/1410 2432/2175/2066 478/525/523 +f 567/524/522 2460/1464/1410 2432/2175/2066 478/525/523 \ No newline at end of file diff --git a/Resources/robots/Booster-K1/common.xml b/resources/robots/Booster-K1/common.xml similarity index 100% rename from Resources/robots/Booster-K1/common.xml rename to resources/robots/Booster-K1/common.xml diff --git a/Resources/robots/Booster-K1/instance.xml b/resources/robots/Booster-K1/instance.xml similarity index 100% rename from Resources/robots/Booster-K1/instance.xml rename to resources/robots/Booster-K1/instance.xml diff --git a/Resources/robots/Booster-T1/common.xml b/resources/robots/Booster-T1/common.xml similarity index 99% rename from Resources/robots/Booster-T1/common.xml rename to resources/robots/Booster-T1/common.xml index 193e96d..f4615a5 100644 --- a/Resources/robots/Booster-T1/common.xml +++ b/resources/robots/Booster-T1/common.xml @@ -1,14 +1,14 @@ - + - + - + diff --git a/Resources/robots/Booster-T1/instance.xml b/resources/robots/Booster-T1/instance.xml similarity index 99% rename from Resources/robots/Booster-T1/instance.xml rename to resources/robots/Booster-T1/instance.xml index 1ed8dd3..bcb3b75 100644 --- a/Resources/robots/Booster-T1/instance.xml +++ b/resources/robots/Booster-T1/instance.xml @@ -89,7 +89,7 @@ - + @@ -100,7 +100,7 @@ - + @@ -127,7 +127,7 @@ - + @@ -147,7 +147,7 @@ - + diff --git a/Resources/Scenes/mixed_scene.yaml b/resources/scenes/mixed_scene.yaml similarity index 100% rename from Resources/Scenes/mixed_scene.yaml rename to resources/scenes/mixed_scene.yaml diff --git a/Resources/textures/ball.png b/resources/textures/ball.png similarity index 100% rename from Resources/textures/ball.png rename to resources/textures/ball.png diff --git a/Resources/textures/fieldRCAP.png b/resources/textures/fieldRCAP.png similarity index 100% rename from Resources/textures/fieldRCAP.png rename to resources/textures/fieldRCAP.png diff --git a/Resources/textures/net.png b/resources/textures/net.png similarity index 100% rename from Resources/textures/net.png rename to resources/textures/net.png diff --git a/Resources/textures/shadow_grad.png b/resources/textures/shadow_grad.png similarity index 100% rename from Resources/textures/shadow_grad.png rename to resources/textures/shadow_grad.png diff --git a/Resources/textures/soccer_field.png b/resources/textures/soccer_field.png similarity index 100% rename from Resources/textures/soccer_field.png rename to resources/textures/soccer_field.png diff --git a/Src/AppWindow.cpp b/src/AppWindow.cpp similarity index 97% rename from Src/AppWindow.cpp rename to src/AppWindow.cpp index df39db8..ac4a0a6 100644 --- a/Src/AppWindow.cpp +++ b/src/AppWindow.cpp @@ -7,8 +7,9 @@ #include "Constants.h" #include "MujocoContext.h" -#include "Robot.h" +#include "RobotManager.h" #include "SceneParser.h" + namespace spqr { AppWindow::AppWindow(int& argc, char** argv) { @@ -44,7 +45,7 @@ AppWindow::AppWindow(int& argc, char** argv) { }; void AppWindow::openScene() { - QString fileName = QFileDialog::getOpenFileName(this, tr("Open Scene File"), "Resources/Scenes/", + QString fileName = QFileDialog::getOpenFileName(this, tr("Open Scene File"), "resources/scenes/", tr("YAML Files (*.yaml)")); if (!fileName.isEmpty()) { loadScene(fileName); diff --git a/Src/Bindings.cpp b/src/Bindings.cpp similarity index 100% rename from Src/Bindings.cpp rename to src/Bindings.cpp diff --git a/Src/CircusApplication.cpp b/src/CircusApplication.cpp similarity index 100% rename from Src/CircusApplication.cpp rename to src/CircusApplication.cpp diff --git a/Src/Container.cpp b/src/Container.cpp similarity index 100% rename from Src/Container.cpp rename to src/Container.cpp diff --git a/Src/MujocoContext.cpp b/src/MujocoContext.cpp similarity index 100% rename from Src/MujocoContext.cpp rename to src/MujocoContext.cpp diff --git a/Src/SceneParser.cpp b/src/SceneParser.cpp similarity index 96% rename from Src/SceneParser.cpp rename to src/SceneParser.cpp index 486b47b..3747459 100644 --- a/Src/SceneParser.cpp +++ b/src/SceneParser.cpp @@ -12,8 +12,10 @@ #include #include -#include "Robot.h" +#include "RobotManager.h" #include "Team.h" +#include "robots/Robot.h" + using namespace pugi; using namespace std; namespace spqr { @@ -99,11 +101,11 @@ string SceneParser::buildMuJoCoXml() { xml_node compiler = mujoco.append_child("compiler"); compiler.append_attribute("angle") = "radian"; - compiler.append_attribute("meshdir") = "Resources/meshes/"; + compiler.append_attribute("meshdir") = "resources/meshes/"; xml_node include_node = mujoco.append_child("include"); include_node.append_attribute("file") - = (filesystem::path(PROJECT_ROOT) / "Resources" / "includes" / (scene.field + ".xml")).c_str(); + = (filesystem::path(PROJECT_ROOT) / "resources" / "includes" / (scene.field + ".xml")).c_str(); xml_node visual = mujoco.append_child("visual"); xml_node map = visual.append_child("quality"); @@ -111,7 +113,7 @@ string SceneParser::buildMuJoCoXml() { include_node = mujoco.append_child("include"); include_node.append_attribute("file") - = (filesystem::path(PROJECT_ROOT) / "Resources" / "includes" / "ball.xml").c_str(); + = (filesystem::path(PROJECT_ROOT) / "resources" / "includes" / "ball.xml").c_str(); for (const string& robotType : robotTypes) buildRobotCommon(robotType, mujoco); @@ -153,7 +155,7 @@ string SceneParser::buildMuJoCoXml() { void SceneParser::buildRobotCommon(const string& robotType, xml_node& mujoco) { filesystem::path commonPath - = filesystem::path(PROJECT_ROOT) / "Resources" / "robots" / robotType / "common.xml"; + = filesystem::path(PROJECT_ROOT) / "resources" / "robots" / robotType / "common.xml"; if (!filesystem::exists(commonPath)) { throw runtime_error("Robot common file does not exist: " + commonPath.string()); } @@ -192,7 +194,7 @@ void SceneParser::prefixSubtree(xml_node& root, const string& robotName) { void SceneParser::buildRobotInstance(const shared_ptr& robotSpec, xml_node& worldbody, xml_node& actuator, xml_node& sensor) { filesystem::path instancePath - = filesystem::path(PROJECT_ROOT) / "Resources" / "robots" / robotSpec->type / "instance.xml"; + = filesystem::path(PROJECT_ROOT) / "resources" / "robots" / robotSpec->type / "instance.xml"; if (!filesystem::exists(instancePath)) { throw runtime_error("Robot instance file does not exist: " + instancePath.string()); diff --git a/Src/SimulationThread.cpp b/src/SimulationThread.cpp similarity index 97% rename from Src/SimulationThread.cpp rename to src/SimulationThread.cpp index 2667a87..1459d80 100644 --- a/Src/SimulationThread.cpp +++ b/src/SimulationThread.cpp @@ -2,7 +2,7 @@ #include -#include "Robot.h" +#include "RobotManager.h" namespace spqr { diff --git a/Src/SimulationViewport.cpp b/src/SimulationViewport.cpp similarity index 100% rename from Src/SimulationViewport.cpp rename to src/SimulationViewport.cpp diff --git a/Src/main.cpp b/src/main.cpp similarity index 100% rename from Src/main.cpp rename to src/main.cpp