[
  {
    "path": ".gitignore",
    "content": "*.mex*\n*.pyc\n*.tgz\n*.so\n*.o\noutput*\nlib/synthesize/build/*\nlib/utils/bbox.c\ndata/\ndata_self/\ndocker/\nngc/\n\n.idea/\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\npip-wheel-metadata/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n.hypothesis/\n.pytest_cache/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n.python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# celery beat schedule file\ncelerybeat-schedule\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n.idea/\n.\n\n*.png\n\nresults/\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"ycb_render/pybind11\"]\n\tpath = ycb_render/pybind11\n\turl = https://github.com/pybind/pybind11.git\n"
  },
  {
    "path": "LICENSE.md",
    "content": "# NVIDIA Source Code License for PoseCNN-PyTorch: A PyTorch Implementation of the PoseCNN Framework for 6D Object Pose Estimation\n\n## 1. Definitions\n\n“Licensor” means any person or entity that distributes its Work.\n\n“Software” means the original work of authorship made available under this License.\n“Work” means the Software and any additions to or derivative works of the Software that are made available under this License.\n\n“Nvidia Processors” means any central processing unit (CPU), graphics processing unit (GPU), field-programmable gate array (FPGA), application-specific integrated circuit (ASIC) or any combination thereof designed, made, sold, or provided by Nvidia or its affiliates.\n\nThe terms “reproduce,” “reproduction,” “derivative works,” and “distribution” have the meaning as provided under U.S. copyright law; provided, however, that for the purposes of this License, derivative works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work.\n\nWorks, including the Software, are “made available” under this License by including in or with the Work either (a) a copyright notice referencing the applicability of this License to the Work, or (b) a copy of this License.\n\n## 2. License Grants\n\n### 2.1 Copyright Grant.\nSubject to the terms and conditions of this License, each Licensor grants to you a perpetual, worldwide, non-exclusive, royalty-free, copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense and distribute its Work and any resulting derivative works in any form.\n\n## 3. Limitations\n\n### 3.1 Redistribution.\n You may reproduce or distribute the Work only if (a) you do so under this License, (b) you include a complete copy of this License with your distribution, and (c) you retain without modification any copyright, patent, trademark, or attribution notices that are present in the Work.\n\n### 3.2 Derivative Works.\n You may specify that additional or different terms apply to the use, reproduction, and distribution of your derivative works of the Work (“Your Terms”) only if (a) Your Terms provide that the use limitation in Section 3.3 applies to your derivative works, and (b) you identify the specific derivative works that are subject to Your Terms. Notwithstanding Your Terms, this License (including the redistribution requirements in Section 3.1) will continue to apply to the Work itself.\n\n### 3.3 Use Limitation.\n The Work and any derivative works thereof only may be used or intended for use non-commercially.  The Work or derivative works thereof may be used or intended for use by Nvidia or its affiliates commercially or non-commercially.  As used herein, “non-commercially” means for research or evaluation purposes only.\n\n### 3.4 Patent Claims.\n If you bring or threaten to bring a patent claim against any Licensor (including any claim, cross-claim or counterclaim in a lawsuit) to enforce any patents that you allege are infringed by any Work, then your rights under this License from such Licensor (including the grants in Sections 2.1 and 2.2) will terminate immediately.\n\n### 3.5 Trademarks.\n This License does not grant any rights to use any Licensor’s or its affiliates’ names, logos, or trademarks, except as necessary to reproduce the notices described in this License.\n\n### 3.6 Termination.\n If you violate any term of this License, then your rights under this License (including the grants in Sections 2.1 and 2.2) will terminate immediately.\n\n## 4. Disclaimer of Warranty.\n\nTHE WORK IS PROVIDED “AS IS” WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WARRANTIES OR CONDITIONS OF M ERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE OR NON-INFRINGEMENT. YOU BEAR THE RISK OF UNDERTAKING ANY ACTIVITIES UNDER THIS LICENSE. \n\n## 5. Limitation of Liability.\n\nEXCEPT AS PROHIBITED BY APPLICABLE LAW, IN NO EVENT AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE SHALL ANY LICENSOR BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATED TO THIS LICENSE, THE USE OR INABILITY TO USE THE WORK (INCLUDING BUT NOT LIMITED TO LOSS OF GOODWILL, BUSINESS INTERRUPTION, LOST PROFITS OR DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY OTHER COMM ERCIAL DAMAGES OR LOSSES), EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\n"
  },
  {
    "path": "README.md",
    "content": "# PoseCNN-PyTorch: A PyTorch Implementation of the PoseCNN Framework for 6D Object Pose Estimation\n\n### Introduction\n\nWe implement PoseCNN in PyTorch in this project.\n\nPoseCNN is an end-to-end Convolutional Neural Network for 6D object pose estimation. PoseCNN estimates the 3D translation of an object by localizing its center in the image and predicting its distance from the camera. The 3D rotation of the object is estimated by regressing to a quaternion representation. [arXiv](https://arxiv.org/abs/1711.00199), [Project](https://rse-lab.cs.washington.edu/projects/posecnn/)\n\nRotation regression in PoseCNN cannot handle symmetric objects very well. Check [PoseRBPF](https://github.com/NVlabs/PoseRBPF) for a better solution for symmetric objects.\n\nThe code also supports pose refinement by matching segmented 3D point cloud of an object to its SDF.\n\n<p align=\"center\"><img src=\"./data/pics/intro.png\" width=\"640\" height=\"320\"/></p>\n\n### License\n\nPoseCNN-PyTorch is released under the NVIDIA Source Code License (refer to the LICENSE file for details).\n\n### Citation\n\nIf you find the package is useful in your research, please consider citing:\n\n    @inproceedings{xiang2018posecnn,\n        Author = {Yu Xiang and Tanner Schmidt and Venkatraman Narayanan and Dieter Fox},\n        Title = {{PoseCNN}: A Convolutional Neural Network for {6D} Object Pose Estimation in Cluttered Scenes},\n        booktitle = {Robotics: Science and Systems (RSS)},\n        Year = {2018}\n    }\n\n### Required environment\n\n- Ubuntu 16.04 or above\n- PyTorch 0.4.1 or above\n- CUDA 9.1 or above\n\n### Installation\n\nUse python3. If ROS is needed, compile with python2.\n\n1. Install [PyTorch](https://pytorch.org/)\n\n2. Install Eigen from the Github source code [here](https://github.com/eigenteam/eigen-git-mirror)\n\n3. Install Sophus from the Github source code [here](https://github.com/yuxng/Sophus)\n\n4. Install python packages\n   ```Shell\n   pip install -r requirement.txt\n   ```\n\n5. Initialize the submodules in ycb_render\n   ```Shell\n   git submodule update --init --recursive\n   ```\n\n6. Compile the new layers under $ROOT/lib/layers we introduce in PoseCNN\n    ```Shell\n    cd $ROOT/lib/layers\n    sudo python setup.py install\n    ```\n\n7. Compile cython components\n    ```Shell\n    cd $ROOT/lib/utils\n    python setup.py build_ext --inplace\n    ```\n\n8. Compile the ycb_render in $ROOT/ycb_render\n    ```Shell\n    cd $ROOT/ycb_render\n    sudo python setup.py develop\n    ```\n\n### Download\n\n- 3D models of YCB Objects we used [here](https://drive.google.com/file/d/1PTNmhd-eSq0fwSPv0nvQN8h_scR1v-UJ/view?usp=sharing) (3G). Save under $ROOT/data or use a symbol link.\n\n- Our pre-trained checkpoints [here](https://drive.google.com/file/d/1-ECAkkTRfa1jJ9YBTzf04wxCGw6-m5d4/view?usp=sharing) (4G). Save under $ROOT/data or use a symbol link.\n\n- Our real-world images with pose annotations for 20 YCB objects collected via robot interation [here](https://drive.google.com/file/d/1cQH_dnDzyrI0MWNx8st4lht_q0F6cUrE/view?usp=sharing) (53G). Check our ICRA 2020 [paper](https://arxiv.org/abs/1909.10159) for details.\n\n\n### Running the demo\n\n1. Download 3D models and our pre-trained checkpoints first.\n\n2. run the following script\n    ```Shell\n    ./experiments/scripts/demo.sh\n    ```\n\n<p align=\"center\"><img src=\"./data/pics/posecnn.png\" width=\"640\" height=\"360\"/></p>\n\n### Training your own models with synthetic data for YCB objects\n\n1. Download background images, and save to $ROOT/data or use symbol links.\n\n    - Our own images [here](https://drive.google.com/file/d/1Q5VTKHEEejT2lAKwefG00eWcrnNnpieC/view?usp=sharing) (7G)\n    - COCO 2014 images [here](https://cocodataset.org/#download)\n    - Or use your own background images\n\n2. Download pretrained VGG16 weights: [here](https://drive.google.com/file/d/1tTd64s1zNnjONlXvTFDZAf4E68Pupc_S/view?usp=sharing) (528M). Put the weight file to $ROOT/data/checkpoints. If our pre-trained models are already downloaded, the VGG16 checkpoint should be in $ROOT/data/checkpoints already.\n\n3. Training and testing for 20 YCB objects with synthetic data. Modify the configuration file for training on a subset of these objects.\n    ```Shell\n    cd $ROOT\n\n    # multi-gpu training, use 1 GPU or 2 GPUs since batch size is set to 2\n    ./experiments/scripts/ycb_object_train.sh\n\n    # testing on synthetic data, $GPU_ID can be 0, 1, etc.\n    ./experiments/scripts/ycb_object_test.sh $GPU_ID\n\n    ```\n\n### Training and testing on the YCB-Video dataset\n1. Download the YCB-Video dataset from [here](https://rse-lab.cs.washington.edu/projects/posecnn/).\n\n2. Create a symlink for the YCB-Video dataset\n    ```Shell\n    cd $ROOT/data/YCB_Video\n    ln -s $ycb_data data\n    ```\n\n3. Training and testing on the YCB-Video dataset\n    ```Shell\n    cd $ROOT\n\n    # multi-gpu training, use 1 GPU or 2 GPUs since batch size is set to 2\n    ./experiments/scripts/ycb_video_train.sh\n\n    # testing, $GPU_ID can be 0, 1, etc.\n    ./experiments/scripts/ycb_video_test.sh $GPU_ID\n\n    ```\n\n### Training and testing on the DexYCB dataset\n1. Download the DexYCB dataset from [here](https://dex-ycb.github.io/).\n\n2. Create a symlink for the DexYCB dataset\n    ```Shell\n    cd $ROOT/data/DEX_YCB\n    ln -s $dex_ycb_data data\n    ```\n\n3. Training and testing on the DexYCB dataset\n    ```Shell\n    cd $ROOT\n\n    # multi-gpu training for different splits, use 1 GPU or 2 GPUs since batch size is set to 2\n    ./experiments/scripts/dex_ycb_train_s0.sh\n    ./experiments/scripts/dex_ycb_train_s1.sh\n    ./experiments/scripts/dex_ycb_train_s2.sh\n    ./experiments/scripts/dex_ycb_train_s3.sh\n\n    # testing, $GPU_ID can be 0, 1, etc.\n    # our trained models are in checkpoints.zip\n    ./experiments/scripts/dex_ycb_test_s0.sh $GPU_ID $EPOCH\n    ./experiments/scripts/dex_ycb_test_s1.sh $GPU_ID $EPOCH\n    ./experiments/scripts/dex_ycb_test_s2.sh $GPU_ID $EPOCH\n    ./experiments/scripts/dex_ycb_test_s3.sh $GPU_ID $EPOCH\n\n    ```\n\n### Running with ROS on a Realsense Camera for real-world pose estimation\n\n- Python2 is needed for ROS.\n\n- Make sure our pretrained checkpoints are downloaded.\n\n```Shell\n# start realsense\nroslaunch realsense2_camera rs_aligned_depth.launch tf_prefix:=measured/camera\n\n# start rviz\nrosrun rviz rviz -d ./ros/posecnn.rviz\n\n# run posecnn for detection only (20 objects), $GPU_ID can be 0, 1, etc.\n./experiments/scripts/ros_ycb_object_test_detection.sh $GPU_ID\n\n# run full posecnn (20 objects), $GPU_ID can be 0, 1, etc.\n./experiments/scripts/ros_ycb_object_test.sh $GPU_ID\n```\n\nOur example:\n<p align=\"center\"><img src=\"./data/pics/posecnn.gif\"/></p>\n"
  },
  {
    "path": "build.sh",
    "content": "cd lib/layers/;\npython3 setup.py build develop;\ncd ../utils;\npython3 setup.py build_ext --inplace;\ncd ../../ycb_render;\npython3 setup.py develop\n\n"
  },
  {
    "path": "experiments/cfgs/dex_ycb.yml",
    "content": "EXP_DIR: dex_ycb\nINPUT: COLOR\nTRAIN:\n  TRAINABLE: True\n  WEIGHT_DECAY: 0.0001\n  LEARNING_RATE: 0.001\n  MILESTONES: !!python/tuple [12]\n  MOMENTUM: 0.9\n  BETA: 0.999\n  GAMMA: 0.1\n  SCALES_BASE: !!python/tuple [1.0]\n  IMS_PER_BATCH: 2\n  MAX_ITERS_PER_EPOCH: 20000\n  NUM_UNITS: 64\n  HARD_LABEL_THRESHOLD: 0.9\n  HARD_LABEL_SAMPLING: 0.0\n  HARD_ANGLE: 5.0\n  HOUGH_LABEL_THRESHOLD: 100\n  HOUGH_VOTING_THRESHOLD: 10\n  HOUGH_SKIP_PIXELS: 10\n  FG_THRESH: 0.5\n  FG_THRESH_POSE: 0.5\n  CLASSES: !!python/tuple [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21] # no large clamp\n  SNAPSHOT_INFIX: dex_ycb\n  SNAPSHOT_EPOCHS: 1\n  SNAPSHOT_PREFIX: vgg16\n  USE_FLIPPED: False\n  CHROMATIC: True\n  ADD_NOISE: True\n  VISUALIZE: False\n  VERTEX_REG: True\n  POSE_REG: True\n  FREEZE_LAYERS: False\n  VERTEX_W: 10.0\n  VERTEX_W_INSIDE: 10.0\n  # synthetic data\n  SYNTHESIZE: False\n  SYN_RATIO: 5\n  SYN_BACKGROUND_SPECIFIC: False\n  SYN_BACKGROUND_SUBTRACT_MEAN: True\n  SYN_SAMPLE_OBJECT: True\n  SYN_SAMPLE_POSE: False\n  SYN_MIN_OBJECT: 5\n  SYN_MAX_OBJECT: 8\n  SYN_TNEAR: 0.5\n  SYN_TFAR: 1.6\n  SYN_BOUND: 0.15\n  SYN_STD_ROTATION: 15\n  SYN_STD_TRANSLATION: 0.05\nTEST:\n  SINGLE_FRAME: True\n  HOUGH_LABEL_THRESHOLD: 200\n  HOUGH_VOTING_THRESHOLD: 10\n  NUM_SDF_ITERATIONS_TRACKING: 50\n  SDF_TRANSLATION_REG: 1000.0\n  SDF_ROTATION_REG: 10.0\n  IMS_PER_BATCH: 1\n  HOUGH_SKIP_PIXELS: 10\n  DET_THRESHOLD: 0.1\n  SCALES_BASE: !!python/tuple [1.0]\n  VISUALIZE: False\n  SYNTHESIZE: False\n  POSE_REFINE: True\n  ROS_CAMERA: camera\n  CLASSES: !!python/tuple [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21] # no large clamp\n"
  },
  {
    "path": "experiments/cfgs/ycb_object.yml",
    "content": "EXP_DIR: ycb_object\nINPUT: COLOR\nTRAIN:\n  TRAINABLE: True\n  WEIGHT_DECAY: 0.0001\n  LEARNING_RATE: 0.001\n  MILESTONES: !!python/tuple [3]\n  MOMENTUM: 0.9\n  BETA: 0.999\n  GAMMA: 0.1\n  SCALES_BASE: !!python/tuple [1.0]\n  IMS_PER_BATCH: 2\n  NUM_UNITS: 64\n  HARD_LABEL_THRESHOLD: 0.9\n  HARD_LABEL_SAMPLING: 0.0\n  HARD_ANGLE: 5.0\n  HOUGH_LABEL_THRESHOLD: 100\n  HOUGH_VOTING_THRESHOLD: 10\n  HOUGH_SKIP_PIXELS: 10\n  FG_THRESH: 0.5\n  FG_THRESH_POSE: 0.5\n  CLASSES: !!python/tuple [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21] # no large clamp\n  SYMMETRY: !!python/tuple [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1]\n  SNAPSHOT_INFIX: ycb_object\n  SNAPSHOT_EPOCHS: 1\n  SNAPSHOT_PREFIX: vgg16\n  USE_FLIPPED: False\n  CHROMATIC: True\n  ADD_NOISE: True\n  VISUALIZE: False\n  VERTEX_REG: True\n  POSE_REG: True\n  SLIM: False\n  # synthetic data\n  SYNTHESIZE: True\n  SYNNUM: 40000\n  SYN_RATIO: 5\n  SYN_BACKGROUND_SPECIFIC: True\n  SYN_BACKGROUND_SUBTRACT_MEAN: True\n  SYN_SAMPLE_OBJECT: True\n  SYN_SAMPLE_POSE: False\n  SYN_MIN_OBJECT: 5\n  SYN_MAX_OBJECT: 8\n  SYN_TNEAR: 0.5\n  SYN_TFAR: 1.6\n  SYN_BOUND: 0.3\n  SYN_STD_ROTATION: 15\n  SYN_STD_TRANSLATION: 0.05\nTEST:\n  SINGLE_FRAME: True\n  HOUGH_LABEL_THRESHOLD: 400\n  HOUGH_VOTING_THRESHOLD: 10\n  NUM_SDF_ITERATIONS_TRACKING: 50\n  SDF_TRANSLATION_REG: 1000.0\n  SDF_ROTATION_REG: 10.0\n  IMS_PER_BATCH: 1\n  HOUGH_SKIP_PIXELS: 10\n  DET_THRESHOLD: 0.2\n  SCALES_BASE: !!python/tuple [1.0]\n  VISUALIZE: True\n  SYNTHESIZE: True\n  POSE_REFINE: True\n  ROS_CAMERA: D435\n  CLASSES: !!python/tuple [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21] # no large clamp\n  SYMMETRY: !!python/tuple [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1]\n"
  },
  {
    "path": "experiments/cfgs/ycb_object_detection.yml",
    "content": "EXP_DIR: ycb_object\nINPUT: COLOR\nTRAIN:\n  TRAINABLE: True\n  WEIGHT_DECAY: 0.0001\n  LEARNING_RATE: 0.001\n  MILESTONES: !!python/tuple [3]\n  MOMENTUM: 0.9\n  BETA: 0.999\n  GAMMA: 0.1\n  SCALES_BASE: !!python/tuple [1.0]\n  IMS_PER_BATCH: 2\n  NUM_UNITS: 64\n  HARD_LABEL_THRESHOLD: 0.9\n  HARD_LABEL_SAMPLING: 0.0\n  HARD_ANGLE: 5.0\n  HOUGH_LABEL_THRESHOLD: 100\n  HOUGH_VOTING_THRESHOLD: 10\n  HOUGH_SKIP_PIXELS: 10\n  FG_THRESH: 0.5\n  FG_THRESH_POSE: 0.5\n  CLASSES: !!python/tuple [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21] # no large clamp\n  SYMMETRY: !!python/tuple [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1]\n  SNAPSHOT_INFIX: ycb_object_detection\n  SNAPSHOT_EPOCHS: 1\n  SNAPSHOT_PREFIX: vgg16\n  USE_FLIPPED: False\n  CHROMATIC: True\n  ADD_NOISE: True\n  VISUALIZE: False\n  VERTEX_REG: True\n  POSE_REG: False       # no rotation regression\n  SLIM: True\n  # synthetic data\n  SYNTHESIZE: True\n  SYNNUM: 40000\n  SYN_RATIO: 5\n  SYN_BACKGROUND_SPECIFIC: True\n  SYN_BACKGROUND_SUBTRACT_MEAN: True\n  SYN_SAMPLE_OBJECT: True\n  SYN_SAMPLE_POSE: False\n  SYN_MIN_OBJECT: 5\n  SYN_MAX_OBJECT: 8\n  SYN_TNEAR: 0.5\n  SYN_TFAR: 1.6\n  SYN_BOUND: 0.3\n  SYN_STD_ROTATION: 15\n  SYN_STD_TRANSLATION: 0.05\nTEST:\n  SINGLE_FRAME: True\n  HOUGH_LABEL_THRESHOLD: 400\n  HOUGH_VOTING_THRESHOLD: 10\n  IMS_PER_BATCH: 1\n  HOUGH_SKIP_PIXELS: 10\n  DET_THRESHOLD: 0.2\n  SCALES_BASE: !!python/tuple [1.0]\n  VISUALIZE: False\n  SYNTHESIZE: True\n  POSE_REFINE: False\n  ROS_CAMERA: D435\n  CLASSES: !!python/tuple [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21] # no large clamp\n  SYMMETRY: !!python/tuple [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1]\n"
  },
  {
    "path": "experiments/cfgs/ycb_object_self_supervision.yml",
    "content": "EXP_DIR: ycb_self_supervision\nINPUT: COLOR\nTRAIN:\n  TRAINABLE: True\n  WEIGHT_DECAY: 0.0001\n  LEARNING_RATE: 0.0001\n  MILESTONES: !!python/tuple [10000000]\n  MOMENTUM: 0.9\n  BETA: 0.999\n  GAMMA: 0.1\n  SCALES_BASE: !!python/tuple [1.0]\n  IMS_PER_BATCH: 2\n  NUM_UNITS: 64\n  HARD_LABEL_THRESHOLD: 0.9\n  HARD_LABEL_SAMPLING: 0.0\n  HARD_ANGLE: 5.0\n  HOUGH_LABEL_THRESHOLD: 100\n  HOUGH_VOTING_THRESHOLD: 10\n  HOUGH_SKIP_PIXELS: 10\n  FG_THRESH: 0.5\n  FG_THRESH_POSE: 0.5\n  CLASSES: !!python/tuple [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21] # no large clamp\n  SYMMETRY: !!python/tuple [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1]\n  SNAPSHOT_INFIX: ycb_object_self_supervision\n  SNAPSHOT_EPOCHS: 1\n  SNAPSHOT_PREFIX: vgg16\n  USE_FLIPPED: False\n  CHROMATIC: True\n  ADD_NOISE: True\n  VISUALIZE: False\n  VERTEX_REG: True\n  POSE_REG: True\n  SLIM: False\n  MAX_ITERS_PER_EPOCH: 20000\n  # synthetic data\n  SYNTHESIZE: True\n  SYNNUM: 40000\n  SYN_RATIO: 3\n  SYN_BACKGROUND_SPECIFIC: True\n  SYN_BACKGROUND_SUBTRACT_MEAN: True\n  SYN_SAMPLE_OBJECT: True\n  SYN_SAMPLE_POSE: False\n  SYN_MIN_OBJECT: 5\n  SYN_MAX_OBJECT: 8\n  SYN_TNEAR: 0.5\n  SYN_TFAR: 1.6\n  SYN_BOUND: 0.3\n  SYN_STD_ROTATION: 15\n  SYN_STD_TRANSLATION: 0.05\nTEST:\n  SINGLE_FRAME: True\n  HOUGH_LABEL_THRESHOLD: 100\n  HOUGH_VOTING_THRESHOLD: 10\n  NUM_SDF_ITERATIONS_TRACKING: 50\n  SDF_TRANSLATION_REG: 1000.0\n  SDF_ROTATION_REG: 10.0\n  IMS_PER_BATCH: 1\n  HOUGH_SKIP_PIXELS: 10\n  DET_THRESHOLD: 0.2\n  SCALES_BASE: !!python/tuple [1.0]\n  VISUALIZE: True\n  SYNTHESIZE: False\n  POSE_REFINE: True\n  ROS_CAMERA: D435\n  CLASSES: !!python/tuple [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21]\n  SYMMETRY: !!python/tuple [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1]\n"
  },
  {
    "path": "experiments/cfgs/ycb_video.yml",
    "content": "EXP_DIR: ycb_video\nINPUT: COLOR\nTRAIN:\n  TRAINABLE: True\n  WEIGHT_DECAY: 0.0001\n  LEARNING_RATE: 0.001\n  MILESTONES: !!python/tuple [12]\n  MOMENTUM: 0.9\n  BETA: 0.999\n  GAMMA: 0.1\n  SCALES_BASE: !!python/tuple [1.0]\n  IMS_PER_BATCH: 2\n  MAX_ITERS_PER_EPOCH: 20000\n  NUM_UNITS: 64\n  HARD_LABEL_THRESHOLD: 0.9\n  HARD_LABEL_SAMPLING: 0.0\n  HARD_ANGLE: 5.0\n  HOUGH_LABEL_THRESHOLD: 100\n  HOUGH_VOTING_THRESHOLD: 10\n  HOUGH_SKIP_PIXELS: 10\n  FG_THRESH: 0.5\n  FG_THRESH_POSE: 0.5\n  CLASSES: !!python/tuple [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]\n  SNAPSHOT_INFIX: ycb_video\n  SNAPSHOT_EPOCHS: 1\n  SNAPSHOT_PREFIX: vgg16\n  USE_FLIPPED: False\n  CHROMATIC: True\n  ADD_NOISE: True\n  VISUALIZE: False\n  VERTEX_REG: True\n  POSE_REG: True\n  FREEZE_LAYERS: False\n  VERTEX_W: 10.0\n  VERTEX_W_INSIDE: 10.0\n  # synthetic data\n  SYNTHESIZE: False\n  SYN_RATIO: 5\n  SYN_BACKGROUND_SPECIFIC: False\n  SYN_BACKGROUND_SUBTRACT_MEAN: True\n  SYN_SAMPLE_OBJECT: True\n  SYN_SAMPLE_POSE: False\n  SYN_MIN_OBJECT: 5\n  SYN_MAX_OBJECT: 8\n  SYN_TNEAR: 0.5\n  SYN_TFAR: 1.6\n  SYN_BOUND: 0.15\n  SYN_STD_ROTATION: 15\n  SYN_STD_TRANSLATION: 0.05\nTEST:\n  SINGLE_FRAME: True\n  HOUGH_LABEL_THRESHOLD: 200\n  HOUGH_VOTING_THRESHOLD: 10\n  NUM_SDF_ITERATIONS_TRACKING: 50\n  SDF_TRANSLATION_REG: 100.0\n  SDF_ROTATION_REG: 1.0\n  IMS_PER_BATCH: 1\n  HOUGH_SKIP_PIXELS: 10\n  DET_THRESHOLD: 0.1\n  SCALES_BASE: !!python/tuple [1.0]\n  VISUALIZE: False\n  SYNTHESIZE: False\n  POSE_REFINE: True\n  ROS_CAMERA: camera\n  CLASSES: !!python/tuple [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]\n#  CLASSES: !!python/tuple [0, 1, 2, 3, 4]\n"
  },
  {
    "path": "experiments/scripts/demo.sh",
    "content": "#!/bin/bash\n\t\nset -x\nset -e\n\nexport PYTHONUNBUFFERED=\"True\"\nexport CUDA_VISIBLE_DEVICES=0\n\ntime ./tools/test_images.py --gpu 0 \\\n  --imgdir data/demo/ \\\n  --meta data/demo/meta.yml \\\n  --color *color.png \\\n  --network posecnn \\\n  --pretrained data/checkpoints/ycb_object/vgg16_ycb_object_self_supervision_epoch_8.checkpoint.pth \\\n  --dataset ycb_object_test \\\n  --cfg experiments/cfgs/ycb_object.yml\n"
  },
  {
    "path": "experiments/scripts/dex_ycb_test_s0.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\nexport CUDA_VISIBLE_DEVICES=$1\n\ntime ./tools/test_net.py --gpu $1 \\\n  --network posecnn \\\n  --pretrained output/dex_ycb/dex_ycb_s0_train/vgg16_dex_ycb_epoch_$2.checkpoint.pth \\\n  --dataset dex_ycb_s0_test \\\n  --cfg experiments/cfgs/dex_ycb.yml\n"
  },
  {
    "path": "experiments/scripts/dex_ycb_test_s1.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\nexport CUDA_VISIBLE_DEVICES=$1\n\ntime ./tools/test_net.py --gpu $1 \\\n  --network posecnn \\\n  --pretrained output/dex_ycb/dex_ycb_s1_train/vgg16_dex_ycb_epoch_$2.checkpoint.pth \\\n  --dataset dex_ycb_s1_test \\\n  --cfg experiments/cfgs/dex_ycb.yml\n"
  },
  {
    "path": "experiments/scripts/dex_ycb_test_s2.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\nexport CUDA_VISIBLE_DEVICES=$1\n\ntime ./tools/test_net.py --gpu $1 \\\n  --network posecnn \\\n  --pretrained output/dex_ycb/dex_ycb_s2_train/vgg16_dex_ycb_epoch_$2.checkpoint.pth \\\n  --dataset dex_ycb_s2_test \\\n  --cfg experiments/cfgs/dex_ycb.yml\n"
  },
  {
    "path": "experiments/scripts/dex_ycb_test_s3.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\nexport CUDA_VISIBLE_DEVICES=$1\n\ntime ./tools/test_net.py --gpu $1 \\\n  --network posecnn \\\n  --pretrained output/dex_ycb/dex_ycb_s3_train/vgg16_dex_ycb_epoch_$2.checkpoint.pth \\\n  --dataset dex_ycb_s3_test \\\n  --cfg experiments/cfgs/dex_ycb.yml\n"
  },
  {
    "path": "experiments/scripts/dex_ycb_train_s0.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\n\ntime ./tools/train_net.py \\\n  --network posecnn \\\n  --pretrained data/checkpoints/vgg16-397923af.pth \\\n  --dataset dex_ycb_s0_train \\\n  --cfg experiments/cfgs/dex_ycb.yml \\\n  --solver sgd \\\n  --epochs 16\n"
  },
  {
    "path": "experiments/scripts/dex_ycb_train_s1.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\n\ntime ./tools/train_net.py \\\n  --network posecnn \\\n  --pretrained data/checkpoints/vgg16-397923af.pth \\\n  --dataset dex_ycb_s1_train \\\n  --cfg experiments/cfgs/dex_ycb.yml \\\n  --solver sgd \\\n  --epochs 16\n"
  },
  {
    "path": "experiments/scripts/dex_ycb_train_s2.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\n\ntime ./tools/train_net.py \\\n  --network posecnn \\\n  --pretrained data/checkpoints/vgg16-397923af.pth \\\n  --dataset dex_ycb_s2_train \\\n  --cfg experiments/cfgs/dex_ycb.yml \\\n  --solver sgd \\\n  --epochs 16\n"
  },
  {
    "path": "experiments/scripts/dex_ycb_train_s3.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\n\ntime ./tools/train_net.py \\\n  --network posecnn \\\n  --pretrained data/checkpoints/vgg16-397923af.pth \\\n  --dataset dex_ycb_s3_train \\\n  --cfg experiments/cfgs/dex_ycb.yml \\\n  --solver sgd \\\n  --epochs 16\n"
  },
  {
    "path": "experiments/scripts/ros_ycb_object_test.sh",
    "content": "#!/bin/bash\n\t\nset -x\nset -e\n\nexport PYTHONUNBUFFERED=\"True\"\nexport CUDA_VISIBLE_DEVICES=$1\n\ntime ./ros/test_images.py --gpu $1 \\\n  --instance 0 \\\n  --network posecnn \\\n  --pretrained data/checkpoints/ycb_object/vgg16_ycb_object_self_supervision_epoch_8.checkpoint.pth \\\n  --dataset ycb_object_test \\\n  --cfg experiments/cfgs/ycb_object.yml\n"
  },
  {
    "path": "experiments/scripts/ros_ycb_object_test_detection.sh",
    "content": "#!/bin/bash\n\t\nset -x\nset -e\n\nexport PYTHONUNBUFFERED=\"True\"\nexport CUDA_VISIBLE_DEVICES=$1\n\ntime ./ros/test_images.py --gpu $1 \\\n  --instance 0 \\\n  --network posecnn \\\n  --pretrained data/checkpoints/ycb_object/vgg16_ycb_object_detection_self_supervision_epoch_8.checkpoint.pth \\\n  --dataset ycb_object_test \\\n  --cfg experiments/cfgs/ycb_object_detection.yml\n"
  },
  {
    "path": "experiments/scripts/ycb_object_test.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\n\nexport PYTHONUNBUFFERED=\"True\"\nexport CUDA_VISIBLE_DEVICES=$1\n\ntime ./tools/test_net.py --gpu $1 \\\n  --network posecnn \\\n  --pretrained output/ycb_object/ycb_object_train/vgg16_ycb_object_epoch_$2.checkpoint.pth \\\n  --dataset ycb_object_test \\\n  --cfg experiments/cfgs/ycb_object.yml\n"
  },
  {
    "path": "experiments/scripts/ycb_object_train.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\n\n./tools/train_net.py \\\n  --network posecnn \\\n  --pretrained data/checkpoints/vgg16-397923af.pth \\\n  --dataset ycb_object_train \\\n  --cfg experiments/cfgs/ycb_object.yml \\\n  --solver sgd \\\n  --epochs 16\n"
  },
  {
    "path": "experiments/scripts/ycb_object_train_detection.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\n\n./tools/train_net.py \\\n  --network posecnn \\\n  --pretrained data/checkpoints/vgg16-397923af.pth \\\n  --dataset ycb_object_train \\\n  --cfg experiments/cfgs/ycb_object_detection.yml \\\n  --solver sgd \\\n  --epochs 16\n"
  },
  {
    "path": "experiments/scripts/ycb_object_train_self_supervision.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\n\n./tools/train_net.py \\\n  --network posecnn \\\n  --pretrained output/ycb_object/ycb_object_train/vgg16_ycb_object_epoch_16.checkpoint.pth \\\n  --dataset ycb_self_supervision_all \\\n  --cfg experiments/cfgs/ycb_object_self_supervision.yml \\\n  --solver sgd \\\n  --epochs 8\n"
  },
  {
    "path": "experiments/scripts/ycb_video_test.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\n\nexport PYTHONUNBUFFERED=\"True\"\nexport CUDA_VISIBLE_DEVICES=$1\n\ntime ./tools/test_net.py --gpu $1 \\\n  --network posecnn \\\n  --pretrained output/ycb_video/ycb_video_train/vgg16_ycb_video_epoch_$2.checkpoint.pth \\\n  --dataset ycb_video_keyframe \\\n  --cfg experiments/cfgs/ycb_video.yml\n"
  },
  {
    "path": "experiments/scripts/ycb_video_train.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\n\ntime ./tools/train_net.py \\\n  --network posecnn \\\n  --pretrained data/checkpoints/vgg16-397923af.pth \\\n  --dataset ycb_video_train \\\n  --cfg experiments/cfgs/ycb_video.yml \\\n  --solver sgd \\\n  --epochs 16\n"
  },
  {
    "path": "lib/datasets/__init__.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nfrom .imdb import imdb\nfrom .ycb_video import YCBVideo\nfrom .ycb_self_supervision import YCBSelfSupervision\nfrom .ycb_object import YCBObject\nfrom .dex_ycb import DexYCBDataset\nfrom .background import BackgroundDataset\n\nimport os.path as osp\nROOT_DIR = osp.join(osp.dirname(__file__), '..', '..')\n"
  },
  {
    "path": "lib/datasets/background.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport torch\nimport torchvision\nimport torch.utils.data as data\nimport os, math\nimport os.path as osp\nfrom os.path import *\nimport numpy as np\nimport numpy.random as npr\nimport cv2\nimport datasets\nfrom fcn.config import cfg\nfrom utils.blob import chromatic_transform, add_noise, add_noise_depth\n\nclass BackgroundDataset(data.Dataset, datasets.imdb):\n\n    def __init__(self, name):\n\n        self._name = name\n        self.files_color = []\n        self.files_depth = []\n\n        if name == 'coco':\n            background_dir = os.path.join(self.cache_path, '../coco/train2014/train2014')\n            for filename in os.listdir(background_dir):\n                self.files_color.append(os.path.join(background_dir, filename))\n            self.files_color.sort()\n\n        elif name == 'texture':\n            background_dir = os.path.join(self.cache_path, '../textures')\n            for filename in os.listdir(background_dir):\n                self.files_color.append(os.path.join(background_dir, filename))\n            self.files_color.sort()\n\n        elif name == 'nvidia':\n            allencenter = os.path.join(self.cache_path, '../backgrounds/nvidia')\n            subdirs = os.listdir(allencenter)\n            for i in range(len(subdirs)):\n                subdir = subdirs[i]\n                files = os.listdir(os.path.join(allencenter, subdir))\n                for j in range(len(files)):\n                    filename = os.path.join(allencenter, subdir, files[j])\n                    self.files_color.append(filename)\n            self.files_color.sort()\n\n        elif name == 'table':\n            allencenter = os.path.join(self.cache_path, '../backgrounds/table')\n            subdirs = os.listdir(allencenter)\n            for i in range(len(subdirs)):\n                subdir = subdirs[i]\n                files = os.listdir(os.path.join(allencenter, subdir))\n                for j in range(len(files)):\n                    filename = os.path.join(allencenter, subdir, files[j])\n                    self.files_color.append(filename)\n            self.files_color.sort()\n\n        elif name == 'isaac':\n            allencenter = os.path.join(self.cache_path, '../backgrounds/isaac')\n            subdirs = os.listdir(allencenter)\n            for i in range(len(subdirs)):\n                subdir = subdirs[i]\n                files = os.listdir(os.path.join(allencenter, subdir))\n                for j in range(len(files)):\n                    filename = os.path.join(allencenter, subdir, files[j])\n                    self.files_color.append(filename)\n            self.files_color.sort()\n\n        elif name == 'rgbd':\n            comotion = os.path.join(self.cache_path, '../backgrounds/rgbd')\n            subdirs = os.listdir(comotion)\n            for i in range(len(subdirs)):\n                subdir = subdirs[i]\n                files = os.listdir(os.path.join(comotion, subdir))\n                for j in range(len(files)):\n                    filename = os.path.join(comotion, subdir, files[j])\n                    if 'depth.png' in filename:\n                        self.files_depth.append(filename)\n                    else:\n                        self.files_color.append(filename)\n\n            self.files_color.sort()\n            self.files_depth.sort()\n\n        self._intrinsic_matrix = np.array([[524.7917885754071, 0, 332.5213232846151],\n                                          [0, 489.3563960810721, 281.2339855172282],\n                                          [0, 0, 1]])\n\n        self.num = len(self.files_color)\n        self.subtract_mean = cfg.TRAIN.SYN_BACKGROUND_SUBTRACT_MEAN\n        if cfg.TRAIN.SYN_CROP:\n            self._height = cfg.TRAIN.SYN_CROP_SIZE\n            self._width = cfg.TRAIN.SYN_CROP_SIZE\n        else:\n            self._height = cfg.TRAIN.SYN_HEIGHT\n            self._width = cfg.TRAIN.SYN_WIDTH\n        self._pixel_mean = cfg.PIXEL_MEANS\n        print('{} background images'.format(self.num))\n\n\n    def __len__(self):\n        return self.num\n\n    def __getitem__(self, idx):\n        filename_color = self.files_color[idx]\n        if self.name == 'rgbd':\n            filename_depth = self.files_depth[idx]\n        else:\n            filename_depth = None\n        return self.load(filename_color, filename_depth)\n\n    def load(self, filename_color, filename_depth):\n        if filename_depth is None:\n            background_depth = np.zeros((3, self._height, self._width), dtype=np.float32)\n            mask_depth = np.zeros((self._height, self._width), dtype=np.float32)\n\n        if filename_depth is None and np.random.rand(1) < cfg.TRAIN.SYN_BACKGROUND_CONSTANT_PROB:  # only for rgb cases\n            # constant background image\n            background_color = np.ones((self._height, self._width, 3), dtype=np.uint8)\n            color = np.random.randint(256, size=3)\n            background_color[:, :, 0] = color[0]\n            background_color[:, :, 1] = color[1]\n            background_color[:, :, 2] = color[2]\n        else:\n            background_color = cv2.imread(filename_color, cv2.IMREAD_UNCHANGED)\n\n            if filename_depth is not None:\n                background_depth = cv2.imread(filename_depth, cv2.IMREAD_UNCHANGED)\n\n            try:\n                # randomly crop a region as background\n                bw = background_color.shape[1]\n                bh = background_color.shape[0]\n                x1 = npr.randint(0, int(bw/3))\n                y1 = npr.randint(0, int(bh/3))\n                x2 = npr.randint(int(2*bw/3), bw)\n                y2 = npr.randint(int(2*bh/3), bh)\n                background_color = background_color[y1:y2, x1:x2]\n                background_color = cv2.resize(background_color, (self._width, self._height), interpolation=cv2.INTER_LINEAR)\n                if len(background_color.shape) != 3:\n                    background_color = cv2.cvtColor(background_color, cv2.COLOR_GRAY2RGB)\n\n                if filename_depth is not None:\n                    background_depth = background_depth[y1:y2, x1:x2]\n                    background_depth = cv2.resize(background_depth, (self._width, self._height), interpolation=cv2.INTER_NEAREST)\n                    background_depth = self.backproject(background_depth, self._intrinsic_matrix, 1000.0)\n\n            except:\n                background_color = np.zeros((self._height, self._width, 3), dtype=np.uint8)\n                print('bad background_color image', filename_color)\n                if filename_depth is not None:\n                    background_depth = np.zeros((self._height, self._width, 3), dtype=np.float32)\n                    print('bad depth background image')\n\n            if len(background_color.shape) != 3:\n                background_color = np.zeros((self._height, self._width, 3), dtype=np.uint8)\n                print('bad background_color image', filename_color)\n\n            if filename_depth is not None:\n                if len(background_depth.shape) != 3:\n                    background_depth = np.zeros((self._height, self._width, 3), dtype=np.float32)\n                    print('bad depth background image')\n\n                z_im = background_depth[:, :, 2]\n                mask_depth = z_im > 0.0\n                mask_depth = mask_depth.astype(np.float32)\n\n                if np.random.rand(1) > 0.1:\n                    background_depth = add_noise_depth(background_depth)\n\n                background_depth = background_depth.transpose(2, 0, 1).astype(np.float32)\n\n            if np.random.rand(1) > 0.1:\n                background_color = chromatic_transform(background_color)\n\n        if np.random.rand(1) > 0.1:\n            background_color = add_noise(background_color)\n\n        background_color = background_color.astype(np.float32)\n\n        if self.subtract_mean:\n            background_color -= self._pixel_mean\n        background_color = background_color.transpose(2, 0, 1) / 255.0\n\n        sample = {'background_color': background_color,\n                  'background_depth': background_depth,\n                  'mask_depth': mask_depth}\n\n        return sample\n"
  },
  {
    "path": "lib/datasets/dex_ycb.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport os\nimport sys\nimport yaml\nimport numpy as np\nimport torch\nimport torch.utils.data as data\nimport numpy as np\nimport numpy.random as npr\nimport cv2\nimport copy\nimport glob\nimport scipy\n\nimport datasets\nfrom fcn.config import cfg\nfrom utils.blob import pad_im, chromatic_transform, add_noise\nfrom transforms3d.quaternions import mat2quat, quat2mat\nfrom utils.se3 import *\nfrom utils.pose_error import *\nfrom utils.cython_bbox import bbox_overlaps\n\n_SUBJECTS = [\n    '20200709-subject-01',\n    '20200813-subject-02',\n    '20200820-subject-03',\n    '20200903-subject-04',\n    '20200908-subject-05',\n    '20200918-subject-06',\n    '20200928-subject-07',\n    '20201002-subject-08',\n    '20201015-subject-09',\n    '20201022-subject-10',\n]\n\n_SERIALS = [\n    '836212060125',\n    '839512060362',\n    '840412060917',\n    '841412060263',\n    '932122060857',\n    '932122060861',\n    '932122061900',\n    '932122062010',\n]\n\n_YCB_CLASSES = {\n     1: '002_master_chef_can',\n     2: '003_cracker_box',\n     3: '004_sugar_box',\n     4: '005_tomato_soup_can',\n     5: '006_mustard_bottle',\n     6: '007_tuna_fish_can',\n     7: '008_pudding_box',\n     8: '009_gelatin_box',\n     9: '010_potted_meat_can',\n    10: '011_banana',\n    11: '019_pitcher_base',\n    12: '021_bleach_cleanser',\n    13: '024_bowl',\n    14: '025_mug',\n    15: '035_power_drill',\n    16: '036_wood_block',\n    17: '037_scissors',\n    18: '040_large_marker',\n    19: '051_large_clamp',\n    20: '052_extra_large_clamp',\n    21: '061_foam_brick',\n}\n\n_MANO_JOINTS = [\n    'wrist',\n    'thumb_mcp',\n    'thumb_pip',\n    'thumb_dip',\n    'thumb_tip',\n    'index_mcp',\n    'index_pip',\n    'index_dip',\n    'index_tip',\n    'middle_mcp',\n    'middle_pip',\n    'middle_dip',\n    'middle_tip',\n    'ring_mcp',\n    'ring_pip',\n    'ring_dip',\n    'ring_tip',\n    'little_mcp',\n    'little_pip',\n    'little_dip',\n    'little_tip'\n]\n\n_MANO_JOINT_CONNECT = [\n    [0,  1], [ 1,  2], [ 2,  3], [ 3,  4],\n    [0,  5], [ 5,  6], [ 6,  7], [ 7,  8],\n    [0,  9], [ 9, 10], [10, 11], [11, 12],\n    [0, 13], [13, 14], [14, 15], [15, 16],\n    [0, 17], [17, 18], [18, 19], [19, 20],\n]\n\n_BOP_EVAL_SUBSAMPLING_FACTOR = 4\n\nclass DexYCBDataset(data.Dataset, datasets.imdb):\n\n    def __init__(self, setup, split):\n        self._setup = setup\n        self._split = split\n        self._color_format = \"color_{:06d}.jpg\"\n        self._depth_format = \"aligned_depth_to_color_{:06d}.png\"\n        self._label_format = \"labels_{:06d}.npz\"\n        self._height = 480\n        self._width = 640\n\n        # paths\n        self._name = 'dex_ycb_' + setup + '_' + split\n        self._image_set = split\n        self._dex_ycb_path = self._get_default_path()\n        path = os.path.join(self._dex_ycb_path, 'data')\n        self._data_dir = path\n        self._calib_dir = os.path.join(self._data_dir, \"calibration\")\n        self._model_dir = os.path.join(self._data_dir, \"models\")\n\n        self._obj_file = {\n            k: os.path.join(self._model_dir, v, \"textured_simple.obj\")\n            for k, v in _YCB_CLASSES.items()\n        }\n\n        # define all the classes\n        self._classes_all = ('__background__', '002_master_chef_can', '003_cracker_box', '004_sugar_box', '005_tomato_soup_can', '006_mustard_bottle', \\\n                         '007_tuna_fish_can', '008_pudding_box', '009_gelatin_box', '010_potted_meat_can', '011_banana', '019_pitcher_base', \\\n                         '021_bleach_cleanser', '024_bowl', '025_mug', '035_power_drill', '036_wood_block', '037_scissors', '040_large_marker', \\\n                         '051_large_clamp', '052_extra_large_clamp', '061_foam_brick')\n        self._num_classes_all = len(self._classes_all)\n        self._class_colors_all = [(255, 255, 255), (255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 0, 255), (0, 255, 255), \\\n                              (128, 0, 0), (0, 128, 0), (0, 0, 128), (128, 128, 0), (128, 0, 128), (0, 128, 128), \\\n                              (64, 0, 0), (0, 64, 0), (0, 0, 64), (64, 64, 0), (64, 0, 64), (0, 64, 64), \n                              (192, 0, 0), (0, 192, 0), (0, 0, 192)]\n        self._symmetry_all = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]).astype(np.float32)\n        self._extents_all = self._load_object_extents()\n\n        # select a subset of classes\n        self._classes = [self._classes_all[i] for i in cfg.TRAIN.CLASSES]\n        self._classes_test = [self._classes_all[i] for i in cfg.TEST.CLASSES]\n        self._num_classes = len(self._classes)\n        self._class_colors = [self._class_colors_all[i] for i in cfg.TRAIN.CLASSES]\n        self._symmetry = self._symmetry_all[cfg.TRAIN.CLASSES]\n        self._symmetry_test = self._symmetry_all[cfg.TEST.CLASSES]\n        self._extents = self._extents_all[cfg.TRAIN.CLASSES]\n        self._extents_test = self._extents_all[cfg.TEST.CLASSES]\n        self._pixel_mean = cfg.PIXEL_MEANS / 255.0\n\n        # train classes\n        self._points, self._points_all, self._point_blob = \\\n            self._load_object_points(self._classes, self._extents, self._symmetry)\n\n        # test classes\n        self._points_test, self._points_all_test, self._point_blob_test = \\\n            self._load_object_points(self._classes_test, self._extents_test, self._symmetry_test)\n\n        # 3D model paths\n        self.model_mesh_paths = ['{}/{}/textured_simple.obj'.format(self._model_dir, cls) for cls in self._classes_all[1:]]\n        self.model_sdf_paths = ['{}/{}/textured_simple_low_res.pth'.format(self._model_dir, cls) for cls in self._classes_all[1:]]\n        self.model_texture_paths = ['{}/{}/texture_map.png'.format(self._model_dir, cls) for cls in self._classes_all[1:]]\n        self.model_colors = [np.array(self._class_colors_all[i]) / 255.0 for i in range(1, len(self._classes_all))]\n\n        self.model_mesh_paths_target = ['{}/{}/textured_simple.obj'.format(self._model_dir, cls) for cls in self._classes[1:]]\n        self.model_sdf_paths_target = ['{}/{}/textured_simple.sdf'.format(self._model_dir, cls) for cls in self._classes[1:]]\n        self.model_texture_paths_target = ['{}/{}/texture_map.png'.format(self._model_dir, cls) for cls in self._classes[1:]]\n        self.model_colors_target = [np.array(self._class_colors_all[i]) / 255.0 for i in cfg.TRAIN.CLASSES[1:]]\n\n        # Seen subjects, camera views, grasped objects.\n        if self._setup == 's0':\n            if self._split == 'train':\n                subject_ind = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n                serial_ind = [0, 1, 2, 3, 4, 5, 6, 7]\n                sequence_ind = [i for i in range(100) if i % 5 != 4]\n            if self._split == 'val':\n                subject_ind = [0, 1]\n                serial_ind = [0, 1, 2, 3, 4, 5, 6, 7]\n                sequence_ind = [i for i in range(100) if i % 5 == 4]\n            if self._split == 'test':\n                subject_ind = [2, 3, 4, 5, 6, 7, 8, 9]\n                serial_ind = [0, 1, 2, 3, 4, 5, 6, 7]\n                sequence_ind = [i for i in range(100) if i % 5 == 4]\n\n        # Unseen subjects.\n        if self._setup == 's1':\n            if self._split == 'train':\n                subject_ind = [0, 1, 2, 3, 4, 5, 9]\n                serial_ind = [0, 1, 2, 3, 4, 5, 6, 7]\n                sequence_ind = list(range(100))\n            if self._split == 'val':\n                subject_ind = [6]\n                serial_ind = [0, 1, 2, 3, 4, 5, 6, 7]\n                sequence_ind = list(range(100))\n            if self._split == 'test':\n                subject_ind = [7, 8]\n                serial_ind = [0, 1, 2, 3, 4, 5, 6, 7]\n                sequence_ind = list(range(100))\n\n        # Unseen camera views.\n        if self._setup == 's2':\n            if self._split == 'train':\n                subject_ind = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n                serial_ind = [0, 1, 2, 3, 4, 5]\n                sequence_ind = list(range(100))\n            if self._split == 'val':\n                subject_ind = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n                serial_ind = [6]\n                sequence_ind = list(range(100))\n            if self._split == 'test':\n                subject_ind = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n                serial_ind = [7]\n                sequence_ind = list(range(100))\n\n        # Unseen grasped objects.\n        if self._setup == 's3':\n            if self._split == 'train':\n                subject_ind = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n                serial_ind = [0, 1, 2, 3, 4, 5, 6, 7]\n                sequence_ind = [\n                    i for i in range(100) if i // 5 not in (3, 7, 11, 15, 19)\n                ]\n            if self._split == 'val':\n                subject_ind = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n                serial_ind = [0, 1, 2, 3, 4, 5, 6, 7]\n                sequence_ind = [i for i in range(100) if i // 5 in (3, 19)]\n            if self._split == 'test':\n                subject_ind = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n                serial_ind = [0, 1, 2, 3, 4, 5, 6, 7]\n                sequence_ind = [i for i in range(100) if i // 5 in (7, 11, 15)]\n\n        self._subjects = [_SUBJECTS[i] for i in subject_ind]\n        self._serials = [_SERIALS[i] for i in serial_ind]\n        self._intrinsics = []\n        for s in self._serials:\n            intr_file = os.path.join(self._calib_dir, \"intrinsics\", \"{}_{}x{}.yml\".format(s, self._width, self._height))\n            with open(intr_file, 'r') as f:\n                intr = yaml.load(f, Loader=yaml.FullLoader)\n            intr = intr['color']\n            self._intrinsics.append(intr)\n\n        # build mapping\n        self._sequences = []\n        self._mapping = []\n        self._ycb_ids = []\n        offset = 0\n        for n in self._subjects:\n            seq = sorted(os.listdir(os.path.join(self._data_dir, n)))\n            seq = [os.path.join(n, s) for s in seq]\n            assert len(seq) == 100\n            seq = [seq[i] for i in sequence_ind]\n            self._sequences += seq\n            for i, q in enumerate(seq):\n                meta_file = os.path.join(self._data_dir, q, \"meta.yml\")\n                with open(meta_file, 'r') as f:\n                    meta = yaml.load(f, Loader=yaml.FullLoader)\n                c = np.arange(len(self._serials))\n                f = np.arange(meta['num_frames'])\n                f, c = np.meshgrid(f, c)\n                c = c.ravel()\n                f = f.ravel()\n                s = (offset + i) * np.ones_like(c)\n                m = np.vstack((s, c, f)).T\n                self._mapping.append(m)\n                self._ycb_ids.append(meta['ycb_ids'])\n            offset += len(seq)\n        self._mapping = np.vstack(self._mapping)\n\n        # sample a subset for training\n        if split == 'train':\n            self._mapping = self._mapping[::10]\n\n        # dataset size\n        self._size = len(self._mapping)\n        print('dataset %s with images %d' % (self._name, self._size))\n        if cfg.MODE == 'TRAIN' and self._size > cfg.TRAIN.MAX_ITERS_PER_EPOCH * cfg.TRAIN.IMS_PER_BATCH:\n            self._size = cfg.TRAIN.MAX_ITERS_PER_EPOCH * cfg.TRAIN.IMS_PER_BATCH\n\n\n    def __len__(self):\n        return self._size\n\n\n    def get_bop_id_from_idx(self, idx):\n        s, c, f = map(lambda x: x.item(), self._mapping[idx])\n        scene_id = s * len(self._serials) + c\n        im_id = f\n        return scene_id, im_id\n\n\n    def __getitem__(self, idx):\n        s, c, f = self._mapping[idx]\n\n        is_testing = f % _BOP_EVAL_SUBSAMPLING_FACTOR == 0\n        d = os.path.join(self._data_dir, self._sequences[s], self._serials[c])\n        roidb = {\n            'color_file': os.path.join(d, self._color_format.format(f)),\n            'depth_file': os.path.join(d, self._depth_format.format(f)),\n            'label_file': os.path.join(d, self._label_format.format(f)),\n            'intrinsics': self._intrinsics[c],\n            'ycb_ids': self._ycb_ids[s],\n        }\n\n        # Get the input image blob\n        random_scale_ind = npr.randint(0, high=len(cfg.TRAIN.SCALES_BASE))\n        im_blob, im_depth, im_scale, height, width = self._get_image_blob(roidb['color_file'], roidb['depth_file'], random_scale_ind)\n\n        # build the label blob\n        label_blob, mask, meta_data_blob, pose_blob, gt_boxes, vertex_targets, vertex_weights \\\n            = self._get_label_blob(roidb, self._num_classes, im_scale, height, width)\n\n        is_syn = 0\n        im_info = np.array([im_blob.shape[1], im_blob.shape[2], im_scale, is_syn], dtype=np.float32)\n        scene_id, im_id = self.get_bop_id_from_idx(idx)\n        video_id = '%04d' % (scene_id)\n        image_id = '%06d' % (im_id)\n\n        sample = {'image_color': im_blob,\n                  'im_depth': im_depth,\n                  'label': label_blob,\n                  'mask': mask,\n                  'meta_data': meta_data_blob,\n                  'poses': pose_blob,\n                  'extents': self._extents,\n                  'points': self._point_blob,\n                  'symmetry': self._symmetry,\n                  'gt_boxes': gt_boxes,\n                  'im_info': im_info,\n                  'video_id': video_id,\n                  'image_id': image_id}\n\n        if cfg.TRAIN.VERTEX_REG:\n            sample['vertex_targets'] = vertex_targets\n            sample['vertex_weights'] = vertex_weights\n\n        if self._split == 'test':\n            sample['is_testing'] = is_testing\n\n        return sample\n\n\n    def _get_image_blob(self, color_file, depth_file, scale_ind):    \n\n        # rgba\n        rgba = pad_im(cv2.imread(color_file, cv2.IMREAD_UNCHANGED), 16)\n        if rgba.shape[2] == 4:\n            im = np.copy(rgba[:,:,:3])\n            alpha = rgba[:,:,3]\n            I = np.where(alpha == 0)\n            im[I[0], I[1], :] = 0\n        else:\n            im = rgba\n\n        im_scale = cfg.TRAIN.SCALES_BASE[scale_ind]\n        if im_scale != 1.0:\n            im = cv2.resize(im, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_LINEAR)\n        height = im.shape[0]\n        width = im.shape[1]\n\n        # chromatic transform\n        if cfg.TRAIN.CHROMATIC and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1:\n            im = chromatic_transform(im)\n        if cfg.TRAIN.ADD_NOISE and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1:\n            im = add_noise(im)\n        im_tensor = torch.from_numpy(im) / 255.0\n        im_tensor -= self._pixel_mean\n        image_blob = im_tensor.permute(2, 0, 1).float()\n\n        # depth image\n        im_depth = pad_im(cv2.imread(depth_file, cv2.IMREAD_UNCHANGED), 16)\n        if im_scale != 1.0:\n            im_depth = cv2.resize(im_depth, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_NEAREST)\n        im_depth = im_depth.astype('float') / 1000.0\n\n        return image_blob, im_depth, im_scale, height, width\n\n\n    def _get_label_blob(self, roidb, num_classes, im_scale, height, width):\n        \"\"\" build the label blob \"\"\"\n\n        # parse data\n        cls_indexes = roidb['ycb_ids']\n        classes = np.array(cfg.TRAIN.CLASSES)\n        fx = roidb['intrinsics']['fx']\n        fy = roidb['intrinsics']['fy']\n        px = roidb['intrinsics']['ppx']\n        py = roidb['intrinsics']['ppy']\n        intrinsic_matrix = np.eye(3, dtype=np.float32)\n        intrinsic_matrix[0, 0] = fx\n        intrinsic_matrix[1, 1] = fy\n        intrinsic_matrix[0, 2] = px\n        intrinsic_matrix[1, 2] = py\n        label = np.load(roidb['label_file'])\n\n        # read label image\n        im_label = label['seg']\n        if im_scale != 1.0:\n            im_label = cv2.resize(im_label, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_NEAREST)\n\n        label_blob = np.zeros((num_classes, height, width), dtype=np.float32)\n        label_blob[0, :, :] = 1.0\n        for i in range(1, num_classes):\n            I = np.where(im_label == classes[i])\n            if len(I[0]) > 0:\n                label_blob[i, I[0], I[1]] = 1.0\n                label_blob[0, I[0], I[1]] = 0.0\n\n        # foreground mask\n        seg = torch.from_numpy((im_label != 0).astype(np.float32))\n        mask = seg.unsqueeze(0).repeat((3, 1, 1)).float()\n\n        # poses\n        poses = label['pose_y']\n        if len(poses.shape) == 2:\n            poses = np.reshape(poses, (1, 3, 4))\n        num = poses.shape[0]\n        assert num == len(cls_indexes), 'number of poses not equal to number of objects'\n\n        pose_blob = np.zeros((num_classes, 9), dtype=np.float32)\n        gt_boxes = np.zeros((num_classes, 5), dtype=np.float32)\n        center = np.zeros((num, 2), dtype=np.float32)\n        count = 0\n        for i in range(num):\n            cls = int(cls_indexes[i])\n            ind = np.where(classes == cls)[0]\n            if len(ind) > 0:\n                R = poses[i, :, :3]\n                T = poses[i, :, 3]\n                pose_blob[count, 0] = 1\n                pose_blob[count, 1] = ind\n                qt = mat2quat(R)\n\n                # egocentric to allocentric\n                qt_allocentric = egocentric2allocentric(qt, T)\n                if qt_allocentric[0] < 0:\n                   qt_allocentric = -1 * qt_allocentric\n                pose_blob[count, 2:6] = qt_allocentric\n                pose_blob[count, 6:] = T\n\n                # compute center\n                center[i, 0] = fx * T[0] / T[2] + px\n                center[i, 1] = fy * T[1] / T[2] + py\n\n                # compute box\n                x3d = np.ones((4, self._points_all.shape[1]), dtype=np.float32)\n                x3d[0, :] = self._points_all[ind,:,0]\n                x3d[1, :] = self._points_all[ind,:,1]\n                x3d[2, :] = self._points_all[ind,:,2]\n                RT = np.zeros((3, 4), dtype=np.float32)\n                RT[:3, :3] = quat2mat(qt)\n                RT[:, 3] = T\n                x2d = np.matmul(intrinsic_matrix, np.matmul(RT, x3d))\n                x2d[0, :] = np.divide(x2d[0, :], x2d[2, :])\n                x2d[1, :] = np.divide(x2d[1, :], x2d[2, :])\n        \n                gt_boxes[count, 0] = np.min(x2d[0, :]) * im_scale\n                gt_boxes[count, 1] = np.min(x2d[1, :]) * im_scale\n                gt_boxes[count, 2] = np.max(x2d[0, :]) * im_scale\n                gt_boxes[count, 3] = np.max(x2d[1, :]) * im_scale\n                gt_boxes[count, 4] = ind\n                count += 1\n\n        # construct the meta data\n        \"\"\"\n        format of the meta_data\n        intrinsic matrix: meta_data[0 ~ 8]\n        inverse intrinsic matrix: meta_data[9 ~ 17]\n        \"\"\"\n        K = np.matrix(intrinsic_matrix) * im_scale\n        K[2, 2] = 1\n        Kinv = np.linalg.pinv(K)\n        meta_data_blob = np.zeros(18, dtype=np.float32)\n        meta_data_blob[0:9] = K.flatten()\n        meta_data_blob[9:18] = Kinv.flatten()\n\n        # vertex regression target\n        if cfg.TRAIN.VERTEX_REG:\n            vertex_targets, vertex_weights = self._generate_vertex_targets(im_label,\n                cls_indexes, center, poses, classes, num_classes)\n        else:\n            vertex_targets = []\n            vertex_weights = []\n\n        return label_blob, mask, meta_data_blob, pose_blob, gt_boxes, vertex_targets, vertex_weights\n\n\n    # compute the voting label image in 2D\n    def _generate_vertex_targets(self, im_label, cls_indexes, center, poses, classes, num_classes):\n\n        width = im_label.shape[1]\n        height = im_label.shape[0]\n        vertex_targets = np.zeros((3 * num_classes, height, width), dtype=np.float32)\n        vertex_weights = np.zeros((3 * num_classes, height, width), dtype=np.float32)\n\n        c = np.zeros((2, 1), dtype=np.float32)\n        for i in range(1, num_classes):\n            y, x = np.where(im_label == classes[i])\n            I = np.where(im_label == classes[i])\n            ind = np.where(cls_indexes == classes[i])[0]\n            if len(x) > 0 and len(ind) > 0:\n                c[0] = center[ind, 0]\n                c[1] = center[ind, 1]\n                if isinstance(poses, list):\n                    z = poses[int(ind)][2]\n                else:\n                    if len(poses.shape) == 3:\n                        z = poses[ind, 2, 3]\n                    else:\n                        z = poses[ind, -1]\n                R = np.tile(c, (1, len(x))) - np.vstack((x, y))\n                # compute the norm\n                N = np.linalg.norm(R, axis=0) + 1e-10\n                # normalization\n                R = np.divide(R, np.tile(N, (2,1)))\n                # assignment\n                vertex_targets[3*i+0, y, x] = R[0,:]\n                vertex_targets[3*i+1, y, x] = R[1,:]\n                vertex_targets[3*i+2, y, x] = math.log(z)\n\n                vertex_weights[3*i+0, y, x] = cfg.TRAIN.VERTEX_W_INSIDE\n                vertex_weights[3*i+1, y, x] = cfg.TRAIN.VERTEX_W_INSIDE\n                vertex_weights[3*i+2, y, x] = cfg.TRAIN.VERTEX_W_INSIDE\n\n        return vertex_targets, vertex_weights\n\n\n    def _get_default_path(self):\n        \"\"\"\n        Return the default path where YCB_Video is expected to be installed.\n        \"\"\"\n        return os.path.join(datasets.ROOT_DIR, 'data', 'DEX_YCB')\n\n\n    def _load_object_extents(self):\n        extents = np.zeros((self._num_classes_all, 3), dtype=np.float32)\n        for i in range(1, self._num_classes_all):\n            point_file = os.path.join(self._model_dir, self._classes_all[i], 'points.xyz')\n            print(point_file)\n            assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file)\n            points = np.loadtxt(point_file)\n            extents[i, :] = 2 * np.max(np.absolute(points), axis=0)\n        return extents\n\n\n    def _load_object_points(self, classes, extents, symmetry):\n\n        points = [[] for _ in range(len(classes))]\n        num = np.inf\n        num_classes = len(classes)\n        for i in range(1, num_classes):\n            point_file = os.path.join(self._model_dir, classes[i], 'points.xyz')\n            print(point_file)\n            assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file)\n            points[i] = np.loadtxt(point_file)\n            if points[i].shape[0] < num:\n                num = points[i].shape[0]\n\n        points_all = np.zeros((num_classes, num, 3), dtype=np.float32)\n        for i in range(1, num_classes):\n            points_all[i, :, :] = points[i][:num, :]\n\n        # rescale the points\n        point_blob = points_all.copy()\n        for i in range(1, num_classes):\n            # compute the rescaling factor for the points\n            weight = 10.0 / np.amax(extents[i, :])\n            if weight < 10:\n                weight = 10\n            if symmetry[i] > 0:\n                point_blob[i, :, :] = 4 * weight * point_blob[i, :, :]\n            else:\n                point_blob[i, :, :] = weight * point_blob[i, :, :]\n        return points, points_all, point_blob\n\n\n    def write_dop_results(self, output_dir):\n        # only write the result file\n        filename = os.path.join(output_dir, 'posecnn_' + self.name + '.csv')\n        f = open(filename, 'w')\n        f.write('scene_id,im_id,obj_id,score,R,t,time\\n')\n\n        if cfg.TEST.POSE_REFINE:\n            filename_refined = os.path.join(output_dir, 'posecnn_' + self.name + '_refined.csv')\n            f1 = open(filename_refined, 'w')\n            f1.write('scene_id,im_id,obj_id,score,R,t,time\\n')\n\n        # list the mat file\n        images_color = []\n        filename = os.path.join(output_dir, '*.mat')\n        files = sorted(glob.glob(filename))\n\n        # for each image\n        for i in range(len(files)):\n            filename = os.path.basename(files[i])\n\n            # parse filename\n            pos = filename.find('_')\n            scene_id = int(filename[:pos])\n            im_id = int(filename[pos+1:-4])\n\n            # load result\n            print(files[i])\n            result = scipy.io.loadmat(files[i])\n            if len(result['rois']) == 0:\n                continue\n\n            rois = result['rois']\n            num = rois.shape[0]\n            for j in range(num):\n                obj_id = cfg.TRAIN.CLASSES[int(rois[j, 1])]\n                if obj_id == 0:\n                    continue\n                score = rois[j, -1]\n                run_time = -1\n\n                # pose from network\n                R = quat2mat(result['poses'][j, :4].flatten())\n                t = result['poses'][j, 4:] * 1000\n                line = '{scene_id},{im_id},{obj_id},{score},{R},{t},{time}\\n'.format(\n                    scene_id=scene_id,\n                    im_id=im_id,\n                    obj_id=obj_id,\n                    score=score,\n                    R=' '.join(map(str, R.flatten().tolist())),\n                    t=' '.join(map(str, t.flatten().tolist())),\n                    time=run_time)\n                f.write(line)\n\n                if cfg.TEST.POSE_REFINE:\n                    R = quat2mat(result['poses_refined'][j, :4].flatten())\n                    t = result['poses_refined'][j, 4:] * 1000\n                    line = '{scene_id},{im_id},{obj_id},{score},{R},{t},{time}\\n'.format(\n                        scene_id=scene_id,\n                        im_id=im_id,\n                        obj_id=obj_id,\n                        score=score,\n                        R=' '.join(map(str, R.flatten().tolist())),\n                        t=' '.join(map(str, t.flatten().tolist())),\n                        time=run_time)\n                    f1.write(line)\n\n        # close file\n        f.close()\n        if cfg.TEST.POSE_REFINE:\n            f1.close()\n\n\n    # compute box\n    def compute_box(self, cls, intrinsic_matrix, RT):\n        classes = np.array(cfg.TRAIN.CLASSES)\n        ind = np.where(classes == cls)[0]\n        x3d = np.ones((4, self._points_all.shape[1]), dtype=np.float32)\n        x3d[0, :] = self._points_all[ind,:,0]\n        x3d[1, :] = self._points_all[ind,:,1]\n        x3d[2, :] = self._points_all[ind,:,2]\n        x2d = np.matmul(intrinsic_matrix, np.matmul(RT, x3d))\n        x2d[0, :] = np.divide(x2d[0, :], x2d[2, :])\n        x2d[1, :] = np.divide(x2d[1, :], x2d[2, :])\n        x1 = np.min(x2d[0, :])\n        y1 = np.min(x2d[1, :])\n        x2 = np.max(x2d[0, :])\n        y2 = np.max(x2d[1, :])\n        return [x1, y1, x2, y2]\n\n\n    def evaluation(self, output_dir):\n        self.write_dop_results(output_dir)\n\n        filename = os.path.join(output_dir, 'results_posecnn.mat')\n        if os.path.exists(filename):\n            results_all = scipy.io.loadmat(filename)\n            print('load results from file')\n            print(filename)\n            distances_sys = results_all['distances_sys']\n            distances_non = results_all['distances_non']\n            errors_rotation = results_all['errors_rotation']\n            errors_translation = results_all['errors_translation']\n            results_seq_id = results_all['results_seq_id'].flatten()\n            results_frame_id = results_all['results_frame_id'].flatten()\n            results_object_id = results_all['results_object_id'].flatten()\n            results_cls_id = results_all['results_cls_id'].flatten()\n        else:\n            # save results\n            num_max = 200000\n            num_results = 2\n            distances_sys = np.zeros((num_max, num_results), dtype=np.float32)\n            distances_non = np.zeros((num_max, num_results), dtype=np.float32)\n            errors_rotation = np.zeros((num_max, num_results), dtype=np.float32)\n            errors_translation = np.zeros((num_max, num_results), dtype=np.float32)\n            results_seq_id = np.zeros((num_max, ), dtype=np.float32)\n            results_frame_id = np.zeros((num_max, ), dtype=np.float32)\n            results_object_id = np.zeros((num_max, ), dtype=np.float32)\n            results_cls_id = np.zeros((num_max, ), dtype=np.float32)\n\n            # for each image\n            count = -1\n            for i in range(len(self._mapping)):\n\n                s, c, f = self._mapping[i]\n                is_testing = f % _BOP_EVAL_SUBSAMPLING_FACTOR == 0\n                if not is_testing:\n                    continue\n\n                # intrinsics\n                intrinsics = self._intrinsics[c]\n                intrinsic_matrix = np.eye(3, dtype=np.float32)\n                intrinsic_matrix[0, 0] = intrinsics['fx']\n                intrinsic_matrix[1, 1] = intrinsics['fy']\n                intrinsic_matrix[0, 2] = intrinsics['ppx']\n                intrinsic_matrix[1, 2] = intrinsics['ppy']\n\n                # parse keyframe name\n                scene_id, im_id = self.get_bop_id_from_idx(i)\n\n                # load result\n                filename = os.path.join(output_dir, '%04d_%06d.mat' % (scene_id, im_id))\n                print(filename)\n                result = scipy.io.loadmat(filename)\n\n                # load gt\n                d = os.path.join(self._data_dir, self._sequences[s], self._serials[c])\n                label_file = os.path.join(d, self._label_format.format(f))\n                label = np.load(label_file)\n                cls_indexes = np.array(self._ycb_ids[s]).flatten()\n\n                # poses\n                poses = label['pose_y']\n                if len(poses.shape) == 2:\n                    poses = np.reshape(poses, (1, 3, 4))\n                num = poses.shape[0]\n                assert num == len(cls_indexes), 'number of poses not equal to number of objects'\n\n                # instance label\n                im_label = label['seg']\n                instance_ids = np.unique(im_label)\n                if instance_ids[0] == 0:\n                    instance_ids = instance_ids[1:]\n                if instance_ids[-1] == 255:\n                    instance_ids = instance_ids[:-1]\n\n                # for each gt poses\n                for j in range(len(instance_ids)):\n                    cls = instance_ids[j]\n\n                    # find the number of pixels of the object\n                    pixels = np.sum(im_label == cls)\n                    if pixels < 200:\n                        continue\n                    count += 1\n\n                    # find the pose\n                    object_index = np.where(cls_indexes == cls)[0][0]\n                    RT_gt = poses[object_index, :, :]\n                    box_gt = self.compute_box(cls, intrinsic_matrix, RT_gt)\n\n                    results_seq_id[count] = scene_id\n                    results_frame_id[count] = im_id\n                    results_object_id[count] = object_index\n                    results_cls_id[count] = cls\n\n                    # network result\n                    roi_index = []\n                    if len(result['rois']) > 0:\n                        for k in range(result['rois'].shape[0]):\n                            ind = int(result['rois'][k, 1])\n                            if cls == cfg.TRAIN.CLASSES[ind]:\n                                roi_index.append(k)\n\n                    # select the roi\n                    if len(roi_index) > 1:\n                        # overlaps: (rois x gt_boxes)\n                        roi_blob = result['rois'][roi_index, :]\n                        roi_blob = roi_blob[:, (0, 2, 3, 4, 5, 1)]\n                        gt_box_blob = np.zeros((1, 5), dtype=np.float32)\n                        gt_box_blob[0, 1:] = box_gt\n                        overlaps = bbox_overlaps(\n                            np.ascontiguousarray(roi_blob[:, :5], dtype=np.float),\n                            np.ascontiguousarray(gt_box_blob, dtype=np.float)).flatten()\n                        assignment = overlaps.argmax()\n                        roi_index = [roi_index[assignment]]\n\n                    if len(roi_index) > 0:\n                        RT = np.zeros((3, 4), dtype=np.float32)\n                        ind = int(result['rois'][roi_index, 1])\n                        points = self._points[ind]\n\n                        # pose from network\n                        RT[:3, :3] = quat2mat(result['poses'][roi_index, :4].flatten())\n                        RT[:, 3] = result['poses'][roi_index, 4:]\n                        distances_sys[count, 0] = adi(RT[:3, :3], RT[:, 3],  RT_gt[:3, :3], RT_gt[:, 3], points)\n                        distances_non[count, 0] = add(RT[:3, :3], RT[:, 3],  RT_gt[:3, :3], RT_gt[:, 3], points)\n                        errors_rotation[count, 0] = re(RT[:3, :3], RT_gt[:3, :3])\n                        errors_translation[count, 0] = te(RT[:, 3], RT_gt[:, 3])\n\n                        # pose after depth refinement\n                        if cfg.TEST.POSE_REFINE:\n                            RT[:3, :3] = quat2mat(result['poses_refined'][roi_index, :4].flatten())\n                            RT[:, 3] = result['poses_refined'][roi_index, 4:]\n                            distances_sys[count, 1] = adi(RT[:3, :3], RT[:, 3],  RT_gt[:3, :3], RT_gt[:, 3], points)\n                            distances_non[count, 1] = add(RT[:3, :3], RT[:, 3],  RT_gt[:3, :3], RT_gt[:, 3], points)\n                            errors_rotation[count, 1] = re(RT[:3, :3], RT_gt[:3, :3])\n                            errors_translation[count, 1] = te(RT[:, 3], RT_gt[:, 3])\n                        else:\n                            distances_sys[count, 1] = np.inf\n                            distances_non[count, 1] = np.inf\n                            errors_rotation[count, 1] = np.inf\n                            errors_translation[count, 1] = np.inf\n                    else:\n                        distances_sys[count, :] = np.inf\n                        distances_non[count, :] = np.inf\n                        errors_rotation[count, :] = np.inf\n                        errors_translation[count, :] = np.inf\n\n            distances_sys = distances_sys[:count+1, :]\n            distances_non = distances_non[:count+1, :]\n            errors_rotation = errors_rotation[:count+1, :]\n            errors_translation = errors_translation[:count+1, :]\n            results_seq_id = results_seq_id[:count+1]\n            results_frame_id = results_frame_id[:count+1]\n            results_object_id = results_object_id[:count+1]\n            results_cls_id = results_cls_id[:count+1]\n\n            results_all = {'distances_sys': distances_sys,\n                       'distances_non': distances_non,\n                       'errors_rotation': errors_rotation,\n                       'errors_translation': errors_translation,\n                       'results_seq_id': results_seq_id,\n                       'results_frame_id': results_frame_id,\n                       'results_object_id': results_object_id,\n                       'results_cls_id': results_cls_id }\n\n            filename = os.path.join(output_dir, 'results_posecnn.mat')\n            scipy.io.savemat(filename, results_all)\n\n        # print the results\n        # for each class\n        import matplotlib.pyplot as plt\n        max_distance = 0.1\n        index_plot = [0, 1]\n        color = ['r', 'b']\n        leng = ['PoseCNN', 'PoseCNN refined']\n        num = len(leng)\n        ADD = np.zeros((self._num_classes_all, num), dtype=np.float32)\n        ADDS = np.zeros((self._num_classes_all, num), dtype=np.float32)\n        TS = np.zeros((self._num_classes_all, num), dtype=np.float32)\n        classes = list(copy.copy(self._classes_all))\n        classes[0] = 'all'\n        for k in range(self._num_classes_all):\n            fig = plt.figure(figsize=(16.0, 10.0))\n            if k == 0:\n                index = range(len(results_cls_id))\n            else:\n                index = np.where(results_cls_id == k)[0]\n\n            if len(index) == 0:\n                continue\n            print('%s: %d objects' % (classes[k], len(index)))\n\n            # distance symmetry\n            ax = fig.add_subplot(2, 3, 1)\n            lengs = []\n            for i in index_plot:\n                D = distances_sys[index, i]\n                ind = np.where(D > max_distance)[0]\n                D[ind] = np.inf\n                d = np.sort(D)\n                n = len(d)\n                accuracy = np.cumsum(np.ones((n, ), np.float32)) / n\n                plt.plot(d, accuracy, color[i], linewidth=2)\n                ADDS[k, i] = VOCap(d, accuracy)\n                lengs.append('%s (%.2f)' % (leng[i], ADDS[k, i] * 100))\n                print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D))))\n\n            ax.legend(lengs)\n            plt.xlabel('Average distance threshold in meter (symmetry)')\n            plt.ylabel('accuracy')\n            ax.set_title(classes[k])\n\n            # distance non-symmetry\n            ax = fig.add_subplot(2, 3, 2)\n            lengs = []\n            for i in index_plot:\n                D = distances_non[index, i]\n                ind = np.where(D > max_distance)[0]\n                D[ind] = np.inf\n                d = np.sort(D)\n                n = len(d)\n                accuracy = np.cumsum(np.ones((n, ), np.float32)) / n\n                plt.plot(d, accuracy, color[i], linewidth=2)\n                ADD[k, i] = VOCap(d, accuracy)\n                lengs.append('%s (%.2f)' % (leng[i], ADD[k, i] * 100))\n                print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D))))\n\n            ax.legend(lengs)\n            plt.xlabel('Average distance threshold in meter (non-symmetry)')\n            plt.ylabel('accuracy')\n            ax.set_title(classes[k])\n\n            # translation\n            ax = fig.add_subplot(2, 3, 3)\n            lengs = []\n            for i in index_plot:\n                D = errors_translation[index, i]\n                ind = np.where(D > max_distance)[0]\n                D[ind] = np.inf\n                d = np.sort(D)\n                n = len(d)\n                accuracy = np.cumsum(np.ones((n, ), np.float32)) / n\n                plt.plot(d, accuracy, color[i], linewidth=2)\n                TS[k, i] = VOCap(d, accuracy)\n                lengs.append('%s (%.2f)' % (leng[i], TS[k, i] * 100))\n                print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D))))\n\n            ax.legend(lengs)\n            plt.xlabel('Translation threshold in meter')\n            plt.ylabel('accuracy')\n            ax.set_title(classes[k])\n\n            # rotation histogram\n            count = 4\n            for i in index_plot:\n                ax = fig.add_subplot(2, 3, count)\n                D = errors_rotation[index, i]\n                ind = np.where(np.isfinite(D))[0]\n                D = D[ind]\n                ax.hist(D, bins=range(0, 190, 10), range=(0, 180))\n                plt.xlabel('Rotation angle error')\n                plt.ylabel('count')\n                ax.set_title(leng[i])\n                count += 1\n\n            # mng = plt.get_current_fig_manager()\n            # mng.full_screen_toggle()\n            filename = output_dir + '/' + classes[k] + '.png'\n            # plt.show()\n            plt.savefig(filename)\n\n        # print ADD\n        print('==================ADD======================')\n        for k in range(len(classes)):\n            print('%s: %f' % (classes[k], ADD[k, 0]))\n        for k in range(len(classes)-1):\n            print('%f' % (ADD[k+1, 0]))\n        print('%f' % (ADD[0, 0]))\n        print(cfg.TRAIN.SNAPSHOT_INFIX)\n        print('===========================================')\n\n        # print ADD-S\n        print('==================ADD-S====================')\n        for k in range(len(classes)):\n            print('%s: %f' % (classes[k], ADDS[k, 0]))\n        for k in range(len(classes)-1):\n            print('%f' % (ADDS[k+1, 0]))\n        print('%f' % (ADDS[0, 0]))\n        print(cfg.TRAIN.SNAPSHOT_INFIX)\n        print('===========================================')\n\n        # print ADD\n        print('==================ADD refined======================')\n        for k in range(len(classes)):\n            print('%s: %f' % (classes[k], ADD[k, 1]))\n        for k in range(len(classes)-1):\n            print('%f' % (ADD[k+1, 1]))\n        print('%f' % (ADD[0, 1]))\n        print(cfg.TRAIN.SNAPSHOT_INFIX)\n        print('===========================================')\n\n        # print ADD-S\n        print('==================ADD-S refined====================')\n        for k in range(len(classes)):\n            print('%s: %f' % (classes[k], ADDS[k, 1]))\n        for k in range(len(classes)-1):\n            print('%f' % (ADDS[k+1, 1]))\n        print('%f' % (ADDS[0, 1]))\n        print(cfg.TRAIN.SNAPSHOT_INFIX)\n        print('===========================================')\n"
  },
  {
    "path": "lib/datasets/factory.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\n\"\"\"Factory method for easily getting imdbs by name.\"\"\"\n\n__sets = {}\n\nimport datasets.ycb_video\nimport datasets.ycb_object\nimport datasets.ycb_self_supervision\nimport datasets.dex_ycb\nimport datasets.background\nimport numpy as np\n\n# ycb video dataset\nfor split in ['train', 'val', 'keyframe', 'trainval', 'debug']:\n    name = 'ycb_video_{}'.format(split)\n    print(name)\n    __sets[name] = (lambda split=split:\n            datasets.YCBVideo(split))\n\n# ycb object dataset\nfor split in ['train', 'test']:\n    name = 'ycb_object_{}'.format(split)\n    print(name)\n    __sets[name] = (lambda split=split:\n            datasets.YCBObject(split))\n\n# ycb self supervision dataset\nfor split in ['train_1', 'train_2', 'train_3', 'train_4', 'train_5', 'test', 'all', 'train_block_median', 'train_block_median_azure', 'train_block_median_demo', 'train_block_median_azure_demo', 'train_table',\n              'debug', 'train_block', 'train_block_azure', 'train_block_big_sim', 'train_block_median_sim', 'train_block_small_sim']:\n    name = 'ycb_self_supervision_{}'.format(split)\n    print(name)\n    __sets[name] = (lambda split=split:\n            datasets.YCBSelfSupervision(split))\n\n# background dataset\nfor split in ['coco', 'rgbd', 'nvidia', 'table', 'isaac', 'texture']:\n    name = 'background_{}'.format(split)\n    print(name)\n    __sets[name] = (lambda split=split:\n            datasets.BackgroundDataset(split))\n\n\n# DEX YCB dataset\nfor setup in ('s0', 's1', 's2', 's3'):\n    for split in ('train', 'val', 'test'):\n        name = 'dex_ycb_{}_{}'.format(setup, split)\n        __sets[name] = (lambda setup=setup, split=split: datasets.DexYCBDataset(setup, split))\n\n\ndef get_dataset(name):\n    \"\"\"Get an imdb (image database) by name.\"\"\"\n    if name not in __sets:\n        raise KeyError('Unknown dataset: {}'.format(name))\n    return __sets[name]()\n\ndef list_datasets():\n    \"\"\"List all registered imdbs.\"\"\"\n    return __sets.keys()\n"
  },
  {
    "path": "lib/datasets/imdb.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport os\nimport os.path as osp\nimport numpy as np\nimport datasets\nimport math\nimport glob\nfrom fcn.config import cfg\n\nclass imdb(object):\n    \"\"\"Image database.\"\"\"\n\n    def __init__(self):\n        self._name = ''\n        self._num_classes = 0\n        self._classes = []\n        self._class_colors = []\n\n    @property\n    def name(self):\n        return self._name\n\n    @property\n    def num_classes(self):\n        return len(self._classes)\n\n    @property\n    def classes(self):\n        return self._classes\n\n    @property\n    def class_colors(self):\n        return self._class_colors\n\n    @property\n    def cache_path(self):\n        cache_path = osp.abspath(osp.join(datasets.ROOT_DIR, 'data', 'cache'))\n        if not os.path.exists(cache_path):\n            os.makedirs(cache_path)\n        return cache_path\n\n\n    # backproject pixels into 3D points in camera's coordinate system\n    def backproject(self, depth_cv, intrinsic_matrix, factor):\n\n        depth = depth_cv.astype(np.float32, copy=True) / factor\n\n        index = np.where(~np.isfinite(depth))\n        depth[index[0], index[1]] = 0\n\n        # get intrinsic matrix\n        K = intrinsic_matrix\n        Kinv = np.linalg.inv(K)\n\n        # compute the 3D points\n        width = depth.shape[1]\n        height = depth.shape[0]\n\n        # construct the 2D points matrix\n        x, y = np.meshgrid(np.arange(width), np.arange(height))\n        ones = np.ones((height, width), dtype=np.float32)\n        x2d = np.stack((x, y, ones), axis=2).reshape(width*height, 3)\n\n        # backprojection\n        R = np.dot(Kinv, x2d.transpose())\n\n        # compute the 3D points\n        X = np.multiply(np.tile(depth.reshape(1, width*height), (3, 1)), R)\n        return np.array(X).transpose().reshape((height, width, 3))\n\n\n    def _build_uniform_poses(self):\n\n        self.eulers = []\n        interval = cfg.TRAIN.UNIFORM_POSE_INTERVAL\n        for yaw in range(-180, 180, interval):\n            for pitch in range(-90, 90, interval):\n                for roll in range(-180, 180, interval):\n                    self.eulers.append([yaw, pitch, roll])\n\n        # sample indexes\n        num_poses = len(self.eulers)\n        num_classes = len(self._classes_all) - 1 # no background\n        self.pose_indexes = np.zeros((num_classes, ), dtype=np.int32)\n        self.pose_lists = []\n        for i in range(num_classes):\n            self.pose_lists.append(np.random.permutation(np.arange(num_poses)))\n\n\n    def evaluation(self, output_dir):\n        print('evaluation function not implemented for dataset %s' % self._name)\n"
  },
  {
    "path": "lib/datasets/ycb_object.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport torch\nimport torch.utils.data as data\n\nimport os, math\nimport sys\nimport os.path as osp\nfrom os.path import *\nimport numpy as np\nimport numpy.random as npr\nimport cv2\ntry:\n    import cPickle  # Use cPickle on Python 2.7\nexcept ImportError:\n    import pickle as cPickle\nimport scipy.io\nimport glob\n\nimport datasets\nfrom fcn.config import cfg\nfrom utils.blob import pad_im, chromatic_transform, add_noise, add_noise_cuda, add_noise_depth_cuda\nfrom transforms3d.quaternions import mat2quat, quat2mat\nfrom transforms3d.euler import euler2quat\nfrom utils.se3 import *\nfrom scipy.optimize import minimize\nimport matplotlib.pyplot as plt\n\n\nclass YCBObject(data.Dataset, datasets.imdb):\n    def __init__(self, image_set, ycb_object_path = None):\n\n        self._name = 'ycb_object_' + image_set\n        self._image_set = image_set\n        self._ycb_object_path = self._get_default_path() if ycb_object_path is None \\\n                            else ycb_object_path\n        self._data_path = os.path.join(self._ycb_object_path, 'data')\n        self._model_path = os.path.join(datasets.ROOT_DIR, 'data', 'models')\n        self.root_path = self._ycb_object_path\n\n        # define all the classes\n        self._classes_all = ('__background__', '002_master_chef_can', '003_cracker_box', '004_sugar_box', '005_tomato_soup_can', '006_mustard_bottle', \\\n                         '007_tuna_fish_can', '008_pudding_box', '009_gelatin_box', '010_potted_meat_can', '011_banana', '019_pitcher_base', \\\n                         '021_bleach_cleanser', '024_bowl', '025_mug', '035_power_drill', '036_wood_block', '037_scissors', '040_large_marker', \\\n                         '051_large_clamp', '052_extra_large_clamp', '061_foam_brick', 'holiday_cup1', 'holiday_cup2', 'sanning_mug', \\\n                         '001_chips_can', 'block_red_big', 'block_green_big', 'block_blue_big', 'block_yellow_big', \\\n                         'block_red_small', 'block_green_small', 'block_blue_small', 'block_yellow_small', \\\n                         'block_red_median', 'block_green_median', 'block_blue_median', 'block_yellow_median',\n                         'fusion_duplo_dude', 'cabinet_handle')\n        self._num_classes_all = len(self._classes_all)\n        self._class_colors_all = [(255, 255, 255), (255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 0, 255), (0, 255, 255), \\\n                              (0, 0, 128), (0, 128, 0), (128, 0, 0), (128, 128, 0), (128, 0, 128), (0, 128, 128), \\\n                              (0, 64, 0), (64, 0, 0), (0, 0, 64), (64, 64, 0), (64, 0, 64), (0, 64, 64), \\\n                              (192, 0, 0), (0, 192, 0), (0, 0, 192), (192, 192, 0), (192, 0, 192), (0, 192, 192), (32, 0, 0), \\\n                              (150, 0, 0), (0, 150, 0), (0, 0, 150), (150, 150, 0), (75, 0, 0), (0, 75, 0), (0, 0, 75), (75, 75, 0), \\\n                              (200, 0, 0), (0, 200, 0), (0, 0, 200), (200, 200, 0), (16, 16, 0), (16, 16, 16)]\n        self._extents_all = self._load_object_extents()\n\n        self._width = cfg.TRAIN.SYN_WIDTH\n        self._height = cfg.TRAIN.SYN_HEIGHT\n        self._intrinsic_matrix = np.array([[524.7917885754071, 0, 332.5213232846151],\n                                          [0, 489.3563960810721, 281.2339855172282],\n                                          [0, 0, 1]])\n\n        # select a subset of classes\n        self._classes = [self._classes_all[i] for i in cfg.TRAIN.CLASSES]\n        self._classes_test = [self._classes_all[i] for i in cfg.TEST.CLASSES]\n        self._num_classes = len(self._classes)\n        self._class_colors = [self._class_colors_all[i] for i in cfg.TRAIN.CLASSES]\n        self._class_colors_test = [self._class_colors_all[i] for i in cfg.TEST.CLASSES]\n        self._symmetry = np.array(cfg.TRAIN.SYMMETRY).astype(np.float32)\n        self._symmetry_test = np.array(cfg.TEST.SYMMETRY).astype(np.float32)\n        self._extents = self._extents_all[cfg.TRAIN.CLASSES]\n        self._extents_test = self._extents_all[cfg.TEST.CLASSES]\n\n        # train classes\n        self._points, self._points_all, self._point_blob = \\\n            self._load_object_points(self._classes, self._extents, self._symmetry)\n\n        # test classes\n        self._points_test, self._points_all_test, self._point_blob_test = \\\n            self._load_object_points(self._classes_test, self._extents_test, self._symmetry_test)\n\n        self._pixel_mean = torch.tensor(cfg.PIXEL_MEANS / 255.0).cuda().float()\n\n        self._classes_other = []\n        for i in range(self._num_classes_all):\n            if i not in cfg.TRAIN.CLASSES:\n                # do not use clamp\n                if i == 19 and 20 in cfg.TRAIN.CLASSES:\n                    continue\n                if i == 20 and 19 in cfg.TRAIN.CLASSES:\n                    continue\n                self._classes_other.append(i)\n        self._num_classes_other = len(self._classes_other)\n\n        # 3D model paths\n        self.model_sdf_paths = ['{}/{}/textured_simple_low_res.pth'.format(self._model_path, cls) for cls in self._classes_all[1:]]\n        self.model_colors = [np.array(self._class_colors_all[i]) / 255.0 for i in range(1, len(self._classes_all))]\n\n        self.model_mesh_paths = []\n        for cls in self._classes_all[1:]:\n            filename = '{}/{}/textured_simple.ply'.format(self._model_path, cls)\n            if osp.exists(filename):\n                self.model_mesh_paths.append(filename)\n                continue\n            filename = '{}/{}/textured_simple.obj'.format(self._model_path, cls)\n            if osp.exists(filename):\n                self.model_mesh_paths.append(filename)\n                continue\n\n        self.model_texture_paths = []\n        for cls in self._classes_all[1:]:\n            filename = '{}/{}/texture_map.png'.format(self._model_path, cls)\n            if osp.exists(filename):\n                self.model_texture_paths.append(filename)\n            else:\n                self.model_texture_paths.append('')\n\n        # target meshes\n        self.model_colors_target = [np.array(self._class_colors_all[i]) / 255.0 for i in cfg.TRAIN.CLASSES[1:]]\n        self.model_mesh_paths_target = []\n        for cls in self._classes[1:]:\n            filename = '{}/{}/textured_simple.obj'.format(self._model_path, cls)\n            if osp.exists(filename):\n                self.model_mesh_paths_target.append(filename)\n                continue\n            filename = '{}/{}/textured_simple.ply'.format(self._model_path, cls)\n            if osp.exists(filename):\n                self.model_mesh_paths_target.append(filename)\n\n        self.model_texture_paths_target = []\n        for cls in self._classes[1:]:\n            filename = '{}/{}/texture_map.png'.format(self._model_path, cls)\n            if osp.exists(filename):\n                self.model_texture_paths_target.append(filename)\n            else:\n                self.model_texture_paths_target.append('')\n\n        self._class_to_ind = dict(zip(self._classes, range(self._num_classes)))\n        self._size = cfg.TRAIN.SYNNUM\n        self._build_uniform_poses()\n\n        # sample indexes real for ycb object\n        num_poses = 600\n        num_classes = len(self._classes_all) - 1 # no background\n        self.pose_indexes_real = np.zeros((num_classes, ), dtype=np.int32)\n        self.pose_lists_real = []\n        self.pose_images = []\n        for i in range(num_classes):\n            self.pose_lists_real.append(np.random.permutation(np.arange(num_poses)))\n            dirname = osp.join(self._data_path, self._classes_all[i+1], '*.jpg')\n            files = glob.glob(dirname)\n            self.pose_images.append(files)\n\n        # construct fake inputs\n        label_blob = np.zeros((1, self._num_classes, self._height, self._width), dtype=np.float32)\n        pose_blob = np.zeros((1, self._num_classes, 9), dtype=np.float32)\n        gt_boxes = np.zeros((1, self._num_classes, 5), dtype=np.float32)\n\n        # construct the meta data\n        K = self._intrinsic_matrix\n        Kinv = np.linalg.pinv(K)\n        meta_data_blob = np.zeros((1, 18), dtype=np.float32)\n        meta_data_blob[0, 0:9] = K.flatten()\n        meta_data_blob[0, 9:18] = Kinv.flatten()\n\n        self.input_labels = torch.from_numpy(label_blob).cuda()\n        self.input_meta_data = torch.from_numpy(meta_data_blob).cuda()\n        self.input_extents = torch.from_numpy(self._extents).cuda()\n        self.input_gt_boxes = torch.from_numpy(gt_boxes).cuda()\n        self.input_poses = torch.from_numpy(pose_blob).cuda()\n        self.input_points = torch.from_numpy(self._point_blob).cuda()\n        self.input_symmetry = torch.from_numpy(self._symmetry).cuda()\n\n\n    def _render_item(self):\n\n        height = cfg.TRAIN.SYN_HEIGHT\n        width = cfg.TRAIN.SYN_WIDTH\n        fx = self._intrinsic_matrix[0, 0]\n        fy = self._intrinsic_matrix[1, 1]\n        px = self._intrinsic_matrix[0, 2]\n        py = self._intrinsic_matrix[1, 2]\n        zfar = 6.0\n        znear = 0.01\n\n        # sample target objects\n        if cfg.TRAIN.SYN_SAMPLE_OBJECT:\n            maxnum = np.minimum(self.num_classes-1, cfg.TRAIN.SYN_MAX_OBJECT)\n            num = np.random.randint(cfg.TRAIN.SYN_MIN_OBJECT, maxnum+1)\n            perm = np.random.permutation(np.arange(self.num_classes-1))\n            indexes_target = perm[:num] + 1\n        else:\n            num = self.num_classes - 1\n            indexes_target = np.arange(num) + 1\n        num_target = num\n        cls_indexes = [cfg.TRAIN.CLASSES[i]-1 for i in indexes_target]\n\n        # sample other objects as distractors\n        if cfg.TRAIN.SYN_SAMPLE_DISTRACTOR:\n            num_other = min(5, self._num_classes_other)\n            num_selected = np.random.randint(0, num_other+1)\n            perm = np.random.permutation(np.arange(self._num_classes_other))\n            indexes = perm[:num_selected]\n            for i in range(num_selected):\n                cls_indexes.append(self._classes_other[indexes[i]]-1)\n        else:\n            num_selected = 0\n\n        # sample poses\n        num = num_target + num_selected\n        poses_all = []\n        for i in range(num):\n            qt = np.zeros((7, ), dtype=np.float32)\n            # rotation\n            cls = int(cls_indexes[i])\n            if self.pose_indexes[cls] >= len(self.pose_lists[cls]):\n                self.pose_indexes[cls] = 0\n                self.pose_lists[cls] = np.random.permutation(np.arange(len(self.eulers)))\n            yaw = self.eulers[self.pose_lists[cls][self.pose_indexes[cls]]][0] + 15 * np.random.randn()\n            pitch = self.eulers[self.pose_lists[cls][self.pose_indexes[cls]]][1] + 15 * np.random.randn()\n            pitch = np.clip(pitch, -90, 90)\n            roll = self.eulers[self.pose_lists[cls][self.pose_indexes[cls]]][2] + 15 * np.random.randn()\n            qt[3:] = euler2quat(yaw * math.pi / 180.0, pitch * math.pi / 180.0, roll * math.pi / 180.0, 'syxz')\n            self.pose_indexes[cls] += 1\n\n            # translation\n            bound = cfg.TRAIN.SYN_BOUND\n            if i == 0 or i >= num_target or np.random.rand(1) > 0.5:\n                qt[0] = np.random.uniform(-bound, bound)\n                qt[1] = np.random.uniform(-bound, bound)\n                qt[2] = np.random.uniform(cfg.TRAIN.SYN_TNEAR, cfg.TRAIN.SYN_TFAR)\n            else:\n                # sample an object nearby\n                object_id = np.random.randint(0, i, size=1)[0]\n                extent = 2 * np.mean(self._extents_all[cls+1, :])\n\n                flag = np.random.randint(0, 2)\n                if flag == 0:\n                    flag = -1\n                qt[0] = poses_all[object_id][0] + flag * extent * np.random.uniform(1.0, 1.5)\n                if np.absolute(qt[0]) > bound:\n                    qt[0] = poses_all[object_id][0] - flag * extent * np.random.uniform(1.0, 1.5)\n                if np.absolute(qt[0]) > bound:\n                    qt[0] = np.random.uniform(-bound, bound)\n\n                flag = np.random.randint(0, 2)\n                if flag == 0:\n                    flag = -1\n                qt[1] = poses_all[object_id][1] + flag * extent * np.random.uniform(1.0, 1.5)\n                if np.absolute(qt[1]) > bound:\n                    qt[1] = poses_all[object_id][1] - flag * extent * np.random.uniform(1.0, 1.5)\n                if np.absolute(qt[1]) > bound:\n                    qt[1] = np.random.uniform(-bound, bound)\n\n                qt[2] = poses_all[object_id][2] - extent * np.random.uniform(2.0, 4.0)\n                if qt[2] < cfg.TRAIN.SYN_TNEAR:\n                    qt[2] = poses_all[object_id][2] + extent * np.random.uniform(2.0, 4.0)\n\n            poses_all.append(qt)\n        cfg.renderer.set_poses(poses_all)\n\n        # sample lighting\n        cfg.renderer.set_light_pos(np.random.uniform(-0.5, 0.5, 3))\n\n        intensity = np.random.uniform(0.8, 2)\n        light_color = intensity * np.random.uniform(0.9, 1.1, 3)\n        cfg.renderer.set_light_color(light_color)\n            \n        # rendering\n        cfg.renderer.set_projection_matrix(width, height, fx, fy, px, py, znear, zfar)\n        image_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n        seg_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n        pc_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n        cfg.renderer.render(cls_indexes, image_tensor, seg_tensor, pc2_tensor=pc_tensor)\n        image_tensor = image_tensor.flip(0)\n        seg_tensor = seg_tensor.flip(0)\n        pc_tensor = pc_tensor.flip(0)\n\n        # foreground mask\n        seg = seg_tensor[:,:,2] + 256*seg_tensor[:,:,1] + 256*256*seg_tensor[:,:,0]\n        mask = (seg != 0).unsqueeze(0).repeat((3, 1, 1)).float()\n\n        # RGB to BGR order\n        im = image_tensor.cpu().numpy()\n        im = np.clip(im, 0, 1)\n        im = im[:, :, (2, 1, 0)] * 255\n        im = im.astype(np.uint8)\n\n        # XYZ coordinates in camera frame\n        im_depth = pc_tensor.cpu().numpy()\n        im_depth = im_depth[:, :, :3]\n        im_depth_return = im_depth[:, :, 2].copy()\n\n        im_label = seg_tensor.cpu().numpy()\n        im_label = im_label[:, :, (2, 1, 0)] * 255\n        im_label = np.round(im_label).astype(np.uint8)\n        im_label = np.clip(im_label, 0, 255)\n        im_label, im_label_all = self.process_label_image(im_label)\n\n        centers = np.zeros((num, 2), dtype=np.float32)\n        rcenters = cfg.renderer.get_centers()\n        for i in range(num):\n            centers[i, 0] = rcenters[i][1] * width\n            centers[i, 1] = rcenters[i][0] * height\n        centers = centers[:num_target, :]\n\n        '''\n        import matplotlib.pyplot as plt\n        fig = plt.figure()\n        ax = fig.add_subplot(3, 2, 1)\n        plt.imshow(im[:, :, (2, 1, 0)])\n        for i in range(num_target):\n            plt.plot(centers[i, 0], centers[i, 1], 'yo')\n        ax = fig.add_subplot(3, 2, 2)\n        plt.imshow(im_label)\n        ax = fig.add_subplot(3, 2, 3)\n        plt.imshow(im_depth[:, :, 0])\n        ax = fig.add_subplot(3, 2, 4)\n        plt.imshow(im_depth[:, :, 1])\n        ax = fig.add_subplot(3, 2, 5)\n        plt.imshow(im_depth[:, :, 2])\n        plt.show()\n        #'''\n\n        # chromatic transform\n        if cfg.TRAIN.CHROMATIC and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1:\n            im = chromatic_transform(im)\n\n        im_cuda = torch.from_numpy(im).cuda().float() / 255.0\n        if cfg.TRAIN.ADD_NOISE and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1:\n            im_cuda = add_noise_cuda(im_cuda)\n        im_cuda -= self._pixel_mean\n        im_cuda = im_cuda.permute(2, 0, 1)\n\n        if cfg.INPUT == 'DEPTH' or cfg.INPUT == 'RGBD':\n\n            # depth mask\n            z_im = im_depth[:, :, 2]\n            mask_depth = z_im > 0.0\n            mask_depth = mask_depth.astype('float')\n            mask_depth_cuda = torch.from_numpy(mask_depth).cuda().float()\n            mask_depth_cuda.unsqueeze_(0)\n\n            im_cuda_depth = torch.from_numpy(im_depth).cuda().float()\n            if cfg.TRAIN.ADD_NOISE and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1:\n                im_cuda_depth = add_noise_depth_cuda(im_cuda_depth)\n            im_cuda_depth = im_cuda_depth.permute(2, 0, 1)\n        else:\n            im_cuda_depth = im_cuda.clone()\n            mask_depth_cuda = torch.cuda.FloatTensor(1, height, width).fill_(0)\n\n        # label blob\n        classes = np.array(range(self.num_classes))\n        label_blob = np.zeros((self.num_classes, self._height, self._width), dtype=np.float32)\n        label_blob[0, :, :] = 1.0\n        for i in range(1, self.num_classes):\n            I = np.where(im_label == classes[i])\n            if len(I[0]) > 0:\n                label_blob[i, I[0], I[1]] = 1.0\n                label_blob[0, I[0], I[1]] = 0.0\n\n        # poses and boxes\n        pose_blob = np.zeros((self.num_classes, 9), dtype=np.float32)\n        gt_boxes = np.zeros((self.num_classes, 5), dtype=np.float32)\n        for i in range(num_target):\n            cls = int(indexes_target[i])\n            pose_blob[i, 0] = 1\n            pose_blob[i, 1] = cls\n            T = poses_all[i][:3]\n            qt = poses_all[i][3:]\n\n            # egocentric to allocentric\n            qt_allocentric = egocentric2allocentric(qt, T)\n            if qt_allocentric[0] < 0:\n                qt_allocentric = -1 * qt_allocentric\n            pose_blob[i, 2:6] = qt_allocentric\n            pose_blob[i, 6:] = T\n\n            # compute box\n            x3d = np.ones((4, self._points_all.shape[1]), dtype=np.float32)\n            x3d[0, :] = self._points_all[cls,:,0]\n            x3d[1, :] = self._points_all[cls,:,1]\n            x3d[2, :] = self._points_all[cls,:,2]\n            RT = np.zeros((3, 4), dtype=np.float32)\n            RT[:3, :3] = quat2mat(qt)\n            RT[:, 3] = T\n            x2d = np.matmul(self._intrinsic_matrix, np.matmul(RT, x3d))\n            x2d[0, :] = np.divide(x2d[0, :], x2d[2, :])\n            x2d[1, :] = np.divide(x2d[1, :], x2d[2, :])\n        \n            gt_boxes[i, 0] = np.min(x2d[0, :])\n            gt_boxes[i, 1] = np.min(x2d[1, :])\n            gt_boxes[i, 2] = np.max(x2d[0, :])\n            gt_boxes[i, 3] = np.max(x2d[1, :])\n            gt_boxes[i, 4] = cls\n\n\n        # construct the meta data\n        \"\"\"\n        format of the meta_data\n        intrinsic matrix: meta_data[0 ~ 8]\n        inverse intrinsic matrix: meta_data[9 ~ 17]\n        \"\"\"\n        K = self._intrinsic_matrix\n        K[2, 2] = 1\n        Kinv = np.linalg.pinv(K)\n        meta_data_blob = np.zeros(18, dtype=np.float32)\n        meta_data_blob[0:9] = K.flatten()\n        meta_data_blob[9:18] = Kinv.flatten()\n\n        # vertex regression target\n        if cfg.TRAIN.VERTEX_REG:\n            vertex_targets, vertex_weights = self._generate_vertex_targets(im_label, indexes_target, centers, poses_all, classes, self.num_classes)\n        elif cfg.TRAIN.VERTEX_REG_DELTA and cfg.INPUT == 'DEPTH' or cfg.INPUT == 'RGBD':\n            vertex_targets, vertex_weights = self._generate_vertex_deltas(im_label, indexes_target, centers, poses_all,\n                                                                           classes, self.num_classes, im_depth)\n        else:\n            vertex_targets = []\n            vertex_weights = []\n\n        im_info = np.array([im.shape[1], im.shape[2], cfg.TRAIN.SCALES_BASE[0], 1], dtype=np.float32)\n\n        sample = {'image_color': im_cuda,\n                  'image_depth': im_cuda_depth,\n                  'im_depth': im_depth_return,\n                  'label': label_blob,\n                  'mask': mask,\n                  'mask_depth': mask_depth_cuda,\n                  'meta_data': meta_data_blob,\n                  'poses': pose_blob,\n                  'extents': self._extents,\n                  'points': self._point_blob,\n                  'symmetry': self._symmetry,\n                  'gt_boxes': gt_boxes,\n                  'im_info': im_info}\n\n        if cfg.TRAIN.VERTEX_REG or cfg.TRAIN.VERTEX_REG_DELTA:\n            sample['vertex_targets'] = vertex_targets\n            sample['vertex_weights'] = vertex_weights\n\n        return sample\n\n\n    def __getitem__(self, index):\n        return self._render_item()\n\n\n    def __len__(self):\n        return self._size\n\n\n    # compute the voting label image in 2D\n    def _generate_vertex_targets(self, im_label, cls_indexes, center, poses, classes, num_classes):\n\n        width = im_label.shape[1]\n        height = im_label.shape[0]\n        vertex_targets = np.zeros((3 * num_classes, height, width), dtype=np.float32)\n        vertex_weights = np.zeros((3 * num_classes, height, width), dtype=np.float32)\n\n        c = np.zeros((2, 1), dtype=np.float32)\n        for i in range(1, num_classes):\n            y, x = np.where(im_label == classes[i])\n            I = np.where(im_label == classes[i])\n            ind = np.where(cls_indexes == classes[i])[0]\n            if len(x) > 0 and len(ind) > 0:\n                c[0] = center[ind, 0]\n                c[1] = center[ind, 1]\n                z = poses[int(ind)][2]\n                R = np.tile(c, (1, len(x))) - np.vstack((x, y))\n                # compute the norm\n                N = np.linalg.norm(R, axis=0) + 1e-10\n                # normalization\n                R = np.divide(R, np.tile(N, (2,1)))\n                # assignment\n                vertex_targets[3*i+0, y, x] = R[0,:]\n                vertex_targets[3*i+1, y, x] = R[1,:]\n                vertex_targets[3*i+2, y, x] = math.log(z)\n\n                vertex_weights[3*i+0, y, x] = cfg.TRAIN.VERTEX_W_INSIDE\n                vertex_weights[3*i+1, y, x] = cfg.TRAIN.VERTEX_W_INSIDE\n                vertex_weights[3*i+2, y, x] = cfg.TRAIN.VERTEX_W_INSIDE\n\n        return vertex_targets, vertex_weights\n\n\n    def _generate_vertex_deltas(self, im_label, cls_indexes, center, poses, classes, num_classes, im_depth):\n\n        x_image = im_depth[:, :, 0]\n        y_image = im_depth[:, :, 1]\n        z_image = im_depth[:, :, 2]\n\n        width = im_label.shape[1]\n        height = im_label.shape[0]\n        vertex_targets = np.zeros((3 * num_classes, height, width), dtype=np.float32)\n        vertex_weights = np.zeros((3 * num_classes, height, width), dtype=np.float32)\n\n        c = np.zeros((2, 1), dtype=np.float32)\n        for i in range(1, num_classes):\n\n            valid_mask = (z_image != 0.0)\n            label_mask = (im_label == classes[i])\n            fin_mask = valid_mask * label_mask\n\n            y, x = np.where(fin_mask)\n            ind = np.where(cls_indexes == classes[i])[0]\n            if len(x) > 0 and len(ind) > 0:\n\n                extents_here = self._extents[i, :]\n                largest_dim = np.sqrt(np.sum(extents_here * extents_here))\n                half_diameter = largest_dim / 2.0\n\n                c[0] = center[ind, 0]\n                c[1] = center[ind, 1]\n\n                if isinstance(poses, list):\n                    x_center_coord = poses[int(ind)][0]\n                    y_center_coord = poses[int(ind)][1]\n                    z_center_coord = poses[int(ind)][2]\n                else:\n                    if len(poses.shape) == 3:\n                        x_center_coord = poses[0, 3, ind]\n                        y_center_coord = poses[1, 3, ind]\n                        z_center_coord = poses[2, 3, ind]\n                    else:\n                        x_center_coord = poses[ind, -3]\n                        y_center_coord = poses[ind, -2]\n                        z_center_coord = poses[ind, -1]\n\n                targets_x = (x_image[y, x] - x_center_coord) / half_diameter\n                targets_y = (y_image[y, x] - y_center_coord) / half_diameter\n                targets_z = (z_image[y, x] - z_center_coord) / half_diameter\n\n                vertex_targets[3 * i + 0, y, x] = targets_x\n                vertex_targets[3 * i + 1, y, x] = targets_y\n                vertex_targets[3 * i + 2, y, x] = targets_z\n\n                vertex_weights[3 * i + 0, y, x] = cfg.TRAIN.VERTEX_W_INSIDE\n                vertex_weights[3 * i + 1, y, x] = cfg.TRAIN.VERTEX_W_INSIDE\n                vertex_weights[3 * i + 2, y, x] = cfg.TRAIN.VERTEX_W_INSIDE\n        \n        return vertex_targets, vertex_weights\n\n\n    def _get_default_path(self):\n        \"\"\"\n        Return the default path where ycb_object is expected to be installed.\n        \"\"\"\n        return os.path.join(datasets.ROOT_DIR, 'data', 'YCB_Object')\n\n\n    def _load_object_extents(self):\n\n        extents = np.zeros((self._num_classes_all, 3), dtype=np.float32)\n        for i in range(1, self._num_classes_all):\n            point_file = os.path.join(self._model_path, self._classes_all[i], 'points.xyz')\n            print(point_file)\n            assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file)\n            points = np.loadtxt(point_file)\n            extents[i, :] = 2 * np.max(np.absolute(points), axis=0)\n\n        return extents\n\n\n    def _load_object_points(self, classes, extents, symmetry):\n\n        points = [[] for _ in range(len(classes))]\n        num = np.inf\n        num_classes = len(classes)\n        for i in range(1, num_classes):\n            point_file = os.path.join(self._model_path, classes[i], 'points.xyz')\n            print(point_file)\n            assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file)\n            points[i] = np.loadtxt(point_file)\n            if points[i].shape[0] < num:\n                num = points[i].shape[0]\n\n        points_all = np.zeros((num_classes, num, 3), dtype=np.float32)\n        for i in range(1, num_classes):\n            points_all[i, :, :] = points[i][:num, :]\n\n        # rescale the points\n        point_blob = points_all.copy()\n        for i in range(1, num_classes):\n            # compute the rescaling factor for the points\n            weight = 10.0 / np.amax(extents[i, :])\n            if weight < 10:\n                weight = 10\n            if symmetry[i] > 0:\n                point_blob[i, :, :] = 4 * weight * point_blob[i, :, :]\n            else:\n                point_blob[i, :, :] = weight * point_blob[i, :, :]\n\n        return points, points_all, point_blob\n\n\n    def labels_to_image(self, labels):\n\n        height = labels.shape[0]\n        width = labels.shape[1]\n        im_label = np.zeros((height, width, 3), dtype=np.uint8)\n        for i in range(self.num_classes):\n            I = np.where(labels == i)\n            im_label[I[0], I[1], :] = self._class_colors[i]\n\n        return im_label\n\n\n    def process_label_image(self, label_image):\n        \"\"\"\n        change label image to label index\n        \"\"\"\n        height = label_image.shape[0]\n        width = label_image.shape[1]\n        labels = np.zeros((height, width), dtype=np.int32)\n        labels_all = np.zeros((height, width), dtype=np.int32)\n\n        # label image is in BGR order\n        index = label_image[:,:,2] + 256*label_image[:,:,1] + 256*256*label_image[:,:,0]\n        for i in range(1, len(self._class_colors_all)):\n            color = self._class_colors_all[i]\n            ind = color[0] + 256*color[1] + 256*256*color[2]\n            I = np.where(index == ind)\n            labels_all[I[0], I[1]] = i\n\n            ind = np.where(np.array(cfg.TRAIN.CLASSES) == i)[0]\n            if len(ind) > 0:\n                labels[I[0], I[1]] = ind\n\n        return labels, labels_all\n"
  },
  {
    "path": "lib/datasets/ycb_self_supervision.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport torch\nimport torch.utils.data as data\n\nimport os, math\nimport sys\nimport os.path as osp\nfrom os.path import *\nimport numpy as np\nimport numpy.random as npr\nimport cv2\nimport scipy.io\nimport copy\nimport glob\ntry:\n    import cPickle  # Use cPickle on Python 2.7\nexcept ImportError:\n    import pickle as cPickle\n\nimport datasets\nfrom fcn.config import cfg\nfrom utils.blob import pad_im, chromatic_transform, add_noise, add_noise_cuda\nfrom transforms3d.quaternions import mat2quat, quat2mat\nfrom utils.se3 import *\nfrom utils.pose_error import *\nfrom utils.cython_bbox import bbox_overlaps\nfrom utils.segmentation_evaluation import multilabel_metrics\n\ndef VOCap(rec, prec):\n    index = np.where(np.isfinite(rec))[0]\n    rec = rec[index]\n    prec = prec[index]\n    if len(rec) == 0 or len(prec) == 0:\n        ap = 0\n    else:\n        mrec = np.insert(rec, 0, 0)\n        mrec = np.append(mrec, 0.1)\n        mpre = np.insert(prec, 0, 0)\n        mpre = np.append(mpre, prec[-1])\n        for i in range(1, len(mpre)):\n            mpre[i] = max(mpre[i], mpre[i-1])\n        i = np.where(mrec[1:] != mrec[:-1])[0] + 1\n        ap = np.sum(np.multiply(mrec[i] - mrec[i-1], mpre[i])) * 10\n    return ap\n\nclass YCBSelfSupervision(data.Dataset, datasets.imdb):\n    def __init__(self, image_set, ycb_self_supervision_path = None):\n\n        self._name = 'ycb_self_supervision_' + image_set\n        self._image_set = image_set\n        self._ycb_self_supervision_path = self._get_default_path() if ycb_self_supervision_path is None \\\n                            else ycb_self_supervision_path\n        self._data_path = os.path.join(self._ycb_self_supervision_path, 'data')\n        self._model_path = os.path.join(datasets.ROOT_DIR, 'data', 'models')\n\n        # define all the classes\n        self._classes_all = ('__background__', '002_master_chef_can', '003_cracker_box', '004_sugar_box', '005_tomato_soup_can', '006_mustard_bottle', \\\n                         '007_tuna_fish_can', '008_pudding_box', '009_gelatin_box', '010_potted_meat_can', '011_banana', '019_pitcher_base', \\\n                         '021_bleach_cleanser', '024_bowl', '025_mug', '035_power_drill', '036_wood_block', '037_scissors', '040_large_marker', \\\n                         '051_large_clamp', '052_extra_large_clamp', '061_foam_brick', 'holiday_cup1', 'holiday_cup2', 'sanning_mug', \\\n                         '001_chips_can', 'block_red_big', 'block_green_big', 'block_blue_big', 'block_yellow_big', \\\n                         'block_red_small', 'block_green_small', 'block_blue_small', 'block_yellow_small', \\\n                         'block_red_median', 'block_green_median', 'block_blue_median', 'block_yellow_median', 'fusion_duplo_dude', 'cabinet_handle')\n        self._num_classes_all = len(self._classes_all)\n        self._class_colors_all = [(255, 255, 255), (255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 0, 255), (0, 255, 255), \\\n                              (0, 0, 128), (0, 128, 0), (128, 0, 0), (128, 128, 0), (128, 0, 128), (0, 128, 128), \\\n                              (0, 64, 0), (64, 0, 0), (0, 0, 64), (64, 64, 0), (64, 0, 64), (0, 64, 64), \\\n                              (192, 0, 0), (0, 192, 0), (0, 0, 192), (192, 192, 0), (192, 0, 192), (0, 192, 192), (32, 0, 0), \\\n                              (150, 0, 0), (0, 150, 0), (0, 0, 150), (150, 150, 0), (75, 0, 0), (0, 75, 0), (0, 0, 75), (75, 75, 0), \\\n                              (200, 0, 0), (0, 200, 0), (0, 0, 200), (200, 200, 0), (16, 16, 0), (16, 16, 16)]\n        self._extents_all = self._load_object_extents()\n\n        self._width = cfg.TRAIN.SYN_WIDTH\n        self._height = cfg.TRAIN.SYN_HEIGHT\n        self._intrinsic_matrix = np.array([[616.3653,    0.,      310.25882],\n                                           [  0.,      616.20294, 236.59981],\n                                           [  0.,        0.,        1.     ]])\n\n        if self._width == 1280:\n            self._intrinsic_matrix = np.array([[599.48681641,   0.,         639.84338379],\n                                               [  0.,         599.24389648, 366.09042358],\n                                               [  0.,           0.,           1.        ]])\n\n\n        # select a subset of classes\n        self._classes = [self._classes_all[i] for i in cfg.TRAIN.CLASSES]\n        self._classes_test = [self._classes_all[i] for i in cfg.TEST.CLASSES]\n        self._num_classes = len(self._classes)\n        self._class_colors = [self._class_colors_all[i] for i in cfg.TRAIN.CLASSES]\n        self._class_colors_test = [self._class_colors_all[i] for i in cfg.TEST.CLASSES]\n        self._symmetry = np.array(cfg.TRAIN.SYMMETRY).astype(np.float32)\n        self._symmetry_test = np.array(cfg.TEST.SYMMETRY).astype(np.float32)\n        self._extents = self._extents_all[cfg.TRAIN.CLASSES]\n        self._extents_test = self._extents_all[cfg.TEST.CLASSES]\n        self._points, self._points_all, self._point_blob = self._load_object_points(self._classes, self._extents, self._symmetry)\n        self._points_test, self._points_all_test, self._point_blob_test = \\\n            self._load_object_points(self._classes_test, self._extents_test, self._symmetry_test)\n        self._pixel_mean = torch.tensor(cfg.PIXEL_MEANS / 255.0).cuda().float()\n\n        self._classes_other = []\n        for i in range(self._num_classes_all):\n            if i not in cfg.TRAIN.CLASSES:\n                # do not use clamp\n                if i == 19 and 20 in cfg.TRAIN.CLASSES:\n                    continue\n                if i == 20 and 19 in cfg.TRAIN.CLASSES:\n                    continue\n                self._classes_other.append(i)\n        self._num_classes_other = len(self._classes_other)\n\n        # 3D model paths\n        self.model_sdf_paths = ['{}/{}/textured_simple_low_res.pth'.format(self._model_path, cls) for cls in self._classes_all[1:]]\n        self.model_colors = [np.array(self._class_colors_all[i]) / 255.0 for i in range(1, len(self._classes_all))]\n\n        self.model_mesh_paths = []\n        for cls in self._classes_all[1:]:\n            filename = '{}/{}/textured_simple.ply'.format(self._model_path, cls)\n            if osp.exists(filename):\n                self.model_mesh_paths.append(filename)\n                continue\n            filename = '{}/{}/textured_simple.obj'.format(self._model_path, cls)\n            if osp.exists(filename):\n                self.model_mesh_paths.append(filename)\n\n        self.model_texture_paths = []\n        for cls in self._classes_all[1:]:\n            filename = '{}/{}/texture_map.png'.format(self._model_path, cls)\n            if osp.exists(filename):\n                self.model_texture_paths.append(filename)\n            else:\n                self.model_texture_paths.append('')\n\n        # target meshes\n        self.model_colors_target = [np.array(self._class_colors_all[i]) / 255.0 for i in cfg.TRAIN.CLASSES[1:]]\n        self.model_mesh_paths_target = []\n        for cls in self._classes[1:]:\n            filename = '{}/{}/textured_simple.ply'.format(self._model_path, cls)\n            if osp.exists(filename):\n                self.model_mesh_paths_target.append(filename)\n                continue\n            filename = '{}/{}/textured_simple.obj'.format(self._model_path, cls)\n            if osp.exists(filename):\n                self.model_mesh_paths_target.append(filename)\n\n        self.model_texture_paths_target = []\n        for cls in self._classes[1:]:\n            filename = '{}/{}/texture_map.png'.format(self._model_path, cls)\n            if osp.exists(filename):\n                self.model_texture_paths_target.append(filename)\n            else:\n                self.model_texture_paths_target.append('')\n\n        self._class_to_ind = dict(zip(self._classes, range(self._num_classes)))\n        self._image_ext = '.png'\n        self._image_index = self._load_image_set_index(image_set)\n\n        if (cfg.MODE == 'TRAIN' and cfg.TRAIN.SYNTHESIZE) or (cfg.MODE == 'TEST' and cfg.TEST.SYNTHESIZE):\n            self._size = len(self._image_index) * (cfg.TRAIN.SYN_RATIO+1)\n        else:\n            self._size = len(self._image_index)\n\n        if self._size > cfg.TRAIN.MAX_ITERS_PER_EPOCH * cfg.TRAIN.IMS_PER_BATCH:\n            self._size = cfg.TRAIN.MAX_ITERS_PER_EPOCH * cfg.TRAIN.IMS_PER_BATCH\n        self._roidb = self.gt_roidb()\n        if cfg.MODE == 'TRAIN' or cfg.TEST.VISUALIZE:\n            self._perm = np.random.permutation(np.arange(len(self._roidb)))\n        else:\n            self._perm = np.arange(len(self._roidb))\n        self._cur = 0\n        self._build_uniform_poses()\n        self.lb_shift = -0.2\n        self.ub_shift = 0.2\n        self.lb_scale = 0.8\n        self.ub_scale = 2.0\n\n        assert os.path.exists(self._ycb_self_supervision_path), \\\n                'ycb_self_supervision path does not exist: {}'.format(self._ycb_self_supervision_path)\n        assert os.path.exists(self._data_path), \\\n                'Data path does not exist: {}'.format(self._data_path)\n\n        # construct fake inputs\n        label_blob = np.zeros((1, self._num_classes, self._height, self._width), dtype=np.float32)\n        pose_blob = np.zeros((1, self._num_classes, 9), dtype=np.float32)\n        gt_boxes = np.zeros((1, self._num_classes, 5), dtype=np.float32)\n\n        # construct the meta data\n        K = self._intrinsic_matrix\n        Kinv = np.linalg.pinv(K)\n        meta_data_blob = np.zeros((1, 18), dtype=np.float32)\n        meta_data_blob[0, 0:9] = K.flatten()\n        meta_data_blob[0, 9:18] = Kinv.flatten()\n\n        self.input_labels = torch.from_numpy(label_blob).cuda()\n        self.input_meta_data = torch.from_numpy(meta_data_blob).cuda()\n        self.input_extents = torch.from_numpy(self._extents).cuda()\n        self.input_gt_boxes = torch.from_numpy(gt_boxes).cuda()\n        self.input_poses = torch.from_numpy(pose_blob).cuda()\n        self.input_points = torch.from_numpy(self._point_blob).cuda()\n        self.input_symmetry = torch.from_numpy(self._symmetry).cuda()\n\n\n    def _render_item(self):\n\n        height = cfg.TRAIN.SYN_HEIGHT\n        width = cfg.TRAIN.SYN_WIDTH\n        fx = self._intrinsic_matrix[0, 0]\n        fy = self._intrinsic_matrix[1, 1]\n        px = self._intrinsic_matrix[0, 2]\n        py = self._intrinsic_matrix[1, 2]\n        zfar = 6.0\n        znear = 0.01\n\n        # sample target objects\n        if cfg.TRAIN.SYN_SAMPLE_OBJECT:\n            maxnum = np.minimum(self.num_classes-1, cfg.TRAIN.SYN_MAX_OBJECT)\n            num = np.random.randint(cfg.TRAIN.SYN_MIN_OBJECT, maxnum+1)\n            perm = np.random.permutation(np.arange(self.num_classes-1))\n            indexes_target = perm[:num] + 1\n        else:\n            num = self.num_classes - 1\n            indexes_target = np.arange(num) + 1\n        num_target = num\n        cls_indexes = [cfg.TRAIN.CLASSES[i]-1 for i in indexes_target]\n\n        # sample other objects as distractors\n        if cfg.TRAIN.SYN_SAMPLE_DISTRACTOR:\n            num_other = min(5, self._num_classes_other)\n            num_selected = np.random.randint(0, num_other+1)\n            perm = np.random.permutation(np.arange(self._num_classes_other))\n            indexes = perm[:num_selected]\n            for i in range(num_selected):\n                cls_indexes.append(self._classes_other[indexes[i]]-1)\n        else:\n            num_selected = 0\n\n        # sample poses\n        num = num_target + num_selected\n        poses_all = []\n        for i in range(num):\n            qt = np.zeros((7, ), dtype=np.float32)\n            # rotation\n            cls = int(cls_indexes[i])\n            if self.pose_indexes[cls] >= len(self.pose_lists[cls]):\n                self.pose_indexes[cls] = 0\n                self.pose_lists[cls] = np.random.permutation(np.arange(len(self.eulers)))\n            yaw = self.eulers[self.pose_lists[cls][self.pose_indexes[cls]]][0] + 15 * np.random.randn()\n            pitch = self.eulers[self.pose_lists[cls][self.pose_indexes[cls]]][1] + 15 * np.random.randn()\n            pitch = np.clip(pitch, -90, 90)\n            roll = self.eulers[self.pose_lists[cls][self.pose_indexes[cls]]][2] + 15 * np.random.randn()\n            qt[3:] = euler2quat(yaw * math.pi / 180.0, pitch * math.pi / 180.0, roll * math.pi / 180.0, 'syxz')\n            self.pose_indexes[cls] += 1\n\n            # translation\n            bound = cfg.TRAIN.SYN_BOUND\n            if i == 0 or i >= num_target or np.random.rand(1) > 0.5:\n                qt[0] = np.random.uniform(-bound, bound)\n                qt[1] = np.random.uniform(-bound, bound)\n                qt[2] = np.random.uniform(cfg.TRAIN.SYN_TNEAR, cfg.TRAIN.SYN_TFAR)\n            else:\n                # sample an object nearby\n                object_id = np.random.randint(0, i, size=1)[0]\n                extent = np.mean(self._extents_all[cls+1, :])\n\n                flag = np.random.randint(0, 2)\n                if flag == 0:\n                    flag = -1\n                qt[0] = poses_all[object_id][0] + flag * extent * np.random.uniform(1.0, 1.5)\n                if np.absolute(qt[0]) > bound:\n                    qt[0] = poses_all[object_id][0] - flag * extent * np.random.uniform(1.0, 1.5)\n                if np.absolute(qt[0]) > bound:\n                    qt[0] = np.random.uniform(-bound, bound)\n\n                flag = np.random.randint(0, 2)\n                if flag == 0:\n                    flag = -1\n                qt[1] = poses_all[object_id][1] + flag * extent * np.random.uniform(1.0, 1.5)\n                if np.absolute(qt[1]) > bound:\n                    qt[1] = poses_all[object_id][1] - flag * extent * np.random.uniform(1.0, 1.5)\n                if np.absolute(qt[1]) > bound:\n                    qt[1] = np.random.uniform(-bound, bound)\n\n                qt[2] = poses_all[object_id][2] - extent * np.random.uniform(2.0, 4.0)\n                if qt[2] < cfg.TRAIN.SYN_TNEAR:\n                    qt[2] = poses_all[object_id][2] + extent * np.random.uniform(2.0, 4.0)\n\n            poses_all.append(qt)\n        cfg.renderer.set_poses(poses_all)\n\n        # sample lighting\n        cfg.renderer.set_light_pos(np.random.uniform(-0.5, 0.5, 3))\n\n        intensity = np.random.uniform(0.8, 2)\n        light_color = intensity * np.random.uniform(0.9, 1.1, 3)\n        cfg.renderer.set_light_color(light_color)\n            \n        # rendering\n        cfg.renderer.set_projection_matrix(width, height, fx, fy, px, py, znear, zfar)\n        image_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n        seg_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n        pc_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n        cfg.renderer.render(cls_indexes, image_tensor, seg_tensor, pc2_tensor=pc_tensor)\n        image_tensor = image_tensor.flip(0)\n        seg_tensor = seg_tensor.flip(0)\n        pc_tensor = pc_tensor.flip(0)\n\n        # foreground mask\n        seg = seg_tensor[:,:,2] + 256*seg_tensor[:,:,1] + 256*256*seg_tensor[:,:,0]\n        mask = (seg != 0).unsqueeze(0).repeat((3, 1, 1)).float()\n\n        # RGB to BGR order\n        im = image_tensor.cpu().numpy()\n        im = np.clip(im, 0, 1)\n        im = im[:, :, (2, 1, 0)] * 255\n        im = im.astype(np.uint8)\n\n        # XYZ coordinates in camera frame\n        im_depth = pc_tensor.cpu().numpy()\n        im_depth = im_depth[:, :, :3]\n        im_depth_return = im_depth[:, :, 2].copy()\n\n        im_label = seg_tensor.cpu().numpy()\n        im_label = im_label[:, :, (2, 1, 0)] * 255\n        im_label = np.round(im_label).astype(np.uint8)\n        im_label = np.clip(im_label, 0, 255)\n        im_label, im_label_all = self.process_label_image(im_label)\n\n        centers = np.zeros((num, 2), dtype=np.float32)\n        rcenters = cfg.renderer.get_centers()\n        for i in range(num):\n            centers[i, 0] = rcenters[i][1] * width\n            centers[i, 1] = rcenters[i][0] * height\n        centers = centers[:num_target, :]\n\n        '''\n        import matplotlib.pyplot as plt\n        fig = plt.figure()\n        ax = fig.add_subplot(3, 2, 1)\n        plt.imshow(im[:, :, (2, 1, 0)])\n        for i in range(num_target):\n            plt.plot(centers[i, 0], centers[i, 1], 'yo')\n        ax = fig.add_subplot(3, 2, 2)\n        plt.imshow(im_label)\n        ax = fig.add_subplot(3, 2, 3)\n        plt.imshow(im_depth[:, :, 0])\n        ax = fig.add_subplot(3, 2, 4)\n        plt.imshow(im_depth[:, :, 1])\n        ax = fig.add_subplot(3, 2, 5)\n        plt.imshow(im_depth[:, :, 2])\n        plt.show()\n        #'''\n\n        # chromatic transform\n        if cfg.TRAIN.CHROMATIC and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1:\n            im = chromatic_transform(im)\n\n        im_cuda = torch.from_numpy(im).cuda().float() / 255.0\n        if cfg.TRAIN.ADD_NOISE and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1:\n            im_cuda = add_noise_cuda(im_cuda)\n        im_cuda -= self._pixel_mean\n        im_cuda = im_cuda.permute(2, 0, 1)\n\n        if cfg.INPUT == 'DEPTH' or cfg.INPUT == 'RGBD':\n\n            # depth mask\n            z_im = im_depth[:, :, 2]\n            mask_depth = z_im > 0.0\n            mask_depth = mask_depth.astype('float')\n            mask_depth_cuda = torch.from_numpy(mask_depth).cuda().float()\n            mask_depth_cuda.unsqueeze_(0)\n\n            im_cuda_depth = torch.from_numpy(im_depth).cuda().float()\n            if cfg.TRAIN.ADD_NOISE and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1:\n                im_cuda_depth = add_noise_depth_cuda(im_cuda_depth)\n            im_cuda_depth = im_cuda_depth.permute(2, 0, 1)\n        else:\n            im_cuda_depth = im_cuda.clone()\n            mask_depth_cuda = torch.cuda.FloatTensor(1, height, width).fill_(0)\n\n        # label blob\n        classes = np.array(range(self.num_classes))\n        label_blob = np.zeros((self.num_classes, self._height, self._width), dtype=np.float32)\n        label_blob[0, :, :] = 1.0\n        for i in range(1, self.num_classes):\n            I = np.where(im_label == classes[i])\n            if len(I[0]) > 0:\n                label_blob[i, I[0], I[1]] = 1.0\n                label_blob[0, I[0], I[1]] = 0.0\n\n        # poses and boxes\n        pose_blob = np.zeros((self.num_classes, 9), dtype=np.float32)\n        gt_boxes = np.zeros((self.num_classes, 5), dtype=np.float32)\n        count = 0\n        for i in range(num_target):\n            cls = int(indexes_target[i])\n            T = poses_all[i][:3]\n            qt = poses_all[i][3:]\n\n            I = np.where(im_label == cls)\n            if len(I[0]) == 0:\n                continue\n\n            # compute box\n            x3d = np.ones((4, self._points_all.shape[1]), dtype=np.float32)\n            x3d[0, :] = self._points_all[cls,:,0]\n            x3d[1, :] = self._points_all[cls,:,1]\n            x3d[2, :] = self._points_all[cls,:,2]\n            RT = np.zeros((3, 4), dtype=np.float32)\n            RT[:3, :3] = quat2mat(qt)\n            RT[:, 3] = T\n            x2d = np.matmul(self._intrinsic_matrix, np.matmul(RT, x3d))\n            x2d[0, :] = np.divide(x2d[0, :], x2d[2, :])\n            x2d[1, :] = np.divide(x2d[1, :], x2d[2, :])\n\n            x1 = np.min(x2d[0, :])\n            y1 = np.min(x2d[1, :])\n            x2 = np.max(x2d[0, :])\n            y2 = np.max(x2d[1, :])\n            if x1 > width or y1 > height or x2 < 0 or y2 < 0:\n                continue\n\n            gt_boxes[count, 0] = x1\n            gt_boxes[count, 1] = y1\n            gt_boxes[count, 2] = x2\n            gt_boxes[count, 3] = y2\n            gt_boxes[count, 4] = cls\n\n            pose_blob[count, 0] = 1\n            pose_blob[count, 1] = cls\n            # egocentric to allocentric\n            qt_allocentric = egocentric2allocentric(qt, T)\n            if qt_allocentric[0] < 0:\n                qt_allocentric = -1 * qt_allocentric\n            pose_blob[count, 2:6] = qt_allocentric\n            pose_blob[count, 6:] = T\n            count += 1\n\n\n        # construct the meta data\n        \"\"\"\n        format of the meta_data\n        intrinsic matrix: meta_data[0 ~ 8]\n        inverse intrinsic matrix: meta_data[9 ~ 17]\n        \"\"\"\n        K = self._intrinsic_matrix\n        K[2, 2] = 1\n        Kinv = np.linalg.pinv(K)\n        meta_data_blob = np.zeros(18, dtype=np.float32)\n        meta_data_blob[0:9] = K.flatten()\n        meta_data_blob[9:18] = Kinv.flatten()\n\n        # vertex regression target\n        if cfg.TRAIN.VERTEX_REG:\n            vertex_targets, vertex_weights = self._generate_vertex_targets(im_label, indexes_target, centers, poses_all, classes, self.num_classes)\n        elif cfg.TRAIN.VERTEX_REG_DELTA and cfg.INPUT == 'DEPTH' or cfg.INPUT == 'RGBD':\n            vertex_targets, vertex_weights = self._generate_vertex_deltas(im_label, indexes_target, centers, poses_all,\n                                                                           classes, self.num_classes, im_depth)\n        else:\n            vertex_targets = []\n            vertex_weights = []\n\n        im_info = np.array([im.shape[1], im.shape[2], cfg.TRAIN.SCALES_BASE[0], 1], dtype=np.float32)\n\n        sample = {'image_color': im_cuda,\n                  'im_depth': im_depth_return,\n                  'label': label_blob,\n                  'mask': mask,\n                  'meta_data': meta_data_blob,\n                  'poses': pose_blob,\n                  'extents': self._extents,\n                  'points': self._point_blob,\n                  'symmetry': self._symmetry,\n                  'gt_boxes': gt_boxes,\n                  'im_info': im_info,\n                  'meta_data_path': ''}\n\n        if cfg.TRAIN.VERTEX_REG or cfg.TRAIN.VERTEX_REG_DELTA:\n            sample['vertex_targets'] = vertex_targets\n            sample['vertex_weights'] = vertex_weights\n\n        # affine transformation\n        if cfg.TRAIN.AFFINE:\n            shift = np.float32([np.random.uniform(self.lb_shift, self.ub_shift), np.random.uniform(self.lb_shift, self.ub_shift)])\n            scale = np.random.uniform(self.lb_scale, self.ub_scale)\n            affine_matrix = np.float32([[scale, 0, shift[0]], [0, scale, shift[1]]])\n\n            affine_1 = np.eye(3, dtype=np.float32)\n            affine_1[0, 2] = -0.5 * self._width\n            affine_1[1, 2] = -0.5 * self._height\n\n            affine_2 = np.eye(3, dtype=np.float32)\n            affine_2[0, 0] = 1.0 / scale\n            affine_2[0, 2] = -shift[0] * 0.5 * self._width / scale\n            affine_2[1, 1] = 1.0 / scale\n            affine_2[1, 2] = -shift[1] * 0.5 * self._height / scale\n\n            affine_3 = np.matmul(affine_2, affine_1)\n            affine_4 = np.matmul(np.linalg.inv(affine_1), affine_3)\n            affine_matrix_coordinate = affine_4[:3, :]\n\n            sample['affine_matrix'] = torch.from_numpy(affine_matrix).cuda()\n            sample['affine_matrix_coordinate'] = torch.from_numpy(affine_matrix_coordinate).cuda()\n\n        return sample\n\n\n    def __getitem__(self, index):\n\n        is_syn = 0\n        if ((cfg.MODE == 'TRAIN' and cfg.TRAIN.SYNTHESIZE) or (cfg.MODE == 'TEST' and cfg.TEST.SYNTHESIZE)) and (index % (cfg.TRAIN.SYN_RATIO+1) != 0):\n            is_syn = 1\n\n        if is_syn:\n            return self._render_item()\n\n        if self._cur >= len(self._roidb):\n            self._perm = np.random.permutation(np.arange(len(self._roidb)))\n            self._cur = 0\n        db_ind = self._perm[self._cur]\n        roidb = self._roidb[db_ind]\n        self._cur += 1\n\n        # Get the input image blob\n        random_scale_ind = npr.randint(0, high=len(cfg.TRAIN.SCALES_BASE))\n        im_blob, im_depth, im_scale, height, width = self._get_image_blob(roidb, random_scale_ind)\n\n        # build the label blob\n        label_blob, mask, meta_data_blob, pose_blob, gt_boxes, vertex_targets, vertex_weights \\\n            = self._get_label_blob(roidb, self._num_classes, im_scale, height, width)\n\n        im_info = np.array([im_blob.shape[1], im_blob.shape[2], im_scale, is_syn], dtype=np.float32)\n        mask_depth_cuda = torch.cuda.FloatTensor(1, height, width).fill_(0)\n\n        sample = {'image_color': im_blob,\n                  'im_depth': im_depth,\n                  'label': label_blob,\n                  'mask': mask,\n                  'meta_data': meta_data_blob,\n                  'poses': pose_blob,\n                  'extents': self._extents,\n                  'points': self._point_blob,\n                  'symmetry': self._symmetry,\n                  'gt_boxes': gt_boxes,\n                  'im_info': im_info,\n                  'meta_data_path': roidb['meta_data']}\n\n        if cfg.TRAIN.VERTEX_REG:\n            sample['vertex_targets'] = vertex_targets\n            sample['vertex_weights'] = vertex_weights\n\n        return sample\n\n\n    def _get_image_blob(self, roidb, scale_ind):    \n\n        # rgba\n        rgba = pad_im(cv2.imread(roidb['image'], cv2.IMREAD_UNCHANGED), 16)\n        if rgba.shape[2] == 4:\n            im = np.copy(rgba[:,:,:3])\n            alpha = rgba[:,:,3]\n            I = np.where(alpha == 0)\n            im[I[0], I[1], :] = 0\n        else:\n            im = rgba\n\n        im_scale = cfg.TRAIN.SCALES_BASE[scale_ind]\n        if im_scale != 1.0:\n            im = cv2.resize(im, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_LINEAR)\n        height = im.shape[0]\n        width = im.shape[1]\n\n        if roidb['flipped']:\n            im = im[:, ::-1, :]\n\n        # chromatic transform\n        if cfg.TRAIN.CHROMATIC and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1:\n            im = chromatic_transform(im)\n\n        im_cuda = torch.from_numpy(im).cuda().float() / 255.0\n        if cfg.TRAIN.ADD_NOISE and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1:\n            im_cuda = add_noise_cuda(im_cuda)\n        im_cuda -= self._pixel_mean\n        im_cuda = im_cuda.permute(2, 0, 1)\n\n        # depth image\n        im_depth = pad_im(cv2.imread(roidb['depth'], cv2.IMREAD_UNCHANGED), 16)\n        if im_scale != 1.0:\n            im_depth = cv2.resize(im_depth, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_NEAREST)\n        im_depth = im_depth.astype(np.float32) / 1000.0\n\n        return im_cuda, im_depth, im_scale, height, width\n\n\n    def _get_label_blob(self, roidb, num_classes, im_scale, height, width):\n        \"\"\" build the label blob \"\"\"\n\n        meta_data = scipy.io.loadmat(roidb['meta_data'])\n        meta_data['cls_indexes'] = meta_data['cls_indexes'].flatten()\n        classes = np.array(cfg.TRAIN.CLASSES)\n        classes_test = np.array(cfg.TEST.CLASSES).flatten()\n\n        intrinsic_matrix = np.matrix(meta_data['intrinsic_matrix'])\n        fx = intrinsic_matrix[0, 0]\n        fy = intrinsic_matrix[1, 1]\n        px = intrinsic_matrix[0, 2]\n        py = intrinsic_matrix[1, 2]\n        zfar = 6.0\n        znear = 0.01\n\n        # poses\n        poses = meta_data['poses']\n        if len(poses.shape) == 2:\n            poses = np.reshape(poses, (3, 4, 1))\n        if roidb['flipped']:\n            poses = _flip_poses(poses, meta_data['intrinsic_matrix'], width)\n        num = poses.shape[2]\n\n        # render poses to get the label image\n        cls_indexes = []\n        poses_all = []\n        qt = np.zeros((7, ), dtype=np.float32)\n        for i in range(num):\n            RT = poses[:, :, i]\n            qt[:3] = RT[:, 3]\n            qt[3:] = mat2quat(RT[:, :3])\n            if cfg.MODE == 'TEST':\n                index = np.where(classes_test == meta_data['cls_indexes'][i])[0]\n                cls_indexes.append(index[0])\n            else:\n                cls_indexes.append(meta_data['cls_indexes'][i] - 1)\n            poses_all.append(qt.copy())\n            \n        # rendering\n        cfg.renderer.set_poses(poses_all)\n        cfg.renderer.set_light_pos([0, 0, 0])\n        cfg.renderer.set_light_color([1, 1, 1])\n        cfg.renderer.set_projection_matrix(width, height, fx, fy, px, py, znear, zfar)\n        image_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n        seg_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n        cfg.renderer.render(cls_indexes, image_tensor, seg_tensor)\n        image_tensor = image_tensor.flip(0)\n        seg_tensor = seg_tensor.flip(0)\n\n        # semantic labels\n        im_label = seg_tensor.cpu().numpy()\n        im_label = im_label[:, :, (2, 1, 0)] * 255\n        im_label = np.round(im_label).astype(np.uint8)\n        im_label = np.clip(im_label, 0, 255)\n        im_label, im_label_all = self.process_label_image(im_label)\n\n        centers = np.zeros((num, 2), dtype=np.float32)\n        rcenters = cfg.renderer.get_centers()\n        for i in range(num):\n            centers[i, 0] = rcenters[i][1] * width\n            centers[i, 1] = rcenters[i][0] * height\n\n        # label blob\n        label_blob = np.zeros((num_classes, height, width), dtype=np.float32)\n        label_blob[0, :, :] = 1.0\n        for i in range(1, num_classes):\n            I = np.where(im_label_all == classes[i])\n            if len(I[0]) > 0:\n                label_blob[i, I[0], I[1]] = 1.0\n                label_blob[0, I[0], I[1]] = 0.0\n\n        '''\n        import matplotlib.pyplot as plt\n        fig = plt.figure()\n        ax = fig.add_subplot(1, 2, 1)\n        plt.imshow(im_label)\n        for i in range(num):\n            plt.plot(centers[i, 0], centers[i, 1], 'yo')\n        ax = fig.add_subplot(1, 2, 2)\n        plt.imshow(im_label_all)\n        plt.show()\n        #'''\n\n        # foreground mask\n        seg = torch.from_numpy((im_label != 0).astype(np.float32))\n        mask = seg.unsqueeze(0).repeat((3, 1, 1)).float().cuda()\n\n        # gt poses\n        pose_blob = np.zeros((num_classes, 9), dtype=np.float32)\n        gt_boxes = np.zeros((num_classes, 5), dtype=np.float32)\n        count = 0\n        for i in range(num):\n            cls = int(meta_data['cls_indexes'][i])\n            ind = np.where(classes == cls)[0]\n            if len(ind) > 0:\n\n                I = np.where(im_label == ind[0])\n                if len(I[0]) == 0:\n                    continue\n\n                R = poses[:, :3, i]\n                T = poses[:, 3, i]\n\n                # compute box\n                x3d = np.ones((4, self._points_all.shape[1]), dtype=np.float32)\n                x3d[0, :] = self._points_all[ind,:,0]\n                x3d[1, :] = self._points_all[ind,:,1]\n                x3d[2, :] = self._points_all[ind,:,2]\n                RT = np.zeros((3, 4), dtype=np.float32)\n                RT[:3, :3] = R\n                RT[:, 3] = T\n                x2d = np.matmul(meta_data['intrinsic_matrix'], np.matmul(RT, x3d))\n                x2d[0, :] = np.divide(x2d[0, :], x2d[2, :])\n                x2d[1, :] = np.divide(x2d[1, :], x2d[2, :])\n\n                x1 = np.min(x2d[0, :]) * im_scale\n                y1 = np.min(x2d[1, :]) * im_scale\n                x2 = np.max(x2d[0, :]) * im_scale\n                y2 = np.max(x2d[1, :]) * im_scale\n                if x1 > width or y1 > height or x2 < 0 or y2 < 0:\n                    continue\n                gt_boxes[count, 0] = x1\n                gt_boxes[count, 1] = y1\n                gt_boxes[count, 2] = x2\n                gt_boxes[count, 3] = y2\n                gt_boxes[count, 4] = ind\n\n                # pose\n                pose_blob[count, 0] = 1\n                pose_blob[count, 1] = ind\n                qt = mat2quat(R)\n\n                # egocentric to allocentric\n                qt_allocentric = egocentric2allocentric(qt, T)\n                if qt_allocentric[0] < 0:\n                   qt_allocentric = -1 * qt_allocentric\n                pose_blob[count, 2:6] = qt_allocentric\n                pose_blob[count, 6:] = T\n                count += 1\n\n        # construct the meta data\n        \"\"\"\n        format of the meta_data\n        intrinsic matrix: meta_data[0 ~ 8]\n        inverse intrinsic matrix: meta_data[9 ~ 17]\n        \"\"\"\n        K = np.matrix(meta_data['intrinsic_matrix']) * im_scale\n        K[2, 2] = 1\n        Kinv = np.linalg.pinv(K)\n        meta_data_blob = np.zeros(18, dtype=np.float32)\n        meta_data_blob[0:9] = K.flatten()\n        meta_data_blob[9:18] = Kinv.flatten()\n\n        # vertex regression target\n        if cfg.TRAIN.VERTEX_REG:\n            if roidb['flipped']:\n                centers[:, 0] = width - centers[:, 0]\n            vertex_targets, vertex_weights = self._generate_vertex_targets(im_label_all, meta_data['cls_indexes'], \\\n                centers, poses_all, classes, num_classes)\n        else:\n            vertex_targets = []\n            vertex_weights = []\n\n        return label_blob, mask, meta_data_blob, pose_blob, gt_boxes, vertex_targets, vertex_weights\n\n\n    # compute the voting label image in 2D\n    def _generate_vertex_targets(self, im_label, cls_indexes, center, poses, classes, num_classes):\n\n        width = im_label.shape[1]\n        height = im_label.shape[0]\n        vertex_targets = np.zeros((3 * num_classes, height, width), dtype=np.float32)\n        vertex_weights = np.zeros((3 * num_classes, height, width), dtype=np.float32)\n\n        c = np.zeros((2, 1), dtype=np.float32)\n        for i in range(1, num_classes):\n            y, x = np.where(im_label == classes[i])\n            I = np.where(im_label == classes[i])\n            ind = np.where(cls_indexes == classes[i])[0]\n            if len(x) > 0 and len(ind) > 0:\n                c[0] = center[ind, 0]\n                c[1] = center[ind, 1]\n                z = poses[int(ind)][2]\n                R = np.tile(c, (1, len(x))) - np.vstack((x, y))\n                # compute the norm\n                N = np.linalg.norm(R, axis=0) + 1e-10\n                # normalization\n                R = np.divide(R, np.tile(N, (2,1)))\n                # assignment\n                vertex_targets[3*i+0, y, x] = R[0,:]\n                vertex_targets[3*i+1, y, x] = R[1,:]\n                vertex_targets[3*i+2, y, x] = math.log(z)\n\n                vertex_weights[3*i+0, y, x] = cfg.TRAIN.VERTEX_W_INSIDE\n                vertex_weights[3*i+1, y, x] = cfg.TRAIN.VERTEX_W_INSIDE\n                vertex_weights[3*i+2, y, x] = cfg.TRAIN.VERTEX_W_INSIDE\n\n        return vertex_targets, vertex_weights\n\n\n    def __len__(self):\n        return self._size\n\n\n    def _get_default_path(self):\n        \"\"\"\n        Return the default path where ycb_self_supervision is expected to be installed.\n        \"\"\"\n        return os.path.join(datasets.ROOT_DIR, 'data', 'YCB_Self_Supervision')\n\n\n    def _load_image_set_index(self, image_set):\n        \"\"\"\n        Load the indexes of images in the data folder\n        \"\"\"\n\n        image_set_file = os.path.join(self._ycb_self_supervision_path, image_set + '.txt')\n        assert os.path.exists(image_set_file), \\\n                'Path does not exist: {}'.format(image_set_file)\n\n        subdirs = []\n        with open(image_set_file) as f:\n            for x in f.readlines():\n                subdirs.append(x.rstrip('\\n'))\n\n        image_index = []\n        for i in range(len(subdirs)):\n            subdir = subdirs[i]\n            folder = osp.join(self._data_path, subdir)\n            filename = os.path.join(folder, '*.mat')\n            files = glob.glob(filename)\n            print(subdir, len(files))\n            for k in range(len(files)):\n                filename = files[k]\n                head, name = os.path.split(filename)\n                index = subdir + '/' + name[:-9]\n                image_index.append(index)\n\n        print('=======================================================')\n        print('%d image in %s' % (len(image_index), self._data_path))\n        print('=======================================================')\n        return image_index\n\n\n    def _load_object_points(self, classes, extents, symmetry):\n\n        points = [[] for _ in range(len(classes))]\n        num = np.inf\n        num_classes = len(classes)\n        for i in range(1, num_classes):\n            point_file = os.path.join(self._model_path, classes[i], 'points.xyz')\n            print(point_file)\n            assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file)\n            points[i] = np.loadtxt(point_file)\n            if points[i].shape[0] < num:\n                num = points[i].shape[0]\n\n        points_all = np.zeros((num_classes, num, 3), dtype=np.float32)\n        for i in range(1, num_classes):\n            points_all[i, :, :] = points[i][:num, :]\n\n        # rescale the points\n        point_blob = points_all.copy()\n        for i in range(1, num_classes):\n            # compute the rescaling factor for the points\n            weight = 10.0 / np.amax(extents[i, :])\n            if weight < 10:\n                weight = 10\n            if symmetry[i] > 0:\n                point_blob[i, :, :] = 4 * weight * point_blob[i, :, :]\n            else:\n                point_blob[i, :, :] = weight * point_blob[i, :, :]\n\n        return points, points_all, point_blob\n\n\n    def _load_object_extents(self):\n\n        extents = np.zeros((self._num_classes_all, 3), dtype=np.float32)\n        for i in range(1, self._num_classes_all):\n            point_file = os.path.join(self._model_path, self._classes_all[i], 'points.xyz')\n            print(point_file)\n            assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file)\n            points = np.loadtxt(point_file)\n            extents[i, :] = 2 * np.max(np.absolute(points), axis=0)\n\n        return extents\n\n\n    # image\n    def image_path_at(self, i):\n        \"\"\"\n        Return the absolute path to image i in the image sequence.\n        \"\"\"\n        return self.image_path_from_index(self.image_index[i])\n\n    def image_path_from_index(self, index):\n        \"\"\"\n        Construct an image path from the image's \"index\" identifier.\n        \"\"\"\n\n        image_path_jpg = os.path.join(self._data_path, index + '_color.jpg')\n        image_path_png = os.path.join(self._data_path, index + '_color.png')\n        if os.path.exists(image_path_jpg):\n            return image_path_jpg\n        elif os.path.exists(image_path_png):\n            return image_path_png\n\n        assert os.path.exists(image_path_jpg) or os.path.exists(image_path_png), \\\n                'Path does not exist: {} or {}'.format(image_path_jpg, image_path_png)\n\n    # depth\n    def depth_path_at(self, i):\n        \"\"\"\n        Return the absolute path to depth i in the image sequence.\n        \"\"\"\n        return self.depth_path_from_index(self.image_index[i])\n\n    def depth_path_from_index(self, index):\n        \"\"\"\n        Construct an depth path from the image's \"index\" identifier.\n        \"\"\"\n        depth_path = os.path.join(self._data_path, index + '_depth' + self._image_ext)\n        assert os.path.exists(depth_path), \\\n                'Path does not exist: {}'.format(depth_path)\n        return depth_path\n\n    # camera pose\n    def metadata_path_at(self, i):\n        \"\"\"\n        Return the absolute path to metadata i in the image sequence.\n        \"\"\"\n        return self.metadata_path_from_index(self.image_index[i])\n\n    def metadata_path_from_index(self, index):\n        \"\"\"\n        Construct an metadata path from the image's \"index\" identifier.\n        \"\"\"\n        metadata_path = os.path.join(self._data_path, index + '_meta.mat')\n        assert os.path.exists(metadata_path), \\\n                'Path does not exist: {}'.format(metadata_path)\n        return metadata_path\n\n    def gt_roidb(self):\n        \"\"\"\n        Return the database of ground-truth regions of interest.\n\n        This function loads/saves from/to a cache file to speed up future calls.\n        \"\"\"\n\n        gt_roidb = [self._load_ycb_self_supervision_annotation(index)\n                    for index in self._image_index]\n\n        return gt_roidb\n\n\n    def _load_ycb_self_supervision_annotation(self, index):\n        \"\"\"\n        Load class name and meta data\n        \"\"\"\n        # image path\n        image_path = self.image_path_from_index(index)\n\n        # depth path\n        depth_path = self.depth_path_from_index(index)\n\n        # metadata path\n        metadata_path = self.metadata_path_from_index(index)\n        \n        return {'image': image_path,\n                'depth': depth_path,\n                'meta_data': metadata_path,\n                'flipped': False}\n\n\n    def labels_to_image(self, labels):\n\n        height = labels.shape[0]\n        width = labels.shape[1]\n        im_label = np.zeros((height, width, 3), dtype=np.uint8)\n        for i in range(self.num_classes):\n            I = np.where(labels == i)\n            im_label[I[0], I[1], :] = self._class_colors[i]\n\n        return im_label\n\n\n    def process_label_image(self, label_image):\n        \"\"\"\n        change label image to label index\n        \"\"\"\n        height = label_image.shape[0]\n        width = label_image.shape[1]\n        labels = np.zeros((height, width), dtype=np.int32)\n        labels_all = np.zeros((height, width), dtype=np.int32)\n\n        # label image is in BGR order\n        index = label_image[:,:,2] + 256*label_image[:,:,1] + 256*256*label_image[:,:,0]\n        for i in range(1, len(self._class_colors_all)):\n            color = self._class_colors_all[i]\n            ind = color[0] + 256*color[1] + 256*256*color[2]\n            I = np.where(index == ind)\n            labels_all[I[0], I[1]] = i\n\n            ind = np.where(np.array(cfg.TRAIN.CLASSES) == i)[0]\n            if len(ind) > 0:\n                labels[I[0], I[1]] = ind\n\n        return labels, labels_all\n\n\n    def render_gt_pose(self, meta_data):\n\n        width = self._width\n        height = self._height\n        meta_data['cls_indexes'] = meta_data['cls_indexes'].flatten()\n        classes = np.array(cfg.TRAIN.CLASSES)\n        classes_test = np.array(cfg.TEST.CLASSES).flatten()\n\n        intrinsic_matrix = np.matrix(meta_data['intrinsic_matrix'])\n        fx = intrinsic_matrix[0, 0]\n        fy = intrinsic_matrix[1, 1]\n        px = intrinsic_matrix[0, 2]\n        py = intrinsic_matrix[1, 2]\n        zfar = 6.0\n        znear = 0.01\n\n        # poses\n        poses = meta_data['poses']\n        if len(poses.shape) == 2:\n            poses = np.reshape(poses, (3, 4, 1))\n        num = poses.shape[2]\n\n        # render poses to get the label image\n        cls_indexes = []\n        poses_all = []\n        qt = np.zeros((7, ), dtype=np.float32)\n        for i in range(num):\n            RT = poses[:, :, i]\n            qt[:3] = RT[:, 3]\n            qt[3:] = mat2quat(RT[:, :3])\n            if cfg.MODE == 'TEST':\n                index = np.where(classes_test == meta_data['cls_indexes'][i])[0]\n                cls_indexes.append(index[0])\n            else:\n                cls_indexes.append(meta_data['cls_indexes'][i] - 1)\n            poses_all.append(qt.copy())\n            \n        # rendering\n        cfg.renderer.set_poses(poses_all)\n        cfg.renderer.set_light_pos([0, 0, 0])\n        cfg.renderer.set_light_color([1, 1, 1])\n        cfg.renderer.set_projection_matrix(width, height, fx, fy, px, py, znear, zfar)\n        image_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n        seg_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n        cfg.renderer.render(cls_indexes, image_tensor, seg_tensor)\n        image_tensor = image_tensor.flip(0)\n        seg_tensor = seg_tensor.flip(0)\n\n        # semantic labels\n        im_label = seg_tensor.cpu().numpy()\n        im_label = im_label[:, :, (2, 1, 0)] * 255\n        im_label = np.round(im_label).astype(np.uint8)\n        im_label = np.clip(im_label, 0, 255)\n        im_label, im_label_all = self.process_label_image(im_label)\n\n        # foreground mask\n        seg = torch.from_numpy((im_label != 0).astype(np.float32))\n        mask = seg.unsqueeze(0).repeat((3, 1, 1)).float().cuda()\n\n        # gt boxes\n        gt_boxes = np.zeros((self._num_classes, 5), dtype=np.float32)\n        count = 0\n        selected = []\n        for i in range(num):\n            cls = int(meta_data['cls_indexes'][i])\n            ind = np.where(classes == cls)[0]\n            if len(ind) > 0:\n                R = poses[:, :3, i]\n                T = poses[:, 3, i]\n\n                # compute box\n                x3d = np.ones((4, self._points_all.shape[1]), dtype=np.float32)\n                x3d[0, :] = self._points_all[ind,:,0]\n                x3d[1, :] = self._points_all[ind,:,1]\n                x3d[2, :] = self._points_all[ind,:,2]\n                RT = np.zeros((3, 4), dtype=np.float32)\n                RT[:3, :3] = R\n                RT[:, 3] = T\n                x2d = np.matmul(meta_data['intrinsic_matrix'], np.matmul(RT, x3d))\n                x2d[0, :] = np.divide(x2d[0, :], x2d[2, :])\n                x2d[1, :] = np.divide(x2d[1, :], x2d[2, :])\n\n                x1 = np.min(x2d[0, :])\n                y1 = np.min(x2d[1, :])\n                x2 = np.max(x2d[0, :])\n                y2 = np.max(x2d[1, :])\n                if x1 > width or y1 > height or x2 < 0 or y2 < 0:\n                    continue\n                gt_boxes[count, 0] = x1\n                gt_boxes[count, 1] = y1\n                gt_boxes[count, 2] = x2\n                gt_boxes[count, 3] = y2\n                selected.append(i)\n                count += 1\n\n        meta_data['cls_indexes'] = meta_data['cls_indexes'][selected]\n        meta_data['poses'] = poses[:, :, selected]\n        meta_data['im_label'] = im_label\n        meta_data['box'] = gt_boxes[:count, :4]\n        return meta_data\n\n\n    def evaluation(self, output_dir):\n\n        filename = os.path.join(output_dir, 'results_posecnn.mat')\n        if os.path.exists(filename):\n            results_all = scipy.io.loadmat(filename)\n            print('load results from file')\n            print(filename)\n            distances_sys = results_all['distances_sys']\n            distances_non = results_all['distances_non']\n            errors_rotation = results_all['errors_rotation']\n            errors_translation = results_all['errors_translation']\n            results_frame_id = results_all['results_frame_id'].flatten()\n            results_object_id = results_all['results_object_id'].flatten()\n            results_cls_id = results_all['results_cls_id'].flatten()\n            segmentation_precision = results_all['segmentation_precision']\n            segmentation_recall = results_all['segmentation_recall']\n            segmentation_f1 = results_all['segmentation_f1']\n            segmentation_count = results_all['segmentation_count']\n        else:\n            # save results\n            num_max = 100000\n            num_results = 2\n            distances_sys = np.zeros((num_max, num_results), dtype=np.float32)\n            distances_non = np.zeros((num_max, num_results), dtype=np.float32)\n            errors_rotation = np.zeros((num_max, num_results), dtype=np.float32)\n            errors_translation = np.zeros((num_max, num_results), dtype=np.float32)\n            results_frame_id = np.zeros((num_max, ), dtype=np.float32)\n            results_object_id = np.zeros((num_max, ), dtype=np.float32)\n            results_cls_id = np.zeros((num_max, ), dtype=np.float32)\n            segmentation_precision = np.zeros((num_max, self._num_classes), dtype=np.float32)\n            segmentation_recall = np.zeros((num_max, self._num_classes), dtype=np.float32)\n            segmentation_f1 = np.zeros((num_max, self._num_classes), dtype=np.float32)\n            segmentation_count = np.zeros((num_max, self._num_classes), dtype=np.float32)\n\n            # for each image\n            count = -1\n            count_file = -1\n            filename = os.path.join(output_dir, '*.mat')\n            files = glob.glob(filename)\n            for i in range(len(files)):\n\n                # load result\n                filename = files[i]\n                print(filename)\n                result_posecnn = scipy.io.loadmat(filename)\n\n                # load gt poses\n                filename = result_posecnn['meta_data_path'][0]\n                print(filename)\n                gt = scipy.io.loadmat(filename)\n\n                # render gt poses\n                gt = self.render_gt_pose(gt)\n\n                # compute segmentation metrics\n                metrics_dict = multilabel_metrics(result_posecnn['labels'].astype(np.int32), gt['im_label'].astype(np.int32), self._num_classes)\n                count_file += 1\n                segmentation_precision[count_file, :] = metrics_dict['Precision']\n                segmentation_recall[count_file, :] = metrics_dict['Recall']\n                segmentation_f1[count_file, :] = metrics_dict['F-measure']\n                segmentation_count[count_file, :] = metrics_dict['Count']\n\n                '''\n                import matplotlib.pyplot as plt\n                fig = plt.figure()\n                im_file = filename.replace('_meta.mat', '_color.png')\n                im = cv2.imread(im_file)\n                ax = fig.add_subplot(2, 2, 1)\n                plt.imshow(im[:, :, (2, 1, 0)])\n                for i in range(gt['box'].shape[0]):\n                    x1 = gt['box'][i, 0]\n                    y1 = gt['box'][i, 1]\n                    x2 = gt['box'][i, 2]\n                    y2 = gt['box'][i, 3]\n                    plt.gca().add_patch(plt.Rectangle((x1, y1), x2-x1, y2-y1, fill=False, edgecolor='g', linewidth=3))\n                ax = fig.add_subplot(2, 2, 2)\n                plt.imshow(gt['im_label'])\n                ax = fig.add_subplot(2, 2, 3)\n                plt.imshow(result_posecnn['labels'].astype(np.int32))\n                plt.show()\n                #'''\n\n                # for each gt poses\n                cls_indexes = gt['cls_indexes'].flatten()\n                for j in range(len(cls_indexes)):\n                    count += 1\n                    cls_index = cls_indexes[j]\n                    RT_gt = gt['poses'][:, :, j]\n\n                    results_frame_id[count] = i\n                    results_object_id[count] = j\n                    results_cls_id[count] = cls_index\n\n                    # network result\n                    result = result_posecnn\n                    roi_index = []\n                    if len(result['rois']) > 0:     \n                        for k in range(result['rois'].shape[0]):\n                            ind = int(result['rois'][k, 1])\n                            cls = cfg.TRAIN.CLASSES[ind]\n                            if cls == cls_index:\n                                roi_index.append(k)                   \n\n                    # select the roi\n                    if len(roi_index) > 1:\n                        # overlaps: (rois x gt_boxes)\n                        roi_blob = result['rois'][roi_index, :]\n                        roi_blob = roi_blob[:, (0, 2, 3, 4, 5, 1)]\n                        gt_box_blob = np.zeros((1, 5), dtype=np.float32)\n                        gt_box_blob[0, 1:] = gt['box'][j, :]\n                        overlaps = bbox_overlaps(\n                            np.ascontiguousarray(roi_blob[:, :5], dtype=np.float),\n                            np.ascontiguousarray(gt_box_blob, dtype=np.float)).flatten()\n                        assignment = overlaps.argmax()\n                        roi_index = [roi_index[assignment]]\n\n                    if len(roi_index) > 0:\n                        RT = np.zeros((3, 4), dtype=np.float32)\n                        ind = int(result['rois'][roi_index, 1])\n                        if ind == -1:\n                            points = self._points_clamp\n                        else:\n                            points = self._points[ind]\n\n                        # pose from network\n                        RT[:3, :3] = quat2mat(result['poses'][roi_index, :4].flatten())\n                        RT[:, 3] = result['poses'][roi_index, 4:]\n                        distances_sys[count, 0] = adi(RT[:3, :3], RT[:, 3],  RT_gt[:3, :3], RT_gt[:, 3], points)\n                        distances_non[count, 0] = add(RT[:3, :3], RT[:, 3],  RT_gt[:3, :3], RT_gt[:, 3], points)\n                        errors_rotation[count, 0] = re(RT[:3, :3], RT_gt[:3, :3])\n                        errors_translation[count, 0] = te(RT[:, 3], RT_gt[:, 3])\n\n                        # pose after depth refinement\n                        if cfg.TEST.POSE_REFINE:\n                            RT[:3, :3] = quat2mat(result['poses_refined'][roi_index, :4].flatten())\n                            RT[:, 3] = result['poses_refined'][roi_index, 4:]\n                            distances_sys[count, 1] = adi(RT[:3, :3], RT[:, 3],  RT_gt[:3, :3], RT_gt[:, 3], points)\n                            distances_non[count, 1] = add(RT[:3, :3], RT[:, 3],  RT_gt[:3, :3], RT_gt[:, 3], points)\n                            errors_rotation[count, 1] = re(RT[:3, :3], RT_gt[:3, :3])\n                            errors_translation[count, 1] = te(RT[:, 3], RT_gt[:, 3])\n                        else:\n                            distances_sys[count, 1] = np.inf\n                            distances_non[count, 1] = np.inf\n                            errors_rotation[count, 1] = np.inf\n                            errors_translation[count, 1] = np.inf\n                    else:\n                        distances_sys[count, :] = np.inf\n                        distances_non[count, :] = np.inf\n                        errors_rotation[count, :] = np.inf\n                        errors_translation[count, :] = np.inf\n\n            distances_sys = distances_sys[:count+1, :]\n            distances_non = distances_non[:count+1, :]\n            errors_rotation = errors_rotation[:count+1, :]\n            errors_translation = errors_translation[:count+1, :]\n            results_frame_id = results_frame_id[:count+1]\n            results_object_id = results_object_id[:count+1]\n            results_cls_id = results_cls_id[:count+1]\n            segmentation_precision = segmentation_precision[:count_file+1, :]\n            segmentation_recall = segmentation_recall[:count_file+1, :]\n            segmentation_f1 = segmentation_f1[:count_file+1, :]\n            segmentation_count = segmentation_count[:count_file+1, :]\n\n            results_all = {'distances_sys': distances_sys,\n                       'distances_non': distances_non,\n                       'errors_rotation': errors_rotation,\n                       'errors_translation': errors_translation,\n                       'results_frame_id': results_frame_id,\n                       'results_object_id': results_object_id,\n                       'results_cls_id': results_cls_id,\n                       'segmentation_precision': segmentation_precision, \n                       'segmentation_recall': segmentation_recall,\n                       'segmentation_f1': segmentation_f1,\n                       'segmentation_count': segmentation_count}\n\n            filename = os.path.join(output_dir, 'results_posecnn.mat')\n            scipy.io.savemat(filename, results_all)\n\n        # for each class\n        import matplotlib.pyplot as plt\n        max_distance = 0.1\n        index_plot = [0, 1]\n        color = ['r', 'b']\n        leng = ['PoseCNN', 'refined']\n        num = len(leng)\n        ADD = np.zeros((self._num_classes_all, num), dtype=np.float32)\n        ADDS = np.zeros((self._num_classes_all, num), dtype=np.float32)\n        TS = np.zeros((self._num_classes_all, num), dtype=np.float32)\n        classes = list(copy.copy(self._classes_all))\n        classes[0] = 'all'\n        for k in range(self._num_classes_all):\n            fig = plt.figure()\n            if k == 0:\n                index = range(len(results_cls_id))\n            else:\n                index = np.where(results_cls_id == k)[0]\n\n            if len(index) == 0:\n                continue\n            print('%s: %d objects' % (classes[k], len(index)))\n\n            # distance symmetry\n            ax = fig.add_subplot(2, 3, 1)\n            lengs = []\n            for i in index_plot:\n                D = distances_sys[index, i]\n                ind = np.where(D > max_distance)[0]\n                D[ind] = np.inf\n                d = np.sort(D)\n                n = len(d)\n                accuracy = np.cumsum(np.ones((n, ), np.float32)) / n\n                plt.plot(d, accuracy, color[i], linewidth=2)\n                ADDS[k, i] = VOCap(d, accuracy)\n                lengs.append('%s (%.2f)' % (leng[i], ADDS[k, i] * 100))\n                print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D))))\n\n            ax.legend(lengs)\n            plt.xlabel('Average distance threshold in meter (symmetry)')\n            plt.ylabel('accuracy')\n            ax.set_title(classes[k])\n\n            # distance non-symmetry\n            ax = fig.add_subplot(2, 3, 2)\n            lengs = []\n            for i in index_plot:\n                D = distances_non[index, i]\n                ind = np.where(D > max_distance)[0]\n                D[ind] = np.inf\n                d = np.sort(D)\n                n = len(d)\n                accuracy = np.cumsum(np.ones((n, ), np.float32)) / n\n                plt.plot(d, accuracy, color[i], linewidth=2)\n                ADD[k, i] = VOCap(d, accuracy)\n                lengs.append('%s (%.2f)' % (leng[i], ADD[k, i] * 100))\n                print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D))))\n\n            ax.legend(lengs)\n            plt.xlabel('Average distance threshold in meter (non-symmetry)')\n            plt.ylabel('accuracy')\n            ax.set_title(classes[k])\n\n            # translation\n            ax = fig.add_subplot(2, 3, 3)\n            lengs = []\n            for i in index_plot:\n                D = errors_translation[index, i]\n                ind = np.where(D > max_distance)[0]\n                D[ind] = np.inf\n                d = np.sort(D)\n                n = len(d)\n                accuracy = np.cumsum(np.ones((n, ), np.float32)) / n\n                plt.plot(d, accuracy, color[i], linewidth=2)\n                TS[k, i] = VOCap(d, accuracy)\n                lengs.append('%s (%.2f)' % (leng[i], TS[k, i] * 100))\n                print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D))))\n\n            ax.legend(lengs)\n            plt.xlabel('Translation threshold in meter')\n            plt.ylabel('accuracy')\n            ax.set_title(classes[k])\n\n            # rotation histogram\n            count = 4\n            for i in index_plot:\n                ax = fig.add_subplot(2, 3, count)\n                D = errors_rotation[index, i]\n                ind = np.where(np.isfinite(D))[0]\n                D = D[ind]\n                ax.hist(D, bins=range(0, 190, 10), range=(0, 180))\n                plt.xlabel('Rotation angle error')\n                plt.ylabel('count')\n                ax.set_title(leng[i])\n                count += 1\n\n            # mng = plt.get_current_fig_manager()\n            # mng.full_screen_toggle()\n            filename = output_dir + '/' + classes[k] + '.png'\n            plt.savefig(filename)\n            # plt.show()\n\n        # print ADD\n        print('==================ADD======================')\n        for k in range(len(classes)):\n            print('%s: %f' % (classes[k], ADD[k, 0]))\n        for k in range(len(classes)-1):\n            print('%f' % (ADD[k+1, 0]))\n        print('%f' % (ADD[0, 0]))\n        print(cfg.TRAIN.SNAPSHOT_INFIX)\n        print('===========================================')\n\n        # print ADD-S\n        print('==================ADD-S====================')\n        for k in range(len(classes)):\n            print('%s: %f' % (classes[k], ADDS[k, 0]))\n        for k in range(len(classes)-1):\n            print('%f' % (ADDS[k+1, 0]))\n        print('%f' % (ADDS[0, 0]))\n        print(cfg.TRAIN.SNAPSHOT_INFIX)\n        print('===========================================')\n\n        # print ADD\n        print('==================ADD refined======================')\n        for k in range(len(classes)):\n            print('%s: %f' % (classes[k], ADD[k, 1]))\n        for k in range(len(classes)-1):\n            print('%f' % (ADD[k+1, 1]))\n        print('%f' % (ADD[0, 1]))\n        print(cfg.TRAIN.SNAPSHOT_INFIX)\n        print('===========================================')\n\n        # print ADD-S\n        print('==================ADD-S refined====================')\n        for k in range(len(classes)):\n            print('%s: %f' % (classes[k], ADDS[k, 1]))\n        for k in range(len(classes)-1):\n            print('%f' % (ADDS[k+1, 1]))\n        print('%f' % (ADDS[0, 1]))\n        print(cfg.TRAIN.SNAPSHOT_INFIX)\n        print('===========================================')\n\n        # print segmentation precision\n        print('==================segmentation precision====================')\n        for i in range(self._num_classes):\n            count = np.sum(segmentation_count[:, i])\n            if count > 0:\n                precision = np.sum(segmentation_precision[:, i]) / count\n            else:\n                precision = 0\n            print('%s: %d objects, %f' % (self._classes[i], count, precision))\n        for i in range(self._num_classes):\n            count = np.sum(segmentation_count[:, i])\n            if count > 0:\n                precision = np.sum(segmentation_precision[:, i]) / count\n            else:\n                precision = 0\n            print('%f' % (precision))\n        print('===========================================')\n\n        # print segmentation recall\n        print('==================segmentation recall====================')\n        for i in range(self._num_classes):\n            count = np.sum(segmentation_count[:, i])\n            if count > 0:\n                recall = np.sum(segmentation_recall[:, i]) / count\n            else:\n                recall = 0\n            print('%s: %d objects, %f' % (self._classes[i], count, recall))\n        for i in range(self._num_classes):\n            count = np.sum(segmentation_count[:, i])\n            if count > 0:\n                recall = np.sum(segmentation_recall[:, i]) / count\n            else:\n                recall = 0\n            print('%f' % (recall))\n        print('===========================================')\n\n        # print segmentation f1\n        print('==================segmentation f1====================')\n        for i in range(self._num_classes):\n            count = np.sum(segmentation_count[:, i])\n            if count > 0:\n                f1 = np.sum(segmentation_f1[:, i]) / count\n            else:\n                f1 = 0\n            print('%s: %d objects, %f' % (self._classes[i], count, f1))\n        for i in range(self._num_classes):\n            count = np.sum(segmentation_count[:, i])\n            if count > 0:\n                f1 = np.sum(segmentation_f1[:, i]) / count\n            else:\n                f1 = 0\n            print('%f' % (f1))\n        print('===========================================')\n"
  },
  {
    "path": "lib/datasets/ycb_video.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport torch\nimport torch.utils.data as data\n\nimport os, math\nimport sys\nimport os.path as osp\nfrom os.path import *\nimport numpy as np\nimport numpy.random as npr\nimport cv2\nimport scipy.io\nimport copy\nimport glob\ntry:\n    import cPickle  # Use cPickle on Python 2.7\nexcept ImportError:\n    import pickle as cPickle\n\nimport datasets\nfrom fcn.config import cfg\nfrom utils.blob import pad_im, chromatic_transform, add_noise, add_noise_cuda\nfrom transforms3d.quaternions import mat2quat, quat2mat\nfrom utils.se3 import *\nfrom utils.pose_error import *\nfrom utils.cython_bbox import bbox_overlaps\n\n\nclass YCBVideo(data.Dataset, datasets.imdb):\n    def __init__(self, image_set, ycb_video_path = None):\n\n        self._name = 'ycb_video_' + image_set\n        self._image_set = image_set\n        self._ycb_video_path = self._get_default_path() if ycb_video_path is None \\\n                            else ycb_video_path\n\n        path = os.path.join(self._ycb_video_path, 'data')\n        if not os.path.exists(path):\n            path = os.path.join(self._ycb_video_path, 'YCB_Video_Dataset/YCB_Video_Dataset/YCB_Video_Dataset/data')\n        self._data_path = path\n\n        self._model_path = os.path.join(datasets.ROOT_DIR, 'data', 'models')\n\n        # define all the classes\n        self._classes_all = ('__background__', '002_master_chef_can', '003_cracker_box', '004_sugar_box', '005_tomato_soup_can', '006_mustard_bottle', \\\n                         '007_tuna_fish_can', '008_pudding_box', '009_gelatin_box', '010_potted_meat_can', '011_banana', '019_pitcher_base', \\\n                         '021_bleach_cleanser', '024_bowl', '025_mug', '035_power_drill', '036_wood_block', '037_scissors', '040_large_marker', \\\n                         '051_large_clamp', '052_extra_large_clamp', '061_foam_brick')\n        self._num_classes_all = len(self._classes_all)\n        self._class_colors_all = [(255, 255, 255), (255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 0, 255), (0, 255, 255), \\\n                              (128, 0, 0), (0, 128, 0), (0, 0, 128), (128, 128, 0), (128, 0, 128), (0, 128, 128), \\\n                              (64, 0, 0), (0, 64, 0), (0, 0, 64), (64, 64, 0), (64, 0, 64), (0, 64, 64), \n                              (192, 0, 0), (0, 192, 0), (0, 0, 192)]\n        self._symmetry_all = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]).astype(np.float32)\n        self._extents_all = self._load_object_extents()\n\n        self._width = 640\n        self._height = 480\n        self._intrinsic_matrix = np.array([[1.066778e+03, 0.000000e+00, 3.129869e+02],\n                                          [0.000000e+00, 1.067487e+03, 2.413109e+02],\n                                          [0.000000e+00, 0.000000e+00, 1.000000e+00]])\n\n        # select a subset of classes\n        self._classes = [self._classes_all[i] for i in cfg.TRAIN.CLASSES]\n        self._classes_test = [self._classes_all[i] for i in cfg.TEST.CLASSES]\n        self._num_classes = len(self._classes)\n        self._class_colors = [self._class_colors_all[i] for i in cfg.TRAIN.CLASSES]\n        self._symmetry = self._symmetry_all[cfg.TRAIN.CLASSES]\n        self._symmetry_test = self._symmetry_all[cfg.TEST.CLASSES]\n        self._extents = self._extents_all[cfg.TRAIN.CLASSES]\n        self._extents_test = self._extents_all[cfg.TEST.CLASSES]\n        self._pixel_mean = cfg.PIXEL_MEANS / 255.0\n\n        # train classes\n        self._points, self._points_all, self._point_blob = \\\n            self._load_object_points(self._classes, self._extents, self._symmetry)\n\n        # test classes\n        self._points_test, self._points_all_test, self._point_blob_test = \\\n            self._load_object_points(self._classes_test, self._extents_test, self._symmetry_test)\n\n        # 3D model paths\n        self.model_mesh_paths = ['{}/{}/textured_simple.obj'.format(self._model_path, cls) for cls in self._classes_all[1:]]\n        self.model_sdf_paths = ['{}/{}/textured_simple_low_res.pth'.format(self._model_path, cls) for cls in self._classes_all[1:]]\n        self.model_texture_paths = ['{}/{}/texture_map.png'.format(self._model_path, cls) for cls in self._classes_all[1:]]\n        self.model_colors = [np.array(self._class_colors_all[i]) / 255.0 for i in range(1, len(self._classes_all))]\n\n        self.model_mesh_paths_target = ['{}/{}/textured_simple.obj'.format(self._model_path, cls) for cls in self._classes[1:]]\n        self.model_sdf_paths_target = ['{}/{}/textured_simple.sdf'.format(self._model_path, cls) for cls in self._classes[1:]]\n        self.model_texture_paths_target = ['{}/{}/texture_map.png'.format(self._model_path, cls) for cls in self._classes[1:]]\n        self.model_colors_target = [np.array(self._class_colors_all[i]) / 255.0 for i in cfg.TRAIN.CLASSES[1:]]\n\n        self._class_to_ind = dict(zip(self._classes, range(self._num_classes)))\n        self._image_index = self._load_image_set_index(image_set)\n\n        self._size = len(self._image_index)\n        if self._size > cfg.TRAIN.MAX_ITERS_PER_EPOCH * cfg.TRAIN.IMS_PER_BATCH:\n            self._size = cfg.TRAIN.MAX_ITERS_PER_EPOCH * cfg.TRAIN.IMS_PER_BATCH\n        self._roidb = self.gt_roidb()\n\n        assert os.path.exists(self._ycb_video_path), \\\n                'ycb_video path does not exist: {}'.format(self._ycb_video_path)\n        assert os.path.exists(self._data_path), \\\n                'Data path does not exist: {}'.format(self._data_path)\n\n\n    def __getitem__(self, index):\n\n        is_syn = 0\n        roidb = self._roidb[index]\n\n        # Get the input image blob\n        random_scale_ind = npr.randint(0, high=len(cfg.TRAIN.SCALES_BASE))\n        im_blob, im_depth, im_scale, height, width = self._get_image_blob(roidb, random_scale_ind)\n\n        # build the label blob\n        label_blob, mask, meta_data_blob, pose_blob, gt_boxes, vertex_targets, vertex_weights \\\n            = self._get_label_blob(roidb, self._num_classes, im_scale, height, width)\n\n        is_syn = roidb['is_syn']\n        im_info = np.array([im_blob.shape[1], im_blob.shape[2], im_scale, is_syn], dtype=np.float32)\n\n        sample = {'image_color': im_blob,\n                  'im_depth': im_depth,\n                  'label': label_blob,\n                  'mask': mask,\n                  'meta_data': meta_data_blob,\n                  'poses': pose_blob,\n                  'extents': self._extents,\n                  'points': self._point_blob,\n                  'symmetry': self._symmetry,\n                  'gt_boxes': gt_boxes,\n                  'im_info': im_info,\n                  'video_id': roidb['video_id'],\n                  'image_id': roidb['image_id']}\n\n        if cfg.TRAIN.VERTEX_REG:\n            sample['vertex_targets'] = vertex_targets\n            sample['vertex_weights'] = vertex_weights\n\n        return sample\n\n\n    def _get_image_blob(self, roidb, scale_ind):    \n\n        # rgba\n        rgba = pad_im(cv2.imread(roidb['image'], cv2.IMREAD_UNCHANGED), 16)\n        if rgba.shape[2] == 4:\n            im = np.copy(rgba[:,:,:3])\n            alpha = rgba[:,:,3]\n            I = np.where(alpha == 0)\n            im[I[0], I[1], :] = 0\n        else:\n            im = rgba\n\n        im_scale = cfg.TRAIN.SCALES_BASE[scale_ind]\n        if im_scale != 1.0:\n            im = cv2.resize(im, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_LINEAR)\n        height = im.shape[0]\n        width = im.shape[1]\n\n        if roidb['flipped']:\n            im = im[:, ::-1, :]\n\n        # chromatic transform\n        if cfg.TRAIN.CHROMATIC and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1:\n            im = chromatic_transform(im)\n        if cfg.TRAIN.ADD_NOISE and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1:\n            im = add_noise(im)\n        im_tensor = torch.from_numpy(im) / 255.0\n        im_tensor -= self._pixel_mean\n        image_blob = im_tensor.permute(2, 0, 1).float()\n\n        # depth image\n        im_depth = pad_im(cv2.imread(roidb['depth'], cv2.IMREAD_UNCHANGED), 16)\n        if im_scale != 1.0:\n            im_depth = cv2.resize(im_depth, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_NEAREST)\n        im_depth = im_depth.astype('float') / 10000.0\n\n        return image_blob, im_depth, im_scale, height, width\n\n\n    def _get_label_blob(self, roidb, num_classes, im_scale, height, width):\n        \"\"\" build the label blob \"\"\"\n\n        meta_data = scipy.io.loadmat(roidb['meta_data'])\n        meta_data['cls_indexes'] = meta_data['cls_indexes'].flatten()\n        classes = np.array(cfg.TRAIN.CLASSES)\n\n        # read label image\n        im_label = pad_im(cv2.imread(roidb['label'], cv2.IMREAD_UNCHANGED), 16)\n        if roidb['flipped']:\n            if len(im_label.shape) == 2:\n                im_label = im_label[:, ::-1]\n            else:\n                im_label = im_label[:, ::-1, :]\n        if im_scale != 1.0:\n            im_label = cv2.resize(im_label, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_NEAREST)\n\n        label_blob = np.zeros((num_classes, height, width), dtype=np.float32)\n        label_blob[0, :, :] = 1.0\n        for i in range(1, num_classes):\n            I = np.where(im_label == classes[i])\n            if len(I[0]) > 0:\n                label_blob[i, I[0], I[1]] = 1.0\n                label_blob[0, I[0], I[1]] = 0.0\n\n        # foreground mask\n        seg = torch.from_numpy((im_label != 0).astype(np.float32))\n        mask = seg.unsqueeze(0).repeat((3, 1, 1)).float()\n\n        # poses\n        poses = meta_data['poses']\n        if len(poses.shape) == 2:\n            poses = np.reshape(poses, (3, 4, 1))\n        if roidb['flipped']:\n            poses = _flip_poses(poses, meta_data['intrinsic_matrix'], width)\n\n        num = poses.shape[2]\n        pose_blob = np.zeros((num_classes, 9), dtype=np.float32)\n        gt_boxes = np.zeros((num_classes, 5), dtype=np.float32)\n        count = 0\n        for i in range(num):\n            cls = int(meta_data['cls_indexes'][i])\n            ind = np.where(classes == cls)[0]\n            if len(ind) > 0:\n                R = poses[:, :3, i]\n                T = poses[:, 3, i]\n                pose_blob[count, 0] = 1\n                pose_blob[count, 1] = ind\n                qt = mat2quat(R)\n\n                # egocentric to allocentric\n                qt_allocentric = egocentric2allocentric(qt, T)\n                if qt_allocentric[0] < 0:\n                   qt_allocentric = -1 * qt_allocentric\n                pose_blob[count, 2:6] = qt_allocentric\n                pose_blob[count, 6:] = T\n\n                # compute box\n                x3d = np.ones((4, self._points_all.shape[1]), dtype=np.float32)\n                x3d[0, :] = self._points_all[ind,:,0]\n                x3d[1, :] = self._points_all[ind,:,1]\n                x3d[2, :] = self._points_all[ind,:,2]\n                RT = np.zeros((3, 4), dtype=np.float32)\n                RT[:3, :3] = quat2mat(qt)\n                RT[:, 3] = T\n                x2d = np.matmul(meta_data['intrinsic_matrix'], np.matmul(RT, x3d))\n                x2d[0, :] = np.divide(x2d[0, :], x2d[2, :])\n                x2d[1, :] = np.divide(x2d[1, :], x2d[2, :])\n        \n                gt_boxes[count, 0] = np.min(x2d[0, :]) * im_scale\n                gt_boxes[count, 1] = np.min(x2d[1, :]) * im_scale\n                gt_boxes[count, 2] = np.max(x2d[0, :]) * im_scale\n                gt_boxes[count, 3] = np.max(x2d[1, :]) * im_scale\n                gt_boxes[count, 4] = ind\n                count += 1\n\n        # construct the meta data\n        \"\"\"\n        format of the meta_data\n        intrinsic matrix: meta_data[0 ~ 8]\n        inverse intrinsic matrix: meta_data[9 ~ 17]\n        \"\"\"\n        K = np.matrix(meta_data['intrinsic_matrix']) * im_scale\n        K[2, 2] = 1\n        Kinv = np.linalg.pinv(K)\n        meta_data_blob = np.zeros(18, dtype=np.float32)\n        meta_data_blob[0:9] = K.flatten()\n        meta_data_blob[9:18] = Kinv.flatten()\n\n        # vertex regression target\n        if cfg.TRAIN.VERTEX_REG:\n            center = meta_data['center']\n            if roidb['flipped']:\n                center[:, 0] = width - center[:, 0]\n            vertex_targets, vertex_weights = self._generate_vertex_targets(im_label,\n                meta_data['cls_indexes'], center, poses, classes, num_classes)\n        else:\n            vertex_targets = []\n            vertex_weights = []\n\n        return label_blob, mask, meta_data_blob, pose_blob, gt_boxes, vertex_targets, vertex_weights\n\n\n    # compute the voting label image in 2D\n    def _generate_vertex_targets(self, im_label, cls_indexes, center, poses, classes, num_classes):\n\n        width = im_label.shape[1]\n        height = im_label.shape[0]\n        vertex_targets = np.zeros((3 * num_classes, height, width), dtype=np.float32)\n        vertex_weights = np.zeros((3 * num_classes, height, width), dtype=np.float32)\n\n        c = np.zeros((2, 1), dtype=np.float32)\n        for i in range(1, num_classes):\n            y, x = np.where(im_label == classes[i])\n            I = np.where(im_label == classes[i])\n            ind = np.where(cls_indexes == classes[i])[0]\n            if len(x) > 0 and len(ind) > 0:\n                c[0] = center[ind, 0]\n                c[1] = center[ind, 1]\n                if isinstance(poses, list):\n                    z = poses[int(ind)][2]\n                else:\n                    if len(poses.shape) == 3:\n                        z = poses[2, 3, ind]\n                    else:\n                        z = poses[ind, -1]\n                R = np.tile(c, (1, len(x))) - np.vstack((x, y))\n                # compute the norm\n                N = np.linalg.norm(R, axis=0) + 1e-10\n                # normalization\n                R = np.divide(R, np.tile(N, (2,1)))\n                # assignment\n                vertex_targets[3*i+0, y, x] = R[0,:]\n                vertex_targets[3*i+1, y, x] = R[1,:]\n                vertex_targets[3*i+2, y, x] = math.log(z)\n\n                vertex_weights[3*i+0, y, x] = cfg.TRAIN.VERTEX_W_INSIDE\n                vertex_weights[3*i+1, y, x] = cfg.TRAIN.VERTEX_W_INSIDE\n                vertex_weights[3*i+2, y, x] = cfg.TRAIN.VERTEX_W_INSIDE\n\n        return vertex_targets, vertex_weights\n\n\n    def __len__(self):\n        return self._size\n\n\n    def _get_default_path(self):\n        \"\"\"\n        Return the default path where YCB_Video is expected to be installed.\n        \"\"\"\n        return os.path.join(datasets.ROOT_DIR, 'data', 'YCB_Video')\n\n\n    def _load_image_set_index(self, image_set):\n        \"\"\"\n        Load the indexes listed in this dataset's image set file.\n        \"\"\"\n        image_set_file = os.path.join(self._ycb_video_path, image_set + '.txt')\n        assert os.path.exists(image_set_file), \\\n                'Path does not exist: {}'.format(image_set_file)\n\n        image_index = []\n        video_ids_selected = set([])\n        video_ids_not = set([])\n        count = np.zeros((self.num_classes, ), dtype=np.int32)\n\n        with open(image_set_file) as f:\n            for x in f.readlines():\n                index = x.rstrip('\\n')\n                pos = index.find('/')\n                video_id = index[:pos]\n\n                if not video_id in video_ids_selected and not video_id in video_ids_not:\n                    filename = os.path.join(self._data_path, video_id, '000001-meta.mat')\n                    meta_data = scipy.io.loadmat(filename)\n                    cls_indexes = meta_data['cls_indexes'].flatten()\n                    flag = 0\n                    for i in range(len(cls_indexes)):\n                        cls_index = int(cls_indexes[i])\n                        ind = np.where(np.array(cfg.TRAIN.CLASSES) == cls_index)[0]\n                        if len(ind) > 0:\n                            count[ind] += 1\n                            flag = 1\n                    if flag:\n                        video_ids_selected.add(video_id)\n                    else:\n                        video_ids_not.add(video_id)\n\n                if video_id in video_ids_selected:\n                    image_index.append(index)\n\n        for i in range(1, self.num_classes):\n            print('%d %s [%d/%d]' % (i, self.classes[i], count[i], len(list(video_ids_selected))))\n\n        # sample a subset for training\n        if image_set == 'train':\n            image_index = image_index[::5]\n\n            # add synthetic data\n            filename = os.path.join(self._data_path + '_syn', '*.mat')\n            files = glob.glob(filename)\n            print('adding synthetic %d data' % (len(files)))\n            for i in range(len(files)):\n                filename = files[i].replace(self._data_path, '../data')[:-9]\n                image_index.append(filename)\n\n        return image_index\n\n\n    def _load_object_points(self, classes, extents, symmetry):\n\n        points = [[] for _ in range(len(classes))]\n        num = np.inf\n        num_classes = len(classes)\n        for i in range(1, num_classes):\n            point_file = os.path.join(self._model_path, classes[i], 'points.xyz')\n            print(point_file)\n            assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file)\n            points[i] = np.loadtxt(point_file)\n            if points[i].shape[0] < num:\n                num = points[i].shape[0]\n\n        points_all = np.zeros((num_classes, num, 3), dtype=np.float32)\n        for i in range(1, num_classes):\n            points_all[i, :, :] = points[i][:num, :]\n\n        # rescale the points\n        point_blob = points_all.copy()\n        for i in range(1, num_classes):\n            # compute the rescaling factor for the points\n            weight = 10.0 / np.amax(extents[i, :])\n            if weight < 10:\n                weight = 10\n            if symmetry[i] > 0:\n                point_blob[i, :, :] = 4 * weight * point_blob[i, :, :]\n            else:\n                point_blob[i, :, :] = weight * point_blob[i, :, :]\n\n        return points, points_all, point_blob\n\n\n    def _load_object_extents(self):\n\n        extents = np.zeros((self._num_classes_all, 3), dtype=np.float32)\n        for i in range(1, self._num_classes_all):\n            point_file = os.path.join(self._model_path, self._classes_all[i], 'points.xyz')\n            print(point_file)\n            assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file)\n            points = np.loadtxt(point_file)\n            extents[i, :] = 2 * np.max(np.absolute(points), axis=0)\n\n        return extents\n\n\n    # image\n    def image_path_at(self, i):\n        \"\"\"\n        Return the absolute path to image i in the image sequence.\n        \"\"\"\n        return self.image_path_from_index(self.image_index[i])\n\n    def image_path_from_index(self, index):\n        \"\"\"\n        Construct an image path from the image's \"index\" identifier.\n        \"\"\"\n\n        image_path = os.path.join(self._data_path, index + '-color.jpg')\n        if not os.path.exists(image_path):\n            image_path = os.path.join(self._data_path, index + '-color.png')\n\n        assert os.path.exists(image_path), \\\n                'Path does not exist: {}'.format(image_path)\n        return image_path\n\n    # depth\n    def depth_path_at(self, i):\n        \"\"\"\n        Return the absolute path to depth i in the image sequence.\n        \"\"\"\n        return self.depth_path_from_index(self.image_index[i])\n\n    def depth_path_from_index(self, index):\n        \"\"\"\n        Construct an depth path from the image's \"index\" identifier.\n        \"\"\"\n        depth_path = os.path.join(self._data_path, index + '-depth.png')\n        assert os.path.exists(depth_path), \\\n                'Path does not exist: {}'.format(depth_path)\n        return depth_path\n\n    # label\n    def label_path_at(self, i):\n        \"\"\"\n        Return the absolute path to metadata i in the image sequence.\n        \"\"\"\n        return self.label_path_from_index(self.image_index[i])\n\n    def label_path_from_index(self, index):\n        \"\"\"\n        Construct an metadata path from the image's \"index\" identifier.\n        \"\"\"\n        label_path = os.path.join(self._data_path, index + '-label.png')\n        assert os.path.exists(label_path), \\\n                'Path does not exist: {}'.format(label_path)\n        return label_path\n\n    # camera pose\n    def metadata_path_at(self, i):\n        \"\"\"\n        Return the absolute path to metadata i in the image sequence.\n        \"\"\"\n        return self.metadata_path_from_index(self.image_index[i])\n\n    def metadata_path_from_index(self, index):\n        \"\"\"\n        Construct an metadata path from the image's \"index\" identifier.\n        \"\"\"\n        metadata_path = os.path.join(self._data_path, index + '-meta.mat')\n        assert os.path.exists(metadata_path), \\\n                'Path does not exist: {}'.format(metadata_path)\n        return metadata_path\n\n    def gt_roidb(self):\n        \"\"\"\n        Return the database of ground-truth regions of interest.\n\n        This function loads/saves from/to a cache file to speed up future calls.\n        \"\"\"\n\n        prefix = '_class'\n        for i in range(len(cfg.TRAIN.CLASSES)):\n            prefix += '_%d' % cfg.TRAIN.CLASSES[i]\n        cache_file = os.path.join(self.cache_path, self.name + prefix + '_gt_roidb.pkl')\n        if os.path.exists(cache_file):\n            with open(cache_file, 'rb') as fid:\n                roidb = cPickle.load(fid)\n            print('{} gt roidb loaded from {}'.format(self.name, cache_file))\n            return roidb\n\n        print('loading gt...')\n        gt_roidb = [self._load_ycb_video_annotation(index)\n                    for index in self._image_index]\n\n        with open(cache_file, 'wb') as fid:\n            cPickle.dump(gt_roidb, fid, cPickle.HIGHEST_PROTOCOL)\n        print('wrote gt roidb to {}'.format(cache_file))\n\n        return gt_roidb\n\n\n    def _load_ycb_video_annotation(self, index):\n        \"\"\"\n        Load class name and meta data\n        \"\"\"\n        # image path\n        image_path = self.image_path_from_index(index)\n\n        # depth path\n        depth_path = self.depth_path_from_index(index)\n\n        # label path\n        label_path = self.label_path_from_index(index)\n\n        # metadata path\n        metadata_path = self.metadata_path_from_index(index)\n\n        # is synthetic image or not\n        if 'data_syn' in image_path:\n            is_syn = 1\n            video_id = ''\n            image_id = ''\n        else:\n            is_syn = 0\n            # parse image name\n            pos = index.find('/')\n            video_id = index[:pos]\n            image_id = index[pos+1:]\n        \n        return {'image': image_path,\n                'depth': depth_path,\n                'label': label_path,\n                'meta_data': metadata_path,\n                'video_id': video_id,\n                'image_id': image_id,\n                'is_syn': is_syn,\n                'flipped': False}\n\n\n    def labels_to_image(self, labels):\n\n        height = labels.shape[0]\n        width = labels.shape[1]\n        im_label = np.zeros((height, width, 3), dtype=np.uint8)\n        for i in range(self.num_classes):\n            I = np.where(labels == i)\n            im_label[I[0], I[1], :] = self._class_colors[i]\n\n        return im_label\n\n\n    def process_label_image(self, label_image):\n        \"\"\"\n        change label image to label index\n        \"\"\"\n        height = label_image.shape[0]\n        width = label_image.shape[1]\n        labels = np.zeros((height, width), dtype=np.int32)\n        labels_all = np.zeros((height, width), dtype=np.int32)\n\n        # label image is in BGR order\n        index = label_image[:,:,2] + 256*label_image[:,:,1] + 256*256*label_image[:,:,0]\n        for i in range(1, len(self._class_colors_all)):\n            color = self._class_colors_all[i]\n            ind = color[0] + 256*color[1] + 256*256*color[2]\n            I = np.where(index == ind)\n            labels_all[I[0], I[1]] = i\n\n            ind = np.where(np.array(cfg.TRAIN.CLASSES) == i)[0]\n            if len(ind) > 0:\n                labels[I[0], I[1]] = ind\n\n        return labels, labels_all\n\n\n    def evaluation(self, output_dir):\n\n        filename = os.path.join(output_dir, 'results_posecnn.mat')\n        if os.path.exists(filename):\n            results_all = scipy.io.loadmat(filename)\n            print('load results from file')\n            print(filename)\n            distances_sys = results_all['distances_sys']\n            distances_non = results_all['distances_non']\n            errors_rotation = results_all['errors_rotation']\n            errors_translation = results_all['errors_translation']\n            results_seq_id = results_all['results_seq_id'].flatten()\n            results_frame_id = results_all['results_frame_id'].flatten()\n            results_object_id = results_all['results_object_id'].flatten()\n            results_cls_id = results_all['results_cls_id'].flatten()\n        else:\n            # save results\n            num_max = 100000\n            num_results = 2\n            distances_sys = np.zeros((num_max, num_results), dtype=np.float32)\n            distances_non = np.zeros((num_max, num_results), dtype=np.float32)\n            errors_rotation = np.zeros((num_max, num_results), dtype=np.float32)\n            errors_translation = np.zeros((num_max, num_results), dtype=np.float32)\n            results_seq_id = np.zeros((num_max, ), dtype=np.float32)\n            results_frame_id = np.zeros((num_max, ), dtype=np.float32)\n            results_object_id = np.zeros((num_max, ), dtype=np.float32)\n            results_cls_id = np.zeros((num_max, ), dtype=np.float32)\n\n            # for each image\n            count = -1\n            for i in range(len(self._roidb)):\n    \n                # parse keyframe name\n                seq_id = int(self._roidb[i]['video_id'])\n                frame_id = int(self._roidb[i]['image_id'])\n\n                # load result\n                filename = os.path.join(output_dir, '%04d_%06d.mat' % (seq_id, frame_id))\n                print(filename)\n                result_posecnn = scipy.io.loadmat(filename)\n\n                # load gt poses\n                filename = osp.join(self._data_path, '%04d/%06d-meta.mat' % (seq_id, frame_id))\n                print(filename)\n                gt = scipy.io.loadmat(filename)\n\n                # for each gt poses\n                cls_indexes = gt['cls_indexes'].flatten()\n                for j in range(len(cls_indexes)):\n                    count += 1\n                    cls_index = cls_indexes[j]\n                    RT_gt = gt['poses'][:, :, j]\n\n                    results_seq_id[count] = seq_id\n                    results_frame_id[count] = frame_id\n                    results_object_id[count] = j\n                    results_cls_id[count] = cls_index\n\n                    # network result\n                    result = result_posecnn\n                    roi_index = []\n                    if len(result['rois']) > 0:     \n                        for k in range(result['rois'].shape[0]):\n                            ind = int(result['rois'][k, 1])\n                            if ind == -1:\n                                cls = 19\n                            else:\n                                cls = cfg.TRAIN.CLASSES[ind]\n                            if cls == cls_index:\n                                roi_index.append(k)                   \n\n                    # select the roi\n                    if len(roi_index) > 1:\n                        # overlaps: (rois x gt_boxes)\n                        roi_blob = result['rois'][roi_index, :]\n                        roi_blob = roi_blob[:, (0, 2, 3, 4, 5, 1)]\n                        gt_box_blob = np.zeros((1, 5), dtype=np.float32)\n                        gt_box_blob[0, 1:] = gt['box'][j, :]\n                        overlaps = bbox_overlaps(\n                            np.ascontiguousarray(roi_blob[:, :5], dtype=np.float),\n                            np.ascontiguousarray(gt_box_blob, dtype=np.float)).flatten()\n                        assignment = overlaps.argmax()\n                        roi_index = [roi_index[assignment]]\n\n                    if len(roi_index) > 0:\n                        RT = np.zeros((3, 4), dtype=np.float32)\n                        ind = int(result['rois'][roi_index, 1])\n                        points = self._points[ind]\n\n                        # pose from network\n                        RT[:3, :3] = quat2mat(result['poses'][roi_index, :4].flatten())\n                        RT[:, 3] = result['poses'][roi_index, 4:]\n                        distances_sys[count, 0] = adi(RT[:3, :3], RT[:, 3],  RT_gt[:3, :3], RT_gt[:, 3], points)\n                        distances_non[count, 0] = add(RT[:3, :3], RT[:, 3],  RT_gt[:3, :3], RT_gt[:, 3], points)\n                        errors_rotation[count, 0] = re(RT[:3, :3], RT_gt[:3, :3])\n                        errors_translation[count, 0] = te(RT[:, 3], RT_gt[:, 3])\n\n                        # pose after depth refinement\n                        if cfg.TEST.POSE_REFINE:\n                            RT[:3, :3] = quat2mat(result['poses_refined'][roi_index, :4].flatten())\n                            RT[:, 3] = result['poses_refined'][roi_index, 4:]\n                            distances_sys[count, 1] = adi(RT[:3, :3], RT[:, 3],  RT_gt[:3, :3], RT_gt[:, 3], points)\n                            distances_non[count, 1] = add(RT[:3, :3], RT[:, 3],  RT_gt[:3, :3], RT_gt[:, 3], points)\n                            errors_rotation[count, 1] = re(RT[:3, :3], RT_gt[:3, :3])\n                            errors_translation[count, 1] = te(RT[:, 3], RT_gt[:, 3])\n                        else:\n                            distances_sys[count, 1] = np.inf\n                            distances_non[count, 1] = np.inf\n                            errors_rotation[count, 1] = np.inf\n                            errors_translation[count, 1] = np.inf\n                    else:\n                        distances_sys[count, :] = np.inf\n                        distances_non[count, :] = np.inf\n                        errors_rotation[count, :] = np.inf\n                        errors_translation[count, :] = np.inf\n\n            distances_sys = distances_sys[:count+1, :]\n            distances_non = distances_non[:count+1, :]\n            errors_rotation = errors_rotation[:count+1, :]\n            errors_translation = errors_translation[:count+1, :]\n            results_seq_id = results_seq_id[:count+1]\n            results_frame_id = results_frame_id[:count+1]\n            results_object_id = results_object_id[:count+1]\n            results_cls_id = results_cls_id[:count+1]\n\n            results_all = {'distances_sys': distances_sys,\n                       'distances_non': distances_non,\n                       'errors_rotation': errors_rotation,\n                       'errors_translation': errors_translation,\n                       'results_seq_id': results_seq_id,\n                       'results_frame_id': results_frame_id,\n                       'results_object_id': results_object_id,\n                       'results_cls_id': results_cls_id }\n\n            filename = os.path.join(output_dir, 'results_posecnn.mat')\n            scipy.io.savemat(filename, results_all)\n\n        # print the results\n        # for each class\n        import matplotlib.pyplot as plt\n        max_distance = 0.1\n        index_plot = [0, 1]\n        color = ['r', 'b']\n        leng = ['PoseCNN', 'PoseCNN refined']\n        num = len(leng)\n        ADD = np.zeros((self._num_classes_all, num), dtype=np.float32)\n        ADDS = np.zeros((self._num_classes_all, num), dtype=np.float32)\n        TS = np.zeros((self._num_classes_all, num), dtype=np.float32)\n        classes = list(copy.copy(self._classes_all))\n        classes[0] = 'all'\n        for k in range(self._num_classes_all):\n            fig = plt.figure()\n            if k == 0:\n                index = range(len(results_cls_id))\n            else:\n                index = np.where(results_cls_id == k)[0]\n\n            if len(index) == 0:\n                continue\n            print('%s: %d objects' % (classes[k], len(index)))\n\n            # distance symmetry\n            ax = fig.add_subplot(2, 3, 1)\n            lengs = []\n            for i in index_plot:\n                D = distances_sys[index, i]\n                ind = np.where(D > max_distance)[0]\n                D[ind] = np.inf\n                d = np.sort(D)\n                n = len(d)\n                accuracy = np.cumsum(np.ones((n, ), np.float32)) / n\n                plt.plot(d, accuracy, color[i], linewidth=2)\n                ADDS[k, i] = VOCap(d, accuracy)\n                lengs.append('%s (%.2f)' % (leng[i], ADDS[k, i] * 100))\n                print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D))))\n\n            ax.legend(lengs)\n            plt.xlabel('Average distance threshold in meter (symmetry)')\n            plt.ylabel('accuracy')\n            ax.set_title(classes[k])\n\n            # distance non-symmetry\n            ax = fig.add_subplot(2, 3, 2)\n            lengs = []\n            for i in index_plot:\n                D = distances_non[index, i]\n                ind = np.where(D > max_distance)[0]\n                D[ind] = np.inf\n                d = np.sort(D)\n                n = len(d)\n                accuracy = np.cumsum(np.ones((n, ), np.float32)) / n\n                plt.plot(d, accuracy, color[i], linewidth=2)\n                ADD[k, i] = VOCap(d, accuracy)\n                lengs.append('%s (%.2f)' % (leng[i], ADD[k, i] * 100))\n                print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D))))\n\n            ax.legend(lengs)\n            plt.xlabel('Average distance threshold in meter (non-symmetry)')\n            plt.ylabel('accuracy')\n            ax.set_title(classes[k])\n\n            # translation\n            ax = fig.add_subplot(2, 3, 3)\n            lengs = []\n            for i in index_plot:\n                D = errors_translation[index, i]\n                ind = np.where(D > max_distance)[0]\n                D[ind] = np.inf\n                d = np.sort(D)\n                n = len(d)\n                accuracy = np.cumsum(np.ones((n, ), np.float32)) / n\n                plt.plot(d, accuracy, color[i], linewidth=2)\n                TS[k, i] = VOCap(d, accuracy)\n                lengs.append('%s (%.2f)' % (leng[i], TS[k, i] * 100))\n                print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D))))\n\n            ax.legend(lengs)\n            plt.xlabel('Translation threshold in meter')\n            plt.ylabel('accuracy')\n            ax.set_title(classes[k])\n\n            # rotation histogram\n            count = 4\n            for i in index_plot:\n                ax = fig.add_subplot(2, 3, count)\n                D = errors_rotation[index, i]\n                ind = np.where(np.isfinite(D))[0]\n                D = D[ind]\n                ax.hist(D, bins=range(0, 190, 10), range=(0, 180))\n                plt.xlabel('Rotation angle error')\n                plt.ylabel('count')\n                ax.set_title(leng[i])\n                count += 1\n\n            # mng = plt.get_current_fig_manager()\n            # mng.full_screen_toggle()\n            filename = output_dir + '/' + classes[k] + '.png'\n            plt.savefig(filename)\n            # plt.show()\n\n        # print ADD\n        print('==================ADD======================')\n        for k in range(len(classes)):\n            print('%s: %f' % (classes[k], ADD[k, 0]))\n        for k in range(len(classes)-1):\n            print('%f' % (ADD[k+1, 0]))\n        print('%f' % (ADD[0, 0]))\n        print(cfg.TRAIN.SNAPSHOT_INFIX)\n        print('===========================================')\n\n        # print ADD-S\n        print('==================ADD-S====================')\n        for k in range(len(classes)):\n            print('%s: %f' % (classes[k], ADDS[k, 0]))\n        for k in range(len(classes)-1):\n            print('%f' % (ADDS[k+1, 0]))\n        print('%f' % (ADDS[0, 0]))\n        print(cfg.TRAIN.SNAPSHOT_INFIX)\n        print('===========================================')\n\n        # print ADD\n        print('==================ADD refined======================')\n        for k in range(len(classes)):\n            print('%s: %f' % (classes[k], ADD[k, 1]))\n        for k in range(len(classes)-1):\n            print('%f' % (ADD[k+1, 1]))\n        print('%f' % (ADD[0, 1]))\n        print(cfg.TRAIN.SNAPSHOT_INFIX)\n        print('===========================================')\n\n        # print ADD-S\n        print('==================ADD-S refined====================')\n        for k in range(len(classes)):\n            print('%s: %f' % (classes[k], ADDS[k, 1]))\n        for k in range(len(classes)-1):\n            print('%f' % (ADDS[k+1, 1]))\n        print('%f' % (ADDS[0, 1]))\n        print(cfg.TRAIN.SNAPSHOT_INFIX)\n        print('===========================================')\n"
  },
  {
    "path": "lib/fcn/__init__.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n"
  },
  {
    "path": "lib/fcn/config.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\n\"\"\"PoseCNN config system.\n\nThis file specifies default config options for Fast R-CNN. You should not\nchange values in this file. Instead, you should write a config file (in yaml)\nand use cfg_from_file(yaml_file) to load it and override the default options.\n\nMost tools in $ROOT/tools take a --cfg option to specify an override file.\n    - See tools/{train,test}_net.py for example code that uses cfg_from_file()\n    - See experiments/cfgs/*.yml for example YAML config override files\n\"\"\"\n\nimport os\nimport os.path as osp\nimport numpy as np\nimport math\n# `pip install easydict` if you don't have it\nfrom easydict import EasyDict as edict\nimport logging\n\n__C = edict()\n# Consumers can get config by:\n#   from fast_rcnn_config import cfg\ncfg = __C\n\n__C.FLIP_X = False\n__C.INPUT = 'RGBD'\n__C.NETWORK = 'VGG16'\n__C.RIG = ''\n__C.CAD = ''\n__C.POSE = ''\n__C.BACKGROUND = ''\n__C.USE_GPU_NMS = True\n__C.MODE = 'TRAIN'\n__C.INTRINSICS = ()\n__C.DATA_PATH = ''\n\n__C.FLOW_HEIGHT = 512\n__C.FLOW_WIDTH = 640\n\n# Anchor scales for RPN\n__C.ANCHOR_SCALES = (8,16,32)\n\n# Anchor ratios for RPN\n__C.ANCHOR_RATIOS = (0.5,1,2)\n\n__C.FEATURE_STRIDE = 16\n__C.gpu_id = 0\n__C.instance_id = 0\n\n#\n# Training options\n#\n\n__C.TRAIN = edict()\n\n__C.TRAIN.WEIGHT_DECAY = 0.0001\n\n__C.TRAIN.SEGMENTATION = True\n__C.TRAIN.ITERNUM = 4\n__C.TRAIN.HEATUP = 4\n__C.TRAIN.GPUNUM = 1\n__C.TRAIN.CLASSES = (0,1,2,3)\n__C.TRAIN.SYMMETRY = (0,0,0,0)\n\n__C.TRAIN.SLIM = False\n__C.TRAIN.SINGLE_FRAME = False\n__C.TRAIN.TRAINABLE = True\n__C.TRAIN.VERTEX_REG = True\n__C.TRAIN.VERTEX_REG_DELTA = False\n__C.TRAIN.POSE_REG = True\n__C.TRAIN.LABEL_W = 1.0\n__C.TRAIN.VERTEX_W = 1.0\n__C.TRAIN.VERTEX_W_INSIDE = 10.0\n__C.TRAIN.POSE_W = 1.0\n__C.TRAIN.BOX_W = 1.0\n__C.TRAIN.HARD_LABEL_THRESHOLD = 1.0\n__C.TRAIN.HARD_LABEL_SAMPLING = 1.0\n__C.TRAIN.HARD_ANGLE = 15.0\n__C.TRAIN.VISUALIZE = False\n__C.TRAIN.GAN = False\n__C.TRAIN.MATCHING = False\n__C.TRAIN.NOISE_LEVEL = 0.05\n__C.TRAIN.FREEZE_LAYERS = True\n__C.TRAIN.MAX_ITERS_PER_EPOCH = 1000000\n__C.TRAIN.UNIFORM_POSE_INTERVAL = 15\n__C.TRAIN.AFFINE = False\n\n# Hough voting\n__C.TRAIN.HOUGH_LABEL_THRESHOLD = 100\n__C.TRAIN.HOUGH_VOTING_THRESHOLD = -1\n__C.TRAIN.HOUGH_SKIP_PIXELS = -1\n__C.TRAIN.HOUGH_INLIER_THRESHOLD = 0.9\n\n# synthetic training\n__C.TRAIN.SYNTHESIZE = False\n__C.TRAIN.SYN_ONLINE = False\n__C.TRAIN.SYN_WIDTH = 640\n__C.TRAIN.SYN_HEIGHT = 480\n__C.TRAIN.SYNROOT = '/var/Projects/Deep_Pose/data/LOV/data_syn/'\nif not os.path.exists(__C.TRAIN.SYNROOT):\n    __C.TRAIN.SYNROOT = '/home/yuxiang/Projects/Deep_Pose/data/LOV/data_syn/'\n__C.TRAIN.SYNITER = 0\n__C.TRAIN.SYNNUM = 80000\n__C.TRAIN.SYN_RATIO = 1\n__C.TRAIN.SYN_CLASS_INDEX = 1\n__C.TRAIN.SYN_TNEAR = 0.5\n__C.TRAIN.SYN_TFAR = 2.0\n__C.TRAIN.SYN_BACKGROUND_SPECIFIC = False\n__C.TRAIN.SYN_BACKGROUND_SUBTRACT_MEAN = False\n__C.TRAIN.SYN_BACKGROUND_CONSTANT_PROB = 0.1\n__C.TRAIN.SYN_BACKGROUND_AFFINE = False\n__C.TRAIN.SYN_SAMPLE_OBJECT = True\n__C.TRAIN.SYN_SAMPLE_POSE = True\n__C.TRAIN.SYN_STD_ROTATION = 15\n__C.TRAIN.SYN_STD_TRANSLATION = 0.05\n__C.TRAIN.SYN_MIN_OBJECT = 5\n__C.TRAIN.SYN_MAX_OBJECT = 8\n__C.TRAIN.SYN_TNEAR = 0.5\n__C.TRAIN.SYN_TFAR = 2.0\n__C.TRAIN.SYN_BOUND = 0.4\n__C.TRAIN.SYN_SAMPLE_DISTRACTOR = True\n__C.TRAIN.SYN_CROP = False\n__C.TRAIN.SYN_CROP_SIZE = 224\n__C.TRAIN.SYN_TABLE_PROB = 0.8\n\n# autoencoder\n__C.TRAIN.BOOSTRAP_PIXELS = 20\n\n# domain adaptation\n__C.TRAIN.ADAPT = False\n__C.TRAIN.ADAPT_ROOT = ''\n__C.TRAIN.ADAPT_NUM = 400\n__C.TRAIN.ADAPT_RATIO = 1\n__C.TRAIN.ADAPT_WEIGHT = 0.1\n\n# learning rate\n__C.TRAIN.OPTIMIZER = 'MOMENTUM'\n__C.TRAIN.LEARNING_RATE = 0.0001\n__C.TRAIN.MILESTONES = (100, 150, 200)\n__C.TRAIN.MOMENTUM = 0.9\n__C.TRAIN.BETA = 0.999\n__C.TRAIN.GAMMA = 0.1\n\n__C.TRAIN.SYMSIZE = 0\n\n# voxel grid size\n__C.TRAIN.GRID_SIZE = 256\n\n# Scales to compute real features\n__C.TRAIN.SCALES_BASE = (0.25, 0.5, 1.0, 2.0, 3.0)\n\n# parameters for data augmentation\n__C.TRAIN.CHROMATIC = True\n__C.TRAIN.ADD_NOISE = False\n\n# Images to use per minibatch\n__C.TRAIN.IMS_PER_BATCH = 2\n__C.TRAIN.NUM_STEPS = 5\n__C.TRAIN.NUM_UNITS = 64\n\n# Use horizontally-flipped images during training?\n__C.TRAIN.USE_FLIPPED = True\n\n# Iterations between snapshots\n__C.TRAIN.SNAPSHOT_EPOCHS = 1\n\n# solver.prototxt specifies the snapshot path prefix, this adds an optional\n# infix to yield the path: <prefix>[_<infix>]_iters_XYZ.caffemodel\n__C.TRAIN.SNAPSHOT_PREFIX = 'caffenet_fast_rcnn'\n__C.TRAIN.SNAPSHOT_INFIX = ''\n\n__C.TRAIN.DISPLAY = 20\n__C.TRAIN.ITERS = 0\n\n# Whether to add ground truth boxes to the pool when sampling regions\n__C.TRAIN.USE_GT = False\n\n# Minibatch size (number of regions of interest [ROIs])\n__C.TRAIN.BATCH_SIZE = 128\n\n# Fraction of minibatch that is labeled foreground (i.e. class > 0)\n__C.TRAIN.FG_FRACTION = 0.25\n\n# Overlap threshold for a ROI to be considered foreground (if >= FG_THRESH)\n__C.TRAIN.FG_THRESH = 0.5\n__C.TRAIN.FG_THRESH_POSE = 0.2\n\n# Overlap threshold for a ROI to be considered background (class = 0 if\n# overlap in [LO, HI))\n__C.TRAIN.BG_THRESH_HI = 0.5\n__C.TRAIN.BG_THRESH_LO = 0.1\n\n\n# Use RPN to detect objects\n__C.TRAIN.HAS_RPN = True\n\n# IOU >= thresh: positive example\n__C.TRAIN.RPN_POSITIVE_OVERLAP = 0.7\n\n# IOU < thresh: negative example\n__C.TRAIN.RPN_NEGATIVE_OVERLAP = 0.3\n\n# If an anchor satisfied by positive and negative conditions set to negative\n__C.TRAIN.RPN_CLOBBER_POSITIVES = False\n\n# Max number of foreground examples\n__C.TRAIN.RPN_FG_FRACTION = 0.5\n\n# Total number of examples\n__C.TRAIN.RPN_BATCHSIZE = 256\n\n# NMS threshold used on RPN proposals\n__C.TRAIN.RPN_NMS_THRESH = 0.7\n\n# Number of top scoring boxes to keep before apply NMS to RPN proposals\n__C.TRAIN.RPN_PRE_NMS_TOP_N = 12000\n\n# Number of top scoring boxes to keep after applying NMS to RPN proposals\n__C.TRAIN.RPN_POST_NMS_TOP_N = 2000\n\n# Deprecated (outside weights)\n__C.TRAIN.RPN_BBOX_INSIDE_WEIGHTS = (1.0, 1.0, 1.0, 1.0)\n\n# Give the positive RPN examples weight of p * 1 / {num positives}\n# and give negatives a weight of (1 - p)\n# Set to -1.0 to use uniform example weighting\n__C.TRAIN.RPN_POSITIVE_WEIGHT = -1.0\n\n# Normalize the targets (subtract empirical mean, divide by empirical stddev)\n__C.TRAIN.BBOX_NORMALIZE_TARGETS = True\n\n# Deprecated (inside weights)\n__C.TRAIN.BBOX_INSIDE_WEIGHTS = (1.0, 1.0, 1.0, 1.0)\n\n# Normalize the targets using \"precomputed\" (or made up) means and stdevs\n# (BBOX_NORMALIZE_TARGETS must also be True)\n__C.TRAIN.BBOX_NORMALIZE_TARGETS_PRECOMPUTED = True\n\n__C.TRAIN.BBOX_NORMALIZE_MEANS = (0.0, 0.0, 0.0, 0.0)\n\n__C.TRAIN.BBOX_NORMALIZE_STDS = (0.1, 0.1, 0.2, 0.2)\n\n\n#\n# Testing options\n#\n\n__C.TEST = edict()\n__C.TEST.GLOBAL_SEARCH = False\n__C.TEST.SEGMENTATION = True\n__C.TEST.SINGLE_FRAME = False\n__C.TEST.VERTEX_REG_2D = False\n__C.TEST.VERTEX_REG_3D = False\n__C.TEST.VISUALIZE = False\n__C.TEST.RANSAC = False\n__C.TEST.GAN = False\n__C.TEST.POSE_REG = False\n__C.TEST.POSE_REFINE = False\n__C.TEST.POSE_SDF = True\n__C.TEST.POSE_CODEBOOK = False\n__C.TEST.SYNTHESIZE = False\n__C.TEST.ROS_CAMERA = 'camera'\n__C.TEST.DET_THRESHOLD = 0.5\n__C.TEST.BUILD_CODEBOOK = False\n__C.TEST.IMS_PER_BATCH = 1\n__C.TEST.MEAN_SHIFT = False\n__C.TEST.CHECK_SIZE = False\n__C.TEST.NUM_SDF_ITERATIONS_INIT = 100\n__C.TEST.NUM_SDF_ITERATIONS_TRACKING = 50\n__C.TEST.SDF_TRANSLATION_REG = 10.0\n__C.TEST.SDF_ROTATION_REG = 0.1\n__C.TEST.NUM_LOST = 3\n__C.TEST.ALIGN_Z_AXIS = False\n__C.TEST.GEN_DATA = False\n\n# Hough voting\n__C.TEST.HOUGH_LABEL_THRESHOLD = 100\n__C.TEST.HOUGH_VOTING_THRESHOLD = -1\n__C.TEST.HOUGH_SKIP_PIXELS = -1\n__C.TEST.HOUGH_INLIER_THRESHOLD = 0.9\n__C.TEST.CLASSES = (0,1,2,3)\n__C.TEST.SYMMETRY = (0,0,0,0)\n\n\n__C.TEST.ITERNUM = 4\n\n# Scales to compute real features\n__C.TEST.SCALES_BASE = (0.25, 0.5, 1.0, 2.0, 3.0)\n\n# voxel grid size\n__C.TEST.GRID_SIZE = 256\n\n## NMS threshold used on RPN proposals\n__C.TEST.RPN_NMS_THRESH = 0.7\n\n# Number of top scoring boxes to keep before apply NMS to RPN proposals\n__C.TEST.RPN_PRE_NMS_TOP_N = 6000\n\n# Number of top scoring boxes to keep after applying NMS to RPN proposals\n__C.TEST.RPN_POST_NMS_TOP_N = 300\n\n# Test using bounding-box regressors\n__C.TEST.BBOX_REG = True\n\n# Overlap threshold used for non-maximum suppression (suppress boxes with\n# IoU >= this threshold)\n__C.TEST.NMS = 0.3\n\n# Pixel mean values (BGR order) as a (1, 1, 3) array\n# These are the values originally used for training VGG16\n__C.PIXEL_MEANS = np.array([[[102.9801, 115.9465, 122.7717]]])\n\n# For reproducibility\n__C.RNG_SEED = 3\n\n# A small number that's used many times\n__C.EPS = 1e-14\n\n# Root directory of project\n__C.ROOT_DIR = osp.abspath(osp.join(osp.dirname(__file__), '..', '..'))\n\n# Place outputs under an experiments directory\n__C.EXP_DIR = 'default'\n\n# Default GPU device id\n__C.GPU_ID = 0\n\n\ndef get_output_dir(imdb, net):\n    \"\"\"Return the directory where experimental artifacts are placed.\n\n    A canonical path is built using the name from an imdb and a network\n    (if not None).\n    \"\"\"\n    path = osp.abspath(osp.join(__C.ROOT_DIR, 'output', __C.EXP_DIR, imdb.name))\n    if net is None:\n        return path\n    else:\n        return osp.join(path, net)\n\ndef _merge_a_into_b(a, b):\n    \"\"\"Merge config dictionary a into config dictionary b, clobbering the\n    options in b whenever they are also specified in a.\n    \"\"\"\n    if type(a) is not edict:\n        return\n\n    for k, v in a.items():\n        # a must specify keys that are in b\n        if k not in b:\n            raise KeyError('{} is not a valid config key'.format(k))\n\n        # the types must match, too\n        if type(b[k]) is not type(v):\n            raise ValueError(('Type mismatch ({} vs. {}) '\n                              'for config key: {}').format(type(b[k]),\n                                                           type(v), k))\n\n        # recursively merge dicts\n        if type(v) is edict:\n            try:\n                _merge_a_into_b(a[k], b[k])\n            except:\n                print('Error under config key: {}'.format(k))\n                raise\n        else:\n            b[k] = v\n\ndef cfg_from_file(filename):\n    \"\"\"Load a config file and merge it into the default options.\"\"\"\n    import yaml\n    with open(filename, 'r') as f:\n        yaml_cfg = edict(yaml.load(f))\n\n    _merge_a_into_b(yaml_cfg, __C)\n\n\ndef yaml_from_file(filename):\n    \"\"\"Load a config file and merge it into the default options.\"\"\"\n    import yaml\n    with open(filename, 'r') as f:\n        yaml_cfg = edict(yaml.load(f))\n    return yaml_cfg\n"
  },
  {
    "path": "lib/fcn/render_utils.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport torch\nimport time\nimport sys, os\nimport numpy as np\nimport cv2\nimport matplotlib.pyplot as plt\nfrom fcn.config import cfg\nfrom transforms3d.quaternions import quat2mat\n\n\ndef render_image(dataset, im, rois, poses, poses_refine, labels):\n\n    # label image\n    label_image = dataset.labels_to_image(labels)\n    im_label = im[:, :, (2, 1, 0)].copy()\n    I = np.where(labels != 0)\n    im_label[I[0], I[1], :] = 0.5 * label_image[I[0], I[1], :] + 0.5 * im_label[I[0], I[1], :]\n\n    num = poses.shape[0]\n    classes = dataset._classes_test\n    class_colors = dataset._class_colors_test\n\n    cls_indexes = []\n    poses_all = []\n    poses_refine_all = []\n    for i in range(num):\n        if cfg.MODE == 'TEST':\n            cls_index = int(rois[i, 1]) - 1\n        else:\n            cls_index = cfg.TRAIN.CLASSES[int(rois[i, 1])] - 1\n\n        if cls_index < 0:\n            continue\n\n        cls_indexes.append(cls_index)\n        qt = np.zeros((7, ), dtype=np.float32)\n        qt[:3] = poses[i, 4:7]\n        qt[3:] = poses[i, :4]\n        poses_all.append(qt.copy())\n\n        if cfg.TEST.POSE_REFINE and poses_refine is not None:\n            qt[:3] = poses_refine[i, 4:7]\n            qt[3:] = poses_refine[i, :4]\n            poses_refine_all.append(qt.copy())\n\n        cls = int(rois[i, 1])\n        print(classes[cls], rois[i, -1], cls_index)\n        if cls > 0 and rois[i, -1] > cfg.TEST.DET_THRESHOLD:\n            # draw roi\n            x1 = rois[i, 2]\n            y1 = rois[i, 3]\n            x2 = rois[i, 4]\n            y2 = rois[i, 5]\n            cv2.rectangle(im_label, (x1, y1), (x2, y2), class_colors[cls], 2)\n\n            # draw center\n            cx = int((x1 + x2) / 2)\n            cy = int((y1 + y2) / 2)\n            cv2.circle(im_label, (cx, cy), 2, (255, 255, 0), 10)\n\n    # rendering\n    if len(cls_indexes) > 0 and cfg.TRAIN.POSE_REG:\n\n        height = im.shape[0]\n        width = im.shape[1]\n        intrinsic_matrix = dataset._intrinsic_matrix\n        fx = intrinsic_matrix[0, 0]\n        fy = intrinsic_matrix[1, 1]\n        px = intrinsic_matrix[0, 2]\n        py = intrinsic_matrix[1, 2]\n        zfar = 10.0\n        znear = 0.01\n        image_tensor = torch.cuda.FloatTensor(height, width, 4)\n        seg_tensor = torch.cuda.FloatTensor(height, width, 4)\n\n        # set renderer\n        cfg.renderer.set_light_pos([0, 0, 0])\n        cfg.renderer.set_light_color([1, 1, 1])\n        cfg.renderer.set_projection_matrix(width, height, fx, fy, px, py, znear, zfar)\n\n        # pose\n        cfg.renderer.set_poses(poses_all)\n        frame = cfg.renderer.render(cls_indexes, image_tensor, seg_tensor)\n        image_tensor = image_tensor.flip(0)\n        im_render = image_tensor.cpu().numpy()\n        im_render = np.clip(im_render, 0, 1)\n        im_render = im_render[:, :, :3] * 255\n        im_render = im_render.astype(np.uint8)\n        im_output = 0.8 * im[:,:,(2, 1, 0)].astype(np.float32) + 1.0 * im_render.astype(np.float32)\n        im_output = np.clip(im_output, 0, 255)\n\n        # pose refine\n        if cfg.TEST.POSE_REFINE and poses_refine is not None:\n             cfg.renderer.set_poses(poses_refine_all)\n             frame = cfg.renderer.render(cls_indexes, image_tensor, seg_tensor)\n             image_tensor = image_tensor.flip(0)\n             im_render = image_tensor.cpu().numpy()\n             im_render = np.clip(im_render, 0, 1)\n             im_render = im_render[:, :, :3] * 255\n             im_render = im_render.astype(np.uint8)\n             im_output_refine = 0.8 * im[:,:,(2, 1, 0)].astype(np.float32) + 1.0 * im_render.astype(np.float32)\n             im_output_refine = np.clip(im_output_refine, 0, 255)\n             im_output_refine = im_output_refine.astype(np.uint8)\n        else:\n             im_output_refine = im_output.copy()\n    else:\n        im_output = 0.4 * im[:,:,(2, 1, 0)]\n        im_output_refine = im_output.copy()\n\n    return im_output.astype(np.uint8), im_output_refine.astype(np.uint8), im_label\n"
  },
  {
    "path": "lib/fcn/test_common.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport torch\nimport time\nimport sys, os\nimport numpy as np\nimport posecnn_cuda\nimport matplotlib.pyplot as plt\nfrom transforms3d.quaternions import mat2quat, quat2mat\nfrom matplotlib.patches import Circle\nfrom fcn.config import cfg\n\ndef compute_index_sdf(rois):\n    num = rois.shape[0]\n    index_sdf = []\n    for i in range(num):\n        cls = int(rois[i, 1])\n        if cls == 0:\n            continue\n        if cfg.TRAIN.CLASSES[cls] not in cfg.TEST.CLASSES:\n            continue\n        if rois[i, -1] < cfg.TEST.DET_THRESHOLD:\n            continue\n        index_sdf.append(i)\n    return index_sdf\n\n# SDF refinement\ndef refine_pose(im_label, im_depth, rois, poses, meta_data, dataset, visualize=False):\n\n    start_time = time.time()\n    width = im_depth.shape[1]\n    height = im_depth.shape[0]\n    sdf_optim = cfg.sdf_optimizer\n    steps = cfg.TEST.NUM_SDF_ITERATIONS_TRACKING\n    index_sdf = compute_index_sdf(rois)\n\n    # backproject depth\n    intrinsic_matrix = meta_data[0, :9].cpu().numpy().reshape((3, 3))\n    fx = intrinsic_matrix[0, 0]\n    fy = intrinsic_matrix[1, 1]\n    px = intrinsic_matrix[0, 2]\n    py = intrinsic_matrix[1, 2]\n    zfar = 6.0\n    znear = 0.01\n    im_pcloud = posecnn_cuda.backproject_forward(fx, fy, px, py, im_depth)[0]\n    dpoints = im_pcloud[:,:,:3].cpu().numpy().reshape((-1, 3))\n\n    # rendering\n    num = len(index_sdf)\n    poses_all = []\n    cls_indexes = []\n    for i in range(num):\n        ind = index_sdf[i]\n        cls = int(rois[ind, 1])\n        cls_render = cfg.TEST.CLASSES.index(cfg.TRAIN.CLASSES[cls]) - 1\n        cls_indexes.append(cls_render)\n        qt = np.zeros((7, ), dtype=np.float32)\n        qt[3:] = poses[ind, :4]\n        qt[:3] = poses[ind, 4:]\n        poses_all.append(qt)\n    cfg.renderer.set_poses(poses_all)\n    cfg.renderer.set_projection_matrix(width, height, fx, fy, px, py, znear, zfar)\n    image_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n    seg_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n    pcloud_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n    cfg.renderer.render(cls_indexes, image_tensor, seg_tensor, pc2_tensor=pcloud_tensor)\n    pcloud_tensor = pcloud_tensor.flip(0)\n    pcloud = pcloud_tensor[:,:,:3].cpu().numpy().reshape((-1, 3))   \n\n    # refine translation\n    poses_t = poses.copy()\n    for i in range(num):\n        ind = index_sdf[i]\n        cls = int(rois[ind, 1])\n        cls_render = cfg.TEST.CLASSES.index(cfg.TRAIN.CLASSES[cls]) - 1\n        x1 = max(int(rois[ind, 2]), 0)\n        y1 = max(int(rois[ind, 3]), 0)\n        x2 = min(int(rois[ind, 4]), width-1)\n        y2 = min(int(rois[ind, 5]), height-1)\n        labels = torch.zeros_like(im_label)\n        labels[y1:y2, x1:x2] = im_label[y1:y2, x1:x2]\n        labels = labels.cpu().numpy().reshape((width * height, ))\n        index = np.where((labels == cls) & np.isfinite(dpoints[:, 0]) & (pcloud[:, 0] != 0) & (dpoints[:, 0] != 0))[0]\n        if len(index) > 10:\n            T = np.mean(dpoints[index, :] - pcloud[index, :], axis=0)\n            z_new = poses[ind, 6] + T[2]\n            poses_t[ind, 6] = z_new\n            poses_t[ind, 4] = (poses[ind, 4] / poses[ind, 6]) * z_new\n            poses_t[ind, 5] = (poses[ind, 5] / poses[ind, 6]) * z_new\n            print('object {}, class {}, z {}, z new {}'.format(i, dataset._classes_test[cls_render+1], poses[ind, 6], z_new))\n\n    if visualize:\n        fig = plt.figure()\n        ax = fig.add_subplot(1, 1, 1)\n        image_tensor = image_tensor.flip(0)\n        im = image_tensor.cpu().numpy() * 255\n        im = im.astype(np.uint8)\n        plt.imshow(im)\n        plt.show()\n\n    # compare the depth\n    depth_meas_roi = im_pcloud[:, :, 2]\n    mask_depth_meas = depth_meas_roi > 0\n    mask_depth_valid = torch.isfinite(depth_meas_roi)\n\n    # prepare data\n    T_oc_init = np.zeros((num, 4, 4), dtype=np.float32)\n    cls_index = torch.cuda.FloatTensor(0, 1)\n    obj_index = torch.cuda.FloatTensor(0, 1)\n    pix_index = torch.cuda.LongTensor(0, 2)\n    for i in range(num):\n\n        # pose\n        ind = index_sdf[i]\n        pose = poses_t[ind, :].copy()\n        T_co = np.eye(4, dtype=np.float32)\n        T_co[:3, :3] = quat2mat(pose[:4])\n        T_co[:3, 3] = pose[4:]\n        T_oc_init[i] = np.linalg.inv(T_co)\n\n        # filter out points very far away\n        z = float(pose[6])\n        roi = rois[ind, :].copy()\n        cls = int(roi[1])\n        extent = 1.0 * np.mean(dataset._extents[cls, :])\n        mask_distance = torch.abs(depth_meas_roi - z) < extent\n            \n        # mask label\n        cls_render = cfg.TEST.CLASSES.index(cfg.TRAIN.CLASSES[cls]) - 1\n        w = roi[4] - roi[2]\n        h = roi[5] - roi[3]\n        x1 = max(int(roi[2] - w / 2), 0)\n        y1 = max(int(roi[3] - h / 2), 0)\n        x2 = min(int(roi[4] + w / 2), width - 1)\n        y2 = min(int(roi[5] + h / 2), height - 1)\n        if im_label is not None:\n            labels = torch.zeros_like(im_label)\n            labels[y1:y2, x1:x2] = im_label[y1:y2, x1:x2]\n            mask_label = labels == cls\n        else:\n            mask_label = torch.zeros_like(mask_depth_meas)\n            mask_label[y1:y2, x1:x2] = 1\n\n        mask = mask_label * mask_depth_meas * mask_depth_valid * mask_distance\n        index_p = torch.nonzero(mask)\n        n = index_p.shape[0]\n\n        if n > 100:\n            pix_index = torch.cat((pix_index, index_p), dim=0)\n            index = cls_render * torch.ones((n, 1), dtype=torch.float32, device=0)\n            cls_index = torch.cat((cls_index, index), dim=0)\n            index = i * torch.ones((n, 1), dtype=torch.float32, device=0)\n            obj_index = torch.cat((obj_index, index), dim=0)\n            print('sdf {} points for object {}, class {} {}'.format(n, i, cls_render, dataset._classes_test[cls_render+1]))\n        else:\n            print('sdf {} points for object {}, class {} {}, no refinement'.format(n, i, cls_render, dataset._classes_test[cls_render+1]))\n\n        if visualize and n <= 100:\n            fig = plt.figure()\n            ax = fig.add_subplot(2, 3, 1)\n            plt.imshow(mask_label.cpu().numpy())\n            ax.set_title('mask label')\n            ax = fig.add_subplot(2, 3, 2)\n            plt.imshow(mask_depth_meas.cpu().numpy())\n            ax.set_title('mask_depth_meas')\n            ax = fig.add_subplot(2, 3, 3)\n            plt.imshow(mask_depth_valid.cpu().numpy())\n            ax.set_title('mask_depth_valid')\n            ax = fig.add_subplot(2, 3, 4)\n            plt.imshow(mask_distance.cpu().numpy())\n            ax.set_title('mask_distance')\n            print(extent, z)\n            ax = fig.add_subplot(2, 3, 5)\n            plt.imshow(depth_meas_roi.cpu().numpy())\n            ax.set_title('depth')\n            plt.show()\n\n    # data\n    n = pix_index.shape[0]\n    print('sdf with {} points'.format(n))\n    if n == 0:\n        return poses_t.copy()\n    points = im_pcloud[pix_index[:, 0], pix_index[:, 1], :]\n    points = torch.cat((points, cls_index, obj_index), dim=1)\n    T_oc_opt = sdf_optim.refine_pose_layer(T_oc_init, points, steps=steps)\n\n    # collect poses\n    poses_refined = poses_t.copy()\n    for i in range(num):\n        RT_opt = T_oc_opt[i]\n        ind = index_sdf[i]\n        if RT_opt[3, 3] > 0:\n            RT_opt = np.linalg.inv(RT_opt)\n            poses_refined[ind, :4] = mat2quat(RT_opt[:3, :3])\n            poses_refined[ind, 4:] = RT_opt[:3, 3]\n\n    if visualize:\n        points = points.cpu().numpy()\n        for i in range(num):\n            ind = index_sdf[i]\n            roi = rois[ind, :].copy()\n            cls = int(roi[1])\n            cls = cfg.TEST.CLASSES.index(cfg.TRAIN.CLASSES[cls])\n            T_co_init = np.linalg.inv(T_oc_init[i])\n\n            pose = poses_refined[ind, :].copy()\n            T_co_opt = np.eye(4, dtype=np.float32)\n            T_co_opt[:3, :3] = quat2mat(pose[:4])\n            T_co_opt[:3, 3] = pose[4:]\n\n            index = np.where(points[:, 4] == i)[0]\n            if len(index) == 0:\n                continue\n            pts = points[index, :4].copy()\n            pts[:, 3] = 1.0\n\n            # show points\n            fig = plt.figure()\n            ax = fig.add_subplot(1, 1, 1, projection='3d')\n            points_obj = dataset._points_all_test[cls, :, :]\n            points_init = np.matmul(np.linalg.inv(T_co_init), pts.transpose()).transpose()\n            points_opt = np.matmul(np.linalg.inv(T_co_opt), pts.transpose()).transpose()\n\n            ax.scatter(points_obj[::5, 0], points_obj[::5, 1], points_obj[::5, 2], color='yellow')\n            ax.scatter(points_init[::5, 0], points_init[::5, 1], points_init[::5, 2], color='red')\n            ax.scatter(points_opt[::5, 0], points_opt[::5, 1], points_opt[::5, 2], color='blue')\n\n            ax.set_xlabel('X Label')\n            ax.set_ylabel('Y Label')\n            ax.set_zlabel('Z Label')\n            ax.set_xlim(sdf_optim.xmins[cls-1], sdf_optim.xmaxs[cls-1])\n            ax.set_ylim(sdf_optim.ymins[cls-1], sdf_optim.ymaxs[cls-1])\n            ax.set_zlim(sdf_optim.zmins[cls-1], sdf_optim.zmaxs[cls-1])\n            ax.set_title(dataset._classes_test[cls])\n            plt.show()\n\n    print('pose refine time %.6f' % (time.time() - start_time))\n    return poses_refined\n"
  },
  {
    "path": "lib/fcn/test_dataset.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport torch\nimport torch.nn as nn\nimport time\nimport sys, os\nimport numpy as np\nimport cv2\nimport scipy\nimport matplotlib.pyplot as plt\n\nfrom fcn.config import cfg\nfrom fcn.test_common import refine_pose\nfrom transforms3d.quaternions import mat2quat, quat2mat, qmult\nfrom utils.se3 import *\nfrom utils.nms import nms\nfrom utils.pose_error import re, te\n\nclass AverageMeter(object):\n    \"\"\"Computes and stores the average and current value\"\"\"\n\n    def __init__(self):\n        self.reset()\n\n    def reset(self):\n        self.val = 0\n        self.avg = 0\n        self.sum = 0\n        self.count = 0\n\n    def update(self, val, n=1):\n        self.val = val\n        self.sum += val * n\n        self.count += n\n        self.avg = self.sum / self.count\n\n    def __repr__(self):\n        return '{:.3f} ({:.3f})'.format(self.val, self.avg)\n\n\ndef test(test_loader, background_loader, network, output_dir):\n\n    batch_time = AverageMeter()\n    epoch_size = len(test_loader)\n    enum_background = enumerate(background_loader)\n\n    # switch to test mode\n    network.eval()\n\n    for i, sample in enumerate(test_loader):\n\n        # if 'is_testing' in sample and sample['is_testing'] == 0:\n        #    continue\n\n        end = time.time()\n\n        inputs = sample['image_color']\n        im_info = sample['im_info']\n\n        # add background\n        mask = sample['mask']\n        try:\n            _, background = next(enum_background)\n        except:\n            enum_background = enumerate(background_loader)\n            _, background = next(enum_background)\n\n        if inputs.size(0) != background['background_color'].size(0):\n            enum_background = enumerate(background_loader)\n            _, background = next(enum_background)\n\n        background_color = background['background_color'].cuda()\n        for j in range(inputs.size(0)):\n            is_syn = im_info[j, -1]\n            if is_syn:\n                inputs[j] = mask[j] * inputs[j] + (1 - mask[j]) * background_color[j]\n\n        labels = sample['label'].cuda()\n        meta_data = sample['meta_data'].cuda()\n        extents = sample['extents'][0, :, :].repeat(cfg.TRAIN.GPUNUM, 1, 1).cuda()\n        gt_boxes = sample['gt_boxes'].cuda()\n        poses = sample['poses'].cuda()\n        points = sample['points'][0, :, :, :].repeat(cfg.TRAIN.GPUNUM, 1, 1, 1).cuda()\n        symmetry = sample['symmetry'][0, :].repeat(cfg.TRAIN.GPUNUM, 1).cuda()\n        \n        # compute output\n        if cfg.TRAIN.VERTEX_REG:\n            if cfg.TRAIN.POSE_REG:\n                out_label, out_vertex, rois, out_pose, out_quaternion = network(inputs, labels, meta_data, extents, gt_boxes, poses, points, symmetry)\n                \n                # combine poses\n                rois = rois.detach().cpu().numpy()\n                out_pose = out_pose.detach().cpu().numpy()\n                out_quaternion = out_quaternion.detach().cpu().numpy()\n                num = rois.shape[0]\n                poses = out_pose.copy()\n                for j in range(num):\n                    cls = int(rois[j, 1])\n                    if cls >= 0:\n                        qt = out_quaternion[j, 4*cls:4*cls+4]\n                        qt = qt / np.linalg.norm(qt)\n                        # allocentric to egocentric\n                        poses[j, 4] *= poses[j, 6]\n                        poses[j, 5] *= poses[j, 6]\n                        T = poses[j, 4:]\n                        poses[j, :4] = allocentric2egocentric(qt, T)\n\n                # non-maximum suppression within class\n                index = nms(rois, 0.5)\n                rois = rois[index, :]\n                poses = poses[index, :]\n\n                # refine pose\n                if cfg.TEST.POSE_REFINE:\n                    im_depth = sample['im_depth'].numpy()[0]\n                    depth_tensor = torch.from_numpy(im_depth).cuda().float()\n                    labels_out = out_label[0]\n                    poses_refined = refine_pose(labels_out, depth_tensor, rois, poses, sample['meta_data'], test_loader.dataset)\n                else:\n                    poses_refined = []\n            else:\n                out_label, out_vertex, rois, out_pose = network(inputs, labels, meta_data, extents, gt_boxes, poses, points, symmetry)\n                rois = rois.detach().cpu().numpy()\n                out_pose = out_pose.detach().cpu().numpy()\n                poses = out_pose.copy()\n                poses_refined = []\n\n                # non-maximum suppression within class\n                index = nms(rois, 0.5)\n                rois = rois[index, :]\n                poses = poses[index, :]\n        else:\n            out_label = network(inputs, labels, meta_data, extents, gt_boxes, poses, points, symmetry)\n            out_vertex = []\n            rois = []\n            poses = []\n            poses_refined = []\n\n        if cfg.TEST.VISUALIZE:\n            _vis_test(inputs, labels, out_label, out_vertex, rois, poses, poses_refined, sample, \\\n                test_loader.dataset._points_all, test_loader.dataset.classes, test_loader.dataset.class_colors)\n\n        # measure elapsed time\n        batch_time.update(time.time() - end)\n\n        if not cfg.TEST.VISUALIZE:\n            result = {'labels': out_label[0].detach().cpu().numpy(), 'rois': rois, 'poses': poses, 'poses_refined': poses_refined}\n            if 'video_id' in sample and 'image_id' in sample:\n                filename = os.path.join(output_dir, sample['video_id'][0] + '_' + sample['image_id'][0] + '.mat')\n            else:\n                result['meta_data_path'] = sample['meta_data_path']\n                print(result['meta_data_path'])\n                filename = os.path.join(output_dir, '%06d.mat' % i)\n            print(filename)\n            scipy.io.savemat(filename, result, do_compression=True)\n\n        print('[%d/%d], batch time %.2f' % (i, epoch_size, batch_time.val))\n\n    filename = os.path.join(output_dir, 'results_posecnn.mat')\n    if os.path.exists(filename):\n        os.remove(filename)\n\n\ndef _vis_test(inputs, labels, out_label, out_vertex, rois, poses, poses_refined, sample, points, classes, class_colors):\n\n    \"\"\"Visualize a mini-batch for debugging.\"\"\"\n    import matplotlib.pyplot as plt\n\n    im_blob = inputs.cpu().numpy()\n    label_blob = labels.cpu().numpy()\n    label_pred = out_label.cpu().numpy()\n    gt_poses = sample['poses'].numpy()\n    meta_data_blob = sample['meta_data'].numpy()\n    metadata = meta_data_blob[0, :]\n    intrinsic_matrix = metadata[:9].reshape((3,3))\n    gt_boxes = sample['gt_boxes'].numpy()\n    extents = sample['extents'][0, :, :].numpy()\n\n    if cfg.TRAIN.VERTEX_REG or cfg.TRAIN.VERTEX_REG_DELTA:\n        vertex_targets = sample['vertex_targets'].numpy()\n        vertex_pred = out_vertex.detach().cpu().numpy()\n\n    m = 4\n    n = 4\n    for i in range(im_blob.shape[0]):\n        fig = plt.figure()\n        start = 1\n\n        # show image\n        im = im_blob[i, :, :, :].copy()\n        im = im.transpose((1, 2, 0)) * 255.0\n        im += cfg.PIXEL_MEANS\n        im = im[:, :, (2, 1, 0)]\n        im = im.astype(np.uint8)\n        ax = fig.add_subplot(m, n, 1)\n        plt.imshow(im)\n        ax.set_title('color')\n        start += 1\n\n        # show gt boxes\n        boxes = gt_boxes[i]\n        for j in range(boxes.shape[0]):\n            if boxes[j, 4] == 0:\n                continue\n            x1 = boxes[j, 0]\n            y1 = boxes[j, 1]\n            x2 = boxes[j, 2]\n            y2 = boxes[j, 3]\n            plt.gca().add_patch(\n                plt.Rectangle((x1, y1), x2-x1, y2-y1, fill=False, edgecolor='g', linewidth=3))\n\n        # show gt label\n        label_gt = label_blob[i, :, :, :]\n        label_gt = label_gt.transpose((1, 2, 0))\n        height = label_gt.shape[0]\n        width = label_gt.shape[1]\n        num_classes = label_gt.shape[2]\n        im_label_gt = np.zeros((height, width, 3), dtype=np.uint8)\n        for j in range(num_classes):\n            I = np.where(label_gt[:, :, j] > 0)\n            im_label_gt[I[0], I[1], :] = class_colors[j]\n\n        ax = fig.add_subplot(m, n, start)\n        start += 1\n        plt.imshow(im_label_gt)\n        ax.set_title('gt labels') \n\n        # show predicted label\n        label = label_pred[i, :, :]\n        height = label.shape[0]\n        width = label.shape[1]\n        im_label = np.zeros((height, width, 3), dtype=np.uint8)\n        for j in range(num_classes):\n            I = np.where(label == j)\n            im_label[I[0], I[1], :] = class_colors[j]\n\n        ax = fig.add_subplot(m, n, start)\n        start += 1\n        plt.imshow(im_label)\n        ax.set_title('predicted labels')\n\n        if cfg.TRAIN.VERTEX_REG or cfg.TRAIN.VERTEX_REG_DELTA:\n\n            # show predicted boxes\n            ax = fig.add_subplot(m, n, start)\n            start += 1\n            plt.imshow(im)\n\n            ax.set_title('predicted boxes')\n            for j in range(rois.shape[0]):\n                if rois[j, 0] != i or rois[j, -1] < cfg.TEST.DET_THRESHOLD:\n                    continue\n                cls = rois[j, 1]\n                x1 = rois[j, 2]\n                y1 = rois[j, 3]\n                x2 = rois[j, 4]\n                y2 = rois[j, 5]\n                plt.gca().add_patch(\n                    plt.Rectangle((x1, y1), x2-x1, y2-y1, fill=False, edgecolor=np.array(class_colors[int(cls)])/255.0, linewidth=3))\n\n                cx = (x1 + x2) / 2\n                cy = (y1 + y2) / 2\n                plt.plot(cx, cy, 'yo')\n\n            # show gt poses\n            ax = fig.add_subplot(m, n, start)\n            start += 1\n            ax.set_title('gt poses')\n            plt.imshow(im)\n\n            pose_blob = gt_poses[i]\n            for j in range(pose_blob.shape[0]):\n                if pose_blob[j, 0] == 0:\n                    continue\n\n                cls = int(pose_blob[j, 1])\n                # extract 3D points\n                x3d = np.ones((4, points.shape[1]), dtype=np.float32)\n                x3d[0, :] = points[cls,:,0]\n                x3d[1, :] = points[cls,:,1]\n                x3d[2, :] = points[cls,:,2]\n               \n                # projection\n                RT = np.zeros((3, 4), dtype=np.float32)\n                qt = pose_blob[j, 2:6]\n                T = pose_blob[j, 6:]\n                qt_new = allocentric2egocentric(qt, T)\n                RT[:3, :3] = quat2mat(qt_new)\n                RT[:, 3] = T\n                x2d = np.matmul(intrinsic_matrix, np.matmul(RT, x3d))\n                x2d[0, :] = np.divide(x2d[0, :], x2d[2, :])\n                x2d[1, :] = np.divide(x2d[1, :], x2d[2, :])\n                plt.plot(x2d[0, :], x2d[1, :], '.', color=np.divide(class_colors[cls], 255.0), alpha=0.1)                    \n\n            # show predicted poses\n            ax = fig.add_subplot(m, n, start)\n            start += 1\n            ax.set_title('predicted poses')\n            plt.imshow(im)\n            for j in range(rois.shape[0]):\n                if rois[j, 0] != i:\n                    continue\n                cls = int(rois[j, 1])\n                if cls > 0:\n                    print('%s: detection score %s' % (classes[cls], rois[j, -1]))\n                if rois[j, -1] > cfg.TEST.DET_THRESHOLD:\n                    # extract 3D points\n                    x3d = np.ones((4, points.shape[1]), dtype=np.float32)\n                    x3d[0, :] = points[cls,:,0]\n                    x3d[1, :] = points[cls,:,1]\n                    x3d[2, :] = points[cls,:,2]\n\n                    # projection\n                    RT = np.zeros((3, 4), dtype=np.float32)\n                    RT[:3, :3] = quat2mat(poses[j, :4])\n                    RT[:, 3] = poses[j, 4:7]\n                    x2d = np.matmul(intrinsic_matrix, np.matmul(RT, x3d))\n                    x2d[0, :] = np.divide(x2d[0, :], x2d[2, :])\n                    x2d[1, :] = np.divide(x2d[1, :], x2d[2, :])\n                    plt.plot(x2d[0, :], x2d[1, :], '.', color=np.divide(class_colors[cls], 255.0), alpha=0.1)\n\n            # show predicted refined poses\n            if cfg.TEST.POSE_REFINE:\n                ax = fig.add_subplot(m, n, start)\n                start += 1\n                ax.set_title('predicted refined poses')\n                plt.imshow(im)\n                for j in range(rois.shape[0]):\n                    if rois[j, 0] != i:\n                        continue\n                    cls = int(rois[j, 1])\n                    if rois[j, -1] > cfg.TEST.DET_THRESHOLD:\n                        # extract 3D points\n                        x3d = np.ones((4, points.shape[1]), dtype=np.float32)\n                        x3d[0, :] = points[cls,:,0]\n                        x3d[1, :] = points[cls,:,1]\n                        x3d[2, :] = points[cls,:,2]\n\n                        # projection\n                        RT = np.zeros((3, 4), dtype=np.float32)\n                        RT[:3, :3] = quat2mat(poses_refined[j, :4])\n                        RT[:, 3] = poses_refined[j, 4:7]\n                        x2d = np.matmul(intrinsic_matrix, np.matmul(RT, x3d))\n                        x2d[0, :] = np.divide(x2d[0, :], x2d[2, :])\n                        x2d[1, :] = np.divide(x2d[1, :], x2d[2, :])\n                        plt.plot(x2d[0, :], x2d[1, :], '.', color=np.divide(class_colors[cls], 255.0), alpha=0.1)\n\n            # show gt vertex targets\n            vertex_target = vertex_targets[i, :, :, :]\n            center = np.zeros((3, height, width), dtype=np.float32)\n\n            for j in range(1, num_classes):\n                index = np.where(label_gt[:, :, j] > 0)\n                if len(index[0]) > 0:\n                    center[:, index[0], index[1]] = vertex_target[3*j:3*j+3, index[0], index[1]]\n\n            ax = fig.add_subplot(m, n, start)\n            start += 1\n            plt.imshow(center[0,:,:])\n            ax.set_title('gt center x') \n\n            ax = fig.add_subplot(m, n, start)\n            start += 1\n            plt.imshow(center[1,:,:])\n            ax.set_title('gt center y')\n\n            ax = fig.add_subplot(m, n, start)\n            start += 1\n            plt.imshow(np.exp(center[2,:,:]))\n            ax.set_title('gt z')\n\n            # show predicted vertex targets\n            vertex_target = vertex_pred[i, :, :, :]\n            center = np.zeros((3, height, width), dtype=np.float32)\n\n            for j in range(1, num_classes):\n                index = np.where(label == j)\n                if len(index[0]) > 0:\n                    center[:, index[0], index[1]] = vertex_target[3*j:3*j+3, index[0], index[1]]\n\n            ax = fig.add_subplot(m, n, start)\n            start += 1\n            plt.imshow(center[0,:,:])\n            ax.set_title('predicted center x') \n\n            ax = fig.add_subplot(m, n, start)\n            start += 1\n            plt.imshow(center[1,:,:])\n            ax.set_title('predicted center y')\n\n            ax = fig.add_subplot(m, n, start)\n            start += 1\n            plt.imshow(np.exp(center[2,:,:]))\n            ax.set_title('predicted z')\n\n        plt.show()\n"
  },
  {
    "path": "lib/fcn/test_imageset.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport torch\nimport torch.nn.functional as F\nimport time\nimport sys, os\nimport cv2\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nfrom fcn.config import cfg\nfrom fcn.render_utils import render_image\nfrom fcn.test_common import refine_pose\nfrom transforms3d.quaternions import mat2quat, quat2mat, qmult\nfrom utils.se3 import *\nfrom utils.nms import *\nfrom utils.pose_error import re, te\n\n\ndef test_image(network, dataset, im_color, im_depth=None, im_index=None):\n    \"\"\"test on a single image\"\"\"\n\n    # compute image blob\n    im = im_color.astype(np.float32, copy=True)\n    im -= cfg.PIXEL_MEANS\n    height = im.shape[0]\n    width = im.shape[1]\n    im = np.transpose(im / 255.0, (2, 0, 1))\n    im = im[np.newaxis, :, :, :]\n\n    K = dataset._intrinsic_matrix\n    K[2, 2] = 1\n    Kinv = np.linalg.pinv(K)\n    meta_data = np.zeros((1, 18), dtype=np.float32)\n    meta_data[0, 0:9] = K.flatten()\n    meta_data[0, 9:18] = Kinv.flatten()\n    meta_data = torch.from_numpy(meta_data).cuda()\n\n    if im_depth is not None:\n        depth_tensor = torch.from_numpy(im_depth).cuda().float()\n    else:\n        depth_tensor = None\n\n    # transfer to GPU\n    inputs = torch.from_numpy(im).cuda()\n\n    # run network\n    if cfg.TRAIN.VERTEX_REG:\n\n        if cfg.TRAIN.POSE_REG:\n            out_label, out_vertex, rois, out_pose, out_quaternion = network(inputs, dataset.input_labels, meta_data, \\\n                dataset.input_extents, dataset.input_gt_boxes, dataset.input_poses, dataset.input_points, dataset.input_symmetry)\n            labels = out_label[0]\n\n            # combine poses\n            rois = rois.detach().cpu().numpy()\n            out_pose = out_pose.detach().cpu().numpy()\n            out_quaternion = out_quaternion.detach().cpu().numpy()\n            num = rois.shape[0]\n            poses = out_pose.copy()\n            for j in range(num):\n                cls = int(rois[j, 1])\n                if cls >= 0:\n                    qt = out_quaternion[j, 4*cls:4*cls+4]\n                    qt = qt / np.linalg.norm(qt)\n                    # allocentric to egocentric\n                    poses[j, 4] *= poses[j, 6]\n                    poses[j, 5] *= poses[j, 6]\n                    T = poses[j, 4:]\n                    poses[j, :4] = allocentric2egocentric(qt, T)\n\n            # filter out detections\n            index = np.where(rois[:, -1] > cfg.TEST.DET_THRESHOLD)[0]\n            rois = rois[index, :]\n            poses = poses[index, :]\n\n            # non-maximum suppression within class\n            index = nms(rois, 0.2)\n            rois = rois[index, :]\n            poses = poses[index, :]\n           \n            # optimize depths\n            if cfg.TEST.POSE_REFINE and im_depth is not None:\n                poses_refined = refine_pose(labels, depth_tensor, rois, poses, meta_data, dataset)\n            else:\n                poses_refined = None\n\n        else:\n            # no pose regression\n            out_label, out_vertex, rois, out_pose = network(inputs, dataset.input_labels, meta_data, \\\n                dataset.input_extents, dataset.input_gt_boxes, dataset.input_poses, dataset.input_points, dataset.input_symmetry)\n\n            labels = out_label[0]\n\n            rois = rois.detach().cpu().numpy()\n            out_pose = out_pose.detach().cpu().numpy()\n            poses = out_pose.copy()\n\n            # filter out detections\n            index = np.where(rois[:, -1] > cfg.TEST.DET_THRESHOLD)[0]\n            rois = rois[index, :]\n            poses = poses[index, :]\n            poses_refined = None\n\n            # non-maximum suppression within class\n            index = nms(rois, 0.2)\n            rois = rois[index, :]\n            poses = poses[index, :]\n    else:\n        # segmentation only\n        out_label = network(inputs, dataset.input_labels, dataset.input_meta_data, \\\n            dataset.input_extents, dataset.input_gt_boxes, dataset.input_poses, dataset.input_points, dataset.input_symmetry)\n        labels = out_label[0]\n        rois = np.zeros((0, 7), dtype=np.float32)\n        poses = np.zeros((0, 7), dtype=np.float32)\n        poses_refined = None\n\n    im_pose, im_pose_refined, im_label = render_image(dataset, im_color, rois, poses, poses_refined, labels.cpu().numpy())\n    if cfg.TEST.VISUALIZE:\n        vis_test(dataset, im, im_depth, labels.cpu().numpy(), rois, poses, poses_refined, im_pose, im_pose_refined, out_vertex)\n\n    return im_pose, im_pose_refined, im_label, labels.cpu().numpy(), rois, poses, poses_refined\n\n\ndef vis_test(dataset, im, im_depth, label, rois, poses, poses_refined, im_pose, im_pose_refine, out_vertex=None, im_index=None):\n\n    \"\"\"Visualize a testing results.\"\"\"\n    import matplotlib.pyplot as plt\n\n    num_classes = len(dataset._class_colors_test)\n    classes = dataset._classes_test\n    class_colors = dataset._class_colors_test\n    points = dataset._points_all_test\n    intrinsic_matrix = dataset._intrinsic_matrix\n    height = label.shape[0]\n    width = label.shape[1]\n\n    if out_vertex is not None:\n        vertex_pred = out_vertex.detach().cpu().numpy()\n\n    fig = plt.figure()\n    plot = 1\n    m = 2\n    n = 3\n    # show image\n    im = im[0, :, :, :].copy()\n    im = im.transpose((1, 2, 0)) * 255.0\n    im += cfg.PIXEL_MEANS\n    im = im[:, :, (2, 1, 0)]\n    im = im.astype(np.uint8)\n    ax = fig.add_subplot(m, n, plot)\n    plot += 1\n    plt.imshow(im)\n    plt.axis('off')\n    ax.set_title('input image')\n\n    # show predicted label\n    im_label = dataset.labels_to_image(label)\n    ax = fig.add_subplot(m, n, plot)\n    plot += 1\n    plt.imshow(im_label)\n    plt.axis('off')\n    ax.set_title('predicted labels')\n\n    if cfg.TRAIN.VERTEX_REG or cfg.TRAIN.VERTEX_REG_DELTA:\n\n        # show predicted boxes\n        ax = fig.add_subplot(m, n, plot)\n        plot += 1\n        plt.imshow(im)\n        plt.axis('off')\n        ax.set_title('predicted boxes')\n        for j in range(rois.shape[0]):\n            cls = rois[j, 1]\n            x1 = rois[j, 2]\n            y1 = rois[j, 3]\n            x2 = rois[j, 4]\n            y2 = rois[j, 5]\n            plt.gca().add_patch(\n                plt.Rectangle((x1, y1), x2-x1, y2-y1, fill=False, edgecolor=np.array(class_colors[int(cls)])/255.0, linewidth=3))\n\n            cx = (x1 + x2) / 2\n            cy = (y1 + y2) / 2\n            plt.plot(cx, cy, 'yo')\n\n        '''\n        # show predicted poses\n        if cfg.TRAIN.POSE_REG:\n            ax = fig.add_subplot(m, n, plot)\n            plot += 1\n            ax.set_title('predicted poses')\n            plt.imshow(im)\n            for j in range(rois.shape[0]):\n                cls = int(rois[j, 1])\n                print(classes[cls], rois[j, -1])\n                if cls > 0 and rois[j, -1] > cfg.TEST.DET_THRESHOLD:\n                    # extract 3D points\n                    x3d = np.ones((4, points.shape[1]), dtype=np.float32)\n                    x3d[0, :] = points[cls,:,0]\n                    x3d[1, :] = points[cls,:,1]\n                    x3d[2, :] = points[cls,:,2]\n\n                    # projection\n                    RT = np.zeros((3, 4), dtype=np.float32)\n                    RT[:3, :3] = quat2mat(poses[j, :4])\n                    RT[:, 3] = poses[j, 4:7]\n                    x2d = np.matmul(intrinsic_matrix, np.matmul(RT, x3d))\n                    x2d[0, :] = np.divide(x2d[0, :], x2d[2, :])\n                    x2d[1, :] = np.divide(x2d[1, :], x2d[2, :])\n                    plt.plot(x2d[0, :], x2d[1, :], '.', color=np.divide(class_colors[cls], 255.0), alpha=0.5)\n\n        if out_vertex is not None:\n            # show predicted vertex targets\n            vertex_target = vertex_pred[0, :, :, :]\n            center = np.zeros((3, height, width), dtype=np.float32)\n\n            for j in range(1, dataset._num_classes):\n                index = np.where(label == j)\n                if len(index[0]) > 0:\n                    center[0, index[0], index[1]] = vertex_target[3*j, index[0], index[1]]\n                    center[1, index[0], index[1]] = vertex_target[3*j+1, index[0], index[1]]\n                    center[2, index[0], index[1]] = np.exp(vertex_target[3*j+2, index[0], index[1]])\n\n            ax = fig.add_subplot(m, n, plot)\n            plot += 1\n            plt.imshow(center[0,:,:])\n            plt.axis('off')\n            ax.set_title('predicted center x') \n\n            ax = fig.add_subplot(m, n, plot)\n            plot += 1\n            plt.imshow(center[1,:,:])\n            plt.axis('off')\n            ax.set_title('predicted center y')\n\n            ax = fig.add_subplot(m, n, plot)\n            plot += 1\n            plt.imshow(center[2,:,:])\n            plt.axis('off')\n            ax.set_title('predicted z')\n        '''\n\n    # show depth\n    if im_depth is not None:\n        ax = fig.add_subplot(m, n, plot)\n        plot += 1\n        plt.imshow(im_depth)\n        plt.axis('off')\n        ax.set_title('input depth')\n\n    ax = fig.add_subplot(m, n, plot)\n    plot += 1\n    plt.imshow(im_pose)\n    plt.axis('off')\n    ax.set_title('estimated poses')\n\n    if cfg.TEST.POSE_REFINE and im_pose_refine is not None and im_depth is not None:\n        ax = fig.add_subplot(m, n, plot)\n        plot += 1\n        plt.imshow(im_pose_refine)\n        plt.axis('off')\n        ax.set_title('estimated poses refined')\n\n    if im_index is not None:\n        mng = plt.get_current_fig_manager()\n        mng.resize(*mng.window.maxsize())\n        plt.show(block=False)\n        plt.pause(1)\n        filename = 'output/images/%06d.png' % im_index\n        fig.savefig(filename)\n        plt.close()\n    else:\n        plt.show()\n"
  },
  {
    "path": "lib/fcn/train.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport torch\nimport torch.nn as nn\nimport time\nimport sys, os\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nfrom fcn.config import cfg\nfrom transforms3d.quaternions import mat2quat, quat2mat, qmult\nfrom utils.se3 import *\nfrom utils.nms import *\nfrom utils.pose_error import re, te\n\nclass AverageMeter(object):\n    \"\"\"Computes and stores the average and current value\"\"\"\n\n    def __init__(self):\n        self.reset()\n\n    def reset(self):\n        self.val = 0\n        self.avg = 0\n        self.sum = 0\n        self.count = 0\n\n    def update(self, val, n=1):\n        self.val = val\n        self.sum += val * n\n        self.count += n\n        self.avg = self.sum / self.count\n\n    def __repr__(self):\n        return '{:.3f} ({:.3f})'.format(self.val, self.avg)\n\n\ndef loss_cross_entropy(scores, labels):\n    \"\"\"\n    scores: a tensor [batch_size, num_classes, height, width]\n    labels: a tensor [batch_size, num_classes, height, width]\n    \"\"\"\n\n    cross_entropy = -torch.sum(labels * scores, dim=1)\n    loss = torch.div(torch.sum(cross_entropy), torch.sum(labels)+1e-10)\n\n    return loss\n\n\ndef smooth_l1_loss(vertex_pred, vertex_targets, vertex_weights, sigma=1.0):\n    sigma_2 = sigma ** 2\n    vertex_diff = vertex_pred - vertex_targets\n    diff = torch.mul(vertex_weights, vertex_diff)\n    abs_diff = torch.abs(diff)\n    smoothL1_sign = torch.lt(abs_diff, 1. / sigma_2).float().detach()\n    in_loss = torch.pow(diff, 2) * (sigma_2 / 2.) * smoothL1_sign \\\n            + (abs_diff - (0.5 / sigma_2)) * (1. - smoothL1_sign)\n    loss = torch.div( torch.sum(in_loss), torch.sum(vertex_weights) + 1e-10 )\n    return loss\n\n#************************************#\n#    train PoseCNN                   #\n#************************************#\n\n'''\nsample = {'image_color': im_blob,\n          'im_depth': im_depth,\n          'label': label_blob,\n          'mask': mask,\n          'meta_data': meta_data_blob,\n          'poses': pose_blob,\n          'extents': self._extents,\n          'points': self._point_blob,\n          'symmetry': self._symmetry,\n          'gt_boxes': gt_boxes,\n          'im_info': im_info,\n          'vertex_targets': vertex_targets,\n          'vertex_weights': vertex_weights}\n'''\n\ndef train(train_loader, background_loader, network, optimizer, epoch):\n\n    batch_time = AverageMeter()\n    losses = AverageMeter()\n\n    epoch_size = len(train_loader)\n    enum_background = enumerate(background_loader)\n    pixel_mean = torch.from_numpy(cfg.PIXEL_MEANS.transpose(2, 0, 1) / 255.0).float()\n\n    # switch to train mode\n    network.train()\n\n    for i, sample in enumerate(train_loader):\n\n        end = time.time()\n\n        # prepare data\n        inputs = sample['image_color'].cuda()\n        im_info = sample['im_info']\n        mask = sample['mask'].cuda()\n        labels = sample['label'].cuda()\n        meta_data = sample['meta_data'].cuda()\n        extents = sample['extents'][0, :, :].repeat(cfg.TRAIN.GPUNUM, 1, 1).cuda()\n        gt_boxes = sample['gt_boxes'].cuda()\n        poses = sample['poses'].cuda()\n        points = sample['points'][0, :, :, :].repeat(cfg.TRAIN.GPUNUM, 1, 1, 1).cuda()\n        symmetry = sample['symmetry'][0, :].repeat(cfg.TRAIN.GPUNUM, 1).cuda()\n\n        if cfg.TRAIN.VERTEX_REG:\n            vertex_targets = sample['vertex_targets'].cuda()\n            vertex_weights = sample['vertex_weights'].cuda()\n        else:\n            vertex_targets = []\n            vertex_weights = []\n\n        # add background\n        try:\n            _, background = next(enum_background)\n        except:\n            enum_background = enumerate(background_loader)\n            _, background = next(enum_background)\n\n        if inputs.size(0) != background['background_color'].size(0):\n            enum_background = enumerate(background_loader)\n            _, background = next(enum_background)\n\n        background_color = background['background_color'].cuda()\n        for j in range(inputs.size(0)):\n            is_syn = im_info[j, -1]\n            if is_syn or np.random.rand(1) > 0.5:\n                inputs[j] = mask[j] * inputs[j] + (1 - mask[j]) * background_color[j]\n\n        # visualization\n        if cfg.TRAIN.VISUALIZE:\n            _vis_minibatch(inputs, background, labels, vertex_targets, sample, train_loader.dataset.class_colors)\n\n        # compute output\n        if cfg.TRAIN.VERTEX_REG:\n            if cfg.TRAIN.POSE_REG:\n                out_logsoftmax, out_weight, out_vertex, out_logsoftmax_box, \\\n                    bbox_labels, bbox_pred, bbox_targets, bbox_inside_weights, loss_pose_tensor, poses_weight \\\n                    = network(inputs, labels, meta_data, extents, gt_boxes, poses, points, symmetry)\n\n                loss_label = loss_cross_entropy(out_logsoftmax, out_weight)\n                loss_vertex = cfg.TRAIN.VERTEX_W * smooth_l1_loss(out_vertex, vertex_targets, vertex_weights)\n                loss_box = loss_cross_entropy(out_logsoftmax_box, bbox_labels)\n                loss_location = smooth_l1_loss(bbox_pred, bbox_targets, bbox_inside_weights)\n                loss_pose = torch.mean(loss_pose_tensor)\n                loss = loss_label + loss_vertex + loss_box + loss_location + loss_pose\n            else:\n                out_logsoftmax, out_weight, out_vertex, out_logsoftmax_box, \\\n                    bbox_labels, bbox_pred, bbox_targets, bbox_inside_weights \\\n                    = network(inputs, labels, meta_data, extents, gt_boxes, poses, points, symmetry)\n\n                loss_label = loss_cross_entropy(out_logsoftmax, out_weight)\n                loss_vertex = cfg.TRAIN.VERTEX_W * smooth_l1_loss(out_vertex, vertex_targets, vertex_weights)\n                loss_box = loss_cross_entropy(out_logsoftmax_box, bbox_labels)\n                loss_location = smooth_l1_loss(bbox_pred, bbox_targets, bbox_inside_weights)\n                loss = loss_label + loss_vertex + loss_box + loss_location\n        else:\n            out_logsoftmax, out_weight = network(inputs, labels, meta_data, extents, gt_boxes, poses, points, symmetry)\n            loss = loss_cross_entropy(out_logsoftmax, out_weight)\n\n        # record loss\n        losses.update(loss.data, inputs.size(0))\n\n        # compute gradient and do optimization step\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n\n        # measure elapsed time\n        batch_time.update(time.time() - end)\n\n        if cfg.TRAIN.VERTEX_REG:\n            if cfg.TRAIN.POSE_REG:\n                num_bg = torch.sum(bbox_labels[:, 0])\n                num_fg = torch.sum(torch.sum(bbox_labels[:, 1:], dim=1))\n                num_fg_pose = torch.sum(torch.sum(poses_weight[:, 4:], dim=1)) / 4\n                print('[%d/%d][%d/%d], %.4f, label %.4f, center %.4f, box %.4f (%03d, %03d), loc %.4f, pose %.4f (%03d), lr %.6f, time %.2f' \\\n                   % (epoch, cfg.epochs, i, epoch_size, loss.data, loss_label.data, loss_vertex.data, loss_box.data, num_fg.data, num_bg.data, \\\n                      loss_location.data, loss_pose.data, num_fg_pose, optimizer.param_groups[0]['lr'], batch_time.val))\n            else:\n                num_bg = torch.sum(bbox_labels[:, 0])\n                num_fg = torch.sum(torch.sum(bbox_labels[:, 1:], dim=1))\n                print('[%d/%d][%d/%d], %.4f, label %.4f, center %.4f, box %.4f (%03d, %03d), loc %.4f, lr %.6f, time %.2f' \\\n                   % (epoch, cfg.epochs, i, epoch_size, loss.data, loss_label.data, loss_vertex.data, loss_box.data, num_fg.data, num_bg.data, \\\n                      loss_location.data, optimizer.param_groups[0]['lr'], batch_time.val))\n        else:\n            print('[%d/%d][%d/%d], loss %.4f, lr %.6f, time %.2f' \\\n               % (epoch, cfg.epochs, i, epoch_size, loss, optimizer.param_groups[0]['lr'], batch_time.val))\n        cfg.TRAIN.ITERS += 1\n\n\ndef _get_bb3D(extent):\n    bb = np.zeros((3, 8), dtype=np.float32)\n    \n    xHalf = extent[0] * 0.5\n    yHalf = extent[1] * 0.5\n    zHalf = extent[2] * 0.5\n    \n    bb[:, 0] = [xHalf, yHalf, zHalf]\n    bb[:, 1] = [-xHalf, yHalf, zHalf]\n    bb[:, 2] = [xHalf, -yHalf, zHalf]\n    bb[:, 3] = [-xHalf, -yHalf, zHalf]\n    bb[:, 4] = [xHalf, yHalf, -zHalf]\n    bb[:, 5] = [-xHalf, yHalf, -zHalf]\n    bb[:, 6] = [xHalf, -yHalf, -zHalf]\n    bb[:, 7] = [-xHalf, -yHalf, -zHalf]\n    \n    return bb\n\n\ndef _vis_minibatch(inputs, background, labels, vertex_targets, sample, class_colors):\n\n    \"\"\"Visualize a mini-batch for debugging.\"\"\"\n    import matplotlib.pyplot as plt\n\n    im_blob = inputs.cpu().numpy()\n    label_blob = labels.cpu().numpy()\n    gt_poses = sample['poses'].numpy()\n    meta_data_blob = sample['meta_data'].numpy()\n    gt_boxes = sample['gt_boxes'].numpy()\n    extents = sample['extents'][0, :, :].numpy()\n    background_color = background['background_color'].numpy()\n\n    if cfg.TRAIN.VERTEX_REG:\n        vertex_target_blob = vertex_targets.cpu().numpy()\n\n    if cfg.INPUT == 'COLOR':\n        m = 3\n        n = 3\n    else:\n        m = 3\n        n = 4\n    \n    for i in range(im_blob.shape[0]):\n        fig = plt.figure()\n        start = 1\n\n        metadata = meta_data_blob[i, :]\n        intrinsic_matrix = metadata[:9].reshape((3,3))\n\n        # show image\n        if cfg.INPUT == 'COLOR' or cfg.INPUT == 'RGBD':\n            if cfg.INPUT == 'COLOR':\n                im = im_blob[i, :, :, :].copy()\n            else:\n                im = im_blob[i, :3, :, :].copy()\n            im = im.transpose((1, 2, 0)) * 255.0\n            im += cfg.PIXEL_MEANS\n            im = im[:, :, (2, 1, 0)]\n            im = np.clip(im, 0, 255)\n            im = im.astype(np.uint8)\n            ax = fig.add_subplot(m, n, 1)\n            plt.imshow(im)\n            ax.set_title('color')\n            start += 1\n\n        if cfg.INPUT == 'DEPTH' or cfg.INPUT == 'RGBD':\n            if cfg.INPUT == 'DEPTH':\n                im_depth = im_blob[i, :, :, :].copy()\n            else:\n                im_depth = im_blob[i, 3:6, :, :].copy()\n\n            ax = fig.add_subplot(m, n, start)\n            plt.imshow(im_depth[0, :, :])\n            ax.set_title('depth x')\n            start += 1\n\n            ax = fig.add_subplot(m, n, start)\n            plt.imshow(im_depth[1, :, :])\n            ax.set_title('depth y')\n            start += 1\n\n            ax = fig.add_subplot(m, n, start)\n            plt.imshow(im_depth[2, :, :])\n            ax.set_title('depth z')\n            start += 1\n\n            if cfg.INPUT == 'RGBD':\n                ax = fig.add_subplot(m, n, start)\n                mask = im_blob[i, 6, :, :].copy()\n                plt.imshow(mask)\n                ax.set_title('depth mask')\n                start += 1\n\n        # project the 3D box to image\n        pose_blob = gt_poses[i]\n        for j in range(pose_blob.shape[0]):\n            if pose_blob[j, 0] == 0:\n                continue\n\n            class_id = int(pose_blob[j, 1])\n            bb3d = _get_bb3D(extents[class_id, :])\n            x3d = np.ones((4, 8), dtype=np.float32)\n            x3d[0:3, :] = bb3d\n            \n            # projection\n            RT = np.zeros((3, 4), dtype=np.float32)\n\n            # allocentric to egocentric\n            T = pose_blob[j, 6:]\n            qt = allocentric2egocentric(pose_blob[j, 2:6], T)\n            RT[:3, :3] = quat2mat(qt)\n\n            # RT[:3, :3] = quat2mat(pose_blob[j, 2:6])\n            RT[:, 3] = pose_blob[j, 6:]\n            x2d = np.matmul(intrinsic_matrix, np.matmul(RT, x3d))\n            x2d[0, :] = np.divide(x2d[0, :], x2d[2, :])\n            x2d[1, :] = np.divide(x2d[1, :], x2d[2, :])\n\n            x1 = np.min(x2d[0, :])\n            x2 = np.max(x2d[0, :])\n            y1 = np.min(x2d[1, :])\n            y2 = np.max(x2d[1, :])\n            plt.gca().add_patch(plt.Rectangle((x1, y1), x2-x1, y2-y1, fill=False, edgecolor='g', linewidth=3, clip_on=False))\n\n        if cfg.INPUT == 'COLOR' or cfg.INPUT == 'RGBD':\n            im_background = background_color[i]\n            im_background = im_background.transpose((1, 2, 0)) * 255.0\n            im_background += cfg.PIXEL_MEANS\n            im_background = im_background[:, :, (2, 1, 0)]\n            im_background = np.clip(im_background, 0, 255)\n            im_background = im_background.astype(np.uint8)\n            ax = fig.add_subplot(m, n, start)\n            plt.imshow(im_background)\n            ax.set_title('background')\n            start += 1\n\n        # show gt boxes\n        ax = fig.add_subplot(m, n, start)\n        start += 1\n        if cfg.INPUT == 'COLOR' or cfg.INPUT == 'RGBD':\n            plt.imshow(im)\n        else:\n            plt.imshow(im_depth[2, :, :])\n        ax.set_title('gt boxes')\n        boxes = gt_boxes[i]\n        for j in range(boxes.shape[0]):\n            if boxes[j, 4] == 0:\n                continue\n            x1 = boxes[j, 0]\n            y1 = boxes[j, 1]\n            x2 = boxes[j, 2]\n            y2 = boxes[j, 3]\n            plt.gca().add_patch(\n                plt.Rectangle((x1, y1), x2-x1, y2-y1, fill=False, edgecolor='g', linewidth=3, clip_on=False))\n\n        # show label\n        label = label_blob[i, :, :, :]\n        label = label.transpose((1, 2, 0))\n\n        height = label.shape[0]\n        width = label.shape[1]\n        num_classes = label.shape[2]\n        im_label = np.zeros((height, width, 3), dtype=np.uint8)\n        for j in range(num_classes):\n            I = np.where(label[:, :, j] > 0)\n            im_label[I[0], I[1], :] = class_colors[j]\n\n        ax = fig.add_subplot(m, n, start)\n        start += 1\n        plt.imshow(im_label)\n        ax.set_title('label')\n\n        # show vertex targets\n        if cfg.TRAIN.VERTEX_REG:\n            vertex_target = vertex_target_blob[i, :, :, :]\n            center = np.zeros((3, height, width), dtype=np.float32)\n\n            for j in range(1, num_classes):\n                index = np.where(label[:, :, j] > 0)\n                if len(index[0]) > 0:\n                    center[0, index[0], index[1]] = vertex_target[3*j, index[0], index[1]]\n                    center[1, index[0], index[1]] = vertex_target[3*j+1, index[0], index[1]]\n                    center[2, index[0], index[1]] = np.exp(vertex_target[3*j+2, index[0], index[1]])\n\n            ax = fig.add_subplot(m, n, start)\n            start += 1\n            plt.imshow(center[0,:,:])\n            ax.set_title('center x') \n\n            ax = fig.add_subplot(m, n, start)\n            start += 1\n            plt.imshow(center[1,:,:])\n            ax.set_title('center y')\n\n            ax = fig.add_subplot(m, n, start)\n            start += 1\n            plt.imshow(center[2,:,:])\n            ax.set_title('z')\n\n        plt.show()\n"
  },
  {
    "path": "lib/layers/ROIAlign_cuda.cu",
    "content": "// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.\n#include <ATen/ATen.h>\n#include <ATen/cuda/CUDAContext.h>\n\n#include <THC/THC.h>\n#include <THC/THCAtomics.cuh>\n#include <THC/THCDeviceUtils.cuh>\n\n// TODO make it in a common file\n#define CUDA_1D_KERNEL_LOOP(i, n)                            \\\n  for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \\\n       i += blockDim.x * gridDim.x)\n\n\ntemplate <typename T>\n__device__ T bilinear_interpolate(const T* bottom_data,\n    const int height, const int width,\n    T y, T x,\n    const int index /* index for debug only*/) {\n\n  // deal with cases that inverse elements are out of feature map boundary\n  if (y < -1.0 || y > height || x < -1.0 || x > width) {\n    //empty\n    /*\n    if (x < -1.0 && y < -1.0)\n      return bottom_data[0];\n\n    if (x < -1.0 && y < height)\n    {\n      int yy = (int)y;\n      return bottom_data[yy * width];\n    }\n\n    if (x < -1.0 && y > height)\n      return bottom_data[(height - 1) * width];\n\n    if (x < width && y > height)\n    {\n      int xx = (int)x;\n      return bottom_data[(height - 1) * width + xx];\n    }\n\n    if (x > width && y > height)\n      return bottom_data[(height - 1) * width + width - 1];\n\n    if (x > width && y < -1.0)\n      return bottom_data[width - 1];\n\n    if (x > width && y < height)\n    {\n      int yy = (int)y;\n      return bottom_data[yy * width + width - 1];\n    }\n\n    if (x < width && y < -1.0)\n    {\n      int xx = (int)x;\n      return bottom_data[xx];\n    }\n    */\n    return 0;\n  }\n\n  if (y <= 0) y = 0;\n  if (x <= 0) x = 0;\n\n  int y_low = (int) y;\n  int x_low = (int) x;\n  int y_high;\n  int x_high;\n\n  if (y_low >= height - 1) {\n    y_high = y_low = height - 1;\n    y = (T) y_low;\n  } else {\n    y_high = y_low + 1;\n  }\n\n  if (x_low >= width - 1) {\n    x_high = x_low = width - 1;\n    x = (T) x_low;\n  } else {\n    x_high = x_low + 1;\n  }\n\n  T ly = y - y_low;\n  T lx = x - x_low;\n  T hy = 1. - ly, hx = 1. - lx;\n  // do bilinear interpolation\n  T v1 = bottom_data[y_low * width + x_low];\n  T v2 = bottom_data[y_low * width + x_high];\n  T v3 = bottom_data[y_high * width + x_low];\n  T v4 = bottom_data[y_high * width + x_high];\n  T w1 = hy * hx, w2 = hy * lx, w3 = ly * hx, w4 = ly * lx;\n\n  T val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4);\n\n  return val;\n}\n\ntemplate <typename T>\n__global__ void RoIAlignForward(const int nthreads, const T* bottom_data,\n    const T spatial_scale, const int channels,\n    const int height, const int width,\n    const int pooled_height, const int pooled_width,\n    const int sampling_ratio,\n    const T* bottom_rois, T* top_data) {\n  CUDA_1D_KERNEL_LOOP(index, nthreads) {\n    // (n, c, ph, pw) is an element in the pooled output\n    int pw = index % pooled_width;\n    int ph = (index / pooled_width) % pooled_height;\n    int c = (index / pooled_width / pooled_height) % channels;\n    int n = index / pooled_width / pooled_height / channels;\n\n    const T* offset_bottom_rois = bottom_rois + n * 5;\n    int roi_batch_ind = offset_bottom_rois[0];\n\n    // Do not using rounding; this implementation detail is critical\n    T roi_start_w = offset_bottom_rois[1] * spatial_scale;\n    T roi_start_h = offset_bottom_rois[2] * spatial_scale;\n    T roi_end_w = offset_bottom_rois[3] * spatial_scale;\n    T roi_end_h = offset_bottom_rois[4] * spatial_scale;\n    // T roi_start_w = round(offset_bottom_rois[1] * spatial_scale);\n    // T roi_start_h = round(offset_bottom_rois[2] * spatial_scale);\n    // T roi_end_w = round(offset_bottom_rois[3] * spatial_scale);\n    // T roi_end_h = round(offset_bottom_rois[4] * spatial_scale);\n\n    // Force malformed ROIs to be 1x1\n    T roi_width = max(roi_end_w - roi_start_w, (T)1.);\n    T roi_height = max(roi_end_h - roi_start_h, (T)1.);\n    T bin_size_h = static_cast<T>(roi_height) / static_cast<T>(pooled_height);\n    T bin_size_w = static_cast<T>(roi_width) / static_cast<T>(pooled_width);\n\n    const T* offset_bottom_data = bottom_data + (roi_batch_ind * channels + c) * height * width;\n\n    // We use roi_bin_grid to sample the grid and mimic integral\n    int roi_bin_grid_h = (sampling_ratio > 0) ? sampling_ratio : ceil(roi_height / pooled_height); // e.g., = 2\n    int roi_bin_grid_w = (sampling_ratio > 0) ? sampling_ratio : ceil(roi_width / pooled_width);\n\n    // We do average (integral) pooling inside a bin\n    const T count = roi_bin_grid_h * roi_bin_grid_w; // e.g. = 4\n\n    T output_val = 0.;\n    for (int iy = 0; iy < roi_bin_grid_h; iy ++) // e.g., iy = 0, 1\n    {\n      const T y = roi_start_h + ph * bin_size_h + static_cast<T>(iy + .5f) * bin_size_h / static_cast<T>(roi_bin_grid_h); // e.g., 0.5, 1.5\n      for (int ix = 0; ix < roi_bin_grid_w; ix ++)\n      {\n        const T x = roi_start_w + pw * bin_size_w + static_cast<T>(ix + .5f) * bin_size_w / static_cast<T>(roi_bin_grid_w);\n\n        T val = bilinear_interpolate(offset_bottom_data, height, width, y, x, index);\n        output_val += val;\n      }\n    }\n    output_val /= count;\n\n    top_data[index] = output_val;\n  }\n}\n\n\ntemplate <typename T>\n__device__ void bilinear_interpolate_gradient(\n    const int height, const int width,\n    T y, T x,\n    T & w1, T & w2, T & w3, T & w4,\n    int & x_low, int & x_high, int & y_low, int & y_high,\n    const int index /* index for debug only*/) {\n\n  // deal with cases that inverse elements are out of feature map boundary\n  if (y < -1.0 || y > height || x < -1.0 || x > width) {\n    //empty\n    w1 = w2 = w3 = w4 = 0.;\n    x_low = x_high = y_low = y_high = -1;\n    return;\n  }\n\n  if (y <= 0) y = 0;\n  if (x <= 0) x = 0;\n\n  y_low = (int) y;\n  x_low = (int) x;\n\n  if (y_low >= height - 1) {\n    y_high = y_low = height - 1;\n    y = (T) y_low;\n  } else {\n    y_high = y_low + 1;\n  }\n\n  if (x_low >= width - 1) {\n    x_high = x_low = width - 1;\n    x = (T) x_low;\n  } else {\n    x_high = x_low + 1;\n  }\n\n  T ly = y - y_low;\n  T lx = x - x_low;\n  T hy = 1. - ly, hx = 1. - lx;\n\n  // reference in forward\n  // T v1 = bottom_data[y_low * width + x_low];\n  // T v2 = bottom_data[y_low * width + x_high];\n  // T v3 = bottom_data[y_high * width + x_low];\n  // T v4 = bottom_data[y_high * width + x_high];\n  // T val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4);\n\n  w1 = hy * hx, w2 = hy * lx, w3 = ly * hx, w4 = ly * lx;\n\n  return;\n}\n\ntemplate <typename T>\n__global__ void RoIAlignBackwardFeature(const int nthreads, const T* top_diff,\n    const int num_rois, const T spatial_scale,\n    const int channels, const int height, const int width,\n    const int pooled_height, const int pooled_width,\n    const int sampling_ratio,\n    T* bottom_diff,\n    const T* bottom_rois) {\n  CUDA_1D_KERNEL_LOOP(index, nthreads) {\n    // (n, c, ph, pw) is an element in the pooled output\n    int pw = index % pooled_width;\n    int ph = (index / pooled_width) % pooled_height;\n    int c = (index / pooled_width / pooled_height) % channels;\n    int n = index / pooled_width / pooled_height / channels;\n\n    const T* offset_bottom_rois = bottom_rois + n * 5;\n    int roi_batch_ind = offset_bottom_rois[0];\n\n    // Do not using rounding; this implementation detail is critical\n    T roi_start_w = offset_bottom_rois[1] * spatial_scale;\n    T roi_start_h = offset_bottom_rois[2] * spatial_scale;\n    T roi_end_w = offset_bottom_rois[3] * spatial_scale;\n    T roi_end_h = offset_bottom_rois[4] * spatial_scale;\n    // T roi_start_w = round(offset_bottom_rois[1] * spatial_scale);\n    // T roi_start_h = round(offset_bottom_rois[2] * spatial_scale);\n    // T roi_end_w = round(offset_bottom_rois[3] * spatial_scale);\n    // T roi_end_h = round(offset_bottom_rois[4] * spatial_scale);\n\n    // Force malformed ROIs to be 1x1\n    T roi_width = max(roi_end_w - roi_start_w, (T)1.);\n    T roi_height = max(roi_end_h - roi_start_h, (T)1.);\n    T bin_size_h = static_cast<T>(roi_height) / static_cast<T>(pooled_height);\n    T bin_size_w = static_cast<T>(roi_width) / static_cast<T>(pooled_width);\n\n    T* offset_bottom_diff = bottom_diff + (roi_batch_ind * channels + c) * height * width;\n\n    int top_offset    = (n * channels + c) * pooled_height * pooled_width;\n    const T* offset_top_diff = top_diff + top_offset;\n    const T top_diff_this_bin = offset_top_diff[ph * pooled_width + pw];\n\n    // We use roi_bin_grid to sample the grid and mimic integral\n    int roi_bin_grid_h = (sampling_ratio > 0) ? sampling_ratio : ceil(roi_height / pooled_height); // e.g., = 2\n    int roi_bin_grid_w = (sampling_ratio > 0) ? sampling_ratio : ceil(roi_width / pooled_width);\n\n    // We do average (integral) pooling inside a bin\n    const T count = roi_bin_grid_h * roi_bin_grid_w; // e.g. = 4\n\n    for (int iy = 0; iy < roi_bin_grid_h; iy ++) // e.g., iy = 0, 1\n    {\n      const T y = roi_start_h + ph * bin_size_h + static_cast<T>(iy + .5f) * bin_size_h / static_cast<T>(roi_bin_grid_h); // e.g., 0.5, 1.5\n      for (int ix = 0; ix < roi_bin_grid_w; ix ++)\n      {\n        const T x = roi_start_w + pw * bin_size_w + static_cast<T>(ix + .5f) * bin_size_w / static_cast<T>(roi_bin_grid_w);\n\n        T w1, w2, w3, w4;\n        int x_low, x_high, y_low, y_high;\n\n        bilinear_interpolate_gradient(height, width, y, x,\n            w1, w2, w3, w4,\n            x_low, x_high, y_low, y_high,\n            index);\n\n        T g1 = top_diff_this_bin * w1 / count;\n        T g2 = top_diff_this_bin * w2 / count;\n        T g3 = top_diff_this_bin * w3 / count;\n        T g4 = top_diff_this_bin * w4 / count;\n\n        if (x_low >= 0 && x_high >= 0 && y_low >= 0 && y_high >= 0)\n        {\n          atomicAdd(offset_bottom_diff + y_low * width + x_low, static_cast<T>(g1));\n          atomicAdd(offset_bottom_diff + y_low * width + x_high, static_cast<T>(g2));\n          atomicAdd(offset_bottom_diff + y_high * width + x_low, static_cast<T>(g3));\n          atomicAdd(offset_bottom_diff + y_high * width + x_high, static_cast<T>(g4));\n        } // if\n      } // ix\n    } // iy\n  } // CUDA_1D_KERNEL_LOOP\n} // RoIAlignBackward\n\n\nat::Tensor ROIAlign_forward_cuda(const at::Tensor& input,\n                                 const at::Tensor& rois,\n                                 const float spatial_scale,\n                                 const int pooled_height,\n                                 const int pooled_width,\n                                 const int sampling_ratio) {\n  AT_ASSERTM(input.type().is_cuda(), \"input must be a CUDA tensor\");\n  AT_ASSERTM(rois.type().is_cuda(), \"rois must be a CUDA tensor\");\n\n  auto num_rois = rois.size(0);\n  auto channels = input.size(1);\n  auto height = input.size(2);\n  auto width = input.size(3);\n\n  auto output = at::empty({num_rois, channels, pooled_height, pooled_width}, input.options());\n  auto output_size = num_rois * pooled_height * pooled_width * channels;\n  cudaStream_t stream = at::cuda::getCurrentCUDAStream();\n\n  dim3 grid(std::min(THCCeilDiv(output_size, 512L), 4096L));\n  dim3 block(512);\n\n  if (output.numel() == 0) {\n    THCudaCheck(cudaGetLastError());\n    return output;\n  }\n\n  AT_DISPATCH_FLOATING_TYPES(input.type(), \"ROIAlign_forward\", [&] {\n    RoIAlignForward<scalar_t><<<grid, block, 0, stream>>>(\n         output_size,\n         input.contiguous().data<scalar_t>(),\n         spatial_scale,\n         channels,\n         height,\n         width,\n         pooled_height,\n         pooled_width,\n         sampling_ratio,\n         rois.contiguous().data<scalar_t>(),\n         output.data<scalar_t>());\n  });\n  THCudaCheck(cudaGetLastError());\n  return output;\n}\n\n// TODO remove the dependency on input and use instead its sizes -> save memory\nat::Tensor ROIAlign_backward_cuda(const at::Tensor& grad,\n                                  const at::Tensor& rois,\n                                  const float spatial_scale,\n                                  const int pooled_height,\n                                  const int pooled_width,\n                                  const int batch_size,\n                                  const int channels,\n                                  const int height,\n                                  const int width,\n                                  const int sampling_ratio) {\n  AT_ASSERTM(grad.type().is_cuda(), \"grad must be a CUDA tensor\");\n  AT_ASSERTM(rois.type().is_cuda(), \"rois must be a CUDA tensor\");\n\n  auto num_rois = rois.size(0);\n  auto grad_input = at::zeros({batch_size, channels, height, width}, grad.options());\n\n  cudaStream_t stream = at::cuda::getCurrentCUDAStream();\n\n  dim3 grid(std::min(THCCeilDiv(grad.numel(), 512L), 4096L));\n  dim3 block(512);\n\n  // handle possibly empty gradients\n  if (grad.numel() == 0) {\n    THCudaCheck(cudaGetLastError());\n    return grad_input;\n  }\n\n  AT_DISPATCH_FLOATING_TYPES(grad.type(), \"ROIAlign_backward\", [&] {\n    RoIAlignBackwardFeature<scalar_t><<<grid, block, 0, stream>>>(\n         grad.numel(),\n         grad.contiguous().data<scalar_t>(),\n         num_rois,\n         spatial_scale,\n         channels,\n         height,\n         width,\n         pooled_height,\n         pooled_width,\n         sampling_ratio,\n         grad_input.data<scalar_t>(),\n         rois.contiguous().data<scalar_t>());\n  });\n  THCudaCheck(cudaGetLastError());\n  return grad_input;\n}\n"
  },
  {
    "path": "lib/layers/__init__.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n"
  },
  {
    "path": "lib/layers/backproject_kernel.cu",
    "content": "// Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n// This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n// text can be found in LICENSE.md\n\n#include <ATen/ATen.h>\n\n#include <cuda.h>\n#include <cuda_runtime.h>\n#include <thrust/device_vector.h>\n\n#include <vector>\n\n#define CUDA_1D_KERNEL_LOOP(i, n)                            \\\n  for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \\\n       i += blockDim.x * gridDim.x)\n\ntemplate <typename Dtype>\n__global__ void BackprojectForward(const int nthreads, const int width, const float fx, \n  const float fy, const float px, const float py, const Dtype* depth, Dtype* top_data)\n{\n  CUDA_1D_KERNEL_LOOP(index, nthreads) \n  {\n    int x = index % width;\n    int y = index / width;\n    Dtype d = depth[index];\n\n    top_data[3 * index + 0] = d * (x - px) / fx;\n    top_data[3 * index + 1] = d * (y - py) / fy;\n    top_data[3 * index + 2] = d;\n  }\n}\n\n\nstd::vector<at::Tensor> backproject_cuda_forward(\n    float fx, float fy, float px, float py,\n    at::Tensor depth)\n{\n  // run kernels\n  cudaError_t err;\n  const int kThreadsPerBlock = 512;\n  int output_size;\n\n  int height = depth.size(0);\n  int width = depth.size(1);\n  auto top_data = at::zeros({height, width, 3}, depth.options());\n\n  // compute the losses and gradients\n  output_size = height * width;\n  BackprojectForward<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>(\n      output_size, width, fx, fy, px, py, depth.data<float>(), top_data.data<float>());\n  cudaDeviceSynchronize();\n\n  err = cudaGetLastError();\n  if(cudaSuccess != err)\n  {\n    fprintf( stderr, \"cudaCheckError() failed: %s\\n\", cudaGetErrorString( err ) );\n    exit( -1 );\n  }\n\n  return {top_data};\n}\n"
  },
  {
    "path": "lib/layers/hard_label.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport math\nfrom torch import nn\nfrom torch.autograd import Function\nimport torch\nimport posecnn_cuda\n\n\nclass HardLabelFunction(Function):\n    @staticmethod\n    def forward(ctx, prob, label, rand, threshold, sample_percentage):\n        outputs = posecnn_cuda.hard_label_forward(threshold, sample_percentage, prob, label, rand)\n        top_data = outputs[0]\n        return top_data\n\n    @staticmethod\n    def backward(ctx, top_diff):\n        outputs = posecnn_cuda.hard_label_backward(top_diff)\n        d_prob, d_label = outputs\n        return d_prob, d_label, None, None, None\n\n\nclass HardLabel(nn.Module):\n    def __init__(self, threshold, sample_percentage):\n        super(HardLabel, self).__init__()\n        self.threshold = threshold\n        self.sample_percentage = sample_percentage\n\n    def forward(self, prob, label, rand):\n        return HardLabelFunction.apply(prob, label, rand, self.threshold, self.sample_percentage)\n"
  },
  {
    "path": "lib/layers/hard_label_kernel.cu",
    "content": "// Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n// This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n// text can be found in LICENSE.md\n\n#include <ATen/ATen.h>\n\n#include <cuda.h>\n#include <cuda_runtime.h>\n#include <thrust/device_vector.h>\n\n#include <vector>\n\n#define CUDA_1D_KERNEL_LOOP(i, n)                            \\\n  for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \\\n       i += blockDim.x * gridDim.x)\n\ntemplate <typename Dtype>\n__global__ void HardLabelForward(const int nthreads, const float threshold, const float sample_percentage,\n    const Dtype* bottom_prob, const Dtype* bottom_label, const Dtype* bottom_rand, Dtype* top_data)\n{\n  CUDA_1D_KERNEL_LOOP(index, nthreads) \n  {\n    if (bottom_label[index] > 0 && (bottom_prob[index] < threshold || bottom_rand[index] < sample_percentage))\n      top_data[index] = 1.0; \n  }\n}\n\n\nstd::vector<at::Tensor> hard_label_cuda_forward(\n    float threshold,\n    float sample_percentage,\n    at::Tensor bottom_prob,\n    at::Tensor bottom_label,\n    at::Tensor bottom_rand) \n{\n  // run kernels\n  const int kThreadsPerBlock = 1024;\n  int output_size;\n\n  if (bottom_prob.dim() == 4)\n    output_size = bottom_prob.size(0) * bottom_prob.size(1) * bottom_prob.size(2) * bottom_prob.size(3);\n  else\n    output_size = bottom_prob.size(0) * bottom_prob.size(1);\n\n  auto top_data = at::zeros(bottom_prob.sizes(), bottom_prob.options());\n\n  AT_DISPATCH_FLOATING_TYPES(bottom_prob.type(), \"hard_label_forward_cuda\", ([&] {\n\n    // compute the losses and gradients\n    HardLabelForward<scalar_t><<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>(\n        output_size,\n        threshold,\n        sample_percentage,\n        bottom_prob.data<scalar_t>(),\n        bottom_label.data<scalar_t>(),\n        bottom_rand.data<scalar_t>(),\n        top_data.data<scalar_t>());\n\n  }));\n\n  return {top_data};\n}\n\n\nstd::vector<at::Tensor> hard_label_cuda_backward(\n    at::Tensor top_diff)\n{\n  auto grad_prob = at::zeros(top_diff.sizes(), top_diff.options());\n  auto grad_label = at::zeros(top_diff.sizes(), top_diff.options());\n\n  return {grad_prob, grad_label};\n}\n"
  },
  {
    "path": "lib/layers/hough_voting.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport math\nfrom torch import nn\nfrom torch.autograd import Function\nimport torch\nimport posecnn_cuda\n\n\nclass HoughVotingFunction(Function):\n    @staticmethod\n    def forward(ctx, label, vertex, meta_data, extents, is_train, skip_pixels, \\\n            label_threshold, inlier_threshold, voting_threshold, per_threshold):\n\n        outputs = posecnn_cuda.hough_voting_forward(label, vertex, meta_data, extents, is_train, skip_pixels, \\\n            label_threshold, inlier_threshold, voting_threshold, per_threshold)\n\n        top_box = outputs[0]\n        top_pose = outputs[1]\n        return top_box, top_pose\n\n    @staticmethod\n    def backward(ctx, top_diff_box, top_diff_pose):\n        return None, None, None, None, None, None, None, None, None, None\n\n\nclass HoughVoting(nn.Module):\n    def __init__(self, is_train=0, skip_pixels=10, label_threshold=100, inlier_threshold=0.9, voting_threshold=-1, per_threshold=0.01):\n        super(HoughVoting, self).__init__()\n        self.is_train = is_train\n        self.skip_pixels = skip_pixels\n        self.label_threshold = label_threshold\n        self.inlier_threshold = inlier_threshold\n        self.voting_threshold = voting_threshold\n        self.per_threshold = per_threshold\n\n    def forward(self, label, vertex, meta_data, extents):\n        return HoughVotingFunction.apply(label, vertex, meta_data, extents, self.is_train, self.skip_pixels, \\\n            self.label_threshold, self.inlier_threshold, self.voting_threshold, self.per_threshold)\n"
  },
  {
    "path": "lib/layers/hough_voting_kernel.cu",
    "content": "// Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n// This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n// text can be found in LICENSE.md\n\n#include <ATen/ATen.h>\n\n#include <cuda.h>\n#include <cuda_runtime.h>\n\n#include <stdio.h>\n#include <cfloat>\n#include <time.h>\n#include <thrust/extrema.h>\n#include <Eigen/Geometry> \n#include <cublas_v2.h>\n\n#define VERTEX_CHANNELS 3\n#define MAX_ROI 128\n\n#define CUDA_1D_KERNEL_LOOP(i, n)                            \\\n  for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \\\n       i += blockDim.x * gridDim.x)\n\n\n__device__ inline float angle_distance(int cx, int cy, int x, int y, float u, float v)\n{\n  float dx = cx - x;\n  float dy = cy - y;\n  float n1 = sqrt(u * u + v * v);\n  float n2 = sqrt(dx * dx + dy * dy);\n  float dot = u * dx + v * dy;\n  float distance = dot / (n1 * n2);\n\n  return distance;\n}\n\n\n__device__ inline float angle_distance_label(int cx, int cy, int x, int y, float u, float v,\n  int cls, const int height, const int width, const int* labelmap)\n{\n  float dx = cx - x;\n  float dy = cy - y;\n  float n1 = sqrt(u * u + v * v);\n  float n2 = sqrt(dx * dx + dy * dy);\n  float dot = u * dx + v * dy;\n  float distance = dot / (n1 * n2);\n\n  int num = 10;\n  int count = 0;\n  for (int i = 1; i <= num; i++)\n  {\n    float step = float(i) / float(num);\n    int px = int(x + step * dx);\n    int py = int(y + step * dy);\n    if (px >= 0 && px < width && py >= 0 && py < height)\n    {\n      if (labelmap[py * width + px] == cls)\n        count++;\n    }\n  }\n  if ((float)count / float(num) < 0.5)\n    distance = 0;\n\n  return distance;\n}\n\n\n__device__ inline void project_box(int cls, const float* extents, const float* meta_data, float distance, float factor, float* threshold)\n{\n  float xHalf = extents[cls * 3 + 0] * 0.5;\n  float yHalf = extents[cls * 3 + 1] * 0.5;\n  float zHalf = extents[cls * 3 + 2] * 0.5;\n  float bb3D[24];\n\n  bb3D[0] = xHalf; bb3D[1] = yHalf; bb3D[2] = zHalf + distance;\n  bb3D[3] = -xHalf; bb3D[4] = yHalf; bb3D[5] = zHalf + distance;\n  bb3D[6] = xHalf; bb3D[7] = -yHalf; bb3D[8] = zHalf + distance;\n  bb3D[9] = -xHalf; bb3D[10] = -yHalf; bb3D[11] = zHalf + distance;\n  bb3D[12] = xHalf; bb3D[13] = yHalf; bb3D[14] = -zHalf + distance;\n  bb3D[15] = -xHalf; bb3D[16] = yHalf; bb3D[17] = -zHalf + distance;\n  bb3D[18] = xHalf; bb3D[19] = -yHalf; bb3D[20] = -zHalf + distance;\n  bb3D[21] = -xHalf; bb3D[22] = -yHalf; bb3D[23] = -zHalf + distance;\n\n  float fx = meta_data[0];\n  float fy = meta_data[4];\n  float px = meta_data[2];\n  float py = meta_data[5];\n  float minX = 1e8;\n  float maxX = -1e8;\n  float minY = 1e8;\n  float maxY = -1e8;\n  for (int i = 0; i < 8; i++)\n  {\n    float x = fx * (bb3D[i * 3] / bb3D[i * 3 + 2])  + px;\n    float y = fy * (bb3D[i * 3 + 1] / bb3D[i * 3 + 2])  + py;\n    minX = fmin(minX, x);\n    minY = fmin(minY, y);\n    maxX = fmax(maxX, x);\n    maxY = fmax(maxY, y);\n  }\n  float width = maxX - minX + 1;\n  float height = maxY - minY + 1;\n  *threshold = fmax(width, height) * factor;\n}\n\n\n__global__ void compute_arrays_kernel(const int nthreads, const int* labelmap,\n    int* arrays, int* array_size, const int height, const int width) \n{\n  CUDA_1D_KERNEL_LOOP(index, nthreads) \n  {\n    int cls = labelmap[index];\n    if (cls > 0)\n    {\n      int size = atomicAdd(array_size + cls, 1);\n      int offset = cls * height * width + size;\n      arrays[offset] = index;\n    }\n  }\n}\n\n\n__global__ void compute_hough_kernel(const int nthreads, float* hough_space, float* hough_data, \n    const int* labelmap, const float* vertmap, const float* extents, const float* meta_data, \n    int* arrays, int* array_size, int* class_indexes, const int height, const int width, \n    const int num_classes, const int count, const float inlierThreshold, const int skip_pixels) \n{\n  CUDA_1D_KERNEL_LOOP(index, nthreads) \n  {\n    // (cls, cx, cy) is an element in the hough space\n    int ind = index / (height * width);\n    int cls = class_indexes[ind];\n    int n = index % (height * width);\n    int cx = n % width;\n    int cy = n / width;\n    int size = array_size[cls];\n    float distance = 0;\n    float threshold;\n\n    for (int i = 0; i < size; i += skip_pixels)\n    {\n      int offset = cls * height * width + i;\n      int location = arrays[offset];\n      int x = location % width;\n      int y = location / width;\n\n      // read the direction\n      offset = VERTEX_CHANNELS * cls * height * width + y * width + x;\n      float u = vertmap[offset];\n      offset = VERTEX_CHANNELS * cls * height * width + height * width + y * width + x;\n      float v = vertmap[offset];\n      offset = VERTEX_CHANNELS * cls * height * width + 2 * height * width + y * width + x;\n      float d = exp(vertmap[offset]);\n\n      // vote\n      if (angle_distance_label(cx, cy, x, y, u, v, cls, height, width, labelmap) > inlierThreshold)\n      {\n        project_box(cls, extents, meta_data, d, 0.6, &threshold);\n        float dx = fabsf(x - cx);\n        float dy = fabsf(y - cy);\n        if (dx < threshold && dy < threshold)\n        {\n          hough_space[index]++;\n          distance += d;\n        }\n      }\n    }\n\n    if (hough_space[index] > 0)\n    {\n      distance /= hough_space[index];\n\n      float bb_width = -1;\n      float bb_height = -1;\n      for (int i = 0; i < size; i += skip_pixels)\n      {\n        int offset = cls * height * width + i;\n        int location = arrays[offset];\n        int x = location % width;\n        int y = location / width;\n\n        // read the direction\n        offset = VERTEX_CHANNELS * cls * height * width + y * width + x;\n        float u = vertmap[offset];\n        offset = VERTEX_CHANNELS * cls * height * width + height * width + y * width + x;\n        float v = vertmap[offset];\n\n        // vote\n        if (angle_distance_label(cx, cy, x, y, u, v, cls, height, width, labelmap) > inlierThreshold)\n        {\n          project_box(cls, extents, meta_data, distance, 0.6, &threshold);\n          float dx = fabsf(x - cx);\n          float dy = fabsf(y - cy);\n          if (dx > bb_width && dx < threshold && dy < threshold)\n            bb_width = dx;\n          if (dy > bb_height && dx < threshold && dy < threshold)\n            bb_height = dy;\n        }\n      }\n\n      int offset = ind * height * width * 3 + 3 * (cy * width + cx);\n      hough_data[offset] = distance;\n      hough_data[offset + 1] = 2 * bb_height;\n      hough_data[offset + 2] = 2 * bb_width;\n    }\n  }\n}\n\n__global__ void compute_max_indexes_kernel(const int nthreads, int* max_indexes, int index_size, int* num_max, float* hough_space, \n  float* hough_data, int height, int width, float threshold, float perThreshold, const int is_train)\n{\n  CUDA_1D_KERNEL_LOOP(index, nthreads) \n  {\n    // (ind, cx, cy) is an element in the hough space\n    int ind = index / (height * width);\n    int n = index % (height * width);\n    int cx = n % width;\n    int cy = n / width;\n    int kernel_size = 3;\n\n    int offset = ind * height * width * 3 + 3 * (cy * width + cx);\n    float bb_height = hough_data[offset + 1];\n    float bb_width = hough_data[offset + 2];\n\n    if (hough_space[index] > threshold && bb_height > 0 && bb_width > 0)\n    {\n      // check if the location is local maximum\n      int flag = 0;\n      for (int x = cx - kernel_size; x <= cx + kernel_size; x++)\n      {\n        for (int y = cy - kernel_size; y <= cy + kernel_size; y++)\n        {\n          if (x >= 0 && x < width && y >= 0 && y < height)\n          {\n            if (hough_space[ind * height * width + y * width + x] > hough_space[index])\n            {\n              flag = 1;\n              break;\n            }\n            if (is_train == 0 && hough_space[ind * height * width + y * width + x] == hough_space[index])\n            {\n              if (ind * height * width + y * width + x > index)\n              {\n                flag = 1;\n                break;\n              }\n            }\n          }\n        }\n\n        // check the percentage of voting\n        if (hough_space[index] / (bb_height * bb_width) < perThreshold)\n          flag = 1;\n      }\n\n      if (flag == 0)\n      {\n        // add the location to max_indexes\n        int max_index = atomicAdd(num_max, 1);\n        if (max_index < index_size)\n          max_indexes[max_index] = index;\n      }\n    }\n  }\n}\n\n\n__global__ void compute_rois_kernel(const int nthreads, float* top_box, float* top_pose, \n    const float* meta_data, float* hough_space, float* hough_data, int* max_indexes, int* class_indexes,\n    int batch_index, const int height, const int width, const int num_classes, int* num_rois, const int is_train) \n{\n  CUDA_1D_KERNEL_LOOP(index, nthreads) \n  {\n    float scale = 0.0;\n    int max_index = max_indexes[index];\n    int ind = max_index / (height * width);\n    int cls = class_indexes[ind];\n    int n = max_index % (height * width);\n    int x = n % width;\n    int y = n / width;\n\n    float fx = meta_data[0];\n    float fy = meta_data[4];\n    float px = meta_data[2];\n    float py = meta_data[5];\n    float rx = (x - px) / fx;\n    float ry = (y - py) / fy;\n\n    int offset = ind * height * width * 3 + 3 * (y * width + x);\n    float bb_distance = hough_data[offset];\n    float bb_height = hough_data[offset + 1];\n    float bb_width = hough_data[offset + 2];\n\n    if (is_train)\n    {\n      int roi_index = atomicAdd(num_rois, 9);\n      top_box[roi_index * 7 + 0] = batch_index;\n      top_box[roi_index * 7 + 1] = cls;\n      top_box[roi_index * 7 + 2] = x - bb_width * (0.5 + scale);\n      top_box[roi_index * 7 + 3] = y - bb_height * (0.5 + scale);\n      top_box[roi_index * 7 + 4] = x + bb_width * (0.5 + scale);\n      top_box[roi_index * 7 + 5] = y + bb_height * (0.5 + scale);\n      top_box[roi_index * 7 + 6] = hough_space[max_index];\n\n      for (int j = 0; j < 9; j++)\n      {\n        top_pose[(roi_index + j) * 7 + 0] = 1;\n        top_pose[(roi_index + j) * 7 + 1] = 0;\n        top_pose[(roi_index + j) * 7 + 2] = 0;\n        top_pose[(roi_index + j) * 7 + 3] = 0;\n        top_pose[(roi_index + j) * 7 + 4] = rx;\n        top_pose[(roi_index + j) * 7 + 5] = ry;\n        top_pose[(roi_index + j) * 7 + 6] = bb_distance;\n      }\n\n      // add jittering boxes\n      float x1 = top_box[roi_index * 7 + 2];\n      float y1 = top_box[roi_index * 7 + 3];\n      float x2 = top_box[roi_index * 7 + 4];\n      float y2 = top_box[roi_index * 7 + 5];\n      float ww = x2 - x1;\n      float hh = y2 - y1;\n\n      // (-1, -1)\n      roi_index++;\n      top_box[roi_index * 7 + 0] = batch_index;\n      top_box[roi_index * 7 + 1] = cls;\n      top_box[roi_index * 7 + 2] = x1 - 0.05 * ww;\n      top_box[roi_index * 7 + 3] = y1 - 0.05 * hh;\n      top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww;\n      top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh;\n      top_box[roi_index * 7 + 6] = hough_space[max_index];\n\n      // (+1, -1)\n      roi_index++;\n      top_box[roi_index * 7 + 0] = batch_index;\n      top_box[roi_index * 7 + 1] = cls;\n      top_box[roi_index * 7 + 2] = x1 + 0.05 * ww;\n      top_box[roi_index * 7 + 3] = y1 - 0.05 * hh;\n      top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww;\n      top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh;\n      top_box[roi_index * 7 + 6] = hough_space[max_index];\n\n      // (-1, +1)\n      roi_index++;\n      top_box[roi_index * 7 + 0] = batch_index;\n      top_box[roi_index * 7 + 1] = cls;\n      top_box[roi_index * 7 + 2] = x1 - 0.05 * ww;\n      top_box[roi_index * 7 + 3] = y1 + 0.05 * hh;\n      top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww;\n      top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh;\n      top_box[roi_index * 7 + 6] = hough_space[max_index];\n\n      // (+1, +1)\n      roi_index++;\n      top_box[roi_index * 7 + 0] = batch_index;\n      top_box[roi_index * 7 + 1] = cls;\n      top_box[roi_index * 7 + 2] = x1 + 0.05 * ww;\n      top_box[roi_index * 7 + 3] = y1 + 0.05 * hh;\n      top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww;\n      top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh;\n      top_box[roi_index * 7 + 6] = hough_space[max_index];\n\n      // (0, -1)\n      roi_index++;\n      top_box[roi_index * 7 + 0] = batch_index;\n      top_box[roi_index * 7 + 1] = cls;\n      top_box[roi_index * 7 + 2] = x1;\n      top_box[roi_index * 7 + 3] = y1 - 0.05 * hh;\n      top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww;\n      top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh;\n      top_box[roi_index * 7 + 6] = hough_space[max_index];\n\n      // (-1, 0)\n      roi_index++;\n      top_box[roi_index * 7 + 0] = batch_index;\n      top_box[roi_index * 7 + 1] = cls;\n      top_box[roi_index * 7 + 2] = x1 - 0.05 * ww;\n      top_box[roi_index * 7 + 3] = y1;\n      top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww;\n      top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh;\n      top_box[roi_index * 7 + 6] = hough_space[max_index];\n\n      // (0, +1)\n      roi_index++;\n      top_box[roi_index * 7 + 0] = batch_index;\n      top_box[roi_index * 7 + 1] = cls;\n      top_box[roi_index * 7 + 2] = x1;\n      top_box[roi_index * 7 + 3] = y1 + 0.05 * hh;\n      top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww;\n      top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh;\n      top_box[roi_index * 7 + 6] = hough_space[max_index];\n\n      // (+1, 0)\n      roi_index++;\n      top_box[roi_index * 7 + 0] = batch_index;\n      top_box[roi_index * 7 + 1] = cls;\n      top_box[roi_index * 7 + 2] = x1 + 0.05 * ww;\n      top_box[roi_index * 7 + 3] = y1;\n      top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww;\n      top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh;\n      top_box[roi_index * 7 + 6] = hough_space[max_index];\n    }\n    else\n    {\n      int roi_index = atomicAdd(num_rois, 1);\n      top_box[roi_index * 7 + 0] = batch_index;\n      top_box[roi_index * 7 + 1] = cls;\n      top_box[roi_index * 7 + 2] = x - bb_width * (0.5 + scale);\n      top_box[roi_index * 7 + 3] = y - bb_height * (0.5 + scale);\n      top_box[roi_index * 7 + 4] = x + bb_width * (0.5 + scale);\n      top_box[roi_index * 7 + 5] = y + bb_height * (0.5 + scale);\n      top_box[roi_index * 7 + 6] = hough_space[max_index];\n\n      top_pose[roi_index * 7 + 0] = 1;\n      top_pose[roi_index * 7 + 1] = 0;\n      top_pose[roi_index * 7 + 2] = 0;\n      top_pose[roi_index * 7 + 3] = 0;\n      top_pose[roi_index * 7 + 4] = rx;\n      top_pose[roi_index * 7 + 5] = ry;\n      top_pose[roi_index * 7 + 6] = bb_distance;\n    }\n  }\n}\n\n\nstd::vector<at::Tensor> hough_voting_cuda_forward(\n    at::Tensor bottom_label,\n    at::Tensor bottom_vertex,\n    at::Tensor bottom_meta_data,\n    at::Tensor extents,\n    int is_train,\n    int skip_pixels,\n    int labelThreshold,\n    float inlierThreshold,\n    float votingThreshold,\n    float perThreshold)\n{\n  const int kThreadsPerBlock = 1024;\n  int output_size;\n  cudaError_t err;\n\n  const int batch_size = bottom_vertex.size(0);\n  const int num_classes = bottom_vertex.size(1) / VERTEX_CHANNELS;\n  const int height = bottom_vertex.size(2);\n  const int width = bottom_vertex.size(3);\n  const int num_meta_data = bottom_meta_data.size(1);\n  const int index_size = MAX_ROI / batch_size;\n\n  auto top_box = at::zeros({MAX_ROI * 9, 7}, bottom_vertex.options());\n  auto top_pose = at::zeros({MAX_ROI * 9, 7}, bottom_vertex.options());\n  auto num_rois = at::zeros({1}, bottom_label.options());\n\n  for (int batch_index = 0; batch_index < batch_size; batch_index++)\n  {\n    const int* labelmap = bottom_label.data<int>() + batch_index * height * width;\n    const float* vertmap = bottom_vertex.data<float>() + batch_index * height * width * VERTEX_CHANNELS * num_classes;\n    const float* meta_data = bottom_meta_data.data<float>() + batch_index * num_meta_data;\n\n    // step 1: compute a label index array for each class\n    auto arrays = at::zeros({num_classes, height * width}, bottom_label.options());\n    auto array_sizes = at::zeros({num_classes}, bottom_label.options());\n    output_size = height * width;\n    compute_arrays_kernel<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>(\n      output_size, labelmap, arrays.data<int>(), array_sizes.data<int>(), height, width);\n    cudaThreadSynchronize();\n\n    // compute class indexes\n    int* array_sizes_host = (int*)malloc(num_classes * sizeof(int));\n    int* class_indexes_host = (int*)malloc(num_classes * sizeof(int));\n    cudaMemcpy(array_sizes_host, array_sizes.data<int>(), num_classes * sizeof(int), cudaMemcpyDeviceToHost);\n    int count = 0;\n    for (int c = 1; c < num_classes; c++)\n    {\n      if (array_sizes_host[c] > labelThreshold)\n      {\n        class_indexes_host[count] = c;\n        count++;\n      }\n      // else\n      //  printf(\"class %d with only pixels %d\\n\", c, array_sizes_host[c]);\n    }\n\n    if (count == 0)\n    {\n      free(array_sizes_host);\n      free(class_indexes_host);\n      continue;\n    }\n\n    auto class_indexes = at::zeros({count}, bottom_label.options());\n    cudaMemcpy(class_indexes.data<int>(), class_indexes_host, count * sizeof(int), cudaMemcpyHostToDevice);\n    err = cudaGetLastError();\n    if(cudaSuccess != err)\n    {\n      fprintf( stderr, \"cudaCheckError() failed compute label index: %s\\n\", cudaGetErrorString( err ) );\n      exit( -1 );\n    }\n\n    // step 2: compute the hough space\n    auto hough_space = at::zeros({count, height, width}, bottom_vertex.options());\n    auto hough_data = at::zeros({count, height, width, 3}, bottom_vertex.options());\n\n    output_size = count * height * width;\n    compute_hough_kernel<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>(\n      output_size, hough_space.data<float>(), hough_data.data<float>(), labelmap, vertmap, extents.data<float>(), meta_data,\n      arrays.data<int>(), array_sizes.data<int>(), class_indexes.data<int>(), height, width, num_classes, count, inlierThreshold, skip_pixels);\n    cudaThreadSynchronize();\n\n    err = cudaGetLastError();\n    if(cudaSuccess != err)\n    {\n      fprintf( stderr, \"cudaCheckError() failed compute hough space: %s\\n\", cudaGetErrorString( err ) );\n      exit( -1 );\n    }\n\n    // step 3: find the maximum in hough space\n    auto num_max = at::zeros({1}, bottom_label.options());\n    auto max_indexes = at::zeros({index_size}, bottom_label.options());\n\n    if (votingThreshold > 0)\n    {\n      output_size = count * height * width;\n      compute_max_indexes_kernel<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>(\n        output_size, max_indexes.data<int>(), index_size, num_max.data<int>(), \n        hough_space.data<float>(), hough_data.data<float>(), height, width, votingThreshold, perThreshold, is_train);\n      cudaThreadSynchronize();\n    }\n    else\n    {\n      int* max_indexes_host = (int*)malloc(count * sizeof(int));\n      memset(max_indexes_host, 0, count * sizeof(int));\n      for (int i = 0; i < count; i++)\n      {\n        float *hmax = thrust::max_element(thrust::device, hough_space.data<float>() + i * height * width, \n                                          hough_space.data<float>() + (i+1) * height * width);\n        max_indexes_host[i] = hmax - hough_space.data<float>();\n      }\n      cudaMemcpy(num_max.data<int>(), &count, sizeof(int), cudaMemcpyHostToDevice);\n      cudaMemcpy(max_indexes.data<int>(), max_indexes_host, count * sizeof(int), cudaMemcpyHostToDevice);\n      free(max_indexes_host);\n    }\n\n    err = cudaGetLastError();\n    if(cudaSuccess != err)\n    {\n      fprintf( stderr, \"cudaCheckError() failed compute maximum: %s\\n\", cudaGetErrorString( err ) );\n      exit( -1 );\n    }\n\n    // step 4: compute outputs\n    int num_max_host;\n    cudaMemcpy(&num_max_host, num_max.data<int>(), sizeof(int), cudaMemcpyDeviceToHost);\n    if (num_max_host >= index_size)\n    {\n      printf(\"hough voting num_max: %d exceeds capacity %d\\n\", num_max_host, index_size);\n      num_max_host = index_size;\n    }\n    if (num_max_host > 0)\n    {\n      output_size = num_max_host;\n      compute_rois_kernel<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>(\n        output_size, top_box.data<float>(), top_pose.data<float>(), meta_data, hough_space.data<float>(),\n        hough_data.data<float>(), max_indexes.data<int>(), class_indexes.data<int>(),\n        batch_index, height, width, num_classes, num_rois.data<int>(), is_train);\n      cudaThreadSynchronize();\n    }\n  \n    // clean up\n    free(array_sizes_host);\n    free(class_indexes_host);\n\n    err = cudaGetLastError();\n    if(cudaSuccess != err)\n    {\n      fprintf( stderr, \"cudaCheckError() failed compute outputs: %s\\n\", cudaGetErrorString( err ) );\n      exit( -1 );\n    }\n  }\n\n  // copy outputs\n  int num_rois_host;\n  cudaMemcpy(&num_rois_host, num_rois.data<int>(), sizeof(int), cudaMemcpyDeviceToHost);\n  if (num_rois_host == 0)\n    num_rois_host = 1;\n  auto top_box_final = at::zeros({num_rois_host, 7}, bottom_vertex.options());\n  auto top_pose_final = at::zeros({num_rois_host, 7}, bottom_vertex.options());\n  cudaMemcpy(top_box_final.data<float>(), top_box.data<float>(), num_rois_host * 7 * sizeof(float), cudaMemcpyDeviceToDevice);\n  cudaMemcpy(top_pose_final.data<float>(), top_pose.data<float>(), num_rois_host * 7 * sizeof(float), cudaMemcpyDeviceToDevice);\n\n  return {top_box_final, top_pose_final};\n}\n"
  },
  {
    "path": "lib/layers/point_matching_loss.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport math\nfrom torch import nn\nfrom torch.autograd import Function\nimport torch\nimport posecnn_cuda\n\nclass PMLossFunction(Function):\n    @staticmethod\n    def forward(ctx, prediction, target, weight, points, symmetry, hard_angle):\n        outputs = posecnn_cuda.pml_forward(prediction, target, weight, points, symmetry, hard_angle)\n        loss = outputs[0]\n        variables = outputs[1:]\n        ctx.save_for_backward(*variables)\n\n        return loss\n\n    @staticmethod\n    def backward(ctx, grad_loss):\n        outputs = posecnn_cuda.pml_backward(grad_loss, *ctx.saved_variables)\n        d_rotation = outputs[0]\n\n        return d_rotation, None, None, None, None, None\n\n\nclass PMLoss(nn.Module):\n    def __init__(self, hard_angle=15):\n        super(PMLoss, self).__init__()\n        self.hard_angle = hard_angle\n\n    def forward(self, prediction, target, weight, points, symmetry):\n        return PMLossFunction.apply(prediction, target, weight, points, symmetry, self.hard_angle)\n"
  },
  {
    "path": "lib/layers/point_matching_loss_kernel.cu",
    "content": "// Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n// This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n// text can be found in LICENSE.md\n\n#include <ATen/ATen.h>\n\n#include <cuda.h>\n#include <cuda_runtime.h>\n#include <thrust/device_vector.h>\n\n#include <vector>\n\n#define CUDA_1D_KERNEL_LOOP(i, n)                            \\\n  for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \\\n       i += blockDim.x * gridDim.x)\n\n#define POSE_CHANNELS 4\n\ntemplate <typename Dtype>\n__global__ void AveragedistanceForward(const int nthreads, const Dtype* prediction, const Dtype* target,\n    const Dtype* weight, const Dtype* point, const Dtype* symmetry, const int batch_size, const int num_classes, \n    const int num_points, const float hard_angle, Dtype* rotations, Dtype* losses, Dtype* diffs, Dtype* angles_batch) \n{\n  CUDA_1D_KERNEL_LOOP(index_thread, nthreads) \n  {\n    // batch index\n    int n = index_thread / num_points;\n    int p = index_thread % num_points;\n\n    // find the class label and pose of this object\n    int index_cls = -1, ind;\n    Dtype s, u, v, w;\n    for (int i = 0; i < POSE_CHANNELS * num_classes; i += POSE_CHANNELS)\n    {\n      int index = n * POSE_CHANNELS * num_classes + i;\n      if (weight[index] > 0)\n      {\n        index_cls = i / POSE_CHANNELS;\n\n        // gt quaternion\n        s = target[index + 0];\n        u = target[index + 1];\n        v = target[index + 2];\n        w = target[index + 3];\n\n        // gt rotation matrix\n        ind = n * num_points * 6 * 9 + p * 6 * 9;\n        rotations[ind + 0] = s * s + u * u - v * v - w * w;\n        rotations[ind + 1] = 2 * (u * v - s * w);\n        rotations[ind + 2] = 2 * (u * w + s * v);\n        rotations[ind + 3] = 2 * (u * v + s * w);\n        rotations[ind + 4] = s * s - u * u + v * v - w * w;\n        rotations[ind + 5] = 2 * (v * w - s * u);\n        rotations[ind + 6] = 2 * (u * w - s * v);\n        rotations[ind + 7] = 2 * (v * w + s * u);\n        rotations[ind + 8] = s * s - u * u - v * v + w * w;\n\n        // predicted quaternion\n        s = prediction[index + 0];\n        u = prediction[index + 1];\n        v = prediction[index + 2];\n        w = prediction[index + 3];\n\n        // predicted rotation matrix\n        ind = n * num_points * 6 * 9 + p * 6 * 9 + 9;\n        rotations[ind + 0] = s * s + u * u - v * v - w * w;\n        rotations[ind + 1] = 2 * (u * v - s * w);\n        rotations[ind + 2] = 2 * (u * w + s * v);\n        rotations[ind + 3] = 2 * (u * v + s * w);\n        rotations[ind + 4] = s * s - u * u + v * v - w * w;\n        rotations[ind + 5] = 2 * (v * w - s * u);\n        rotations[ind + 6] = 2 * (u * w - s * v);\n        rotations[ind + 7] = 2 * (v * w + s * u);\n        rotations[ind + 8] = s * s - u * u - v * v + w * w;\n\n        // compute the angular distance between quarternions\n        if (p == 0)\n        {\n          Dtype d = target[index + 0] * prediction[index + 0] + target[index + 1] * prediction[index + 1] \n                  + target[index + 2] * prediction[index + 2] + target[index + 3] * prediction[index + 3];\n          Dtype angle = acos(2 * d * d - 1) * 180.0 / 3.14159265;\n          if (angle > hard_angle)\n            angles_batch[n] = 1.0;\n        }\n\n        break;\n      }\n    }\n    if (index_cls == -1)\n      continue;\n\n    // derivatives of Ru to quaternion\n    ind = n * num_points * 6 * 9 + p * 6 * 9 + 18;\n    rotations[ind + 0] = 2 * s;\n    rotations[ind + 1] = -2 * w;\n    rotations[ind + 2] = 2 * v;\n    rotations[ind + 3] = 2 * w;\n    rotations[ind + 4] = 2 * s;\n    rotations[ind + 5] = -2 * u;\n    rotations[ind + 6] = -2 * v;\n    rotations[ind + 7] = 2 * u;\n    rotations[ind + 8] = 2 * s;\n\n    ind = n * num_points * 6 * 9 + p * 6 * 9 + 27;\n    rotations[ind + 0] = 2 * u;\n    rotations[ind + 1] = 2 * v;\n    rotations[ind + 2] = 2 * w;\n    rotations[ind + 3] = 2 * v;\n    rotations[ind + 4] = -2 * u;\n    rotations[ind + 5] = -2 * s;\n    rotations[ind + 6] = 2 * w;\n    rotations[ind + 7] = 2 * s;\n    rotations[ind + 8] = -2 * u;\n\n    ind = n * num_points * 6 * 9 + p * 6 * 9 + 36;\n    rotations[ind + 0] = -2 * v;\n    rotations[ind + 1] = 2 * u;\n    rotations[ind + 2] = 2 * s;\n    rotations[ind + 3] = 2 * u;\n    rotations[ind + 4] = 2 * v;\n    rotations[ind + 5] = 2 * w;\n    rotations[ind + 6] = -2 * s;\n    rotations[ind + 7] = 2 * w;\n    rotations[ind + 8] = -2 * v;\n\n    ind = n * num_points * 6 * 9 + p * 6 * 9 + 45;\n    rotations[ind + 0] = -2 * w;\n    rotations[ind + 1] = -2 * s;\n    rotations[ind + 2] = 2 * u;\n    rotations[ind + 3] = 2 * s;\n    rotations[ind + 4] = -2 * w;\n    rotations[ind + 5] = 2 * v;\n    rotations[ind + 6] = 2 * u;\n    rotations[ind + 7] = 2 * v;\n    rotations[ind + 8] = 2 * w;\n\n    // for the point\n    int index = index_cls * num_points * 3 + p * 3;\n    ind = n * num_points * 6 * 9 + p * 6 * 9;\n\n    // rotate the first point\n    Dtype x1 = rotations[ind + 9 + 0] * point[index + 0] + rotations[ind + 9 + 1] * point[index + 1] + rotations[ind + 9 + 2] * point[index + 2];\n    Dtype y1 = rotations[ind + 9 + 3] * point[index + 0] + rotations[ind + 9 + 4] * point[index + 1] + rotations[ind + 9 + 5] * point[index + 2];\n    Dtype z1 = rotations[ind + 9 + 6] * point[index + 0] + rotations[ind + 9 + 7] * point[index + 1] + rotations[ind + 9 + 8] * point[index + 2];\n\n    int index_min;\n    Dtype x2, y2, z2;\n    if (symmetry[index_cls] > 0)\n    {\n      // find the closet point for symmetry object\n      Dtype dmin = FLT_MAX;\n      for (int i = 0; i < num_points; i++)\n      {\n        int index2 = index_cls * num_points * 3 + i * 3;\n        x2 = rotations[ind + 0] * point[index2 + 0] + rotations[ind + 1] * point[index2 + 1] + rotations[ind + 2] * point[index2 + 2];\n        y2 = rotations[ind + 3] * point[index2 + 0] + rotations[ind + 4] * point[index2 + 1] + rotations[ind + 5] * point[index2 + 2];\n        z2 = rotations[ind + 6] * point[index2 + 0] + rotations[ind + 7] * point[index2 + 1] + rotations[ind + 8] * point[index2 + 2];\n        Dtype distance = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2);\n        if (distance < dmin)\n        {\n          dmin = distance;\n          index_min = index2;\n        }\n      }\n    }\n    else\n      index_min = index;\n\n    x2 = rotations[ind + 0] * point[index_min + 0] + rotations[ind + 1] * point[index_min + 1] + rotations[ind + 2] * point[index_min + 2];\n    y2 = rotations[ind + 3] * point[index_min + 0] + rotations[ind + 4] * point[index_min + 1] + rotations[ind + 5] * point[index_min + 2];\n    z2 = rotations[ind + 6] * point[index_min + 0] + rotations[ind + 7] * point[index_min + 1] + rotations[ind + 8] * point[index_min + 2];    \n\n    // smooth l1 loss\n    Dtype distance = 0;\n    int index_diff = n * num_points * POSE_CHANNELS * num_classes + p * POSE_CHANNELS * num_classes + POSE_CHANNELS * index_cls;\n    for (int j = 0; j < 3; j++)\n    {\n      Dtype diff, df;\n      if (j == 0)\n        diff = x1 - x2;\n      else if (j == 1)\n        diff = y1 - y2;\n      else\n        diff = z1 - z2;\n\n      if (fabs(diff) < 1)\n      {\n        distance += 0.5 * diff * diff;\n        df = diff;\n      }\n      else\n      {\n        distance += fabs(diff) - 0.5;\n        if (diff > 0)\n          df = 1.0;\n        else\n          df = -1.0;\n      }\n\n      for (int k = 0; k < 3; k++)\n      {\n        ind = n * num_points * 6 * 9 + p * 6 * 9 + 18;\n        diffs[index_diff + 0] += df * point[index + k] * rotations[ind + j * 3 + k] / num_points;\n        ind = n * num_points * 6 * 9 + p * 6 * 9 + 27;\n        diffs[index_diff + 1] += df * point[index + k] * rotations[ind + j * 3 + k] / num_points;\n        ind = n * num_points * 6 * 9 + p * 6 * 9 + 36;\n        diffs[index_diff + 2] += df * point[index + k] * rotations[ind + j * 3 + k] / num_points;\n        ind = n * num_points * 6 * 9 + p * 6 * 9 + 45;\n        diffs[index_diff + 3] += df * point[index + k] * rotations[ind + j * 3 + k] / num_points;\n      }\n    }\n    losses[index_thread] = distance / num_points;\n  }\n}\n\n\n\ntemplate <typename Dtype>\n__global__ void sum_losses_gradients(const int nthreads, const Dtype* losses, const Dtype* diffs, \n    const int num_classes, const int num_points, const float batch_hard, Dtype* angles, Dtype* loss_batch, Dtype* bottom_diff) \n{\n  CUDA_1D_KERNEL_LOOP(index, nthreads) \n  {\n    int n = index / (POSE_CHANNELS * num_classes);\n    int c = index % (POSE_CHANNELS * num_classes);\n\n    bottom_diff[index] = 0;\n    if (angles[n] > 0)\n    {\n      for (int p = 0; p < num_points; p++)\n      {\n        int index_diff = n * num_points * POSE_CHANNELS * num_classes + p * POSE_CHANNELS * num_classes + c;\n        bottom_diff[index] += diffs[index_diff] / batch_hard;\n      }\n    }\n\n    if (c == 0)\n    {\n      loss_batch[n] = 0;\n      if (angles[n] > 0)\n      {\n        for (int p = 0; p < num_points; p++)\n          loss_batch[n] += losses[n * num_points + p] / batch_hard;\n      }\n    }\n  }\n}\n\n\nstd::vector<at::Tensor> pml_cuda_forward(\n    at::Tensor bottom_prediction,\n    at::Tensor bottom_target,\n    at::Tensor bottom_weight,\n    at::Tensor points,\n    at::Tensor symmetry,\n    float hard_angle) \n{\n  // run kernels\n  cudaError_t err;\n  const int kThreadsPerBlock = 512;\n  int output_size;\n\n  // temp losses\n  const int batch_size = bottom_prediction.size(0);\n  const int num_classes = points.size(1);\n  const int num_points = points.size(2); \n\n  auto losses = at::zeros({batch_size, num_points}, points.options());\n  auto losses_batch = at::zeros({batch_size}, points.options());\n  auto angles_batch = at::zeros({batch_size}, points.options());\n  auto top_data = at::zeros({1}, points.options());\n\n  // temp diffs\n  auto diffs = at::zeros({batch_size, num_points, POSE_CHANNELS * num_classes}, points.options());\n  auto bottom_diff = at::zeros({batch_size, POSE_CHANNELS * num_classes}, points.options());\n\n  // temp rotations\n  auto rotations = at::zeros({batch_size, num_points, 6 * 9}, points.options());\n\n  // compute the losses and gradients\n  output_size = batch_size * num_points;\n  AveragedistanceForward<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>(\n      output_size, bottom_prediction.data<float>(), bottom_target.data<float>(), bottom_weight.data<float>(), \n      points.data<float>(), symmetry.data<float>(), \n      batch_size, num_classes, num_points, hard_angle, rotations.data<float>(), losses.data<float>(), diffs.data<float>(), angles_batch.data<float>());\n  cudaDeviceSynchronize();\n\n  // sum the angle flags\n  thrust::device_ptr<float> angles_ptr(angles_batch.data<float>());\n  float batch_hard = thrust::reduce(angles_ptr, angles_ptr + batch_size);\n\n  err = cudaGetLastError();\n  if(cudaSuccess != err)\n  {\n    fprintf( stderr, \"cudaCheckError() failed: %s\\n\", cudaGetErrorString( err ) );\n    exit( -1 );\n  }\n\n  // sum the diffs\n  output_size = batch_size * POSE_CHANNELS * num_classes;\n  sum_losses_gradients<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>(\n      output_size, losses.data<float>(), diffs.data<float>(), num_classes, \n      num_points, batch_hard, angles_batch.data<float>(), losses_batch.data<float>(), bottom_diff.data<float>());\n  cudaDeviceSynchronize();\n\n  // sum the loss\n  thrust::device_ptr<float> losses_ptr(losses_batch.data<float>());\n  float loss = thrust::reduce(losses_ptr, losses_ptr + batch_size);\n  cudaMemcpy(top_data.data<float>(), &loss, sizeof(float), cudaMemcpyHostToDevice);\n\n  err = cudaGetLastError();\n  if(cudaSuccess != err)\n  {\n    fprintf( stderr, \"cudaCheckError() failed: %s\\n\", cudaGetErrorString( err ) );\n    exit( -1 );\n  }\n\n  return {top_data, bottom_diff};\n}\n\n\ntemplate <typename Dtype>\n__global__ void AveragedistanceBackward(const int nthreads, const Dtype* top_diff,\n    const Dtype* bottom_diff, Dtype* output) \n{\n  CUDA_1D_KERNEL_LOOP(index, nthreads) \n  {\n    output[index] = top_diff[0] * bottom_diff[index];\n  }\n}\n\n\nstd::vector<at::Tensor> pml_cuda_backward(\n    at::Tensor grad_loss,\n    at::Tensor bottom_diff)\n{\n  cudaError_t err;\n  const int kThreadsPerBlock = 512;\n  int output_size;\n  const int batch_size = bottom_diff.size(0);\n  const int num_classes = bottom_diff.size(1) / POSE_CHANNELS;\n  auto grad_rotation = at::zeros({batch_size, POSE_CHANNELS * num_classes}, bottom_diff.options());\n\n  output_size = batch_size * POSE_CHANNELS * num_classes;\n  AveragedistanceBackward<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>(\n      output_size, grad_loss.data<float>(), bottom_diff.data<float>(), grad_rotation.data<float>());\n\n  cudaDeviceSynchronize();\n  err = cudaGetLastError();\n  if(cudaSuccess != err)\n  {\n    fprintf( stderr, \"cudaCheckError() failed : %s\\n\", cudaGetErrorString( err ) );\n    exit( -1 );\n  }\n\n  return {grad_rotation};\n}\n"
  },
  {
    "path": "lib/layers/pose_target_layer.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport torch\nimport numpy as np\nfrom fcn.config import cfg\nfrom utils.bbox_transform import bbox_transform_inv\nfrom utils.cython_bbox import bbox_overlaps\n\n# rpn_rois: (batch_ids, cls, x1, y1, x2, y2, scores)\n# gt_boxes: batch * num_classes * (x1, y1, x2, y2, cls)\ndef pose_target_layer(rois, bbox_prob, bbox_pred, gt_boxes, poses, is_training):\n\n    rois = rois.detach().cpu().numpy()\n    bbox_prob = bbox_prob.detach().cpu().numpy()\n    bbox_pred = bbox_pred.detach().cpu().numpy()\n    gt_boxes = gt_boxes.detach().cpu().numpy()\n    num_classes = bbox_prob.shape[1]\n  \n    # process boxes\n    if cfg.TRAIN.BBOX_NORMALIZE_TARGETS_PRECOMPUTED:\n        stds = np.tile(np.array(cfg.TRAIN.BBOX_NORMALIZE_STDS), (num_classes))\n        means = np.tile(np.array(cfg.TRAIN.BBOX_NORMALIZE_MEANS), (num_classes))\n        bbox_pred *= stds\n        bbox_pred += means\n\n    boxes = rois[:, 2:6].copy()\n    pred_boxes = bbox_transform_inv(boxes, bbox_pred)\n\n    # assign boxes\n    for i in range(rois.shape[0]):\n        cls = int(rois[i, 1])\n        rois[i, 2:6] = pred_boxes[i, cls*4:cls*4+4]\n        rois[i, 6] = bbox_prob[i, cls]\n\n    # convert boxes to (batch_ids, x1, y1, x2, y2, cls)\n    roi_blob = rois[:, (0, 2, 3, 4, 5, 1)]\n    gt_box_blob = np.zeros((0, 6), dtype=np.float32)\n    pose_blob = np.zeros((0, 9), dtype=np.float32)\n    for i in range(gt_boxes.shape[0]):\n        for j in range(gt_boxes.shape[1]):\n            if gt_boxes[i, j, -1] > 0:\n                gt_box = np.zeros((1, 6), dtype=np.float32)\n                gt_box[0, 0] = i\n                gt_box[0, 1:5] = gt_boxes[i, j, :4]\n                gt_box[0, 5] = gt_boxes[i, j, 4]\n                gt_box_blob = np.concatenate((gt_box_blob, gt_box), axis=0)\n                poses[i, j, 0] = i\n                pose_blob = np.concatenate((pose_blob, poses[i, j, :].cpu().reshape(1, 9)), axis=0)\n\n    if gt_box_blob.shape[0] == 0:\n        num = rois.shape[0]\n        poses_target = np.zeros((num, 4 * num_classes), dtype=np.float32)\n        poses_weight = np.zeros((num, 4 * num_classes), dtype=np.float32)\n    else:\n        # overlaps: (rois x gt_boxes)\n        overlaps = bbox_overlaps(\n            np.ascontiguousarray(roi_blob[:, :5], dtype=np.float),\n            np.ascontiguousarray(gt_box_blob[:, :5], dtype=np.float))\n\n        gt_assignment = overlaps.argmax(axis=1)\n        max_overlaps = overlaps.max(axis=1)\n        labels = gt_box_blob[gt_assignment, 5]\n        quaternions = pose_blob[gt_assignment, 2:6]\n\n        # Select foreground RoIs as those with >= FG_THRESH overlap\n        bg_inds = np.where(max_overlaps < cfg.TRAIN.FG_THRESH_POSE)[0]\n        labels[bg_inds] = 0\n\n        bg_inds = np.where(roi_blob[:, -1] != labels)[0]\n        labels[bg_inds] = 0\n\n        # in training, only use the positive boxes for pose regression\n        if is_training:\n            fg_inds = np.where(labels > 0)[0]\n            if len(fg_inds) > 0:\n                rois = rois[fg_inds, :]\n                quaternions = quaternions[fg_inds, :]\n                labels = labels[fg_inds]\n    \n        # pose regression targets and weights\n        poses_target, poses_weight = _compute_pose_targets(quaternions, labels, num_classes)\n\n    return torch.from_numpy(rois).cuda(), torch.from_numpy(poses_target).cuda(), torch.from_numpy(poses_weight).cuda()\n\n\ndef _compute_pose_targets(quaternions, labels, num_classes):\n    \"\"\"Compute pose regression targets for an image.\"\"\"\n\n    num = quaternions.shape[0]\n    poses_target = np.zeros((num, 4 * num_classes), dtype=np.float32)\n    poses_weight = np.zeros((num, 4 * num_classes), dtype=np.float32)\n\n    for i in range(num):\n        cls = labels[i]\n        if cls > 0 and np.linalg.norm(quaternions[i, :]) > 0:\n            start = int(4 * cls)\n            end = start + 4\n            poses_target[i, start:end] = quaternions[i, :]\n            poses_weight[i, start:end] = 1.0\n\n    return poses_target, poses_weight\n"
  },
  {
    "path": "lib/layers/posecnn_layers.cpp",
    "content": "// Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n// This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n// text can be found in LICENSE.md\n\n#include <torch/torch.h>\n#include <ATen/ATen.h>\n#include <ATen/cuda/CUDAContext.h>\n#include <vector>\n#include <cuda_runtime.h>\n\n#define CHECK_CUDA(x) AT_ASSERT(x.type().is_cuda())\n#define CHECK_CONTIGUOUS(x) AT_ASSERT(x.is_contiguous())\n#define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)\n\n\n/************************************************************\n backproject depth to 3D points\n*************************************************************/\n\nstd::vector<at::Tensor> backproject_cuda_forward(\n    float fx, float fy, float px, float py,\n    at::Tensor depth);\n\nstd::vector<at::Tensor> backproject_forward(\n    float fx, float fy, float px, float py,\n    at::Tensor depth)\n{\n  CHECK_INPUT(depth);\n\n  return backproject_cuda_forward(fx, fy, px, py, depth);\n}\n\n\n/************************************************************\n hard label layer\n*************************************************************/\nstd::vector<at::Tensor> hard_label_cuda_forward(\n    float threshold,\n    float sample_percentage,\n    at::Tensor bottom_prob,\n    at::Tensor bottom_label,\n    at::Tensor bottom_rand);\n\nstd::vector<at::Tensor> hard_label_cuda_backward(\n    at::Tensor top_diff);\n\nstd::vector<at::Tensor> hard_label_forward(\n    float threshold,\n    float sample_percentage,\n    at::Tensor bottom_prob,\n    at::Tensor bottom_label,\n    at::Tensor bottom_rand)\n{\n  CHECK_INPUT(bottom_prob);\n  CHECK_INPUT(bottom_label);\n  CHECK_INPUT(bottom_rand);\n\n  return hard_label_cuda_forward(threshold, sample_percentage, bottom_prob, bottom_label, bottom_rand);\n}\n\nstd::vector<at::Tensor> hard_label_backward(\n    at::Tensor top_diff) {\n  CHECK_INPUT(top_diff);\n\n  return hard_label_cuda_backward(top_diff);\n}\n\n\n/************************************************************\n hough voting layer\n*************************************************************/\nstd::vector<at::Tensor> hough_voting_cuda_forward(\n    at::Tensor bottom_label,\n    at::Tensor bottom_verex,\n    at::Tensor meta_data,\n    at::Tensor extents,\n    int is_train,\n    int skip_pixels,\n    int labelThreshold,\n    float inlierThreshold,\n    float votingThreshold,\n    float perThreshold);\n\nstd::vector<at::Tensor> hough_voting_forward(\n    at::Tensor bottom_label,\n    at::Tensor bottom_vertex,\n    at::Tensor meta_data,\n    at::Tensor extents,\n    int is_train,\n    int skip_pixels,\n    int labelThreshold,\n    float inlierThreshold,\n    float votingThreshold,\n    float perThreshold)\n{\n  CHECK_INPUT(bottom_label);\n  CHECK_INPUT(bottom_vertex);\n  CHECK_INPUT(extents);\n  CHECK_INPUT(meta_data);\n\n  return hough_voting_cuda_forward(bottom_label, bottom_vertex, meta_data, extents, \n    is_train, skip_pixels, labelThreshold, inlierThreshold, votingThreshold, perThreshold);\n}\n\n\n/************************************************************\n roi pool layer\n*************************************************************/\nstd::vector<at::Tensor> roi_pool_cuda_forward(\n    int pooled_height,\n    int pooled_width,\n    float spatial_scale,\n    at::Tensor bottom_features,\n    at::Tensor bottom_rois);\n\nstd::vector<at::Tensor> roi_pool_cuda_backward(\n    int batch_size,\n    int height,\n    int width,\n    float spatial_scale,\n    at::Tensor top_diff,\n    at::Tensor bottom_rois,\n    at::Tensor argmax_data);\n\nstd::vector<at::Tensor> roi_pool_forward(\n    int pooled_height,\n    int pooled_width,\n    float spatial_scale,\n    at::Tensor bottom_features,\n    at::Tensor bottom_rois)\n{\n  CHECK_INPUT(bottom_features);\n  CHECK_INPUT(bottom_rois);\n\n  return roi_pool_cuda_forward(pooled_height, pooled_width, spatial_scale, bottom_features, bottom_rois);\n}\n\nstd::vector<at::Tensor> roi_pool_backward(\n    int batch_size,\n    int height,\n    int width,\n    float spatial_scale,\n    at::Tensor top_diff,\n    at::Tensor bottom_rois,\n    at::Tensor argmax_data) \n{\n  CHECK_INPUT(top_diff);\n  CHECK_INPUT(bottom_rois);\n  CHECK_INPUT(argmax_data);\n\n  return roi_pool_cuda_backward(batch_size, height, width, spatial_scale, top_diff, bottom_rois, argmax_data);\n}\n\n\n/************************************************************\n roi align layer\n*************************************************************/\n\nat::Tensor ROIAlign_forward_cuda(const at::Tensor& input,\n                                 const at::Tensor& rois,\n                                 const float spatial_scale,\n                                 const int pooled_height,\n                                 const int pooled_width,\n                                 const int sampling_ratio);\n\nat::Tensor ROIAlign_backward_cuda(const at::Tensor& grad,\n                                  const at::Tensor& rois,\n                                  const float spatial_scale,\n                                  const int pooled_height,\n                                  const int pooled_width,\n                                  const int batch_size,\n                                  const int channels,\n                                  const int height,\n                                  const int width,\n                                  const int sampling_ratio);\n\n// Interface for Python\nat::Tensor ROIAlign_forward(const at::Tensor& input,\n                            const at::Tensor& rois,\n                            const float spatial_scale,\n                            const int pooled_height,\n                            const int pooled_width,\n                            const int sampling_ratio) \n{\n  return ROIAlign_forward_cuda(input, rois, spatial_scale, pooled_height, pooled_width, sampling_ratio);\n}\n\nat::Tensor ROIAlign_backward(const at::Tensor& grad,\n                             const at::Tensor& rois,\n                             const float spatial_scale,\n                             const int pooled_height,\n                             const int pooled_width,\n                             const int batch_size,\n                             const int channels,\n                             const int height,\n                             const int width,\n                             const int sampling_ratio)\n{\n  return ROIAlign_backward_cuda(grad, rois, spatial_scale, pooled_height, pooled_width, batch_size, channels, height, width, sampling_ratio);\n}\n\n\n/************************************************************\n point matching loss layer\n*************************************************************/\n\nstd::vector<at::Tensor> pml_cuda_forward(\n    at::Tensor bottom_prediction,\n    at::Tensor bottom_target,\n    at::Tensor bottom_weight,\n    at::Tensor points,\n    at::Tensor symmetry,\n    float hard_angle);\n\nstd::vector<at::Tensor> pml_cuda_backward(\n    at::Tensor grad_loss,\n    at::Tensor bottom_diff);\n\nstd::vector<at::Tensor> pml_forward(\n    at::Tensor bottom_prediction,\n    at::Tensor bottom_target,\n    at::Tensor bottom_weight,\n    at::Tensor points,\n    at::Tensor symmetry,\n    float hard_angle)\n{\n  CHECK_INPUT(bottom_prediction);\n  CHECK_INPUT(bottom_target);\n  CHECK_INPUT(bottom_weight);\n  CHECK_INPUT(points);\n  CHECK_INPUT(symmetry);\n\n  return pml_cuda_forward(bottom_prediction, bottom_target, bottom_weight, points, symmetry, hard_angle);\n}\n\nstd::vector<at::Tensor> pml_backward(\n    at::Tensor grad_loss,\n    at::Tensor bottom_diff) \n{\n  CHECK_INPUT(grad_loss);\n  CHECK_INPUT(bottom_diff);\n\n  return pml_cuda_backward(grad_loss, bottom_diff);\n}\n\n\n/************************************************************\n sdf matching loss layer\n*************************************************************/\n\nstd::vector<at::Tensor> sdf_loss_cuda_forward(\n    at::Tensor pose_delta,\n    at::Tensor pose_init,\n    at::Tensor sdf_grids,\n    at::Tensor sdf_limits,\n    at::Tensor points,\n    at::Tensor regularization);\n\nstd::vector<at::Tensor> sdf_loss_cuda_backward(\n    at::Tensor grad_loss,\n    at::Tensor bottom_diff);\n\nstd::vector<at::Tensor> sdf_loss_forward(\n    at::Tensor pose_delta,\n    at::Tensor pose_init,\n    at::Tensor sdf_grids,\n    at::Tensor sdf_limits,\n    at::Tensor points,\n    at::Tensor regularization)\n{\n  CHECK_INPUT(pose_delta);\n  CHECK_INPUT(pose_init);\n  CHECK_INPUT(sdf_grids);\n  CHECK_INPUT(sdf_limits);\n  CHECK_INPUT(points);\n  CHECK_INPUT(regularization);\n\n  return sdf_loss_cuda_forward(pose_delta, pose_init, sdf_grids, sdf_limits, points, regularization);\n}\n\nstd::vector<at::Tensor> sdf_loss_backward(\n    at::Tensor grad_loss,\n    at::Tensor bottom_diff) \n{\n  CHECK_INPUT(grad_loss);\n  CHECK_INPUT(bottom_diff);\n\n  return sdf_loss_cuda_backward(grad_loss, bottom_diff);\n}\n\n/********* python interface ***********/\n\nPYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {\n  m.def(\"backproject_forward\", &backproject_forward, \"backproject forward (CUDA)\");\n  m.def(\"hard_label_forward\", &hard_label_forward, \"hard_label forward (CUDA)\");\n  m.def(\"hard_label_backward\", &hard_label_backward, \"hard_label backward (CUDA)\");\n  m.def(\"hough_voting_forward\", &hough_voting_forward, \"hough_voting forward (CUDA)\");\n  m.def(\"roi_pool_forward\", &roi_pool_forward, \"roi_pool forward (CUDA)\");\n  m.def(\"roi_pool_backward\", &roi_pool_backward, \"roi_pool backward (CUDA)\");\n  m.def(\"roi_align_forward\", &ROIAlign_forward, \"ROIAlign_forward\");\n  m.def(\"roi_align_backward\", &ROIAlign_backward, \"ROIAlign_backward\");\n  m.def(\"pml_forward\", &pml_forward, \"pml forward (CUDA)\");\n  m.def(\"pml_backward\", &pml_backward, \"pml backward (CUDA)\");\n  m.def(\"sdf_loss_forward\", &sdf_loss_forward, \"SDF loss forward (CUDA)\");\n  m.def(\"sdf_loss_backward\", &sdf_loss_backward, \"SDF loss backward (CUDA)\");\n}\n"
  },
  {
    "path": "lib/layers/roi_align.py",
    "content": "# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.\nimport torch\nfrom torch import nn\nfrom torch.autograd import Function\nfrom torch.autograd.function import once_differentiable\nfrom torch.nn.modules.utils import _pair\nimport posecnn_cuda\n\n\nclass _ROIAlign(Function):\n    @staticmethod\n    def forward(ctx, input, roi, output_size, spatial_scale, sampling_ratio):\n        ctx.save_for_backward(roi)\n        ctx.output_size = _pair(output_size)\n        ctx.spatial_scale = spatial_scale\n        ctx.sampling_ratio = sampling_ratio\n        ctx.input_shape = input.size()\n        output = posecnn_cuda.roi_align_forward(input, roi, spatial_scale,\n                                      output_size[0], output_size[1],\n                                      sampling_ratio)\n        return output\n\n    @staticmethod\n    @once_differentiable\n    def backward(ctx, grad_output):\n        rois, = ctx.saved_tensors\n        output_size = ctx.output_size\n        spatial_scale = ctx.spatial_scale\n        sampling_ratio = ctx.sampling_ratio\n        bs, ch, h, w = ctx.input_shape\n        grad_input = posecnn_cuda.roi_align_backward(\n            grad_output,\n            rois,\n            spatial_scale,\n            output_size[0],\n            output_size[1],\n            bs,\n            ch,\n            h,\n            w,\n            sampling_ratio,\n        )\n        return grad_input, None, None, None, None\n\n\nroi_align = _ROIAlign.apply\n\n\nclass ROIAlign(nn.Module):\n    def __init__(self, output_size, spatial_scale, sampling_ratio):\n        super(ROIAlign, self).__init__()\n        self.output_size = output_size\n        self.spatial_scale = spatial_scale\n        self.sampling_ratio = sampling_ratio\n\n    def forward(self, input, rois):\n        return roi_align(input, rois, self.output_size, self.spatial_scale,\n                         self.sampling_ratio)\n\n    def __repr__(self):\n        tmpstr = self.__class__.__name__ + \"(\"\n        tmpstr += \"output_size=\" + str(self.output_size)\n        tmpstr += \", spatial_scale=\" + str(self.spatial_scale)\n        tmpstr += \", sampling_ratio=\" + str(self.sampling_ratio)\n        tmpstr += \")\"\n        return tmpstr\n"
  },
  {
    "path": "lib/layers/roi_pooling.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport math\nfrom torch import nn\nfrom torch.autograd import Function\nimport torch\nimport posecnn_cuda\n\n\nclass RoIPoolFunction(Function):\n    @staticmethod\n    def forward(ctx, features, rois, pool_height, pool_width, spatial_scale):\n        outputs = posecnn_cuda.roi_pool_forward(pool_height, pool_width, spatial_scale, features, rois)\n        top_data = outputs[0]\n        variables = outputs[1:]\n        variables.append(rois)\n        ctx.feature_size = features.size()\n        ctx.spatial_scale = spatial_scale\n        ctx.save_for_backward(*variables)\n        return top_data\n\n    @staticmethod\n    def backward(ctx, top_diff):\n        argmax_data = ctx.saved_variables[0]\n        rois = ctx.saved_variables[1]\n        batch_size, num_channels, data_height, data_width = ctx.feature_size\n        spatial_scale = ctx.spatial_scale\n        outputs = posecnn_cuda.roi_pool_backward(batch_size, data_height, data_width, spatial_scale, top_diff, rois, argmax_data)\n        d_features = outputs[0]\n        return d_features, None, None, None, None   \n\nclass RoIPool(nn.Module):\n    def __init__(self, pool_height, pool_width, spatial_scale):\n        super(RoIPool, self).__init__()\n\n        self.pool_width = int(pool_width)\n        self.pool_height = int(pool_height)\n        self.spatial_scale = float(spatial_scale)\n\n    def forward(self, features, rois):\n        return RoIPoolFunction.apply(features, rois, self.pool_height, self.pool_width, self.spatial_scale)\n"
  },
  {
    "path": "lib/layers/roi_pooling_kernel.cu",
    "content": "// Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n// This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n// text can be found in LICENSE.md\n\n#include <ATen/ATen.h>\n\n#include <cuda.h>\n#include <cuda_runtime.h>\n#include <thrust/device_vector.h>\n\n#include <vector>\n\n#define CUDA_1D_KERNEL_LOOP(i, n)                            \\\n  for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \\\n       i += blockDim.x * gridDim.x)\n\n__global__ void ROIPoolForward(const int nthreads, const float* bottom_data, const float spatial_scale, const int height, const int width,\n                               const int channels, const int channel_rois, const int pool_height, const int pool_width, \n                               const float* bottom_rois, float* top_data, float* argmax_data) \n{\n  CUDA_1D_KERNEL_LOOP(index, nthreads) \n  {\n    // (n, c, ph, pw) is an element in the pool output\n    // int n = index;\n    // int pw = n % pool_width;\n    // n /= pool_width;\n    // int ph = n % pool_height;\n    // n /= pool_height;\n    // int c = n % channels;\n    // n /= channels;\n\n    // (n, c, ph, pw) is an element in the pooled output\n    int pw = index % pool_width;\n    int ph = (index / pool_width) % pool_height;\n    int c  = (index / pool_width / pool_height) % channels;\n    int n  = index / pool_width / pool_height / channels;\n\n    float roi_batch_ind = bottom_rois[n * channel_rois + 0];\n    float roi_start_w = bottom_rois[n * channel_rois + 2] * spatial_scale;\n    float roi_start_h = bottom_rois[n * channel_rois + 3] * spatial_scale;\n    float roi_end_w = bottom_rois[n * channel_rois + 4] * spatial_scale;\n    float roi_end_h = bottom_rois[n * channel_rois + 5] * spatial_scale;\n\n    // Force malformed ROIs to be 1x1\n    int roi_width = max(roi_end_w - roi_start_w + 1, 1.0);\n    int roi_height = max(roi_end_h - roi_start_h + 1, 1.0);\n    float bin_size_h = static_cast<float>(roi_height) / static_cast<float>(pool_height);\n    float bin_size_w = static_cast<float>(roi_width) / static_cast<float>(pool_width);\n\n    int hstart = static_cast<int>(floor(static_cast<float>(ph) * bin_size_h));\n    int wstart = static_cast<int>(floor(static_cast<float>(pw) * bin_size_w));\n    int hend = static_cast<int>(ceil(static_cast<float>(ph + 1) * bin_size_h));\n    int wend = static_cast<int>(ceil(static_cast<float>(pw + 1) * bin_size_w));\n\n    // Add roi offsets and clip to input boundaries\n    hstart = min(max(int(hstart + roi_start_h), 0), height);\n    hend = min(max(int(hend + roi_start_h), 0), height);\n    wstart = min(max(int(wstart + roi_start_w), 0), width);\n    wend = min(max(int(wend + roi_start_w), 0), width);\n    bool is_empty = (hend <= hstart) || (wend <= wstart);\n\n    // Define an empty pooling region to be zero\n    float maxval = is_empty ? 0 : -FLT_MAX;\n    // If nothing is pooled, argmax = -1 causes nothing to be backprop'd\n    int maxidx = -1;\n    int offset = roi_batch_ind * channels * height * width;\n    const float* offset_bottom_data = bottom_data + offset;\n    for (int h = hstart; h < hend; ++h) \n    {\n      for (int w = wstart; w < wend; ++w) \n      {\n        int bottom_index = c * height * width + h * width + w;\n        if (offset_bottom_data[bottom_index] > maxval) {\n          maxval = offset_bottom_data[bottom_index];\n          maxidx = bottom_index;\n        }\n      }\n    }\n    top_data[index] = maxval;\n    argmax_data[index] = maxidx;\n  }\n}\n\n\nstd::vector<at::Tensor> roi_pool_cuda_forward(\n    int pool_height,\n    int pool_width,\n    float spatial_scale,\n    at::Tensor bottom_features,\n    at::Tensor bottom_rois) \n{\n  // run kernels\n  const int kThreadsPerBlock = 1024;\n  cudaError_t err;\n\n  const int batch_size = bottom_features.size(0);\n  const int num_channels = bottom_features.size(1);\n  const int height = bottom_features.size(2);\n  const int width = bottom_features.size(3);\n  const int num_rois = bottom_rois.size(0);\n  const int channel_rois = bottom_rois.size(1);\n\n  auto top_data = at::zeros({num_rois, num_channels, pool_height, pool_width}, bottom_features.options());\n  auto top_argmax = at::zeros({num_rois, num_channels, pool_height, pool_width}, bottom_features.options());\n  const int output_size = num_rois * num_channels * pool_height * pool_width;\n\n  ROIPoolForward<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>(\n    output_size, bottom_features.data<float>(), spatial_scale, height, width, num_channels, channel_rois,\n    pool_height, pool_width, bottom_rois.data<float>(), top_data.data<float>(), top_argmax.data<float>());\n\n  err = cudaGetLastError();\n  if(cudaSuccess != err) \n  {\n    fprintf( stderr, \"cudaCheckError() failed : %s\\n\", cudaGetErrorString( err ) );\n    exit( -1 );\n  }\n\n  return {top_data, top_argmax};\n}\n\n\n__global__ void ROIPoolBackward(const int nthreads, const float* top_diff, const float spatial_scale, const int height, const int width,\n                                const int num_rois, const int channels, const int channel_rois, \n                                const int pool_height, const int pool_width, float* bottom_diff, \n                                const float* bottom_rois, const float* argmax_data) \n{\n  CUDA_1D_KERNEL_LOOP(index, nthreads) \n  {\n    // (n, c, h, w) coords in bottom data\n    int w = index % width;\n    int h = (index / width) % height;\n    int c  = (index / width / height) % channels;\n    int n  = index / width / height / channels;\n\n    float gradient = 0;\n    // Accumulate gradient over all ROIs that pooled this element\n    for (int roi_n = 0; roi_n < num_rois; roi_n++)\n    {\n      const float* offset_bottom_rois = bottom_rois + roi_n * channel_rois;\n      int roi_batch_ind = int(offset_bottom_rois[0]);\n      // Skip if ROI's batch index doesn't match n\n      if (n != roi_batch_ind) \n        continue;\n\n      int roi_start_w = round(offset_bottom_rois[2] * spatial_scale);\n      int roi_start_h = round(offset_bottom_rois[3] * spatial_scale);\n      int roi_end_w = round(offset_bottom_rois[4] * spatial_scale);\n      int roi_end_h = round(offset_bottom_rois[5] * spatial_scale);\n\n      // Skip if ROI doesn't include (h, w)\n      const bool in_roi = (w >= roi_start_w && w <= roi_end_w &&\n                           h >= roi_start_h && h <= roi_end_h);\n      if (!in_roi)\n        continue;\n\n      int offset = roi_n * channels * pool_height * pool_width;\n      const float* offset_top_diff = top_diff + offset;\n      const float* offset_argmax_data = argmax_data + offset;\n\n      // Compute feasible set of pooled units that could have pooled\n      // this bottom unit\n\n      // Force malformed ROIs to be 1x1\n      int roi_width = max(roi_end_w - roi_start_w + 1, 1);\n      int roi_height = max(roi_end_h - roi_start_h + 1, 1);\n      float bin_size_h = static_cast<float>(roi_height) / static_cast<float>(pool_height);\n      float bin_size_w = static_cast<float>(roi_width) / static_cast<float>(pool_width);\n\n      int phstart = floor(static_cast<float>(h - roi_start_h) / bin_size_h);\n      int phend = ceil(static_cast<float>(h - roi_start_h + 1) / bin_size_h);\n      int pwstart = floor(static_cast<float>(w - roi_start_w) / bin_size_w);\n      int pwend = ceil(static_cast<float>(w - roi_start_w + 1) / bin_size_w);\n\n      phstart = min(max(phstart, 0), pool_height);\n      phend = min(max(phend, 0), pool_height);\n      pwstart = min(max(pwstart, 0), pool_width);\n      pwend = min(max(pwend, 0), pool_width);\n\n      for (int ph = phstart; ph < phend; ++ph) \n      {\n        for (int pw = pwstart; pw < pwend; ++pw) \n        {\n          if (int(offset_argmax_data[c * pool_height * pool_width + ph * pool_width + pw]) == c * height * width + h * width + w) \n            gradient += offset_top_diff[c * pool_height * pool_width + ph * pool_width + pw];\n        }\n      }\n    }\n    bottom_diff[index] = gradient;\n  }\n}\n\n\nstd::vector<at::Tensor> roi_pool_cuda_backward(\n    int batch_size,\n    int height,\n    int width,\n    float spatial_scale,\n    at::Tensor top_diff,\n    at::Tensor bottom_rois,\n    at::Tensor argmax_data)\n{\n  const int kThreadsPerBlock = 1024;\n  cudaError_t err;\n\n  const int num_rois = top_diff.size(0);\n  const int num_channels = top_diff.size(1);\n  const int pool_height = top_diff.size(2);\n  const int pool_width = top_diff.size(3);\n  const int channel_rois = bottom_rois.size(1);\n\n  auto bottom_diff = at::zeros({batch_size, num_channels, height, width}, top_diff.options());\n  const int output_size = batch_size * num_channels * height * width;\n\n  ROIPoolBackward<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>(\n    output_size, top_diff.data<float>(), spatial_scale, height, width, num_rois, num_channels, channel_rois,\n    pool_height, pool_width, bottom_diff.data<float>(), bottom_rois.data<float>(), argmax_data.data<float>());\n\n  err = cudaGetLastError();\n  if(cudaSuccess != err) \n  {\n    fprintf( stderr, \"cudaCheckError() failed : %s\\n\", cudaGetErrorString( err ) );\n    exit(-1);\n  }\n\n  return {bottom_diff};\n}\n"
  },
  {
    "path": "lib/layers/roi_target_layer.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nfrom __future__ import absolute_import\nfrom __future__ import division\n\nimport torch\nimport numpy as np\nimport numpy.random as npr\nfrom fcn.config import cfg\nfrom utils.bbox_transform import bbox_transform\nfrom utils.cython_bbox import bbox_overlaps\n\n# rpn_rois: (batch_ids, cls, x1, y1, x2, y2, scores)\n# gt_boxes: batch * num_classes * (x1, y1, x2, y2, cls)\ndef roi_target_layer(rpn_rois, gt_boxes):\n    \"\"\"\n    Assign object detection proposals to ground-truth targets. Produces proposal\n    classification labels and bounding-box regression targets.\n    \"\"\"\n\n    rpn_rois = rpn_rois.detach().cpu().numpy()\n    gt_boxes = gt_boxes.detach().cpu().numpy()\n    num_classes = gt_boxes.shape[1]\n\n    # convert boxes to (batch_ids, x1, y1, x2, y2, cls)\n    roi_blob = rpn_rois[:, (0, 2, 3, 4, 5, 1)]\n    gt_box_blob = np.zeros((0, 6), dtype=np.float32)\n    for i in range(gt_boxes.shape[0]):\n        for j in range(gt_boxes.shape[1]):\n            if gt_boxes[i, j, -1] > 0:\n                gt_box = np.zeros((1, 6), dtype=np.float32)\n                gt_box[0, 0] = i\n                gt_box[0, 1:5] = gt_boxes[i, j, :4]\n                gt_box[0, 5] = gt_boxes[i, j, 4]\n                gt_box_blob = np.concatenate((gt_box_blob, gt_box), axis=0)\n\n    # sample rois with classification labels and bounding box regression targets\n    labels, bbox_targets, bbox_inside_weights = _sample_rois(roi_blob, gt_box_blob, num_classes)\n    bbox_outside_weights = np.array(bbox_inside_weights > 0).astype(np.float32)\n\n    # convert labels\n    num = labels.shape[0]\n    label_blob = np.zeros((num, num_classes), dtype=np.float32)\n    if np.any(roi_blob[:, -1] > 0):\n        for i in range(num):\n            label_blob[i, int(labels[i])] = 1.0\n\n    return torch.from_numpy(label_blob).cuda(), torch.from_numpy(bbox_targets).cuda(), \\\n        torch.from_numpy(bbox_inside_weights).cuda(), torch.from_numpy(bbox_outside_weights).cuda()\n\n\ndef _get_bbox_regression_labels(bbox_target_data, num_classes):\n  \"\"\"Bounding-box regression targets (bbox_target_data) are stored in a\n  compact form N x (class, tx, ty, tw, th)\n\n  This function expands those targets into the 4-of-4*K representation used\n  by the network (i.e. only one class has non-zero targets).\n\n  Returns:\n      bbox_target (ndarray): N x 4K blob of regression targets\n      bbox_inside_weights (ndarray): N x 4K blob of loss weights\n  \"\"\"\n\n  clss = bbox_target_data[:, 0]\n  bbox_targets = np.zeros((clss.size, 4 * num_classes), dtype=np.float32)\n  bbox_inside_weights = np.zeros(bbox_targets.shape, dtype=np.float32)\n  inds = np.where(clss > 0)[0]\n  for ind in inds:\n    cls = clss[ind]\n    start = int(4 * cls)\n    end = start + 4\n    bbox_targets[ind, start:end] = bbox_target_data[ind, 1:]\n    bbox_inside_weights[ind, start:end] = cfg.TRAIN.BBOX_INSIDE_WEIGHTS\n  return bbox_targets, bbox_inside_weights\n\n\ndef _compute_targets(ex_rois, gt_rois, labels):\n  \"\"\"Compute bounding-box regression targets for an image.\"\"\"\n\n  assert ex_rois.shape[0] == gt_rois.shape[0]\n  assert ex_rois.shape[1] == 4\n  assert gt_rois.shape[1] == 4\n\n  targets = bbox_transform(ex_rois, gt_rois)\n  if cfg.TRAIN.BBOX_NORMALIZE_TARGETS_PRECOMPUTED:\n    # Optionally normalize targets by a precomputed mean and stdev\n    targets = ((targets - np.array(cfg.TRAIN.BBOX_NORMALIZE_MEANS))\n               / np.array(cfg.TRAIN.BBOX_NORMALIZE_STDS))\n  return np.hstack(\n    (labels[:, np.newaxis], targets)).astype(np.float32, copy=False)\n\n\ndef _sample_rois(all_rois, gt_boxes, num_classes):\n  \"\"\"Generate a random sample of RoIs comprising foreground and background\n  examples.\n  \"\"\"\n  # all_rois (batch_ids, x1, y1, x2, y2, cls)\n  # gt_boxes (batch_ids, x1, y1, x2, y2, cls)\n  # overlaps: (rois x gt_boxes)\n\n  if gt_boxes.shape[0] == 0:\n      num = all_rois.shape[0]\n      labels = np.zeros((num, 1), dtype=np.float32)\n      bbox_targets = np.zeros((num, 4 * num_classes), dtype=np.float32)\n      bbox_inside_weights = np.zeros(bbox_targets.shape, dtype=np.float32)\n  else:\n      overlaps = bbox_overlaps(\n        np.ascontiguousarray(all_rois[:, :5], dtype=np.float),\n        np.ascontiguousarray(gt_boxes[:, :5], dtype=np.float))\n\n      gt_assignment = overlaps.argmax(axis=1)\n      max_overlaps = overlaps.max(axis=1)\n      labels = gt_boxes[gt_assignment, 5]\n\n      # Select foreground RoIs as those with >= FG_THRESH overlap\n      # fg_inds = np.where(max_overlaps >= cfg.TRAIN.FG_THRESH)[0]\n      bg_inds = np.where(max_overlaps < cfg.TRAIN.FG_THRESH)[0]\n      labels[bg_inds] = 0\n\n      # print '{:d} rois, {:d} fg, {:d} bg'.format(all_rois.shape[0], all_rois.shape[0]-len(bg_inds), len(bg_inds))\n      # print all_rois\n\n      bbox_target_data = _compute_targets(\n        all_rois[:, 1:5], gt_boxes[gt_assignment, 1:5], labels)\n\n      bbox_targets, bbox_inside_weights = \\\n        _get_bbox_regression_labels(bbox_target_data, num_classes)\n\n  return labels, bbox_targets, bbox_inside_weights\n"
  },
  {
    "path": "lib/layers/sdf_matching_loss.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport math\nfrom torch import nn\nfrom torch.autograd import Function\nimport torch\nimport posecnn_cuda\n\nclass SDFLossFunction(Function):\n    @staticmethod\n    def forward(ctx, pose_delta, pose_init, sdf_grids, sdf_limits, points, regularization):\n        outputs = posecnn_cuda.sdf_loss_forward(pose_delta, pose_init, sdf_grids, sdf_limits, points, regularization)\n        loss = outputs[0]\n        sdf_values = outputs[1]\n        se3 = outputs[2]\n        dalpha = outputs[3]\n        J = outputs[4]\n        variables = outputs[4:]\n        ctx.save_for_backward(*variables)\n\n        return loss, sdf_values, se3, dalpha, J\n\n    @staticmethod\n    def backward(ctx, grad_loss, grad_sdf_values, grad_se3, grad_JTJ, grad_J):\n        outputs = posecnn_cuda.sdf_loss_backward(grad_loss, *ctx.saved_variables)\n        d_delta = outputs[0]\n\n        return d_delta, None, None, None, None\n\n\nclass SDFLoss(nn.Module):\n    def __init__(self):\n        super(SDFLoss, self).__init__()\n\n    def forward(self, pose_delta, pose_init, sdf_grids, sdf_limits, points, regularization):\n        return SDFLossFunction.apply(pose_delta, pose_init, sdf_grids, sdf_limits, points, regularization)\n"
  },
  {
    "path": "lib/layers/sdf_matching_loss_kernel.cu",
    "content": "// Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n// This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n// text can be found in LICENSE.md\n\n#include <ATen/ATen.h>\n\n#include <cuda.h>\n#include <cuda_runtime.h>\n#include <thrust/device_vector.h>\n#include <Eigen/Core>\n#include <Eigen/Dense>\n#include <sophus/se3.hpp>\n#include <vector>\n\n#define CUDA_1D_KERNEL_LOOP(i, n)                            \\\n  for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \\\n       i += blockDim.x * gridDim.x)\n\ninline __device__ __host__ float lerp(float a, float b, float t)\n{\n    return a + t*(b-a);\n}\n\n__device__ __host__ float3 operator+(const float3 &a, const float3 &b)\n{\n  return make_float3(a.x+b.x, a.y+b.y, a.z+b.z);\n}\n\n__device__ __host__ float3 operator-(const float3 &a, const float3 &b)\n{\n  return make_float3(a.x-b.x, a.y-b.y, a.z-b.z);\n}\n\ntemplate <typename Dtype>\ninline __device__ __host__ const Dtype & getValue(const int3 & v, const int3 & dim, const Dtype* sdf_grids)\n{\n  return sdf_grids[v.x * dim.y * dim.z + v.y * dim.z + v.z];\n}\n\ntemplate <typename Dtype>\ninline __device__ __host__ Dtype getValueInterpolated(const float3 & pGrid, const int3 & dim, const Dtype* sdf_grids)\n{\n  const int x0 = (int)(pGrid.x - 0.5); const float fx = (pGrid.x - 0.5) - x0;\n  const int y0 = (int)(pGrid.y - 0.5); const float fy = (pGrid.y - 0.5) - y0;\n  const int z0 = (int)(pGrid.z - 0.5); const float fz = (pGrid.z - 0.5) - z0;\n\n  const int x1 = x0 + 1;\n  const int y1 = y0 + 1;\n  const int z1 = z0 + 1;\n\n  if ( !(x0 >= 0 && x1 < dim.x && y0 >= 0 && y1 < dim.y && z0 >=0 && z1 < dim.z) )\n    return 0.1;\n\n  const float dx00 = lerp( getValue(make_int3(x0,y0,z0), dim, sdf_grids), getValue(make_int3(x1,y0,z0), dim, sdf_grids), fx);\n  const float dx01 = lerp( getValue(make_int3(x0,y0,z1), dim, sdf_grids), getValue(make_int3(x1,y0,z1), dim, sdf_grids), fx);\n  const float dx10 = lerp( getValue(make_int3(x0,y1,z0), dim, sdf_grids), getValue(make_int3(x1,y1,z0), dim, sdf_grids), fx);\n  const float dx11 = lerp( getValue(make_int3(x0,y1,z1), dim, sdf_grids), getValue(make_int3(x1,y1,z1), dim, sdf_grids), fx);\n\n  const float dxy0 = lerp( dx00, dx10, fy );\n  const float dxy1 = lerp( dx01, dx11, fy );\n  float dxyz = lerp( dxy0, dxy1, fz );\n\n  // penalize inside objects\n  // if (dxyz < 0)\n  //  dxyz *= 10;\n\n  return dxyz;\n}\n\ntemplate <typename Dtype>\ninline __device__ __host__ float3 getGradientInterpolated(const float3 & pGrid, const int3 & dim, const Dtype* sdf_grids)\n{\n  const float3 delta_x = make_float3(1,0,0);\n  const float3 delta_y = make_float3(0,1,0);\n  const float3 delta_z = make_float3(0,0,1);\n\n  Dtype f_px = getValueInterpolated(pGrid + delta_x, dim, sdf_grids);\n  Dtype f_py = getValueInterpolated(pGrid + delta_y, dim, sdf_grids);\n  Dtype f_pz = getValueInterpolated(pGrid + delta_z, dim, sdf_grids);\n\n  Dtype f_mx = getValueInterpolated(pGrid - delta_x, dim, sdf_grids);\n  Dtype f_my = getValueInterpolated(pGrid - delta_y, dim, sdf_grids);\n  Dtype f_mz = getValueInterpolated(pGrid - delta_z, dim, sdf_grids);\n\n  float3 grad;\n  grad.x = 0.5*(f_px - f_mx);\n  grad.y = 0.5*(f_py - f_my);\n  grad.z = 0.5*(f_pz - f_mz);\n  return grad;\n}\n\n\n/*******************************************/\n/* pose_delta: num_objects x 6             */\n/* pose_init: num_objects x 4 x 4          */\n/* sdf_grid: num_classes x c x h x w       */\n/* sdf_limits: num_classes x 9             */\n/* points: num_points x 5                  */\n/*******************************************/\ntemplate <typename Dtype>\n__global__ void SDFdistanceForward(const int nthreads, const Dtype* pose_delta, const Dtype* pose_init,\n    const Dtype* sdf_grids, const Dtype* sdf_limits, const Dtype* points, \n    const int num_points, Dtype* losses, Dtype* top_values, \n    Dtype* diffs, Dtype* JTJ, Dtype* top_se3) \n{\n  typedef Sophus::SE3<Dtype> SE3;\n  typedef Eigen::Matrix<Dtype,3,1,Eigen::DontAlign> Vec3;\n\n  // index is the index of point\n  CUDA_1D_KERNEL_LOOP(index, nthreads) \n  {\n    int cls_index = int(points[5 * index + 3]);\n    int obj_index = int(points[5 * index + 4]);\n    int start_index;\n\n    // convert delta pose\n    Eigen::Matrix<Dtype,6,1> deltaPose;\n    start_index = 6 * obj_index;\n    deltaPose << pose_delta[start_index + 0], pose_delta[start_index + 1], pose_delta[start_index + 2], \n                 pose_delta[start_index + 3], pose_delta[start_index + 4], pose_delta[start_index + 5];\n    SE3 deltaPoseMatrix = SE3::exp(deltaPose);\n\n    // convert initial pose\n    Eigen::Matrix<Dtype,4,4> initialPose;\n    start_index = 16 * obj_index;\n    initialPose << pose_init[start_index + 0], pose_init[start_index + 1], pose_init[start_index + 2], pose_init[start_index + 3],\n                   pose_init[start_index + 4], pose_init[start_index + 5], pose_init[start_index + 6], pose_init[start_index + 7],\n                   pose_init[start_index + 8], pose_init[start_index + 9], pose_init[start_index + 10], pose_init[start_index + 11],\n                   pose_init[start_index + 12], pose_init[start_index + 13], pose_init[start_index + 14], pose_init[start_index + 15];\n    SE3 initialPoseMatrix = SE3(initialPose);\n\n    // start point of a new object\n    if (index == 0 || int(points[5 * (index-1) + 4]) != obj_index)\n    {\n      SE3 pose = deltaPoseMatrix * initialPoseMatrix;\n      Eigen::Matrix<Dtype,3,4> matrix = pose.matrix3x4();\n      int count = 0;\n      start_index = 16 * obj_index;\n      for (int i = 0; i < 3; i++)\n      {\n        for (int j = 0; j < 4; j++)\n          top_se3[start_index + count++] = matrix(i, j);\n      }\n      top_se3[start_index + 15] = 1.0;\n    }\n\n    // convert point\n    Vec3 point;\n    point << points[5 * index], points[5 * index + 1], points[5 * index + 2];\n\n    // transform the point\n    const Vec3 updatedPoint = deltaPoseMatrix * initialPoseMatrix * point;\n\n    // obtain sdf value\n    start_index = 9 * cls_index;\n    int d0 = int(sdf_limits[start_index + 6]);\n    int d1 = int(sdf_limits[start_index + 7]);\n    int d2 = int(sdf_limits[start_index + 8]);\n    float px = (updatedPoint(0) - sdf_limits[start_index + 0]) / (sdf_limits[start_index + 3] - sdf_limits[start_index + 0]) * d0;\n    float py = (updatedPoint(1) - sdf_limits[start_index + 1]) / (sdf_limits[start_index + 4] - sdf_limits[start_index + 1]) * d1;\n    float pz = (updatedPoint(2) - sdf_limits[start_index + 2]) / (sdf_limits[start_index + 5] - sdf_limits[start_index + 2]) * d2;\n\n    float3 pGrid = make_float3(px, py, pz);\n    int3 dim = make_int3(d0, d1, d2);\n    Dtype value = getValueInterpolated(pGrid, dim, sdf_grids + cls_index * d0 * d1 * d2);\n\n    // L2 loss\n    int flag = 1;\n    if (value < 0)\n      flag = -1;\n    value *= flag;\n\n    losses[index] = 0.5 * value * value;\n    top_values[index] = losses[index];\n\n    // L2 penalty on translation\n\n    // float lambda = 0.1;\n    // losses[index] += 0.5 * lambda * (pose_delta[0] * pose_delta[0] + pose_delta[1] * pose_delta[1] + pose_delta[2] * pose_delta[2]);\n\n    // compute gradient\n    float3 grad = getGradientInterpolated(pGrid, dim, sdf_grids + cls_index * d0 * d1 * d2);\n    Vec3 sdfUpdate;\n    sdfUpdate << grad.x, grad.y, grad.z;\n\n    Eigen::Matrix<Dtype,3,6> dUpdate;\n    dUpdate << 1, 0, 0,                     0,  updatedPoint(2), -updatedPoint(1),\n               0, 1, 0, -updatedPoint(2),                     0,  updatedPoint(0),\n               0, 0, 1,  updatedPoint(1), -updatedPoint(0),                     0;\n\n    Eigen::Matrix<Dtype,1,6> J = flag * sdfUpdate.transpose() * dUpdate;\n\n    // assign gradient\n    for (int i = 0; i < 6; i++)\n      diffs[6 * index + i] = value * J(i);\n\n    // L2 penalty on translation\n    // diffs[6 * index + 0] += lambda * pose_delta[0];\n    // diffs[6 * index + 1] += lambda * pose_delta[1];\n    // diffs[6 * index + 2] += lambda * pose_delta[2];\n\n    // compute JTJ\n    Eigen::Matrix<Dtype,6,6> result = J.transpose() * J;\n    for (int i = 0; i < 6; i++)\n    {\n      for (int j = 0; j < 6; j++)\n        JTJ[36 * index + i * 6 + j] = result(i, j);\n    }\n  }\n}\n\n/* diffs: num_points x num_channels */\n/* bottom_diff: num_objects x num_channels */\ntemplate <typename Dtype>\n__global__ void sum_gradients(const int nthreads, const Dtype* diffs, const int num_channels, const Dtype* points, Dtype* bottom_diff) \n{\n  CUDA_1D_KERNEL_LOOP(index, nthreads) \n  {\n    int p = index / num_channels;\n    int c = index % num_channels;\n    int obj_index = int(points[5 * p + 4]);\n    atomicAdd(bottom_diff + obj_index * num_channels + c, diffs[index]);\n  }\n}\n\n\n/*******************************************/\n/* pose_delta: num_objects x 6             */\n/* pose_init: num_objects x 4 x 4          */\n/* sdf_grid: num_classes x c x h x w       */\n/* sdf_limits: num_classes x 9             */\n/* points: num_points x 5                  */\n/*******************************************/\nstd::vector<at::Tensor> sdf_loss_cuda_forward(\n    at::Tensor pose_delta,\n    at::Tensor pose_init,\n    at::Tensor sdf_grids,\n    at::Tensor sdf_limits,\n    at::Tensor points, \n    at::Tensor regularization) \n{\n  // run kernels\n  cudaError_t err;\n  const int kThreadsPerBlock = 512;\n  const int num_channels = 6;\n  int output_size;\n\n  // sizes\n  const int num_objects = pose_delta.size(0);\n  const int num_classes = sdf_grids.size(0);\n  const int num_points = points.size(0);\n\n  // temp losses\n  auto losses = at::zeros({num_points}, points.options());\n  auto top_values = at::zeros({num_points}, points.options());\n  auto top_data = at::zeros({1}, points.options());\n  auto top_se3 = at::zeros({num_objects, 4, 4}, points.options());\n\n  // temp diffs\n  auto diffs = at::zeros({num_points, num_channels}, points.options());\n  auto JTJ = at::zeros({num_points, num_channels, num_channels}, points.options());\n  auto bottom_diff = at::zeros({num_objects, num_channels}, points.options());\n  auto bottom_JTJ = at::zeros({num_objects, num_channels, num_channels}, points.options());\n\n  // compute the losses and gradients\n  output_size = num_points;\n  SDFdistanceForward<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>(\n      output_size, pose_delta.data<float>(), pose_init.data<float>(), sdf_grids.data<float>(), sdf_limits.data<float>(),\n      points.data<float>(), num_points, losses.data<float>(), top_values.data<float>(), \n      diffs.data<float>(), JTJ.data<float>(), top_se3.data<float>());\n  cudaDeviceSynchronize();\n\n  err = cudaGetLastError();\n  if(cudaSuccess != err)\n  {\n    fprintf( stderr, \"cudaCheckError() failed: %s\\n\", cudaGetErrorString( err ) );\n    exit( -1 );\n  }\n\n  // sum the diffs\n  output_size = num_points * num_channels;\n  sum_gradients<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>(\n      output_size, diffs.data<float>(), num_channels, points.data<float>(), bottom_diff.data<float>());\n\n  output_size = num_points * num_channels * num_channels;\n  sum_gradients<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>(\n      output_size, JTJ.data<float>(), num_channels * num_channels, points.data<float>(), bottom_JTJ.data<float>());\n  cudaDeviceSynchronize();\n\n  // sum the loss\n  thrust::device_ptr<float> losses_ptr(losses.data<float>());\n  float loss = thrust::reduce(losses_ptr, losses_ptr + num_points) / num_points;\n  cudaMemcpy(top_data.data<float>(), &loss, sizeof(float), cudaMemcpyHostToDevice);\n\n  err = cudaGetLastError();\n  if(cudaSuccess != err)\n  {\n    fprintf( stderr, \"cudaCheckError() failed: %s\\n\", cudaGetErrorString( err ) );\n    exit( -1 );\n  }\n\n  // compute Gauss Newton update\n  float* bottom_diff_host = (float*)malloc(num_objects * num_channels * sizeof(float));\n  float* regularization_host = (float*)malloc(num_channels * sizeof(float));\n  float* bottom_JTJ_host = (float*)malloc(num_objects * num_channels * num_channels * sizeof(float));\n  cudaMemcpy(bottom_diff_host, bottom_diff.data<float>(), num_objects * num_channels * sizeof(float), cudaMemcpyDeviceToHost);\n  cudaMemcpy(regularization_host, regularization.data<float>(), num_channels * sizeof(float), cudaMemcpyDeviceToHost);\n  cudaMemcpy(bottom_JTJ_host, bottom_JTJ.data<float>(), num_objects * num_channels * num_channels * sizeof(float), cudaMemcpyDeviceToHost);\n\n  Eigen::Matrix<float,6,1> J_eigen;\n  Eigen::Matrix<float,6,6> JTJ_eigen;\n  float* dalpha_all = (float*)malloc(num_objects * num_channels * sizeof(float));\n  for (int k = 0; k < num_objects; k++)\n  {\n    for (int i = 0; i < num_channels; i++)\n    {\n      J_eigen(i) = bottom_diff_host[k * num_channels + i];\n      for (int j = 0; j < num_channels; j++)\n        JTJ_eigen(i, j) = bottom_JTJ_host[k * num_channels * num_channels + i * num_channels + j];\n      JTJ_eigen(i, i) += regularization_host[i];\n    }\n    Eigen::Matrix<float,6,1> dalpha = JTJ_eigen.ldlt().solve(J_eigen);\n    for (int i = 0; i < num_channels; i++)\n      dalpha_all[k * num_channels + i] = dalpha(i);\n  }\n\n  auto bottom_delta = at::zeros({num_objects, num_channels}, points.options());\n  cudaMemcpy(bottom_delta.data<float>(), dalpha_all, num_objects * num_channels * sizeof(float), cudaMemcpyHostToDevice);\n  free(bottom_diff_host);\n  free(regularization_host);\n  free(bottom_JTJ_host);\n  free(dalpha_all);\n\n  return {top_data, top_values, top_se3, bottom_delta, bottom_diff};\n}\n\n\ntemplate <typename Dtype>\n__global__ void SDFdistanceBackward(const int nthreads, const Dtype* top_diff,\n    const Dtype* bottom_diff, Dtype* output) \n{\n  CUDA_1D_KERNEL_LOOP(index, nthreads) \n  {\n    output[index] = top_diff[0] * bottom_diff[index];\n  }\n}\n\n\nstd::vector<at::Tensor> sdf_loss_cuda_backward(\n    at::Tensor grad_loss,\n    at::Tensor bottom_diff)\n{\n  cudaError_t err;\n  const int kThreadsPerBlock = 512;\n  int output_size;\n  const int batch_size = bottom_diff.size(0);\n  const int num_channels = bottom_diff.size(1);\n  auto grad_pose = at::zeros({batch_size, num_channels}, bottom_diff.options());\n\n  output_size = batch_size * num_channels;\n  SDFdistanceBackward<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>(\n      output_size, grad_loss.data<float>(), bottom_diff.data<float>(), grad_pose.data<float>());\n\n  cudaDeviceSynchronize();\n  err = cudaGetLastError();\n  if(cudaSuccess != err)\n  {\n    fprintf( stderr, \"cudaCheckError() failed : %s\\n\", cudaGetErrorString( err ) );\n    exit( -1 );\n  }\n\n  return {grad_pose};\n}\n"
  },
  {
    "path": "lib/layers/setup.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nfrom setuptools import setup\nfrom torch.utils.cpp_extension import BuildExtension, CUDAExtension\n\nsetup(\n    name='posecnn',\n    ext_modules=[\n        CUDAExtension(\n            name='posecnn_cuda', \n            sources = [\n            'backproject_kernel.cu',\n            'sdf_matching_loss_kernel.cu',\n            'posecnn_layers.cpp',\n            'hard_label_kernel.cu',\n            'hough_voting_kernel.cu',\n            'roi_pooling_kernel.cu',\n            'ROIAlign_cuda.cu',\n            'point_matching_loss_kernel.cu'],\n            include_dirs = ['/usr/local/include/eigen3', '/usr/local/include'])\n    ],\n    cmdclass={\n        'build_ext': BuildExtension\n    })\n"
  },
  {
    "path": "lib/networks/PoseCNN.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport torch\nimport torch.nn as nn\nimport torchvision.models as models\nimport math\nimport sys\nimport copy\nfrom torch.nn.init import kaiming_normal_\nfrom layers.hard_label import HardLabel\nfrom layers.hough_voting import HoughVoting\nfrom layers.roi_pooling import RoIPool\nfrom layers.point_matching_loss import PMLoss\nfrom layers.roi_target_layer import roi_target_layer\nfrom layers.pose_target_layer import pose_target_layer\nfrom fcn.config import cfg\n\n__all__ = [\n    'posecnn',\n]\n\nvgg16 = models.vgg16(pretrained=False)\n\ndef log_softmax_high_dimension(input):\n    num_classes = input.size()[1]\n    m = torch.max(input, dim=1, keepdim=True)[0]\n    if input.dim() == 4:\n        d = input - m.repeat(1, num_classes, 1, 1)\n    else:\n        d = input - m.repeat(1, num_classes)\n    e = torch.exp(d)\n    s = torch.sum(e, dim=1, keepdim=True)\n    if input.dim() == 4:\n        output = d - torch.log(s.repeat(1, num_classes, 1, 1))\n    else:\n        output = d - torch.log(s.repeat(1, num_classes))\n    return output\n\n\ndef softmax_high_dimension(input):\n    num_classes = input.size()[1]\n    m = torch.max(input, dim=1, keepdim=True)[0]\n    if input.dim() == 4:\n        e = torch.exp(input - m.repeat(1, num_classes, 1, 1))\n    else:\n        e = torch.exp(input - m.repeat(1, num_classes))\n    s = torch.sum(e, dim=1, keepdim=True)\n    if input.dim() == 4:\n        output = torch.div(e, s.repeat(1, num_classes, 1, 1))\n    else:\n        output = torch.div(e, s.repeat(1, num_classes))\n    return output\n\ndef conv(in_planes, out_planes, kernel_size=3, stride=1, relu=True):\n    if relu:\n        return nn.Sequential(\n            nn.Conv2d(in_planes, out_planes, kernel_size=kernel_size, stride=stride, padding=(kernel_size-1)//2, bias=True),\n            nn.ReLU(inplace=True))\n    else:\n        return nn.Conv2d(in_planes, out_planes, kernel_size=kernel_size, stride=stride, padding=(kernel_size-1)//2, bias=True)\n\n\ndef fc(in_planes, out_planes, relu=True):\n    if relu:\n        return nn.Sequential(\n            nn.Linear(in_planes, out_planes),\n            nn.LeakyReLU(0.1, inplace=True))\n    else:\n        return nn.Linear(in_planes, out_planes)\n\n\ndef upsample(scale_factor):\n    return nn.Upsample(scale_factor=scale_factor, mode='bilinear')\n\n\nclass PoseCNN(nn.Module):\n\n    def __init__(self, num_classes, num_units):\n        super(PoseCNN, self).__init__()\n        self.num_classes = num_classes\n\n        # conv features\n        features = list(vgg16.features)[:30]\n        \n        # change the first conv layer for RGBD\n        if cfg.INPUT == 'RGBD':\n            conv0 = conv(6, 64, kernel_size=3, relu=False)\n            conv0.weight.data[:, :3, :, :] = features[0].weight.data\n            conv0.weight.data[:, 3:, :, :] = features[0].weight.data\n            conv0.bias.data = features[0].bias.data\n            features[0] = conv0\n\n        self.features = nn.ModuleList(features)\n        self.classifier = vgg16.classifier[:-1]\n        if cfg.TRAIN.SLIM:\n            dim_fc = 256\n            self.classifier[0] = nn.Linear(512*7*7, 256)\n            self.classifier[3] = nn.Linear(256, 256)\n        else:\n            dim_fc = 4096\n            \n        print(self.features)\n        print(self.classifier)\n\n        # freeze some layers\n        if cfg.TRAIN.FREEZE_LAYERS:\n            for i in [0, 2, 5, 7, 10, 12, 14]:\n                self.features[i].weight.requires_grad = False\n                self.features[i].bias.requires_grad = False\n\n        # semantic labeling branch\n        self.conv4_embed = conv(512, num_units, kernel_size=1)\n        self.conv5_embed = conv(512, num_units, kernel_size=1)\n        self.upsample_conv5_embed = upsample(2.0)\n        self.upsample_embed = upsample(8.0)\n        self.conv_score = conv(num_units, num_classes, kernel_size=1)\n        self.hard_label = HardLabel(threshold=cfg.TRAIN.HARD_LABEL_THRESHOLD, sample_percentage=cfg.TRAIN.HARD_LABEL_SAMPLING)\n        self.dropout = nn.Dropout()\n\n        if cfg.TRAIN.VERTEX_REG:\n            # center regression branch\n            self.conv4_vertex_embed = conv(512, 2*num_units, kernel_size=1, relu=False)\n            self.conv5_vertex_embed = conv(512, 2*num_units, kernel_size=1, relu=False)\n            self.upsample_conv5_vertex_embed = upsample(2.0)\n            self.upsample_vertex_embed = upsample(8.0)\n            self.conv_vertex_score = conv(2*num_units, 3*num_classes, kernel_size=1, relu=False)\n            # hough voting\n            self.hough_voting = HoughVoting(is_train=0, skip_pixels=10, label_threshold=100, \\\n                                            inlier_threshold=0.9, voting_threshold=-1, per_threshold=0.01)\n\n            self.roi_pool_conv4 = RoIPool(pool_height=7, pool_width=7, spatial_scale=1.0 / 8.0)\n            self.roi_pool_conv5 = RoIPool(pool_height=7, pool_width=7, spatial_scale=1.0 / 16.0)\n            self.fc8 = fc(dim_fc, num_classes)\n            self.fc9 = fc(dim_fc, 4 * num_classes, relu=False)\n\n            if cfg.TRAIN.POSE_REG:\n                self.fc10 = fc(dim_fc, 4 * num_classes, relu=False)\n                self.pml = PMLoss(hard_angle=cfg.TRAIN.HARD_ANGLE)\n\n        for m in self.modules():\n            if isinstance(m, nn.Conv2d) or isinstance(m, nn.ConvTranspose2d):\n                kaiming_normal_(m.weight.data)\n                if m.bias is not None:\n                    m.bias.data.zero_()\n            elif isinstance(m, nn.BatchNorm2d):\n                m.weight.data.fill_(1)\n                m.bias.data.zero_()\n\n\n    def forward(self, x, label_gt, meta_data, extents, gt_boxes, poses, points, symmetry):\n\n        # conv features\n        for i, model in enumerate(self.features):\n            x = model(x)\n            if i == 22:\n                out_conv4_3 = x\n            if i == 29:\n                out_conv5_3 = x\n\n        # semantic labeling branch\n        out_conv4_embed = self.conv4_embed(out_conv4_3)\n        out_conv5_embed = self.conv5_embed(out_conv5_3)\n        out_conv5_embed_up = self.upsample_conv5_embed(out_conv5_embed)\n        out_embed = self.dropout(out_conv4_embed + out_conv5_embed_up)\n        out_embed_up = self.upsample_embed(out_embed)\n        out_score = self.conv_score(out_embed_up)\n        out_logsoftmax = log_softmax_high_dimension(out_score)\n        out_prob = softmax_high_dimension(out_score)\n        out_label = torch.max(out_prob, dim=1)[1].type(torch.IntTensor).cuda()\n        out_weight = self.hard_label(out_prob, label_gt, torch.rand(out_prob.size()).cuda())\n\n        if cfg.TRAIN.VERTEX_REG:\n            # center regression branch\n            out_conv4_vertex_embed = self.conv4_vertex_embed(out_conv4_3)\n            out_conv5_vertex_embed = self.conv5_vertex_embed(out_conv5_3)\n            out_conv5_vertex_embed_up = self.upsample_conv5_vertex_embed(out_conv5_vertex_embed)\n            out_vertex_embed = self.dropout(out_conv4_vertex_embed + out_conv5_vertex_embed_up)\n            out_vertex_embed_up = self.upsample_vertex_embed(out_vertex_embed)\n            out_vertex = self.conv_vertex_score(out_vertex_embed_up)\n\n            # hough voting\n            if self.training:\n                self.hough_voting.is_train = 1\n                self.hough_voting.label_threshold = cfg.TRAIN.HOUGH_LABEL_THRESHOLD\n                self.hough_voting.voting_threshold = cfg.TRAIN.HOUGH_VOTING_THRESHOLD\n                self.hough_voting.skip_pixels = cfg.TRAIN.HOUGH_SKIP_PIXELS\n                self.hough_voting.inlier_threshold = cfg.TRAIN.HOUGH_INLIER_THRESHOLD\n            else:\n                self.hough_voting.is_train = 0\n                self.hough_voting.label_threshold = cfg.TEST.HOUGH_LABEL_THRESHOLD\n                self.hough_voting.voting_threshold = cfg.TEST.HOUGH_VOTING_THRESHOLD\n                self.hough_voting.skip_pixels = cfg.TEST.HOUGH_SKIP_PIXELS\n                self.hough_voting.inlier_threshold = cfg.TEST.HOUGH_INLIER_THRESHOLD\n            out_box, out_pose = self.hough_voting(out_label, out_vertex, meta_data, extents)\n\n            # bounding box classification and regression branch\n            bbox_labels, bbox_targets, bbox_inside_weights, bbox_outside_weights = roi_target_layer(out_box, gt_boxes)\n            out_roi_conv4 = self.roi_pool_conv4(out_conv4_3, out_box)\n            out_roi_conv5 = self.roi_pool_conv5(out_conv5_3, out_box)\n            out_roi = out_roi_conv4 + out_roi_conv5\n            out_roi_flatten = out_roi.view(out_roi.size(0), -1)\n            out_fc7 = self.classifier(out_roi_flatten)\n            out_fc8 = self.fc8(out_fc7)\n            out_logsoftmax_box = log_softmax_high_dimension(out_fc8)\n            bbox_prob = softmax_high_dimension(out_fc8)\n            bbox_label_weights = self.hard_label(bbox_prob, bbox_labels, torch.rand(bbox_prob.size()).cuda())\n            bbox_pred = self.fc9(out_fc7)\n\n            # rotation regression branch\n            rois, poses_target, poses_weight = pose_target_layer(out_box, bbox_prob, bbox_pred, gt_boxes, poses, self.training)\n            if cfg.TRAIN.POSE_REG:    \n                out_qt_conv4 = self.roi_pool_conv4(out_conv4_3, rois)\n                out_qt_conv5 = self.roi_pool_conv5(out_conv5_3, rois)\n                out_qt = out_qt_conv4 + out_qt_conv5\n                out_qt_flatten = out_qt.view(out_qt.size(0), -1)\n                out_qt_fc7 = self.classifier(out_qt_flatten)\n                out_quaternion = self.fc10(out_qt_fc7)\n                # point matching loss\n                poses_pred = nn.functional.normalize(torch.mul(out_quaternion, poses_weight))\n                if self.training:\n                    loss_pose = self.pml(poses_pred, poses_target, poses_weight, points, symmetry)\n\n        if self.training:\n            if cfg.TRAIN.VERTEX_REG:\n                if cfg.TRAIN.POSE_REG:\n                    return out_logsoftmax, out_weight, out_vertex, out_logsoftmax_box, bbox_label_weights, \\\n                           bbox_pred, bbox_targets, bbox_inside_weights, loss_pose, poses_weight\n                else:\n                    return out_logsoftmax, out_weight, out_vertex, out_logsoftmax_box, bbox_label_weights, \\\n                           bbox_pred, bbox_targets, bbox_inside_weights\n            else:\n                return out_logsoftmax, out_weight\n        else:\n            if cfg.TRAIN.VERTEX_REG:\n                if cfg.TRAIN.POSE_REG:\n                    return out_label, out_vertex, rois, out_pose, out_quaternion\n                else:\n                    return out_label, out_vertex, rois, out_pose\n            else:\n                return out_label\n\n    def weight_parameters(self):\n        return [param for name, param in self.named_parameters() if 'weight' in name]\n\n    def bias_parameters(self):\n        return [param for name, param in self.named_parameters() if 'bias' in name]\n\n\ndef posecnn(num_classes, num_units, data=None):\n\n    model = PoseCNN(num_classes, num_units)\n\n    if data is not None:\n        model_dict = model.state_dict()\n        print('model keys')\n        print('=================================================')\n        for k, v in model_dict.items():\n            print(k)\n        print('=================================================')\n\n        print('data keys')\n        print('=================================================')\n        for k, v in data.items():\n            print(k)\n        print('=================================================')\n\n        pretrained_dict = {k: v for k, v in data.items() if k in model_dict and v.size() == model_dict[k].size()}\n        print('load the following keys from the pretrained model')\n        print('=================================================')\n        for k, v in pretrained_dict.items():\n            print(k)\n        print('=================================================')\n        model_dict.update(pretrained_dict) \n        model.load_state_dict(model_dict)\n\n    return model\n"
  },
  {
    "path": "lib/networks/__init__.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nfrom .PoseCNN import *\n"
  },
  {
    "path": "lib/sdf/__init__.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n"
  },
  {
    "path": "lib/sdf/_init_paths.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\n\"\"\"Set up paths for Fast R-CNN.\"\"\"\n\nimport os.path as osp\nimport sys\n\ndef add_path(path):\n    if path not in sys.path:\n        sys.path.insert(0, path)\n\nthis_dir = osp.dirname(__file__)\nlib_path = osp.join(this_dir, '..')\nadd_path(lib_path)\n"
  },
  {
    "path": "lib/sdf/multi_sdf_optimizer.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nfrom sdf_utils import *\n\nclass multi_sdf_optimizer():\n    def __init__(self, sdf_file, lr=0.01, online_calib=True, use_gpu=False):\n\n        self.use_gpu = use_gpu\n        print(' start loading sdf ... ')\n        sdf_info = read_sdf(sdf_file)\n        sdf = sdf_info[0]\n        min_coords = sdf_info[1]\n        delta = sdf_info[2]\n        max_coords = min_coords + delta * np.array(sdf.shape)\n        self.xmin, self.ymin, self.zmin = min_coords\n        self.xmax, self.ymax, self.zmax = max_coords\n        self.sdf_torch = torch.from_numpy(sdf).float().permute(1, 0, 2).unsqueeze(0).unsqueeze(1)\n        if self.use_gpu:\n            self.sdf_torch = self.sdf_torch.cuda()\n        print('     sdf size = {}x{}x{}'.format(self.sdf_torch.size(2), self.sdf_torch.size(3), self.sdf_torch.size(4)))\n        print('     minimal coordinate = ({:.4f}, {:.4f}, {:.4f}) cm'.format(self.xmin * 100, self.ymin * 100, self.zmin * 100))\n        print('     maximal coordinate = ({:.4f}, {:.4f}, {:.4f}) cm'.format(self.xmax * 100, self.ymax * 100, self.zmax * 100))\n        print(' finished loading sdf ! ')\n\n        if use_gpu:\n            self.dpose = torch.tensor([0, 0, 0, 1e-12, 1e-12, 1e-12], dtype=torch.float32, requires_grad=True, device=0)\n        else:\n            self.dpose = torch.tensor([0, 0, 0, 1e-12, 1e-12, 1e-12], dtype=torch.float32, requires_grad=True)\n\n        self.online_calib = online_calib\n        if online_calib:\n            if use_gpu:\n                self.dpose_ext = torch.tensor([0, 0, 0, 1e-12, 1e-12, 1e-12], dtype=torch.float32, requires_grad=True,\n                                              device=0)\n            else:\n                self.dpose_ext = torch.tensor([0, 0, 0, 1e-12, 1e-12, 1e-12], dtype=torch.float32, requires_grad=True)\n        else:\n            self.dpose_ext = torch.tensor([0, 0, 0, 1e-12, 1e-12, 1e-12], dtype=torch.float32, requires_grad=False)\n            if use_gpu:\n                self.dpose_ext = self.dpose_ext.cuda()\n\n        if online_calib:\n            self.optimizer = optim.Adam([self.dpose,\n                                         self.dpose_ext],\n                                        lr=lr)\n        else:\n            self.optimizer = optim.Adam([self.dpose],\n                                        lr=lr)\n\n        self.loss = nn.L1Loss(reduction='sum')\n        self.loss_extrinsics = nn.L1Loss(reduction='mean')\n\n        if use_gpu:\n            self.loss = self.loss.cuda()\n            self.loss_ext_t = self.loss_ext_t.cuda()\n            self.loss_extrinsics = self.loss_extrinsics.cuda()\n\n    def look_up(self, samples_x, samples_y, samples_z):\n        samples_x = torch.clamp(samples_x, self.xmin, self.xmax)\n        samples_y = torch.clamp(samples_y, self.ymin, self.ymax)\n        samples_z = torch.clamp(samples_z, self.zmin, self.zmax)\n\n        samples_x = (samples_x - self.xmin) / (self.xmax - self.xmin)\n        samples_y = (samples_y - self.ymin) / (self.ymax - self.ymin)\n        samples_z = (samples_z - self.zmin) / (self.zmax - self.zmin)\n\n        samples = torch.cat((samples_z.unsqueeze(0).unsqueeze(2).unsqueeze(3).unsqueeze(4),\n                             samples_x.unsqueeze(0).unsqueeze(2).unsqueeze(3).unsqueeze(4),\n                             samples_y.unsqueeze(0).unsqueeze(2).unsqueeze(3).unsqueeze(4)),\n                            dim=4)\n\n        samples = samples * 2 - 1\n\n        return F.grid_sample(self.sdf_torch, samples)\n\n    def compute_dist(self, d_pose, T_oc_0, ps_c):\n\n        ps_o = torch.mm(Oplus(T_oc_0, d_pose, self.use_gpu), ps_c.permute(1, 0)).permute(1, 0)[:, :3]\n\n        dist = self.look_up(ps_o[:, 0], ps_o[:, 1], ps_o[:, 2])\n\n        return dist\n\n    def compute_dist_multiview(self, d_pose, d_pose_ext, T_oc_0, T_rc_0, ps_c, T_r0rv):\n        # convert points to referece camera frame\n        T_rc = Oplus(T_rc_0, d_pose_ext, self.use_gpu)\n        T_cr = torch.inverse(T_rc)\n        T_c0cv = torch.matmul(T_cr.unsqueeze(0), torch.matmul(T_r0rv, T_rc.unsqueeze(0)))\n\n        ps_c0_all = []\n        for i in range(len(ps_c)):\n            ps_c0_all.append(torch.mm(T_c0cv[i], ps_c[i].permute(1, 0)).permute(1, 0).view(-1, 4))\n\n        ps_c0 = torch.cat(ps_c0_all, dim=0)\n\n        dist = self.compute_dist(d_pose, T_oc_0, ps_c0)\n\n        return dist\n\n    def refine_pose_singleview(self, T_co_0, ps_c, steps=100):\n        # input T_co_0: 4x4\n        #       ps_c:   nx4\n\n        if self.use_gpu:\n            T_oc_0 = torch.from_numpy(np.linalg.inv(T_co_0)).cuda()\n        else:\n            T_oc_0 = torch.from_numpy(np.linalg.inv(T_co_0))\n\n        self.dpose.data[:3] *= 0\n        self.dpose.data[3:] = self.dpose.data[3:] * 0 + 1e-12\n\n        for i in range(steps):\n\n            self.optimizer.zero_grad()\n\n            dist = self.compute_dist(self.dpose, T_oc_0, ps_c)\n            dist_target = torch.zeros_like(dist)\n            if self.use_gpu:\n                dist_target = dist_target.cuda()\n\n            loss = self.loss(dist, dist_target)\n            loss.backward()\n\n            self.optimizer.step()\n\n            # print('step: {}, loss = {}'.format(i + 1, loss.data.cpu().item()))\n\n        T_oc_opt = Oplus(T_oc_0, self.dpose, self.use_gpu)\n        T_co_opt = np.linalg.inv(T_oc_opt.cpu().detach().numpy())\n\n        dist = torch.mean(torch.abs(dist)).detach().cpu().numpy()\n\n        return T_co_opt, dist\n\n    def refine_pose_multiview(self, T_co_0, T_rc_0, ps_c, T_r0rv, steps=100):\n        # input T_co_0: 4x4 Relative pose of\n        #       T_cr_0: 4x4 Extrinsics\n        #       T_r0rv: vx4x4 Relative pose between robot frame at time 0 and time v\n        #       ps_c: tuple   vXn_ix4, point cloud in each frame\n\n        if self.use_gpu:\n            T_oc_0 = torch.from_numpy(np.linalg.inv(T_co_0)).cuda()\n            T_rc_0 = torch.from_numpy(T_rc_0).cuda()\n            T_r0rv = torch.from_numpy(T_r0rv).cuda()\n        else:\n            T_oc_0 = torch.from_numpy(np.linalg.inv(T_co_0))\n            T_rc_0 = torch.from_numpy(T_rc_0)\n            T_r0rv = torch.from_numpy(T_r0rv)\n\n        self.dpose.data[:3] *= 0\n        self.dpose.data[3:] = self.dpose.data[3:] * 0 + 1e-12\n        self.dpose_ext.data[:3] *= 0\n        self.dpose_ext.data[3:] = self.dpose.data[3:] * 0 + 1e-12\n\n        for i in range(steps):\n\n            self.optimizer.zero_grad()\n\n            dist = self.compute_dist_multiview(self.dpose, self.dpose_ext, T_oc_0, T_rc_0, ps_c, T_r0rv)\n\n            dist_target = torch.zeros_like(dist)\n            if self.use_gpu:\n                dist_target = dist_target.cuda()\n\n\n            loss = self.loss(dist, dist_target) + \\\n                   self.loss_extrinsics(self.dpose_ext[[0, 1, 2, 3, 5]],\n                                        torch.zeros_like(self.dpose_ext[[0, 1, 2, 3, 5]])) * 1e8\n\n            loss.backward()\n\n            self.optimizer.step()\n\n            # print('step: {}, loss = {}'.format(i + 1, loss.data.cpu().item()))\n\n        T_oc_opt = Oplus(T_oc_0, self.dpose, self.use_gpu)\n        T_co_opt = np.linalg.inv(T_oc_opt.cpu().detach().numpy())\n\n        T_rc_opt = Oplus(T_rc_0, self.dpose_ext, self.use_gpu)\n        T_rc_opt = T_rc_opt.cpu().detach().numpy()\n\n        dist = torch.mean(torch.abs(dist)).detach().cpu().numpy()\n\n        return T_co_opt, T_rc_opt, dist\n"
  },
  {
    "path": "lib/sdf/sdf_optimizer.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport sys\nimport cv2\nimport time\nfrom .sdf_utils import *\nimport _init_paths\nfrom fcn.config import cfg\nfrom layers.sdf_matching_loss import SDFLoss\n\nclass sdf_optimizer():\n    def __init__(self, classes, sdf_files, lr=0.01, optimizer='Adam', use_gpu=True):\n\n        self.classes = classes\n        self.sdf_files = sdf_files\n        self.use_gpu = use_gpu\n        num = len(sdf_files)\n        self.xmins = np.zeros((num, ), dtype=np.float32)\n        self.ymins = np.zeros((num, ), dtype=np.float32)\n        self.zmins = np.zeros((num, ), dtype=np.float32)\n        self.xmaxs = np.zeros((num, ), dtype=np.float32)\n        self.ymaxs = np.zeros((num, ), dtype=np.float32)\n        self.zmaxs = np.zeros((num, ), dtype=np.float32)\n\n        sdf_torch_list = []\n        for i in range(len(sdf_files)):\n            sdf_file = sdf_files[i]\n            print(' start loading sdf from {} ... '.format(sdf_file))\n\n            if sdf_file[-3:] == 'sdf':\n                sdf_info = read_sdf(sdf_file)\n                sdf = sdf_info[0]\n                min_coords = sdf_info[1]\n                delta = sdf_info[2]\n                max_coords = min_coords + delta * np.array(sdf.shape)\n                self.xmins[i], self.ymins[i], self.zmins[i] = min_coords\n                self.xmaxs[i], self.ymaxs[i], self.zmaxs[i] = max_coords\n                sdf_torch_list.append(torch.from_numpy(sdf).float())\n            elif sdf_file[-3:] == 'pth':\n                sdf_info = torch.load(sdf_file)\n                min_coords = sdf_info['min_coords']\n                max_coords = sdf_info['max_coords']\n                self.xmins[i], self.ymins[i], self.zmins[i] = min_coords\n                self.xmaxs[i], self.ymaxs[i], self.zmaxs[i] = max_coords\n                sdf_torch_list.append(sdf_info['sdf_torch'][0, 0].permute(1, 0, 2))\n\n            print('     minimal coordinate = ({:.4f}, {:.4f}, {:.4f}) cm'.format(self.xmins[i] * 100, self.ymins[i] * 100, self.zmins[i] * 100))\n            print('     maximal coordinate = ({:.4f}, {:.4f}, {:.4f}) cm'.format(self.xmaxs[i] * 100, self.ymaxs[i] * 100, self.zmaxs[i] * 100))\n            print(sdf_torch_list[-1].shape)\n            print(' finished loading sdf ! ')\n\n        # combine sdfs\n        max_shape = np.array([sdf.shape for sdf in sdf_torch_list]).max(axis=0)\n        self.sdf_torch = torch.ones((num, max_shape[0], max_shape[1], max_shape[2]), dtype=torch.float32)\n        self.sdf_limits = np.zeros((num, 9), dtype=np.float32)\n        for i in range(num):\n            size = sdf_torch_list[i].shape\n            self.sdf_torch[i, :size[0], :size[1], :size[2]] = sdf_torch_list[i]\n            self.sdf_limits[i, 0] = self.xmins[i]\n            self.sdf_limits[i, 1] = self.ymins[i]\n            self.sdf_limits[i, 2] = self.zmins[i]\n            self.sdf_limits[i, 3] = self.xmins[i] + (self.xmaxs[i] - self.xmins[i]) * max_shape[0] / size[0]\n            self.sdf_limits[i, 4] = self.ymins[i] + (self.ymaxs[i] - self.ymins[i]) * max_shape[1] / size[1]\n            self.sdf_limits[i, 5] = self.zmins[i] + (self.zmaxs[i] - self.zmins[i]) * max_shape[2] / size[2]\n            self.sdf_limits[i, 6] = max_shape[0]\n            self.sdf_limits[i, 7] = max_shape[1]\n            self.sdf_limits[i, 8] = max_shape[2]\n        self.sdf_limits = torch.from_numpy(self.sdf_limits)\n\n        if self.use_gpu:\n            self.sdf_torch = self.sdf_torch.cuda()\n            self.sdf_limits = self.sdf_limits.cuda()\n\n        self.sdf_loss = SDFLoss()\n\n\n    def look_up(self, samples_x, samples_y, samples_z):\n        samples_x = torch.clamp(samples_x, self.xmin, self.xmax)\n        samples_y = torch.clamp(samples_y, self.ymin, self.ymax)\n        samples_z = torch.clamp(samples_z, self.zmin, self.zmax)\n\n        samples_x = (samples_x - self.xmin) / (self.xmax - self.xmin)\n        samples_y = (samples_y - self.ymin) / (self.ymax - self.ymin)\n        samples_z = (samples_z - self.zmin) / (self.zmax - self.zmin)\n\n        samples = torch.cat((samples_z.unsqueeze(0).unsqueeze(2).unsqueeze(3).unsqueeze(4),\n                             samples_x.unsqueeze(0).unsqueeze(2).unsqueeze(3).unsqueeze(4),\n                             samples_y.unsqueeze(0).unsqueeze(2).unsqueeze(3).unsqueeze(4)),\n                            dim=4)\n\n        samples = samples * 2 - 1\n\n        return F.grid_sample(self.sdf_torch, samples, padding_mode=\"border\")\n\n    def compute_dist(self, d_pose, T_oc_0, ps_c):\n\n        ps_o = torch.mm(Oplus(T_oc_0, d_pose, self.use_gpu), ps_c.permute(1, 0)).permute(1, 0)[:, :3]\n\n        dist = self.look_up(ps_o[:, 0], ps_o[:, 1], ps_o[:, 2])\n\n        return torch.abs(dist)\n\n    def refine_pose(self, T_co_0, ps_c, steps=100):\n        # input T_co_0: 4x4\n        #       ps_c:   nx4\n\n        if self.use_gpu:\n            T_oc_0 = torch.from_numpy(np.linalg.inv(T_co_0)).cuda()\n        else:\n            T_oc_0 = torch.from_numpy(np.linalg.inv(T_co_0))\n\n        self.dpose.data[:3] *= 0\n        self.dpose.data[3:] = self.dpose.data[3:] * 0 + 1e-12\n\n        self.dist = torch.zeros((ps_c.size(0),))\n        if self.use_gpu:\n            self.dist = self.dist.cuda()\n\n        for i in range(steps):\n\n            if self.optimizer_type == 'LBFGS':\n                def closure():\n                    self.optimizer.zero_grad()\n\n                    dist = self.compute_dist(self.dpose, T_oc_0, ps_c)\n\n                    self.dist = dist.detach()\n\n                    dist_target = torch.zeros_like(dist)\n                    if self.use_gpu:\n                        dist_target = dist_target.cuda()\n\n                    loss = self.loss(dist, dist_target)\n                    loss.backward()\n\n                    return loss\n\n                self.optimizer.step(closure)\n\n            elif self.optimizer_type == 'Adam':\n                self.optimizer.zero_grad()\n\n                dist = self.compute_dist(self.dpose, T_oc_0, ps_c)\n                self.dist = dist.detach()\n                dist_target = torch.zeros_like(dist)\n                if self.use_gpu:\n                    dist_target = dist_target.cuda()\n\n                loss = self.loss(dist, dist_target)\n                loss.backward()\n\n                self.optimizer.step()\n\n            # print('step: {}, loss = {}'.format(i + 1, loss.data.cpu().item()))\n\n        T_oc_opt = Oplus(T_oc_0, self.dpose, self.use_gpu)\n        T_co_opt = np.linalg.inv(T_oc_opt.cpu().detach().numpy())\n\n        dist = torch.mean(torch.abs(self.dist)).detach().cpu().numpy()\n\n        return T_co_opt, dist\n\n\n    def refine_pose_layer(self, T_oc_0, points, steps=100):\n        # input T_co_0: mx4x4, m is the number of objects\n        #       points: nx3 in camera\n\n        # construct initial pose\n        pose_init = torch.from_numpy(T_oc_0).cuda()\n\n        m = T_oc_0.shape[0]\n        dpose = torch.zeros((m, 6), dtype=torch.float32, requires_grad=True, device=0)\n        dpose.data[:, :3] *= 0\n        dpose.data[:, 3:] = dpose.data[:, 3:] * 0 + 1e-12\n        treg = cfg.TEST.SDF_TRANSLATION_REG\n        rreg = cfg.TEST.SDF_ROTATION_REG\n        regularization = torch.tensor([treg, treg, treg, rreg, rreg, rreg], dtype=torch.float32, requires_grad=False, device=0)\n\n        start = time.time()\n        for i in range(steps):\n\n            # self.optimizer.zero_grad()\n            loss, sdf_values, T_oc_opt, dalpha, J = self.sdf_loss(dpose, pose_init, self.sdf_torch, self.sdf_limits, points, regularization)\n            # print(loss)\n            # loss.backward()\n            # self.optimizer.step()\n\n            # JTJ = JTJ.cpu().detach().numpy() + np.diag([100, 100, 100, 0.001, 0.001, 0.001]).astype(np.float32)\n            # J = J.cpu().detach().numpy()\n            # dalpha = torch.from_numpy(np.matmul(np.linalg.inv(JTJ), J)).cuda()\n            dpose = dpose - dalpha\n\n            # self.dpose = self.dpose - 0.001 * J\n\n        end = time.time()\n        print('sdf refinement iterations %d, time %f' % (steps, end - start))\n        return T_oc_opt.cpu().detach().numpy()\n"
  },
  {
    "path": "lib/sdf/sdf_utils.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport torch\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport torch.optim as optim\nimport torch.nn as nn\nimport torch.nn.init as init\nfrom mpl_toolkits.mplot3d import Axes3D  # noqa: F401 unused import\nfrom transforms3d.quaternions import *\nfrom transforms3d.axangles import *\nimport torch.nn.functional as F\nimport time\n\n\ndef read_sdf(sdf_file):\n    with open(sdf_file, \"r\") as file:\n        lines = file.readlines()\n        nx, ny, nz = map(int, lines[0].split(' '))\n        x0, y0, z0 = map(float, lines[1].split(' '))\n        delta = float(lines[2].strip())\n        data = np.zeros([nx, ny, nz])\n        for i, line in enumerate(lines[3:]):\n            idx = i % nx\n            idy = int(i / nx) % ny\n            idz = int(i / (nx * ny))\n            val = float(line.strip())\n            data[idx, idy, idz] = val\n    return (data, np.array([x0, y0, z0]), delta)\n\n\ndef skew(w, gpu=False):\n    if gpu:\n        wc = torch.stack((torch.tensor(0, dtype=torch.float32).cuda(), -w[2], w[1],\n                          w[2], torch.tensor(0, dtype=torch.float32).cuda(), -w[0],\n                          -w[1], w[0], torch.tensor(0, dtype=torch.float32).cuda()\n                          )).view(3, 3)\n    else:\n        wc = torch.stack((torch.tensor(0, dtype=torch.float32), -w[2], w[1],\n                          w[2], torch.tensor(0, dtype=torch.float32), -w[0],\n                          -w[1], w[0], torch.tensor(0, dtype=torch.float32)\n                         )).view(3, 3)\n\n    return wc\n\n\ndef Exp(dq, gpu):\n\n    if gpu:\n        I = torch.eye(3, dtype=torch.float32).cuda()\n    else:\n        I = torch.eye(3, dtype=torch.float32)\n\n    dphi = torch.norm(dq, p=2, dim=0)\n\n    if dphi > 0.05:\n        u = 1/dphi * dq\n\n        ux = skew(u, gpu)\n\n        if gpu:\n            dR = I + torch.sin(dphi) * ux + (torch.tensor(1, dtype=torch.float32).cuda() - torch.cos(dphi)) * torch.mm(ux, ux)\n        else:\n            dR = I + torch.sin(dphi) * ux + (torch.tensor(1, dtype=torch.float32) - torch.cos(dphi)) * torch.mm(ux, ux)\n    else:\n        dR = I + skew(dq, gpu)\n\n    return dR\n\n\ndef Oplus(T, v, gpu=False):\n\n    dR = Exp(v[3:], gpu)\n    dt = v[:3]\n\n    if gpu:\n        dT = torch.stack((dR[0, 0], dR[0, 1], dR[0, 2], dt[0],\n                          dR[1, 0], dR[1, 1], dR[1, 2], dt[1],\n                          dR[2, 0], dR[2, 1], dR[2, 2], dt[2],\n                          torch.tensor(0, dtype=torch.float32).cuda(),\n                          torch.tensor(0, dtype=torch.float32).cuda(),\n                          torch.tensor(0, dtype=torch.float32).cuda(),\n                          torch.tensor(1, dtype=torch.float32).cuda())).view(4, 4)\n    else:\n        dT = torch.stack((dR[0, 0], dR[0, 1], dR[0, 2], dt[0],\n                          dR[1, 0], dR[1, 1], dR[1, 2], dt[1],\n                          dR[2, 0], dR[2, 1], dR[2, 2], dt[2],\n                          torch.tensor(0, dtype=torch.float32),\n                          torch.tensor(0, dtype=torch.float32),\n                          torch.tensor(0, dtype=torch.float32),\n                          torch.tensor(1, dtype=torch.float32))).view(4, 4)\n\n    return torch.mm(T, dT)\n"
  },
  {
    "path": "lib/sdf/test_sdf_optimizer.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nfrom sdf_optimizer import *\nfrom transforms3d.quaternions import mat2quat, quat2mat\nimport cv2\n\ndef Twc_np(pose):\n\n    Twc = np.zeros((4, 4), dtype=np.float32)\n\n    Twc[:3, :3] = quat2mat(pose[3:])\n    Twc[:3, 3] = pose[:3]\n    Twc[3, 3] = 1\n\n    return Twc\n\ntry:\n    import cPickle as pickle\nexcept:\n    import pickle\nimport numpy as np\nfrom itertools import izip_longest as izip\n\nclass SignedDensityField(object):\n    \"\"\" Data is stored in the following way\n            data[x, y, z]\n    \"\"\"\n\n    def __init__(self, data, origin, delta):\n        self.data = data\n        self.nx, self.ny, self.nz = data.shape\n        self.origin = origin\n        self.delta = delta\n        self.max_coords = self.origin + delta * np.array(data.shape)\n\n    def _rel_pos_to_idxes(self, rel_pos):\n        i_min = np.array([0, 0, 0], dtype=np.int)\n        i_max = np.array([self.nx - 1, self.ny - 1, self.nz - 1], dtype=np.int)\n        return np.clip(((rel_pos - self.origin) / self.delta).astype(int), i_min, i_max)\n\n    def get_distance(self, rel_pos):\n        idxes = self._rel_pos_to_idxes(rel_pos)\n        assert idxes.shape[0] == rel_pos.shape[0]\n        return self.data[idxes[:, 0], idxes[:, 1], idxes[:, 2]]\n\n    def dump(self, pkl_file):\n        data = {}\n        data['data'] = self.data\n        data['origin'] = self.origin\n        data['delta'] = self.delta\n        pickle.dump(data, open(pkl_file, \"wb\"), protocol=2)\n\n    def visualize(self, max_dist=0.1):\n        try:\n            from mayavi import mlab\n        except:\n            print(\"mayavi is not installed!\")\n\n        figure = mlab.figure('Signed Density Field')\n        SCALE = 100  # The dimensions will be expressed in cm for better visualization.\n        data = np.copy(self.data)\n        data = np.minimum(max_dist, data)\n        xmin, ymin, zmin = SCALE * self.origin\n        xmax, ymax, zmax = SCALE * self.max_coords\n        delta = SCALE * self.delta\n        xi, yi, zi = np.mgrid[xmin:xmax:delta, ymin:ymax:delta, zmin:zmax:delta]\n        data[data <= 0] -= 0.2\n        data = -data\n        grid = mlab.pipeline.scalar_field(xi, yi, zi, data)\n        vmin = np.min(data)\n        vmax = np.max(data)\n        mlab.pipeline.volume(grid, vmin=vmin, vmax=(vmax + vmin) / 2)\n        mlab.axes()\n        mlab.show()\n\n    @classmethod\n    def from_sdf(cls, sdf_file):\n        with open(sdf_file, \"r\") as file:\n            axis = 2\n            lines = file.readlines()\n            nx, ny, nz = map(int, lines[0].split(' '))\n            print(nx, ny, nz)\n            x0, y0, z0 = map(float, lines[1].split(' '))\n            print(x0, y0, z0)\n            delta = float(lines[2].strip())\n            print(delta)\n            data = np.zeros([nx, ny, nz])\n            for i, line in enumerate(lines[3:]):\n                idx = i % nx\n                idy = int(i / nx) % ny\n                idz = int(i / (nx * ny))\n                val = float(line.strip())\n                data[idx, idy, idz] = val\n\n        return cls(data, np.array([x0, y0, z0]), delta)\n\n    @classmethod\n    def from_pkl(cls, pkl_file):\n        data = pickle.load(open(pkl_file, \"r\"))\n\n        return cls(data['data'], data['origin'], data['delta'])\n\nif __name__ == '__main__':\n\n    # object_name = '002_master_chef_can'\n    # object_name = '037_scissors'\n    # object_name = '061_foam_brick'\n    object_name = '007_tuna_fish_can'\n\n    visualize_sdf = False\n\n    sdf_file = '../../data/YCB_Object/models/{}/textured_simple_low_res.pth'.format(object_name)\n\n    sdf_optim = sdf_optimizer(sdf_file, lr=0.01, use_gpu=True, optimizer='Adam')\n    print(torch.max(sdf_optim.sdf_torch))\n    print(torch.min(sdf_optim.sdf_torch))\n\n    if visualize_sdf:\n        sdf_show = SignedDensityField.from_sdf(sdf_file)\n        sdf_show.visualize()\n\n    # load points of the same object\n    point_file = '../../data/YCB_Object/models/{}/points.xyz'.format(object_name)\n    points = torch.from_numpy(np.loadtxt(point_file)).float()\n    points = torch.cat((points, torch.ones((points.size(0), 1), dtype=torch.float32)), dim=1)\n    points_np = points.numpy()\n    print(points_np.shape)\n\n    # set ground truth pose\n    pose_gt = np.zeros((7,), dtype=np.float32)\n    pose_gt[:3] = np.array([1, 1, 1], dtype=np.float32)\n\n    R = np.array([[-1, 0, 0],\n                 [0, np.sqrt(0.5), -np.sqrt(0.5)],\n                 [0, -np.sqrt(0.5), -np.sqrt(0.5)]], dtype=np.float32)\n\n    pose_gt[3:] = mat2quat(R)\n\n    # get measurements\n    Twc_gt = Twc_np(pose_gt)\n    points_c = np.matmul(np.linalg.inv(Twc_gt), np.transpose(points_np)).transpose()\n    points_c = torch.from_numpy(points_c)\n\n    index = np.random.permutation(np.arange(points_c.shape[0]))[:2000]\n    points_c = points_c[index, :]\n    print(points_c.shape)\n\n    T_co_init = np.linalg.inv(Twc_gt)\n    R_perturb = axangle2mat(np.random.rand(3,), 40 * np.random.rand() / 57.3, is_normalized=False)\n    T_co_init[:3, :3] = np.matmul(T_co_init[:3, :3], R_perturb)\n    T_co_init[:3, 3] += 0.01\n\n    points_init = np.matmul(np.linalg.inv(T_co_init), points_c.numpy().transpose()).transpose()\n\n    # optimization\n    points_input = points_c[:, :3].clone().cuda()\n    T_co_opt, sdf_values = sdf_optim.refine_pose_layer(T_co_init, points_input, steps=100)\n\n    print(T_co_opt)\n    print(np.linalg.inv(Twc_gt))\n    np.set_printoptions(threshold=sys.maxsize)\n    # print(sdf_values.detach().cpu().numpy())\n\n    # visualization for debugging\n    points_opt = np.matmul(np.linalg.inv(T_co_opt), points_c.numpy().transpose()).transpose()\n\n    fig = plt.figure()\n    ax = fig.add_subplot(111, projection='3d')\n\n    ax.scatter(points_np[::5, 0], points_np[::5, 1], points_np[::5, 2], color='green')\n    ax.scatter(points_init[::5, 0], points_init[::5, 1], points_init[::5, 2], color='red')\n    ax.scatter(points_opt[::5, 0], points_opt[::5, 1], points_opt[::5, 2], color='blue')\n\n    ax.set_xlabel('X Label')\n    ax.set_ylabel('Y Label')\n    ax.set_zlabel('Z Label')\n\n    min_coor = np.min(np.array([sdf_optim.xmin, sdf_optim.ymin, sdf_optim.zmin]))\n    max_coor = np.max(np.array([sdf_optim.xmax, sdf_optim.ymax, sdf_optim.zmax]))\n\n    ax.set_xlim(min_coor, max_coor)\n    ax.set_ylim(min_coor, max_coor)\n    ax.set_zlim(min_coor, max_coor)\n\n    plt.show()\n"
  },
  {
    "path": "lib/utils/__init__.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n"
  },
  {
    "path": "lib/utils/bbox.pyx",
    "content": "# --------------------------------------------------------\n# Fast R-CNN\n# Copyright (c) 2015 Microsoft\n# Licensed under The MIT License [see LICENSE for details]\n# Written by Sergey Karayev\n# --------------------------------------------------------\n\ncimport cython\nimport numpy as np\ncimport numpy as np\n\nDTYPE = np.float\nctypedef np.float_t DTYPE_t\n\ndef bbox_overlaps(\n        np.ndarray[DTYPE_t, ndim=2] boxes,\n        np.ndarray[DTYPE_t, ndim=2] query_boxes):\n    \"\"\"\n    Parameters\n    ----------\n    boxes: (N, 5) ndarray of float (batch_id, x1, y1, x2, y2)\n    query_boxes: (K, 5) ndarray of float (batch_id, x1, y1, x2, y2)\n    Returns\n    -------\n    overlaps: (N, K) ndarray of overlap between boxes and query_boxes\n    \"\"\"\n    cdef unsigned int N = boxes.shape[0]\n    cdef unsigned int K = query_boxes.shape[0]\n    cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE)\n    cdef DTYPE_t iw, ih, box_area\n    cdef DTYPE_t ua\n    cdef unsigned int k, n\n    for k in range(K):\n        box_area = (\n            (query_boxes[k, 2+1] - query_boxes[k, 0+1] + 1) *\n            (query_boxes[k, 3+1] - query_boxes[k, 1+1] + 1)\n        )\n        for n in range(N):\n            if query_boxes[k, 0] == boxes[n, 0]:\n                iw = (\n                    min(boxes[n, 2+1], query_boxes[k, 2+1]) -\n                    max(boxes[n, 0+1], query_boxes[k, 0+1]) + 1\n                )\n                if iw > 0:\n                    ih = (\n                        min(boxes[n, 3+1], query_boxes[k, 3+1]) -\n                        max(boxes[n, 1+1], query_boxes[k, 1+1]) + 1\n                    )\n                    if ih > 0:\n                        ua = float(\n                            (boxes[n, 2+1] - boxes[n, 0+1] + 1) *\n                            (boxes[n, 3+1] - boxes[n, 1+1] + 1) +\n                            box_area - iw * ih\n                        )\n                        overlaps[n, k] = iw * ih / ua\n    return overlaps\n"
  },
  {
    "path": "lib/utils/bbox_transform.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport numpy as np\n\ndef bbox_transform(ex_rois, gt_rois):\n  ex_widths = ex_rois[:, 2] - ex_rois[:, 0] + 1.0\n  ex_heights = ex_rois[:, 3] - ex_rois[:, 1] + 1.0\n  ex_ctr_x = ex_rois[:, 0] + 0.5 * ex_widths\n  ex_ctr_y = ex_rois[:, 1] + 0.5 * ex_heights\n\n  gt_widths = gt_rois[:, 2] - gt_rois[:, 0] + 1.0\n  gt_heights = gt_rois[:, 3] - gt_rois[:, 1] + 1.0\n  gt_ctr_x = gt_rois[:, 0] + 0.5 * gt_widths\n  gt_ctr_y = gt_rois[:, 1] + 0.5 * gt_heights\n\n  targets_dx = (gt_ctr_x - ex_ctr_x) / ex_widths\n  targets_dy = (gt_ctr_y - ex_ctr_y) / ex_heights\n  targets_dw = np.log(gt_widths / ex_widths)\n  targets_dh = np.log(gt_heights / ex_heights)\n\n  targets = np.vstack(\n    (targets_dx, targets_dy, targets_dw, targets_dh)).transpose()\n  return targets\n\n\ndef bbox_transform_inv(boxes, deltas):\n  if boxes.shape[0] == 0:\n    return np.zeros((0, deltas.shape[1]), dtype=deltas.dtype)\n\n  boxes = boxes.astype(deltas.dtype, copy=False)\n  widths = boxes[:, 2] - boxes[:, 0] + 1.0\n  heights = boxes[:, 3] - boxes[:, 1] + 1.0\n  ctr_x = boxes[:, 0] + 0.5 * widths\n  ctr_y = boxes[:, 1] + 0.5 * heights\n\n  dx = deltas[:, 0::4]\n  dy = deltas[:, 1::4]\n  dw = deltas[:, 2::4]\n  dh = deltas[:, 3::4]\n  \n  pred_ctr_x = dx * widths[:, np.newaxis] + ctr_x[:, np.newaxis]\n  pred_ctr_y = dy * heights[:, np.newaxis] + ctr_y[:, np.newaxis]\n  pred_w = np.exp(dw) * widths[:, np.newaxis]\n  pred_h = np.exp(dh) * heights[:, np.newaxis]\n\n  pred_boxes = np.zeros(deltas.shape, dtype=deltas.dtype)\n  # x1\n  pred_boxes[:, 0::4] = pred_ctr_x - 0.5 * pred_w\n  # y1\n  pred_boxes[:, 1::4] = pred_ctr_y - 0.5 * pred_h\n  # x2\n  pred_boxes[:, 2::4] = pred_ctr_x + 0.5 * pred_w\n  # y2\n  pred_boxes[:, 3::4] = pred_ctr_y + 0.5 * pred_h\n\n  return pred_boxes\n\n\ndef clip_boxes(boxes, im_shape):\n  \"\"\"\n  Clip boxes to image boundaries.\n  \"\"\"\n\n  # x1 >= 0\n  boxes[:, 0::4] = np.maximum(np.minimum(boxes[:, 0::4], im_shape[1] - 1), 0)\n  # y1 >= 0\n  boxes[:, 1::4] = np.maximum(np.minimum(boxes[:, 1::4], im_shape[0] - 1), 0)\n  # x2 < im_shape[1]\n  boxes[:, 2::4] = np.maximum(np.minimum(boxes[:, 2::4], im_shape[1] - 1), 0)\n  # y2 < im_shape[0]\n  boxes[:, 3::4] = np.maximum(np.minimum(boxes[:, 3::4], im_shape[0] - 1), 0)\n  return boxes\n"
  },
  {
    "path": "lib/utils/blob.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\n\"\"\"Blob helper functions.\"\"\"\n\nimport torch\nimport torch.nn as nn\nimport numpy as np\nimport cv2\nimport random\n\ndef im_list_to_blob(ims, num_channels):\n    \"\"\"Convert a list of images into a network input.\n\n    Assumes images are already prepared (means subtracted, BGR order, ...).\n    \"\"\"\n    max_shape = np.array([im.shape for im in ims]).max(axis=0)\n    num_images = len(ims)\n    blob = np.zeros((num_images, max_shape[0], max_shape[1], num_channels),\n                    dtype=np.float32)\n    for i in xrange(num_images):\n        im = ims[i]\n        if num_channels == 1:\n            blob[i, 0:im.shape[0], 0:im.shape[1], :] = im[:,:,np.newaxis]\n        else:\n            blob[i, 0:im.shape[0], 0:im.shape[1], :] = im\n\n    return blob\n\ndef prep_im_for_blob(im, pixel_means, target_size, max_size):\n    \"\"\"Mean subtract and scale an image for use in a blob.\"\"\"\n    im = im.astype(np.float32, copy=False)\n    im -= pixel_means\n    im_shape = im.shape\n    im_size_min = np.min(im_shape[0:2])\n    im_size_max = np.max(im_shape[0:2])\n    im_scale = float(target_size) / float(im_size_min)\n    # Prevent the biggest axis from being more than MAX_SIZE\n    if np.round(im_scale * im_size_max) > max_size:\n        im_scale = float(max_size) / float(im_size_max)\n    im = cv2.resize(im, None, None, fx=im_scale, fy=im_scale,\n                    interpolation=cv2.INTER_LINEAR)\n\n    return im, im_scale\n\n\ndef pad_im(im, factor, value=0):\n    height = im.shape[0]\n    width = im.shape[1]\n\n    pad_height = int(np.ceil(height / float(factor)) * factor - height)\n    pad_width = int(np.ceil(width / float(factor)) * factor - width)\n\n    if len(im.shape) == 3:\n        return np.lib.pad(im, ((0, pad_height), (0, pad_width), (0,0)), 'constant', constant_values=value)\n    elif len(im.shape) == 2:\n        return np.lib.pad(im, ((0, pad_height), (0, pad_width)), 'constant', constant_values=value)\n\n\ndef unpad_im(im, factor):\n    height = im.shape[0]\n    width = im.shape[1]\n\n    pad_height = int(np.ceil(height / float(factor)) * factor - height)\n    pad_width = int(np.ceil(width / float(factor)) * factor - width)\n\n    if len(im.shape) == 3:\n        return im[0:height-pad_height, 0:width-pad_width, :]\n    elif len(im.shape) == 2:\n        return im[0:height-pad_height, 0:width-pad_width]\n\n\ndef chromatic_transform(im, label=None, d_h=None, d_s=None, d_l=None):\n    \"\"\"\n    Given an image array, add the hue, saturation and luminosity to the image\n    \"\"\"\n    # Set random hue, luminosity and saturation which ranges from -0.1 to 0.1\n    if d_h is None:\n        d_h = (np.random.rand(1) - 0.5) * 0.1 * 180\n    if d_l is None:\n        d_l = (np.random.rand(1) - 0.5) * 0.2 * 256\n    if d_s is None:\n        d_s = (np.random.rand(1) - 0.5) * 0.2 * 256\n    # Convert the BGR to HLS\n    hls = cv2.cvtColor(im, cv2.COLOR_BGR2HLS)\n    h, l, s = cv2.split(hls)\n    # Add the values to the image H, L, S\n    new_h = (h + d_h) % 180\n    new_l = np.clip(l + d_l, 0, 255)\n    new_s = np.clip(s + d_s, 0, 255)\n    # Convert the HLS to BGR\n    new_hls = cv2.merge((new_h, new_l, new_s)).astype('uint8')\n    new_im = cv2.cvtColor(new_hls, cv2.COLOR_HLS2BGR)\n\n    if label is not None:\n        I = np.where(label > 0)\n        new_im[I[0], I[1], :] = im[I[0], I[1], :]\n    return new_im\n\n\ndef add_noise(image, level = 0.1):\n\n    # random number\n    r = np.random.rand(1)\n\n    # gaussian noise\n    if r < 0.9:\n        row,col,ch= image.shape\n        mean = 0\n        noise_level = random.uniform(0, level)\n        sigma = np.random.rand(1) * noise_level * 256\n        gauss = sigma * np.random.randn(row,col) + mean\n        gauss = np.repeat(gauss[:, :, np.newaxis], ch, axis=2)\n        noisy = image + gauss\n        noisy = np.clip(noisy, 0, 255)\n    else:\n        # motion blur\n        sizes = [3, 5, 7, 9, 11, 15]\n        size = sizes[int(np.random.randint(len(sizes), size=1))]\n        kernel_motion_blur = np.zeros((size, size))\n        if np.random.rand(1) < 0.5:\n            kernel_motion_blur[int((size-1)/2), :] = np.ones(size)\n        else:\n            kernel_motion_blur[:, int((size-1)/2)] = np.ones(size)\n        kernel_motion_blur = kernel_motion_blur / size\n        noisy = cv2.filter2D(image, -1, kernel_motion_blur)\n\n    return noisy.astype('uint8')\n\n\ndef add_noise_depth(image, level = 0.1):\n    row,col,ch= image.shape\n    noise_level = random.uniform(0, level)\n    gauss = noise_level * np.random.randn(row,col)\n    gauss = np.repeat(gauss[:, :, np.newaxis], ch, axis=2)\n    noisy = image + gauss\n    return noisy\n\n\ndef add_noise_depth_cuda(image, level = 0.1):\n    noise_level = random.uniform(0, level)\n    gauss = torch.randn_like(image) * noise_level\n    noisy = image + gauss\n    return noisy\n\ndef add_gaussian_noise_cuda(image, level = 0.1):\n\n    # gaussian noise\n    noise_level = random.uniform(0, level)\n    gauss = torch.randn_like(image) * noise_level\n    noisy = image + gauss\n    noisy = torch.clamp(noisy, 0, 1.0)\n    return noisy\n\n\ndef add_noise_cuda(image, level = 0.1):\n    # random number\n    r = np.random.rand(1)\n\n    # gaussian noise\n    if r < 0.8:\n        noise_level = random.uniform(0, level)\n        gauss = torch.randn_like(image) * noise_level\n        noisy = image + gauss\n        noisy = torch.clamp(noisy, 0, 1.0)\n    else:\n        # motion blur\n        sizes = [3, 5, 7, 9, 11, 15]\n        size = sizes[int(np.random.randint(len(sizes), size=1))]\n        kernel_motion_blur = torch.zeros((size, size))\n        if np.random.rand(1) < 0.5:\n            kernel_motion_blur[int((size-1)/2), :] = torch.ones(size)\n        else:\n            kernel_motion_blur[:, int((size-1)/2)] = torch.ones(size)\n        kernel_motion_blur = kernel_motion_blur.cuda() / size\n        kernel_motion_blur = kernel_motion_blur.view(1, 1, size, size)\n        kernel_motion_blur = kernel_motion_blur.repeat(image.size(2), 1,  1, 1)\n\n        motion_blur_filter = nn.Conv2d(in_channels=image.size(2),\n                                       out_channels=image.size(2),\n                                       kernel_size=size,\n                                       groups=image.size(2),\n                                       bias=False,\n                                       padding=int(size/2))\n\n        motion_blur_filter.weight.data = kernel_motion_blur\n        motion_blur_filter.weight.requires_grad = False\n        noisy = motion_blur_filter(image.permute(2, 0, 1).unsqueeze(0))\n        noisy = noisy.squeeze(0).permute(1, 2, 0)\n\n    return noisy\n"
  },
  {
    "path": "lib/utils/nms.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport numpy as np\n\ndef nms(dets, thresh):\n    cls = dets[:, 1]\n    x1 = dets[:, 2]\n    y1 = dets[:, 3]\n    x2 = dets[:, 4]\n    y2 = dets[:, 5]\n    scores = dets[:, 6]\n\n    areas = (x2 - x1 + 1) * (y2 - y1 + 1)\n    order = scores.argsort()[::-1]\n\n    keep = []\n    while order.size > 0:\n        i = order[0]\n        keep.append(i)\n        xx1 = np.maximum(x1[i], x1[order[1:]])\n        yy1 = np.maximum(y1[i], y1[order[1:]])\n        xx2 = np.minimum(x2[i], x2[order[1:]])\n        yy2 = np.minimum(y2[i], y2[order[1:]])\n\n        w = np.maximum(0.0, xx2 - xx1 + 1)\n        h = np.maximum(0.0, yy2 - yy1 + 1)\n        inter = w * h\n        ovr = inter / (areas[i] + areas[order[1:]] - inter)\n\n        inds = np.where(~((ovr > thresh) & (cls[order[1:]] == cls[i])))[0]\n        #inds = np.where(ovr <= thresh)[0]\n        order = order[inds + 1]\n\n    return keep\n"
  },
  {
    "path": "lib/utils/pose_error.py",
    "content": "# Author: Tomas Hodan (hodantom@cmp.felk.cvut.cz)\n# Center for Machine Perception, Czech Technical University in Prague\n\n# Implementation of the pose error functions described in:\n# Hodan et al., \"On Evaluation of 6D Object Pose Estimation\", ECCVW 2016\n\nimport math\nimport numpy as np\nfrom scipy import spatial\nfrom transforms3d.quaternions import quat2mat, mat2quat\n\n\ndef VOCap(rec, prec):\n    index = np.where(np.isfinite(rec))[0]\n    rec = rec[index]\n    prec = prec[index]\n    if len(rec) == 0 or len(prec) == 0:\n        ap = 0\n    else:\n        mrec = np.insert(rec, 0, 0)\n        mrec = np.append(mrec, 0.1)\n        mpre = np.insert(prec, 0, 0)\n        mpre = np.append(mpre, prec[-1])\n        for i in range(1, len(mpre)):\n            mpre[i] = max(mpre[i], mpre[i-1])\n        i = np.where(mrec[1:] != mrec[:-1])[0] + 1\n        ap = np.sum(np.multiply(mrec[i] - mrec[i-1], mpre[i])) * 10\n    return ap\n\n\ndef transform_pts_Rt(pts, R, t):\n    \"\"\"\n    Applies a rigid transformation to 3D points.\n\n    :param pts: nx3 ndarray with 3D points.\n    :param R: 3x3 rotation matrix.\n    :param t: 3x1 translation vector.\n    :return: nx3 ndarray with transformed 3D points.\n    \"\"\"\n    assert(pts.shape[1] == 3)\n    pts_t = R.dot(pts.T) + t.reshape((3, 1))\n    return pts_t.T\n\ndef reproj(K, R_est, t_est, R_gt, t_gt, pts):\n    \"\"\"\n    reprojection error.\n    :param K intrinsic matrix\n    :param R_est, t_est: Estimated pose (3x3 rot. matrix and 3x1 trans. vector).\n    :param R_gt, t_gt: GT pose (3x3 rot. matrix and 3x1 trans. vector).\n    :param model: Object model given by a dictionary where item 'pts'\n    is nx3 ndarray with 3D model points.\n    :return: Error of pose_est w.r.t. pose_gt.\n    \"\"\"\n    pts_est = transform_pts_Rt(pts, R_est, t_est)\n    pts_gt = transform_pts_Rt(pts, R_gt, t_gt)\n\n    pixels_est = K.dot(pts_est.T)\n    pixels_est = pixels_est.T\n    pixels_gt = K.dot(pts_gt.T)\n    pixels_gt = pixels_gt.T\n\n    n = pts.shape[0]\n    est = np.zeros((n, 2), dtype=np.float32);\n    est[:, 0] = np.divide(pixels_est[:, 0], pixels_est[:, 2])\n    est[:, 1] = np.divide(pixels_est[:, 1], pixels_est[:, 2])\n\n    gt = np.zeros((n, 2), dtype=np.float32);\n    gt[:, 0] = np.divide(pixels_gt[:, 0], pixels_gt[:, 2])\n    gt[:, 1] = np.divide(pixels_gt[:, 1], pixels_gt[:, 2])\n\n    e = np.linalg.norm(est - gt, axis=1).mean()\n    return e\n\ndef add(R_est, t_est, R_gt, t_gt, pts):\n    \"\"\"\n    Average Distance of Model Points for objects with no indistinguishable views\n    - by Hinterstoisser et al. (ACCV 2012).\n\n    :param R_est, t_est: Estimated pose (3x3 rot. matrix and 3x1 trans. vector).\n    :param R_gt, t_gt: GT pose (3x3 rot. matrix and 3x1 trans. vector).\n    :param model: Object model given by a dictionary where item 'pts'\n    is nx3 ndarray with 3D model points.\n    :return: Error of pose_est w.r.t. pose_gt.\n    \"\"\"\n    pts_est = transform_pts_Rt(pts, R_est, t_est)\n    pts_gt = transform_pts_Rt(pts, R_gt, t_gt)\n    e = np.linalg.norm(pts_est - pts_gt, axis=1).mean()\n    return e\n\ndef adi(R_est, t_est, R_gt, t_gt, pts):\n    \"\"\"\n    Average Distance of Model Points for objects with indistinguishable views\n    - by Hinterstoisser et al. (ACCV 2012).\n\n    :param R_est, t_est: Estimated pose (3x3 rot. matrix and 3x1 trans. vector).\n    :param R_gt, t_gt: GT pose (3x3 rot. matrix and 3x1 trans. vector).\n    :param model: Object model given by a dictionary where item 'pts'\n    is nx3 ndarray with 3D model points.\n    :return: Error of pose_est w.r.t. pose_gt.\n    \"\"\"\n    pts_est = transform_pts_Rt(pts, R_est, t_est)\n    pts_gt = transform_pts_Rt(pts, R_gt, t_gt)\n\n    # Calculate distances to the nearest neighbors from pts_gt to pts_est\n    nn_index = spatial.cKDTree(pts_est)\n    nn_dists, _ = nn_index.query(pts_gt, k=1)\n\n    e = nn_dists.mean()\n    return e\n\ndef re(R_est, R_gt):\n    \"\"\"\n    Rotational Error.\n\n    :param R_est: Rotational element of the estimated pose (3x1 vector).\n    :param R_gt: Rotational element of the ground truth pose (3x1 vector).\n    :return: Error of t_est w.r.t. t_gt.\n    \"\"\"\n    assert(R_est.shape == R_gt.shape == (3, 3))\n    error_cos = 0.5 * (np.trace(R_est.dot(np.linalg.inv(R_gt))) - 1.0)\n    error_cos = min(1.0, max(-1.0, error_cos)) # Avoid invalid values due to numerical errors\n    error = math.acos(error_cos)\n    error = 180.0 * error / np.pi # [rad] -> [deg]\n    return error\n\ndef te(t_est, t_gt):\n    \"\"\"\n    Translational Error.\n\n    :param t_est: Translation element of the estimated pose (3x1 vector).\n    :param t_gt: Translation element of the ground truth pose (3x1 vector).\n    :return: Error of t_est w.r.t. t_gt.\n    \"\"\"\n    assert(t_est.size == t_gt.size == 3)\n    error = np.linalg.norm(t_gt - t_est)\n    return error\n"
  },
  {
    "path": "lib/utils/se3.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport numpy as np\nfrom transforms3d.quaternions import mat2quat, quat2mat, qmult, qinverse\nfrom transforms3d.euler import quat2euler, mat2euler, euler2quat\n\n# RT is a 3x4 matrix\ndef se3_inverse(RT):\n    R = RT[0:3, 0:3]\n    T = RT[0:3, 3].reshape((3,1))\n    RT_new = np.zeros((3, 4), dtype=np.float32)\n    RT_new[0:3, 0:3] = R.transpose()\n    RT_new[0:3, 3] = -1 * np.dot(R.transpose(), T).reshape((3))\n    return RT_new\n\ndef se3_mul(RT1, RT2):\n    R1 = RT1[0:3, 0:3]\n    T1 = RT1[0:3, 3].reshape((3,1))\n\n    R2 = RT2[0:3, 0:3]\n    T2 = RT2[0:3, 3].reshape((3,1))\n\n    RT_new = np.zeros((3, 4), dtype=np.float32)\n    RT_new[0:3, 0:3] = np.dot(R1, R2)\n    T_new = np.dot(R1, T2) + T1\n    RT_new[0:3, 3] = T_new.reshape((3))\n    return RT_new\n\n\ndef egocentric2allocentric(qt, T):\n    dx = np.arctan2(T[0], -T[2])\n    dy = np.arctan2(T[1], -T[2])\n    quat = euler2quat(-dy, -dx, 0, axes='sxyz')\n    quat = qmult(qinverse(quat), qt)\n    return quat\n\n\ndef allocentric2egocentric(qt, T):\n    dx = np.arctan2(T[0], -T[2])\n    dy = np.arctan2(T[1], -T[2])\n    quat = euler2quat(-dy, -dx, 0, axes='sxyz')\n    quat = qmult(quat, qt)\n    return quat\n\n\ndef T_inv_transform(T_src, T_tgt):\n    '''\n    :param T_src: \n    :param T_tgt:\n    :return: T_delta: delta in pixel \n    '''\n    T_delta = np.zeros((3, ), dtype=np.float32)\n\n    T_delta[0] = T_tgt[0] / T_tgt[2] - T_src[0] / T_src[2]\n    T_delta[1] = T_tgt[1] / T_tgt[2] - T_src[1] / T_src[2]\n    T_delta[2] = np.log(T_src[2] / T_tgt[2])\n\n    return T_delta\n\n\ndef rotation_x(theta):\n    t = theta * np.pi / 180.0\n    R = np.zeros((3, 3), dtype=np.float32)\n    R[0, 0] = 1\n    R[1, 1] = np.cos(t)\n    R[1, 2] = -np.sin(t)\n    R[2, 1] = np.sin(t)\n    R[2, 2] = np.cos(t)\n    return R\n\ndef rotation_y(theta):\n    t = theta * np.pi / 180.0\n    R = np.zeros((3, 3), dtype=np.float32)\n    R[0, 0] = np.cos(t)\n    R[0, 2] = np.sin(t)\n    R[1, 1] = 1\n    R[2, 0] = -np.sin(t)\n    R[2, 2] = np.cos(t)\n    return R\n\ndef rotation_z(theta):\n    t = theta * np.pi / 180.0\n    R = np.zeros((3, 3), dtype=np.float32)\n    R[0, 0] = np.cos(t)\n    R[0, 1] = -np.sin(t)\n    R[1, 0] = np.sin(t)\n    R[1, 1] = np.cos(t)\n    R[2, 2] = 1\n    return R\n"
  },
  {
    "path": "lib/utils/segmentation_evaluation.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport sys, os\nimport numpy as np\nimport cv2\n\n# This function is modeled off of P/R/F measure as described by Dave et al. (arXiv19)\ndef multilabel_metrics(prediction, gt, num_classes):\n    \"\"\" Computes F-Measure, Precision, Recall, IoU, #objects detected, #confident objects detected, #GT objects.\n        It computes these measures only of objects, not background (0)/table (1).\n        Uses the Hungarian algorithm to match predicted masks with ground truth masks.\n\n        A \"confident object\" is an object that is predicted with more than 0.75 F-measure\n\n        @param gt: a [H x W] numpy.ndarray with ground truth masks\n        @param prediction: a [H x W] numpy.ndarray with predicted masks\n\n        @return: a dictionary with the metrics\n    \"\"\"\n\n    precisions = np.zeros((num_classes, ), dtype=np.float32)\n    recalls = np.zeros((num_classes, ), dtype=np.float32)\n    f1s = np.zeros((num_classes, ), dtype=np.float32)\n    count = np.zeros((num_classes, ), dtype=np.float32)\n\n    # for each class\n    for cls in range(num_classes):\n\n        gt_mask = (gt == cls)\n        pred_mask = (prediction == cls)\n        A = np.logical_and(pred_mask, gt_mask)\n\n        count_true = np.count_nonzero(A)\n        count_pred = np.count_nonzero(pred_mask)\n        count_gt = np.count_nonzero(gt_mask)\n\n        # precision\n        if count_pred > 0:\n            precisions[cls] = float(count_true) / float(count_pred)\n            \n        # recall\n        if count_gt > 0:\n            recalls[cls] = float(count_true) / float(count_gt)\n            count[cls] = 1\n            \n        # F-measure\n        if precisions[cls] + recalls[cls] != 0:\n            f1s[cls] = (2 * precisions[cls] * recalls[cls]) / (precisions[cls] + recalls[cls])\n\n\n    return {'F-measure' : f1s,\n            'Precision' : precisions,\n            'Recall' : recalls,\n            'Count': count}\n"
  },
  {
    "path": "lib/utils/setup.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport os\nfrom os.path import join as pjoin\nimport numpy as np\nfrom distutils.core import setup\nfrom distutils.extension import Extension\nfrom Cython.Distutils import build_ext\n\ndef find_in_path(name, path):\n    \"Find a file in a search path\"\n    #adapted fom http://code.activestate.com/recipes/52224-find-a-file-given-a-search-path/\n    for dir in path.split(os.pathsep):\n        binpath = pjoin(dir, name)\n        if os.path.exists(binpath):\n            return os.path.abspath(binpath)\n    return None\n\ndef locate_cuda():\n    \"\"\"Locate the CUDA environment on the system\n\n    Returns a dict with keys 'home', 'nvcc', 'include', and 'lib64'\n    and values giving the absolute path to each directory.\n\n    Starts by looking for the CUDAHOME env variable. If not found, everything\n    is based on finding 'nvcc' in the PATH.\n    \"\"\"\n\n    # first check if the CUDAHOME env variable is in use\n    if 'CUDAHOME' in os.environ:\n        home = os.environ['CUDAHOME']\n        nvcc = pjoin(home, 'bin', 'nvcc')\n    else:\n        # otherwise, search the PATH for NVCC\n        default_path = pjoin(os.sep, 'usr', 'local', 'cuda', 'bin')\n        nvcc = find_in_path('nvcc', os.environ['PATH'] + os.pathsep + default_path)\n        if nvcc is None:\n            raise EnvironmentError('The nvcc binary could not be '\n                'located in your $PATH. Either add it to your path, or set $CUDAHOME')\n        home = os.path.dirname(os.path.dirname(nvcc))\n\n    cudaconfig = {'home':home, 'nvcc':nvcc,\n                  'include': pjoin(home, 'include'),\n                  'lib64': pjoin(home, 'lib64')}\n    for k, v in cudaconfig.items():\n        if not os.path.exists(v):\n            raise EnvironmentError('The CUDA %s path could not be located in %s' % (k, v))\n\n    return cudaconfig\nCUDA = locate_cuda()\n\n# Obtain the numpy include directory.  This logic works across numpy versions.\ntry:\n    numpy_include = np.get_include()\nexcept AttributeError:\n    numpy_include = np.get_numpy_include()\n\ndef customize_compiler_for_nvcc(self):\n    \"\"\"inject deep into distutils to customize how the dispatch\n    to gcc/nvcc works.\n\n    If you subclass UnixCCompiler, it's not trivial to get your subclass\n    injected in, and still have the right customizations (i.e.\n    distutils.sysconfig.customize_compiler) run on it. So instead of going\n    the OO route, I have this. Note, it's kindof like a wierd functional\n    subclassing going on.\"\"\"\n\n    # tell the compiler it can processes .cu\n    self.src_extensions.append('.cu')\n\n    # save references to the default compiler_so and _comple methods\n    default_compiler_so = self.compiler_so\n    super = self._compile\n\n    # now redefine the _compile method. This gets executed for each\n    # object but distutils doesn't have the ability to change compilers\n    # based on source extension: we add it.\n    def _compile(obj, src, ext, cc_args, extra_postargs, pp_opts):\n        if os.path.splitext(src)[1] == '.cu':\n            # use the cuda for .cu files\n            self.set_executable('compiler_so', CUDA['nvcc'])\n            # use only a subset of the extra_postargs, which are 1-1 translated\n            # from the extra_compile_args in the Extension class\n            postargs = extra_postargs['nvcc']\n        else:\n            postargs = extra_postargs['gcc']\n\n        super(obj, src, ext, cc_args, postargs, pp_opts)\n        # reset the default compiler_so, which we might have changed for cuda\n        self.compiler_so = default_compiler_so\n\n    # inject our redefined _compile method into the class\n    self._compile = _compile\n\n\n# run the customize_compiler\nclass custom_build_ext(build_ext):\n    def build_extensions(self):\n        customize_compiler_for_nvcc(self.compiler)\n        build_ext.build_extensions(self)\n\next_modules = [\n    Extension(\n        \"cython_bbox\",\n        [\"bbox.pyx\"],\n        extra_compile_args={'gcc': [\"-Wno-cpp\", \"-Wno-unused-function\"]},\n        include_dirs = [numpy_include]\n    )\n]\n\nsetup(\n    name='fcn',\n    ext_modules=ext_modules,\n    # inject our custom trigger\n    cmdclass={'build_ext': custom_build_ext},\n)\n"
  },
  {
    "path": "requirement.txt",
    "content": "pyassimp == 4.1.3\nprogressbar2\npyopengl >= 3.1.0\nopencv-python == 4.2.0.34\ntransforms3d\npillow\nIPython\nmatplotlib\neasydict\npyyaml\nfuture\nscipy\nCython\n"
  },
  {
    "path": "ros/_init_paths.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\n\"\"\"Set up paths for Fast R-CNN.\"\"\"\n\nimport os.path as osp\nimport sys\n\ndef add_path(path):\n    if path not in sys.path:\n        sys.path.insert(0, path)\n\nthis_dir = osp.dirname(__file__)\n\n# Add lib to PYTHONPATH\nlib_path = osp.join(this_dir, '..', 'lib')\nadd_path(lib_path)\n\nlib_path = osp.join(this_dir, '..', 'ycb_render')\nadd_path(lib_path)\n"
  },
  {
    "path": "ros/collect_images_realsense.py",
    "content": "#!/usr/bin/env python\n\n# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\n\"\"\"collect images from Intel RealSense D435\"\"\"\n\nimport rospy\nimport message_filters\nimport cv2\nimport argparse\nimport pprint\nimport time, os, sys\nimport os.path as osp\nimport numpy as np\nimport yaml\nfrom cv_bridge import CvBridge, CvBridgeError\nfrom sensor_msgs.msg import Image, CameraInfo\n\nclass ImageListener:\n\n    def __init__(self):\n\n        self.cv_bridge = CvBridge()\n        self.count = 0\n\n        # output dir\n        this_dir = osp.dirname(__file__)\n        self.outdir = osp.join(this_dir, '..', 'data', 'images')\n        if not os.path.exists(self.outdir):\n            os.mkdir(self.outdir)\n\n        # initialize a node\n        rospy.init_node(\"image_listener\")\n        rgb_sub = message_filters.Subscriber('/camera/color/image_raw', Image, queue_size=2)\n        depth_sub = message_filters.Subscriber('/camera/aligned_depth_to_color/image_raw', Image, queue_size=2)\n        msg = rospy.wait_for_message('/camera/color/camera_info', CameraInfo)\n\n        # save camera intrinsics\n        intrinsic_matrix = np.array(msg.K).reshape(3, 3)\n        print(intrinsic_matrix)\n\n        dict_file = {'INTRINSICS' : intrinsic_matrix.flatten().tolist()}\n        filename = os.path.join(self.outdir, 'meta.yml')\n        with open(filename, 'w') as file:\n            yaml.dump(dict_file, file)\n\n        queue_size = 1\n        slop_seconds = 0.025\n        ts = message_filters.ApproximateTimeSynchronizer([rgb_sub, depth_sub], queue_size, slop_seconds)\n        ts.registerCallback(self.callback)\n\n    def callback(self, rgb, depth):\n        if depth.encoding == '32FC1':\n            depth_32 = self.cv_bridge.imgmsg_to_cv2(depth) * 1000\n            depth_cv = np.array(depth_32, dtype=np.uint16)\n        elif depth.encoding == '16UC1':\n            depth_cv = self.cv_bridge.imgmsg_to_cv2(depth)\n        else:\n            rospy.logerr_throttle(\n                1, 'Unsupported depth type. Expected 16UC1 or 32FC1, got {}'.format(\n                    depth.encoding))\n            return\n\n        # write images\n        im = self.cv_bridge.imgmsg_to_cv2(rgb, 'bgr8')\n        filename = self.outdir + '/%06d-color.png' % self.count\n        cv2.imwrite(filename, im)\n        print filename\n\n        filename = self.outdir + '/%06d-depth.png' % self.count\n        cv2.imwrite(filename, depth_cv)\n        print(filename)\n\n        self.count += 1\n\n\nif __name__ == '__main__':\n\n    # image listener\n    listener = ImageListener()\n    try:  \n        rospy.spin()\n    except KeyboardInterrupt:\n        print \"Shutting down\"\n"
  },
  {
    "path": "ros/posecnn.rviz",
    "content": "Panels:\n  - Class: rviz/Displays\n    Help Height: 0\n    Name: Displays\n    Property Tree Widget:\n      Expanded:\n        - /Global Options1\n        - /Status1\n        - /DepthCloud1\n        - /DepthCloud1/Auto Size1\n        - /rgb_input1\n        - /depth_input1\n        - /posecnn detection1\n        - /posecnn1\n        - /TF1\n        - /TF1/Frames1\n        - /DepthCloud2\n        - /DepthCloud2/Auto Size1\n        - /posecnn+sdf1\n        - /deepim1\n      Splitter Ratio: 0.829787254\n    Tree Height: 540\n  - Class: rviz/Selection\n    Name: Selection\n  - Class: rviz/Tool Properties\n    Expanded:\n      - /2D Pose Estimate1\n      - /2D Nav Goal1\n      - /Publish Point1\n    Name: Tool Properties\n    Splitter Ratio: 0.588679016\n  - Class: rviz/Views\n    Expanded:\n      - /Current View1\n    Name: Views\n    Splitter Ratio: 0.5\n  - Class: rviz/Time\n    Experimental: false\n    Name: Time\n    SyncMode: 0\n    SyncSource: rgb_input\nToolbars:\n  toolButtonStyle: 2\nVisualization Manager:\n  Class: \"\"\n  Displays:\n    - Alpha: 0.5\n      Cell Size: 1\n      Class: rviz/Grid\n      Color: 160; 160; 164\n      Enabled: true\n      Line Style:\n        Line Width: 0.0299999993\n        Value: Lines\n      Name: Grid\n      Normal Cell Count: 0\n      Offset:\n        X: 0\n        Y: 0\n        Z: 0\n      Plane: XY\n      Plane Cell Count: 10\n      Reference Frame: <Fixed Frame>\n      Value: true\n    - Alpha: 1\n      Auto Size:\n        Auto Size Factor: 1\n        Value: true\n      Autocompute Intensity Bounds: true\n      Autocompute Value Bounds:\n        Max Value: 10\n        Min Value: -10\n        Value: true\n      Axis: Z\n      Channel Name: intensity\n      Class: rviz/DepthCloud\n      Color: 255; 255; 255\n      Color Image Topic: /camera/color/image_raw\n      Color Transformer: RGB8\n      Color Transport Hint: raw\n      Decay Time: 0\n      Depth Map Topic: /camera/aligned_depth_to_color/image_raw\n      Depth Map Transport Hint: raw\n      Enabled: true\n      Invert Rainbow: false\n      Max Color: 255; 255; 255\n      Max Intensity: 4096\n      Min Color: 0; 0; 0\n      Min Intensity: 0\n      Name: DepthCloud\n      Occlusion Compensation:\n        Occlusion Time-Out: 30\n        Value: false\n      Position Transformer: XYZ\n      Queue Size: 5\n      Selectable: true\n      Size (Pixels): 3\n      Style: Flat Squares\n      Topic Filter: true\n      Use Fixed Frame: true\n      Use rainbow: true\n      Value: true\n    - Class: rviz/Image\n      Enabled: true\n      Image Topic: /camera/color/image_raw\n      Max Value: 1\n      Median window: 5\n      Min Value: 0\n      Name: rgb_input\n      Normalize Range: true\n      Queue Size: 2\n      Transport Hint: raw\n      Unreliable: false\n      Value: true\n    - Class: rviz/Image\n      Enabled: true\n      Image Topic: /camera/aligned_depth_to_color/image_raw\n      Max Value: 1\n      Median window: 5\n      Min Value: 0\n      Name: depth_input\n      Normalize Range: true\n      Queue Size: 2\n      Transport Hint: raw\n      Unreliable: false\n      Value: true\n    - Class: rviz/Image\n      Enabled: true\n      Image Topic: /posecnn_label_00\n      Max Value: 1\n      Median window: 5\n      Min Value: 0\n      Name: posecnn detection\n      Normalize Range: true\n      Queue Size: 2\n      Transport Hint: raw\n      Unreliable: false\n      Value: true\n    - Class: rviz/Image\n      Enabled: true\n      Image Topic: /posecnn_pose_00\n      Max Value: 1\n      Median window: 5\n      Min Value: 0\n      Name: posecnn\n      Normalize Range: true\n      Queue Size: 2\n      Transport Hint: raw\n      Unreliable: false\n      Value: true\n    - Class: rviz/TF\n      Enabled: true\n      Frame Timeout: 1\n      Frames:\n        All Enabled: false\n        deepim/00_extra_large_clamp_01:\n          Value: true\n        deepim/00_tomato_soup_can_01:\n          Value: true\n        measured/camera_aligned_depth_to_color_frame:\n          Value: false\n        measured/camera_aligned_depth_to_infra1_frame:\n          Value: false\n        measured/camera_color_frame:\n          Value: false\n        measured/camera_color_optical_frame:\n          Value: false\n        measured/camera_depth_frame:\n          Value: false\n        measured/camera_depth_optical_frame:\n          Value: false\n        measured/camera_infra1_frame:\n          Value: false\n        measured/camera_infra1_optical_frame:\n          Value: false\n        measured/camera_infra2_frame:\n          Value: false\n        measured/camera_infra2_optical_frame:\n          Value: false\n        measured/camera_link:\n          Value: false\n        posecnn/00_extra_large_clamp_01:\n          Value: true\n        posecnn/00_extra_large_clamp_01_refined:\n          Value: true\n        posecnn/00_extra_large_clamp_01_roi:\n          Value: true\n        posecnn/00_scissors_01:\n          Value: true\n        posecnn/00_scissors_01_refined:\n          Value: true\n        posecnn/00_scissors_01_roi:\n          Value: true\n        posecnn/00_scissors_02:\n          Value: true\n        posecnn/00_scissors_02_refined:\n          Value: true\n        posecnn/00_scissors_02_roi:\n          Value: true\n        posecnn/00_tomato_soup_can_01:\n          Value: true\n        posecnn/00_tomato_soup_can_01_refined:\n          Value: true\n        posecnn/00_tomato_soup_can_01_roi:\n          Value: true\n      Marker Scale: 0.5\n      Name: TF\n      Show Arrows: false\n      Show Axes: true\n      Show Names: false\n      Tree:\n        measured/camera_link:\n          measured/camera_aligned_depth_to_color_frame:\n            measured/camera_color_optical_frame:\n              deepim/00_extra_large_clamp_01:\n                {}\n              deepim/00_tomato_soup_can_01:\n                {}\n              posecnn/00_extra_large_clamp_01:\n                {}\n              posecnn/00_extra_large_clamp_01_refined:\n                {}\n              posecnn/00_extra_large_clamp_01_roi:\n                {}\n              posecnn/00_scissors_01:\n                {}\n              posecnn/00_scissors_01_refined:\n                {}\n              posecnn/00_scissors_01_roi:\n                {}\n              posecnn/00_scissors_02:\n                {}\n              posecnn/00_scissors_02_refined:\n                {}\n              posecnn/00_scissors_02_roi:\n                {}\n              posecnn/00_tomato_soup_can_01:\n                {}\n              posecnn/00_tomato_soup_can_01_refined:\n                {}\n              posecnn/00_tomato_soup_can_01_roi:\n                {}\n          measured/camera_aligned_depth_to_infra1_frame:\n            measured/camera_infra1_optical_frame:\n              {}\n          measured/camera_color_frame:\n            {}\n          measured/camera_depth_frame:\n            measured/camera_depth_optical_frame:\n              {}\n          measured/camera_infra1_frame:\n            {}\n          measured/camera_infra2_frame:\n            measured/camera_infra2_optical_frame:\n              {}\n      Update Interval: 0\n      Value: true\n    - Alpha: 1\n      Auto Size:\n        Auto Size Factor: 1\n        Value: true\n      Autocompute Intensity Bounds: true\n      Autocompute Value Bounds:\n        Max Value: 10\n        Min Value: -10\n        Value: true\n      Axis: Z\n      Channel Name: intensity\n      Class: rviz/DepthCloud\n      Color: 255; 255; 255\n      Color Image Topic: /camera/color/image_raw\n      Color Transformer: RGB8\n      Color Transport Hint: raw\n      Decay Time: 0\n      Depth Map Topic: /camera/aligned_depth_to_color/image_raw\n      Depth Map Transport Hint: raw\n      Enabled: true\n      Invert Rainbow: false\n      Max Color: 255; 255; 255\n      Max Intensity: 4096\n      Min Color: 0; 0; 0\n      Min Intensity: 0\n      Name: DepthCloud\n      Occlusion Compensation:\n        Occlusion Time-Out: 30\n        Value: false\n      Position Transformer: XYZ\n      Queue Size: 5\n      Selectable: true\n      Size (Pixels): 3\n      Style: Flat Squares\n      Topic Filter: true\n      Use Fixed Frame: true\n      Use rainbow: true\n      Value: true\n    - Class: rviz/Image\n      Enabled: true\n      Image Topic: /posecnn_pose_refined_00\n      Max Value: 1\n      Median window: 5\n      Min Value: 0\n      Name: posecnn+sdf\n      Normalize Range: true\n      Queue Size: 2\n      Transport Hint: raw\n      Unreliable: false\n      Value: true\n    - Class: rviz/Image\n      Enabled: true\n      Image Topic: /deepim_pose_image_00\n      Max Value: 1\n      Median window: 5\n      Min Value: 0\n      Name: deepim\n      Normalize Range: true\n      Queue Size: 2\n      Transport Hint: raw\n      Unreliable: false\n      Value: true\n  Enabled: true\n  Global Options:\n    Background Color: 48; 48; 48\n    Default Light: true\n    Fixed Frame: measured/camera_color_optical_frame\n    Frame Rate: 30\n  Name: root\n  Tools:\n    - Class: rviz/Interact\n      Hide Inactive Objects: true\n    - Class: rviz/MoveCamera\n    - Class: rviz/Select\n    - Class: rviz/FocusCamera\n    - Class: rviz/Measure\n    - Class: rviz/SetInitialPose\n      Topic: /initialpose\n    - Class: rviz/SetGoal\n      Topic: /move_base_simple/goal\n    - Class: rviz/PublishPoint\n      Single click: true\n      Topic: /clicked_point\n  Value: true\n  Views:\n    Current:\n      Class: rviz/Orbit\n      Distance: 0.48041454\n      Enable Stereo Rendering:\n        Stereo Eye Separation: 0.0599999987\n        Stereo Focal Distance: 1\n        Swap Stereo Eyes: false\n        Value: false\n      Focal Point:\n        X: 0.0808260292\n        Y: 0.0394595489\n        Z: 0.310144812\n      Focal Shape Fixed Size: true\n      Focal Shape Size: 0.0500000007\n      Invert Z Axis: false\n      Name: Current View\n      Near Clip Distance: 0.00999999978\n      Pitch: -1.56979632\n      Target Frame: <Fixed Frame>\n      Value: Orbit (rviz)\n      Yaw: 4.7208395\n    Saved: ~\nWindow Geometry:\n  Displays:\n    collapsed: false\n  Height: 1145\n  Hide Left Dock: false\n  Hide Right Dock: false\n  QMainWindow State: 000000ff00000000fd00000004000000000000024300000268fc0200000009fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006600fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c00610079007301000001a100000268000000e200fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000a0049006d006100670065010000037f000000b7000000000000000000000001000001ee00000268fc0200000005fb00000012007200670062005f0069006e00700075007401000001a10000012e0000001b00fffffffb0000001600640065007000740068005f0069006e00700075007401000002d5000001340000001b00fffffffb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fc0000023d000001f90000000000fffffffa000000000100000002fb0000000a0049006d0061006700650100000000ffffffff0000000000000000fb0000000a005600690065007700730000000551000001ee0000011e00fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b20000000000000000000000020000073d00000173fc010000000cfb000000220070006f007300650063006e006e00200064006500740065006300740069006f006e0100000000000001d0000000db00fffffffb0000000e0070006f007300650063006e006e01000001d6000001ce0000007e00fffffffb0000000a0049006d00610067006501000003e7000001a70000000000000000fb000000160070006f007300650063006e006e002b00730064006601000003aa000001c9000000a600fffffffb000000160070006f007300650063006e006e002b0073006400660100000302000001770000000000000000fb0000000c00640065006500700069006d0100000579000001c40000007700fffffffb0000001600640065007000740068005f0069006e0070007500740100000000000001aa0000000000000000fb00000012007200670062005f0069006e00700075007401000001b0000001c20000000000000000fb000000100050006f0073006500520042005000460100000378000001de0000000000000000fb0000000e0050006f007300650043004e004e010000055c000001e30000000000000000fb0000000a00560069006500770073030000004e00000080000002e100000197fb000000160050006f007300650043004e004e0020006f006c006401000006b30000008c0000000000000000000000030000073d00000046fc0100000002fb0000000800540069006d006501000000000000073d000003cc00fffffffb0000000800540069006d00650100000000000004500000000000000000000003000000026800000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000\n  Selection:\n    collapsed: false\n  Time:\n    collapsed: false\n  Tool Properties:\n    collapsed: false\n  Views:\n    collapsed: false\n  Width: 1853\n  X: 67\n  Y: 27\n  deepim:\n    collapsed: false\n  depth_input:\n    collapsed: false\n  posecnn:\n    collapsed: false\n  posecnn detection:\n    collapsed: false\n  posecnn+sdf:\n    collapsed: false\n  rgb_input:\n    collapsed: false\n"
  },
  {
    "path": "ros/test_images.py",
    "content": "#!/usr/bin/env python\n\n# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\n\"\"\"Test a PoseCNN on images\"\"\"\n\nimport torch\nimport torch.nn.parallel\nimport torch.backends.cudnn as cudnn\nimport torch.utils.data\n\nimport tf\nimport rosnode\nimport message_filters\nimport cv2\nimport torch.nn as nn\nimport threading\n\nimport argparse\nimport pprint\nimport time, os, sys\nimport os.path as osp\nimport numpy as np\nimport time\nimport rospy\nimport _init_paths\nimport networks\n\nfrom fcn.test_imageset import test_image\nfrom cv_bridge import CvBridge, CvBridgeError\nfrom fcn.config import cfg, cfg_from_file, get_output_dir\nfrom datasets.factory import get_dataset\nfrom std_msgs.msg import String\nfrom sensor_msgs.msg import Image, CameraInfo\nfrom transforms3d.quaternions import mat2quat, quat2mat, qmult\nfrom scipy.optimize import minimize\nfrom utils.blob import pad_im, chromatic_transform, add_noise\nfrom geometry_msgs.msg import PoseStamped\nfrom ycb_renderer import YCBRenderer\nfrom utils.se3 import *\nfrom utils.nms import *\nfrom Queue import Queue\nfrom sdf.sdf_optimizer import sdf_optimizer\n\nlock = threading.Lock()\n\nclass ImageListener:\n\n    def __init__(self, network, dataset):\n\n        self.net = network\n        self.dataset = dataset\n        self.cv_bridge = CvBridge()\n        self.renders = dict()\n\n        self.im = None\n        self.depth = None\n        self.rgb_frame_id = None\n\n        suffix = '_%02d' % (cfg.instance_id)\n        prefix = '%02d_' % (cfg.instance_id)\n        self.suffix = suffix\n        self.prefix = prefix\n        fusion_type = ''\n\n        # initialize a node\n        rospy.init_node(\"posecnn_rgb\")\n        self.br = tf.TransformBroadcaster()\n        self.label_pub = rospy.Publisher('posecnn_label' + fusion_type + suffix, Image, queue_size=10)\n        self.pose_pub = rospy.Publisher('posecnn_pose' + fusion_type + suffix, Image, queue_size=10)\n        self.pose_refined_pub = rospy.Publisher('posecnn_pose_refined' + fusion_type + suffix, Image, queue_size=10)\n\n        # create pose publisher for each known object class\n        self.pubs = []\n        for i in range(1, self.dataset.num_classes):\n            if self.dataset.classes[i][3] == '_':\n                cls = prefix + self.dataset.classes[i][4:]\n            else:\n                cls = prefix + self.dataset.classes[i]\n            cls = cls + fusion_type\n            self.pubs.append(rospy.Publisher('/objects/prior_pose/' + cls, PoseStamped, queue_size=10))\n\n        if cfg.TEST.ROS_CAMERA == 'D435':\n            # use RealSense D435\n            rgb_sub = message_filters.Subscriber('/camera/color/image_raw', Image, queue_size=10)\n            depth_sub = message_filters.Subscriber('/camera/aligned_depth_to_color/image_raw', Image, queue_size=10)\n            msg = rospy.wait_for_message('/camera/color/camera_info', CameraInfo)\n            self.base_frame = 'measured/camera_color_optical_frame'\n        elif cfg.TEST.ROS_CAMERA == 'Azure':             \n            rgb_sub = message_filters.Subscriber('/rgb/image_raw', Image, queue_size=10)\n            depth_sub = message_filters.Subscriber('/depth_to_rgb/image_raw', Image, queue_size=10)\n            msg = rospy.wait_for_message('/rgb/camera_info', CameraInfo)\n            self.base_frame = 'rgb_camera_link'\n        else:\n            # use kinect\n            rgb_sub = message_filters.Subscriber('/%s/rgb/image_color' % (cfg.TEST.ROS_CAMERA), Image, queue_size=2)\n            depth_sub = message_filters.Subscriber('/%s/depth_registered/image' % (cfg.TEST.ROS_CAMERA), Image, queue_size=2)\n            msg = rospy.wait_for_message('/%s/rgb/camera_info' % (cfg.TEST.ROS_CAMERA), CameraInfo)\n            self.base_frame = '%s_depth_optical_frame' % (cfg.TEST.ROS_CAMERA)\n\n        # update camera intrinsics\n        K = np.array(msg.K).reshape(3, 3)\n        self.dataset._intrinsic_matrix = K\n        print(self.dataset._intrinsic_matrix)\n\n        queue_size = 1\n        slop_seconds = 0.1\n        ts = message_filters.ApproximateTimeSynchronizer([rgb_sub, depth_sub], queue_size, slop_seconds)\n        ts.registerCallback(self.callback_rgbd)\n\n    def callback_rgbd(self, rgb, depth):\n\n        if depth.encoding == '32FC1':\n            depth_cv = self.cv_bridge.imgmsg_to_cv2(depth)\n        elif depth.encoding == '16UC1':\n            depth_cv = self.cv_bridge.imgmsg_to_cv2(depth).copy().astype(np.float32)\n            depth_cv /= 1000.0\n        else:\n            rospy.logerr_throttle(\n                1, 'Unsupported depth type. Expected 16UC1 or 32FC1, got {}'.format(\n                    depth.encoding))\n            return\n\n        im = self.cv_bridge.imgmsg_to_cv2(rgb, 'bgr8')\n\n        with lock:\n            self.im = im.copy()\n            self.depth = depth_cv.copy()\n            self.rgb_frame_id = rgb.header.frame_id\n        \n    def run_network(self):\n\n        with lock:\n            if listener.im is None:\n                return\n            im = self.im.copy()\n            depth_cv = self.depth.copy()\n            rgb_frame_id = self.rgb_frame_id\n\n        fusion_type = ''\n        start_time = time.time()\n        im_pose, im_pose_refined, im_label, labels, rois, poses, poses_refined = test_image(self.net, self.dataset, im, depth_cv)\n        print(\"--- %s seconds ---\" % (time.time() - start_time))\n\n        # publish label image\n        label_msg = self.cv_bridge.cv2_to_imgmsg(im_label)\n        label_msg.header.stamp = rospy.Time.now()\n        label_msg.header.frame_id = rgb_frame_id\n        label_msg.encoding = 'rgb8'\n        self.label_pub.publish(label_msg)\n\n        # publish pose image\n        pose_msg = self.cv_bridge.cv2_to_imgmsg(im_pose)\n        pose_msg.header.stamp = rospy.Time.now()\n        pose_msg.header.frame_id = rgb_frame_id\n        pose_msg.encoding = 'rgb8'\n        self.pose_pub.publish(pose_msg)\n\n        # publish pose refined image\n        pose_msg = self.cv_bridge.cv2_to_imgmsg(im_pose_refined)\n        pose_msg.header.stamp = rospy.Time.now()\n        pose_msg.header.frame_id = rgb_frame_id\n        pose_msg.encoding = 'rgb8'\n        self.pose_refined_pub.publish(pose_msg)\n\n        indexes = np.zeros((self.dataset.num_classes, ), dtype=np.int32)\n        if not rois.shape[0]:\n            return\n\n        index = np.argsort(rois[:, 2])\n        rois = rois[index, :]\n        poses = poses[index, :]\n        if poses_refined is not None:\n            poses_refined = poses_refined[index, :]\n        for i in range(rois.shape[0]):\n            cls = int(rois[i, 1])\n            if cls > 0 and rois[i, -1] > cfg.TEST.DET_THRESHOLD:\n                if not np.any(poses[i, 4:]):\n                    continue\n\n                if self.dataset.classes[cls][3] == '_':\n                    name = self.prefix + self.dataset.classes[cls][4:]\n                else:\n                    name = self.prefix + self.dataset.classes[cls]\n                name = name + fusion_type\n                indexes[cls] += 1\n                name = name + '_%02d' % (indexes[cls])\n                tf_name = os.path.join(\"posecnn\", name)\n\n                # send transformation as bounding box (mis-used)\n                n = np.linalg.norm(rois[i, 2:6])\n                x1 = rois[i, 2] / n\n                y1 = rois[i, 3] / n\n                x2 = rois[i, 4] / n\n                y2 = rois[i, 5] / n\n                now = rospy.Time.now()\n                self.br.sendTransform([n, now.secs, 0], [x1, y1, x2, y2], now, tf_name + '_roi', self.base_frame)\n\n                # send poses\n                quat = [poses[i, 1], poses[i, 2], poses[i, 3], poses[i, 0]]\n                self.br.sendTransform(poses[i, 4:7], quat, rospy.Time.now(), tf_name, self.base_frame)\n\n                # send poses refined\n                if poses_refined is not None:\n                    quat = [poses_refined[i, 1], poses_refined[i, 2], poses_refined[i, 3], poses_refined[i, 0]]\n                    self.br.sendTransform(poses_refined[i, 4:7], quat, rospy.Time.now(), tf_name + '_refined', self.base_frame)\n\n                # create pose msg\n                msg = PoseStamped()\n                msg.header.stamp = rospy.Time.now()\n                msg.header.frame_id = self.base_frame\n                msg.pose.orientation.x = poses[i, 1]\n                msg.pose.orientation.y = poses[i, 2]\n                msg.pose.orientation.z = poses[i, 3]\n                msg.pose.orientation.w = poses[i, 0]\n                msg.pose.position.x = poses[i, 4]\n                msg.pose.position.y = poses[i, 5]\n                msg.pose.position.z = poses[i, 6]\n                pub = self.pubs[cls - 1]\n                pub.publish(msg)\n\n\ndef parse_args():\n    \"\"\"\n    Parse input arguments\n    \"\"\"\n    parser = argparse.ArgumentParser(description='Test a PoseCNN network')\n    parser.add_argument('--gpu', dest='gpu_id', help='GPU id to use',\n                        default=0, type=int)\n    parser.add_argument('--instance', dest='instance_id', help='PoseCNN instance id to use',\n                        default=0, type=int)\n    parser.add_argument('--pretrained', dest='pretrained',\n                        help='initialize with pretrained checkpoint',\n                        default=None, type=str)\n    parser.add_argument('--cfg', dest='cfg_file',\n                        help='optional config file', default=None, type=str)\n    parser.add_argument('--dataset', dest='dataset_name',\n                        help='dataset to train on',\n                        default='shapenet_scene_train', type=str)\n    parser.add_argument('--rand', dest='randomize',\n                        help='randomize (do not use a fixed seed)',\n                        action='store_true')\n    parser.add_argument('--network', dest='network_name',\n                        help='name of the network',\n                        default=None, type=str)\n    parser.add_argument('--cad', dest='cad_name',\n                        help='name of the CAD file',\n                        default=None, type=str)\n    parser.add_argument('--pose', dest='pose_name',\n                        help='name of the pose files',\n                        default=None, type=str)\n    parser.add_argument('--background', dest='background_name',\n                        help='name of the background file',\n                        default=None, type=str)\n\n    if len(sys.argv) == 1:\n        parser.print_help()\n        sys.exit(1)\n\n    args = parser.parse_args()\n    return args\n\n\nif __name__ == '__main__':\n    args = parse_args()\n\n    print('Called with args:')\n    print(args)\n\n    if args.cfg_file is not None:\n        cfg_from_file(args.cfg_file)\n\n    print('Using config:')\n    pprint.pprint(cfg)\n\n    if not args.randomize:\n        # fix the random seeds (numpy and caffe) for reproducibility\n        np.random.seed(cfg.RNG_SEED)\n\n    # device\n    cfg.device = torch.device('cuda:{:d}'.format(0))\n    print('GPU device {:d}'.format(args.gpu_id))\n    cfg.gpu_id = args.gpu_id\n    cfg.instance_id = args.instance_id\n\n    # dataset\n    cfg.MODE = 'TEST'\n    cfg.TEST.SYNTHESIZE = False\n    cfg.TEST.VISUALIZE = False\n    dataset = get_dataset(args.dataset_name)\n\n    # prepare network\n    if args.pretrained:\n        network_data = torch.load(args.pretrained)\n        print(\"=> using pre-trained network '{}'\".format(args.pretrained))\n    else:\n        network_data = None\n        print(\"no pretrained network specified\")\n        sys.exit()\n\n    network = networks.__dict__[args.network_name](dataset.num_classes, cfg.TRAIN.NUM_UNITS, network_data).cuda(device=cfg.device)\n    network = torch.nn.DataParallel(network, device_ids=[0]).cuda(device=cfg.device)\n    cudnn.benchmark = True\n\n    if cfg.TRAIN.POSE_REG:\n        print('loading 3D models')\n        cfg.renderer = YCBRenderer(width=cfg.TRAIN.SYN_WIDTH, height=cfg.TRAIN.SYN_HEIGHT, gpu_id=args.gpu_id, render_marker=False)\n        model_mesh_paths = [dataset.model_mesh_paths[i-1] for i in cfg.TEST.CLASSES[1:]]\n        model_texture_paths = [dataset.model_texture_paths[i-1] for i in cfg.TEST.CLASSES[1:]]\n        model_colors = [dataset.model_colors[i-1] for i in cfg.TEST.CLASSES[1:]]\n        cfg.renderer.load_objects(model_mesh_paths, model_texture_paths, model_colors)\n        cfg.renderer.set_camera_default()\n        print(dataset.model_mesh_paths)\n\n    # load sdfs\n    if cfg.TEST.POSE_REFINE:\n        print('loading SDFs')\n        sdf_files = []\n        for i in cfg.TEST.CLASSES[1:]:\n            sdf_files.append(dataset.model_sdf_paths[i-1])\n        cfg.sdf_optimizer = sdf_optimizer(cfg.TEST.CLASSES[1:], sdf_files)\n\n    # image listener\n    network.eval()\n    listener = ImageListener(network, dataset)\n\n    while not rospy.is_shutdown():       \n       listener.run_network()\n"
  },
  {
    "path": "tools/_init_paths.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\n\"\"\"Set up paths for Fast R-CNN.\"\"\"\n\nimport os.path as osp\nimport sys\n\ndef add_path(path):\n    if path not in sys.path:\n        sys.path.insert(0, path)\n\nthis_dir = osp.dirname(__file__)\n\n# Add lib to PYTHONPATH\nlib_path = osp.join(this_dir, '..', 'lib')\nadd_path(lib_path)\n\nlib_path = osp.join(this_dir, '..', 'ycb_render')\nadd_path(lib_path)\n"
  },
  {
    "path": "tools/test_images.py",
    "content": "#!/usr/bin/env python3\n\n# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\n\"\"\"Test a PoseCNN on images\"\"\"\n\nimport torch\nimport torch.nn.parallel\nimport torch.backends.cudnn as cudnn\nimport torch.utils.data\n\nimport argparse\nimport pprint\nimport time, os, sys\nimport os.path as osp\nimport numpy as np\nimport cv2\nimport scipy.io\nimport glob\n\nimport _init_paths\nfrom fcn.test_imageset import test_image\nfrom fcn.config import cfg, cfg_from_file, yaml_from_file, get_output_dir\nfrom datasets.factory import get_dataset\nimport networks\nfrom ycb_renderer import YCBRenderer\nfrom utils.blob import pad_im\nfrom sdf.sdf_optimizer import sdf_optimizer\n\ndef parse_args():\n    \"\"\"\n    Parse input arguments\n    \"\"\"\n    parser = argparse.ArgumentParser(description='Test a PoseCNN network')\n    parser.add_argument('--gpu', dest='gpu_id', help='GPU id to use',\n                        default=0, type=int)\n    parser.add_argument('--pretrained', dest='pretrained',\n                        help='initialize with pretrained checkpoint',\n                        default=None, type=str)\n    parser.add_argument('--pretrained_encoder', dest='pretrained_encoder',\n                        help='initialize with pretrained encoder checkpoint',\n                        default=None, type=str)\n    parser.add_argument('--codebook', dest='codebook',\n                        help='codebook',\n                        default=None, type=str)\n    parser.add_argument('--cfg', dest='cfg_file',\n                        help='optional config file', default=None, type=str)\n    parser.add_argument('--meta', dest='meta_file',\n                        help='optional metadata file', default=None, type=str)\n    parser.add_argument('--dataset', dest='dataset_name',\n                        help='dataset to train on',\n                        default='shapenet_scene_train', type=str)\n    parser.add_argument('--depth', dest='depth_name',\n                        help='depth image pattern',\n                        default='*depth.png', type=str)\n    parser.add_argument('--color', dest='color_name',\n                        help='color image pattern',\n                        default='*color.png', type=str)\n    parser.add_argument('--imgdir', dest='imgdir',\n                        help='path of the directory with the test images',\n                        default='data/Images', type=str)\n    parser.add_argument('--rand', dest='randomize',\n                        help='randomize (do not use a fixed seed)',\n                        action='store_true')\n    parser.add_argument('--network', dest='network_name',\n                        help='name of the network',\n                        default=None, type=str)\n    parser.add_argument('--background', dest='background_name',\n                        help='name of the background file',\n                        default=None, type=str)\n\n    if len(sys.argv) == 1:\n        parser.print_help()\n        sys.exit(1)\n\n    args = parser.parse_args()\n    return args\n\n\nif __name__ == '__main__':\n    args = parse_args()\n\n    print('Called with args:')\n    print(args)\n\n    if args.cfg_file is not None:\n        cfg_from_file(args.cfg_file)\n\n    if len(cfg.TEST.CLASSES) == 0:\n        cfg.TEST.CLASSES = cfg.TRAIN.CLASSES\n\n    if args.meta_file is not None:\n        meta = yaml_from_file(args.meta_file)\n        # overwrite test classes\n        print(meta)\n        if 'ycb_ids' in meta:\n            cfg.TEST.CLASSES = [0]\n            for i in meta.ycb_ids:\n                cfg.TEST.CLASSES.append(i)\n            print('TEST CLASSES:', cfg.TEST.CLASSES)\n        if 'INTRINSICS' in meta:\n            cfg.INTRINSICS = meta['INTRINSICS']\n\n    print('Using config:')\n    pprint.pprint(cfg)\n\n    if not args.randomize:\n        # fix the random seeds (numpy and caffe) for reproducibility\n        np.random.seed(cfg.RNG_SEED)\n\n    # device\n    cfg.gpu_id = args.gpu_id\n    cfg.device = torch.device('cuda:{:d}'.format(cfg.gpu_id))\n    cfg.instance_id = 0\n    print('GPU device {:d}'.format(args.gpu_id))\n\n    # dataset\n    cfg.MODE = 'TEST'\n    cfg.TEST.SYNTHESIZE = False\n    dataset = get_dataset(args.dataset_name)\n\n    # overwrite intrinsics\n    if len(cfg.INTRINSICS) > 0:\n        K = np.array(cfg.INTRINSICS).reshape(3, 3)\n        if cfg.TEST.SCALES_BASE[0] != 1:\n            scale = cfg.TEST.SCALES_BASE[0]\n            K[0, 0] *= scale\n            K[0, 2] *= scale\n            K[1, 1] *= scale\n            K[1, 2] *= scale\n        dataset._intrinsic_matrix = K\n        print(dataset._intrinsic_matrix)\n\n    # list images\n    images_color = []\n    filename = os.path.join(args.imgdir, args.color_name)\n    files = glob.glob(filename)\n    for i in range(len(files)):\n        filename = files[i]\n        images_color.append(filename)\n    images_color.sort()\n\n    images_depth = []\n    filename = os.path.join(args.imgdir, args.depth_name)\n    files = glob.glob(filename)\n    for i in range(len(files)):\n        filename = files[i]\n        images_depth.append(filename)\n    images_depth.sort()\n\n    if cfg.TEST.VISUALIZE:\n        index_images = np.random.permutation(len(images_color))\n    else:\n        index_images = range(len(images_color))\n        resdir = args.imgdir + '_posecnn_results'\n        if not os.path.exists(resdir):\n            os.makedirs(resdir)\n\n    # prepare network\n    if args.pretrained:\n        network_data = torch.load(args.pretrained)\n        print(\"=> using pre-trained network '{}'\".format(args.pretrained))\n    else:\n        network_data = None\n        print(\"no pretrained network specified\")\n        sys.exit()\n\n    network = networks.__dict__[args.network_name](dataset.num_classes, cfg.TRAIN.NUM_UNITS, network_data).cuda(device=cfg.device)\n    network = torch.nn.DataParallel(network, device_ids=[cfg.gpu_id]).cuda(device=cfg.device)\n    cudnn.benchmark = True\n    network.eval()\n\n    print('loading 3D models')\n    cfg.renderer = YCBRenderer(width=cfg.TRAIN.SYN_WIDTH, height=cfg.TRAIN.SYN_HEIGHT, gpu_id=args.gpu_id, render_marker=False)\n    if cfg.TEST.SYNTHESIZE:\n        cfg.renderer.load_objects(dataset.model_mesh_paths, dataset.model_texture_paths, dataset.model_colors)\n    else:\n        model_mesh_paths = [dataset.model_mesh_paths[i-1] for i in cfg.TEST.CLASSES[1:]]\n        model_texture_paths = [dataset.model_texture_paths[i-1] for i in cfg.TEST.CLASSES[1:]]\n        model_colors = [dataset.model_colors[i-1] for i in cfg.TEST.CLASSES[1:]]\n        cfg.renderer.load_objects(model_mesh_paths, model_texture_paths, model_colors)\n    cfg.renderer.set_camera_default()\n    print(dataset.model_mesh_paths)\n\n    # load sdfs\n    if cfg.TEST.POSE_REFINE:\n        print('loading SDFs')\n        sdf_files = []\n        for i in cfg.TEST.CLASSES[1:]:\n            sdf_files.append(dataset.model_sdf_paths[i-1])\n        cfg.sdf_optimizer = sdf_optimizer(cfg.TEST.CLASSES[1:], sdf_files)\n\n    # for each image\n    for i in index_images:\n        im = pad_im(cv2.imread(images_color[i], cv2.IMREAD_COLOR), 16)\n        print(images_color[i])\n        if len(images_depth) > 0 and osp.exists(images_depth[i]):\n            depth = pad_im(cv2.imread(images_depth[i], cv2.IMREAD_UNCHANGED), 16)\n            depth = depth.astype('float') / 1000.0\n            print(images_depth[i])\n        else:\n            depth = None\n            print('no depth image')\n\n        # rescale image if necessary\n        if cfg.TEST.SCALES_BASE[0] != 1:\n            im_scale = cfg.TEST.SCALES_BASE[0]\n            im = pad_im(cv2.resize(im, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_LINEAR), 16)\n            if depth is not None:\n                depth = pad_im(cv2.resize(depth, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_NEAREST), 16)\n\n        # run network\n        im_pose, im_pose_refined, im_label, labels, rois, poses, poses_refined = test_image(network, dataset, im, depth)\n\n        # save result\n        if not cfg.TEST.VISUALIZE:\n\n            # map the roi index\n            for j in range(rois.shape[0]):\n                rois[j, 1] = cfg.TRAIN.CLASSES.index(cfg.TEST.CLASSES[int(rois[j, 1])])\n\n            result = {'labels': labels, 'rois': rois, 'poses': poses, 'poses_refined': poses_refined, 'intrinsic_matrix': dataset._intrinsic_matrix}\n            head, tail = os.path.split(images_color[i])\n            filename = os.path.join(resdir, tail + '.mat')\n            scipy.io.savemat(filename, result, do_compression=True)\n            # rendered image\n            filename = os.path.join(resdir, tail + '_render.jpg')\n            cv2.imwrite(filename, im_pose[:, :, (2, 1, 0)])\n            filename = os.path.join(resdir, tail + '_render_refined.jpg')\n            cv2.imwrite(filename, im_pose_refined[:, :, (2, 1, 0)])\n"
  },
  {
    "path": "tools/test_net.py",
    "content": "#!/usr/bin/env python3\n\n# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\n\"\"\"Test a DeepIM network on an image database.\"\"\"\n\nimport torch\nimport torch.nn.parallel\nimport torch.backends.cudnn as cudnn\nimport torch.utils.data\n\nimport argparse\nimport pprint\nimport time, os, sys\nimport os.path as osp\nimport numpy as np\nimport random\nimport scipy.io\n\nimport _init_paths\nfrom fcn.test_dataset import test\nfrom fcn.config import cfg, cfg_from_file, get_output_dir\nfrom datasets.factory import get_dataset\nimport networks\nfrom ycb_renderer import YCBRenderer\nfrom sdf.sdf_optimizer import sdf_optimizer\n\ndef parse_args():\n    \"\"\"\n    Parse input arguments\n    \"\"\"\n    parser = argparse.ArgumentParser(description='Test a PoseCNN network')\n    parser.add_argument('--gpu', dest='gpu_id', help='GPU id to use',\n                        default=0, type=int)\n    parser.add_argument('--pretrained', dest='pretrained',\n                        help='initialize with pretrained checkpoint',\n                        default=None, type=str)\n    parser.add_argument('--cfg', dest='cfg_file',\n                        help='optional config file', default=None, type=str)\n    parser.add_argument('--dataset', dest='dataset_name',\n                        help='dataset to train on',\n                        default='shapenet_scene_train', type=str)\n    parser.add_argument('--dataset_background', dest='dataset_background_name',\n                        help='background dataset to train on',\n                        default='background_nvidia', type=str)\n    parser.add_argument('--rand', dest='randomize',\n                        help='randomize (do not use a fixed seed)',\n                        action='store_true')\n    parser.add_argument('--network', dest='network_name',\n                        help='name of the network',\n                        default=None, type=str)\n    parser.add_argument('--background', dest='background_name',\n                        help='name of the background file',\n                        default=None, type=str)\n\n    if len(sys.argv) == 1:\n        parser.print_help()\n        sys.exit(1)\n\n    args = parser.parse_args()\n    return args\n\nif __name__ == '__main__':\n    args = parse_args()\n\n    print('Called with args:')\n    print(args)\n\n    if args.cfg_file is not None:\n        cfg_from_file(args.cfg_file)\n\n    if len(cfg.TEST.CLASSES) == 0:\n        cfg.TEST.CLASSES = cfg.TRAIN.CLASSES\n    print('Using config:')\n    pprint.pprint(cfg)\n\n    if not args.randomize:\n        # fix the random seeds (numpy and caffe) for reproducibility\n        np.random.seed(cfg.RNG_SEED)\n\n    # device\n    cfg.gpu_id = 0\n    cfg.device = torch.device('cuda:{:d}'.format(cfg.gpu_id))\n    print('GPU device {:d}'.format(args.gpu_id))\n\n    # prepare dataset\n    if cfg.TEST.VISUALIZE:\n        shuffle = True\n        np.random.seed()\n    else:\n        shuffle = False\n    cfg.MODE = 'TEST'\n    dataset = get_dataset(args.dataset_name)\n    worker_init_fn = dataset.worker_init_fn if hasattr(dataset, 'worker_init_fn') else None\n    dataloader = torch.utils.data.DataLoader(dataset, batch_size=cfg.TEST.IMS_PER_BATCH, shuffle=shuffle,\n        num_workers=0, worker_init_fn=worker_init_fn)\n    print('Use dataset `{:s}` for test'.format(dataset.name))\n\n    if cfg.TRAIN.SYN_BACKGROUND_SPECIFIC:\n        background_dataset = get_dataset(args.dataset_background_name)\n    else:\n        background_dataset = get_dataset('background_coco')\n    background_loader = torch.utils.data.DataLoader(background_dataset, batch_size=cfg.TEST.IMS_PER_BATCH,\n                                                    shuffle=True, num_workers=1)\n\n    # overwrite intrinsics\n    if len(cfg.INTRINSICS) > 0:\n        K = np.array(cfg.INTRINSICS).reshape(3, 3)\n        dataset._intrinsic_matrix = K\n        background_dataset._intrinsic_matrix = K\n        print(dataset._intrinsic_matrix)\n\n    # output directory\n    cfg.TEST.MODEL = args.pretrained.split('/')[-1]\n    output_dir = get_output_dir(dataset, None)\n    output_dir = os.path.join(output_dir, cfg.TEST.MODEL)\n    print('Output will be saved to `{:s}`'.format(output_dir))\n    if not os.path.exists(output_dir):\n        os.makedirs(output_dir)\n\n    # prepare network\n    if args.pretrained:\n        network_data = torch.load(args.pretrained)\n        if isinstance(network_data, dict) and 'model' in network_data:\n            network_data = network_data['model']\n        print(\"=> using pre-trained network '{}'\".format(args.pretrained))\n    else:\n        network_data = None\n        print(\"no pretrained network specified\")\n        sys.exit()\n\n    network = networks.__dict__[args.network_name](dataset.num_classes, cfg.TRAIN.NUM_UNITS, network_data).cuda(device=cfg.device)\n    network = torch.nn.DataParallel(network, device_ids=[cfg.gpu_id]).cuda(device=cfg.device)\n    cudnn.benchmark = True\n\n    # renderer\n    if cfg.TEST.SYNTHESIZE or cfg.TEST.POSE_REFINE:\n        cfg.renderer = YCBRenderer(width=cfg.TRAIN.SYN_WIDTH, height=cfg.TRAIN.SYN_HEIGHT, gpu_id=args.gpu_id, render_marker=False)\n        if cfg.TEST.SYNTHESIZE:\n            cfg.renderer.load_objects(dataset.model_mesh_paths, dataset.model_texture_paths, dataset.model_colors)\n        else:\n            model_mesh_paths = [dataset.model_mesh_paths[i-1] for i in cfg.TEST.CLASSES[1:]]\n            model_texture_paths = [dataset.model_texture_paths[i-1] for i in cfg.TEST.CLASSES[1:]]\n            model_colors = [dataset.model_colors[i-1] for i in cfg.TEST.CLASSES[1:]]\n            cfg.renderer.load_objects(model_mesh_paths, model_texture_paths, model_colors)\n        cfg.renderer.set_camera_default()\n\n    # load sdfs\n    if cfg.TEST.POSE_REFINE:\n        print('loading SDFs')\n        sdf_files = []\n        for i in cfg.TEST.CLASSES[1:]:\n            sdf_files.append(dataset.model_sdf_paths[i-1])\n        cfg.sdf_optimizer = sdf_optimizer(cfg.TEST.CLASSES[1:], sdf_files)\n\n    # test network\n    test(dataloader, background_loader, network, output_dir)\n\n    # evaluation\n    dataset.evaluation(output_dir)\n"
  },
  {
    "path": "tools/train_net.py",
    "content": "#!/usr/bin/env python3\n\n# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\n\"\"\"Train a PoseCNN on an image database.\"\"\"\n\nimport torch\nimport torch.nn.parallel\nimport torch.backends.cudnn as cudnn\nimport torch.optim\nimport torch.utils.data\n\nimport argparse\nimport pprint\nimport numpy as np\nimport sys\nimport os\nimport os.path as osp\nimport cv2\n\nimport _init_paths\nimport datasets\nimport networks\nfrom fcn.config import cfg, cfg_from_file, get_output_dir\nfrom fcn.train import train\nfrom datasets.factory import get_dataset\n\ndef parse_args():\n    \"\"\"\n    Parse input arguments\n    \"\"\"\n    parser = argparse.ArgumentParser(description='Train a PoseCNN network')\n    parser.add_argument('--epochs', dest='epochs',\n                        help='number of epochs to train',\n                        default=40000, type=int)\n    parser.add_argument('--startepoch', dest='startepoch',\n                        help='the starting epoch',\n                        default=0, type=int)\n    parser.add_argument('--pretrained', dest='pretrained',\n                        help='initialize with pretrained checkpoint',\n                        default=None, type=str)\n    parser.add_argument('--cfg', dest='cfg_file',\n                        help='optional config file',\n                        default=None, type=str)\n    parser.add_argument('--solver', dest='solver',\n                        help='solver type',\n                        default='sgd', type=str)\n    parser.add_argument('--dataset', dest='dataset_name',\n                        help='dataset to train on',\n                        default='shapenet_scene_train', type=str)\n    parser.add_argument('--dataset_background', dest='dataset_background_name',\n                        help='background dataset to train on',\n                        default='background_nvidia', type=str)\n    parser.add_argument('--rand', dest='randomize',\n                        help='randomize (do not use a fixed seed)',\n                        action='store_true')\n    parser.add_argument('--network', dest='network_name',\n                        help='name of the network',\n                        default=None, type=str)\n\n    if len(sys.argv) == 1:\n        parser.print_help()\n        sys.exit(1)\n\n    args = parser.parse_args()\n    return args\n\n\nif __name__ == '__main__':\n    args = parse_args()\n\n    print('Called with args:')\n    print(args)\n\n    if args.cfg_file is not None:\n        cfg_from_file(args.cfg_file)\n\n    print('Using config:')\n    pprint.pprint(cfg)\n\n    if not args.randomize:\n        # fix the random seeds (numpy and caffe) for reproducibility\n        np.random.seed(cfg.RNG_SEED)\n\n    # prepare dataset\n    cfg.MODE = 'TRAIN'\n    dataset = get_dataset(args.dataset_name)\n    worker_init_fn = dataset.worker_init_fn if hasattr(dataset, 'worker_init_fn') else None\n    if cfg.TRAIN.SYNTHESIZE:\n        num_workers = 0\n    else:\n        num_workers = 4\n    dataloader = torch.utils.data.DataLoader(dataset, batch_size=cfg.TRAIN.IMS_PER_BATCH, shuffle=True, \n        num_workers=num_workers, worker_init_fn=worker_init_fn)\n    print('Use dataset `{:s}` for training'.format(dataset.name))\n\n    # background dataset\n    if cfg.TRAIN.SYN_BACKGROUND_SPECIFIC:\n        background_dataset = get_dataset(args.dataset_background_name)\n    else:\n        background_dataset = get_dataset('background_coco')\n    background_loader = torch.utils.data.DataLoader(background_dataset, batch_size=cfg.TRAIN.IMS_PER_BATCH,\n                                                    shuffle=True, num_workers=4)\n\n    # overwrite intrinsics\n    if len(cfg.INTRINSICS) > 0:\n        K = np.array(cfg.INTRINSICS).reshape(3, 3)\n        dataset._intrinsic_matrix = K\n        background_dataset._intrinsic_matrix = K\n        print(dataset._intrinsic_matrix)\n\n    # output directory\n    output_dir = get_output_dir(dataset, None)\n    print('Output will be saved to `{:s}`'.format(output_dir))\n    if not os.path.exists(output_dir):\n        os.makedirs(output_dir)\n\n    # prepare network\n    if args.pretrained:\n        network_data = torch.load(args.pretrained)\n        if isinstance(network_data, dict) and 'model' in network_data:\n            network_data = network_data['model']\n        print(\"=> using pre-trained network '{}'\".format(args.network_name))\n    else:\n        network_data = None\n        print(\"=> creating network '{}'\".format(args.network_name))\n\n    network = networks.__dict__[args.network_name](dataset.num_classes, cfg.TRAIN.NUM_UNITS, network_data).cuda()\n    if torch.cuda.device_count() > 1:\n        cfg.TRAIN.GPUNUM = torch.cuda.device_count()\n        print(\"Let's use\", torch.cuda.device_count(), \"GPUs!\")\n    network = torch.nn.DataParallel(network).cuda()\n    cudnn.benchmark = True\n\n    # renderer\n    if cfg.TRAIN.SYNTHESIZE:\n        from ycb_renderer import YCBRenderer\n        print('loading 3D models')\n        cfg.renderer = YCBRenderer(width=cfg.TRAIN.SYN_WIDTH, height=cfg.TRAIN.SYN_HEIGHT, render_marker=False)\n        cfg.renderer.load_objects(dataset.model_mesh_paths, dataset.model_texture_paths, dataset.model_colors)\n        cfg.renderer.set_camera_default()\n        print(dataset.model_mesh_paths)\n\n    # optimizer\n    assert(args.solver in ['adam', 'sgd'])\n    print('=> setting {} solver'.format(args.solver))\n    param_groups = [{'params': network.module.bias_parameters(), 'weight_decay': cfg.TRAIN.WEIGHT_DECAY},\n                    {'params': network.module.weight_parameters(), 'weight_decay': cfg.TRAIN.WEIGHT_DECAY}]\n\n    if args.solver == 'adam':\n        optimizer = torch.optim.Adam(param_groups, cfg.TRAIN.LEARNING_RATE,\n                                     betas=(cfg.TRAIN.MOMENTUM, cfg.TRAIN.BETA))\n    elif args.solver == 'sgd':\n        optimizer = torch.optim.SGD(param_groups, cfg.TRAIN.LEARNING_RATE,\n                                    momentum=cfg.TRAIN.MOMENTUM)\n        scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, \n                        milestones=[m - args.startepoch for m in cfg.TRAIN.MILESTONES], gamma=cfg.TRAIN.GAMMA)\n    cfg.epochs = args.epochs\n\n    # main loop\n    for epoch in range(args.startepoch, args.epochs):\n        if args.solver == 'sgd':\n            scheduler.step()\n\n        train(dataloader, background_loader, network, optimizer, epoch)\n\n        # save checkpoint\n        if (epoch+1) % cfg.TRAIN.SNAPSHOT_EPOCHS == 0 or epoch == args.epochs - 1:\n            state = network.module.state_dict()\n            infix = ('_' + cfg.TRAIN.SNAPSHOT_INFIX\n                     if cfg.TRAIN.SNAPSHOT_INFIX != '' else '')\n            filename = (cfg.TRAIN.SNAPSHOT_PREFIX + infix + '_epoch_{:d}'.format(epoch+1) + '.checkpoint.pth')\n            torch.save(state, os.path.join(output_dir, filename))\n            print(filename)\n"
  },
  {
    "path": "ycb_render/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.8.12)\nproject(CppYCBRenderer)\n\nfind_package(CUDA REQUIRED)\nset(CUDA_LIBRARIES PUBLIC ${CUDA_LIBRARIES})\n\ninclude_directories(glad)\n\nadd_subdirectory(pybind11)\n\ncuda_add_library(CppYCBRenderer MODULE glad/egl.c glad/gl.c cpp/ycb_renderer.cpp)\n\ntarget_link_libraries(CppYCBRenderer PRIVATE pybind11::module dl pthread)\nset_target_properties(CppYCBRenderer PROPERTIES PREFIX \"${PYTHON_MODULE_PREFIX}\"\n                                         SUFFIX \"${PYTHON_MODULE_EXTENSION}\")\n\nadd_executable(query_devices glad/egl.c glad/gl.c cpp/query_devices.cpp)\nadd_executable(test_device glad/egl.c glad/gl.c cpp/test_device.cpp)\n\ntarget_link_libraries(query_devices dl pthread)\ntarget_link_libraries(test_device dl pthread)\n"
  },
  {
    "path": "ycb_render/__init__.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n"
  },
  {
    "path": "ycb_render/cpp/query_devices.cpp",
    "content": "// Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n// This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n// text can be found in LICENSE.md\n\n//g++  glad/egl.c glad/gl.c egl.cpp -I glad -lpthread -ldl\n#include <stdio.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdbool.h>\n#include <unistd.h>\n\n#include  <glad/egl.h>\n#include  <glad/gl.h>\nstruct EGLInternalData2 {\n    bool m_isInitialized;\n\n    int m_windowWidth;\n    int m_windowHeight;\n    int m_renderDevice;\n\n\n    EGLBoolean success;\n    EGLint num_configs;\n    EGLConfig egl_config;\n    EGLSurface egl_surface;\n    EGLContext egl_context;\n    EGLDisplay egl_display;\n\n    EGLInternalData2()\n    : m_isInitialized(false),\n    m_windowWidth(0),\n    m_windowHeight(0) {}\n};\n\nint main(){\n\n\n    int m_windowWidth;\n    int m_windowHeight;\n    int m_renderDevice;\n    \n    EGLBoolean success;\n    EGLint num_configs;\n    EGLConfig egl_config;\n    EGLSurface egl_surface;\n    EGLContext egl_context;\n    EGLDisplay egl_display;\n    \n    m_windowWidth = 256;\n    m_windowHeight = 256;\n    m_renderDevice = -1;\n\n    EGLint egl_config_attribs[] = {EGL_RED_SIZE,\n        8,\n        EGL_GREEN_SIZE,\n        8,\n        EGL_BLUE_SIZE,\n        8,\n        EGL_DEPTH_SIZE,\n        8,\n        EGL_SURFACE_TYPE,\n        EGL_PBUFFER_BIT,\n        EGL_RENDERABLE_TYPE,\n        EGL_OPENGL_BIT,\n        EGL_NONE};\n    \n    EGLint egl_pbuffer_attribs[] = {\n        EGL_WIDTH, m_windowWidth, EGL_HEIGHT, m_windowHeight,\n        EGL_NONE,\n    };\n    \n    EGLInternalData2* m_data = new EGLInternalData2();\n\n    // Load EGL functions\n    int egl_version = gladLoaderLoadEGL(NULL);\n    if(!egl_version) {\n        fprintf(stderr, \"failed to EGL with glad.\\n\");\n        exit(EXIT_FAILURE);\n    };\n\n    // Query EGL Devices\n    const int max_devices = 32;\n    EGLDeviceEXT egl_devices[max_devices];\n    EGLint num_devices = 0;\n    EGLint egl_error = eglGetError();\n    if (!eglQueryDevicesEXT(max_devices, egl_devices, &num_devices) ||\n        egl_error != EGL_SUCCESS) {\n        printf(\"eglQueryDevicesEXT Failed.\\n\");\n        m_data->egl_display = EGL_NO_DISPLAY;\n    }\n\n    printf(\"%d\", num_devices);\n\n    return 0;\n}\n\n\n"
  },
  {
    "path": "ycb_render/cpp/test_device.cpp",
    "content": "// Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n// This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n// text can be found in LICENSE.md\n\n//g++  glad/egl.c glad/gl.c egl.cpp -I glad -lpthread -ldl\n#include <stdio.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdbool.h>\n#include <unistd.h>\n\n#include  <glad/egl.h>\n#include  <glad/gl.h>\nstruct EGLInternalData2 {\n    bool m_isInitialized;\n\n    int m_windowWidth;\n    int m_windowHeight;\n    int m_renderDevice;\n\n    EGLBoolean success;\n    EGLint num_configs;\n    EGLConfig egl_config;\n    EGLSurface egl_surface;\n    EGLContext egl_context;\n    EGLDisplay egl_display;\n\n    EGLInternalData2()\n    : m_isInitialized(false),\n    m_windowWidth(0),\n    m_windowHeight(0) {}\n};\n\nint main(int argc, char ** argv){\n\n\n    int m_windowWidth;\n    int m_windowHeight;\n    int m_renderDevice;\n    \n    EGLBoolean success;\n    EGLint num_configs;\n    EGLConfig egl_config;\n    EGLSurface egl_surface;\n    EGLContext egl_context;\n    EGLDisplay egl_display;\n    \n    m_windowWidth = 256;\n    m_windowHeight = 256;\n    m_renderDevice = -1;\n\n    EGLint egl_config_attribs[] = {EGL_RED_SIZE,\n        8,\n        EGL_GREEN_SIZE,\n        8,\n        EGL_BLUE_SIZE,\n        8,\n        EGL_DEPTH_SIZE,\n        8,\n        EGL_SURFACE_TYPE,\n        EGL_PBUFFER_BIT,\n        EGL_RENDERABLE_TYPE,\n        EGL_OPENGL_BIT,\n        EGL_NONE};\n    \n    EGLint egl_pbuffer_attribs[] = {\n        EGL_WIDTH, m_windowWidth, EGL_HEIGHT, m_windowHeight,\n        EGL_NONE,\n    };\n    \n    EGLInternalData2* m_data = new EGLInternalData2();\n\n    // Load EGL functions\n    int egl_version = gladLoaderLoadEGL(NULL);\n    if(!egl_version) {\n        fprintf(stderr, \"failed to EGL with glad.\\n\");\n        exit(EXIT_FAILURE);\n\n    };\n\n    // Query EGL Devices\n    const int max_devices = 32;\n    EGLDeviceEXT egl_devices[max_devices];\n    EGLint num_devices = 0;\n    EGLint egl_error = eglGetError();\n    if (!eglQueryDevicesEXT(max_devices, egl_devices, &num_devices) ||\n        egl_error != EGL_SUCCESS) {\n        printf(\"eglQueryDevicesEXT Failed.\\n\");\n        m_data->egl_display = EGL_NO_DISPLAY;\n    }\n\n    //printf(\"number of devices found %d\\n\", num_devices);\n\n    \n    m_data->m_renderDevice = atoi(argv[1]);\n\n        // Set display\n        EGLDisplay display = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT,\n                                                      egl_devices[m_data->m_renderDevice], NULL);\n        if (eglGetError() == EGL_SUCCESS && display != EGL_NO_DISPLAY) {\n            int major, minor;\n            EGLBoolean initialized = eglInitialize(display, &major, &minor);\n            if (eglGetError() == EGL_SUCCESS && initialized == EGL_TRUE) {\n                m_data->egl_display = display;\n            }\n        }\n\n    if (!eglInitialize(m_data->egl_display, NULL, NULL)) {\n        fprintf(stderr, \"Unable to initialize EGL\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    egl_version = gladLoaderLoadEGL(m_data->egl_display);\n    if (!egl_version) {\n        fprintf(stderr, \"Unable to reload EGL.\\n\");\n        exit(EXIT_FAILURE);\n    }\n    printf(\"Loaded EGL %d.%d after reload.\\n\", GLAD_VERSION_MAJOR(egl_version),\n           GLAD_VERSION_MINOR(egl_version));\n\n\n    m_data->success = eglBindAPI(EGL_OPENGL_API);\n    if (!m_data->success) {\n        // TODO: Properly handle this error (requires change to default window\n        // API to change return on all window types to bool).\n        fprintf(stderr, \"Failed to bind OpenGL API.\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    m_data->success =\n    eglChooseConfig(m_data->egl_display, egl_config_attribs,\n                    &m_data->egl_config, 1, &m_data->num_configs);\n    if (!m_data->success) {\n        // TODO: Properly handle this error (requires change to default window\n        // API to change return on all window types to bool).\n        fprintf(stderr, \"Failed to choose config (eglError: %d)\\n\", eglGetError());\n        exit(EXIT_FAILURE);\n    }\n    if (m_data->num_configs != 1) {\n        fprintf(stderr, \"Didn't get exactly one config, but %d\\n\", m_data->num_configs);\n        exit(EXIT_FAILURE);\n    }\n\n    m_data->egl_surface = eglCreatePbufferSurface(\n                                                  m_data->egl_display, m_data->egl_config, egl_pbuffer_attribs);\n    if (m_data->egl_surface == EGL_NO_SURFACE) {\n        fprintf(stderr, \"Unable to create EGL surface (eglError: %d)\\n\", eglGetError());\n        exit(EXIT_FAILURE);\n    }\n\n\n    m_data->egl_context = eglCreateContext(\n                                           m_data->egl_display, m_data->egl_config, EGL_NO_CONTEXT, NULL);\n    if (!m_data->egl_context) {\n        fprintf(stderr, \"Unable to create EGL context (eglError: %d)\\n\",eglGetError());\n        exit(EXIT_FAILURE);\n    }\n\n    m_data->success =\n        eglMakeCurrent(m_data->egl_display, m_data->egl_surface, m_data->egl_surface,\n                   m_data->egl_context);\n    if (!m_data->success) {\n        fprintf(stderr, \"Failed to make context current (eglError: %d)\\n\", eglGetError());\n        exit(EXIT_FAILURE);\n    }\n\n    if (!gladLoadGL(eglGetProcAddress)) {\n        fprintf(stderr, \"failed to load GL with glad.\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    const GLubyte* ven = glGetString(GL_VENDOR);\n    printf(\"GL_VENDOR=%s\\n\", ven);\n\n    const GLubyte* ren = glGetString(GL_RENDERER);\n    printf(\"GL_RENDERER=%s\\n\", ren);\n    const GLubyte* ver = glGetString(GL_VERSION);\n    printf(\"GL_VERSION=%s\\n\", ver);\n    const GLubyte* sl = glGetString(GL_SHADING_LANGUAGE_VERSION);\n    printf(\"GL_SHADING_LANGUAGE_VERSION=%s\\n\", sl);\n\n    return 0;\n}\n\n\n"
  },
  {
    "path": "ycb_render/cpp/ycb_renderer.cpp",
    "content": "// Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n// This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n// text can be found in LICENSE.md\n\n//g++  glad/egl.c glad/gl.c egl.cpp -I glad -lpthread -ldl\n#include <stdio.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdbool.h>\n#include <unistd.h>\n\n#include  <glad/egl.h>\n#include  <glad/gl.h>\n#include <pybind11/pybind11.h>\n#include <pybind11/numpy.h>\n#include <pybind11/stl.h>\n#include <cstdint>\n\n#include <cuda_runtime.h>\n#include <cuda_gl_interop.h>\n\n#define MAX_NUM_RESOURCES 10\n\nnamespace py = pybind11;\n\nstruct EGLInternalData2 {\n    bool m_isInitialized;\n\n    int m_windowWidth;\n    int m_windowHeight;\n    int m_renderDevice;\n\n    EGLBoolean success;\n    EGLint num_configs;\n    EGLConfig egl_config;\n    EGLSurface egl_surface;\n    EGLContext egl_context;\n    EGLDisplay egl_display;\n\n    EGLInternalData2()\n    : m_isInitialized(false),\n    m_windowWidth(0),\n    m_windowHeight(0) {}\n};\n\n\nclass CppYCBRenderer{\npublic:\n    CppYCBRenderer(int w, int h, int d):m_windowHeight(h),m_windowWidth(w),m_renderDevice(d) {};\n\n    int m_windowWidth;\n    int m_windowHeight;\n    int m_renderDevice;\n\n    EGLBoolean success;\n    EGLint num_configs;\n    EGLConfig egl_config;\n    EGLSurface egl_surface;\n    EGLContext egl_context;\n    EGLDisplay egl_display;\n\n\n    EGLInternalData2* m_data = NULL;\n\n    cudaGraphicsResource* cuda_res[MAX_NUM_RESOURCES];\n\n\n    int init() {\n\n    m_data = new EGLInternalData2();\n\n    EGLint egl_config_attribs[] = {EGL_RED_SIZE,\n        8,\n        EGL_GREEN_SIZE,\n        8,\n        EGL_BLUE_SIZE,\n        8,\n        EGL_DEPTH_SIZE,\n        8,\n        EGL_SURFACE_TYPE,\n        EGL_PBUFFER_BIT,\n        EGL_RENDERABLE_TYPE,\n        EGL_OPENGL_BIT,\n        EGL_NONE};\n\n    EGLint egl_pbuffer_attribs[] = {\n        EGL_WIDTH, m_windowWidth, EGL_HEIGHT, m_windowHeight,\n        EGL_NONE,\n    };\n\n    for (int i = 0; i < MAX_NUM_RESOURCES; i++)\n        cuda_res[i] = NULL;\n\n    // Load EGL functions\n    int egl_version = gladLoaderLoadEGL(NULL);\n    if(!egl_version) {\n        fprintf(stderr, \"failed to EGL with glad.\\n\");\n        exit(EXIT_FAILURE);\n\n    };\n\n    // Query EGL Devices\n    const int max_devices = 32;\n    EGLDeviceEXT egl_devices[max_devices];\n    EGLint num_devices = 0;\n    EGLint egl_error = eglGetError();\n    if (!eglQueryDevicesEXT(max_devices, egl_devices, &num_devices) ||\n        egl_error != EGL_SUCCESS) {\n        printf(\"eglQueryDevicesEXT Failed.\\n\");\n        m_data->egl_display = EGL_NO_DISPLAY;\n    }\n\n    printf(\"number of devices found %d\\n\", num_devices);\n\n    m_data->m_renderDevice = m_renderDevice;\n    // Query EGL Screens\n    if(m_data->m_renderDevice == -1) {\n        // Chose default screen, by trying all\n        for (EGLint i = 0; i < num_devices; ++i) {\n            // Set display\n            EGLDisplay display = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT,\n                                                          egl_devices[i], NULL);\n            if (eglGetError() == EGL_SUCCESS && display != EGL_NO_DISPLAY) {\n                int major, minor;\n                EGLBoolean initialized = eglInitialize(display, &major, &minor);\n                if (eglGetError() == EGL_SUCCESS && initialized == EGL_TRUE) {\n                    m_data->egl_display = display;\n                }\n            }\n        }\n    } else {\n        // Chose specific screen, by using m_renderDevice\n        if (m_data->m_renderDevice < 0 || m_data->m_renderDevice >= num_devices) {\n            fprintf(stderr, \"Invalid render_device choice: %d < %d.\\n\", m_data->m_renderDevice, num_devices);\n            exit(EXIT_FAILURE);\n        }\n\n        // Set display\n        EGLDisplay display = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT,\n                                                      egl_devices[m_data->m_renderDevice], NULL);\n        if (eglGetError() == EGL_SUCCESS && display != EGL_NO_DISPLAY) {\n            int major, minor;\n            EGLBoolean initialized = eglInitialize(display, &major, &minor);\n            if (eglGetError() == EGL_SUCCESS && initialized == EGL_TRUE) {\n                m_data->egl_display = display;\n            }\n        }\n    }\n\n    if (!eglInitialize(m_data->egl_display, NULL, NULL)) {\n        fprintf(stderr, \"Unable to initialize EGL\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    egl_version = gladLoaderLoadEGL(m_data->egl_display);\n    if (!egl_version) {\n        fprintf(stderr, \"Unable to reload EGL.\\n\");\n        exit(EXIT_FAILURE);\n    }\n    printf(\"Loaded EGL %d.%d after reload.\\n\", GLAD_VERSION_MAJOR(egl_version),\n           GLAD_VERSION_MINOR(egl_version));\n\n\n    m_data->success = eglBindAPI(EGL_OPENGL_API);\n    if (!m_data->success) {\n        // TODO: Properly handle this error (requires change to default window\n        // API to change return on all window types to bool).\n        fprintf(stderr, \"Failed to bind OpenGL API.\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    m_data->success =\n    eglChooseConfig(m_data->egl_display, egl_config_attribs,\n                    &m_data->egl_config, 1, &m_data->num_configs);\n    if (!m_data->success) {\n        // TODO: Properly handle this error (requires change to default window\n        // API to change return on all window types to bool).\n        fprintf(stderr, \"Failed to choose config (eglError: %d)\\n\", eglGetError());\n        exit(EXIT_FAILURE);\n    }\n    if (m_data->num_configs != 1) {\n        fprintf(stderr, \"Didn't get exactly one config, but %d\\n\", m_data->num_configs);\n        exit(EXIT_FAILURE);\n    }\n\n    m_data->egl_surface = eglCreatePbufferSurface(\n                                                  m_data->egl_display, m_data->egl_config, egl_pbuffer_attribs);\n    if (m_data->egl_surface == EGL_NO_SURFACE) {\n        fprintf(stderr, \"Unable to create EGL surface (eglError: %d)\\n\", eglGetError());\n        exit(EXIT_FAILURE);\n    }\n\n\n    m_data->egl_context = eglCreateContext(\n                                           m_data->egl_display, m_data->egl_config, EGL_NO_CONTEXT, NULL);\n    if (!m_data->egl_context) {\n        fprintf(stderr, \"Unable to create EGL context (eglError: %d)\\n\",eglGetError());\n        exit(EXIT_FAILURE);\n    }\n\n    m_data->success =\n        eglMakeCurrent(m_data->egl_display, m_data->egl_surface, m_data->egl_surface,\n                   m_data->egl_context);\n    if (!m_data->success) {\n        fprintf(stderr, \"Failed to make context current (eglError: %d)\\n\", eglGetError());\n        exit(EXIT_FAILURE);\n    }\n\n    if (!gladLoadGL(eglGetProcAddress)) {\n        fprintf(stderr, \"failed to load GL with glad.\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n\n    return 0;\n    };\n\n    void query() {\n        const GLubyte* ven = glGetString(GL_VENDOR);\n        printf(\"GL_VENDOR=%s\\n\", ven);\n        const GLubyte* ren = glGetString(GL_RENDERER);\n        printf(\"GL_RENDERER=%s\\n\", ren);\n        const GLubyte* ver = glGetString(GL_VERSION);\n        printf(\"GL_VERSION=%s\\n\", ver);\n        const GLubyte* sl = glGetString(GL_SHADING_LANGUAGE_VERSION);\n        printf(\"GL_SHADING_LANGUAGE_VERSION=%s\\n\", sl);\n    }\n\n    void release()\n    {\n      eglTerminate(m_data->egl_display);\n      delete m_data;\n      for (int i = 0; i < MAX_NUM_RESOURCES; i++)\n      {\n        if (cuda_res[i])\n        {\n          cudaError_t err = cudaGraphicsUnregisterResource(cuda_res[i]);\n          if( err != cudaSuccess )\n          {\n            std::cout << \"cudaGraphicsUnregisterResource failed: \" << err << std::endl;\n          }\n        }\n      }\n    }\n\n    void draw(py::array_t<float> x) {\n        //printf(\"draw\\n\");\n        int size = 3 * m_windowWidth * m_windowHeight;\n        //unsigned char *data2 = new unsigned char[size];\n\n        auto ptr = (float *) x.mutable_data();\n\n        glClear(GL_COLOR_BUFFER_BIT);\n        glBegin(GL_TRIANGLES);\n        glColor3f(1, 0, 0);\n        glVertex2f(0,  1);\n\n        glColor3f(0, 1, 0);\n        glVertex2f(-1, -1);\n\n        glColor3f(0, 0, 1);\n        glVertex2f(1, -1);\n        glEnd();\n\n        eglSwapBuffers( m_data->egl_display, m_data->egl_surface);\n        glReadPixels(0,0,m_windowWidth,m_windowHeight,GL_RGB, GL_FLOAT, ptr);\n        //unsigned error = lodepng::encode(\"test.png\", (unsigned char*)data2, m_windowWidth, m_windowHeight, LCT_RGB, 8);\n        //delete data2;\n    }\n\n    void draw_py(py::array_t<float> x) {\n        /*auto r = x.mutable_unchecked<3>(); // Will throw if ndim != 3 or flags.writeable is false\n            for (ssize_t i = 0; i < r.shape(0); i++)\n                for (ssize_t j = 0; j < r.shape(1); j++)\n                    for (ssize_t k = 0; k < r.shape(2); k++)\n                        r(i, j, k) += 1.0;*/\n\n        std::fill(x.mutable_data(), x.mutable_data() + x.size(), 42);\n    }\n\n\n    void map_tensor(GLuint tid, int width, int height, std::size_t data)\n    {\n       cudaError_t err;\n       if (cuda_res[tid] == NULL)\n       {\n         err = cudaGraphicsGLRegisterImage(&(cuda_res[tid]), tid, GL_TEXTURE_2D, cudaGraphicsMapFlagsNone);\n         if( err != cudaSuccess )\n         {\n           std::cout << \"cudaGraphicsGLRegisterImage failed: \" << err << std::endl;\n         }\n       }\n\n       err = cudaGraphicsMapResources(1, &(cuda_res[tid]));\n       if( err != cudaSuccess )\n       {\n         std::cout << \"cudaGraphicsMapResources failed: \" << err << std::endl;\n       }\n\n       cudaArray* array;\n       err = cudaGraphicsSubResourceGetMappedArray(&array, cuda_res[tid], 0, 0);\n       if( err != cudaSuccess )\n       {\n         std::cout << \"cudaGraphicsSubResourceGetMappedArray failed: \" << err << std::endl;\n       }\n\n       // copy data\n       err = cudaMemcpy2DFromArray((void*)data, width*4*sizeof(float), array, 0, 0, width*4*sizeof(float), height, cudaMemcpyDeviceToDevice);\n       if( err != cudaSuccess )\n       {\n         std::cout << \"cudaMemcpy2DFromArray failed: \" << err << std::endl;\n       }\n\n       err = cudaGraphicsUnmapResources(1, &(cuda_res[tid]));\n       if( err != cudaSuccess )\n       {\n         std::cout << \"cudaGraphicsUnmapResources failed: \" << err << std::endl;\n       }\n    }\n};\n\n\nPYBIND11_MODULE(CppYCBRenderer, m) {\n    py::class_<CppYCBRenderer>(m, \"CppYCBRenderer\")\n        .def(py::init<int, int, int>())\n        .def(\"init\", &CppYCBRenderer::init)\n        .def(\"query\", &CppYCBRenderer::query)\n        .def(\"map_tensor\", &CppYCBRenderer::map_tensor)\n        .def(\"draw\", &CppYCBRenderer::draw, py::arg().noconvert())\n        .def(\"release\", &CppYCBRenderer::release)\n        .def(\"draw_py\", &CppYCBRenderer::draw_py, py::arg().noconvert());\n\n#ifdef VERSION_INFO\n    m.attr(\"__version__\") = VERSION_INFO;\n#else\n    m.attr(\"__version__\") = \"dev\";\n#endif\n}\n"
  },
  {
    "path": "ycb_render/get_available_devices.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport subprocess\nimport os\n\n\ndef get_available_devices():\n    executable_path = os.path.join(os.path.dirname(__file__), 'build')\n\n    num_devices = int(subprocess.check_output(\n        [\"{}/query_devices\".format(executable_path)]))\n\n    available_devices = []\n    for i in range(num_devices):\n        try:\n            if b\"NVIDIA\" in subprocess.check_output([\"{}/test_device\".format(executable_path),  str(i)]):\n                available_devices.append(i)\n        except subprocess.CalledProcessError as e:\n            print(e)\n    return(available_devices)\n\n\nif __name__ == '__main__':\n    print(get_available_devices())\n"
  },
  {
    "path": "ycb_render/glad/EGL/eglplatform.h",
    "content": "#ifndef __eglplatform_h_\n#define __eglplatform_h_\n\n/*\n** Copyright (c) 2007-2016 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and/or associated documentation files (the\n** \"Materials\"), to deal in the Materials without restriction, including\n** without limitation the rights to use, copy, modify, merge, publish,\n** distribute, sublicense, and/or sell copies of the Materials, and to\n** permit persons to whom the Materials are furnished to do so, subject to\n** the following conditions:\n**\n** The above copyright notice and this permission notice shall be included\n** in all copies or substantial portions of the Materials.\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n*/\n\n/* Platform-specific types and definitions for egl.h\n * $Revision: 30994 $ on $Date: 2015-04-30 13:36:48 -0700 (Thu, 30 Apr 2015) $\n *\n * Adopters may modify khrplatform.h and this file to suit their platform.\n * You are encouraged to submit all modifications to the Khronos group so that\n * they can be included in future versions of this file.  Please submit changes\n * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla)\n * by filing a bug against product \"EGL\" component \"Registry\".\n */\n\n#include <KHR/khrplatform.h>\n\n/* Macros used in EGL function prototype declarations.\n *\n * EGL functions should be prototyped as:\n *\n * EGLAPI return-type EGLAPIENTRY eglFunction(arguments);\n * typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments);\n *\n * KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h\n */\n\n#ifndef EGLAPI\n#define EGLAPI KHRONOS_APICALL\n#endif\n\n#ifndef EGLAPIENTRY\n#define EGLAPIENTRY  KHRONOS_APIENTRY\n#endif\n#define EGLAPIENTRYP EGLAPIENTRY*\n\n/* The types NativeDisplayType, NativeWindowType, and NativePixmapType\n * are aliases of window-system-dependent types, such as X Display * or\n * Windows Device Context. They must be defined in platform-specific\n * code below. The EGL-prefixed versions of Native*Type are the same\n * types, renamed in EGL 1.3 so all types in the API start with \"EGL\".\n *\n * Khronos STRONGLY RECOMMENDS that you use the default definitions\n * provided below, since these changes affect both binary and source\n * portability of applications using EGL running on different EGL\n * implementations.\n */\n\n#if defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN 1\n#endif\n#include <windows.h>\n\ntypedef HDC     EGLNativeDisplayType;\ntypedef HBITMAP EGLNativePixmapType;\ntypedef HWND    EGLNativeWindowType;\n\n#elif defined(__WINSCW__) || defined(__SYMBIAN32__)  /* Symbian */\n\ntypedef int   EGLNativeDisplayType;\ntypedef void *EGLNativeWindowType;\ntypedef void *EGLNativePixmapType;\n\n#elif defined(WL_EGL_PLATFORM)\n\ntypedef struct wl_display     *EGLNativeDisplayType;\ntypedef struct wl_egl_pixmap  *EGLNativePixmapType;\ntypedef struct wl_egl_window  *EGLNativeWindowType;\n\n#elif defined(__GBM__)\n\ntypedef struct gbm_device  *EGLNativeDisplayType;\ntypedef struct gbm_bo      *EGLNativePixmapType;\ntypedef void               *EGLNativeWindowType;\n\n#elif defined(__ANDROID__) || defined(ANDROID)\n\nstruct ANativeWindow;\nstruct egl_native_pixmap_t;\n\ntypedef struct ANativeWindow*           EGLNativeWindowType;\ntypedef struct egl_native_pixmap_t*     EGLNativePixmapType;\ntypedef void*                           EGLNativeDisplayType;\n\n#elif defined(__unix__) || defined(__APPLE__)\n\n#if defined(MESA_EGL_NO_X11_HEADERS)\n\ntypedef void            *EGLNativeDisplayType;\ntypedef khronos_uintptr_t EGLNativePixmapType;\ntypedef khronos_uintptr_t EGLNativeWindowType;\n\n#else\n\n/* X11 (tentative)  */\n#include <X11/Xlib.h>\n#include <X11/Xutil.h>\n\ntypedef Display *EGLNativeDisplayType;\ntypedef Pixmap   EGLNativePixmapType;\ntypedef Window   EGLNativeWindowType;\n\n#endif /* MESA_EGL_NO_X11_HEADERS */\n\n#elif __HAIKU__\n#include <kernel/image.h>\ntypedef void\t\t\t\t*EGLNativeDisplayType;\ntypedef khronos_uintptr_t\t EGLNativePixmapType;\ntypedef khronos_uintptr_t\t EGLNativeWindowType;\n\n#else\n#error \"Platform not recognized\"\n#endif\n\n/* EGL 1.2 types, renamed for consistency in EGL 1.3 */\ntypedef EGLNativeDisplayType NativeDisplayType;\ntypedef EGLNativePixmapType  NativePixmapType;\ntypedef EGLNativeWindowType  NativeWindowType;\n\n\n/* Define EGLint. This must be a signed integral type large enough to contain\n * all legal attribute names and values passed into and out of EGL, whether\n * their type is boolean, bitmask, enumerant (symbolic constant), integer,\n * handle, or other.  While in general a 32-bit integer will suffice, if\n * handles are 64 bit types, then EGLint should be defined as a signed 64-bit\n * integer type.\n */\ntypedef khronos_int32_t EGLint;\n\n\n/* C++ / C typecast macros for special EGL handle values */\n#if defined(__cplusplus)\n#define EGL_CAST(type, value) (static_cast<type>(value))\n#else\n#define EGL_CAST(type, value) ((type) (value))\n#endif\n\n#endif /* __eglplatform_h */\n"
  },
  {
    "path": "ycb_render/glad/KHR/khrplatform.h",
    "content": "#ifndef __khrplatform_h_\n#define __khrplatform_h_\n\n/*\n** Copyright (c) 2008-2009 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and/or associated documentation files (the\n** \"Materials\"), to deal in the Materials without restriction, including\n** without limitation the rights to use, copy, modify, merge, publish,\n** distribute, sublicense, and/or sell copies of the Materials, and to\n** permit persons to whom the Materials are furnished to do so, subject to\n** the following conditions:\n**\n** The above copyright notice and this permission notice shall be included\n** in all copies or substantial portions of the Materials.\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n*/\n\n/* Khronos platform-specific types and definitions.\n *\n * $Revision: 32517 $ on $Date: 2016-03-11 02:41:19 -0800 (Fri, 11 Mar 2016) $\n *\n * Adopters may modify this file to suit their platform. Adopters are\n * encouraged to submit platform specific modifications to the Khronos\n * group so that they can be included in future versions of this file.\n * Please submit changes by sending them to the public Khronos Bugzilla\n * (http://khronos.org/bugzilla) by filing a bug against product\n * \"Khronos (general)\" component \"Registry\".\n *\n * A predefined template which fills in some of the bug fields can be\n * reached using http://tinyurl.com/khrplatform-h-bugreport, but you\n * must create a Bugzilla login first.\n *\n *\n * See the Implementer's Guidelines for information about where this file\n * should be located on your system and for more details of its use:\n *    http://www.khronos.org/registry/implementers_guide.pdf\n *\n * This file should be included as\n *        #include <KHR/khrplatform.h>\n * by Khronos client API header files that use its types and defines.\n *\n * The types in khrplatform.h should only be used to define API-specific types.\n *\n * Types defined in khrplatform.h:\n *    khronos_int8_t              signed   8  bit\n *    khronos_uint8_t             unsigned 8  bit\n *    khronos_int16_t             signed   16 bit\n *    khronos_uint16_t            unsigned 16 bit\n *    khronos_int32_t             signed   32 bit\n *    khronos_uint32_t            unsigned 32 bit\n *    khronos_int64_t             signed   64 bit\n *    khronos_uint64_t            unsigned 64 bit\n *    khronos_intptr_t            signed   same number of bits as a pointer\n *    khronos_uintptr_t           unsigned same number of bits as a pointer\n *    khronos_ssize_t             signed   size\n *    khronos_usize_t             unsigned size\n *    khronos_float_t             signed   32 bit floating point\n *    khronos_time_ns_t           unsigned 64 bit time in nanoseconds\n *    khronos_utime_nanoseconds_t unsigned time interval or absolute time in\n *                                         nanoseconds\n *    khronos_stime_nanoseconds_t signed time interval in nanoseconds\n *    khronos_boolean_enum_t      enumerated boolean type. This should\n *      only be used as a base type when a client API's boolean type is\n *      an enum. Client APIs which use an integer or other type for\n *      booleans cannot use this as the base type for their boolean.\n *\n * Tokens defined in khrplatform.h:\n *\n *    KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.\n *\n *    KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.\n *    KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.\n *\n * Calling convention macros defined in this file:\n *    KHRONOS_APICALL\n *    KHRONOS_APIENTRY\n *    KHRONOS_APIATTRIBUTES\n *\n * These may be used in function prototypes as:\n *\n *      KHRONOS_APICALL void KHRONOS_APIENTRY funcname(\n *                                  int arg1,\n *                                  int arg2) KHRONOS_APIATTRIBUTES;\n */\n\n/*-------------------------------------------------------------------------\n * Definition of KHRONOS_APICALL\n *-------------------------------------------------------------------------\n * This precedes the return type of the function in the function prototype.\n */\n#if defined(_WIN32) && !defined(__SCITECH_SNAP__)\n#   define KHRONOS_APICALL __declspec(dllimport)\n#elif defined (__SYMBIAN32__)\n#   define KHRONOS_APICALL IMPORT_C\n#elif defined(__ANDROID__)\n#   define KHRONOS_APICALL __attribute__((visibility(\"default\")))\n#else\n#   define KHRONOS_APICALL\n#endif\n\n/*-------------------------------------------------------------------------\n * Definition of KHRONOS_APIENTRY\n *-------------------------------------------------------------------------\n * This follows the return type of the function  and precedes the function\n * name in the function prototype.\n */\n#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)\n    /* Win32 but not WinCE */\n#   define KHRONOS_APIENTRY __stdcall\n#else\n#   define KHRONOS_APIENTRY\n#endif\n\n/*-------------------------------------------------------------------------\n * Definition of KHRONOS_APIATTRIBUTES\n *-------------------------------------------------------------------------\n * This follows the closing parenthesis of the function prototype arguments.\n */\n#if defined (__ARMCC_2__)\n#define KHRONOS_APIATTRIBUTES __softfp\n#else\n#define KHRONOS_APIATTRIBUTES\n#endif\n\n/*-------------------------------------------------------------------------\n * basic type definitions\n *-----------------------------------------------------------------------*/\n#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)\n\n\n/*\n * Using <stdint.h>\n */\n#include <stdint.h>\ntypedef int32_t                 khronos_int32_t;\ntypedef uint32_t                khronos_uint32_t;\ntypedef int64_t                 khronos_int64_t;\ntypedef uint64_t                khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif defined(__VMS ) || defined(__sgi)\n\n/*\n * Using <inttypes.h>\n */\n#include <inttypes.h>\ntypedef int32_t                 khronos_int32_t;\ntypedef uint32_t                khronos_uint32_t;\ntypedef int64_t                 khronos_int64_t;\ntypedef uint64_t                khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)\n\n/*\n * Win32\n */\ntypedef __int32                 khronos_int32_t;\ntypedef unsigned __int32        khronos_uint32_t;\ntypedef __int64                 khronos_int64_t;\ntypedef unsigned __int64        khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif defined(__sun__) || defined(__digital__)\n\n/*\n * Sun or Digital\n */\ntypedef int                     khronos_int32_t;\ntypedef unsigned int            khronos_uint32_t;\n#if defined(__arch64__) || defined(_LP64)\ntypedef long int                khronos_int64_t;\ntypedef unsigned long int       khronos_uint64_t;\n#else\ntypedef long long int           khronos_int64_t;\ntypedef unsigned long long int  khronos_uint64_t;\n#endif /* __arch64__ */\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif 0\n\n/*\n * Hypothetical platform with no float or int64 support\n */\ntypedef int                     khronos_int32_t;\ntypedef unsigned int            khronos_uint32_t;\n#define KHRONOS_SUPPORT_INT64   0\n#define KHRONOS_SUPPORT_FLOAT   0\n\n#else\n\n/*\n * Generic fallback\n */\n#include <stdint.h>\ntypedef int32_t                 khronos_int32_t;\ntypedef uint32_t                khronos_uint32_t;\ntypedef int64_t                 khronos_int64_t;\ntypedef uint64_t                khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#endif\n\n\n/*\n * Types that are (so far) the same on all platforms\n */\ntypedef signed   char          khronos_int8_t;\ntypedef unsigned char          khronos_uint8_t;\ntypedef signed   short int     khronos_int16_t;\ntypedef unsigned short int     khronos_uint16_t;\n\n/*\n * Types that differ between LLP64 and LP64 architectures - in LLP64,\n * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears\n * to be the only LLP64 architecture in current use.\n */\n#ifdef _WIN64\ntypedef signed   long long int khronos_intptr_t;\ntypedef unsigned long long int khronos_uintptr_t;\ntypedef signed   long long int khronos_ssize_t;\ntypedef unsigned long long int khronos_usize_t;\n#else\ntypedef signed   long  int     khronos_intptr_t;\ntypedef unsigned long  int     khronos_uintptr_t;\ntypedef signed   long  int     khronos_ssize_t;\ntypedef unsigned long  int     khronos_usize_t;\n#endif\n\n#if KHRONOS_SUPPORT_FLOAT\n/*\n * Float type\n */\ntypedef          float         khronos_float_t;\n#endif\n\n#if KHRONOS_SUPPORT_INT64\n/* Time types\n *\n * These types can be used to represent a time interval in nanoseconds or\n * an absolute Unadjusted System Time.  Unadjusted System Time is the number\n * of nanoseconds since some arbitrary system event (e.g. since the last\n * time the system booted).  The Unadjusted System Time is an unsigned\n * 64 bit value that wraps back to 0 every 584 years.  Time intervals\n * may be either signed or unsigned.\n */\ntypedef khronos_uint64_t       khronos_utime_nanoseconds_t;\ntypedef khronos_int64_t        khronos_stime_nanoseconds_t;\n#endif\n\n/*\n * Dummy value used to pad enum types to 32 bits.\n */\n#ifndef KHRONOS_MAX_ENUM\n#define KHRONOS_MAX_ENUM 0x7FFFFFFF\n#endif\n\n/*\n * Enumerated boolean type\n *\n * Values other than zero should be considered to be true.  Therefore\n * comparisons should not be made against KHRONOS_TRUE.\n */\ntypedef enum {\n    KHRONOS_FALSE = 0,\n    KHRONOS_TRUE  = 1,\n    KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM\n} khronos_boolean_enum_t;\n\n#endif /* __khrplatform_h_ */\n"
  },
  {
    "path": "ycb_render/glad/egl.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <glad/egl.h>\n\n#ifndef GLAD_IMPL_UTIL_C_\n#define GLAD_IMPL_UTIL_C_\n\n#if _MSC_VER >= 1400\n#define GLAD_IMPL_UTIL_STRNCPY(dest, source, len) strncpy_s(dest, len, source, len-1);\n#else\n#define GLAD_IMPL_UTIL_STRNCPY(dest, source, len) strncpy(dest, source, len);\n#endif\n\n#ifdef _MSC_VER\n#define GLAD_IMPL_UTIL_SSCANF sscanf_s\n#else\n#define GLAD_IMPL_UTIL_SSCANF sscanf\n#endif\n\n#endif /* GLAD_IMPL_UTIL_C_ */\n\n\nint GLAD_EGL_VERSION_1_0;\nint GLAD_EGL_VERSION_1_1;\nint GLAD_EGL_VERSION_1_2;\nint GLAD_EGL_VERSION_1_3;\nint GLAD_EGL_VERSION_1_4;\nint GLAD_EGL_VERSION_1_5;\nint GLAD_EGL_EXT_platform_device;\nint GLAD_EGL_EXT_platform_base;\nint GLAD_EGL_NV_device_cuda;\nint GLAD_EGL_EXT_device_enumeration;\nint GLAD_EGL_EXT_device_query;\nint GLAD_EGL_EXT_device_base;\nint GLAD_EGL_NV_cuda_event;\n\n\n\nPFNEGLQUERYDEVICESEXTPROC glad_eglQueryDevicesEXT;\nPFNEGLCREATEPBUFFERSURFACEPROC glad_eglCreatePbufferSurface;\nPFNEGLGETERRORPROC glad_eglGetError;\nPFNEGLGETPROCADDRESSPROC glad_eglGetProcAddress;\nPFNEGLGETCURRENTDISPLAYPROC glad_eglGetCurrentDisplay;\nPFNEGLQUERYAPIPROC glad_eglQueryAPI;\nPFNEGLCREATEPLATFORMPIXMAPSURFACEPROC glad_eglCreatePlatformPixmapSurface;\nPFNEGLQUERYDISPLAYATTRIBKHRPROC glad_eglQueryDisplayAttribKHR;\nPFNEGLDESTROYSYNCPROC glad_eglDestroySync;\nPFNEGLCREATEIMAGEPROC glad_eglCreateImage;\nPFNEGLQUERYCONTEXTPROC glad_eglQueryContext;\nPFNEGLSWAPBUFFERSPROC glad_eglSwapBuffers;\nPFNEGLCREATECONTEXTPROC glad_eglCreateContext;\nPFNEGLCHOOSECONFIGPROC glad_eglChooseConfig;\nPFNEGLBINDAPIPROC glad_eglBindAPI;\nPFNEGLWAITNATIVEPROC glad_eglWaitNative;\nPFNEGLTERMINATEPROC glad_eglTerminate;\nPFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC glad_eglCreatePlatformPixmapSurfaceEXT;\nPFNEGLRELEASETHREADPROC glad_eglReleaseThread;\nPFNEGLCREATEPLATFORMWINDOWSURFACEPROC glad_eglCreatePlatformWindowSurface;\nPFNEGLGETCONFIGATTRIBPROC glad_eglGetConfigAttrib;\nPFNEGLGETCURRENTSURFACEPROC glad_eglGetCurrentSurface;\nPFNEGLCOPYBUFFERSPROC glad_eglCopyBuffers;\nPFNEGLGETPLATFORMDISPLAYEXTPROC glad_eglGetPlatformDisplayEXT;\nPFNEGLQUERYDEVICEATTRIBEXTPROC glad_eglQueryDeviceAttribEXT;\nPFNEGLCREATEPIXMAPSURFACEPROC glad_eglCreatePixmapSurface;\nPFNEGLBINDTEXIMAGEPROC glad_eglBindTexImage;\nPFNEGLGETPLATFORMDISPLAYPROC glad_eglGetPlatformDisplay;\nPFNEGLGETDISPLAYPROC glad_eglGetDisplay;\nPFNEGLQUERYSTRINGPROC glad_eglQueryString;\nPFNEGLCLIENTWAITSYNCPROC glad_eglClientWaitSync;\nPFNEGLWAITSYNCPROC glad_eglWaitSync;\nPFNEGLDESTROYIMAGEPROC glad_eglDestroyImage;\nPFNEGLRELEASETEXIMAGEPROC glad_eglReleaseTexImage;\nPFNEGLQUERYDISPLAYATTRIBEXTPROC glad_eglQueryDisplayAttribEXT;\nPFNEGLDESTROYCONTEXTPROC glad_eglDestroyContext;\nPFNEGLQUERYDEVICESTRINGEXTPROC glad_eglQueryDeviceStringEXT;\nPFNEGLCREATEWINDOWSURFACEPROC glad_eglCreateWindowSurface;\nPFNEGLGETCURRENTCONTEXTPROC glad_eglGetCurrentContext;\nPFNEGLINITIALIZEPROC glad_eglInitialize;\nPFNEGLDESTROYSURFACEPROC glad_eglDestroySurface;\nPFNEGLMAKECURRENTPROC glad_eglMakeCurrent;\nPFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC glad_eglCreatePlatformWindowSurfaceEXT;\nPFNEGLSWAPINTERVALPROC glad_eglSwapInterval;\nPFNEGLCREATESYNCPROC glad_eglCreateSync;\nPFNEGLGETSYNCATTRIBPROC glad_eglGetSyncAttrib;\nPFNEGLSURFACEATTRIBPROC glad_eglSurfaceAttrib;\nPFNEGLWAITGLPROC glad_eglWaitGL;\nPFNEGLQUERYSURFACEPROC glad_eglQuerySurface;\nPFNEGLGETCONFIGSPROC glad_eglGetConfigs;\nPFNEGLWAITCLIENTPROC glad_eglWaitClient;\nPFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC glad_eglCreatePbufferFromClientBuffer;\n\n\nstatic void load_EGL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_EGL_VERSION_1_0) return;\n    eglCreatePbufferSurface = (PFNEGLCREATEPBUFFERSURFACEPROC) load(\"eglCreatePbufferSurface\", userptr);\n    eglGetError = (PFNEGLGETERRORPROC) load(\"eglGetError\", userptr);\n    eglGetProcAddress = (PFNEGLGETPROCADDRESSPROC) load(\"eglGetProcAddress\", userptr);\n    eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) load(\"eglGetCurrentDisplay\", userptr);\n    eglQueryContext = (PFNEGLQUERYCONTEXTPROC) load(\"eglQueryContext\", userptr);\n    eglSwapBuffers = (PFNEGLSWAPBUFFERSPROC) load(\"eglSwapBuffers\", userptr);\n    eglCreateContext = (PFNEGLCREATECONTEXTPROC) load(\"eglCreateContext\", userptr);\n    eglChooseConfig = (PFNEGLCHOOSECONFIGPROC) load(\"eglChooseConfig\", userptr);\n    eglWaitNative = (PFNEGLWAITNATIVEPROC) load(\"eglWaitNative\", userptr);\n    eglTerminate = (PFNEGLTERMINATEPROC) load(\"eglTerminate\", userptr);\n    eglCopyBuffers = (PFNEGLCOPYBUFFERSPROC) load(\"eglCopyBuffers\", userptr);\n    eglGetConfigAttrib = (PFNEGLGETCONFIGATTRIBPROC) load(\"eglGetConfigAttrib\", userptr);\n    eglGetCurrentSurface = (PFNEGLGETCURRENTSURFACEPROC) load(\"eglGetCurrentSurface\", userptr);\n    eglCreatePixmapSurface = (PFNEGLCREATEPIXMAPSURFACEPROC) load(\"eglCreatePixmapSurface\", userptr);\n    eglGetDisplay = (PFNEGLGETDISPLAYPROC) load(\"eglGetDisplay\", userptr);\n    eglQueryString = (PFNEGLQUERYSTRINGPROC) load(\"eglQueryString\", userptr);\n    eglDestroyContext = (PFNEGLDESTROYCONTEXTPROC) load(\"eglDestroyContext\", userptr);\n    eglCreateWindowSurface = (PFNEGLCREATEWINDOWSURFACEPROC) load(\"eglCreateWindowSurface\", userptr);\n    eglInitialize = (PFNEGLINITIALIZEPROC) load(\"eglInitialize\", userptr);\n    eglDestroySurface = (PFNEGLDESTROYSURFACEPROC) load(\"eglDestroySurface\", userptr);\n    eglMakeCurrent = (PFNEGLMAKECURRENTPROC) load(\"eglMakeCurrent\", userptr);\n    eglWaitGL = (PFNEGLWAITGLPROC) load(\"eglWaitGL\", userptr);\n    eglQuerySurface = (PFNEGLQUERYSURFACEPROC) load(\"eglQuerySurface\", userptr);\n    eglGetConfigs = (PFNEGLGETCONFIGSPROC) load(\"eglGetConfigs\", userptr);\n}\nstatic void load_EGL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_EGL_VERSION_1_1) return;\n    eglReleaseTexImage = (PFNEGLRELEASETEXIMAGEPROC) load(\"eglReleaseTexImage\", userptr);\n    eglSurfaceAttrib = (PFNEGLSURFACEATTRIBPROC) load(\"eglSurfaceAttrib\", userptr);\n    eglBindTexImage = (PFNEGLBINDTEXIMAGEPROC) load(\"eglBindTexImage\", userptr);\n    eglSwapInterval = (PFNEGLSWAPINTERVALPROC) load(\"eglSwapInterval\", userptr);\n}\nstatic void load_EGL_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_EGL_VERSION_1_2) return;\n    eglBindAPI = (PFNEGLBINDAPIPROC) load(\"eglBindAPI\", userptr);\n    eglQueryAPI = (PFNEGLQUERYAPIPROC) load(\"eglQueryAPI\", userptr);\n    eglWaitClient = (PFNEGLWAITCLIENTPROC) load(\"eglWaitClient\", userptr);\n    eglCreatePbufferFromClientBuffer = (PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) load(\"eglCreatePbufferFromClientBuffer\", userptr);\n    eglReleaseThread = (PFNEGLRELEASETHREADPROC) load(\"eglReleaseThread\", userptr);\n}\nstatic void load_EGL_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_EGL_VERSION_1_4) return;\n    eglGetCurrentContext = (PFNEGLGETCURRENTCONTEXTPROC) load(\"eglGetCurrentContext\", userptr);\n}\nstatic void load_EGL_VERSION_1_5( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_EGL_VERSION_1_5) return;\n    eglDestroySync = (PFNEGLDESTROYSYNCPROC) load(\"eglDestroySync\", userptr);\n    eglCreateImage = (PFNEGLCREATEIMAGEPROC) load(\"eglCreateImage\", userptr);\n    eglGetPlatformDisplay = (PFNEGLGETPLATFORMDISPLAYPROC) load(\"eglGetPlatformDisplay\", userptr);\n    eglDestroyImage = (PFNEGLDESTROYIMAGEPROC) load(\"eglDestroyImage\", userptr);\n    eglClientWaitSync = (PFNEGLCLIENTWAITSYNCPROC) load(\"eglClientWaitSync\", userptr);\n    eglWaitSync = (PFNEGLWAITSYNCPROC) load(\"eglWaitSync\", userptr);\n    eglCreateSync = (PFNEGLCREATESYNCPROC) load(\"eglCreateSync\", userptr);\n    eglGetSyncAttrib = (PFNEGLGETSYNCATTRIBPROC) load(\"eglGetSyncAttrib\", userptr);\n    eglCreatePlatformWindowSurface = (PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) load(\"eglCreatePlatformWindowSurface\", userptr);\n    eglCreatePlatformPixmapSurface = (PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) load(\"eglCreatePlatformPixmapSurface\", userptr);\n}\nstatic void load_EGL_EXT_platform_base( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_EGL_EXT_platform_base) return;\n    eglCreatePlatformWindowSurfaceEXT = (PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC) load(\"eglCreatePlatformWindowSurfaceEXT\", userptr);\n    eglGetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC) load(\"eglGetPlatformDisplayEXT\", userptr);\n    eglCreatePlatformPixmapSurfaceEXT = (PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC) load(\"eglCreatePlatformPixmapSurfaceEXT\", userptr);\n}\nstatic void load_EGL_EXT_device_enumeration( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_EGL_EXT_device_enumeration) return;\n    eglQueryDevicesEXT = (PFNEGLQUERYDEVICESEXTPROC) load(\"eglQueryDevicesEXT\", userptr);\n}\nstatic void load_EGL_EXT_device_query( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_EGL_EXT_device_query) return;\n    eglQueryDisplayAttribEXT = (PFNEGLQUERYDISPLAYATTRIBEXTPROC) load(\"eglQueryDisplayAttribEXT\", userptr);\n    eglQueryDeviceStringEXT = (PFNEGLQUERYDEVICESTRINGEXTPROC) load(\"eglQueryDeviceStringEXT\", userptr);\n    eglQueryDeviceAttribEXT = (PFNEGLQUERYDEVICEATTRIBEXTPROC) load(\"eglQueryDeviceAttribEXT\", userptr);\n    eglQueryDisplayAttribKHR = (PFNEGLQUERYDISPLAYATTRIBKHRPROC) load(\"eglQueryDisplayAttribKHR\", userptr);\n}\nstatic void load_EGL_EXT_device_base( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_EGL_EXT_device_base) return;\n    eglQueryDisplayAttribEXT = (PFNEGLQUERYDISPLAYATTRIBEXTPROC) load(\"eglQueryDisplayAttribEXT\", userptr);\n    eglQueryDevicesEXT = (PFNEGLQUERYDEVICESEXTPROC) load(\"eglQueryDevicesEXT\", userptr);\n    eglQueryDeviceStringEXT = (PFNEGLQUERYDEVICESTRINGEXTPROC) load(\"eglQueryDeviceStringEXT\", userptr);\n    eglQueryDeviceAttribEXT = (PFNEGLQUERYDEVICEATTRIBEXTPROC) load(\"eglQueryDeviceAttribEXT\", userptr);\n    eglQueryDisplayAttribKHR = (PFNEGLQUERYDISPLAYATTRIBKHRPROC) load(\"eglQueryDisplayAttribKHR\", userptr);\n}\n\n\n\nstatic int get_exts(EGLDisplay display, const char **extensions) {\n    *extensions = eglQueryString(display, EGL_EXTENSIONS);\n\n    return extensions != NULL;\n}\n\nstatic int has_ext(const char *extensions, const char *ext) {\n    const char *loc;\n    const char *terminator;\n    if(extensions == NULL) {\n        return 0;\n    }\n    while(1) {\n        loc = strstr(extensions, ext);\n        if(loc == NULL) {\n            return 0;\n        }\n        terminator = loc + strlen(ext);\n        if((loc == extensions || *(loc - 1) == ' ') &&\n            (*terminator == ' ' || *terminator == '\\0')) {\n            return 1;\n        }\n        extensions = terminator;\n    }\n}\n\nstatic GLADapiproc glad_egl_get_proc_from_userptr(const char *name, void *userptr) {\n    return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name);\n}\n\nstatic int find_extensionsEGL(EGLDisplay display) {\n    const char *extensions;\n    if (!get_exts(display, &extensions)) return 0;\n\n    GLAD_EGL_EXT_platform_device = has_ext(extensions, \"EGL_EXT_platform_device\");\n    GLAD_EGL_EXT_platform_base = has_ext(extensions, \"EGL_EXT_platform_base\");\n    GLAD_EGL_NV_device_cuda = has_ext(extensions, \"EGL_NV_device_cuda\");\n    GLAD_EGL_EXT_device_enumeration = has_ext(extensions, \"EGL_EXT_device_enumeration\");\n    GLAD_EGL_EXT_device_query = has_ext(extensions, \"EGL_EXT_device_query\");\n    GLAD_EGL_EXT_device_base = has_ext(extensions, \"EGL_EXT_device_base\");\n    GLAD_EGL_NV_cuda_event = has_ext(extensions, \"EGL_NV_cuda_event\");\n\n    return 1;\n}\n\nstatic int find_coreEGL(EGLDisplay display) {\n    int major, minor;\n    const char *version;\n\n    if (display == NULL) {\n        display = EGL_NO_DISPLAY; /* this is usually NULL, better safe than sorry */\n    }\n    if (display == EGL_NO_DISPLAY) {\n        display = eglGetCurrentDisplay();\n    }\n    if (display == EGL_NO_DISPLAY) {\n        display = eglGetDisplay(EGL_DEFAULT_DISPLAY);\n    }\n    if (display == EGL_NO_DISPLAY) {\n        return 0;\n    }\n\n    version = eglQueryString(display, EGL_VERSION);\n    (void) eglGetError();\n\n    if (version == NULL) {\n        major = 1;\n        minor = 0;\n    } else {\n        GLAD_IMPL_UTIL_SSCANF(version, \"%d.%d\", &major, &minor);\n    }\n\n    GLAD_EGL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;\n    GLAD_EGL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1;\n    GLAD_EGL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1;\n    GLAD_EGL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1;\n    GLAD_EGL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1;\n    GLAD_EGL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1;\n\n    return GLAD_MAKE_VERSION(major, minor);\n}\n\nint gladLoadEGLUserPtr(EGLDisplay display, GLADuserptrloadfunc load, void* userptr) {\n    int version;\n    eglGetDisplay = (PFNEGLGETDISPLAYPROC) load(\"eglGetDisplay\", userptr);\n    eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) load(\"eglGetCurrentDisplay\", userptr);\n    eglQueryString = (PFNEGLQUERYSTRINGPROC) load(\"eglQueryString\", userptr);\n    eglGetError = (PFNEGLGETERRORPROC) load(\"eglGetError\", userptr);\n    if (eglGetDisplay == NULL || eglGetCurrentDisplay == NULL || eglQueryString == NULL || eglGetError == NULL) return 0;\n\n    version = find_coreEGL(display);\n    if (!version) return 0;\n    load_EGL_VERSION_1_0(load, userptr);\n    load_EGL_VERSION_1_1(load, userptr);\n    load_EGL_VERSION_1_2(load, userptr);\n    load_EGL_VERSION_1_4(load, userptr);\n    load_EGL_VERSION_1_5(load, userptr);\n\n    if (!find_extensionsEGL(display)) return 0;\n    load_EGL_EXT_platform_base(load, userptr);\n    load_EGL_EXT_device_enumeration(load, userptr);\n    load_EGL_EXT_device_query(load, userptr);\n    load_EGL_EXT_device_base(load, userptr);\n\n    return version;\n}\n\nint gladLoadEGL(EGLDisplay display, GLADloadfunc load) {\n    return gladLoadEGLUserPtr(display, glad_egl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);\n}\n\n\n#ifdef GLAD_EGL\n\n#ifndef GLAD_LOADER_LIBRARY_C_\n#define GLAD_LOADER_LIBRARY_C_\n\n#include <stddef.h>\n#include <stdlib.h>\n\n#if GLAD_PLATFORM_WIN32\n#include <windows.h>\n#else\n#include <dlfcn.h>\n#endif\n\n\nstatic void* glad_get_dlopen_handle(const char *lib_names[], int length) {\n    void *handle = NULL;\n    int i;\n\n    for (i = 0; i < length; ++i) {\n#if GLAD_PLATFORM_WIN32\n  #if GLAD_PLATFORM_UWP\n        size_t buffer_size = (strlen(lib_names[i]) + 1) * sizeof(WCHAR);\n        LPWSTR buffer = (LPWSTR) malloc(buffer_size);\n        if (buffer != NULL) {\n            int ret = MultiByteToWideChar(CP_ACP, 0, lib_names[i], -1, buffer, buffer_size);\n            if (ret != 0) {\n                handle = (void*) LoadPackagedLibrary(buffer, 0);\n            }\n            free((void*) buffer);\n        }\n  #else\n        handle = (void*) LoadLibraryA(lib_names[i]);\n  #endif\n#else\n        handle = dlopen(lib_names[i], RTLD_LAZY | RTLD_LOCAL);\n#endif\n        if (handle != NULL) {\n            return handle;\n        }\n    }\n\n    return NULL;\n}\n\nstatic void glad_close_dlopen_handle(void* handle) {\n    if (handle != NULL) {\n#if GLAD_PLATFORM_WIN32\n        FreeLibrary((HMODULE) handle);\n#else\n        dlclose(handle);\n#endif\n    }\n}\n\nstatic GLADapiproc glad_dlsym_handle(void* handle, const char *name) {\n    if (handle == NULL) {\n        return NULL;\n    }\n\n#if GLAD_PLATFORM_WIN32\n    return (GLADapiproc) GetProcAddress((HMODULE) handle, name);\n#else\n    return GLAD_GNUC_EXTENSION (GLADapiproc) dlsym(handle, name);\n#endif\n}\n\n#endif /* GLAD_LOADER_LIBRARY_C_ */\n\nstruct _glad_egl_userptr {\n    void *handle;\n    PFNEGLGETPROCADDRESSPROC get_proc_address_ptr;\n};\n\nstatic GLADapiproc glad_egl_get_proc(const char* name, void *vuserptr) {\n    struct _glad_egl_userptr userptr = *(struct _glad_egl_userptr*) vuserptr;\n    GLADapiproc result = NULL;\n\n    result = glad_dlsym_handle(userptr.handle, name);\n    if (result == NULL) {\n        result = GLAD_GNUC_EXTENSION (GLADapiproc) userptr.get_proc_address_ptr(name);\n    }\n\n    return result;\n}\n\nstatic void* _egl_handle = NULL;\n\nint gladLoaderLoadEGL(EGLDisplay display) {\n#ifdef __APPLE__\n    static const char *NAMES[] = {\"libEGL.dylib\"};\n#elif GLAD_PLATFORM_WIN32\n    static const char *NAMES[] = {\"libEGL.dll\", \"EGL.dll\"};\n#else\n    static const char *NAMES[] = {\"libEGL.so.1\", \"libEGL.so\"};\n#endif\n\n    int version = 0;\n    int did_load = 0;\n    struct _glad_egl_userptr userptr;\n\n    if (_egl_handle == NULL) {\n        _egl_handle = glad_get_dlopen_handle(NAMES, sizeof(NAMES) / sizeof(NAMES[0]));\n        did_load = _egl_handle != NULL;\n    }\n\n    if (_egl_handle != NULL) {\n        userptr.handle = _egl_handle;\n        userptr.get_proc_address_ptr = (PFNEGLGETPROCADDRESSPROC) glad_dlsym_handle(_egl_handle, \"eglGetProcAddress\");\n        if (userptr.get_proc_address_ptr != NULL) {\n            version = gladLoadEGLUserPtr(display, glad_egl_get_proc, &userptr);\n        }\n\n        if (!version && did_load) {\n            glad_close_dlopen_handle(_egl_handle);\n            _egl_handle = NULL;\n        }\n    }\n\n    return version;\n}\n\nvoid gladLoaderUnloadEGL() {\n    if (_egl_handle != NULL) {\n        glad_close_dlopen_handle(_egl_handle);\n        _egl_handle = NULL;\n    }\n}\n\n#endif /* GLAD_EGL */\n"
  },
  {
    "path": "ycb_render/glad/gl.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <glad/gl.h>\n\n#ifndef GLAD_IMPL_UTIL_C_\n#define GLAD_IMPL_UTIL_C_\n\n#if _MSC_VER >= 1400\n#define GLAD_IMPL_UTIL_STRNCPY(dest, source, len) strncpy_s(dest, len, source, len-1);\n#else\n#define GLAD_IMPL_UTIL_STRNCPY(dest, source, len) strncpy(dest, source, len);\n#endif\n\n#ifdef _MSC_VER\n#define GLAD_IMPL_UTIL_SSCANF sscanf_s\n#else\n#define GLAD_IMPL_UTIL_SSCANF sscanf\n#endif\n\n#endif /* GLAD_IMPL_UTIL_C_ */\n\n\nint GLAD_GL_VERSION_1_0;\nint GLAD_GL_VERSION_1_1;\nint GLAD_GL_VERSION_1_2;\nint GLAD_GL_VERSION_1_3;\nint GLAD_GL_VERSION_1_4;\nint GLAD_GL_VERSION_1_5;\nint GLAD_GL_VERSION_2_0;\nint GLAD_GL_VERSION_2_1;\nint GLAD_GL_VERSION_3_0;\nint GLAD_GL_VERSION_3_1;\nint GLAD_GL_VERSION_3_2;\nint GLAD_GL_VERSION_3_3;\nint GLAD_GL_VERSION_4_0;\nint GLAD_GL_VERSION_4_1;\nint GLAD_GL_VERSION_4_2;\nint GLAD_GL_VERSION_4_3;\nint GLAD_GL_VERSION_4_4;\nint GLAD_GL_VERSION_4_5;\nint GLAD_GL_VERSION_4_6;\nint GLAD_GL_ARB_point_sprite;\n\n\n\nPFNGLGETTEXTUREPARAMETERIIVPROC glad_glGetTextureParameterIiv;\nPFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv;\nPFNGLTEXTURESTORAGE3DMULTISAMPLEPROC glad_glTextureStorage3DMultisample;\nPFNGLEVALPOINT2PROC glad_glEvalPoint2;\nPFNGLVERTEXARRAYATTRIBBINDINGPROC glad_glVertexArrayAttribBinding;\nPFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC glad_glFlushMappedNamedBufferRange;\nPFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC glad_glGetNamedFramebufferParameteriv;\nPFNGLPIXELTRANSFERFPROC glad_glPixelTransferf;\nPFNGLGETFLOATI_VPROC glad_glGetFloati_v;\nPFNGLLOADNAMEPROC glad_glLoadName;\nPFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv;\nPFNGLSECONDARYCOLOR3SVPROC glad_glSecondaryColor3sv;\nPFNGLCOPYTEXTURESUBIMAGE1DPROC glad_glCopyTextureSubImage1D;\nPFNGLSECONDARYCOLOR3UIVPROC glad_glSecondaryColor3uiv;\nPFNGLUNIFORM1DVPROC glad_glUniform1dv;\nPFNGLWINDOWPOS3DVPROC glad_glWindowPos3dv;\nPFNGLSECONDARYCOLOR3BVPROC glad_glSecondaryColor3bv;\nPFNGLSECONDARYCOLOR3UIPROC glad_glSecondaryColor3ui;\nPFNGLGETNCOLORTABLEPROC glad_glGetnColorTable;\nPFNGLRASTERPOS3IPROC glad_glRasterPos3i;\nPFNGLACTIVETEXTUREPROC glad_glActiveTexture;\nPFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv;\nPFNGLCLEARNAMEDBUFFERDATAPROC glad_glClearNamedBufferData;\nPFNGLNORMAL3DPROC glad_glNormal3d;\nPFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC glad_glInvalidateNamedFramebufferSubData;\nPFNGLBINDBUFFERSBASEPROC glad_glBindBuffersBase;\nPFNGLEVALCOORD1DPROC glad_glEvalCoord1d;\nPFNGLGETMAPFVPROC glad_glGetMapfv;\nPFNGLISSYNCPROC glad_glIsSync;\nPFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D;\nPFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation;\nPFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D;\nPFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i;\nPFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv;\nPFNGLVERTEX4SVPROC glad_glVertex4sv;\nPFNGLTEXSTORAGE2DPROC glad_glTexStorage2D;\nPFNGLTEXCOORD2FVPROC glad_glTexCoord2fv;\nPFNGLUNIFORMMATRIX3X2DVPROC glad_glUniformMatrix3x2dv;\nPFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv;\nPFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv;\nPFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex;\nPFNGLDEPTHRANGEINDEXEDPROC glad_glDepthRangeIndexed;\nPFNGLISQUERYPROC glad_glIsQuery;\nPFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines;\nPFNGLGETTEXTURELEVELPARAMETERFVPROC glad_glGetTextureLevelParameterfv;\nPFNGLUNIFORMMATRIX4X3DVPROC glad_glUniformMatrix4x3dv;\nPFNGLBLITNAMEDFRAMEBUFFERPROC glad_glBlitNamedFramebuffer;\nPFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui;\nPFNGLINDEXSPROC glad_glIndexs;\nPFNGLCOLORP3UIPROC glad_glColorP3ui;\nPFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui;\nPFNGLCREATESHADERPROC glad_glCreateShader;\nPFNGLCLEARNAMEDFRAMEBUFFERFIPROC glad_glClearNamedFramebufferfi;\nPFNGLGETCOMPRESSEDTEXTUREIMAGEPROC glad_glGetCompressedTextureImage;\nPFNGLCOLOR4SVPROC glad_glColor4sv;\nPFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert;\nPFNGLRECTFPROC glad_glRectf;\nPFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog;\nPFNGLWINDOWPOS3SPROC glad_glWindowPos3s;\nPFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer;\nPFNGLCOPYIMAGESUBDATAPROC glad_glCopyImageSubData;\nPFNGLCOLORPOINTERPROC glad_glColorPointer;\nPFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv;\nPFNGLGETMATERIALFVPROC glad_glGetMaterialfv;\nPFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv;\nPFNGLDELETESAMPLERSPROC glad_glDeleteSamplers;\nPFNGLGETMATERIALIVPROC glad_glGetMaterialiv;\nPFNGLBLENDFUNCPROC glad_glBlendFunc;\nPFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC glad_glNamedFramebufferRenderbuffer;\nPFNGLNAMEDBUFFERDATAPROC glad_glNamedBufferData;\nPFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements;\nPFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i;\nPFNGLGETPROGRAMSTAGEIVPROC glad_glGetProgramStageiv;\nPFNGLVERTEXATTRIBLFORMATPROC glad_glVertexAttribLFormat;\nPFNGLVERTEX2SVPROC glad_glVertex2sv;\nPFNGLRECTSVPROC glad_glRectsv;\nPFNGLTEXTURESTORAGE2DPROC glad_glTextureStorage2D;\nPFNGLUNIFORM3FPROC glad_glUniform3f;\nPFNGLDRAWBUFFERPROC glad_glDrawBuffer;\nPFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D;\nPFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv;\nPFNGLUNIFORM4FPROC glad_glUniform4f;\nPFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d;\nPFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f;\nPFNGLSECONDARYCOLOR3UBVPROC glad_glSecondaryColor3ubv;\nPFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers;\nPFNGLCLEARCOLORPROC glad_glClearColor;\nPFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer;\nPFNGLGETTEXGENFVPROC glad_glGetTexGenfv;\nPFNGLCOLOR4DVPROC glad_glColor4dv;\nPFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv;\nPFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram;\nPFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender;\nPFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample;\nPFNGLVIEWPORTINDEXEDFVPROC glad_glViewportIndexedfv;\nPFNGLMAPGRID1FPROC glad_glMapGrid1f;\nPFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d;\nPFNGLWINDOWPOS2DVPROC glad_glWindowPos2dv;\nPFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv;\nPFNGLTEXGENFVPROC glad_glTexGenfv;\nPFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv;\nPFNGLROTATEDPROC glad_glRotated;\nPFNGLCREATEQUERIESPROC glad_glCreateQueries;\nPFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv;\nPFNGLTEXIMAGE1DPROC glad_glTexImage1D;\nPFNGLWINDOWPOS3IPROC glad_glWindowPos3i;\nPFNGLCLAMPCOLORPROC glad_glClampColor;\nPFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv;\nPFNGLVERTEX4FPROC glad_glVertex4f;\nPFNGLNORMAL3FPROC glad_glNormal3f;\nPFNGLCOLOR3UBPROC glad_glColor3ub;\nPFNGLSCISSORINDEXEDPROC glad_glScissorIndexed;\nPFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib;\nPFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d;\nPFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages;\nPFNGLTEXCOORD3SPROC glad_glTexCoord3s;\nPFNGLLIGHTFPROC glad_glLightf;\nPFNGLTEXCOORD3FVPROC glad_glTexCoord3fv;\nPFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv;\nPFNGLVERTEXATTRIBL2DPROC glad_glVertexAttribL2d;\nPFNGLFOGCOORDDPROC glad_glFogCoordd;\nPFNGLGETNPIXELMAPUIVPROC glad_glGetnPixelMapuiv;\nPFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample;\nPFNGLGETQUERYBUFFEROBJECTIVPROC glad_glGetQueryBufferObjectiv;\nPFNGLGETSTRINGIPROC glad_glGetStringi;\nPFNGLRASTERPOS4SPROC glad_glRasterPos4s;\nPFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui;\nPFNGLGETQUERYIVPROC glad_glGetQueryiv;\nPFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray;\nPFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv;\nPFNGLTEXPARAMETERFPROC glad_glTexParameterf;\nPFNGLWINDOWPOS3DPROC glad_glWindowPos3d;\nPFNGLGENERATETEXTUREMIPMAPPROC glad_glGenerateTextureMipmap;\nPFNGLDELETESYNCPROC glad_glDeleteSync;\nPFNGLBINDBUFFERPROC glad_glBindBuffer;\nPFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup;\nPFNGLRASTERPOS2IPROC glad_glRasterPos2i;\nPFNGLBINDIMAGETEXTUREPROC glad_glBindImageTexture;\nPFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer;\nPFNGLEVALMESH2PROC glad_glEvalMesh2;\nPFNGLLINKPROGRAMPROC glad_glLinkProgram;\nPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D;\nPFNGLPUSHMATRIXPROC glad_glPushMatrix;\nPFNGLFRAMEBUFFERPARAMETERIPROC glad_glFramebufferParameteri;\nPFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName;\nPFNGLUNIFORM3DPROC glad_glUniform3d;\nPFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv;\nPFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D;\nPFNGLGETTRANSFORMFEEDBACKI64_VPROC glad_glGetTransformFeedbacki64_v;\nPFNGLCOMPILESHADERPROC glad_glCompileShader;\nPFNGLGETLIGHTFVPROC glad_glGetLightfv;\nPFNGLPIXELMAPUSVPROC glad_glPixelMapusv;\nPFNGLRASTERPOS4IPROC glad_glRasterPos4i;\nPFNGLUNIFORMMATRIX4X2DVPROC glad_glUniformMatrix4x2dv;\nPFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D;\nPFNGLINITNAMESPROC glad_glInitNames;\nPFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui;\nPFNGLCLEARBUFFERIVPROC glad_glClearBufferiv;\nPFNGLMAP1FPROC glad_glMap1f;\nPFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv;\nPFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv;\nPFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv;\nPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample;\nPFNGLGETVERTEXARRAYINDEXEDIVPROC glad_glGetVertexArrayIndexediv;\nPFNGLVERTEXARRAYELEMENTBUFFERPROC glad_glVertexArrayElementBuffer;\nPFNGLGETTEXGENDVPROC glad_glGetTexGendv;\nPFNGLCLEARNAMEDFRAMEBUFFERFVPROC glad_glClearNamedFramebufferfv;\nPFNGLSECONDARYCOLOR3FPROC glad_glSecondaryColor3f;\nPFNGLSHADERBINARYPROC glad_glShaderBinary;\nPFNGLMAP1DPROC glad_glMap1d;\nPFNGLVERTEXATTRIBL2DVPROC glad_glVertexAttribL2dv;\nPFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d;\nPFNGLTEXCOORD1DVPROC glad_glTexCoord1dv;\nPFNGLTEXSTORAGE2DMULTISAMPLEPROC glad_glTexStorage2DMultisample;\nPFNGLGENTRANSFORMFEEDBACKSPROC glad_glGenTransformFeedbacks;\nPFNGLCLEARBUFFERSUBDATAPROC glad_glClearBufferSubData;\nPFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv;\nPFNGLGETFRAMEBUFFERPARAMETERIVPROC glad_glGetFramebufferParameteriv;\nPFNGLPIXELMAPFVPROC glad_glPixelMapfv;\nPFNGLCOLOR3FPROC glad_glColor3f;\nPFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv;\nPFNGLMULTMATRIXDPROC glad_glMultMatrixd;\nPFNGLCOPYPIXELSPROC glad_glCopyPixels;\nPFNGLUNIFORM2DVPROC glad_glUniform2dv;\nPFNGLCOLOR3SVPROC glad_glColor3sv;\nPFNGLOBJECTLABELPROC glad_glObjectLabel;\nPFNGLGETOBJECTLABELPROC glad_glGetObjectLabel;\nPFNGLINDEXFVPROC glad_glIndexfv;\nPFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC glad_glCompressedTextureSubImage3D;\nPFNGLMAPGRID1DPROC glad_glMapGrid1d;\nPFNGLGETQUERYBUFFEROBJECTUIVPROC glad_glGetQueryBufferObjectuiv;\nPFNGLRASTERPOS3SVPROC glad_glRasterPos3sv;\nPFNGLSELECTBUFFERPROC glad_glSelectBuffer;\nPFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv;\nPFNGLPATCHPARAMETERIPROC glad_glPatchParameteri;\nPFNGLGETTEXTUREPARAMETERIUIVPROC glad_glGetTextureParameterIuiv;\nPFNGLCOLOR3IVPROC glad_glColor3iv;\nPFNGLMAPBUFFERPROC glad_glMapBuffer;\nPFNGLNORMALP3UIPROC glad_glNormalP3ui;\nPFNGLVERTEXPOINTERPROC glad_glVertexPointer;\nPFNGLGETTEXTUREPARAMETERFVPROC glad_glGetTextureParameterfv;\nPFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer;\nPFNGLDEPTHRANGEFPROC glad_glDepthRangef;\nPFNGLTEXTUREPARAMETERIVPROC glad_glTextureParameteriv;\nPFNGLVERTEXP2UIVPROC glad_glVertexP2uiv;\nPFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv;\nPFNGLTEXPARAMETERIVPROC glad_glTexParameteriv;\nPFNGLBINDVERTEXBUFFERSPROC glad_glBindVertexBuffers;\nPFNGLVERTEXP3UIVPROC glad_glVertexP3uiv;\nPFNGLINDEXIPROC glad_glIndexi;\nPFNGLGETACTIVESUBROUTINENAMEPROC glad_glGetActiveSubroutineName;\nPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D;\nPFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv;\nPFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv;\nPFNGLGETTEXGENIVPROC glad_glGetTexGeniv;\nPFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s;\nPFNGLPOINTSIZEPROC glad_glPointSize;\nPFNGLVERTEXP2UIPROC glad_glVertexP2ui;\nPFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC glad_glMultiDrawArraysIndirectCount;\nPFNGLGETNTEXIMAGEPROC glad_glGetnTexImage;\nPFNGLCULLFACEPROC glad_glCullFace;\nPFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri;\nPFNGLTEXTUREBARRIERPROC glad_glTextureBarrier;\nPFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer;\nPFNGLBEGINQUERYPROC glad_glBeginQuery;\nPFNGLCOLOR4USPROC glad_glColor4us;\nPFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv;\nPFNGLTEXCOORD4IVPROC glad_glTexCoord4iv;\nPFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv;\nPFNGLDELETETEXTURESPROC glad_glDeleteTextures;\nPFNGLWINDOWPOS2IVPROC glad_glWindowPos2iv;\nPFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer;\nPFNGLCREATEVERTEXARRAYSPROC glad_glCreateVertexArrays;\nPFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i;\nPFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui;\nPFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC glad_glCompressedTextureSubImage2D;\nPFNGLRECTDPROC glad_glRectd;\nPFNGLMULTTRANSPOSEMATRIXDPROC glad_glMultTransposeMatrixd;\nPFNGLTEXENVFPROC glad_glTexEnvf;\nPFNGLNORMAL3IPROC glad_glNormal3i;\nPFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation;\nPFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate;\nPFNGLGETINTEGERVPROC glad_glGetIntegerv;\nPFNGLUSEPROGRAMPROC glad_glUseProgram;\nPFNGLNORMAL3BVPROC glad_glNormal3bv;\nPFNGLPIXELSTOREIPROC glad_glPixelStorei;\nPFNGLNORMAL3SPROC glad_glNormal3s;\nPFNGLCOLOR4IVPROC glad_glColor4iv;\nPFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv;\nPFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident;\nPFNGLGETUNIFORMFVPROC glad_glGetUniformfv;\nPFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC glad_glGetActiveSubroutineUniformName;\nPFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv;\nPFNGLTEXSTORAGE3DPROC glad_glTexStorage3D;\nPFNGLTEXCOORD1IPROC glad_glTexCoord1i;\nPFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC glad_glGetCompressedTextureSubImage;\nPFNGLVERTEXARRAYVERTEXBUFFERSPROC glad_glVertexArrayVertexBuffers;\nPFNGLSECONDARYCOLOR3DPROC glad_glSecondaryColor3d;\nPFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays;\nPFNGLUNMAPBUFFERPROC glad_glUnmapBuffer;\nPFNGLISENABLEDIPROC glad_glIsEnabledi;\nPFNGLBINDSAMPLERSPROC glad_glBindSamplers;\nPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D;\nPFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures;\nPFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv;\nPFNGLRASTERPOS4DPROC glad_glRasterPos4d;\nPFNGLSECONDARYCOLOR3USVPROC glad_glSecondaryColor3usv;\nPFNGLGETSYNCIVPROC glad_glGetSynciv;\nPFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv;\nPFNGLLIGHTMODELFVPROC glad_glLightModelfv;\nPFNGLTEXTURESTORAGE3DPROC glad_glTextureStorage3D;\nPFNGLRESUMETRANSFORMFEEDBACKPROC glad_glResumeTransformFeedback;\nPFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines;\nPFNGLVERTEX4FVPROC glad_glVertex4fv;\nPFNGLLIGHTIVPROC glad_glLightiv;\nPFNGLCLEARNAMEDFRAMEBUFFERIVPROC glad_glClearNamedFramebufferiv;\nPFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv;\nPFNGLTEXCOORD3DVPROC glad_glTexCoord3dv;\nPFNGLFOGCOORDPOINTERPROC glad_glFogCoordPointer;\nPFNGLUNIFORM2IPROC glad_glUniform2i;\nPFNGLTEXTURESUBIMAGE3DPROC glad_glTextureSubImage3D;\nPFNGLGETDOUBLEI_VPROC glad_glGetDoublei_v;\nPFNGLCLEARBUFFERDATAPROC glad_glClearBufferData;\nPFNGLBINDTEXTUREPROC glad_glBindTexture;\nPFNGLTEXTUREBUFFERRANGEPROC glad_glTextureBufferRange;\nPFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv;\nPFNGLSAMPLEMASKIPROC glad_glSampleMaski;\nPFNGLCLEARACCUMPROC glad_glClearAccum;\nPFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform;\nPFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary;\nPFNGLDETACHSHADERPROC glad_glDetachShader;\nPFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s;\nPFNGLTEXTUREPARAMETERIPROC glad_glTextureParameteri;\nPFNGLCOLOR3DVPROC glad_glColor3dv;\nPFNGLBINDSAMPLERPROC glad_glBindSampler;\nPFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC glad_glCheckNamedFramebufferStatus;\nPFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv;\nPFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays;\nPFNGLRASTERPOS4DVPROC glad_glRasterPos4dv;\nPFNGLGETFLOATVPROC glad_glGetFloatv;\nPFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri;\nPFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers;\nPFNGLSECONDARYCOLORPOINTERPROC glad_glSecondaryColorPointer;\nPFNGLISSAMPLERPROC glad_glIsSampler;\nPFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv;\nPFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv;\nPFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl;\nPFNGLBINDBUFFERSRANGEPROC glad_glBindBuffersRange;\nPFNGLMULTIDRAWARRAYSINDIRECTPROC glad_glMultiDrawArraysIndirect;\nPFNGLGETMAPDVPROC glad_glGetMapdv;\nPFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui;\nPFNGLVERTEXATTRIBIFORMATPROC glad_glVertexAttribIFormat;\nPFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC glad_glDrawTransformFeedbackStreamInstanced;\nPFNGLTRANSFORMFEEDBACKBUFFERBASEPROC glad_glTransformFeedbackBufferBase;\nPFNGLGETTEXENVIVPROC glad_glGetTexEnviv;\nPFNGLCOLORP3UIVPROC glad_glColorP3uiv;\nPFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f;\nPFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib;\nPFNGLGETTEXIMAGEPROC glad_glGetTexImage;\nPFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage;\nPFNGLDELETEBUFFERSPROC glad_glDeleteBuffers;\nPFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync;\nPFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv;\nPFNGLCLEARTEXIMAGEPROC glad_glClearTexImage;\nPFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv;\nPFNGLUNIFORM3UIVPROC glad_glUniform3uiv;\nPFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName;\nPFNGLEVALPOINT1PROC glad_glEvalPoint1;\nPFNGLCOLOR3USPROC glad_glColor3us;\nPFNGLGETTEXTURESUBIMAGEPROC glad_glGetTextureSubImage;\nPFNGLCOLOR3IPROC glad_glColor3i;\nPFNGLSECONDARYCOLOR3DVPROC glad_glSecondaryColor3dv;\nPFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv;\nPFNGLVIEWPORTARRAYVPROC glad_glViewportArrayv;\nPFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i;\nPFNGLVERTEXATTRIBL4DPROC glad_glVertexAttribL4d;\nPFNGLCOLOR4DPROC glad_glColor4d;\nPFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation;\nPFNGLCOLOR4UBVPROC glad_glColor4ubv;\nPFNGLUNIFORMMATRIX4DVPROC glad_glUniformMatrix4dv;\nPFNGLUNIFORMMATRIX3X4DVPROC glad_glUniformMatrix3x4dv;\nPFNGLSCISSORPROC glad_glScissor;\nPFNGLUNIFORMSUBROUTINESUIVPROC glad_glUniformSubroutinesuiv;\nPFNGLVERTEX4IVPROC glad_glVertex4iv;\nPFNGLCOLORMASKPROC glad_glColorMask;\nPFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate;\nPFNGLGETBOOLEANVPROC glad_glGetBooleanv;\nPFNGLVERTEX3DPROC glad_glVertex3d;\nPFNGLGETNAMEDBUFFERPOINTERVPROC glad_glGetNamedBufferPointerv;\nPFNGLVERTEXARRAYVERTEXBUFFERPROC glad_glVertexArrayVertexBuffer;\nPFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple;\nPFNGLSTENCILOPPROC glad_glStencilOp;\nPFNGLVIEWPORTPROC glad_glViewport;\nPFNGLGETNPOLYGONSTIPPLEPROC glad_glGetnPolygonStipple;\nPFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv;\nPFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback;\nPFNGLCREATEPROGRAMPROC glad_glCreateProgram;\nPFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog;\nPFNGLGETVERTEXARRAYINDEXED64IVPROC glad_glGetVertexArrayIndexed64iv;\nPFNGLTEXGENDPROC glad_glTexGend;\nPFNGLINDEXUBPROC glad_glIndexub;\nPFNGLMULTMATRIXFPROC glad_glMultMatrixf;\nPFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui;\nPFNGLTEXIMAGE3DPROC glad_glTexImage3D;\nPFNGLGETNUNIFORMDVPROC glad_glGetnUniformdv;\nPFNGLRECTIVPROC glad_glRectiv;\nPFNGLTEXCOORD4SPROC glad_glTexCoord4s;\nPFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D;\nPFNGLLOGICOPPROC glad_glLogicOp;\nPFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv;\nPFNGLSECONDARYCOLOR3FVPROC glad_glSecondaryColor3fv;\nPFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer;\nPFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv;\nPFNGLCREATESAMPLERSPROC glad_glCreateSamplers;\nPFNGLPIXELMAPUIVPROC glad_glPixelMapuiv;\nPFNGLBLENDCOLORPROC glad_glBlendColor;\nPFNGLLIGHTMODELIPROC glad_glLightModeli;\nPFNGLPOINTPARAMETERIPROC glad_glPointParameteri;\nPFNGLGENQUERIESPROC glad_glGenQueries;\nPFNGLNAMEDFRAMEBUFFERTEXTUREPROC glad_glNamedFramebufferTexture;\nPFNGLGETNSEPARABLEFILTERPROC glad_glGetnSeparableFilter;\nPFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv;\nPFNGLCOLOR4FVPROC glad_glColor4fv;\nPFNGLGETVERTEXARRAYIVPROC glad_glGetVertexArrayiv;\nPFNGLUNIFORM1UIPROC glad_glUniform1ui;\nPFNGLGETNMAPFVPROC glad_glGetnMapfv;\nPFNGLUNIFORM4FVPROC glad_glUniform4fv;\nPFNGLTEXGENFPROC glad_glTexGenf;\nPFNGLINDEXIVPROC glad_glIndexiv;\nPFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv;\nPFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i;\nPFNGLCOLOR4USVPROC glad_glColor4usv;\nPFNGLDRAWBUFFERSPROC glad_glDrawBuffers;\nPFNGLWINDOWPOS2IPROC glad_glWindowPos2i;\nPFNGLTEXBUFFERRANGEPROC glad_glTexBufferRange;\nPFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv;\nPFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv;\nPFNGLMULTIDRAWELEMENTSINDIRECTPROC glad_glMultiDrawElementsIndirect;\nPFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv;\nPFNGLUNIFORM3IPROC glad_glUniform3i;\nPFNGLGETCLIPPLANEPROC glad_glGetClipPlane;\nPFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv;\nPFNGLTEXCOORD2IPROC glad_glTexCoord2i;\nPFNGLUNIFORM4UIPROC glad_glUniform4ui;\nPFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC glad_glDrawElementsInstancedBaseVertexBaseInstance;\nPFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv;\nPFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d;\nPFNGLGETLIGHTIVPROC glad_glGetLightiv;\nPFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv;\nPFNGLTEXTURESTORAGE1DPROC glad_glTextureStorage1D;\nPFNGLSTENCILMASKPROC glad_glStencilMask;\nPFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv;\nPFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f;\nPFNGLINDEXDPROC glad_glIndexd;\nPFNGLNORMALP3UIVPROC glad_glNormalP3uiv;\nPFNGLEVALMESH1PROC glad_glEvalMesh1;\nPFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv;\nPFNGLVERTEXATTRIBL4DVPROC glad_glVertexAttribL4dv;\nPFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture;\nPFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s;\nPFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv;\nPFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv;\nPFNGLRASTERPOS3DPROC glad_glRasterPos3d;\nPFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv;\nPFNGLBINDTEXTUREUNITPROC glad_glBindTextureUnit;\nPFNGLWAITSYNCPROC glad_glWaitSync;\nPFNGLMATERIALFVPROC glad_glMaterialfv;\nPFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i;\nPFNGLRASTERPOS2SPROC glad_glRasterPos2s;\nPFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv;\nPFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv;\nPFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate;\nPFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv;\nPFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv;\nPFNGLVERTEXP4UIVPROC glad_glVertexP4uiv;\nPFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex;\nPFNGLDEPTHFUNCPROC glad_glDepthFunc;\nPFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f;\nPFNGLSHADERSOURCEPROC glad_glShaderSource;\nPFNGLVERTEX2IVPROC glad_glVertex2iv;\nPFNGLMAPNAMEDBUFFERPROC glad_glMapNamedBuffer;\nPFNGLCLEARDEPTHFPROC glad_glClearDepthf;\nPFNGLUNIFORM1FPROC glad_glUniform1f;\nPFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d;\nPFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v;\nPFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC glad_glNamedFramebufferDrawBuffers;\nPFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D;\nPFNGLDELETETRANSFORMFEEDBACKSPROC glad_glDeleteTransformFeedbacks;\nPFNGLVERTEX3IVPROC glad_glVertex3iv;\nPFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv;\nPFNGLISTEXTUREPROC glad_glIsTexture;\nPFNGLMULTTRANSPOSEMATRIXFPROC glad_glMultTransposeMatrixf;\nPFNGLNEWLISTPROC glad_glNewList;\nPFNGLSCALEFPROC glad_glScalef;\nPFNGLVERTEX3FPROC glad_glVertex3f;\nPFNGLTEXCOORD1IVPROC glad_glTexCoord1iv;\nPFNGLFOGCOORDFVPROC glad_glFogCoordfv;\nPFNGLMAPGRID2DPROC glad_glMapGrid2d;\nPFNGLWINDOWPOS2FVPROC glad_glWindowPos2fv;\nPFNGLREADPIXELSPROC glad_glReadPixels;\nPFNGLINVALIDATETEXSUBIMAGEPROC glad_glInvalidateTexSubImage;\nPFNGLORTHOPROC glad_glOrtho;\nPFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv;\nPFNGLWINDOWPOS2SVPROC glad_glWindowPos2sv;\nPFNGLFOGFPROC glad_glFogf;\nPFNGLCOLOR3SPROC glad_glColor3s;\nPFNGLUNIFORM2UIVPROC glad_glUniform2uiv;\nPFNGLPIXELZOOMPROC glad_glPixelZoom;\nPFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f;\nPFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv;\nPFNGLVERTEX3DVPROC glad_glVertex3dv;\nPFNGLUNIFORM3FVPROC glad_glUniform3fv;\nPFNGLENABLEPROC glad_glEnable;\nPFNGLTEXTUREPARAMETERIUIVPROC glad_glTextureParameterIuiv;\nPFNGLFOGCOORDDVPROC glad_glFogCoorddv;\nPFNGLBUFFERDATAPROC glad_glBufferData;\nPFNGLPOPATTRIBPROC glad_glPopAttrib;\nPFNGLNORMAL3DVPROC glad_glNormal3dv;\nPFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex;\nPFNGLPASSTHROUGHPROC glad_glPassThrough;\nPFNGLTEXCOORD2DVPROC glad_glTexCoord2dv;\nPFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv;\nPFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv;\nPFNGLUNIFORM3DVPROC glad_glUniform3dv;\nPFNGLBLENDEQUATIONIPROC glad_glBlendEquationi;\nPFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui;\nPFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv;\nPFNGLVERTEX4IPROC glad_glVertex4i;\nPFNGLUNIFORM4UIVPROC glad_glUniform4uiv;\nPFNGLTEXENVFVPROC glad_glTexEnvfv;\nPFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv;\nPFNGLCLEARTEXSUBIMAGEPROC glad_glClearTexSubImage;\nPFNGLTRANSLATEDPROC glad_glTranslated;\nPFNGLPOINTPARAMETERFPROC glad_glPointParameterf;\nPFNGLSCISSORINDEXEDVPROC glad_glScissorIndexedv;\nPFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv;\nPFNGLREADBUFFERPROC glad_glReadBuffer;\nPFNGLENDPROC glad_glEnd;\nPFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced;\nPFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv;\nPFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv;\nPFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC glad_glCompressedTextureSubImage1D;\nPFNGLVERTEX2DVPROC glad_glVertex2dv;\nPFNGLPUSHNAMEPROC glad_glPushName;\nPFNGLINVALIDATEBUFFERDATAPROC glad_glInvalidateBufferData;\nPFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv;\nPFNGLGENTEXTURESPROC glad_glGenTextures;\nPFNGLTEXCOORD4FVPROC glad_glTexCoord4fv;\nPFNGLDISPATCHCOMPUTEPROC glad_glDispatchCompute;\nPFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv;\nPFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv;\nPFNGLGETPROGRAMRESOURCENAMEPROC glad_glGetProgramResourceName;\nPFNGLVERTEX2FVPROC glad_glVertex2fv;\nPFNGLCOLOR4UBPROC glad_glColor4ub;\nPFNGLUNIFORM3IVPROC glad_glUniform3iv;\nPFNGLCLIPPLANEPROC glad_glClipPlane;\nPFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv;\nPFNGLUNIFORM4IPROC glad_glUniform4i;\nPFNGLWINDOWPOS3IVPROC glad_glWindowPos3iv;\nPFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv;\nPFNGLUNIFORM2DPROC glad_glUniform2d;\nPFNGLPOPMATRIXPROC glad_glPopMatrix;\nPFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline;\nPFNGLRASTERPOS3DVPROC glad_glRasterPos3dv;\nPFNGLTEXCOORD1FVPROC glad_glTexCoord1fv;\nPFNGLTEXCOORD2IVPROC glad_glTexCoord2iv;\nPFNGLCOPYTEXTURESUBIMAGE2DPROC glad_glCopyTextureSubImage2D;\nPFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders;\nPFNGLGETTRANSFORMFEEDBACKI_VPROC glad_glGetTransformFeedbacki_v;\nPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv;\nPFNGLVERTEXARRAYATTRIBIFORMATPROC glad_glVertexArrayAttribIFormat;\nPFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel;\nPFNGLGETNPIXELMAPUSVPROC glad_glGetnPixelMapusv;\nPFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f;\nPFNGLCLEARSTENCILPROC glad_glClearStencil;\nPFNGLDISABLEPROC glad_glDisable;\nPFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f;\nPFNGLGETSUBROUTINEINDEXPROC glad_glGetSubroutineIndex;\nPFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d;\nPFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv;\nPFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv;\nPFNGLUNIFORM4IVPROC glad_glUniform4iv;\nPFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor;\nPFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation;\nPFNGLGETNCOMPRESSEDTEXIMAGEPROC glad_glGetnCompressedTexImage;\nPFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv;\nPFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv;\nPFNGLEVALCOORD2DPROC glad_glEvalCoord2d;\nPFNGLGETPOINTERVPROC glad_glGetPointerv;\nPFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d;\nPFNGLTEXCOORD2FPROC glad_glTexCoord2f;\nPFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData;\nPFNGLUNIFORMMATRIX3DVPROC glad_glUniformMatrix3dv;\nPFNGLSECONDARYCOLOR3IVPROC glad_glSecondaryColor3iv;\nPFNGLFINISHPROC glad_glFinish;\nPFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline;\nPFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv;\nPFNGLGETNMAPDVPROC glad_glGetnMapdv;\nPFNGLBINDTEXTURESPROC glad_glBindTextures;\nPFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui;\nPFNGLCOLORMASKIPROC glad_glColorMaski;\nPFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v;\nPFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s;\nPFNGLWINDOWPOS2DPROC glad_glWindowPos2d;\nPFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glad_glDrawArraysInstancedBaseInstance;\nPFNGLDRAWTRANSFORMFEEDBACKPROC glad_glDrawTransformFeedback;\nPFNGLWINDOWPOS2FPROC glad_glWindowPos2f;\nPFNGLVERTEXATTRIBLPOINTERPROC glad_glVertexAttribLPointer;\nPFNGLTEXCOORD4FPROC glad_glTexCoord4f;\nPFNGLLIGHTMODELIVPROC glad_glLightModeliv;\nPFNGLUNIFORM2UIPROC glad_glUniform2ui;\nPFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays;\nPFNGLTEXBUFFERPROC glad_glTexBuffer;\nPFNGLUNIFORM2FPROC glad_glUniform2f;\nPFNGLTEXCOORD1DPROC glad_glTexCoord1d;\nPFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D;\nPFNGLGETGRAPHICSRESETSTATUSPROC glad_glGetGraphicsResetStatus;\nPFNGLTEXCOORD1SPROC glad_glTexCoord1s;\nPFNGLINDEXSVPROC glad_glIndexsv;\nPFNGLRASTERPOS4IVPROC glad_glRasterPos4iv;\nPFNGLSECONDARYCOLOR3IPROC glad_glSecondaryColor3i;\nPFNGLCALLLISTPROC glad_glCallList;\nPFNGLINDEXUBVPROC glad_glIndexubv;\nPFNGLPOLYGONMODEPROC glad_glPolygonMode;\nPFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture;\nPFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv;\nPFNGLISTRANSFORMFEEDBACKPROC glad_glIsTransformFeedback;\nPFNGLNAMEDBUFFERSUBDATAPROC glad_glNamedBufferSubData;\nPFNGLGETPROGRAMINTERFACEIVPROC glad_glGetProgramInterfaceiv;\nPFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState;\nPFNGLCLEARNAMEDFRAMEBUFFERUIVPROC glad_glClearNamedFramebufferuiv;\nPFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv;\nPFNGLVERTEXARRAYATTRIBLFORMATPROC glad_glVertexArrayAttribLFormat;\nPFNGLVERTEX4DPROC glad_glVertex4d;\nPFNGLNORMAL3SVPROC glad_glNormal3sv;\nPFNGLRASTERPOS4FPROC glad_glRasterPos4f;\nPFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui;\nPFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers;\nPFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings;\nPFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv;\nPFNGLNAMEDFRAMEBUFFERREADBUFFERPROC glad_glNamedFramebufferReadBuffer;\nPFNGLUNIFORMMATRIX2X3DVPROC glad_glUniformMatrix2x3dv;\nPFNGLVERTEXATTRIBL3DVPROC glad_glVertexAttribL3dv;\nPFNGLUNIFORM1UIVPROC glad_glUniform1uiv;\nPFNGLTEXCOORD1SVPROC glad_glTexCoord1sv;\nPFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v;\nPFNGLTEXTURESUBIMAGE2DPROC glad_glTextureSubImage2D;\nPFNGLNAMEDRENDERBUFFERSTORAGEPROC glad_glNamedRenderbufferStorage;\nPFNGLGETMAPIVPROC glad_glGetMapiv;\nPFNGLMATRIXMODEPROC glad_glMatrixMode;\nPFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv;\nPFNGLVERTEXATTRIBL1DVPROC glad_glVertexAttribL1dv;\nPFNGLGETNAMEDBUFFERSUBDATAPROC glad_glGetNamedBufferSubData;\nPFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays;\nPFNGLGETTEXTUREPARAMETERIVPROC glad_glGetTextureParameteriv;\nPFNGLVERTEX3FVPROC glad_glVertex3fv;\nPFNGLMATERIALIVPROC glad_glMaterialiv;\nPFNGLPIXELTRANSFERIPROC glad_glPixelTransferi;\nPFNGLGETNHISTOGRAMPROC glad_glGetnHistogram;\nPFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv;\nPFNGLENABLEVERTEXARRAYATTRIBPROC glad_glEnableVertexArrayAttrib;\nPFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender;\nPFNGLDELETELISTSPROC glad_glDeleteLists;\nPFNGLTEXCOORD2SVPROC glad_glTexCoord2sv;\nPFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback;\nPFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f;\nPFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage;\nPFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus;\nPFNGLGETINTERNALFORMATI64VPROC glad_glGetInternalformati64v;\nPFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap;\nPFNGLDELETEQUERIESPROC glad_glDeleteQueries;\nPFNGLNAMEDFRAMEBUFFERPARAMETERIPROC glad_glNamedFramebufferParameteri;\nPFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex;\nPFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d;\nPFNGLALPHAFUNCPROC glad_glAlphaFunc;\nPFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC glad_glTransformFeedbackBufferRange;\nPFNGLLINESTIPPLEPROC glad_glLineStipple;\nPFNGLTEXGENIPROC glad_glTexGeni;\nPFNGLTEXSTORAGE3DMULTISAMPLEPROC glad_glTexStorage3DMultisample;\nPFNGLISVERTEXARRAYPROC glad_glIsVertexArray;\nPFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC glad_glGetNamedRenderbufferParameteriv;\nPFNGLINVALIDATEFRAMEBUFFERPROC glad_glInvalidateFramebuffer;\nPFNGLPROGRAMBINARYPROC glad_glProgramBinary;\nPFNGLTEXCOORD4DVPROC glad_glTexCoord4dv;\nPFNGLVERTEX3IPROC glad_glVertex3i;\nPFNGLSECONDARYCOLOR3BPROC glad_glSecondaryColor3b;\nPFNGLRASTERPOS4SVPROC glad_glRasterPos4sv;\nPFNGLDISABLEIPROC glad_glDisablei;\nPFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv;\nPFNGLINVALIDATETEXIMAGEPROC glad_glInvalidateTexImage;\nPFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i;\nPFNGLINDEXFPROC glad_glIndexf;\nPFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex;\nPFNGLGETNCONVOLUTIONFILTERPROC glad_glGetnConvolutionFilter;\nPFNGLGETERRORPROC glad_glGetError;\nPFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv;\nPFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange;\nPFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui;\nPFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage;\nPFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv;\nPFNGLISPROGRAMPROC glad_glIsProgram;\nPFNGLISLISTPROC glad_glIsList;\nPFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv;\nPFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f;\nPFNGLTEXPARAMETERIPROC glad_glTexParameteri;\nPFNGLPUSHATTRIBPROC glad_glPushAttrib;\nPFNGLFRONTFACEPROC glad_glFrontFace;\nPFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC glad_glDrawElementsInstancedBaseInstance;\nPFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s;\nPFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i;\nPFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D;\nPFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D;\nPFNGLGENSAMPLERSPROC glad_glGenSamplers;\nPFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf;\nPFNGLRASTERPOS4FVPROC glad_glRasterPos4fv;\nPFNGLPAUSETRANSFORMFEEDBACKPROC glad_glPauseTransformFeedback;\nPFNGLPOPNAMEPROC glad_glPopName;\nPFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv;\nPFNGLEVALCOORD1FPROC glad_glEvalCoord1f;\nPFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers;\nPFNGLLIGHTIPROC glad_glLighti;\nPFNGLTEXTUREVIEWPROC glad_glTextureView;\nPFNGLLOADTRANSPOSEMATRIXDPROC glad_glLoadTransposeMatrixd;\nPFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetNamedFramebufferAttachmentParameteriv;\nPFNGLUNIFORM4DPROC glad_glUniform4d;\nPFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui;\nPFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer;\nPFNGLSTENCILFUNCPROC glad_glStencilFunc;\nPFNGLUNIFORM1IPROC glad_glUniform1i;\nPFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv;\nPFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC glad_glInvalidateNamedFramebufferData;\nPFNGLPATCHPARAMETERFVPROC glad_glPatchParameterfv;\nPFNGLFOGFVPROC glad_glFogfv;\nPFNGLVERTEXP3UIPROC glad_glVertexP3ui;\nPFNGLREADNPIXELSPROC glad_glReadnPixels;\nPFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i;\nPFNGLVERTEXATTRIBBINDINGPROC glad_glVertexAttribBinding;\nPFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv;\nPFNGLVERTEX4SPROC glad_glVertex4s;\nPFNGLVERTEXBINDINGDIVISORPROC glad_glVertexBindingDivisor;\nPFNGLTEXTUREPARAMETERFVPROC glad_glTextureParameterfv;\nPFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv;\nPFNGLNORMAL3BPROC glad_glNormal3b;\nPFNGLGETUNIFORMSUBROUTINEUIVPROC glad_glGetUniformSubroutineuiv;\nPFNGLVERTEX3SVPROC glad_glVertex3sv;\nPFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv;\nPFNGLGETNAMEDBUFFERPARAMETERI64VPROC glad_glGetNamedBufferParameteri64v;\nPFNGLDRAWPIXELSPROC glad_glDrawPixels;\nPFNGLCALLLISTSPROC glad_glCallLists;\nPFNGLTEXCOORD3IPROC glad_glTexCoord3i;\nPFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui;\nPFNGLQUERYCOUNTERPROC glad_glQueryCounter;\nPFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv;\nPFNGLUNIFORM1IVPROC glad_glUniform1iv;\nPFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate;\nPFNGLGETNAMEDBUFFERPARAMETERIVPROC glad_glGetNamedBufferParameteriv;\nPFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv;\nPFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib;\nPFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray;\nPFNGLMATERIALIPROC glad_glMateriali;\nPFNGLUNIFORM2FVPROC glad_glUniform2fv;\nPFNGLRASTERPOS3FVPROC glad_glRasterPos3fv;\nPFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC glad_glGetProgramResourceLocationIndex;\nPFNGLGETDOUBLEVPROC glad_glGetDoublev;\nPFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex;\nPFNGLUNIFORMMATRIX2X4DVPROC glad_glUniformMatrix2x4dv;\nPFNGLCOLOR4BVPROC glad_glColor4bv;\nPFNGLGETINTERNALFORMATIVPROC glad_glGetInternalformativ;\nPFNGLGETACTIVESUBROUTINEUNIFORMIVPROC glad_glGetActiveSubroutineUniformiv;\nPFNGLGETQUERYINDEXEDIVPROC glad_glGetQueryIndexediv;\nPFNGLBINDVERTEXBUFFERPROC glad_glBindVertexBuffer;\nPFNGLTEXCOORD3FPROC glad_glTexCoord3f;\nPFNGLCOLOR3UIVPROC glad_glColor3uiv;\nPFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv;\nPFNGLCLEARPROC glad_glClear;\nPFNGLRASTERPOS2DVPROC glad_glRasterPos2dv;\nPFNGLTEXCOORD2SPROC glad_glTexCoord2s;\nPFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui;\nPFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer;\nPFNGLTEXENVIPROC glad_glTexEnvi;\nPFNGLTEXTUREPARAMETERFPROC glad_glTextureParameterf;\nPFNGLMATERIALFPROC glad_glMaterialf;\nPFNGLGETUNIFORMDVPROC glad_glGetUniformdv;\nPFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv;\nPFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv;\nPFNGLCLEARINDEXPROC glad_glClearIndex;\nPFNGLDISPATCHCOMPUTEINDIRECTPROC glad_glDispatchComputeIndirect;\nPFNGLROTATEFPROC glad_glRotatef;\nPFNGLTEXTURESUBIMAGE1DPROC glad_glTextureSubImage1D;\nPFNGLPOLYGONOFFSETCLAMPPROC glad_glPolygonOffsetClamp;\nPFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv;\nPFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv;\nPFNGLSECONDARYCOLOR3SPROC glad_glSecondaryColor3s;\nPFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv;\nPFNGLGETVERTEXATTRIBLDVPROC glad_glGetVertexAttribLdv;\nPFNGLRASTERPOS2FVPROC glad_glRasterPos2fv;\nPFNGLSHADEMODELPROC glad_glShadeModel;\nPFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv;\nPFNGLNORMAL3FVPROC glad_glNormal3fv;\nPFNGLISBUFFERPROC glad_glIsBuffer;\nPFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f;\nPFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer;\nPFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed;\nPFNGLBINDBUFFERBASEPROC glad_glBindBufferBase;\nPFNGLGENBUFFERSPROC glad_glGenBuffers;\nPFNGLTEXCOORD1FPROC glad_glTexCoord1f;\nPFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData;\nPFNGLCREATETRANSFORMFEEDBACKSPROC glad_glCreateTransformFeedbacks;\nPFNGLMAP2FPROC glad_glMap2f;\nPFNGLCREATEBUFFERSPROC glad_glCreateBuffers;\nPFNGLCOLOR3USVPROC glad_glColor3usv;\nPFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv;\nPFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation;\nPFNGLVERTEX2DPROC glad_glVertex2d;\nPFNGLGETSUBROUTINEUNIFORMLOCATIONPROC glad_glGetSubroutineUniformLocation;\nPFNGLINVALIDATEBUFFERSUBDATAPROC glad_glInvalidateBufferSubData;\nPFNGLUNIFORMMATRIX2DVPROC glad_glUniformMatrix2dv;\nPFNGLCLEARNAMEDBUFFERSUBDATAPROC glad_glClearNamedBufferSubData;\nPFNGLGETPROGRAMIVPROC glad_glGetProgramiv;\nPFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements;\nPFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv;\nPFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v;\nPFNGLVERTEXATTRIBL1DPROC glad_glVertexAttribL1d;\nPFNGLGETTEXTUREIMAGEPROC glad_glGetTextureImage;\nPFNGLGETNUNIFORMIVPROC glad_glGetnUniformiv;\nPFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i;\nPFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC glad_glDrawTransformFeedbackInstanced;\nPFNGLGETPROGRAMRESOURCEINDEXPROC glad_glGetProgramResourceIndex;\nPFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d;\nPFNGLUNMAPNAMEDBUFFERPROC glad_glUnmapNamedBuffer;\nPFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f;\nPFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv;\nPFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv;\nPFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange;\nPFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv;\nPFNGLCOLORMATERIALPROC glad_glColorMaterial;\nPFNGLBLENDEQUATIONPROC glad_glBlendEquation;\nPFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer;\nPFNGLCOLOR3DPROC glad_glColor3d;\nPFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv;\nPFNGLLIGHTFVPROC glad_glLightfv;\nPFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv;\nPFNGLDEPTHMASKPROC glad_glDepthMask;\nPFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying;\nPFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui;\nPFNGLVERTEXATTRIBL3DPROC glad_glVertexAttribL3d;\nPFNGLDRAWELEMENTSINDIRECTPROC glad_glDrawElementsIndirect;\nPFNGLLOADTRANSPOSEMATRIXFPROC glad_glLoadTransposeMatrixf;\nPFNGLENDQUERYINDEXEDPROC glad_glEndQueryIndexed;\nPFNGLSECONDARYCOLOR3USPROC glad_glSecondaryColor3us;\nPFNGLTEXTURESTORAGE2DMULTISAMPLEPROC glad_glTextureStorage2DMultisample;\nPFNGLPIXELSTOREFPROC glad_glPixelStoref;\nPFNGLUNIFORM2IVPROC glad_glUniform2iv;\nPFNGLRASTERPOS2SVPROC glad_glRasterPos2sv;\nPFNGLVERTEX2IPROC glad_glVertex2i;\nPFNGLFRUSTUMPROC glad_glFrustum;\nPFNGLMEMORYBARRIERPROC glad_glMemoryBarrier;\nPFNGLGETSTRINGPROC glad_glGetString;\nPFNGLLINEWIDTHPROC glad_glLineWidth;\nPFNGLNORMALPOINTERPROC glad_glNormalPointer;\nPFNGLGETNUNIFORMUIVPROC glad_glGetnUniformuiv;\nPFNGLDEPTHRANGEARRAYVPROC glad_glDepthRangeArrayv;\nPFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui;\nPFNGLATTACHSHADERPROC glad_glAttachShader;\nPFNGLDRAWARRAYSPROC glad_glDrawArrays;\nPFNGLCOLOR4SPROC glad_glColor4s;\nPFNGLTEXGENDVPROC glad_glTexGendv;\nPFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv;\nPFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv;\nPFNGLENDQUERYPROC glad_glEndQuery;\nPFNGLWINDOWPOS2SPROC glad_glWindowPos2s;\nPFNGLDRAWARRAYSINDIRECTPROC glad_glDrawArraysIndirect;\nPFNGLRASTERPOS3SPROC glad_glRasterPos3s;\nPFNGLGETNPIXELMAPFVPROC glad_glGetnPixelMapfv;\nPFNGLTEXCOORD3SVPROC glad_glTexCoord3sv;\nPFNGLRECTIPROC glad_glRecti;\nPFNGLUNIFORM4DVPROC glad_glUniform4dv;\nPFNGLBLENDEQUATIONSEPARATEIPROC glad_glBlendEquationSeparatei;\nPFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv;\nPFNGLGETPROGRAMRESOURCEIVPROC glad_glGetProgramResourceiv;\nPFNGLINVALIDATESUBFRAMEBUFFERPROC glad_glInvalidateSubFramebuffer;\nPFNGLFENCESYNCPROC glad_glFenceSync;\nPFNGLUNIFORM3UIPROC glad_glUniform3ui;\nPFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv;\nPFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s;\nPFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv;\nPFNGLLOADMATRIXFPROC glad_glLoadMatrixf;\nPFNGLTRANSLATEFPROC glad_glTranslatef;\nPFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv;\nPFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv;\nPFNGLMAPGRID2FPROC glad_glMapGrid2f;\nPFNGLENABLECLIENTSTATEPROC glad_glEnableClientState;\nPFNGLGETUNIFORMIVPROC glad_glGetUniformiv;\nPFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv;\nPFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv;\nPFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv;\nPFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv;\nPFNGLINDEXDVPROC glad_glIndexdv;\nPFNGLBLENDFUNCIPROC glad_glBlendFunci;\nPFNGLISENABLEDPROC glad_glIsEnabled;\nPFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv;\nPFNGLRASTERPOS3IVPROC glad_glRasterPos3iv;\nPFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange;\nPFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s;\nPFNGLRASTERPOS2FPROC glad_glRasterPos2f;\nPFNGLMINSAMPLESHADINGPROC glad_glMinSampleShading;\nPFNGLGETQUERYBUFFEROBJECTUI64VPROC glad_glGetQueryBufferObjectui64v;\nPFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i;\nPFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv;\nPFNGLVERTEX2FPROC glad_glVertex2f;\nPFNGLVERTEXARRAYBINDINGDIVISORPROC glad_glVertexArrayBindingDivisor;\nPFNGLINDEXPOINTERPROC glad_glIndexPointer;\nPFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding;\nPFNGLRENDERMODEPROC glad_glRenderMode;\nPFNGLTEXSTORAGE1DPROC glad_glTexStorage1D;\nPFNGLBUFFERSUBDATAPROC glad_glBufferSubData;\nPFNGLCOLOR3FVPROC glad_glColor3fv;\nPFNGLBITMAPPROC glad_glBitmap;\nPFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv;\nPFNGLVIEWPORTINDEXEDFPROC glad_glViewportIndexedf;\nPFNGLRASTERPOS2DPROC glad_glRasterPos2d;\nPFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices;\nPFNGLENABLEIPROC glad_glEnablei;\nPFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D;\nPFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate;\nPFNGLNAMEDBUFFERSTORAGEPROC glad_glNamedBufferStorage;\nPFNGLRECTSPROC glad_glRects;\nPFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv;\nPFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple;\nPFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D;\nPFNGLSECONDARYCOLOR3UBPROC glad_glSecondaryColor3ub;\nPFNGLWINDOWPOS3FPROC glad_glWindowPos3f;\nPFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv;\nPFNGLSHADERSTORAGEBLOCKBINDINGPROC glad_glShaderStorageBlockBinding;\nPFNGLLOADIDENTITYPROC glad_glLoadIdentity;\nPFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex;\nPFNGLVERTEX2SPROC glad_glVertex2s;\nPFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv;\nPFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s;\nPFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler;\nPFNGLGETSHADERSOURCEPROC glad_glGetShaderSource;\nPFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv;\nPFNGLTEXPARAMETERFVPROC glad_glTexParameterfv;\nPFNGLISSHADERPROC glad_glIsShader;\nPFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv;\nPFNGLTEXCOORD4IPROC glad_glTexCoord4i;\nPFNGLCOLOR4UIPROC glad_glColor4ui;\nPFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv;\nPFNGLGETTEXENVFVPROC glad_glGetTexEnvfv;\nPFNGLTEXCOORD4DPROC glad_glTexCoord4d;\nPFNGLSCISSORARRAYVPROC glad_glScissorArrayv;\nPFNGLCREATERENDERBUFFERSPROC glad_glCreateRenderbuffers;\nPFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv;\nPFNGLCOLOR4FPROC glad_glColor4f;\nPFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub;\nPFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv;\nPFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D;\nPFNGLNORMAL3IVPROC glad_glNormal3iv;\nPFNGLBINDIMAGETEXTURESPROC glad_glBindImageTextures;\nPFNGLTEXGENIVPROC glad_glTexGeniv;\nPFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D;\nPFNGLSCALEDPROC glad_glScaled;\nPFNGLCREATEPROGRAMPIPELINESPROC glad_glCreateProgramPipelines;\nPFNGLBLENDFUNCSEPARATEIPROC glad_glBlendFuncSeparatei;\nPFNGLHINTPROC glad_glHint;\nPFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i;\nPFNGLINDEXMASKPROC glad_glIndexMask;\nPFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f;\nPFNGLCOLOR3BPROC glad_glColor3b;\nPFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv;\nPFNGLSPECIALIZESHADERPROC glad_glSpecializeShader;\nPFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC glad_glNamedFramebufferDrawBuffer;\nPFNGLGETQUERYBUFFEROBJECTI64VPROC glad_glGetQueryBufferObjecti64v;\nPFNGLTEXCOORD3IVPROC glad_glTexCoord3iv;\nPFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv;\nPFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv;\nPFNGLBUFFERSTORAGEPROC glad_glBufferStorage;\nPFNGLVERTEX3SPROC glad_glVertex3s;\nPFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv;\nPFNGLDEPTHRANGEPROC glad_glDepthRange;\nPFNGLRASTERPOS3FPROC glad_glRasterPos3f;\nPFNGLDELETESHADERPROC glad_glDeleteShader;\nPFNGLCOLOR3BVPROC glad_glColor3bv;\nPFNGLCOLOR3UBVPROC glad_glColor3ubv;\nPFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv;\nPFNGLTEXCOORD4SVPROC glad_glTexCoord4sv;\nPFNGLMAP2DPROC glad_glMap2d;\nPFNGLFOGCOORDFPROC glad_glFogCoordf;\nPFNGLEDGEFLAGVPROC glad_glEdgeFlagv;\nPFNGLCLIPCONTROLPROC glad_glClipControl;\nPFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv;\nPFNGLGETTRANSFORMFEEDBACKIVPROC glad_glGetTransformFeedbackiv;\nPFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv;\nPFNGLGETNMINMAXPROC glad_glGetnMinmax;\nPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glNamedRenderbufferStorageMultisample;\nPFNGLCOLORP4UIPROC glad_glColorP4ui;\nPFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv;\nPFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv;\nPFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv;\nPFNGLVERTEXP4UIPROC glad_glVertexP4ui;\nPFNGLRECTFVPROC glad_glRectfv;\nPFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback;\nPFNGLARRAYELEMENTPROC glad_glArrayElement;\nPFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC glad_glNamedFramebufferTextureLayer;\nPFNGLBEGINPROC glad_glBegin;\nPFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer;\nPFNGLTEXCOORD3DPROC glad_glTexCoord3d;\nPFNGLUNIFORM1FVPROC glad_glUniform1fv;\nPFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv;\nPFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog;\nPFNGLPOLYGONOFFSETPROC glad_glPolygonOffset;\nPFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat;\nPFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d;\nPFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv;\nPFNGLBINDTRANSFORMFEEDBACKPROC glad_glBindTransformFeedback;\nPFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex;\nPFNGLDISABLEVERTEXARRAYATTRIBPROC glad_glDisableVertexArrayAttrib;\nPFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv;\nPFNGLUNIFORM1DPROC glad_glUniform1d;\nPFNGLVERTEXATTRIBFORMATPROC glad_glVertexAttribFormat;\nPFNGLMEMORYBARRIERBYREGIONPROC glad_glMemoryBarrierByRegion;\nPFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup;\nPFNGLCOLOR4BPROC glad_glColor4b;\nPFNGLTEXTUREBUFFERPROC glad_glTextureBuffer;\nPFNGLGETSHADERIVPROC glad_glGetShaderiv;\nPFNGLBEGINQUERYINDEXEDPROC glad_glBeginQueryIndexed;\nPFNGLCOPYNAMEDBUFFERSUBDATAPROC glad_glCopyNamedBufferSubData;\nPFNGLVERTEXARRAYATTRIBFORMATPROC glad_glVertexArrayAttribFormat;\nPFNGLMAPNAMEDBUFFERRANGEPROC glad_glMapNamedBufferRange;\nPFNGLCOLOR4UIVPROC glad_glColor4uiv;\nPFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui;\nPFNGLWINDOWPOS3SVPROC glad_glWindowPos3sv;\nPFNGLFOGIVPROC glad_glFogiv;\nPFNGLTEXTUREPARAMETERIIVPROC glad_glTextureParameterIiv;\nPFNGLLISTBASEPROC glad_glListBase;\nPFNGLCREATEFRAMEBUFFERSPROC glad_glCreateFramebuffers;\nPFNGLEVALCOORD2FPROC glad_glEvalCoord2f;\nPFNGLVERTEX4DVPROC glad_glVertex4dv;\nPFNGLDELETEPROGRAMPROC glad_glDeleteProgram;\nPFNGLDRAWELEMENTSPROC glad_glDrawElements;\nPFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC glad_glDrawTransformFeedbackStream;\nPFNGLVALIDATEPROGRAMPROC glad_glValidateProgram;\nPFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced;\nPFNGLGENLISTSPROC glad_glGenLists;\nPFNGLCOLOR4IPROC glad_glColor4i;\nPFNGLCOLOR3UIPROC glad_glColor3ui;\nPFNGLCREATETEXTURESPROC glad_glCreateTextures;\nPFNGLCOLORP4UIVPROC glad_glColorP4uiv;\nPFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog;\nPFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui;\nPFNGLCLEARBUFFERFIPROC glad_glClearBufferfi;\nPFNGLCOPYTEXTURESUBIMAGE3DPROC glad_glCopyTextureSubImage3D;\nPFNGLEDGEFLAGPROC glad_glEdgeFlag;\nPFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v;\nPFNGLRASTERPOS2IVPROC glad_glRasterPos2iv;\nPFNGLGETNMAPIVPROC glad_glGetnMapiv;\nPFNGLRECTDVPROC glad_glRectdv;\nPFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v;\nPFNGLENDLISTPROC glad_glEndList;\nPFNGLFLUSHPROC glad_glFlush;\nPFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui;\nPFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC glad_glMultiDrawElementsIndirectCount;\nPFNGLGETINTEGER64VPROC glad_glGetInteger64v;\nPFNGLLIGHTMODELFPROC glad_glLightModelf;\nPFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv;\nPFNGLGETTEXTURELEVELPARAMETERIVPROC glad_glGetTextureLevelParameteriv;\nPFNGLLOADMATRIXDPROC glad_glLoadMatrixd;\nPFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline;\nPFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv;\nPFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray;\nPFNGLCLEARDEPTHPROC glad_glClearDepth;\nPFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv;\nPFNGLWINDOWPOS3FVPROC glad_glWindowPos3fv;\nPFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d;\nPFNGLGETPROGRAMRESOURCELOCATIONPROC glad_glGetProgramResourceLocation;\nPFNGLTEXCOORD2DPROC glad_glTexCoord2d;\nPFNGLACCUMPROC glad_glAccum;\nPFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui;\nPFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui;\nPFNGLGETNUNIFORMFVPROC glad_glGetnUniformfv;\nPFNGLFOGIPROC glad_glFogi;\nPFNGLCLEARBUFFERFVPROC glad_glClearBufferfv;\nPFNGLTEXENVIVPROC glad_glTexEnviv;\nPFNGLTEXIMAGE2DPROC glad_glTexImage2D;\nPFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC glad_glGetActiveAtomicCounterBufferiv;\nPFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv;\nPFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv;\nPFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel;\n\n\nstatic void load_GL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_1_0) return;\n    glEvalPoint2 = (PFNGLEVALPOINT2PROC) load(\"glEvalPoint2\", userptr);\n    glEvalCoord2d = (PFNGLEVALCOORD2DPROC) load(\"glEvalCoord2d\", userptr);\n    glPixelStoref = (PFNGLPIXELSTOREFPROC) load(\"glPixelStoref\", userptr);\n    glTexCoord2f = (PFNGLTEXCOORD2FPROC) load(\"glTexCoord2f\", userptr);\n    glFinish = (PFNGLFINISHPROC) load(\"glFinish\", userptr);\n    glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC) load(\"glGetTexLevelParameterfv\", userptr);\n    glPixelTransferf = (PFNGLPIXELTRANSFERFPROC) load(\"glPixelTransferf\", userptr);\n    glClearAccum = (PFNGLCLEARACCUMPROC) load(\"glClearAccum\", userptr);\n    glLoadName = (PFNGLLOADNAMEPROC) load(\"glLoadName\", userptr);\n    glRasterPos2sv = (PFNGLRASTERPOS2SVPROC) load(\"glRasterPos2sv\", userptr);\n    glVertex2i = (PFNGLVERTEX2IPROC) load(\"glVertex2i\", userptr);\n    glFrustum = (PFNGLFRUSTUMPROC) load(\"glFrustum\", userptr);\n    glGetString = (PFNGLGETSTRINGPROC) load(\"glGetString\", userptr);\n    glLineWidth = (PFNGLLINEWIDTHPROC) load(\"glLineWidth\", userptr);\n    glColor3dv = (PFNGLCOLOR3DVPROC) load(\"glColor3dv\", userptr);\n    glColor4s = (PFNGLCOLOR4SPROC) load(\"glColor4s\", userptr);\n    glTexGendv = (PFNGLTEXGENDVPROC) load(\"glTexGendv\", userptr);\n    glRasterPos3s = (PFNGLRASTERPOS3SPROC) load(\"glRasterPos3s\", userptr);\n    glRasterPos4dv = (PFNGLRASTERPOS4DVPROC) load(\"glRasterPos4dv\", userptr);\n    glGetFloatv = (PFNGLGETFLOATVPROC) load(\"glGetFloatv\", userptr);\n    glRasterPos3i = (PFNGLRASTERPOS3IPROC) load(\"glRasterPos3i\", userptr);\n    glTexCoord4f = (PFNGLTEXCOORD4FPROC) load(\"glTexCoord4f\", userptr);\n    glGetMapfv = (PFNGLGETMAPFVPROC) load(\"glGetMapfv\", userptr);\n    glNormal3d = (PFNGLNORMAL3DPROC) load(\"glNormal3d\", userptr);\n    glLightModeliv = (PFNGLLIGHTMODELIVPROC) load(\"glLightModeliv\", userptr);\n    glTexCoord3sv = (PFNGLTEXCOORD3SVPROC) load(\"glTexCoord3sv\", userptr);\n    glEvalCoord1d = (PFNGLEVALCOORD1DPROC) load(\"glEvalCoord1d\", userptr);\n    glGetMapdv = (PFNGLGETMAPDVPROC) load(\"glGetMapdv\", userptr);\n    glRecti = (PFNGLRECTIPROC) load(\"glRecti\", userptr);\n    glTexCoord1d = (PFNGLTEXCOORD1DPROC) load(\"glTexCoord1d\", userptr);\n    glGetPixelMapfv = (PFNGLGETPIXELMAPFVPROC) load(\"glGetPixelMapfv\", userptr);\n    glVertex4sv = (PFNGLVERTEX4SVPROC) load(\"glVertex4sv\", userptr);\n    glTexCoord1s = (PFNGLTEXCOORD1SPROC) load(\"glTexCoord1s\", userptr);\n    glIndexsv = (PFNGLINDEXSVPROC) load(\"glIndexsv\", userptr);\n    glRasterPos4iv = (PFNGLRASTERPOS4IVPROC) load(\"glRasterPos4iv\", userptr);\n    glTexCoord2fv = (PFNGLTEXCOORD2FVPROC) load(\"glTexCoord2fv\", userptr);\n    glGetTexEnviv = (PFNGLGETTEXENVIVPROC) load(\"glGetTexEnviv\", userptr);\n    glCallList = (PFNGLCALLLISTPROC) load(\"glCallList\", userptr);\n    glLoadMatrixf = (PFNGLLOADMATRIXFPROC) load(\"glLoadMatrixf\", userptr);\n    glPolygonMode = (PFNGLPOLYGONMODEPROC) load(\"glPolygonMode\", userptr);\n    glTranslatef = (PFNGLTRANSLATEFPROC) load(\"glTranslatef\", userptr);\n    glGetTexImage = (PFNGLGETTEXIMAGEPROC) load(\"glGetTexImage\", userptr);\n    glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(\"glGetTexParameterfv\", userptr);\n    glMapGrid2f = (PFNGLMAPGRID2FPROC) load(\"glMapGrid2f\", userptr);\n    glVertex4d = (PFNGLVERTEX4DPROC) load(\"glVertex4d\", userptr);\n    glNormal3sv = (PFNGLNORMAL3SVPROC) load(\"glNormal3sv\", userptr);\n    glRasterPos4f = (PFNGLRASTERPOS4FPROC) load(\"glRasterPos4f\", userptr);\n    glEvalCoord1dv = (PFNGLEVALCOORD1DVPROC) load(\"glEvalCoord1dv\", userptr);\n    glIndexs = (PFNGLINDEXSPROC) load(\"glIndexs\", userptr);\n    glIndexdv = (PFNGLINDEXDVPROC) load(\"glIndexdv\", userptr);\n    glIsEnabled = (PFNGLISENABLEDPROC) load(\"glIsEnabled\", userptr);\n    glGetPixelMapusv = (PFNGLGETPIXELMAPUSVPROC) load(\"glGetPixelMapusv\", userptr);\n    glColor3us = (PFNGLCOLOR3USPROC) load(\"glColor3us\", userptr);\n    glEvalPoint1 = (PFNGLEVALPOINT1PROC) load(\"glEvalPoint1\", userptr);\n    glColor4sv = (PFNGLCOLOR4SVPROC) load(\"glColor4sv\", userptr);\n    glColor3i = (PFNGLCOLOR3IPROC) load(\"glColor3i\", userptr);\n    glRectf = (PFNGLRECTFPROC) load(\"glRectf\", userptr);\n    glEvalCoord1fv = (PFNGLEVALCOORD1FVPROC) load(\"glEvalCoord1fv\", userptr);\n    glTexCoord1sv = (PFNGLTEXCOORD1SVPROC) load(\"glTexCoord1sv\", userptr);\n    glColor4d = (PFNGLCOLOR4DPROC) load(\"glColor4d\", userptr);\n    glColor4ubv = (PFNGLCOLOR4UBVPROC) load(\"glColor4ubv\", userptr);\n    glGetMaterialfv = (PFNGLGETMATERIALFVPROC) load(\"glGetMaterialfv\", userptr);\n    glRasterPos3iv = (PFNGLRASTERPOS3IVPROC) load(\"glRasterPos3iv\", userptr);\n    glGetMaterialiv = (PFNGLGETMATERIALIVPROC) load(\"glGetMaterialiv\", userptr);\n    glBlendFunc = (PFNGLBLENDFUNCPROC) load(\"glBlendFunc\", userptr);\n    glGetMapiv = (PFNGLGETMAPIVPROC) load(\"glGetMapiv\", userptr);\n    glMatrixMode = (PFNGLMATRIXMODEPROC) load(\"glMatrixMode\", userptr);\n    glScissor = (PFNGLSCISSORPROC) load(\"glScissor\", userptr);\n    glVertex4iv = (PFNGLVERTEX4IVPROC) load(\"glVertex4iv\", userptr);\n    glColorMask = (PFNGLCOLORMASKPROC) load(\"glColorMask\", userptr);\n    glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(\"glGetBooleanv\", userptr);\n    glVertex2sv = (PFNGLVERTEX2SVPROC) load(\"glVertex2sv\", userptr);\n    glRectsv = (PFNGLRECTSVPROC) load(\"glRectsv\", userptr);\n    glRasterPos2f = (PFNGLRASTERPOS2FPROC) load(\"glRasterPos2f\", userptr);\n    glVertex3d = (PFNGLVERTEX3DPROC) load(\"glVertex3d\", userptr);\n    glStencilOp = (PFNGLSTENCILOPPROC) load(\"glStencilOp\", userptr);\n    glViewport = (PFNGLVIEWPORTPROC) load(\"glViewport\", userptr);\n    glMaterialiv = (PFNGLMATERIALIVPROC) load(\"glMaterialiv\", userptr);\n    glDrawBuffer = (PFNGLDRAWBUFFERPROC) load(\"glDrawBuffer\", userptr);\n    glVertex2f = (PFNGLVERTEX2FPROC) load(\"glVertex2f\", userptr);\n    glPixelTransferi = (PFNGLPIXELTRANSFERIPROC) load(\"glPixelTransferi\", userptr);\n    glGetPolygonStipple = (PFNGLGETPOLYGONSTIPPLEPROC) load(\"glGetPolygonStipple\", userptr);\n    glDeleteLists = (PFNGLDELETELISTSPROC) load(\"glDeleteLists\", userptr);\n    glRenderMode = (PFNGLRENDERMODEPROC) load(\"glRenderMode\", userptr);\n    glTexCoord2sv = (PFNGLTEXCOORD2SVPROC) load(\"glTexCoord2sv\", userptr);\n    glTexGend = (PFNGLTEXGENDPROC) load(\"glTexGend\", userptr);\n    glBitmap = (PFNGLBITMAPPROC) load(\"glBitmap\", userptr);\n    glMultMatrixf = (PFNGLMULTMATRIXFPROC) load(\"glMultMatrixf\", userptr);\n    glColor3fv = (PFNGLCOLOR3FVPROC) load(\"glColor3fv\", userptr);\n    glClearColor = (PFNGLCLEARCOLORPROC) load(\"glClearColor\", userptr);\n    glRectiv = (PFNGLRECTIVPROC) load(\"glRectiv\", userptr);\n    glGetTexGenfv = (PFNGLGETTEXGENFVPROC) load(\"glGetTexGenfv\", userptr);\n    glColor4dv = (PFNGLCOLOR4DVPROC) load(\"glColor4dv\", userptr);\n    glLogicOp = (PFNGLLOGICOPPROC) load(\"glLogicOp\", userptr);\n    glTexCoord4s = (PFNGLTEXCOORD4SPROC) load(\"glTexCoord4s\", userptr);\n    glRasterPos2d = (PFNGLRASTERPOS2DPROC) load(\"glRasterPos2d\", userptr);\n    glMapGrid1f = (PFNGLMAPGRID1FPROC) load(\"glMapGrid1f\", userptr);\n    glLightModeli = (PFNGLLIGHTMODELIPROC) load(\"glLightModeli\", userptr);\n    glPixelMapuiv = (PFNGLPIXELMAPUIVPROC) load(\"glPixelMapuiv\", userptr);\n    glTexGenfv = (PFNGLTEXGENFVPROC) load(\"glTexGenfv\", userptr);\n    glRotated = (PFNGLROTATEDPROC) load(\"glRotated\", userptr);\n    glAlphaFunc = (PFNGLALPHAFUNCPROC) load(\"glAlphaFunc\", userptr);\n    glRects = (PFNGLRECTSPROC) load(\"glRects\", userptr);\n    glPolygonStipple = (PFNGLPOLYGONSTIPPLEPROC) load(\"glPolygonStipple\", userptr);\n    glTexImage1D = (PFNGLTEXIMAGE1DPROC) load(\"glTexImage1D\", userptr);\n    glColor4fv = (PFNGLCOLOR4FVPROC) load(\"glColor4fv\", userptr);\n    glLineStipple = (PFNGLLINESTIPPLEPROC) load(\"glLineStipple\", userptr);\n    glVertex4f = (PFNGLVERTEX4FPROC) load(\"glVertex4f\", userptr);\n    glColor3ub = (PFNGLCOLOR3UBPROC) load(\"glColor3ub\", userptr);\n    glNormal3f = (PFNGLNORMAL3FPROC) load(\"glNormal3f\", userptr);\n    glTexGeni = (PFNGLTEXGENIPROC) load(\"glTexGeni\", userptr);\n    glTexCoord4dv = (PFNGLTEXCOORD4DVPROC) load(\"glTexCoord4dv\", userptr);\n    glTexCoord3s = (PFNGLTEXCOORD3SPROC) load(\"glTexCoord3s\", userptr);\n    glLightf = (PFNGLLIGHTFPROC) load(\"glLightf\", userptr);\n    glTexGenf = (PFNGLTEXGENFPROC) load(\"glTexGenf\", userptr);\n    glTexCoord3fv = (PFNGLTEXCOORD3FVPROC) load(\"glTexCoord3fv\", userptr);\n    glIndexiv = (PFNGLINDEXIVPROC) load(\"glIndexiv\", userptr);\n    glRasterPos4sv = (PFNGLRASTERPOS4SVPROC) load(\"glRasterPos4sv\", userptr);\n    glVertex3i = (PFNGLVERTEX3IPROC) load(\"glVertex3i\", userptr);\n    glColor4usv = (PFNGLCOLOR4USVPROC) load(\"glColor4usv\", userptr);\n    glLoadIdentity = (PFNGLLOADIDENTITYPROC) load(\"glLoadIdentity\", userptr);\n    glIndexf = (PFNGLINDEXFPROC) load(\"glIndexf\", userptr);\n    glVertex2s = (PFNGLVERTEX2SPROC) load(\"glVertex2s\", userptr);\n    glRasterPos4s = (PFNGLRASTERPOS4SPROC) load(\"glRasterPos4s\", userptr);\n    glGetClipPlane = (PFNGLGETCLIPPLANEPROC) load(\"glGetClipPlane\", userptr);\n    glGetError = (PFNGLGETERRORPROC) load(\"glGetError\", userptr);\n    glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(\"glTexParameterfv\", userptr);\n    glColor4ui = (PFNGLCOLOR4UIPROC) load(\"glColor4ui\", userptr);\n    glTexCoord4d = (PFNGLTEXCOORD4DPROC) load(\"glTexCoord4d\", userptr);\n    glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(\"glTexParameterf\", userptr);\n    glTexCoord2i = (PFNGLTEXCOORD2IPROC) load(\"glTexCoord2i\", userptr);\n    glTexCoord4i = (PFNGLTEXCOORD4IPROC) load(\"glTexCoord4i\", userptr);\n    glGetTexEnvfv = (PFNGLGETTEXENVFVPROC) load(\"glGetTexEnvfv\", userptr);\n    glFrontFace = (PFNGLFRONTFACEPROC) load(\"glFrontFace\", userptr);\n    glRasterPos2i = (PFNGLRASTERPOS2IPROC) load(\"glRasterPos2i\", userptr);\n    glIsList = (PFNGLISLISTPROC) load(\"glIsList\", userptr);\n    glGetLightiv = (PFNGLGETLIGHTIVPROC) load(\"glGetLightiv\", userptr);\n    glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(\"glTexParameteri\", userptr);\n    glPushAttrib = (PFNGLPUSHATTRIBPROC) load(\"glPushAttrib\", userptr);\n    glColor4f = (PFNGLCOLOR4FPROC) load(\"glColor4f\", userptr);\n    glStencilMask = (PFNGLSTENCILMASKPROC) load(\"glStencilMask\", userptr);\n    glEvalMesh1 = (PFNGLEVALMESH1PROC) load(\"glEvalMesh1\", userptr);\n    glIndexd = (PFNGLINDEXDPROC) load(\"glIndexd\", userptr);\n    glNormal3iv = (PFNGLNORMAL3IVPROC) load(\"glNormal3iv\", userptr);\n    glRasterPos4fv = (PFNGLRASTERPOS4FVPROC) load(\"glRasterPos4fv\", userptr);\n    glTexGeniv = (PFNGLTEXGENIVPROC) load(\"glTexGeniv\", userptr);\n    glPopName = (PFNGLPOPNAMEPROC) load(\"glPopName\", userptr);\n    glFeedbackBuffer = (PFNGLFEEDBACKBUFFERPROC) load(\"glFeedbackBuffer\", userptr);\n    glEvalMesh2 = (PFNGLEVALMESH2PROC) load(\"glEvalMesh2\", userptr);\n    glScaled = (PFNGLSCALEDPROC) load(\"glScaled\", userptr);\n    glPushMatrix = (PFNGLPUSHMATRIXPROC) load(\"glPushMatrix\", userptr);\n    glEvalCoord1f = (PFNGLEVALCOORD1FPROC) load(\"glEvalCoord1f\", userptr);\n    glLighti = (PFNGLLIGHTIPROC) load(\"glLighti\", userptr);\n    glHint = (PFNGLHINTPROC) load(\"glHint\", userptr);\n    glIndexMask = (PFNGLINDEXMASKPROC) load(\"glIndexMask\", userptr);\n    glRasterPos3d = (PFNGLRASTERPOS3DPROC) load(\"glRasterPos3d\", userptr);\n    glEvalCoord2fv = (PFNGLEVALCOORD2FVPROC) load(\"glEvalCoord2fv\", userptr);\n    glColor3b = (PFNGLCOLOR3BPROC) load(\"glColor3b\", userptr);\n    glMaterialfv = (PFNGLMATERIALFVPROC) load(\"glMaterialfv\", userptr);\n    glStencilFunc = (PFNGLSTENCILFUNCPROC) load(\"glStencilFunc\", userptr);\n    glGetLightfv = (PFNGLGETLIGHTFVPROC) load(\"glGetLightfv\", userptr);\n    glInitNames = (PFNGLINITNAMESPROC) load(\"glInitNames\", userptr);\n    glRasterPos4i = (PFNGLRASTERPOS4IPROC) load(\"glRasterPos4i\", userptr);\n    glPixelMapusv = (PFNGLPIXELMAPUSVPROC) load(\"glPixelMapusv\", userptr);\n    glRasterPos2s = (PFNGLRASTERPOS2SPROC) load(\"glRasterPos2s\", userptr);\n    glFogfv = (PFNGLFOGFVPROC) load(\"glFogfv\", userptr);\n    glTexCoord3iv = (PFNGLTEXCOORD3IVPROC) load(\"glTexCoord3iv\", userptr);\n    glMap1f = (PFNGLMAP1FPROC) load(\"glMap1f\", userptr);\n    glVertex3s = (PFNGLVERTEX3SPROC) load(\"glVertex3s\", userptr);\n    glRasterPos3f = (PFNGLRASTERPOS3FPROC) load(\"glRasterPos3f\", userptr);\n    glDepthFunc = (PFNGLDEPTHFUNCPROC) load(\"glDepthFunc\", userptr);\n    glDepthRange = (PFNGLDEPTHRANGEPROC) load(\"glDepthRange\", userptr);\n    glVertex4s = (PFNGLVERTEX4SPROC) load(\"glVertex4s\", userptr);\n    glColor3bv = (PFNGLCOLOR3BVPROC) load(\"glColor3bv\", userptr);\n    glColor3ubv = (PFNGLCOLOR3UBVPROC) load(\"glColor3ubv\", userptr);\n    glNormal3b = (PFNGLNORMAL3BPROC) load(\"glNormal3b\", userptr);\n    glVertex3sv = (PFNGLVERTEX3SVPROC) load(\"glVertex3sv\", userptr);\n    glVertex2iv = (PFNGLVERTEX2IVPROC) load(\"glVertex2iv\", userptr);\n    glTexCoord4sv = (PFNGLTEXCOORD4SVPROC) load(\"glTexCoord4sv\", userptr);\n    glMap2d = (PFNGLMAP2DPROC) load(\"glMap2d\", userptr);\n    glGetTexGendv = (PFNGLGETTEXGENDVPROC) load(\"glGetTexGendv\", userptr);\n    glTexCoord3i = (PFNGLTEXCOORD3IPROC) load(\"glTexCoord3i\", userptr);\n    glCallLists = (PFNGLCALLLISTSPROC) load(\"glCallLists\", userptr);\n    glDrawPixels = (PFNGLDRAWPIXELSPROC) load(\"glDrawPixels\", userptr);\n    glMap1d = (PFNGLMAP1DPROC) load(\"glMap1d\", userptr);\n    glEdgeFlagv = (PFNGLEDGEFLAGVPROC) load(\"glEdgeFlagv\", userptr);\n    glTexCoord1dv = (PFNGLTEXCOORD1DVPROC) load(\"glTexCoord1dv\", userptr);\n    glRectfv = (PFNGLRECTFVPROC) load(\"glRectfv\", userptr);\n    glVertex3iv = (PFNGLVERTEX3IVPROC) load(\"glVertex3iv\", userptr);\n    glMateriali = (PFNGLMATERIALIPROC) load(\"glMateriali\", userptr);\n    glBegin = (PFNGLBEGINPROC) load(\"glBegin\", userptr);\n    glTexCoord3d = (PFNGLTEXCOORD3DPROC) load(\"glTexCoord3d\", userptr);\n    glNewList = (PFNGLNEWLISTPROC) load(\"glNewList\", userptr);\n    glPixelMapfv = (PFNGLPIXELMAPFVPROC) load(\"glPixelMapfv\", userptr);\n    glVertex3f = (PFNGLVERTEX3FPROC) load(\"glVertex3f\", userptr);\n    glColor3f = (PFNGLCOLOR3FPROC) load(\"glColor3f\", userptr);\n    glMultMatrixd = (PFNGLMULTMATRIXDPROC) load(\"glMultMatrixd\", userptr);\n    glScalef = (PFNGLSCALEFPROC) load(\"glScalef\", userptr);\n    glRasterPos3fv = (PFNGLRASTERPOS3FVPROC) load(\"glRasterPos3fv\", userptr);\n    glTexCoord1iv = (PFNGLTEXCOORD1IVPROC) load(\"glTexCoord1iv\", userptr);\n    glGetDoublev = (PFNGLGETDOUBLEVPROC) load(\"glGetDoublev\", userptr);\n    glMapGrid2d = (PFNGLMAPGRID2DPROC) load(\"glMapGrid2d\", userptr);\n    glReadPixels = (PFNGLREADPIXELSPROC) load(\"glReadPixels\", userptr);\n    glColor4bv = (PFNGLCOLOR4BVPROC) load(\"glColor4bv\", userptr);\n    glOrtho = (PFNGLORTHOPROC) load(\"glOrtho\", userptr);\n    glCopyPixels = (PFNGLCOPYPIXELSPROC) load(\"glCopyPixels\", userptr);\n    glFogf = (PFNGLFOGFPROC) load(\"glFogf\", userptr);\n    glTexCoord3f = (PFNGLTEXCOORD3FPROC) load(\"glTexCoord3f\", userptr);\n    glColor3s = (PFNGLCOLOR3SPROC) load(\"glColor3s\", userptr);\n    glColor3sv = (PFNGLCOLOR3SVPROC) load(\"glColor3sv\", userptr);\n    glIndexfv = (PFNGLINDEXFVPROC) load(\"glIndexfv\", userptr);\n    glPixelZoom = (PFNGLPIXELZOOMPROC) load(\"glPixelZoom\", userptr);\n    glColor3uiv = (PFNGLCOLOR3UIVPROC) load(\"glColor3uiv\", userptr);\n    glRasterPos2dv = (PFNGLRASTERPOS2DVPROC) load(\"glRasterPos2dv\", userptr);\n    glEvalCoord2dv = (PFNGLEVALCOORD2DVPROC) load(\"glEvalCoord2dv\", userptr);\n    glMapGrid1d = (PFNGLMAPGRID1DPROC) load(\"glMapGrid1d\", userptr);\n    glVertex3dv = (PFNGLVERTEX3DVPROC) load(\"glVertex3dv\", userptr);\n    glClear = (PFNGLCLEARPROC) load(\"glClear\", userptr);\n    glEnable = (PFNGLENABLEPROC) load(\"glEnable\", userptr);\n    glSelectBuffer = (PFNGLSELECTBUFFERPROC) load(\"glSelectBuffer\", userptr);\n    glRasterPos3sv = (PFNGLRASTERPOS3SVPROC) load(\"glRasterPos3sv\", userptr);\n    glNormal3dv = (PFNGLNORMAL3DVPROC) load(\"glNormal3dv\", userptr);\n    glPopAttrib = (PFNGLPOPATTRIBPROC) load(\"glPopAttrib\", userptr);\n    glColor3iv = (PFNGLCOLOR3IVPROC) load(\"glColor3iv\", userptr);\n    glTexCoord2s = (PFNGLTEXCOORD2SPROC) load(\"glTexCoord2s\", userptr);\n    glTexEnvi = (PFNGLTEXENVIPROC) load(\"glTexEnvi\", userptr);\n    glTexCoord2dv = (PFNGLTEXCOORD2DVPROC) load(\"glTexCoord2dv\", userptr);\n    glPassThrough = (PFNGLPASSTHROUGHPROC) load(\"glPassThrough\", userptr);\n    glMaterialf = (PFNGLMATERIALFPROC) load(\"glMaterialf\", userptr);\n    glColor4b = (PFNGLCOLOR4BPROC) load(\"glColor4b\", userptr);\n    glColor4uiv = (PFNGLCOLOR4UIVPROC) load(\"glColor4uiv\", userptr);\n    glClearIndex = (PFNGLCLEARINDEXPROC) load(\"glClearIndex\", userptr);\n    glRotatef = (PFNGLROTATEFPROC) load(\"glRotatef\", userptr);\n    glFogiv = (PFNGLFOGIVPROC) load(\"glFogiv\", userptr);\n    glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(\"glTexParameteriv\", userptr);\n    glListBase = (PFNGLLISTBASEPROC) load(\"glListBase\", userptr);\n    glIndexi = (PFNGLINDEXIPROC) load(\"glIndexi\", userptr);\n    glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC) load(\"glGetTexLevelParameteriv\", userptr);\n    glVertex4i = (PFNGLVERTEX4IPROC) load(\"glVertex4i\", userptr);\n    glGetPixelMapuiv = (PFNGLGETPIXELMAPUIVPROC) load(\"glGetPixelMapuiv\", userptr);\n    glTexEnvfv = (PFNGLTEXENVFVPROC) load(\"glTexEnvfv\", userptr);\n    glEvalCoord2f = (PFNGLEVALCOORD2FPROC) load(\"glEvalCoord2f\", userptr);\n    glVertex4dv = (PFNGLVERTEX4DVPROC) load(\"glVertex4dv\", userptr);\n    glGetTexGeniv = (PFNGLGETTEXGENIVPROC) load(\"glGetTexGeniv\", userptr);\n    glPointSize = (PFNGLPOINTSIZEPROC) load(\"glPointSize\", userptr);\n    glTranslated = (PFNGLTRANSLATEDPROC) load(\"glTranslated\", userptr);\n    glColor4i = (PFNGLCOLOR4IPROC) load(\"glColor4i\", userptr);\n    glCullFace = (PFNGLCULLFACEPROC) load(\"glCullFace\", userptr);\n    glGenLists = (PFNGLGENLISTSPROC) load(\"glGenLists\", userptr);\n    glReadBuffer = (PFNGLREADBUFFERPROC) load(\"glReadBuffer\", userptr);\n    glRasterPos2fv = (PFNGLRASTERPOS2FVPROC) load(\"glRasterPos2fv\", userptr);\n    glEnd = (PFNGLENDPROC) load(\"glEnd\", userptr);\n    glVertex2dv = (PFNGLVERTEX2DVPROC) load(\"glVertex2dv\", userptr);\n    glColor4us = (PFNGLCOLOR4USPROC) load(\"glColor4us\", userptr);\n    glPushName = (PFNGLPUSHNAMEPROC) load(\"glPushName\", userptr);\n    glShadeModel = (PFNGLSHADEMODELPROC) load(\"glShadeModel\", userptr);\n    glNormal3fv = (PFNGLNORMAL3FVPROC) load(\"glNormal3fv\", userptr);\n    glTexCoord4iv = (PFNGLTEXCOORD4IVPROC) load(\"glTexCoord4iv\", userptr);\n    glColor3ui = (PFNGLCOLOR3UIPROC) load(\"glColor3ui\", userptr);\n    glRectd = (PFNGLRECTDPROC) load(\"glRectd\", userptr);\n    glTexCoord4fv = (PFNGLTEXCOORD4FVPROC) load(\"glTexCoord4fv\", userptr);\n    glTexCoord1f = (PFNGLTEXCOORD1FPROC) load(\"glTexCoord1f\", userptr);\n    glEdgeFlag = (PFNGLEDGEFLAGPROC) load(\"glEdgeFlag\", userptr);\n    glTexEnvf = (PFNGLTEXENVFPROC) load(\"glTexEnvf\", userptr);\n    glMap2f = (PFNGLMAP2FPROC) load(\"glMap2f\", userptr);\n    glNormal3i = (PFNGLNORMAL3IPROC) load(\"glNormal3i\", userptr);\n    glColor3usv = (PFNGLCOLOR3USVPROC) load(\"glColor3usv\", userptr);\n    glRasterPos2iv = (PFNGLRASTERPOS2IVPROC) load(\"glRasterPos2iv\", userptr);\n    glGetIntegerv = (PFNGLGETINTEGERVPROC) load(\"glGetIntegerv\", userptr);\n    glRectdv = (PFNGLRECTDVPROC) load(\"glRectdv\", userptr);\n    glNormal3bv = (PFNGLNORMAL3BVPROC) load(\"glNormal3bv\", userptr);\n    glVertex2fv = (PFNGLVERTEX2FVPROC) load(\"glVertex2fv\", userptr);\n    glVertex2d = (PFNGLVERTEX2DPROC) load(\"glVertex2d\", userptr);\n    glEndList = (PFNGLENDLISTPROC) load(\"glEndList\", userptr);\n    glFlush = (PFNGLFLUSHPROC) load(\"glFlush\", userptr);\n    glPixelStorei = (PFNGLPIXELSTOREIPROC) load(\"glPixelStorei\", userptr);\n    glColor4ub = (PFNGLCOLOR4UBPROC) load(\"glColor4ub\", userptr);\n    glNormal3s = (PFNGLNORMAL3SPROC) load(\"glNormal3s\", userptr);\n    glColor4iv = (PFNGLCOLOR4IVPROC) load(\"glColor4iv\", userptr);\n    glClipPlane = (PFNGLCLIPPLANEPROC) load(\"glClipPlane\", userptr);\n    glTexCoord1i = (PFNGLTEXCOORD1IPROC) load(\"glTexCoord1i\", userptr);\n    glLightModelf = (PFNGLLIGHTMODELFPROC) load(\"glLightModelf\", userptr);\n    glPopMatrix = (PFNGLPOPMATRIXPROC) load(\"glPopMatrix\", userptr);\n    glLoadMatrixd = (PFNGLLOADMATRIXDPROC) load(\"glLoadMatrixd\", userptr);\n    glRasterPos3dv = (PFNGLRASTERPOS3DVPROC) load(\"glRasterPos3dv\", userptr);\n    glTexCoord1fv = (PFNGLTEXCOORD1FVPROC) load(\"glTexCoord1fv\", userptr);\n    glTexCoord2iv = (PFNGLTEXCOORD2IVPROC) load(\"glTexCoord2iv\", userptr);\n    glClearDepth = (PFNGLCLEARDEPTHPROC) load(\"glClearDepth\", userptr);\n    glTexCoord2d = (PFNGLTEXCOORD2DPROC) load(\"glTexCoord2d\", userptr);\n    glRasterPos4d = (PFNGLRASTERPOS4DPROC) load(\"glRasterPos4d\", userptr);\n    glColorMaterial = (PFNGLCOLORMATERIALPROC) load(\"glColorMaterial\", userptr);\n    glAccum = (PFNGLACCUMPROC) load(\"glAccum\", userptr);\n    glClearStencil = (PFNGLCLEARSTENCILPROC) load(\"glClearStencil\", userptr);\n    glLightModelfv = (PFNGLLIGHTMODELFVPROC) load(\"glLightModelfv\", userptr);\n    glColor3d = (PFNGLCOLOR3DPROC) load(\"glColor3d\", userptr);\n    glDisable = (PFNGLDISABLEPROC) load(\"glDisable\", userptr);\n    glFogi = (PFNGLFOGIPROC) load(\"glFogi\", userptr);\n    glTexEnviv = (PFNGLTEXENVIVPROC) load(\"glTexEnviv\", userptr);\n    glLightfv = (PFNGLLIGHTFVPROC) load(\"glLightfv\", userptr);\n    glDepthMask = (PFNGLDEPTHMASKPROC) load(\"glDepthMask\", userptr);\n    glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(\"glTexImage2D\", userptr);\n    glVertex3fv = (PFNGLVERTEX3FVPROC) load(\"glVertex3fv\", userptr);\n    glVertex4fv = (PFNGLVERTEX4FVPROC) load(\"glVertex4fv\", userptr);\n    glLightiv = (PFNGLLIGHTIVPROC) load(\"glLightiv\", userptr);\n    glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(\"glGetTexParameteriv\", userptr);\n    glTexCoord3dv = (PFNGLTEXCOORD3DVPROC) load(\"glTexCoord3dv\", userptr);\n}\nstatic void load_GL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_1_1) return;\n    glVertexPointer = (PFNGLVERTEXPOINTERPROC) load(\"glVertexPointer\", userptr);\n    glBindTexture = (PFNGLBINDTEXTUREPROC) load(\"glBindTexture\", userptr);\n    glGetPointerv = (PFNGLGETPOINTERVPROC) load(\"glGetPointerv\", userptr);\n    glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(\"glTexSubImage1D\", userptr);\n    glEdgeFlagPointer = (PFNGLEDGEFLAGPOINTERPROC) load(\"glEdgeFlagPointer\", userptr);\n    glIndexPointer = (PFNGLINDEXPOINTERPROC) load(\"glIndexPointer\", userptr);\n    glDrawElements = (PFNGLDRAWELEMENTSPROC) load(\"glDrawElements\", userptr);\n    glNormalPointer = (PFNGLNORMALPOINTERPROC) load(\"glNormalPointer\", userptr);\n    glIndexub = (PFNGLINDEXUBPROC) load(\"glIndexub\", userptr);\n    glDrawArrays = (PFNGLDRAWARRAYSPROC) load(\"glDrawArrays\", userptr);\n    glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(\"glDeleteTextures\", userptr);\n    glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(\"glCopyTexImage2D\", userptr);\n    glGenTextures = (PFNGLGENTEXTURESPROC) load(\"glGenTextures\", userptr);\n    glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(\"glTexSubImage2D\", userptr);\n    glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load(\"glCopyTexImage1D\", userptr);\n    glIndexubv = (PFNGLINDEXUBVPROC) load(\"glIndexubv\", userptr);\n    glPopClientAttrib = (PFNGLPOPCLIENTATTRIBPROC) load(\"glPopClientAttrib\", userptr);\n    glAreTexturesResident = (PFNGLARETEXTURESRESIDENTPROC) load(\"glAreTexturesResident\", userptr);\n    glPushClientAttrib = (PFNGLPUSHCLIENTATTRIBPROC) load(\"glPushClientAttrib\", userptr);\n    glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC) load(\"glDisableClientState\", userptr);\n    glEnableClientState = (PFNGLENABLECLIENTSTATEPROC) load(\"glEnableClientState\", userptr);\n    glIsTexture = (PFNGLISTEXTUREPROC) load(\"glIsTexture\", userptr);\n    glArrayElement = (PFNGLARRAYELEMENTPROC) load(\"glArrayElement\", userptr);\n    glTexCoordPointer = (PFNGLTEXCOORDPOINTERPROC) load(\"glTexCoordPointer\", userptr);\n    glInterleavedArrays = (PFNGLINTERLEAVEDARRAYSPROC) load(\"glInterleavedArrays\", userptr);\n    glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(\"glPolygonOffset\", userptr);\n    glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC) load(\"glPrioritizeTextures\", userptr);\n    glColorPointer = (PFNGLCOLORPOINTERPROC) load(\"glColorPointer\", userptr);\n    glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load(\"glCopyTexSubImage1D\", userptr);\n    glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(\"glCopyTexSubImage2D\", userptr);\n}\nstatic void load_GL_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_1_2) return;\n    glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) load(\"glDrawRangeElements\", userptr);\n    glTexImage3D = (PFNGLTEXIMAGE3DPROC) load(\"glTexImage3D\", userptr);\n    glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load(\"glCopyTexSubImage3D\", userptr);\n    glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC) load(\"glTexSubImage3D\", userptr);\n}\nstatic void load_GL_VERSION_1_3( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_1_3) return;\n    glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(\"glMultiTexCoord4f\", userptr);\n    glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC) load(\"glLoadTransposeMatrixf\", userptr);\n    glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC) load(\"glCompressedTexImage3D\", userptr);\n    glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load(\"glClientActiveTexture\", userptr);\n    glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(\"glCompressedTexSubImage2D\", userptr);\n    glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC) load(\"glMultiTexCoord2s\", userptr);\n    glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC) load(\"glMultiTexCoord4i\", userptr);\n    glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC) load(\"glLoadTransposeMatrixd\", userptr);\n    glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC) load(\"glMultiTexCoord2i\", userptr);\n    glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) load(\"glCompressedTexSubImage3D\", userptr);\n    glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC) load(\"glMultiTexCoord4dv\", userptr);\n    glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC) load(\"glCompressedTexImage1D\", userptr);\n    glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC) load(\"glMultiTexCoord3s\", userptr);\n    glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC) load(\"glMultiTexCoord1f\", userptr);\n    glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC) load(\"glGetCompressedTexImage\", userptr);\n    glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC) load(\"glMultiTexCoord1i\", userptr);\n    glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC) load(\"glMultiTexCoord3f\", userptr);\n    glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC) load(\"glMultiTexCoord3dv\", userptr);\n    glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC) load(\"glMultTransposeMatrixd\", userptr);\n    glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(\"glActiveTexture\", userptr);\n    glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC) load(\"glMultiTexCoord1dv\", userptr);\n    glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC) load(\"glMultiTexCoord3sv\", userptr);\n    glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC) load(\"glMultiTexCoord3d\", userptr);\n    glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(\"glCompressedTexImage2D\", userptr);\n    glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC) load(\"glMultiTexCoord1d\", userptr);\n    glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC) load(\"glMultiTexCoord4d\", userptr);\n    glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC) load(\"glMultiTexCoord1sv\", userptr);\n    glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC) load(\"glMultiTexCoord4sv\", userptr);\n    glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC) load(\"glMultiTexCoord3i\", userptr);\n    glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC) load(\"glMultiTexCoord1iv\", userptr);\n    glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC) load(\"glMultTransposeMatrixf\", userptr);\n    glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC) load(\"glMultiTexCoord2fv\", userptr);\n    glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC) load(\"glMultiTexCoord4s\", userptr);\n    glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC) load(\"glMultiTexCoord2f\", userptr);\n    glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) load(\"glCompressedTexSubImage1D\", userptr);\n    glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC) load(\"glMultiTexCoord2dv\", userptr);\n    glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC) load(\"glMultiTexCoord2sv\", userptr);\n    glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC) load(\"glMultiTexCoord3iv\", userptr);\n    glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load(\"glSampleCoverage\", userptr);\n    glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC) load(\"glMultiTexCoord2iv\", userptr);\n    glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC) load(\"glMultiTexCoord2d\", userptr);\n    glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC) load(\"glMultiTexCoord1s\", userptr);\n    glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC) load(\"glMultiTexCoord4fv\", userptr);\n    glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC) load(\"glMultiTexCoord3fv\", userptr);\n    glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC) load(\"glMultiTexCoord4iv\", userptr);\n    glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC) load(\"glMultiTexCoord1fv\", userptr);\n}\nstatic void load_GL_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_1_4) return;\n    glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC) load(\"glMultiDrawElements\", userptr);\n    glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC) load(\"glWindowPos3sv\", userptr);\n    glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC) load(\"glSecondaryColor3us\", userptr);\n    glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC) load(\"glSecondaryColor3iv\", userptr);\n    glPointParameterf = (PFNGLPOINTPARAMETERFPROC) load(\"glPointParameterf\", userptr);\n    glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC) load(\"glSecondaryColor3s\", userptr);\n    glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC) load(\"glSecondaryColor3sv\", userptr);\n    glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC) load(\"glSecondaryColor3uiv\", userptr);\n    glWindowPos2d = (PFNGLWINDOWPOS2DPROC) load(\"glWindowPos2d\", userptr);\n    glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC) load(\"glSecondaryColor3ubv\", userptr);\n    glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC) load(\"glWindowPos3dv\", userptr);\n    glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC) load(\"glWindowPos2iv\", userptr);\n    glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC) load(\"glMultiDrawArrays\", userptr);\n    glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC) load(\"glSecondaryColor3bv\", userptr);\n    glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC) load(\"glSecondaryColor3ui\", userptr);\n    glWindowPos2f = (PFNGLWINDOWPOS2FPROC) load(\"glWindowPos2f\", userptr);\n    glWindowPos2s = (PFNGLWINDOWPOS2SPROC) load(\"glWindowPos2s\", userptr);\n    glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC) load(\"glSecondaryColor3fv\", userptr);\n    glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC) load(\"glPointParameteriv\", userptr);\n    glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC) load(\"glSecondaryColorPointer\", userptr);\n    glBlendColor = (PFNGLBLENDCOLORPROC) load(\"glBlendColor\", userptr);\n    glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC) load(\"glWindowPos2dv\", userptr);\n    glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(\"glBlendFuncSeparate\", userptr);\n    glPointParameteri = (PFNGLPOINTPARAMETERIPROC) load(\"glPointParameteri\", userptr);\n    glFogCoordf = (PFNGLFOGCOORDFPROC) load(\"glFogCoordf\", userptr);\n    glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC) load(\"glSecondaryColor3f\", userptr);\n    glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC) load(\"glSecondaryColor3i\", userptr);\n    glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC) load(\"glSecondaryColor3ub\", userptr);\n    glWindowPos3i = (PFNGLWINDOWPOS3IPROC) load(\"glWindowPos3i\", userptr);\n    glWindowPos3f = (PFNGLWINDOWPOS3FPROC) load(\"glWindowPos3f\", userptr);\n    glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC) load(\"glSecondaryColor3b\", userptr);\n    glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC) load(\"glWindowPos3iv\", userptr);\n    glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC) load(\"glSecondaryColor3d\", userptr);\n    glFogCoordd = (PFNGLFOGCOORDDPROC) load(\"glFogCoordd\", userptr);\n    glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC) load(\"glWindowPos3fv\", userptr);\n    glWindowPos2i = (PFNGLWINDOWPOS2IPROC) load(\"glWindowPos2i\", userptr);\n    glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) load(\"glPointParameterfv\", userptr);\n    glFogCoordfv = (PFNGLFOGCOORDFVPROC) load(\"glFogCoordfv\", userptr);\n    glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC) load(\"glSecondaryColor3usv\", userptr);\n    glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC) load(\"glWindowPos2fv\", userptr);\n    glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(\"glBlendEquation\", userptr);\n    glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC) load(\"glWindowPos2sv\", userptr);\n    glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC) load(\"glSecondaryColor3dv\", userptr);\n    glWindowPos3s = (PFNGLWINDOWPOS3SPROC) load(\"glWindowPos3s\", userptr);\n    glWindowPos3d = (PFNGLWINDOWPOS3DPROC) load(\"glWindowPos3d\", userptr);\n    glFogCoorddv = (PFNGLFOGCOORDDVPROC) load(\"glFogCoorddv\", userptr);\n    glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC) load(\"glFogCoordPointer\", userptr);\n}\nstatic void load_GL_VERSION_1_5( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_1_5) return;\n    glMapBuffer = (PFNGLMAPBUFFERPROC) load(\"glMapBuffer\", userptr);\n    glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(\"glBufferSubData\", userptr);\n    glBeginQuery = (PFNGLBEGINQUERYPROC) load(\"glBeginQuery\", userptr);\n    glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(\"glGetBufferParameteriv\", userptr);\n    glGenQueries = (PFNGLGENQUERIESPROC) load(\"glGenQueries\", userptr);\n    glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC) load(\"glGetQueryObjectuiv\", userptr);\n    glIsBuffer = (PFNGLISBUFFERPROC) load(\"glIsBuffer\", userptr);\n    glGetQueryiv = (PFNGLGETQUERYIVPROC) load(\"glGetQueryiv\", userptr);\n    glEndQuery = (PFNGLENDQUERYPROC) load(\"glEndQuery\", userptr);\n    glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC) load(\"glGetQueryObjectiv\", userptr);\n    glGenBuffers = (PFNGLGENBUFFERSPROC) load(\"glGenBuffers\", userptr);\n    glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) load(\"glGetBufferSubData\", userptr);\n    glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(\"glDeleteBuffers\", userptr);\n    glIsQuery = (PFNGLISQUERYPROC) load(\"glIsQuery\", userptr);\n    glBindBuffer = (PFNGLBINDBUFFERPROC) load(\"glBindBuffer\", userptr);\n    glDeleteQueries = (PFNGLDELETEQUERIESPROC) load(\"glDeleteQueries\", userptr);\n    glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load(\"glUnmapBuffer\", userptr);\n    glBufferData = (PFNGLBUFFERDATAPROC) load(\"glBufferData\", userptr);\n    glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load(\"glGetBufferPointerv\", userptr);\n}\nstatic void load_GL_VERSION_2_0( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_2_0) return;\n    glUniform2i = (PFNGLUNIFORM2IPROC) load(\"glUniform2i\", userptr);\n    glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(\"glVertexAttrib2fv\", userptr);\n    glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(\"glUniformMatrix3fv\", userptr);\n    glUniform2iv = (PFNGLUNIFORM2IVPROC) load(\"glUniform2iv\", userptr);\n    glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(\"glGetActiveUniform\", userptr);\n    glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(\"glUniformMatrix4fv\", userptr);\n    glDetachShader = (PFNGLDETACHSHADERPROC) load(\"glDetachShader\", userptr);\n    glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(\"glVertexAttrib4s\", userptr);\n    glAttachShader = (PFNGLATTACHSHADERPROC) load(\"glAttachShader\", userptr);\n    glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(\"glVertexAttrib4Nuiv\", userptr);\n    glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(\"glGetAttribLocation\", userptr);\n    glUniform2f = (PFNGLUNIFORM2FPROC) load(\"glUniform2f\", userptr);\n    glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(\"glVertexAttrib1s\", userptr);\n    glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(\"glVertexAttrib4Nsv\", userptr);\n    glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(\"glVertexAttrib1f\", userptr);\n    glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(\"glVertexAttrib3sv\", userptr);\n    glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(\"glGetUniformiv\", userptr);\n    glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(\"glVertexAttrib4sv\", userptr);\n    glCreateShader = (PFNGLCREATESHADERPROC) load(\"glCreateShader\", userptr);\n    glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) load(\"glStencilOpSeparate\", userptr);\n    glUniform3f = (PFNGLUNIFORM3FPROC) load(\"glUniform3f\", userptr);\n    glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(\"glVertexAttrib4usv\", userptr);\n    glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(\"glCreateProgram\", userptr);\n    glUniform4f = (PFNGLUNIFORM4FPROC) load(\"glUniform4f\", userptr);\n    glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) load(\"glGetShaderInfoLog\", userptr);\n    glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(\"glVertexAttrib2d\", userptr);\n    glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(\"glVertexAttrib2f\", userptr);\n    glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(\"glUniformMatrix2fv\", userptr);\n    glUniform4fv = (PFNGLUNIFORM4FVPROC) load(\"glUniform4fv\", userptr);\n    glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(\"glVertexAttrib4d\", userptr);\n    glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(\"glVertexAttrib1fv\", userptr);\n    glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(\"glVertexAttrib4Nubv\", userptr);\n    glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(\"glVertexAttrib1sv\", userptr);\n    glDrawBuffers = (PFNGLDRAWBUFFERSPROC) load(\"glDrawBuffers\", userptr);\n    glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(\"glGetShaderSource\", userptr);\n    glUniform3i = (PFNGLUNIFORM3IPROC) load(\"glUniform3i\", userptr);\n    glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(\"glVertexAttrib4bv\", userptr);\n    glIsShader = (PFNGLISSHADERPROC) load(\"glIsShader\", userptr);\n    glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(\"glVertexAttrib4iv\", userptr);\n    glIsProgram = (PFNGLISPROGRAMPROC) load(\"glIsProgram\", userptr);\n    glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(\"glVertexAttrib1d\", userptr);\n    glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(\"glVertexAttrib2dv\", userptr);\n    glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(\"glVertexAttrib3f\", userptr);\n    glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(\"glVertexAttrib3fv\", userptr);\n    glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(\"glVertexAttrib4Nusv\", userptr);\n    glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(\"glVertexAttrib4Nub\", userptr);\n    glLinkProgram = (PFNGLLINKPROGRAMPROC) load(\"glLinkProgram\", userptr);\n    glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(\"glVertexAttrib2s\", userptr);\n    glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(\"glVertexAttrib3dv\", userptr);\n    glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(\"glVertexAttrib4ubv\", userptr);\n    glUniform1i = (PFNGLUNIFORM1IPROC) load(\"glUniform1i\", userptr);\n    glCompileShader = (PFNGLCOMPILESHADERPROC) load(\"glCompileShader\", userptr);\n    glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(\"glBlendEquationSeparate\", userptr);\n    glDeleteShader = (PFNGLDELETESHADERPROC) load(\"glDeleteShader\", userptr);\n    glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(\"glGetVertexAttribfv\", userptr);\n    glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(\"glGetVertexAttribiv\", userptr);\n    glShaderSource = (PFNGLSHADERSOURCEPROC) load(\"glShaderSource\", userptr);\n    glUniform1f = (PFNGLUNIFORM1FPROC) load(\"glUniform1f\", userptr);\n    glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) load(\"glStencilFuncSeparate\", userptr);\n    glUniform1iv = (PFNGLUNIFORM1IVPROC) load(\"glUniform1iv\", userptr);\n    glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(\"glVertexAttrib4fv\", userptr);\n    glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(\"glVertexAttrib4dv\", userptr);\n    glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(\"glGetActiveAttrib\", userptr);\n    glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(\"glEnableVertexAttribArray\", userptr);\n    glUniform1fv = (PFNGLUNIFORM1FVPROC) load(\"glUniform1fv\", userptr);\n    glUniform2fv = (PFNGLUNIFORM2FVPROC) load(\"glUniform2fv\", userptr);\n    glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(\"glVertexAttrib2sv\", userptr);\n    glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(\"glVertexAttrib4Nbv\", userptr);\n    glUniform3fv = (PFNGLUNIFORM3FVPROC) load(\"glUniform3fv\", userptr);\n    glGetShaderiv = (PFNGLGETSHADERIVPROC) load(\"glGetShaderiv\", userptr);\n    glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(\"glVertexAttribPointer\", userptr);\n    glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(\"glGetVertexAttribPointerv\", userptr);\n    glDeleteProgram = (PFNGLDELETEPROGRAMPROC) load(\"glDeleteProgram\", userptr);\n    glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(\"glVertexAttrib3s\", userptr);\n    glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(\"glValidateProgram\", userptr);\n    glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(\"glVertexAttrib4uiv\", userptr);\n    glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(\"glGetVertexAttribdv\", userptr);\n    glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) load(\"glGetProgramInfoLog\", userptr);\n    glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC) load(\"glStencilMaskSeparate\", userptr);\n    glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(\"glBindAttribLocation\", userptr);\n    glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(\"glGetUniformLocation\", userptr);\n    glUseProgram = (PFNGLUSEPROGRAMPROC) load(\"glUseProgram\", userptr);\n    glGetProgramiv = (PFNGLGETPROGRAMIVPROC) load(\"glGetProgramiv\", userptr);\n    glUniform3iv = (PFNGLUNIFORM3IVPROC) load(\"glUniform3iv\", userptr);\n    glUniform4i = (PFNGLUNIFORM4IPROC) load(\"glUniform4i\", userptr);\n    glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(\"glGetUniformfv\", userptr);\n    glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(\"glVertexAttrib4Niv\", userptr);\n    glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(\"glDisableVertexAttribArray\", userptr);\n    glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) load(\"glGetAttachedShaders\", userptr);\n    glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(\"glVertexAttrib3d\", userptr);\n    glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(\"glVertexAttrib4f\", userptr);\n    glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(\"glVertexAttrib1dv\", userptr);\n    glUniform4iv = (PFNGLUNIFORM4IVPROC) load(\"glUniform4iv\", userptr);\n}\nstatic void load_GL_VERSION_2_1( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_2_1) return;\n    glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC) load(\"glUniformMatrix3x2fv\", userptr);\n    glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC) load(\"glUniformMatrix2x4fv\", userptr);\n    glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC) load(\"glUniformMatrix4x2fv\", userptr);\n    glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) load(\"glUniformMatrix3x4fv\", userptr);\n    glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC) load(\"glUniformMatrix2x3fv\", userptr);\n    glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC) load(\"glUniformMatrix4x3fv\", userptr);\n}\nstatic void load_GL_VERSION_3_0( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_3_0) return;\n    glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) load(\"glMapBufferRange\", userptr);\n    glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC) load(\"glTexParameterIuiv\", userptr);\n    glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC) load(\"glVertexAttribI4uiv\", userptr);\n    glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC) load(\"glBindFragDataLocation\", userptr);\n    glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC) load(\"glClearBufferuiv\", userptr);\n    glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) load(\"glGenVertexArrays\", userptr);\n    glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC) load(\"glVertexAttribI4usv\", userptr);\n    glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC) load(\"glVertexAttribI1iv\", userptr);\n    glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC) load(\"glTexParameterIiv\", userptr);\n    glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC) load(\"glVertexAttribI3ui\", userptr);\n    glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(\"glGenFramebuffers\", userptr);\n    glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC) load(\"glVertexAttribI4ui\", userptr);\n    glUniform4uiv = (PFNGLUNIFORM4UIVPROC) load(\"glUniform4uiv\", userptr);\n    glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC) load(\"glEndTransformFeedback\", userptr);\n    glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC) load(\"glVertexAttribI1uiv\", userptr);\n    glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC) load(\"glGetTexParameterIuiv\", userptr);\n    glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC) load(\"glEndConditionalRender\", userptr);\n    glColorMaski = (PFNGLCOLORMASKIPROC) load(\"glColorMaski\", userptr);\n    glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC) load(\"glVertexAttribI4bv\", userptr);\n    glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC) load(\"glVertexAttribI4sv\", userptr);\n    glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(\"glIsRenderbuffer\", userptr);\n    glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(\"glFramebufferTexture1D\", userptr);\n    glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC) load(\"glGetVertexAttribIiv\", userptr);\n    glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC) load(\"glVertexAttribI1ui\", userptr);\n    glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC) load(\"glVertexAttribI2uiv\", userptr);\n    glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(\"glDeleteFramebuffers\", userptr);\n    glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(\"glCheckFramebufferStatus\", userptr);\n    glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC) load(\"glVertexAttribI3uiv\", userptr);\n    glClearBufferiv = (PFNGLCLEARBUFFERIVPROC) load(\"glClearBufferiv\", userptr);\n    glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC) load(\"glVertexAttribI4ubv\", userptr);\n    glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(\"glFramebufferRenderbuffer\", userptr);\n    glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC) load(\"glVertexAttribIPointer\", userptr);\n    glClearBufferfi = (PFNGLCLEARBUFFERFIPROC) load(\"glClearBufferfi\", userptr);\n    glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(\"glBindBufferBase\", userptr);\n    glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC) load(\"glVertexAttribI1i\", userptr);\n    glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(\"glBindFramebuffer\", userptr);\n    glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC) load(\"glBeginConditionalRender\", userptr);\n    glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(\"glGenerateMipmap\", userptr);\n    glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(\"glBindRenderbuffer\", userptr);\n    glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(\"glDeleteRenderbuffers\", userptr);\n    glUniform2ui = (PFNGLUNIFORM2UIPROC) load(\"glUniform2ui\", userptr);\n    glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) load(\"glDeleteVertexArrays\", userptr);\n    glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(\"glRenderbufferStorageMultisample\", userptr);\n    glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC) load(\"glGetBooleani_v\", userptr);\n    glEnablei = (PFNGLENABLEIPROC) load(\"glEnablei\", userptr);\n    glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(\"glFramebufferTexture2D\", userptr);\n    glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC) load(\"glGetUniformuiv\", userptr);\n    glUniform3ui = (PFNGLUNIFORM3UIPROC) load(\"glUniform3ui\", userptr);\n    glClampColor = (PFNGLCLAMPCOLORPROC) load(\"glClampColor\", userptr);\n    glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC) load(\"glGetVertexAttribIuiv\", userptr);\n    glUniform1ui = (PFNGLUNIFORM1UIPROC) load(\"glUniform1ui\", userptr);\n    glIsVertexArray = (PFNGLISVERTEXARRAYPROC) load(\"glIsVertexArray\", userptr);\n    glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) load(\"glBeginTransformFeedback\", userptr);\n    glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(\"glRenderbufferStorage\", userptr);\n    glDisablei = (PFNGLDISABLEIPROC) load(\"glDisablei\", userptr);\n    glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC) load(\"glGetTexParameterIiv\", userptr);\n    glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC) load(\"glVertexAttribI2i\", userptr);\n    glIsEnabledi = (PFNGLISENABLEDIPROC) load(\"glIsEnabledi\", userptr);\n    glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC) load(\"glVertexAttribI4iv\", userptr);\n    glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(\"glGenRenderbuffers\", userptr);\n    glGetStringi = (PFNGLGETSTRINGIPROC) load(\"glGetStringi\", userptr);\n    glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC) load(\"glTransformFeedbackVaryings\", userptr);\n    glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(\"glGetFramebufferAttachmentParameteriv\", userptr);\n    glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(\"glBindBufferRange\", userptr);\n    glUniform3uiv = (PFNGLUNIFORM3UIVPROC) load(\"glUniform3uiv\", userptr);\n    glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC) load(\"glVertexAttribI2iv\", userptr);\n    glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) load(\"glFlushMappedBufferRange\", userptr);\n    glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC) load(\"glVertexAttribI2ui\", userptr);\n    glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) load(\"glBindVertexArray\", userptr);\n    glUniform2uiv = (PFNGLUNIFORM2UIVPROC) load(\"glUniform2uiv\", userptr);\n    glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC) load(\"glVertexAttribI3iv\", userptr);\n    glUniform1uiv = (PFNGLUNIFORM1UIVPROC) load(\"glUniform1uiv\", userptr);\n    glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(\"glBlitFramebuffer\", userptr);\n    glClearBufferfv = (PFNGLCLEARBUFFERFVPROC) load(\"glClearBufferfv\", userptr);\n    glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(\"glIsFramebuffer\", userptr);\n    glUniform4ui = (PFNGLUNIFORM4UIPROC) load(\"glUniform4ui\", userptr);\n    glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(\"glGetIntegeri_v\", userptr);\n    glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC) load(\"glVertexAttribI4i\", userptr);\n    glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC) load(\"glVertexAttribI3i\", userptr);\n    glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC) load(\"glGetFragDataLocation\", userptr);\n    glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) load(\"glGetTransformFeedbackVarying\", userptr);\n    glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(\"glFramebufferTextureLayer\", userptr);\n    glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(\"glFramebufferTexture3D\", userptr);\n    glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(\"glGetRenderbufferParameteriv\", userptr);\n}\nstatic void load_GL_VERSION_3_1( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_3_1) return;\n    glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) load(\"glDrawArraysInstanced\", userptr);\n    glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(\"glBindBufferRange\", userptr);\n    glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC) load(\"glGetActiveUniformName\", userptr);\n    glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) load(\"glGetUniformBlockIndex\", userptr);\n    glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(\"glBindBufferBase\", userptr);\n    glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) load(\"glGetActiveUniformBlockiv\", userptr);\n    glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(\"glCopyBufferSubData\", userptr);\n    glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) load(\"glGetUniformIndices\", userptr);\n    glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) load(\"glGetActiveUniformBlockName\", userptr);\n    glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(\"glGetIntegeri_v\", userptr);\n    glTexBuffer = (PFNGLTEXBUFFERPROC) load(\"glTexBuffer\", userptr);\n    glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) load(\"glUniformBlockBinding\", userptr);\n    glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC) load(\"glDrawElementsInstanced\", userptr);\n    glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) load(\"glGetActiveUniformsiv\", userptr);\n    glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC) load(\"glPrimitiveRestartIndex\", userptr);\n}\nstatic void load_GL_VERSION_3_2( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_3_2) return;\n    glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) load(\"glDrawElementsInstancedBaseVertex\", userptr);\n    glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) load(\"glGetMultisamplefv\", userptr);\n    glGetInteger64v = (PFNGLGETINTEGER64VPROC) load(\"glGetInteger64v\", userptr);\n    glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC) load(\"glGetInteger64i_v\", userptr);\n    glGetSynciv = (PFNGLGETSYNCIVPROC) load(\"glGetSynciv\", userptr);\n    glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) load(\"glDrawRangeElementsBaseVertex\", userptr);\n    glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(\"glFramebufferTexture\", userptr);\n    glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC) load(\"glGetBufferParameteri64v\", userptr);\n    glSampleMaski = (PFNGLSAMPLEMASKIPROC) load(\"glSampleMaski\", userptr);\n    glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) load(\"glTexImage3DMultisample\", userptr);\n    glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) load(\"glMultiDrawElementsBaseVertex\", userptr);\n    glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) load(\"glClientWaitSync\", userptr);\n    glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC) load(\"glProvokingVertex\", userptr);\n    glWaitSync = (PFNGLWAITSYNCPROC) load(\"glWaitSync\", userptr);\n    glDeleteSync = (PFNGLDELETESYNCPROC) load(\"glDeleteSync\", userptr);\n    glIsSync = (PFNGLISSYNCPROC) load(\"glIsSync\", userptr);\n    glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) load(\"glTexImage2DMultisample\", userptr);\n    glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) load(\"glDrawElementsBaseVertex\", userptr);\n    glFenceSync = (PFNGLFENCESYNCPROC) load(\"glFenceSync\", userptr);\n}\nstatic void load_GL_VERSION_3_3( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_3_3) return;\n    glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load(\"glSamplerParameterf\", userptr);\n    glGenSamplers = (PFNGLGENSAMPLERSPROC) load(\"glGenSamplers\", userptr);\n    glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC) load(\"glVertexAttribDivisor\", userptr);\n    glNormalP3uiv = (PFNGLNORMALP3UIVPROC) load(\"glNormalP3uiv\", userptr);\n    glNormalP3ui = (PFNGLNORMALP3UIPROC) load(\"glNormalP3ui\", userptr);\n    glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC) load(\"glTexCoordP1uiv\", userptr);\n    glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC) load(\"glVertexAttribP1ui\", userptr);\n    glVertexP2uiv = (PFNGLVERTEXP2UIVPROC) load(\"glVertexP2uiv\", userptr);\n    glVertexP3uiv = (PFNGLVERTEXP3UIVPROC) load(\"glVertexP3uiv\", userptr);\n    glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC) load(\"glVertexAttribP3uiv\", userptr);\n    glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) load(\"glSamplerParameterIuiv\", userptr);\n    glVertexP2ui = (PFNGLVERTEXP2UIPROC) load(\"glVertexP2ui\", userptr);\n    glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC) load(\"glTexCoordP2uiv\", userptr);\n    glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC) load(\"glVertexAttribP1uiv\", userptr);\n    glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load(\"glSamplerParameteri\", userptr);\n    glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC) load(\"glMultiTexCoordP3ui\", userptr);\n    glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) load(\"glGetQueryObjecti64v\", userptr);\n    glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) load(\"glGetSamplerParameterIiv\", userptr);\n    glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load(\"glSamplerParameterfv\", userptr);\n    glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC) load(\"glMultiTexCoordP2ui\", userptr);\n    glVertexP3ui = (PFNGLVERTEXP3UIPROC) load(\"glVertexP3ui\", userptr);\n    glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC) load(\"glTexCoordP2ui\", userptr);\n    glColorP4uiv = (PFNGLCOLORP4UIVPROC) load(\"glColorP4uiv\", userptr);\n    glBindSampler = (PFNGLBINDSAMPLERPROC) load(\"glBindSampler\", userptr);\n    glVertexP4uiv = (PFNGLVERTEXP4UIVPROC) load(\"glVertexP4uiv\", userptr);\n    glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC) load(\"glVertexAttribP3ui\", userptr);\n    glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) load(\"glGetSamplerParameterIuiv\", userptr);\n    glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) load(\"glBindFragDataLocationIndexed\", userptr);\n    glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC) load(\"glMultiTexCoordP4uiv\", userptr);\n    glIsSampler = (PFNGLISSAMPLERPROC) load(\"glIsSampler\", userptr);\n    glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load(\"glGetSamplerParameterfv\", userptr);\n    glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC) load(\"glTexCoordP3ui\", userptr);\n    glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) load(\"glVertexAttribP4uiv\", userptr);\n    glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC) load(\"glSecondaryColorP3uiv\", userptr);\n    glQueryCounter = (PFNGLQUERYCOUNTERPROC) load(\"glQueryCounter\", userptr);\n    glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) load(\"glGetQueryObjectui64v\", userptr);\n    glColorP3uiv = (PFNGLCOLORP3UIVPROC) load(\"glColorP3uiv\", userptr);\n    glColorP4ui = (PFNGLCOLORP4UIPROC) load(\"glColorP4ui\", userptr);\n    glVertexP4ui = (PFNGLVERTEXP4UIPROC) load(\"glVertexP4ui\", userptr);\n    glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load(\"glGetSamplerParameteriv\", userptr);\n    glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC) load(\"glMultiTexCoordP2uiv\", userptr);\n    glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load(\"glSamplerParameteriv\", userptr);\n    glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC) load(\"glTexCoordP3uiv\", userptr);\n    glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC) load(\"glTexCoordP4ui\", userptr);\n    glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC) load(\"glMultiTexCoordP1ui\", userptr);\n    glColorP3ui = (PFNGLCOLORP3UIPROC) load(\"glColorP3ui\", userptr);\n    glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC) load(\"glMultiTexCoordP1uiv\", userptr);\n    glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC) load(\"glMultiTexCoordP4ui\", userptr);\n    glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC) load(\"glVertexAttribP2ui\", userptr);\n    glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC) load(\"glSecondaryColorP3ui\", userptr);\n    glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC) load(\"glTexCoordP1ui\", userptr);\n    glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) load(\"glSamplerParameterIiv\", userptr);\n    glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load(\"glDeleteSamplers\", userptr);\n    glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC) load(\"glVertexAttribP2uiv\", userptr);\n    glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC) load(\"glMultiTexCoordP3uiv\", userptr);\n    glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) load(\"glVertexAttribP4ui\", userptr);\n    glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC) load(\"glTexCoordP4uiv\", userptr);\n    glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC) load(\"glGetFragDataIndex\", userptr);\n}\nstatic void load_GL_VERSION_4_0( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_4_0) return;\n    glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC) load(\"glBeginQueryIndexed\", userptr);\n    glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC) load(\"glPauseTransformFeedback\", userptr);\n    glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC) load(\"glUniformMatrix3x4dv\", userptr);\n    glGetUniformdv = (PFNGLGETUNIFORMDVPROC) load(\"glGetUniformdv\", userptr);\n    glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC) load(\"glUniformSubroutinesuiv\", userptr);\n    glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC) load(\"glEndQueryIndexed\", userptr);\n    glUniform3dv = (PFNGLUNIFORM3DVPROC) load(\"glUniform3dv\", userptr);\n    glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC) load(\"glGetProgramStageiv\", userptr);\n    glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC) load(\"glBlendFuncSeparatei\", userptr);\n    glBlendEquationi = (PFNGLBLENDEQUATIONIPROC) load(\"glBlendEquationi\", userptr);\n    glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC) load(\"glMinSampleShading\", userptr);\n    glUniform4d = (PFNGLUNIFORM4DPROC) load(\"glUniform4d\", userptr);\n    glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC) load(\"glUniformMatrix3dv\", userptr);\n    glUniform3d = (PFNGLUNIFORM3DPROC) load(\"glUniform3d\", userptr);\n    glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC) load(\"glGetActiveSubroutineName\", userptr);\n    glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) load(\"glDrawTransformFeedbackStream\", userptr);\n    glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC) load(\"glPatchParameterfv\", userptr);\n    glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC) load(\"glUniformMatrix4x2dv\", userptr);\n    glUniform1dv = (PFNGLUNIFORM1DVPROC) load(\"glUniform1dv\", userptr);\n    glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC) load(\"glDrawArraysIndirect\", userptr);\n    glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC) load(\"glDrawTransformFeedback\", userptr);\n    glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC) load(\"glGetUniformSubroutineuiv\", userptr);\n    glUniform4dv = (PFNGLUNIFORM4DVPROC) load(\"glUniform4dv\", userptr);\n    glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC) load(\"glBlendEquationSeparatei\", userptr);\n    glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) load(\"glGetSubroutineUniformLocation\", userptr);\n    glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC) load(\"glUniformMatrix2dv\", userptr);\n    glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC) load(\"glUniformMatrix3x2dv\", userptr);\n    glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC) load(\"glIsTransformFeedback\", userptr);\n    glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC) load(\"glDeleteTransformFeedbacks\", userptr);\n    glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) load(\"glGetActiveSubroutineUniformName\", userptr);\n    glUniform2d = (PFNGLUNIFORM2DPROC) load(\"glUniform2d\", userptr);\n    glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC) load(\"glGenTransformFeedbacks\", userptr);\n    glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC) load(\"glUniformMatrix4x3dv\", userptr);\n    glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC) load(\"glUniformMatrix2x4dv\", userptr);\n    glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) load(\"glGetActiveSubroutineUniformiv\", userptr);\n    glBlendFunci = (PFNGLBLENDFUNCIPROC) load(\"glBlendFunci\", userptr);\n    glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC) load(\"glUniformMatrix2x3dv\", userptr);\n    glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC) load(\"glGetQueryIndexediv\", userptr);\n    glUniform2dv = (PFNGLUNIFORM2DVPROC) load(\"glUniform2dv\", userptr);\n    glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC) load(\"glGetSubroutineIndex\", userptr);\n    glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC) load(\"glResumeTransformFeedback\", userptr);\n    glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC) load(\"glBindTransformFeedback\", userptr);\n    glUniform1d = (PFNGLUNIFORM1DPROC) load(\"glUniform1d\", userptr);\n    glPatchParameteri = (PFNGLPATCHPARAMETERIPROC) load(\"glPatchParameteri\", userptr);\n    glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC) load(\"glDrawElementsIndirect\", userptr);\n    glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC) load(\"glUniformMatrix4dv\", userptr);\n}\nstatic void load_GL_VERSION_4_1( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_4_1) return;\n    glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC) load(\"glGetDoublei_v\", userptr);\n    glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC) load(\"glProgramUniform4d\", userptr);\n    glGetFloati_v = (PFNGLGETFLOATI_VPROC) load(\"glGetFloati_v\", userptr);\n    glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC) load(\"glIsProgramPipeline\", userptr);\n    glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) load(\"glGetProgramBinary\", userptr);\n    glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC) load(\"glDepthRangeArrayv\", userptr);\n    glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC) load(\"glProgramUniform1iv\", userptr);\n    glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) load(\"glProgramUniformMatrix3x2dv\", userptr);\n    glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(\"glProgramParameteri\", userptr);\n    glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC) load(\"glVertexAttribLPointer\", userptr);\n    glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) load(\"glProgramUniformMatrix2x3fv\", userptr);\n    glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC) load(\"glProgramUniform3fv\", userptr);\n    glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC) load(\"glProgramUniform4i\", userptr);\n    glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC) load(\"glProgramUniform2iv\", userptr);\n    glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC) load(\"glProgramUniform1dv\", userptr);\n    glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC) load(\"glDepthRangeIndexed\", userptr);\n    glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC) load(\"glDeleteProgramPipelines\", userptr);\n    glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC) load(\"glProgramUniform4fv\", userptr);\n    glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC) load(\"glVertexAttribL3dv\", userptr);\n    glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC) load(\"glViewportArrayv\", userptr);\n    glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC) load(\"glVertexAttribL4d\", userptr);\n    glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC) load(\"glVertexAttribL1dv\", userptr);\n    glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC) load(\"glProgramUniform3i\", userptr);\n    glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC) load(\"glCreateShaderProgramv\", userptr);\n    glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC) load(\"glProgramUniform3uiv\", userptr);\n    glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC) load(\"glViewportIndexedf\", userptr);\n    glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) load(\"glActiveShaderProgram\", userptr);\n    glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC) load(\"glViewportIndexedfv\", userptr);\n    glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC) load(\"glProgramUniform4uiv\", userptr);\n    glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC) load(\"glProgramUniform1d\", userptr);\n    glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC) load(\"glProgramUniform2fv\", userptr);\n    glScissorIndexed = (PFNGLSCISSORINDEXEDPROC) load(\"glScissorIndexed\", userptr);\n    glProgramBinary = (PFNGLPROGRAMBINARYPROC) load(\"glProgramBinary\", userptr);\n    glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) load(\"glUseProgramStages\", userptr);\n    glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC) load(\"glVertexAttribL2d\", userptr);\n    glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC) load(\"glReleaseShaderCompiler\", userptr);\n    glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC) load(\"glProgramUniform3dv\", userptr);\n    glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC) load(\"glProgramUniformMatrix3dv\", userptr);\n    glScissorArrayv = (PFNGLSCISSORARRAYVPROC) load(\"glScissorArrayv\", userptr);\n    glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) load(\"glProgramUniformMatrix3x4dv\", userptr);\n    glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC) load(\"glVertexAttribL4dv\", userptr);\n    glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC) load(\"glProgramUniform2f\", userptr);\n    glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC) load(\"glProgramUniform2i\", userptr);\n    glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC) load(\"glProgramUniformMatrix4dv\", userptr);\n    glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC) load(\"glProgramUniform2uiv\", userptr);\n    glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) load(\"glProgramUniformMatrix3x4fv\", userptr);\n    glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC) load(\"glProgramUniform4f\", userptr);\n    glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(\"glClearDepthf\", userptr);\n    glShaderBinary = (PFNGLSHADERBINARYPROC) load(\"glShaderBinary\", userptr);\n    glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC) load(\"glProgramUniform2ui\", userptr);\n    glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC) load(\"glGetProgramPipelineiv\", userptr);\n    glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) load(\"glProgramUniformMatrix2x3dv\", userptr);\n    glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC) load(\"glVertexAttribL2dv\", userptr);\n    glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC) load(\"glProgramUniformMatrix2dv\", userptr);\n    glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC) load(\"glProgramUniformMatrix2fv\", userptr);\n    glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC) load(\"glGetProgramPipelineInfoLog\", userptr);\n    glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) load(\"glProgramUniformMatrix4x3dv\", userptr);\n    glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC) load(\"glGetShaderPrecisionFormat\", userptr);\n    glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC) load(\"glProgramUniform3d\", userptr);\n    glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) load(\"glProgramUniformMatrix4x2dv\", userptr);\n    glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC) load(\"glProgramUniform3f\", userptr);\n    glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC) load(\"glProgramUniform3iv\", userptr);\n    glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(\"glDepthRangef\", userptr);\n    glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC) load(\"glProgramUniform4iv\", userptr);\n    glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC) load(\"glScissorIndexedv\", userptr);\n    glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) load(\"glProgramUniformMatrix2x4dv\", userptr);\n    glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC) load(\"glGetVertexAttribLdv\", userptr);\n    glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC) load(\"glProgramUniform2dv\", userptr);\n    glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC) load(\"glProgramUniform4dv\", userptr);\n    glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC) load(\"glProgramUniform1fv\", userptr);\n    glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC) load(\"glProgramUniform3ui\", userptr);\n    glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC) load(\"glProgramUniform4ui\", userptr);\n    glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC) load(\"glProgramUniformMatrix4fv\", userptr);\n    glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC) load(\"glVertexAttribL1d\", userptr);\n    glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) load(\"glProgramUniformMatrix3x2fv\", userptr);\n    glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) load(\"glProgramUniformMatrix2x4fv\", userptr);\n    glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC) load(\"glProgramUniform1i\", userptr);\n    glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) load(\"glValidateProgramPipeline\", userptr);\n    glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC) load(\"glBindProgramPipeline\", userptr);\n    glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC) load(\"glProgramUniform1uiv\", userptr);\n    glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC) load(\"glProgramUniform2d\", userptr);\n    glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC) load(\"glProgramUniformMatrix3fv\", userptr);\n    glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) load(\"glProgramUniformMatrix4x2fv\", userptr);\n    glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC) load(\"glProgramUniform1f\", userptr);\n    glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC) load(\"glGenProgramPipelines\", userptr);\n    glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC) load(\"glProgramUniform1ui\", userptr);\n    glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) load(\"glProgramUniformMatrix4x3fv\", userptr);\n    glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC) load(\"glVertexAttribL3d\", userptr);\n}\nstatic void load_GL_VERSION_4_2( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_4_2) return;\n    glTexStorage2D = (PFNGLTEXSTORAGE2DPROC) load(\"glTexStorage2D\", userptr);\n    glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC) load(\"glGetInternalformativ\", userptr);\n    glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC) load(\"glBindImageTexture\", userptr);\n    glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) load(\"glDrawTransformFeedbackStreamInstanced\", userptr);\n    glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) load(\"glDrawArraysInstancedBaseInstance\", userptr);\n    glTexStorage3D = (PFNGLTEXSTORAGE3DPROC) load(\"glTexStorage3D\", userptr);\n    glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) load(\"glDrawElementsInstancedBaseVertexBaseInstance\", userptr);\n    glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) load(\"glDrawTransformFeedbackInstanced\", userptr);\n    glMemoryBarrier = (PFNGLMEMORYBARRIERPROC) load(\"glMemoryBarrier\", userptr);\n    glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) load(\"glGetActiveAtomicCounterBufferiv\", userptr);\n    glTexStorage1D = (PFNGLTEXSTORAGE1DPROC) load(\"glTexStorage1D\", userptr);\n    glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) load(\"glDrawElementsInstancedBaseInstance\", userptr);\n}\nstatic void load_GL_VERSION_4_3( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_4_3) return;\n    glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC) load(\"glDispatchComputeIndirect\", userptr);\n    glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC) load(\"glVertexAttribLFormat\", userptr);\n    glClearBufferData = (PFNGLCLEARBUFFERDATAPROC) load(\"glClearBufferData\", userptr);\n    glTextureView = (PFNGLTEXTUREVIEWPROC) load(\"glTextureView\", userptr);\n    glGetPointerv = (PFNGLGETPOINTERVPROC) load(\"glGetPointerv\", userptr);\n    glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC) load(\"glFramebufferParameteri\", userptr);\n    glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) load(\"glDebugMessageCallback\", userptr);\n    glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC) load(\"glInvalidateBufferData\", userptr);\n    glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC) load(\"glGetInternalformati64v\", userptr);\n    glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC) load(\"glVertexAttribBinding\", userptr);\n    glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC) load(\"glDispatchCompute\", userptr);\n    glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC) load(\"glVertexBindingDivisor\", userptr);\n    glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC) load(\"glMultiDrawArraysIndirect\", userptr);\n    glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC) load(\"glGetProgramResourceName\", userptr);\n    glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) load(\"glDebugMessageControl\", userptr);\n    glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC) load(\"glGetProgramResourceiv\", userptr);\n    glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC) load(\"glInvalidateSubFramebuffer\", userptr);\n    glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC) load(\"glVertexAttribIFormat\", userptr);\n    glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC) load(\"glInvalidateBufferSubData\", userptr);\n    glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC) load(\"glTexStorage2DMultisample\", userptr);\n    glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC) load(\"glTexStorage3DMultisample\", userptr);\n    glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC) load(\"glInvalidateFramebuffer\", userptr);\n    glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC) load(\"glGetProgramInterfaceiv\", userptr);\n    glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC) load(\"glShaderStorageBlockBinding\", userptr);\n    glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC) load(\"glClearBufferSubData\", userptr);\n    glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC) load(\"glGetProgramResourceIndex\", userptr);\n    glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC) load(\"glInvalidateTexImage\", userptr);\n    glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC) load(\"glGetFramebufferParameteriv\", userptr);\n    glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) load(\"glGetProgramResourceLocationIndex\", userptr);\n    glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) load(\"glObjectPtrLabel\", userptr);\n    glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC) load(\"glTexBufferRange\", userptr);\n    glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC) load(\"glGetProgramResourceLocation\", userptr);\n    glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC) load(\"glMultiDrawElementsIndirect\", userptr);\n    glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC) load(\"glInvalidateTexSubImage\", userptr);\n    glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC) load(\"glBindVertexBuffer\", userptr);\n    glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) load(\"glDebugMessageInsert\", userptr);\n    glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) load(\"glGetDebugMessageLog\", userptr);\n    glObjectLabel = (PFNGLOBJECTLABELPROC) load(\"glObjectLabel\", userptr);\n    glGetObjectLabel = (PFNGLGETOBJECTLABELPROC) load(\"glGetObjectLabel\", userptr);\n    glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC) load(\"glCopyImageSubData\", userptr);\n    glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load(\"glPushDebugGroup\", userptr);\n    glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load(\"glPopDebugGroup\", userptr);\n    glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC) load(\"glVertexAttribFormat\", userptr);\n    glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) load(\"glGetObjectPtrLabel\", userptr);\n}\nstatic void load_GL_VERSION_4_4( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_4_4) return;\n    glBindSamplers = (PFNGLBINDSAMPLERSPROC) load(\"glBindSamplers\", userptr);\n    glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC) load(\"glBindImageTextures\", userptr);\n    glBufferStorage = (PFNGLBUFFERSTORAGEPROC) load(\"glBufferStorage\", userptr);\n    glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC) load(\"glBindVertexBuffers\", userptr);\n    glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC) load(\"glBindBuffersBase\", userptr);\n    glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC) load(\"glClearTexSubImage\", userptr);\n    glClearTexImage = (PFNGLCLEARTEXIMAGEPROC) load(\"glClearTexImage\", userptr);\n    glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC) load(\"glBindBuffersRange\", userptr);\n    glBindTextures = (PFNGLBINDTEXTURESPROC) load(\"glBindTextures\", userptr);\n}\nstatic void load_GL_VERSION_4_5( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_4_5) return;\n    glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC) load(\"glGetTextureParameterIiv\", userptr);\n    glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) load(\"glTextureStorage3DMultisample\", userptr);\n    glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC) load(\"glTextureSubImage3D\", userptr);\n    glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC) load(\"glVertexArrayAttribBinding\", userptr);\n    glGetnCompressedTexImage = (PFNGLGETNCOMPRESSEDTEXIMAGEPROC) load(\"glGetnCompressedTexImage\", userptr);\n    glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) load(\"glTextureStorage2DMultisample\", userptr);\n    glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) load(\"glFlushMappedNamedBufferRange\", userptr);\n    glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) load(\"glGetNamedFramebufferParameteriv\", userptr);\n    glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC) load(\"glTextureBufferRange\", userptr);\n    glGetnMapdv = (PFNGLGETNMAPDVPROC) load(\"glGetnMapdv\", userptr);\n    glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC) load(\"glCopyTextureSubImage1D\", userptr);\n    glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC) load(\"glGetnUniformuiv\", userptr);\n    glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC) load(\"glTextureParameteri\", userptr);\n    glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) load(\"glCheckNamedFramebufferStatus\", userptr);\n    glGetnColorTable = (PFNGLGETNCOLORTABLEPROC) load(\"glGetnColorTable\", userptr);\n    glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC) load(\"glClearNamedBufferData\", userptr);\n    glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) load(\"glInvalidateNamedFramebufferSubData\", userptr);\n    glGetnPixelMapfv = (PFNGLGETNPIXELMAPFVPROC) load(\"glGetnPixelMapfv\", userptr);\n    glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC) load(\"glGetGraphicsResetStatus\", userptr);\n    glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) load(\"glTransformFeedbackBufferBase\", userptr);\n    glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC) load(\"glNamedBufferSubData\", userptr);\n    glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) load(\"glClearNamedFramebufferuiv\", userptr);\n    glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC) load(\"glVertexArrayAttribLFormat\", userptr);\n    glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC) load(\"glGetTextureLevelParameterfv\", userptr);\n    glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC) load(\"glBlitNamedFramebuffer\", userptr);\n    glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) load(\"glClearNamedFramebufferfi\", userptr);\n    glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) load(\"glNamedFramebufferReadBuffer\", userptr);\n    glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) load(\"glGetCompressedTextureImage\", userptr);\n    glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC) load(\"glGetTextureSubImage\", userptr);\n    glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC) load(\"glTextureSubImage2D\", userptr);\n    glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC) load(\"glNamedRenderbufferStorage\", userptr);\n    glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) load(\"glNamedFramebufferRenderbuffer\", userptr);\n    glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC) load(\"glNamedBufferData\", userptr);\n    glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC) load(\"glGetNamedBufferSubData\", userptr);\n    glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC) load(\"glGetNamedBufferPointerv\", userptr);\n    glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC) load(\"glTextureStorage2D\", userptr);\n    glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC) load(\"glGetTextureParameteriv\", userptr);\n    glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC) load(\"glVertexArrayVertexBuffer\", userptr);\n    glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC) load(\"glGetQueryBufferObjectui64v\", userptr);\n    glGetnPolygonStipple = (PFNGLGETNPOLYGONSTIPPLEPROC) load(\"glGetnPolygonStipple\", userptr);\n    glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC) load(\"glVertexArrayBindingDivisor\", userptr);\n    glGetnHistogram = (PFNGLGETNHISTOGRAMPROC) load(\"glGetnHistogram\", userptr);\n    glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC) load(\"glEnableVertexArrayAttrib\", userptr);\n    glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC) load(\"glGetVertexArrayIndexed64iv\", userptr);\n    glGetnUniformdv = (PFNGLGETNUNIFORMDVPROC) load(\"glGetnUniformdv\", userptr);\n    glCreateSamplers = (PFNGLCREATESAMPLERSPROC) load(\"glCreateSamplers\", userptr);\n    glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) load(\"glNamedFramebufferParameteri\", userptr);\n    glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC) load(\"glNamedBufferStorage\", userptr);\n    glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) load(\"glNamedFramebufferTexture\", userptr);\n    glGetnSeparableFilter = (PFNGLGETNSEPARABLEFILTERPROC) load(\"glGetnSeparableFilter\", userptr);\n    glCreateQueries = (PFNGLCREATEQUERIESPROC) load(\"glCreateQueries\", userptr);\n    glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) load(\"glTransformFeedbackBufferRange\", userptr);\n    glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC) load(\"glGetVertexArrayiv\", userptr);\n    glGetnMapfv = (PFNGLGETNMAPFVPROC) load(\"glGetnMapfv\", userptr);\n    glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) load(\"glGetNamedRenderbufferParameteriv\", userptr);\n    glGetnPixelMapuiv = (PFNGLGETNPIXELMAPUIVPROC) load(\"glGetnPixelMapuiv\", userptr);\n    glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC) load(\"glGetQueryBufferObjectiv\", userptr);\n    glGetnConvolutionFilter = (PFNGLGETNCONVOLUTIONFILTERPROC) load(\"glGetnConvolutionFilter\", userptr);\n    glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC) load(\"glCreateRenderbuffers\", userptr);\n    glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC) load(\"glGenerateTextureMipmap\", userptr);\n    glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC) load(\"glTextureStorage1D\", userptr);\n    glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC) load(\"glCreateProgramPipelines\", userptr);\n    glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(\"glGetNamedFramebufferAttachmentParameteriv\", userptr);\n    glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC) load(\"glBindTextureUnit\", userptr);\n    glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC) load(\"glGetTransformFeedbacki64_v\", userptr);\n    glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) load(\"glNamedFramebufferDrawBuffer\", userptr);\n    glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) load(\"glInvalidateNamedFramebufferData\", userptr);\n    glReadnPixels = (PFNGLREADNPIXELSPROC) load(\"glReadnPixels\", userptr);\n    glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC) load(\"glTextureParameterfv\", userptr);\n    glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC) load(\"glGetVertexArrayIndexediv\", userptr);\n    glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC) load(\"glMapNamedBuffer\", userptr);\n    glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) load(\"glGetNamedBufferParameteri64v\", userptr);\n    glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC) load(\"glVertexArrayElementBuffer\", userptr);\n    glClipControl = (PFNGLCLIPCONTROLPROC) load(\"glClipControl\", userptr);\n    glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) load(\"glClearNamedFramebufferfv\", userptr);\n    glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC) load(\"glGetTransformFeedbackiv\", userptr);\n    glGetnMinmax = (PFNGLGETNMINMAXPROC) load(\"glGetnMinmax\", userptr);\n    glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(\"glNamedRenderbufferStorageMultisample\", userptr);\n    glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) load(\"glNamedFramebufferDrawBuffers\", userptr);\n    glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC) load(\"glGetNamedBufferParameteriv\", userptr);\n    glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) load(\"glNamedFramebufferTextureLayer\", userptr);\n    glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) load(\"glClearNamedFramebufferiv\", userptr);\n    glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) load(\"glCompressedTextureSubImage3D\", userptr);\n    glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC) load(\"glDisableVertexArrayAttrib\", userptr);\n    glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC) load(\"glGetQueryBufferObjectuiv\", userptr);\n    glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC) load(\"glTextureParameterIuiv\", userptr);\n    glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC) load(\"glGetTextureParameterIuiv\", userptr);\n    glTextureBuffer = (PFNGLTEXTUREBUFFERPROC) load(\"glTextureBuffer\", userptr);\n    glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC) load(\"glMemoryBarrierByRegion\", userptr);\n    glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC) load(\"glTextureParameterf\", userptr);\n    glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC) load(\"glCopyNamedBufferSubData\", userptr);\n    glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC) load(\"glVertexArrayAttribFormat\", userptr);\n    glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC) load(\"glMapNamedBufferRange\", userptr);\n    glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC) load(\"glTextureSubImage1D\", userptr);\n    glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC) load(\"glGetTextureParameterfv\", userptr);\n    glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC) load(\"glTextureParameteriv\", userptr);\n    glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC) load(\"glCreateFramebuffers\", userptr);\n    glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC) load(\"glTextureParameterIiv\", userptr);\n    glGetnTexImage = (PFNGLGETNTEXIMAGEPROC) load(\"glGetnTexImage\", userptr);\n    glTextureBarrier = (PFNGLTEXTUREBARRIERPROC) load(\"glTextureBarrier\", userptr);\n    glCreateTextures = (PFNGLCREATETEXTURESPROC) load(\"glCreateTextures\", userptr);\n    glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) load(\"glCompressedTextureSubImage1D\", userptr);\n    glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC) load(\"glCopyTextureSubImage3D\", userptr);\n    glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC) load(\"glCreateVertexArrays\", userptr);\n    glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) load(\"glCompressedTextureSubImage2D\", userptr);\n    glCreateBuffers = (PFNGLCREATEBUFFERSPROC) load(\"glCreateBuffers\", userptr);\n    glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC) load(\"glCreateTransformFeedbacks\", userptr);\n    glGetnMapiv = (PFNGLGETNMAPIVPROC) load(\"glGetnMapiv\", userptr);\n    glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC) load(\"glClearNamedBufferSubData\", userptr);\n    glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC) load(\"glGetTextureImage\", userptr);\n    glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC) load(\"glGetTextureLevelParameteriv\", userptr);\n    glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC) load(\"glGetnUniformiv\", userptr);\n    glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) load(\"glGetCompressedTextureSubImage\", userptr);\n    glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC) load(\"glVertexArrayVertexBuffers\", userptr);\n    glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC) load(\"glCopyTextureSubImage2D\", userptr);\n    glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC) load(\"glGetTransformFeedbacki_v\", userptr);\n    glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC) load(\"glUnmapNamedBuffer\", userptr);\n    glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC) load(\"glVertexArrayAttribIFormat\", userptr);\n    glGetnPixelMapusv = (PFNGLGETNPIXELMAPUSVPROC) load(\"glGetnPixelMapusv\", userptr);\n    glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC) load(\"glGetnUniformfv\", userptr);\n    glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC) load(\"glTextureStorage3D\", userptr);\n    glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC) load(\"glGetQueryBufferObjecti64v\", userptr);\n}\nstatic void load_GL_VERSION_4_6( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GL_VERSION_4_6) return;\n    glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC) load(\"glPolygonOffsetClamp\", userptr);\n    glSpecializeShader = (PFNGLSPECIALIZESHADERPROC) load(\"glSpecializeShader\", userptr);\n    glMultiDrawArraysIndirectCount = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) load(\"glMultiDrawArraysIndirectCount\", userptr);\n    glMultiDrawElementsIndirectCount = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) load(\"glMultiDrawElementsIndirectCount\", userptr);\n}\n\n\n\n#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0)\n#define GLAD_GL_IS_SOME_NEW_VERSION 1\n#else\n#define GLAD_GL_IS_SOME_NEW_VERSION 0\n#endif\n\nstatic int get_exts( int version, const char **out_exts, unsigned int *out_num_exts_i, char ***out_exts_i) {\n#if GLAD_GL_IS_SOME_NEW_VERSION\n    if(GLAD_VERSION_MAJOR(version) < 3) {\n#else\n    (void) version;\n    (void) out_num_exts_i;\n    (void) out_exts_i;\n#endif\n        if (glGetString == NULL) {\n            return 0;\n        }\n        *out_exts = (const char *)glGetString(GL_EXTENSIONS);\n#if GLAD_GL_IS_SOME_NEW_VERSION\n    } else {\n        unsigned int index = 0;\n        unsigned int num_exts_i = 0;\n        char **exts_i = NULL;\n        if (glGetStringi == NULL || glGetIntegerv == NULL) {\n            return 0;\n        }\n        glGetIntegerv(GL_NUM_EXTENSIONS, (int*) &num_exts_i);\n        if (num_exts_i > 0) {\n            exts_i = (char **) malloc(num_exts_i * (sizeof *exts_i));\n        }\n        if (exts_i == NULL) {\n            return 0;\n        }\n        for(index = 0; index < num_exts_i; index++) {\n            const char *gl_str_tmp = (const char*) glGetStringi(GL_EXTENSIONS, index);\n            size_t len = strlen(gl_str_tmp) + 1;\n\n            char *local_str = (char*) malloc(len * sizeof(char));\n            if(local_str != NULL) {\n                GLAD_IMPL_UTIL_STRNCPY(local_str, gl_str_tmp, len);\n            }\n\n            exts_i[index] = local_str;\n        }\n\n        *out_num_exts_i = num_exts_i;\n        *out_exts_i = exts_i;\n    }\n#endif\n    return 1;\n}\nstatic void free_exts(char **exts_i, unsigned int num_exts_i) {\n    if (exts_i != NULL) {\n        unsigned int index;\n        for(index = 0; index < num_exts_i; index++) {\n            free((void *) (exts_i[index]));\n        }\n        free((void *)exts_i);\n        exts_i = NULL;\n    }\n}\nstatic int has_ext(int version, const char *exts, unsigned int num_exts_i, char **exts_i, const char *ext) {\n    if(GLAD_VERSION_MAJOR(version) < 3 || !GLAD_GL_IS_SOME_NEW_VERSION) {\n        const char *extensions;\n        const char *loc;\n        const char *terminator;\n        extensions = exts;\n        if(extensions == NULL || ext == NULL) {\n            return 0;\n        }\n        while(1) {\n            loc = strstr(extensions, ext);\n            if(loc == NULL) {\n                return 0;\n            }\n            terminator = loc + strlen(ext);\n            if((loc == extensions || *(loc - 1) == ' ') &&\n                (*terminator == ' ' || *terminator == '\\0')) {\n                return 1;\n            }\n            extensions = terminator;\n        }\n    } else {\n        unsigned int index;\n        for(index = 0; index < num_exts_i; index++) {\n            const char *e = exts_i[index];\n            if(strcmp(e, ext) == 0) {\n                return 1;\n            }\n        }\n    }\n    return 0;\n}\n\nstatic GLADapiproc glad_gl_get_proc_from_userptr(const char* name, void *userptr) {\n    return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name);\n}\n\nstatic int find_extensionsGL( int version) {\n    const char *exts = NULL;\n    unsigned int num_exts_i = 0;\n    char **exts_i = NULL;\n    if (!get_exts(version, &exts, &num_exts_i, &exts_i)) return 0;\n\n    GLAD_GL_ARB_point_sprite = has_ext(version, exts, num_exts_i, exts_i, \"GL_ARB_point_sprite\");\n\n    free_exts(exts_i, num_exts_i);\n    return 1;\n}\n\nstatic int find_coreGL(void) {\n    int i, major, minor;\n    const char* version;\n    const char* prefixes[] = {\n        \"OpenGL ES-CM \",\n        \"OpenGL ES-CL \",\n        \"OpenGL ES \",\n        NULL\n    };\n    version = (const char*) glGetString(GL_VERSION);\n    if (!version) return 0;\n    for (i = 0;  prefixes[i];  i++) {\n        const size_t length = strlen(prefixes[i]);\n        if (strncmp(version, prefixes[i], length) == 0) {\n            version += length;\n            break;\n        }\n    }\n\n    GLAD_IMPL_UTIL_SSCANF(version, \"%d.%d\", &major, &minor);\n\n    GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;\n    GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1;\n    GLAD_GL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1;\n    GLAD_GL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1;\n    GLAD_GL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1;\n    GLAD_GL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1;\n    GLAD_GL_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2;\n    GLAD_GL_VERSION_2_1 = (major == 2 && minor >= 1) || major > 2;\n    GLAD_GL_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3;\n    GLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3;\n    GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3;\n    GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3;\n    GLAD_GL_VERSION_4_0 = (major == 4 && minor >= 0) || major > 4;\n    GLAD_GL_VERSION_4_1 = (major == 4 && minor >= 1) || major > 4;\n    GLAD_GL_VERSION_4_2 = (major == 4 && minor >= 2) || major > 4;\n    GLAD_GL_VERSION_4_3 = (major == 4 && minor >= 3) || major > 4;\n    GLAD_GL_VERSION_4_4 = (major == 4 && minor >= 4) || major > 4;\n    GLAD_GL_VERSION_4_5 = (major == 4 && minor >= 5) || major > 4;\n    GLAD_GL_VERSION_4_6 = (major == 4 && minor >= 6) || major > 4;\n\n    return GLAD_MAKE_VERSION(major, minor);\n}\n\nint gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr) {\n    int version;\n\n    glGetString = (PFNGLGETSTRINGPROC) load(\"glGetString\", userptr);\n    if(glGetString == NULL) return 0;\n    if(glGetString(GL_VERSION) == NULL) return 0;\n    version = find_coreGL();\n\n    load_GL_VERSION_1_0(load, userptr);\n    load_GL_VERSION_1_1(load, userptr);\n    load_GL_VERSION_1_2(load, userptr);\n    load_GL_VERSION_1_3(load, userptr);\n    load_GL_VERSION_1_4(load, userptr);\n    load_GL_VERSION_1_5(load, userptr);\n    load_GL_VERSION_2_0(load, userptr);\n    load_GL_VERSION_2_1(load, userptr);\n    load_GL_VERSION_3_0(load, userptr);\n    load_GL_VERSION_3_1(load, userptr);\n    load_GL_VERSION_3_2(load, userptr);\n    load_GL_VERSION_3_3(load, userptr);\n    load_GL_VERSION_4_0(load, userptr);\n    load_GL_VERSION_4_1(load, userptr);\n    load_GL_VERSION_4_2(load, userptr);\n    load_GL_VERSION_4_3(load, userptr);\n    load_GL_VERSION_4_4(load, userptr);\n    load_GL_VERSION_4_5(load, userptr);\n    load_GL_VERSION_4_6(load, userptr);\n\n    if (!find_extensionsGL(version)) return 0;\n\n\n\n    return version;\n}\n\n\nint gladLoadGL( GLADloadfunc load) {\n    return gladLoadGLUserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);\n}\n\n\n\n\n#ifdef GLAD_GL\n\n#ifndef GLAD_LOADER_LIBRARY_C_\n#define GLAD_LOADER_LIBRARY_C_\n\n#include <stddef.h>\n#include <stdlib.h>\n\n#if GLAD_PLATFORM_WIN32\n#include <windows.h>\n#else\n#include <dlfcn.h>\n#endif\n\n\nstatic void* glad_get_dlopen_handle(const char *lib_names[], int length) {\n    void *handle = NULL;\n    int i;\n\n    for (i = 0; i < length; ++i) {\n#if GLAD_PLATFORM_WIN32\n  #if GLAD_PLATFORM_UWP\n        size_t buffer_size = (strlen(lib_names[i]) + 1) * sizeof(WCHAR);\n        LPWSTR buffer = (LPWSTR) malloc(buffer_size);\n        if (buffer != NULL) {\n            int ret = MultiByteToWideChar(CP_ACP, 0, lib_names[i], -1, buffer, buffer_size);\n            if (ret != 0) {\n                handle = (void*) LoadPackagedLibrary(buffer, 0);\n            }\n            free((void*) buffer);\n        }\n  #else\n        handle = (void*) LoadLibraryA(lib_names[i]);\n  #endif\n#else\n        handle = dlopen(lib_names[i], RTLD_LAZY | RTLD_LOCAL);\n#endif\n        if (handle != NULL) {\n            return handle;\n        }\n    }\n\n    return NULL;\n}\n\nstatic void glad_close_dlopen_handle(void* handle) {\n    if (handle != NULL) {\n#if GLAD_PLATFORM_WIN32\n        FreeLibrary((HMODULE) handle);\n#else\n        dlclose(handle);\n#endif\n    }\n}\n\nstatic GLADapiproc glad_dlsym_handle(void* handle, const char *name) {\n    if (handle == NULL) {\n        return NULL;\n    }\n\n#if GLAD_PLATFORM_WIN32\n    return (GLADapiproc) GetProcAddress((HMODULE) handle, name);\n#else\n    return GLAD_GNUC_EXTENSION (GLADapiproc) dlsym(handle, name);\n#endif\n}\n\n#endif /* GLAD_LOADER_LIBRARY_C_ */\n\ntypedef void* (GLAD_API_PTR *GLADglprocaddrfunc)(const char*);\nstruct _glad_gl_userptr {\n    void *gl_handle;\n    GLADglprocaddrfunc gl_get_proc_address_ptr;\n};\n\nstatic GLADapiproc glad_gl_get_proc(const char *name, void *vuserptr) {\n    struct _glad_gl_userptr userptr = *(struct _glad_gl_userptr*) vuserptr;\n    GLADapiproc result = NULL;\n\n#ifndef __APPLE__\n    if(userptr.gl_get_proc_address_ptr != NULL) {\n        result = GLAD_GNUC_EXTENSION (GLADapiproc) userptr.gl_get_proc_address_ptr(name);\n    }\n#endif\n    if(result == NULL) {\n        result = glad_dlsym_handle(userptr.gl_handle, name);\n    }\n\n    return result;\n}\n\nint gladLoaderLoadGL(void) {\n#ifdef __APPLE__\n    static const char *NAMES[] = {\n        \"../Frameworks/OpenGL.framework/OpenGL\",\n        \"/Library/Frameworks/OpenGL.framework/OpenGL\",\n        \"/System/Library/Frameworks/OpenGL.framework/OpenGL\",\n        \"/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL\"\n    };\n#elif GLAD_PLATFORM_WIN32\n    static const char *NAMES[] = {\"opengl32.dll\"};\n#else\n    static const char *NAMES[] = {\n#if defined __CYGWIN__\n        \"libGL-1.so\",\n#endif\n        \"libGL.so.1\",\n        \"libGL.so\"\n    };\n#endif\n\n    int version = 0;\n    void *handle;\n    struct _glad_gl_userptr userptr;\n\n    handle = glad_get_dlopen_handle(NAMES, sizeof(NAMES) / sizeof(NAMES[0]));\n    if (handle) {\n        userptr.gl_handle = handle;\n#ifdef __APPLE__\n        userptr.gl_get_proc_address_ptr = NULL;\n#elif GLAD_PLATFORM_WIN32\n        userptr.gl_get_proc_address_ptr =\n            (GLADglprocaddrfunc) glad_dlsym_handle(handle, \"wglGetProcAddress\");\n#else\n        userptr.gl_get_proc_address_ptr =\n            (GLADglprocaddrfunc) glad_dlsym_handle(handle, \"glXGetProcAddressARB\");\n#endif\n        version = gladLoadGLUserPtr(glad_gl_get_proc, &userptr);\n\n        glad_close_dlopen_handle(handle);\n    }\n\n    return version;\n}\n\n\n#endif /* GLAD_GL */\n"
  },
  {
    "path": "ycb_render/glad/glad/egl.h",
    "content": "/**\n * Loader generated by glad 0.1.11a0 on Wed Jun 13 07:59:54 2018\n *\n * Generator: C/C++\n * Specification: egl\n * Extensions: 7\n *\n * APIs:\n *  - egl=1.5\n *\n * Options:\n *  - HEADER_ONLY = False\n *  - DEBUG = False\n *  - MX = False\n *  - LOADER = True\n *  - MX_GLOBAL = False\n *  - ALIAS = False\n *\n * Commandline:\n *    --api='egl=1.5' --extensions='EGL_EXT_platform_device,EGL_EXT_platform_base,EGL_NV_device_cuda,EGL_EXT_device_enumeration,EGL_EXT_device_query,EGL_EXT_device_base,EGL_NV_cuda_event' c --loader\n *\n * Online:\n *    http://glad2.dav1d.de/#merge=off&api=egl%3D1.5&extensions=EGL_EXT_platform_device%2CEGL_EXT_platform_base%2CEGL_NV_device_cuda%2CEGL_EXT_device_enumeration%2CEGL_EXT_device_query%2CEGL_EXT_device_base%2CEGL_NV_cuda_event&generator=c&header_only=off&debug=off&mx=off&loader=on&mx_global=off&alias=off\n *\n */\n\n#ifndef GLAD_EGL_H_\n#define GLAD_EGL_H_\n\n\n#define GLAD_EGL\n#define GLAD_OPTION_EGL_LOADER\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef GLAD_PLATFORM_H_\n#define GLAD_PLATFORM_H_\n\n#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)\n  #define GLAD_PLATFORM_WIN32 1\n#else\n  #define GLAD_PLATFORM_WIN32 0\n#endif\n\n\n#ifndef GLAD_PLATFORM_UWP\n  #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY)\n    #ifdef __has_include\n      #if __has_include(<winapifamily.h>)\n        #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1\n      #endif\n    #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_\n      #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1\n    #endif\n  #endif\n\n  #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY\n    #include <winapifamily.h>\n    #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)\n      #define GLAD_PLATFORM_UWP 1\n    #endif\n  #endif\n\n  #ifndef GLAD_PLATFORM_UWP\n    #define GLAD_PLATFORM_UWP 0\n  #endif\n#endif\n\n#ifdef __GNUC__\n  #define GLAD_GNUC_EXTENSION __extension__\n#else\n  #define GLAD_GNUC_EXTENSION\n#endif\n\n#ifndef GLAD_API_CALL\n  #if defined(GLAD_API_CALL_EXPORT)\n    #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__)\n      #if defined(GLAD_API_CALL_EXPORT_BUILD)\n        #if defined(__GNUC__)\n          #define GLAD_API_CALL __attribute__ ((dllexport)) extern\n        #else\n          #define GLAD_API_CALL __declspec(dllexport) extern\n        #endif\n      #else\n        #if defined(__GNUC__)\n          #define GLAD_API_CALL __attribute__ ((dllimport)) extern\n        #else\n          #define GLAD_API_CALL __declspec(dllimport) extern\n        #endif\n      #endif\n    #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD)\n      #define GLAD_API_CALL __attribute__ ((visibility (\"default\"))) extern\n    #else\n      #define GLAD_API_CALL extern\n    #endif\n  #else\n    #define GLAD_API_CALL extern\n  #endif\n#endif\n\n#ifdef APIENTRY\n  #define GLAD_API_PTR APIENTRY\n#elif GLAD_PLATFORM_WIN32\n  #define GLAD_API_PTR __stdcall\n#else\n  #define GLAD_API_PTR\n#endif\n\n\n#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor)\n#define GLAD_VERSION_MAJOR(version) (version / 10000)\n#define GLAD_VERSION_MINOR(version) (version % 10000)\n\ntypedef void (*GLADapiproc)(void);\n\ntypedef GLADapiproc (*GLADloadfunc)(const char *name);\ntypedef GLADapiproc (*GLADuserptrloadfunc)(const char *name, void *userptr);\n\ntypedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...);\ntypedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...);\n\n#endif /* GLAD_PLATFORM_H_ */\n\n#define EGL_VERSION 0x3054\n#define EGL_CONFIG_CAVEAT 0x3027\n#define EGL_NATIVE_VISUAL_ID 0x302E\n#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2\n#define EGL_NATIVE_RENDERABLE 0x302D\n#define EGL_BAD_SURFACE 0x300D\n#define EGL_MULTISAMPLE_RESOLVE 0x3099\n#define EGL_PIXEL_ASPECT_RATIO 0x3092\n#define EGL_BLUE_SIZE 0x3022\n#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5\n#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD\n#define EGL_BAD_ALLOC 0x3003\n#define EGL_SAMPLES 0x3031\n#define EGL_SYNC_TYPE 0x30F7\n#define EGL_LUMINANCE_SIZE 0x303D\n#define EGL_PBUFFER_BIT 0x0001\n#define EGL_ALPHA_FORMAT_NONPRE EGL_VG_ALPHA_FORMAT_NONPRE\n#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B\n#define EGL_CONTEXT_LOST 0x300E\n#define EGL_BUFFER_PRESERVED 0x3094\n#define EGL_GL_COLORSPACE_LINEAR EGL_COLORSPACE_LINEAR\n#define EGL_SAMPLE_BUFFERS 0x3032\n#define EGL_GL_RENDERBUFFER 0x30B9\n#define EGL_UNSIGNALED 0x30F3\n#define EGL_OPENGL_ES_API 0x30A0\n#define EGL_EXTENSIONS 0x3055\n#define EGL_GL_TEXTURE_2D 0x30B1\n#define EGL_BACK_BUFFER 0x3084\n#define EGL_SYNC_CONDITION 0x30F8\n#define EGL_BAD_NATIVE_PIXMAP 0x300A\n#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0\n#define EGL_TEXTURE_2D 0x305F\n#define EGL_CONFORMANT 0x3042\n#define EGL_PIXMAP_BIT 0x0002\n#define EGL_SLOW_CONFIG 0x3050\n#define EGL_CL_EVENT_HANDLE 0x309C\n#define EGL_BAD_CURRENT_SURFACE 0x3007\n#define EGL_BIND_TO_TEXTURE_RGBA 0x303A\n#define EGL_VG_COLORSPACE_sRGB EGL_COLORSPACE_sRGB\n#define EGL_IMAGE_PRESERVED 0x30D2\n#define EGL_SURFACE_TYPE 0x3033\n#define EGL_OPENVG_BIT 0x0002\n#define EGL_VERTICAL_RESOLUTION 0x3091\n#define EGL_MAX_PBUFFER_PIXELS 0x302B\n#define EGL_DEVICE_EXT 0x322C\n#define EGL_SWAP_BEHAVIOR 0x3093\n#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200\n#define EGL_VG_ALPHA_FORMAT 0x3088\n#define EGL_RENDER_BUFFER 0x3086\n#define EGL_VG_COLORSPACE 0x3087\n#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0)\n#define EGL_OPENGL_API 0x30A2\n#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7\n#define EGL_LUMINANCE_BUFFER 0x308F\n#define EGL_NO_RESET_NOTIFICATION 0x31BE\n#define EGL_COLORSPACE_sRGB 0x3089\n#define EGL_OPENGL_ES_BIT 0x0001\n#define EGL_BAD_ACCESS 0x3002\n#define EGL_OPENGL_ES2_BIT 0x0004\n#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF\n#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0)\n#define EGL_NO_DEVICE_EXT EGL_CAST(EGLDeviceEXT,0)\n#define EGL_BAD_CONFIG 0x3005\n#define EGL_NO_TEXTURE 0x305C\n#define EGL_LARGEST_PBUFFER 0x3058\n#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400\n#define EGL_ALPHA_FORMAT EGL_VG_ALPHA_FORMAT\n#define EGL_ALPHA_MASK_SIZE 0x303E\n#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4\n#define EGL_CUDA_DEVICE_NV 0x323A\n#define EGL_VENDOR 0x3053\n#define EGL_STENCIL_SIZE 0x3026\n#define EGL_BAD_ATTRIBUTE 0x3004\n#define EGL_DRAW 0x3059\n#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001\n#define EGL_COLORSPACE EGL_VG_COLORSPACE\n#define EGL_SYNC_CUDA_EVENT_NV 0x323C\n#define EGL_OPENVG_IMAGE 0x3096\n#define EGL_NO_IMAGE EGL_CAST(EGLImage,0)\n#define EGL_TEXTURE_TARGET 0x3081\n#define EGL_CORE_NATIVE_ENGINE 0x305B\n#define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0)\n#define EGL_SIGNALED 0x30F2\n#define EGL_GL_COLORSPACE 0x309D\n#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0\n#define EGL_WIDTH 0x3057\n#define EGL_TRANSPARENT_RGB 0x3052\n#define EGL_SYNC_FENCE 0x30F9\n#define EGL_RENDERABLE_TYPE 0x3040\n#define EGL_TRANSPARENT_BLUE_VALUE 0x3035\n#define EGL_MAX_SWAP_INTERVAL 0x303C\n#define EGL_HEIGHT 0x3056\n#define EGL_TRANSPARENT_TYPE 0x3034\n#define EGL_DEPTH_SIZE 0x3025\n#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD\n#define EGL_FOREVER 0xFFFFFFFFFFFFFFFF\n#define EGL_NATIVE_VISUAL_TYPE 0x302F\n#define EGL_GREEN_SIZE 0x3023\n#define EGL_DISPLAY_SCALING 10000\n#define EGL_WINDOW_BIT 0x0004\n#define EGL_BIND_TO_TEXTURE_RGB 0x3039\n#define EGL_VG_COLORSPACE_LINEAR EGL_COLORSPACE_LINEAR\n#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001\n#define EGL_BAD_DISPLAY 0x3008\n#define EGL_CONDITION_SATISFIED 0x30F6\n#define EGL_SYNC_CL_EVENT 0x30FE\n#define EGL_COLORSPACE_LINEAR 0x308A\n#define EGL_NONE 0x3038\n#define EGL_MATCH_NATIVE_PIXMAP 0x3041\n#define EGL_MIPMAP_LEVEL 0x3083\n#define EGL_PLATFORM_DEVICE_EXT 0x313F\n#define EGL_BAD_CONTEXT 0x3006\n#define EGL_MIN_SWAP_INTERVAL 0x303B\n#define EGL_BAD_DEVICE_EXT 0x322B\n#define EGL_FALSE 0\n#define EGL_TEXTURE_FORMAT 0x3080\n#define EGL_GL_TEXTURE_3D 0x30B2\n#define EGL_COLOR_BUFFER_TYPE 0x303F\n#define EGL_MAX_PBUFFER_WIDTH 0x302C\n#define EGL_SINGLE_BUFFER 0x3085\n#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002\n#define EGL_ALPHA_SIZE 0x3021\n#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A\n#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020\n#define EGL_SYNC_STATUS 0x30F1\n#define EGL_TRUE 1\n#define EGL_TIMEOUT_EXPIRED 0x30F5\n#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0)\n#define EGL_RED_SIZE 0x3024\n#define EGL_TEXTURE_RGBA 0x305E\n#define EGL_TRANSPARENT_GREEN_VALUE 0x3036\n#define EGL_GL_TEXTURE_ZOFFSET 0x30BD\n#define EGL_ALPHA_FORMAT_PRE EGL_VG_ALPHA_FORMAT_PRE\n#define EGL_UNKNOWN EGL_CAST(EGLint,-1)\n#define EGL_SUCCESS 0x3000\n#define EGL_CONTEXT_CLIENT_VERSION 0x3098\n#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3\n#define EGL_SYNC_CUDA_EVENT_COMPLETE_NV 0x323D\n#define EGL_BUFFER_SIZE 0x3020\n#define EGL_MAX_PBUFFER_HEIGHT 0x302A\n#define EGL_HORIZONTAL_RESOLUTION 0x3090\n#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF\n#define EGL_LEVEL 0x3029\n#define EGL_CONTEXT_MAJOR_VERSION EGL_CONTEXT_CLIENT_VERSION\n#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040\n#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8\n#define EGL_READ 0x305A\n#define EGL_BAD_PARAMETER 0x300C\n#define EGL_RGB_BUFFER 0x308E\n#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B\n#define EGL_NON_CONFORMANT_CONFIG 0x3051\n#define EGL_MIPMAP_TEXTURE 0x3082\n#define EGL_CONFIG_ID 0x3028\n#define EGL_CONTEXT_MINOR_VERSION 0x30FB\n#define EGL_TRANSPARENT_RED_VALUE 0x3037\n#define EGL_BUFFER_DESTROYED 0x3095\n#define EGL_CONTEXT_CLIENT_TYPE 0x3097\n#define EGL_BAD_NATIVE_WINDOW 0x300B\n#define EGL_OPENGL_BIT 0x0008\n#define EGL_OPENVG_API 0x30A1\n#define EGL_OPENGL_ES3_BIT 0x00000040\n#define EGL_BAD_MATCH 0x3009\n#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1\n#define EGL_TEXTURE_RGB 0x305D\n#define EGL_CLIENT_APIS 0x308D\n#define EGL_GL_TEXTURE_LEVEL 0x30BC\n#define EGL_NOT_INITIALIZED 0x3001\n#define EGL_NO_SYNC EGL_CAST(EGLSync,0)\n#define EGL_VG_ALPHA_FORMAT_PRE 0x308C\n#define EGL_DONT_CARE EGL_CAST(EGLint,-1)\n#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6\n#define EGL_GL_COLORSPACE_SRGB EGL_COLORSPACE_sRGB\n#define EGL_CUDA_EVENT_HANDLE_NV 0x323B\n\n\n#include <KHR/khrplatform.h>\n#include <EGL/eglplatform.h>\n\n\n\n\n\n\n\n\n\n\n\nstruct AHardwareBuffer;\n\ntypedef unsigned int EGLBoolean;\ntypedef unsigned int EGLenum;\ntypedef intptr_t EGLAttribKHR;\ntypedef intptr_t EGLAttrib;\ntypedef void *EGLClientBuffer;\ntypedef void *EGLConfig;\ntypedef void *EGLContext;\ntypedef void *EGLDeviceEXT;\ntypedef void *EGLDisplay;\ntypedef void *EGLImage;\ntypedef void *EGLImageKHR;\ntypedef void *EGLLabelKHR;\ntypedef void *EGLObjectKHR;\ntypedef void *EGLOutputLayerEXT;\ntypedef void *EGLOutputPortEXT;\ntypedef void *EGLStreamKHR;\ntypedef void *EGLSurface;\ntypedef void *EGLSync;\ntypedef void *EGLSyncKHR;\ntypedef void *EGLSyncNV;\ntypedef void (*__eglMustCastToProperFunctionPointerType)(void);\ntypedef khronos_utime_nanoseconds_t EGLTimeKHR;\ntypedef khronos_utime_nanoseconds_t EGLTime;\ntypedef khronos_utime_nanoseconds_t EGLTimeNV;\ntypedef khronos_utime_nanoseconds_t EGLuint64NV;\ntypedef khronos_uint64_t EGLuint64KHR;\ntypedef khronos_stime_nanoseconds_t EGLnsecsANDROID;\ntypedef int EGLNativeFileDescriptorKHR;\ntypedef khronos_ssize_t EGLsizeiANDROID;\ntypedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize);\ntypedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize);\nstruct EGLClientPixmapHI {\n    void  *pData;\n    EGLint iWidth;\n    EGLint iHeight;\n    EGLint iStride;\n};\ntypedef void (GLAD_API_PTR *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message);\n\n\n#define EGL_VERSION_1_0 1\nGLAD_API_CALL int GLAD_EGL_VERSION_1_0;\n#define EGL_VERSION_1_1 1\nGLAD_API_CALL int GLAD_EGL_VERSION_1_1;\n#define EGL_VERSION_1_2 1\nGLAD_API_CALL int GLAD_EGL_VERSION_1_2;\n#define EGL_VERSION_1_3 1\nGLAD_API_CALL int GLAD_EGL_VERSION_1_3;\n#define EGL_VERSION_1_4 1\nGLAD_API_CALL int GLAD_EGL_VERSION_1_4;\n#define EGL_VERSION_1_5 1\nGLAD_API_CALL int GLAD_EGL_VERSION_1_5;\n#define EGL_EXT_platform_device 1\nGLAD_API_CALL int GLAD_EGL_EXT_platform_device;\n#define EGL_EXT_platform_base 1\nGLAD_API_CALL int GLAD_EGL_EXT_platform_base;\n#define EGL_NV_device_cuda 1\nGLAD_API_CALL int GLAD_EGL_NV_device_cuda;\n#define EGL_EXT_device_enumeration 1\nGLAD_API_CALL int GLAD_EGL_EXT_device_enumeration;\n#define EGL_EXT_device_query 1\nGLAD_API_CALL int GLAD_EGL_EXT_device_query;\n#define EGL_EXT_device_base 1\nGLAD_API_CALL int GLAD_EGL_EXT_device_base;\n#define EGL_NV_cuda_event 1\nGLAD_API_CALL int GLAD_EGL_NV_cuda_event;\n\n\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYDEVICESEXTPROC)(EGLint   max_devices, EGLDeviceEXT  * devices, EGLint  * num_devices);\ntypedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPBUFFERSURFACEPROC)(EGLDisplay   dpy, EGLConfig   config, const  EGLint  * attrib_list);\ntypedef EGLint (GLAD_API_PTR *PFNEGLGETERRORPROC)(void);\ntypedef __eglMustCastToProperFunctionPointerType (GLAD_API_PTR *PFNEGLGETPROCADDRESSPROC)(const char * procname);\ntypedef EGLDisplay (GLAD_API_PTR *PFNEGLGETCURRENTDISPLAYPROC)(void);\ntypedef EGLenum (GLAD_API_PTR *PFNEGLQUERYAPIPROC)(void);\ntypedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC)(EGLDisplay   dpy, EGLConfig   config, void * native_pixmap, const  EGLAttrib  * attrib_list);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYDISPLAYATTRIBKHRPROC)(EGLDisplay   dpy, EGLint   name, EGLAttrib  * value);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYSYNCPROC)(EGLDisplay   dpy, EGLSync   sync);\ntypedef EGLImage (GLAD_API_PTR *PFNEGLCREATEIMAGEPROC)(EGLDisplay   dpy, EGLContext   ctx, EGLenum   target, EGLClientBuffer   buffer, const  EGLAttrib  * attrib_list);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYCONTEXTPROC)(EGLDisplay   dpy, EGLContext   ctx, EGLint   attribute, EGLint  * value);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLSWAPBUFFERSPROC)(EGLDisplay   dpy, EGLSurface   surface);\ntypedef EGLContext (GLAD_API_PTR *PFNEGLCREATECONTEXTPROC)(EGLDisplay   dpy, EGLConfig   config, EGLContext   share_context, const  EGLint  * attrib_list);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLCHOOSECONFIGPROC)(EGLDisplay   dpy, const  EGLint  * attrib_list, EGLConfig  * configs, EGLint   config_size, EGLint  * num_config);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLBINDAPIPROC)(EGLenum   api);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITNATIVEPROC)(EGLint   engine);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLTERMINATEPROC)(EGLDisplay   dpy);\ntypedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC)(EGLDisplay   dpy, EGLConfig   config, void * native_pixmap, const  EGLint  * attrib_list);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLRELEASETHREADPROC)(void);\ntypedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMWINDOWSURFACEPROC)(EGLDisplay   dpy, EGLConfig   config, void * native_window, const  EGLAttrib  * attrib_list);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLGETCONFIGATTRIBPROC)(EGLDisplay   dpy, EGLConfig   config, EGLint   attribute, EGLint  * value);\ntypedef EGLSurface (GLAD_API_PTR *PFNEGLGETCURRENTSURFACEPROC)(EGLint   readdraw);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLCOPYBUFFERSPROC)(EGLDisplay   dpy, EGLSurface   surface, EGLNativePixmapType   target);\ntypedef EGLDisplay (GLAD_API_PTR *PFNEGLGETPLATFORMDISPLAYEXTPROC)(EGLenum   platform, void * native_display, const  EGLint  * attrib_list);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYDEVICEATTRIBEXTPROC)(EGLDeviceEXT   device, EGLint   attribute, EGLAttrib  * value);\ntypedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPIXMAPSURFACEPROC)(EGLDisplay   dpy, EGLConfig   config, EGLNativePixmapType   pixmap, const  EGLint  * attrib_list);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLBINDTEXIMAGEPROC)(EGLDisplay   dpy, EGLSurface   surface, EGLint   buffer);\ntypedef EGLDisplay (GLAD_API_PTR *PFNEGLGETPLATFORMDISPLAYPROC)(EGLenum   platform, void * native_display, const  EGLAttrib  * attrib_list);\ntypedef EGLDisplay (GLAD_API_PTR *PFNEGLGETDISPLAYPROC)(EGLNativeDisplayType   display_id);\ntypedef const char * (GLAD_API_PTR *PFNEGLQUERYSTRINGPROC)(EGLDisplay   dpy, EGLint   name);\ntypedef EGLint (GLAD_API_PTR *PFNEGLCLIENTWAITSYNCPROC)(EGLDisplay   dpy, EGLSync   sync, EGLint   flags, EGLTime   timeout);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITSYNCPROC)(EGLDisplay   dpy, EGLSync   sync, EGLint   flags);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYIMAGEPROC)(EGLDisplay   dpy, EGLImage   image);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLRELEASETEXIMAGEPROC)(EGLDisplay   dpy, EGLSurface   surface, EGLint   buffer);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYDISPLAYATTRIBEXTPROC)(EGLDisplay   dpy, EGLint   attribute, EGLAttrib  * value);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYCONTEXTPROC)(EGLDisplay   dpy, EGLContext   ctx);\ntypedef const char * (GLAD_API_PTR *PFNEGLQUERYDEVICESTRINGEXTPROC)(EGLDeviceEXT   device, EGLint   name);\ntypedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEWINDOWSURFACEPROC)(EGLDisplay   dpy, EGLConfig   config, EGLNativeWindowType   win, const  EGLint  * attrib_list);\ntypedef EGLContext (GLAD_API_PTR *PFNEGLGETCURRENTCONTEXTPROC)(void);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLINITIALIZEPROC)(EGLDisplay   dpy, EGLint  * major, EGLint  * minor);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYSURFACEPROC)(EGLDisplay   dpy, EGLSurface   surface);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLMAKECURRENTPROC)(EGLDisplay   dpy, EGLSurface   draw, EGLSurface   read, EGLContext   ctx);\ntypedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)(EGLDisplay   dpy, EGLConfig   config, void * native_window, const  EGLint  * attrib_list);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLSWAPINTERVALPROC)(EGLDisplay   dpy, EGLint   interval);\ntypedef EGLSync (GLAD_API_PTR *PFNEGLCREATESYNCPROC)(EGLDisplay   dpy, EGLenum   type, const  EGLAttrib  * attrib_list);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLGETSYNCATTRIBPROC)(EGLDisplay   dpy, EGLSync   sync, EGLint   attribute, EGLAttrib  * value);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLSURFACEATTRIBPROC)(EGLDisplay   dpy, EGLSurface   surface, EGLint   attribute, EGLint   value);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITGLPROC)(void);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYSURFACEPROC)(EGLDisplay   dpy, EGLSurface   surface, EGLint   attribute, EGLint  * value);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLGETCONFIGSPROC)(EGLDisplay   dpy, EGLConfig  * configs, EGLint   config_size, EGLint  * num_config);\ntypedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITCLIENTPROC)(void);\ntypedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC)(EGLDisplay   dpy, EGLenum   buftype, EGLClientBuffer   buffer, EGLConfig   config, const  EGLint  * attrib_list);\n\nGLAD_API_CALL PFNEGLQUERYDEVICESEXTPROC glad_eglQueryDevicesEXT;\n#define eglQueryDevicesEXT glad_eglQueryDevicesEXT\nGLAD_API_CALL PFNEGLCREATEPBUFFERSURFACEPROC glad_eglCreatePbufferSurface;\n#define eglCreatePbufferSurface glad_eglCreatePbufferSurface\nGLAD_API_CALL PFNEGLGETERRORPROC glad_eglGetError;\n#define eglGetError glad_eglGetError\nGLAD_API_CALL PFNEGLGETPROCADDRESSPROC glad_eglGetProcAddress;\n#define eglGetProcAddress glad_eglGetProcAddress\nGLAD_API_CALL PFNEGLGETCURRENTDISPLAYPROC glad_eglGetCurrentDisplay;\n#define eglGetCurrentDisplay glad_eglGetCurrentDisplay\nGLAD_API_CALL PFNEGLQUERYAPIPROC glad_eglQueryAPI;\n#define eglQueryAPI glad_eglQueryAPI\nGLAD_API_CALL PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC glad_eglCreatePlatformPixmapSurface;\n#define eglCreatePlatformPixmapSurface glad_eglCreatePlatformPixmapSurface\nGLAD_API_CALL PFNEGLQUERYDISPLAYATTRIBKHRPROC glad_eglQueryDisplayAttribKHR;\n#define eglQueryDisplayAttribKHR glad_eglQueryDisplayAttribKHR\nGLAD_API_CALL PFNEGLDESTROYSYNCPROC glad_eglDestroySync;\n#define eglDestroySync glad_eglDestroySync\nGLAD_API_CALL PFNEGLCREATEIMAGEPROC glad_eglCreateImage;\n#define eglCreateImage glad_eglCreateImage\nGLAD_API_CALL PFNEGLQUERYCONTEXTPROC glad_eglQueryContext;\n#define eglQueryContext glad_eglQueryContext\nGLAD_API_CALL PFNEGLSWAPBUFFERSPROC glad_eglSwapBuffers;\n#define eglSwapBuffers glad_eglSwapBuffers\nGLAD_API_CALL PFNEGLCREATECONTEXTPROC glad_eglCreateContext;\n#define eglCreateContext glad_eglCreateContext\nGLAD_API_CALL PFNEGLCHOOSECONFIGPROC glad_eglChooseConfig;\n#define eglChooseConfig glad_eglChooseConfig\nGLAD_API_CALL PFNEGLBINDAPIPROC glad_eglBindAPI;\n#define eglBindAPI glad_eglBindAPI\nGLAD_API_CALL PFNEGLWAITNATIVEPROC glad_eglWaitNative;\n#define eglWaitNative glad_eglWaitNative\nGLAD_API_CALL PFNEGLTERMINATEPROC glad_eglTerminate;\n#define eglTerminate glad_eglTerminate\nGLAD_API_CALL PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC glad_eglCreatePlatformPixmapSurfaceEXT;\n#define eglCreatePlatformPixmapSurfaceEXT glad_eglCreatePlatformPixmapSurfaceEXT\nGLAD_API_CALL PFNEGLRELEASETHREADPROC glad_eglReleaseThread;\n#define eglReleaseThread glad_eglReleaseThread\nGLAD_API_CALL PFNEGLCREATEPLATFORMWINDOWSURFACEPROC glad_eglCreatePlatformWindowSurface;\n#define eglCreatePlatformWindowSurface glad_eglCreatePlatformWindowSurface\nGLAD_API_CALL PFNEGLGETCONFIGATTRIBPROC glad_eglGetConfigAttrib;\n#define eglGetConfigAttrib glad_eglGetConfigAttrib\nGLAD_API_CALL PFNEGLGETCURRENTSURFACEPROC glad_eglGetCurrentSurface;\n#define eglGetCurrentSurface glad_eglGetCurrentSurface\nGLAD_API_CALL PFNEGLCOPYBUFFERSPROC glad_eglCopyBuffers;\n#define eglCopyBuffers glad_eglCopyBuffers\nGLAD_API_CALL PFNEGLGETPLATFORMDISPLAYEXTPROC glad_eglGetPlatformDisplayEXT;\n#define eglGetPlatformDisplayEXT glad_eglGetPlatformDisplayEXT\nGLAD_API_CALL PFNEGLQUERYDEVICEATTRIBEXTPROC glad_eglQueryDeviceAttribEXT;\n#define eglQueryDeviceAttribEXT glad_eglQueryDeviceAttribEXT\nGLAD_API_CALL PFNEGLCREATEPIXMAPSURFACEPROC glad_eglCreatePixmapSurface;\n#define eglCreatePixmapSurface glad_eglCreatePixmapSurface\nGLAD_API_CALL PFNEGLBINDTEXIMAGEPROC glad_eglBindTexImage;\n#define eglBindTexImage glad_eglBindTexImage\nGLAD_API_CALL PFNEGLGETPLATFORMDISPLAYPROC glad_eglGetPlatformDisplay;\n#define eglGetPlatformDisplay glad_eglGetPlatformDisplay\nGLAD_API_CALL PFNEGLGETDISPLAYPROC glad_eglGetDisplay;\n#define eglGetDisplay glad_eglGetDisplay\nGLAD_API_CALL PFNEGLQUERYSTRINGPROC glad_eglQueryString;\n#define eglQueryString glad_eglQueryString\nGLAD_API_CALL PFNEGLCLIENTWAITSYNCPROC glad_eglClientWaitSync;\n#define eglClientWaitSync glad_eglClientWaitSync\nGLAD_API_CALL PFNEGLWAITSYNCPROC glad_eglWaitSync;\n#define eglWaitSync glad_eglWaitSync\nGLAD_API_CALL PFNEGLDESTROYIMAGEPROC glad_eglDestroyImage;\n#define eglDestroyImage glad_eglDestroyImage\nGLAD_API_CALL PFNEGLRELEASETEXIMAGEPROC glad_eglReleaseTexImage;\n#define eglReleaseTexImage glad_eglReleaseTexImage\nGLAD_API_CALL PFNEGLQUERYDISPLAYATTRIBEXTPROC glad_eglQueryDisplayAttribEXT;\n#define eglQueryDisplayAttribEXT glad_eglQueryDisplayAttribEXT\nGLAD_API_CALL PFNEGLDESTROYCONTEXTPROC glad_eglDestroyContext;\n#define eglDestroyContext glad_eglDestroyContext\nGLAD_API_CALL PFNEGLQUERYDEVICESTRINGEXTPROC glad_eglQueryDeviceStringEXT;\n#define eglQueryDeviceStringEXT glad_eglQueryDeviceStringEXT\nGLAD_API_CALL PFNEGLCREATEWINDOWSURFACEPROC glad_eglCreateWindowSurface;\n#define eglCreateWindowSurface glad_eglCreateWindowSurface\nGLAD_API_CALL PFNEGLGETCURRENTCONTEXTPROC glad_eglGetCurrentContext;\n#define eglGetCurrentContext glad_eglGetCurrentContext\nGLAD_API_CALL PFNEGLINITIALIZEPROC glad_eglInitialize;\n#define eglInitialize glad_eglInitialize\nGLAD_API_CALL PFNEGLDESTROYSURFACEPROC glad_eglDestroySurface;\n#define eglDestroySurface glad_eglDestroySurface\nGLAD_API_CALL PFNEGLMAKECURRENTPROC glad_eglMakeCurrent;\n#define eglMakeCurrent glad_eglMakeCurrent\nGLAD_API_CALL PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC glad_eglCreatePlatformWindowSurfaceEXT;\n#define eglCreatePlatformWindowSurfaceEXT glad_eglCreatePlatformWindowSurfaceEXT\nGLAD_API_CALL PFNEGLSWAPINTERVALPROC glad_eglSwapInterval;\n#define eglSwapInterval glad_eglSwapInterval\nGLAD_API_CALL PFNEGLCREATESYNCPROC glad_eglCreateSync;\n#define eglCreateSync glad_eglCreateSync\nGLAD_API_CALL PFNEGLGETSYNCATTRIBPROC glad_eglGetSyncAttrib;\n#define eglGetSyncAttrib glad_eglGetSyncAttrib\nGLAD_API_CALL PFNEGLSURFACEATTRIBPROC glad_eglSurfaceAttrib;\n#define eglSurfaceAttrib glad_eglSurfaceAttrib\nGLAD_API_CALL PFNEGLWAITGLPROC glad_eglWaitGL;\n#define eglWaitGL glad_eglWaitGL\nGLAD_API_CALL PFNEGLQUERYSURFACEPROC glad_eglQuerySurface;\n#define eglQuerySurface glad_eglQuerySurface\nGLAD_API_CALL PFNEGLGETCONFIGSPROC glad_eglGetConfigs;\n#define eglGetConfigs glad_eglGetConfigs\nGLAD_API_CALL PFNEGLWAITCLIENTPROC glad_eglWaitClient;\n#define eglWaitClient glad_eglWaitClient\nGLAD_API_CALL PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC glad_eglCreatePbufferFromClientBuffer;\n#define eglCreatePbufferFromClientBuffer glad_eglCreatePbufferFromClientBuffer\n\n\nGLAD_API_CALL int gladLoadEGLUserPtr(EGLDisplay display, GLADuserptrloadfunc load, void *userptr);\nGLAD_API_CALL int gladLoadEGL(EGLDisplay display, GLADloadfunc load);\n\n\n\n\n#ifdef GLAD_EGL\n\nGLAD_API_CALL int gladLoaderLoadEGL(EGLDisplay display);\n\nGLAD_API_CALL void gladLoaderUnloadEGL(void);\n\n#endif\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "ycb_render/glad/glad/gl.h",
    "content": "/**\n * Loader generated by glad 0.1.11a0 on Wed Jun 13 07:59:51 2018\n *\n * Generator: C/C++\n * Specification: gl\n * Extensions: 1\n *\n * APIs:\n *  - gl:compatibility=4.6\n *\n * Options:\n *  - LOADER = True\n *  - DEBUG = False\n *  - ALIAS = False\n *  - MX = False\n *  - HEADER_ONLY = False\n *  - MX_GLOBAL = False\n *\n * Commandline:\n *    --api='gl:compatibility=4.6' --extensions='GL_ARB_point_sprite' c --loader\n *\n * Online:\n *    http://glad2.dav1d.de/#merge=off&api=gl%3Acompatibility%3D4.6&extensions=GL_ARB_point_sprite&generator=c&loader=on&debug=off&alias=off&mx=off&header_only=off&mx_global=off\n *\n */\n\n#ifndef GLAD_GL_H_\n#define GLAD_GL_H_\n\n#ifdef __gl_h_\n    #error OpenGL header already included (API: gl), remove previous include!\n#endif\n#define __gl_h_ 1\n\n\n#define GLAD_GL\n#define GLAD_OPTION_GL_LOADER\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef GLAD_PLATFORM_H_\n#define GLAD_PLATFORM_H_\n\n#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)\n  #define GLAD_PLATFORM_WIN32 1\n#else\n  #define GLAD_PLATFORM_WIN32 0\n#endif\n\n\n#ifndef GLAD_PLATFORM_UWP\n  #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY)\n    #ifdef __has_include\n      #if __has_include(<winapifamily.h>)\n        #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1\n      #endif\n    #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_\n      #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1\n    #endif\n  #endif\n\n  #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY\n    #include <winapifamily.h>\n    #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)\n      #define GLAD_PLATFORM_UWP 1\n    #endif\n  #endif\n\n  #ifndef GLAD_PLATFORM_UWP\n    #define GLAD_PLATFORM_UWP 0\n  #endif\n#endif\n\n#ifdef __GNUC__\n  #define GLAD_GNUC_EXTENSION __extension__\n#else\n  #define GLAD_GNUC_EXTENSION\n#endif\n\n#ifndef GLAD_API_CALL\n  #if defined(GLAD_API_CALL_EXPORT)\n    #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__)\n      #if defined(GLAD_API_CALL_EXPORT_BUILD)\n        #if defined(__GNUC__)\n          #define GLAD_API_CALL __attribute__ ((dllexport)) extern\n        #else\n          #define GLAD_API_CALL __declspec(dllexport) extern\n        #endif\n      #else\n        #if defined(__GNUC__)\n          #define GLAD_API_CALL __attribute__ ((dllimport)) extern\n        #else\n          #define GLAD_API_CALL __declspec(dllimport) extern\n        #endif\n      #endif\n    #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD)\n      #define GLAD_API_CALL __attribute__ ((visibility (\"default\"))) extern\n    #else\n      #define GLAD_API_CALL extern\n    #endif\n  #else\n    #define GLAD_API_CALL extern\n  #endif\n#endif\n\n#ifdef APIENTRY\n  #define GLAD_API_PTR APIENTRY\n#elif GLAD_PLATFORM_WIN32\n  #define GLAD_API_PTR __stdcall\n#else\n  #define GLAD_API_PTR\n#endif\n\n\n#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor)\n#define GLAD_VERSION_MAJOR(version) (version / 10000)\n#define GLAD_VERSION_MINOR(version) (version % 10000)\n\ntypedef void (*GLADapiproc)(void);\n\ntypedef GLADapiproc (*GLADloadfunc)(const char *name);\ntypedef GLADapiproc (*GLADuserptrloadfunc)(const char *name, void *userptr);\n\ntypedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...);\ntypedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...);\n\n#endif /* GLAD_PLATFORM_H_ */\n\n#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C\n#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263\n#define GL_PROJECTION_MATRIX 0x0BA7\n#define GL_MAP1_GRID_DOMAIN 0x0DD0\n#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE\n#define GL_MAX_ELEMENTS_INDICES 0x80E9\n#define GL_TEXTURE_INTENSITY_TYPE 0x8C15\n#define GL_TEXTURE31 0x84DF\n#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC\n#define GL_RGBA_MODE 0x0C31\n#define GL_ONE_MINUS_SRC_ALPHA 0x0303\n#define GL_SAMPLE_COVERAGE_INVERT 0x80AB\n#define GL_R32UI 0x8236\n#define GL_VERTEX_BINDING_BUFFER 0x8F4F\n#define GL_UNSIGNED_BYTE_3_3_2 0x8032\n#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067\n#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING\n#define GL_QUERY_WAIT 0x8E13\n#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88\n#define GL_MINOR_VERSION 0x821C\n#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056\n#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301\n#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB\n#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105\n#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D\n#define GL_MAX_LABEL_LENGTH 0x82E8\n#define GL_TEXTURE_DEPTH_SIZE 0x884A\n#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054\n#define GL_NOOP 0x1505\n#define GL_COLOR_MATERIAL 0x0B57\n#define GL_RG32UI 0x823C\n#define GL_READ_WRITE 0x88BA\n#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214\n#define GL_4D_COLOR_TEXTURE 0x0604\n#define GL_BUFFER_USAGE 0x8765\n#define GL_TEXTURE_GEN_MODE 0x2500\n#define GL_T2F_V3F 0x2A27\n#define GL_COLOR_ATTACHMENT26 0x8CFA\n#define GL_INT_SAMPLER_BUFFER 0x8DD0\n#define GL_R16F 0x822D\n#define GL_TEXTURE_BINDING_3D 0x806A\n#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2\n#define GL_DONT_CARE 0x1100\n#define GL_STREAM_READ 0x88E1\n#define GL_DOUBLE_VEC4 0x8FFE\n#define GL_FUNC_SUBTRACT 0x800A\n#define GL_ACCUM_GREEN_BITS 0x0D59\n#define GL_S 0x2000\n#define GL_POINT_SIZE_RANGE 0x0B12\n#define GL_CURRENT_SECONDARY_COLOR 0x8459\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43\n#define GL_DEPTH_RENDERABLE 0x8287\n#define GL_FOG_COORDINATE 0x8451\n#define GL_REPLACE 0x1E01\n#define GL_SAMPLE_SHADING 0x8C36\n#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC\n#define GL_MAX_RENDERBUFFER_SIZE 0x84E8\n#define GL_SEPARATE_SPECULAR_COLOR 0x81FA\n#define GL_LEQUAL 0x0203\n#define GL_INDEX_ARRAY_POINTER 0x8091\n#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF\n#define GL_OPERAND0_ALPHA 0x8598\n#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A\n#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123\n#define GL_LUMINANCE16 0x8042\n#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4\n#define GL_DEBUG_TYPE_POP_GROUP 0x826A\n#define GL_SHADER_STORAGE_BUFFER 0x90D2\n#define GL_INDEX_ARRAY_TYPE 0x8085\n#define GL_SCISSOR_BOX 0x0C10\n#define GL_IMAGE_CLASS_2_X_16 0x82BD\n#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF\n#define GL_OR 0x1507\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A\n#define GL_GREATER 0x0204\n#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A\n#define GL_VERTEX_BINDING_OFFSET 0x82D7\n#define GL_LIGHT_MODEL_AMBIENT 0x0B53\n#define GL_CW 0x0900\n#define GL_CONSTANT 0x8576\n#define GL_VIEW_CLASS_8_BITS 0x82CB\n#define GL_ALWAYS 0x0207\n#define GL_RENDERBUFFER_BINDING 0x8CA7\n#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061\n#define GL_PIXEL_MAP_I_TO_G 0x0C73\n#define GL_COMPARE_R_TO_TEXTURE 0x884E\n#define GL_LUMINANCE16_ALPHA16 0x8048\n#define GL_INT_IMAGE_2D_RECT 0x905A\n#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272\n#define GL_DEPTH_FUNC 0x0B74\n#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84\n#define GL_COMPRESSED_SLUMINANCE 0x8C4A\n#define GL_TEXTURE24 0x84D8\n#define GL_PACK_LSB_FIRST 0x0D01\n#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8\n#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306\n#define GL_COLOR_WRITEMASK 0x0C23\n#define GL_UNIFORM_BUFFER_START 0x8A29\n#define GL_CLEAR 0x1500\n#define GL_UNIFORM_BLOCK_INDEX 0x8A3A\n#define GL_VERTEX_TEXTURE 0x829B\n#define GL_TEXTURE_WRAP_T 0x2803\n#define GL_T2F_C4F_N3F_V3F 0x2A2C\n#define GL_LUMINANCE4_ALPHA4 0x8043\n#define GL_SAMPLER_2D 0x8B5E\n#define GL_MAX_VARYING_COMPONENTS MAX_VARYING_FLOATS\n#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B\n#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0\n#define GL_GEOMETRY_SHADER_BIT 0x00000004\n#define GL_DRAW_BUFFER7 0x882C\n#define GL_IMAGE_CLASS_4_X_8 0x82BF\n#define GL_POINT_SPRITE 0x8861\n#define GL_SOURCE1_RGB 0x8581\n#define GL_RGB 0x1907\n#define GL_RG16 0x822C\n#define GL_VIEWPORT_BIT 0x00000800\n#define GL_VERSION 0x1F02\n#define GL_SAMPLE_COVERAGE 0x80A0\n#define GL_INT_SAMPLER_2D_RECT 0x8DCD\n#define GL_RGB10_A2 0x8059\n#define GL_TESS_CONTROL_TEXTURE 0x829C\n#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2\n#define GL_TEXTURE_GREEN_SIZE 0x805D\n#define GL_TEXTURE2 0x84C2\n#define GL_NEGATIVE_ONE_TO_ONE 0x935E\n#define GL_QUADRATIC_ATTENUATION 0x1209\n#define GL_CLAMP_VERTEX_COLOR 0x891A\n#define GL_SAMPLES 0x80A9\n#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128\n#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623\n#define GL_CLEAR_TEXTURE 0x9365\n#define GL_MAX_NAME_LENGTH 0x92F6\n#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001\n#define GL_POLYGON_OFFSET_FILL 0x8037\n#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122\n#define GL_DEBUG_SOURCE_API 0x8246\n#define GL_INDEX_SHIFT 0x0D12\n#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB\n#define GL_SHADER 0x82E1\n#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F\n#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2\n#define GL_PROVOKING_VERTEX 0x8E4F\n#define GL_DEPTH_COMPONENT32F 0x8CAC\n#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212\n#define GL_MODULATE 0x2100\n#define GL_POLYGON_OFFSET_CLAMP 0x8E1B\n#define GL_FOG_COORDINATE_SOURCE 0x8450\n#define GL_FRAMEBUFFER_COMPLETE 0x8CD5\n#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291\n#define GL_SAMPLER_2D_SHADOW 0x8B62\n#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279\n#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D\n#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD\n#define GL_DEBUG_TYPE_ERROR 0x824C\n#define GL_DOUBLEBUFFER 0x0C32\n#define GL_SYNC_FLAGS 0x9115\n#define GL_SAMPLER_2D_MULTISAMPLE 0x9108\n#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800\n#define GL_AMBIENT 0x1200\n#define GL_SRC0_RGB GL_SOURCE0_RGB\n#define GL_EXP 0x0800\n#define GL_FIXED 0x140C\n#define GL_NOTEQUAL 0x0205\n#define GL_VIEW_CLASS_48_BITS 0x82C7\n#define GL_DEPTH_STENCIL 0x84F9\n#define GL_UNIFORM_TYPE 0x8A37\n#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D\n#define GL_RGBA32F 0x8814\n#define GL_MAX_NAME_STACK_DEPTH 0x0D37\n#define GL_BUFFER_MAP_OFFSET 0x9121\n#define GL_FOG_HINT 0x0C54\n#define GL_UNPACK_ALIGNMENT 0x0CF5\n#define GL_COLOR_LOGIC_OP 0x0BF2\n#define GL_VERTICES_SUBMITTED 0x82EE\n#define GL_STENCIL_INDEX4 0x8D47\n#define GL_PIXEL_MAP_G_TO_G 0x0C77\n#define GL_TEXTURE_1D 0x0DE0\n#define GL_NO_ERROR 0\n#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56\n#define GL_INTERLEAVED_ATTRIBS 0x8C8C\n#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C\n#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B\n#define GL_TRANSFORM_FEEDBACK 0x8E22\n#define GL_CLIP_DEPTH_MODE 0x935D\n#define GL_TEXTURE_SHARED_SIZE 0x8C3F\n#define GL_MAX 0x8008\n#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7\n#define GL_RENDER_MODE 0x0C40\n#define GL_COLOR_ATTACHMENT12 0x8CEC\n#define GL_LIST_BIT 0x00020000\n#define GL_DOT3_RGB 0x86AE\n#define GL_RG16I 0x8239\n#define GL_T2F_C4UB_V3F 0x2A29\n#define GL_INTERNALFORMAT_RED_SIZE 0x8271\n#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000\n#define GL_R11F_G11F_B10F 0x8C3A\n#define GL_TEXTURE27 0x84DB\n#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B\n#define GL_COEFF 0x0A00\n#define GL_MAP2_VERTEX_3 0x0DB7\n#define GL_QUERY 0x82E3\n#define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4\n#define GL_ALPHA_BITS 0x0D55\n#define GL_CURRENT_FOG_COORDINATE 0x8453\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0\n#define GL_SAMPLE_MASK_VALUE 0x8E52\n#define GL_LINEAR_MIPMAP_LINEAR 0x2703\n#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274\n#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC\n#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F\n#define GL_MAX_CULL_DISTANCES 0x82F9\n#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C\n#define GL_FLOAT_MAT2x4 0x8B66\n#define GL_FLOAT_VEC3 0x8B51\n#define GL_RENDERBUFFER 0x8D41\n#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49\n#define GL_SPIR_V_EXTENSIONS 0x9553\n#define GL_TEXTURE_COMPRESSION_HINT 0x84EF\n#define GL_TEXTURE4 0x84C4\n#define GL_VERTEX_ARRAY_POINTER 0x808E\n#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84\n#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB\n#define GL_COLOR_ATTACHMENT16 0x8CF0\n#define GL_ADD_SIGNED 0x8574\n#define GL_RENDERER 0x1F01\n#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6\n#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B\n#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3\n#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C\n#define GL_TESS_CONTROL_SHADER_BIT 0x00000008\n#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD\n#define GL_FILL 0x1B02\n#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213\n#define GL_INDEX_LOGIC_OP 0x0BF1\n#define GL_IMAGE_CLASS_1_X_8 0x82C1\n#define GL_RGB5_A1 0x8057\n#define GL_STENCIL_INDEX 0x1901\n#define GL_INT_IMAGE_2D 0x9058\n#define GL_FRAMEBUFFER_UNDEFINED 0x8219\n#define GL_ACCUM_RED_BITS 0x0D58\n#define GL_POLYGON_OFFSET_POINT 0x2A01\n#define GL_MAX_3D_TEXTURE_SIZE 0x8073\n#define GL_ZOOM_Y 0x0D17\n#define GL_DEBUG_SEVERITY_HIGH 0x9146\n#define GL_R16 0x822A\n#define GL_SCISSOR_TEST 0x0C11\n#define GL_RGB10_A2UI 0x906F\n#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6\n#define GL_FOG_BIT 0x00000080\n#define GL_GEOMETRY_TEXTURE 0x829E\n#define GL_UNIFORM_BLOCK 0x92E2\n#define GL_INT_SAMPLER_CUBE 0x8DCC\n#define GL_PACK_SKIP_PIXELS 0x0D04\n#define GL_TEXTURE_SHADOW 0x82A1\n#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC\n#define GL_RED_BITS 0x0D52\n#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F\n#define GL_COLOR_ATTACHMENT6 0x8CE6\n#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009\n#define GL_COLOR_INDEXES 0x1603\n#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4\n#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4\n#define GL_TEXTURE_WRAP_R 0x8072\n#define GL_TESS_GEN_SPACING 0x8E77\n#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36\n#define GL_INTENSITY16 0x804D\n#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24\n#define GL_COLOR_ATTACHMENT2 0x8CE2\n#define GL_WRITE_ONLY 0x88B9\n#define GL_GREEN_INTEGER 0x8D95\n#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7\n#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104\n#define GL_R8UI 0x8232\n#define GL_DRAW_BUFFER1 0x8826\n#define GL_PIXEL_MAP_I_TO_B 0x0C74\n#define GL_MEDIUM_INT 0x8DF4\n#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517\n#define GL_IMAGE_BINDING_LAYERED 0x8F3C\n#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803\n#define GL_RED_BIAS 0x0D15\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C\n#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004\n#define GL_FLOAT 0x1406\n#define GL_MAP_WRITE_BIT 0x0002\n#define GL_CONDITION_SATISFIED 0x911C\n#define GL_NUM_ACTIVE_VARIABLES 0x9304\n#define GL_PROGRAM_PIPELINE_BINDING 0x825A\n#define GL_OBJECT_PLANE 0x2501\n#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249\n#define GL_TEXTURE_ALPHA_SIZE 0x805F\n#define GL_COMPRESSED_LUMINANCE 0x84EA\n#define GL_FLOAT_MAT4x2 0x8B69\n#define GL_COLOR_ATTACHMENT19 0x8CF3\n#define GL_RGBA8I 0x8D8E\n#define GL_GEOMETRY_SUBROUTINE 0x92EB\n#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE\n#define GL_FEEDBACK 0x1C01\n#define GL_POLYGON_BIT 0x00000008\n#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5\n#define GL_ALPHA12 0x803D\n#define GL_TEXTURE_COMPRESSED 0x86A1\n#define GL_FRAMEBUFFER_BINDING 0x8CA6\n#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B\n#define GL_TEXTURE1 0x84C1\n#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3\n#define GL_DOUBLE_MAT3x2 0x8F4B\n#define GL_ONE_MINUS_DST_ALPHA 0x0305\n#define GL_CULL_FACE_MODE 0x0B45\n#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221\n#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3\n#define GL_COLOR_RENDERABLE 0x8286\n#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD\n#define GL_T2F_N3F_V3F 0x2A2B\n#define GL_TEXTURE_DEPTH 0x8071\n#define GL_DEPTH_COMPONENT16 0x81A5\n#define GL_STENCIL_BACK_FAIL 0x8801\n#define GL_COMPRESSED_RG_RGTC2 0x8DBD\n#define GL_ATTACHED_SHADERS 0x8B85\n#define GL_TEXTURE_IMAGE_FORMAT 0x828F\n#define GL_TEXTURE_GATHER 0x82A2\n#define GL_LOAD 0x0101\n#define GL_DEPTH32F_STENCIL8 0x8CAD\n#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215\n#define GL_ACTIVE_TEXTURE 0x84E0\n#define GL_TEXTURE_BORDER 0x1005\n#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3\n#define GL_MAX_LIGHTS 0x0D31\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B\n#define GL_V3F 0x2A21\n#define GL_TESS_EVALUATION_TEXTURE 0x829D\n#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6\n#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102\n#define GL_INTERNALFORMAT_PREFERRED 0x8270\n#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1\n#define GL_FRAGMENT_TEXTURE 0x829F\n#define GL_IMAGE_TEXEL_SIZE 0x82A7\n#define GL_POINT_DISTANCE_ATTENUATION 0x8129\n#define GL_RGB32I 0x8D83\n#define GL_INT_VEC4 0x8B55\n#define GL_FRONT 0x0404\n#define GL_TEXTURE18 0x84D2\n#define GL_DRAW_BUFFER9 0x882E\n#define GL_SHADER_COMPILER 0x8DFA\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F\n#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E\n#define GL_INT_SAMPLER_3D 0x8DCB\n#define GL_RGBA16 0x805B\n#define GL_2D 0x0600\n#define GL_FRONT_LEFT 0x0400\n#define GL_UNPACK_LSB_FIRST 0x0CF1\n#define GL_EQUIV 0x1509\n#define GL_LIGHTING_BIT 0x00000040\n#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277\n#define GL_INVALID_OPERATION 0x0502\n#define GL_TEXTURE25 0x84D9\n#define GL_POINT_SIZE_MAX 0x8127\n#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES\n#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269\n#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC\n#define GL_SPHERE_MAP 0x2402\n#define GL_RG32F 0x8230\n#define GL_QUERY_NO_WAIT 0x8E14\n#define GL_POINT_SIZE_MIN 0x8126\n#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB\n#define GL_RG8I 0x8237\n#define GL_FRAGMENT_SHADER_BIT 0x00000002\n#define GL_MAP2_NORMAL 0x0DB2\n#define GL_TEXTURE_BLUE_SIZE 0x805E\n#define GL_UNSIGNED_INT_VEC4 0x8DC8\n#define GL_INT_VEC3 0x8B54\n#define GL_COPY_READ_BUFFER_BINDING GL_COPY_READ_BUFFER\n#define GL_CLIP_DISTANCE6 0x3006\n#define GL_TEXTURE_SWIZZLE_B 0x8E44\n#define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7\n#define GL_DOUBLE_MAT2x3 0x8F49\n#define GL_COLOR_ARRAY 0x8076\n#define GL_DEPTH_WRITEMASK 0x0B72\n#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06\n#define GL_COLOR_ARRAY_STRIDE 0x8083\n#define GL_PARAMETER_BUFFER 0x80EE\n#define GL_LINE_BIT 0x00000004\n#define GL_IS_PER_PATCH 0x92E7\n#define GL_DEBUG_CALLBACK_FUNCTION 0x8244\n#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0\n#define GL_UNSIGNED_SHORT 0x1403\n#define GL_R 0x2002\n#define GL_COLOR_ATTACHMENT18 0x8CF2\n#define GL_IMAGE_BINDING_LEVEL 0x8F3B\n#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100\n#define GL_TEXTURE_BORDER_COLOR 0x1004\n#define GL_COLOR_SUM 0x8458\n#define GL_DRAW_BUFFER5 0x882A\n#define GL_FRAMEBUFFER_DEFAULT 0x8218\n#define GL_MAX_TEXTURE_UNITS 0x84E2\n#define GL_COLOR_MATERIAL_FACE 0x0B55\n#define GL_LIGHT4 0x4004\n#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD\n#define GL_BUFFER_MAPPED 0x88BC\n#define GL_DISPLAY_LIST 0x82E7\n#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8\n#define GL_BITMAP 0x1A00\n#define GL_T2F_C3F_V3F 0x2A2A\n#define GL_COLOR_ATTACHMENT20 0x8CF4\n#define GL_INVALID_VALUE 0x0501\n#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE\n#define GL_PROGRAM_SEPARABLE 0x8258\n#define GL_BACK 0x0405\n#define GL_TESS_GEN_VERTEX_ORDER 0x8E78\n#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264\n#define GL_FOG 0x0B60\n#define GL_LOW_INT 0x8DF3\n#define GL_ARRAY_BUFFER 0x8892\n#define GL_COLOR_ARRAY_TYPE 0x8082\n#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A\n#define GL_COMPILE_STATUS 0x8B81\n#define GL_STENCIL_INDEX16 0x8D49\n#define GL_VIEW_CLASS_32_BITS 0x82C8\n#define GL_R3_G3_B2 0x2A10\n#define GL_QUERY_TARGET 0x82EA\n#define GL_CLIP_ORIGIN 0x935C\n#define GL_DRAW_BUFFER12 0x8831\n#define GL_ONE_MINUS_SRC1_COLOR 0x88FA\n#define GL_TEXTURE30 0x84DE\n#define GL_STATIC_READ 0x88E5\n#define GL_RGB565 0x8D62\n#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010\n#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A\n#define GL_MANUAL_GENERATE_MIPMAP 0x8294\n#define GL_PRIMITIVES_GENERATED 0x8C87\n#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82\n#define GL_ALL_BARRIER_BITS 0xFFFFFFFF\n#define GL_CONSTANT_ALPHA 0x8003\n#define GL_RGB16_SNORM 0x8F9A\n#define GL_INVERT 0x150A\n#define GL_BLOCK_INDEX 0x92FD\n#define GL_MAX_VIEWPORT_DIMS 0x0D3A\n#define GL_TEXTURE11 0x84CB\n#define GL_RG 0x8227\n#define GL_BUFFER_SIZE 0x8764\n#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85\n#define GL_GUILTY_CONTEXT_RESET 0x8253\n#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267\n#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89\n#define GL_TEXTURE21 0x84D5\n#define GL_HIGH_INT 0x8DF5\n#define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5\n#define GL_LESS 0x0201\n#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0\n#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B\n#define GL_AUX_BUFFERS 0x0C00\n#define GL_TEXTURE_INTENSITY_SIZE 0x8061\n#define GL_ACCUM_BLUE_BITS 0x0D5A\n#define GL_ACTIVE_ATTRIBUTES 0x8B89\n#define GL_SAMPLE_MASK 0x8E51\n#define GL_MAP1_INDEX 0x0D91\n#define GL_UNSIGNED_INT_IMAGE_1D 0x9062\n#define GL_UNPACK_SKIP_IMAGES 0x806D\n#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD\n#define GL_BOOL_VEC3 0x8B58\n#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456\n#define GL_MULTISAMPLE 0x809D\n#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089\n#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7\n#define GL_LIGHT5 0x4005\n#define GL_LOSE_CONTEXT_ON_RESET 0x8252\n#define GL_QUERY_WAIT_INVERTED 0x8E17\n#define GL_DEPTH24_STENCIL8 0x88F0\n#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D\n#define GL_FOG_END 0x0B64\n#define GL_MAX_COMBINED_DIMENSIONS 0x8282\n#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3\n#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A\n#define GL_FLOAT_VEC2 0x8B50\n#define GL_STEREO 0x0C33\n#define GL_READ_PIXELS_FORMAT 0x828D\n#define GL_SAMPLE_POSITION 0x8E50\n#define GL_DOUBLE_MAT4x3 0x8F4E\n#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C\n#define GL_NEAREST_MIPMAP_LINEAR 0x2702\n#define GL_SMOOTH 0x1D01\n#define GL_BUFFER_ACCESS_FLAGS 0x911F\n#define GL_TEXTURE_COMPONENTS 0x1003\n#define GL_CLIP_DISTANCE7 0x3007\n#define GL_LUMINANCE_ALPHA 0x190A\n#define GL_TEXTURE_CUBE_MAP 0x8513\n#define GL_NORMALIZE 0x0BA1\n#define GL_SOURCE1_ALPHA 0x8589\n#define GL_INT_SAMPLER_2D 0x8DCA\n#define GL_RGBA2 0x8055\n#define GL_TEXTURE_BUFFER 0x8C2A\n#define GL_TEXTURE_LUMINANCE_SIZE 0x8060\n#define GL_ARRAY_BUFFER_BINDING 0x8894\n#define GL_OPERAND1_RGB 0x8591\n#define GL_C4UB_V3F 0x2A23\n#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76\n#define GL_SAMPLE_BUFFERS 0x80A8\n#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211\n#define GL_ONE_MINUS_SRC_COLOR 0x0301\n#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE\n#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD\n#define GL_INT_IMAGE_3D 0x9059\n#define GL_BLEND_DST_RGB 0x80C8\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4\n#define GL_SHADER_STORAGE_BUFFER_START 0x90D4\n#define GL_MAP2_GRID_SEGMENTS 0x0DD3\n#define GL_NUM_SPIR_V_EXTENSIONS 0x9554\n#define GL_COLOR_MATERIAL_PARAMETER 0x0B56\n#define GL_SIGNALED 0x9119\n#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48\n#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A\n#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0\n#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA\n#define GL_COPY_INVERTED 0x150C\n#define GL_STENCIL_COMPONENTS 0x8285\n#define GL_PIXEL_MAP_I_TO_I 0x0C70\n#define GL_COMPRESSED_RGB 0x84ED\n#define GL_BYTE 0x1400\n#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318\n#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E\n#define GL_COMBINE_RGB 0x8571\n#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F\n#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D\n#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C\n#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101\n#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19\n#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE\n#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE\n#define GL_BUFFER_ACCESS 0x88BB\n#define GL_STACK_UNDERFLOW 0x0504\n#define GL_SUBTRACT 0x84E7\n#define GL_QUERY_BUFFER_BINDING 0x9193\n#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC\n#define GL_PARAMETER_BUFFER_BINDING 0x80EF\n#define GL_STENCIL_FUNC 0x0B92\n#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2\n#define GL_MAP1_TEXTURE_COORD_4 0x0D96\n#define GL_SMOOTH_POINT_SIZE_RANGE GL_POINT_SIZE_RANGE\n#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A\n#define GL_ALPHA_INTEGER 0x8D97\n#define GL_SPOT_CUTOFF 0x1206\n#define GL_PATCHES 0x000E\n#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF\n#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C\n#define GL_RGB8I 0x8D8F\n#define GL_PROGRAM_PIPELINE 0x82E4\n#define GL_SHADER_IMAGE_LOAD 0x82A4\n#define GL_STATIC_DRAW 0x88E4\n#define GL_EQUAL 0x0202\n#define GL_SRGB 0x8C40\n#define GL_Q 0x2003\n#define GL_DRAW_BUFFER2 0x8827\n#define GL_TEXTURE_GREEN_TYPE 0x8C11\n#define GL_COMBINE 0x8570\n#define GL_READ_BUFFER 0x0C02\n#define GL_TEXTURE_BUFFER_OFFSET 0x919D\n#define GL_SHADING_LANGUAGE_VERSION 0x8B8C\n#define GL_CONTEXT_PROFILE_MASK 0x9126\n#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43\n#define GL_TEXTURE_BLUE_TYPE 0x8C12\n#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9\n#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF\n#define GL_TEXTURE16 0x84D0\n#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30\n#define GL_ALPHA_TEST 0x0BC0\n#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309\n#define GL_COLOR_ATTACHMENT4 0x8CE4\n#define GL_COLOR_ATTACHMENT28 0x8CFC\n#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124\n#define GL_MEDIUM_FLOAT 0x8DF1\n#define GL_COMPRESSED_SRGB 0x8C48\n#define GL_PIXEL_MODE_BIT 0x00000020\n#define GL_SMOOTH_LINE_WIDTH_GRANULARITY GL_LINE_WIDTH_GRANULARITY\n#define GL_4_BYTES 0x1409\n#define GL_COMPRESSED_SRGB8_ETC2 0x9275\n#define GL_IMAGE_CLASS_2_X_8 0x82C0\n#define GL_POLYGON_STIPPLE_BIT 0x00000010\n#define GL_CURRENT_PROGRAM 0x8B8D\n#define GL_STACK_OVERFLOW 0x0503\n#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002\n#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F\n#define GL_BLUE_BITS 0x0D54\n#define GL_SAMPLER_CUBE 0x8B60\n#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6\n#define GL_TRANSFORM_BIT 0x00001000\n#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E\n#define GL_INNOCENT_CONTEXT_RESET 0x8254\n#define GL_COMPRESSED_RG 0x8226\n#define GL_UNSIGNED_SHORT_5_6_5 0x8363\n#define GL_FLOAT_MAT4 0x8B5C\n#define GL_RGB_INTEGER 0x8D98\n#define GL_TRUE 1\n#define GL_COLOR_ATTACHMENT21 0x8CF5\n#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6\n#define GL_RENDERBUFFER_RED_SIZE 0x8D50\n#define GL_LEFT 0x0406\n#define GL_MAP1_VERTEX_4 0x0D98\n#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362\n#define GL_INTENSITY4 0x804A\n#define GL_CURRENT_QUERY 0x8865\n#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE\n#define GL_QUERY_RESULT 0x8866\n#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80\n#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624\n#define GL_UNIFORM_BUFFER_SIZE 0x8A2A\n#define GL_DEBUG_TYPE_PORTABILITY 0x824F\n#define GL_COMBINE_ALPHA 0x8572\n#define GL_CURRENT_INDEX 0x0B01\n#define GL_TEXTURE_COMPARE_MODE 0x884C\n#define GL_GENERATE_MIPMAP 0x8191\n#define GL_LOW_FLOAT 0x8DF0\n#define GL_MAP2_TEXTURE_COORD_3 0x0DB5\n#define GL_UNSIGNED_INT_IMAGE_2D 0x9063\n#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F\n#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367\n#define GL_LOGIC_OP 0x0BF1\n#define GL_BUFFER_VARIABLE 0x92E5\n#define GL_NOR 0x1508\n#define GL_STREAM_COPY 0x88E2\n#define GL_SELECTION_BUFFER_POINTER 0x0DF3\n#define GL_IMAGE_CLASS_4_X_16 0x82BC\n#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5\n#define GL_COMPILE_AND_EXECUTE 0x1301\n#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C\n#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B\n#define GL_ALPHA4 0x803B\n#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9\n#define GL_CCW 0x0901\n#define GL_FLOAT_MAT2x3 0x8B65\n#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73\n#define GL_DRAW_BUFFER13 0x8832\n#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9\n#define GL_UPPER_LEFT 0x8CA2\n#define GL_COMPRESSED_ALPHA 0x84E9\n#define GL_SIGNED_NORMALIZED 0x8F9C\n#define GL_MAX_VERTEX_STREAMS 0x8E71\n#define GL_PRIMARY_COLOR 0x8577\n#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271\n#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A\n#define GL_MAP2_VERTEX_4 0x0DB8\n#define GL_FRONT_AND_BACK 0x0408\n#define GL_DEBUG_TYPE_PERFORMANCE 0x8250\n#define GL_ALPHA8 0x803C\n#define GL_IMAGE_PIXEL_TYPE 0x82AA\n#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19\n#define GL_UNSIGNED_INT_10_10_10_2 0x8036\n#define GL_EXP2 0x0801\n#define GL_TEXTURE_GEN_S 0x0C60\n#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F\n#define GL_VIEW_CLASS_128_BITS 0x82C4\n#define GL_ATOMIC_COUNTER_BUFFER 0x92C0\n#define GL_LINE_RESET_TOKEN 0x0707\n#define GL_CLAMP 0x2900\n#define GL_PIXEL_UNPACK_BUFFER 0x88EC\n#define GL_RGB16UI 0x8D77\n#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55\n#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127\n#define GL_FRAMEBUFFER_RENDERABLE 0x8289\n#define GL_DIFFUSE 0x1201\n#define GL_DEPTH_BIAS 0x0D1F\n#define GL_IMAGE_PIXEL_FORMAT 0x82A9\n#define GL_FLOAT_MAT3x2 0x8B67\n#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46\n#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0\n#define GL_FRONT_RIGHT 0x0401\n#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6\n#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95\n#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2\n#define GL_DEPTH_BITS 0x0D56\n#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70\n#define GL_SOURCE2_ALPHA 0x858A\n#define GL_AND_INVERTED 0x1504\n#define GL_IMAGE_BINDING_FORMAT 0x906E\n#define GL_RGB8_SNORM 0x8F96\n#define GL_BOOL_VEC2 0x8B57\n#define GL_SAMPLER_2D_ARRAY 0x8DC1\n#define GL_UNIFORM_BLOCK_BINDING 0x8A3F\n#define GL_VIEW_CLASS_96_BITS 0x82C5\n#define GL_DEPTH_TEST 0x0B71\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45\n#define GL_SAMPLE_ALPHA_TO_ONE 0x809F\n#define GL_POLYGON 0x0009\n#define GL_BOOL_VEC4 0x8B59\n#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111\n#define GL_FRACTIONAL_ODD 0x8E7B\n#define GL_UNIFORM 0x92E1\n#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69\n#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86\n#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262\n#define GL_ALPHA_BIAS 0x0D1D\n#define GL_POINT_TOKEN 0x0701\n#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6\n#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53\n#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD\n#define GL_FLOAT_MAT3 0x8B5B\n#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81\n#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA\n#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F\n#define GL_NICEST 0x1102\n#define GL_C3F_V3F 0x2A24\n#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B\n#define GL_BACK_LEFT 0x0402\n#define GL_SOURCE0_RGB 0x8580\n#define GL_ACTIVE_PROGRAM 0x8259\n#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF\n#define GL_STENCIL_REF 0x0B97\n#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37\n#define GL_DRAW_BUFFER3 0x8828\n#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE\n#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C\n#define GL_BLEND_EQUATION_RGB 0x8009\n#define GL_LUMINANCE 0x1909\n#define GL_COMPRESSED_INTENSITY 0x84EC\n#define GL_LUMINANCE12 0x8041\n#define GL_PACK_SKIP_IMAGES 0x806B\n#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020\n#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC\n#define GL_COLOR_ATTACHMENT17 0x8CF1\n#define GL_TEXTURE_GEN_R 0x0C62\n#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C\n#define GL_HALF_FLOAT 0x140B\n#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107\n#define GL_AND_REVERSE 0x1502\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516\n#define GL_PIXEL_PACK_BUFFER 0x88EB\n#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F\n#define GL_INT_VEC2 0x8B53\n#define GL_INDEX_OFFSET 0x0D13\n#define GL_SAMPLER_1D_ARRAY 0x8DC0\n#define GL_TEXTURE20 0x84D4\n#define GL_LOGIC_OP_MODE 0x0BF0\n#define GL_ZERO 0\n#define GL_UNIFORM_BUFFER_BINDING 0x8A28\n#define GL_SCISSOR_BIT 0x00080000\n#define GL_TEXTURE_PRIORITY 0x8066\n#define GL_DRAW_BUFFER11 0x8830\n#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB\n#define GL_COLOR_ATTACHMENT23 0x8CF7\n#define GL_NAME_STACK_DEPTH 0x0D70\n#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216\n#define GL_COLOR_ATTACHMENT30 0x8CFE\n#define GL_FOG_COORD GL_FOG_COORDINATE\n#define GL_IMAGE_CLASS_10_10_10_2 0x82C3\n#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC\n#define GL_COMMAND_BARRIER_BIT 0x00000040\n#define GL_LUMINANCE4 0x803F\n#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279\n#define GL_DEPTH_COMPONENTS 0x8284\n#define GL_BGR 0x80E0\n#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED\n#define GL_LINE_STIPPLE 0x0B24\n#define GL_COLOR_COMPONENTS 0x8283\n#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9\n#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065\n#define GL_UNSIGNED_INT_8_8_8_8 0x8035\n#define GL_XOR 0x1506\n#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E\n#define GL_MATRIX_MODE 0x0BA0\n#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092\n#define GL_INDEX_MODE 0x0C30\n#define GL_MAX_VERTEX_ATTRIBS 0x8869\n#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8\n#define GL_NORMAL_ARRAY 0x8075\n#define GL_PACK_ROW_LENGTH 0x0D02\n#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C\n#define GL_INDEX_WRITEMASK 0x0C21\n#define GL_COLOR_ATTACHMENT0 0x8CE0\n#define GL_RENDERBUFFER_HEIGHT 0x8D43\n#define GL_FLOAT_MAT2 0x8B5A\n#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D\n#define GL_TEXTURE23 0x84D7\n#define GL_MAX_SAMPLES 0x8D57\n#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802\n#define GL_AUX3 0x040C\n#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311\n#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273\n#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF\n#define GL_DOUBLE_MAT2 0x8F46\n#define GL_RESET_NOTIFICATION_STRATEGY 0x8256\n#define GL_INDEX_CLEAR_VALUE 0x0C20\n#define GL_MAX_PATCH_VERTICES 0x8E7D\n#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3\n#define GL_COLOR_ATTACHMENT1 0x8CE1\n#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1\n#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103\n#define GL_RGB9_E5 0x8C3D\n#define GL_MAX_ELEMENT_INDEX 0x8D6B\n#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008\n#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3\n#define GL_MAP2_INDEX 0x0DB1\n#define GL_TEXTURE5 0x84C5\n#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144\n#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276\n#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200\n#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF\n#define GL_ONE 1\n#define GL_LINE_WIDTH 0x0B21\n#define GL_DRAW_INDIRECT_BUFFER 0x8F3F\n#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS\n#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB\n#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896\n#define GL_DOUBLE_MAT2x4 0x8F4A\n#define GL_LINES_ADJACENCY 0x000A\n#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87\n#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1\n#define GL_PACK_SWAP_BYTES 0x0D00\n#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF\n#define GL_NORMAL_ARRAY_POINTER 0x808F\n#define GL_IMAGE_CLASS_11_11_10 0x82C2\n#define GL_MULT 0x0103\n#define GL_R16I 0x8233\n#define GL_ALPHA 0x1906\n#define GL_FUNC_REVERSE_SUBTRACT 0x800B\n#define GL_3D_COLOR 0x0602\n#define GL_PROJECTION 0x1701\n#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4\n#define GL_NAME_LENGTH 0x92F9\n#define GL_TEXTURE_DEPTH_TYPE 0x8C16\n#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B\n#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243\n#define GL_TEXTURE_IMAGE_TYPE 0x8290\n#define GL_FUNC_ADD 0x8006\n#define GL_STENCIL_INDEX1 0x8D46\n#define GL_SHADER_BINARY_FORMATS 0x8DF8\n#define GL_RGB16I 0x8D89\n#define GL_AUTO_NORMAL 0x0D80\n#define GL_SYNC_FENCE 0x9116\n#define GL_COLOR_ENCODING 0x8296\n#define GL_GREEN_SCALE 0x0D18\n#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F\n#define GL_TEXTURE7 0x84C7\n#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002\n#define GL_DEBUG_SOURCE_OTHER 0x824B\n#define GL_GEOMETRY_SHADER 0x8DD9\n#define GL_OR_REVERSE 0x150B\n#define GL_MAP1_VERTEX_3 0x0D97\n#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8\n#define GL_TEXTURE_SAMPLES 0x9106\n#define GL_MAX_CLIP_PLANES 0x0D32\n#define GL_COLOR_ATTACHMENT15 0x8CEF\n#define GL_PIXEL_MAP_R_TO_R 0x0C76\n#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895\n#define GL_SRC2_RGB GL_SOURCE2_RGB\n#define GL_PIXEL_MAP_S_TO_S 0x0C71\n#define GL_SAMPLER_BINDING 0x8919\n#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD\n#define GL_PRIMITIVE_RESTART 0x8F9D\n#define GL_MAX_IMAGE_UNITS 0x8F38\n#define GL_LIGHT0 0x4000\n#define GL_BGRA 0x80E1\n#define GL_FOG_INDEX 0x0B61\n#define GL_VERTEX_SUBROUTINE 0x92E8\n#define GL_SELECT 0x1C02\n#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020\n#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004\n#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001\n#define GL_POINT_SPRITE_ARB 0x8861\n#define GL_SPOT_DIRECTION 0x1204\n#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506\n#define GL_CLIP_PLANE0 0x3000\n#define GL_FULL_SUPPORT 0x82B7\n#define GL_OPERAND0_RGB 0x8590\n#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51\n#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125\n#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276\n#define GL_VIEW_CLASS_64_BITS 0x82C6\n#define GL_VIEW_CLASS_16_BITS 0x82CA\n#define GL_BLEND_EQUATION 0x8009\n#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C\n#define GL_OPERAND2_RGB 0x8592\n#define GL_MAJOR_VERSION 0x821B\n#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400\n#define GL_COMPRESSED_RED_RGTC1 0x8DBB\n#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210\n#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A\n#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514\n#define GL_MIRRORED_REPEAT 0x8370\n#define GL_BUFFER_MAP_LENGTH 0x9120\n#define GL_BLEND_SRC 0x0BE1\n#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83\n#define GL_MAX_HEIGHT 0x827F\n#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D\n#define GL_BUFFER_DATA_SIZE 0x9303\n#define GL_BLUE_INTEGER 0x8D96\n#define GL_TRIANGLES 0x0004\n#define GL_UNKNOWN_CONTEXT_RESET 0x8255\n#define GL_IMAGE_BUFFER 0x9051\n#define GL_FILTER 0x829A\n#define GL_RGBA12 0x805A\n#define GL_BLEND 0x0BE2\n#define GL_RGB8UI 0x8D7D\n#define GL_MAX_VARYING_VECTORS 0x8DFC\n#define GL_COLOR_ATTACHMENT3 0x8CE3\n#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E\n#define GL_FLOAT_VEC4 0x8B52\n#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310\n#define GL_SAMPLER_1D 0x8B5D\n#define GL_MAP1_COLOR_4 0x0D90\n#define GL_TEXTURE_BIT 0x00040000\n#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7\n#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA\n#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23\n#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9\n#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E\n#define GL_STENCIL_BACK_FUNC 0x8800\n#define GL_INFO_LOG_LENGTH 0x8B84\n#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A\n#define GL_SPOT_EXPONENT 0x1205\n#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307\n#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31\n#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1\n#define GL_LINE_WIDTH_RANGE 0x0B22\n#define GL_PROGRAM_BINARY_FORMATS 0x87FF\n#define GL_UNPACK_SKIP_PIXELS 0x0CF4\n#define GL_MAP_COHERENT_BIT 0x0080\n#define GL_IMAGE_BINDING_LAYER 0x8F3D\n#define GL_FRAMEBUFFER_BLEND 0x828B\n#define GL_RGB10 0x8052\n#define GL_POLYGON_OFFSET_LINE 0x2A02\n#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366\n#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80\n#define GL_R16_SNORM 0x8F98\n#define GL_FRAGMENT_SHADER 0x8B30\n#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080\n#define GL_EDGE_FLAG 0x0B43\n#define GL_TEXTURE_GATHER_SHADOW 0x82A3\n#define GL_INT_IMAGE_BUFFER 0x905C\n#define GL_LOCATION 0x930E\n#define GL_SYNC_STATUS 0x9114\n#define GL_MODELVIEW_STACK_DEPTH 0x0BA3\n#define GL_PROGRAM_INPUT 0x92E3\n#define GL_STENCIL_RENDERABLE 0x8288\n#define GL_MAP_STENCIL 0x0D11\n#define GL_LIGHT7 0x4007\n#define GL_LAST_VERTEX_CONVENTION 0x8E4E\n#define GL_TEXTURE13 0x84CD\n#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59\n#define GL_ACCUM 0x0100\n#define GL_INT_2_10_10_10_REV 0x8D9F\n#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA\n#define GL_2_BYTES 0x1407\n#define GL_REFLECTION_MAP 0x8512\n#define GL_GREEN 0x1904\n#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E\n#define GL_RGB4 0x804F\n#define GL_SLUMINANCE8 0x8C47\n#define GL_TRIANGLE_STRIP 0x0005\n#define GL_INTERNALFORMAT_SUPPORTED 0x826F\n#define GL_TIME_ELAPSED 0x88BF\n#define GL_SEPARATE_ATTRIBS 0x8C8D\n#define GL_COLOR_INDEX 0x1900\n#define GL_COLOR_ARRAY_POINTER 0x8090\n#define GL_COMPRESSED_R11_EAC 0x9270\n#define GL_CLAMP_READ_COLOR 0x891C\n#define GL_COPY_PIXEL_TOKEN 0x0706\n#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74\n#define GL_DEPTH 0x1801\n#define GL_SLUMINANCE8_ALPHA8 0x8C45\n#define GL_FOG_START 0x0B63\n#define GL_FRAMEBUFFER_SRGB 0x8DB9\n#define GL_STENCIL_FAIL 0x0B94\n#define GL_LUMINANCE8_ALPHA8 0x8045\n#define GL_COLOR_ATTACHMENT14 0x8CEE\n#define GL_INTENSITY8 0x804B\n#define GL_NAND 0x150E\n#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3\n#define GL_MIN 0x8007\n#define GL_SYNC_CONDITION 0x9113\n#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C\n#define GL_SAMPLER_BUFFER 0x8DC2\n#define GL_PACK_ALIGNMENT 0x0D05\n#define GL_DEPTH_SCALE 0x0D1E\n#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF\n#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257\n#define GL_RG8_SNORM 0x8F95\n#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE\n#define GL_BOOL 0x8B56\n#define GL_DST_COLOR 0x0306\n#define GL_INT_SAMPLER_1D 0x8DC9\n#define GL_BLEND_DST 0x0BE0\n#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33\n#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE\n#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898\n#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001\n#define GL_LUMINANCE6_ALPHA2 0x8044\n#define GL_DOUBLE_MAT4x2 0x8F4D\n#define GL_STENCIL_ATTACHMENT 0x8D20\n#define GL_ACTIVE_VARIABLES 0x9305\n#define GL_TEXTURE26 0x84DA\n#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54\n#define GL_DEBUG_LOGGED_MESSAGES 0x9145\n#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA\n#define GL_FIXED_ONLY 0x891D\n#define GL_MAP1_TEXTURE_COORD_3 0x0D95\n#define GL_COMPRESSED_RGBA 0x84EE\n#define GL_DEBUG_TYPE_MARKER 0x8268\n#define GL_SHADER_STORAGE_BLOCK 0x92E6\n#define GL_BLEND_COLOR 0x8005\n#define GL_TEXTURE_WRAP_S 0x2802\n#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645\n#define GL_LIGHTING 0x0B50\n#define GL_COMPATIBLE_SUBROUTINES 0x8E4B\n#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC\n#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D\n#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C\n#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D\n#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E\n#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2\n#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292\n#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB\n#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD\n#define GL_ACTIVE_RESOURCES 0x92F5\n#define GL_QUERY_NO_WAIT_INVERTED 0x8E18\n#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C\n#define GL_TEXTURE_RESIDENT 0x8067\n#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5\n#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5\n#define GL_MAX_WIDTH 0x827E\n#define GL_LIST_MODE 0x0B30\n#define GL_PACK_IMAGE_HEIGHT 0x806C\n#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA\n#define GL_BUFFER_BINDING 0x9302\n#define GL_LINE_SMOOTH_HINT 0x0C52\n#define GL_TEXTURE3 0x84C3\n#define GL_FLAT 0x1D00\n#define GL_COPY_READ_BUFFER 0x8F36\n#define GL_MAX_VARYING_FLOATS 0x8B4B\n#define GL_EYE_PLANE 0x2502\n#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001\n#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897\n#define GL_TEXTURE_ENV_MODE 0x2200\n#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2\n#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622\n#define GL_PROXY_TEXTURE_3D 0x8070\n#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A\n#define GL_TEXTURE_BINDING_BUFFER 0x8C2C\n#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F\n#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E\n#define GL_UNPACK_SWAP_BYTES 0x0CF0\n#define GL_R32F 0x822E\n#define GL_DRAW_BUFFER8 0x882D\n#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7\n#define GL_LOCATION_COMPONENT 0x934A\n#define GL_T4F_V4F 0x2A28\n#define GL_DEPTH_BUFFER_BIT 0x00000100\n#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1\n#define GL_REPEAT 0x2901\n#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265\n#define GL_MULTISAMPLE_BIT 0x20000000\n#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000\n#define GL_SRC_COLOR 0x0300\n#define GL_INT_IMAGE_1D 0x9057\n#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A\n#define GL_IMAGE_3D 0x904E\n#define GL_ONE_MINUS_DST_COLOR 0x0307\n#define GL_FALSE 0\n#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A\n#define GL_MAP2_TEXTURE_COORD_2 0x0DB4\n#define GL_HINT_BIT 0x00008000\n#define GL_BLUE_BIAS 0x0D1B\n#define GL_RG16UI 0x823A\n#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5\n#define GL_KEEP 0x1E00\n#define GL_TESS_EVALUATION_SHADER 0x8E87\n#define GL_STENCIL_TEST 0x0B90\n#define GL_TEXTURE6 0x84C6\n#define GL_DEPTH_COMPONENT24 0x81A6\n#define GL_VIEWPORT_BOUNDS_RANGE 0x825D\n#define GL_MAX_UNIFORM_LOCATIONS 0x826E\n#define GL_RGBA 0x1908\n#define GL_DYNAMIC_COPY 0x88EA\n#define GL_PACK_SKIP_ROWS 0x0D03\n#define GL_LIST_INDEX 0x0B33\n#define GL_IMAGE_BINDING_NAME 0x8F3A\n#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F\n#define GL_RED_INTEGER 0x8D94\n#define GL_OPERAND2_ALPHA 0x859A\n#define GL_INVALID_INDEX 0xFFFFFFFF\n#define GL_VERTEX_SHADER_INVOCATIONS 0x82F0\n#define GL_TEXTURE_GEN_T 0x0C61\n#define GL_TEXTURE_GEN_Q 0x0C63\n#define GL_CURRENT_RASTER_COLOR 0x0B04\n#define GL_RGBA4 0x8056\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8\n#define GL_DECAL 0x2101\n#define GL_TEXTURE_SWIZZLE_R 0x8E42\n#define GL_RED_SCALE 0x0D14\n#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1\n#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128\n#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143\n#define GL_PATCH_VERTICES 0x8E72\n#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872\n#define GL_TEXTURE_SWIZZLE_G 0x8E43\n#define GL_PROGRAM_POINT_SIZE GL_VERTEX_PROGRAM_POINT_SIZE\n#define GL_COMPRESSED_RGB8_ETC2 0x9274\n#define GL_DYNAMIC_READ 0x88E9\n#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D\n#define GL_POLYGON_STIPPLE 0x0B42\n#define GL_ADD 0x0104\n#define GL_COLOR_ATTACHMENT25 0x8CF9\n#define GL_TEXTURE_ENV_COLOR 0x2201\n#define GL_DEPTH_ATTACHMENT 0x8D00\n#define GL_POINT_SIZE_GRANULARITY 0x0B13\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED\n#define GL_SRGB8 0x8C41\n#define GL_LINE_STRIP_ADJACENCY 0x000B\n#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER\n#define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0\n#define GL_MAX_TEXTURE_COORDS 0x8871\n#define GL_COLOR_ARRAY_SIZE 0x8081\n#define GL_RG8 0x822B\n#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA\n#define GL_TESS_GEN_MODE 0x8E76\n#define GL_COLOR_ATTACHMENT29 0x8CFD\n#define GL_HIGH_FLOAT 0x8DF2\n#define GL_GREEN_BITS 0x0D53\n#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C\n#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B\n#define GL_DRAW_BUFFER 0x0C01\n#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16\n#define GL_ACTIVE_UNIFORMS 0x8B86\n#define GL_LINEAR_ATTENUATION 0x1208\n#define GL_COPY_WRITE_BUFFER 0x8F37\n#define GL_BITMAP_TOKEN 0x0704\n#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D\n#define GL_IMAGE_2D_ARRAY 0x9053\n#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE\n#define GL_VIEWPORT 0x0BA2\n#define GL_VENDOR 0x1F00\n#define GL_LIGHT1 0x4001\n#define GL_CLEAR_BUFFER 0x82B4\n#define GL_R8 0x8229\n#define GL_RENDER 0x1C00\n#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29\n#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A\n#define GL_SAMPLER_2D_RECT 0x8B63\n#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC\n#define GL_RGBA16UI 0x8D76\n#define GL_VERTEX_ARRAY_TYPE 0x807B\n#define GL_QUAD_STRIP 0x0008\n#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE\n#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3\n#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF\n#define GL_TRANSFORM_FEEDBACK_ACTIVE GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE\n#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE\n#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8\n#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE\n#define GL_LINE 0x1B01\n#define GL_LINK_STATUS 0x8B82\n#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF\n#define GL_ACTIVE_SUBROUTINES 0x8DE5\n#define GL_INT 0x1404\n#define GL_LUMINANCE12_ALPHA12 0x8047\n#define GL_MAX_PIXEL_MAP_TABLE 0x0D34\n#define GL_EYE_LINEAR 0x2400\n#define GL_COLOR_ATTACHMENT13 0x8CED\n#define GL_POLYGON_OFFSET_UNITS 0x2A00\n#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1\n#define GL_VERTEX_ARRAY_STRIDE 0x807C\n#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088\n#define GL_COLOR_ATTACHMENT11 0x8CEB\n#define GL_OR_INVERTED 0x150D\n#define GL_ACCUM_ALPHA_BITS 0x0D5B\n#define GL_FOG_COLOR 0x0B66\n#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE\n#define GL_DEBUG_TYPE_OTHER 0x8251\n#define GL_LINES 0x0001\n#define GL_READ_PIXELS_TYPE 0x828E\n#define GL_PROGRAM_OUTPUT 0x92E4\n#define GL_DEPTH_RANGE 0x0B70\n#define GL_INTERPOLATE 0x8575\n#define GL_DOT3_RGBA 0x86AF\n#define GL_IMAGE_BINDING_ACCESS 0x8F3E\n#define GL_BGR_INTEGER 0x8D9A\n#define GL_GREEN_BIAS 0x0D19\n#define GL_BLEND_DST_ALPHA 0x80CA\n#define GL_CURRENT_VERTEX_ATTRIB 0x8626\n#define GL_RG_INTEGER 0x8228\n#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365\n#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2\n#define GL_CLAMP_FRAGMENT_COLOR 0x891B\n#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B\n#define GL_GEQUAL 0x0206\n#define GL_DEPTH_CLAMP 0x864F\n#define GL_STATIC_COPY 0x88E6\n#define GL_TEXTURE_STACK_DEPTH 0x0BA5\n#define GL_COLOR_ATTACHMENT8 0x8CE8\n#define GL_RGB16F 0x881B\n#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35\n#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF\n#define GL_DEBUG_SEVERITY_MEDIUM 0x9147\n#define GL_3D 0x0601\n#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A\n#define GL_SOURCE0_ALPHA 0x8588\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44\n#define GL_ALIASED_POINT_SIZE_RANGE 0x846D\n#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14\n#define GL_R16UI 0x8234\n#define GL_SAMPLER_1D_SHADOW 0x8B61\n#define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6\n#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033\n#define GL_TEXTURE_VIEW 0x82B5\n#define GL_DST_ALPHA 0x0304\n#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364\n#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D\n#define GL_LUMINANCE8 0x8040\n#define GL_UNSIGNED_BYTE 0x1401\n#define GL_N3F_V3F 0x2A25\n#define GL_ACCUM_CLEAR_VALUE 0x0B80\n#define GL_SHADER_IMAGE_ATOMIC 0x82A6\n#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8\n#define GL_POINTS 0x0000\n#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3\n#define GL_ALPHA_SCALE 0x0D1C\n#define GL_RGBA8_SNORM 0x8F97\n#define GL_MAP_COLOR 0x0D10\n#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266\n#define GL_VIEW_CLASS_RGTC1_RED 0x82D0\n#define GL_DOUBLE_VEC2 0x8FFC\n#define GL_MAX_TESS_GEN_LEVEL 0x8E7E\n#define GL_RGB32F 0x8815\n#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454\n#define GL_BUFFER_MAP_POINTER 0x88BD\n#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001\n#define GL_PIXEL_MAP_I_TO_A 0x0C75\n#define GL_MAX_ELEMENTS_VERTICES 0x80E8\n#define GL_MAX_LIST_NESTING 0x0B31\n#define GL_IMAGE_CLASS_1_X_32 0x82BB\n#define GL_POLYGON_SMOOTH_HINT 0x0C53\n#define GL_TEXTURE_MAG_FILTER 0x2800\n#define GL_DOUBLE 0x140A\n#define GL_PIXEL_MAP_B_TO_B 0x0C78\n#define GL_COMPRESSED_RG11_EAC 0x9272\n#define GL_ZOOM_X 0x0D16\n#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47\n#define GL_DRAW_BUFFER15 0x8834\n#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5\n#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7\n#define GL_BLUE_SCALE 0x0D1A\n#define GL_DELETE_STATUS 0x8B80\n#define GL_PROGRAM 0x82E2\n#define GL_QUERY_RESULT_NO_WAIT 0x9194\n#define GL_LINE_WIDTH_GRANULARITY 0x0B23\n#define GL_OPERAND1_ALPHA 0x8599\n#define GL_MAX_EVAL_ORDER 0x0D30\n#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905\n#define GL_SHADER_IMAGE_STORE 0x82A5\n#define GL_PASS_THROUGH_TOKEN 0x0700\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0\n#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317\n#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD\n#define GL_ACCUM_BUFFER_BIT 0x00000200\n#define GL_DEPTH_CLEAR_VALUE 0x0B73\n#define GL_IMAGE_2D_RECT 0x904F\n#define GL_TEXTURE12 0x84CC\n#define GL_RGBA16I 0x8D88\n#define GL_FRONT_FACE 0x0B46\n#define GL_AUX0 0x0409\n#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034\n#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069\n#define GL_UNSIGNED_INT_VEC2 0x8DC6\n#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278\n#define GL_SAMPLER_3D 0x8B5F\n#define GL_C4F_N3F_V3F 0x2A26\n#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2\n#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002\n#define GL_CLIP_PLANE2 0x3002\n#define GL_RGBA8 0x8058\n#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4\n#define GL_RETURN 0x0102\n#define GL_MAX_SUBROUTINES 0x8DE7\n#define GL_COLOR_ATTACHMENT7 0x8CE7\n#define GL_AUTO_GENERATE_MIPMAP 0x8295\n#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA\n#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7\n#define GL_MAP_PERSISTENT_BIT 0x0040\n#define GL_BACK_RIGHT 0x0403\n#define GL_COMPRESSED_SRGB_ALPHA 0x8C49\n#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519\n#define GL_3D_COLOR_TEXTURE 0x0603\n#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0\n#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE\n#define GL_INT_IMAGE_2D_ARRAY 0x905E\n#define GL_POLYGON_MODE 0x0B40\n#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8\n#define GL_CULL_FACE 0x0B44\n#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C\n#define GL_TEXTURE_RED_SIZE 0x805C\n#define GL_R8_SNORM 0x8F94\n#define GL_COMPRESSED_RED 0x8225\n#define GL_IMAGE_CUBE 0x9050\n#define GL_IMAGE_1D_ARRAY 0x9052\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9\n#define GL_NO_RESET_NOTIFICATION 0x8261\n#define GL_RG16F 0x822F\n#define GL_POINT_SIZE 0x0B11\n#define GL_SOURCE2_RGB 0x8582\n#define GL_BGRA_INTEGER 0x8D9B\n#define GL_FASTEST 0x1101\n#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315\n#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093\n#define GL_TYPE 0x92FA\n#define GL_TEXTURE10 0x84CA\n#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C\n#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E\n#define GL_DEPTH_TEXTURE_MODE 0x884B\n#define GL_WAIT_FAILED 0x911D\n#define GL_BLEND_SRC_ALPHA 0x80CB\n#define GL_DRAW_BUFFER14 0x8833\n#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308\n#define GL_IS_ROW_MAJOR 0x9300\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515\n#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52\n#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899\n#define GL_MAP_READ_BIT 0x0001\n#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5\n#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277\n#define GL_UNIFORM_SIZE 0x8A38\n#define GL_MAP2_GRID_DOMAIN 0x0DD2\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7\n#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B\n#define GL_RGB32UI 0x8D71\n#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F\n#define GL_OUT_OF_MEMORY 0x0505\n#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E\n#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455\n#define GL_LINEAR_MIPMAP_NEAREST 0x2701\n#define GL_AUX2 0x040B\n#define GL_FOG_MODE 0x0B65\n#define GL_POSITION 0x1203\n#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4\n#define GL_SPIR_V_BINARY 0x9552\n#define GL_IMAGE_CLASS_1_X_16 0x82BE\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46\n#define GL_TEXTURE_2D 0x0DE1\n#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B\n#define GL_ALPHA16 0x803E\n#define GL_VIEW_CLASS_RGTC2_RG 0x82D1\n#define GL_TEXTURE_WIDTH 0x1000\n#define GL_PIXEL_MAP_A_TO_A 0x0C79\n#define GL_MATRIX_STRIDE 0x92FF\n#define GL_MAX_LAYERS 0x8281\n#define GL_TEXTURE15 0x84CF\n#define GL_TEXTURE_ALPHA_TYPE 0x8C13\n#define GL_VERTEX_ATTRIB_BINDING 0x82D4\n#define GL_TEXTURE28 0x84DC\n#define GL_QUERY_BUFFER 0x9192\n#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3\n#define GL_DEPTH_COMPONENT32 0x81A7\n#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B\n#define GL_CURRENT_NORMAL 0x0B02\n#define GL_RASTERIZER_DISCARD 0x8C89\n#define GL_TEXTURE19 0x84D3\n#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6\n#define GL_3_BYTES 0x1408\n#define GL_VERTEX_ARRAY_SIZE 0x807A\n#define GL_DITHER 0x0BD0\n#define GL_CONSTANT_ATTENUATION 0x1207\n#define GL_FRAMEBUFFER 0x8D40\n#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002\n#define GL_TEXTURE_TARGET 0x1006\n#define GL_STENCIL_BACK_WRITEMASK 0x8CA5\n#define GL_QUADS 0x0007\n#define GL_SHORT 0x1402\n#define GL_RG16_SNORM 0x8F99\n#define GL_SHADER_SOURCE_LENGTH 0x8B88\n#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248\n#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5\n#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB\n#define GL_EDGE_FLAG_ARRAY 0x8079\n#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41\n#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1\n#define GL_INTERNALFORMAT_RED_TYPE 0x8278\n#define GL_ALPHA_TEST_FUNC 0x0BC1\n#define GL_DRAW_BUFFER6 0x882B\n#define GL_VIEW_CLASS_24_BITS 0x82C9\n#define GL_T 0x2001\n#define GL_AND 0x1501\n#define GL_OBJECT_LINEAR 0x2401\n#define GL_SRGB8_ALPHA8 0x8C43\n#define GL_LINE_STIPPLE_PATTERN 0x0B25\n#define GL_INDEX_ARRAY 0x8077\n#define GL_DRAW_FRAMEBUFFER 0x8CA9\n#define GL_TEXTURE_2D_MULTISAMPLE 0x9100\n#define GL_READ_PIXELS 0x828C\n#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34\n#define GL_CLIP_PLANE3 0x3003\n#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4\n#define GL_RGB_SCALE 0x8573\n#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D\n#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E\n#define GL_TEXTURE14 0x84CE\n#define GL_DOUBLE_VEC3 0x8FFD\n#define GL_ISOLINES 0x8E7A\n#define GL_CLAMP_TO_BORDER 0x812D\n#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B\n#define GL_COORD_REPLACE_ARB 0x8862\n#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E\n#define GL_UNPACK_IMAGE_HEIGHT 0x806E\n#define GL_UNIFORM_NAME_LENGTH 0x8A39\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC\n#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2\n#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518\n#define GL_CONTEXT_FLAGS 0x821E\n#define GL_TEXTURE_SWIZZLE_A 0x8E45\n#define GL_R32I 0x8235\n#define GL_EXTENSIONS 0x1F03\n#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52\n#define GL_RG32I 0x823B\n#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA\n#define GL_LINE_SMOOTH 0x0B20\n#define GL_VERTEX_BINDING_STRIDE 0x82D8\n#define GL_COMPUTE_SHADER_BIT 0x00000020\n#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3\n#define GL_TESS_CONTROL_SHADER 0x8E88\n#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8\n#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217\n#define GL_BLEND_SRC_RGB 0x80C9\n#define GL_TEXTURE_1D_ARRAY 0x8C18\n#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060\n#define GL_SECONDARY_COLOR_ARRAY 0x845E\n#define GL_SELECTION_BUFFER_SIZE 0x0DF4\n#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643\n#define GL_VERTEX_ARRAY 0x8074\n#define GL_POLYGON_SMOOTH 0x0B41\n#define GL_MAX_INTEGER_SAMPLES 0x9110\n#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D\n#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8\n#define GL_ZERO_TO_ONE 0x935F\n#define GL_INDEX_BITS 0x0D51\n#define GL_SRC_ALPHA_SATURATE 0x0308\n#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25\n#define GL_TRIANGLE_FAN 0x0006\n#define GL_FRAGMENT_DEPTH 0x8452\n#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625\n#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F\n#define GL_ALPHA_TEST_REF 0x0BC2\n#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1\n#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD\n#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35\n#define GL_COLOR_ATTACHMENT31 0x8CFF\n#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E\n#define GL_GENERATE_MIPMAP_HINT 0x8192\n#define GL_UNIFORM_BARRIER_BIT 0x00000004\n#define GL_RGB5 0x8050\n#define GL_EVAL_BIT 0x00010000\n#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008\n#define GL_SAMPLES_PASSED 0x8914\n#define GL_R8I 0x8231\n#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314\n#define GL_LIST_BASE 0x0B32\n#define GL_TEXTURE_COMPARE_FUNC 0x884D\n#define GL_MAP1_GRID_SEGMENTS 0x0DD1\n#define GL_NORMAL_ARRAY_TYPE 0x807E\n#define GL_MAX_DEPTH 0x8280\n#define GL_TRANSFORM_FEEDBACK_PAUSED GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED\n#define GL_VERTEX_SHADER_BIT 0x00000001\n#define GL_OFFSET 0x92FC\n#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3\n#define GL_TEXTURE 0x1702\n#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF\n#define GL_COLOR_BUFFER_BIT 0x00004000\n#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39\n#define GL_AUX1 0x040A\n#define GL_STENCIL_BITS 0x0D57\n#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B\n#define GL_GEOMETRY_VERTICES_OUT 0x8916\n#define GL_UNIFORM_BUFFER 0x8A11\n#define GL_INT_IMAGE_1D_ARRAY 0x905D\n#define GL_ORDER 0x0A01\n#define GL_AMBIENT_AND_DIFFUSE 0x1602\n#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY\n#define GL_SMOOTH_LINE_WIDTH_RANGE GL_LINE_WIDTH_RANGE\n#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F\n#define GL_INDEX_ARRAY_STRIDE 0x8086\n#define GL_INT_IMAGE_CUBE 0x905B\n#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7\n#define GL_UNSIGNED_INT_IMAGE_3D 0x9064\n#define GL_STENCIL_BUFFER_BIT 0x00000400\n#define GL_SUBPIXEL_BITS 0x0D50\n#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004\n#define GL_UNDEFINED_VERTEX 0x8260\n#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40\n#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8\n#define GL_SRGB_READ 0x8297\n#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC\n#define GL_SRC_ALPHA 0x0302\n#define GL_DEBUG_SOURCE_APPLICATION 0x824A\n#define GL_DRAW_PIXEL_TOKEN 0x0705\n#define GL_MIRROR_CLAMP_TO_EDGE 0x8743\n#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312\n#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE\n#define GL_BUFFER_STORAGE_FLAGS 0x8220\n#define GL_DEBUG_OUTPUT 0x92E0\n#define GL_LINE_TOKEN 0x0702\n#define GL_CURRENT_RASTER_DISTANCE 0x0B09\n#define GL_MAP2_COLOR_4 0x0DB0\n#define GL_SPECULAR 0x1202\n#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247\n#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF\n#define GL_T4F_C4F_N3F_V4F 0x2A2D\n#define GL_TEXTURE_BINDING_2D 0x8069\n#define GL_TESS_CONTROL_SUBROUTINE 0x92E9\n#define GL_CLIP_PLANE1 0x3001\n#define GL_UNSIGNED_INT 0x1405\n#define GL_READ_FRAMEBUFFER 0x8CA8\n#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275\n#define GL_MAX_TEXTURE_SIZE 0x0D33\n#define GL_UNPACK_SKIP_ROWS 0x0CF3\n#define GL_BUFFER 0x82E0\n#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75\n#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A\n#define GL_TRIANGLES_ADJACENCY 0x000C\n#define GL_VERTEX_BINDING_DIVISOR 0x82D6\n#define GL_MODELVIEW_MATRIX 0x0BA6\n#define GL_C4UB_V2F 0x2A22\n#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313\n#define GL_RESCALE_NORMAL 0x803A\n#define GL_COMPILE 0x1300\n#define GL_DEBUG_SEVERITY_LOW 0x9148\n#define GL_NUM_EXTENSIONS 0x821D\n#define GL_TEXTURE22 0x84D6\n#define GL_PREVIOUS 0x8578\n#define GL_UNPACK_ROW_LENGTH 0x0CF2\n#define GL_QUERY_COUNTER_BITS 0x8864\n#define GL_LIGHT2 0x4002\n#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE\n#define GL_RGB12 0x8053\n#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A\n#define GL_TEXTURE_2D_ARRAY 0x8C1A\n#define GL_CONSTANT_COLOR 0x8001\n#define GL_RED 0x1903\n#define GL_LOCATION_INDEX 0x930F\n#define GL_PROXY_TEXTURE_2D 0x8064\n#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4\n#define GL_RENDERBUFFER_WIDTH 0x8D42\n#define GL_READ_ONLY 0x88B8\n#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA\n#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2\n#define GL_VERTEX_SHADER 0x8B31\n#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551\n#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316\n#define GL_RGBA32I 0x8D82\n#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB\n#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50\n#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA\n#define GL_LINEAR 0x2601\n#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6\n#define GL_TEXTURE_MIN_LOD 0x813A\n#define GL_LOWER_LEFT 0x8CA1\n#define GL_POINT_SMOOTH_HINT 0x0C51\n#define GL_LUMINANCE12_ALPHA4 0x8046\n#define GL_COMPUTE_SHADER 0x91B9\n#define GL_MAP2_TEXTURE_COORD_4 0x0DB6\n#define GL_COPY_WRITE_BUFFER_BINDING GL_COPY_WRITE_BUFFER\n#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B\n#define GL_NEVER 0x0200\n#define GL_EMISSION 0x1600\n#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D\n#define GL_SINGLE_COLOR 0x81F9\n#define GL_MAP1_TEXTURE_COORD_1 0x0D93\n#define GL_TEXTURE_HEIGHT 0x1001\n#define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC\n#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010\n#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368\n#define GL_COLOR_ATTACHMENT27 0x8CFB\n#define GL_TIMEOUT_EXPIRED 0x911B\n#define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2\n#define GL_UNIFORM_OFFSET 0x8A3B\n#define GL_ATTRIB_STACK_DEPTH 0x0BB0\n#define GL_SHININESS 0x1601\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42\n#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273\n#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3\n#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6\n#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85\n#define GL_CONTEXT_LOST 0x0507\n#define GL_STENCIL_VALUE_MASK 0x0B93\n#define GL_LINE_LOOP 0x0002\n#define GL_BLEND_EQUATION_ALPHA 0x883D\n#define GL_DOUBLE_MAT4 0x8F48\n#define GL_MAP1_TEXTURE_COORD_2 0x0D94\n#define GL_DYNAMIC_DRAW 0x88E8\n#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E\n#define GL_VALIDATE_STATUS 0x8B83\n#define GL_QUERY_RESULT_AVAILABLE 0x8867\n#define GL_IMAGE_1D 0x904C\n#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066\n#define GL_TEXTURE_LOD_BIAS 0x8501\n#define GL_PROGRAM_BINARY_LENGTH 0x8741\n#define GL_INCR_WRAP 0x8507\n#define GL_NEAREST 0x2600\n#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9\n#define GL_MAX_VIEWPORTS 0x825B\n#define GL_SRGB_ALPHA 0x8C42\n#define GL_TEXTURE_STENCIL_SIZE 0x88F1\n#define GL_COLOR_CLEAR_VALUE 0x0C22\n#define GL_TEXTURE_BUFFER_SIZE 0x919E\n#define GL_LINE_STIPPLE_REPEAT 0x0B26\n#define GL_NORMAL_ARRAY_STRIDE 0x807F\n#define GL_NEAREST_MIPMAP_NEAREST 0x2700\n#define GL_RGBA8UI 0x8D7C\n#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF\n#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96\n#define GL_MIPMAP 0x8293\n#define GL_DECR 0x1E03\n#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39\n#define GL_TEXTURE_RECTANGLE 0x84F5\n#define GL_ALL_SHADER_BITS 0xFFFFFFFF\n#define GL_SMOOTH_POINT_SIZE_GRANULARITY GL_POINT_SIZE_GRANULARITY\n#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D\n#define GL_POINT_SMOOTH 0x0B10\n#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129\n#define GL_SAMPLE_COVERAGE_VALUE 0x80AA\n#define GL_COPY 0x1503\n#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB\n#define GL_RIGHT 0x0407\n#define GL_COMPUTE_TEXTURE 0x82A0\n#define GL_TEXTURE_MAX_LEVEL 0x813D\n#define GL_RGB8 0x8051\n#define GL_UNSIGNED_INT_VEC3 0x8DC7\n#define GL_SRC1_COLOR 0x88F9\n#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642\n#define GL_STENCIL_BACK_REF 0x8CA3\n#define GL_TEXTURE0 0x84C0\n#define GL_TEXTURE_MAX_LOD 0x813B\n#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA\n#define GL_LINE_STRIP 0x0003\n#define GL_RGBA32UI 0x8D70\n#define GL_SHADE_MODEL 0x0B54\n#define GL_FLOAT_MAT4x3 0x8B6A\n#define GL_DRAW_BUFFER10 0x882F\n#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E\n#define GL_IMAGE_2D_MULTISAMPLE 0x9055\n#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9\n#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1\n#define GL_GEOMETRY_OUTPUT_TYPE 0x8918\n#define GL_TEXTURE_RED_TYPE 0x8C10\n#define GL_PIXEL_MAP_I_TO_R 0x0C72\n#define GL_FOG_DENSITY 0x0B62\n#define GL_CLIENT_STORAGE_BIT 0x0200\n#define GL_POLYGON_OFFSET_FACTOR 0x8038\n#define GL_INDEX 0x8222\n#define GL_SRGB_WRITE 0x8298\n#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245\n#define GL_ENABLE_BIT 0x00002000\n#define GL_COMPUTE_SUBROUTINE 0x92ED\n#define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1\n#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C\n#define GL_FOG_COORDINATE_ARRAY 0x8457\n#define GL_COLOR_ATTACHMENT9 0x8CE9\n#define GL_FLOAT_MAT3x4 0x8B68\n#define GL_STREAM_DRAW 0x88E0\n#define GL_UNSIGNED_NORMALIZED 0x8C17\n#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7\n#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF\n#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32\n#define GL_CLIP_PLANE4 0x3004\n#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6\n#define GL_INTENSITY 0x8049\n#define GL_INTENSITY12 0x804C\n#define GL_ALL_ATTRIB_BITS 0xFFFFFFFF\n#define GL_SRC1_RGB GL_SOURCE1_RGB\n#define GL_UNSIGNALED 0x9118\n#define GL_COLOR_ATTACHMENT10 0x8CEA\n#define GL_STENCIL_INDEX8 0x8D48\n#define GL_CLIP_PLANE5 0x3005\n#define GL_MAX_DRAW_BUFFERS 0x8824\n#define GL_RGBA_INTEGER 0x8D99\n#define GL_COLOR 0x1800\n#define GL_DOUBLE_MAT3 0x8F47\n#define GL_ALREADY_SIGNALED 0x911A\n#define GL_ARRAY_STRIDE 0x92FE\n#define GL_TEXTURE_MIN_FILTER 0x2801\n#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D\n#define GL_ARRAY_SIZE 0x92FB\n#define GL_CLAMP_TO_EDGE 0x812F\n#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1\n#define GL_IMAGE_2D 0x904D\n#define GL_CAVEAT_SUPPORT 0x82B8\n#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000\n#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB\n#define GL_TEXTURE_BUFFER_BINDING 0x8C2A\n#define GL_VERTEX_ARRAY_BINDING 0x85B5\n#define GL_INCR 0x1E02\n#define GL_TEXTURE_COORD_ARRAY 0x8078\n#define GL_SAMPLER_CUBE_SHADOW 0x8DC5\n#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008\n#define GL_COLOR_ATTACHMENT5 0x8CE5\n#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF\n#define GL_COLOR_ATTACHMENT24 0x8CF8\n#define GL_FRACTIONAL_EVEN 0x8E7C\n#define GL_STENCIL_CLEAR_VALUE 0x0B91\n#define GL_DRAW_BUFFER4 0x8829\n#define GL_RGBA16_SNORM 0x8F9B\n#define GL_TEXTURE_ENV 0x2300\n#define GL_POINT 0x1B00\n#define GL_DOUBLE_MAT3x4 0x8F4C\n#define GL_CURRENT_TEXTURE_COORDS 0x0B03\n#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5\n#define GL_V2F 0x2A20\n#define GL_RG8UI 0x8238\n#define GL_MAP2_TEXTURE_COORD_1 0x0DB3\n#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A\n#define GL_PROJECTION_STACK_DEPTH 0x0BA4\n#define GL_SAMPLER 0x82E6\n#define GL_GEOMETRY_INPUT_TYPE 0x8917\n#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F\n#define GL_NORMAL_MAP 0x8511\n#define GL_RGB16 0x8054\n#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068\n#define GL_DEPTH_COMPONENT 0x1902\n#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242\n#define GL_DRAW_BUFFER0 0x8825\n#define GL_STENCIL_WRITEMASK 0x0B98\n#define GL_ANY_SAMPLES_PASSED 0x8C2F\n#define GL_UNSIGNED_INT_24_8 0x84FA\n#define GL_FRAGMENT_SUBROUTINE 0x92EC\n#define GL_PRIMITIVES_SUBMITTED 0x82EF\n#define GL_MAP1_NORMAL 0x0D92\n#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109\n#define GL_NONE 0\n#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A\n#define GL_TEXTURE_3D 0x806F\n#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C\n#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0\n#define GL_DYNAMIC_STORAGE_BIT 0x0100\n#define GL_IMAGE_CLASS_4_X_32 0x82B9\n#define GL_STENCIL 0x1802\n#define GL_BLUE 0x1905\n#define GL_IMAGE_CLASS_2_X_32 0x82BA\n#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904\n#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38\n#define GL_TIMESTAMP 0x8E28\n#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B\n#define GL_MODELVIEW 0x1700\n#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8\n#define GL_SET 0x150F\n#define GL_LIGHT6 0x4006\n#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE\n#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F\n#define GL_TEXTURE_FILTER_CONTROL 0x8500\n#define GL_QUERY_BY_REGION_WAIT 0x8E15\n#define GL_COLOR_ATTACHMENT22 0x8CF6\n#define GL_TEXTURE29 0x84DD\n#define GL_DECR_WRAP 0x8508\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB\n#define GL_TEXTURE_BASE_LEVEL 0x813C\n#define GL_COORD_REPLACE 0x8862\n#define GL_TEXTURE_MATRIX 0x0BA8\n#define GL_CURRENT_BIT 0x00000001\n#define GL_POLYGON_TOKEN 0x0703\n#define GL_POINT_BIT 0x00000002\n#define GL_CURRENT_RASTER_POSITION 0x0B07\n#define GL_SLUMINANCE_ALPHA 0x8C44\n#define GL_RENDERBUFFER_SAMPLES 0x8CAB\n#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B\n#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1\n#define GL_ELEMENT_ARRAY_BUFFER 0x8893\n#define GL_SLUMINANCE 0x8C46\n#define GL_TEXTURE9 0x84C9\n#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A\n#define GL_CURRENT_COLOR 0x0B00\n#define GL_PROXY_TEXTURE_1D 0x8063\n#define GL_LAYER_PROVOKING_VERTEX 0x825E\n#define GL_RGBA16F 0x881A\n#define GL_TEXTURE8 0x84C8\n#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED\n#define GL_TEXTURE17 0x84D1\n#define GL_INVALID_ENUM 0x0500\n#define GL_NUM_SAMPLE_COUNTS 0x9380\n#define GL_OBJECT_TYPE 0x9112\n#define GL_DOMAIN 0x0A02\n#define GL_FIRST_VERTEX_CONVENTION 0x8E4D\n#define GL_TEXTURE_INTERNAL_FORMAT 0x1003\n#define GL_TESS_GEN_POINT_MODE 0x8E79\n#define GL_TEXTURE_BINDING_1D 0x8068\n#define GL_SHADER_TYPE 0x8B4F\n#define GL_LIGHT3 0x4003\n#define GL_MAX_IMAGE_SAMPLES 0x906D\n#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49\n#define GL_CURRENT_RASTER_INDEX 0x0B05\n#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002\n#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64\n\n\n#include <stddef.h>\n#include <KHR/khrplatform.h>\n#ifndef GLEXT_64_TYPES_DEFINED\n/* This code block is duplicated in glxext.h, so must be protected */\n#define GLEXT_64_TYPES_DEFINED\n/* Define int32_t, int64_t, and uint64_t types for UST/MSC */\n/* (as used in the GL_EXT_timer_query extension). */\n#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n#include <inttypes.h>\n#elif defined(__sun__) || defined(__digital__)\n#include <inttypes.h>\n#if defined(__STDC__)\n#if defined(__arch64__) || defined(_LP64)\ntypedef long int int64_t;\ntypedef unsigned long int uint64_t;\n#else\ntypedef long long int int64_t;\ntypedef unsigned long long int uint64_t;\n#endif /* __arch64__ */\n#endif /* __STDC__ */\n#elif defined( __VMS ) || defined(__sgi)\n#include <inttypes.h>\n#elif defined(__SCO__) || defined(__USLC__)\n#include <stdint.h>\n#elif defined(__UNIXOS2__) || defined(__SOL64__)\ntypedef long int int32_t;\ntypedef long long int int64_t;\ntypedef unsigned long long int uint64_t;\n#elif defined(_WIN32) && defined(__GNUC__)\n#include <stdint.h>\n#elif defined(_WIN32)\ntypedef __int32 int32_t;\ntypedef __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\n#else\n/* Fallback if nothing above works */\n#include <inttypes.h>\n#endif\n#endif\ntypedef unsigned int GLenum;\ntypedef unsigned char GLboolean;\ntypedef unsigned int GLbitfield;\ntypedef void GLvoid;\ntypedef signed char GLbyte;\ntypedef short GLshort;\ntypedef int GLint;\ntypedef int GLclampx;\ntypedef unsigned char GLubyte;\ntypedef unsigned short GLushort;\ntypedef unsigned int GLuint;\ntypedef int GLsizei;\ntypedef float GLfloat;\ntypedef float GLclampf;\ntypedef double GLdouble;\ntypedef double GLclampd;\ntypedef void *GLeglClientBufferEXT;\ntypedef void *GLeglImageOES;\ntypedef char GLchar;\ntypedef char GLcharARB;\n#ifdef __APPLE__\ntypedef void *GLhandleARB;\n#else\ntypedef unsigned int GLhandleARB;\n#endif\ntypedef unsigned short GLhalfARB;\ntypedef unsigned short GLhalf;\ntypedef GLint GLfixed;\n#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)\ntypedef khronos_intptr_t GLintptr;\n#else\ntypedef khronos_intptr_t GLintptr;\n#endif\n#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)\ntypedef khronos_ssize_t GLsizeiptr;\n#else\ntypedef khronos_ssize_t GLsizeiptr;\n#endif\ntypedef int64_t GLint64;\ntypedef uint64_t GLuint64;\n#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)\ntypedef long GLintptrARB;\n#else\ntypedef ptrdiff_t GLintptrARB;\n#endif\n#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)\ntypedef long GLsizeiptrARB;\n#else\ntypedef ptrdiff_t GLsizeiptrARB;\n#endif\ntypedef int64_t GLint64EXT;\ntypedef uint64_t GLuint64EXT;\ntypedef struct __GLsync *GLsync;\nstruct _cl_context;\nstruct _cl_event;\ntypedef void (GLAD_API_PTR *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);\ntypedef void (GLAD_API_PTR *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);\ntypedef void (GLAD_API_PTR *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);\ntypedef void (GLAD_API_PTR *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam);\ntypedef unsigned short GLhalfNV;\ntypedef GLintptr GLvdpauSurfaceNV;\ntypedef void (GLAD_API_PTR *GLVULKANPROCNV)(void);\n\n\n#define GL_VERSION_1_0 1\nGLAD_API_CALL int GLAD_GL_VERSION_1_0;\n#define GL_VERSION_1_1 1\nGLAD_API_CALL int GLAD_GL_VERSION_1_1;\n#define GL_VERSION_1_2 1\nGLAD_API_CALL int GLAD_GL_VERSION_1_2;\n#define GL_VERSION_1_3 1\nGLAD_API_CALL int GLAD_GL_VERSION_1_3;\n#define GL_VERSION_1_4 1\nGLAD_API_CALL int GLAD_GL_VERSION_1_4;\n#define GL_VERSION_1_5 1\nGLAD_API_CALL int GLAD_GL_VERSION_1_5;\n#define GL_VERSION_2_0 1\nGLAD_API_CALL int GLAD_GL_VERSION_2_0;\n#define GL_VERSION_2_1 1\nGLAD_API_CALL int GLAD_GL_VERSION_2_1;\n#define GL_VERSION_3_0 1\nGLAD_API_CALL int GLAD_GL_VERSION_3_0;\n#define GL_VERSION_3_1 1\nGLAD_API_CALL int GLAD_GL_VERSION_3_1;\n#define GL_VERSION_3_2 1\nGLAD_API_CALL int GLAD_GL_VERSION_3_2;\n#define GL_VERSION_3_3 1\nGLAD_API_CALL int GLAD_GL_VERSION_3_3;\n#define GL_VERSION_4_0 1\nGLAD_API_CALL int GLAD_GL_VERSION_4_0;\n#define GL_VERSION_4_1 1\nGLAD_API_CALL int GLAD_GL_VERSION_4_1;\n#define GL_VERSION_4_2 1\nGLAD_API_CALL int GLAD_GL_VERSION_4_2;\n#define GL_VERSION_4_3 1\nGLAD_API_CALL int GLAD_GL_VERSION_4_3;\n#define GL_VERSION_4_4 1\nGLAD_API_CALL int GLAD_GL_VERSION_4_4;\n#define GL_VERSION_4_5 1\nGLAD_API_CALL int GLAD_GL_VERSION_4_5;\n#define GL_VERSION_4_6 1\nGLAD_API_CALL int GLAD_GL_VERSION_4_6;\n#define GL_ARB_point_sprite 1\nGLAD_API_CALL int GLAD_GL_ARB_point_sprite;\n\n\ntypedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIIVPROC)(GLuint   texture, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORDP1UIVPROC)(GLenum   type, const  GLuint  * coords);\ntypedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC)(GLuint   texture, GLsizei   samples, GLenum   internalformat, GLsizei   width, GLsizei   height, GLsizei   depth, GLboolean   fixedsamplelocations);\ntypedef void (GLAD_API_PTR *PFNGLEVALPOINT2PROC)(GLint   i, GLint   j);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBBINDINGPROC)(GLuint   vaobj, GLuint   attribindex, GLuint   bindingindex);\ntypedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC)(GLuint   buffer, GLintptr   offset, GLsizeiptr   length);\ntypedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC)(GLuint   framebuffer, GLenum   pname, GLint  * param);\ntypedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERFPROC)(GLenum   pname, GLfloat   param);\ntypedef void (GLAD_API_PTR *PFNGLGETFLOATI_VPROC)(GLenum   target, GLuint   index, GLfloat  * data);\ntypedef void (GLAD_API_PTR *PFNGLLOADNAMEPROC)(GLuint   name);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE1DPROC)(GLuint   texture, GLint   level, GLint   xoffset, GLint   x, GLint   y, GLsizei   width);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIVPROC)(const  GLuint  * v);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM1DVPROC)(GLint   location, GLsizei   count, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DVPROC)(const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BVPROC)(const  GLbyte  * v);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIPROC)(GLuint   red, GLuint   green, GLuint   blue);\ntypedef void (GLAD_API_PTR *PFNGLGETNCOLORTABLEPROC)(GLenum   target, GLenum   format, GLenum   type, GLsizei   bufSize, void * table);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS3IPROC)(GLint   x, GLint   y, GLint   z);\ntypedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREPROC)(GLenum   texture);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVPROC)(GLuint   index, const  GLuint  * v);\ntypedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERDATAPROC)(GLuint   buffer, GLenum   internalformat, GLenum   format, GLenum   type, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLNORMAL3DPROC)(GLdouble   nx, GLdouble   ny, GLdouble   nz);\ntypedef void (GLAD_API_PTR *PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC)(GLuint   framebuffer, GLsizei   numAttachments, const  GLenum  * attachments, GLint   x, GLint   y, GLsizei   width, GLsizei   height);\ntypedef void (GLAD_API_PTR *PFNGLBINDBUFFERSBASEPROC)(GLenum   target, GLuint   first, GLsizei   count, const  GLuint  * buffers);\ntypedef void (GLAD_API_PTR *PFNGLEVALCOORD1DPROC)(GLdouble   u);\ntypedef void (GLAD_API_PTR *PFNGLGETMAPFVPROC)(GLenum   target, GLenum   query, GLfloat  * v);\ntypedef GLboolean (GLAD_API_PTR *PFNGLISSYNCPROC)(GLsync   sync);\ntypedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DPROC)(GLenum   target, GLint   level, GLint   xoffset, GLint   yoffset, GLsizei   width, GLsizei   height, GLenum   format, GLenum   type, const void * pixels);\ntypedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONPROC)(GLuint   program, const  GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DPROC)(GLenum   target, GLint   level, GLenum   internalformat, GLint   x, GLint   y, GLsizei   width, GLint   border);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IPROC)(GLuint   program, GLint   location, GLint   v0, GLint   v1, GLint   v2, GLint   v3);\ntypedef void (GLAD_API_PTR *PFNGLGETPIXELMAPFVPROC)(GLenum   map, GLfloat  * values);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX4SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DPROC)(GLenum   target, GLsizei   levels, GLenum   internalformat, GLsizei   width, GLsizei   height);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD2FVPROC)(const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2DVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint   index, GLenum   pname, GLuint  * params);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVPROC)(GLuint   index, const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum   mode, GLuint   start, GLuint   end, GLsizei   count, GLenum   type, const void * indices, GLint   basevertex);\ntypedef void (GLAD_API_PTR *PFNGLDEPTHRANGEINDEXEDPROC)(GLuint   index, GLdouble   n, GLdouble   f);\ntypedef GLboolean (GLAD_API_PTR *PFNGLISQUERYPROC)(GLuint   id);\ntypedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPIPELINESPROC)(GLsizei   n, const  GLuint  * pipelines);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERFVPROC)(GLuint   texture, GLint   level, GLenum   pname, GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3DVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLBLITNAMEDFRAMEBUFFERPROC)(GLuint   readFramebuffer, GLuint   drawFramebuffer, GLint   srcX0, GLint   srcY0, GLint   srcX1, GLint   srcY1, GLint   dstX0, GLint   dstY0, GLint   dstX1, GLint   dstY1, GLbitfield   mask, GLenum   filter);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP1UIPROC)(GLenum   texture, GLenum   type, GLuint   coords);\ntypedef void (GLAD_API_PTR *PFNGLINDEXSPROC)(GLshort   c);\ntypedef void (GLAD_API_PTR *PFNGLCOLORP3UIPROC)(GLenum   type, GLuint   color);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP4UIPROC)(GLenum   texture, GLenum   type, GLuint   coords);\ntypedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROC)(GLenum   type);\ntypedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERFIPROC)(GLuint   framebuffer, GLenum   buffer, GLint   drawbuffer, GLfloat   depth, GLint   stencil);\ntypedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC)(GLuint   texture, GLint   level, GLsizei   bufSize, void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGEINSERTPROC)(GLenum   source, GLenum   type, GLuint   id, GLenum   severity, GLsizei   length, const  GLchar  * buf);\ntypedef void (GLAD_API_PTR *PFNGLRECTFPROC)(GLfloat   x1, GLfloat   y1, GLfloat   x2, GLfloat   y2);\ntypedef GLuint (GLAD_API_PTR *PFNGLGETDEBUGMESSAGELOGPROC)(GLuint   count, GLsizei   bufSize, GLenum  * sources, GLenum  * types, GLuint  * ids, GLenum  * severities, GLsizei  * lengths, GLchar  * messageLog);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SPROC)(GLshort   x, GLshort   y, GLshort   z);\ntypedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFERPROC)(GLuint   framebuffer);\ntypedef void (GLAD_API_PTR *PFNGLCOPYIMAGESUBDATAPROC)(GLuint   srcName, GLenum   srcTarget, GLint   srcLevel, GLint   srcX, GLint   srcY, GLint   srcZ, GLuint   dstName, GLenum   dstTarget, GLint   dstLevel, GLint   dstX, GLint   dstY, GLint   dstZ, GLsizei   srcWidth, GLsizei   srcHeight, GLsizei   srcDepth);\ntypedef void (GLAD_API_PTR *PFNGLCOLORPOINTERPROC)(GLint   size, GLenum   type, GLsizei   stride, const void * pointer);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3FVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLGETMATERIALFVPROC)(GLenum   face, GLenum   pname, GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IVPROC)(GLenum   target, const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLDELETESAMPLERSPROC)(GLsizei   count, const  GLuint  * samplers);\ntypedef void (GLAD_API_PTR *PFNGLGETMATERIALIVPROC)(GLenum   face, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLBLENDFUNCPROC)(GLenum   sfactor, GLenum   dfactor);\ntypedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC)(GLuint   framebuffer, GLenum   attachment, GLenum   renderbuffertarget, GLuint   renderbuffer);\ntypedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERDATAPROC)(GLuint   buffer, GLsizeiptr   size, const void * data, GLenum   usage);\ntypedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSPROC)(GLenum   mode, const  GLsizei  * count, GLenum   type, const void *const* indices, GLsizei   drawcount);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IPROC)(GLuint   program, GLint   location, GLint   v0, GLint   v1, GLint   v2);\ntypedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTAGEIVPROC)(GLuint   program, GLenum   shadertype, GLenum   pname, GLint  * values);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLFORMATPROC)(GLuint   attribindex, GLint   size, GLenum   type, GLuint   relativeoffset);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX2SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLRECTSVPROC)(const  GLshort  * v1, const  GLshort  * v2);\ntypedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DPROC)(GLuint   texture, GLsizei   levels, GLenum   internalformat, GLsizei   width, GLsizei   height);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM3FPROC)(GLint   location, GLfloat   v0, GLfloat   v1, GLfloat   v2);\ntypedef void (GLAD_API_PTR *PFNGLDRAWBUFFERPROC)(GLenum   buf);\ntypedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DPROC)(GLenum   target, GLint   level, GLint   xoffset, GLsizei   width, GLenum   format, GLenum   type, const void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORDP2UIVPROC)(GLenum   type, const  GLuint  * coords);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM4FPROC)(GLint   location, GLfloat   v0, GLfloat   v1, GLfloat   v2, GLfloat   v3);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DPROC)(GLuint   index, GLdouble   x, GLdouble   y);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FPROC)(GLuint   index, GLfloat   x, GLfloat   y);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBVPROC)(const  GLubyte  * v);\ntypedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei   n, const  GLuint  * framebuffers);\ntypedef void (GLAD_API_PTR *PFNGLCLEARCOLORPROC)(GLfloat   red, GLfloat   green, GLfloat   blue, GLfloat   alpha);\ntypedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum   target, GLenum   attachment, GLenum   renderbuffertarget, GLuint   renderbuffer);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXGENFVPROC)(GLenum   coord, GLenum   pname, GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4DVPROC)(const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP4UIVPROC)(GLenum   texture, GLenum   type, const  GLuint  * coords);\ntypedef void (GLAD_API_PTR *PFNGLACTIVESHADERPROGRAMPROC)(GLuint   pipeline, GLuint   program);\ntypedef void (GLAD_API_PTR *PFNGLBEGINCONDITIONALRENDERPROC)(GLuint   id, GLenum   mode);\ntypedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DMULTISAMPLEPROC)(GLenum   target, GLsizei   samples, GLenum   internalformat, GLsizei   width, GLsizei   height, GLsizei   depth, GLboolean   fixedsamplelocations);\ntypedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFVPROC)(GLuint   index, const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLMAPGRID1FPROC)(GLint   un, GLfloat   u1, GLfloat   u2);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DPROC)(GLenum   target, GLdouble   s, GLdouble   t, GLdouble   r);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DVPROC)(const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVPROC)(GLenum   target, GLenum   pname, void ** params);\ntypedef void (GLAD_API_PTR *PFNGLTEXGENFVPROC)(GLenum   coord, GLenum   pname, const  GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIVPROC)(GLuint   index, GLenum   type, GLboolean   normalized, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLROTATEDPROC)(GLdouble   angle, GLdouble   x, GLdouble   y, GLdouble   z);\ntypedef void (GLAD_API_PTR *PFNGLCREATEQUERIESPROC)(GLenum   target, GLsizei   n, GLuint  * ids);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2FVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLTEXIMAGE1DPROC)(GLenum   target, GLint   level, GLint   internalformat, GLsizei   width, GLint   border, GLenum   format, GLenum   type, const void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IPROC)(GLint   x, GLint   y, GLint   z);\ntypedef void (GLAD_API_PTR *PFNGLCLAMPCOLORPROC)(GLenum   target, GLenum   clamp);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2FVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX4FPROC)(GLfloat   x, GLfloat   y, GLfloat   z, GLfloat   w);\ntypedef void (GLAD_API_PTR *PFNGLNORMAL3FPROC)(GLfloat   nx, GLfloat   ny, GLfloat   nz);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3UBPROC)(GLubyte   red, GLubyte   green, GLubyte   blue);\ntypedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDPROC)(GLuint   index, GLint   left, GLint   bottom, GLsizei   width, GLsizei   height);\ntypedef void (GLAD_API_PTR *PFNGLPUSHCLIENTATTRIBPROC)(GLbitfield   mask);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DPROC)(GLuint   index, GLdouble   x, GLdouble   y, GLdouble   z, GLdouble   w);\ntypedef void (GLAD_API_PTR *PFNGLUSEPROGRAMSTAGESPROC)(GLuint   pipeline, GLbitfield   stages, GLuint   program);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD3SPROC)(GLshort   s, GLshort   t, GLshort   r);\ntypedef void (GLAD_API_PTR *PFNGLLIGHTFPROC)(GLenum   light, GLenum   pname, GLfloat   param);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD3FVPROC)(const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVPROC)(GLuint   index, const  GLubyte  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DPROC)(GLuint   index, GLdouble   x, GLdouble   y);\ntypedef void (GLAD_API_PTR *PFNGLFOGCOORDDPROC)(GLdouble   coord);\ntypedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPUIVPROC)(GLenum   map, GLsizei   bufSize, GLuint  * values);\ntypedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum   target, GLsizei   samples, GLenum   internalformat, GLsizei   width, GLsizei   height, GLboolean   fixedsamplelocations);\ntypedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTIVPROC)(GLuint   id, GLuint   buffer, GLenum   pname, GLintptr   offset);\ntypedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGIPROC)(GLenum   name, GLuint   index);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS4SPROC)(GLshort   x, GLshort   y, GLshort   z, GLshort   w);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIPROC)(GLuint   index, GLenum   type, GLboolean   normalized, GLuint   value);\ntypedef void (GLAD_API_PTR *PFNGLGETQUERYIVPROC)(GLenum   target, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLBINDVERTEXARRAYPROC)(GLuint   array);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFPROC)(GLenum   target, GLenum   pname, GLfloat   param);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DPROC)(GLdouble   x, GLdouble   y, GLdouble   z);\ntypedef void (GLAD_API_PTR *PFNGLGENERATETEXTUREMIPMAPPROC)(GLuint   texture);\ntypedef void (GLAD_API_PTR *PFNGLDELETESYNCPROC)(GLsync   sync);\ntypedef void (GLAD_API_PTR *PFNGLBINDBUFFERPROC)(GLenum   target, GLuint   buffer);\ntypedef void (GLAD_API_PTR *PFNGLPUSHDEBUGGROUPPROC)(GLenum   source, GLuint   id, GLsizei   length, const  GLchar  * message);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS2IPROC)(GLint   x, GLint   y);\ntypedef void (GLAD_API_PTR *PFNGLBINDIMAGETEXTUREPROC)(GLuint   unit, GLuint   texture, GLint   level, GLboolean   layered, GLint   layer, GLenum   access, GLenum   format);\ntypedef void (GLAD_API_PTR *PFNGLFEEDBACKBUFFERPROC)(GLsizei   size, GLenum   type, GLfloat  * buffer);\ntypedef void (GLAD_API_PTR *PFNGLEVALMESH2PROC)(GLenum   mode, GLint   i1, GLint   i2, GLint   j1, GLint   j2);\ntypedef void (GLAD_API_PTR *PFNGLLINKPROGRAMPROC)(GLuint   program);\ntypedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum   target, GLint   level, GLint   xoffset, GLint   yoffset, GLsizei   width, GLsizei   height, GLenum   format, GLsizei   imageSize, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLPUSHMATRIXPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERPARAMETERIPROC)(GLenum   target, GLenum   pname, GLint   param);\ntypedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint   program, GLuint   uniformBlockIndex, GLsizei   bufSize, GLsizei  * length, GLchar  * uniformBlockName);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM3DPROC)(GLint   location, GLdouble   x, GLdouble   y, GLdouble   z);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVPROC)(GLuint   index, const  GLubyte  * v);\ntypedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE1DPROC)(GLenum   target, GLint   level, GLenum   internalformat, GLsizei   width, GLint   border, GLsizei   imageSize, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKI64_VPROC)(GLuint   xfb, GLenum   pname, GLuint   index, GLint64  * param);\ntypedef void (GLAD_API_PTR *PFNGLCOMPILESHADERPROC)(GLuint   shader);\ntypedef void (GLAD_API_PTR *PFNGLGETLIGHTFVPROC)(GLenum   light, GLenum   pname, GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLPIXELMAPUSVPROC)(GLenum   map, GLsizei   mapsize, const  GLushort  * values);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS4IPROC)(GLint   x, GLint   y, GLint   z, GLint   w);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2DVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum   target, GLenum   attachment, GLenum   textarget, GLuint   texture, GLint   level);\ntypedef void (GLAD_API_PTR *PFNGLINITNAMESPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIPROC)(GLuint   index, GLuint   x);\ntypedef void (GLAD_API_PTR *PFNGLCLEARBUFFERIVPROC)(GLenum   buffer, GLint   drawbuffer, const  GLint  * value);\ntypedef void (GLAD_API_PTR *PFNGLMAP1FPROC)(GLenum   target, GLfloat   u1, GLfloat   u2, GLint   stride, GLint   order, const  GLfloat  * points);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4DVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVPROC)(GLuint   index, GLenum   pname, GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint   program, GLuint   uniformBlockIndex, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum   target, GLsizei   samples, GLenum   internalformat, GLsizei   width, GLsizei   height);\ntypedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINDEXEDIVPROC)(GLuint   vaobj, GLuint   index, GLenum   pname, GLint  * param);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXARRAYELEMENTBUFFERPROC)(GLuint   vaobj, GLuint   buffer);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXGENDVPROC)(GLenum   coord, GLenum   pname, GLdouble  * params);\ntypedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERFVPROC)(GLuint   framebuffer, GLenum   buffer, GLint   drawbuffer, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FPROC)(GLfloat   red, GLfloat   green, GLfloat   blue);\ntypedef void (GLAD_API_PTR *PFNGLSHADERBINARYPROC)(GLsizei   count, const  GLuint  * shaders, GLenum   binaryformat, const void * binary, GLsizei   length);\ntypedef void (GLAD_API_PTR *PFNGLMAP1DPROC)(GLenum   target, GLdouble   u1, GLdouble   u2, GLint   stride, GLint   order, const  GLdouble  * points);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DVPROC)(GLuint   index, const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DPROC)(GLenum   target, GLdouble   s, GLdouble   t, GLdouble   r, GLdouble   q);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD1DVPROC)(const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DMULTISAMPLEPROC)(GLenum   target, GLsizei   samples, GLenum   internalformat, GLsizei   width, GLsizei   height, GLboolean   fixedsamplelocations);\ntypedef void (GLAD_API_PTR *PFNGLGENTRANSFORMFEEDBACKSPROC)(GLsizei   n, GLuint  * ids);\ntypedef void (GLAD_API_PTR *PFNGLCLEARBUFFERSUBDATAPROC)(GLenum   target, GLenum   internalformat, GLintptr   offset, GLsizeiptr   size, GLenum   format, GLenum   type, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2FVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERPARAMETERIVPROC)(GLenum   target, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLPIXELMAPFVPROC)(GLenum   map, GLsizei   mapsize, const  GLfloat  * values);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3FPROC)(GLfloat   red, GLfloat   green, GLfloat   blue);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLMULTMATRIXDPROC)(const  GLdouble  * m);\ntypedef void (GLAD_API_PTR *PFNGLCOPYPIXELSPROC)(GLint   x, GLint   y, GLsizei   width, GLsizei   height, GLenum   type);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM2DVPROC)(GLint   location, GLsizei   count, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLOBJECTLABELPROC)(GLenum   identifier, GLuint   name, GLsizei   length, const  GLchar  * label);\ntypedef void (GLAD_API_PTR *PFNGLGETOBJECTLABELPROC)(GLenum   identifier, GLuint   name, GLsizei   bufSize, GLsizei  * length, GLchar  * label);\ntypedef void (GLAD_API_PTR *PFNGLINDEXFVPROC)(const  GLfloat  * c);\ntypedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC)(GLuint   texture, GLint   level, GLint   xoffset, GLint   yoffset, GLint   zoffset, GLsizei   width, GLsizei   height, GLsizei   depth, GLenum   format, GLsizei   imageSize, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLMAPGRID1DPROC)(GLint   un, GLdouble   u1, GLdouble   u2);\ntypedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTUIVPROC)(GLuint   id, GLuint   buffer, GLenum   pname, GLintptr   offset);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS3SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLSELECTBUFFERPROC)(GLsizei   size, GLuint  * buffer);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IVPROC)(GLuint   index, const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERIPROC)(GLenum   pname, GLint   value);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIUIVPROC)(GLuint   texture, GLenum   pname, GLuint  * params);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3IVPROC)(const  GLint  * v);\ntypedef void * (GLAD_API_PTR *PFNGLMAPBUFFERPROC)(GLenum   target, GLenum   access);\ntypedef void (GLAD_API_PTR *PFNGLNORMALP3UIPROC)(GLenum   type, GLuint   coords);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXPOINTERPROC)(GLint   size, GLenum   type, GLsizei   stride, const void * pointer);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERFVPROC)(GLuint   texture, GLenum   pname, GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint   index, GLint   size, GLenum   type, GLboolean   normalized, GLsizei   stride, const void * pointer);\ntypedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFPROC)(GLfloat   n, GLfloat   f);\ntypedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIVPROC)(GLuint   texture, GLenum   pname, const  GLint  * param);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXP2UIVPROC)(GLenum   type, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4USVPROC)(GLuint   index, const  GLushort  * v);\ntypedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIVPROC)(GLenum   target, GLenum   pname, const  GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLBINDVERTEXBUFFERSPROC)(GLuint   first, GLsizei   count, const  GLuint  * buffers, const  GLintptr  * offsets, const  GLsizei  * strides);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXP3UIVPROC)(GLenum   type, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLINDEXIPROC)(GLint   c);\ntypedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINENAMEPROC)(GLuint   program, GLenum   shadertype, GLuint   index, GLsizei   bufsize, GLsizei  * length, GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum   target, GLint   level, GLint   xoffset, GLint   yoffset, GLint   zoffset, GLsizei   width, GLsizei   height, GLsizei   depth, GLenum   format, GLsizei   imageSize, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint   index, GLenum   pname, void ** pointer);\ntypedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUIVPROC)(GLenum   map, GLuint  * values);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXGENIVPROC)(GLenum   coord, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SPROC)(GLuint   index, GLshort   x, GLshort   y, GLshort   z);\ntypedef void (GLAD_API_PTR *PFNGLPOINTSIZEPROC)(GLfloat   size);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXP2UIPROC)(GLenum   type, GLuint   value);\ntypedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC)(GLenum   mode, const void * indirect, GLintptr   drawcount, GLsizei   maxdrawcount, GLsizei   stride);\ntypedef void (GLAD_API_PTR *PFNGLGETNTEXIMAGEPROC)(GLenum   target, GLint   level, GLenum   format, GLenum   type, GLsizei   bufSize, void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLCULLFACEPROC)(GLenum   mode);\ntypedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIPROC)(GLuint   sampler, GLenum   pname, GLint   param);\ntypedef void (GLAD_API_PTR *PFNGLTEXTUREBARRIERPROC)(void);\ntypedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFERPROC)(GLuint   renderbuffer);\ntypedef void (GLAD_API_PTR *PFNGLBEGINQUERYPROC)(GLenum   target, GLuint   id);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4USPROC)(GLushort   red, GLushort   green, GLushort   blue, GLushort   alpha);\ntypedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVPROC)(GLuint   index, GLenum   pname, GLdouble  * params);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD4IVPROC)(const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLDELETETEXTURESPROC)(GLsizei   n, const  GLuint  * textures);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IVPROC)(const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint   index, GLint   size, GLenum   type, GLsizei   stride, const void * pointer);\ntypedef void (GLAD_API_PTR *PFNGLCREATEVERTEXARRAYSPROC)(GLsizei   n, GLuint  * arrays);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IPROC)(GLuint   index, GLint   x);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIPROC)(GLuint   program, GLint   location, GLuint   v0, GLuint   v1, GLuint   v2);\ntypedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC)(GLuint   texture, GLint   level, GLint   xoffset, GLint   yoffset, GLsizei   width, GLsizei   height, GLenum   format, GLsizei   imageSize, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLRECTDPROC)(GLdouble   x1, GLdouble   y1, GLdouble   x2, GLdouble   y2);\ntypedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXDPROC)(const  GLdouble  * m);\ntypedef void (GLAD_API_PTR *PFNGLTEXENVFPROC)(GLenum   target, GLenum   pname, GLfloat   param);\ntypedef void (GLAD_API_PTR *PFNGLNORMAL3IPROC)(GLint   nx, GLint   ny, GLint   nz);\ntypedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONPROC)(GLuint   program, GLuint   index, const  GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLSTENCILMASKSEPARATEPROC)(GLenum   face, GLuint   mask);\ntypedef void (GLAD_API_PTR *PFNGLGETINTEGERVPROC)(GLenum   pname, GLint  * data);\ntypedef void (GLAD_API_PTR *PFNGLUSEPROGRAMPROC)(GLuint   program);\ntypedef void (GLAD_API_PTR *PFNGLNORMAL3BVPROC)(const  GLbyte  * v);\ntypedef void (GLAD_API_PTR *PFNGLPIXELSTOREIPROC)(GLenum   pname, GLint   param);\ntypedef void (GLAD_API_PTR *PFNGLNORMAL3SPROC)(GLshort   nx, GLshort   ny, GLshort   nz);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4IVPROC)(const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP2UIVPROC)(GLenum   texture, GLenum   type, const  GLuint  * coords);\ntypedef GLboolean (GLAD_API_PTR *PFNGLARETEXTURESRESIDENTPROC)(GLsizei   n, const  GLuint  * textures, GLboolean  * residences);\ntypedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVPROC)(GLuint   program, GLint   location, GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)(GLuint   program, GLenum   shadertype, GLuint   index, GLsizei   bufsize, GLsizei  * length, GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DPROC)(GLenum   target, GLsizei   levels, GLenum   internalformat, GLsizei   width, GLsizei   height, GLsizei   depth);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD1IPROC)(GLint   s);\ntypedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)(GLuint   texture, GLint   level, GLint   xoffset, GLint   yoffset, GLint   zoffset, GLsizei   width, GLsizei   height, GLsizei   depth, GLsizei   bufSize, void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXBUFFERSPROC)(GLuint   vaobj, GLuint   first, GLsizei   count, const  GLuint  * buffers, const  GLintptr  * offsets, const  GLsizei  * strides);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DPROC)(GLdouble   red, GLdouble   green, GLdouble   blue);\ntypedef void (GLAD_API_PTR *PFNGLINTERLEAVEDARRAYSPROC)(GLenum   format, GLsizei   stride, const void * pointer);\ntypedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERPROC)(GLenum   target);\ntypedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDIPROC)(GLenum   target, GLuint   index);\ntypedef void (GLAD_API_PTR *PFNGLBINDSAMPLERSPROC)(GLuint   first, GLsizei   count, const  GLuint  * samplers);\ntypedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum   target, GLint   level, GLint   xoffset, GLsizei   width, GLenum   format, GLsizei   imageSize, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESPROC)(GLsizei   n, const  GLuint  * textures, const  GLfloat  * priorities);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS4DPROC)(GLdouble   x, GLdouble   y, GLdouble   z, GLdouble   w);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USVPROC)(const  GLushort  * v);\ntypedef void (GLAD_API_PTR *PFNGLGETSYNCIVPROC)(GLsync   sync, GLenum   pname, GLsizei   bufSize, GLsizei  * length, GLint  * values);\ntypedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIIVPROC)(GLuint   sampler, GLenum   pname, const  GLint  * param);\ntypedef void (GLAD_API_PTR *PFNGLLIGHTMODELFVPROC)(GLenum   pname, const  GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DPROC)(GLuint   texture, GLsizei   levels, GLenum   internalformat, GLsizei   width, GLsizei   height, GLsizei   depth);\ntypedef void (GLAD_API_PTR *PFNGLRESUMETRANSFORMFEEDBACKPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLGENPROGRAMPIPELINESPROC)(GLsizei   n, GLuint  * pipelines);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX4FVPROC)(const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLLIGHTIVPROC)(GLenum   light, GLenum   pname, const  GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERIVPROC)(GLuint   framebuffer, GLenum   buffer, GLint   drawbuffer, const  GLint  * value);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIVPROC)(GLenum   target, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD3DVPROC)(const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLFOGCOORDPOINTERPROC)(GLenum   type, GLsizei   stride, const void * pointer);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM2IPROC)(GLint   location, GLint   v0, GLint   v1);\ntypedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE3DPROC)(GLuint   texture, GLint   level, GLint   xoffset, GLint   yoffset, GLint   zoffset, GLsizei   width, GLsizei   height, GLsizei   depth, GLenum   format, GLenum   type, const void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLGETDOUBLEI_VPROC)(GLenum   target, GLuint   index, GLdouble  * data);\ntypedef void (GLAD_API_PTR *PFNGLCLEARBUFFERDATAPROC)(GLenum   target, GLenum   internalformat, GLenum   format, GLenum   type, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLBINDTEXTUREPROC)(GLenum   target, GLuint   texture);\ntypedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFERRANGEPROC)(GLuint   texture, GLenum   internalformat, GLuint   buffer, GLintptr   offset, GLsizeiptr   size);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum   target, GLint   level, GLenum   pname, GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLSAMPLEMASKIPROC)(GLuint   maskNumber, GLbitfield   mask);\ntypedef void (GLAD_API_PTR *PFNGLCLEARACCUMPROC)(GLfloat   red, GLfloat   green, GLfloat   blue, GLfloat   alpha);\ntypedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMPROC)(GLuint   program, GLuint   index, GLsizei   bufSize, GLsizei  * length, GLint  * size, GLenum  * type, GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLGETPROGRAMBINARYPROC)(GLuint   program, GLsizei   bufSize, GLsizei  * length, GLenum  * binaryFormat, void * binary);\ntypedef void (GLAD_API_PTR *PFNGLDETACHSHADERPROC)(GLuint   program, GLuint   shader);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SPROC)(GLuint   index, GLshort   x, GLshort   y, GLshort   z, GLshort   w);\ntypedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIPROC)(GLuint   texture, GLenum   pname, GLint   param);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3DVPROC)(const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLBINDSAMPLERPROC)(GLuint   unit, GLuint   sampler);\ntypedef GLenum (GLAD_API_PTR *PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)(GLuint   framebuffer, GLenum   target);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLint  * value);\ntypedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSPROC)(GLenum   mode, const  GLint  * first, const  GLsizei  * count, GLsizei   drawcount);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS4DVPROC)(const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLGETFLOATVPROC)(GLenum   pname, GLfloat  * data);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIPROC)(GLuint   program, GLenum   pname, GLint   value);\ntypedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSPROC)(GLsizei   n, const  GLuint  * renderbuffers);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORPOINTERPROC)(GLint   size, GLenum   type, GLsizei   stride, const void * pointer);\ntypedef GLboolean (GLAD_API_PTR *PFNGLISSAMPLERPROC)(GLuint   sampler);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DVPROC)(GLenum   target, const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECONTROLPROC)(GLenum   source, GLenum   type, GLenum   severity, GLsizei   count, const  GLuint  * ids, GLboolean   enabled);\ntypedef void (GLAD_API_PTR *PFNGLBINDBUFFERSRANGEPROC)(GLenum   target, GLuint   first, GLsizei   count, const  GLuint  * buffers, const  GLintptr  * offsets, const  GLsizeiptr  * sizes);\ntypedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTPROC)(GLenum   mode, const void * indirect, GLsizei   drawcount, GLsizei   stride);\ntypedef void (GLAD_API_PTR *PFNGLGETMAPDVPROC)(GLenum   target, GLenum   query, GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORDP3UIPROC)(GLenum   type, GLuint   coords);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIFORMATPROC)(GLuint   attribindex, GLint   size, GLenum   type, GLuint   relativeoffset);\ntypedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)(GLenum   mode, GLuint   id, GLuint   stream, GLsizei   instancecount);\ntypedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC)(GLuint   xfb, GLuint   index, GLuint   buffer);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXENVIVPROC)(GLenum   target, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLCOLORP3UIVPROC)(GLenum   type, const  GLuint  * color);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FPROC)(GLuint   index, GLfloat   x);\ntypedef void (GLAD_API_PTR *PFNGLPOPCLIENTATTRIBPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXIMAGEPROC)(GLenum   target, GLint   level, GLenum   format, GLenum   type, void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEPROC)(GLenum   target, GLenum   internalformat, GLsizei   width, GLsizei   height);\ntypedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSPROC)(GLsizei   n, const  GLuint  * buffers);\ntypedef GLenum (GLAD_API_PTR *PFNGLCLIENTWAITSYNCPROC)(GLsync   sync, GLbitfield   flags, GLuint64   timeout);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLCLEARTEXIMAGEPROC)(GLuint   texture, GLint   level, GLenum   format, GLenum   type, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FVPROC)(GLenum   target, const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM3UIVPROC)(GLint   location, GLsizei   count, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMNAMEPROC)(GLuint   program, GLuint   uniformIndex, GLsizei   bufSize, GLsizei  * length, GLchar  * uniformName);\ntypedef void (GLAD_API_PTR *PFNGLEVALPOINT1PROC)(GLint   i);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3USPROC)(GLushort   red, GLushort   green, GLushort   blue);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXTURESUBIMAGEPROC)(GLuint   texture, GLint   level, GLint   xoffset, GLint   yoffset, GLint   zoffset, GLsizei   width, GLsizei   height, GLsizei   depth, GLenum   format, GLenum   type, GLsizei   bufSize, void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3IPROC)(GLint   red, GLint   green, GLint   blue);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DVPROC)(const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLEVALCOORD1FVPROC)(const  GLfloat  * u);\ntypedef void (GLAD_API_PTR *PFNGLVIEWPORTARRAYVPROC)(GLuint   first, GLsizei   count, const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IPROC)(GLuint   index, GLint   x, GLint   y, GLint   z, GLint   w);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DPROC)(GLuint   index, GLdouble   x, GLdouble   y, GLdouble   z, GLdouble   w);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4DPROC)(GLdouble   red, GLdouble   green, GLdouble   blue, GLdouble   alpha);\ntypedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATALOCATIONPROC)(GLuint   program, const  GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4UBVPROC)(const  GLubyte  * v);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4DVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4DVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLSCISSORPROC)(GLint   x, GLint   y, GLsizei   width, GLsizei   height);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMSUBROUTINESUIVPROC)(GLenum   shadertype, GLsizei   count, const  GLuint  * indices);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX4IVPROC)(const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLCOLORMASKPROC)(GLboolean   red, GLboolean   green, GLboolean   blue, GLboolean   alpha);\ntypedef void (GLAD_API_PTR *PFNGLSTENCILOPSEPARATEPROC)(GLenum   face, GLenum   sfail, GLenum   dpfail, GLenum   dppass);\ntypedef void (GLAD_API_PTR *PFNGLGETBOOLEANVPROC)(GLenum   pname, GLboolean  * data);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX3DPROC)(GLdouble   x, GLdouble   y, GLdouble   z);\ntypedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPOINTERVPROC)(GLuint   buffer, GLenum   pname, void ** params);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXBUFFERPROC)(GLuint   vaobj, GLuint   bindingindex, GLuint   buffer, GLintptr   offset, GLsizei   stride);\ntypedef void (GLAD_API_PTR *PFNGLGETPOLYGONSTIPPLEPROC)(GLubyte  * mask);\ntypedef void (GLAD_API_PTR *PFNGLSTENCILOPPROC)(GLenum   fail, GLenum   zfail, GLenum   zpass);\ntypedef void (GLAD_API_PTR *PFNGLVIEWPORTPROC)(GLint   x, GLint   y, GLsizei   width, GLsizei   height);\ntypedef void (GLAD_API_PTR *PFNGLGETNPOLYGONSTIPPLEPROC)(GLsizei   bufSize, GLubyte  * pattern);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVPROC)(GLuint   index, const  GLushort  * v);\ntypedef void (GLAD_API_PTR *PFNGLENDTRANSFORMFEEDBACKPROC)(void);\ntypedef GLuint (GLAD_API_PTR *PFNGLCREATEPROGRAMPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLGETSHADERINFOLOGPROC)(GLuint   shader, GLsizei   bufSize, GLsizei  * length, GLchar  * infoLog);\ntypedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINDEXED64IVPROC)(GLuint   vaobj, GLuint   index, GLenum   pname, GLint64  * param);\ntypedef void (GLAD_API_PTR *PFNGLTEXGENDPROC)(GLenum   coord, GLenum   pname, GLdouble   param);\ntypedef void (GLAD_API_PTR *PFNGLINDEXUBPROC)(GLubyte   c);\ntypedef void (GLAD_API_PTR *PFNGLMULTMATRIXFPROC)(const  GLfloat  * m);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP2UIPROC)(GLenum   texture, GLenum   type, GLuint   coords);\ntypedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DPROC)(GLenum   target, GLint   level, GLint   internalformat, GLsizei   width, GLsizei   height, GLsizei   depth, GLint   border, GLenum   format, GLenum   type, const void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLGETNUNIFORMDVPROC)(GLuint   program, GLint   location, GLsizei   bufSize, GLdouble  * params);\ntypedef void (GLAD_API_PTR *PFNGLRECTIVPROC)(const  GLint  * v1, const  GLint  * v2);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD4SPROC)(GLshort   s, GLshort   t, GLshort   r, GLshort   q);\ntypedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DPROC)(GLenum   target, GLint   level, GLenum   internalformat, GLint   x, GLint   y, GLsizei   width, GLsizei   height, GLint   border);\ntypedef void (GLAD_API_PTR *PFNGLLOGICOPPROC)(GLenum   opcode);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FVPROC)(const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFERPROC)(GLenum   target, GLuint   renderbuffer);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLCREATESAMPLERSPROC)(GLsizei   n, GLuint  * samplers);\ntypedef void (GLAD_API_PTR *PFNGLPIXELMAPUIVPROC)(GLenum   map, GLsizei   mapsize, const  GLuint  * values);\ntypedef void (GLAD_API_PTR *PFNGLBLENDCOLORPROC)(GLfloat   red, GLfloat   green, GLfloat   blue, GLfloat   alpha);\ntypedef void (GLAD_API_PTR *PFNGLLIGHTMODELIPROC)(GLenum   pname, GLint   param);\ntypedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIPROC)(GLenum   pname, GLint   param);\ntypedef void (GLAD_API_PTR *PFNGLGENQUERIESPROC)(GLsizei   n, GLuint  * ids);\ntypedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTUREPROC)(GLuint   framebuffer, GLenum   attachment, GLuint   texture, GLint   level);\ntypedef void (GLAD_API_PTR *PFNGLGETNSEPARABLEFILTERPROC)(GLenum   target, GLenum   format, GLenum   type, GLsizei   rowBufSize, void * row, GLsizei   columnBufSize, void * column, void * span);\ntypedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUIVPROC)(GLuint   id, GLenum   pname, GLuint  * params);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4FVPROC)(const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYIVPROC)(GLuint   vaobj, GLenum   pname, GLint  * param);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM1UIPROC)(GLint   location, GLuint   v0);\ntypedef void (GLAD_API_PTR *PFNGLGETNMAPFVPROC)(GLenum   target, GLenum   query, GLsizei   bufSize, GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM4FVPROC)(GLint   location, GLsizei   count, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLTEXGENFPROC)(GLenum   coord, GLenum   pname, GLfloat   param);\ntypedef void (GLAD_API_PTR *PFNGLINDEXIVPROC)(const  GLint  * c);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVPROC)(GLuint   index, const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IPROC)(GLenum   target, GLint   s, GLint   t, GLint   r);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4USVPROC)(const  GLushort  * v);\ntypedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSPROC)(GLsizei   n, const  GLenum  * bufs);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IPROC)(GLint   x, GLint   y);\ntypedef void (GLAD_API_PTR *PFNGLTEXBUFFERRANGEPROC)(GLenum   target, GLenum   internalformat, GLuint   buffer, GLintptr   offset, GLsizeiptr   size);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP1UIVPROC)(GLenum   texture, GLenum   type, const  GLuint  * coords);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IVPROC)(GLuint   index, const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTPROC)(GLenum   mode, GLenum   type, const void * indirect, GLsizei   drawcount, GLsizei   stride);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4FVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM3IPROC)(GLint   location, GLint   v0, GLint   v1, GLint   v2);\ntypedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEPROC)(GLenum   plane, GLdouble  * equation);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIVPROC)(GLuint   index, GLenum   type, GLboolean   normalized, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD2IPROC)(GLint   s, GLint   t);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM4UIPROC)(GLint   location, GLuint   v0, GLuint   v1, GLuint   v2, GLuint   v3);\ntypedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)(GLenum   mode, GLsizei   count, GLenum   type, const void * indices, GLsizei   instancecount, GLint   basevertex, GLuint   baseinstance);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVPROC)(GLuint   index, const  GLushort  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DPROC)(GLuint   index, GLdouble   x);\ntypedef void (GLAD_API_PTR *PFNGLGETLIGHTIVPROC)(GLenum   light, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE1DPROC)(GLuint   texture, GLsizei   levels, GLenum   internalformat, GLsizei   width);\ntypedef void (GLAD_API_PTR *PFNGLSTENCILMASKPROC)(GLuint   mask);\ntypedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum   target, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FPROC)(GLenum   target, GLfloat   s, GLfloat   t, GLfloat   r, GLfloat   q);\ntypedef void (GLAD_API_PTR *PFNGLINDEXDPROC)(GLdouble   c);\ntypedef void (GLAD_API_PTR *PFNGLNORMALP3UIVPROC)(GLenum   type, const  GLuint  * coords);\ntypedef void (GLAD_API_PTR *PFNGLEVALMESH1PROC)(GLenum   mode, GLint   i1, GLint   i2);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORDP3UIVPROC)(GLenum   type, const  GLuint  * coords);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DVPROC)(GLuint   index, const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREPROC)(GLenum   texture);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SPROC)(GLuint   index, GLshort   x, GLshort   y);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVPROC)(GLuint   index, const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIIVPROC)(GLenum   target, GLenum   pname, const  GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS3DPROC)(GLdouble   x, GLdouble   y, GLdouble   z);\ntypedef void (GLAD_API_PTR *PFNGLEVALCOORD2FVPROC)(const  GLfloat  * u);\ntypedef void (GLAD_API_PTR *PFNGLBINDTEXTUREUNITPROC)(GLuint   unit, GLuint   texture);\ntypedef void (GLAD_API_PTR *PFNGLWAITSYNCPROC)(GLsync   sync, GLbitfield   flags, GLuint64   timeout);\ntypedef void (GLAD_API_PTR *PFNGLMATERIALFVPROC)(GLenum   face, GLenum   pname, const  GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IPROC)(GLuint   program, GLint   location, GLint   v0, GLint   v1);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS2SPROC)(GLshort   x, GLshort   y);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4BVPROC)(GLuint   index, const  GLbyte  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4SVPROC)(GLuint   index, const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum   modeRGB, GLenum   modeAlpha);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIVPROC)(GLuint   index, const  GLuint  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIVPROC)(GLuint   index, const  GLuint  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXP4UIVPROC)(GLenum   type, const  GLuint  * value);\ntypedef GLuint (GLAD_API_PTR *PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint   program, const  GLchar  * uniformBlockName);\ntypedef void (GLAD_API_PTR *PFNGLDEPTHFUNCPROC)(GLenum   func);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FPROC)(GLuint   program, GLint   location, GLfloat   v0, GLfloat   v1, GLfloat   v2, GLfloat   v3);\ntypedef void (GLAD_API_PTR *PFNGLSHADERSOURCEPROC)(GLuint   shader, GLsizei   count, const  GLchar  *const* string, const  GLint  * length);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX2IVPROC)(const  GLint  * v);\ntypedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFERPROC)(GLuint   buffer, GLenum   access);\ntypedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFPROC)(GLfloat   d);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM1FPROC)(GLint   location, GLfloat   v0);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DPROC)(GLenum   target, GLdouble   s);\ntypedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUI64VPROC)(GLuint   id, GLenum   pname, GLuint64  * params);\ntypedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC)(GLuint   framebuffer, GLsizei   n, const  GLenum  * bufs);\ntypedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE3DPROC)(GLenum   target, GLint   level, GLint   xoffset, GLint   yoffset, GLint   zoffset, GLsizei   width, GLsizei   height, GLsizei   depth, GLenum   format, GLenum   type, const void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLDELETETRANSFORMFEEDBACKSPROC)(GLsizei   n, const  GLuint  * ids);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX3IVPROC)(const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3FVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREPROC)(GLuint   texture);\ntypedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXFPROC)(const  GLfloat  * m);\ntypedef void (GLAD_API_PTR *PFNGLNEWLISTPROC)(GLuint   list, GLenum   mode);\ntypedef void (GLAD_API_PTR *PFNGLSCALEFPROC)(GLfloat   x, GLfloat   y, GLfloat   z);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX3FPROC)(GLfloat   x, GLfloat   y, GLfloat   z);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD1IVPROC)(const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLFOGCOORDFVPROC)(const  GLfloat  * coord);\ntypedef void (GLAD_API_PTR *PFNGLMAPGRID2DPROC)(GLint   un, GLdouble   u1, GLdouble   u2, GLint   vn, GLdouble   v1, GLdouble   v2);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FVPROC)(const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLREADPIXELSPROC)(GLint   x, GLint   y, GLsizei   width, GLsizei   height, GLenum   format, GLenum   type, void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLINVALIDATETEXSUBIMAGEPROC)(GLuint   texture, GLint   level, GLint   xoffset, GLint   yoffset, GLint   zoffset, GLsizei   width, GLsizei   height, GLsizei   depth);\ntypedef void (GLAD_API_PTR *PFNGLORTHOPROC)(GLdouble   left, GLdouble   right, GLdouble   bottom, GLdouble   top, GLdouble   zNear, GLdouble   zFar);\ntypedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTIVPROC)(GLuint   id, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLFOGFPROC)(GLenum   pname, GLfloat   param);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3SPROC)(GLshort   red, GLshort   green, GLshort   blue);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM2UIVPROC)(GLint   location, GLsizei   count, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLPIXELZOOMPROC)(GLfloat   xfactor, GLfloat   yfactor);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FPROC)(GLuint   program, GLint   location, GLfloat   v0, GLfloat   v1, GLfloat   v2);\ntypedef void (GLAD_API_PTR *PFNGLEVALCOORD2DVPROC)(const  GLdouble  * u);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX3DVPROC)(const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM3FVPROC)(GLint   location, GLsizei   count, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLENABLEPROC)(GLenum   cap);\ntypedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIUIVPROC)(GLuint   texture, GLenum   pname, const  GLuint  * params);\ntypedef void (GLAD_API_PTR *PFNGLFOGCOORDDVPROC)(const  GLdouble  * coord);\ntypedef void (GLAD_API_PTR *PFNGLBUFFERDATAPROC)(GLenum   target, GLsizeiptr   size, const void * data, GLenum   usage);\ntypedef void (GLAD_API_PTR *PFNGLPOPATTRIBPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLNORMAL3DVPROC)(const  GLdouble  * v);\ntypedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATAINDEXPROC)(GLuint   program, const  GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLPASSTHROUGHPROC)(GLfloat   token);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD2DVPROC)(const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORDP4UIVPROC)(GLenum   type, const  GLuint  * coords);\ntypedef void (GLAD_API_PTR *PFNGLCLEARBUFFERUIVPROC)(GLenum   buffer, GLint   drawbuffer, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM3DVPROC)(GLint   location, GLsizei   count, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONIPROC)(GLuint   buf, GLenum   mode);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIPROC)(GLuint   index, GLuint   x, GLuint   y, GLuint   z, GLuint   w);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum   target, GLint   level, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX4IPROC)(GLint   x, GLint   y, GLint   z, GLint   w);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM4UIVPROC)(GLint   location, GLsizei   count, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLTEXENVFVPROC)(GLenum   target, GLenum   pname, const  GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DVPROC)(GLenum   target, const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLCLEARTEXSUBIMAGEPROC)(GLuint   texture, GLint   level, GLint   xoffset, GLint   yoffset, GLint   zoffset, GLsizei   width, GLsizei   height, GLsizei   depth, GLenum   format, GLenum   type, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLTRANSLATEDPROC)(GLdouble   x, GLdouble   y, GLdouble   z);\ntypedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFPROC)(GLenum   pname, GLfloat   param);\ntypedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDVPROC)(GLuint   index, const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLREADBUFFERPROC)(GLenum   src);\ntypedef void (GLAD_API_PTR *PFNGLENDPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum   mode, GLint   first, GLsizei   count, GLsizei   instancecount);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVPROC)(GLuint   index, const  GLuint  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UBVPROC)(GLuint   index, const  GLubyte  * v);\ntypedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC)(GLuint   texture, GLint   level, GLint   xoffset, GLsizei   width, GLenum   format, GLsizei   imageSize, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX2DVPROC)(const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLPUSHNAMEPROC)(GLuint   name);\ntypedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERDATAPROC)(GLuint   buffer);\ntypedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIVPROC)(GLenum   pname, const  GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLGENTEXTURESPROC)(GLsizei   n, GLuint  * textures);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD4FVPROC)(const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLDISPATCHCOMPUTEPROC)(GLuint   num_groups_x, GLuint   num_groups_y, GLuint   num_groups_z);\ntypedef void (GLAD_API_PTR *PFNGLGETUNIFORMUIVPROC)(GLuint   program, GLint   location, GLuint  * params);\ntypedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint   program, GLsizei   uniformCount, const  GLuint  * uniformIndices, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCENAMEPROC)(GLuint   program, GLenum   programInterface, GLuint   index, GLsizei   bufSize, GLsizei  * length, GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX2FVPROC)(const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4UBPROC)(GLubyte   red, GLubyte   green, GLubyte   blue, GLubyte   alpha);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM3IVPROC)(GLint   location, GLsizei   count, const  GLint  * value);\ntypedef void (GLAD_API_PTR *PFNGLCLIPPLANEPROC)(GLenum   plane, const  GLdouble  * equation);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM4IPROC)(GLint   location, GLint   v0, GLint   v1, GLint   v2, GLint   v3);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IVPROC)(const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIVPROC)(GLuint   sampler, GLenum   pname, const  GLint  * param);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM2DPROC)(GLint   location, GLdouble   x, GLdouble   y);\ntypedef void (GLAD_API_PTR *PFNGLPOPMATRIXPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPIPELINEPROC)(GLuint   pipeline);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS3DVPROC)(const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD1FVPROC)(const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD2IVPROC)(const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE2DPROC)(GLuint   texture, GLint   level, GLint   xoffset, GLint   yoffset, GLint   x, GLint   y, GLsizei   width, GLsizei   height);\ntypedef void (GLAD_API_PTR *PFNGLGETATTACHEDSHADERSPROC)(GLuint   program, GLsizei   maxCount, GLsizei  * count, GLuint  * shaders);\ntypedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKI_VPROC)(GLuint   xfb, GLenum   pname, GLuint   index, GLint  * param);\ntypedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum   target, GLenum   attachment, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBIFORMATPROC)(GLuint   vaobj, GLuint   attribindex, GLint   size, GLenum   type, GLuint   relativeoffset);\ntypedef void (GLAD_API_PTR *PFNGLOBJECTPTRLABELPROC)(const void * ptr, GLsizei   length, const  GLchar  * label);\ntypedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPUSVPROC)(GLenum   map, GLsizei   bufSize, GLushort  * values);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FPROC)(GLuint   program, GLint   location, GLfloat   v0);\ntypedef void (GLAD_API_PTR *PFNGLCLEARSTENCILPROC)(GLint   s);\ntypedef void (GLAD_API_PTR *PFNGLDISABLEPROC)(GLenum   cap);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FPROC)(GLuint   index, GLfloat   x, GLfloat   y, GLfloat   z, GLfloat   w);\ntypedef GLuint (GLAD_API_PTR *PFNGLGETSUBROUTINEINDEXPROC)(GLuint   program, GLenum   shadertype, const  GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DPROC)(GLenum   target, GLdouble   s, GLdouble   t);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP3UIVPROC)(GLenum   texture, GLenum   type, const  GLuint  * coords);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FVPROC)(GLenum   target, const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM4IVPROC)(GLint   location, GLsizei   count, const  GLint  * value);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISORPROC)(GLuint   index, GLuint   divisor);\ntypedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONPROC)(GLuint   program, GLuint   color, const  GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLGETNCOMPRESSEDTEXIMAGEPROC)(GLenum   target, GLint   lod, GLsizei   bufSize, void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVPROC)(GLuint   index, const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLEVALCOORD2DPROC)(GLdouble   u, GLdouble   v);\ntypedef void (GLAD_API_PTR *PFNGLGETPOINTERVPROC)(GLenum   pname, void ** params);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DPROC)(GLuint   program, GLint   location, GLdouble   v0, GLdouble   v1, GLdouble   v2, GLdouble   v3);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD2FPROC)(GLfloat   s, GLfloat   t);\ntypedef void (GLAD_API_PTR *PFNGLCOPYBUFFERSUBDATAPROC)(GLenum   readTarget, GLenum   writeTarget, GLintptr   readOffset, GLintptr   writeOffset, GLsizeiptr   size);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3DVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IVPROC)(const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLFINISHPROC)(void);\ntypedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPIPELINEPROC)(GLuint   pipeline);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIVPROC)(GLuint   index, GLenum   type, GLboolean   normalized, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLGETNMAPDVPROC)(GLenum   target, GLenum   query, GLsizei   bufSize, GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLBINDTEXTURESPROC)(GLuint   first, GLsizei   count, const  GLuint  * textures);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP3UIPROC)(GLenum   texture, GLenum   type, GLuint   coords);\ntypedef void (GLAD_API_PTR *PFNGLCOLORMASKIPROC)(GLuint   index, GLboolean   r, GLboolean   g, GLboolean   b, GLboolean   a);\ntypedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTI64VPROC)(GLuint   id, GLenum   pname, GLint64  * params);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SPROC)(GLenum   target, GLshort   s, GLshort   t, GLshort   r);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DPROC)(GLdouble   x, GLdouble   y);\ntypedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)(GLenum   mode, GLint   first, GLsizei   count, GLsizei   instancecount, GLuint   baseinstance);\ntypedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKPROC)(GLenum   mode, GLuint   id);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FPROC)(GLfloat   x, GLfloat   y);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLPOINTERPROC)(GLuint   index, GLint   size, GLenum   type, GLsizei   stride, const void * pointer);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD4FPROC)(GLfloat   s, GLfloat   t, GLfloat   r, GLfloat   q);\ntypedef void (GLAD_API_PTR *PFNGLLIGHTMODELIVPROC)(GLenum   pname, const  GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM2UIPROC)(GLint   location, GLuint   v0, GLuint   v1);\ntypedef void (GLAD_API_PTR *PFNGLDELETEVERTEXARRAYSPROC)(GLsizei   n, const  GLuint  * arrays);\ntypedef void (GLAD_API_PTR *PFNGLTEXBUFFERPROC)(GLenum   target, GLenum   internalformat, GLuint   buffer);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM2FPROC)(GLint   location, GLfloat   v0, GLfloat   v1);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD1DPROC)(GLdouble   s);\ntypedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum   target, GLint   level, GLenum   internalformat, GLsizei   width, GLsizei   height, GLint   border, GLsizei   imageSize, const void * data);\ntypedef GLenum (GLAD_API_PTR *PFNGLGETGRAPHICSRESETSTATUSPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD1SPROC)(GLshort   s);\ntypedef void (GLAD_API_PTR *PFNGLINDEXSVPROC)(const  GLshort  * c);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS4IVPROC)(const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IPROC)(GLint   red, GLint   green, GLint   blue);\ntypedef void (GLAD_API_PTR *PFNGLCALLLISTPROC)(GLuint   list);\ntypedef void (GLAD_API_PTR *PFNGLINDEXUBVPROC)(const  GLubyte  * c);\ntypedef void (GLAD_API_PTR *PFNGLPOLYGONMODEPROC)(GLenum   face, GLenum   mode);\ntypedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum   target, GLenum   attachment, GLuint   texture, GLint   level);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4FVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef GLboolean (GLAD_API_PTR *PFNGLISTRANSFORMFEEDBACKPROC)(GLuint   id);\ntypedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSUBDATAPROC)(GLuint   buffer, GLintptr   offset, GLsizeiptr   size, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLGETPROGRAMINTERFACEIVPROC)(GLuint   program, GLenum   programInterface, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLDISABLECLIENTSTATEPROC)(GLenum   array);\ntypedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC)(GLuint   framebuffer, GLenum   buffer, GLint   drawbuffer, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERFVPROC)(GLenum   target, GLenum   pname, GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBLFORMATPROC)(GLuint   vaobj, GLuint   attribindex, GLint   size, GLenum   type, GLuint   relativeoffset);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX4DPROC)(GLdouble   x, GLdouble   y, GLdouble   z, GLdouble   w);\ntypedef void (GLAD_API_PTR *PFNGLNORMAL3SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS4FPROC)(GLfloat   x, GLfloat   y, GLfloat   z, GLfloat   w);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORDP4UIPROC)(GLenum   type, GLuint   coords);\ntypedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSPROC)(GLsizei   n, GLuint  * renderbuffers);\ntypedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint   program, GLsizei   count, const  GLchar  *const* varyings, GLenum   bufferMode);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC)(GLuint   framebuffer, GLenum   src);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3DVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DVPROC)(GLuint   index, const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM1UIVPROC)(GLint   location, GLsizei   count, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD1SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLGETINTEGERI_VPROC)(GLenum   target, GLuint   index, GLint  * data);\ntypedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE2DPROC)(GLuint   texture, GLint   level, GLint   xoffset, GLint   yoffset, GLsizei   width, GLsizei   height, GLenum   format, GLenum   type, const void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEPROC)(GLuint   renderbuffer, GLenum   internalformat, GLsizei   width, GLsizei   height);\ntypedef void (GLAD_API_PTR *PFNGLGETMAPIVPROC)(GLenum   target, GLenum   query, GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLMATRIXMODEPROC)(GLenum   mode);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIVPROC)(GLuint   index, const  GLuint  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DVPROC)(GLuint   index, const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERSUBDATAPROC)(GLuint   buffer, GLintptr   offset, GLsizeiptr   size, void * data);\ntypedef void (GLAD_API_PTR *PFNGLGENVERTEXARRAYSPROC)(GLsizei   n, GLuint  * arrays);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIVPROC)(GLuint   texture, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX3FVPROC)(const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLMATERIALIVPROC)(GLenum   face, GLenum   pname, const  GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERIPROC)(GLenum   pname, GLint   param);\ntypedef void (GLAD_API_PTR *PFNGLGETNHISTOGRAMPROC)(GLenum   target, GLboolean   reset, GLenum   format, GLenum   type, GLsizei   bufSize, void * values);\ntypedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROGRAMVPROC)(GLenum   type, GLsizei   count, const  GLchar  *const* strings);\ntypedef void (GLAD_API_PTR *PFNGLENABLEVERTEXARRAYATTRIBPROC)(GLuint   vaobj, GLuint   index);\ntypedef void (GLAD_API_PTR *PFNGLENDCONDITIONALRENDERPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLDELETELISTSPROC)(GLuint   list, GLsizei   range);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD2SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC   callback, const void * userParam);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FPROC)(GLenum   target, GLfloat   s);\ntypedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum   target, GLint   level, void * img);\ntypedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum   target);\ntypedef void (GLAD_API_PTR *PFNGLGETINTERNALFORMATI64VPROC)(GLenum   target, GLenum   internalformat, GLenum   pname, GLsizei   bufSize, GLint64  * params);\ntypedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPPROC)(GLenum   target);\ntypedef void (GLAD_API_PTR *PFNGLDELETEQUERIESPROC)(GLsizei   n, const  GLuint  * ids);\ntypedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC)(GLuint   framebuffer, GLenum   pname, GLint   param);\ntypedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum   mode, GLsizei   count, GLenum   type, const void * indices, GLint   basevertex);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DPROC)(GLuint   program, GLint   location, GLdouble   v0);\ntypedef void (GLAD_API_PTR *PFNGLALPHAFUNCPROC)(GLenum   func, GLfloat   ref);\ntypedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC)(GLuint   xfb, GLuint   index, GLuint   buffer, GLintptr   offset, GLsizeiptr   size);\ntypedef void (GLAD_API_PTR *PFNGLLINESTIPPLEPROC)(GLint   factor, GLushort   pattern);\ntypedef void (GLAD_API_PTR *PFNGLTEXGENIPROC)(GLenum   coord, GLenum   pname, GLint   param);\ntypedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DMULTISAMPLEPROC)(GLenum   target, GLsizei   samples, GLenum   internalformat, GLsizei   width, GLsizei   height, GLsizei   depth, GLboolean   fixedsamplelocations);\ntypedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXARRAYPROC)(GLuint   array);\ntypedef void (GLAD_API_PTR *PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC)(GLuint   renderbuffer, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLINVALIDATEFRAMEBUFFERPROC)(GLenum   target, GLsizei   numAttachments, const  GLenum  * attachments);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMBINARYPROC)(GLuint   program, GLenum   binaryFormat, const void * binary, GLsizei   length);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD4DVPROC)(const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX3IPROC)(GLint   x, GLint   y, GLint   z);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BPROC)(GLbyte   red, GLbyte   green, GLbyte   blue);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS4SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLDISABLEIPROC)(GLenum   target, GLuint   index);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVPROC)(GLuint   index, const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLINVALIDATETEXIMAGEPROC)(GLuint   texture, GLint   level);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IPROC)(GLuint   index, GLint   x, GLint   y);\ntypedef void (GLAD_API_PTR *PFNGLINDEXFPROC)(GLfloat   c);\ntypedef void (GLAD_API_PTR *PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint   index);\ntypedef void (GLAD_API_PTR *PFNGLGETNCONVOLUTIONFILTERPROC)(GLenum   target, GLenum   format, GLenum   type, GLsizei   bufSize, void * image);\ntypedef GLenum (GLAD_API_PTR *PFNGLGETERRORPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVPROC)(GLuint   index, const  GLbyte  * v);\ntypedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum   target, GLintptr   offset, GLsizeiptr   length);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORDP1UIPROC)(GLenum   type, GLuint   coords);\ntypedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat   value, GLboolean   invert);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IVPROC)(GLenum   target, const  GLint  * v);\ntypedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPROC)(GLuint   program);\ntypedef GLboolean (GLAD_API_PTR *PFNGLISLISTPROC)(GLuint   list);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVPROC)(GLuint   index, const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FPROC)(GLuint   index, GLfloat   x, GLfloat   y, GLfloat   z);\ntypedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIPROC)(GLenum   target, GLenum   pname, GLint   param);\ntypedef void (GLAD_API_PTR *PFNGLPUSHATTRIBPROC)(GLbitfield   mask);\ntypedef void (GLAD_API_PTR *PFNGLFRONTFACEPROC)(GLenum   mode);\ntypedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)(GLenum   mode, GLsizei   count, GLenum   type, const void * indices, GLsizei   instancecount, GLuint   baseinstance);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SPROC)(GLenum   target, GLshort   s);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IPROC)(GLuint   index, GLint   x, GLint   y, GLint   z);\ntypedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum   target, GLint   level, GLint   xoffset, GLint   x, GLint   y, GLsizei   width);\ntypedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum   target, GLenum   attachment, GLenum   textarget, GLuint   texture, GLint   level, GLint   zoffset);\ntypedef void (GLAD_API_PTR *PFNGLGENSAMPLERSPROC)(GLsizei   count, GLuint  * samplers);\ntypedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFPROC)(GLuint   sampler, GLenum   pname, GLfloat   param);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS4FVPROC)(const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLPAUSETRANSFORMFEEDBACKPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLPOPNAMEPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IVPROC)(GLuint   index, const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLEVALCOORD1FPROC)(GLfloat   u);\ntypedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSPROC)(GLsizei   n, GLuint  * framebuffers);\ntypedef void (GLAD_API_PTR *PFNGLLIGHTIPROC)(GLenum   light, GLenum   pname, GLint   param);\ntypedef void (GLAD_API_PTR *PFNGLTEXTUREVIEWPROC)(GLuint   texture, GLenum   target, GLuint   origtexture, GLenum   internalformat, GLuint   minlevel, GLuint   numlevels, GLuint   minlayer, GLuint   numlayers);\ntypedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXDPROC)(const  GLdouble  * m);\ntypedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLuint   framebuffer, GLenum   attachment, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM4DPROC)(GLint   location, GLdouble   x, GLdouble   y, GLdouble   z, GLdouble   w);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIPROC)(GLuint   index, GLuint   x, GLuint   y, GLuint   z);\ntypedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTERPROC)(GLsizei   stride, const void * pointer);\ntypedef void (GLAD_API_PTR *PFNGLSTENCILFUNCPROC)(GLenum   func, GLint   ref, GLuint   mask);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM1IPROC)(GLint   location, GLint   v0);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIUIVPROC)(GLenum   target, GLenum   pname, GLuint  * params);\ntypedef void (GLAD_API_PTR *PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC)(GLuint   framebuffer, GLsizei   numAttachments, const  GLenum  * attachments);\ntypedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERFVPROC)(GLenum   pname, const  GLfloat  * values);\ntypedef void (GLAD_API_PTR *PFNGLFOGFVPROC)(GLenum   pname, const  GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXP3UIPROC)(GLenum   type, GLuint   value);\ntypedef void (GLAD_API_PTR *PFNGLREADNPIXELSPROC)(GLint   x, GLint   y, GLsizei   width, GLsizei   height, GLenum   format, GLenum   type, GLsizei   bufSize, void * data);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IPROC)(GLenum   target, GLint   s);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBBINDINGPROC)(GLuint   attribindex, GLuint   bindingindex);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DVPROC)(GLenum   target, const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX4SPROC)(GLshort   x, GLshort   y, GLshort   z, GLshort   w);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXBINDINGDIVISORPROC)(GLuint   bindingindex, GLuint   divisor);\ntypedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFVPROC)(GLuint   texture, GLenum   pname, const  GLfloat  * param);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLNORMAL3BPROC)(GLbyte   nx, GLbyte   ny, GLbyte   nz);\ntypedef void (GLAD_API_PTR *PFNGLGETUNIFORMSUBROUTINEUIVPROC)(GLenum   shadertype, GLint   location, GLuint  * params);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX3SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SVPROC)(GLenum   target, const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPARAMETERI64VPROC)(GLuint   buffer, GLenum   pname, GLint64  * params);\ntypedef void (GLAD_API_PTR *PFNGLDRAWPIXELSPROC)(GLsizei   width, GLsizei   height, GLenum   format, GLenum   type, const void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLCALLLISTSPROC)(GLsizei   n, GLenum   type, const void * lists);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD3IPROC)(GLint   s, GLint   t, GLint   r);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIPROC)(GLuint   program, GLint   location, GLuint   v0, GLuint   v1);\ntypedef void (GLAD_API_PTR *PFNGLQUERYCOUNTERPROC)(GLuint   id, GLenum   target);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM1IVPROC)(GLint   location, GLsizei   count, const  GLint  * value);\ntypedef void (GLAD_API_PTR *PFNGLSTENCILFUNCSEPARATEPROC)(GLenum   face, GLenum   func, GLint   ref, GLuint   mask);\ntypedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPARAMETERIVPROC)(GLuint   buffer, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2DVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBPROC)(GLuint   program, GLuint   index, GLsizei   bufSize, GLsizei  * length, GLint  * size, GLenum  * type, GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint   index);\ntypedef void (GLAD_API_PTR *PFNGLMATERIALIPROC)(GLenum   face, GLenum   pname, GLint   param);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM2FVPROC)(GLint   location, GLsizei   count, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS3FVPROC)(const  GLfloat  * v);\ntypedef GLint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)(GLuint   program, GLenum   programInterface, const  GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLGETDOUBLEVPROC)(GLenum   pname, GLdouble  * data);\ntypedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum   mode, GLsizei   count, GLenum   type, const void * indices, GLsizei   instancecount, GLint   basevertex);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4DVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4BVPROC)(const  GLbyte  * v);\ntypedef void (GLAD_API_PTR *PFNGLGETINTERNALFORMATIVPROC)(GLenum   target, GLenum   internalformat, GLenum   pname, GLsizei   bufSize, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)(GLuint   program, GLenum   shadertype, GLuint   index, GLenum   pname, GLint  * values);\ntypedef void (GLAD_API_PTR *PFNGLGETQUERYINDEXEDIVPROC)(GLenum   target, GLuint   index, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLBINDVERTEXBUFFERPROC)(GLuint   bindingindex, GLuint   buffer, GLintptr   offset, GLsizei   stride);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD3FPROC)(GLfloat   s, GLfloat   t, GLfloat   r);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3UIVPROC)(const  GLuint  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVPROC)(GLuint   index, const  GLbyte  * v);\ntypedef void (GLAD_API_PTR *PFNGLCLEARPROC)(GLbitfield   mask);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS2DVPROC)(const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD2SPROC)(GLshort   s, GLshort   t);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIPROC)(GLuint   index, GLenum   type, GLboolean   normalized, GLuint   value);\ntypedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum   target, GLenum   attachment, GLuint   texture, GLint   level, GLint   layer);\ntypedef void (GLAD_API_PTR *PFNGLTEXENVIPROC)(GLenum   target, GLenum   pname, GLint   param);\ntypedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFPROC)(GLuint   texture, GLenum   pname, GLfloat   param);\ntypedef void (GLAD_API_PTR *PFNGLMATERIALFPROC)(GLenum   face, GLenum   pname, GLfloat   param);\ntypedef void (GLAD_API_PTR *PFNGLGETUNIFORMDVPROC)(GLuint   program, GLint   location, GLdouble  * params);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLint  * value);\ntypedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIUIVPROC)(GLenum   target, GLenum   pname, const  GLuint  * params);\ntypedef void (GLAD_API_PTR *PFNGLCLEARINDEXPROC)(GLfloat   c);\ntypedef void (GLAD_API_PTR *PFNGLDISPATCHCOMPUTEINDIRECTPROC)(GLintptr   indirect);\ntypedef void (GLAD_API_PTR *PFNGLROTATEFPROC)(GLfloat   angle, GLfloat   x, GLfloat   y, GLfloat   z);\ntypedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE1DPROC)(GLuint   texture, GLint   level, GLint   xoffset, GLsizei   width, GLenum   format, GLenum   type, const void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETCLAMPPROC)(GLfloat   factor, GLfloat   units, GLfloat   clamp);\ntypedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIUIVPROC)(GLuint   sampler, GLenum   pname, const  GLuint  * param);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLint  * value);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SPROC)(GLshort   red, GLshort   green, GLshort   blue);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBLDVPROC)(GLuint   index, GLenum   pname, GLdouble  * params);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS2FVPROC)(const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLSHADEMODELPROC)(GLenum   mode);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLNORMAL3FVPROC)(const  GLfloat  * v);\ntypedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERPROC)(GLuint   buffer);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FPROC)(GLenum   target, GLfloat   s, GLfloat   t, GLfloat   r);\ntypedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFERPROC)(GLenum   target, GLuint   framebuffer);\ntypedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)(GLuint   program, GLuint   colorNumber, GLuint   index, const  GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLBINDBUFFERBASEPROC)(GLenum   target, GLuint   index, GLuint   buffer);\ntypedef void (GLAD_API_PTR *PFNGLGENBUFFERSPROC)(GLsizei   n, GLuint  * buffers);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD1FPROC)(GLfloat   s);\ntypedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAPROC)(GLenum   target, GLintptr   offset, GLsizeiptr   size, void * data);\ntypedef void (GLAD_API_PTR *PFNGLCREATETRANSFORMFEEDBACKSPROC)(GLsizei   n, GLuint  * ids);\ntypedef void (GLAD_API_PTR *PFNGLMAP2FPROC)(GLenum   target, GLfloat   u1, GLfloat   u2, GLint   ustride, GLint   uorder, GLfloat   v1, GLfloat   v2, GLint   vstride, GLint   vorder, const  GLfloat  * points);\ntypedef void (GLAD_API_PTR *PFNGLCREATEBUFFERSPROC)(GLsizei   n, GLuint  * buffers);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3USVPROC)(const  GLushort  * v);\ntypedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint   sampler, GLenum   pname, GLfloat  * params);\ntypedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONPROC)(GLuint   program, const  GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX2DPROC)(GLdouble   x, GLdouble   y);\ntypedef GLint (GLAD_API_PTR *PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)(GLuint   program, GLenum   shadertype, const  GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERSUBDATAPROC)(GLuint   buffer, GLintptr   offset, GLsizeiptr   length);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2DVPROC)(GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERSUBDATAPROC)(GLuint   buffer, GLenum   internalformat, GLintptr   offset, GLsizeiptr   size, GLenum   format, GLenum   type, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVPROC)(GLuint   program, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSPROC)(GLenum   mode, GLuint   start, GLuint   end, GLsizei   count, GLenum   type, const void * indices);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4FVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLGETINTEGER64I_VPROC)(GLenum   target, GLuint   index, GLint64  * data);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DPROC)(GLuint   index, GLdouble   x);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXTUREIMAGEPROC)(GLuint   texture, GLint   level, GLenum   format, GLenum   type, GLsizei   bufSize, void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLGETNUNIFORMIVPROC)(GLuint   program, GLint   location, GLsizei   bufSize, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IPROC)(GLuint   program, GLint   location, GLint   v0);\ntypedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)(GLenum   mode, GLuint   id, GLsizei   instancecount);\ntypedef GLuint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEINDEXPROC)(GLuint   program, GLenum   programInterface, const  GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DPROC)(GLuint   program, GLint   location, GLdouble   v0, GLdouble   v1);\ntypedef GLboolean (GLAD_API_PTR *PFNGLUNMAPNAMEDBUFFERPROC)(GLuint   buffer);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FPROC)(GLenum   target, GLfloat   s, GLfloat   t);\ntypedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVPROC)(GLenum   pname, const  GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3FVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLBINDBUFFERRANGEPROC)(GLenum   target, GLuint   index, GLuint   buffer, GLintptr   offset, GLsizeiptr   size);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DVPROC)(GLenum   target, const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLCOLORMATERIALPROC)(GLenum   face, GLenum   mode);\ntypedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONPROC)(GLenum   mode);\ntypedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERPROC)(GLint   srcX0, GLint   srcY0, GLint   srcX1, GLint   srcY1, GLint   dstX0, GLint   dstY0, GLint   dstX1, GLint   dstY1, GLbitfield   mask, GLenum   filter);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3DPROC)(GLdouble   red, GLdouble   green, GLdouble   blue);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IVPROC)(GLenum   target, const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLLIGHTFVPROC)(GLenum   light, GLenum   pname, const  GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVPROC)(GLuint   index, const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLDEPTHMASKPROC)(GLboolean   flag);\ntypedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint   program, GLuint   index, GLsizei   bufSize, GLsizei  * length, GLsizei  * size, GLenum  * type, GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIPROC)(GLuint   program, GLint   location, GLuint   v0);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DPROC)(GLuint   index, GLdouble   x, GLdouble   y, GLdouble   z);\ntypedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINDIRECTPROC)(GLenum   mode, GLenum   type, const void * indirect);\ntypedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXFPROC)(const  GLfloat  * m);\ntypedef void (GLAD_API_PTR *PFNGLENDQUERYINDEXEDPROC)(GLenum   target, GLuint   index);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USPROC)(GLushort   red, GLushort   green, GLushort   blue);\ntypedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC)(GLuint   texture, GLsizei   samples, GLenum   internalformat, GLsizei   width, GLsizei   height, GLboolean   fixedsamplelocations);\ntypedef void (GLAD_API_PTR *PFNGLPIXELSTOREFPROC)(GLenum   pname, GLfloat   param);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM2IVPROC)(GLint   location, GLsizei   count, const  GLint  * value);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS2SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX2IPROC)(GLint   x, GLint   y);\ntypedef void (GLAD_API_PTR *PFNGLFRUSTUMPROC)(GLdouble   left, GLdouble   right, GLdouble   bottom, GLdouble   top, GLdouble   zNear, GLdouble   zFar);\ntypedef void (GLAD_API_PTR *PFNGLMEMORYBARRIERPROC)(GLbitfield   barriers);\ntypedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGPROC)(GLenum   name);\ntypedef void (GLAD_API_PTR *PFNGLLINEWIDTHPROC)(GLfloat   width);\ntypedef void (GLAD_API_PTR *PFNGLNORMALPOINTERPROC)(GLenum   type, GLsizei   stride, const void * pointer);\ntypedef void (GLAD_API_PTR *PFNGLGETNUNIFORMUIVPROC)(GLuint   program, GLint   location, GLsizei   bufSize, GLuint  * params);\ntypedef void (GLAD_API_PTR *PFNGLDEPTHRANGEARRAYVPROC)(GLuint   first, GLsizei   count, const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORDP2UIPROC)(GLenum   type, GLuint   coords);\ntypedef void (GLAD_API_PTR *PFNGLATTACHSHADERPROC)(GLuint   program, GLuint   shader);\ntypedef void (GLAD_API_PTR *PFNGLDRAWARRAYSPROC)(GLenum   mode, GLint   first, GLsizei   count);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4SPROC)(GLshort   red, GLshort   green, GLshort   blue, GLshort   alpha);\ntypedef void (GLAD_API_PTR *PFNGLTEXGENDVPROC)(GLenum   coord, GLenum   pname, const  GLdouble  * params);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIUIVPROC)(GLuint   sampler, GLenum   pname, GLuint  * params);\ntypedef void (GLAD_API_PTR *PFNGLENDQUERYPROC)(GLenum   target);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SPROC)(GLshort   x, GLshort   y);\ntypedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINDIRECTPROC)(GLenum   mode, const void * indirect);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS3SPROC)(GLshort   x, GLshort   y, GLshort   z);\ntypedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPFVPROC)(GLenum   map, GLsizei   bufSize, GLfloat  * values);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD3SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLRECTIPROC)(GLint   x1, GLint   y1, GLint   x2, GLint   y2);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM4DVPROC)(GLint   location, GLsizei   count, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEIPROC)(GLuint   buf, GLenum   modeRGB, GLenum   modeAlpha);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEIVPROC)(GLuint   program, GLenum   programInterface, GLuint   index, GLsizei   propCount, const  GLenum  * props, GLsizei   bufSize, GLsizei  * length, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLINVALIDATESUBFRAMEBUFFERPROC)(GLenum   target, GLsizei   numAttachments, const  GLenum  * attachments, GLint   x, GLint   y, GLsizei   width, GLsizei   height);\ntypedef GLsync (GLAD_API_PTR *PFNGLFENCESYNCPROC)(GLenum   condition, GLbitfield   flags);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM3UIPROC)(GLint   location, GLuint   v0, GLuint   v1, GLuint   v2);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORP3UIVPROC)(GLenum   type, const  GLuint  * color);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SPROC)(GLuint   index, GLshort   x);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVPROC)(GLuint   index, const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLLOADMATRIXFPROC)(const  GLfloat  * m);\ntypedef void (GLAD_API_PTR *PFNGLTRANSLATEFPROC)(GLfloat   x, GLfloat   y, GLfloat   z);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVPROC)(GLenum   target, const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLint  * value);\ntypedef void (GLAD_API_PTR *PFNGLMAPGRID2FPROC)(GLint   un, GLfloat   u1, GLfloat   u2, GLint   vn, GLfloat   v1, GLfloat   v2);\ntypedef void (GLAD_API_PTR *PFNGLENABLECLIENTSTATEPROC)(GLenum   array);\ntypedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVPROC)(GLuint   program, GLint   location, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLEVALCOORD1DVPROC)(const  GLdouble  * u);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IVPROC)(GLuint   index, const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVPROC)(GLuint   index, const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLGETMULTISAMPLEFVPROC)(GLenum   pname, GLuint   index, GLfloat  * val);\ntypedef void (GLAD_API_PTR *PFNGLINDEXDVPROC)(const  GLdouble  * c);\ntypedef void (GLAD_API_PTR *PFNGLBLENDFUNCIPROC)(GLuint   buf, GLenum   src, GLenum   dst);\ntypedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDPROC)(GLenum   cap);\ntypedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUSVPROC)(GLenum   map, GLushort  * values);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS3IVPROC)(const  GLint  * v);\ntypedef void * (GLAD_API_PTR *PFNGLMAPBUFFERRANGEPROC)(GLenum   target, GLintptr   offset, GLsizeiptr   length, GLbitfield   access);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SPROC)(GLenum   target, GLshort   s, GLshort   t);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS2FPROC)(GLfloat   x, GLfloat   y);\ntypedef void (GLAD_API_PTR *PFNGLMINSAMPLESHADINGPROC)(GLfloat   value);\ntypedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTUI64VPROC)(GLuint   id, GLuint   buffer, GLenum   pname, GLintptr   offset);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IPROC)(GLenum   target, GLint   s, GLint   t);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIVPROC)(GLuint   index, GLenum   type, GLboolean   normalized, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX2FPROC)(GLfloat   x, GLfloat   y);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXARRAYBINDINGDIVISORPROC)(GLuint   vaobj, GLuint   bindingindex, GLuint   divisor);\ntypedef void (GLAD_API_PTR *PFNGLINDEXPOINTERPROC)(GLenum   type, GLsizei   stride, const void * pointer);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint   program, GLuint   uniformBlockIndex, GLuint   uniformBlockBinding);\ntypedef GLint (GLAD_API_PTR *PFNGLRENDERMODEPROC)(GLenum   mode);\ntypedef void (GLAD_API_PTR *PFNGLTEXSTORAGE1DPROC)(GLenum   target, GLsizei   levels, GLenum   internalformat, GLsizei   width);\ntypedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAPROC)(GLenum   target, GLintptr   offset, GLsizeiptr   size, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3FVPROC)(const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLBITMAPPROC)(GLsizei   width, GLsizei   height, GLfloat   xorig, GLfloat   yorig, GLfloat   xmove, GLfloat   ymove, const  GLubyte  * bitmap);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFPROC)(GLuint   index, GLfloat   x, GLfloat   y, GLfloat   w, GLfloat   h);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS2DPROC)(GLdouble   x, GLdouble   y);\ntypedef void (GLAD_API_PTR *PFNGLGETUNIFORMINDICESPROC)(GLuint   program, GLsizei   uniformCount, const  GLchar  *const* uniformNames, GLuint  * uniformIndices);\ntypedef void (GLAD_API_PTR *PFNGLENABLEIPROC)(GLenum   target, GLuint   index);\ntypedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum   target, GLenum   attachment, GLenum   textarget, GLuint   texture, GLint   level);\ntypedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEPROC)(GLenum   sfactorRGB, GLenum   dfactorRGB, GLenum   sfactorAlpha, GLenum   dfactorAlpha);\ntypedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSTORAGEPROC)(GLuint   buffer, GLsizeiptr   size, const void * data, GLbitfield   flags);\ntypedef void (GLAD_API_PTR *PFNGLRECTSPROC)(GLshort   x1, GLshort   y1, GLshort   x2, GLshort   y2);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLPOLYGONSTIPPLEPROC)(const  GLubyte  * mask);\ntypedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum   target, GLint   level, GLint   xoffset, GLint   yoffset, GLint   zoffset, GLint   x, GLint   y, GLsizei   width, GLsizei   height);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBPROC)(GLubyte   red, GLubyte   green, GLubyte   blue);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FPROC)(GLfloat   x, GLfloat   y, GLfloat   z);\ntypedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint   sampler, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLSHADERSTORAGEBLOCKBINDINGPROC)(GLuint   program, GLuint   storageBlockIndex, GLuint   storageBlockBinding);\ntypedef void (GLAD_API_PTR *PFNGLLOADIDENTITYPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum   mode, const  GLsizei  * count, GLenum   type, const void *const* indices, GLsizei   drawcount, const  GLint  * basevertex);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX2SPROC)(GLshort   x, GLshort   y);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IVPROC)(GLenum   target, const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SPROC)(GLenum   target, GLshort   s, GLshort   t, GLshort   r, GLshort   q);\ntypedef void (GLAD_API_PTR *PFNGLRELEASESHADERCOMPILERPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEPROC)(GLuint   shader, GLsizei   bufSize, GLsizei  * length, GLchar  * source);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SVPROC)(GLenum   target, const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFVPROC)(GLenum   target, GLenum   pname, const  GLfloat  * params);\ntypedef GLboolean (GLAD_API_PTR *PFNGLISSHADERPROC)(GLuint   shader);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVPROC)(GLuint   index, const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD4IPROC)(GLint   s, GLint   t, GLint   r, GLint   q);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4UIPROC)(GLuint   red, GLuint   green, GLuint   blue, GLuint   alpha);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3DVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXENVFVPROC)(GLenum   target, GLenum   pname, GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD4DPROC)(GLdouble   s, GLdouble   t, GLdouble   r, GLdouble   q);\ntypedef void (GLAD_API_PTR *PFNGLSCISSORARRAYVPROC)(GLuint   first, GLsizei   count, const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLCREATERENDERBUFFERSPROC)(GLsizei   n, GLuint  * renderbuffers);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVPROC)(GLuint   index, const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4FPROC)(GLfloat   red, GLfloat   green, GLfloat   blue, GLfloat   alpha);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBPROC)(GLuint   index, GLubyte   x, GLubyte   y, GLubyte   z, GLubyte   w);\ntypedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIIVPROC)(GLuint   sampler, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum   target, GLint   level, GLint   xoffset, GLint   yoffset, GLint   x, GLint   y, GLsizei   width, GLsizei   height);\ntypedef void (GLAD_API_PTR *PFNGLNORMAL3IVPROC)(const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLBINDIMAGETEXTURESPROC)(GLuint   first, GLsizei   count, const  GLuint  * textures);\ntypedef void (GLAD_API_PTR *PFNGLTEXGENIVPROC)(GLenum   coord, GLenum   pname, const  GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE3DPROC)(GLenum   target, GLint   level, GLenum   internalformat, GLsizei   width, GLsizei   height, GLsizei   depth, GLint   border, GLsizei   imageSize, const void * data);\ntypedef void (GLAD_API_PTR *PFNGLSCALEDPROC)(GLdouble   x, GLdouble   y, GLdouble   z);\ntypedef void (GLAD_API_PTR *PFNGLCREATEPROGRAMPIPELINESPROC)(GLsizei   n, GLuint  * pipelines);\ntypedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEIPROC)(GLuint   buf, GLenum   srcRGB, GLenum   dstRGB, GLenum   srcAlpha, GLenum   dstAlpha);\ntypedef void (GLAD_API_PTR *PFNGLHINTPROC)(GLenum   target, GLenum   mode);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IPROC)(GLenum   target, GLint   s, GLint   t, GLint   r, GLint   q);\ntypedef void (GLAD_API_PTR *PFNGLINDEXMASKPROC)(GLuint   mask);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FPROC)(GLuint   program, GLint   location, GLfloat   v0, GLfloat   v1);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3BPROC)(GLbyte   red, GLbyte   green, GLbyte   blue);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIVPROC)(GLuint   index, const  GLuint  * v);\ntypedef void (GLAD_API_PTR *PFNGLSPECIALIZESHADERPROC)(GLuint   shader, const  GLchar  * pEntryPoint, GLuint   numSpecializationConstants, const  GLuint  * pConstantIndex, const  GLuint  * pConstantValue);\ntypedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)(GLuint   framebuffer, GLenum   buf);\ntypedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTI64VPROC)(GLuint   id, GLuint   buffer, GLenum   pname, GLintptr   offset);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD3IVPROC)(const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFVPROC)(GLuint   sampler, GLenum   pname, const  GLfloat  * param);\ntypedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIIVPROC)(GLuint   index, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLBUFFERSTORAGEPROC)(GLenum   target, GLsizeiptr   size, const void * data, GLbitfield   flags);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX3SPROC)(GLshort   x, GLshort   y, GLshort   z);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLDEPTHRANGEPROC)(GLdouble   n, GLdouble   f);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS3FPROC)(GLfloat   x, GLfloat   y, GLfloat   z);\ntypedef void (GLAD_API_PTR *PFNGLDELETESHADERPROC)(GLuint   shader);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3BVPROC)(const  GLbyte  * v);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3UBVPROC)(const  GLubyte  * v);\ntypedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVPROC)(GLuint   index, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD4SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLMAP2DPROC)(GLenum   target, GLdouble   u1, GLdouble   u2, GLint   ustride, GLint   uorder, GLdouble   v1, GLdouble   v2, GLint   vstride, GLint   vorder, const  GLdouble  * points);\ntypedef void (GLAD_API_PTR *PFNGLFOGCOORDFPROC)(GLfloat   coord);\ntypedef void (GLAD_API_PTR *PFNGLEDGEFLAGVPROC)(const  GLboolean  * flag);\ntypedef void (GLAD_API_PTR *PFNGLCLIPCONTROLPROC)(GLenum   origin, GLenum   depth);\ntypedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVPROC)(GLenum   target, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKIVPROC)(GLuint   xfb, GLenum   pname, GLint  * param);\ntypedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEIVPROC)(GLuint   pipeline, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLGETNMINMAXPROC)(GLenum   target, GLboolean   reset, GLenum   format, GLenum   type, GLsizei   bufSize, void * values);\ntypedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLuint   renderbuffer, GLsizei   samples, GLenum   internalformat, GLsizei   width, GLsizei   height);\ntypedef void (GLAD_API_PTR *PFNGLCOLORP4UIPROC)(GLenum   type, GLuint   color);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SVPROC)(GLenum   target, const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVPROC)(GLuint   index, const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVPROC)(GLuint   index, const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXP4UIPROC)(GLenum   type, GLuint   value);\ntypedef void (GLAD_API_PTR *PFNGLRECTFVPROC)(const  GLfloat  * v1, const  GLfloat  * v2);\ntypedef void (GLAD_API_PTR *PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum   primitiveMode);\ntypedef void (GLAD_API_PTR *PFNGLARRAYELEMENTPROC)(GLint   i);\ntypedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC)(GLuint   framebuffer, GLenum   attachment, GLuint   texture, GLint   level, GLint   layer);\ntypedef void (GLAD_API_PTR *PFNGLBEGINPROC)(GLenum   mode);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTERPROC)(GLint   size, GLenum   type, GLsizei   stride, const void * pointer);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD3DPROC)(GLdouble   s, GLdouble   t, GLdouble   r);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM1FVPROC)(GLint   location, GLsizei   count, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVPROC)(GLuint   index, const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEINFOLOGPROC)(GLuint   pipeline, GLsizei   bufSize, GLsizei  * length, GLchar  * infoLog);\ntypedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETPROC)(GLfloat   factor, GLfloat   units);\ntypedef void (GLAD_API_PTR *PFNGLGETSHADERPRECISIONFORMATPROC)(GLenum   shadertype, GLenum   precisiontype, GLint  * range, GLint  * precision);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DPROC)(GLuint   program, GLint   location, GLdouble   v0, GLdouble   v1, GLdouble   v2);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLdouble  * value);\ntypedef void (GLAD_API_PTR *PFNGLBINDTRANSFORMFEEDBACKPROC)(GLenum   target, GLuint   id);\ntypedef void (GLAD_API_PTR *PFNGLPROVOKINGVERTEXPROC)(GLenum   mode);\ntypedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXARRAYATTRIBPROC)(GLuint   vaobj, GLuint   index);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FVPROC)(GLenum   target, const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLUNIFORM1DPROC)(GLint   location, GLdouble   x);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBFORMATPROC)(GLuint   attribindex, GLint   size, GLenum   type, GLboolean   normalized, GLuint   relativeoffset);\ntypedef void (GLAD_API_PTR *PFNGLMEMORYBARRIERBYREGIONPROC)(GLbitfield   barriers);\ntypedef void (GLAD_API_PTR *PFNGLPOPDEBUGGROUPPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4BPROC)(GLbyte   red, GLbyte   green, GLbyte   blue, GLbyte   alpha);\ntypedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFERPROC)(GLuint   texture, GLenum   internalformat, GLuint   buffer);\ntypedef void (GLAD_API_PTR *PFNGLGETSHADERIVPROC)(GLuint   shader, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLBEGINQUERYINDEXEDPROC)(GLenum   target, GLuint   index, GLuint   id);\ntypedef void (GLAD_API_PTR *PFNGLCOPYNAMEDBUFFERSUBDATAPROC)(GLuint   readBuffer, GLuint   writeBuffer, GLintptr   readOffset, GLintptr   writeOffset, GLsizeiptr   size);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBFORMATPROC)(GLuint   vaobj, GLuint   attribindex, GLint   size, GLenum   type, GLboolean   normalized, GLuint   relativeoffset);\ntypedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFERRANGEPROC)(GLuint   buffer, GLintptr   offset, GLsizeiptr   length, GLbitfield   access);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4UIVPROC)(const  GLuint  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIPROC)(GLuint   index, GLenum   type, GLboolean   normalized, GLuint   value);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SVPROC)(const  GLshort  * v);\ntypedef void (GLAD_API_PTR *PFNGLFOGIVPROC)(GLenum   pname, const  GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIIVPROC)(GLuint   texture, GLenum   pname, const  GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLLISTBASEPROC)(GLuint   base);\ntypedef void (GLAD_API_PTR *PFNGLCREATEFRAMEBUFFERSPROC)(GLsizei   n, GLuint  * framebuffers);\ntypedef void (GLAD_API_PTR *PFNGLEVALCOORD2FPROC)(GLfloat   u, GLfloat   v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEX4DVPROC)(const  GLdouble  * v);\ntypedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPROC)(GLuint   program);\ntypedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSPROC)(GLenum   mode, GLsizei   count, GLenum   type, const void * indices);\ntypedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)(GLenum   mode, GLuint   id, GLuint   stream);\ntypedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPROC)(GLuint   program);\ntypedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum   mode, GLsizei   count, GLenum   type, const void * indices, GLsizei   instancecount);\ntypedef GLuint (GLAD_API_PTR *PFNGLGENLISTSPROC)(GLsizei   range);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR4IPROC)(GLint   red, GLint   green, GLint   blue, GLint   alpha);\ntypedef void (GLAD_API_PTR *PFNGLCOLOR3UIPROC)(GLuint   red, GLuint   green, GLuint   blue);\ntypedef void (GLAD_API_PTR *PFNGLCREATETEXTURESPROC)(GLenum   target, GLsizei   n, GLuint  * textures);\ntypedef void (GLAD_API_PTR *PFNGLCOLORP4UIVPROC)(GLenum   type, const  GLuint  * color);\ntypedef void (GLAD_API_PTR *PFNGLGETPROGRAMINFOLOGPROC)(GLuint   program, GLsizei   bufSize, GLsizei  * length, GLchar  * infoLog);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIPROC)(GLuint   index, GLenum   type, GLboolean   normalized, GLuint   value);\ntypedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFIPROC)(GLenum   buffer, GLint   drawbuffer, GLfloat   depth, GLint   stencil);\ntypedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE3DPROC)(GLuint   texture, GLint   level, GLint   xoffset, GLint   yoffset, GLint   zoffset, GLint   x, GLint   y, GLsizei   width, GLsizei   height);\ntypedef void (GLAD_API_PTR *PFNGLEDGEFLAGPROC)(GLboolean   flag);\ntypedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERI64VPROC)(GLenum   target, GLenum   pname, GLint64  * params);\ntypedef void (GLAD_API_PTR *PFNGLRASTERPOS2IVPROC)(const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLGETNMAPIVPROC)(GLenum   target, GLenum   query, GLsizei   bufSize, GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLRECTDVPROC)(const  GLdouble  * v1, const  GLdouble  * v2);\ntypedef void (GLAD_API_PTR *PFNGLGETBOOLEANI_VPROC)(GLenum   target, GLuint   index, GLboolean  * data);\ntypedef void (GLAD_API_PTR *PFNGLENDLISTPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLFLUSHPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIPROC)(GLuint   program, GLint   location, GLuint   v0, GLuint   v1, GLuint   v2, GLuint   v3);\ntypedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC)(GLenum   mode, GLenum   type, const void * indirect, GLintptr   drawcount, GLsizei   maxdrawcount, GLsizei   stride);\ntypedef void (GLAD_API_PTR *PFNGLGETINTEGER64VPROC)(GLenum   pname, GLint64  * data);\ntypedef void (GLAD_API_PTR *PFNGLLIGHTMODELFPROC)(GLenum   pname, GLfloat   param);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVPROC)(GLuint   index, const  GLint  * v);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERIVPROC)(GLuint   texture, GLint   level, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLLOADMATRIXDPROC)(const  GLdouble  * m);\ntypedef void (GLAD_API_PTR *PFNGLBINDPROGRAMPIPELINEPROC)(GLuint   pipeline);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIVPROC)(GLuint   program, GLint   location, GLsizei   count, const  GLuint  * value);\ntypedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint   index);\ntypedef void (GLAD_API_PTR *PFNGLCLEARDEPTHPROC)(GLdouble   depth);\ntypedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIIVPROC)(GLenum   target, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FVPROC)(const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DPROC)(GLuint   index, GLdouble   x, GLdouble   y, GLdouble   z);\ntypedef GLint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONPROC)(GLuint   program, GLenum   programInterface, const  GLchar  * name);\ntypedef void (GLAD_API_PTR *PFNGLTEXCOORD2DPROC)(GLdouble   s, GLdouble   t);\ntypedef void (GLAD_API_PTR *PFNGLACCUMPROC)(GLenum   op, GLfloat   value);\ntypedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORP3UIPROC)(GLenum   type, GLuint   color);\ntypedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIPROC)(GLuint   index, GLuint   x, GLuint   y);\ntypedef void (GLAD_API_PTR *PFNGLGETNUNIFORMFVPROC)(GLuint   program, GLint   location, GLsizei   bufSize, GLfloat  * params);\ntypedef void (GLAD_API_PTR *PFNGLFOGIPROC)(GLenum   pname, GLint   param);\ntypedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFVPROC)(GLenum   buffer, GLint   drawbuffer, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLTEXENVIVPROC)(GLenum   target, GLenum   pname, const  GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DPROC)(GLenum   target, GLint   level, GLint   internalformat, GLsizei   width, GLsizei   height, GLint   border, GLenum   format, GLenum   type, const void * pixels);\ntypedef void (GLAD_API_PTR *PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)(GLuint   program, GLuint   bufferIndex, GLenum   pname, GLint  * params);\ntypedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)(GLuint   program, GLint   location, GLsizei   count, GLboolean   transpose, const  GLfloat  * value);\ntypedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FVPROC)(GLenum   target, const  GLfloat  * v);\ntypedef void (GLAD_API_PTR *PFNGLGETOBJECTPTRLABELPROC)(const void * ptr, GLsizei   bufSize, GLsizei  * length, GLchar  * label);\n\nGLAD_API_CALL PFNGLGETTEXTUREPARAMETERIIVPROC glad_glGetTextureParameterIiv;\n#define glGetTextureParameterIiv glad_glGetTextureParameterIiv\nGLAD_API_CALL PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv;\n#define glTexCoordP1uiv glad_glTexCoordP1uiv\nGLAD_API_CALL PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC glad_glTextureStorage3DMultisample;\n#define glTextureStorage3DMultisample glad_glTextureStorage3DMultisample\nGLAD_API_CALL PFNGLEVALPOINT2PROC glad_glEvalPoint2;\n#define glEvalPoint2 glad_glEvalPoint2\nGLAD_API_CALL PFNGLVERTEXARRAYATTRIBBINDINGPROC glad_glVertexArrayAttribBinding;\n#define glVertexArrayAttribBinding glad_glVertexArrayAttribBinding\nGLAD_API_CALL PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC glad_glFlushMappedNamedBufferRange;\n#define glFlushMappedNamedBufferRange glad_glFlushMappedNamedBufferRange\nGLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC glad_glGetNamedFramebufferParameteriv;\n#define glGetNamedFramebufferParameteriv glad_glGetNamedFramebufferParameteriv\nGLAD_API_CALL PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf;\n#define glPixelTransferf glad_glPixelTransferf\nGLAD_API_CALL PFNGLGETFLOATI_VPROC glad_glGetFloati_v;\n#define glGetFloati_v glad_glGetFloati_v\nGLAD_API_CALL PFNGLLOADNAMEPROC glad_glLoadName;\n#define glLoadName glad_glLoadName\nGLAD_API_CALL PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv;\n#define glUniformMatrix4fv glad_glUniformMatrix4fv\nGLAD_API_CALL PFNGLSECONDARYCOLOR3SVPROC glad_glSecondaryColor3sv;\n#define glSecondaryColor3sv glad_glSecondaryColor3sv\nGLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE1DPROC glad_glCopyTextureSubImage1D;\n#define glCopyTextureSubImage1D glad_glCopyTextureSubImage1D\nGLAD_API_CALL PFNGLSECONDARYCOLOR3UIVPROC glad_glSecondaryColor3uiv;\n#define glSecondaryColor3uiv glad_glSecondaryColor3uiv\nGLAD_API_CALL PFNGLUNIFORM1DVPROC glad_glUniform1dv;\n#define glUniform1dv glad_glUniform1dv\nGLAD_API_CALL PFNGLWINDOWPOS3DVPROC glad_glWindowPos3dv;\n#define glWindowPos3dv glad_glWindowPos3dv\nGLAD_API_CALL PFNGLSECONDARYCOLOR3BVPROC glad_glSecondaryColor3bv;\n#define glSecondaryColor3bv glad_glSecondaryColor3bv\nGLAD_API_CALL PFNGLSECONDARYCOLOR3UIPROC glad_glSecondaryColor3ui;\n#define glSecondaryColor3ui glad_glSecondaryColor3ui\nGLAD_API_CALL PFNGLGETNCOLORTABLEPROC glad_glGetnColorTable;\n#define glGetnColorTable glad_glGetnColorTable\nGLAD_API_CALL PFNGLRASTERPOS3IPROC glad_glRasterPos3i;\n#define glRasterPos3i glad_glRasterPos3i\nGLAD_API_CALL PFNGLACTIVETEXTUREPROC glad_glActiveTexture;\n#define glActiveTexture glad_glActiveTexture\nGLAD_API_CALL PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv;\n#define glVertexAttrib4Nuiv glad_glVertexAttrib4Nuiv\nGLAD_API_CALL PFNGLCLEARNAMEDBUFFERDATAPROC glad_glClearNamedBufferData;\n#define glClearNamedBufferData glad_glClearNamedBufferData\nGLAD_API_CALL PFNGLNORMAL3DPROC glad_glNormal3d;\n#define glNormal3d glad_glNormal3d\nGLAD_API_CALL PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC glad_glInvalidateNamedFramebufferSubData;\n#define glInvalidateNamedFramebufferSubData glad_glInvalidateNamedFramebufferSubData\nGLAD_API_CALL PFNGLBINDBUFFERSBASEPROC glad_glBindBuffersBase;\n#define glBindBuffersBase glad_glBindBuffersBase\nGLAD_API_CALL PFNGLEVALCOORD1DPROC glad_glEvalCoord1d;\n#define glEvalCoord1d glad_glEvalCoord1d\nGLAD_API_CALL PFNGLGETMAPFVPROC glad_glGetMapfv;\n#define glGetMapfv glad_glGetMapfv\nGLAD_API_CALL PFNGLISSYNCPROC glad_glIsSync;\n#define glIsSync glad_glIsSync\nGLAD_API_CALL PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D;\n#define glTexSubImage2D glad_glTexSubImage2D\nGLAD_API_CALL PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation;\n#define glGetAttribLocation glad_glGetAttribLocation\nGLAD_API_CALL PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D;\n#define glCopyTexImage1D glad_glCopyTexImage1D\nGLAD_API_CALL PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i;\n#define glProgramUniform4i glad_glProgramUniform4i\nGLAD_API_CALL PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv;\n#define glGetPixelMapfv glad_glGetPixelMapfv\nGLAD_API_CALL PFNGLVERTEX4SVPROC glad_glVertex4sv;\n#define glVertex4sv glad_glVertex4sv\nGLAD_API_CALL PFNGLTEXSTORAGE2DPROC glad_glTexStorage2D;\n#define glTexStorage2D glad_glTexStorage2D\nGLAD_API_CALL PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv;\n#define glTexCoord2fv glad_glTexCoord2fv\nGLAD_API_CALL PFNGLUNIFORMMATRIX3X2DVPROC glad_glUniformMatrix3x2dv;\n#define glUniformMatrix3x2dv glad_glUniformMatrix3x2dv\nGLAD_API_CALL PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv;\n#define glGetVertexAttribIuiv glad_glGetVertexAttribIuiv\nGLAD_API_CALL PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv;\n#define glVertexAttrib3sv glad_glVertexAttrib3sv\nGLAD_API_CALL PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex;\n#define glDrawRangeElementsBaseVertex glad_glDrawRangeElementsBaseVertex\nGLAD_API_CALL PFNGLDEPTHRANGEINDEXEDPROC glad_glDepthRangeIndexed;\n#define glDepthRangeIndexed glad_glDepthRangeIndexed\nGLAD_API_CALL PFNGLISQUERYPROC glad_glIsQuery;\n#define glIsQuery glad_glIsQuery\nGLAD_API_CALL PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines;\n#define glDeleteProgramPipelines glad_glDeleteProgramPipelines\nGLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERFVPROC glad_glGetTextureLevelParameterfv;\n#define glGetTextureLevelParameterfv glad_glGetTextureLevelParameterfv\nGLAD_API_CALL PFNGLUNIFORMMATRIX4X3DVPROC glad_glUniformMatrix4x3dv;\n#define glUniformMatrix4x3dv glad_glUniformMatrix4x3dv\nGLAD_API_CALL PFNGLBLITNAMEDFRAMEBUFFERPROC glad_glBlitNamedFramebuffer;\n#define glBlitNamedFramebuffer glad_glBlitNamedFramebuffer\nGLAD_API_CALL PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui;\n#define glMultiTexCoordP1ui glad_glMultiTexCoordP1ui\nGLAD_API_CALL PFNGLINDEXSPROC glad_glIndexs;\n#define glIndexs glad_glIndexs\nGLAD_API_CALL PFNGLCOLORP3UIPROC glad_glColorP3ui;\n#define glColorP3ui glad_glColorP3ui\nGLAD_API_CALL PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui;\n#define glMultiTexCoordP4ui glad_glMultiTexCoordP4ui\nGLAD_API_CALL PFNGLCREATESHADERPROC glad_glCreateShader;\n#define glCreateShader glad_glCreateShader\nGLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERFIPROC glad_glClearNamedFramebufferfi;\n#define glClearNamedFramebufferfi glad_glClearNamedFramebufferfi\nGLAD_API_CALL PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC glad_glGetCompressedTextureImage;\n#define glGetCompressedTextureImage glad_glGetCompressedTextureImage\nGLAD_API_CALL PFNGLCOLOR4SVPROC glad_glColor4sv;\n#define glColor4sv glad_glColor4sv\nGLAD_API_CALL PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert;\n#define glDebugMessageInsert glad_glDebugMessageInsert\nGLAD_API_CALL PFNGLRECTFPROC glad_glRectf;\n#define glRectf glad_glRectf\nGLAD_API_CALL PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog;\n#define glGetDebugMessageLog glad_glGetDebugMessageLog\nGLAD_API_CALL PFNGLWINDOWPOS3SPROC glad_glWindowPos3s;\n#define glWindowPos3s glad_glWindowPos3s\nGLAD_API_CALL PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer;\n#define glIsFramebuffer glad_glIsFramebuffer\nGLAD_API_CALL PFNGLCOPYIMAGESUBDATAPROC glad_glCopyImageSubData;\n#define glCopyImageSubData glad_glCopyImageSubData\nGLAD_API_CALL PFNGLCOLORPOINTERPROC glad_glColorPointer;\n#define glColorPointer glad_glColorPointer\nGLAD_API_CALL PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv;\n#define glUniformMatrix4x3fv glad_glUniformMatrix4x3fv\nGLAD_API_CALL PFNGLGETMATERIALFVPROC glad_glGetMaterialfv;\n#define glGetMaterialfv glad_glGetMaterialfv\nGLAD_API_CALL PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv;\n#define glMultiTexCoord4iv glad_glMultiTexCoord4iv\nGLAD_API_CALL PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers;\n#define glDeleteSamplers glad_glDeleteSamplers\nGLAD_API_CALL PFNGLGETMATERIALIVPROC glad_glGetMaterialiv;\n#define glGetMaterialiv glad_glGetMaterialiv\nGLAD_API_CALL PFNGLBLENDFUNCPROC glad_glBlendFunc;\n#define glBlendFunc glad_glBlendFunc\nGLAD_API_CALL PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC glad_glNamedFramebufferRenderbuffer;\n#define glNamedFramebufferRenderbuffer glad_glNamedFramebufferRenderbuffer\nGLAD_API_CALL PFNGLNAMEDBUFFERDATAPROC glad_glNamedBufferData;\n#define glNamedBufferData glad_glNamedBufferData\nGLAD_API_CALL PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements;\n#define glMultiDrawElements glad_glMultiDrawElements\nGLAD_API_CALL PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i;\n#define glProgramUniform3i glad_glProgramUniform3i\nGLAD_API_CALL PFNGLGETPROGRAMSTAGEIVPROC glad_glGetProgramStageiv;\n#define glGetProgramStageiv glad_glGetProgramStageiv\nGLAD_API_CALL PFNGLVERTEXATTRIBLFORMATPROC glad_glVertexAttribLFormat;\n#define glVertexAttribLFormat glad_glVertexAttribLFormat\nGLAD_API_CALL PFNGLVERTEX2SVPROC glad_glVertex2sv;\n#define glVertex2sv glad_glVertex2sv\nGLAD_API_CALL PFNGLRECTSVPROC glad_glRectsv;\n#define glRectsv glad_glRectsv\nGLAD_API_CALL PFNGLTEXTURESTORAGE2DPROC glad_glTextureStorage2D;\n#define glTextureStorage2D glad_glTextureStorage2D\nGLAD_API_CALL PFNGLUNIFORM3FPROC glad_glUniform3f;\n#define glUniform3f glad_glUniform3f\nGLAD_API_CALL PFNGLDRAWBUFFERPROC glad_glDrawBuffer;\n#define glDrawBuffer glad_glDrawBuffer\nGLAD_API_CALL PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D;\n#define glTexSubImage1D glad_glTexSubImage1D\nGLAD_API_CALL PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv;\n#define glTexCoordP2uiv glad_glTexCoordP2uiv\nGLAD_API_CALL PFNGLUNIFORM4FPROC glad_glUniform4f;\n#define glUniform4f glad_glUniform4f\nGLAD_API_CALL PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d;\n#define glVertexAttrib2d glad_glVertexAttrib2d\nGLAD_API_CALL PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f;\n#define glVertexAttrib2f glad_glVertexAttrib2f\nGLAD_API_CALL PFNGLSECONDARYCOLOR3UBVPROC glad_glSecondaryColor3ubv;\n#define glSecondaryColor3ubv glad_glSecondaryColor3ubv\nGLAD_API_CALL PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers;\n#define glDeleteFramebuffers glad_glDeleteFramebuffers\nGLAD_API_CALL PFNGLCLEARCOLORPROC glad_glClearColor;\n#define glClearColor glad_glClearColor\nGLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer;\n#define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer\nGLAD_API_CALL PFNGLGETTEXGENFVPROC glad_glGetTexGenfv;\n#define glGetTexGenfv glad_glGetTexGenfv\nGLAD_API_CALL PFNGLCOLOR4DVPROC glad_glColor4dv;\n#define glColor4dv glad_glColor4dv\nGLAD_API_CALL PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv;\n#define glMultiTexCoordP4uiv glad_glMultiTexCoordP4uiv\nGLAD_API_CALL PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram;\n#define glActiveShaderProgram glad_glActiveShaderProgram\nGLAD_API_CALL PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender;\n#define glBeginConditionalRender glad_glBeginConditionalRender\nGLAD_API_CALL PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample;\n#define glTexImage3DMultisample glad_glTexImage3DMultisample\nGLAD_API_CALL PFNGLVIEWPORTINDEXEDFVPROC glad_glViewportIndexedfv;\n#define glViewportIndexedfv glad_glViewportIndexedfv\nGLAD_API_CALL PFNGLMAPGRID1FPROC glad_glMapGrid1f;\n#define glMapGrid1f glad_glMapGrid1f\nGLAD_API_CALL PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d;\n#define glMultiTexCoord3d glad_glMultiTexCoord3d\nGLAD_API_CALL PFNGLWINDOWPOS2DVPROC glad_glWindowPos2dv;\n#define glWindowPos2dv glad_glWindowPos2dv\nGLAD_API_CALL PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv;\n#define glGetBufferPointerv glad_glGetBufferPointerv\nGLAD_API_CALL PFNGLTEXGENFVPROC glad_glTexGenfv;\n#define glTexGenfv glad_glTexGenfv\nGLAD_API_CALL PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv;\n#define glVertexAttribP4uiv glad_glVertexAttribP4uiv\nGLAD_API_CALL PFNGLROTATEDPROC glad_glRotated;\n#define glRotated glad_glRotated\nGLAD_API_CALL PFNGLCREATEQUERIESPROC glad_glCreateQueries;\n#define glCreateQueries glad_glCreateQueries\nGLAD_API_CALL PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv;\n#define glUniformMatrix3x2fv glad_glUniformMatrix3x2fv\nGLAD_API_CALL PFNGLTEXIMAGE1DPROC glad_glTexImage1D;\n#define glTexImage1D glad_glTexImage1D\nGLAD_API_CALL PFNGLWINDOWPOS3IPROC glad_glWindowPos3i;\n#define glWindowPos3i glad_glWindowPos3i\nGLAD_API_CALL PFNGLCLAMPCOLORPROC glad_glClampColor;\n#define glClampColor glad_glClampColor\nGLAD_API_CALL PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv;\n#define glUniformMatrix4x2fv glad_glUniformMatrix4x2fv\nGLAD_API_CALL PFNGLVERTEX4FPROC glad_glVertex4f;\n#define glVertex4f glad_glVertex4f\nGLAD_API_CALL PFNGLNORMAL3FPROC glad_glNormal3f;\n#define glNormal3f glad_glNormal3f\nGLAD_API_CALL PFNGLCOLOR3UBPROC glad_glColor3ub;\n#define glColor3ub glad_glColor3ub\nGLAD_API_CALL PFNGLSCISSORINDEXEDPROC glad_glScissorIndexed;\n#define glScissorIndexed glad_glScissorIndexed\nGLAD_API_CALL PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib;\n#define glPushClientAttrib glad_glPushClientAttrib\nGLAD_API_CALL PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d;\n#define glVertexAttrib4d glad_glVertexAttrib4d\nGLAD_API_CALL PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages;\n#define glUseProgramStages glad_glUseProgramStages\nGLAD_API_CALL PFNGLTEXCOORD3SPROC glad_glTexCoord3s;\n#define glTexCoord3s glad_glTexCoord3s\nGLAD_API_CALL PFNGLLIGHTFPROC glad_glLightf;\n#define glLightf glad_glLightf\nGLAD_API_CALL PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv;\n#define glTexCoord3fv glad_glTexCoord3fv\nGLAD_API_CALL PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv;\n#define glVertexAttrib4Nubv glad_glVertexAttrib4Nubv\nGLAD_API_CALL PFNGLVERTEXATTRIBL2DPROC glad_glVertexAttribL2d;\n#define glVertexAttribL2d glad_glVertexAttribL2d\nGLAD_API_CALL PFNGLFOGCOORDDPROC glad_glFogCoordd;\n#define glFogCoordd glad_glFogCoordd\nGLAD_API_CALL PFNGLGETNPIXELMAPUIVPROC glad_glGetnPixelMapuiv;\n#define glGetnPixelMapuiv glad_glGetnPixelMapuiv\nGLAD_API_CALL PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample;\n#define glTexImage2DMultisample glad_glTexImage2DMultisample\nGLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTIVPROC glad_glGetQueryBufferObjectiv;\n#define glGetQueryBufferObjectiv glad_glGetQueryBufferObjectiv\nGLAD_API_CALL PFNGLGETSTRINGIPROC glad_glGetStringi;\n#define glGetStringi glad_glGetStringi\nGLAD_API_CALL PFNGLRASTERPOS4SPROC glad_glRasterPos4s;\n#define glRasterPos4s glad_glRasterPos4s\nGLAD_API_CALL PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui;\n#define glVertexAttribP2ui glad_glVertexAttribP2ui\nGLAD_API_CALL PFNGLGETQUERYIVPROC glad_glGetQueryiv;\n#define glGetQueryiv glad_glGetQueryiv\nGLAD_API_CALL PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray;\n#define glBindVertexArray glad_glBindVertexArray\nGLAD_API_CALL PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv;\n#define glProgramUniform3dv glad_glProgramUniform3dv\nGLAD_API_CALL PFNGLTEXPARAMETERFPROC glad_glTexParameterf;\n#define glTexParameterf glad_glTexParameterf\nGLAD_API_CALL PFNGLWINDOWPOS3DPROC glad_glWindowPos3d;\n#define glWindowPos3d glad_glWindowPos3d\nGLAD_API_CALL PFNGLGENERATETEXTUREMIPMAPPROC glad_glGenerateTextureMipmap;\n#define glGenerateTextureMipmap glad_glGenerateTextureMipmap\nGLAD_API_CALL PFNGLDELETESYNCPROC glad_glDeleteSync;\n#define glDeleteSync glad_glDeleteSync\nGLAD_API_CALL PFNGLBINDBUFFERPROC glad_glBindBuffer;\n#define glBindBuffer glad_glBindBuffer\nGLAD_API_CALL PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup;\n#define glPushDebugGroup glad_glPushDebugGroup\nGLAD_API_CALL PFNGLRASTERPOS2IPROC glad_glRasterPos2i;\n#define glRasterPos2i glad_glRasterPos2i\nGLAD_API_CALL PFNGLBINDIMAGETEXTUREPROC glad_glBindImageTexture;\n#define glBindImageTexture glad_glBindImageTexture\nGLAD_API_CALL PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer;\n#define glFeedbackBuffer glad_glFeedbackBuffer\nGLAD_API_CALL PFNGLEVALMESH2PROC glad_glEvalMesh2;\n#define glEvalMesh2 glad_glEvalMesh2\nGLAD_API_CALL PFNGLLINKPROGRAMPROC glad_glLinkProgram;\n#define glLinkProgram glad_glLinkProgram\nGLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D;\n#define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D\nGLAD_API_CALL PFNGLPUSHMATRIXPROC glad_glPushMatrix;\n#define glPushMatrix glad_glPushMatrix\nGLAD_API_CALL PFNGLFRAMEBUFFERPARAMETERIPROC glad_glFramebufferParameteri;\n#define glFramebufferParameteri glad_glFramebufferParameteri\nGLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName;\n#define glGetActiveUniformBlockName glad_glGetActiveUniformBlockName\nGLAD_API_CALL PFNGLUNIFORM3DPROC glad_glUniform3d;\n#define glUniform3d glad_glUniform3d\nGLAD_API_CALL PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv;\n#define glVertexAttrib4ubv glad_glVertexAttrib4ubv\nGLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D;\n#define glCompressedTexImage1D glad_glCompressedTexImage1D\nGLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKI64_VPROC glad_glGetTransformFeedbacki64_v;\n#define glGetTransformFeedbacki64_v glad_glGetTransformFeedbacki64_v\nGLAD_API_CALL PFNGLCOMPILESHADERPROC glad_glCompileShader;\n#define glCompileShader glad_glCompileShader\nGLAD_API_CALL PFNGLGETLIGHTFVPROC glad_glGetLightfv;\n#define glGetLightfv glad_glGetLightfv\nGLAD_API_CALL PFNGLPIXELMAPUSVPROC glad_glPixelMapusv;\n#define glPixelMapusv glad_glPixelMapusv\nGLAD_API_CALL PFNGLRASTERPOS4IPROC glad_glRasterPos4i;\n#define glRasterPos4i glad_glRasterPos4i\nGLAD_API_CALL PFNGLUNIFORMMATRIX4X2DVPROC glad_glUniformMatrix4x2dv;\n#define glUniformMatrix4x2dv glad_glUniformMatrix4x2dv\nGLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D;\n#define glFramebufferTexture1D glad_glFramebufferTexture1D\nGLAD_API_CALL PFNGLINITNAMESPROC glad_glInitNames;\n#define glInitNames glad_glInitNames\nGLAD_API_CALL PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui;\n#define glVertexAttribI1ui glad_glVertexAttribI1ui\nGLAD_API_CALL PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv;\n#define glClearBufferiv glad_glClearBufferiv\nGLAD_API_CALL PFNGLMAP1FPROC glad_glMap1f;\n#define glMap1f glad_glMap1f\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv;\n#define glProgramUniformMatrix4dv glad_glProgramUniformMatrix4dv\nGLAD_API_CALL PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv;\n#define glGetVertexAttribfv glad_glGetVertexAttribfv\nGLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv;\n#define glGetActiveUniformBlockiv glad_glGetActiveUniformBlockiv\nGLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample;\n#define glRenderbufferStorageMultisample glad_glRenderbufferStorageMultisample\nGLAD_API_CALL PFNGLGETVERTEXARRAYINDEXEDIVPROC glad_glGetVertexArrayIndexediv;\n#define glGetVertexArrayIndexediv glad_glGetVertexArrayIndexediv\nGLAD_API_CALL PFNGLVERTEXARRAYELEMENTBUFFERPROC glad_glVertexArrayElementBuffer;\n#define glVertexArrayElementBuffer glad_glVertexArrayElementBuffer\nGLAD_API_CALL PFNGLGETTEXGENDVPROC glad_glGetTexGendv;\n#define glGetTexGendv glad_glGetTexGendv\nGLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERFVPROC glad_glClearNamedFramebufferfv;\n#define glClearNamedFramebufferfv glad_glClearNamedFramebufferfv\nGLAD_API_CALL PFNGLSECONDARYCOLOR3FPROC glad_glSecondaryColor3f;\n#define glSecondaryColor3f glad_glSecondaryColor3f\nGLAD_API_CALL PFNGLSHADERBINARYPROC glad_glShaderBinary;\n#define glShaderBinary glad_glShaderBinary\nGLAD_API_CALL PFNGLMAP1DPROC glad_glMap1d;\n#define glMap1d glad_glMap1d\nGLAD_API_CALL PFNGLVERTEXATTRIBL2DVPROC glad_glVertexAttribL2dv;\n#define glVertexAttribL2dv glad_glVertexAttribL2dv\nGLAD_API_CALL PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d;\n#define glMultiTexCoord4d glad_glMultiTexCoord4d\nGLAD_API_CALL PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv;\n#define glTexCoord1dv glad_glTexCoord1dv\nGLAD_API_CALL PFNGLTEXSTORAGE2DMULTISAMPLEPROC glad_glTexStorage2DMultisample;\n#define glTexStorage2DMultisample glad_glTexStorage2DMultisample\nGLAD_API_CALL PFNGLGENTRANSFORMFEEDBACKSPROC glad_glGenTransformFeedbacks;\n#define glGenTransformFeedbacks glad_glGenTransformFeedbacks\nGLAD_API_CALL PFNGLCLEARBUFFERSUBDATAPROC glad_glClearBufferSubData;\n#define glClearBufferSubData glad_glClearBufferSubData\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv;\n#define glProgramUniformMatrix2fv glad_glProgramUniformMatrix2fv\nGLAD_API_CALL PFNGLGETFRAMEBUFFERPARAMETERIVPROC glad_glGetFramebufferParameteriv;\n#define glGetFramebufferParameteriv glad_glGetFramebufferParameteriv\nGLAD_API_CALL PFNGLPIXELMAPFVPROC glad_glPixelMapfv;\n#define glPixelMapfv glad_glPixelMapfv\nGLAD_API_CALL PFNGLCOLOR3FPROC glad_glColor3f;\n#define glColor3f glad_glColor3f\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv;\n#define glProgramUniformMatrix4x3dv glad_glProgramUniformMatrix4x3dv\nGLAD_API_CALL PFNGLMULTMATRIXDPROC glad_glMultMatrixd;\n#define glMultMatrixd glad_glMultMatrixd\nGLAD_API_CALL PFNGLCOPYPIXELSPROC glad_glCopyPixels;\n#define glCopyPixels glad_glCopyPixels\nGLAD_API_CALL PFNGLUNIFORM2DVPROC glad_glUniform2dv;\n#define glUniform2dv glad_glUniform2dv\nGLAD_API_CALL PFNGLCOLOR3SVPROC glad_glColor3sv;\n#define glColor3sv glad_glColor3sv\nGLAD_API_CALL PFNGLOBJECTLABELPROC glad_glObjectLabel;\n#define glObjectLabel glad_glObjectLabel\nGLAD_API_CALL PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel;\n#define glGetObjectLabel glad_glGetObjectLabel\nGLAD_API_CALL PFNGLINDEXFVPROC glad_glIndexfv;\n#define glIndexfv glad_glIndexfv\nGLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC glad_glCompressedTextureSubImage3D;\n#define glCompressedTextureSubImage3D glad_glCompressedTextureSubImage3D\nGLAD_API_CALL PFNGLMAPGRID1DPROC glad_glMapGrid1d;\n#define glMapGrid1d glad_glMapGrid1d\nGLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTUIVPROC glad_glGetQueryBufferObjectuiv;\n#define glGetQueryBufferObjectuiv glad_glGetQueryBufferObjectuiv\nGLAD_API_CALL PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv;\n#define glRasterPos3sv glad_glRasterPos3sv\nGLAD_API_CALL PFNGLSELECTBUFFERPROC glad_glSelectBuffer;\n#define glSelectBuffer glad_glSelectBuffer\nGLAD_API_CALL PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv;\n#define glVertexAttribI3iv glad_glVertexAttribI3iv\nGLAD_API_CALL PFNGLPATCHPARAMETERIPROC glad_glPatchParameteri;\n#define glPatchParameteri glad_glPatchParameteri\nGLAD_API_CALL PFNGLGETTEXTUREPARAMETERIUIVPROC glad_glGetTextureParameterIuiv;\n#define glGetTextureParameterIuiv glad_glGetTextureParameterIuiv\nGLAD_API_CALL PFNGLCOLOR3IVPROC glad_glColor3iv;\n#define glColor3iv glad_glColor3iv\nGLAD_API_CALL PFNGLMAPBUFFERPROC glad_glMapBuffer;\n#define glMapBuffer glad_glMapBuffer\nGLAD_API_CALL PFNGLNORMALP3UIPROC glad_glNormalP3ui;\n#define glNormalP3ui glad_glNormalP3ui\nGLAD_API_CALL PFNGLVERTEXPOINTERPROC glad_glVertexPointer;\n#define glVertexPointer glad_glVertexPointer\nGLAD_API_CALL PFNGLGETTEXTUREPARAMETERFVPROC glad_glGetTextureParameterfv;\n#define glGetTextureParameterfv glad_glGetTextureParameterfv\nGLAD_API_CALL PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer;\n#define glVertexAttribPointer glad_glVertexAttribPointer\nGLAD_API_CALL PFNGLDEPTHRANGEFPROC glad_glDepthRangef;\n#define glDepthRangef glad_glDepthRangef\nGLAD_API_CALL PFNGLTEXTUREPARAMETERIVPROC glad_glTextureParameteriv;\n#define glTextureParameteriv glad_glTextureParameteriv\nGLAD_API_CALL PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv;\n#define glVertexP2uiv glad_glVertexP2uiv\nGLAD_API_CALL PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv;\n#define glVertexAttribI4usv glad_glVertexAttribI4usv\nGLAD_API_CALL PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv;\n#define glTexParameteriv glad_glTexParameteriv\nGLAD_API_CALL PFNGLBINDVERTEXBUFFERSPROC glad_glBindVertexBuffers;\n#define glBindVertexBuffers glad_glBindVertexBuffers\nGLAD_API_CALL PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv;\n#define glVertexP3uiv glad_glVertexP3uiv\nGLAD_API_CALL PFNGLINDEXIPROC glad_glIndexi;\n#define glIndexi glad_glIndexi\nGLAD_API_CALL PFNGLGETACTIVESUBROUTINENAMEPROC glad_glGetActiveSubroutineName;\n#define glGetActiveSubroutineName glad_glGetActiveSubroutineName\nGLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D;\n#define glCompressedTexSubImage3D glad_glCompressedTexSubImage3D\nGLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv;\n#define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv\nGLAD_API_CALL PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv;\n#define glGetPixelMapuiv glad_glGetPixelMapuiv\nGLAD_API_CALL PFNGLGETTEXGENIVPROC glad_glGetTexGeniv;\n#define glGetTexGeniv glad_glGetTexGeniv\nGLAD_API_CALL PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s;\n#define glVertexAttrib3s glad_glVertexAttrib3s\nGLAD_API_CALL PFNGLPOINTSIZEPROC glad_glPointSize;\n#define glPointSize glad_glPointSize\nGLAD_API_CALL PFNGLVERTEXP2UIPROC glad_glVertexP2ui;\n#define glVertexP2ui glad_glVertexP2ui\nGLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC glad_glMultiDrawArraysIndirectCount;\n#define glMultiDrawArraysIndirectCount glad_glMultiDrawArraysIndirectCount\nGLAD_API_CALL PFNGLGETNTEXIMAGEPROC glad_glGetnTexImage;\n#define glGetnTexImage glad_glGetnTexImage\nGLAD_API_CALL PFNGLCULLFACEPROC glad_glCullFace;\n#define glCullFace glad_glCullFace\nGLAD_API_CALL PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri;\n#define glSamplerParameteri glad_glSamplerParameteri\nGLAD_API_CALL PFNGLTEXTUREBARRIERPROC glad_glTextureBarrier;\n#define glTextureBarrier glad_glTextureBarrier\nGLAD_API_CALL PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer;\n#define glIsRenderbuffer glad_glIsRenderbuffer\nGLAD_API_CALL PFNGLBEGINQUERYPROC glad_glBeginQuery;\n#define glBeginQuery glad_glBeginQuery\nGLAD_API_CALL PFNGLCOLOR4USPROC glad_glColor4us;\n#define glColor4us glad_glColor4us\nGLAD_API_CALL PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv;\n#define glGetVertexAttribdv glad_glGetVertexAttribdv\nGLAD_API_CALL PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv;\n#define glTexCoord4iv glad_glTexCoord4iv\nGLAD_API_CALL PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv;\n#define glProgramUniform1fv glad_glProgramUniform1fv\nGLAD_API_CALL PFNGLDELETETEXTURESPROC glad_glDeleteTextures;\n#define glDeleteTextures glad_glDeleteTextures\nGLAD_API_CALL PFNGLWINDOWPOS2IVPROC glad_glWindowPos2iv;\n#define glWindowPos2iv glad_glWindowPos2iv\nGLAD_API_CALL PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer;\n#define glVertexAttribIPointer glad_glVertexAttribIPointer\nGLAD_API_CALL PFNGLCREATEVERTEXARRAYSPROC glad_glCreateVertexArrays;\n#define glCreateVertexArrays glad_glCreateVertexArrays\nGLAD_API_CALL PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i;\n#define glVertexAttribI1i glad_glVertexAttribI1i\nGLAD_API_CALL PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui;\n#define glProgramUniform3ui glad_glProgramUniform3ui\nGLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC glad_glCompressedTextureSubImage2D;\n#define glCompressedTextureSubImage2D glad_glCompressedTextureSubImage2D\nGLAD_API_CALL PFNGLRECTDPROC glad_glRectd;\n#define glRectd glad_glRectd\nGLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXDPROC glad_glMultTransposeMatrixd;\n#define glMultTransposeMatrixd glad_glMultTransposeMatrixd\nGLAD_API_CALL PFNGLTEXENVFPROC glad_glTexEnvf;\n#define glTexEnvf glad_glTexEnvf\nGLAD_API_CALL PFNGLNORMAL3IPROC glad_glNormal3i;\n#define glNormal3i glad_glNormal3i\nGLAD_API_CALL PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation;\n#define glBindAttribLocation glad_glBindAttribLocation\nGLAD_API_CALL PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate;\n#define glStencilMaskSeparate glad_glStencilMaskSeparate\nGLAD_API_CALL PFNGLGETINTEGERVPROC glad_glGetIntegerv;\n#define glGetIntegerv glad_glGetIntegerv\nGLAD_API_CALL PFNGLUSEPROGRAMPROC glad_glUseProgram;\n#define glUseProgram glad_glUseProgram\nGLAD_API_CALL PFNGLNORMAL3BVPROC glad_glNormal3bv;\n#define glNormal3bv glad_glNormal3bv\nGLAD_API_CALL PFNGLPIXELSTOREIPROC glad_glPixelStorei;\n#define glPixelStorei glad_glPixelStorei\nGLAD_API_CALL PFNGLNORMAL3SPROC glad_glNormal3s;\n#define glNormal3s glad_glNormal3s\nGLAD_API_CALL PFNGLCOLOR4IVPROC glad_glColor4iv;\n#define glColor4iv glad_glColor4iv\nGLAD_API_CALL PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv;\n#define glMultiTexCoordP2uiv glad_glMultiTexCoordP2uiv\nGLAD_API_CALL PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident;\n#define glAreTexturesResident glad_glAreTexturesResident\nGLAD_API_CALL PFNGLGETUNIFORMFVPROC glad_glGetUniformfv;\n#define glGetUniformfv glad_glGetUniformfv\nGLAD_API_CALL PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC glad_glGetActiveSubroutineUniformName;\n#define glGetActiveSubroutineUniformName glad_glGetActiveSubroutineUniformName\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv;\n#define glProgramUniformMatrix2x4fv glad_glProgramUniformMatrix2x4fv\nGLAD_API_CALL PFNGLTEXSTORAGE3DPROC glad_glTexStorage3D;\n#define glTexStorage3D glad_glTexStorage3D\nGLAD_API_CALL PFNGLTEXCOORD1IPROC glad_glTexCoord1i;\n#define glTexCoord1i glad_glTexCoord1i\nGLAD_API_CALL PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC glad_glGetCompressedTextureSubImage;\n#define glGetCompressedTextureSubImage glad_glGetCompressedTextureSubImage\nGLAD_API_CALL PFNGLVERTEXARRAYVERTEXBUFFERSPROC glad_glVertexArrayVertexBuffers;\n#define glVertexArrayVertexBuffers glad_glVertexArrayVertexBuffers\nGLAD_API_CALL PFNGLSECONDARYCOLOR3DPROC glad_glSecondaryColor3d;\n#define glSecondaryColor3d glad_glSecondaryColor3d\nGLAD_API_CALL PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays;\n#define glInterleavedArrays glad_glInterleavedArrays\nGLAD_API_CALL PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer;\n#define glUnmapBuffer glad_glUnmapBuffer\nGLAD_API_CALL PFNGLISENABLEDIPROC glad_glIsEnabledi;\n#define glIsEnabledi glad_glIsEnabledi\nGLAD_API_CALL PFNGLBINDSAMPLERSPROC glad_glBindSamplers;\n#define glBindSamplers glad_glBindSamplers\nGLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D;\n#define glCompressedTexSubImage1D glad_glCompressedTexSubImage1D\nGLAD_API_CALL PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures;\n#define glPrioritizeTextures glad_glPrioritizeTextures\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv;\n#define glProgramUniformMatrix4x2fv glad_glProgramUniformMatrix4x2fv\nGLAD_API_CALL PFNGLRASTERPOS4DPROC glad_glRasterPos4d;\n#define glRasterPos4d glad_glRasterPos4d\nGLAD_API_CALL PFNGLSECONDARYCOLOR3USVPROC glad_glSecondaryColor3usv;\n#define glSecondaryColor3usv glad_glSecondaryColor3usv\nGLAD_API_CALL PFNGLGETSYNCIVPROC glad_glGetSynciv;\n#define glGetSynciv glad_glGetSynciv\nGLAD_API_CALL PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv;\n#define glSamplerParameterIiv glad_glSamplerParameterIiv\nGLAD_API_CALL PFNGLLIGHTMODELFVPROC glad_glLightModelfv;\n#define glLightModelfv glad_glLightModelfv\nGLAD_API_CALL PFNGLTEXTURESTORAGE3DPROC glad_glTextureStorage3D;\n#define glTextureStorage3D glad_glTextureStorage3D\nGLAD_API_CALL PFNGLRESUMETRANSFORMFEEDBACKPROC glad_glResumeTransformFeedback;\n#define glResumeTransformFeedback glad_glResumeTransformFeedback\nGLAD_API_CALL PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines;\n#define glGenProgramPipelines glad_glGenProgramPipelines\nGLAD_API_CALL PFNGLVERTEX4FVPROC glad_glVertex4fv;\n#define glVertex4fv glad_glVertex4fv\nGLAD_API_CALL PFNGLLIGHTIVPROC glad_glLightiv;\n#define glLightiv glad_glLightiv\nGLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERIVPROC glad_glClearNamedFramebufferiv;\n#define glClearNamedFramebufferiv glad_glClearNamedFramebufferiv\nGLAD_API_CALL PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv;\n#define glGetTexParameteriv glad_glGetTexParameteriv\nGLAD_API_CALL PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv;\n#define glTexCoord3dv glad_glTexCoord3dv\nGLAD_API_CALL PFNGLFOGCOORDPOINTERPROC glad_glFogCoordPointer;\n#define glFogCoordPointer glad_glFogCoordPointer\nGLAD_API_CALL PFNGLUNIFORM2IPROC glad_glUniform2i;\n#define glUniform2i glad_glUniform2i\nGLAD_API_CALL PFNGLTEXTURESUBIMAGE3DPROC glad_glTextureSubImage3D;\n#define glTextureSubImage3D glad_glTextureSubImage3D\nGLAD_API_CALL PFNGLGETDOUBLEI_VPROC glad_glGetDoublei_v;\n#define glGetDoublei_v glad_glGetDoublei_v\nGLAD_API_CALL PFNGLCLEARBUFFERDATAPROC glad_glClearBufferData;\n#define glClearBufferData glad_glClearBufferData\nGLAD_API_CALL PFNGLBINDTEXTUREPROC glad_glBindTexture;\n#define glBindTexture glad_glBindTexture\nGLAD_API_CALL PFNGLTEXTUREBUFFERRANGEPROC glad_glTextureBufferRange;\n#define glTextureBufferRange glad_glTextureBufferRange\nGLAD_API_CALL PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv;\n#define glGetTexLevelParameterfv glad_glGetTexLevelParameterfv\nGLAD_API_CALL PFNGLSAMPLEMASKIPROC glad_glSampleMaski;\n#define glSampleMaski glad_glSampleMaski\nGLAD_API_CALL PFNGLCLEARACCUMPROC glad_glClearAccum;\n#define glClearAccum glad_glClearAccum\nGLAD_API_CALL PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform;\n#define glGetActiveUniform glad_glGetActiveUniform\nGLAD_API_CALL PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary;\n#define glGetProgramBinary glad_glGetProgramBinary\nGLAD_API_CALL PFNGLDETACHSHADERPROC glad_glDetachShader;\n#define glDetachShader glad_glDetachShader\nGLAD_API_CALL PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s;\n#define glVertexAttrib4s glad_glVertexAttrib4s\nGLAD_API_CALL PFNGLTEXTUREPARAMETERIPROC glad_glTextureParameteri;\n#define glTextureParameteri glad_glTextureParameteri\nGLAD_API_CALL PFNGLCOLOR3DVPROC glad_glColor3dv;\n#define glColor3dv glad_glColor3dv\nGLAD_API_CALL PFNGLBINDSAMPLERPROC glad_glBindSampler;\n#define glBindSampler glad_glBindSampler\nGLAD_API_CALL PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC glad_glCheckNamedFramebufferStatus;\n#define glCheckNamedFramebufferStatus glad_glCheckNamedFramebufferStatus\nGLAD_API_CALL PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv;\n#define glProgramUniform1iv glad_glProgramUniform1iv\nGLAD_API_CALL PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays;\n#define glMultiDrawArrays glad_glMultiDrawArrays\nGLAD_API_CALL PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv;\n#define glRasterPos4dv glad_glRasterPos4dv\nGLAD_API_CALL PFNGLGETFLOATVPROC glad_glGetFloatv;\n#define glGetFloatv glad_glGetFloatv\nGLAD_API_CALL PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri;\n#define glProgramParameteri glad_glProgramParameteri\nGLAD_API_CALL PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers;\n#define glDeleteRenderbuffers glad_glDeleteRenderbuffers\nGLAD_API_CALL PFNGLSECONDARYCOLORPOINTERPROC glad_glSecondaryColorPointer;\n#define glSecondaryColorPointer glad_glSecondaryColorPointer\nGLAD_API_CALL PFNGLISSAMPLERPROC glad_glIsSampler;\n#define glIsSampler glad_glIsSampler\nGLAD_API_CALL PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv;\n#define glMultiTexCoord1dv glad_glMultiTexCoord1dv\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv;\n#define glProgramUniformMatrix2x3fv glad_glProgramUniformMatrix2x3fv\nGLAD_API_CALL PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl;\n#define glDebugMessageControl glad_glDebugMessageControl\nGLAD_API_CALL PFNGLBINDBUFFERSRANGEPROC glad_glBindBuffersRange;\n#define glBindBuffersRange glad_glBindBuffersRange\nGLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTPROC glad_glMultiDrawArraysIndirect;\n#define glMultiDrawArraysIndirect glad_glMultiDrawArraysIndirect\nGLAD_API_CALL PFNGLGETMAPDVPROC glad_glGetMapdv;\n#define glGetMapdv glad_glGetMapdv\nGLAD_API_CALL PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui;\n#define glTexCoordP3ui glad_glTexCoordP3ui\nGLAD_API_CALL PFNGLVERTEXATTRIBIFORMATPROC glad_glVertexAttribIFormat;\n#define glVertexAttribIFormat glad_glVertexAttribIFormat\nGLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC glad_glDrawTransformFeedbackStreamInstanced;\n#define glDrawTransformFeedbackStreamInstanced glad_glDrawTransformFeedbackStreamInstanced\nGLAD_API_CALL PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC glad_glTransformFeedbackBufferBase;\n#define glTransformFeedbackBufferBase glad_glTransformFeedbackBufferBase\nGLAD_API_CALL PFNGLGETTEXENVIVPROC glad_glGetTexEnviv;\n#define glGetTexEnviv glad_glGetTexEnviv\nGLAD_API_CALL PFNGLCOLORP3UIVPROC glad_glColorP3uiv;\n#define glColorP3uiv glad_glColorP3uiv\nGLAD_API_CALL PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f;\n#define glVertexAttrib1f glad_glVertexAttrib1f\nGLAD_API_CALL PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib;\n#define glPopClientAttrib glad_glPopClientAttrib\nGLAD_API_CALL PFNGLGETTEXIMAGEPROC glad_glGetTexImage;\n#define glGetTexImage glad_glGetTexImage\nGLAD_API_CALL PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage;\n#define glRenderbufferStorage glad_glRenderbufferStorage\nGLAD_API_CALL PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers;\n#define glDeleteBuffers glad_glDeleteBuffers\nGLAD_API_CALL PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync;\n#define glClientWaitSync glad_glClientWaitSync\nGLAD_API_CALL PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv;\n#define glProgramUniform1dv glad_glProgramUniform1dv\nGLAD_API_CALL PFNGLCLEARTEXIMAGEPROC glad_glClearTexImage;\n#define glClearTexImage glad_glClearTexImage\nGLAD_API_CALL PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv;\n#define glMultiTexCoord2fv glad_glMultiTexCoord2fv\nGLAD_API_CALL PFNGLUNIFORM3UIVPROC glad_glUniform3uiv;\n#define glUniform3uiv glad_glUniform3uiv\nGLAD_API_CALL PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName;\n#define glGetActiveUniformName glad_glGetActiveUniformName\nGLAD_API_CALL PFNGLEVALPOINT1PROC glad_glEvalPoint1;\n#define glEvalPoint1 glad_glEvalPoint1\nGLAD_API_CALL PFNGLCOLOR3USPROC glad_glColor3us;\n#define glColor3us glad_glColor3us\nGLAD_API_CALL PFNGLGETTEXTURESUBIMAGEPROC glad_glGetTextureSubImage;\n#define glGetTextureSubImage glad_glGetTextureSubImage\nGLAD_API_CALL PFNGLCOLOR3IPROC glad_glColor3i;\n#define glColor3i glad_glColor3i\nGLAD_API_CALL PFNGLSECONDARYCOLOR3DVPROC glad_glSecondaryColor3dv;\n#define glSecondaryColor3dv glad_glSecondaryColor3dv\nGLAD_API_CALL PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv;\n#define glEvalCoord1fv glad_glEvalCoord1fv\nGLAD_API_CALL PFNGLVIEWPORTARRAYVPROC glad_glViewportArrayv;\n#define glViewportArrayv glad_glViewportArrayv\nGLAD_API_CALL PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i;\n#define glVertexAttribI4i glad_glVertexAttribI4i\nGLAD_API_CALL PFNGLVERTEXATTRIBL4DPROC glad_glVertexAttribL4d;\n#define glVertexAttribL4d glad_glVertexAttribL4d\nGLAD_API_CALL PFNGLCOLOR4DPROC glad_glColor4d;\n#define glColor4d glad_glColor4d\nGLAD_API_CALL PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation;\n#define glGetFragDataLocation glad_glGetFragDataLocation\nGLAD_API_CALL PFNGLCOLOR4UBVPROC glad_glColor4ubv;\n#define glColor4ubv glad_glColor4ubv\nGLAD_API_CALL PFNGLUNIFORMMATRIX4DVPROC glad_glUniformMatrix4dv;\n#define glUniformMatrix4dv glad_glUniformMatrix4dv\nGLAD_API_CALL PFNGLUNIFORMMATRIX3X4DVPROC glad_glUniformMatrix3x4dv;\n#define glUniformMatrix3x4dv glad_glUniformMatrix3x4dv\nGLAD_API_CALL PFNGLSCISSORPROC glad_glScissor;\n#define glScissor glad_glScissor\nGLAD_API_CALL PFNGLUNIFORMSUBROUTINESUIVPROC glad_glUniformSubroutinesuiv;\n#define glUniformSubroutinesuiv glad_glUniformSubroutinesuiv\nGLAD_API_CALL PFNGLVERTEX4IVPROC glad_glVertex4iv;\n#define glVertex4iv glad_glVertex4iv\nGLAD_API_CALL PFNGLCOLORMASKPROC glad_glColorMask;\n#define glColorMask glad_glColorMask\nGLAD_API_CALL PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate;\n#define glStencilOpSeparate glad_glStencilOpSeparate\nGLAD_API_CALL PFNGLGETBOOLEANVPROC glad_glGetBooleanv;\n#define glGetBooleanv glad_glGetBooleanv\nGLAD_API_CALL PFNGLVERTEX3DPROC glad_glVertex3d;\n#define glVertex3d glad_glVertex3d\nGLAD_API_CALL PFNGLGETNAMEDBUFFERPOINTERVPROC glad_glGetNamedBufferPointerv;\n#define glGetNamedBufferPointerv glad_glGetNamedBufferPointerv\nGLAD_API_CALL PFNGLVERTEXARRAYVERTEXBUFFERPROC glad_glVertexArrayVertexBuffer;\n#define glVertexArrayVertexBuffer glad_glVertexArrayVertexBuffer\nGLAD_API_CALL PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple;\n#define glGetPolygonStipple glad_glGetPolygonStipple\nGLAD_API_CALL PFNGLSTENCILOPPROC glad_glStencilOp;\n#define glStencilOp glad_glStencilOp\nGLAD_API_CALL PFNGLVIEWPORTPROC glad_glViewport;\n#define glViewport glad_glViewport\nGLAD_API_CALL PFNGLGETNPOLYGONSTIPPLEPROC glad_glGetnPolygonStipple;\n#define glGetnPolygonStipple glad_glGetnPolygonStipple\nGLAD_API_CALL PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv;\n#define glVertexAttrib4usv glad_glVertexAttrib4usv\nGLAD_API_CALL PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback;\n#define glEndTransformFeedback glad_glEndTransformFeedback\nGLAD_API_CALL PFNGLCREATEPROGRAMPROC glad_glCreateProgram;\n#define glCreateProgram glad_glCreateProgram\nGLAD_API_CALL PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog;\n#define glGetShaderInfoLog glad_glGetShaderInfoLog\nGLAD_API_CALL PFNGLGETVERTEXARRAYINDEXED64IVPROC glad_glGetVertexArrayIndexed64iv;\n#define glGetVertexArrayIndexed64iv glad_glGetVertexArrayIndexed64iv\nGLAD_API_CALL PFNGLTEXGENDPROC glad_glTexGend;\n#define glTexGend glad_glTexGend\nGLAD_API_CALL PFNGLINDEXUBPROC glad_glIndexub;\n#define glIndexub glad_glIndexub\nGLAD_API_CALL PFNGLMULTMATRIXFPROC glad_glMultMatrixf;\n#define glMultMatrixf glad_glMultMatrixf\nGLAD_API_CALL PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui;\n#define glMultiTexCoordP2ui glad_glMultiTexCoordP2ui\nGLAD_API_CALL PFNGLTEXIMAGE3DPROC glad_glTexImage3D;\n#define glTexImage3D glad_glTexImage3D\nGLAD_API_CALL PFNGLGETNUNIFORMDVPROC glad_glGetnUniformdv;\n#define glGetnUniformdv glad_glGetnUniformdv\nGLAD_API_CALL PFNGLRECTIVPROC glad_glRectiv;\n#define glRectiv glad_glRectiv\nGLAD_API_CALL PFNGLTEXCOORD4SPROC glad_glTexCoord4s;\n#define glTexCoord4s glad_glTexCoord4s\nGLAD_API_CALL PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D;\n#define glCopyTexImage2D glad_glCopyTexImage2D\nGLAD_API_CALL PFNGLLOGICOPPROC glad_glLogicOp;\n#define glLogicOp glad_glLogicOp\nGLAD_API_CALL PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv;\n#define glUniformMatrix2fv glad_glUniformMatrix2fv\nGLAD_API_CALL PFNGLSECONDARYCOLOR3FVPROC glad_glSecondaryColor3fv;\n#define glSecondaryColor3fv glad_glSecondaryColor3fv\nGLAD_API_CALL PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer;\n#define glBindRenderbuffer glad_glBindRenderbuffer\nGLAD_API_CALL PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv;\n#define glProgramUniform4uiv glad_glProgramUniform4uiv\nGLAD_API_CALL PFNGLCREATESAMPLERSPROC glad_glCreateSamplers;\n#define glCreateSamplers glad_glCreateSamplers\nGLAD_API_CALL PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv;\n#define glPixelMapuiv glad_glPixelMapuiv\nGLAD_API_CALL PFNGLBLENDCOLORPROC glad_glBlendColor;\n#define glBlendColor glad_glBlendColor\nGLAD_API_CALL PFNGLLIGHTMODELIPROC glad_glLightModeli;\n#define glLightModeli glad_glLightModeli\nGLAD_API_CALL PFNGLPOINTPARAMETERIPROC glad_glPointParameteri;\n#define glPointParameteri glad_glPointParameteri\nGLAD_API_CALL PFNGLGENQUERIESPROC glad_glGenQueries;\n#define glGenQueries glad_glGenQueries\nGLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTUREPROC glad_glNamedFramebufferTexture;\n#define glNamedFramebufferTexture glad_glNamedFramebufferTexture\nGLAD_API_CALL PFNGLGETNSEPARABLEFILTERPROC glad_glGetnSeparableFilter;\n#define glGetnSeparableFilter glad_glGetnSeparableFilter\nGLAD_API_CALL PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv;\n#define glGetQueryObjectuiv glad_glGetQueryObjectuiv\nGLAD_API_CALL PFNGLCOLOR4FVPROC glad_glColor4fv;\n#define glColor4fv glad_glColor4fv\nGLAD_API_CALL PFNGLGETVERTEXARRAYIVPROC glad_glGetVertexArrayiv;\n#define glGetVertexArrayiv glad_glGetVertexArrayiv\nGLAD_API_CALL PFNGLUNIFORM1UIPROC glad_glUniform1ui;\n#define glUniform1ui glad_glUniform1ui\nGLAD_API_CALL PFNGLGETNMAPFVPROC glad_glGetnMapfv;\n#define glGetnMapfv glad_glGetnMapfv\nGLAD_API_CALL PFNGLUNIFORM4FVPROC glad_glUniform4fv;\n#define glUniform4fv glad_glUniform4fv\nGLAD_API_CALL PFNGLTEXGENFPROC glad_glTexGenf;\n#define glTexGenf glad_glTexGenf\nGLAD_API_CALL PFNGLINDEXIVPROC glad_glIndexiv;\n#define glIndexiv glad_glIndexiv\nGLAD_API_CALL PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv;\n#define glVertexAttrib1fv glad_glVertexAttrib1fv\nGLAD_API_CALL PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i;\n#define glMultiTexCoord3i glad_glMultiTexCoord3i\nGLAD_API_CALL PFNGLCOLOR4USVPROC glad_glColor4usv;\n#define glColor4usv glad_glColor4usv\nGLAD_API_CALL PFNGLDRAWBUFFERSPROC glad_glDrawBuffers;\n#define glDrawBuffers glad_glDrawBuffers\nGLAD_API_CALL PFNGLWINDOWPOS2IPROC glad_glWindowPos2i;\n#define glWindowPos2i glad_glWindowPos2i\nGLAD_API_CALL PFNGLTEXBUFFERRANGEPROC glad_glTexBufferRange;\n#define glTexBufferRange glad_glTexBufferRange\nGLAD_API_CALL PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv;\n#define glMultiTexCoordP1uiv glad_glMultiTexCoordP1uiv\nGLAD_API_CALL PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv;\n#define glVertexAttribI2iv glad_glVertexAttribI2iv\nGLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTPROC glad_glMultiDrawElementsIndirect;\n#define glMultiDrawElementsIndirect glad_glMultiDrawElementsIndirect\nGLAD_API_CALL PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv;\n#define glUniformMatrix2x4fv glad_glUniformMatrix2x4fv\nGLAD_API_CALL PFNGLUNIFORM3IPROC glad_glUniform3i;\n#define glUniform3i glad_glUniform3i\nGLAD_API_CALL PFNGLGETCLIPPLANEPROC glad_glGetClipPlane;\n#define glGetClipPlane glad_glGetClipPlane\nGLAD_API_CALL PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv;\n#define glVertexAttribP2uiv glad_glVertexAttribP2uiv\nGLAD_API_CALL PFNGLTEXCOORD2IPROC glad_glTexCoord2i;\n#define glTexCoord2i glad_glTexCoord2i\nGLAD_API_CALL PFNGLUNIFORM4UIPROC glad_glUniform4ui;\n#define glUniform4ui glad_glUniform4ui\nGLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC glad_glDrawElementsInstancedBaseVertexBaseInstance;\n#define glDrawElementsInstancedBaseVertexBaseInstance glad_glDrawElementsInstancedBaseVertexBaseInstance\nGLAD_API_CALL PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv;\n#define glVertexAttrib4Nusv glad_glVertexAttrib4Nusv\nGLAD_API_CALL PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d;\n#define glVertexAttrib1d glad_glVertexAttrib1d\nGLAD_API_CALL PFNGLGETLIGHTIVPROC glad_glGetLightiv;\n#define glGetLightiv glad_glGetLightiv\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv;\n#define glProgramUniformMatrix3x4dv glad_glProgramUniformMatrix3x4dv\nGLAD_API_CALL PFNGLTEXTURESTORAGE1DPROC glad_glTextureStorage1D;\n#define glTextureStorage1D glad_glTextureStorage1D\nGLAD_API_CALL PFNGLSTENCILMASKPROC glad_glStencilMask;\n#define glStencilMask glad_glStencilMask\nGLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv;\n#define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv\nGLAD_API_CALL PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f;\n#define glMultiTexCoord4f glad_glMultiTexCoord4f\nGLAD_API_CALL PFNGLINDEXDPROC glad_glIndexd;\n#define glIndexd glad_glIndexd\nGLAD_API_CALL PFNGLNORMALP3UIVPROC glad_glNormalP3uiv;\n#define glNormalP3uiv glad_glNormalP3uiv\nGLAD_API_CALL PFNGLEVALMESH1PROC glad_glEvalMesh1;\n#define glEvalMesh1 glad_glEvalMesh1\nGLAD_API_CALL PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv;\n#define glTexCoordP3uiv glad_glTexCoordP3uiv\nGLAD_API_CALL PFNGLVERTEXATTRIBL4DVPROC glad_glVertexAttribL4dv;\n#define glVertexAttribL4dv glad_glVertexAttribL4dv\nGLAD_API_CALL PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture;\n#define glClientActiveTexture glad_glClientActiveTexture\nGLAD_API_CALL PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s;\n#define glVertexAttrib2s glad_glVertexAttrib2s\nGLAD_API_CALL PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv;\n#define glVertexAttrib3dv glad_glVertexAttrib3dv\nGLAD_API_CALL PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv;\n#define glTexParameterIiv glad_glTexParameterIiv\nGLAD_API_CALL PFNGLRASTERPOS3DPROC glad_glRasterPos3d;\n#define glRasterPos3d glad_glRasterPos3d\nGLAD_API_CALL PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv;\n#define glEvalCoord2fv glad_glEvalCoord2fv\nGLAD_API_CALL PFNGLBINDTEXTUREUNITPROC glad_glBindTextureUnit;\n#define glBindTextureUnit glad_glBindTextureUnit\nGLAD_API_CALL PFNGLWAITSYNCPROC glad_glWaitSync;\n#define glWaitSync glad_glWaitSync\nGLAD_API_CALL PFNGLMATERIALFVPROC glad_glMaterialfv;\n#define glMaterialfv glad_glMaterialfv\nGLAD_API_CALL PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i;\n#define glProgramUniform2i glad_glProgramUniform2i\nGLAD_API_CALL PFNGLRASTERPOS2SPROC glad_glRasterPos2s;\n#define glRasterPos2s glad_glRasterPos2s\nGLAD_API_CALL PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv;\n#define glVertexAttribI4bv glad_glVertexAttribI4bv\nGLAD_API_CALL PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv;\n#define glVertexAttribI4sv glad_glVertexAttribI4sv\nGLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate;\n#define glBlendEquationSeparate glad_glBlendEquationSeparate\nGLAD_API_CALL PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv;\n#define glVertexAttribI3uiv glad_glVertexAttribI3uiv\nGLAD_API_CALL PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv;\n#define glVertexAttribI2uiv glad_glVertexAttribI2uiv\nGLAD_API_CALL PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv;\n#define glVertexP4uiv glad_glVertexP4uiv\nGLAD_API_CALL PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex;\n#define glGetUniformBlockIndex glad_glGetUniformBlockIndex\nGLAD_API_CALL PFNGLDEPTHFUNCPROC glad_glDepthFunc;\n#define glDepthFunc glad_glDepthFunc\nGLAD_API_CALL PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f;\n#define glProgramUniform4f glad_glProgramUniform4f\nGLAD_API_CALL PFNGLSHADERSOURCEPROC glad_glShaderSource;\n#define glShaderSource glad_glShaderSource\nGLAD_API_CALL PFNGLVERTEX2IVPROC glad_glVertex2iv;\n#define glVertex2iv glad_glVertex2iv\nGLAD_API_CALL PFNGLMAPNAMEDBUFFERPROC glad_glMapNamedBuffer;\n#define glMapNamedBuffer glad_glMapNamedBuffer\nGLAD_API_CALL PFNGLCLEARDEPTHFPROC glad_glClearDepthf;\n#define glClearDepthf glad_glClearDepthf\nGLAD_API_CALL PFNGLUNIFORM1FPROC glad_glUniform1f;\n#define glUniform1f glad_glUniform1f\nGLAD_API_CALL PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d;\n#define glMultiTexCoord1d glad_glMultiTexCoord1d\nGLAD_API_CALL PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v;\n#define glGetQueryObjectui64v glad_glGetQueryObjectui64v\nGLAD_API_CALL PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC glad_glNamedFramebufferDrawBuffers;\n#define glNamedFramebufferDrawBuffers glad_glNamedFramebufferDrawBuffers\nGLAD_API_CALL PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D;\n#define glTexSubImage3D glad_glTexSubImage3D\nGLAD_API_CALL PFNGLDELETETRANSFORMFEEDBACKSPROC glad_glDeleteTransformFeedbacks;\n#define glDeleteTransformFeedbacks glad_glDeleteTransformFeedbacks\nGLAD_API_CALL PFNGLVERTEX3IVPROC glad_glVertex3iv;\n#define glVertex3iv glad_glVertex3iv\nGLAD_API_CALL PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv;\n#define glUniformMatrix2x3fv glad_glUniformMatrix2x3fv\nGLAD_API_CALL PFNGLISTEXTUREPROC glad_glIsTexture;\n#define glIsTexture glad_glIsTexture\nGLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXFPROC glad_glMultTransposeMatrixf;\n#define glMultTransposeMatrixf glad_glMultTransposeMatrixf\nGLAD_API_CALL PFNGLNEWLISTPROC glad_glNewList;\n#define glNewList glad_glNewList\nGLAD_API_CALL PFNGLSCALEFPROC glad_glScalef;\n#define glScalef glad_glScalef\nGLAD_API_CALL PFNGLVERTEX3FPROC glad_glVertex3f;\n#define glVertex3f glad_glVertex3f\nGLAD_API_CALL PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv;\n#define glTexCoord1iv glad_glTexCoord1iv\nGLAD_API_CALL PFNGLFOGCOORDFVPROC glad_glFogCoordfv;\n#define glFogCoordfv glad_glFogCoordfv\nGLAD_API_CALL PFNGLMAPGRID2DPROC glad_glMapGrid2d;\n#define glMapGrid2d glad_glMapGrid2d\nGLAD_API_CALL PFNGLWINDOWPOS2FVPROC glad_glWindowPos2fv;\n#define glWindowPos2fv glad_glWindowPos2fv\nGLAD_API_CALL PFNGLREADPIXELSPROC glad_glReadPixels;\n#define glReadPixels glad_glReadPixels\nGLAD_API_CALL PFNGLINVALIDATETEXSUBIMAGEPROC glad_glInvalidateTexSubImage;\n#define glInvalidateTexSubImage glad_glInvalidateTexSubImage\nGLAD_API_CALL PFNGLORTHOPROC glad_glOrtho;\n#define glOrtho glad_glOrtho\nGLAD_API_CALL PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv;\n#define glGetQueryObjectiv glad_glGetQueryObjectiv\nGLAD_API_CALL PFNGLWINDOWPOS2SVPROC glad_glWindowPos2sv;\n#define glWindowPos2sv glad_glWindowPos2sv\nGLAD_API_CALL PFNGLFOGFPROC glad_glFogf;\n#define glFogf glad_glFogf\nGLAD_API_CALL PFNGLCOLOR3SPROC glad_glColor3s;\n#define glColor3s glad_glColor3s\nGLAD_API_CALL PFNGLUNIFORM2UIVPROC glad_glUniform2uiv;\n#define glUniform2uiv glad_glUniform2uiv\nGLAD_API_CALL PFNGLPIXELZOOMPROC glad_glPixelZoom;\n#define glPixelZoom glad_glPixelZoom\nGLAD_API_CALL PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f;\n#define glProgramUniform3f glad_glProgramUniform3f\nGLAD_API_CALL PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv;\n#define glEvalCoord2dv glad_glEvalCoord2dv\nGLAD_API_CALL PFNGLVERTEX3DVPROC glad_glVertex3dv;\n#define glVertex3dv glad_glVertex3dv\nGLAD_API_CALL PFNGLUNIFORM3FVPROC glad_glUniform3fv;\n#define glUniform3fv glad_glUniform3fv\nGLAD_API_CALL PFNGLENABLEPROC glad_glEnable;\n#define glEnable glad_glEnable\nGLAD_API_CALL PFNGLTEXTUREPARAMETERIUIVPROC glad_glTextureParameterIuiv;\n#define glTextureParameterIuiv glad_glTextureParameterIuiv\nGLAD_API_CALL PFNGLFOGCOORDDVPROC glad_glFogCoorddv;\n#define glFogCoorddv glad_glFogCoorddv\nGLAD_API_CALL PFNGLBUFFERDATAPROC glad_glBufferData;\n#define glBufferData glad_glBufferData\nGLAD_API_CALL PFNGLPOPATTRIBPROC glad_glPopAttrib;\n#define glPopAttrib glad_glPopAttrib\nGLAD_API_CALL PFNGLNORMAL3DVPROC glad_glNormal3dv;\n#define glNormal3dv glad_glNormal3dv\nGLAD_API_CALL PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex;\n#define glGetFragDataIndex glad_glGetFragDataIndex\nGLAD_API_CALL PFNGLPASSTHROUGHPROC glad_glPassThrough;\n#define glPassThrough glad_glPassThrough\nGLAD_API_CALL PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv;\n#define glTexCoord2dv glad_glTexCoord2dv\nGLAD_API_CALL PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv;\n#define glTexCoordP4uiv glad_glTexCoordP4uiv\nGLAD_API_CALL PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv;\n#define glClearBufferuiv glad_glClearBufferuiv\nGLAD_API_CALL PFNGLUNIFORM3DVPROC glad_glUniform3dv;\n#define glUniform3dv glad_glUniform3dv\nGLAD_API_CALL PFNGLBLENDEQUATIONIPROC glad_glBlendEquationi;\n#define glBlendEquationi glad_glBlendEquationi\nGLAD_API_CALL PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui;\n#define glVertexAttribI4ui glad_glVertexAttribI4ui\nGLAD_API_CALL PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv;\n#define glGetTexLevelParameteriv glad_glGetTexLevelParameteriv\nGLAD_API_CALL PFNGLVERTEX4IPROC glad_glVertex4i;\n#define glVertex4i glad_glVertex4i\nGLAD_API_CALL PFNGLUNIFORM4UIVPROC glad_glUniform4uiv;\n#define glUniform4uiv glad_glUniform4uiv\nGLAD_API_CALL PFNGLTEXENVFVPROC glad_glTexEnvfv;\n#define glTexEnvfv glad_glTexEnvfv\nGLAD_API_CALL PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv;\n#define glMultiTexCoord4dv glad_glMultiTexCoord4dv\nGLAD_API_CALL PFNGLCLEARTEXSUBIMAGEPROC glad_glClearTexSubImage;\n#define glClearTexSubImage glad_glClearTexSubImage\nGLAD_API_CALL PFNGLTRANSLATEDPROC glad_glTranslated;\n#define glTranslated glad_glTranslated\nGLAD_API_CALL PFNGLPOINTPARAMETERFPROC glad_glPointParameterf;\n#define glPointParameterf glad_glPointParameterf\nGLAD_API_CALL PFNGLSCISSORINDEXEDVPROC glad_glScissorIndexedv;\n#define glScissorIndexedv glad_glScissorIndexedv\nGLAD_API_CALL PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv;\n#define glProgramUniform2dv glad_glProgramUniform2dv\nGLAD_API_CALL PFNGLREADBUFFERPROC glad_glReadBuffer;\n#define glReadBuffer glad_glReadBuffer\nGLAD_API_CALL PFNGLENDPROC glad_glEnd;\n#define glEnd glad_glEnd\nGLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced;\n#define glDrawArraysInstanced glad_glDrawArraysInstanced\nGLAD_API_CALL PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv;\n#define glVertexAttrib4uiv glad_glVertexAttrib4uiv\nGLAD_API_CALL PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv;\n#define glVertexAttribI4ubv glad_glVertexAttribI4ubv\nGLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC glad_glCompressedTextureSubImage1D;\n#define glCompressedTextureSubImage1D glad_glCompressedTextureSubImage1D\nGLAD_API_CALL PFNGLVERTEX2DVPROC glad_glVertex2dv;\n#define glVertex2dv glad_glVertex2dv\nGLAD_API_CALL PFNGLPUSHNAMEPROC glad_glPushName;\n#define glPushName glad_glPushName\nGLAD_API_CALL PFNGLINVALIDATEBUFFERDATAPROC glad_glInvalidateBufferData;\n#define glInvalidateBufferData glad_glInvalidateBufferData\nGLAD_API_CALL PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv;\n#define glPointParameteriv glad_glPointParameteriv\nGLAD_API_CALL PFNGLGENTEXTURESPROC glad_glGenTextures;\n#define glGenTextures glad_glGenTextures\nGLAD_API_CALL PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv;\n#define glTexCoord4fv glad_glTexCoord4fv\nGLAD_API_CALL PFNGLDISPATCHCOMPUTEPROC glad_glDispatchCompute;\n#define glDispatchCompute glad_glDispatchCompute\nGLAD_API_CALL PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv;\n#define glGetUniformuiv glad_glGetUniformuiv\nGLAD_API_CALL PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv;\n#define glGetActiveUniformsiv glad_glGetActiveUniformsiv\nGLAD_API_CALL PFNGLGETPROGRAMRESOURCENAMEPROC glad_glGetProgramResourceName;\n#define glGetProgramResourceName glad_glGetProgramResourceName\nGLAD_API_CALL PFNGLVERTEX2FVPROC glad_glVertex2fv;\n#define glVertex2fv glad_glVertex2fv\nGLAD_API_CALL PFNGLCOLOR4UBPROC glad_glColor4ub;\n#define glColor4ub glad_glColor4ub\nGLAD_API_CALL PFNGLUNIFORM3IVPROC glad_glUniform3iv;\n#define glUniform3iv glad_glUniform3iv\nGLAD_API_CALL PFNGLCLIPPLANEPROC glad_glClipPlane;\n#define glClipPlane glad_glClipPlane\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv;\n#define glProgramUniformMatrix3x2fv glad_glProgramUniformMatrix3x2fv\nGLAD_API_CALL PFNGLUNIFORM4IPROC glad_glUniform4i;\n#define glUniform4i glad_glUniform4i\nGLAD_API_CALL PFNGLWINDOWPOS3IVPROC glad_glWindowPos3iv;\n#define glWindowPos3iv glad_glWindowPos3iv\nGLAD_API_CALL PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv;\n#define glSamplerParameteriv glad_glSamplerParameteriv\nGLAD_API_CALL PFNGLUNIFORM2DPROC glad_glUniform2d;\n#define glUniform2d glad_glUniform2d\nGLAD_API_CALL PFNGLPOPMATRIXPROC glad_glPopMatrix;\n#define glPopMatrix glad_glPopMatrix\nGLAD_API_CALL PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline;\n#define glValidateProgramPipeline glad_glValidateProgramPipeline\nGLAD_API_CALL PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv;\n#define glRasterPos3dv glad_glRasterPos3dv\nGLAD_API_CALL PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv;\n#define glTexCoord1fv glad_glTexCoord1fv\nGLAD_API_CALL PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv;\n#define glTexCoord2iv glad_glTexCoord2iv\nGLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE2DPROC glad_glCopyTextureSubImage2D;\n#define glCopyTextureSubImage2D glad_glCopyTextureSubImage2D\nGLAD_API_CALL PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders;\n#define glGetAttachedShaders glad_glGetAttachedShaders\nGLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKI_VPROC glad_glGetTransformFeedbacki_v;\n#define glGetTransformFeedbacki_v glad_glGetTransformFeedbacki_v\nGLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv;\n#define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv\nGLAD_API_CALL PFNGLVERTEXARRAYATTRIBIFORMATPROC glad_glVertexArrayAttribIFormat;\n#define glVertexArrayAttribIFormat glad_glVertexArrayAttribIFormat\nGLAD_API_CALL PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel;\n#define glObjectPtrLabel glad_glObjectPtrLabel\nGLAD_API_CALL PFNGLGETNPIXELMAPUSVPROC glad_glGetnPixelMapusv;\n#define glGetnPixelMapusv glad_glGetnPixelMapusv\nGLAD_API_CALL PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f;\n#define glProgramUniform1f glad_glProgramUniform1f\nGLAD_API_CALL PFNGLCLEARSTENCILPROC glad_glClearStencil;\n#define glClearStencil glad_glClearStencil\nGLAD_API_CALL PFNGLDISABLEPROC glad_glDisable;\n#define glDisable glad_glDisable\nGLAD_API_CALL PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f;\n#define glVertexAttrib4f glad_glVertexAttrib4f\nGLAD_API_CALL PFNGLGETSUBROUTINEINDEXPROC glad_glGetSubroutineIndex;\n#define glGetSubroutineIndex glad_glGetSubroutineIndex\nGLAD_API_CALL PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d;\n#define glMultiTexCoord2d glad_glMultiTexCoord2d\nGLAD_API_CALL PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv;\n#define glMultiTexCoordP3uiv glad_glMultiTexCoordP3uiv\nGLAD_API_CALL PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv;\n#define glMultiTexCoord3fv glad_glMultiTexCoord3fv\nGLAD_API_CALL PFNGLUNIFORM4IVPROC glad_glUniform4iv;\n#define glUniform4iv glad_glUniform4iv\nGLAD_API_CALL PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor;\n#define glVertexAttribDivisor glad_glVertexAttribDivisor\nGLAD_API_CALL PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation;\n#define glBindFragDataLocation glad_glBindFragDataLocation\nGLAD_API_CALL PFNGLGETNCOMPRESSEDTEXIMAGEPROC glad_glGetnCompressedTexImage;\n#define glGetnCompressedTexImage glad_glGetnCompressedTexImage\nGLAD_API_CALL PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv;\n#define glUniformMatrix3fv glad_glUniformMatrix3fv\nGLAD_API_CALL PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv;\n#define glVertexAttrib2fv glad_glVertexAttrib2fv\nGLAD_API_CALL PFNGLEVALCOORD2DPROC glad_glEvalCoord2d;\n#define glEvalCoord2d glad_glEvalCoord2d\nGLAD_API_CALL PFNGLGETPOINTERVPROC glad_glGetPointerv;\n#define glGetPointerv glad_glGetPointerv\nGLAD_API_CALL PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d;\n#define glProgramUniform4d glad_glProgramUniform4d\nGLAD_API_CALL PFNGLTEXCOORD2FPROC glad_glTexCoord2f;\n#define glTexCoord2f glad_glTexCoord2f\nGLAD_API_CALL PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData;\n#define glCopyBufferSubData glad_glCopyBufferSubData\nGLAD_API_CALL PFNGLUNIFORMMATRIX3DVPROC glad_glUniformMatrix3dv;\n#define glUniformMatrix3dv glad_glUniformMatrix3dv\nGLAD_API_CALL PFNGLSECONDARYCOLOR3IVPROC glad_glSecondaryColor3iv;\n#define glSecondaryColor3iv glad_glSecondaryColor3iv\nGLAD_API_CALL PFNGLFINISHPROC glad_glFinish;\n#define glFinish glad_glFinish\nGLAD_API_CALL PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline;\n#define glIsProgramPipeline glad_glIsProgramPipeline\nGLAD_API_CALL PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv;\n#define glVertexAttribP1uiv glad_glVertexAttribP1uiv\nGLAD_API_CALL PFNGLGETNMAPDVPROC glad_glGetnMapdv;\n#define glGetnMapdv glad_glGetnMapdv\nGLAD_API_CALL PFNGLBINDTEXTURESPROC glad_glBindTextures;\n#define glBindTextures glad_glBindTextures\nGLAD_API_CALL PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui;\n#define glMultiTexCoordP3ui glad_glMultiTexCoordP3ui\nGLAD_API_CALL PFNGLCOLORMASKIPROC glad_glColorMaski;\n#define glColorMaski glad_glColorMaski\nGLAD_API_CALL PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v;\n#define glGetQueryObjecti64v glad_glGetQueryObjecti64v\nGLAD_API_CALL PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s;\n#define glMultiTexCoord3s glad_glMultiTexCoord3s\nGLAD_API_CALL PFNGLWINDOWPOS2DPROC glad_glWindowPos2d;\n#define glWindowPos2d glad_glWindowPos2d\nGLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glad_glDrawArraysInstancedBaseInstance;\n#define glDrawArraysInstancedBaseInstance glad_glDrawArraysInstancedBaseInstance\nGLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKPROC glad_glDrawTransformFeedback;\n#define glDrawTransformFeedback glad_glDrawTransformFeedback\nGLAD_API_CALL PFNGLWINDOWPOS2FPROC glad_glWindowPos2f;\n#define glWindowPos2f glad_glWindowPos2f\nGLAD_API_CALL PFNGLVERTEXATTRIBLPOINTERPROC glad_glVertexAttribLPointer;\n#define glVertexAttribLPointer glad_glVertexAttribLPointer\nGLAD_API_CALL PFNGLTEXCOORD4FPROC glad_glTexCoord4f;\n#define glTexCoord4f glad_glTexCoord4f\nGLAD_API_CALL PFNGLLIGHTMODELIVPROC glad_glLightModeliv;\n#define glLightModeliv glad_glLightModeliv\nGLAD_API_CALL PFNGLUNIFORM2UIPROC glad_glUniform2ui;\n#define glUniform2ui glad_glUniform2ui\nGLAD_API_CALL PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays;\n#define glDeleteVertexArrays glad_glDeleteVertexArrays\nGLAD_API_CALL PFNGLTEXBUFFERPROC glad_glTexBuffer;\n#define glTexBuffer glad_glTexBuffer\nGLAD_API_CALL PFNGLUNIFORM2FPROC glad_glUniform2f;\n#define glUniform2f glad_glUniform2f\nGLAD_API_CALL PFNGLTEXCOORD1DPROC glad_glTexCoord1d;\n#define glTexCoord1d glad_glTexCoord1d\nGLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D;\n#define glCompressedTexImage2D glad_glCompressedTexImage2D\nGLAD_API_CALL PFNGLGETGRAPHICSRESETSTATUSPROC glad_glGetGraphicsResetStatus;\n#define glGetGraphicsResetStatus glad_glGetGraphicsResetStatus\nGLAD_API_CALL PFNGLTEXCOORD1SPROC glad_glTexCoord1s;\n#define glTexCoord1s glad_glTexCoord1s\nGLAD_API_CALL PFNGLINDEXSVPROC glad_glIndexsv;\n#define glIndexsv glad_glIndexsv\nGLAD_API_CALL PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv;\n#define glRasterPos4iv glad_glRasterPos4iv\nGLAD_API_CALL PFNGLSECONDARYCOLOR3IPROC glad_glSecondaryColor3i;\n#define glSecondaryColor3i glad_glSecondaryColor3i\nGLAD_API_CALL PFNGLCALLLISTPROC glad_glCallList;\n#define glCallList glad_glCallList\nGLAD_API_CALL PFNGLINDEXUBVPROC glad_glIndexubv;\n#define glIndexubv glad_glIndexubv\nGLAD_API_CALL PFNGLPOLYGONMODEPROC glad_glPolygonMode;\n#define glPolygonMode glad_glPolygonMode\nGLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture;\n#define glFramebufferTexture glad_glFramebufferTexture\nGLAD_API_CALL PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv;\n#define glUniformMatrix3x4fv glad_glUniformMatrix3x4fv\nGLAD_API_CALL PFNGLISTRANSFORMFEEDBACKPROC glad_glIsTransformFeedback;\n#define glIsTransformFeedback glad_glIsTransformFeedback\nGLAD_API_CALL PFNGLNAMEDBUFFERSUBDATAPROC glad_glNamedBufferSubData;\n#define glNamedBufferSubData glad_glNamedBufferSubData\nGLAD_API_CALL PFNGLGETPROGRAMINTERFACEIVPROC glad_glGetProgramInterfaceiv;\n#define glGetProgramInterfaceiv glad_glGetProgramInterfaceiv\nGLAD_API_CALL PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState;\n#define glDisableClientState glad_glDisableClientState\nGLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC glad_glClearNamedFramebufferuiv;\n#define glClearNamedFramebufferuiv glad_glClearNamedFramebufferuiv\nGLAD_API_CALL PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv;\n#define glGetTexParameterfv glad_glGetTexParameterfv\nGLAD_API_CALL PFNGLVERTEXARRAYATTRIBLFORMATPROC glad_glVertexArrayAttribLFormat;\n#define glVertexArrayAttribLFormat glad_glVertexArrayAttribLFormat\nGLAD_API_CALL PFNGLVERTEX4DPROC glad_glVertex4d;\n#define glVertex4d glad_glVertex4d\nGLAD_API_CALL PFNGLNORMAL3SVPROC glad_glNormal3sv;\n#define glNormal3sv glad_glNormal3sv\nGLAD_API_CALL PFNGLRASTERPOS4FPROC glad_glRasterPos4f;\n#define glRasterPos4f glad_glRasterPos4f\nGLAD_API_CALL PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui;\n#define glTexCoordP4ui glad_glTexCoordP4ui\nGLAD_API_CALL PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers;\n#define glGenRenderbuffers glad_glGenRenderbuffers\nGLAD_API_CALL PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings;\n#define glTransformFeedbackVaryings glad_glTransformFeedbackVaryings\nGLAD_API_CALL PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv;\n#define glProgramUniform4fv glad_glProgramUniform4fv\nGLAD_API_CALL PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC glad_glNamedFramebufferReadBuffer;\n#define glNamedFramebufferReadBuffer glad_glNamedFramebufferReadBuffer\nGLAD_API_CALL PFNGLUNIFORMMATRIX2X3DVPROC glad_glUniformMatrix2x3dv;\n#define glUniformMatrix2x3dv glad_glUniformMatrix2x3dv\nGLAD_API_CALL PFNGLVERTEXATTRIBL3DVPROC glad_glVertexAttribL3dv;\n#define glVertexAttribL3dv glad_glVertexAttribL3dv\nGLAD_API_CALL PFNGLUNIFORM1UIVPROC glad_glUniform1uiv;\n#define glUniform1uiv glad_glUniform1uiv\nGLAD_API_CALL PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv;\n#define glTexCoord1sv glad_glTexCoord1sv\nGLAD_API_CALL PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v;\n#define glGetIntegeri_v glad_glGetIntegeri_v\nGLAD_API_CALL PFNGLTEXTURESUBIMAGE2DPROC glad_glTextureSubImage2D;\n#define glTextureSubImage2D glad_glTextureSubImage2D\nGLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEPROC glad_glNamedRenderbufferStorage;\n#define glNamedRenderbufferStorage glad_glNamedRenderbufferStorage\nGLAD_API_CALL PFNGLGETMAPIVPROC glad_glGetMapiv;\n#define glGetMapiv glad_glGetMapiv\nGLAD_API_CALL PFNGLMATRIXMODEPROC glad_glMatrixMode;\n#define glMatrixMode glad_glMatrixMode\nGLAD_API_CALL PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv;\n#define glVertexAttribI4uiv glad_glVertexAttribI4uiv\nGLAD_API_CALL PFNGLVERTEXATTRIBL1DVPROC glad_glVertexAttribL1dv;\n#define glVertexAttribL1dv glad_glVertexAttribL1dv\nGLAD_API_CALL PFNGLGETNAMEDBUFFERSUBDATAPROC glad_glGetNamedBufferSubData;\n#define glGetNamedBufferSubData glad_glGetNamedBufferSubData\nGLAD_API_CALL PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays;\n#define glGenVertexArrays glad_glGenVertexArrays\nGLAD_API_CALL PFNGLGETTEXTUREPARAMETERIVPROC glad_glGetTextureParameteriv;\n#define glGetTextureParameteriv glad_glGetTextureParameteriv\nGLAD_API_CALL PFNGLVERTEX3FVPROC glad_glVertex3fv;\n#define glVertex3fv glad_glVertex3fv\nGLAD_API_CALL PFNGLMATERIALIVPROC glad_glMaterialiv;\n#define glMaterialiv glad_glMaterialiv\nGLAD_API_CALL PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi;\n#define glPixelTransferi glad_glPixelTransferi\nGLAD_API_CALL PFNGLGETNHISTOGRAMPROC glad_glGetnHistogram;\n#define glGetnHistogram glad_glGetnHistogram\nGLAD_API_CALL PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv;\n#define glCreateShaderProgramv glad_glCreateShaderProgramv\nGLAD_API_CALL PFNGLENABLEVERTEXARRAYATTRIBPROC glad_glEnableVertexArrayAttrib;\n#define glEnableVertexArrayAttrib glad_glEnableVertexArrayAttrib\nGLAD_API_CALL PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender;\n#define glEndConditionalRender glad_glEndConditionalRender\nGLAD_API_CALL PFNGLDELETELISTSPROC glad_glDeleteLists;\n#define glDeleteLists glad_glDeleteLists\nGLAD_API_CALL PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv;\n#define glTexCoord2sv glad_glTexCoord2sv\nGLAD_API_CALL PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback;\n#define glDebugMessageCallback glad_glDebugMessageCallback\nGLAD_API_CALL PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f;\n#define glMultiTexCoord1f glad_glMultiTexCoord1f\nGLAD_API_CALL PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage;\n#define glGetCompressedTexImage glad_glGetCompressedTexImage\nGLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus;\n#define glCheckFramebufferStatus glad_glCheckFramebufferStatus\nGLAD_API_CALL PFNGLGETINTERNALFORMATI64VPROC glad_glGetInternalformati64v;\n#define glGetInternalformati64v glad_glGetInternalformati64v\nGLAD_API_CALL PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap;\n#define glGenerateMipmap glad_glGenerateMipmap\nGLAD_API_CALL PFNGLDELETEQUERIESPROC glad_glDeleteQueries;\n#define glDeleteQueries glad_glDeleteQueries\nGLAD_API_CALL PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC glad_glNamedFramebufferParameteri;\n#define glNamedFramebufferParameteri glad_glNamedFramebufferParameteri\nGLAD_API_CALL PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex;\n#define glDrawElementsBaseVertex glad_glDrawElementsBaseVertex\nGLAD_API_CALL PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d;\n#define glProgramUniform1d glad_glProgramUniform1d\nGLAD_API_CALL PFNGLALPHAFUNCPROC glad_glAlphaFunc;\n#define glAlphaFunc glad_glAlphaFunc\nGLAD_API_CALL PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC glad_glTransformFeedbackBufferRange;\n#define glTransformFeedbackBufferRange glad_glTransformFeedbackBufferRange\nGLAD_API_CALL PFNGLLINESTIPPLEPROC glad_glLineStipple;\n#define glLineStipple glad_glLineStipple\nGLAD_API_CALL PFNGLTEXGENIPROC glad_glTexGeni;\n#define glTexGeni glad_glTexGeni\nGLAD_API_CALL PFNGLTEXSTORAGE3DMULTISAMPLEPROC glad_glTexStorage3DMultisample;\n#define glTexStorage3DMultisample glad_glTexStorage3DMultisample\nGLAD_API_CALL PFNGLISVERTEXARRAYPROC glad_glIsVertexArray;\n#define glIsVertexArray glad_glIsVertexArray\nGLAD_API_CALL PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC glad_glGetNamedRenderbufferParameteriv;\n#define glGetNamedRenderbufferParameteriv glad_glGetNamedRenderbufferParameteriv\nGLAD_API_CALL PFNGLINVALIDATEFRAMEBUFFERPROC glad_glInvalidateFramebuffer;\n#define glInvalidateFramebuffer glad_glInvalidateFramebuffer\nGLAD_API_CALL PFNGLPROGRAMBINARYPROC glad_glProgramBinary;\n#define glProgramBinary glad_glProgramBinary\nGLAD_API_CALL PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv;\n#define glTexCoord4dv glad_glTexCoord4dv\nGLAD_API_CALL PFNGLVERTEX3IPROC glad_glVertex3i;\n#define glVertex3i glad_glVertex3i\nGLAD_API_CALL PFNGLSECONDARYCOLOR3BPROC glad_glSecondaryColor3b;\n#define glSecondaryColor3b glad_glSecondaryColor3b\nGLAD_API_CALL PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv;\n#define glRasterPos4sv glad_glRasterPos4sv\nGLAD_API_CALL PFNGLDISABLEIPROC glad_glDisablei;\n#define glDisablei glad_glDisablei\nGLAD_API_CALL PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv;\n#define glVertexAttrib1sv glad_glVertexAttrib1sv\nGLAD_API_CALL PFNGLINVALIDATETEXIMAGEPROC glad_glInvalidateTexImage;\n#define glInvalidateTexImage glad_glInvalidateTexImage\nGLAD_API_CALL PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i;\n#define glVertexAttribI2i glad_glVertexAttribI2i\nGLAD_API_CALL PFNGLINDEXFPROC glad_glIndexf;\n#define glIndexf glad_glIndexf\nGLAD_API_CALL PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex;\n#define glPrimitiveRestartIndex glad_glPrimitiveRestartIndex\nGLAD_API_CALL PFNGLGETNCONVOLUTIONFILTERPROC glad_glGetnConvolutionFilter;\n#define glGetnConvolutionFilter glad_glGetnConvolutionFilter\nGLAD_API_CALL PFNGLGETERRORPROC glad_glGetError;\n#define glGetError glad_glGetError\nGLAD_API_CALL PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv;\n#define glVertexAttrib4bv glad_glVertexAttrib4bv\nGLAD_API_CALL PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange;\n#define glFlushMappedBufferRange glad_glFlushMappedBufferRange\nGLAD_API_CALL PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui;\n#define glTexCoordP1ui glad_glTexCoordP1ui\nGLAD_API_CALL PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage;\n#define glSampleCoverage glad_glSampleCoverage\nGLAD_API_CALL PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv;\n#define glMultiTexCoord2iv glad_glMultiTexCoord2iv\nGLAD_API_CALL PFNGLISPROGRAMPROC glad_glIsProgram;\n#define glIsProgram glad_glIsProgram\nGLAD_API_CALL PFNGLISLISTPROC glad_glIsList;\n#define glIsList glad_glIsList\nGLAD_API_CALL PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv;\n#define glVertexAttrib2dv glad_glVertexAttrib2dv\nGLAD_API_CALL PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f;\n#define glVertexAttrib3f glad_glVertexAttrib3f\nGLAD_API_CALL PFNGLTEXPARAMETERIPROC glad_glTexParameteri;\n#define glTexParameteri glad_glTexParameteri\nGLAD_API_CALL PFNGLPUSHATTRIBPROC glad_glPushAttrib;\n#define glPushAttrib glad_glPushAttrib\nGLAD_API_CALL PFNGLFRONTFACEPROC glad_glFrontFace;\n#define glFrontFace glad_glFrontFace\nGLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC glad_glDrawElementsInstancedBaseInstance;\n#define glDrawElementsInstancedBaseInstance glad_glDrawElementsInstancedBaseInstance\nGLAD_API_CALL PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s;\n#define glMultiTexCoord1s glad_glMultiTexCoord1s\nGLAD_API_CALL PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i;\n#define glVertexAttribI3i glad_glVertexAttribI3i\nGLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D;\n#define glCopyTexSubImage1D glad_glCopyTexSubImage1D\nGLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D;\n#define glFramebufferTexture3D glad_glFramebufferTexture3D\nGLAD_API_CALL PFNGLGENSAMPLERSPROC glad_glGenSamplers;\n#define glGenSamplers glad_glGenSamplers\nGLAD_API_CALL PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf;\n#define glSamplerParameterf glad_glSamplerParameterf\nGLAD_API_CALL PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv;\n#define glRasterPos4fv glad_glRasterPos4fv\nGLAD_API_CALL PFNGLPAUSETRANSFORMFEEDBACKPROC glad_glPauseTransformFeedback;\n#define glPauseTransformFeedback glad_glPauseTransformFeedback\nGLAD_API_CALL PFNGLPOPNAMEPROC glad_glPopName;\n#define glPopName glad_glPopName\nGLAD_API_CALL PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv;\n#define glVertexAttribI1iv glad_glVertexAttribI1iv\nGLAD_API_CALL PFNGLEVALCOORD1FPROC glad_glEvalCoord1f;\n#define glEvalCoord1f glad_glEvalCoord1f\nGLAD_API_CALL PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers;\n#define glGenFramebuffers glad_glGenFramebuffers\nGLAD_API_CALL PFNGLLIGHTIPROC glad_glLighti;\n#define glLighti glad_glLighti\nGLAD_API_CALL PFNGLTEXTUREVIEWPROC glad_glTextureView;\n#define glTextureView glad_glTextureView\nGLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXDPROC glad_glLoadTransposeMatrixd;\n#define glLoadTransposeMatrixd glad_glLoadTransposeMatrixd\nGLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetNamedFramebufferAttachmentParameteriv;\n#define glGetNamedFramebufferAttachmentParameteriv glad_glGetNamedFramebufferAttachmentParameteriv\nGLAD_API_CALL PFNGLUNIFORM4DPROC glad_glUniform4d;\n#define glUniform4d glad_glUniform4d\nGLAD_API_CALL PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui;\n#define glVertexAttribI3ui glad_glVertexAttribI3ui\nGLAD_API_CALL PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer;\n#define glEdgeFlagPointer glad_glEdgeFlagPointer\nGLAD_API_CALL PFNGLSTENCILFUNCPROC glad_glStencilFunc;\n#define glStencilFunc glad_glStencilFunc\nGLAD_API_CALL PFNGLUNIFORM1IPROC glad_glUniform1i;\n#define glUniform1i glad_glUniform1i\nGLAD_API_CALL PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv;\n#define glGetTexParameterIuiv glad_glGetTexParameterIuiv\nGLAD_API_CALL PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC glad_glInvalidateNamedFramebufferData;\n#define glInvalidateNamedFramebufferData glad_glInvalidateNamedFramebufferData\nGLAD_API_CALL PFNGLPATCHPARAMETERFVPROC glad_glPatchParameterfv;\n#define glPatchParameterfv glad_glPatchParameterfv\nGLAD_API_CALL PFNGLFOGFVPROC glad_glFogfv;\n#define glFogfv glad_glFogfv\nGLAD_API_CALL PFNGLVERTEXP3UIPROC glad_glVertexP3ui;\n#define glVertexP3ui glad_glVertexP3ui\nGLAD_API_CALL PFNGLREADNPIXELSPROC glad_glReadnPixels;\n#define glReadnPixels glad_glReadnPixels\nGLAD_API_CALL PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i;\n#define glMultiTexCoord1i glad_glMultiTexCoord1i\nGLAD_API_CALL PFNGLVERTEXATTRIBBINDINGPROC glad_glVertexAttribBinding;\n#define glVertexAttribBinding glad_glVertexAttribBinding\nGLAD_API_CALL PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv;\n#define glMultiTexCoord3dv glad_glMultiTexCoord3dv\nGLAD_API_CALL PFNGLVERTEX4SPROC glad_glVertex4s;\n#define glVertex4s glad_glVertex4s\nGLAD_API_CALL PFNGLVERTEXBINDINGDIVISORPROC glad_glVertexBindingDivisor;\n#define glVertexBindingDivisor glad_glVertexBindingDivisor\nGLAD_API_CALL PFNGLTEXTUREPARAMETERFVPROC glad_glTextureParameterfv;\n#define glTextureParameterfv glad_glTextureParameterfv\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv;\n#define glProgramUniformMatrix3x4fv glad_glProgramUniformMatrix3x4fv\nGLAD_API_CALL PFNGLNORMAL3BPROC glad_glNormal3b;\n#define glNormal3b glad_glNormal3b\nGLAD_API_CALL PFNGLGETUNIFORMSUBROUTINEUIVPROC glad_glGetUniformSubroutineuiv;\n#define glGetUniformSubroutineuiv glad_glGetUniformSubroutineuiv\nGLAD_API_CALL PFNGLVERTEX3SVPROC glad_glVertex3sv;\n#define glVertex3sv glad_glVertex3sv\nGLAD_API_CALL PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv;\n#define glMultiTexCoord3sv glad_glMultiTexCoord3sv\nGLAD_API_CALL PFNGLGETNAMEDBUFFERPARAMETERI64VPROC glad_glGetNamedBufferParameteri64v;\n#define glGetNamedBufferParameteri64v glad_glGetNamedBufferParameteri64v\nGLAD_API_CALL PFNGLDRAWPIXELSPROC glad_glDrawPixels;\n#define glDrawPixels glad_glDrawPixels\nGLAD_API_CALL PFNGLCALLLISTSPROC glad_glCallLists;\n#define glCallLists glad_glCallLists\nGLAD_API_CALL PFNGLTEXCOORD3IPROC glad_glTexCoord3i;\n#define glTexCoord3i glad_glTexCoord3i\nGLAD_API_CALL PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui;\n#define glProgramUniform2ui glad_glProgramUniform2ui\nGLAD_API_CALL PFNGLQUERYCOUNTERPROC glad_glQueryCounter;\n#define glQueryCounter glad_glQueryCounter\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv;\n#define glProgramUniformMatrix2x3dv glad_glProgramUniformMatrix2x3dv\nGLAD_API_CALL PFNGLUNIFORM1IVPROC glad_glUniform1iv;\n#define glUniform1iv glad_glUniform1iv\nGLAD_API_CALL PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate;\n#define glStencilFuncSeparate glad_glStencilFuncSeparate\nGLAD_API_CALL PFNGLGETNAMEDBUFFERPARAMETERIVPROC glad_glGetNamedBufferParameteriv;\n#define glGetNamedBufferParameteriv glad_glGetNamedBufferParameteriv\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv;\n#define glProgramUniformMatrix2dv glad_glProgramUniformMatrix2dv\nGLAD_API_CALL PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib;\n#define glGetActiveAttrib glad_glGetActiveAttrib\nGLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray;\n#define glEnableVertexAttribArray glad_glEnableVertexAttribArray\nGLAD_API_CALL PFNGLMATERIALIPROC glad_glMateriali;\n#define glMateriali glad_glMateriali\nGLAD_API_CALL PFNGLUNIFORM2FVPROC glad_glUniform2fv;\n#define glUniform2fv glad_glUniform2fv\nGLAD_API_CALL PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv;\n#define glRasterPos3fv glad_glRasterPos3fv\nGLAD_API_CALL PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC glad_glGetProgramResourceLocationIndex;\n#define glGetProgramResourceLocationIndex glad_glGetProgramResourceLocationIndex\nGLAD_API_CALL PFNGLGETDOUBLEVPROC glad_glGetDoublev;\n#define glGetDoublev glad_glGetDoublev\nGLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex;\n#define glDrawElementsInstancedBaseVertex glad_glDrawElementsInstancedBaseVertex\nGLAD_API_CALL PFNGLUNIFORMMATRIX2X4DVPROC glad_glUniformMatrix2x4dv;\n#define glUniformMatrix2x4dv glad_glUniformMatrix2x4dv\nGLAD_API_CALL PFNGLCOLOR4BVPROC glad_glColor4bv;\n#define glColor4bv glad_glColor4bv\nGLAD_API_CALL PFNGLGETINTERNALFORMATIVPROC glad_glGetInternalformativ;\n#define glGetInternalformativ glad_glGetInternalformativ\nGLAD_API_CALL PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC glad_glGetActiveSubroutineUniformiv;\n#define glGetActiveSubroutineUniformiv glad_glGetActiveSubroutineUniformiv\nGLAD_API_CALL PFNGLGETQUERYINDEXEDIVPROC glad_glGetQueryIndexediv;\n#define glGetQueryIndexediv glad_glGetQueryIndexediv\nGLAD_API_CALL PFNGLBINDVERTEXBUFFERPROC glad_glBindVertexBuffer;\n#define glBindVertexBuffer glad_glBindVertexBuffer\nGLAD_API_CALL PFNGLTEXCOORD3FPROC glad_glTexCoord3f;\n#define glTexCoord3f glad_glTexCoord3f\nGLAD_API_CALL PFNGLCOLOR3UIVPROC glad_glColor3uiv;\n#define glColor3uiv glad_glColor3uiv\nGLAD_API_CALL PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv;\n#define glVertexAttrib4Nbv glad_glVertexAttrib4Nbv\nGLAD_API_CALL PFNGLCLEARPROC glad_glClear;\n#define glClear glad_glClear\nGLAD_API_CALL PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv;\n#define glRasterPos2dv glad_glRasterPos2dv\nGLAD_API_CALL PFNGLTEXCOORD2SPROC glad_glTexCoord2s;\n#define glTexCoord2s glad_glTexCoord2s\nGLAD_API_CALL PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui;\n#define glVertexAttribP4ui glad_glVertexAttribP4ui\nGLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer;\n#define glFramebufferTextureLayer glad_glFramebufferTextureLayer\nGLAD_API_CALL PFNGLTEXENVIPROC glad_glTexEnvi;\n#define glTexEnvi glad_glTexEnvi\nGLAD_API_CALL PFNGLTEXTUREPARAMETERFPROC glad_glTextureParameterf;\n#define glTextureParameterf glad_glTextureParameterf\nGLAD_API_CALL PFNGLMATERIALFPROC glad_glMaterialf;\n#define glMaterialf glad_glMaterialf\nGLAD_API_CALL PFNGLGETUNIFORMDVPROC glad_glGetUniformdv;\n#define glGetUniformdv glad_glGetUniformdv\nGLAD_API_CALL PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv;\n#define glProgramUniform3iv glad_glProgramUniform3iv\nGLAD_API_CALL PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv;\n#define glTexParameterIuiv glad_glTexParameterIuiv\nGLAD_API_CALL PFNGLCLEARINDEXPROC glad_glClearIndex;\n#define glClearIndex glad_glClearIndex\nGLAD_API_CALL PFNGLDISPATCHCOMPUTEINDIRECTPROC glad_glDispatchComputeIndirect;\n#define glDispatchComputeIndirect glad_glDispatchComputeIndirect\nGLAD_API_CALL PFNGLROTATEFPROC glad_glRotatef;\n#define glRotatef glad_glRotatef\nGLAD_API_CALL PFNGLTEXTURESUBIMAGE1DPROC glad_glTextureSubImage1D;\n#define glTextureSubImage1D glad_glTextureSubImage1D\nGLAD_API_CALL PFNGLPOLYGONOFFSETCLAMPPROC glad_glPolygonOffsetClamp;\n#define glPolygonOffsetClamp glad_glPolygonOffsetClamp\nGLAD_API_CALL PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv;\n#define glSamplerParameterIuiv glad_glSamplerParameterIuiv\nGLAD_API_CALL PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv;\n#define glProgramUniform4iv glad_glProgramUniform4iv\nGLAD_API_CALL PFNGLSECONDARYCOLOR3SPROC glad_glSecondaryColor3s;\n#define glSecondaryColor3s glad_glSecondaryColor3s\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv;\n#define glProgramUniformMatrix2x4dv glad_glProgramUniformMatrix2x4dv\nGLAD_API_CALL PFNGLGETVERTEXATTRIBLDVPROC glad_glGetVertexAttribLdv;\n#define glGetVertexAttribLdv glad_glGetVertexAttribLdv\nGLAD_API_CALL PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv;\n#define glRasterPos2fv glad_glRasterPos2fv\nGLAD_API_CALL PFNGLSHADEMODELPROC glad_glShadeModel;\n#define glShadeModel glad_glShadeModel\nGLAD_API_CALL PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv;\n#define glProgramUniform4dv glad_glProgramUniform4dv\nGLAD_API_CALL PFNGLNORMAL3FVPROC glad_glNormal3fv;\n#define glNormal3fv glad_glNormal3fv\nGLAD_API_CALL PFNGLISBUFFERPROC glad_glIsBuffer;\n#define glIsBuffer glad_glIsBuffer\nGLAD_API_CALL PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f;\n#define glMultiTexCoord3f glad_glMultiTexCoord3f\nGLAD_API_CALL PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer;\n#define glBindFramebuffer glad_glBindFramebuffer\nGLAD_API_CALL PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed;\n#define glBindFragDataLocationIndexed glad_glBindFragDataLocationIndexed\nGLAD_API_CALL PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase;\n#define glBindBufferBase glad_glBindBufferBase\nGLAD_API_CALL PFNGLGENBUFFERSPROC glad_glGenBuffers;\n#define glGenBuffers glad_glGenBuffers\nGLAD_API_CALL PFNGLTEXCOORD1FPROC glad_glTexCoord1f;\n#define glTexCoord1f glad_glTexCoord1f\nGLAD_API_CALL PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData;\n#define glGetBufferSubData glad_glGetBufferSubData\nGLAD_API_CALL PFNGLCREATETRANSFORMFEEDBACKSPROC glad_glCreateTransformFeedbacks;\n#define glCreateTransformFeedbacks glad_glCreateTransformFeedbacks\nGLAD_API_CALL PFNGLMAP2FPROC glad_glMap2f;\n#define glMap2f glad_glMap2f\nGLAD_API_CALL PFNGLCREATEBUFFERSPROC glad_glCreateBuffers;\n#define glCreateBuffers glad_glCreateBuffers\nGLAD_API_CALL PFNGLCOLOR3USVPROC glad_glColor3usv;\n#define glColor3usv glad_glColor3usv\nGLAD_API_CALL PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv;\n#define glGetSamplerParameterfv glad_glGetSamplerParameterfv\nGLAD_API_CALL PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation;\n#define glGetUniformLocation glad_glGetUniformLocation\nGLAD_API_CALL PFNGLVERTEX2DPROC glad_glVertex2d;\n#define glVertex2d glad_glVertex2d\nGLAD_API_CALL PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC glad_glGetSubroutineUniformLocation;\n#define glGetSubroutineUniformLocation glad_glGetSubroutineUniformLocation\nGLAD_API_CALL PFNGLINVALIDATEBUFFERSUBDATAPROC glad_glInvalidateBufferSubData;\n#define glInvalidateBufferSubData glad_glInvalidateBufferSubData\nGLAD_API_CALL PFNGLUNIFORMMATRIX2DVPROC glad_glUniformMatrix2dv;\n#define glUniformMatrix2dv glad_glUniformMatrix2dv\nGLAD_API_CALL PFNGLCLEARNAMEDBUFFERSUBDATAPROC glad_glClearNamedBufferSubData;\n#define glClearNamedBufferSubData glad_glClearNamedBufferSubData\nGLAD_API_CALL PFNGLGETPROGRAMIVPROC glad_glGetProgramiv;\n#define glGetProgramiv glad_glGetProgramiv\nGLAD_API_CALL PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements;\n#define glDrawRangeElements glad_glDrawRangeElements\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv;\n#define glProgramUniformMatrix4fv glad_glProgramUniformMatrix4fv\nGLAD_API_CALL PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v;\n#define glGetInteger64i_v glad_glGetInteger64i_v\nGLAD_API_CALL PFNGLVERTEXATTRIBL1DPROC glad_glVertexAttribL1d;\n#define glVertexAttribL1d glad_glVertexAttribL1d\nGLAD_API_CALL PFNGLGETTEXTUREIMAGEPROC glad_glGetTextureImage;\n#define glGetTextureImage glad_glGetTextureImage\nGLAD_API_CALL PFNGLGETNUNIFORMIVPROC glad_glGetnUniformiv;\n#define glGetnUniformiv glad_glGetnUniformiv\nGLAD_API_CALL PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i;\n#define glProgramUniform1i glad_glProgramUniform1i\nGLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC glad_glDrawTransformFeedbackInstanced;\n#define glDrawTransformFeedbackInstanced glad_glDrawTransformFeedbackInstanced\nGLAD_API_CALL PFNGLGETPROGRAMRESOURCEINDEXPROC glad_glGetProgramResourceIndex;\n#define glGetProgramResourceIndex glad_glGetProgramResourceIndex\nGLAD_API_CALL PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d;\n#define glProgramUniform2d glad_glProgramUniform2d\nGLAD_API_CALL PFNGLUNMAPNAMEDBUFFERPROC glad_glUnmapNamedBuffer;\n#define glUnmapNamedBuffer glad_glUnmapNamedBuffer\nGLAD_API_CALL PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f;\n#define glMultiTexCoord2f glad_glMultiTexCoord2f\nGLAD_API_CALL PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv;\n#define glPointParameterfv glad_glPointParameterfv\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv;\n#define glProgramUniformMatrix3fv glad_glProgramUniformMatrix3fv\nGLAD_API_CALL PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange;\n#define glBindBufferRange glad_glBindBufferRange\nGLAD_API_CALL PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv;\n#define glMultiTexCoord2dv glad_glMultiTexCoord2dv\nGLAD_API_CALL PFNGLCOLORMATERIALPROC glad_glColorMaterial;\n#define glColorMaterial glad_glColorMaterial\nGLAD_API_CALL PFNGLBLENDEQUATIONPROC glad_glBlendEquation;\n#define glBlendEquation glad_glBlendEquation\nGLAD_API_CALL PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer;\n#define glBlitFramebuffer glad_glBlitFramebuffer\nGLAD_API_CALL PFNGLCOLOR3DPROC glad_glColor3d;\n#define glColor3d glad_glColor3d\nGLAD_API_CALL PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv;\n#define glMultiTexCoord3iv glad_glMultiTexCoord3iv\nGLAD_API_CALL PFNGLLIGHTFVPROC glad_glLightfv;\n#define glLightfv glad_glLightfv\nGLAD_API_CALL PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv;\n#define glVertexAttrib1dv glad_glVertexAttrib1dv\nGLAD_API_CALL PFNGLDEPTHMASKPROC glad_glDepthMask;\n#define glDepthMask glad_glDepthMask\nGLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying;\n#define glGetTransformFeedbackVarying glad_glGetTransformFeedbackVarying\nGLAD_API_CALL PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui;\n#define glProgramUniform1ui glad_glProgramUniform1ui\nGLAD_API_CALL PFNGLVERTEXATTRIBL3DPROC glad_glVertexAttribL3d;\n#define glVertexAttribL3d glad_glVertexAttribL3d\nGLAD_API_CALL PFNGLDRAWELEMENTSINDIRECTPROC glad_glDrawElementsIndirect;\n#define glDrawElementsIndirect glad_glDrawElementsIndirect\nGLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXFPROC glad_glLoadTransposeMatrixf;\n#define glLoadTransposeMatrixf glad_glLoadTransposeMatrixf\nGLAD_API_CALL PFNGLENDQUERYINDEXEDPROC glad_glEndQueryIndexed;\n#define glEndQueryIndexed glad_glEndQueryIndexed\nGLAD_API_CALL PFNGLSECONDARYCOLOR3USPROC glad_glSecondaryColor3us;\n#define glSecondaryColor3us glad_glSecondaryColor3us\nGLAD_API_CALL PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC glad_glTextureStorage2DMultisample;\n#define glTextureStorage2DMultisample glad_glTextureStorage2DMultisample\nGLAD_API_CALL PFNGLPIXELSTOREFPROC glad_glPixelStoref;\n#define glPixelStoref glad_glPixelStoref\nGLAD_API_CALL PFNGLUNIFORM2IVPROC glad_glUniform2iv;\n#define glUniform2iv glad_glUniform2iv\nGLAD_API_CALL PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv;\n#define glRasterPos2sv glad_glRasterPos2sv\nGLAD_API_CALL PFNGLVERTEX2IPROC glad_glVertex2i;\n#define glVertex2i glad_glVertex2i\nGLAD_API_CALL PFNGLFRUSTUMPROC glad_glFrustum;\n#define glFrustum glad_glFrustum\nGLAD_API_CALL PFNGLMEMORYBARRIERPROC glad_glMemoryBarrier;\n#define glMemoryBarrier glad_glMemoryBarrier\nGLAD_API_CALL PFNGLGETSTRINGPROC glad_glGetString;\n#define glGetString glad_glGetString\nGLAD_API_CALL PFNGLLINEWIDTHPROC glad_glLineWidth;\n#define glLineWidth glad_glLineWidth\nGLAD_API_CALL PFNGLNORMALPOINTERPROC glad_glNormalPointer;\n#define glNormalPointer glad_glNormalPointer\nGLAD_API_CALL PFNGLGETNUNIFORMUIVPROC glad_glGetnUniformuiv;\n#define glGetnUniformuiv glad_glGetnUniformuiv\nGLAD_API_CALL PFNGLDEPTHRANGEARRAYVPROC glad_glDepthRangeArrayv;\n#define glDepthRangeArrayv glad_glDepthRangeArrayv\nGLAD_API_CALL PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui;\n#define glTexCoordP2ui glad_glTexCoordP2ui\nGLAD_API_CALL PFNGLATTACHSHADERPROC glad_glAttachShader;\n#define glAttachShader glad_glAttachShader\nGLAD_API_CALL PFNGLDRAWARRAYSPROC glad_glDrawArrays;\n#define glDrawArrays glad_glDrawArrays\nGLAD_API_CALL PFNGLCOLOR4SPROC glad_glColor4s;\n#define glColor4s glad_glColor4s\nGLAD_API_CALL PFNGLTEXGENDVPROC glad_glTexGendv;\n#define glTexGendv glad_glTexGendv\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv;\n#define glProgramUniformMatrix3x2dv glad_glProgramUniformMatrix3x2dv\nGLAD_API_CALL PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv;\n#define glGetSamplerParameterIuiv glad_glGetSamplerParameterIuiv\nGLAD_API_CALL PFNGLENDQUERYPROC glad_glEndQuery;\n#define glEndQuery glad_glEndQuery\nGLAD_API_CALL PFNGLWINDOWPOS2SPROC glad_glWindowPos2s;\n#define glWindowPos2s glad_glWindowPos2s\nGLAD_API_CALL PFNGLDRAWARRAYSINDIRECTPROC glad_glDrawArraysIndirect;\n#define glDrawArraysIndirect glad_glDrawArraysIndirect\nGLAD_API_CALL PFNGLRASTERPOS3SPROC glad_glRasterPos3s;\n#define glRasterPos3s glad_glRasterPos3s\nGLAD_API_CALL PFNGLGETNPIXELMAPFVPROC glad_glGetnPixelMapfv;\n#define glGetnPixelMapfv glad_glGetnPixelMapfv\nGLAD_API_CALL PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv;\n#define glTexCoord3sv glad_glTexCoord3sv\nGLAD_API_CALL PFNGLRECTIPROC glad_glRecti;\n#define glRecti glad_glRecti\nGLAD_API_CALL PFNGLUNIFORM4DVPROC glad_glUniform4dv;\n#define glUniform4dv glad_glUniform4dv\nGLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEIPROC glad_glBlendEquationSeparatei;\n#define glBlendEquationSeparatei glad_glBlendEquationSeparatei\nGLAD_API_CALL PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv;\n#define glProgramUniform3fv glad_glProgramUniform3fv\nGLAD_API_CALL PFNGLGETPROGRAMRESOURCEIVPROC glad_glGetProgramResourceiv;\n#define glGetProgramResourceiv glad_glGetProgramResourceiv\nGLAD_API_CALL PFNGLINVALIDATESUBFRAMEBUFFERPROC glad_glInvalidateSubFramebuffer;\n#define glInvalidateSubFramebuffer glad_glInvalidateSubFramebuffer\nGLAD_API_CALL PFNGLFENCESYNCPROC glad_glFenceSync;\n#define glFenceSync glad_glFenceSync\nGLAD_API_CALL PFNGLUNIFORM3UIPROC glad_glUniform3ui;\n#define glUniform3ui glad_glUniform3ui\nGLAD_API_CALL PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv;\n#define glSecondaryColorP3uiv glad_glSecondaryColorP3uiv\nGLAD_API_CALL PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s;\n#define glVertexAttrib1s glad_glVertexAttrib1s\nGLAD_API_CALL PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv;\n#define glVertexAttrib4Nsv glad_glVertexAttrib4Nsv\nGLAD_API_CALL PFNGLLOADMATRIXFPROC glad_glLoadMatrixf;\n#define glLoadMatrixf glad_glLoadMatrixf\nGLAD_API_CALL PFNGLTRANSLATEFPROC glad_glTranslatef;\n#define glTranslatef glad_glTranslatef\nGLAD_API_CALL PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv;\n#define glMultiTexCoord4sv glad_glMultiTexCoord4sv\nGLAD_API_CALL PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv;\n#define glProgramUniform2iv glad_glProgramUniform2iv\nGLAD_API_CALL PFNGLMAPGRID2FPROC glad_glMapGrid2f;\n#define glMapGrid2f glad_glMapGrid2f\nGLAD_API_CALL PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState;\n#define glEnableClientState glad_glEnableClientState\nGLAD_API_CALL PFNGLGETUNIFORMIVPROC glad_glGetUniformiv;\n#define glGetUniformiv glad_glGetUniformiv\nGLAD_API_CALL PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv;\n#define glEvalCoord1dv glad_glEvalCoord1dv\nGLAD_API_CALL PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv;\n#define glVertexAttribI4iv glad_glVertexAttribI4iv\nGLAD_API_CALL PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv;\n#define glVertexAttrib4sv glad_glVertexAttrib4sv\nGLAD_API_CALL PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv;\n#define glGetMultisamplefv glad_glGetMultisamplefv\nGLAD_API_CALL PFNGLINDEXDVPROC glad_glIndexdv;\n#define glIndexdv glad_glIndexdv\nGLAD_API_CALL PFNGLBLENDFUNCIPROC glad_glBlendFunci;\n#define glBlendFunci glad_glBlendFunci\nGLAD_API_CALL PFNGLISENABLEDPROC glad_glIsEnabled;\n#define glIsEnabled glad_glIsEnabled\nGLAD_API_CALL PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv;\n#define glGetPixelMapusv glad_glGetPixelMapusv\nGLAD_API_CALL PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv;\n#define glRasterPos3iv glad_glRasterPos3iv\nGLAD_API_CALL PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange;\n#define glMapBufferRange glad_glMapBufferRange\nGLAD_API_CALL PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s;\n#define glMultiTexCoord2s glad_glMultiTexCoord2s\nGLAD_API_CALL PFNGLRASTERPOS2FPROC glad_glRasterPos2f;\n#define glRasterPos2f glad_glRasterPos2f\nGLAD_API_CALL PFNGLMINSAMPLESHADINGPROC glad_glMinSampleShading;\n#define glMinSampleShading glad_glMinSampleShading\nGLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTUI64VPROC glad_glGetQueryBufferObjectui64v;\n#define glGetQueryBufferObjectui64v glad_glGetQueryBufferObjectui64v\nGLAD_API_CALL PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i;\n#define glMultiTexCoord2i glad_glMultiTexCoord2i\nGLAD_API_CALL PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv;\n#define glVertexAttribP3uiv glad_glVertexAttribP3uiv\nGLAD_API_CALL PFNGLVERTEX2FPROC glad_glVertex2f;\n#define glVertex2f glad_glVertex2f\nGLAD_API_CALL PFNGLVERTEXARRAYBINDINGDIVISORPROC glad_glVertexArrayBindingDivisor;\n#define glVertexArrayBindingDivisor glad_glVertexArrayBindingDivisor\nGLAD_API_CALL PFNGLINDEXPOINTERPROC glad_glIndexPointer;\n#define glIndexPointer glad_glIndexPointer\nGLAD_API_CALL PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding;\n#define glUniformBlockBinding glad_glUniformBlockBinding\nGLAD_API_CALL PFNGLRENDERMODEPROC glad_glRenderMode;\n#define glRenderMode glad_glRenderMode\nGLAD_API_CALL PFNGLTEXSTORAGE1DPROC glad_glTexStorage1D;\n#define glTexStorage1D glad_glTexStorage1D\nGLAD_API_CALL PFNGLBUFFERSUBDATAPROC glad_glBufferSubData;\n#define glBufferSubData glad_glBufferSubData\nGLAD_API_CALL PFNGLCOLOR3FVPROC glad_glColor3fv;\n#define glColor3fv glad_glColor3fv\nGLAD_API_CALL PFNGLBITMAPPROC glad_glBitmap;\n#define glBitmap glad_glBitmap\nGLAD_API_CALL PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv;\n#define glProgramUniform3uiv glad_glProgramUniform3uiv\nGLAD_API_CALL PFNGLVIEWPORTINDEXEDFPROC glad_glViewportIndexedf;\n#define glViewportIndexedf glad_glViewportIndexedf\nGLAD_API_CALL PFNGLRASTERPOS2DPROC glad_glRasterPos2d;\n#define glRasterPos2d glad_glRasterPos2d\nGLAD_API_CALL PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices;\n#define glGetUniformIndices glad_glGetUniformIndices\nGLAD_API_CALL PFNGLENABLEIPROC glad_glEnablei;\n#define glEnablei glad_glEnablei\nGLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D;\n#define glFramebufferTexture2D glad_glFramebufferTexture2D\nGLAD_API_CALL PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate;\n#define glBlendFuncSeparate glad_glBlendFuncSeparate\nGLAD_API_CALL PFNGLNAMEDBUFFERSTORAGEPROC glad_glNamedBufferStorage;\n#define glNamedBufferStorage glad_glNamedBufferStorage\nGLAD_API_CALL PFNGLRECTSPROC glad_glRects;\n#define glRects glad_glRects\nGLAD_API_CALL PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv;\n#define glProgramUniform2fv glad_glProgramUniform2fv\nGLAD_API_CALL PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple;\n#define glPolygonStipple glad_glPolygonStipple\nGLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D;\n#define glCopyTexSubImage3D glad_glCopyTexSubImage3D\nGLAD_API_CALL PFNGLSECONDARYCOLOR3UBPROC glad_glSecondaryColor3ub;\n#define glSecondaryColor3ub glad_glSecondaryColor3ub\nGLAD_API_CALL PFNGLWINDOWPOS3FPROC glad_glWindowPos3f;\n#define glWindowPos3f glad_glWindowPos3f\nGLAD_API_CALL PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv;\n#define glGetSamplerParameteriv glad_glGetSamplerParameteriv\nGLAD_API_CALL PFNGLSHADERSTORAGEBLOCKBINDINGPROC glad_glShaderStorageBlockBinding;\n#define glShaderStorageBlockBinding glad_glShaderStorageBlockBinding\nGLAD_API_CALL PFNGLLOADIDENTITYPROC glad_glLoadIdentity;\n#define glLoadIdentity glad_glLoadIdentity\nGLAD_API_CALL PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex;\n#define glMultiDrawElementsBaseVertex glad_glMultiDrawElementsBaseVertex\nGLAD_API_CALL PFNGLVERTEX2SPROC glad_glVertex2s;\n#define glVertex2s glad_glVertex2s\nGLAD_API_CALL PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv;\n#define glMultiTexCoord1iv glad_glMultiTexCoord1iv\nGLAD_API_CALL PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s;\n#define glMultiTexCoord4s glad_glMultiTexCoord4s\nGLAD_API_CALL PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler;\n#define glReleaseShaderCompiler glad_glReleaseShaderCompiler\nGLAD_API_CALL PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource;\n#define glGetShaderSource glad_glGetShaderSource\nGLAD_API_CALL PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv;\n#define glMultiTexCoord2sv glad_glMultiTexCoord2sv\nGLAD_API_CALL PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv;\n#define glTexParameterfv glad_glTexParameterfv\nGLAD_API_CALL PFNGLISSHADERPROC glad_glIsShader;\n#define glIsShader glad_glIsShader\nGLAD_API_CALL PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv;\n#define glVertexAttrib4iv glad_glVertexAttrib4iv\nGLAD_API_CALL PFNGLTEXCOORD4IPROC glad_glTexCoord4i;\n#define glTexCoord4i glad_glTexCoord4i\nGLAD_API_CALL PFNGLCOLOR4UIPROC glad_glColor4ui;\n#define glColor4ui glad_glColor4ui\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv;\n#define glProgramUniformMatrix3dv glad_glProgramUniformMatrix3dv\nGLAD_API_CALL PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv;\n#define glGetTexEnvfv glad_glGetTexEnvfv\nGLAD_API_CALL PFNGLTEXCOORD4DPROC glad_glTexCoord4d;\n#define glTexCoord4d glad_glTexCoord4d\nGLAD_API_CALL PFNGLSCISSORARRAYVPROC glad_glScissorArrayv;\n#define glScissorArrayv glad_glScissorArrayv\nGLAD_API_CALL PFNGLCREATERENDERBUFFERSPROC glad_glCreateRenderbuffers;\n#define glCreateRenderbuffers glad_glCreateRenderbuffers\nGLAD_API_CALL PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv;\n#define glVertexAttrib3fv glad_glVertexAttrib3fv\nGLAD_API_CALL PFNGLCOLOR4FPROC glad_glColor4f;\n#define glColor4f glad_glColor4f\nGLAD_API_CALL PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub;\n#define glVertexAttrib4Nub glad_glVertexAttrib4Nub\nGLAD_API_CALL PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv;\n#define glGetSamplerParameterIiv glad_glGetSamplerParameterIiv\nGLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D;\n#define glCopyTexSubImage2D glad_glCopyTexSubImage2D\nGLAD_API_CALL PFNGLNORMAL3IVPROC glad_glNormal3iv;\n#define glNormal3iv glad_glNormal3iv\nGLAD_API_CALL PFNGLBINDIMAGETEXTURESPROC glad_glBindImageTextures;\n#define glBindImageTextures glad_glBindImageTextures\nGLAD_API_CALL PFNGLTEXGENIVPROC glad_glTexGeniv;\n#define glTexGeniv glad_glTexGeniv\nGLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D;\n#define glCompressedTexImage3D glad_glCompressedTexImage3D\nGLAD_API_CALL PFNGLSCALEDPROC glad_glScaled;\n#define glScaled glad_glScaled\nGLAD_API_CALL PFNGLCREATEPROGRAMPIPELINESPROC glad_glCreateProgramPipelines;\n#define glCreateProgramPipelines glad_glCreateProgramPipelines\nGLAD_API_CALL PFNGLBLENDFUNCSEPARATEIPROC glad_glBlendFuncSeparatei;\n#define glBlendFuncSeparatei glad_glBlendFuncSeparatei\nGLAD_API_CALL PFNGLHINTPROC glad_glHint;\n#define glHint glad_glHint\nGLAD_API_CALL PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i;\n#define glMultiTexCoord4i glad_glMultiTexCoord4i\nGLAD_API_CALL PFNGLINDEXMASKPROC glad_glIndexMask;\n#define glIndexMask glad_glIndexMask\nGLAD_API_CALL PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f;\n#define glProgramUniform2f glad_glProgramUniform2f\nGLAD_API_CALL PFNGLCOLOR3BPROC glad_glColor3b;\n#define glColor3b glad_glColor3b\nGLAD_API_CALL PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv;\n#define glVertexAttribI1uiv glad_glVertexAttribI1uiv\nGLAD_API_CALL PFNGLSPECIALIZESHADERPROC glad_glSpecializeShader;\n#define glSpecializeShader glad_glSpecializeShader\nGLAD_API_CALL PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC glad_glNamedFramebufferDrawBuffer;\n#define glNamedFramebufferDrawBuffer glad_glNamedFramebufferDrawBuffer\nGLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTI64VPROC glad_glGetQueryBufferObjecti64v;\n#define glGetQueryBufferObjecti64v glad_glGetQueryBufferObjecti64v\nGLAD_API_CALL PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv;\n#define glTexCoord3iv glad_glTexCoord3iv\nGLAD_API_CALL PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv;\n#define glSamplerParameterfv glad_glSamplerParameterfv\nGLAD_API_CALL PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv;\n#define glGetVertexAttribIiv glad_glGetVertexAttribIiv\nGLAD_API_CALL PFNGLBUFFERSTORAGEPROC glad_glBufferStorage;\n#define glBufferStorage glad_glBufferStorage\nGLAD_API_CALL PFNGLVERTEX3SPROC glad_glVertex3s;\n#define glVertex3s glad_glVertex3s\nGLAD_API_CALL PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv;\n#define glProgramUniform2uiv glad_glProgramUniform2uiv\nGLAD_API_CALL PFNGLDEPTHRANGEPROC glad_glDepthRange;\n#define glDepthRange glad_glDepthRange\nGLAD_API_CALL PFNGLRASTERPOS3FPROC glad_glRasterPos3f;\n#define glRasterPos3f glad_glRasterPos3f\nGLAD_API_CALL PFNGLDELETESHADERPROC glad_glDeleteShader;\n#define glDeleteShader glad_glDeleteShader\nGLAD_API_CALL PFNGLCOLOR3BVPROC glad_glColor3bv;\n#define glColor3bv glad_glColor3bv\nGLAD_API_CALL PFNGLCOLOR3UBVPROC glad_glColor3ubv;\n#define glColor3ubv glad_glColor3ubv\nGLAD_API_CALL PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv;\n#define glGetVertexAttribiv glad_glGetVertexAttribiv\nGLAD_API_CALL PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv;\n#define glTexCoord4sv glad_glTexCoord4sv\nGLAD_API_CALL PFNGLMAP2DPROC glad_glMap2d;\n#define glMap2d glad_glMap2d\nGLAD_API_CALL PFNGLFOGCOORDFPROC glad_glFogCoordf;\n#define glFogCoordf glad_glFogCoordf\nGLAD_API_CALL PFNGLEDGEFLAGVPROC glad_glEdgeFlagv;\n#define glEdgeFlagv glad_glEdgeFlagv\nGLAD_API_CALL PFNGLCLIPCONTROLPROC glad_glClipControl;\n#define glClipControl glad_glClipControl\nGLAD_API_CALL PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv;\n#define glGetBufferParameteriv glad_glGetBufferParameteriv\nGLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKIVPROC glad_glGetTransformFeedbackiv;\n#define glGetTransformFeedbackiv glad_glGetTransformFeedbackiv\nGLAD_API_CALL PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv;\n#define glGetProgramPipelineiv glad_glGetProgramPipelineiv\nGLAD_API_CALL PFNGLGETNMINMAXPROC glad_glGetnMinmax;\n#define glGetnMinmax glad_glGetnMinmax\nGLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glNamedRenderbufferStorageMultisample;\n#define glNamedRenderbufferStorageMultisample glad_glNamedRenderbufferStorageMultisample\nGLAD_API_CALL PFNGLCOLORP4UIPROC glad_glColorP4ui;\n#define glColorP4ui glad_glColorP4ui\nGLAD_API_CALL PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv;\n#define glMultiTexCoord1sv glad_glMultiTexCoord1sv\nGLAD_API_CALL PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv;\n#define glVertexAttrib4fv glad_glVertexAttrib4fv\nGLAD_API_CALL PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv;\n#define glVertexAttrib4dv glad_glVertexAttrib4dv\nGLAD_API_CALL PFNGLVERTEXP4UIPROC glad_glVertexP4ui;\n#define glVertexP4ui glad_glVertexP4ui\nGLAD_API_CALL PFNGLRECTFVPROC glad_glRectfv;\n#define glRectfv glad_glRectfv\nGLAD_API_CALL PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback;\n#define glBeginTransformFeedback glad_glBeginTransformFeedback\nGLAD_API_CALL PFNGLARRAYELEMENTPROC glad_glArrayElement;\n#define glArrayElement glad_glArrayElement\nGLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC glad_glNamedFramebufferTextureLayer;\n#define glNamedFramebufferTextureLayer glad_glNamedFramebufferTextureLayer\nGLAD_API_CALL PFNGLBEGINPROC glad_glBegin;\n#define glBegin glad_glBegin\nGLAD_API_CALL PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer;\n#define glTexCoordPointer glad_glTexCoordPointer\nGLAD_API_CALL PFNGLTEXCOORD3DPROC glad_glTexCoord3d;\n#define glTexCoord3d glad_glTexCoord3d\nGLAD_API_CALL PFNGLUNIFORM1FVPROC glad_glUniform1fv;\n#define glUniform1fv glad_glUniform1fv\nGLAD_API_CALL PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv;\n#define glVertexAttrib2sv glad_glVertexAttrib2sv\nGLAD_API_CALL PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog;\n#define glGetProgramPipelineInfoLog glad_glGetProgramPipelineInfoLog\nGLAD_API_CALL PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset;\n#define glPolygonOffset glad_glPolygonOffset\nGLAD_API_CALL PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat;\n#define glGetShaderPrecisionFormat glad_glGetShaderPrecisionFormat\nGLAD_API_CALL PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d;\n#define glProgramUniform3d glad_glProgramUniform3d\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv;\n#define glProgramUniformMatrix4x2dv glad_glProgramUniformMatrix4x2dv\nGLAD_API_CALL PFNGLBINDTRANSFORMFEEDBACKPROC glad_glBindTransformFeedback;\n#define glBindTransformFeedback glad_glBindTransformFeedback\nGLAD_API_CALL PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex;\n#define glProvokingVertex glad_glProvokingVertex\nGLAD_API_CALL PFNGLDISABLEVERTEXARRAYATTRIBPROC glad_glDisableVertexArrayAttrib;\n#define glDisableVertexArrayAttrib glad_glDisableVertexArrayAttrib\nGLAD_API_CALL PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv;\n#define glMultiTexCoord4fv glad_glMultiTexCoord4fv\nGLAD_API_CALL PFNGLUNIFORM1DPROC glad_glUniform1d;\n#define glUniform1d glad_glUniform1d\nGLAD_API_CALL PFNGLVERTEXATTRIBFORMATPROC glad_glVertexAttribFormat;\n#define glVertexAttribFormat glad_glVertexAttribFormat\nGLAD_API_CALL PFNGLMEMORYBARRIERBYREGIONPROC glad_glMemoryBarrierByRegion;\n#define glMemoryBarrierByRegion glad_glMemoryBarrierByRegion\nGLAD_API_CALL PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup;\n#define glPopDebugGroup glad_glPopDebugGroup\nGLAD_API_CALL PFNGLCOLOR4BPROC glad_glColor4b;\n#define glColor4b glad_glColor4b\nGLAD_API_CALL PFNGLTEXTUREBUFFERPROC glad_glTextureBuffer;\n#define glTextureBuffer glad_glTextureBuffer\nGLAD_API_CALL PFNGLGETSHADERIVPROC glad_glGetShaderiv;\n#define glGetShaderiv glad_glGetShaderiv\nGLAD_API_CALL PFNGLBEGINQUERYINDEXEDPROC glad_glBeginQueryIndexed;\n#define glBeginQueryIndexed glad_glBeginQueryIndexed\nGLAD_API_CALL PFNGLCOPYNAMEDBUFFERSUBDATAPROC glad_glCopyNamedBufferSubData;\n#define glCopyNamedBufferSubData glad_glCopyNamedBufferSubData\nGLAD_API_CALL PFNGLVERTEXARRAYATTRIBFORMATPROC glad_glVertexArrayAttribFormat;\n#define glVertexArrayAttribFormat glad_glVertexArrayAttribFormat\nGLAD_API_CALL PFNGLMAPNAMEDBUFFERRANGEPROC glad_glMapNamedBufferRange;\n#define glMapNamedBufferRange glad_glMapNamedBufferRange\nGLAD_API_CALL PFNGLCOLOR4UIVPROC glad_glColor4uiv;\n#define glColor4uiv glad_glColor4uiv\nGLAD_API_CALL PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui;\n#define glVertexAttribP1ui glad_glVertexAttribP1ui\nGLAD_API_CALL PFNGLWINDOWPOS3SVPROC glad_glWindowPos3sv;\n#define glWindowPos3sv glad_glWindowPos3sv\nGLAD_API_CALL PFNGLFOGIVPROC glad_glFogiv;\n#define glFogiv glad_glFogiv\nGLAD_API_CALL PFNGLTEXTUREPARAMETERIIVPROC glad_glTextureParameterIiv;\n#define glTextureParameterIiv glad_glTextureParameterIiv\nGLAD_API_CALL PFNGLLISTBASEPROC glad_glListBase;\n#define glListBase glad_glListBase\nGLAD_API_CALL PFNGLCREATEFRAMEBUFFERSPROC glad_glCreateFramebuffers;\n#define glCreateFramebuffers glad_glCreateFramebuffers\nGLAD_API_CALL PFNGLEVALCOORD2FPROC glad_glEvalCoord2f;\n#define glEvalCoord2f glad_glEvalCoord2f\nGLAD_API_CALL PFNGLVERTEX4DVPROC glad_glVertex4dv;\n#define glVertex4dv glad_glVertex4dv\nGLAD_API_CALL PFNGLDELETEPROGRAMPROC glad_glDeleteProgram;\n#define glDeleteProgram glad_glDeleteProgram\nGLAD_API_CALL PFNGLDRAWELEMENTSPROC glad_glDrawElements;\n#define glDrawElements glad_glDrawElements\nGLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC glad_glDrawTransformFeedbackStream;\n#define glDrawTransformFeedbackStream glad_glDrawTransformFeedbackStream\nGLAD_API_CALL PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram;\n#define glValidateProgram glad_glValidateProgram\nGLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced;\n#define glDrawElementsInstanced glad_glDrawElementsInstanced\nGLAD_API_CALL PFNGLGENLISTSPROC glad_glGenLists;\n#define glGenLists glad_glGenLists\nGLAD_API_CALL PFNGLCOLOR4IPROC glad_glColor4i;\n#define glColor4i glad_glColor4i\nGLAD_API_CALL PFNGLCOLOR3UIPROC glad_glColor3ui;\n#define glColor3ui glad_glColor3ui\nGLAD_API_CALL PFNGLCREATETEXTURESPROC glad_glCreateTextures;\n#define glCreateTextures glad_glCreateTextures\nGLAD_API_CALL PFNGLCOLORP4UIVPROC glad_glColorP4uiv;\n#define glColorP4uiv glad_glColorP4uiv\nGLAD_API_CALL PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog;\n#define glGetProgramInfoLog glad_glGetProgramInfoLog\nGLAD_API_CALL PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui;\n#define glVertexAttribP3ui glad_glVertexAttribP3ui\nGLAD_API_CALL PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi;\n#define glClearBufferfi glad_glClearBufferfi\nGLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE3DPROC glad_glCopyTextureSubImage3D;\n#define glCopyTextureSubImage3D glad_glCopyTextureSubImage3D\nGLAD_API_CALL PFNGLEDGEFLAGPROC glad_glEdgeFlag;\n#define glEdgeFlag glad_glEdgeFlag\nGLAD_API_CALL PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v;\n#define glGetBufferParameteri64v glad_glGetBufferParameteri64v\nGLAD_API_CALL PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv;\n#define glRasterPos2iv glad_glRasterPos2iv\nGLAD_API_CALL PFNGLGETNMAPIVPROC glad_glGetnMapiv;\n#define glGetnMapiv glad_glGetnMapiv\nGLAD_API_CALL PFNGLRECTDVPROC glad_glRectdv;\n#define glRectdv glad_glRectdv\nGLAD_API_CALL PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v;\n#define glGetBooleani_v glad_glGetBooleani_v\nGLAD_API_CALL PFNGLENDLISTPROC glad_glEndList;\n#define glEndList glad_glEndList\nGLAD_API_CALL PFNGLFLUSHPROC glad_glFlush;\n#define glFlush glad_glFlush\nGLAD_API_CALL PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui;\n#define glProgramUniform4ui glad_glProgramUniform4ui\nGLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC glad_glMultiDrawElementsIndirectCount;\n#define glMultiDrawElementsIndirectCount glad_glMultiDrawElementsIndirectCount\nGLAD_API_CALL PFNGLGETINTEGER64VPROC glad_glGetInteger64v;\n#define glGetInteger64v glad_glGetInteger64v\nGLAD_API_CALL PFNGLLIGHTMODELFPROC glad_glLightModelf;\n#define glLightModelf glad_glLightModelf\nGLAD_API_CALL PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv;\n#define glVertexAttrib4Niv glad_glVertexAttrib4Niv\nGLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERIVPROC glad_glGetTextureLevelParameteriv;\n#define glGetTextureLevelParameteriv glad_glGetTextureLevelParameteriv\nGLAD_API_CALL PFNGLLOADMATRIXDPROC glad_glLoadMatrixd;\n#define glLoadMatrixd glad_glLoadMatrixd\nGLAD_API_CALL PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline;\n#define glBindProgramPipeline glad_glBindProgramPipeline\nGLAD_API_CALL PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv;\n#define glProgramUniform1uiv glad_glProgramUniform1uiv\nGLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray;\n#define glDisableVertexAttribArray glad_glDisableVertexAttribArray\nGLAD_API_CALL PFNGLCLEARDEPTHPROC glad_glClearDepth;\n#define glClearDepth glad_glClearDepth\nGLAD_API_CALL PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv;\n#define glGetTexParameterIiv glad_glGetTexParameterIiv\nGLAD_API_CALL PFNGLWINDOWPOS3FVPROC glad_glWindowPos3fv;\n#define glWindowPos3fv glad_glWindowPos3fv\nGLAD_API_CALL PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d;\n#define glVertexAttrib3d glad_glVertexAttrib3d\nGLAD_API_CALL PFNGLGETPROGRAMRESOURCELOCATIONPROC glad_glGetProgramResourceLocation;\n#define glGetProgramResourceLocation glad_glGetProgramResourceLocation\nGLAD_API_CALL PFNGLTEXCOORD2DPROC glad_glTexCoord2d;\n#define glTexCoord2d glad_glTexCoord2d\nGLAD_API_CALL PFNGLACCUMPROC glad_glAccum;\n#define glAccum glad_glAccum\nGLAD_API_CALL PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui;\n#define glSecondaryColorP3ui glad_glSecondaryColorP3ui\nGLAD_API_CALL PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui;\n#define glVertexAttribI2ui glad_glVertexAttribI2ui\nGLAD_API_CALL PFNGLGETNUNIFORMFVPROC glad_glGetnUniformfv;\n#define glGetnUniformfv glad_glGetnUniformfv\nGLAD_API_CALL PFNGLFOGIPROC glad_glFogi;\n#define glFogi glad_glFogi\nGLAD_API_CALL PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv;\n#define glClearBufferfv glad_glClearBufferfv\nGLAD_API_CALL PFNGLTEXENVIVPROC glad_glTexEnviv;\n#define glTexEnviv glad_glTexEnviv\nGLAD_API_CALL PFNGLTEXIMAGE2DPROC glad_glTexImage2D;\n#define glTexImage2D glad_glTexImage2D\nGLAD_API_CALL PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC glad_glGetActiveAtomicCounterBufferiv;\n#define glGetActiveAtomicCounterBufferiv glad_glGetActiveAtomicCounterBufferiv\nGLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv;\n#define glProgramUniformMatrix4x3fv glad_glProgramUniformMatrix4x3fv\nGLAD_API_CALL PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv;\n#define glMultiTexCoord1fv glad_glMultiTexCoord1fv\nGLAD_API_CALL PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel;\n#define glGetObjectPtrLabel glad_glGetObjectPtrLabel\n\n\nGLAD_API_CALL int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr);\nGLAD_API_CALL int gladLoadGL( GLADloadfunc load);\n\n\n\n\n\n#ifdef GLAD_GL\n\nGLAD_API_CALL int gladLoaderLoadGL(void);\n\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "ycb_render/glad/glad/glx.h",
    "content": "/**\n * Loader generated by glad 0.1.11a0 on Wed Jun 13 07:59:53 2018\n *\n * Generator: C/C++\n * Specification: glx\n * Extensions: 63\n *\n * APIs:\n *  - glx=1.4\n *\n * Options:\n *  - MX = False\n *  - DEBUG = False\n *  - MX_GLOBAL = False\n *  - HEADER_ONLY = False\n *  - LOADER = True\n *  - ALIAS = False\n *\n * Commandline:\n *    --api='glx=1.4' --extensions='GLX_MESA_copy_sub_buffer,GLX_EXT_create_context_es_profile,GLX_SGIX_pbuffer,GLX_SGI_make_current_read,GLX_OML_sync_control,GLX_SGIX_hyperpipe,GLX_INTEL_swap_event,GLX_EXT_swap_control,GLX_NV_robustness_video_memory_purge,GLX_MESA_pixmap_colormap,GLX_ARB_fbconfig_float,GLX_EXT_fbconfig_packed_float,GLX_OML_swap_method,GLX_NV_video_capture,GLX_ARB_robustness_application_isolation,GLX_ARB_create_context_robustness,GLX_EXT_visual_rating,GLX_NV_swap_group,GLX_EXT_texture_from_pixmap,GLX_SUN_get_transparent_index,GLX_MESA_release_buffers,GLX_NV_delay_before_swap,GLX_EXT_buffer_age,GLX_MESA_agp_offset,GLX_EXT_visual_info,GLX_SGI_swap_control,GLX_EXT_import_context,GLX_SGI_video_sync,GLX_3DFX_multisample,GLX_ARB_multisample,GLX_EXT_framebuffer_sRGB,GLX_SGI_cushion,GLX_ARB_robustness_share_group_isolation,GLX_SGIX_fbconfig,GLX_NV_copy_buffer,GLX_SGIX_visual_select_group,GLX_EXT_swap_control_tear,GLX_ARB_create_context,GLX_AMD_gpu_association,GLX_MESA_query_renderer,GLX_EXT_create_context_es2_profile,GLX_MESA_swap_control,GLX_SGIX_video_resize,GLX_ARB_context_flush_control,GLX_NV_video_out,GLX_EXT_no_config_context,GLX_SGIS_blended_overlay,GLX_EXT_stereo_tree,GLX_ARB_create_context_no_error,GLX_EXT_libglvnd,GLX_ARB_create_context_profile,GLX_NV_float_buffer,GLX_MESA_set_3dfx_mode,GLX_ARB_framebuffer_sRGB,GLX_ARB_get_proc_address,GLX_SGIS_shared_multisample,GLX_NV_copy_image,GLX_NV_present_video,GLX_SGIX_swap_barrier,GLX_SGIS_multisample,GLX_SGIX_swap_group,GLX_ARB_vertex_buffer_object,GLX_NV_multisample_coverage' c --loader\n *\n * Online:\n *    http://glad2.dav1d.de/#merge=off&api=glx%3D1.4&extensions=GLX_MESA_copy_sub_buffer%2CGLX_EXT_create_context_es_profile%2CGLX_SGIX_pbuffer%2CGLX_SGI_make_current_read%2CGLX_OML_sync_control%2CGLX_SGIX_hyperpipe%2CGLX_INTEL_swap_event%2CGLX_EXT_swap_control%2CGLX_NV_robustness_video_memory_purge%2CGLX_MESA_pixmap_colormap%2CGLX_ARB_fbconfig_float%2CGLX_EXT_fbconfig_packed_float%2CGLX_OML_swap_method%2CGLX_NV_video_capture%2CGLX_ARB_robustness_application_isolation%2CGLX_ARB_create_context_robustness%2CGLX_EXT_visual_rating%2CGLX_NV_swap_group%2CGLX_EXT_texture_from_pixmap%2CGLX_SUN_get_transparent_index%2CGLX_MESA_release_buffers%2CGLX_NV_delay_before_swap%2CGLX_EXT_buffer_age%2CGLX_MESA_agp_offset%2CGLX_EXT_visual_info%2CGLX_SGI_swap_control%2CGLX_EXT_import_context%2CGLX_SGI_video_sync%2CGLX_3DFX_multisample%2CGLX_ARB_multisample%2CGLX_EXT_framebuffer_sRGB%2CGLX_SGI_cushion%2CGLX_ARB_robustness_share_group_isolation%2CGLX_SGIX_fbconfig%2CGLX_NV_copy_buffer%2CGLX_SGIX_visual_select_group%2CGLX_EXT_swap_control_tear%2CGLX_ARB_create_context%2CGLX_AMD_gpu_association%2CGLX_MESA_query_renderer%2CGLX_EXT_create_context_es2_profile%2CGLX_MESA_swap_control%2CGLX_SGIX_video_resize%2CGLX_ARB_context_flush_control%2CGLX_NV_video_out%2CGLX_EXT_no_config_context%2CGLX_SGIS_blended_overlay%2CGLX_EXT_stereo_tree%2CGLX_ARB_create_context_no_error%2CGLX_EXT_libglvnd%2CGLX_ARB_create_context_profile%2CGLX_NV_float_buffer%2CGLX_MESA_set_3dfx_mode%2CGLX_ARB_framebuffer_sRGB%2CGLX_ARB_get_proc_address%2CGLX_SGIS_shared_multisample%2CGLX_NV_copy_image%2CGLX_NV_present_video%2CGLX_SGIX_swap_barrier%2CGLX_SGIS_multisample%2CGLX_SGIX_swap_group%2CGLX_ARB_vertex_buffer_object%2CGLX_NV_multisample_coverage&generator=c&mx=off&debug=off&mx_global=off&header_only=off&loader=on&alias=off\n *\n */\n\n#ifndef GLAD_GLX_H_\n#define GLAD_GLX_H_\n\n#ifdef GLX_H\n    #error GLX header already included (API: glx), remove previous include!\n#endif\n#define GLX_H 1\n\n\n#include <X11/X.h>\n#include <X11/Xlib.h>\n#include <X11/Xutil.h>\n\n#include <glad/gl.h>\n\n#define GLAD_GLX\n#define GLAD_OPTION_GLX_LOADER\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef GLAD_PLATFORM_H_\n#define GLAD_PLATFORM_H_\n\n#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)\n  #define GLAD_PLATFORM_WIN32 1\n#else\n  #define GLAD_PLATFORM_WIN32 0\n#endif\n\n\n#ifndef GLAD_PLATFORM_UWP\n  #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY)\n    #ifdef __has_include\n      #if __has_include(<winapifamily.h>)\n        #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1\n      #endif\n    #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_\n      #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1\n    #endif\n  #endif\n\n  #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY\n    #include <winapifamily.h>\n    #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)\n      #define GLAD_PLATFORM_UWP 1\n    #endif\n  #endif\n\n  #ifndef GLAD_PLATFORM_UWP\n    #define GLAD_PLATFORM_UWP 0\n  #endif\n#endif\n\n#ifdef __GNUC__\n  #define GLAD_GNUC_EXTENSION __extension__\n#else\n  #define GLAD_GNUC_EXTENSION\n#endif\n\n#ifndef GLAD_API_CALL\n  #if defined(GLAD_API_CALL_EXPORT)\n    #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__)\n      #if defined(GLAD_API_CALL_EXPORT_BUILD)\n        #if defined(__GNUC__)\n          #define GLAD_API_CALL __attribute__ ((dllexport)) extern\n        #else\n          #define GLAD_API_CALL __declspec(dllexport) extern\n        #endif\n      #else\n        #if defined(__GNUC__)\n          #define GLAD_API_CALL __attribute__ ((dllimport)) extern\n        #else\n          #define GLAD_API_CALL __declspec(dllimport) extern\n        #endif\n      #endif\n    #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD)\n      #define GLAD_API_CALL __attribute__ ((visibility (\"default\"))) extern\n    #else\n      #define GLAD_API_CALL extern\n    #endif\n  #else\n    #define GLAD_API_CALL extern\n  #endif\n#endif\n\n#ifdef APIENTRY\n  #define GLAD_API_PTR APIENTRY\n#elif GLAD_PLATFORM_WIN32\n  #define GLAD_API_PTR __stdcall\n#else\n  #define GLAD_API_PTR\n#endif\n\n\n#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor)\n#define GLAD_VERSION_MAJOR(version) (version / 10000)\n#define GLAD_VERSION_MINOR(version) (version % 10000)\n\ntypedef void (*GLADapiproc)(void);\n\ntypedef GLADapiproc (*GLADloadfunc)(const char *name);\ntypedef GLADapiproc (*GLADuserptrloadfunc)(const char *name, void *userptr);\n\ntypedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...);\ntypedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...);\n\n#endif /* GLAD_PLATFORM_H_ */\n\n#define GLX_RGBA_FLOAT_BIT_ARB 0x00000004\n#define __GLX_NUMBER_EVENTS 17\n#define GLX_X_VISUAL_TYPE 0x22\n#define GLX_PRESERVED_CONTENTS 0x801B\n#define GLX_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004\n#define GLX_3DFX_WINDOW_MODE_MESA 0x1\n#define GLX_RENDERER_VERSION_MESA 0x8185\n#define GLX_TRANSPARENT_GREEN_VALUE 0x26\n#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB\n#define GLX_RENDER_TYPE_SGIX 0x8011\n#define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000\n#define GLX_TRANSPARENT_ALPHA_VALUE 0x28\n#define GLX_AUX2_EXT 0x20E4\n#define GLX_FRONT_LEFT_EXT 0x20DE\n#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002\n#define GLX_NO_EXTENSION 3\n#define GLX_DIRECT_COLOR_EXT 0x8003\n#define GLX_BAD_VISUAL 4\n#define GLX_BAD_CONTEXT 5\n#define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA\n#define GLX_STEREO_NOTIFY_EXT 0x00000000\n#define GLX_ACCUM_BLUE_SIZE 16\n#define GLX_COVERAGE_SAMPLES_NV 100001\n#define GLX_BACK_BUFFER_AGE_EXT 0x20F4\n#define GLX_SLOW_VISUAL_EXT 0x8001\n#define GLX_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2\n#define GLX_EVENT_MASK 0x801F\n#define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256\n#define GLX_SAMPLE_BUFFERS_3DFX 0x8050\n#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018\n#define GLX_USE_GL 1\n#define GLX_PIXMAP_BIT 0x00000002\n#define GLX_HYPERPIPE_STEREO_SGIX 0x00000003\n#define GLX_TRANSPARENT_RGB 0x8008\n#define GLX_PRESERVED_CONTENTS_SGIX 0x801B\n#define GLX_GPU_NUM_PIPES_AMD 0x21A5\n#define GLX_RENDER_TYPE 0x8011\n#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016\n#define GLX_X_VISUAL_TYPE_EXT 0x22\n#define GLX_FRONT_EXT GLX_FRONT_LEFT_EXT\n#define GLX_TRANSPARENT_TYPE_EXT 0x23\n#define GLX_HYPERPIPE_ID_SGIX 0x8030\n#define GLX_GPU_OPENGL_VERSION_STRING_AMD 0x1F02\n#define GLX_RENDERER_ACCELERATED_MESA 0x8186\n#define GLX_DAMAGED_SGIX 0x8020\n#define GLX_STEREO 6\n#define GLX_FLOAT_COMPONENTS_NV 0x20B0\n#define GLX_GPU_RENDERER_STRING_AMD 0x1F01\n#define GLX_SWAP_UNDEFINED_OML 0x8063\n#define GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098\n#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002\n#define GLX_TRUE_COLOR 0x8002\n#define GLX_SAVED 0x8021\n#define GLX_RENDERER_DEVICE_ID_MESA 0x8184\n#define GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA 0x818C\n#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3\n#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25\n#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7\n#define GLX_WINDOW_SGIX 0x8022\n#define GLX_TRANSPARENT_INDEX_VALUE 0x24\n#define GLX_NONE_EXT 0x8000\n#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002\n#define GLX_SAMPLE_BUFFERS_ARB 100000\n#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001\n#define GLX_VIDEO_OUT_DEPTH_NV 0x20C5\n#define GLX_RENDERER_VIDEO_MEMORY_MESA 0x8187\n#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026\n#define GLX_TEXTURE_1D_EXT 0x20DB\n#define GLX_SYNC_SWAP_SGIX 0x00000001\n#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100\n#define GLX_VIDEO_OUT_COLOR_NV 0x20C3\n#define GLX_DEPTH_BUFFER_BIT 0x00000020\n#define GLX_AUX_BUFFERS_BIT 0x00000010\n#define GLX_BLENDED_RGBA_SGIS 0x8025\n#define GLX_DRAWABLE_TYPE_SGIX 0x8010\n#define GLX_DEPTH_SIZE 12\n#define GLX_SAMPLES_ARB 100001\n#define GLX_VISUAL_ID_EXT 0x800B\n#define GLX_STEREO_TREE_EXT 0x20F5\n#define GLX_NON_CONFORMANT_CONFIG 0x800D\n#define GLX_GPU_VENDOR_AMD 0x1F00\n#define GLX_WINDOW_BIT 0x00000001\n#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126\n#define GLX_SAMPLES_3DFX 0x8051\n#define GLX_BUFFER_SIZE 2\n#define GLX_TEXTURE_2D_BIT_EXT 0x00000002\n#define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9\n#define GLX_CONTEXT_ES2_PROFILE_BIT_EXT GLX_CONTEXT_ES_PROFILE_BIT_EXT\n#define GLX_DEVICE_ID_NV 0x20CD\n#define GLX_WINDOW 0x8022\n#define GLX_TEXTURE_2D_EXT 0x20DC\n#define GLX_PSEUDO_COLOR 0x8004\n#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1\n#define GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA 0x818A\n#define GLX_TEXTURE_TARGET_EXT 0x20D6\n#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010\n#define GLX_AUX4_EXT 0x20E6\n#define GLX_STATIC_COLOR_EXT 0x8005\n#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24\n#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9\n#define GLX_GPU_CLOCK_AMD 0x21A4\n#define GLX_GPU_NUM_RB_AMD 0x21A7\n#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008\n#define GLX_VENDOR_NAMES_EXT 0x20F6\n#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092\n#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001\n#define GLX_ACCUM_GREEN_SIZE 15\n#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2\n#define GLX_PBUFFER 0x8023\n#define GLX_RGBA_TYPE_SGIX 0x8014\n#define GLX_PBUFFER_BIT 0x00000004\n#define GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA 0x818D\n#define GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0\n#define GLX_TRANSPARENT_INDEX_EXT 0x8009\n#define GLX_COPY_COMPLETE_INTEL 0x8181\n#define GLX_NONE 0x8000\n#define GLX_PbufferClobber 0\n#define GLX_RGBA 4\n#define GLX_HEIGHT_SGIX 0x801E\n#define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91\n#define GLX_SWAP_COPY_OML 0x8062\n#define GLX_BACK_RIGHT_EXT 0x20E1\n#define GLX_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097\n#define GLX_SLOW_CONFIG 0x8001\n#define GLX_RENDERER_PREFERRED_PROFILE_MESA 0x8189\n#define GLX_Y_INVERTED_EXT 0x20D4\n#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027\n#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004\n#define GLX_AUX8_EXT 0x20EA\n#define GLX_EXCHANGE_COMPLETE_INTEL 0x8180\n#define GLX_CONTEXT_FLAGS_ARB 0x2094\n#define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9\n#define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008\n#define GLX_PBUFFER_CLOBBER_MASK 0x08000000\n#define GLX_FLIP_COMPLETE_INTEL 0x8182\n#define GLX_BAD_ENUM 7\n#define GLX_AUX3_EXT 0x20E5\n#define GLX_DONT_CARE 0xFFFFFFFF\n#define GLX_SAMPLE_BUFFERS_SGIS 100000\n#define GLX_SWAP_INTERVAL_EXT 0x20F1\n#define GLX_RENDERER_ID_MESA 0x818E\n#define GLX_STENCIL_SIZE 13\n#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002\n#define GLX_X_RENDERABLE 0x8012\n#define GLX_VENDOR 0x1\n#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080\n#define GLX_UNIQUE_ID_NV 0x20CE\n#define GLX_WINDOW_BIT_SGIX 0x00000001\n#define GLX_LEVEL 3\n#define GLX_COLOR_SAMPLES_NV 0x20B3\n#define GLX_DIRECT_COLOR 0x8003\n#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8\n#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0\n#define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252\n#define GLX_VIDEO_OUT_ALPHA_NV 0x20C4\n#define GLX_PIXMAP_BIT_SGIX 0x00000002\n#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27\n#define GLX_AUX6_EXT 0x20E8\n#define GLX_BufferSwapComplete 1\n#define GLX_COLOR_INDEX_BIT 0x00000002\n#define GLX_STENCIL_BUFFER_BIT 0x00000040\n#define GLX_MAX_PBUFFER_HEIGHT 0x8017\n#define GLX_ACCUM_BUFFER_BIT 0x00000080\n#define GLX_SWAP_METHOD_OML 0x8060\n#define GLX_EXTENSIONS 0x3\n#define GLX_NUM_VIDEO_SLOTS_NV 0x20F0\n#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001\n#define GLX_SYNC_FRAME_SGIX 0x00000000\n#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC\n#define GLX_PBUFFER_WIDTH 0x8041\n#define GLX_BLUE_SIZE 10\n#define GLX_GRAY_SCALE 0x8006\n#define GLX_STEREO_NOTIFY_MASK_EXT 0x00000001\n#define GLX_AUX9_EXT 0x20EB\n#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6\n#define GLX_EXTENSION_NAME \"GLX\"\n#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D\n#define GLX_VIDEO_OUT_FRAME_NV 0x20C8\n#define GLX_PBUFFER_BIT_SGIX 0x00000004\n#define GLX_AUX5_EXT 0x20E7\n#define GLX_HEIGHT 0x801E\n#define GLX_PBUFFER_HEIGHT 0x8040\n#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2\n#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28\n#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002\n#define GLX_NO_RESET_NOTIFICATION_ARB 0x8261\n#define GLX_DOUBLEBUFFER 5\n#define GLX_SHARE_CONTEXT_EXT 0x800A\n#define GLX_X_RENDERABLE_SGIX 0x8012\n#define GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA 0x8188\n#define GLX_DRAWABLE_TYPE 0x8010\n#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001\n#define GLX_SAMPLES 100001\n#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD\n#define GLX_TRANSPARENT_RGB_EXT 0x8008\n#define GLX_SCREEN_EXT 0x800C\n#define GLX_STATIC_COLOR 0x8005\n#define GLX_RED_SIZE 8\n#define GLX_TRANSPARENT_RED_VALUE 0x25\n#define GLX_GREEN_SIZE 9\n#define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002\n#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008\n#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2\n#define GLX_GPU_NUM_SPI_AMD 0x21A8\n#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000\n#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015\n#define GLX_TEXTURE_FORMAT_EXT 0x20D5\n#define GLX_RGBA_TYPE 0x8014\n#define GLX_RENDERER_VENDOR_ID_MESA 0x8183\n#define GLX_BAD_HYPERPIPE_SGIX 92\n#define GLX_TRANSPARENT_INDEX 0x8009\n#define GLX_BAD_ATTRIBUTE 2\n#define GLX_FRONT_RIGHT_EXT 0x20DF\n#define GLX_STATIC_GRAY 0x8007\n#define GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x20F7\n#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004\n#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028\n#define GLX_FBCONFIG_ID_SGIX 0x8013\n#define GLX_GRAY_SCALE_EXT 0x8006\n#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26\n#define GLX_GPU_RAM_AMD 0x21A3\n#define GLX_TEXTURE_1D_BIT_EXT 0x00000001\n#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001\n#define GLX_RGBA_BIT_SGIX 0x00000001\n#define GLX_PIPE_RECT_SGIX 0x00000001\n#define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004\n#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002\n#define GLX_PBUFFER_SGIX 0x8023\n#define GLX_AUX_BUFFERS 7\n#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA\n#define GLX_BAD_VALUE 6\n#define GLX_LARGEST_PBUFFER 0x801C\n#define GLX_AUX0_EXT 0x20E2\n#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004\n#define GLX_PSEUDO_COLOR_EXT 0x8004\n#define GLX_COLOR_INDEX_TYPE 0x8015\n#define GLX_SAVED_SGIX 0x8021\n#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1\n#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040\n#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091\n#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004\n#define GLX_MIPMAP_TEXTURE_EXT 0x20D7\n#define GLX_ACCUM_ALPHA_SIZE 17\n#define GLX_TRANSPARENT_BLUE_VALUE 0x27\n#define GLX_WIDTH 0x801D\n#define GLX_AUX7_EXT 0x20E9\n#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A\n#define GLX_STATIC_GRAY_EXT 0x8007\n#define GLX_MAX_PBUFFER_WIDTH 0x8016\n#define GLX_CONFIG_CAVEAT 0x20\n#define GLX_EVENT_MASK_SGIX 0x801F\n#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017\n#define GLX_TRANSPARENT_TYPE 0x23\n#define GLX_ALPHA_SIZE 11\n#define GLX_SAMPLE_BUFFERS 100000\n#define GLX_VISUAL_ID 0x800B\n#define GLX_LARGEST_PBUFFER_SGIX 0x801C\n#define GLX_SWAP_EXCHANGE_OML 0x8061\n#define GLX_WIDTH_SGIX 0x801D\n#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008\n#define GLX_SCREEN 0x800C\n#define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095\n#define GLX_ACCUM_RED_SIZE 14\n#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2\n#define GLX_BAD_SCREEN 1\n#define GLX_VISUAL_CAVEAT_EXT 0x20\n#define GLX_BACK_LEFT_EXT 0x20E0\n#define GLX_MAX_PBUFFER_PIXELS 0x8018\n#define GLX_AUX1_EXT 0x20E3\n#define GLX_CONTEXT_OPENGL_NO_ERROR_ARB 0x31B3\n#define GLX_SAMPLES_SGIS 100001\n#define GLX_TRUE_COLOR_EXT 0x8002\n#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020\n#define GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA 0x818B\n#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80\n#define GLX_BACK_EXT GLX_BACK_LEFT_EXT\n#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019\n#define GLX_DAMAGED 0x8020\n#define GLX_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF\n#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2\n#define GLX_LATE_SWAPS_TEAR_EXT 0x20F3\n#define GLX_FBCONFIG_ID 0x8013\n#define GLX_GPU_NUM_SIMD_AMD 0x21A6\n#define GLX_RGBA_BIT 0x00000001\n#define GLX_VERSION 0x2\n\n\n#ifndef GLEXT_64_TYPES_DEFINED\n/* This code block is duplicated in glext.h, so must be protected */\n#define GLEXT_64_TYPES_DEFINED\n/* Define int32_t, int64_t, and uint64_t types for UST/MSC */\n/* (as used in the GLX_OML_sync_control extension). */\n#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n#include <inttypes.h>\n#elif defined(__sun__) || defined(__digital__)\n#include <inttypes.h>\n#if defined(__STDC__)\n#if defined(__arch64__) || defined(_LP64)\ntypedef long int int64_t;\ntypedef unsigned long int uint64_t;\n#else\ntypedef long long int int64_t;\ntypedef unsigned long long int uint64_t;\n#endif /* __arch64__ */\n#endif /* __STDC__ */\n#elif defined( __VMS ) || defined(__sgi)\n#include <inttypes.h>\n#elif defined(__SCO__) || defined(__USLC__)\n#include <stdint.h>\n#elif defined(__UNIXOS2__) || defined(__SOL64__)\ntypedef long int int32_t;\ntypedef long long int int64_t;\ntypedef unsigned long long int uint64_t;\n#elif defined(_WIN32) && defined(__GNUC__)\n#include <stdint.h>\n#elif defined(_WIN32)\ntypedef __int32 int32_t;\ntypedef __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\n#else\n/* Fallback if nothing above works */\n#include <inttypes.h>\n#endif\n#endif\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)\n\n#else\n\n#endif\n\n#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)\n\n#else\n\n#endif\n\n\n\n\n\n\n\ntypedef XID GLXFBConfigID;\ntypedef struct __GLXFBConfigRec *GLXFBConfig;\ntypedef XID GLXContextID;\ntypedef struct __GLXcontextRec *GLXContext;\ntypedef XID GLXPixmap;\ntypedef XID GLXDrawable;\ntypedef XID GLXWindow;\ntypedef XID GLXPbuffer;\ntypedef void (GLAD_API_PTR *__GLXextFuncPtr)(void);\ntypedef XID GLXVideoCaptureDeviceNV;\ntypedef unsigned int GLXVideoDeviceNV;\ntypedef XID GLXVideoSourceSGIX;\ntypedef XID GLXFBConfigIDSGIX;\ntypedef struct __GLXFBConfigRec *GLXFBConfigSGIX;\ntypedef XID GLXPbufferSGIX;\ntypedef struct {\n    int event_type;             /* GLX_DAMAGED or GLX_SAVED */\n    int draw_type;              /* GLX_WINDOW or GLX_PBUFFER */\n    unsigned long serial;       /* # of last request processed by server */\n    Bool send_event;            /* true if this came for SendEvent request */\n    Display *display;           /* display the event was read from */\n    GLXDrawable drawable;       /* XID of Drawable */\n    unsigned int buffer_mask;   /* mask indicating which buffers are affected */\n    unsigned int aux_buffer;    /* which aux buffer was affected */\n    int x, y;\n    int width, height;\n    int count;                  /* if nonzero, at least this many more */\n} GLXPbufferClobberEvent;\ntypedef struct {\n    int type;\n    unsigned long serial;       /* # of last request processed by server */\n    Bool send_event;            /* true if this came from a SendEvent request */\n    Display *display;           /* Display the event was read from */\n    GLXDrawable drawable;       /* drawable on which event was requested in event mask */\n    int event_type;\n    int64_t ust;\n    int64_t msc;\n    int64_t sbc;\n} GLXBufferSwapComplete;\ntypedef union __GLXEvent {\n    GLXPbufferClobberEvent glxpbufferclobber;\n    GLXBufferSwapComplete glxbufferswapcomplete;\n    long pad[24];\n} GLXEvent;\ntypedef struct {\n    int type;\n    unsigned long serial;\n    Bool send_event;\n    Display *display;\n    int extension;\n    int evtype;\n    GLXDrawable window;\n    Bool stereo_tree;\n} GLXStereoNotifyEventEXT;\ntypedef struct {\n    int type;\n    unsigned long serial;   /* # of last request processed by server */\n    Bool send_event;        /* true if this came for SendEvent request */\n    Display *display;       /* display the event was read from */\n    GLXDrawable drawable;   /* i.d. of Drawable */\n    int event_type;         /* GLX_DAMAGED_SGIX or GLX_SAVED_SGIX */\n    int draw_type;          /* GLX_WINDOW_SGIX or GLX_PBUFFER_SGIX */\n    unsigned int mask;      /* mask indicating which buffers are affected*/\n    int x, y;\n    int width, height;\n    int count;              /* if nonzero, at least this many more */\n} GLXBufferClobberEventSGIX;\ntypedef struct {\n    char    pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */\n    int     networkId;\n} GLXHyperpipeNetworkSGIX;\ntypedef struct {\n    char    pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */\n    int     channel;\n    unsigned int participationType;\n    int     timeSlice;\n} GLXHyperpipeConfigSGIX;\ntypedef struct {\n    char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */\n    int srcXOrigin, srcYOrigin, srcWidth, srcHeight;\n    int destXOrigin, destYOrigin, destWidth, destHeight;\n} GLXPipeRect;\ntypedef struct {\n    char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */\n    int XOrigin, YOrigin, maxHeight, maxWidth;\n} GLXPipeRectLimits;\n\n\n#define GLX_VERSION_1_0 1\nGLAD_API_CALL int GLAD_GLX_VERSION_1_0;\n#define GLX_VERSION_1_1 1\nGLAD_API_CALL int GLAD_GLX_VERSION_1_1;\n#define GLX_VERSION_1_2 1\nGLAD_API_CALL int GLAD_GLX_VERSION_1_2;\n#define GLX_VERSION_1_3 1\nGLAD_API_CALL int GLAD_GLX_VERSION_1_3;\n#define GLX_VERSION_1_4 1\nGLAD_API_CALL int GLAD_GLX_VERSION_1_4;\n#define GLX_MESA_copy_sub_buffer 1\nGLAD_API_CALL int GLAD_GLX_MESA_copy_sub_buffer;\n#define GLX_EXT_create_context_es_profile 1\nGLAD_API_CALL int GLAD_GLX_EXT_create_context_es_profile;\n#define GLX_SGIX_pbuffer 1\nGLAD_API_CALL int GLAD_GLX_SGIX_pbuffer;\n#define GLX_SGI_make_current_read 1\nGLAD_API_CALL int GLAD_GLX_SGI_make_current_read;\n#define GLX_OML_sync_control 1\nGLAD_API_CALL int GLAD_GLX_OML_sync_control;\n#define GLX_SGIX_hyperpipe 1\nGLAD_API_CALL int GLAD_GLX_SGIX_hyperpipe;\n#define GLX_INTEL_swap_event 1\nGLAD_API_CALL int GLAD_GLX_INTEL_swap_event;\n#define GLX_EXT_swap_control 1\nGLAD_API_CALL int GLAD_GLX_EXT_swap_control;\n#define GLX_NV_robustness_video_memory_purge 1\nGLAD_API_CALL int GLAD_GLX_NV_robustness_video_memory_purge;\n#define GLX_MESA_pixmap_colormap 1\nGLAD_API_CALL int GLAD_GLX_MESA_pixmap_colormap;\n#define GLX_ARB_fbconfig_float 1\nGLAD_API_CALL int GLAD_GLX_ARB_fbconfig_float;\n#define GLX_EXT_fbconfig_packed_float 1\nGLAD_API_CALL int GLAD_GLX_EXT_fbconfig_packed_float;\n#define GLX_OML_swap_method 1\nGLAD_API_CALL int GLAD_GLX_OML_swap_method;\n#define GLX_NV_video_capture 1\nGLAD_API_CALL int GLAD_GLX_NV_video_capture;\n#define GLX_ARB_robustness_application_isolation 1\nGLAD_API_CALL int GLAD_GLX_ARB_robustness_application_isolation;\n#define GLX_ARB_create_context_robustness 1\nGLAD_API_CALL int GLAD_GLX_ARB_create_context_robustness;\n#define GLX_EXT_visual_rating 1\nGLAD_API_CALL int GLAD_GLX_EXT_visual_rating;\n#define GLX_NV_swap_group 1\nGLAD_API_CALL int GLAD_GLX_NV_swap_group;\n#define GLX_EXT_texture_from_pixmap 1\nGLAD_API_CALL int GLAD_GLX_EXT_texture_from_pixmap;\n#define GLX_SUN_get_transparent_index 1\nGLAD_API_CALL int GLAD_GLX_SUN_get_transparent_index;\n#define GLX_MESA_release_buffers 1\nGLAD_API_CALL int GLAD_GLX_MESA_release_buffers;\n#define GLX_NV_delay_before_swap 1\nGLAD_API_CALL int GLAD_GLX_NV_delay_before_swap;\n#define GLX_EXT_buffer_age 1\nGLAD_API_CALL int GLAD_GLX_EXT_buffer_age;\n#define GLX_MESA_agp_offset 1\nGLAD_API_CALL int GLAD_GLX_MESA_agp_offset;\n#define GLX_EXT_visual_info 1\nGLAD_API_CALL int GLAD_GLX_EXT_visual_info;\n#define GLX_SGI_swap_control 1\nGLAD_API_CALL int GLAD_GLX_SGI_swap_control;\n#define GLX_EXT_import_context 1\nGLAD_API_CALL int GLAD_GLX_EXT_import_context;\n#define GLX_SGI_video_sync 1\nGLAD_API_CALL int GLAD_GLX_SGI_video_sync;\n#define GLX_3DFX_multisample 1\nGLAD_API_CALL int GLAD_GLX_3DFX_multisample;\n#define GLX_ARB_multisample 1\nGLAD_API_CALL int GLAD_GLX_ARB_multisample;\n#define GLX_EXT_framebuffer_sRGB 1\nGLAD_API_CALL int GLAD_GLX_EXT_framebuffer_sRGB;\n#define GLX_SGI_cushion 1\nGLAD_API_CALL int GLAD_GLX_SGI_cushion;\n#define GLX_ARB_robustness_share_group_isolation 1\nGLAD_API_CALL int GLAD_GLX_ARB_robustness_share_group_isolation;\n#define GLX_SGIX_fbconfig 1\nGLAD_API_CALL int GLAD_GLX_SGIX_fbconfig;\n#define GLX_NV_copy_buffer 1\nGLAD_API_CALL int GLAD_GLX_NV_copy_buffer;\n#define GLX_SGIX_visual_select_group 1\nGLAD_API_CALL int GLAD_GLX_SGIX_visual_select_group;\n#define GLX_EXT_swap_control_tear 1\nGLAD_API_CALL int GLAD_GLX_EXT_swap_control_tear;\n#define GLX_ARB_create_context 1\nGLAD_API_CALL int GLAD_GLX_ARB_create_context;\n#define GLX_AMD_gpu_association 1\nGLAD_API_CALL int GLAD_GLX_AMD_gpu_association;\n#define GLX_MESA_query_renderer 1\nGLAD_API_CALL int GLAD_GLX_MESA_query_renderer;\n#define GLX_EXT_create_context_es2_profile 1\nGLAD_API_CALL int GLAD_GLX_EXT_create_context_es2_profile;\n#define GLX_MESA_swap_control 1\nGLAD_API_CALL int GLAD_GLX_MESA_swap_control;\n#define GLX_SGIX_video_resize 1\nGLAD_API_CALL int GLAD_GLX_SGIX_video_resize;\n#define GLX_ARB_context_flush_control 1\nGLAD_API_CALL int GLAD_GLX_ARB_context_flush_control;\n#define GLX_NV_video_out 1\nGLAD_API_CALL int GLAD_GLX_NV_video_out;\n#define GLX_EXT_no_config_context 1\nGLAD_API_CALL int GLAD_GLX_EXT_no_config_context;\n#define GLX_SGIS_blended_overlay 1\nGLAD_API_CALL int GLAD_GLX_SGIS_blended_overlay;\n#define GLX_EXT_stereo_tree 1\nGLAD_API_CALL int GLAD_GLX_EXT_stereo_tree;\n#define GLX_ARB_create_context_no_error 1\nGLAD_API_CALL int GLAD_GLX_ARB_create_context_no_error;\n#define GLX_EXT_libglvnd 1\nGLAD_API_CALL int GLAD_GLX_EXT_libglvnd;\n#define GLX_ARB_create_context_profile 1\nGLAD_API_CALL int GLAD_GLX_ARB_create_context_profile;\n#define GLX_NV_float_buffer 1\nGLAD_API_CALL int GLAD_GLX_NV_float_buffer;\n#define GLX_MESA_set_3dfx_mode 1\nGLAD_API_CALL int GLAD_GLX_MESA_set_3dfx_mode;\n#define GLX_ARB_framebuffer_sRGB 1\nGLAD_API_CALL int GLAD_GLX_ARB_framebuffer_sRGB;\n#define GLX_ARB_get_proc_address 1\nGLAD_API_CALL int GLAD_GLX_ARB_get_proc_address;\n#define GLX_SGIS_shared_multisample 1\nGLAD_API_CALL int GLAD_GLX_SGIS_shared_multisample;\n#define GLX_NV_copy_image 1\nGLAD_API_CALL int GLAD_GLX_NV_copy_image;\n#define GLX_NV_present_video 1\nGLAD_API_CALL int GLAD_GLX_NV_present_video;\n#define GLX_SGIX_swap_barrier 1\nGLAD_API_CALL int GLAD_GLX_SGIX_swap_barrier;\n#define GLX_SGIS_multisample 1\nGLAD_API_CALL int GLAD_GLX_SGIS_multisample;\n#define GLX_SGIX_swap_group 1\nGLAD_API_CALL int GLAD_GLX_SGIX_swap_group;\n#define GLX_ARB_vertex_buffer_object 1\nGLAD_API_CALL int GLAD_GLX_ARB_vertex_buffer_object;\n#define GLX_NV_multisample_coverage 1\nGLAD_API_CALL int GLAD_GLX_NV_multisample_coverage;\n\n\ntypedef void (GLAD_API_PTR *PFNGLXCUSHIONSGIPROC)(Display  * dpy, Window   window, float  cushion);\ntypedef void (GLAD_API_PTR *PFNGLXDESTROYGLXPBUFFERSGIXPROC)(Display  * dpy, GLXPbufferSGIX   pbuf);\ntypedef int (GLAD_API_PTR *PFNGLXSENDPBUFFERTOVIDEONVPROC)(Display  * dpy, GLXPbuffer   pbuf, int  iBufferType, unsigned long * pulCounterPbuffer, GLboolean   bBlock);\ntypedef __GLXextFuncPtr (GLAD_API_PTR *PFNGLXGETPROCADDRESSARBPROC)(const  GLubyte  * procName);\ntypedef GLXContext (GLAD_API_PTR *PFNGLXCREATECONTEXTATTRIBSARBPROC)(Display  * dpy, GLXFBConfig   config, GLXContext   share_context, Bool   direct, const int * attrib_list);\ntypedef void (GLAD_API_PTR *PFNGLXJOINSWAPGROUPSGIXPROC)(Display  * dpy, GLXDrawable   drawable, GLXDrawable   member);\ntypedef void (GLAD_API_PTR *PFNGLXSWAPINTERVALEXTPROC)(Display  * dpy, GLXDrawable   drawable, int  interval);\ntypedef GLXHyperpipeConfigSGIX * (GLAD_API_PTR *PFNGLXQUERYHYPERPIPECONFIGSGIXPROC)(Display  * dpy, int  hpId, int * npipes);\ntypedef int (GLAD_API_PTR *PFNGLXGETGPUINFOAMDPROC)(unsigned int  id, int  property, GLenum   dataType, unsigned int  size, void * data);\ntypedef Status (GLAD_API_PTR *PFNGLXGETTRANSPARENTINDEXSUNPROC)(Display  * dpy, Window   overlay, Window   underlay, long * pTransparentIndex);\ntypedef GLXHyperpipeNetworkSGIX * (GLAD_API_PTR *PFNGLXQUERYHYPERPIPENETWORKSGIXPROC)(Display  * dpy, int * npipes);\ntypedef int (GLAD_API_PTR *PFNGLXQUERYGLXPBUFFERSGIXPROC)(Display  * dpy, GLXPbufferSGIX   pbuf, int  attribute, unsigned int * value);\ntypedef GLXPixmap (GLAD_API_PTR *PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)(Display  * dpy, GLXFBConfigSGIX   config, Pixmap   pixmap);\ntypedef void (GLAD_API_PTR *PFNGLXCOPYCONTEXTPROC)(Display  * dpy, GLXContext   src, GLXContext   dst, unsigned long  mask);\ntypedef GLXPbufferSGIX (GLAD_API_PTR *PFNGLXCREATEGLXPBUFFERSGIXPROC)(Display  * dpy, GLXFBConfigSGIX   config, unsigned int  width, unsigned int  height, int * attrib_list);\ntypedef unsigned int (GLAD_API_PTR *PFNGLXGETGPUIDSAMDPROC)(unsigned int  maxCount, unsigned int * ids);\ntypedef Bool (GLAD_API_PTR *PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC)(GLXContext   ctx);\ntypedef int (GLAD_API_PTR *PFNGLXGETVIDEODEVICENVPROC)(Display  * dpy, int  screen, int  numVideoDevices, GLXVideoDeviceNV  * pVideoDevice);\ntypedef void (GLAD_API_PTR *PFNGLXWAITGLPROC)(void);\ntypedef int (GLAD_API_PTR *PFNGLXGETVIDEOSYNCSGIPROC)(unsigned int * count);\ntypedef int (GLAD_API_PTR *PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC)(Display  * dpy, int  hpId);\ntypedef int (GLAD_API_PTR *PFNGLXHYPERPIPECONFIGSGIXPROC)(Display  * dpy, int  networkId, int  npipes, GLXHyperpipeConfigSGIX  * cfg, int * hpId);\ntypedef int64_t (GLAD_API_PTR *PFNGLXSWAPBUFFERSMSCOMLPROC)(Display  * dpy, GLXDrawable   drawable, int64_t   target_msc, int64_t   divisor, int64_t   remainder);\ntypedef GLXFBConfigSGIX * (GLAD_API_PTR *PFNGLXCHOOSEFBCONFIGSGIXPROC)(Display  * dpy, int  screen, int * attrib_list, int * nelements);\ntypedef int (GLAD_API_PTR *PFNGLXWAITVIDEOSYNCSGIPROC)(int  divisor, int  remainder, unsigned int * count);\ntypedef Bool (GLAD_API_PTR *PFNGLXWAITFORSBCOMLPROC)(Display  * dpy, GLXDrawable   drawable, int64_t   target_sbc, int64_t  * ust, int64_t  * msc, int64_t  * sbc);\ntypedef __GLXextFuncPtr (GLAD_API_PTR *PFNGLXGETPROCADDRESSPROC)(const  GLubyte  * procName);\ntypedef int (GLAD_API_PTR *PFNGLXGETSWAPINTERVALMESAPROC)(void);\ntypedef int (GLAD_API_PTR *PFNGLXCHANNELRECTSGIXPROC)(Display  * display, int  screen, int  channel, int  x, int  y, int  w, int  h);\ntypedef void (GLAD_API_PTR *PFNGLXWAITXPROC)(void);\ntypedef const char * (GLAD_API_PTR *PFNGLXQUERYSERVERSTRINGPROC)(Display  * dpy, int  screen, int  name);\ntypedef GLXPixmap (GLAD_API_PTR *PFNGLXCREATEGLXPIXMAPPROC)(Display  * dpy, XVisualInfo  * visual, Pixmap   pixmap);\ntypedef Bool (GLAD_API_PTR *PFNGLXBINDSWAPBARRIERNVPROC)(Display  * dpy, GLuint   group, GLuint   barrier);\ntypedef const char * (GLAD_API_PTR *PFNGLXQUERYRENDERERSTRINGMESAPROC)(Display  * dpy, int  screen, int  renderer, int  attribute);\ntypedef void (GLAD_API_PTR *PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC)(Display  * dpy, GLXVideoCaptureDeviceNV   device);\ntypedef Bool (GLAD_API_PTR *PFNGLXWAITFORMSCOMLPROC)(Display  * dpy, GLXDrawable   drawable, int64_t   target_msc, int64_t   divisor, int64_t   remainder, int64_t  * ust, int64_t  * msc, int64_t  * sbc);\ntypedef void (GLAD_API_PTR *PFNGLXCOPYSUBBUFFERMESAPROC)(Display  * dpy, GLXDrawable   drawable, int  x, int  y, int  width, int  height);\ntypedef GLXContext (GLAD_API_PTR *PFNGLXGETCURRENTCONTEXTPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLXSELECTEVENTPROC)(Display  * dpy, GLXDrawable   draw, unsigned long  event_mask);\ntypedef int (GLAD_API_PTR *PFNGLXSWAPINTERVALSGIPROC)(int  interval);\ntypedef Bool (GLAD_API_PTR *PFNGLXQUERYSWAPGROUPNVPROC)(Display  * dpy, GLXDrawable   drawable, GLuint  * group, GLuint  * barrier);\ntypedef Bool (GLAD_API_PTR *PFNGLXMAKECURRENTREADSGIPROC)(Display  * dpy, GLXDrawable   draw, GLXDrawable   read, GLXContext   ctx);\ntypedef void (GLAD_API_PTR *PFNGLXQUERYDRAWABLEPROC)(Display  * dpy, GLXDrawable   draw, int  attribute, unsigned int * value);\ntypedef void (GLAD_API_PTR *PFNGLXCOPYBUFFERSUBDATANVPROC)(Display  * dpy, GLXContext   readCtx, GLXContext   writeCtx, GLenum   readTarget, GLenum   writeTarget, GLintptr   readOffset, GLintptr   writeOffset, GLsizeiptr   size);\ntypedef int (GLAD_API_PTR *PFNGLXQUERYCONTEXTPROC)(Display  * dpy, GLXContext   ctx, int  attribute, int * value);\ntypedef int (GLAD_API_PTR *PFNGLXGETCONFIGPROC)(Display  * dpy, XVisualInfo  * visual, int  attrib, int * value);\ntypedef Bool (GLAD_API_PTR *PFNGLXSET3DFXMODEMESAPROC)(int  mode);\ntypedef int (GLAD_API_PTR *PFNGLXGETVIDEOINFONVPROC)(Display  * dpy, int  screen, GLXVideoDeviceNV   VideoDevice, unsigned long * pulCounterOutputPbuffer, unsigned long * pulCounterOutputVideo);\ntypedef Bool (GLAD_API_PTR *PFNGLXISDIRECTPROC)(Display  * dpy, GLXContext   ctx);\ntypedef int (GLAD_API_PTR *PFNGLXGETFBCONFIGATTRIBPROC)(Display  * dpy, GLXFBConfig   config, int  attribute, int * value);\ntypedef XVisualInfo * (GLAD_API_PTR *PFNGLXGETVISUALFROMFBCONFIGPROC)(Display  * dpy, GLXFBConfig   config);\ntypedef void (GLAD_API_PTR *PFNGLXBINDTEXIMAGEEXTPROC)(Display  * dpy, GLXDrawable   drawable, int  buffer, const int * attrib_list);\ntypedef void (GLAD_API_PTR *PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC)(GLXContext   dstCtx, GLint   srcX0, GLint   srcY0, GLint   srcX1, GLint   srcY1, GLint   dstX0, GLint   dstY0, GLint   dstX1, GLint   dstY1, GLbitfield   mask, GLenum   filter);\ntypedef Bool (GLAD_API_PTR *PFNGLXQUERYVERSIONPROC)(Display  * dpy, int * maj, int * min);\ntypedef void (GLAD_API_PTR *PFNGLXSELECTEVENTSGIXPROC)(Display  * dpy, GLXDrawable   drawable, unsigned long  mask);\ntypedef Bool (GLAD_API_PTR *PFNGLXGETMSCRATEOMLPROC)(Display  * dpy, GLXDrawable   drawable, int32_t  * numerator, int32_t  * denominator);\ntypedef Bool (GLAD_API_PTR *PFNGLXQUERYRENDERERINTEGERMESAPROC)(Display  * dpy, int  screen, int  renderer, int  attribute, unsigned int * value);\ntypedef GLXWindow (GLAD_API_PTR *PFNGLXCREATEWINDOWPROC)(Display  * dpy, GLXFBConfig   config, Window   win, const int * attrib_list);\ntypedef void (GLAD_API_PTR *PFNGLXCOPYIMAGESUBDATANVPROC)(Display  * dpy, GLXContext   srcCtx, GLuint   srcName, GLenum   srcTarget, GLint   srcLevel, GLint   srcX, GLint   srcY, GLint   srcZ, GLXContext   dstCtx, GLuint   dstName, GLenum   dstTarget, GLint   dstLevel, GLint   dstX, GLint   dstY, GLint   dstZ, GLsizei   width, GLsizei   height, GLsizei   depth);\ntypedef int (GLAD_API_PTR *PFNGLXSWAPINTERVALMESAPROC)(unsigned int  interval);\ntypedef int (GLAD_API_PTR *PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC)(Display  * dpy, int  timeSlice, int  attrib, int  size, void * returnAttribList);\ntypedef int (GLAD_API_PTR *PFNGLXBINDVIDEOCAPTUREDEVICENVPROC)(Display  * dpy, unsigned int  video_capture_slot, GLXVideoCaptureDeviceNV   device);\ntypedef GLXContext (GLAD_API_PTR *PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)(Display  * dpy, GLXFBConfigSGIX   config, int  render_type, GLXContext   share_list, Bool   direct);\ntypedef unsigned int * (GLAD_API_PTR *PFNGLXENUMERATEVIDEODEVICESNVPROC)(Display  * dpy, int  screen, int * nelements);\ntypedef int (GLAD_API_PTR *PFNGLXHYPERPIPEATTRIBSGIXPROC)(Display  * dpy, int  timeSlice, int  attrib, int  size, void * attribList);\ntypedef void (GLAD_API_PTR *PFNGLXDESTROYPBUFFERPROC)(Display  * dpy, GLXPbuffer   pbuf);\ntypedef void (GLAD_API_PTR *PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC)(Display  * dpy, GLXContext   readCtx, GLXContext   writeCtx, GLuint   readBuffer, GLuint   writeBuffer, GLintptr   readOffset, GLintptr   writeOffset, GLsizeiptr   size);\ntypedef GLXPbuffer (GLAD_API_PTR *PFNGLXCREATEPBUFFERPROC)(Display  * dpy, GLXFBConfig   config, const int * attrib_list);\ntypedef const char * (GLAD_API_PTR *PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC)(int  attribute);\ntypedef int (GLAD_API_PTR *PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC)(Display  * dpy, int  timeSlice, int  attrib, int  size, void * attribList, void * returnAttribList);\ntypedef int (GLAD_API_PTR *PFNGLXGETFBCONFIGATTRIBSGIXPROC)(Display  * dpy, GLXFBConfigSGIX   config, int  attribute, int * value);\ntypedef const char * (GLAD_API_PTR *PFNGLXQUERYEXTENSIONSSTRINGPROC)(Display  * dpy, int  screen);\ntypedef int (GLAD_API_PTR *PFNGLXBINDVIDEODEVICENVPROC)(Display  * dpy, unsigned int  video_slot, unsigned int  video_device, const int * attrib_list);\ntypedef GLXContext (GLAD_API_PTR *PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC)(unsigned int  id, GLXContext   share_list);\ntypedef int (GLAD_API_PTR *PFNGLXQUERYCONTEXTINFOEXTPROC)(Display  * dpy, GLXContext   context, int  attribute, int * value);\ntypedef void (GLAD_API_PTR *PFNGLXGETSELECTEDEVENTPROC)(Display  * dpy, GLXDrawable   draw, unsigned long * event_mask);\ntypedef Display * (GLAD_API_PTR *PFNGLXGETCURRENTDISPLAYPROC)(void);\ntypedef void (GLAD_API_PTR *PFNGLXDESTROYPIXMAPPROC)(Display  * dpy, GLXPixmap   pixmap);\ntypedef void (GLAD_API_PTR *PFNGLXGETSELECTEDEVENTSGIXPROC)(Display  * dpy, GLXDrawable   drawable, unsigned long * mask);\ntypedef void (GLAD_API_PTR *PFNGLXRELEASETEXIMAGEEXTPROC)(Display  * dpy, GLXDrawable   drawable, int  buffer);\ntypedef void (GLAD_API_PTR *PFNGLXUSEXFONTPROC)(Font   font, int  first, int  count, int  list);\ntypedef Bool (GLAD_API_PTR *PFNGLXGETSYNCVALUESOMLPROC)(Display  * dpy, GLXDrawable   drawable, int64_t  * ust, int64_t  * msc, int64_t  * sbc);\ntypedef Bool (GLAD_API_PTR *PFNGLXJOINSWAPGROUPNVPROC)(Display  * dpy, GLXDrawable   drawable, GLuint   group);\ntypedef void (GLAD_API_PTR *PFNGLXSWAPBUFFERSPROC)(Display  * dpy, GLXDrawable   drawable);\ntypedef Bool (GLAD_API_PTR *PFNGLXDELAYBEFORESWAPNVPROC)(Display  * dpy, GLXDrawable   drawable, GLfloat   seconds);\ntypedef int (GLAD_API_PTR *PFNGLXBINDHYPERPIPESGIXPROC)(Display  * dpy, int  hpId);\ntypedef void (GLAD_API_PTR *PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC)(Display  * dpy, GLXVideoCaptureDeviceNV   device);\ntypedef Display * (GLAD_API_PTR *PFNGLXGETCURRENTDISPLAYEXTPROC)(void);\ntypedef GLXFBConfig * (GLAD_API_PTR *PFNGLXGETFBCONFIGSPROC)(Display  * dpy, int  screen, int * nelements);\ntypedef GLXDrawable (GLAD_API_PTR *PFNGLXGETCURRENTREADDRAWABLEPROC)(void);\ntypedef int (GLAD_API_PTR *PFNGLXRELEASEVIDEOIMAGENVPROC)(Display  * dpy, GLXPbuffer   pbuf);\ntypedef Bool (GLAD_API_PTR *PFNGLXQUERYEXTENSIONPROC)(Display  * dpy, int * errorb, int * event);\ntypedef Bool (GLAD_API_PTR *PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)(GLXContext   ctx);\ntypedef XVisualInfo * (GLAD_API_PTR *PFNGLXCHOOSEVISUALPROC)(Display  * dpy, int  screen, int * attribList);\ntypedef void (GLAD_API_PTR *PFNGLXDESTROYCONTEXTPROC)(Display  * dpy, GLXContext   ctx);\ntypedef const char * (GLAD_API_PTR *PFNGLXGETCLIENTSTRINGPROC)(Display  * dpy, int  name);\ntypedef void (GLAD_API_PTR *PFNGLXDESTROYGLXPIXMAPPROC)(Display  * dpy, GLXPixmap   pixmap);\ntypedef Bool (GLAD_API_PTR *PFNGLXRESETFRAMECOUNTNVPROC)(Display  * dpy, int  screen);\ntypedef int (GLAD_API_PTR *PFNGLXRELEASEVIDEODEVICENVPROC)(Display  * dpy, int  screen, GLXVideoDeviceNV   VideoDevice);\ntypedef GLXFBConfigSGIX (GLAD_API_PTR *PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)(Display  * dpy, XVisualInfo  * vis);\ntypedef GLXContext (GLAD_API_PTR *PFNGLXCREATENEWCONTEXTPROC)(Display  * dpy, GLXFBConfig   config, int  render_type, GLXContext   share_list, Bool   direct);\ntypedef Bool (GLAD_API_PTR *PFNGLXMAKECONTEXTCURRENTPROC)(Display  * dpy, GLXDrawable   draw, GLXDrawable   read, GLXContext   ctx);\ntypedef Bool (GLAD_API_PTR *PFNGLXQUERYMAXSWAPGROUPSNVPROC)(Display  * dpy, int  screen, GLuint  * maxGroups, GLuint  * maxBarriers);\ntypedef XVisualInfo * (GLAD_API_PTR *PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)(Display  * dpy, GLXFBConfigSGIX   config);\ntypedef GLXDrawable (GLAD_API_PTR *PFNGLXGETCURRENTDRAWABLEPROC)(void);\ntypedef GLXDrawable (GLAD_API_PTR *PFNGLXGETCURRENTREADDRAWABLESGIPROC)(void);\ntypedef Bool (GLAD_API_PTR *PFNGLXQUERYFRAMECOUNTNVPROC)(Display  * dpy, int  screen, GLuint  * count);\ntypedef unsigned int (GLAD_API_PTR *PFNGLXGETCONTEXTGPUIDAMDPROC)(GLXContext   ctx);\ntypedef void (GLAD_API_PTR *PFNGLXBINDSWAPBARRIERSGIXPROC)(Display  * dpy, GLXDrawable   drawable, int  barrier);\ntypedef Bool (GLAD_API_PTR *PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)(Display  * dpy, int  screen, int * max);\ntypedef GLXPixmap (GLAD_API_PTR *PFNGLXCREATEGLXPIXMAPMESAPROC)(Display  * dpy, XVisualInfo  * visual, Pixmap   pixmap, Colormap   cmap);\ntypedef Bool (GLAD_API_PTR *PFNGLXMAKECURRENTPROC)(Display  * dpy, GLXDrawable   drawable, GLXContext   ctx);\ntypedef void (GLAD_API_PTR *PFNGLXDESTROYWINDOWPROC)(Display  * dpy, GLXWindow   win);\ntypedef int (GLAD_API_PTR *PFNGLXBINDVIDEOIMAGENVPROC)(Display  * dpy, GLXVideoDeviceNV   VideoDevice, GLXPbuffer   pbuf, int  iVideoBuffer);\ntypedef int (GLAD_API_PTR *PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC)(Display  * dpy, GLXVideoCaptureDeviceNV   device, int  attribute, int * value);\ntypedef int (GLAD_API_PTR *PFNGLXQUERYCHANNELDELTASSGIXPROC)(Display  * display, int  screen, int  channel, int * x, int * y, int * w, int * h);\ntypedef GLXVideoCaptureDeviceNV * (GLAD_API_PTR *PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC)(Display  * dpy, int  screen, int * nelements);\ntypedef GLXContext (GLAD_API_PTR *PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)(unsigned int  id, GLXContext   share_context, const int * attribList);\ntypedef GLXContext (GLAD_API_PTR *PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC)(void);\ntypedef int (GLAD_API_PTR *PFNGLXQUERYCHANNELRECTSGIXPROC)(Display  * display, int  screen, int  channel, int * dx, int * dy, int * dw, int * dh);\ntypedef GLXContext (GLAD_API_PTR *PFNGLXCREATECONTEXTPROC)(Display  * dpy, XVisualInfo  * vis, GLXContext   shareList, Bool   direct);\ntypedef void (GLAD_API_PTR *PFNGLXFREECONTEXTEXTPROC)(Display  * dpy, GLXContext   context);\ntypedef GLXContextID (GLAD_API_PTR *PFNGLXGETCONTEXTIDEXTPROC)(const  GLXContext   context);\ntypedef Bool (GLAD_API_PTR *PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)(int  attribute, unsigned int * value);\ntypedef GLXFBConfig * (GLAD_API_PTR *PFNGLXCHOOSEFBCONFIGPROC)(Display  * dpy, int  screen, const int * attrib_list, int * nelements);\ntypedef int (GLAD_API_PTR *PFNGLXBINDCHANNELTOWINDOWSGIXPROC)(Display  * display, int  screen, int  channel, Window   window);\ntypedef int (GLAD_API_PTR *PFNGLXCHANNELRECTSYNCSGIXPROC)(Display  * display, int  screen, int  channel, GLenum   synctype);\ntypedef GLXContext (GLAD_API_PTR *PFNGLXIMPORTCONTEXTEXTPROC)(Display  * dpy, GLXContextID   contextID);\ntypedef Bool (GLAD_API_PTR *PFNGLXRELEASEBUFFERSMESAPROC)(Display  * dpy, GLXDrawable   drawable);\ntypedef GLXPixmap (GLAD_API_PTR *PFNGLXCREATEPIXMAPPROC)(Display  * dpy, GLXFBConfig   config, Pixmap   pixmap, const int * attrib_list);\ntypedef unsigned int (GLAD_API_PTR *PFNGLXGETAGPOFFSETMESAPROC)(const void * pointer);\n\nGLAD_API_CALL PFNGLXCUSHIONSGIPROC glad_glXCushionSGI;\n#define glXCushionSGI glad_glXCushionSGI\nGLAD_API_CALL PFNGLXDESTROYGLXPBUFFERSGIXPROC glad_glXDestroyGLXPbufferSGIX;\n#define glXDestroyGLXPbufferSGIX glad_glXDestroyGLXPbufferSGIX\nGLAD_API_CALL PFNGLXSENDPBUFFERTOVIDEONVPROC glad_glXSendPbufferToVideoNV;\n#define glXSendPbufferToVideoNV glad_glXSendPbufferToVideoNV\nGLAD_API_CALL PFNGLXGETPROCADDRESSARBPROC glad_glXGetProcAddressARB;\n#define glXGetProcAddressARB glad_glXGetProcAddressARB\nGLAD_API_CALL PFNGLXCREATECONTEXTATTRIBSARBPROC glad_glXCreateContextAttribsARB;\n#define glXCreateContextAttribsARB glad_glXCreateContextAttribsARB\nGLAD_API_CALL PFNGLXJOINSWAPGROUPSGIXPROC glad_glXJoinSwapGroupSGIX;\n#define glXJoinSwapGroupSGIX glad_glXJoinSwapGroupSGIX\nGLAD_API_CALL PFNGLXSWAPINTERVALEXTPROC glad_glXSwapIntervalEXT;\n#define glXSwapIntervalEXT glad_glXSwapIntervalEXT\nGLAD_API_CALL PFNGLXQUERYHYPERPIPECONFIGSGIXPROC glad_glXQueryHyperpipeConfigSGIX;\n#define glXQueryHyperpipeConfigSGIX glad_glXQueryHyperpipeConfigSGIX\nGLAD_API_CALL PFNGLXGETGPUINFOAMDPROC glad_glXGetGPUInfoAMD;\n#define glXGetGPUInfoAMD glad_glXGetGPUInfoAMD\nGLAD_API_CALL PFNGLXGETTRANSPARENTINDEXSUNPROC glad_glXGetTransparentIndexSUN;\n#define glXGetTransparentIndexSUN glad_glXGetTransparentIndexSUN\nGLAD_API_CALL PFNGLXQUERYHYPERPIPENETWORKSGIXPROC glad_glXQueryHyperpipeNetworkSGIX;\n#define glXQueryHyperpipeNetworkSGIX glad_glXQueryHyperpipeNetworkSGIX\nGLAD_API_CALL PFNGLXQUERYGLXPBUFFERSGIXPROC glad_glXQueryGLXPbufferSGIX;\n#define glXQueryGLXPbufferSGIX glad_glXQueryGLXPbufferSGIX\nGLAD_API_CALL PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC glad_glXCreateGLXPixmapWithConfigSGIX;\n#define glXCreateGLXPixmapWithConfigSGIX glad_glXCreateGLXPixmapWithConfigSGIX\nGLAD_API_CALL PFNGLXCOPYCONTEXTPROC glad_glXCopyContext;\n#define glXCopyContext glad_glXCopyContext\nGLAD_API_CALL PFNGLXCREATEGLXPBUFFERSGIXPROC glad_glXCreateGLXPbufferSGIX;\n#define glXCreateGLXPbufferSGIX glad_glXCreateGLXPbufferSGIX\nGLAD_API_CALL PFNGLXGETGPUIDSAMDPROC glad_glXGetGPUIDsAMD;\n#define glXGetGPUIDsAMD glad_glXGetGPUIDsAMD\nGLAD_API_CALL PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC glad_glXDeleteAssociatedContextAMD;\n#define glXDeleteAssociatedContextAMD glad_glXDeleteAssociatedContextAMD\nGLAD_API_CALL PFNGLXGETVIDEODEVICENVPROC glad_glXGetVideoDeviceNV;\n#define glXGetVideoDeviceNV glad_glXGetVideoDeviceNV\nGLAD_API_CALL PFNGLXWAITGLPROC glad_glXWaitGL;\n#define glXWaitGL glad_glXWaitGL\nGLAD_API_CALL PFNGLXGETVIDEOSYNCSGIPROC glad_glXGetVideoSyncSGI;\n#define glXGetVideoSyncSGI glad_glXGetVideoSyncSGI\nGLAD_API_CALL PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC glad_glXDestroyHyperpipeConfigSGIX;\n#define glXDestroyHyperpipeConfigSGIX glad_glXDestroyHyperpipeConfigSGIX\nGLAD_API_CALL PFNGLXHYPERPIPECONFIGSGIXPROC glad_glXHyperpipeConfigSGIX;\n#define glXHyperpipeConfigSGIX glad_glXHyperpipeConfigSGIX\nGLAD_API_CALL PFNGLXSWAPBUFFERSMSCOMLPROC glad_glXSwapBuffersMscOML;\n#define glXSwapBuffersMscOML glad_glXSwapBuffersMscOML\nGLAD_API_CALL PFNGLXCHOOSEFBCONFIGSGIXPROC glad_glXChooseFBConfigSGIX;\n#define glXChooseFBConfigSGIX glad_glXChooseFBConfigSGIX\nGLAD_API_CALL PFNGLXWAITVIDEOSYNCSGIPROC glad_glXWaitVideoSyncSGI;\n#define glXWaitVideoSyncSGI glad_glXWaitVideoSyncSGI\nGLAD_API_CALL PFNGLXWAITFORSBCOMLPROC glad_glXWaitForSbcOML;\n#define glXWaitForSbcOML glad_glXWaitForSbcOML\nGLAD_API_CALL PFNGLXGETPROCADDRESSPROC glad_glXGetProcAddress;\n#define glXGetProcAddress glad_glXGetProcAddress\nGLAD_API_CALL PFNGLXGETSWAPINTERVALMESAPROC glad_glXGetSwapIntervalMESA;\n#define glXGetSwapIntervalMESA glad_glXGetSwapIntervalMESA\nGLAD_API_CALL PFNGLXCHANNELRECTSGIXPROC glad_glXChannelRectSGIX;\n#define glXChannelRectSGIX glad_glXChannelRectSGIX\nGLAD_API_CALL PFNGLXWAITXPROC glad_glXWaitX;\n#define glXWaitX glad_glXWaitX\nGLAD_API_CALL PFNGLXQUERYSERVERSTRINGPROC glad_glXQueryServerString;\n#define glXQueryServerString glad_glXQueryServerString\nGLAD_API_CALL PFNGLXCREATEGLXPIXMAPPROC glad_glXCreateGLXPixmap;\n#define glXCreateGLXPixmap glad_glXCreateGLXPixmap\nGLAD_API_CALL PFNGLXBINDSWAPBARRIERNVPROC glad_glXBindSwapBarrierNV;\n#define glXBindSwapBarrierNV glad_glXBindSwapBarrierNV\nGLAD_API_CALL PFNGLXQUERYRENDERERSTRINGMESAPROC glad_glXQueryRendererStringMESA;\n#define glXQueryRendererStringMESA glad_glXQueryRendererStringMESA\nGLAD_API_CALL PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC glad_glXReleaseVideoCaptureDeviceNV;\n#define glXReleaseVideoCaptureDeviceNV glad_glXReleaseVideoCaptureDeviceNV\nGLAD_API_CALL PFNGLXWAITFORMSCOMLPROC glad_glXWaitForMscOML;\n#define glXWaitForMscOML glad_glXWaitForMscOML\nGLAD_API_CALL PFNGLXCOPYSUBBUFFERMESAPROC glad_glXCopySubBufferMESA;\n#define glXCopySubBufferMESA glad_glXCopySubBufferMESA\nGLAD_API_CALL PFNGLXGETCURRENTCONTEXTPROC glad_glXGetCurrentContext;\n#define glXGetCurrentContext glad_glXGetCurrentContext\nGLAD_API_CALL PFNGLXSELECTEVENTPROC glad_glXSelectEvent;\n#define glXSelectEvent glad_glXSelectEvent\nGLAD_API_CALL PFNGLXSWAPINTERVALSGIPROC glad_glXSwapIntervalSGI;\n#define glXSwapIntervalSGI glad_glXSwapIntervalSGI\nGLAD_API_CALL PFNGLXQUERYSWAPGROUPNVPROC glad_glXQuerySwapGroupNV;\n#define glXQuerySwapGroupNV glad_glXQuerySwapGroupNV\nGLAD_API_CALL PFNGLXMAKECURRENTREADSGIPROC glad_glXMakeCurrentReadSGI;\n#define glXMakeCurrentReadSGI glad_glXMakeCurrentReadSGI\nGLAD_API_CALL PFNGLXQUERYDRAWABLEPROC glad_glXQueryDrawable;\n#define glXQueryDrawable glad_glXQueryDrawable\nGLAD_API_CALL PFNGLXCOPYBUFFERSUBDATANVPROC glad_glXCopyBufferSubDataNV;\n#define glXCopyBufferSubDataNV glad_glXCopyBufferSubDataNV\nGLAD_API_CALL PFNGLXQUERYCONTEXTPROC glad_glXQueryContext;\n#define glXQueryContext glad_glXQueryContext\nGLAD_API_CALL PFNGLXGETCONFIGPROC glad_glXGetConfig;\n#define glXGetConfig glad_glXGetConfig\nGLAD_API_CALL PFNGLXSET3DFXMODEMESAPROC glad_glXSet3DfxModeMESA;\n#define glXSet3DfxModeMESA glad_glXSet3DfxModeMESA\nGLAD_API_CALL PFNGLXGETVIDEOINFONVPROC glad_glXGetVideoInfoNV;\n#define glXGetVideoInfoNV glad_glXGetVideoInfoNV\nGLAD_API_CALL PFNGLXISDIRECTPROC glad_glXIsDirect;\n#define glXIsDirect glad_glXIsDirect\nGLAD_API_CALL PFNGLXGETFBCONFIGATTRIBPROC glad_glXGetFBConfigAttrib;\n#define glXGetFBConfigAttrib glad_glXGetFBConfigAttrib\nGLAD_API_CALL PFNGLXGETVISUALFROMFBCONFIGPROC glad_glXGetVisualFromFBConfig;\n#define glXGetVisualFromFBConfig glad_glXGetVisualFromFBConfig\nGLAD_API_CALL PFNGLXBINDTEXIMAGEEXTPROC glad_glXBindTexImageEXT;\n#define glXBindTexImageEXT glad_glXBindTexImageEXT\nGLAD_API_CALL PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC glad_glXBlitContextFramebufferAMD;\n#define glXBlitContextFramebufferAMD glad_glXBlitContextFramebufferAMD\nGLAD_API_CALL PFNGLXQUERYVERSIONPROC glad_glXQueryVersion;\n#define glXQueryVersion glad_glXQueryVersion\nGLAD_API_CALL PFNGLXSELECTEVENTSGIXPROC glad_glXSelectEventSGIX;\n#define glXSelectEventSGIX glad_glXSelectEventSGIX\nGLAD_API_CALL PFNGLXGETMSCRATEOMLPROC glad_glXGetMscRateOML;\n#define glXGetMscRateOML glad_glXGetMscRateOML\nGLAD_API_CALL PFNGLXQUERYRENDERERINTEGERMESAPROC glad_glXQueryRendererIntegerMESA;\n#define glXQueryRendererIntegerMESA glad_glXQueryRendererIntegerMESA\nGLAD_API_CALL PFNGLXCREATEWINDOWPROC glad_glXCreateWindow;\n#define glXCreateWindow glad_glXCreateWindow\nGLAD_API_CALL PFNGLXCOPYIMAGESUBDATANVPROC glad_glXCopyImageSubDataNV;\n#define glXCopyImageSubDataNV glad_glXCopyImageSubDataNV\nGLAD_API_CALL PFNGLXSWAPINTERVALMESAPROC glad_glXSwapIntervalMESA;\n#define glXSwapIntervalMESA glad_glXSwapIntervalMESA\nGLAD_API_CALL PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC glad_glXQueryHyperpipeAttribSGIX;\n#define glXQueryHyperpipeAttribSGIX glad_glXQueryHyperpipeAttribSGIX\nGLAD_API_CALL PFNGLXBINDVIDEOCAPTUREDEVICENVPROC glad_glXBindVideoCaptureDeviceNV;\n#define glXBindVideoCaptureDeviceNV glad_glXBindVideoCaptureDeviceNV\nGLAD_API_CALL PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC glad_glXCreateContextWithConfigSGIX;\n#define glXCreateContextWithConfigSGIX glad_glXCreateContextWithConfigSGIX\nGLAD_API_CALL PFNGLXENUMERATEVIDEODEVICESNVPROC glad_glXEnumerateVideoDevicesNV;\n#define glXEnumerateVideoDevicesNV glad_glXEnumerateVideoDevicesNV\nGLAD_API_CALL PFNGLXHYPERPIPEATTRIBSGIXPROC glad_glXHyperpipeAttribSGIX;\n#define glXHyperpipeAttribSGIX glad_glXHyperpipeAttribSGIX\nGLAD_API_CALL PFNGLXDESTROYPBUFFERPROC glad_glXDestroyPbuffer;\n#define glXDestroyPbuffer glad_glXDestroyPbuffer\nGLAD_API_CALL PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC glad_glXNamedCopyBufferSubDataNV;\n#define glXNamedCopyBufferSubDataNV glad_glXNamedCopyBufferSubDataNV\nGLAD_API_CALL PFNGLXCREATEPBUFFERPROC glad_glXCreatePbuffer;\n#define glXCreatePbuffer glad_glXCreatePbuffer\nGLAD_API_CALL PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC glad_glXQueryCurrentRendererStringMESA;\n#define glXQueryCurrentRendererStringMESA glad_glXQueryCurrentRendererStringMESA\nGLAD_API_CALL PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC glad_glXQueryHyperpipeBestAttribSGIX;\n#define glXQueryHyperpipeBestAttribSGIX glad_glXQueryHyperpipeBestAttribSGIX\nGLAD_API_CALL PFNGLXGETFBCONFIGATTRIBSGIXPROC glad_glXGetFBConfigAttribSGIX;\n#define glXGetFBConfigAttribSGIX glad_glXGetFBConfigAttribSGIX\nGLAD_API_CALL PFNGLXQUERYEXTENSIONSSTRINGPROC glad_glXQueryExtensionsString;\n#define glXQueryExtensionsString glad_glXQueryExtensionsString\nGLAD_API_CALL PFNGLXBINDVIDEODEVICENVPROC glad_glXBindVideoDeviceNV;\n#define glXBindVideoDeviceNV glad_glXBindVideoDeviceNV\nGLAD_API_CALL PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC glad_glXCreateAssociatedContextAMD;\n#define glXCreateAssociatedContextAMD glad_glXCreateAssociatedContextAMD\nGLAD_API_CALL PFNGLXQUERYCONTEXTINFOEXTPROC glad_glXQueryContextInfoEXT;\n#define glXQueryContextInfoEXT glad_glXQueryContextInfoEXT\nGLAD_API_CALL PFNGLXGETSELECTEDEVENTPROC glad_glXGetSelectedEvent;\n#define glXGetSelectedEvent glad_glXGetSelectedEvent\nGLAD_API_CALL PFNGLXGETCURRENTDISPLAYPROC glad_glXGetCurrentDisplay;\n#define glXGetCurrentDisplay glad_glXGetCurrentDisplay\nGLAD_API_CALL PFNGLXDESTROYPIXMAPPROC glad_glXDestroyPixmap;\n#define glXDestroyPixmap glad_glXDestroyPixmap\nGLAD_API_CALL PFNGLXGETSELECTEDEVENTSGIXPROC glad_glXGetSelectedEventSGIX;\n#define glXGetSelectedEventSGIX glad_glXGetSelectedEventSGIX\nGLAD_API_CALL PFNGLXRELEASETEXIMAGEEXTPROC glad_glXReleaseTexImageEXT;\n#define glXReleaseTexImageEXT glad_glXReleaseTexImageEXT\nGLAD_API_CALL PFNGLXUSEXFONTPROC glad_glXUseXFont;\n#define glXUseXFont glad_glXUseXFont\nGLAD_API_CALL PFNGLXGETSYNCVALUESOMLPROC glad_glXGetSyncValuesOML;\n#define glXGetSyncValuesOML glad_glXGetSyncValuesOML\nGLAD_API_CALL PFNGLXJOINSWAPGROUPNVPROC glad_glXJoinSwapGroupNV;\n#define glXJoinSwapGroupNV glad_glXJoinSwapGroupNV\nGLAD_API_CALL PFNGLXSWAPBUFFERSPROC glad_glXSwapBuffers;\n#define glXSwapBuffers glad_glXSwapBuffers\nGLAD_API_CALL PFNGLXDELAYBEFORESWAPNVPROC glad_glXDelayBeforeSwapNV;\n#define glXDelayBeforeSwapNV glad_glXDelayBeforeSwapNV\nGLAD_API_CALL PFNGLXBINDHYPERPIPESGIXPROC glad_glXBindHyperpipeSGIX;\n#define glXBindHyperpipeSGIX glad_glXBindHyperpipeSGIX\nGLAD_API_CALL PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC glad_glXLockVideoCaptureDeviceNV;\n#define glXLockVideoCaptureDeviceNV glad_glXLockVideoCaptureDeviceNV\nGLAD_API_CALL PFNGLXGETCURRENTDISPLAYEXTPROC glad_glXGetCurrentDisplayEXT;\n#define glXGetCurrentDisplayEXT glad_glXGetCurrentDisplayEXT\nGLAD_API_CALL PFNGLXGETFBCONFIGSPROC glad_glXGetFBConfigs;\n#define glXGetFBConfigs glad_glXGetFBConfigs\nGLAD_API_CALL PFNGLXGETCURRENTREADDRAWABLEPROC glad_glXGetCurrentReadDrawable;\n#define glXGetCurrentReadDrawable glad_glXGetCurrentReadDrawable\nGLAD_API_CALL PFNGLXRELEASEVIDEOIMAGENVPROC glad_glXReleaseVideoImageNV;\n#define glXReleaseVideoImageNV glad_glXReleaseVideoImageNV\nGLAD_API_CALL PFNGLXQUERYEXTENSIONPROC glad_glXQueryExtension;\n#define glXQueryExtension glad_glXQueryExtension\nGLAD_API_CALL PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC glad_glXMakeAssociatedContextCurrentAMD;\n#define glXMakeAssociatedContextCurrentAMD glad_glXMakeAssociatedContextCurrentAMD\nGLAD_API_CALL PFNGLXCHOOSEVISUALPROC glad_glXChooseVisual;\n#define glXChooseVisual glad_glXChooseVisual\nGLAD_API_CALL PFNGLXDESTROYCONTEXTPROC glad_glXDestroyContext;\n#define glXDestroyContext glad_glXDestroyContext\nGLAD_API_CALL PFNGLXGETCLIENTSTRINGPROC glad_glXGetClientString;\n#define glXGetClientString glad_glXGetClientString\nGLAD_API_CALL PFNGLXDESTROYGLXPIXMAPPROC glad_glXDestroyGLXPixmap;\n#define glXDestroyGLXPixmap glad_glXDestroyGLXPixmap\nGLAD_API_CALL PFNGLXRESETFRAMECOUNTNVPROC glad_glXResetFrameCountNV;\n#define glXResetFrameCountNV glad_glXResetFrameCountNV\nGLAD_API_CALL PFNGLXRELEASEVIDEODEVICENVPROC glad_glXReleaseVideoDeviceNV;\n#define glXReleaseVideoDeviceNV glad_glXReleaseVideoDeviceNV\nGLAD_API_CALL PFNGLXGETFBCONFIGFROMVISUALSGIXPROC glad_glXGetFBConfigFromVisualSGIX;\n#define glXGetFBConfigFromVisualSGIX glad_glXGetFBConfigFromVisualSGIX\nGLAD_API_CALL PFNGLXCREATENEWCONTEXTPROC glad_glXCreateNewContext;\n#define glXCreateNewContext glad_glXCreateNewContext\nGLAD_API_CALL PFNGLXMAKECONTEXTCURRENTPROC glad_glXMakeContextCurrent;\n#define glXMakeContextCurrent glad_glXMakeContextCurrent\nGLAD_API_CALL PFNGLXQUERYMAXSWAPGROUPSNVPROC glad_glXQueryMaxSwapGroupsNV;\n#define glXQueryMaxSwapGroupsNV glad_glXQueryMaxSwapGroupsNV\nGLAD_API_CALL PFNGLXGETVISUALFROMFBCONFIGSGIXPROC glad_glXGetVisualFromFBConfigSGIX;\n#define glXGetVisualFromFBConfigSGIX glad_glXGetVisualFromFBConfigSGIX\nGLAD_API_CALL PFNGLXGETCURRENTDRAWABLEPROC glad_glXGetCurrentDrawable;\n#define glXGetCurrentDrawable glad_glXGetCurrentDrawable\nGLAD_API_CALL PFNGLXGETCURRENTREADDRAWABLESGIPROC glad_glXGetCurrentReadDrawableSGI;\n#define glXGetCurrentReadDrawableSGI glad_glXGetCurrentReadDrawableSGI\nGLAD_API_CALL PFNGLXQUERYFRAMECOUNTNVPROC glad_glXQueryFrameCountNV;\n#define glXQueryFrameCountNV glad_glXQueryFrameCountNV\nGLAD_API_CALL PFNGLXGETCONTEXTGPUIDAMDPROC glad_glXGetContextGPUIDAMD;\n#define glXGetContextGPUIDAMD glad_glXGetContextGPUIDAMD\nGLAD_API_CALL PFNGLXBINDSWAPBARRIERSGIXPROC glad_glXBindSwapBarrierSGIX;\n#define glXBindSwapBarrierSGIX glad_glXBindSwapBarrierSGIX\nGLAD_API_CALL PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC glad_glXQueryMaxSwapBarriersSGIX;\n#define glXQueryMaxSwapBarriersSGIX glad_glXQueryMaxSwapBarriersSGIX\nGLAD_API_CALL PFNGLXCREATEGLXPIXMAPMESAPROC glad_glXCreateGLXPixmapMESA;\n#define glXCreateGLXPixmapMESA glad_glXCreateGLXPixmapMESA\nGLAD_API_CALL PFNGLXMAKECURRENTPROC glad_glXMakeCurrent;\n#define glXMakeCurrent glad_glXMakeCurrent\nGLAD_API_CALL PFNGLXDESTROYWINDOWPROC glad_glXDestroyWindow;\n#define glXDestroyWindow glad_glXDestroyWindow\nGLAD_API_CALL PFNGLXBINDVIDEOIMAGENVPROC glad_glXBindVideoImageNV;\n#define glXBindVideoImageNV glad_glXBindVideoImageNV\nGLAD_API_CALL PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC glad_glXQueryVideoCaptureDeviceNV;\n#define glXQueryVideoCaptureDeviceNV glad_glXQueryVideoCaptureDeviceNV\nGLAD_API_CALL PFNGLXQUERYCHANNELDELTASSGIXPROC glad_glXQueryChannelDeltasSGIX;\n#define glXQueryChannelDeltasSGIX glad_glXQueryChannelDeltasSGIX\nGLAD_API_CALL PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC glad_glXEnumerateVideoCaptureDevicesNV;\n#define glXEnumerateVideoCaptureDevicesNV glad_glXEnumerateVideoCaptureDevicesNV\nGLAD_API_CALL PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC glad_glXCreateAssociatedContextAttribsAMD;\n#define glXCreateAssociatedContextAttribsAMD glad_glXCreateAssociatedContextAttribsAMD\nGLAD_API_CALL PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC glad_glXGetCurrentAssociatedContextAMD;\n#define glXGetCurrentAssociatedContextAMD glad_glXGetCurrentAssociatedContextAMD\nGLAD_API_CALL PFNGLXQUERYCHANNELRECTSGIXPROC glad_glXQueryChannelRectSGIX;\n#define glXQueryChannelRectSGIX glad_glXQueryChannelRectSGIX\nGLAD_API_CALL PFNGLXCREATECONTEXTPROC glad_glXCreateContext;\n#define glXCreateContext glad_glXCreateContext\nGLAD_API_CALL PFNGLXFREECONTEXTEXTPROC glad_glXFreeContextEXT;\n#define glXFreeContextEXT glad_glXFreeContextEXT\nGLAD_API_CALL PFNGLXGETCONTEXTIDEXTPROC glad_glXGetContextIDEXT;\n#define glXGetContextIDEXT glad_glXGetContextIDEXT\nGLAD_API_CALL PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC glad_glXQueryCurrentRendererIntegerMESA;\n#define glXQueryCurrentRendererIntegerMESA glad_glXQueryCurrentRendererIntegerMESA\nGLAD_API_CALL PFNGLXCHOOSEFBCONFIGPROC glad_glXChooseFBConfig;\n#define glXChooseFBConfig glad_glXChooseFBConfig\nGLAD_API_CALL PFNGLXBINDCHANNELTOWINDOWSGIXPROC glad_glXBindChannelToWindowSGIX;\n#define glXBindChannelToWindowSGIX glad_glXBindChannelToWindowSGIX\nGLAD_API_CALL PFNGLXCHANNELRECTSYNCSGIXPROC glad_glXChannelRectSyncSGIX;\n#define glXChannelRectSyncSGIX glad_glXChannelRectSyncSGIX\nGLAD_API_CALL PFNGLXIMPORTCONTEXTEXTPROC glad_glXImportContextEXT;\n#define glXImportContextEXT glad_glXImportContextEXT\nGLAD_API_CALL PFNGLXRELEASEBUFFERSMESAPROC glad_glXReleaseBuffersMESA;\n#define glXReleaseBuffersMESA glad_glXReleaseBuffersMESA\nGLAD_API_CALL PFNGLXCREATEPIXMAPPROC glad_glXCreatePixmap;\n#define glXCreatePixmap glad_glXCreatePixmap\nGLAD_API_CALL PFNGLXGETAGPOFFSETMESAPROC glad_glXGetAGPOffsetMESA;\n#define glXGetAGPOffsetMESA glad_glXGetAGPOffsetMESA\n\n\nGLAD_API_CALL int gladLoadGLXUserPtr(Display *display, int screen, GLADuserptrloadfunc load, void *userptr);\nGLAD_API_CALL int gladLoadGLX(Display *display, int screen, GLADloadfunc load);\n\n\n\n\n#ifdef GLAD_GLX\n\nGLAD_API_CALL int gladLoaderLoadGLX(Display *display, int screen);\n\nGLAD_API_CALL void gladLoaderUnloadGLX(void);\n\n#endif\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "ycb_render/glad/glx_dyn.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <glad/glx.h>\n#ifdef DYNAMIC_LOAD_X11_FUNCTIONS\n#include <dlfcn.h>\n#endif\n\ntypedef Display* (* PFNXOPENDISPLAY) (_Xconst char* a);\ntypedef Screen* (* PFNXDEFAULTSCREENOFDISPLAY) (Display*);\ntypedef int (* PFNXSCREENNUMBEROFSCREEN) (Screen*);\ntypedef struct\n{\n    void* library;\n    PFNXOPENDISPLAY XOpenDisplay;\n    PFNXDEFAULTSCREENOFDISPLAY XDefaultScreenOfDisplay;\n    PFNXSCREENNUMBEROFSCREEN XScreenNumberOfScreen;\n} X11Struct;\n#ifdef DYNAMIC_LOAD_X11_FUNCTIONS\nvoid initX11Struct(X11Struct *x11) {\n    const char *X11_LIBRARY = \"libX11.so.6\";\n    x11->library = dlopen(X11_LIBRARY, RTLD_LOCAL | RTLD_NOW);\n    if (!x11->library) { fprintf(stderr, \"Error opening X11 library %s\\n\", X11_LIBRARY); exit(EXIT_FAILURE); }\n    int missingFunc = 0;\n    missingFunc = ((x11->XOpenDisplay = (PFNXOPENDISPLAY) dlsym(x11->library,\"XOpenDisplay\"))==NULL) | missingFunc;\n    if (missingFunc) { fprintf(stderr, \"Error: missing func XOpenDisplay in %s, exiting!\\n\", X11_LIBRARY); exit(EXIT_FAILURE);}\n    missingFunc = ((x11->XDefaultScreenOfDisplay = (PFNXDEFAULTSCREENOFDISPLAY) dlsym(x11->library,\"XDefaultScreenOfDisplay\"))==NULL) | missingFunc;\n    if (missingFunc) { fprintf(stderr, \"Error: missing func XScreenNumberOfScreen in %s, exiting!\\n\", X11_LIBRARY); exit(EXIT_FAILURE);}\n    missingFunc = ((x11->XScreenNumberOfScreen = (PFNXSCREENNUMBEROFSCREEN) dlsym(x11->library,\"XScreenNumberOfScreen\"))==NULL) | missingFunc;\n    if (missingFunc) { fprintf(stderr, \"Error: missing func XScreenNumberOfScreen in %s, exiting!\\n\", X11_LIBRARY); exit(EXIT_FAILURE);}\n    if (!missingFunc) { printf(\"X11 functions dynamically loaded using dlopen/dlsym OK!\\n\");}\n}\n#else\nvoid initX11Struct(X11Struct *x11) {\n    x11->XOpenDisplay = XOpenDisplay;\n    x11->XDefaultScreenOfDisplay = XDefaultScreenOfDisplay;\n    x11->XScreenNumberOfScreen = XScreenNumberOfScreen;\n}\n#endif  // DYNAMIC_LOAD_X11_FUNCTIONS\n\n#ifndef GLAD_IMPL_UTIL_C_\n#define GLAD_IMPL_UTIL_C_\n\n#if _MSC_VER >= 1400\n#define GLAD_IMPL_UTIL_STRNCPY(dest, source, len) strncpy_s(dest, len, source, len-1);\n#else\n#define GLAD_IMPL_UTIL_STRNCPY(dest, source, len) strncpy(dest, source, len);\n#endif\n\n#ifdef _MSC_VER\n#define GLAD_IMPL_UTIL_SSCANF sscanf_s\n#else\n#define GLAD_IMPL_UTIL_SSCANF sscanf\n#endif\n\n#endif /* GLAD_IMPL_UTIL_C_ */\n\n\n\n\nint GLAD_GLX_VERSION_1_0;\nint GLAD_GLX_VERSION_1_1;\nint GLAD_GLX_VERSION_1_2;\nint GLAD_GLX_VERSION_1_3;\nint GLAD_GLX_VERSION_1_4;\nint GLAD_GLX_MESA_copy_sub_buffer;\nint GLAD_GLX_EXT_create_context_es_profile;\nint GLAD_GLX_SGIX_pbuffer;\nint GLAD_GLX_SGI_make_current_read;\nint GLAD_GLX_OML_sync_control;\nint GLAD_GLX_SGIX_hyperpipe;\nint GLAD_GLX_INTEL_swap_event;\nint GLAD_GLX_EXT_swap_control;\nint GLAD_GLX_NV_robustness_video_memory_purge;\nint GLAD_GLX_MESA_pixmap_colormap;\nint GLAD_GLX_ARB_fbconfig_float;\nint GLAD_GLX_EXT_fbconfig_packed_float;\nint GLAD_GLX_OML_swap_method;\nint GLAD_GLX_NV_video_capture;\nint GLAD_GLX_ARB_robustness_application_isolation;\nint GLAD_GLX_ARB_create_context_robustness;\nint GLAD_GLX_EXT_visual_rating;\nint GLAD_GLX_NV_swap_group;\nint GLAD_GLX_EXT_texture_from_pixmap;\nint GLAD_GLX_SUN_get_transparent_index;\nint GLAD_GLX_MESA_release_buffers;\nint GLAD_GLX_NV_delay_before_swap;\nint GLAD_GLX_EXT_buffer_age;\nint GLAD_GLX_MESA_agp_offset;\nint GLAD_GLX_EXT_visual_info;\nint GLAD_GLX_SGI_swap_control;\nint GLAD_GLX_EXT_import_context;\nint GLAD_GLX_SGI_video_sync;\nint GLAD_GLX_3DFX_multisample;\nint GLAD_GLX_ARB_multisample;\nint GLAD_GLX_EXT_framebuffer_sRGB;\nint GLAD_GLX_SGI_cushion;\nint GLAD_GLX_ARB_robustness_share_group_isolation;\nint GLAD_GLX_SGIX_fbconfig;\nint GLAD_GLX_NV_copy_buffer;\nint GLAD_GLX_SGIX_visual_select_group;\nint GLAD_GLX_EXT_swap_control_tear;\nint GLAD_GLX_ARB_create_context;\nint GLAD_GLX_AMD_gpu_association;\nint GLAD_GLX_MESA_query_renderer;\nint GLAD_GLX_EXT_create_context_es2_profile;\nint GLAD_GLX_MESA_swap_control;\nint GLAD_GLX_SGIX_video_resize;\nint GLAD_GLX_ARB_context_flush_control;\nint GLAD_GLX_NV_video_out;\nint GLAD_GLX_EXT_no_config_context;\nint GLAD_GLX_SGIS_blended_overlay;\nint GLAD_GLX_EXT_stereo_tree;\nint GLAD_GLX_ARB_create_context_no_error;\nint GLAD_GLX_EXT_libglvnd;\nint GLAD_GLX_ARB_create_context_profile;\nint GLAD_GLX_NV_float_buffer;\nint GLAD_GLX_MESA_set_3dfx_mode;\nint GLAD_GLX_ARB_framebuffer_sRGB;\nint GLAD_GLX_ARB_get_proc_address;\nint GLAD_GLX_SGIS_shared_multisample;\nint GLAD_GLX_NV_copy_image;\nint GLAD_GLX_NV_present_video;\nint GLAD_GLX_SGIX_swap_barrier;\nint GLAD_GLX_SGIS_multisample;\nint GLAD_GLX_SGIX_swap_group;\nint GLAD_GLX_ARB_vertex_buffer_object;\nint GLAD_GLX_NV_multisample_coverage;\n\n\n\nPFNGLXCUSHIONSGIPROC glad_glXCushionSGI;\nPFNGLXDESTROYGLXPBUFFERSGIXPROC glad_glXDestroyGLXPbufferSGIX;\nPFNGLXSENDPBUFFERTOVIDEONVPROC glad_glXSendPbufferToVideoNV;\nPFNGLXGETPROCADDRESSARBPROC glad_glXGetProcAddressARB;\nPFNGLXCREATECONTEXTATTRIBSARBPROC glad_glXCreateContextAttribsARB;\nPFNGLXJOINSWAPGROUPSGIXPROC glad_glXJoinSwapGroupSGIX;\nPFNGLXSWAPINTERVALEXTPROC glad_glXSwapIntervalEXT;\nPFNGLXQUERYHYPERPIPECONFIGSGIXPROC glad_glXQueryHyperpipeConfigSGIX;\nPFNGLXGETGPUINFOAMDPROC glad_glXGetGPUInfoAMD;\nPFNGLXGETTRANSPARENTINDEXSUNPROC glad_glXGetTransparentIndexSUN;\nPFNGLXQUERYHYPERPIPENETWORKSGIXPROC glad_glXQueryHyperpipeNetworkSGIX;\nPFNGLXQUERYGLXPBUFFERSGIXPROC glad_glXQueryGLXPbufferSGIX;\nPFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC glad_glXCreateGLXPixmapWithConfigSGIX;\nPFNGLXCOPYCONTEXTPROC glad_glXCopyContext;\nPFNGLXCREATEGLXPBUFFERSGIXPROC glad_glXCreateGLXPbufferSGIX;\nPFNGLXGETGPUIDSAMDPROC glad_glXGetGPUIDsAMD;\nPFNGLXDELETEASSOCIATEDCONTEXTAMDPROC glad_glXDeleteAssociatedContextAMD;\nPFNGLXGETVIDEODEVICENVPROC glad_glXGetVideoDeviceNV;\nPFNGLXWAITGLPROC glad_glXWaitGL;\nPFNGLXGETVIDEOSYNCSGIPROC glad_glXGetVideoSyncSGI;\nPFNGLXDESTROYHYPERPIPECONFIGSGIXPROC glad_glXDestroyHyperpipeConfigSGIX;\nPFNGLXHYPERPIPECONFIGSGIXPROC glad_glXHyperpipeConfigSGIX;\nPFNGLXSWAPBUFFERSMSCOMLPROC glad_glXSwapBuffersMscOML;\nPFNGLXCHOOSEFBCONFIGSGIXPROC glad_glXChooseFBConfigSGIX;\nPFNGLXWAITVIDEOSYNCSGIPROC glad_glXWaitVideoSyncSGI;\nPFNGLXWAITFORSBCOMLPROC glad_glXWaitForSbcOML;\nPFNGLXGETPROCADDRESSPROC glad_glXGetProcAddress;\nPFNGLXGETSWAPINTERVALMESAPROC glad_glXGetSwapIntervalMESA;\nPFNGLXCHANNELRECTSGIXPROC glad_glXChannelRectSGIX;\nPFNGLXWAITXPROC glad_glXWaitX;\nPFNGLXQUERYSERVERSTRINGPROC glad_glXQueryServerString;\nPFNGLXCREATEGLXPIXMAPPROC glad_glXCreateGLXPixmap;\nPFNGLXBINDSWAPBARRIERNVPROC glad_glXBindSwapBarrierNV;\nPFNGLXQUERYRENDERERSTRINGMESAPROC glad_glXQueryRendererStringMESA;\nPFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC glad_glXReleaseVideoCaptureDeviceNV;\nPFNGLXWAITFORMSCOMLPROC glad_glXWaitForMscOML;\nPFNGLXCOPYSUBBUFFERMESAPROC glad_glXCopySubBufferMESA;\nPFNGLXGETCURRENTCONTEXTPROC glad_glXGetCurrentContext;\nPFNGLXSELECTEVENTPROC glad_glXSelectEvent;\nPFNGLXSWAPINTERVALSGIPROC glad_glXSwapIntervalSGI;\nPFNGLXQUERYSWAPGROUPNVPROC glad_glXQuerySwapGroupNV;\nPFNGLXMAKECURRENTREADSGIPROC glad_glXMakeCurrentReadSGI;\nPFNGLXQUERYDRAWABLEPROC glad_glXQueryDrawable;\nPFNGLXCOPYBUFFERSUBDATANVPROC glad_glXCopyBufferSubDataNV;\nPFNGLXQUERYCONTEXTPROC glad_glXQueryContext;\nPFNGLXGETCONFIGPROC glad_glXGetConfig;\nPFNGLXSET3DFXMODEMESAPROC glad_glXSet3DfxModeMESA;\nPFNGLXGETVIDEOINFONVPROC glad_glXGetVideoInfoNV;\nPFNGLXISDIRECTPROC glad_glXIsDirect;\nPFNGLXGETFBCONFIGATTRIBPROC glad_glXGetFBConfigAttrib;\nPFNGLXGETVISUALFROMFBCONFIGPROC glad_glXGetVisualFromFBConfig;\nPFNGLXBINDTEXIMAGEEXTPROC glad_glXBindTexImageEXT;\nPFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC glad_glXBlitContextFramebufferAMD;\nPFNGLXQUERYVERSIONPROC glad_glXQueryVersion;\nPFNGLXSELECTEVENTSGIXPROC glad_glXSelectEventSGIX;\nPFNGLXGETMSCRATEOMLPROC glad_glXGetMscRateOML;\nPFNGLXQUERYRENDERERINTEGERMESAPROC glad_glXQueryRendererIntegerMESA;\nPFNGLXCREATEWINDOWPROC glad_glXCreateWindow;\nPFNGLXCOPYIMAGESUBDATANVPROC glad_glXCopyImageSubDataNV;\nPFNGLXSWAPINTERVALMESAPROC glad_glXSwapIntervalMESA;\nPFNGLXQUERYHYPERPIPEATTRIBSGIXPROC glad_glXQueryHyperpipeAttribSGIX;\nPFNGLXBINDVIDEOCAPTUREDEVICENVPROC glad_glXBindVideoCaptureDeviceNV;\nPFNGLXCREATECONTEXTWITHCONFIGSGIXPROC glad_glXCreateContextWithConfigSGIX;\nPFNGLXENUMERATEVIDEODEVICESNVPROC glad_glXEnumerateVideoDevicesNV;\nPFNGLXHYPERPIPEATTRIBSGIXPROC glad_glXHyperpipeAttribSGIX;\nPFNGLXDESTROYPBUFFERPROC glad_glXDestroyPbuffer;\nPFNGLXNAMEDCOPYBUFFERSUBDATANVPROC glad_glXNamedCopyBufferSubDataNV;\nPFNGLXCREATEPBUFFERPROC glad_glXCreatePbuffer;\nPFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC glad_glXQueryCurrentRendererStringMESA;\nPFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC glad_glXQueryHyperpipeBestAttribSGIX;\nPFNGLXGETFBCONFIGATTRIBSGIXPROC glad_glXGetFBConfigAttribSGIX;\nPFNGLXQUERYEXTENSIONSSTRINGPROC glad_glXQueryExtensionsString;\nPFNGLXBINDVIDEODEVICENVPROC glad_glXBindVideoDeviceNV;\nPFNGLXCREATEASSOCIATEDCONTEXTAMDPROC glad_glXCreateAssociatedContextAMD;\nPFNGLXQUERYCONTEXTINFOEXTPROC glad_glXQueryContextInfoEXT;\nPFNGLXGETSELECTEDEVENTPROC glad_glXGetSelectedEvent;\nPFNGLXGETCURRENTDISPLAYPROC glad_glXGetCurrentDisplay;\nPFNGLXDESTROYPIXMAPPROC glad_glXDestroyPixmap;\nPFNGLXGETSELECTEDEVENTSGIXPROC glad_glXGetSelectedEventSGIX;\nPFNGLXRELEASETEXIMAGEEXTPROC glad_glXReleaseTexImageEXT;\nPFNGLXUSEXFONTPROC glad_glXUseXFont;\nPFNGLXGETSYNCVALUESOMLPROC glad_glXGetSyncValuesOML;\nPFNGLXJOINSWAPGROUPNVPROC glad_glXJoinSwapGroupNV;\nPFNGLXSWAPBUFFERSPROC glad_glXSwapBuffers;\nPFNGLXDELAYBEFORESWAPNVPROC glad_glXDelayBeforeSwapNV;\nPFNGLXBINDHYPERPIPESGIXPROC glad_glXBindHyperpipeSGIX;\nPFNGLXLOCKVIDEOCAPTUREDEVICENVPROC glad_glXLockVideoCaptureDeviceNV;\nPFNGLXGETCURRENTDISPLAYEXTPROC glad_glXGetCurrentDisplayEXT;\nPFNGLXGETFBCONFIGSPROC glad_glXGetFBConfigs;\nPFNGLXGETCURRENTREADDRAWABLEPROC glad_glXGetCurrentReadDrawable;\nPFNGLXRELEASEVIDEOIMAGENVPROC glad_glXReleaseVideoImageNV;\nPFNGLXQUERYEXTENSIONPROC glad_glXQueryExtension;\nPFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC glad_glXMakeAssociatedContextCurrentAMD;\nPFNGLXCHOOSEVISUALPROC glad_glXChooseVisual;\nPFNGLXDESTROYCONTEXTPROC glad_glXDestroyContext;\nPFNGLXGETCLIENTSTRINGPROC glad_glXGetClientString;\nPFNGLXDESTROYGLXPIXMAPPROC glad_glXDestroyGLXPixmap;\nPFNGLXRESETFRAMECOUNTNVPROC glad_glXResetFrameCountNV;\nPFNGLXRELEASEVIDEODEVICENVPROC glad_glXReleaseVideoDeviceNV;\nPFNGLXGETFBCONFIGFROMVISUALSGIXPROC glad_glXGetFBConfigFromVisualSGIX;\nPFNGLXCREATENEWCONTEXTPROC glad_glXCreateNewContext;\nPFNGLXMAKECONTEXTCURRENTPROC glad_glXMakeContextCurrent;\nPFNGLXQUERYMAXSWAPGROUPSNVPROC glad_glXQueryMaxSwapGroupsNV;\nPFNGLXGETVISUALFROMFBCONFIGSGIXPROC glad_glXGetVisualFromFBConfigSGIX;\nPFNGLXGETCURRENTDRAWABLEPROC glad_glXGetCurrentDrawable;\nPFNGLXGETCURRENTREADDRAWABLESGIPROC glad_glXGetCurrentReadDrawableSGI;\nPFNGLXQUERYFRAMECOUNTNVPROC glad_glXQueryFrameCountNV;\nPFNGLXGETCONTEXTGPUIDAMDPROC glad_glXGetContextGPUIDAMD;\nPFNGLXBINDSWAPBARRIERSGIXPROC glad_glXBindSwapBarrierSGIX;\nPFNGLXQUERYMAXSWAPBARRIERSSGIXPROC glad_glXQueryMaxSwapBarriersSGIX;\nPFNGLXCREATEGLXPIXMAPMESAPROC glad_glXCreateGLXPixmapMESA;\nPFNGLXMAKECURRENTPROC glad_glXMakeCurrent;\nPFNGLXDESTROYWINDOWPROC glad_glXDestroyWindow;\nPFNGLXBINDVIDEOIMAGENVPROC glad_glXBindVideoImageNV;\nPFNGLXQUERYVIDEOCAPTUREDEVICENVPROC glad_glXQueryVideoCaptureDeviceNV;\nPFNGLXQUERYCHANNELDELTASSGIXPROC glad_glXQueryChannelDeltasSGIX;\nPFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC glad_glXEnumerateVideoCaptureDevicesNV;\nPFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC glad_glXCreateAssociatedContextAttribsAMD;\nPFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC glad_glXGetCurrentAssociatedContextAMD;\nPFNGLXQUERYCHANNELRECTSGIXPROC glad_glXQueryChannelRectSGIX;\nPFNGLXCREATECONTEXTPROC glad_glXCreateContext;\nPFNGLXFREECONTEXTEXTPROC glad_glXFreeContextEXT;\nPFNGLXGETCONTEXTIDEXTPROC glad_glXGetContextIDEXT;\nPFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC glad_glXQueryCurrentRendererIntegerMESA;\nPFNGLXCHOOSEFBCONFIGPROC glad_glXChooseFBConfig;\nPFNGLXBINDCHANNELTOWINDOWSGIXPROC glad_glXBindChannelToWindowSGIX;\nPFNGLXCHANNELRECTSYNCSGIXPROC glad_glXChannelRectSyncSGIX;\nPFNGLXIMPORTCONTEXTEXTPROC glad_glXImportContextEXT;\nPFNGLXRELEASEBUFFERSMESAPROC glad_glXReleaseBuffersMESA;\nPFNGLXCREATEPIXMAPPROC glad_glXCreatePixmap;\nPFNGLXGETAGPOFFSETMESAPROC glad_glXGetAGPOffsetMESA;\n\n\nstatic void load_GLX_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_VERSION_1_0) return;\n    glXWaitGL = (PFNGLXWAITGLPROC) load(\"glXWaitGL\", userptr);\n    glXWaitX = (PFNGLXWAITXPROC) load(\"glXWaitX\", userptr);\n    glXGetConfig = (PFNGLXGETCONFIGPROC) load(\"glXGetConfig\", userptr);\n    glXQueryVersion = (PFNGLXQUERYVERSIONPROC) load(\"glXQueryVersion\", userptr);\n    glXCreateContext = (PFNGLXCREATECONTEXTPROC) load(\"glXCreateContext\", userptr);\n    glXQueryExtension = (PFNGLXQUERYEXTENSIONPROC) load(\"glXQueryExtension\", userptr);\n    glXGetCurrentContext = (PFNGLXGETCURRENTCONTEXTPROC) load(\"glXGetCurrentContext\", userptr);\n    glXMakeCurrent = (PFNGLXMAKECURRENTPROC) load(\"glXMakeCurrent\", userptr);\n    glXCopyContext = (PFNGLXCOPYCONTEXTPROC) load(\"glXCopyContext\", userptr);\n    glXIsDirect = (PFNGLXISDIRECTPROC) load(\"glXIsDirect\", userptr);\n    glXCreateGLXPixmap = (PFNGLXCREATEGLXPIXMAPPROC) load(\"glXCreateGLXPixmap\", userptr);\n    glXGetCurrentDrawable = (PFNGLXGETCURRENTDRAWABLEPROC) load(\"glXGetCurrentDrawable\", userptr);\n    glXUseXFont = (PFNGLXUSEXFONTPROC) load(\"glXUseXFont\", userptr);\n    glXChooseVisual = (PFNGLXCHOOSEVISUALPROC) load(\"glXChooseVisual\", userptr);\n    glXDestroyContext = (PFNGLXDESTROYCONTEXTPROC) load(\"glXDestroyContext\", userptr);\n    glXDestroyGLXPixmap = (PFNGLXDESTROYGLXPIXMAPPROC) load(\"glXDestroyGLXPixmap\", userptr);\n    glXSwapBuffers = (PFNGLXSWAPBUFFERSPROC) load(\"glXSwapBuffers\", userptr);\n}\nstatic void load_GLX_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_VERSION_1_1) return;\n    glXQueryServerString = (PFNGLXQUERYSERVERSTRINGPROC) load(\"glXQueryServerString\", userptr);\n    glXGetClientString = (PFNGLXGETCLIENTSTRINGPROC) load(\"glXGetClientString\", userptr);\n    glXQueryExtensionsString = (PFNGLXQUERYEXTENSIONSSTRINGPROC) load(\"glXQueryExtensionsString\", userptr);\n}\nstatic void load_GLX_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_VERSION_1_2) return;\n    glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC) load(\"glXGetCurrentDisplay\", userptr);\n}\nstatic void load_GLX_VERSION_1_3( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_VERSION_1_3) return;\n    glXQueryContext = (PFNGLXQUERYCONTEXTPROC) load(\"glXQueryContext\", userptr);\n    glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC) load(\"glXGetFBConfigs\", userptr);\n    glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC) load(\"glXDestroyPixmap\", userptr);\n    glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC) load(\"glXCreateNewContext\", userptr);\n    glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC) load(\"glXGetCurrentReadDrawable\", userptr);\n    glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC) load(\"glXMakeContextCurrent\", userptr);\n    glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC) load(\"glXDestroyWindow\", userptr);\n    glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC) load(\"glXChooseFBConfig\", userptr);\n    glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC) load(\"glXCreatePixmap\", userptr);\n    glXSelectEvent = (PFNGLXSELECTEVENTPROC) load(\"glXSelectEvent\", userptr);\n    glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC) load(\"glXGetFBConfigAttrib\", userptr);\n    glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC) load(\"glXDestroyPbuffer\", userptr);\n    glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC) load(\"glXCreatePbuffer\", userptr);\n    glXCreateWindow = (PFNGLXCREATEWINDOWPROC) load(\"glXCreateWindow\", userptr);\n    glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC) load(\"glXGetSelectedEvent\", userptr);\n    glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC) load(\"glXQueryDrawable\", userptr);\n    glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC) load(\"glXGetVisualFromFBConfig\", userptr);\n}\nstatic void load_GLX_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_VERSION_1_4) return;\n    glXGetProcAddress = (PFNGLXGETPROCADDRESSPROC) load(\"glXGetProcAddress\", userptr);\n}\nstatic void load_GLX_MESA_copy_sub_buffer( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_MESA_copy_sub_buffer) return;\n    glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC) load(\"glXCopySubBufferMESA\", userptr);\n}\nstatic void load_GLX_SGIX_pbuffer( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_SGIX_pbuffer) return;\n    glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC) load(\"glXDestroyGLXPbufferSGIX\", userptr);\n    glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC) load(\"glXQueryGLXPbufferSGIX\", userptr);\n    glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC) load(\"glXCreateGLXPbufferSGIX\", userptr);\n    glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC) load(\"glXGetSelectedEventSGIX\", userptr);\n    glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC) load(\"glXSelectEventSGIX\", userptr);\n}\nstatic void load_GLX_SGI_make_current_read( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_SGI_make_current_read) return;\n    glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC) load(\"glXGetCurrentReadDrawableSGI\", userptr);\n    glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC) load(\"glXMakeCurrentReadSGI\", userptr);\n}\nstatic void load_GLX_OML_sync_control( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_OML_sync_control) return;\n    glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC) load(\"glXWaitForMscOML\", userptr);\n    glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC) load(\"glXGetSyncValuesOML\", userptr);\n    glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC) load(\"glXWaitForSbcOML\", userptr);\n    glXSwapBuffersMscOML = (PFNGLXSWAPBUFFERSMSCOMLPROC) load(\"glXSwapBuffersMscOML\", userptr);\n    glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC) load(\"glXGetMscRateOML\", userptr);\n}\nstatic void load_GLX_SGIX_hyperpipe( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_SGIX_hyperpipe) return;\n    glXQueryHyperpipeBestAttribSGIX = (PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) load(\"glXQueryHyperpipeBestAttribSGIX\", userptr);\n    glXQueryHyperpipeAttribSGIX = (PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) load(\"glXQueryHyperpipeAttribSGIX\", userptr);\n    glXDestroyHyperpipeConfigSGIX = (PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) load(\"glXDestroyHyperpipeConfigSGIX\", userptr);\n    glXHyperpipeConfigSGIX = (PFNGLXHYPERPIPECONFIGSGIXPROC) load(\"glXHyperpipeConfigSGIX\", userptr);\n    glXHyperpipeAttribSGIX = (PFNGLXHYPERPIPEATTRIBSGIXPROC) load(\"glXHyperpipeAttribSGIX\", userptr);\n    glXQueryHyperpipeConfigSGIX = (PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) load(\"glXQueryHyperpipeConfigSGIX\", userptr);\n    glXQueryHyperpipeNetworkSGIX = (PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) load(\"glXQueryHyperpipeNetworkSGIX\", userptr);\n    glXBindHyperpipeSGIX = (PFNGLXBINDHYPERPIPESGIXPROC) load(\"glXBindHyperpipeSGIX\", userptr);\n}\nstatic void load_GLX_EXT_swap_control( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_EXT_swap_control) return;\n    glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC) load(\"glXSwapIntervalEXT\", userptr);\n}\nstatic void load_GLX_MESA_pixmap_colormap( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_MESA_pixmap_colormap) return;\n    glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC) load(\"glXCreateGLXPixmapMESA\", userptr);\n}\nstatic void load_GLX_NV_video_capture( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_NV_video_capture) return;\n    glXQueryVideoCaptureDeviceNV = (PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC) load(\"glXQueryVideoCaptureDeviceNV\", userptr);\n    glXEnumerateVideoCaptureDevicesNV = (PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC) load(\"glXEnumerateVideoCaptureDevicesNV\", userptr);\n    glXBindVideoCaptureDeviceNV = (PFNGLXBINDVIDEOCAPTUREDEVICENVPROC) load(\"glXBindVideoCaptureDeviceNV\", userptr);\n    glXLockVideoCaptureDeviceNV = (PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC) load(\"glXLockVideoCaptureDeviceNV\", userptr);\n    glXReleaseVideoCaptureDeviceNV = (PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC) load(\"glXReleaseVideoCaptureDeviceNV\", userptr);\n}\nstatic void load_GLX_NV_swap_group( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_NV_swap_group) return;\n    glXQueryFrameCountNV = (PFNGLXQUERYFRAMECOUNTNVPROC) load(\"glXQueryFrameCountNV\", userptr);\n    glXQueryMaxSwapGroupsNV = (PFNGLXQUERYMAXSWAPGROUPSNVPROC) load(\"glXQueryMaxSwapGroupsNV\", userptr);\n    glXResetFrameCountNV = (PFNGLXRESETFRAMECOUNTNVPROC) load(\"glXResetFrameCountNV\", userptr);\n    glXJoinSwapGroupNV = (PFNGLXJOINSWAPGROUPNVPROC) load(\"glXJoinSwapGroupNV\", userptr);\n    glXBindSwapBarrierNV = (PFNGLXBINDSWAPBARRIERNVPROC) load(\"glXBindSwapBarrierNV\", userptr);\n    glXQuerySwapGroupNV = (PFNGLXQUERYSWAPGROUPNVPROC) load(\"glXQuerySwapGroupNV\", userptr);\n}\nstatic void load_GLX_EXT_texture_from_pixmap( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_EXT_texture_from_pixmap) return;\n    glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC) load(\"glXReleaseTexImageEXT\", userptr);\n    glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC) load(\"glXBindTexImageEXT\", userptr);\n}\nstatic void load_GLX_SUN_get_transparent_index( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_SUN_get_transparent_index) return;\n    glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC) load(\"glXGetTransparentIndexSUN\", userptr);\n}\nstatic void load_GLX_MESA_release_buffers( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_MESA_release_buffers) return;\n    glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC) load(\"glXReleaseBuffersMESA\", userptr);\n}\nstatic void load_GLX_NV_delay_before_swap( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_NV_delay_before_swap) return;\n    glXDelayBeforeSwapNV = (PFNGLXDELAYBEFORESWAPNVPROC) load(\"glXDelayBeforeSwapNV\", userptr);\n}\nstatic void load_GLX_MESA_agp_offset( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_MESA_agp_offset) return;\n    glXGetAGPOffsetMESA = (PFNGLXGETAGPOFFSETMESAPROC) load(\"glXGetAGPOffsetMESA\", userptr);\n}\nstatic void load_GLX_SGI_swap_control( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_SGI_swap_control) return;\n    glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC) load(\"glXSwapIntervalSGI\", userptr);\n}\nstatic void load_GLX_EXT_import_context( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_EXT_import_context) return;\n    glXGetCurrentDisplayEXT = (PFNGLXGETCURRENTDISPLAYEXTPROC) load(\"glXGetCurrentDisplayEXT\", userptr);\n    glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC) load(\"glXImportContextEXT\", userptr);\n    glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC) load(\"glXFreeContextEXT\", userptr);\n    glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC) load(\"glXGetContextIDEXT\", userptr);\n    glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC) load(\"glXQueryContextInfoEXT\", userptr);\n}\nstatic void load_GLX_SGI_video_sync( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_SGI_video_sync) return;\n    glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC) load(\"glXGetVideoSyncSGI\", userptr);\n    glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC) load(\"glXWaitVideoSyncSGI\", userptr);\n}\nstatic void load_GLX_SGI_cushion( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_SGI_cushion) return;\n    glXCushionSGI = (PFNGLXCUSHIONSGIPROC) load(\"glXCushionSGI\", userptr);\n}\nstatic void load_GLX_SGIX_fbconfig( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_SGIX_fbconfig) return;\n    glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC) load(\"glXGetFBConfigAttribSGIX\", userptr);\n    glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) load(\"glXCreateGLXPixmapWithConfigSGIX\", userptr);\n    glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) load(\"glXCreateContextWithConfigSGIX\", userptr);\n    glXGetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) load(\"glXGetVisualFromFBConfigSGIX\", userptr);\n    glXChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC) load(\"glXChooseFBConfigSGIX\", userptr);\n    glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) load(\"glXGetFBConfigFromVisualSGIX\", userptr);\n}\nstatic void load_GLX_NV_copy_buffer( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_NV_copy_buffer) return;\n    glXNamedCopyBufferSubDataNV = (PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC) load(\"glXNamedCopyBufferSubDataNV\", userptr);\n    glXCopyBufferSubDataNV = (PFNGLXCOPYBUFFERSUBDATANVPROC) load(\"glXCopyBufferSubDataNV\", userptr);\n}\nstatic void load_GLX_ARB_create_context( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_ARB_create_context) return;\n    glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC) load(\"glXCreateContextAttribsARB\", userptr);\n}\nstatic void load_GLX_AMD_gpu_association( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_AMD_gpu_association) return;\n    glXCreateAssociatedContextAttribsAMD = (PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) load(\"glXCreateAssociatedContextAttribsAMD\", userptr);\n    glXBlitContextFramebufferAMD = (PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC) load(\"glXBlitContextFramebufferAMD\", userptr);\n    glXGetCurrentAssociatedContextAMD = (PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC) load(\"glXGetCurrentAssociatedContextAMD\", userptr);\n    glXGetContextGPUIDAMD = (PFNGLXGETCONTEXTGPUIDAMDPROC) load(\"glXGetContextGPUIDAMD\", userptr);\n    glXMakeAssociatedContextCurrentAMD = (PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) load(\"glXMakeAssociatedContextCurrentAMD\", userptr);\n    glXGetGPUIDsAMD = (PFNGLXGETGPUIDSAMDPROC) load(\"glXGetGPUIDsAMD\", userptr);\n    glXCreateAssociatedContextAMD = (PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC) load(\"glXCreateAssociatedContextAMD\", userptr);\n    glXDeleteAssociatedContextAMD = (PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC) load(\"glXDeleteAssociatedContextAMD\", userptr);\n    glXGetGPUInfoAMD = (PFNGLXGETGPUINFOAMDPROC) load(\"glXGetGPUInfoAMD\", userptr);\n}\nstatic void load_GLX_MESA_query_renderer( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_MESA_query_renderer) return;\n    glXQueryCurrentRendererStringMESA = (PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC) load(\"glXQueryCurrentRendererStringMESA\", userptr);\n    glXQueryCurrentRendererIntegerMESA = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC) load(\"glXQueryCurrentRendererIntegerMESA\", userptr);\n    glXQueryRendererStringMESA = (PFNGLXQUERYRENDERERSTRINGMESAPROC) load(\"glXQueryRendererStringMESA\", userptr);\n    glXQueryRendererIntegerMESA = (PFNGLXQUERYRENDERERINTEGERMESAPROC) load(\"glXQueryRendererIntegerMESA\", userptr);\n}\nstatic void load_GLX_MESA_swap_control( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_MESA_swap_control) return;\n    glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC) load(\"glXGetSwapIntervalMESA\", userptr);\n    glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC) load(\"glXSwapIntervalMESA\", userptr);\n}\nstatic void load_GLX_SGIX_video_resize( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_SGIX_video_resize) return;\n    glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC) load(\"glXBindChannelToWindowSGIX\", userptr);\n    glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC) load(\"glXChannelRectSyncSGIX\", userptr);\n    glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC) load(\"glXQueryChannelDeltasSGIX\", userptr);\n    glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC) load(\"glXQueryChannelRectSGIX\", userptr);\n    glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC) load(\"glXChannelRectSGIX\", userptr);\n}\nstatic void load_GLX_NV_video_out( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_NV_video_out) return;\n    glXGetVideoInfoNV = (PFNGLXGETVIDEOINFONVPROC) load(\"glXGetVideoInfoNV\", userptr);\n    glXSendPbufferToVideoNV = (PFNGLXSENDPBUFFERTOVIDEONVPROC) load(\"glXSendPbufferToVideoNV\", userptr);\n    glXReleaseVideoImageNV = (PFNGLXRELEASEVIDEOIMAGENVPROC) load(\"glXReleaseVideoImageNV\", userptr);\n    glXBindVideoImageNV = (PFNGLXBINDVIDEOIMAGENVPROC) load(\"glXBindVideoImageNV\", userptr);\n    glXReleaseVideoDeviceNV = (PFNGLXRELEASEVIDEODEVICENVPROC) load(\"glXReleaseVideoDeviceNV\", userptr);\n    glXGetVideoDeviceNV = (PFNGLXGETVIDEODEVICENVPROC) load(\"glXGetVideoDeviceNV\", userptr);\n}\nstatic void load_GLX_MESA_set_3dfx_mode( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_MESA_set_3dfx_mode) return;\n    glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC) load(\"glXSet3DfxModeMESA\", userptr);\n}\nstatic void load_GLX_ARB_get_proc_address( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_ARB_get_proc_address) return;\n    glXGetProcAddressARB = (PFNGLXGETPROCADDRESSARBPROC) load(\"glXGetProcAddressARB\", userptr);\n}\nstatic void load_GLX_NV_copy_image( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_NV_copy_image) return;\n    glXCopyImageSubDataNV = (PFNGLXCOPYIMAGESUBDATANVPROC) load(\"glXCopyImageSubDataNV\", userptr);\n}\nstatic void load_GLX_NV_present_video( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_NV_present_video) return;\n    glXBindVideoDeviceNV = (PFNGLXBINDVIDEODEVICENVPROC) load(\"glXBindVideoDeviceNV\", userptr);\n    glXEnumerateVideoDevicesNV = (PFNGLXENUMERATEVIDEODEVICESNVPROC) load(\"glXEnumerateVideoDevicesNV\", userptr);\n}\nstatic void load_GLX_SGIX_swap_barrier( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_SGIX_swap_barrier) return;\n    glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC) load(\"glXBindSwapBarrierSGIX\", userptr);\n    glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) load(\"glXQueryMaxSwapBarriersSGIX\", userptr);\n}\nstatic void load_GLX_SGIX_swap_group( GLADuserptrloadfunc load, void* userptr) {\n    if(!GLAD_GLX_SGIX_swap_group) return;\n    glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC) load(\"glXJoinSwapGroupSGIX\", userptr);\n}\n\n\n\nstatic int has_ext(Display *display, int screen, const char *ext) {\n    const char *terminator;\n    const char *loc;\n    const char *extensions;\n\n    if(!GLAD_GLX_VERSION_1_1)\n        return 0;\n\n    extensions = glXQueryExtensionsString(display, screen);\n\n    if(extensions == NULL || ext == NULL)\n        return 0;\n\n    while(1) {\n        loc = strstr(extensions, ext);\n        if(loc == NULL)\n            break;\n\n        terminator = loc + strlen(ext);\n        if((loc == extensions || *(loc - 1) == ' ') &&\n            (*terminator == ' ' || *terminator == '\\0'))\n        {\n            return 1;\n        }\n        extensions = terminator;\n    }\n\n    return 0;\n}\n\nstatic GLADapiproc glad_glx_get_proc_from_userptr(const char* name, void *userptr) {\n    return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name);\n}\n\nstatic int find_extensionsGLX(Display *display, int screen) {\n    GLAD_GLX_MESA_copy_sub_buffer = has_ext(display, screen, \"GLX_MESA_copy_sub_buffer\");\n    GLAD_GLX_EXT_create_context_es_profile = has_ext(display, screen, \"GLX_EXT_create_context_es_profile\");\n    GLAD_GLX_SGIX_pbuffer = has_ext(display, screen, \"GLX_SGIX_pbuffer\");\n    GLAD_GLX_SGI_make_current_read = has_ext(display, screen, \"GLX_SGI_make_current_read\");\n    GLAD_GLX_OML_sync_control = has_ext(display, screen, \"GLX_OML_sync_control\");\n    GLAD_GLX_SGIX_hyperpipe = has_ext(display, screen, \"GLX_SGIX_hyperpipe\");\n    GLAD_GLX_INTEL_swap_event = has_ext(display, screen, \"GLX_INTEL_swap_event\");\n    GLAD_GLX_EXT_swap_control = has_ext(display, screen, \"GLX_EXT_swap_control\");\n    GLAD_GLX_NV_robustness_video_memory_purge = has_ext(display, screen, \"GLX_NV_robustness_video_memory_purge\");\n    GLAD_GLX_MESA_pixmap_colormap = has_ext(display, screen, \"GLX_MESA_pixmap_colormap\");\n    GLAD_GLX_ARB_fbconfig_float = has_ext(display, screen, \"GLX_ARB_fbconfig_float\");\n    GLAD_GLX_EXT_fbconfig_packed_float = has_ext(display, screen, \"GLX_EXT_fbconfig_packed_float\");\n    GLAD_GLX_OML_swap_method = has_ext(display, screen, \"GLX_OML_swap_method\");\n    GLAD_GLX_NV_video_capture = has_ext(display, screen, \"GLX_NV_video_capture\");\n    GLAD_GLX_ARB_robustness_application_isolation = has_ext(display, screen, \"GLX_ARB_robustness_application_isolation\");\n    GLAD_GLX_ARB_create_context_robustness = has_ext(display, screen, \"GLX_ARB_create_context_robustness\");\n    GLAD_GLX_EXT_visual_rating = has_ext(display, screen, \"GLX_EXT_visual_rating\");\n    GLAD_GLX_NV_swap_group = has_ext(display, screen, \"GLX_NV_swap_group\");\n    GLAD_GLX_EXT_texture_from_pixmap = has_ext(display, screen, \"GLX_EXT_texture_from_pixmap\");\n    GLAD_GLX_SUN_get_transparent_index = has_ext(display, screen, \"GLX_SUN_get_transparent_index\");\n    GLAD_GLX_MESA_release_buffers = has_ext(display, screen, \"GLX_MESA_release_buffers\");\n    GLAD_GLX_NV_delay_before_swap = has_ext(display, screen, \"GLX_NV_delay_before_swap\");\n    GLAD_GLX_EXT_buffer_age = has_ext(display, screen, \"GLX_EXT_buffer_age\");\n    GLAD_GLX_MESA_agp_offset = has_ext(display, screen, \"GLX_MESA_agp_offset\");\n    GLAD_GLX_EXT_visual_info = has_ext(display, screen, \"GLX_EXT_visual_info\");\n    GLAD_GLX_SGI_swap_control = has_ext(display, screen, \"GLX_SGI_swap_control\");\n    GLAD_GLX_EXT_import_context = has_ext(display, screen, \"GLX_EXT_import_context\");\n    GLAD_GLX_SGI_video_sync = has_ext(display, screen, \"GLX_SGI_video_sync\");\n    GLAD_GLX_3DFX_multisample = has_ext(display, screen, \"GLX_3DFX_multisample\");\n    GLAD_GLX_ARB_multisample = has_ext(display, screen, \"GLX_ARB_multisample\");\n    GLAD_GLX_EXT_framebuffer_sRGB = has_ext(display, screen, \"GLX_EXT_framebuffer_sRGB\");\n    GLAD_GLX_SGI_cushion = has_ext(display, screen, \"GLX_SGI_cushion\");\n    GLAD_GLX_ARB_robustness_share_group_isolation = has_ext(display, screen, \"GLX_ARB_robustness_share_group_isolation\");\n    GLAD_GLX_SGIX_fbconfig = has_ext(display, screen, \"GLX_SGIX_fbconfig\");\n    GLAD_GLX_NV_copy_buffer = has_ext(display, screen, \"GLX_NV_copy_buffer\");\n    GLAD_GLX_SGIX_visual_select_group = has_ext(display, screen, \"GLX_SGIX_visual_select_group\");\n    GLAD_GLX_EXT_swap_control_tear = has_ext(display, screen, \"GLX_EXT_swap_control_tear\");\n    GLAD_GLX_ARB_create_context = has_ext(display, screen, \"GLX_ARB_create_context\");\n    GLAD_GLX_AMD_gpu_association = has_ext(display, screen, \"GLX_AMD_gpu_association\");\n    GLAD_GLX_MESA_query_renderer = has_ext(display, screen, \"GLX_MESA_query_renderer\");\n    GLAD_GLX_EXT_create_context_es2_profile = has_ext(display, screen, \"GLX_EXT_create_context_es2_profile\");\n    GLAD_GLX_MESA_swap_control = has_ext(display, screen, \"GLX_MESA_swap_control\");\n    GLAD_GLX_SGIX_video_resize = has_ext(display, screen, \"GLX_SGIX_video_resize\");\n    GLAD_GLX_ARB_context_flush_control = has_ext(display, screen, \"GLX_ARB_context_flush_control\");\n    GLAD_GLX_NV_video_out = has_ext(display, screen, \"GLX_NV_video_out\");\n    GLAD_GLX_EXT_no_config_context = has_ext(display, screen, \"GLX_EXT_no_config_context\");\n    GLAD_GLX_SGIS_blended_overlay = has_ext(display, screen, \"GLX_SGIS_blended_overlay\");\n    GLAD_GLX_EXT_stereo_tree = has_ext(display, screen, \"GLX_EXT_stereo_tree\");\n    GLAD_GLX_ARB_create_context_no_error = has_ext(display, screen, \"GLX_ARB_create_context_no_error\");\n    GLAD_GLX_EXT_libglvnd = has_ext(display, screen, \"GLX_EXT_libglvnd\");\n    GLAD_GLX_ARB_create_context_profile = has_ext(display, screen, \"GLX_ARB_create_context_profile\");\n    GLAD_GLX_NV_float_buffer = has_ext(display, screen, \"GLX_NV_float_buffer\");\n    GLAD_GLX_MESA_set_3dfx_mode = has_ext(display, screen, \"GLX_MESA_set_3dfx_mode\");\n    GLAD_GLX_ARB_framebuffer_sRGB = has_ext(display, screen, \"GLX_ARB_framebuffer_sRGB\");\n    GLAD_GLX_ARB_get_proc_address = has_ext(display, screen, \"GLX_ARB_get_proc_address\");\n    GLAD_GLX_SGIS_shared_multisample = has_ext(display, screen, \"GLX_SGIS_shared_multisample\");\n    GLAD_GLX_NV_copy_image = has_ext(display, screen, \"GLX_NV_copy_image\");\n    GLAD_GLX_NV_present_video = has_ext(display, screen, \"GLX_NV_present_video\");\n    GLAD_GLX_SGIX_swap_barrier = has_ext(display, screen, \"GLX_SGIX_swap_barrier\");\n    GLAD_GLX_SGIS_multisample = has_ext(display, screen, \"GLX_SGIS_multisample\");\n    GLAD_GLX_SGIX_swap_group = has_ext(display, screen, \"GLX_SGIX_swap_group\");\n    GLAD_GLX_ARB_vertex_buffer_object = has_ext(display, screen, \"GLX_ARB_vertex_buffer_object\");\n    GLAD_GLX_NV_multisample_coverage = has_ext(display, screen, \"GLX_NV_multisample_coverage\");\n    return 1;\n}\n\nstatic int find_coreGLX(Display **display, int *screen) {\n    X11Struct x11;\n    initX11Struct(&x11);\n    int major = 0, minor = 0;\n    if(*display == NULL) {\n        *display = x11.XOpenDisplay(0);\n        if (*display == NULL) {\n            return 0;\n        }\n        *screen = x11.XScreenNumberOfScreen(x11.XDefaultScreenOfDisplay(*display));\n    }\n    glXQueryVersion(*display, &major, &minor);\n    GLAD_GLX_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;\n    GLAD_GLX_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1;\n    GLAD_GLX_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1;\n    GLAD_GLX_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1;\n    GLAD_GLX_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1;\n    return GLAD_MAKE_VERSION(major, minor);\n}\n\nint gladLoadGLXUserPtr(Display *display, int screen, GLADuserptrloadfunc load, void *userptr) {\n    int version;\n    glXQueryVersion = (PFNGLXQUERYVERSIONPROC) load(\"glXQueryVersion\", userptr);\n    if(glXQueryVersion == NULL) return 0;\n    version = find_coreGLX(&display, &screen);\n\n    load_GLX_VERSION_1_0(load, userptr);\n    load_GLX_VERSION_1_1(load, userptr);\n    load_GLX_VERSION_1_2(load, userptr);\n    load_GLX_VERSION_1_3(load, userptr);\n    load_GLX_VERSION_1_4(load, userptr);\n\n    if (!find_extensionsGLX(display, screen)) return 0;\n    load_GLX_MESA_copy_sub_buffer(load, userptr);\n    load_GLX_SGIX_pbuffer(load, userptr);\n    load_GLX_SGI_make_current_read(load, userptr);\n    load_GLX_OML_sync_control(load, userptr);\n    load_GLX_SGIX_hyperpipe(load, userptr);\n    load_GLX_EXT_swap_control(load, userptr);\n    load_GLX_MESA_pixmap_colormap(load, userptr);\n    load_GLX_NV_video_capture(load, userptr);\n    load_GLX_NV_swap_group(load, userptr);\n    load_GLX_EXT_texture_from_pixmap(load, userptr);\n    load_GLX_SUN_get_transparent_index(load, userptr);\n    load_GLX_MESA_release_buffers(load, userptr);\n    load_GLX_NV_delay_before_swap(load, userptr);\n    load_GLX_MESA_agp_offset(load, userptr);\n    load_GLX_SGI_swap_control(load, userptr);\n    load_GLX_EXT_import_context(load, userptr);\n    load_GLX_SGI_video_sync(load, userptr);\n    load_GLX_SGI_cushion(load, userptr);\n    load_GLX_SGIX_fbconfig(load, userptr);\n    load_GLX_NV_copy_buffer(load, userptr);\n    load_GLX_ARB_create_context(load, userptr);\n    load_GLX_AMD_gpu_association(load, userptr);\n    load_GLX_MESA_query_renderer(load, userptr);\n    load_GLX_MESA_swap_control(load, userptr);\n    load_GLX_SGIX_video_resize(load, userptr);\n    load_GLX_NV_video_out(load, userptr);\n    load_GLX_MESA_set_3dfx_mode(load, userptr);\n    load_GLX_ARB_get_proc_address(load, userptr);\n    load_GLX_NV_copy_image(load, userptr);\n    load_GLX_NV_present_video(load, userptr);\n    load_GLX_SGIX_swap_barrier(load, userptr);\n    load_GLX_SGIX_swap_group(load, userptr);\n\n    return version;\n}\n\nint gladLoadGLX(Display *display, int screen, GLADloadfunc load) {\n    return gladLoadGLXUserPtr(display, screen, glad_glx_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);\n}\n\n\n#ifdef GLAD_GLX\n\n#ifndef GLAD_LOADER_LIBRARY_C_\n#define GLAD_LOADER_LIBRARY_C_\n\n#include <stddef.h>\n#include <stdlib.h>\n\n#if GLAD_PLATFORM_WIN32\n#include <windows.h>\n#else\n#include <dlfcn.h>\n#endif\n\n\nstatic void* glad_get_dlopen_handle(const char *lib_names[], int length) {\n    void *handle = NULL;\n    int i;\n\n    for (i = 0; i < length; ++i) {\n#if GLAD_PLATFORM_WIN32\n  #if GLAD_PLATFORM_UWP\n        size_t buffer_size = (strlen(lib_names[i]) + 1) * sizeof(WCHAR);\n        LPWSTR buffer = (LPWSTR) malloc(buffer_size);\n        if (buffer != NULL) {\n            int ret = MultiByteToWideChar(CP_ACP, 0, lib_names[i], -1, buffer, buffer_size);\n            if (ret != 0) {\n                handle = (void*) LoadPackagedLibrary(buffer, 0);\n            }\n            free((void*) buffer);\n        }\n  #else\n        handle = (void*) LoadLibraryA(lib_names[i]);\n  #endif\n#else\n        handle = dlopen(lib_names[i], RTLD_LAZY | RTLD_LOCAL);\n#endif\n        if (handle != NULL) {\n            return handle;\n        }\n    }\n\n    return NULL;\n}\n\nstatic void glad_close_dlopen_handle(void* handle) {\n    if (handle != NULL) {\n#if GLAD_PLATFORM_WIN32\n        FreeLibrary((HMODULE) handle);\n#else\n        dlclose(handle);\n#endif\n    }\n}\n\nstatic GLADapiproc glad_dlsym_handle(void* handle, const char *name) {\n    if (handle == NULL) {\n        return NULL;\n    }\n\n#if GLAD_PLATFORM_WIN32\n    return (GLADapiproc) GetProcAddress((HMODULE) handle, name);\n#else\n    return GLAD_GNUC_EXTENSION (GLADapiproc) dlsym(handle, name);\n#endif\n}\n\n#endif /* GLAD_LOADER_LIBRARY_C_ */\n\ntypedef void* (GLAD_API_PTR *GLADglxprocaddrfunc)(const char*);\n\nstatic GLADapiproc glad_glx_get_proc(const char *name, void *userptr) {\n    return GLAD_GNUC_EXTENSION ((GLADapiproc (*)(const char *name)) userptr)(name);\n}\n\nstatic void* _glx_handle;\n\nint gladLoaderLoadGLX(Display *display, int screen) {\n    static const char *NAMES[] = {\n#if defined __CYGWIN__\n        \"libGL-1.so\",\n#endif\n        \"libGL.so.1\",\n        \"libGL.so\"\n    };\n\n    int version = 0;\n    int did_load = 0;\n    GLADglxprocaddrfunc loader;\n\n    if (_glx_handle == NULL) {\n        _glx_handle = glad_get_dlopen_handle(NAMES, sizeof(NAMES) / sizeof(NAMES[0]));\n        did_load = _glx_handle != NULL;\n    }\n\n    if (_glx_handle != NULL) {\n        loader = (GLADglxprocaddrfunc) glad_dlsym_handle(_glx_handle, \"glXGetProcAddressARB\");\n        if (loader != NULL) {\n            version = gladLoadGLXUserPtr(display, screen, glad_glx_get_proc, GLAD_GNUC_EXTENSION (void*) loader);\n        }\n\n        if (!version && did_load) {\n            glad_close_dlopen_handle(_glx_handle);\n            _glx_handle = NULL;\n        }\n    }\n\n    return version;\n}\n\nvoid gladLoaderUnloadGLX() {\n    if (_glx_handle != NULL) {\n        glad_close_dlopen_handle(_glx_handle);\n        _glx_handle = NULL;\n    }\n}\n\n#endif /* GLAD_GLX */\n"
  },
  {
    "path": "ycb_render/glad/linmath.h",
    "content": "#ifndef LINMATH_H\n#define LINMATH_H\n\n#include <math.h>\n\n#ifdef _MSC_VER\n#define inline __inline\n#endif\n\n#define LINMATH_H_DEFINE_VEC(n) \\\ntypedef float vec##n[n]; \\\nstatic inline void vec##n##_add(vec##n r, vec##n const a, vec##n const b) \\\n{ \\\n\tint i; \\\n\tfor(i=0; i<n; ++i) \\\n\t\tr[i] = a[i] + b[i]; \\\n} \\\nstatic inline void vec##n##_sub(vec##n r, vec##n const a, vec##n const b) \\\n{ \\\n\tint i; \\\n\tfor(i=0; i<n; ++i) \\\n\t\tr[i] = a[i] - b[i]; \\\n} \\\nstatic inline void vec##n##_scale(vec##n r, vec##n const v, float const s) \\\n{ \\\n\tint i; \\\n\tfor(i=0; i<n; ++i) \\\n\t\tr[i] = v[i] * s; \\\n} \\\nstatic inline float vec##n##_mul_inner(vec##n const a, vec##n const b) \\\n{ \\\n\tfloat p = 0.; \\\n\tint i; \\\n\tfor(i=0; i<n; ++i) \\\n\t\tp += b[i]*a[i]; \\\n\treturn p; \\\n} \\\nstatic inline float vec##n##_len(vec##n const v) \\\n{ \\\n\treturn (float) sqrt(vec##n##_mul_inner(v,v)); \\\n} \\\nstatic inline void vec##n##_norm(vec##n r, vec##n const v) \\\n{ \\\n\tfloat k = 1.f / vec##n##_len(v); \\\n\tvec##n##_scale(r, v, k); \\\n}\n\nLINMATH_H_DEFINE_VEC(2)\nLINMATH_H_DEFINE_VEC(3)\nLINMATH_H_DEFINE_VEC(4)\n\nstatic inline void vec3_mul_cross(vec3 r, vec3 const a, vec3 const b)\n{\n\tr[0] = a[1]*b[2] - a[2]*b[1];\n\tr[1] = a[2]*b[0] - a[0]*b[2];\n\tr[2] = a[0]*b[1] - a[1]*b[0];\n}\n\nstatic inline void vec3_reflect(vec3 r, vec3 const v, vec3 const n)\n{\n\tfloat p  = 2.f*vec3_mul_inner(v, n);\n\tint i;\n\tfor(i=0;i<3;++i)\n\t\tr[i] = v[i] - p*n[i];\n}\n\nstatic inline void vec4_mul_cross(vec4 r, vec4 a, vec4 b)\n{\n\tr[0] = a[1]*b[2] - a[2]*b[1];\n\tr[1] = a[2]*b[0] - a[0]*b[2];\n\tr[2] = a[0]*b[1] - a[1]*b[0];\n\tr[3] = 1.f;\n}\n\nstatic inline void vec4_reflect(vec4 r, vec4 v, vec4 n)\n{\n\tfloat p  = 2.f*vec4_mul_inner(v, n);\n\tint i;\n\tfor(i=0;i<4;++i)\n\t\tr[i] = v[i] - p*n[i];\n}\n\ntypedef vec4 mat4x4[4];\nstatic inline void mat4x4_identity(mat4x4 M)\n{\n\tint i, j;\n\tfor(i=0; i<4; ++i)\n\t\tfor(j=0; j<4; ++j)\n\t\t\tM[i][j] = i==j ? 1.f : 0.f;\n}\nstatic inline void mat4x4_dup(mat4x4 M, mat4x4 N)\n{\n\tint i, j;\n\tfor(i=0; i<4; ++i)\n\t\tfor(j=0; j<4; ++j)\n\t\t\tM[i][j] = N[i][j];\n}\nstatic inline void mat4x4_row(vec4 r, mat4x4 M, int i)\n{\n\tint k;\n\tfor(k=0; k<4; ++k)\n\t\tr[k] = M[k][i];\n}\nstatic inline void mat4x4_col(vec4 r, mat4x4 M, int i)\n{\n\tint k;\n\tfor(k=0; k<4; ++k)\n\t\tr[k] = M[i][k];\n}\nstatic inline void mat4x4_transpose(mat4x4 M, mat4x4 N)\n{\n\tint i, j;\n\tfor(j=0; j<4; ++j)\n\t\tfor(i=0; i<4; ++i)\n\t\t\tM[i][j] = N[j][i];\n}\nstatic inline void mat4x4_add(mat4x4 M, mat4x4 a, mat4x4 b)\n{\n\tint i;\n\tfor(i=0; i<4; ++i)\n\t\tvec4_add(M[i], a[i], b[i]);\n}\nstatic inline void mat4x4_sub(mat4x4 M, mat4x4 a, mat4x4 b)\n{\n\tint i;\n\tfor(i=0; i<4; ++i)\n\t\tvec4_sub(M[i], a[i], b[i]);\n}\nstatic inline void mat4x4_scale(mat4x4 M, mat4x4 a, float k)\n{\n\tint i;\n\tfor(i=0; i<4; ++i)\n\t\tvec4_scale(M[i], a[i], k);\n}\nstatic inline void mat4x4_scale_aniso(mat4x4 M, mat4x4 a, float x, float y, float z)\n{\n\tint i;\n\tvec4_scale(M[0], a[0], x);\n\tvec4_scale(M[1], a[1], y);\n\tvec4_scale(M[2], a[2], z);\n\tfor(i = 0; i < 4; ++i) {\n\t\tM[3][i] = a[3][i];\n\t}\n}\nstatic inline void mat4x4_mul(mat4x4 M, mat4x4 a, mat4x4 b)\n{\n\tmat4x4 temp;\n\tint k, r, c;\n\tfor(c=0; c<4; ++c) for(r=0; r<4; ++r) {\n\t\ttemp[c][r] = 0.f;\n\t\tfor(k=0; k<4; ++k)\n\t\t\ttemp[c][r] += a[k][r] * b[c][k];\n\t}\n\tmat4x4_dup(M, temp);\n}\nstatic inline void mat4x4_mul_vec4(vec4 r, mat4x4 M, vec4 v)\n{\n\tint i, j;\n\tfor(j=0; j<4; ++j) {\n\t\tr[j] = 0.f;\n\t\tfor(i=0; i<4; ++i)\n\t\t\tr[j] += M[i][j] * v[i];\n\t}\n}\nstatic inline void mat4x4_translate(mat4x4 T, float x, float y, float z)\n{\n\tmat4x4_identity(T);\n\tT[3][0] = x;\n\tT[3][1] = y;\n\tT[3][2] = z;\n}\nstatic inline void mat4x4_translate_in_place(mat4x4 M, float x, float y, float z)\n{\n\tvec4 t = {x, y, z, 0};\n\tvec4 r;\n\tint i;\n\tfor (i = 0; i < 4; ++i) {\n\t\tmat4x4_row(r, M, i);\n\t\tM[3][i] += vec4_mul_inner(r, t);\n\t}\n}\nstatic inline void mat4x4_from_vec3_mul_outer(mat4x4 M, vec3 a, vec3 b)\n{\n\tint i, j;\n\tfor(i=0; i<4; ++i) for(j=0; j<4; ++j)\n\t\tM[i][j] = i<3 && j<3 ? a[i] * b[j] : 0.f;\n}\nstatic inline void mat4x4_rotate(mat4x4 R, mat4x4 M, float x, float y, float z, float angle)\n{\n\tfloat s = sinf(angle);\n\tfloat c = cosf(angle);\n\tvec3 u = {x, y, z};\n\n\tif(vec3_len(u) > 1e-4) {\n\t\tmat4x4 T, C, S = {{0}};\n\n\t\tvec3_norm(u, u);\n\t\tmat4x4_from_vec3_mul_outer(T, u, u);\n\n\t\tS[1][2] =  u[0];\n\t\tS[2][1] = -u[0];\n\t\tS[2][0] =  u[1];\n\t\tS[0][2] = -u[1];\n\t\tS[0][1] =  u[2];\n\t\tS[1][0] = -u[2];\n\n\t\tmat4x4_scale(S, S, s);\n\n\t\tmat4x4_identity(C);\n\t\tmat4x4_sub(C, C, T);\n\n\t\tmat4x4_scale(C, C, c);\n\n\t\tmat4x4_add(T, T, C);\n\t\tmat4x4_add(T, T, S);\n\n\t\tT[3][3] = 1.;\n\t\tmat4x4_mul(R, M, T);\n\t} else {\n\t\tmat4x4_dup(R, M);\n\t}\n}\nstatic inline void mat4x4_rotate_X(mat4x4 Q, mat4x4 M, float angle)\n{\n\tfloat s = sinf(angle);\n\tfloat c = cosf(angle);\n\tmat4x4 R = {\n\t\t{1.f, 0.f, 0.f, 0.f},\n\t\t{0.f,   c,   s, 0.f},\n\t\t{0.f,  -s,   c, 0.f},\n\t\t{0.f, 0.f, 0.f, 1.f}\n\t};\n\tmat4x4_mul(Q, M, R);\n}\nstatic inline void mat4x4_rotate_Y(mat4x4 Q, mat4x4 M, float angle)\n{\n\tfloat s = sinf(angle);\n\tfloat c = cosf(angle);\n\tmat4x4 R = {\n\t\t{   c, 0.f,   s, 0.f},\n\t\t{ 0.f, 1.f, 0.f, 0.f},\n\t\t{  -s, 0.f,   c, 0.f},\n\t\t{ 0.f, 0.f, 0.f, 1.f}\n\t};\n\tmat4x4_mul(Q, M, R);\n}\nstatic inline void mat4x4_rotate_Z(mat4x4 Q, mat4x4 M, float angle)\n{\n\tfloat s = sinf(angle);\n\tfloat c = cosf(angle);\n\tmat4x4 R = {\n\t\t{   c,   s, 0.f, 0.f},\n\t\t{  -s,   c, 0.f, 0.f},\n\t\t{ 0.f, 0.f, 1.f, 0.f},\n\t\t{ 0.f, 0.f, 0.f, 1.f}\n\t};\n\tmat4x4_mul(Q, M, R);\n}\nstatic inline void mat4x4_invert(mat4x4 T, mat4x4 M)\n{\n\tfloat idet;\n\tfloat s[6];\n\tfloat c[6];\n\ts[0] = M[0][0]*M[1][1] - M[1][0]*M[0][1];\n\ts[1] = M[0][0]*M[1][2] - M[1][0]*M[0][2];\n\ts[2] = M[0][0]*M[1][3] - M[1][0]*M[0][3];\n\ts[3] = M[0][1]*M[1][2] - M[1][1]*M[0][2];\n\ts[4] = M[0][1]*M[1][3] - M[1][1]*M[0][3];\n\ts[5] = M[0][2]*M[1][3] - M[1][2]*M[0][3];\n\n\tc[0] = M[2][0]*M[3][1] - M[3][0]*M[2][1];\n\tc[1] = M[2][0]*M[3][2] - M[3][0]*M[2][2];\n\tc[2] = M[2][0]*M[3][3] - M[3][0]*M[2][3];\n\tc[3] = M[2][1]*M[3][2] - M[3][1]*M[2][2];\n\tc[4] = M[2][1]*M[3][3] - M[3][1]*M[2][3];\n\tc[5] = M[2][2]*M[3][3] - M[3][2]*M[2][3];\n\n\t/* Assumes it is invertible */\n\tidet = 1.0f/( s[0]*c[5]-s[1]*c[4]+s[2]*c[3]+s[3]*c[2]-s[4]*c[1]+s[5]*c[0] );\n\n\tT[0][0] = ( M[1][1] * c[5] - M[1][2] * c[4] + M[1][3] * c[3]) * idet;\n\tT[0][1] = (-M[0][1] * c[5] + M[0][2] * c[4] - M[0][3] * c[3]) * idet;\n\tT[0][2] = ( M[3][1] * s[5] - M[3][2] * s[4] + M[3][3] * s[3]) * idet;\n\tT[0][3] = (-M[2][1] * s[5] + M[2][2] * s[4] - M[2][3] * s[3]) * idet;\n\n\tT[1][0] = (-M[1][0] * c[5] + M[1][2] * c[2] - M[1][3] * c[1]) * idet;\n\tT[1][1] = ( M[0][0] * c[5] - M[0][2] * c[2] + M[0][3] * c[1]) * idet;\n\tT[1][2] = (-M[3][0] * s[5] + M[3][2] * s[2] - M[3][3] * s[1]) * idet;\n\tT[1][3] = ( M[2][0] * s[5] - M[2][2] * s[2] + M[2][3] * s[1]) * idet;\n\n\tT[2][0] = ( M[1][0] * c[4] - M[1][1] * c[2] + M[1][3] * c[0]) * idet;\n\tT[2][1] = (-M[0][0] * c[4] + M[0][1] * c[2] - M[0][3] * c[0]) * idet;\n\tT[2][2] = ( M[3][0] * s[4] - M[3][1] * s[2] + M[3][3] * s[0]) * idet;\n\tT[2][3] = (-M[2][0] * s[4] + M[2][1] * s[2] - M[2][3] * s[0]) * idet;\n\n\tT[3][0] = (-M[1][0] * c[3] + M[1][1] * c[1] - M[1][2] * c[0]) * idet;\n\tT[3][1] = ( M[0][0] * c[3] - M[0][1] * c[1] + M[0][2] * c[0]) * idet;\n\tT[3][2] = (-M[3][0] * s[3] + M[3][1] * s[1] - M[3][2] * s[0]) * idet;\n\tT[3][3] = ( M[2][0] * s[3] - M[2][1] * s[1] + M[2][2] * s[0]) * idet;\n}\nstatic inline void mat4x4_orthonormalize(mat4x4 R, mat4x4 M)\n{\n\tfloat s = 1.;\n\tvec3 h;\n\n\tmat4x4_dup(R, M);\n\tvec3_norm(R[2], R[2]);\n\n\ts = vec3_mul_inner(R[1], R[2]);\n\tvec3_scale(h, R[2], s);\n\tvec3_sub(R[1], R[1], h);\n\tvec3_norm(R[2], R[2]);\n\n\ts = vec3_mul_inner(R[1], R[2]);\n\tvec3_scale(h, R[2], s);\n\tvec3_sub(R[1], R[1], h);\n\tvec3_norm(R[1], R[1]);\n\n\ts = vec3_mul_inner(R[0], R[1]);\n\tvec3_scale(h, R[1], s);\n\tvec3_sub(R[0], R[0], h);\n\tvec3_norm(R[0], R[0]);\n}\n\nstatic inline void mat4x4_frustum(mat4x4 M, float l, float r, float b, float t, float n, float f)\n{\n\tM[0][0] = 2.f*n/(r-l);\n\tM[0][1] = M[0][2] = M[0][3] = 0.f;\n\n\tM[1][1] = 2.f*n/(t-b);\n\tM[1][0] = M[1][2] = M[1][3] = 0.f;\n\n\tM[2][0] = (r+l)/(r-l);\n\tM[2][1] = (t+b)/(t-b);\n\tM[2][2] = -(f+n)/(f-n);\n\tM[2][3] = -1.f;\n\n\tM[3][2] = -2.f*(f*n)/(f-n);\n\tM[3][0] = M[3][1] = M[3][3] = 0.f;\n}\nstatic inline void mat4x4_ortho(mat4x4 M, float l, float r, float b, float t, float n, float f)\n{\n\tM[0][0] = 2.f/(r-l);\n\tM[0][1] = M[0][2] = M[0][3] = 0.f;\n\n\tM[1][1] = 2.f/(t-b);\n\tM[1][0] = M[1][2] = M[1][3] = 0.f;\n\n\tM[2][2] = -2.f/(f-n);\n\tM[2][0] = M[2][1] = M[2][3] = 0.f;\n\n\tM[3][0] = -(r+l)/(r-l);\n\tM[3][1] = -(t+b)/(t-b);\n\tM[3][2] = -(f+n)/(f-n);\n\tM[3][3] = 1.f;\n}\nstatic inline void mat4x4_perspective(mat4x4 m, float y_fov, float aspect, float n, float f)\n{\n\t/* NOTE: Degrees are an unhandy unit to work with.\n\t * linmath.h uses radians for everything! */\n\tfloat const a = 1.f / (float) tan(y_fov / 2.f);\n\n\tm[0][0] = a / aspect;\n\tm[0][1] = 0.f;\n\tm[0][2] = 0.f;\n\tm[0][3] = 0.f;\n\n\tm[1][0] = 0.f;\n\tm[1][1] = a;\n\tm[1][2] = 0.f;\n\tm[1][3] = 0.f;\n\n\tm[2][0] = 0.f;\n\tm[2][1] = 0.f;\n\tm[2][2] = -((f + n) / (f - n));\n\tm[2][3] = -1.f;\n\n\tm[3][0] = 0.f;\n\tm[3][1] = 0.f;\n\tm[3][2] = -((2.f * f * n) / (f - n));\n\tm[3][3] = 0.f;\n}\nstatic inline void mat4x4_look_at(mat4x4 m, vec3 eye, vec3 center, vec3 up)\n{\n\t/* Adapted from Android's OpenGL Matrix.java.                        */\n\t/* See the OpenGL GLUT documentation for gluLookAt for a description */\n\t/* of the algorithm. We implement it in a straightforward way:       */\n\n\t/* TODO: The negation of of can be spared by swapping the order of\n\t *       operands in the following cross products in the right way. */\n\tvec3 f;\n\tvec3 s;\n\tvec3 t;\n\n\tvec3_sub(f, center, eye);\n\tvec3_norm(f, f);\n\n\tvec3_mul_cross(s, f, up);\n\tvec3_norm(s, s);\n\n\tvec3_mul_cross(t, s, f);\n\n\tm[0][0] =  s[0];\n\tm[0][1] =  t[0];\n\tm[0][2] = -f[0];\n\tm[0][3] =   0.f;\n\n\tm[1][0] =  s[1];\n\tm[1][1] =  t[1];\n\tm[1][2] = -f[1];\n\tm[1][3] =   0.f;\n\n\tm[2][0] =  s[2];\n\tm[2][1] =  t[2];\n\tm[2][2] = -f[2];\n\tm[2][3] =   0.f;\n\n\tm[3][0] =  0.f;\n\tm[3][1] =  0.f;\n\tm[3][2] =  0.f;\n\tm[3][3] =  1.f;\n\n\tmat4x4_translate_in_place(m, -eye[0], -eye[1], -eye[2]);\n}\n\ntypedef float quat[4];\nstatic inline void quat_identity(quat q)\n{\n\tq[0] = q[1] = q[2] = 0.f;\n\tq[3] = 1.f;\n}\nstatic inline void quat_add(quat r, quat a, quat b)\n{\n\tint i;\n\tfor(i=0; i<4; ++i)\n\t\tr[i] = a[i] + b[i];\n}\nstatic inline void quat_sub(quat r, quat a, quat b)\n{\n\tint i;\n\tfor(i=0; i<4; ++i)\n\t\tr[i] = a[i] - b[i];\n}\nstatic inline void quat_mul(quat r, quat p, quat q)\n{\n\tvec3 w;\n\tvec3_mul_cross(r, p, q);\n\tvec3_scale(w, p, q[3]);\n\tvec3_add(r, r, w);\n\tvec3_scale(w, q, p[3]);\n\tvec3_add(r, r, w);\n\tr[3] = p[3]*q[3] - vec3_mul_inner(p, q);\n}\nstatic inline void quat_scale(quat r, quat v, float s)\n{\n\tint i;\n\tfor(i=0; i<4; ++i)\n\t\tr[i] = v[i] * s;\n}\nstatic inline float quat_inner_product(quat a, quat b)\n{\n\tfloat p = 0.f;\n\tint i;\n\tfor(i=0; i<4; ++i)\n\t\tp += b[i]*a[i];\n\treturn p;\n}\nstatic inline void quat_conj(quat r, quat q)\n{\n\tint i;\n\tfor(i=0; i<3; ++i)\n\t\tr[i] = -q[i];\n\tr[3] = q[3];\n}\nstatic inline void quat_rotate(quat r, float angle, vec3 axis) {\n\tint i;\n\tvec3 v;\n\tvec3_scale(v, axis, sinf(angle / 2));\n\tfor(i=0; i<3; ++i)\n\t\tr[i] = v[i];\n\tr[3] = cosf(angle / 2);\n}\n#define quat_norm vec4_norm\nstatic inline void quat_mul_vec3(vec3 r, quat q, vec3 v)\n{\n/*\n * Method by Fabian 'ryg' Giessen (of Farbrausch)\nt = 2 * cross(q.xyz, v)\nv' = v + q.w * t + cross(q.xyz, t)\n */\n\tvec3 t = {q[0], q[1], q[2]};\n\tvec3 u = {q[0], q[1], q[2]};\n\n\tvec3_mul_cross(t, t, v);\n\tvec3_scale(t, t, 2);\n\n\tvec3_mul_cross(u, u, t);\n\tvec3_scale(t, t, q[3]);\n\n\tvec3_add(r, v, t);\n\tvec3_add(r, r, u);\n}\nstatic inline void mat4x4_from_quat(mat4x4 M, quat q)\n{\n\tfloat a = q[3];\n\tfloat b = q[0];\n\tfloat c = q[1];\n\tfloat d = q[2];\n\tfloat a2 = a*a;\n\tfloat b2 = b*b;\n\tfloat c2 = c*c;\n\tfloat d2 = d*d;\n\n\tM[0][0] = a2 + b2 - c2 - d2;\n\tM[0][1] = 2.f*(b*c + a*d);\n\tM[0][2] = 2.f*(b*d - a*c);\n\tM[0][3] = 0.f;\n\n\tM[1][0] = 2*(b*c - a*d);\n\tM[1][1] = a2 - b2 + c2 - d2;\n\tM[1][2] = 2.f*(c*d + a*b);\n\tM[1][3] = 0.f;\n\n\tM[2][0] = 2.f*(b*d + a*c);\n\tM[2][1] = 2.f*(c*d - a*b);\n\tM[2][2] = a2 - b2 - c2 + d2;\n\tM[2][3] = 0.f;\n\n\tM[3][0] = M[3][1] = M[3][2] = 0.f;\n\tM[3][3] = 1.f;\n}\n\nstatic inline void mat4x4o_mul_quat(mat4x4 R, mat4x4 M, quat q)\n{\n/*  XXX: The way this is written only works for othogonal matrices. */\n/* TODO: Take care of non-orthogonal case. */\n\tquat_mul_vec3(R[0], q, M[0]);\n\tquat_mul_vec3(R[1], q, M[1]);\n\tquat_mul_vec3(R[2], q, M[2]);\n\n\tR[3][0] = R[3][1] = R[3][2] = 0.f;\n\tR[3][3] = 1.f;\n}\nstatic inline void quat_from_mat4x4(quat q, mat4x4 M)\n{\n\tfloat r=0.f;\n\tint i;\n\n\tint perm[] = { 0, 1, 2, 0, 1 };\n\tint *p = perm;\n\n\tfor(i = 0; i<3; i++) {\n\t\tfloat m = M[i][i];\n\t\tif( m < r )\n\t\t\tcontinue;\n\t\tm = r;\n\t\tp = &perm[i];\n\t}\n\n\tr = (float) sqrt(1.f + M[p[0]][p[0]] - M[p[1]][p[1]] - M[p[2]][p[2]] );\n\n\tif(r < 1e-6) {\n\t\tq[0] = 1.f;\n\t\tq[1] = q[2] = q[3] = 0.f;\n\t\treturn;\n\t}\n\n\tq[0] = r/2.f;\n\tq[1] = (M[p[0]][p[1]] - M[p[1]][p[0]])/(2.f*r);\n\tq[2] = (M[p[2]][p[0]] - M[p[0]][p[2]])/(2.f*r);\n\tq[3] = (M[p[2]][p[1]] - M[p[1]][p[2]])/(2.f*r);\n}\n\n#endif\n"
  },
  {
    "path": "ycb_render/glutils/__init__.py",
    "content": ""
  },
  {
    "path": "ycb_render/glutils/_trackball.py",
    "content": "# -*- coding: utf-8 -*-\n#\n# Copyright (c)  2014 Nicolas Rougier\n#                2008 Roger Allen\n#                1993, 1994, Silicon Graphics, Inc.\n# ALL RIGHTS RESERVED\n# Permission to use, copy, modify, and distribute this software for\n# any purpose and without fee is hereby granted, provided that the above\n# copyright notice appear in all copies and that both the copyright notice\n# and this permission notice appear in supporting documentation, and that\n# the name of Silicon Graphics, Inc. not be used in advertising\n# or publicity pertaining to distribution of the software without specific,\n# written prior permission.\n#\n# THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU \"AS-IS\"\n# AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,\n# INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR\n# FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON\n# GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,\n# SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY\n# KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,\n# LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF\n# THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN\n# ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON\n# ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE\n# POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.\n#\n# US Government Users Restricted Rights\n# Use, duplication, or disclosure by the Government is subject to\n# restrictions set forth in FAR 52.227.19(c)(2) or subparagraph\n# (c)(1)(ii) of the Rights in Technical Data and Computer Software\n# clause at DFARS 252.227-7013 and/or in similar or successor\n# clauses in the FAR or the DOD or NASA FAR Supplement.\n# Unpublished-- rights reserved under the copyright laws of the\n# United States.  Contractor/manufacturer is Silicon Graphics,\n# Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.\n#\n# Originally implemented by Gavin Bell, lots of ideas from Thant Tessman\n# and the August '88 issue of Siggraph's \"Computer Graphics,\" pp. 121-129.\n# and David M. Ciemiewicz, Mark Grossman, Henry Moreton, and Paul Haeberli\n#\n# Note: See the following for more information on quaternions:\n#\n# - Shoemake, K., Animating rotation with quaternion curves, Computer\n#   Graphics 19, No 3 (Proc. SIGGRAPH'85), 245-254, 1985.\n# - Pletinckx, D., Quaternion calculus as a basic tool in computer\n#   graphics, The Visual Computer 5, 2-13, 1989.\n# -----------------------------------------------------------------------------\n''' Provides a virtual trackball for 3D scene viewing\n\nExample usage:\n\n   trackball = Trackball(45,30)\n\n   @window.event\n   def on_mouse_drag(x, y, dx, dy, button):\n       trackball.drag(x,y,dx,dy)\n\n   @window.event\n   def on_resize(width,height):\n       glViewport(0, 0, window.width, window.height)\n       glMatrixMode(GL_PROJECTION)\n       glLoadIdentity()\n       gluPerspective(45, window.width / float(window.height), .1, 1000)\n       glMatrixMode (GL_MODELVIEW)\n       glLoadIdentity ()\n       glTranslatef (0, 0, -3)\n       glMultMatrixf(trackball.model)\n\nYou can also set trackball orientation directly by setting theta and phi value\nexpressed in degrees. Theta relates to the rotation angle around X axis while\nphi relates to the rotation angle around Z axis.\n'''\nimport math\nimport numpy as np\n\n\n# Some useful functions on vectors\n# -----------------------------------------------------------------------------\ndef _v_add(v1, v2):\n    return [v1[0]+v2[0], v1[1]+v2[1], v1[2]+v2[2]]\ndef _v_sub(v1, v2):\n    return [v1[0]-v2[0], v1[1]-v2[1], v1[2]-v2[2]]\ndef _v_mul(v, s):\n    return [v[0]*s, v[1]*s, v[2]*s]\ndef _v_dot(v1, v2):\n    return v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2]\ndef _v_cross(v1, v2):\n    return [(v1[1]*v2[2]) - (v1[2]*v2[1]),\n            (v1[2]*v2[0]) - (v1[0]*v2[2]),\n            (v1[0]*v2[1]) - (v1[1]*v2[0])]\ndef _v_length(v):\n    return math.sqrt(_v_dot(v,v))\ndef _v_normalize(v):\n    try:                      return _v_mul(v,1.0/_v_length(v))\n    except ZeroDivisionError: return v\n\n# Some useful functions on quaternions\n# -----------------------------------------------------------------------------\ndef _q_add(q1,q2):\n    t1 = _v_mul(q1, q2[3])\n    t2 = _v_mul(q2, q1[3])\n    t3 = _v_cross(q2, q1)\n    tf = _v_add(t1, t2)\n    tf = _v_add(t3, tf)\n    tf.append(q1[3]*q2[3]-_v_dot(q1,q2))\n    return tf\ndef _q_mul(q, s):\n    return [q[0]*s, q[1]*s, q[2]*s, q[3]*s]\ndef _q_dot(q1, q2):\n    return q1[0]*q2[0] + q1[1]*q2[1] + q1[2]*q2[2] + q1[3]*q2[3]\ndef _q_length(q):\n    return math.sqrt(_q_dot(q,q))\ndef _q_normalize(q):\n    try:                      return _q_mul(q,1.0/_q_length(q))\n    except ZeroDivisionError: return q\ndef _q_from_axis_angle(v, phi):\n    q = _v_mul(_v_normalize(v), math.sin(phi/2.0))\n    q.append(math.cos(phi/2.0))\n    return q\ndef _q_rotmatrix(q):\n    m = np.zeros(16,np.float32)\n    m[0*4+0] = 1.0 - 2.0*(q[1]*q[1] + q[2]*q[2])\n    m[0*4+1] = 2.0 * (q[0]*q[1] - q[2]*q[3])\n    m[0*4+2] = 2.0 * (q[2]*q[0] + q[1]*q[3])\n    m[0*4+3] = 0.0\n    m[1*4+0] = 2.0 * (q[0]*q[1] + q[2]*q[3])\n    m[1*4+1] = 1.0 - 2.0*(q[2]*q[2] + q[0]*q[0])\n    m[1*4+2] = 2.0 * (q[1]*q[2] - q[0]*q[3])\n    m[1*4+3] = 0.0\n    m[2*4+0] = 2.0 * (q[2]*q[0] - q[1]*q[3])\n    m[2*4+1] = 2.0 * (q[1]*q[2] + q[0]*q[3])\n    m[2*4+2] = 1.0 - 2.0*(q[1]*q[1] + q[0]*q[0])\n    m[3*4+3] = 1.0\n    return m.reshape(4,4)\n\n\n\nclass Trackball(object):\n    \"\"\" Virtual trackball for 3D scene viewing \"\"\"\n\n    def __init__(self, theta=0, phi=0):\n        \"\"\" Build a new trackball with specified view \"\"\"\n\n        self._rotation = [0,0,0,1]\n        self._count = 0\n        self._model = np.zeros((4,4),np.float32)\n        self._RENORMCOUNT = 97\n        self._TRACKBALLSIZE = 0.8\n        self._set_orientation(theta,phi)\n        self._x = 0.0\n        self._y = 0.0\n\n    def drag_to (self, x, y, dx, dy):\n        \"\"\" Move trackball view from x,y to x+dx,y+dy. \"\"\"\n\n        q = self._rotate(x,y,dx,dy)\n        self._rotation = _q_add(q,self._rotation)\n        self._count += 1\n        if self._count > self._RENORMCOUNT:\n            self._rotation = _q_normalize(self._rotation)\n            self._count = 0\n        self._model = _q_rotmatrix(self._rotation)\n\n    @property\n    def model(self):\n        \"\"\" Model transformation (read-only) \"\"\"\n        return self._model\n\n    @property\n    def theta(self):\n        \"\"\" Angle (in degrees) around the z axis \"\"\"\n        self._theta, _ = self._get_orientation()\n        return self._theta\n\n    @theta.setter\n    def theta(self, theta):\n        self._set_orientation(math.fmod(theta,360.0),\n                              math.fmod(self._phi,360.0))\n\n    @property\n    def phi(self):\n        \"\"\" Angle (in degrees) around the x axis \"\"\"\n        _, self._phi = self._get_orientation()\n        return self._phi\n\n    @phi.setter\n    def phi(self, phi):\n        self._set_orientation(math.fmod(self._theta,360.),\n                              math.fmod(phi,360.0))\n\n\n    def _get_orientation(self):\n        ''' Return current computed orientation (theta,phi). '''\n\n        q0,q1,q2,q3 = self._rotation\n        ax = math.atan(2*(q0*q1+q2*q3)/(1-2*(q1*q1+q2*q2)))*180.0/math.pi\n        az = math.atan(2*(q0*q3+q1*q2)/(1-2*(q2*q2+q3*q3)))*180.0/math.pi\n        return -az,ax\n\n    def _set_orientation(self, theta, phi):\n        ''' Computes rotation corresponding to theta and phi. '''\n\n        self._theta = theta\n        self._phi = phi\n        angle = self._theta*(math.pi/180.0)\n        sine = math.sin(0.5*angle)\n        xrot = [1*sine, 0, 0, math.cos(0.5*angle)]\n        angle = self._phi*(math.pi/180.0)\n        sine = math.sin(0.5*angle);\n        zrot = [0, 0, sine, math.cos(0.5*angle)]\n        self._rotation = _q_add(xrot, zrot)\n        self._model = _q_rotmatrix(self._rotation)\n\n\n    def _project(self, r, x, y):\n        ''' Project an x,y pair onto a sphere of radius r OR a hyperbolic sheet\n            if we are away from the center of the sphere.\n        '''\n\n        d = math.sqrt(x*x + y*y)\n        if (d < r * 0.70710678118654752440):    # Inside sphere\n            z = math.sqrt(r*r - d*d)\n        else:                                   # On hyperbola\n            t = r / 1.41421356237309504880\n            z = t*t / d\n        return z\n\n\n    def _rotate(self, x, y, dx, dy):\n        ''' Simulate a track-ball.\n\n            Project the points onto the virtual trackball, then figure out the\n            axis of rotation, which is the cross product of x,y and x+dx,y+dy.\n\n            Note: This is a deformed trackball-- this is a trackball in the\n            center, but is deformed into a hyperbolic sheet of rotation away\n            from the center.  This particular function was chosen after trying\n            out several variations.\n        '''\n\n        if not dx and not dy:\n            return [ 0.0, 0.0, 0.0, 1.0]\n        last = [x, y,       self._project(self._TRACKBALLSIZE, x, y)]\n        new  = [x+dx, y+dy, self._project(self._TRACKBALLSIZE, x+dx, y+dy)]\n        a = _v_cross(new, last)\n        d = _v_sub(last, new)\n        t = _v_length(d) / (2.0*self._TRACKBALLSIZE)\n        if (t > 1.0): t = 1.0\n        if (t < -1.0): t = -1.0\n        phi = 2.0 * math.asin(t)\n        return _q_from_axis_angle(a,phi)\n"
  },
  {
    "path": "ycb_render/glutils/glcontext.py",
    "content": "\"\"\"Headless GPU-accelerated OpenGL context creation on Google Colaboratory.\n\nTypical usage:\n\n    # Optional PyOpenGL configuratiopn can be done here.\n    # import OpenGL\n    # OpenGL.ERROR_CHECKING = True\n\n    # 'glcontext' must be imported before any OpenGL.* API.\n    from lucid.misc.gl.glcontext import create_opengl_context\n\n    # Now it's safe to import OpenGL and EGL functions\n    import OpenGL.GL as gl\n\n    # create_opengl_context() creates a GL context that is attached to an\n    # offscreen surface of the specified size. Note that rendering to buffers\n    # of other sizes and formats is still possible with OpenGL Framebuffers.\n    #\n    # Users are expected to directly use the EGL API in case more advanced\n    # context management is required.\n    width, height = 640, 480\n    create_opengl_context((width, height))\n\n    # OpenGL context is available here.\n\n\"\"\"\n\nfrom __future__ import print_function\n\n# pylint: disable=unused-import,g-import-not-at-top,g-statement-before-imports\n\nimport os\n\nos.environ['PYOPENGL_PLATFORM'] = 'egl'\n\ntry:\n  import OpenGL\nexcept:\n  print('This module depends on PyOpenGL.')\n  print('Please run \"\\033[1m!pip install -q pyopengl\\033[0m\" '\n        'prior importing this module.')\n  raise\n\nimport ctypes\nfrom ctypes import pointer\nfrom ctypes import util\nfrom ctypes.util import find_library\n\n# OpenGL loading workaround.\n#\n# * PyOpenGL tries to load libGL, but we need libOpenGL, see [1,2].\n#   This could have been solved by a symlink libGL->libOpenGL, but:\n#\n# * Python 2.7 can't find libGL and linEGL due to a bug (see [3])\n#   in ctypes.util, that was only wixed in Python 3.6.\n#\n# So, the only solution I've found is to monkeypatch ctypes.util\n# [1] https://devblogs.nvidia.com/egl-eye-opengl-visualization-without-x-server/\n# [2] https://devblogs.nvidia.com/linking-opengl-server-side-rendering/\n# [3] https://bugs.python.org/issue9998\n_find_library_old = ctypes.util.find_library\ntry:\n\n  def _find_library_new(name):\n    return {\n        'GL': 'libOpenGL.so',\n        'EGL': 'libEGL.so',\n    }.get(name, _find_library_old(name))\n  ctypes.util.find_library = _find_library_new\n  import OpenGL.GL as gl\n  import OpenGL.EGL as egl\nexcept:\n  print('Unable to load OpenGL libraries. '\n        'Make sure you use GPU-enabled backend.')\n  print('Press \"Runtime->Change runtime type\" and set '\n        '\"Hardware accelerator\" to GPU.')\n  raise\nfinally:\n  ctypes.util.find_library = _find_library_old\n\n\nclass Context:\n    def __init__(self):\n        pass\n\n    def create_opengl_context(self, surface_size=(640, 480)):\n        \"\"\"Create offscreen OpenGL context and make it current.\n\n        Users are expected to directly use EGL API in case more advanced\n        context management is required.\n\n        Args:\n        surface_size: (width, height), size of the offscreen rendering surface.\n        \"\"\"\n        egl_display = egl.eglGetDisplay(egl.EGL_DEFAULT_DISPLAY)\n\n        major, minor = egl.EGLint(), egl.EGLint()\n        egl.eglInitialize(egl_display, pointer(major), pointer(minor))\n\n        config_attribs = [\n          egl.EGL_SURFACE_TYPE, egl.EGL_PBUFFER_BIT, egl.EGL_BLUE_SIZE, 8,\n          egl.EGL_GREEN_SIZE, 8, egl.EGL_RED_SIZE, 8, egl.EGL_DEPTH_SIZE, 24,\n          egl.EGL_RENDERABLE_TYPE, egl.EGL_OPENGL_BIT, egl.EGL_NONE\n        ]\n        # if need MSAA https://www.khronos.org/opengl/wiki/Multisampling\n        config_attribs = (egl.EGLint * len(config_attribs))(*config_attribs)\n\n        num_configs = egl.EGLint()\n        egl_cfg = egl.EGLConfig()\n        egl.eglChooseConfig(egl_display, config_attribs, pointer(egl_cfg), 1,\n                          pointer(num_configs))\n\n        width, height = surface_size\n        pbuffer_attribs = [\n          egl.EGL_WIDTH,\n          width,\n          egl.EGL_HEIGHT,\n          height,\n          egl.EGL_NONE,\n        ]\n        pbuffer_attribs = (egl.EGLint * len(pbuffer_attribs))(*pbuffer_attribs)\n        egl_surf = egl.eglCreatePbufferSurface(egl_display, egl_cfg, pbuffer_attribs)\n\n        egl.eglBindAPI(egl.EGL_OPENGL_API)\n\n        egl_context = egl.eglCreateContext(egl_display, egl_cfg, egl.EGL_NO_CONTEXT,\n                                         None)\n        egl.eglMakeCurrent(egl_display, egl_surf, egl_surf, egl_context)\n        self.display = egl_display\n\n    def destroy(self):\n        egl.eglTerminate(self.display)\n"
  },
  {
    "path": "ycb_render/glutils/glrenderer.py",
    "content": "\"\"\"OpenGL Mesh rendering utils.\"\"\"\n\nfrom contextlib import contextmanager\nimport numpy as np\n\nimport OpenGL.GL as gl\n\nfrom .meshutil import perspective\nfrom PIL import Image\nimport numpy as np\n\n\nclass GLObject(object):\n    def __del__(self):\n        self.release()\n\n    def __enter__(self):\n        bind_func, const = self._bind\n        bind_func(const, self)\n\n    def __exit__(self, *args):\n        bind_func, const = self._bind\n        bind_func(const, 0)\n\n\nclass FBO(GLObject):\n    _bind = gl.glBindFramebuffer, gl.GL_FRAMEBUFFER\n\n    def __init__(self):\n        self._as_parameter_ = gl.glGenFramebuffers(1)\n\n    def release(self):\n        gl.glDeleteFramebuffers(1, [self._as_parameter_])\n\n\nclass Texture(GLObject):\n    _bind = gl.glBindTexture, gl.GL_TEXTURE_2D\n\n    def __init__(self):\n        self._as_parameter_ = gl.glGenTextures(1)\n\n    def release(self):\n        gl.glDeleteTextures([self._as_parameter_])\n\n\nclass Shader(GLObject):\n\n    def __init__(self, vp_code, fp_code):\n        # Importing here, when gl context is already present.\n        # Otherwise get expection on Python3 because of PyOpenGL bug.\n        from OpenGL.GL import shaders\n        self._as_parameter_ = self._shader = shaders.compileProgram(\n            shaders.compileShader(vp_code, gl.GL_VERTEX_SHADER),\n            shaders.compileShader(fp_code, gl.GL_FRAGMENT_SHADER)\n        )\n        self._uniforms = {}\n\n    def release(self):\n        gl.glDeleteProgram(self._as_parameter_)\n\n    def __getitem__(self, uniform_name):\n        if uniform_name not in self._uniforms:\n            self._uniforms[uniform_name] = gl.glGetUniformLocation(self, uniform_name)\n        return self._uniforms[uniform_name]\n\n    def __enter__(self):\n        return self._shader.__enter__()\n\n    def __exit__(self, *args):\n        return self._shader.__exit__(*args)\n\n\nclass MeshRenderer(object):\n    def __init__(self, size):\n        self.size = size\n        self.fbo = FBO()\n        self.color_tex = Texture()\n        self.depth_tex = Texture()\n        w, h = size\n\n        with self.color_tex:\n            gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA32F, w, h, 0,\n                            gl.GL_RGBA, gl.GL_FLOAT, None)\n\n        with self.depth_tex:\n            gl.glTexImage2D.wrappedOperation(\n                gl.GL_TEXTURE_2D, 0, gl.GL_DEPTH24_STENCIL8, w, h, 0,\n                gl.GL_DEPTH_STENCIL, gl.GL_UNSIGNED_INT_24_8, None)\n\n        with self.fbo:\n            gl.glFramebufferTexture2D(gl.GL_FRAMEBUFFER, gl.GL_COLOR_ATTACHMENT0,\n                                      gl.GL_TEXTURE_2D, self.color_tex, 0)\n            gl.glFramebufferTexture2D(gl.GL_FRAMEBUFFER, gl.GL_DEPTH_STENCIL_ATTACHMENT,\n                                      gl.GL_TEXTURE_2D, self.depth_tex, 0)\n            gl.glViewport(0, 0, w, h)\n            assert gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER) == gl.GL_FRAMEBUFFER_COMPLETE\n\n        self.shader = Shader(vp_code='''\n      #version 130\n      uniform mat4 MVP;\n      in vec4 data;\n      out vec4 aData;\n\n      void main() {\n        aData = data;\n        gl_Position = MVP * gl_Vertex;\n      }\n    ''',\n                             fp_code='''\n      #version 130\n      in vec4 aData;\n      out vec4 fragColor;\n      void main() {\n        fragColor = aData;\n      }\n    ''')\n\n        self.fovy = 10.0\n        self.aspect = 1.0 * w / h\n        self.znear, self.zfar = 0.01, 100.0\n\n    @contextmanager\n    def _bind_attrib(self, i, arr):\n        if arr is None:\n            yield\n            return\n        arr = np.ascontiguousarray(arr, np.float32)\n        coord_n = arr.shape[-1]\n        gl.glEnableVertexAttribArray(i)\n        gl.glVertexAttribPointer(i, coord_n, gl.GL_FLOAT, gl.GL_FALSE, 0, arr)\n        yield\n        gl.glDisableVertexAttribArray(i)\n\n    def proj_matrix(self):\n        return perspective(self.fovy, self.aspect, self.znear, self.zfar)\n\n    def render_mesh(self, position, uv, face=None,\n                    clear_color=[0, 0, 0, 0],\n                    modelview=np.eye(4)):\n        MVP = modelview.T.dot(self.proj_matrix())\n        MVP = np.ascontiguousarray(MVP, np.float32)\n        position = np.ascontiguousarray(position, np.float32)\n        with self.fbo:\n            gl.glClearColor(*clear_color)\n            gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)\n\n            with self.shader, self._bind_attrib(0, position), self._bind_attrib(1, uv):\n                gl.glUniformMatrix4fv(self.shader['MVP'], 1, gl.GL_FALSE, MVP)\n                gl.glEnable(gl.GL_DEPTH_TEST)\n                if face is not None:\n                    face = np.ascontiguousarray(face, np.uint32)\n                    gl.glDrawElements(gl.GL_TRIANGLES, face.size, gl.GL_UNSIGNED_INT, face)\n                else:\n                    vert_n = position.size // position.shape[-1]\n                    gl.glDrawArrays(gl.GL_TRIANGLES, 0, vert_n)\n\n                gl.glDisable(gl.GL_DEPTH_TEST)\n\n            w, h = self.size\n            frame = gl.glReadPixels(0, 0, w, h, gl.GL_RGBA, gl.GL_FLOAT)\n            # from IPython import embed; embed()\n\n            frame = frame.reshape(h, w, 4)  # fix PyOpenGL bug\n            # frame = frame.repeat(4, axis=2)\n            # frame = (1 - frame) * 100\n            frame = frame[::-1, ::-1]  # verical flip to match GL convention\n            return frame\n\n    def loadTexture(self, path):\n        img = Image.open(path).transpose(Image.FLIP_TOP_BOTTOM)\n        img_data = np.fromstring(img.tostring(), np.uint8)\n        width, height = img.size\n\n        # glTexImage2D expects the first element of the image data to be the\n        # bottom-left corner of the image.  Subsequent elements go left to right,\n        # with subsequent lines going from bottom to top.\n\n        # However, the image data was created with PIL Image tostring and numpy's\n        # fromstring, which means we have to do a bit of reorganization. The first\n        # element in the data output by tostring() will be the top-left corner of\n        # the image, with following values going left-to-right and lines going\n        # top-to-bottom.  So, we need to flip the vertical coordinate (y).\n        texture = gl.glGenTextures(1)\n        gl.glPixelStorei(gl.GL_UNPACK_ALIGNMENT, 1)\n        gl.glBindTexture(gl.GL_TEXTURE_2D, texture)\n        gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR)\n        gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR_MIPMAP_LINEAR)\n        gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_CLAMP_TO_EDGE)\n        gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_CLAMP_TO_EDGE)\n        gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, width, height, 0,\n                        gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, img_data)\n        gl.glGenerateMipmap(gl.GL_TEXTURE_2D)\n        return texture\n"
  },
  {
    "path": "ycb_render/glutils/meshutil.py",
    "content": "\"\"\"3D mesh manipulation utilities.\"\"\"\n\nfrom builtins import str\nfrom collections import OrderedDict\nimport numpy as np\nfrom transforms3d import quaternions\nfrom transforms3d.quaternions import axangle2quat, mat2quat, quat2mat\n\ndef frustum(left, right, bottom, top, znear, zfar):\n    \"\"\"Create view frustum matrix.\"\"\"\n    assert right != left\n    assert bottom != top\n    assert znear != zfar\n\n    M = np.zeros((4, 4), dtype=np.float32)\n    M[0, 0] = +2.0 * znear / (right - left)\n    M[2, 0] = (right + left) / (right - left)\n    M[1, 1] = +2.0 * znear / (top - bottom)\n    M[3, 1] = (top + bottom) / (top - bottom)\n    M[2, 2] = -(zfar + znear) / (zfar - znear)\n    M[3, 2] = -2.0 * znear * zfar / (zfar - znear)\n    M[2, 3] = -1.0\n    return M\n\n\ndef perspective(fovy, aspect, znear, zfar):\n    \"\"\"Create perspective projection matrix.\"\"\"\n    assert znear != zfar\n    h = np.tan(fovy / 360.0 * np.pi) * znear\n    w = h * aspect\n    return frustum(-w, w, -h, h, znear, zfar)\n\n\ndef anorm(x, axis=None, keepdims=False):\n    \"\"\"Compute L2 norms alogn specified axes.\"\"\"\n    return np.sqrt((x * x).sum(axis=axis, keepdims=keepdims))\n\n\ndef normalize(v, axis=None, eps=1e-10):\n    \"\"\"L2 Normalize along specified axes.\"\"\"\n    return v / max(anorm(v, axis=axis, keepdims=True), eps)\n\n\ndef lookat(eye, target=[0, 0, 0], up=[0, 1, 0]):\n    \"\"\"Generate LookAt modelview matrix.\"\"\"\n    eye = np.float32(eye)\n    forward = normalize(target - eye)\n    side = normalize(np.cross(forward, up))\n    up = np.cross(side, forward)\n    M = np.eye(4, dtype=np.float32)\n    R = M[:3, :3]\n    R[:] = [side, up, -forward]\n    M[:3, 3] = -R.dot(eye)\n    return M\n\n\ndef sample_view(min_dist, max_dist=None):\n    '''Sample random camera position.\n\n  Sample origin directed camera position in given distance\n  range from the origin. ModelView matrix is returned.\n  '''\n    if max_dist is None:\n        max_dist = min_dist\n    dist = np.random.uniform(min_dist, max_dist)\n    eye = np.random.normal(size=3)\n    eye = normalize(eye) * dist\n    return lookat(eye)\n\n\ndef homotrans(M, p):\n    p = np.asarray(p)\n    if p.shape[-1] == M.shape[1] - 1:\n        p = np.append(p, np.ones_like(p[..., :1]), -1)\n    p = np.dot(p, M.T)\n    return p[..., :-1] / p[..., -1:]\n\n\ndef _parse_vertex_tuple(s):\n    \"\"\"Parse vertex indices in '/' separated form (like 'i/j/k', 'i//k' ...).\"\"\"\n    vt = [0, 0, 0]\n    for i, c in enumerate(s.split('/')):\n        if c:\n            vt[i] = int(c)\n    return tuple(vt)\n\n\ndef _unify_rows(a):\n    \"\"\"Unify lengths of each row of a.\"\"\"\n    lens = np.fromiter(map(len, a), np.int32)\n    if not (lens[0] == lens).all():\n        out = np.zeros((len(a), lens.max()), np.float32)\n        for i, row in enumerate(a):\n            out[i, :lens[i]] = row\n    else:\n        out = np.float32(a)\n    return out\n\n\ndef load_obj(fn):\n    \"\"\"Load 3d mesh form .obj' file.\n\n  Args:\n    fn: Input file name or file-like object.\n\n  Returns:\n    dictionary with the following keys (some of which may be missing):\n      position: np.float32, (n, 3) array, vertex positions\n      uv: np.float32, (n, 2) array, vertex uv coordinates\n      normal: np.float32, (n, 3) array, vertex uv normals\n      face: np.int32, (k*3,) traingular face indices\n  \"\"\"\n    position = [np.zeros(3, dtype=np.float32)]\n    normal = [np.zeros(3, dtype=np.float32)]\n    uv = [np.zeros(2, dtype=np.float32)]\n\n    tuple2idx = OrderedDict()\n    trinagle_indices = []\n\n    input_file = open(fn) if isinstance(fn, str) else fn\n    for line in input_file:\n        line = line.strip()\n        if not line or line[0] == '#':\n            continue\n        line = line.split(' ', 1)\n        tag = line[0]\n        if len(line) > 1:\n            line = line[1]\n        else:\n            line = ''\n        if tag == 'v':\n            position.append(np.fromstring(line, sep=' '))\n        elif tag == 'vt':\n            uv.append(np.fromstring(line, sep=' '))\n        elif tag == 'vn':\n            normal.append(np.fromstring(line, sep=' '))\n        elif tag == 'f':\n            output_face_indices = []\n            for chunk in line.split():\n                # tuple order: pos_idx, uv_idx, normal_idx\n                vt = _parse_vertex_tuple(chunk)\n                if vt not in tuple2idx:  # create a new output vertex?\n                    tuple2idx[vt] = len(tuple2idx)\n                output_face_indices.append(tuple2idx[vt])\n            # generate face triangles\n            for i in range(1, len(output_face_indices) - 1):\n                for vi in [0, i, i + 1]:\n                    trinagle_indices.append(output_face_indices[vi])\n\n    outputs = {}\n    outputs['face'] = np.int32(trinagle_indices)\n    pos_idx, uv_idx, normal_idx = np.int32(list(tuple2idx)).T\n    if np.any(pos_idx):\n        outputs['position'] = _unify_rows(position)[pos_idx]\n    if np.any(uv_idx):\n        outputs['uv'] = _unify_rows(uv)[uv_idx]\n    if np.any(normal_idx):\n        outputs['normal'] = _unify_rows(normal)[normal_idx]\n    return outputs\n\ndef normalize_mesh(mesh):\n    '''Scale mesh to fit into -1..1 cube'''\n    mesh = dict(mesh)\n    pos = mesh['position'][:, :3].copy()\n    pos -= (pos.max(0) + pos.min(0)) / 2.0\n    pos /= np.abs(pos).max()\n    mesh['position'] = pos\n    return mesh\n\ndef quat2rotmat(quat):\n    quat_mat = np.eye(4)\n    quat_mat[:3,:3] = quaternions.quat2mat(quat)\n    return quat_mat\n\ndef mat2rotmat(mat):\n    quat_mat = np.eye(4)\n    quat_mat[:3,:3] = mat\n    return quat_mat\n\ndef quat2rotmat(quat):\n    quat_mat = np.eye(4)\n    quat_mat[:3,:3] = quaternions.quat2mat(quat)\n    return quat_mat\n\ndef xyz2mat(xyz):\n    trans_mat = np.eye(4)\n    trans_mat[-1, :3] = xyz\n    return trans_mat\n\ndef mat2xyz(mat):\n    xyz = mat[-1,:3]\n    xyz[np.isnan(xyz)] = 0\n    return xyz\n\ndef safemat2quat(mat):\n    quat = np.array([1,0,0,0])\n    try:\n        quat = mat2quat(mat)\n    except:\n        pass\n    quat[np.isnan(quat)] = 0\n    return quat\n\ndef unpack_pose(pose):\n    unpacked = np.eye(4)\n    unpacked[:3, :3] = quat2mat(pose[3:])\n    unpacked[:3, 3] = pose[:3]\n    return unpacked\n\ndef pack_pose(pose): \n    packed = np.zeros(7)\n    packed[:3] = pose[:3, 3]\n    packed[3:] = safemat2quat(pose[:3, :3])\n    return packed\n"
  },
  {
    "path": "ycb_render/glutils/trackball.py",
    "content": "# -----------------------------------------------------------------------------\n# Copyright (c) 2009-2016 Nicolas P. Rougier. All rights reserved.\n# Distributed under the (new) BSD License.\n# -----------------------------------------------------------------------------\nimport numpy as np\nfrom . import _trackball\nimport platform\nif platform.python_version().startswith('3'):\n    from .meshutil import *\nelse:\n    from meshutil import *\nclass Trackball():\n    \"\"\"\n    3D trackball transform\n\n    :param float aspect:\n       Indicate what is the aspect ratio of the object displayed. This is\n       necessary to convert pixel drag move in oject space coordinates.\n       Default is None.\n\n    :param float znear:\n       Near clip plane. Default is 2.\n\n    :param float zfar: \n       Distance clip plane. Default is 1000.\n\n    :param float theta:\n       Angle (in degrees) around the z axis. Default is 45.\n\n    :param float phi: \n       Angle (in degrees) around the x axis. Default is 45.\n\n    :param float distance:\n       Distance from the trackball to the object.  Default is 8.\n\n    :param float zoom:\n           Zoom level. Default is 35.\n\n    The trackball transform simulates a virtual trackball (3D) that can rotate\n    around the origin using intuitive mouse gestures.\n\n    The transform is connected to the following events:\n\n      * ``on_attach``: Transform initialization\n      * ``on_resize``: Tranform update to maintain aspect\n      * ``on_mouse_scroll``: Zoom in & out (user action)\n      * ``on_mouse_grab``: Drag (user action)\n\n    **Usage example**:\n\n      .. code:: python\n\n         vertex = '''\n         attribute vec2 position;\n         void main()\n         {\n             gl_Position = <transform>(vec4(position, 0.0, 1.0));\n         } '''\n\n         ...\n         window = app.Window(width=800, height=800)\n         program = gloo.Program(vertex, fragment, count=4)\n         ...\n         program['transform'] = Trackball(aspect=1)\n         window.attach(program['transform'])\n         ...\n    \"\"\"\n\n    aliases = { \"view\"       : \"trackball_view\",\n                \"model\"      : \"trackball_model\",\n                \"projection\" : \"trackball_projection\" }\n\n    def __init__(self, width, height, cam_pos=[0,0,2.0]):\n        \"\"\"\n        Initialize the transform.\n        \"\"\"\n        self._aspect = 1\n        self._znear = 0.2\n        self._zfar = 6.0\n        theta = 45\n        phi = 45\n        distance = np.linalg.norm(cam_pos)\n        self._distance = -distance\n        self._zoom = 1\n        self._width = width\n        self._height = height\n        self._window_aspect = 1.5\n\n        self._trackball = _trackball.Trackball(45,45)\n        aspect = self._window_aspect * self._aspect\n        self._projection = perspective(self._zoom, aspect,\n                                           self._znear, self._zfar)\n        self.property = {}\n        self._view = np.eye(4, dtype=np.float32)\n        self._view[:3, 3] = -np.array(cam_pos)\n        self.property[\"view\"] = self._view\n        self.property[\"model\"] = np.eye(4)\n        # self.set_distance(self._distance)\n\n    @property\n    def distance(self):\n        \"\"\" Distance from the trackball to the object \"\"\"\n\n        return self._distance\n\n    # @distance.setter\n    # def distance(self, distance):\n    #     \"\"\" Distance from the trackball to the object \"\"\"\n\n    #     self._view = np.eye(4, dtype=np.float32)\n    #     self._view[2, 3] = -self._distance\n    #     self.property[\"view\"] = self._view\n\n\n    @property\n    def theta(self):\n        \"\"\" Angle (in degrees) around the z axis \"\"\"\n\n        return self._trackball.theta\n\n    @theta.setter\n    def theta(self, theta):\n        \"\"\" Angle (in degrees) around the z axis \"\"\"\n\n        self._trackball.theta = theta\n        self.property[\"model\"] = self._trackball.model\n\n\n    @property\n    def phi(self):\n        \"\"\" Angle (in degrees) around the x axis \"\"\"\n\n        return self._trackball.phi\n\n    @phi.setter\n    def phi(self, phi):\n        \"\"\" Angle (in degrees) around the x axis \"\"\"\n\n        self._trackball.phi = phi\n        self.property[\"model\"] = self._trackball.model\n\n\n    @property\n    def zoom(self):\n        \"\"\" Zoom level (aperture angle in degrees) \"\"\"\n\n        return self._zoom\n\n\n    @phi.setter\n    def zoom(self, value):\n        \"\"\" Zoom level (aperture angle in degrees) \"\"\"\n\n        aspect = self._window_aspect * self._aspect\n        self._zoom = min(max(value, 1.0), 179.0)\n        self.property['projection'] = glm.perspective(self._zoom, aspect,\n                                             self._znear, self._zfar)\n\n    @property\n    def aspect(self):\n        \"\"\" Projection aspect \"\"\"\n\n        return self._aspect\n\n\n    @aspect.setter\n    def aspect(self, value):\n        \"\"\" Projection aspect \"\"\"\n\n        aspect = self._window_aspect * self._aspect\n        self.property['projection'] = glm.perspective(self._zoom, aspect,\n                                             self._znear, self._zfar)\n\n\n    def on_attach(self, program):\n        self.property[\"view\"] = self._view\n        self.property[\"model\"] = self._trackball.model\n        self.property[\"projection\"] = self._projection\n\n\n    def on_resize(self, width, height):\n        self._width  = float(width)\n        self._height = float(height)\n        self._window_aspect = self._width / self._height\n        aspect = self._window_aspect * self._aspect\n        self.property['projection'] = perspective(self._zoom, aspect,\n                                             self._znear, self._zfar)\n\n\n\n    def on_mouse_drag(self, x, y, dx, dy, button=None):\n        width = self._width\n        height = self._height\n        x  = (x*2.0 - width)/width\n        dx = (2.*dx)/width\n        y  = (height - y*2.0)/height\n        dy = -(2.*dy)/height\n        self._trackball.drag_to(x,y,dx,dy)\n        self.property[\"model\"] = self._trackball.model\n\n\n    def on_mouse_scroll(self, x, y, dx, dy):\n        width = self._width\n        height = self._height\n        aspect = self._window_aspect * self._aspect\n        self._zoom = min(max(self._zoom*(1-dy/100), 1.0), 179.0)\n        self.property['projection'] = perspective(self._zoom, aspect,\n                                             self._znear, self._zfar)\n\n    def reinit(self, cam_pos):\n        self._zoom = 1\n        self._window_aspect = 1.5\n\n        self._trackball = _trackball.Trackball(45,45)\n        aspect = self._window_aspect * self._aspect\n        self._projection = perspective(self._zoom, aspect,\n                                           self._znear, self._zfar)\n        self.property = {}\n        self._view = np.eye(4, dtype=np.float32)\n        self._view[:3, 3] = -np.array(cam_pos)\n        self.property[\"view\"] = self._view\n        self.property[\"projection\"] = np.eye(4)        \n        self.property[\"model\"] = np.eye(4)\n        self._trackball._model = np.eye(4)\n"
  },
  {
    "path": "ycb_render/glutils/utils.py",
    "content": "colormap = [[1,0,0], [0,1,0], [0,0,1]]\n"
  },
  {
    "path": "ycb_render/setup.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport os\nimport re\nimport sys\nimport platform\nimport subprocess\n\nfrom setuptools import setup, Extension\nfrom setuptools.command.build_ext import build_ext\nfrom distutils.version import LooseVersion\n\n\nclass CMakeExtension(Extension):\n    def __init__(self, name, sourcedir=''):\n        Extension.__init__(self, name, sources=[])\n        self.sourcedir = os.path.abspath(sourcedir)\n\n\nclass CMakeBuild(build_ext):\n    def run(self):\n        try:\n            out = subprocess.check_output(['cmake', '--version'])\n        except OSError:\n            raise RuntimeError(\"CMake must be installed to build the following extensions: \" +\n                               \", \".join(e.name for e in self.extensions))\n\n        if platform.system() == \"Windows\":\n            cmake_version = LooseVersion(\n                re.search(r'version\\s*([\\d.]+)', out.decode()).group(1))\n            if cmake_version < '3.1.0':\n                raise RuntimeError(\"CMake >= 3.1.0 is required on Windows\")\n\n        for ext in self.extensions:\n            self.build_extension(ext)\n\n    def build_extension(self, ext):\n        extdir = os.path.abspath(os.path.dirname(\n            self.get_ext_fullpath(ext.name)))\n        cmake_args = ['-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + extdir,\n                      '-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=' +\n                      os.path.join(extdir, 'build'),\n                      '-DPYTHON_EXECUTABLE=' + sys.executable]\n\n        cfg = 'Debug' if self.debug else 'Release'\n        build_args = ['--config', cfg]\n\n        if platform.system() == \"Windows\":\n            cmake_args += [\n                '-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{}={}'.format(cfg.upper(), extdir)]\n            if sys.maxsize > 2**32:\n                cmake_args += ['-A', 'x64']\n            build_args += ['--', '/m']\n        else:\n            cmake_args += ['-DCMAKE_BUILD_TYPE=' + cfg]\n            build_args += ['--', '-j2']\n\n        env = os.environ.copy()\n        env['CXXFLAGS'] = '{} -DVERSION_INFO=\\\\\"{}\\\\\"'.format(env.get('CXXFLAGS', ''),\n                                                              self.distribution.get_version())\n        if not os.path.exists(self.build_temp):\n            os.makedirs(self.build_temp)\n        subprocess.check_call(['cmake', ext.sourcedir] +\n                              cmake_args, cwd=self.build_temp, env=env)\n        subprocess.check_call(['cmake', '--build', '.'] +\n                              build_args, cwd=self.build_temp)\n\n\nsetup(\n    name='CppYCBRenderer',\n    version='0.0.1',\n    author='Fei Xia',\n    author_email='xf1280@gmail.com',\n    description='A test project using pybind11 and CMake',\n    long_description='',\n    ext_modules=[CMakeExtension('CppYCBRenderer')],\n    cmdclass=dict(build_ext=CMakeBuild),\n    zip_safe=False,\n)\n"
  },
  {
    "path": "ycb_render/shaders/frag.shader",
    "content": "#version 460\nuniform sampler2D texUnit;\nin vec2 theCoords;\nin vec3 Normal;\nin vec3 Normal_cam;\nin vec3 FragPos;\nin vec3 Instance_color;\nin vec3 Pos_cam;\nin vec3 Pos_obj;\n\nlayout (location = 0) out vec4 outputColour;\nlayout (location = 1) out vec4 NormalColour;\nlayout (location = 2) out vec4 InstanceColour;\nlayout (location = 3) out vec4 PCObject;\nlayout (location = 4) out vec4 PCColour;\n\nuniform vec3 light_position;  // in world coordinate\nuniform vec3 light_color; // light color\n\nvoid main() {\n    float ambientStrength = 0.2;\n    vec3 ambient = ambientStrength * light_color;\n    vec3 lightDir = normalize(light_position - FragPos);\n    float diff = max(dot(Normal, lightDir), 0.0);\n    vec3 diffuse = diff * light_color;\n\n    outputColour =  texture(texUnit, theCoords) * vec4(diffuse + ambient, 1);\n    NormalColour =  vec4((Normal_cam + 1) / 2,1);\n    InstanceColour = vec4(Instance_color,1);\n    PCObject = vec4(Pos_obj,1);\n    PCColour = vec4(Pos_cam,1);\n}"
  },
  {
    "path": "ycb_render/shaders/frag_blinnphong.shader",
    "content": "#version 460\nuniform sampler2D texUnit;\nin vec2 theCoords;\nin vec3 Normal;\nin vec3 Normal_cam;\nin vec3 FragPos;\nin vec3 Instance_color;\nin vec3 Pos_cam;\nin vec3 Pos_obj;\nin float inverse_normal;\nlayout (location = 0) out vec4 outputColour;\nlayout (location = 1) out vec4 NormalColour;\nlayout (location = 2) out vec4 InstanceColour;\nlayout (location = 3) out vec4 PCObject;\nlayout (location = 4) out vec4 PCColour;\n\nuniform vec3 light_position;  // in world coordinate\nuniform vec3 light_color; // light color\nuniform vec3 world_light_pos1;\nuniform vec3 world_light_pos2;\nuniform vec3 mat_ambient;\nuniform vec3 mat_diffuse;\nuniform vec3 mat_specular;\nuniform float mat_shininess;\n\nvoid main() {\n    if (inverse_normal > 0) discard;\n    vec4 texColor = texture(texUnit, theCoords); \n    if(texColor.a < 0.1) discard; \n\n    // attenuation\n    float a = 1.0f;\n    float b =  0.5f;\n    float c =  0.25f;\n    float r = length(light_position - Pos_obj);\n    float scalar = (a + b*r + c*r*r);\n    if(scalar < 0.00000001)\n        scalar = 0.0; \n    else\n        scalar = 1.0/scalar;\n\n    vec3 norm = normalize(Normal);\n    vec3 ambient =  mat_ambient * light_color;\n    vec3 lightDir = normalize(light_position - FragPos);\n    float diff = max(dot(norm, lightDir), 0.0);\n    vec3 diffuse = diff * light_color * mat_diffuse;\n    vec3 viewDir = normalize(Pos_cam - FragPos);\n    vec3 reflectDir = reflect(-lightDir, norm);  \n    float spec = pow(max(dot(viewDir, reflectDir), 0.0), mat_shininess);\n    vec3 specular = light_color * (spec * mat_specular);   \n         \n    // gamma correction\n    vec3 linearColour =  ambient + scalar*(diffuse +  specular);\n    vec3 gamma = vec3(1.0/2.2);\n    outputColour =  texColor * vec4(pow(linearColour, gamma), 1);\n    \n    // add few more lights\n    // lightDir = normalize(world_light_pos1 - FragPos);\n    // diff = max(dot(norm, lightDir), 0.0);\n    // diffuse = diff * light_color * mat_diffuse;\n    // viewDir = normalize(Pos_cam - FragPos);\n    // reflectDir = reflect(-lightDir, norm);  \n    // spec = pow(max(dot(viewDir, reflectDir), 0.0), mat_shininess);\n    // specular = light_color * (spec * mat_specular);              \n    // outputColour +=  texture(texUnit, theCoords)  * vec4(diffuse + ambient + specular, 1);\n    // lightDir = normalize(world_light_pos2 - FragPos);\n    // diff = max(dot(norm, lightDir), 0.0);\n    // diffuse = diff * light_color * mat_diffuse;\n    // viewDir = normalize(Pos_cam - FragPos);\n    // reflectDir = reflect(-lightDir, norm);  \n    // spec = pow(max(dot(viewDir, reflectDir), 0.0), mat_shininess);\n    // specular = light_color * (spec * mat_specular);              \n    // outputColour +=  texture(texUnit, theCoords)  * vec4(ambient + scalar*(diffuse +  specular), 1);\n\n    //NormalColour =  vec4((Normal_cam + 1) / 2,1);\n    NormalColour = vec4(Normal_cam,1);\n    InstanceColour = vec4(Instance_color,1);\n    PCObject = vec4(Pos_obj,1);\n    PCColour = vec4(Pos_cam,1);\n}"
  },
  {
    "path": "ycb_render/shaders/frag_mat.shader",
    "content": "#version 460\nin vec3 Normal;\nin vec3 Normal_cam;\nin vec3 FragPos;\nin vec3 Instance_color;\nin vec3 Pos_cam;\nin vec3 Pos_obj;\nin float inverse_normal;\nuniform vec3 mat_ambient;\nuniform vec3 mat_diffuse;\nuniform vec3 mat_specular;\nuniform float mat_shininess;\n\nlayout (location = 0) out vec4 outputColour;\nlayout (location = 1) out vec4 NormalColour;\nlayout (location = 2) out vec4 InstanceColour;\nlayout (location = 3) out vec4 PCObject;\nlayout (location = 4) out vec4 PCColour;\n\nuniform vec3 light_position;  // in world coordinate\nuniform vec3 light_color; // light color\nvoid main() {\n    if (inverse_normal > 0) discard; // discard the wrong pixel\n    vec3 norm = normalize(Normal);\n    vec3 ambient =  mat_ambient * light_color;\n    vec3 lightDir = normalize(light_position - FragPos);\n    float diff = max(dot(norm, lightDir), 0.0);\n    vec3 diffuse = diff * light_color * mat_diffuse;\n    vec3 viewDir = normalize(Pos_cam - FragPos);\n    vec3 reflectDir = reflect(-lightDir, norm);  \n    float spec = pow(max(dot(viewDir, reflectDir), 0.0), mat_shininess);\n    vec3 specular = light_color * (spec * mat_specular);     \n    outputColour =  vec4(ambient + diffuse + specular, 1);\n\n    //NormalColour =  vec4((Normal_cam + 1) / 2,1);\n    NormalColour = vec4(Normal_cam,1);\n    InstanceColour = vec4(Instance_color,1);\n    PCObject = vec4(Pos_obj,1);\n    PCColour = vec4(Pos_cam,1);\n}"
  },
  {
    "path": "ycb_render/shaders/frag_simple.shader",
    "content": "#version 460\nlayout (location = 0) out vec4 outputColour;\nlayout (location = 1) out vec4 NormalColour;\nlayout (location = 2) out vec4 InstanceColour;\nlayout (location = 3) out vec4 PCColour;\nvoid main() {\n    outputColour = vec4(0.1, 0.1, 0.1, 1.0);\n    NormalColour = vec4(0,0,0,0);\n    InstanceColour = vec4(0,0,0,0);\n    PCColour = vec4(0,0,0,0);\n\n}"
  },
  {
    "path": "ycb_render/shaders/frag_textureless.shader",
    "content": "#version 460\nin vec3 theColor;\nin vec3 Normal;\nin vec3 Normal_cam;\nin vec3 FragPos;\nin vec3 Instance_color;\nin vec3 Pos_cam;\nin vec3 Pos_obj;\nin float inverse_normal;\n\nlayout (location = 0) out vec4 outputColour;\nlayout (location = 1) out vec4 NormalColour;\nlayout (location = 2) out vec4 InstanceColour;\nlayout (location = 3) out vec4 PCObject;\nlayout (location = 4) out vec4 PCColour;\n\nuniform vec3 light_position;  // in world coordinate\nuniform vec3 light_color; // light color\nuniform vec3 mat_ambient;\nuniform vec3 mat_diffuse;\nuniform vec3 mat_specular;\nuniform float mat_shininess;\nvoid main() {\n    //float ambientStrength = 0.2;\n    //vec3 ambient = ambientStrength * light_color;\n    //vec3 lightDir = normalize(light_position - FragPos);\n    //float diff = max(dot(Normal, lightDir), 0.0);\n    //vec3 diffuse = diff * light_color;\n    if (inverse_normal > 0) discard; // discard the wrong pixel\n    vec3 norm = normalize(Normal);\n    vec3 ambient =  mat_ambient * light_color;\n    vec3 lightDir = normalize(light_position - FragPos);\n    float diff = max(dot(norm, lightDir), 0.0);\n    vec3 diffuse = diff * light_color * mat_diffuse;\n    vec3 viewDir = normalize(Pos_cam - FragPos);\n    vec3 reflectDir = reflect(-lightDir, norm);  \n    float spec = pow(max(dot(viewDir, reflectDir), 0.0), mat_shininess);\n    vec3 specular = light_color * (spec * mat_specular);   \n\n    outputColour = vec4(theColor, 1) * vec4(diffuse + ambient + specular, 1);\n    NormalColour =  vec4((Normal_cam + 1) / 2,1);\n    InstanceColour = vec4(Instance_color,1);\n    PCObject = vec4(Pos_obj,1);\n    PCColour = vec4(Pos_cam,1);\n}"
  },
  {
    "path": "ycb_render/shaders/vert.shader",
    "content": "#version 460\nuniform mat4 V;\nuniform mat4 P;\nuniform mat4 pose_rot;\nuniform mat4 pose_trans;\nuniform vec3 instance_color; \n        \nlayout (location=0) in vec3 position;\nlayout (location=1) in vec3 normal;\nlayout (location=2) in vec2 texCoords;\nout vec2 theCoords;\nout vec3 Normal;\nout vec3 FragPos;\nout vec3 Normal_cam;\nout vec3 Instance_color;\nout vec3 Pos_cam;\nout vec3 Pos_obj;\nvoid main() {\n    gl_Position = P * V * pose_trans * pose_rot * vec4(position, 1);\n    vec4 world_position4 = pose_trans * pose_rot * vec4(position, 1);\n    FragPos = vec3(world_position4.xyz / world_position4.w); // in world coordinate\n    Normal = normalize(mat3(pose_rot) * normal); // in world coordinate\n    Normal_cam = normalize(mat3(V) * mat3(pose_rot) * normal); // in camera coordinate\n    \n    vec4 pos_cam4 = V * pose_trans * pose_rot * vec4(position, 1);\n    Pos_cam = pos_cam4.xyz / pos_cam4.w;\n    Pos_obj = position;\n    \n    theCoords = texCoords;\n    Instance_color = instance_color;\n}"
  },
  {
    "path": "ycb_render/shaders/vert_blinnphong.shader",
    "content": "#version 460\nuniform mat4 V;\nuniform mat4 P;\nuniform mat4 pose_rot;\nuniform mat4 pose_trans;\nuniform vec3 instance_color; \n        \nlayout (location=0) in vec3 position;\nlayout (location=1) in vec3 normal;\nlayout (location=2) in vec2 texCoords;\nout vec2 theCoords;\nout vec3 Normal;\nout vec3 FragPos;\nout vec3 Normal_cam;\nout vec3 Instance_color;\nout vec3 Pos_cam;\nout vec3 Pos_obj;\nout float inverse_normal;\nvoid main() {\n    gl_Position = P * V * pose_trans * pose_rot * vec4(position, 1);\n    vec4 world_position4 = pose_trans * pose_rot * vec4(position, 1);\n    FragPos = vec3(world_position4.xyz / world_position4.w); // in world coordinate\n    Normal = normalize(mat3(pose_rot) * normal); // in world coordinate\n    Normal_cam = normalize(mat3(V) * mat3(pose_rot) * normal); // in camera coordinate\n\n    vec4 pos_cam4 = V * pose_trans * pose_rot * vec4(position, 1);\n    Pos_cam = pos_cam4.xyz / pos_cam4.w;\n    Pos_obj = position;\n    float normalDir = dot(Normal_cam, Pos_cam);   \n    inverse_normal = normalDir;       \n    theCoords = texCoords;\n    Instance_color = instance_color;\n}"
  },
  {
    "path": "ycb_render/shaders/vert_mat.shader",
    "content": "#version 460\nuniform mat4 V;\nuniform mat4 P;\nuniform mat4 pose_rot;\nuniform mat4 pose_trans;\nuniform vec3 instance_color; \n        \nlayout (location=0) in vec3 position;\nlayout (location=1) in vec3 normal;\nout vec3 Normal;\nout vec3 FragPos;\nout vec3 Normal_cam;\nout vec3 Instance_color;\nout vec3 Pos_cam;\nout vec3 Pos_obj;\nout float inverse_normal;\nvoid main() {\n    gl_Position = P * V * pose_trans * pose_rot * vec4(position, 1);\n    vec4 world_position4 = pose_trans * pose_rot * vec4(position, 1);\n    FragPos = vec3(world_position4.xyz / world_position4.w); // in world coordinate\n    Normal = normalize(mat3(pose_rot) * normal); // in world coordinate\n    Normal_cam = normalize(mat3(V) * mat3(pose_rot) * normal); // in camera coordinate\n         \n    vec4 pos_cam4 = V * pose_trans * pose_rot * vec4(position, 1);\n    Pos_cam = pos_cam4.xyz / pos_cam4.w;\n    float normalDir = dot(Normal_cam, Pos_cam);\n    Pos_obj = position;\n    Instance_color = instance_color;\n    inverse_normal = normalDir;\n}"
  },
  {
    "path": "ycb_render/shaders/vert_simple.shader",
    "content": "#version 460\nuniform mat4 V;\nuniform mat4 P;\n\nlayout (location=0) in vec3 position;\nlayout (location=1) in vec3 normal;\nlayout (location=2) in vec2 texCoords;\n\nvoid main() {\n    gl_Position = P * V * vec4(position,1);\n}"
  },
  {
    "path": "ycb_render/shaders/vert_textureless.shader",
    "content": "#version 460\nuniform mat4 V;\nuniform mat4 P;\nuniform mat4 pose_rot;\nuniform mat4 pose_trans;\nuniform vec3 instance_color; \n        \nlayout (location=0) in vec3 position;\nlayout (location=1) in vec3 normal;\nlayout (location=2) in vec3 color;\nout vec3 theColor;\nout vec3 Normal;\nout vec3 FragPos;\nout vec3 Normal_cam;\nout vec3 Instance_color;\nout vec3 Pos_cam;\nout vec3 Pos_obj;\nout float inverse_normal;\nvoid main() {\n    gl_Position = P * V * pose_trans * pose_rot * vec4(position, 1);\n    vec4 world_position4 = pose_trans * pose_rot * vec4(position, 1);\n    FragPos = vec3(world_position4.xyz / world_position4.w); // in world coordinate\n    Normal = normalize(mat3(pose_rot) * normal); // in world coordinate\n    Normal_cam = normalize(mat3(V) * mat3(pose_rot) * normal); // in camera coordinate\n    \n    vec4 pos_cam4 = V * pose_trans * pose_rot * vec4(position, 1);\n    Pos_cam = pos_cam4.xyz / pos_cam4.w;\n    Pos_obj = position;\n    float normalDir = dot(Normal_cam, Pos_cam);           \n    theColor = color;\n    Instance_color = instance_color;\n    inverse_normal = normalDir;\n}"
  },
  {
    "path": "ycb_render/visualize_sim.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport torch\nimport cv2\nimport numpy as np\nimport glob\nfrom transforms3d.quaternions import mat2quat, quat2mat\nfrom ycb_renderer_sim import YCBRenderer\n\nif __name__ == '__main__':\n\n    model_path = '.'\n    width = 640\n    height = 480\n    files = glob.glob('data/*.npy')\n\n    renderer = YCBRenderer(width=width, height=height, render_marker=True)\n    models = ['003_cracker_box', '004_sugar_box', '005_tomato_soup_can', '006_mustard_bottle', '010_potted_meat_can']\n    colors = [[0, 1, 0], [0, 0, 1], [1, 1, 0], [1, 0, 1], [0.5, 0.5, 0]]\n\n    # models = ['003_cracker_box']\n    # colors = [[0, 1, 0]]\n\n    obj_paths = [\n        '{}/models_sim/{}/meshes/{}.obj'.format(model_path, item, item) for item in models]\n    texture_paths = [\n        '{}/models_sim/{}/meshes/texture_map.png'.format(model_path, item) for item in models]\n    renderer.load_objects(obj_paths, texture_paths, colors)\n\n    renderer.set_fov(60)\n    renderer.set_light_pos([0, 0, 0])\n    renderer.set_camera([0, 0, 0], [1, 0, 0], [0, 0, 1])\n\n    image_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n    seg_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n    RT_object = np.zeros((3, 4), dtype=np.float32)\n    RT_camera = np.zeros((3, 4), dtype=np.float32)\n\n    for file_path in files[1:]:\n\n        print file_path\n      \n        data = np.load(file_path).item()\n        cls_indexes = []\n        poses = []\n\n        print('object_labels', data['object_labels'])\n        print('fov', data['horizontal_fov'])\n\n        for i, object_name in enumerate(data['object_labels']):\n\n            cls_index = -1\n            for j in range(len(models)):\n                if object_name in models[j]:\n                    cls_index = j\n                    break\n\n            if cls_index >= 0:\n                cls_indexes.append(cls_index)\n\n                RT = np.zeros((3, 4), dtype=np.float32)\n\n                w = data['relative_poses'][i][0]\n                x = data['relative_poses'][i][1]\n                y = data['relative_poses'][i][2]\n                z = data['relative_poses'][i][3]\n                RT[:3, :3] = quat2mat([w, x, y, z])\n\n                x = data['relative_poses'][i][4]\n                y = data['relative_poses'][i][5]\n                z = data['relative_poses'][i][6]\n                RT[:, 3] = [x, y, z]\n                print RT\n\n                qt = np.zeros((7, ), dtype=np.float32)\n                qt[3:] = mat2quat(RT[:3, :3])\n                qt[:3] = RT[:, 3]\n                print qt\n\n                poses.append(qt)\n\n            print('object_name: {}, relative_qt = {}, absolute_qt = {}'.format(data['object_labels'][i], data['relative_poses'][i], data['absolute_poses'][i]))\n\n        renderer.set_poses(poses)\n\n        renderer.render(cls_indexes, image_tensor, seg_tensor)\n        image_tensor = image_tensor.flip(0)\n        seg_tensor = seg_tensor.flip(0)\n\n        # RGB to BGR order\n        im = image_tensor.cpu().numpy()\n        im = np.clip(im, 0, 1)\n        im = im[:, :, (2, 1, 0)] * 255\n        im = im.astype(np.uint8)\n\n        im_label = seg_tensor.cpu().numpy()\n        im_label = im_label[:, :, (2, 1, 0)] * 255\n        im_label = np.round(im_label).astype(np.uint8)\n        im_label = np.clip(im_label, 0, 255)\n    \n        import matplotlib.pyplot as plt\n        fig = plt.figure()\n        ax = fig.add_subplot(2, 2, 1)\n        plt.imshow(data['rgb'][:, :, (2, 1, 0)])\n\n        ax = fig.add_subplot(2, 2, 2)\n        mask = np.squeeze(data['segmentation'], -1).astype(np.uint8)\n        mask *= 40\n        plt.imshow(mask)\n\n        ax = fig.add_subplot(2, 2, 3)\n        plt.imshow(im[:, :, (2, 1, 0)])\n\n        ax = fig.add_subplot(2, 2, 4)\n        plt.imshow(im_label[:, :, (2, 1, 0)])\n        plt.show()\n"
  },
  {
    "path": "ycb_render/ycb_renderer.py",
    "content": "# Copyright (c) 2020 NVIDIA Corporation. All rights reserved.\n# This work is licensed under the NVIDIA Source Code License - Non-commercial. Full\n# text can be found in LICENSE.md\n\nimport sys\nimport ctypes\nimport torch\nimport time\nimport argparse\nfrom pprint import pprint\nfrom PIL import Image\nimport glutils.glcontext as glcontext\nimport OpenGL.GL as GL\nimport cv2\nimport numpy as np\nimport platform\nPYTHON2 = True\nif platform.python_version().startswith('3'):\n    PYTHON2 = False\n\nfrom pyassimp import *\nfrom glutils.meshutil import perspective, lookat, xyz2mat, quat2rotmat, mat2xyz, safemat2quat,homotrans, mat2rotmat, unpack_pose, pack_pose\nfrom glutils.trackball import Trackball\nfrom transforms3d.quaternions import axangle2quat, mat2quat, qmult, qinverse\nfrom transforms3d.euler import quat2euler, mat2euler, euler2quat\nimport CppYCBRenderer\nfrom numpy.linalg import inv, norm\ntry:\n    from .get_available_devices import *\nexcept:\n    from get_available_devices import *\n\nMAX_NUM_OBJECTS = 3\nfrom glutils.utils import colormap\n\n\ndef loadTexture(path):\n    img = Image.open(path).transpose(Image.FLIP_TOP_BOTTOM)\n    img_data = np.fromstring(img.tobytes(), np.uint8)\n    width, height = img.size\n \n    texture = GL.glGenTextures(1)\n    GL.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1)\n    GL.glBindTexture(GL.GL_TEXTURE_2D, texture)\n    GL.glTexParameterf(\n        GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR)\n    GL.glTexParameterf(\n        GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR_MIPMAP_LINEAR)\n    GL.glTexParameterf(\n        GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT) #.GL_CLAMP_TO_EDGE GL_REPEAT\n    GL.glTexParameterf(\n        GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT)\n    if img.mode == 'RGBA':\n        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, width, height, 0,\n                    GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, img_data)\n    else:\n        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB, width, height, 0,\n                    GL.GL_RGB, GL.GL_UNSIGNED_BYTE, img_data)\n    GL.glGenerateMipmap(GL.GL_TEXTURE_2D)\n    return texture\n\n\nclass YCBRenderer:\n    def __init__(self, width=512, height=512, gpu_id=0, render_marker=False, robot=''):\n        self.render_marker = render_marker\n        self.VAOs = []\n        self.VBOs = []\n        self.materials = []\n        self.textures = []\n        self.is_textured = []\n        self.is_materialed = []\n        self.objects = []\n        self.texUnitUniform = None\n        self.width = width\n        self.height = height\n        self.vertices = []\n        self.faces = []\n        self.poses_trans = []\n        self.poses_rot = []\n        self.instances = []\n        self.extents = []\n        self.robot = robot\n        if len(self.robot) > 3:\n            self._offset_map = self.load_offset()\n        else:\n            self._offset_map = None\n\n        self.r = CppYCBRenderer.CppYCBRenderer(width, height, get_available_devices()[gpu_id])\n        self.r.init()\n        self.glstring = GL.glGetString(GL.GL_VERSION)\n        from OpenGL.GL import shaders\n        \n        self.shaders = shaders\n        self.colors = [[0.9, 0, 0], [0.6, 0, 0], [0.3, 0, 0], [0.3, 0, 0], [0.3, 0, 0], [0.3, 0, 0], [0.3, 0, 0]]\n        self.lightcolor = [1, 1, 1]\n\n        cur_dir = os.path.dirname(os.path.abspath(__file__))\n        vertexShader = self.shaders.compileShader(\n                            open(os.path.join(cur_dir, 'shaders/vert.shader')).readlines(), GL.GL_VERTEX_SHADER)\n\n        fragmentShader = self.shaders.compileShader(\n                            open(os.path.join(cur_dir,'shaders/frag.shader')).readlines(), GL.GL_FRAGMENT_SHADER)\n\n        vertexShader_textureMat = self.shaders.compileShader(\n                            open(os.path.join(cur_dir,'shaders/vert_blinnphong.shader')).readlines(), GL.GL_VERTEX_SHADER)\n\n        fragmentShader_textureMat = self.shaders.compileShader(\n                            open(os.path.join(cur_dir,'shaders/frag_blinnphong.shader')).readlines(), GL.GL_FRAGMENT_SHADER)\n\n        vertexShader_textureless = self.shaders.compileShader(\n                            open(os.path.join(cur_dir,'shaders/vert_textureless.shader')).readlines(), GL.GL_VERTEX_SHADER)\n\n        fragmentShader_textureless = self.shaders.compileShader(\n                            open(os.path.join(cur_dir,'shaders/frag_textureless.shader')).readlines(), GL.GL_FRAGMENT_SHADER)\n\n        #try with the easiest shader first, and then look at Gl apply material\n        vertexShader_material = self.shaders.compileShader(\n                            open(os.path.join(cur_dir,'shaders/vert_mat.shader')).readlines(), GL.GL_VERTEX_SHADER)\n\n        fragmentShader_material = self.shaders.compileShader(\n                            open(os.path.join(cur_dir,'shaders/frag_mat.shader')).readlines(), GL.GL_FRAGMENT_SHADER)\n\n        vertexShader_simple = self.shaders.compileShader(\n                            open(os.path.join(cur_dir,'shaders/vert_simple.shader')).readlines(), GL.GL_VERTEX_SHADER)\n\n        fragmentShader_simple = self.shaders.compileShader(\n                            open(os.path.join(cur_dir,'shaders/frag_simple.shader')).readlines(), GL.GL_FRAGMENT_SHADER)\n\n        self.shaderProgram = self.shaders.compileProgram(vertexShader, fragmentShader)\n        self.shaderProgram_textureless = self.shaders.compileProgram(vertexShader_textureless, fragmentShader_textureless)\n        self.shaderProgram_simple = self.shaders.compileProgram(vertexShader_simple, fragmentShader_simple)\n        self.shaderProgram_material = self.shaders.compileProgram(vertexShader_material, fragmentShader_material) \n        self.shaderProgram_textureMat = self.shaders.compileProgram(vertexShader_textureMat, fragmentShader_textureMat)\n\n        self.texUnitUniform_textureMat = GL.glGetUniformLocation(self.shaderProgram_textureMat, 'texUnit')\n\n        self.lightpos = [0, 0, 0]\n\n        self.fbo = GL.glGenFramebuffers(1)\n        self.color_tex = GL.glGenTextures(1)\n        self.color_tex_2 = GL.glGenTextures(1)\n        self.color_tex_3 = GL.glGenTextures(1)\n        self.color_tex_4 = GL.glGenTextures(1)\n        self.color_tex_5 = GL.glGenTextures(1)\n\n        self.depth_tex = GL.glGenTextures(1)\n\n        GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex)\n        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width, self.height, 0,\n                        GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None)\n\n        GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_2)\n        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width, self.height, 0,\n                        GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None)\n\n        GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_3)\n        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width, self.height, 0,\n                        GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None)\n\n        GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_4)\n        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width, self.height, 0,\n                        GL.GL_RGBA, GL.GL_FLOAT, None)\n\n        GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_5)\n        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width, self.height, 0,\n                        GL.GL_RGBA, GL.GL_FLOAT, None)\n\n        GL.glBindTexture(GL.GL_TEXTURE_2D, self.depth_tex)\n\n        GL.glTexImage2D.wrappedOperation(\n            GL.GL_TEXTURE_2D, 0, GL.GL_DEPTH24_STENCIL8, self.width, self.height, 0,\n            GL.GL_DEPTH_STENCIL, GL.GL_UNSIGNED_INT_24_8, None)\n\n        GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.fbo)\n        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, GL.GL_TEXTURE_2D, self.color_tex, 0)\n        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT1, GL.GL_TEXTURE_2D, self.color_tex_2, 0)\n        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT2, GL.GL_TEXTURE_2D, self.color_tex_3, 0)\n        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT3, GL.GL_TEXTURE_2D, self.color_tex_4, 0)\n        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT4, GL.GL_TEXTURE_2D, self.color_tex_5, 0)\n        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_DEPTH_STENCIL_ATTACHMENT, GL.GL_TEXTURE_2D, self.depth_tex, 0)\n        GL.glViewport(0, 0, self.width, self.height)\n        GL.glDrawBuffers(5, [GL.GL_COLOR_ATTACHMENT0, GL.GL_COLOR_ATTACHMENT1,\n                             GL.GL_COLOR_ATTACHMENT2, GL.GL_COLOR_ATTACHMENT3, GL.GL_COLOR_ATTACHMENT4])\n\n        assert GL.glCheckFramebufferStatus(\n            GL.GL_FRAMEBUFFER) == GL.GL_FRAMEBUFFER_COMPLETE\n\n        self.fov = 20\n        self.camera = [1, 0, 0]\n        self.target = [0, 0, 0]\n        self.up = [0, 0, 1]\n        P = perspective(self.fov, float(self.width) /\n                        float(self.height), 0.01, 100)\n        V = lookat(\n            self.camera,\n            self.target, up=self.up)\n\n        self.V = np.ascontiguousarray(V, np.float32)\n        self.P = np.ascontiguousarray(P, np.float32)\n        self.grid = self.generate_grid()\n        #added mouse interaction\n        self.is_rotating = False\n    \n    def generate_grid(self):\n        VAO = GL.glGenVertexArrays(1)\n        GL.glBindVertexArray(VAO)\n\n        vertexData = []\n        for i in np.arange(-1, 1, 0.05):\n            vertexData.append([i, 0, -1, 0, 0, 0, 0, 0])\n            vertexData.append([i, 0, 1, 0, 0, 0, 0, 0])\n            vertexData.append([1, 0, i, 0, 0, 0, 0, 0])\n            vertexData.append([-1, 0, i, 0, 0, 0, 0, 0])\n\n        vertexData = np.array(vertexData).astype(np.float32) * 3\n        # Need VBO for triangle vertices and texture UV coordinates\n        VBO = GL.glGenBuffers(1)\n        GL.glBindBuffer(GL.GL_ARRAY_BUFFER, VBO)\n        GL.glBufferData(GL.GL_ARRAY_BUFFER, vertexData.nbytes, vertexData, GL.GL_STATIC_DRAW)\n\n        # enable array and set up data\n        positionAttrib = GL.glGetAttribLocation(self.shaderProgram_simple, 'position')\n        GL.glEnableVertexAttribArray(0)\n        GL.glVertexAttribPointer(positionAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 32, None)\n        GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0)\n        GL.glBindVertexArray(0)\n\n        return VAO\n\n\n    def load_object(self, obj_path, texture_path, scale=1.0):\n\n        is_materialed = True\n        textures = []\n        start_time = time.time()\n\n        vertices, faces, materials, texture_paths = self.load_mesh(obj_path, scale)\n        print('load mesh {:s} time:{:.3f}'.format(obj_path, time.time() - start_time))\n\n        # compute extent\n        vertices_all = vertices[0]\n        for idx in range(1, len(vertices)):\n            vertices_all += vertices[idx]\n        extent = 2 * np.max(np.absolute(vertices_all[:, :3]), axis=0)\n        self.vertices.append(vertices_all[:, :3])\n        self.extents.append(extent)\n\n        start_time = time.time()\n        self.materials.append(materials)\n        is_textured = []\n        is_colored = []\n        for texture_path in texture_paths:\n            is_texture = False\n            is_color = False\n            if texture_path == '':\n                textures.append(texture_path)\n            elif texture_path == 'color':\n                is_color = True\n                textures.append(texture_path) \n            else:\n                texture_path = os.path.join('/'.join(obj_path.split('/')[:-1]), texture_path) \n                texture = loadTexture(texture_path)\n                textures.append(texture)\n                is_texture = True\n            is_textured.append(is_texture)\n            is_colored.append(is_color)\n        self.textures.append(textures)\n        self.is_textured.append(is_textured)\n        self.is_materialed.append(is_materialed)\n\n        if is_materialed:# and True in is_textured: #for compatability\n            for idx in range(len(vertices)):\n\n                vertexData = vertices[idx].astype(np.float32)\n                face = faces[idx]\n                VAO = GL.glGenVertexArrays(1)\n                GL.glBindVertexArray(VAO)\n\n                # Need VBO for triangle vertices and texture UV coordinates\n                VBO = GL.glGenBuffers(1)\n                GL.glBindBuffer(GL.GL_ARRAY_BUFFER, VBO)\n                GL.glBufferData(GL.GL_ARRAY_BUFFER, vertexData.nbytes, vertexData, GL.GL_STATIC_DRAW)\n                if is_textured[idx]:\n                    positionAttrib = GL.glGetAttribLocation(self.shaderProgram_textureMat, 'position')\n                    normalAttrib = GL.glGetAttribLocation(self.shaderProgram_textureMat, 'normal')\n                    coordsAttrib = GL.glGetAttribLocation(self.shaderProgram_textureMat, 'texCoords')          \n                elif is_colored[idx]:\n                    positionAttrib = GL.glGetAttribLocation(self.shaderProgram_textureless, 'position')\n                    normalAttrib = GL.glGetAttribLocation(self.shaderProgram_textureless, 'normal')\n                    colorAttrib = GL.glGetAttribLocation(self.shaderProgram_textureless, 'color')                    \n                else:\n                    positionAttrib = GL.glGetAttribLocation(self.shaderProgram_material, 'position')\n                    normalAttrib = GL.glGetAttribLocation(self.shaderProgram_material, 'normal')   \n\n                GL.glEnableVertexAttribArray(0)\n                GL.glEnableVertexAttribArray(1)\n                # the last parameter is a pointer\n                if is_textured[idx]:\n                    GL.glEnableVertexAttribArray(2)\n                    GL.glVertexAttribPointer(positionAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 32, None)\n                    GL.glVertexAttribPointer(normalAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 32, ctypes.c_void_p(12))\n                    GL.glVertexAttribPointer(coordsAttrib, 2, GL.GL_FLOAT, GL.GL_TRUE, 32, ctypes.c_void_p(24))\n                elif is_colored[idx]:\n                    GL.glEnableVertexAttribArray(2)\n                    GL.glVertexAttribPointer(positionAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 36, None)\n                    GL.glVertexAttribPointer(normalAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 36, ctypes.c_void_p(12))\n                    GL.glVertexAttribPointer(colorAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 36, ctypes.c_void_p(24))                    \n                else:\n                    GL.glVertexAttribPointer(positionAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 24, None)\n                    GL.glVertexAttribPointer(normalAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 24, ctypes.c_void_p(12))\n\n                GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0)\n                GL.glBindVertexArray(0)\n                self.VAOs.append(VAO)\n                self.VBOs.append(VBO)\n                self.faces.append(face)\n            self.objects.append(obj_path)\n            self.poses_rot.append(np.eye(4))\n            self.poses_trans.append(np.eye(4))  \n            print('buffer time:{:.3f}'.format(time.time() - start_time))\n\n    \n    def load_offset(self):\n\n        cur_path = os.path.abspath(os.path.dirname(__file__))\n        offset_file = os.path.join(cur_path, 'robotPose', self.robot + '_models', 'center_offset.txt')\n        model_file = os.path.join(cur_path, 'robotPose', self.robot + '_models', 'models.txt')\n        with open(model_file, \"r+\") as file:\n            content = file.readlines()\n            model_paths = [path.strip().split('/')[-1] for path in content]\n        offset = np.loadtxt(offset_file).astype(np.float32)\n        offset_map = {}\n        for i in range(offset.shape[0]):\n            offset_map[model_paths[i]] = offset[i, :]\n         #extent max - min in mesh, center = (max + min)/2\n        return offset_map\n\n\n    def load_mesh(self, path, scale=1.0):\n        mesh_file = path.strip().split('/')[-1]  # for offset the robot mesh\n        scene = load(path) #load collada\n        offset = np.zeros(3)\n        if self._offset_map is not None and mesh_file in self._offset_map:\n            offset = self._offset_map[mesh_file]\n        return self.recursive_load(scene.rootnode, [], [], [], [], offset, scale, [[], [], []])\n\n\n    def recursive_load(self, node, vertices, faces, materials,\n                         texture_paths, offset, scale=1, repeated=[[], [], []]):\n        if node.meshes:\n            transform = node.transformation \n            for idx, mesh in enumerate(node.meshes):\n                if mesh.faces.shape[-1] != 3: #ignore Line Set\n                    continue\n                mat = mesh.material\n                texture_path = False\n                if hasattr(mat, 'properties'):\n                    file = ('file', long(1)) if PYTHON2 else ('file', 1) \n                    if file in mat.properties:\n                        texture_paths.append(mat.properties[file])\n                        texture_path = True\n                    else:\n                        texture_paths.append('')\n                mat_diffuse = np.array(mat.properties['diffuse'])[:3] \n                mat_specular = np.array(mat.properties['specular'])[:3] \n                mat_ambient = np.array(mat.properties['ambient'])[:3] #phong shader\n                if 'shininess' in mat.properties:\n                    mat_shininess = max(mat.properties['shininess'], 1) #avoid the 0 shininess\n                else:\n                    mat_shininess = 1\n                mesh_vertex = homotrans(transform,mesh.vertices) - offset #subtract the offset\n                if mesh.normals.shape[0] > 0:\n                    mesh_normals = transform[:3,:3].dot(mesh.normals.transpose()).transpose() #normal stays the same\n                else:\n                    mesh_normals = np.zeros_like(mesh_vertex)\n                    mesh_normals[:,-1] = 1\n                if texture_path:\n                    vertices.append(np.concatenate([mesh_vertex * scale, mesh_normals, mesh.texturecoords[0, :, :2]], axis=-1))\n                elif mesh.colors is not None and len(mesh.colors.shape) > 2:\n                    vertices.append(np.concatenate([mesh_vertex * scale, mesh_normals, mesh.colors[0, :, :3]], axis=-1)) #\n                    texture_paths[-1] = 'color'\n                else:\n                    vertices.append(np.concatenate([mesh_vertex * scale, mesh_normals], axis=-1))\n                faces.append(mesh.faces)\n                materials.append(np.hstack([mat_diffuse, mat_specular, mat_ambient, mat_shininess]))\n        for child in node.children:\n            self.recursive_load(child, vertices, faces, materials, texture_paths, offset, scale, repeated) \n        return vertices, faces, materials, texture_paths\n\n\n    def load_objects(self, obj_paths, texture_paths, colors=[[0.9, 0, 0], [0.6, 0, 0], [0.3, 0, 0]], scale=None):\n        if scale is None:\n            scale = [1]*len(obj_paths)\n        self.colors = colors\n        for i in range(len(obj_paths)):\n            self.load_object(obj_paths[i], texture_paths[i], scale[i])\n            if i == 0:\n                self.instances.append(0)\n            else:\n                self.instances.append(self.instances[-1] + len(self.materials[i-1])) #offset\n        print(self.extents)\n\n    def set_camera(self, camera, target, up):\n        self.camera = camera\n        self.target = target\n        self.up = up\n        V = lookat(\n            self.camera,\n            self.target, up=self.up)\n\n        self.V = np.ascontiguousarray(V, np.float32)\n\n    def set_camera_default(self):\n        self.V = np.eye(4)\n\n    def set_fov(self, fov):\n        self.fov = fov\n        # this is vertical fov\n        P = perspective(self.fov, float(self.width) /\n                        float(self.height), 0.01, 100)\n        self.P = np.ascontiguousarray(P, np.float32)\n\n\n    def set_projection_matrix(self, w, h, fu, fv, u0, v0, znear, zfar):\n        L = -(u0) * znear / fu;\n        R = +(w-u0) * znear / fu;\n        T = -(v0) * znear / fv;\n        B = +(h-v0) * znear / fv;\n\n        P = np.zeros((4, 4), dtype=np.float32);\n        P[0, 0] = 2 * znear / (R-L);\n        P[1, 1] = 2 * znear / (T-B);\n        P[2, 0] = (R+L)/(L-R);\n        P[2, 1] = (T+B)/(B-T);\n        P[2, 2] = (zfar +znear) / (zfar - znear);\n        P[2, 3] = 1.0;\n        P[3, 2] = (2*zfar*znear)/(znear - zfar);\n        self.P = P\n\n    def set_light_color(self, color):\n        self.lightcolor = color\n\n    def render(self, cls_indexes, image_tensor, seg_tensor, normal_tensor=None, pc1_tensor=None, pc2_tensor=None):\n        frame = 0\n        GL.glClearColor(0, 0, 0, 1)\n        GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)\n        GL.glEnable(GL.GL_DEPTH_TEST)\n        #GL.glLightModeli(GL.GL_LIGHT_MODEL_TWO_SIDE, GL.GL_TRUE)\n\n        if self.render_marker:\n            # render some grid and directions\n            GL.glUseProgram(self.shaderProgram_simple)\n            GL.glBindVertexArray(self.grid)\n            GL.glUniformMatrix4fv(GL.glGetUniformLocation(\n                self.shaderProgram_simple, 'V'), 1, GL.GL_TRUE, self.V)\n            GL.glUniformMatrix4fv(GL.glGetUniformLocation(\n                self.shaderProgram_simple, 'P'), 1, GL.GL_FALSE, self.P)\n            GL.glDrawElements(GL.GL_LINES, 160,\n                              GL.GL_UNSIGNED_INT, np.arange(160, dtype=np.int))\n            GL.glBindVertexArray(0)\n            GL.glUseProgram(0)\n            # end rendering markers\n\n        size = 0\n        for i in range(len(cls_indexes)):\n            index = cls_indexes[i]\n            is_materialed = self.is_materialed[index]\n            if is_materialed:\n                num = len(self.materials[index])\n                for idx in range(num):\n                    is_texture = self.is_textured[index][idx] #index\n                    if is_texture:\n                        shader = self.shaderProgram_textureMat\n                    elif self.textures[index][idx] == 'color':\n                        shader = self.shaderProgram_textureless\n                    else:  \n                        shader = self.shaderProgram_material\n                    GL.glUseProgram(shader)\n                    GL.glUniformMatrix4fv(GL.glGetUniformLocation(shader, 'V'), 1, GL.GL_TRUE, self.V)\n                    GL.glUniformMatrix4fv(GL.glGetUniformLocation(shader, 'P'), 1, GL.GL_FALSE, self.P)\n                    GL.glUniformMatrix4fv(GL.glGetUniformLocation(shader, 'pose_trans'), 1, GL.GL_FALSE, self.poses_trans[i])\n                    GL.glUniformMatrix4fv(GL.glGetUniformLocation(shader, 'pose_rot'), 1, GL.GL_TRUE, self.poses_rot[i])\n                    GL.glUniform3f(GL.glGetUniformLocation(shader, 'light_position'), *self.lightpos)\n                    GL.glUniform3f(GL.glGetUniformLocation(shader, 'instance_color'), *self.colors[index])\n                    GL.glUniform3f(GL.glGetUniformLocation(shader, 'light_color'), *self.lightcolor)\n\n                    GL.glUniform3f(GL.glGetUniformLocation(shader, 'mat_diffuse'), *self.materials[index][idx][:3])\n                    GL.glUniform3f(GL.glGetUniformLocation(shader, 'mat_specular'), *self.materials[index][idx][3:6])\n                    GL.glUniform3f(GL.glGetUniformLocation(shader, 'mat_ambient'),  *self.materials[index][idx][6:9])\n                    GL.glUniform1f(GL.glGetUniformLocation(shader, 'mat_shininess'), self.materials[index][idx][-1])\n\n                    try:\n                        if is_texture:\n                            GL.glActiveTexture(GL.GL_TEXTURE0)\n                            GL.glBindTexture(GL.GL_TEXTURE_2D, self.textures[index][idx]) #self.instances[index]\n                            GL.glUniform1i(self.texUnitUniform_textureMat, 0)\n                        GL.glBindVertexArray(self.VAOs[self.instances[index]+idx]) # \n                        GL.glDrawElements(GL.GL_TRIANGLES, self.faces[self.instances[index]+idx].size,\n                                     GL.GL_UNSIGNED_INT, self.faces[self.instances[index]+idx])\n                    finally:\n                        GL.glBindVertexArray(0)\n                        GL.glUseProgram(0)\n\n        GL.glDisable(GL.GL_DEPTH_TEST)\n            # mapping\n        self.r.map_tensor(int(self.color_tex), int(self.width), int(self.height), image_tensor.data_ptr())\n        self.r.map_tensor(int(self.color_tex_3), int(self.width), int(self.height), seg_tensor.data_ptr())\n        if normal_tensor is not None:\n            self.r.map_tensor(int(self.color_tex_2), int(self.width), int(self.height), normal_tensor.data_ptr())\n        if pc1_tensor is not None:\n            self.r.map_tensor(int(self.color_tex_4), int(self.width), int(self.height), pc1_tensor.data_ptr())\n        if pc2_tensor is not None:\n            self.r.map_tensor(int(self.color_tex_5), int(self.width), int(self.height), pc2_tensor.data_ptr())\n             \n        '''\n        GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT0)\n        frame = GL.glReadPixels(0, 0, self.width, self.height, GL.GL_BGRA, GL.GL_FLOAT)\n        #frame = np.frombuffer(frame,dtype = np.float32).reshape(self.width, self.height, 4)\n        frame = frame.reshape(self.height, self.width, 4)[::-1, :]\n\n        # GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT1)\n        #normal = GL.glReadPixels(0, 0, self.width, self.height, GL.GL_BGRA, GL.GL_FLOAT)\n        #normal = np.frombuffer(frame, dtype=np.uint8).reshape(self.width, self.height, 4)\n        #normal = normal[::-1, ]\n\n        GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT2)\n        seg = GL.glReadPixels(0, 0, self.width, self.height, GL.GL_BGRA, GL.GL_FLOAT)\n        #seg = np.frombuffer(frame, dtype=np.uint8).reshape(self.width, self.height, 4)\n        seg = seg.reshape(self.height, self.width, 4)[::-1, :]\n\n        #pc = GL.glReadPixels(0, 0, self.width, self.height, GL.GL_DEPTH_COMPONENT, GL.GL_FLOAT)\n        # seg = np.frombuffer(frame, dtype=np.uint8).reshape(self.width, self.height, 4)\n\n        #pc = np.stack([pc,pc, pc, np.ones(pc.shape)], axis = -1)\n        #pc = pc[::-1, ]\n        #pc = (1-pc) * 10\n\n        # points in object coordinate\n        GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT3)\n        pc2 = GL.glReadPixels(0, 0, self.width, self.height, GL.GL_RGBA, GL.GL_FLOAT)\n        pc2 = pc2.reshape(self.height, self.width, 4)[::-1, :]\n        pc2 = pc2[:,:,:3]\n\n        # points in camera coordinate\n        GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT4)\n        pc3 = GL.glReadPixels(0, 0, self.width, self.height, GL.GL_RGBA, GL.GL_FLOAT)\n        pc3 = pc3.reshape(self.height, self.width, 4)[::-1, :]\n        pc3 = pc3[:,:,:3]\n\n        return [frame, seg, pc2, pc3]\n        '''\n\n\n    def set_light_pos(self, light):\n        self.lightpos = light\n\n    def get_num_objects(self):\n        return len(self.objects)\n\n    def set_poses(self, poses):\n        self.poses_rot = [np.ascontiguousarray(\n            quat2rotmat(item[3:])) for item in poses]\n        self.poses_trans = [np.ascontiguousarray(\n            xyz2mat(item[:3])) for item in poses]\n\n    def set_allocentric_poses(self, poses):\n        self.poses_rot = []\n        self.poses_trans = []\n        for pose in poses:\n            x, y, z = pose[:3]\n            quat_input = pose[3:]\n            dx = np.arctan2(x, -z)\n            dy = np.arctan2(y, -z)\n            # print(dx, dy)\n            quat = euler2quat(-dy, -dx, 0, axes='sxyz')\n            quat = qmult(quat, quat_input)\n            self.poses_rot.append(np.ascontiguousarray(quat2rotmat(quat)))\n            self.poses_trans.append(np.ascontiguousarray(xyz2mat(pose[:3])))\n\n    def release(self):\n        print(self.glstring)\n        self.clean()\n        self.r.release()\n\n    def clean(self):\n        GL.glDeleteTextures([self.color_tex, self.color_tex_2,\n                             self.color_tex_3, self.color_tex_4, self.depth_tex])\n        self.color_tex = None\n        self.color_tex_2 = None\n        self.color_tex_3 = None\n        self.color_tex_4 = None\n\n        self.depth_tex = None\n        GL.glDeleteFramebuffers(1, [self.fbo])\n        self.fbo = None\n        GL.glDeleteBuffers(len(self.VAOs), self.VAOs)\n        self.VAOs = []\n        GL.glDeleteBuffers(len(self.VBOs), self.VBOs)\n        self.VBOs = []\n        GL.glDeleteTextures(self.textures)\n        self.textures = []\n        self.objects = []  # GC should free things here\n        self.faces = []  # GC should free things here\n        self.poses_trans = []  # GC should free things here\n        self.poses_rot = []  # GC should free things here\n\n    def transform_vector(self, vec):\n        vec = np.array(vec)\n        zeros = np.zeros_like(vec)\n\n        vec_t = self.transform_point(vec)\n        zero_t = self.transform_point(zeros)\n\n        v = vec_t - zero_t\n        return v\n\n    def transform_point(self, vec):\n        vec = np.array(vec)\n        if vec.shape[0] == 3:\n            v = self.V.dot(np.concatenate([vec, np.array([1])]))\n            return v[:3]/v[-1]\n        elif vec.shape[0] == 4:\n            v = self.V.dot(vec)\n            return v/v[-1]\n        else:\n            return None\n\n    def transform_pose(self, pose):\n        pose_rot = quat2rotmat(pose[3:])\n        pose_trans = xyz2mat(pose[:3])\n        pose_cam = self.V.dot(pose_trans.T).dot(pose_rot).T\n        return np.concatenate([mat2xyz(pose_cam), safemat2quat(pose_cam[:3, :3].T)])\n\n    def get_num_instances(self):\n        return len(self.instances)\n\n    def get_poses(self):\n        mat = [self.V.dot(self.poses_trans[i].T).dot(\n            self.poses_rot[i]).T for i in range(self.get_num_instances())]\n        poses = [np.concatenate(\n            [mat2xyz(item), safemat2quat(item[:3, :3].T)]) for item in mat]\n        return poses\n\n    def get_egocentric_poses(self):\n        return self.get_poses()\n\n    def get_allocentric_poses(self):\n        poses = self.get_poses()\n        poses_allocentric = []\n        for pose in poses:\n            dx = np.arctan2(pose[0], -pose[2])\n            dy = np.arctan2(pose[1], -pose[2])\n            quat = euler2quat(-dy, -dx, 0, axes='sxyz')\n            quat = qmult(qinverse(quat), pose[3:])\n            poses_allocentric.append(np.concatenate([pose[:3], quat]))\n            #print(quat, pose[3:], pose[:3])\n        return poses_allocentric\n\n    def get_centers(self):\n        centers = []\n        for i in range(len(self.poses_trans)):\n            pose_trans = self.poses_trans[i]\n            proj = (self.P.T.dot(self.V.dot(\n                pose_trans.T).dot(np.array([0, 0, 0, 1]))))\n            proj /= proj[-1]\n            centers.append(proj[:2])\n        centers = np.array(centers)\n        centers = (centers + 1) / 2.0\n        centers[:, 1] = 1 - centers[:, 1]\n        centers = centers[:, ::-1]  # in y, x order\n        return centers\n\n\n    def vis(self, poses, cls_indexes, color_idx=None, color_list=None, cam_pos=[0, 0, 2.0], V=None,\n         distance=2.0, shifted_pose=None, interact=0, window_name='test'):\n        \"\"\"\n        a complicated visualization module \n        \"\"\"\n        theta = 0\n        cam_x, cam_y, cam_z = cam_pos\n        sample = []\n        new_poses = []\n        origin = np.linalg.inv(unpack_pose(poses[0]))\n        if shifted_pose is not None:\n            origin = np.linalg.inv(shifted_pose)\n        for pose in poses:\n            pose = unpack_pose(pose)\n            pose = origin.dot(pose)\n            new_poses.append(pack_pose(pose))\n        poses = new_poses\n\n        cam_pos = np.array([cam_x, cam_y, cam_z])  \n        self.set_camera(cam_pos, cam_pos * 2 , [0, 1, 0])  \n        if V is not None:\n            self.V = V\n            cam_pos = V[:3, 3]\n        self.set_light_pos(cam_pos)      \n        self.set_poses(poses)\n\n        mouse_events = {\n        'view_dir': - self.V[:3, 3],\n        'view_origin': np.array([0, 0, 0.]), # anchor\n        '_mouse_ix': -1,\n        '_mouse_iy': -1,\n        'down': False,\n        'shift': False,\n        'trackball': Trackball(self.width, self.height, cam_pos=cam_pos) \n        }\n\n        image_tensor = torch.cuda.FloatTensor(self.height, self.width, 4).detach()\n        seg_tensor = torch.cuda.FloatTensor(self.height, self.width, 4).detach()\n\n        def update_dir():\n            view_dir = mouse_events['view_origin'] - self.V[:3, 3]  \n            self.set_camera(self.V[:3, 3], self.V[:3, 3] - view_dir, [0, 1, 0]) # would shift along the sphere\n            self.V = self.V.dot(mouse_events['trackball'].property[\"model\"].T)      \n                  \n        def change_dir(event, x, y, flags, param): # fix later to be a finalized version\n            if event == cv2.EVENT_LBUTTONDOWN:\n                mouse_events['_mouse_ix'], mouse_events['_mouse_iy'] = x, y\n                mouse_events['down'] = True\n            if event == cv2.EVENT_MBUTTONDOWN:\n                mouse_events['_mouse_ix'], mouse_events['_mouse_iy'] = x, y\n                mouse_events['shift'] = True\n            if event == cv2.EVENT_MOUSEMOVE:\n                if mouse_events['down']:\n                    dx = (x - mouse_events['_mouse_ix']) / -10.\n                    dy = (y - mouse_events['_mouse_iy']) / -10.\n                    mouse_events['trackball'].on_mouse_drag(x,y,dx,dy)\n                    update_dir()\n                \n                if mouse_events['shift']:\n                    dx = (x - mouse_events['_mouse_ix']) / (-4000. / self.V[2, 3])\n                    dy = (y - mouse_events['_mouse_iy']) / (-4000. / self.V[2, 3]) \n                    self.V[:3, 3] += 0.5 * np.array([dx, dy, 0])\n                    mouse_events['view_origin'] += 0.5 * np.array([-dx, dy, 0]) # change\n                    update_dir()\n            if event == cv2.EVENT_LBUTTONUP:\n                mouse_events['down'] = False\n            if event == cv2.EVENT_MBUTTONUP:\n                mouse_events['shift'] = False\n        if interact > 0:\n            cv2.namedWindow(window_name)\n            cv2.setMouseCallback(window_name, change_dir)\n        \n        # update_dir()\n        img = np.zeros([self.height, self.width, 3])\n        while True:\n            new_cam_pos = -self.V[:3, :3].T.dot(self.V[:3, 3])\n            q = cv2.waitKey(3)\n            if interact > 0:\n                if q == ord('w'):\n                    cam_z += 0.05\n                elif q == ord('s'):\n                    cam_z -= 0.05\n                    interact = 2\n                elif q == ord('u'):\n                    interact = 1\n                elif q == ord('a'):\n                    theta -= 0.1\n                elif q == ord('d'):\n                    theta += 0.1\n                elif q == ord('x'): \n                    self.V[:3, 3] += 0.02 * (self.V[:3, 3] - mouse_events['view_origin'])\n                    update_dir()\n                elif q == ord('c'): # move closer\n                    self.V[:3, 3] -= 0.02 * (self.V[:3, 3] - mouse_events['view_origin'])\n                    update_dir()\n                elif q == ord('z'): # reset\n                    self.set_camera(cam_pos, cam_pos * 2 , [0, 1, 0])\n                    mouse_events['trackball'].reinit(cam_pos)\n                    mouse_events['view_origin'] = np.zeros(3)\n                elif q == ord('i'):\n                    for pose in poses:\n                        pose[1] += 0.02\n                elif q == ord('k'):\n                    for pose in poses:\n                        pose[1] -= 0.02\n                elif q == ord('j'):\n                    for pose in poses:\n                        pose[0] -= 0.02\n                elif q == ord('l'):\n                    for pose in poses:\n                        pose[0] += 0.02\n                elif q == ord('n'):\n                    print('camera V', self.V)\n                elif q == ord('p'):\n                    cur_dir = os.path.dirname(os.path.abspath(__file__))    \n                    Image.fromarray(\n                    (np.clip(frame[0][:, :, [2,1,0]] * 255, 0, 255)).astype(np.uint8)).save(cur_dir + '/test.png')\n                elif q == ord('q'): # wth\n                    break\n                elif q == ord('r'):  # rotate\n                    for pose in poses:\n                        pose[3:] = qmult(axangle2quat(\n                            [0, 0, 1], 5/180.0 * np.pi), pose[3:])\n            self.set_poses(poses)            \n            self.set_light_pos(new_cam_pos) # in world coordinate\n            self.render(cls_indexes, image_tensor, seg_tensor)\n            image_tensor = image_tensor.flip(0)\n            img = image_tensor.cpu().numpy()\n            img = np.clip(img, 0, 1)\n            img = img[:, :, :3] * 255\n            img = img.astype(np.uint8)\n            if interact > 0:\n                cv2.imshow(window_name, img[:,:,::-1])\n            if interact < 2:\n                break\n        return img\n\ncamera_extrinsics=np.array([[-0.211719, 0.97654, -0.0393032, 0.377451],[0.166697, -0.00354316, -0.986002, 0.374476],[-0.96301, -0.215307, -0.162036, 1.87315],[0,0, 0, 1]])\n\n\n\ndef parse_args():\n    \"\"\"\n    Parse input arguments\n    \"\"\"\n    parser = argparse.ArgumentParser(description='Train a Fast R-CNN network')\n    parser.add_argument('--model_path', dest='model_path',\n                        help='path of the ycb models',\n                        default='../data', type=str)\n    parser.add_argument('--robot_name', dest='robot_name',\n                        help='robot name',\n                        default='', type=str)\n    args = parser.parse_args()\n    return args\n\n\n\nif __name__ == '__main__':\n\n    args = parse_args()\n    model_path = args.model_path\n    robot_name = args.robot_name\n    width = 640\n    height = 480\n\n    renderer = YCBRenderer(width=width, height=height, render_marker=True, robot=robot_name)\n    if robot_name == 'baxter':\n        from robotPose.robot_pykdl import *\n        print('robot name', robot_name)\n        models = ['S0', 'S1', 'E0', 'E1', 'W0', 'W1', 'W2']\n        #models = ['E1']\n        obj_paths = [\n            'robotPose/{}_models/{}.DAE'.format(robot_name,item) for item in models]\n        colors = [\n            [0.1*(idx+1),0,0] for idx in range(len(models))]\n        texture_paths = ['' for item in models]\n    elif robot_name == 'panda_arm':\n        from robotPose.robot_pykdl import *\n        print('robot name', robot_name)\n        models = ['link1', 'link2', 'link3', 'link4', 'link5', 'link6', 'link7', 'hand', 'finger', 'finger']\n        #models = ['link4']\n        obj_paths = [\n            'robotPose/{}_models/{}.DAE'.format(robot_name,item) for item in models]\n        colors = [\n            [0,0.1*(idx+1),0] for idx in range(len(models))]\n        texture_paths = ['' for item in models]\n    else:\n        models = [\"003_cracker_box\", \"002_master_chef_can\", \"011_banana\"]\n        colors = [[0.9, 0, 0], [0.6, 0, 0], [0.3, 0, 0]]\n\n        obj_paths = [\n            '{}/models/{}/textured_simple.obj'.format(model_path, item) for item in models]\n        texture_paths = [\n            '{}/models/{}/texture_map.png'.format(model_path, item) for item in models]\n\n    print(obj_paths)\n    renderer.load_objects(obj_paths, texture_paths, colors)\n\n    # mat = pose2mat(pose)\n    pose = np.array([-0.025801208, 0.08432201, 0.004528991,\n                     0.9992879, -0.0021458883, 0.0304758, 0.022142926])\n    pose2 = np.array([-0.56162935, 0.05060109, -0.028915625,\n                      0.6582951, 0.03479896, -0.036391996, -0.75107396])\n    pose3 = np.array([0.22380374, 0.019853603, 0.12159989,\n                      0.9992879, -0.0021458883, 0.0304758, 0.022142926])\n\n    theta = 0\n    z = 1\n    fix_pos = [np.sin(theta), z, np.cos(theta)]\n    renderer.set_camera(fix_pos, [0, 0, 0], [0, 1, 0])\n    fix_pos = np.zeros(3)\n    renderer.set_poses([pose, pose2, pose3])\n    cls_indexes = [0, 1, 2]\n    if robot_name == 'baxter' or robot_name == 'panda_arm' :\n        import scipy.io as sio\n        robot = robot_kinematics(robot_name)\n        poses = []\n        if robot_name == 'baxter':\n            base_link = 'right_arm_mount'\n        else:\n            base_link = 'panda_link0'\n        pose, joint = robot.gen_rand_pose(base_link)\n        cls_indexes = range(len(models)) \n        pose = robot.offset_pose_center(pose, dir='off', base_link=base_link)         #print pose_hand\n        #pose = np.load('%s.npy'%robot_name) \n        for i in range(len(pose)):\n            pose_i =  pose[i]\n            quat = mat2quat(pose_i[:3,:3])\n            trans = pose_i[:3,3]\n            poses.append(np.hstack((trans,quat)))\n\n        renderer.set_poses(poses)\n        renderer.V = camera_extrinsics\n        renderer.set_projection_matrix(640,480,525,525,319.5,239.5,0.0001,6) \n        fix_pos = renderer.V[:3, 3].reshape([1,3]).copy()\n    renderer.set_light_pos([1, 1, 1])\n    renderer.set_light_color([1.0, 1.0, 1.0])\n    image_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n    seg_tensor = torch.cuda.FloatTensor(height, width, 4).detach()\n    \n    import time\n    start = time.time()\n    while True:\n        renderer.render(cls_indexes, image_tensor, seg_tensor)\n        image_tensor = image_tensor.flip(0)\n        seg_tensor = seg_tensor.flip(0)\n        frame = [image_tensor.cpu().numpy(), seg_tensor.cpu().numpy()]\n        centers = renderer.get_centers()\n        for center in centers:\n            x = int(center[1] * width)\n            y = int(center[0] * height)\n            frame[0][y-2:y+2, x-2:x+2, :] = 1\n            frame[1][y-2:y+2, x-2:x+2, :] = 1\n        if len(sys.argv) > 2 and sys.argv[2] == 'headless':\n            # print(np.mean(frame[0]))\n            theta += 0.001\n            if theta > 1:\n                break\n        else:\n            #import matplotlib.pyplot as plt\n            #plt.imshow(np.concatenate(frame, axis=1))\n            # plt.show()\n            cv2.imshow('test', cv2.cvtColor(\n                np.concatenate(frame, axis=1), cv2.COLOR_RGB2BGR))\n            q = cv2.waitKey(16)\n            if q == ord('w'):\n                z += 0.05\n            elif q == ord('s'):\n                z -= 0.05\n            elif q == ord('a'):\n                theta -= 0.1\n            elif q == ord('d'):\n                theta += 0.1\n            elif q == ord('p'):\n                Image.fromarray(\n                    (frame[0][:, :, :3] * 255).astype(np.uint8)).save('test.png')\n            elif q == ord('q'):\n                break\n            elif q == ord('r'):  # rotate\n                pose[3:] = qmult(axangle2quat(\n                    [0, 0, 1], 5/180.0 * np.pi), pose[3:])\n                pose2[3:] = qmult(axangle2quat(\n                    [0, 0, 1], 5 / 180.0 * np.pi), pose2[3:])\n                pose3[3:] = qmult(axangle2quat(\n                    [0, 0, 1], 5 / 180.0 * np.pi), pose3[3:])\n                renderer.set_poses([pose, pose2, pose3])\n\n        cam_pos = fix_pos + np.array([np.sin(theta), z, np.cos(theta)])\n        if robot_name == 'baxter' or robot_name == 'panda_arm' :\n            renderer.V[:3, 3] = np.array(cam_pos)\n        else:\n            cam_pos = fix_pos + np.array([np.sin(theta), z, np.cos(theta)])\n            renderer.set_camera(cam_pos, [0, 0, 0], [0, 1, 0])\n        #renderer.set_light_pos(cam_pos)\n    dt = time.time() - start\n    print(\"{} fps\".format(1000 / dt))\n\n    renderer.release()\n"
  }
]