Repository: NVlabs/PoseCNN-PyTorch Branch: main Commit: f7d28f2abd38 Files: 121 Total size: 1.2 MB Directory structure: gitextract_vctsyxbk/ ├── .gitignore ├── .gitmodules ├── LICENSE.md ├── README.md ├── build.sh ├── experiments/ │ ├── cfgs/ │ │ ├── dex_ycb.yml │ │ ├── ycb_object.yml │ │ ├── ycb_object_detection.yml │ │ ├── ycb_object_self_supervision.yml │ │ └── ycb_video.yml │ └── scripts/ │ ├── demo.sh │ ├── dex_ycb_test_s0.sh │ ├── dex_ycb_test_s1.sh │ ├── dex_ycb_test_s2.sh │ ├── dex_ycb_test_s3.sh │ ├── dex_ycb_train_s0.sh │ ├── dex_ycb_train_s1.sh │ ├── dex_ycb_train_s2.sh │ ├── dex_ycb_train_s3.sh │ ├── ros_ycb_object_test.sh │ ├── ros_ycb_object_test_detection.sh │ ├── ycb_object_test.sh │ ├── ycb_object_train.sh │ ├── ycb_object_train_detection.sh │ ├── ycb_object_train_self_supervision.sh │ ├── ycb_video_test.sh │ └── ycb_video_train.sh ├── lib/ │ ├── datasets/ │ │ ├── __init__.py │ │ ├── background.py │ │ ├── dex_ycb.py │ │ ├── factory.py │ │ ├── imdb.py │ │ ├── ycb_object.py │ │ ├── ycb_self_supervision.py │ │ └── ycb_video.py │ ├── fcn/ │ │ ├── __init__.py │ │ ├── config.py │ │ ├── render_utils.py │ │ ├── test_common.py │ │ ├── test_dataset.py │ │ ├── test_imageset.py │ │ └── train.py │ ├── layers/ │ │ ├── ROIAlign_cuda.cu │ │ ├── __init__.py │ │ ├── backproject_kernel.cu │ │ ├── hard_label.py │ │ ├── hard_label_kernel.cu │ │ ├── hough_voting.py │ │ ├── hough_voting_kernel.cu │ │ ├── point_matching_loss.py │ │ ├── point_matching_loss_kernel.cu │ │ ├── pose_target_layer.py │ │ ├── posecnn_layers.cpp │ │ ├── roi_align.py │ │ ├── roi_pooling.py │ │ ├── roi_pooling_kernel.cu │ │ ├── roi_target_layer.py │ │ ├── sdf_matching_loss.py │ │ ├── sdf_matching_loss_kernel.cu │ │ └── setup.py │ ├── networks/ │ │ ├── PoseCNN.py │ │ └── __init__.py │ ├── sdf/ │ │ ├── __init__.py │ │ ├── _init_paths.py │ │ ├── multi_sdf_optimizer.py │ │ ├── sdf_optimizer.py │ │ ├── sdf_utils.py │ │ └── test_sdf_optimizer.py │ └── utils/ │ ├── __init__.py │ ├── bbox.pyx │ ├── bbox_transform.py │ ├── blob.py │ ├── nms.py │ ├── pose_error.py │ ├── se3.py │ ├── segmentation_evaluation.py │ └── setup.py ├── requirement.txt ├── ros/ │ ├── _init_paths.py │ ├── collect_images_realsense.py │ ├── posecnn.rviz │ └── test_images.py ├── tools/ │ ├── _init_paths.py │ ├── test_images.py │ ├── test_net.py │ └── train_net.py └── ycb_render/ ├── CMakeLists.txt ├── __init__.py ├── cpp/ │ ├── query_devices.cpp │ ├── test_device.cpp │ └── ycb_renderer.cpp ├── get_available_devices.py ├── glad/ │ ├── EGL/ │ │ └── eglplatform.h │ ├── KHR/ │ │ └── khrplatform.h │ ├── egl.c │ ├── gl.c │ ├── glad/ │ │ ├── egl.h │ │ ├── gl.h │ │ └── glx.h │ ├── glx_dyn.c │ └── linmath.h ├── glutils/ │ ├── __init__.py │ ├── _trackball.py │ ├── glcontext.py │ ├── glrenderer.py │ ├── meshutil.py │ ├── trackball.py │ └── utils.py ├── setup.py ├── shaders/ │ ├── frag.shader │ ├── frag_blinnphong.shader │ ├── frag_mat.shader │ ├── frag_simple.shader │ ├── frag_textureless.shader │ ├── vert.shader │ ├── vert_blinnphong.shader │ ├── vert_mat.shader │ ├── vert_simple.shader │ └── vert_textureless.shader ├── visualize_sim.py └── ycb_renderer.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ *.mex* *.pyc *.tgz *.so *.o output* lib/synthesize/build/* lib/utils/bbox.c data/ data_self/ docker/ ngc/ .idea/ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ .idea/ . *.png results/ ================================================ FILE: .gitmodules ================================================ [submodule "ycb_render/pybind11"] path = ycb_render/pybind11 url = https://github.com/pybind/pybind11.git ================================================ FILE: LICENSE.md ================================================ # NVIDIA Source Code License for PoseCNN-PyTorch: A PyTorch Implementation of the PoseCNN Framework for 6D Object Pose Estimation ## 1. Definitions “Licensor” means any person or entity that distributes its Work. “Software” means the original work of authorship made available under this License. “Work” means the Software and any additions to or derivative works of the Software that are made available under this License. “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. The 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. Works, 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. ## 2. License Grants ### 2.1 Copyright Grant. Subject 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. ## 3. Limitations ### 3.1 Redistribution. 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. ### 3.2 Derivative Works. 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. ### 3.3 Use Limitation. 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. ### 3.4 Patent Claims. 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. ### 3.5 Trademarks. 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. ### 3.6 Termination. 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. ## 4. Disclaimer of Warranty. THE 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. ## 5. Limitation of Liability. EXCEPT 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. ================================================ FILE: README.md ================================================ # PoseCNN-PyTorch: A PyTorch Implementation of the PoseCNN Framework for 6D Object Pose Estimation ### Introduction We implement PoseCNN in PyTorch in this project. PoseCNN 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/) Rotation regression in PoseCNN cannot handle symmetric objects very well. Check [PoseRBPF](https://github.com/NVlabs/PoseRBPF) for a better solution for symmetric objects. The code also supports pose refinement by matching segmented 3D point cloud of an object to its SDF.

### License PoseCNN-PyTorch is released under the NVIDIA Source Code License (refer to the LICENSE file for details). ### Citation If you find the package is useful in your research, please consider citing: @inproceedings{xiang2018posecnn, Author = {Yu Xiang and Tanner Schmidt and Venkatraman Narayanan and Dieter Fox}, Title = {{PoseCNN}: A Convolutional Neural Network for {6D} Object Pose Estimation in Cluttered Scenes}, booktitle = {Robotics: Science and Systems (RSS)}, Year = {2018} } ### Required environment - Ubuntu 16.04 or above - PyTorch 0.4.1 or above - CUDA 9.1 or above ### Installation Use python3. If ROS is needed, compile with python2. 1. Install [PyTorch](https://pytorch.org/) 2. Install Eigen from the Github source code [here](https://github.com/eigenteam/eigen-git-mirror) 3. Install Sophus from the Github source code [here](https://github.com/yuxng/Sophus) 4. Install python packages ```Shell pip install -r requirement.txt ``` 5. Initialize the submodules in ycb_render ```Shell git submodule update --init --recursive ``` 6. Compile the new layers under $ROOT/lib/layers we introduce in PoseCNN ```Shell cd $ROOT/lib/layers sudo python setup.py install ``` 7. Compile cython components ```Shell cd $ROOT/lib/utils python setup.py build_ext --inplace ``` 8. Compile the ycb_render in $ROOT/ycb_render ```Shell cd $ROOT/ycb_render sudo python setup.py develop ``` ### Download - 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. - 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. - 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. ### Running the demo 1. Download 3D models and our pre-trained checkpoints first. 2. run the following script ```Shell ./experiments/scripts/demo.sh ```

### Training your own models with synthetic data for YCB objects 1. Download background images, and save to $ROOT/data or use symbol links. - Our own images [here](https://drive.google.com/file/d/1Q5VTKHEEejT2lAKwefG00eWcrnNnpieC/view?usp=sharing) (7G) - COCO 2014 images [here](https://cocodataset.org/#download) - Or use your own background images 2. 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. 3. Training and testing for 20 YCB objects with synthetic data. Modify the configuration file for training on a subset of these objects. ```Shell cd $ROOT # multi-gpu training, use 1 GPU or 2 GPUs since batch size is set to 2 ./experiments/scripts/ycb_object_train.sh # testing on synthetic data, $GPU_ID can be 0, 1, etc. ./experiments/scripts/ycb_object_test.sh $GPU_ID ``` ### Training and testing on the YCB-Video dataset 1. Download the YCB-Video dataset from [here](https://rse-lab.cs.washington.edu/projects/posecnn/). 2. Create a symlink for the YCB-Video dataset ```Shell cd $ROOT/data/YCB_Video ln -s $ycb_data data ``` 3. Training and testing on the YCB-Video dataset ```Shell cd $ROOT # multi-gpu training, use 1 GPU or 2 GPUs since batch size is set to 2 ./experiments/scripts/ycb_video_train.sh # testing, $GPU_ID can be 0, 1, etc. ./experiments/scripts/ycb_video_test.sh $GPU_ID ``` ### Training and testing on the DexYCB dataset 1. Download the DexYCB dataset from [here](https://dex-ycb.github.io/). 2. Create a symlink for the DexYCB dataset ```Shell cd $ROOT/data/DEX_YCB ln -s $dex_ycb_data data ``` 3. Training and testing on the DexYCB dataset ```Shell cd $ROOT # multi-gpu training for different splits, use 1 GPU or 2 GPUs since batch size is set to 2 ./experiments/scripts/dex_ycb_train_s0.sh ./experiments/scripts/dex_ycb_train_s1.sh ./experiments/scripts/dex_ycb_train_s2.sh ./experiments/scripts/dex_ycb_train_s3.sh # testing, $GPU_ID can be 0, 1, etc. # our trained models are in checkpoints.zip ./experiments/scripts/dex_ycb_test_s0.sh $GPU_ID $EPOCH ./experiments/scripts/dex_ycb_test_s1.sh $GPU_ID $EPOCH ./experiments/scripts/dex_ycb_test_s2.sh $GPU_ID $EPOCH ./experiments/scripts/dex_ycb_test_s3.sh $GPU_ID $EPOCH ``` ### Running with ROS on a Realsense Camera for real-world pose estimation - Python2 is needed for ROS. - Make sure our pretrained checkpoints are downloaded. ```Shell # start realsense roslaunch realsense2_camera rs_aligned_depth.launch tf_prefix:=measured/camera # start rviz rosrun rviz rviz -d ./ros/posecnn.rviz # run posecnn for detection only (20 objects), $GPU_ID can be 0, 1, etc. ./experiments/scripts/ros_ycb_object_test_detection.sh $GPU_ID # run full posecnn (20 objects), $GPU_ID can be 0, 1, etc. ./experiments/scripts/ros_ycb_object_test.sh $GPU_ID ``` Our example:

================================================ FILE: build.sh ================================================ cd lib/layers/; python3 setup.py build develop; cd ../utils; python3 setup.py build_ext --inplace; cd ../../ycb_render; python3 setup.py develop ================================================ FILE: experiments/cfgs/dex_ycb.yml ================================================ EXP_DIR: dex_ycb INPUT: COLOR TRAIN: TRAINABLE: True WEIGHT_DECAY: 0.0001 LEARNING_RATE: 0.001 MILESTONES: !!python/tuple [12] MOMENTUM: 0.9 BETA: 0.999 GAMMA: 0.1 SCALES_BASE: !!python/tuple [1.0] IMS_PER_BATCH: 2 MAX_ITERS_PER_EPOCH: 20000 NUM_UNITS: 64 HARD_LABEL_THRESHOLD: 0.9 HARD_LABEL_SAMPLING: 0.0 HARD_ANGLE: 5.0 HOUGH_LABEL_THRESHOLD: 100 HOUGH_VOTING_THRESHOLD: 10 HOUGH_SKIP_PIXELS: 10 FG_THRESH: 0.5 FG_THRESH_POSE: 0.5 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 SNAPSHOT_INFIX: dex_ycb SNAPSHOT_EPOCHS: 1 SNAPSHOT_PREFIX: vgg16 USE_FLIPPED: False CHROMATIC: True ADD_NOISE: True VISUALIZE: False VERTEX_REG: True POSE_REG: True FREEZE_LAYERS: False VERTEX_W: 10.0 VERTEX_W_INSIDE: 10.0 # synthetic data SYNTHESIZE: False SYN_RATIO: 5 SYN_BACKGROUND_SPECIFIC: False SYN_BACKGROUND_SUBTRACT_MEAN: True SYN_SAMPLE_OBJECT: True SYN_SAMPLE_POSE: False SYN_MIN_OBJECT: 5 SYN_MAX_OBJECT: 8 SYN_TNEAR: 0.5 SYN_TFAR: 1.6 SYN_BOUND: 0.15 SYN_STD_ROTATION: 15 SYN_STD_TRANSLATION: 0.05 TEST: SINGLE_FRAME: True HOUGH_LABEL_THRESHOLD: 200 HOUGH_VOTING_THRESHOLD: 10 NUM_SDF_ITERATIONS_TRACKING: 50 SDF_TRANSLATION_REG: 1000.0 SDF_ROTATION_REG: 10.0 IMS_PER_BATCH: 1 HOUGH_SKIP_PIXELS: 10 DET_THRESHOLD: 0.1 SCALES_BASE: !!python/tuple [1.0] VISUALIZE: False SYNTHESIZE: False POSE_REFINE: True ROS_CAMERA: camera 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 ================================================ FILE: experiments/cfgs/ycb_object.yml ================================================ EXP_DIR: ycb_object INPUT: COLOR TRAIN: TRAINABLE: True WEIGHT_DECAY: 0.0001 LEARNING_RATE: 0.001 MILESTONES: !!python/tuple [3] MOMENTUM: 0.9 BETA: 0.999 GAMMA: 0.1 SCALES_BASE: !!python/tuple [1.0] IMS_PER_BATCH: 2 NUM_UNITS: 64 HARD_LABEL_THRESHOLD: 0.9 HARD_LABEL_SAMPLING: 0.0 HARD_ANGLE: 5.0 HOUGH_LABEL_THRESHOLD: 100 HOUGH_VOTING_THRESHOLD: 10 HOUGH_SKIP_PIXELS: 10 FG_THRESH: 0.5 FG_THRESH_POSE: 0.5 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 SYMMETRY: !!python/tuple [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1] SNAPSHOT_INFIX: ycb_object SNAPSHOT_EPOCHS: 1 SNAPSHOT_PREFIX: vgg16 USE_FLIPPED: False CHROMATIC: True ADD_NOISE: True VISUALIZE: False VERTEX_REG: True POSE_REG: True SLIM: False # synthetic data SYNTHESIZE: True SYNNUM: 40000 SYN_RATIO: 5 SYN_BACKGROUND_SPECIFIC: True SYN_BACKGROUND_SUBTRACT_MEAN: True SYN_SAMPLE_OBJECT: True SYN_SAMPLE_POSE: False SYN_MIN_OBJECT: 5 SYN_MAX_OBJECT: 8 SYN_TNEAR: 0.5 SYN_TFAR: 1.6 SYN_BOUND: 0.3 SYN_STD_ROTATION: 15 SYN_STD_TRANSLATION: 0.05 TEST: SINGLE_FRAME: True HOUGH_LABEL_THRESHOLD: 400 HOUGH_VOTING_THRESHOLD: 10 NUM_SDF_ITERATIONS_TRACKING: 50 SDF_TRANSLATION_REG: 1000.0 SDF_ROTATION_REG: 10.0 IMS_PER_BATCH: 1 HOUGH_SKIP_PIXELS: 10 DET_THRESHOLD: 0.2 SCALES_BASE: !!python/tuple [1.0] VISUALIZE: True SYNTHESIZE: True POSE_REFINE: True ROS_CAMERA: D435 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 SYMMETRY: !!python/tuple [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1] ================================================ FILE: experiments/cfgs/ycb_object_detection.yml ================================================ EXP_DIR: ycb_object INPUT: COLOR TRAIN: TRAINABLE: True WEIGHT_DECAY: 0.0001 LEARNING_RATE: 0.001 MILESTONES: !!python/tuple [3] MOMENTUM: 0.9 BETA: 0.999 GAMMA: 0.1 SCALES_BASE: !!python/tuple [1.0] IMS_PER_BATCH: 2 NUM_UNITS: 64 HARD_LABEL_THRESHOLD: 0.9 HARD_LABEL_SAMPLING: 0.0 HARD_ANGLE: 5.0 HOUGH_LABEL_THRESHOLD: 100 HOUGH_VOTING_THRESHOLD: 10 HOUGH_SKIP_PIXELS: 10 FG_THRESH: 0.5 FG_THRESH_POSE: 0.5 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 SYMMETRY: !!python/tuple [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1] SNAPSHOT_INFIX: ycb_object_detection SNAPSHOT_EPOCHS: 1 SNAPSHOT_PREFIX: vgg16 USE_FLIPPED: False CHROMATIC: True ADD_NOISE: True VISUALIZE: False VERTEX_REG: True POSE_REG: False # no rotation regression SLIM: True # synthetic data SYNTHESIZE: True SYNNUM: 40000 SYN_RATIO: 5 SYN_BACKGROUND_SPECIFIC: True SYN_BACKGROUND_SUBTRACT_MEAN: True SYN_SAMPLE_OBJECT: True SYN_SAMPLE_POSE: False SYN_MIN_OBJECT: 5 SYN_MAX_OBJECT: 8 SYN_TNEAR: 0.5 SYN_TFAR: 1.6 SYN_BOUND: 0.3 SYN_STD_ROTATION: 15 SYN_STD_TRANSLATION: 0.05 TEST: SINGLE_FRAME: True HOUGH_LABEL_THRESHOLD: 400 HOUGH_VOTING_THRESHOLD: 10 IMS_PER_BATCH: 1 HOUGH_SKIP_PIXELS: 10 DET_THRESHOLD: 0.2 SCALES_BASE: !!python/tuple [1.0] VISUALIZE: False SYNTHESIZE: True POSE_REFINE: False ROS_CAMERA: D435 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 SYMMETRY: !!python/tuple [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1] ================================================ FILE: experiments/cfgs/ycb_object_self_supervision.yml ================================================ EXP_DIR: ycb_self_supervision INPUT: COLOR TRAIN: TRAINABLE: True WEIGHT_DECAY: 0.0001 LEARNING_RATE: 0.0001 MILESTONES: !!python/tuple [10000000] MOMENTUM: 0.9 BETA: 0.999 GAMMA: 0.1 SCALES_BASE: !!python/tuple [1.0] IMS_PER_BATCH: 2 NUM_UNITS: 64 HARD_LABEL_THRESHOLD: 0.9 HARD_LABEL_SAMPLING: 0.0 HARD_ANGLE: 5.0 HOUGH_LABEL_THRESHOLD: 100 HOUGH_VOTING_THRESHOLD: 10 HOUGH_SKIP_PIXELS: 10 FG_THRESH: 0.5 FG_THRESH_POSE: 0.5 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 SYMMETRY: !!python/tuple [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1] SNAPSHOT_INFIX: ycb_object_self_supervision SNAPSHOT_EPOCHS: 1 SNAPSHOT_PREFIX: vgg16 USE_FLIPPED: False CHROMATIC: True ADD_NOISE: True VISUALIZE: False VERTEX_REG: True POSE_REG: True SLIM: False MAX_ITERS_PER_EPOCH: 20000 # synthetic data SYNTHESIZE: True SYNNUM: 40000 SYN_RATIO: 3 SYN_BACKGROUND_SPECIFIC: True SYN_BACKGROUND_SUBTRACT_MEAN: True SYN_SAMPLE_OBJECT: True SYN_SAMPLE_POSE: False SYN_MIN_OBJECT: 5 SYN_MAX_OBJECT: 8 SYN_TNEAR: 0.5 SYN_TFAR: 1.6 SYN_BOUND: 0.3 SYN_STD_ROTATION: 15 SYN_STD_TRANSLATION: 0.05 TEST: SINGLE_FRAME: True HOUGH_LABEL_THRESHOLD: 100 HOUGH_VOTING_THRESHOLD: 10 NUM_SDF_ITERATIONS_TRACKING: 50 SDF_TRANSLATION_REG: 1000.0 SDF_ROTATION_REG: 10.0 IMS_PER_BATCH: 1 HOUGH_SKIP_PIXELS: 10 DET_THRESHOLD: 0.2 SCALES_BASE: !!python/tuple [1.0] VISUALIZE: True SYNTHESIZE: False POSE_REFINE: True ROS_CAMERA: D435 CLASSES: !!python/tuple [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21] SYMMETRY: !!python/tuple [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1] ================================================ FILE: experiments/cfgs/ycb_video.yml ================================================ EXP_DIR: ycb_video INPUT: COLOR TRAIN: TRAINABLE: True WEIGHT_DECAY: 0.0001 LEARNING_RATE: 0.001 MILESTONES: !!python/tuple [12] MOMENTUM: 0.9 BETA: 0.999 GAMMA: 0.1 SCALES_BASE: !!python/tuple [1.0] IMS_PER_BATCH: 2 MAX_ITERS_PER_EPOCH: 20000 NUM_UNITS: 64 HARD_LABEL_THRESHOLD: 0.9 HARD_LABEL_SAMPLING: 0.0 HARD_ANGLE: 5.0 HOUGH_LABEL_THRESHOLD: 100 HOUGH_VOTING_THRESHOLD: 10 HOUGH_SKIP_PIXELS: 10 FG_THRESH: 0.5 FG_THRESH_POSE: 0.5 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] SNAPSHOT_INFIX: ycb_video SNAPSHOT_EPOCHS: 1 SNAPSHOT_PREFIX: vgg16 USE_FLIPPED: False CHROMATIC: True ADD_NOISE: True VISUALIZE: False VERTEX_REG: True POSE_REG: True FREEZE_LAYERS: False VERTEX_W: 10.0 VERTEX_W_INSIDE: 10.0 # synthetic data SYNTHESIZE: False SYN_RATIO: 5 SYN_BACKGROUND_SPECIFIC: False SYN_BACKGROUND_SUBTRACT_MEAN: True SYN_SAMPLE_OBJECT: True SYN_SAMPLE_POSE: False SYN_MIN_OBJECT: 5 SYN_MAX_OBJECT: 8 SYN_TNEAR: 0.5 SYN_TFAR: 1.6 SYN_BOUND: 0.15 SYN_STD_ROTATION: 15 SYN_STD_TRANSLATION: 0.05 TEST: SINGLE_FRAME: True HOUGH_LABEL_THRESHOLD: 200 HOUGH_VOTING_THRESHOLD: 10 NUM_SDF_ITERATIONS_TRACKING: 50 SDF_TRANSLATION_REG: 100.0 SDF_ROTATION_REG: 1.0 IMS_PER_BATCH: 1 HOUGH_SKIP_PIXELS: 10 DET_THRESHOLD: 0.1 SCALES_BASE: !!python/tuple [1.0] VISUALIZE: False SYNTHESIZE: False POSE_REFINE: True ROS_CAMERA: camera 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] # CLASSES: !!python/tuple [0, 1, 2, 3, 4] ================================================ FILE: experiments/scripts/demo.sh ================================================ #!/bin/bash set -x set -e export PYTHONUNBUFFERED="True" export CUDA_VISIBLE_DEVICES=0 time ./tools/test_images.py --gpu 0 \ --imgdir data/demo/ \ --meta data/demo/meta.yml \ --color *color.png \ --network posecnn \ --pretrained data/checkpoints/ycb_object/vgg16_ycb_object_self_supervision_epoch_8.checkpoint.pth \ --dataset ycb_object_test \ --cfg experiments/cfgs/ycb_object.yml ================================================ FILE: experiments/scripts/dex_ycb_test_s0.sh ================================================ #!/bin/bash set -x set -e export CUDA_VISIBLE_DEVICES=$1 time ./tools/test_net.py --gpu $1 \ --network posecnn \ --pretrained output/dex_ycb/dex_ycb_s0_train/vgg16_dex_ycb_epoch_$2.checkpoint.pth \ --dataset dex_ycb_s0_test \ --cfg experiments/cfgs/dex_ycb.yml ================================================ FILE: experiments/scripts/dex_ycb_test_s1.sh ================================================ #!/bin/bash set -x set -e export CUDA_VISIBLE_DEVICES=$1 time ./tools/test_net.py --gpu $1 \ --network posecnn \ --pretrained output/dex_ycb/dex_ycb_s1_train/vgg16_dex_ycb_epoch_$2.checkpoint.pth \ --dataset dex_ycb_s1_test \ --cfg experiments/cfgs/dex_ycb.yml ================================================ FILE: experiments/scripts/dex_ycb_test_s2.sh ================================================ #!/bin/bash set -x set -e export CUDA_VISIBLE_DEVICES=$1 time ./tools/test_net.py --gpu $1 \ --network posecnn \ --pretrained output/dex_ycb/dex_ycb_s2_train/vgg16_dex_ycb_epoch_$2.checkpoint.pth \ --dataset dex_ycb_s2_test \ --cfg experiments/cfgs/dex_ycb.yml ================================================ FILE: experiments/scripts/dex_ycb_test_s3.sh ================================================ #!/bin/bash set -x set -e export CUDA_VISIBLE_DEVICES=$1 time ./tools/test_net.py --gpu $1 \ --network posecnn \ --pretrained output/dex_ycb/dex_ycb_s3_train/vgg16_dex_ycb_epoch_$2.checkpoint.pth \ --dataset dex_ycb_s3_test \ --cfg experiments/cfgs/dex_ycb.yml ================================================ FILE: experiments/scripts/dex_ycb_train_s0.sh ================================================ #!/bin/bash set -x set -e time ./tools/train_net.py \ --network posecnn \ --pretrained data/checkpoints/vgg16-397923af.pth \ --dataset dex_ycb_s0_train \ --cfg experiments/cfgs/dex_ycb.yml \ --solver sgd \ --epochs 16 ================================================ FILE: experiments/scripts/dex_ycb_train_s1.sh ================================================ #!/bin/bash set -x set -e time ./tools/train_net.py \ --network posecnn \ --pretrained data/checkpoints/vgg16-397923af.pth \ --dataset dex_ycb_s1_train \ --cfg experiments/cfgs/dex_ycb.yml \ --solver sgd \ --epochs 16 ================================================ FILE: experiments/scripts/dex_ycb_train_s2.sh ================================================ #!/bin/bash set -x set -e time ./tools/train_net.py \ --network posecnn \ --pretrained data/checkpoints/vgg16-397923af.pth \ --dataset dex_ycb_s2_train \ --cfg experiments/cfgs/dex_ycb.yml \ --solver sgd \ --epochs 16 ================================================ FILE: experiments/scripts/dex_ycb_train_s3.sh ================================================ #!/bin/bash set -x set -e time ./tools/train_net.py \ --network posecnn \ --pretrained data/checkpoints/vgg16-397923af.pth \ --dataset dex_ycb_s3_train \ --cfg experiments/cfgs/dex_ycb.yml \ --solver sgd \ --epochs 16 ================================================ FILE: experiments/scripts/ros_ycb_object_test.sh ================================================ #!/bin/bash set -x set -e export PYTHONUNBUFFERED="True" export CUDA_VISIBLE_DEVICES=$1 time ./ros/test_images.py --gpu $1 \ --instance 0 \ --network posecnn \ --pretrained data/checkpoints/ycb_object/vgg16_ycb_object_self_supervision_epoch_8.checkpoint.pth \ --dataset ycb_object_test \ --cfg experiments/cfgs/ycb_object.yml ================================================ FILE: experiments/scripts/ros_ycb_object_test_detection.sh ================================================ #!/bin/bash set -x set -e export PYTHONUNBUFFERED="True" export CUDA_VISIBLE_DEVICES=$1 time ./ros/test_images.py --gpu $1 \ --instance 0 \ --network posecnn \ --pretrained data/checkpoints/ycb_object/vgg16_ycb_object_detection_self_supervision_epoch_8.checkpoint.pth \ --dataset ycb_object_test \ --cfg experiments/cfgs/ycb_object_detection.yml ================================================ FILE: experiments/scripts/ycb_object_test.sh ================================================ #!/bin/bash set -x set -e export PYTHONUNBUFFERED="True" export CUDA_VISIBLE_DEVICES=$1 time ./tools/test_net.py --gpu $1 \ --network posecnn \ --pretrained output/ycb_object/ycb_object_train/vgg16_ycb_object_epoch_$2.checkpoint.pth \ --dataset ycb_object_test \ --cfg experiments/cfgs/ycb_object.yml ================================================ FILE: experiments/scripts/ycb_object_train.sh ================================================ #!/bin/bash set -x set -e ./tools/train_net.py \ --network posecnn \ --pretrained data/checkpoints/vgg16-397923af.pth \ --dataset ycb_object_train \ --cfg experiments/cfgs/ycb_object.yml \ --solver sgd \ --epochs 16 ================================================ FILE: experiments/scripts/ycb_object_train_detection.sh ================================================ #!/bin/bash set -x set -e ./tools/train_net.py \ --network posecnn \ --pretrained data/checkpoints/vgg16-397923af.pth \ --dataset ycb_object_train \ --cfg experiments/cfgs/ycb_object_detection.yml \ --solver sgd \ --epochs 16 ================================================ FILE: experiments/scripts/ycb_object_train_self_supervision.sh ================================================ #!/bin/bash set -x set -e ./tools/train_net.py \ --network posecnn \ --pretrained output/ycb_object/ycb_object_train/vgg16_ycb_object_epoch_16.checkpoint.pth \ --dataset ycb_self_supervision_all \ --cfg experiments/cfgs/ycb_object_self_supervision.yml \ --solver sgd \ --epochs 8 ================================================ FILE: experiments/scripts/ycb_video_test.sh ================================================ #!/bin/bash set -x set -e export PYTHONUNBUFFERED="True" export CUDA_VISIBLE_DEVICES=$1 time ./tools/test_net.py --gpu $1 \ --network posecnn \ --pretrained output/ycb_video/ycb_video_train/vgg16_ycb_video_epoch_$2.checkpoint.pth \ --dataset ycb_video_keyframe \ --cfg experiments/cfgs/ycb_video.yml ================================================ FILE: experiments/scripts/ycb_video_train.sh ================================================ #!/bin/bash set -x set -e time ./tools/train_net.py \ --network posecnn \ --pretrained data/checkpoints/vgg16-397923af.pth \ --dataset ycb_video_train \ --cfg experiments/cfgs/ycb_video.yml \ --solver sgd \ --epochs 16 ================================================ FILE: lib/datasets/__init__.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md from .imdb import imdb from .ycb_video import YCBVideo from .ycb_self_supervision import YCBSelfSupervision from .ycb_object import YCBObject from .dex_ycb import DexYCBDataset from .background import BackgroundDataset import os.path as osp ROOT_DIR = osp.join(osp.dirname(__file__), '..', '..') ================================================ FILE: lib/datasets/background.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import torch import torchvision import torch.utils.data as data import os, math import os.path as osp from os.path import * import numpy as np import numpy.random as npr import cv2 import datasets from fcn.config import cfg from utils.blob import chromatic_transform, add_noise, add_noise_depth class BackgroundDataset(data.Dataset, datasets.imdb): def __init__(self, name): self._name = name self.files_color = [] self.files_depth = [] if name == 'coco': background_dir = os.path.join(self.cache_path, '../coco/train2014/train2014') for filename in os.listdir(background_dir): self.files_color.append(os.path.join(background_dir, filename)) self.files_color.sort() elif name == 'texture': background_dir = os.path.join(self.cache_path, '../textures') for filename in os.listdir(background_dir): self.files_color.append(os.path.join(background_dir, filename)) self.files_color.sort() elif name == 'nvidia': allencenter = os.path.join(self.cache_path, '../backgrounds/nvidia') subdirs = os.listdir(allencenter) for i in range(len(subdirs)): subdir = subdirs[i] files = os.listdir(os.path.join(allencenter, subdir)) for j in range(len(files)): filename = os.path.join(allencenter, subdir, files[j]) self.files_color.append(filename) self.files_color.sort() elif name == 'table': allencenter = os.path.join(self.cache_path, '../backgrounds/table') subdirs = os.listdir(allencenter) for i in range(len(subdirs)): subdir = subdirs[i] files = os.listdir(os.path.join(allencenter, subdir)) for j in range(len(files)): filename = os.path.join(allencenter, subdir, files[j]) self.files_color.append(filename) self.files_color.sort() elif name == 'isaac': allencenter = os.path.join(self.cache_path, '../backgrounds/isaac') subdirs = os.listdir(allencenter) for i in range(len(subdirs)): subdir = subdirs[i] files = os.listdir(os.path.join(allencenter, subdir)) for j in range(len(files)): filename = os.path.join(allencenter, subdir, files[j]) self.files_color.append(filename) self.files_color.sort() elif name == 'rgbd': comotion = os.path.join(self.cache_path, '../backgrounds/rgbd') subdirs = os.listdir(comotion) for i in range(len(subdirs)): subdir = subdirs[i] files = os.listdir(os.path.join(comotion, subdir)) for j in range(len(files)): filename = os.path.join(comotion, subdir, files[j]) if 'depth.png' in filename: self.files_depth.append(filename) else: self.files_color.append(filename) self.files_color.sort() self.files_depth.sort() self._intrinsic_matrix = np.array([[524.7917885754071, 0, 332.5213232846151], [0, 489.3563960810721, 281.2339855172282], [0, 0, 1]]) self.num = len(self.files_color) self.subtract_mean = cfg.TRAIN.SYN_BACKGROUND_SUBTRACT_MEAN if cfg.TRAIN.SYN_CROP: self._height = cfg.TRAIN.SYN_CROP_SIZE self._width = cfg.TRAIN.SYN_CROP_SIZE else: self._height = cfg.TRAIN.SYN_HEIGHT self._width = cfg.TRAIN.SYN_WIDTH self._pixel_mean = cfg.PIXEL_MEANS print('{} background images'.format(self.num)) def __len__(self): return self.num def __getitem__(self, idx): filename_color = self.files_color[idx] if self.name == 'rgbd': filename_depth = self.files_depth[idx] else: filename_depth = None return self.load(filename_color, filename_depth) def load(self, filename_color, filename_depth): if filename_depth is None: background_depth = np.zeros((3, self._height, self._width), dtype=np.float32) mask_depth = np.zeros((self._height, self._width), dtype=np.float32) if filename_depth is None and np.random.rand(1) < cfg.TRAIN.SYN_BACKGROUND_CONSTANT_PROB: # only for rgb cases # constant background image background_color = np.ones((self._height, self._width, 3), dtype=np.uint8) color = np.random.randint(256, size=3) background_color[:, :, 0] = color[0] background_color[:, :, 1] = color[1] background_color[:, :, 2] = color[2] else: background_color = cv2.imread(filename_color, cv2.IMREAD_UNCHANGED) if filename_depth is not None: background_depth = cv2.imread(filename_depth, cv2.IMREAD_UNCHANGED) try: # randomly crop a region as background bw = background_color.shape[1] bh = background_color.shape[0] x1 = npr.randint(0, int(bw/3)) y1 = npr.randint(0, int(bh/3)) x2 = npr.randint(int(2*bw/3), bw) y2 = npr.randint(int(2*bh/3), bh) background_color = background_color[y1:y2, x1:x2] background_color = cv2.resize(background_color, (self._width, self._height), interpolation=cv2.INTER_LINEAR) if len(background_color.shape) != 3: background_color = cv2.cvtColor(background_color, cv2.COLOR_GRAY2RGB) if filename_depth is not None: background_depth = background_depth[y1:y2, x1:x2] background_depth = cv2.resize(background_depth, (self._width, self._height), interpolation=cv2.INTER_NEAREST) background_depth = self.backproject(background_depth, self._intrinsic_matrix, 1000.0) except: background_color = np.zeros((self._height, self._width, 3), dtype=np.uint8) print('bad background_color image', filename_color) if filename_depth is not None: background_depth = np.zeros((self._height, self._width, 3), dtype=np.float32) print('bad depth background image') if len(background_color.shape) != 3: background_color = np.zeros((self._height, self._width, 3), dtype=np.uint8) print('bad background_color image', filename_color) if filename_depth is not None: if len(background_depth.shape) != 3: background_depth = np.zeros((self._height, self._width, 3), dtype=np.float32) print('bad depth background image') z_im = background_depth[:, :, 2] mask_depth = z_im > 0.0 mask_depth = mask_depth.astype(np.float32) if np.random.rand(1) > 0.1: background_depth = add_noise_depth(background_depth) background_depth = background_depth.transpose(2, 0, 1).astype(np.float32) if np.random.rand(1) > 0.1: background_color = chromatic_transform(background_color) if np.random.rand(1) > 0.1: background_color = add_noise(background_color) background_color = background_color.astype(np.float32) if self.subtract_mean: background_color -= self._pixel_mean background_color = background_color.transpose(2, 0, 1) / 255.0 sample = {'background_color': background_color, 'background_depth': background_depth, 'mask_depth': mask_depth} return sample ================================================ FILE: lib/datasets/dex_ycb.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import os import sys import yaml import numpy as np import torch import torch.utils.data as data import numpy as np import numpy.random as npr import cv2 import copy import glob import scipy import datasets from fcn.config import cfg from utils.blob import pad_im, chromatic_transform, add_noise from transforms3d.quaternions import mat2quat, quat2mat from utils.se3 import * from utils.pose_error import * from utils.cython_bbox import bbox_overlaps _SUBJECTS = [ '20200709-subject-01', '20200813-subject-02', '20200820-subject-03', '20200903-subject-04', '20200908-subject-05', '20200918-subject-06', '20200928-subject-07', '20201002-subject-08', '20201015-subject-09', '20201022-subject-10', ] _SERIALS = [ '836212060125', '839512060362', '840412060917', '841412060263', '932122060857', '932122060861', '932122061900', '932122062010', ] _YCB_CLASSES = { 1: '002_master_chef_can', 2: '003_cracker_box', 3: '004_sugar_box', 4: '005_tomato_soup_can', 5: '006_mustard_bottle', 6: '007_tuna_fish_can', 7: '008_pudding_box', 8: '009_gelatin_box', 9: '010_potted_meat_can', 10: '011_banana', 11: '019_pitcher_base', 12: '021_bleach_cleanser', 13: '024_bowl', 14: '025_mug', 15: '035_power_drill', 16: '036_wood_block', 17: '037_scissors', 18: '040_large_marker', 19: '051_large_clamp', 20: '052_extra_large_clamp', 21: '061_foam_brick', } _MANO_JOINTS = [ 'wrist', 'thumb_mcp', 'thumb_pip', 'thumb_dip', 'thumb_tip', 'index_mcp', 'index_pip', 'index_dip', 'index_tip', 'middle_mcp', 'middle_pip', 'middle_dip', 'middle_tip', 'ring_mcp', 'ring_pip', 'ring_dip', 'ring_tip', 'little_mcp', 'little_pip', 'little_dip', 'little_tip' ] _MANO_JOINT_CONNECT = [ [0, 1], [ 1, 2], [ 2, 3], [ 3, 4], [0, 5], [ 5, 6], [ 6, 7], [ 7, 8], [0, 9], [ 9, 10], [10, 11], [11, 12], [0, 13], [13, 14], [14, 15], [15, 16], [0, 17], [17, 18], [18, 19], [19, 20], ] _BOP_EVAL_SUBSAMPLING_FACTOR = 4 class DexYCBDataset(data.Dataset, datasets.imdb): def __init__(self, setup, split): self._setup = setup self._split = split self._color_format = "color_{:06d}.jpg" self._depth_format = "aligned_depth_to_color_{:06d}.png" self._label_format = "labels_{:06d}.npz" self._height = 480 self._width = 640 # paths self._name = 'dex_ycb_' + setup + '_' + split self._image_set = split self._dex_ycb_path = self._get_default_path() path = os.path.join(self._dex_ycb_path, 'data') self._data_dir = path self._calib_dir = os.path.join(self._data_dir, "calibration") self._model_dir = os.path.join(self._data_dir, "models") self._obj_file = { k: os.path.join(self._model_dir, v, "textured_simple.obj") for k, v in _YCB_CLASSES.items() } # define all the classes self._classes_all = ('__background__', '002_master_chef_can', '003_cracker_box', '004_sugar_box', '005_tomato_soup_can', '006_mustard_bottle', \ '007_tuna_fish_can', '008_pudding_box', '009_gelatin_box', '010_potted_meat_can', '011_banana', '019_pitcher_base', \ '021_bleach_cleanser', '024_bowl', '025_mug', '035_power_drill', '036_wood_block', '037_scissors', '040_large_marker', \ '051_large_clamp', '052_extra_large_clamp', '061_foam_brick') self._num_classes_all = len(self._classes_all) 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), \ (128, 0, 0), (0, 128, 0), (0, 0, 128), (128, 128, 0), (128, 0, 128), (0, 128, 128), \ (64, 0, 0), (0, 64, 0), (0, 0, 64), (64, 64, 0), (64, 0, 64), (0, 64, 64), (192, 0, 0), (0, 192, 0), (0, 0, 192)] 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) self._extents_all = self._load_object_extents() # select a subset of classes self._classes = [self._classes_all[i] for i in cfg.TRAIN.CLASSES] self._classes_test = [self._classes_all[i] for i in cfg.TEST.CLASSES] self._num_classes = len(self._classes) self._class_colors = [self._class_colors_all[i] for i in cfg.TRAIN.CLASSES] self._symmetry = self._symmetry_all[cfg.TRAIN.CLASSES] self._symmetry_test = self._symmetry_all[cfg.TEST.CLASSES] self._extents = self._extents_all[cfg.TRAIN.CLASSES] self._extents_test = self._extents_all[cfg.TEST.CLASSES] self._pixel_mean = cfg.PIXEL_MEANS / 255.0 # train classes self._points, self._points_all, self._point_blob = \ self._load_object_points(self._classes, self._extents, self._symmetry) # test classes self._points_test, self._points_all_test, self._point_blob_test = \ self._load_object_points(self._classes_test, self._extents_test, self._symmetry_test) # 3D model paths self.model_mesh_paths = ['{}/{}/textured_simple.obj'.format(self._model_dir, cls) for cls in self._classes_all[1:]] self.model_sdf_paths = ['{}/{}/textured_simple_low_res.pth'.format(self._model_dir, cls) for cls in self._classes_all[1:]] self.model_texture_paths = ['{}/{}/texture_map.png'.format(self._model_dir, cls) for cls in self._classes_all[1:]] self.model_colors = [np.array(self._class_colors_all[i]) / 255.0 for i in range(1, len(self._classes_all))] self.model_mesh_paths_target = ['{}/{}/textured_simple.obj'.format(self._model_dir, cls) for cls in self._classes[1:]] self.model_sdf_paths_target = ['{}/{}/textured_simple.sdf'.format(self._model_dir, cls) for cls in self._classes[1:]] self.model_texture_paths_target = ['{}/{}/texture_map.png'.format(self._model_dir, cls) for cls in self._classes[1:]] self.model_colors_target = [np.array(self._class_colors_all[i]) / 255.0 for i in cfg.TRAIN.CLASSES[1:]] # Seen subjects, camera views, grasped objects. if self._setup == 's0': if self._split == 'train': subject_ind = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] serial_ind = [0, 1, 2, 3, 4, 5, 6, 7] sequence_ind = [i for i in range(100) if i % 5 != 4] if self._split == 'val': subject_ind = [0, 1] serial_ind = [0, 1, 2, 3, 4, 5, 6, 7] sequence_ind = [i for i in range(100) if i % 5 == 4] if self._split == 'test': subject_ind = [2, 3, 4, 5, 6, 7, 8, 9] serial_ind = [0, 1, 2, 3, 4, 5, 6, 7] sequence_ind = [i for i in range(100) if i % 5 == 4] # Unseen subjects. if self._setup == 's1': if self._split == 'train': subject_ind = [0, 1, 2, 3, 4, 5, 9] serial_ind = [0, 1, 2, 3, 4, 5, 6, 7] sequence_ind = list(range(100)) if self._split == 'val': subject_ind = [6] serial_ind = [0, 1, 2, 3, 4, 5, 6, 7] sequence_ind = list(range(100)) if self._split == 'test': subject_ind = [7, 8] serial_ind = [0, 1, 2, 3, 4, 5, 6, 7] sequence_ind = list(range(100)) # Unseen camera views. if self._setup == 's2': if self._split == 'train': subject_ind = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] serial_ind = [0, 1, 2, 3, 4, 5] sequence_ind = list(range(100)) if self._split == 'val': subject_ind = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] serial_ind = [6] sequence_ind = list(range(100)) if self._split == 'test': subject_ind = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] serial_ind = [7] sequence_ind = list(range(100)) # Unseen grasped objects. if self._setup == 's3': if self._split == 'train': subject_ind = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] serial_ind = [0, 1, 2, 3, 4, 5, 6, 7] sequence_ind = [ i for i in range(100) if i // 5 not in (3, 7, 11, 15, 19) ] if self._split == 'val': subject_ind = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] serial_ind = [0, 1, 2, 3, 4, 5, 6, 7] sequence_ind = [i for i in range(100) if i // 5 in (3, 19)] if self._split == 'test': subject_ind = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] serial_ind = [0, 1, 2, 3, 4, 5, 6, 7] sequence_ind = [i for i in range(100) if i // 5 in (7, 11, 15)] self._subjects = [_SUBJECTS[i] for i in subject_ind] self._serials = [_SERIALS[i] for i in serial_ind] self._intrinsics = [] for s in self._serials: intr_file = os.path.join(self._calib_dir, "intrinsics", "{}_{}x{}.yml".format(s, self._width, self._height)) with open(intr_file, 'r') as f: intr = yaml.load(f, Loader=yaml.FullLoader) intr = intr['color'] self._intrinsics.append(intr) # build mapping self._sequences = [] self._mapping = [] self._ycb_ids = [] offset = 0 for n in self._subjects: seq = sorted(os.listdir(os.path.join(self._data_dir, n))) seq = [os.path.join(n, s) for s in seq] assert len(seq) == 100 seq = [seq[i] for i in sequence_ind] self._sequences += seq for i, q in enumerate(seq): meta_file = os.path.join(self._data_dir, q, "meta.yml") with open(meta_file, 'r') as f: meta = yaml.load(f, Loader=yaml.FullLoader) c = np.arange(len(self._serials)) f = np.arange(meta['num_frames']) f, c = np.meshgrid(f, c) c = c.ravel() f = f.ravel() s = (offset + i) * np.ones_like(c) m = np.vstack((s, c, f)).T self._mapping.append(m) self._ycb_ids.append(meta['ycb_ids']) offset += len(seq) self._mapping = np.vstack(self._mapping) # sample a subset for training if split == 'train': self._mapping = self._mapping[::10] # dataset size self._size = len(self._mapping) print('dataset %s with images %d' % (self._name, self._size)) if cfg.MODE == 'TRAIN' and self._size > cfg.TRAIN.MAX_ITERS_PER_EPOCH * cfg.TRAIN.IMS_PER_BATCH: self._size = cfg.TRAIN.MAX_ITERS_PER_EPOCH * cfg.TRAIN.IMS_PER_BATCH def __len__(self): return self._size def get_bop_id_from_idx(self, idx): s, c, f = map(lambda x: x.item(), self._mapping[idx]) scene_id = s * len(self._serials) + c im_id = f return scene_id, im_id def __getitem__(self, idx): s, c, f = self._mapping[idx] is_testing = f % _BOP_EVAL_SUBSAMPLING_FACTOR == 0 d = os.path.join(self._data_dir, self._sequences[s], self._serials[c]) roidb = { 'color_file': os.path.join(d, self._color_format.format(f)), 'depth_file': os.path.join(d, self._depth_format.format(f)), 'label_file': os.path.join(d, self._label_format.format(f)), 'intrinsics': self._intrinsics[c], 'ycb_ids': self._ycb_ids[s], } # Get the input image blob random_scale_ind = npr.randint(0, high=len(cfg.TRAIN.SCALES_BASE)) im_blob, im_depth, im_scale, height, width = self._get_image_blob(roidb['color_file'], roidb['depth_file'], random_scale_ind) # build the label blob label_blob, mask, meta_data_blob, pose_blob, gt_boxes, vertex_targets, vertex_weights \ = self._get_label_blob(roidb, self._num_classes, im_scale, height, width) is_syn = 0 im_info = np.array([im_blob.shape[1], im_blob.shape[2], im_scale, is_syn], dtype=np.float32) scene_id, im_id = self.get_bop_id_from_idx(idx) video_id = '%04d' % (scene_id) image_id = '%06d' % (im_id) sample = {'image_color': im_blob, 'im_depth': im_depth, 'label': label_blob, 'mask': mask, 'meta_data': meta_data_blob, 'poses': pose_blob, 'extents': self._extents, 'points': self._point_blob, 'symmetry': self._symmetry, 'gt_boxes': gt_boxes, 'im_info': im_info, 'video_id': video_id, 'image_id': image_id} if cfg.TRAIN.VERTEX_REG: sample['vertex_targets'] = vertex_targets sample['vertex_weights'] = vertex_weights if self._split == 'test': sample['is_testing'] = is_testing return sample def _get_image_blob(self, color_file, depth_file, scale_ind): # rgba rgba = pad_im(cv2.imread(color_file, cv2.IMREAD_UNCHANGED), 16) if rgba.shape[2] == 4: im = np.copy(rgba[:,:,:3]) alpha = rgba[:,:,3] I = np.where(alpha == 0) im[I[0], I[1], :] = 0 else: im = rgba im_scale = cfg.TRAIN.SCALES_BASE[scale_ind] if im_scale != 1.0: im = cv2.resize(im, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_LINEAR) height = im.shape[0] width = im.shape[1] # chromatic transform if cfg.TRAIN.CHROMATIC and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1: im = chromatic_transform(im) if cfg.TRAIN.ADD_NOISE and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1: im = add_noise(im) im_tensor = torch.from_numpy(im) / 255.0 im_tensor -= self._pixel_mean image_blob = im_tensor.permute(2, 0, 1).float() # depth image im_depth = pad_im(cv2.imread(depth_file, cv2.IMREAD_UNCHANGED), 16) if im_scale != 1.0: im_depth = cv2.resize(im_depth, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_NEAREST) im_depth = im_depth.astype('float') / 1000.0 return image_blob, im_depth, im_scale, height, width def _get_label_blob(self, roidb, num_classes, im_scale, height, width): """ build the label blob """ # parse data cls_indexes = roidb['ycb_ids'] classes = np.array(cfg.TRAIN.CLASSES) fx = roidb['intrinsics']['fx'] fy = roidb['intrinsics']['fy'] px = roidb['intrinsics']['ppx'] py = roidb['intrinsics']['ppy'] intrinsic_matrix = np.eye(3, dtype=np.float32) intrinsic_matrix[0, 0] = fx intrinsic_matrix[1, 1] = fy intrinsic_matrix[0, 2] = px intrinsic_matrix[1, 2] = py label = np.load(roidb['label_file']) # read label image im_label = label['seg'] if im_scale != 1.0: im_label = cv2.resize(im_label, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_NEAREST) label_blob = np.zeros((num_classes, height, width), dtype=np.float32) label_blob[0, :, :] = 1.0 for i in range(1, num_classes): I = np.where(im_label == classes[i]) if len(I[0]) > 0: label_blob[i, I[0], I[1]] = 1.0 label_blob[0, I[0], I[1]] = 0.0 # foreground mask seg = torch.from_numpy((im_label != 0).astype(np.float32)) mask = seg.unsqueeze(0).repeat((3, 1, 1)).float() # poses poses = label['pose_y'] if len(poses.shape) == 2: poses = np.reshape(poses, (1, 3, 4)) num = poses.shape[0] assert num == len(cls_indexes), 'number of poses not equal to number of objects' pose_blob = np.zeros((num_classes, 9), dtype=np.float32) gt_boxes = np.zeros((num_classes, 5), dtype=np.float32) center = np.zeros((num, 2), dtype=np.float32) count = 0 for i in range(num): cls = int(cls_indexes[i]) ind = np.where(classes == cls)[0] if len(ind) > 0: R = poses[i, :, :3] T = poses[i, :, 3] pose_blob[count, 0] = 1 pose_blob[count, 1] = ind qt = mat2quat(R) # egocentric to allocentric qt_allocentric = egocentric2allocentric(qt, T) if qt_allocentric[0] < 0: qt_allocentric = -1 * qt_allocentric pose_blob[count, 2:6] = qt_allocentric pose_blob[count, 6:] = T # compute center center[i, 0] = fx * T[0] / T[2] + px center[i, 1] = fy * T[1] / T[2] + py # compute box x3d = np.ones((4, self._points_all.shape[1]), dtype=np.float32) x3d[0, :] = self._points_all[ind,:,0] x3d[1, :] = self._points_all[ind,:,1] x3d[2, :] = self._points_all[ind,:,2] RT = np.zeros((3, 4), dtype=np.float32) RT[:3, :3] = quat2mat(qt) RT[:, 3] = T x2d = np.matmul(intrinsic_matrix, np.matmul(RT, x3d)) x2d[0, :] = np.divide(x2d[0, :], x2d[2, :]) x2d[1, :] = np.divide(x2d[1, :], x2d[2, :]) gt_boxes[count, 0] = np.min(x2d[0, :]) * im_scale gt_boxes[count, 1] = np.min(x2d[1, :]) * im_scale gt_boxes[count, 2] = np.max(x2d[0, :]) * im_scale gt_boxes[count, 3] = np.max(x2d[1, :]) * im_scale gt_boxes[count, 4] = ind count += 1 # construct the meta data """ format of the meta_data intrinsic matrix: meta_data[0 ~ 8] inverse intrinsic matrix: meta_data[9 ~ 17] """ K = np.matrix(intrinsic_matrix) * im_scale K[2, 2] = 1 Kinv = np.linalg.pinv(K) meta_data_blob = np.zeros(18, dtype=np.float32) meta_data_blob[0:9] = K.flatten() meta_data_blob[9:18] = Kinv.flatten() # vertex regression target if cfg.TRAIN.VERTEX_REG: vertex_targets, vertex_weights = self._generate_vertex_targets(im_label, cls_indexes, center, poses, classes, num_classes) else: vertex_targets = [] vertex_weights = [] return label_blob, mask, meta_data_blob, pose_blob, gt_boxes, vertex_targets, vertex_weights # compute the voting label image in 2D def _generate_vertex_targets(self, im_label, cls_indexes, center, poses, classes, num_classes): width = im_label.shape[1] height = im_label.shape[0] vertex_targets = np.zeros((3 * num_classes, height, width), dtype=np.float32) vertex_weights = np.zeros((3 * num_classes, height, width), dtype=np.float32) c = np.zeros((2, 1), dtype=np.float32) for i in range(1, num_classes): y, x = np.where(im_label == classes[i]) I = np.where(im_label == classes[i]) ind = np.where(cls_indexes == classes[i])[0] if len(x) > 0 and len(ind) > 0: c[0] = center[ind, 0] c[1] = center[ind, 1] if isinstance(poses, list): z = poses[int(ind)][2] else: if len(poses.shape) == 3: z = poses[ind, 2, 3] else: z = poses[ind, -1] R = np.tile(c, (1, len(x))) - np.vstack((x, y)) # compute the norm N = np.linalg.norm(R, axis=0) + 1e-10 # normalization R = np.divide(R, np.tile(N, (2,1))) # assignment vertex_targets[3*i+0, y, x] = R[0,:] vertex_targets[3*i+1, y, x] = R[1,:] vertex_targets[3*i+2, y, x] = math.log(z) vertex_weights[3*i+0, y, x] = cfg.TRAIN.VERTEX_W_INSIDE vertex_weights[3*i+1, y, x] = cfg.TRAIN.VERTEX_W_INSIDE vertex_weights[3*i+2, y, x] = cfg.TRAIN.VERTEX_W_INSIDE return vertex_targets, vertex_weights def _get_default_path(self): """ Return the default path where YCB_Video is expected to be installed. """ return os.path.join(datasets.ROOT_DIR, 'data', 'DEX_YCB') def _load_object_extents(self): extents = np.zeros((self._num_classes_all, 3), dtype=np.float32) for i in range(1, self._num_classes_all): point_file = os.path.join(self._model_dir, self._classes_all[i], 'points.xyz') print(point_file) assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file) points = np.loadtxt(point_file) extents[i, :] = 2 * np.max(np.absolute(points), axis=0) return extents def _load_object_points(self, classes, extents, symmetry): points = [[] for _ in range(len(classes))] num = np.inf num_classes = len(classes) for i in range(1, num_classes): point_file = os.path.join(self._model_dir, classes[i], 'points.xyz') print(point_file) assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file) points[i] = np.loadtxt(point_file) if points[i].shape[0] < num: num = points[i].shape[0] points_all = np.zeros((num_classes, num, 3), dtype=np.float32) for i in range(1, num_classes): points_all[i, :, :] = points[i][:num, :] # rescale the points point_blob = points_all.copy() for i in range(1, num_classes): # compute the rescaling factor for the points weight = 10.0 / np.amax(extents[i, :]) if weight < 10: weight = 10 if symmetry[i] > 0: point_blob[i, :, :] = 4 * weight * point_blob[i, :, :] else: point_blob[i, :, :] = weight * point_blob[i, :, :] return points, points_all, point_blob def write_dop_results(self, output_dir): # only write the result file filename = os.path.join(output_dir, 'posecnn_' + self.name + '.csv') f = open(filename, 'w') f.write('scene_id,im_id,obj_id,score,R,t,time\n') if cfg.TEST.POSE_REFINE: filename_refined = os.path.join(output_dir, 'posecnn_' + self.name + '_refined.csv') f1 = open(filename_refined, 'w') f1.write('scene_id,im_id,obj_id,score,R,t,time\n') # list the mat file images_color = [] filename = os.path.join(output_dir, '*.mat') files = sorted(glob.glob(filename)) # for each image for i in range(len(files)): filename = os.path.basename(files[i]) # parse filename pos = filename.find('_') scene_id = int(filename[:pos]) im_id = int(filename[pos+1:-4]) # load result print(files[i]) result = scipy.io.loadmat(files[i]) if len(result['rois']) == 0: continue rois = result['rois'] num = rois.shape[0] for j in range(num): obj_id = cfg.TRAIN.CLASSES[int(rois[j, 1])] if obj_id == 0: continue score = rois[j, -1] run_time = -1 # pose from network R = quat2mat(result['poses'][j, :4].flatten()) t = result['poses'][j, 4:] * 1000 line = '{scene_id},{im_id},{obj_id},{score},{R},{t},{time}\n'.format( scene_id=scene_id, im_id=im_id, obj_id=obj_id, score=score, R=' '.join(map(str, R.flatten().tolist())), t=' '.join(map(str, t.flatten().tolist())), time=run_time) f.write(line) if cfg.TEST.POSE_REFINE: R = quat2mat(result['poses_refined'][j, :4].flatten()) t = result['poses_refined'][j, 4:] * 1000 line = '{scene_id},{im_id},{obj_id},{score},{R},{t},{time}\n'.format( scene_id=scene_id, im_id=im_id, obj_id=obj_id, score=score, R=' '.join(map(str, R.flatten().tolist())), t=' '.join(map(str, t.flatten().tolist())), time=run_time) f1.write(line) # close file f.close() if cfg.TEST.POSE_REFINE: f1.close() # compute box def compute_box(self, cls, intrinsic_matrix, RT): classes = np.array(cfg.TRAIN.CLASSES) ind = np.where(classes == cls)[0] x3d = np.ones((4, self._points_all.shape[1]), dtype=np.float32) x3d[0, :] = self._points_all[ind,:,0] x3d[1, :] = self._points_all[ind,:,1] x3d[2, :] = self._points_all[ind,:,2] x2d = np.matmul(intrinsic_matrix, np.matmul(RT, x3d)) x2d[0, :] = np.divide(x2d[0, :], x2d[2, :]) x2d[1, :] = np.divide(x2d[1, :], x2d[2, :]) x1 = np.min(x2d[0, :]) y1 = np.min(x2d[1, :]) x2 = np.max(x2d[0, :]) y2 = np.max(x2d[1, :]) return [x1, y1, x2, y2] def evaluation(self, output_dir): self.write_dop_results(output_dir) filename = os.path.join(output_dir, 'results_posecnn.mat') if os.path.exists(filename): results_all = scipy.io.loadmat(filename) print('load results from file') print(filename) distances_sys = results_all['distances_sys'] distances_non = results_all['distances_non'] errors_rotation = results_all['errors_rotation'] errors_translation = results_all['errors_translation'] results_seq_id = results_all['results_seq_id'].flatten() results_frame_id = results_all['results_frame_id'].flatten() results_object_id = results_all['results_object_id'].flatten() results_cls_id = results_all['results_cls_id'].flatten() else: # save results num_max = 200000 num_results = 2 distances_sys = np.zeros((num_max, num_results), dtype=np.float32) distances_non = np.zeros((num_max, num_results), dtype=np.float32) errors_rotation = np.zeros((num_max, num_results), dtype=np.float32) errors_translation = np.zeros((num_max, num_results), dtype=np.float32) results_seq_id = np.zeros((num_max, ), dtype=np.float32) results_frame_id = np.zeros((num_max, ), dtype=np.float32) results_object_id = np.zeros((num_max, ), dtype=np.float32) results_cls_id = np.zeros((num_max, ), dtype=np.float32) # for each image count = -1 for i in range(len(self._mapping)): s, c, f = self._mapping[i] is_testing = f % _BOP_EVAL_SUBSAMPLING_FACTOR == 0 if not is_testing: continue # intrinsics intrinsics = self._intrinsics[c] intrinsic_matrix = np.eye(3, dtype=np.float32) intrinsic_matrix[0, 0] = intrinsics['fx'] intrinsic_matrix[1, 1] = intrinsics['fy'] intrinsic_matrix[0, 2] = intrinsics['ppx'] intrinsic_matrix[1, 2] = intrinsics['ppy'] # parse keyframe name scene_id, im_id = self.get_bop_id_from_idx(i) # load result filename = os.path.join(output_dir, '%04d_%06d.mat' % (scene_id, im_id)) print(filename) result = scipy.io.loadmat(filename) # load gt d = os.path.join(self._data_dir, self._sequences[s], self._serials[c]) label_file = os.path.join(d, self._label_format.format(f)) label = np.load(label_file) cls_indexes = np.array(self._ycb_ids[s]).flatten() # poses poses = label['pose_y'] if len(poses.shape) == 2: poses = np.reshape(poses, (1, 3, 4)) num = poses.shape[0] assert num == len(cls_indexes), 'number of poses not equal to number of objects' # instance label im_label = label['seg'] instance_ids = np.unique(im_label) if instance_ids[0] == 0: instance_ids = instance_ids[1:] if instance_ids[-1] == 255: instance_ids = instance_ids[:-1] # for each gt poses for j in range(len(instance_ids)): cls = instance_ids[j] # find the number of pixels of the object pixels = np.sum(im_label == cls) if pixels < 200: continue count += 1 # find the pose object_index = np.where(cls_indexes == cls)[0][0] RT_gt = poses[object_index, :, :] box_gt = self.compute_box(cls, intrinsic_matrix, RT_gt) results_seq_id[count] = scene_id results_frame_id[count] = im_id results_object_id[count] = object_index results_cls_id[count] = cls # network result roi_index = [] if len(result['rois']) > 0: for k in range(result['rois'].shape[0]): ind = int(result['rois'][k, 1]) if cls == cfg.TRAIN.CLASSES[ind]: roi_index.append(k) # select the roi if len(roi_index) > 1: # overlaps: (rois x gt_boxes) roi_blob = result['rois'][roi_index, :] roi_blob = roi_blob[:, (0, 2, 3, 4, 5, 1)] gt_box_blob = np.zeros((1, 5), dtype=np.float32) gt_box_blob[0, 1:] = box_gt overlaps = bbox_overlaps( np.ascontiguousarray(roi_blob[:, :5], dtype=np.float), np.ascontiguousarray(gt_box_blob, dtype=np.float)).flatten() assignment = overlaps.argmax() roi_index = [roi_index[assignment]] if len(roi_index) > 0: RT = np.zeros((3, 4), dtype=np.float32) ind = int(result['rois'][roi_index, 1]) points = self._points[ind] # pose from network RT[:3, :3] = quat2mat(result['poses'][roi_index, :4].flatten()) RT[:, 3] = result['poses'][roi_index, 4:] distances_sys[count, 0] = adi(RT[:3, :3], RT[:, 3], RT_gt[:3, :3], RT_gt[:, 3], points) distances_non[count, 0] = add(RT[:3, :3], RT[:, 3], RT_gt[:3, :3], RT_gt[:, 3], points) errors_rotation[count, 0] = re(RT[:3, :3], RT_gt[:3, :3]) errors_translation[count, 0] = te(RT[:, 3], RT_gt[:, 3]) # pose after depth refinement if cfg.TEST.POSE_REFINE: RT[:3, :3] = quat2mat(result['poses_refined'][roi_index, :4].flatten()) RT[:, 3] = result['poses_refined'][roi_index, 4:] distances_sys[count, 1] = adi(RT[:3, :3], RT[:, 3], RT_gt[:3, :3], RT_gt[:, 3], points) distances_non[count, 1] = add(RT[:3, :3], RT[:, 3], RT_gt[:3, :3], RT_gt[:, 3], points) errors_rotation[count, 1] = re(RT[:3, :3], RT_gt[:3, :3]) errors_translation[count, 1] = te(RT[:, 3], RT_gt[:, 3]) else: distances_sys[count, 1] = np.inf distances_non[count, 1] = np.inf errors_rotation[count, 1] = np.inf errors_translation[count, 1] = np.inf else: distances_sys[count, :] = np.inf distances_non[count, :] = np.inf errors_rotation[count, :] = np.inf errors_translation[count, :] = np.inf distances_sys = distances_sys[:count+1, :] distances_non = distances_non[:count+1, :] errors_rotation = errors_rotation[:count+1, :] errors_translation = errors_translation[:count+1, :] results_seq_id = results_seq_id[:count+1] results_frame_id = results_frame_id[:count+1] results_object_id = results_object_id[:count+1] results_cls_id = results_cls_id[:count+1] results_all = {'distances_sys': distances_sys, 'distances_non': distances_non, 'errors_rotation': errors_rotation, 'errors_translation': errors_translation, 'results_seq_id': results_seq_id, 'results_frame_id': results_frame_id, 'results_object_id': results_object_id, 'results_cls_id': results_cls_id } filename = os.path.join(output_dir, 'results_posecnn.mat') scipy.io.savemat(filename, results_all) # print the results # for each class import matplotlib.pyplot as plt max_distance = 0.1 index_plot = [0, 1] color = ['r', 'b'] leng = ['PoseCNN', 'PoseCNN refined'] num = len(leng) ADD = np.zeros((self._num_classes_all, num), dtype=np.float32) ADDS = np.zeros((self._num_classes_all, num), dtype=np.float32) TS = np.zeros((self._num_classes_all, num), dtype=np.float32) classes = list(copy.copy(self._classes_all)) classes[0] = 'all' for k in range(self._num_classes_all): fig = plt.figure(figsize=(16.0, 10.0)) if k == 0: index = range(len(results_cls_id)) else: index = np.where(results_cls_id == k)[0] if len(index) == 0: continue print('%s: %d objects' % (classes[k], len(index))) # distance symmetry ax = fig.add_subplot(2, 3, 1) lengs = [] for i in index_plot: D = distances_sys[index, i] ind = np.where(D > max_distance)[0] D[ind] = np.inf d = np.sort(D) n = len(d) accuracy = np.cumsum(np.ones((n, ), np.float32)) / n plt.plot(d, accuracy, color[i], linewidth=2) ADDS[k, i] = VOCap(d, accuracy) lengs.append('%s (%.2f)' % (leng[i], ADDS[k, i] * 100)) print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D)))) ax.legend(lengs) plt.xlabel('Average distance threshold in meter (symmetry)') plt.ylabel('accuracy') ax.set_title(classes[k]) # distance non-symmetry ax = fig.add_subplot(2, 3, 2) lengs = [] for i in index_plot: D = distances_non[index, i] ind = np.where(D > max_distance)[0] D[ind] = np.inf d = np.sort(D) n = len(d) accuracy = np.cumsum(np.ones((n, ), np.float32)) / n plt.plot(d, accuracy, color[i], linewidth=2) ADD[k, i] = VOCap(d, accuracy) lengs.append('%s (%.2f)' % (leng[i], ADD[k, i] * 100)) print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D)))) ax.legend(lengs) plt.xlabel('Average distance threshold in meter (non-symmetry)') plt.ylabel('accuracy') ax.set_title(classes[k]) # translation ax = fig.add_subplot(2, 3, 3) lengs = [] for i in index_plot: D = errors_translation[index, i] ind = np.where(D > max_distance)[0] D[ind] = np.inf d = np.sort(D) n = len(d) accuracy = np.cumsum(np.ones((n, ), np.float32)) / n plt.plot(d, accuracy, color[i], linewidth=2) TS[k, i] = VOCap(d, accuracy) lengs.append('%s (%.2f)' % (leng[i], TS[k, i] * 100)) print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D)))) ax.legend(lengs) plt.xlabel('Translation threshold in meter') plt.ylabel('accuracy') ax.set_title(classes[k]) # rotation histogram count = 4 for i in index_plot: ax = fig.add_subplot(2, 3, count) D = errors_rotation[index, i] ind = np.where(np.isfinite(D))[0] D = D[ind] ax.hist(D, bins=range(0, 190, 10), range=(0, 180)) plt.xlabel('Rotation angle error') plt.ylabel('count') ax.set_title(leng[i]) count += 1 # mng = plt.get_current_fig_manager() # mng.full_screen_toggle() filename = output_dir + '/' + classes[k] + '.png' # plt.show() plt.savefig(filename) # print ADD print('==================ADD======================') for k in range(len(classes)): print('%s: %f' % (classes[k], ADD[k, 0])) for k in range(len(classes)-1): print('%f' % (ADD[k+1, 0])) print('%f' % (ADD[0, 0])) print(cfg.TRAIN.SNAPSHOT_INFIX) print('===========================================') # print ADD-S print('==================ADD-S====================') for k in range(len(classes)): print('%s: %f' % (classes[k], ADDS[k, 0])) for k in range(len(classes)-1): print('%f' % (ADDS[k+1, 0])) print('%f' % (ADDS[0, 0])) print(cfg.TRAIN.SNAPSHOT_INFIX) print('===========================================') # print ADD print('==================ADD refined======================') for k in range(len(classes)): print('%s: %f' % (classes[k], ADD[k, 1])) for k in range(len(classes)-1): print('%f' % (ADD[k+1, 1])) print('%f' % (ADD[0, 1])) print(cfg.TRAIN.SNAPSHOT_INFIX) print('===========================================') # print ADD-S print('==================ADD-S refined====================') for k in range(len(classes)): print('%s: %f' % (classes[k], ADDS[k, 1])) for k in range(len(classes)-1): print('%f' % (ADDS[k+1, 1])) print('%f' % (ADDS[0, 1])) print(cfg.TRAIN.SNAPSHOT_INFIX) print('===========================================') ================================================ FILE: lib/datasets/factory.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md """Factory method for easily getting imdbs by name.""" __sets = {} import datasets.ycb_video import datasets.ycb_object import datasets.ycb_self_supervision import datasets.dex_ycb import datasets.background import numpy as np # ycb video dataset for split in ['train', 'val', 'keyframe', 'trainval', 'debug']: name = 'ycb_video_{}'.format(split) print(name) __sets[name] = (lambda split=split: datasets.YCBVideo(split)) # ycb object dataset for split in ['train', 'test']: name = 'ycb_object_{}'.format(split) print(name) __sets[name] = (lambda split=split: datasets.YCBObject(split)) # ycb self supervision dataset for 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', 'debug', 'train_block', 'train_block_azure', 'train_block_big_sim', 'train_block_median_sim', 'train_block_small_sim']: name = 'ycb_self_supervision_{}'.format(split) print(name) __sets[name] = (lambda split=split: datasets.YCBSelfSupervision(split)) # background dataset for split in ['coco', 'rgbd', 'nvidia', 'table', 'isaac', 'texture']: name = 'background_{}'.format(split) print(name) __sets[name] = (lambda split=split: datasets.BackgroundDataset(split)) # DEX YCB dataset for setup in ('s0', 's1', 's2', 's3'): for split in ('train', 'val', 'test'): name = 'dex_ycb_{}_{}'.format(setup, split) __sets[name] = (lambda setup=setup, split=split: datasets.DexYCBDataset(setup, split)) def get_dataset(name): """Get an imdb (image database) by name.""" if name not in __sets: raise KeyError('Unknown dataset: {}'.format(name)) return __sets[name]() def list_datasets(): """List all registered imdbs.""" return __sets.keys() ================================================ FILE: lib/datasets/imdb.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import os import os.path as osp import numpy as np import datasets import math import glob from fcn.config import cfg class imdb(object): """Image database.""" def __init__(self): self._name = '' self._num_classes = 0 self._classes = [] self._class_colors = [] @property def name(self): return self._name @property def num_classes(self): return len(self._classes) @property def classes(self): return self._classes @property def class_colors(self): return self._class_colors @property def cache_path(self): cache_path = osp.abspath(osp.join(datasets.ROOT_DIR, 'data', 'cache')) if not os.path.exists(cache_path): os.makedirs(cache_path) return cache_path # backproject pixels into 3D points in camera's coordinate system def backproject(self, depth_cv, intrinsic_matrix, factor): depth = depth_cv.astype(np.float32, copy=True) / factor index = np.where(~np.isfinite(depth)) depth[index[0], index[1]] = 0 # get intrinsic matrix K = intrinsic_matrix Kinv = np.linalg.inv(K) # compute the 3D points width = depth.shape[1] height = depth.shape[0] # construct the 2D points matrix x, y = np.meshgrid(np.arange(width), np.arange(height)) ones = np.ones((height, width), dtype=np.float32) x2d = np.stack((x, y, ones), axis=2).reshape(width*height, 3) # backprojection R = np.dot(Kinv, x2d.transpose()) # compute the 3D points X = np.multiply(np.tile(depth.reshape(1, width*height), (3, 1)), R) return np.array(X).transpose().reshape((height, width, 3)) def _build_uniform_poses(self): self.eulers = [] interval = cfg.TRAIN.UNIFORM_POSE_INTERVAL for yaw in range(-180, 180, interval): for pitch in range(-90, 90, interval): for roll in range(-180, 180, interval): self.eulers.append([yaw, pitch, roll]) # sample indexes num_poses = len(self.eulers) num_classes = len(self._classes_all) - 1 # no background self.pose_indexes = np.zeros((num_classes, ), dtype=np.int32) self.pose_lists = [] for i in range(num_classes): self.pose_lists.append(np.random.permutation(np.arange(num_poses))) def evaluation(self, output_dir): print('evaluation function not implemented for dataset %s' % self._name) ================================================ FILE: lib/datasets/ycb_object.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import torch import torch.utils.data as data import os, math import sys import os.path as osp from os.path import * import numpy as np import numpy.random as npr import cv2 try: import cPickle # Use cPickle on Python 2.7 except ImportError: import pickle as cPickle import scipy.io import glob import datasets from fcn.config import cfg from utils.blob import pad_im, chromatic_transform, add_noise, add_noise_cuda, add_noise_depth_cuda from transforms3d.quaternions import mat2quat, quat2mat from transforms3d.euler import euler2quat from utils.se3 import * from scipy.optimize import minimize import matplotlib.pyplot as plt class YCBObject(data.Dataset, datasets.imdb): def __init__(self, image_set, ycb_object_path = None): self._name = 'ycb_object_' + image_set self._image_set = image_set self._ycb_object_path = self._get_default_path() if ycb_object_path is None \ else ycb_object_path self._data_path = os.path.join(self._ycb_object_path, 'data') self._model_path = os.path.join(datasets.ROOT_DIR, 'data', 'models') self.root_path = self._ycb_object_path # define all the classes self._classes_all = ('__background__', '002_master_chef_can', '003_cracker_box', '004_sugar_box', '005_tomato_soup_can', '006_mustard_bottle', \ '007_tuna_fish_can', '008_pudding_box', '009_gelatin_box', '010_potted_meat_can', '011_banana', '019_pitcher_base', \ '021_bleach_cleanser', '024_bowl', '025_mug', '035_power_drill', '036_wood_block', '037_scissors', '040_large_marker', \ '051_large_clamp', '052_extra_large_clamp', '061_foam_brick', 'holiday_cup1', 'holiday_cup2', 'sanning_mug', \ '001_chips_can', 'block_red_big', 'block_green_big', 'block_blue_big', 'block_yellow_big', \ 'block_red_small', 'block_green_small', 'block_blue_small', 'block_yellow_small', \ 'block_red_median', 'block_green_median', 'block_blue_median', 'block_yellow_median', 'fusion_duplo_dude', 'cabinet_handle') self._num_classes_all = len(self._classes_all) 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), \ (0, 0, 128), (0, 128, 0), (128, 0, 0), (128, 128, 0), (128, 0, 128), (0, 128, 128), \ (0, 64, 0), (64, 0, 0), (0, 0, 64), (64, 64, 0), (64, 0, 64), (0, 64, 64), \ (192, 0, 0), (0, 192, 0), (0, 0, 192), (192, 192, 0), (192, 0, 192), (0, 192, 192), (32, 0, 0), \ (150, 0, 0), (0, 150, 0), (0, 0, 150), (150, 150, 0), (75, 0, 0), (0, 75, 0), (0, 0, 75), (75, 75, 0), \ (200, 0, 0), (0, 200, 0), (0, 0, 200), (200, 200, 0), (16, 16, 0), (16, 16, 16)] self._extents_all = self._load_object_extents() self._width = cfg.TRAIN.SYN_WIDTH self._height = cfg.TRAIN.SYN_HEIGHT self._intrinsic_matrix = np.array([[524.7917885754071, 0, 332.5213232846151], [0, 489.3563960810721, 281.2339855172282], [0, 0, 1]]) # select a subset of classes self._classes = [self._classes_all[i] for i in cfg.TRAIN.CLASSES] self._classes_test = [self._classes_all[i] for i in cfg.TEST.CLASSES] self._num_classes = len(self._classes) self._class_colors = [self._class_colors_all[i] for i in cfg.TRAIN.CLASSES] self._class_colors_test = [self._class_colors_all[i] for i in cfg.TEST.CLASSES] self._symmetry = np.array(cfg.TRAIN.SYMMETRY).astype(np.float32) self._symmetry_test = np.array(cfg.TEST.SYMMETRY).astype(np.float32) self._extents = self._extents_all[cfg.TRAIN.CLASSES] self._extents_test = self._extents_all[cfg.TEST.CLASSES] # train classes self._points, self._points_all, self._point_blob = \ self._load_object_points(self._classes, self._extents, self._symmetry) # test classes self._points_test, self._points_all_test, self._point_blob_test = \ self._load_object_points(self._classes_test, self._extents_test, self._symmetry_test) self._pixel_mean = torch.tensor(cfg.PIXEL_MEANS / 255.0).cuda().float() self._classes_other = [] for i in range(self._num_classes_all): if i not in cfg.TRAIN.CLASSES: # do not use clamp if i == 19 and 20 in cfg.TRAIN.CLASSES: continue if i == 20 and 19 in cfg.TRAIN.CLASSES: continue self._classes_other.append(i) self._num_classes_other = len(self._classes_other) # 3D model paths self.model_sdf_paths = ['{}/{}/textured_simple_low_res.pth'.format(self._model_path, cls) for cls in self._classes_all[1:]] self.model_colors = [np.array(self._class_colors_all[i]) / 255.0 for i in range(1, len(self._classes_all))] self.model_mesh_paths = [] for cls in self._classes_all[1:]: filename = '{}/{}/textured_simple.ply'.format(self._model_path, cls) if osp.exists(filename): self.model_mesh_paths.append(filename) continue filename = '{}/{}/textured_simple.obj'.format(self._model_path, cls) if osp.exists(filename): self.model_mesh_paths.append(filename) continue self.model_texture_paths = [] for cls in self._classes_all[1:]: filename = '{}/{}/texture_map.png'.format(self._model_path, cls) if osp.exists(filename): self.model_texture_paths.append(filename) else: self.model_texture_paths.append('') # target meshes self.model_colors_target = [np.array(self._class_colors_all[i]) / 255.0 for i in cfg.TRAIN.CLASSES[1:]] self.model_mesh_paths_target = [] for cls in self._classes[1:]: filename = '{}/{}/textured_simple.obj'.format(self._model_path, cls) if osp.exists(filename): self.model_mesh_paths_target.append(filename) continue filename = '{}/{}/textured_simple.ply'.format(self._model_path, cls) if osp.exists(filename): self.model_mesh_paths_target.append(filename) self.model_texture_paths_target = [] for cls in self._classes[1:]: filename = '{}/{}/texture_map.png'.format(self._model_path, cls) if osp.exists(filename): self.model_texture_paths_target.append(filename) else: self.model_texture_paths_target.append('') self._class_to_ind = dict(zip(self._classes, range(self._num_classes))) self._size = cfg.TRAIN.SYNNUM self._build_uniform_poses() # sample indexes real for ycb object num_poses = 600 num_classes = len(self._classes_all) - 1 # no background self.pose_indexes_real = np.zeros((num_classes, ), dtype=np.int32) self.pose_lists_real = [] self.pose_images = [] for i in range(num_classes): self.pose_lists_real.append(np.random.permutation(np.arange(num_poses))) dirname = osp.join(self._data_path, self._classes_all[i+1], '*.jpg') files = glob.glob(dirname) self.pose_images.append(files) # construct fake inputs label_blob = np.zeros((1, self._num_classes, self._height, self._width), dtype=np.float32) pose_blob = np.zeros((1, self._num_classes, 9), dtype=np.float32) gt_boxes = np.zeros((1, self._num_classes, 5), dtype=np.float32) # construct the meta data K = self._intrinsic_matrix Kinv = np.linalg.pinv(K) meta_data_blob = np.zeros((1, 18), dtype=np.float32) meta_data_blob[0, 0:9] = K.flatten() meta_data_blob[0, 9:18] = Kinv.flatten() self.input_labels = torch.from_numpy(label_blob).cuda() self.input_meta_data = torch.from_numpy(meta_data_blob).cuda() self.input_extents = torch.from_numpy(self._extents).cuda() self.input_gt_boxes = torch.from_numpy(gt_boxes).cuda() self.input_poses = torch.from_numpy(pose_blob).cuda() self.input_points = torch.from_numpy(self._point_blob).cuda() self.input_symmetry = torch.from_numpy(self._symmetry).cuda() def _render_item(self): height = cfg.TRAIN.SYN_HEIGHT width = cfg.TRAIN.SYN_WIDTH fx = self._intrinsic_matrix[0, 0] fy = self._intrinsic_matrix[1, 1] px = self._intrinsic_matrix[0, 2] py = self._intrinsic_matrix[1, 2] zfar = 6.0 znear = 0.01 # sample target objects if cfg.TRAIN.SYN_SAMPLE_OBJECT: maxnum = np.minimum(self.num_classes-1, cfg.TRAIN.SYN_MAX_OBJECT) num = np.random.randint(cfg.TRAIN.SYN_MIN_OBJECT, maxnum+1) perm = np.random.permutation(np.arange(self.num_classes-1)) indexes_target = perm[:num] + 1 else: num = self.num_classes - 1 indexes_target = np.arange(num) + 1 num_target = num cls_indexes = [cfg.TRAIN.CLASSES[i]-1 for i in indexes_target] # sample other objects as distractors if cfg.TRAIN.SYN_SAMPLE_DISTRACTOR: num_other = min(5, self._num_classes_other) num_selected = np.random.randint(0, num_other+1) perm = np.random.permutation(np.arange(self._num_classes_other)) indexes = perm[:num_selected] for i in range(num_selected): cls_indexes.append(self._classes_other[indexes[i]]-1) else: num_selected = 0 # sample poses num = num_target + num_selected poses_all = [] for i in range(num): qt = np.zeros((7, ), dtype=np.float32) # rotation cls = int(cls_indexes[i]) if self.pose_indexes[cls] >= len(self.pose_lists[cls]): self.pose_indexes[cls] = 0 self.pose_lists[cls] = np.random.permutation(np.arange(len(self.eulers))) yaw = self.eulers[self.pose_lists[cls][self.pose_indexes[cls]]][0] + 15 * np.random.randn() pitch = self.eulers[self.pose_lists[cls][self.pose_indexes[cls]]][1] + 15 * np.random.randn() pitch = np.clip(pitch, -90, 90) roll = self.eulers[self.pose_lists[cls][self.pose_indexes[cls]]][2] + 15 * np.random.randn() qt[3:] = euler2quat(yaw * math.pi / 180.0, pitch * math.pi / 180.0, roll * math.pi / 180.0, 'syxz') self.pose_indexes[cls] += 1 # translation bound = cfg.TRAIN.SYN_BOUND if i == 0 or i >= num_target or np.random.rand(1) > 0.5: qt[0] = np.random.uniform(-bound, bound) qt[1] = np.random.uniform(-bound, bound) qt[2] = np.random.uniform(cfg.TRAIN.SYN_TNEAR, cfg.TRAIN.SYN_TFAR) else: # sample an object nearby object_id = np.random.randint(0, i, size=1)[0] extent = 2 * np.mean(self._extents_all[cls+1, :]) flag = np.random.randint(0, 2) if flag == 0: flag = -1 qt[0] = poses_all[object_id][0] + flag * extent * np.random.uniform(1.0, 1.5) if np.absolute(qt[0]) > bound: qt[0] = poses_all[object_id][0] - flag * extent * np.random.uniform(1.0, 1.5) if np.absolute(qt[0]) > bound: qt[0] = np.random.uniform(-bound, bound) flag = np.random.randint(0, 2) if flag == 0: flag = -1 qt[1] = poses_all[object_id][1] + flag * extent * np.random.uniform(1.0, 1.5) if np.absolute(qt[1]) > bound: qt[1] = poses_all[object_id][1] - flag * extent * np.random.uniform(1.0, 1.5) if np.absolute(qt[1]) > bound: qt[1] = np.random.uniform(-bound, bound) qt[2] = poses_all[object_id][2] - extent * np.random.uniform(2.0, 4.0) if qt[2] < cfg.TRAIN.SYN_TNEAR: qt[2] = poses_all[object_id][2] + extent * np.random.uniform(2.0, 4.0) poses_all.append(qt) cfg.renderer.set_poses(poses_all) # sample lighting cfg.renderer.set_light_pos(np.random.uniform(-0.5, 0.5, 3)) intensity = np.random.uniform(0.8, 2) light_color = intensity * np.random.uniform(0.9, 1.1, 3) cfg.renderer.set_light_color(light_color) # rendering cfg.renderer.set_projection_matrix(width, height, fx, fy, px, py, znear, zfar) image_tensor = torch.cuda.FloatTensor(height, width, 4).detach() seg_tensor = torch.cuda.FloatTensor(height, width, 4).detach() pc_tensor = torch.cuda.FloatTensor(height, width, 4).detach() cfg.renderer.render(cls_indexes, image_tensor, seg_tensor, pc2_tensor=pc_tensor) image_tensor = image_tensor.flip(0) seg_tensor = seg_tensor.flip(0) pc_tensor = pc_tensor.flip(0) # foreground mask seg = seg_tensor[:,:,2] + 256*seg_tensor[:,:,1] + 256*256*seg_tensor[:,:,0] mask = (seg != 0).unsqueeze(0).repeat((3, 1, 1)).float() # RGB to BGR order im = image_tensor.cpu().numpy() im = np.clip(im, 0, 1) im = im[:, :, (2, 1, 0)] * 255 im = im.astype(np.uint8) # XYZ coordinates in camera frame im_depth = pc_tensor.cpu().numpy() im_depth = im_depth[:, :, :3] im_depth_return = im_depth[:, :, 2].copy() im_label = seg_tensor.cpu().numpy() im_label = im_label[:, :, (2, 1, 0)] * 255 im_label = np.round(im_label).astype(np.uint8) im_label = np.clip(im_label, 0, 255) im_label, im_label_all = self.process_label_image(im_label) centers = np.zeros((num, 2), dtype=np.float32) rcenters = cfg.renderer.get_centers() for i in range(num): centers[i, 0] = rcenters[i][1] * width centers[i, 1] = rcenters[i][0] * height centers = centers[:num_target, :] ''' import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(3, 2, 1) plt.imshow(im[:, :, (2, 1, 0)]) for i in range(num_target): plt.plot(centers[i, 0], centers[i, 1], 'yo') ax = fig.add_subplot(3, 2, 2) plt.imshow(im_label) ax = fig.add_subplot(3, 2, 3) plt.imshow(im_depth[:, :, 0]) ax = fig.add_subplot(3, 2, 4) plt.imshow(im_depth[:, :, 1]) ax = fig.add_subplot(3, 2, 5) plt.imshow(im_depth[:, :, 2]) plt.show() #''' # chromatic transform if cfg.TRAIN.CHROMATIC and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1: im = chromatic_transform(im) im_cuda = torch.from_numpy(im).cuda().float() / 255.0 if cfg.TRAIN.ADD_NOISE and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1: im_cuda = add_noise_cuda(im_cuda) im_cuda -= self._pixel_mean im_cuda = im_cuda.permute(2, 0, 1) if cfg.INPUT == 'DEPTH' or cfg.INPUT == 'RGBD': # depth mask z_im = im_depth[:, :, 2] mask_depth = z_im > 0.0 mask_depth = mask_depth.astype('float') mask_depth_cuda = torch.from_numpy(mask_depth).cuda().float() mask_depth_cuda.unsqueeze_(0) im_cuda_depth = torch.from_numpy(im_depth).cuda().float() if cfg.TRAIN.ADD_NOISE and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1: im_cuda_depth = add_noise_depth_cuda(im_cuda_depth) im_cuda_depth = im_cuda_depth.permute(2, 0, 1) else: im_cuda_depth = im_cuda.clone() mask_depth_cuda = torch.cuda.FloatTensor(1, height, width).fill_(0) # label blob classes = np.array(range(self.num_classes)) label_blob = np.zeros((self.num_classes, self._height, self._width), dtype=np.float32) label_blob[0, :, :] = 1.0 for i in range(1, self.num_classes): I = np.where(im_label == classes[i]) if len(I[0]) > 0: label_blob[i, I[0], I[1]] = 1.0 label_blob[0, I[0], I[1]] = 0.0 # poses and boxes pose_blob = np.zeros((self.num_classes, 9), dtype=np.float32) gt_boxes = np.zeros((self.num_classes, 5), dtype=np.float32) for i in range(num_target): cls = int(indexes_target[i]) pose_blob[i, 0] = 1 pose_blob[i, 1] = cls T = poses_all[i][:3] qt = poses_all[i][3:] # egocentric to allocentric qt_allocentric = egocentric2allocentric(qt, T) if qt_allocentric[0] < 0: qt_allocentric = -1 * qt_allocentric pose_blob[i, 2:6] = qt_allocentric pose_blob[i, 6:] = T # compute box x3d = np.ones((4, self._points_all.shape[1]), dtype=np.float32) x3d[0, :] = self._points_all[cls,:,0] x3d[1, :] = self._points_all[cls,:,1] x3d[2, :] = self._points_all[cls,:,2] RT = np.zeros((3, 4), dtype=np.float32) RT[:3, :3] = quat2mat(qt) RT[:, 3] = T x2d = np.matmul(self._intrinsic_matrix, np.matmul(RT, x3d)) x2d[0, :] = np.divide(x2d[0, :], x2d[2, :]) x2d[1, :] = np.divide(x2d[1, :], x2d[2, :]) gt_boxes[i, 0] = np.min(x2d[0, :]) gt_boxes[i, 1] = np.min(x2d[1, :]) gt_boxes[i, 2] = np.max(x2d[0, :]) gt_boxes[i, 3] = np.max(x2d[1, :]) gt_boxes[i, 4] = cls # construct the meta data """ format of the meta_data intrinsic matrix: meta_data[0 ~ 8] inverse intrinsic matrix: meta_data[9 ~ 17] """ K = self._intrinsic_matrix K[2, 2] = 1 Kinv = np.linalg.pinv(K) meta_data_blob = np.zeros(18, dtype=np.float32) meta_data_blob[0:9] = K.flatten() meta_data_blob[9:18] = Kinv.flatten() # vertex regression target if cfg.TRAIN.VERTEX_REG: vertex_targets, vertex_weights = self._generate_vertex_targets(im_label, indexes_target, centers, poses_all, classes, self.num_classes) elif cfg.TRAIN.VERTEX_REG_DELTA and cfg.INPUT == 'DEPTH' or cfg.INPUT == 'RGBD': vertex_targets, vertex_weights = self._generate_vertex_deltas(im_label, indexes_target, centers, poses_all, classes, self.num_classes, im_depth) else: vertex_targets = [] vertex_weights = [] im_info = np.array([im.shape[1], im.shape[2], cfg.TRAIN.SCALES_BASE[0], 1], dtype=np.float32) sample = {'image_color': im_cuda, 'image_depth': im_cuda_depth, 'im_depth': im_depth_return, 'label': label_blob, 'mask': mask, 'mask_depth': mask_depth_cuda, 'meta_data': meta_data_blob, 'poses': pose_blob, 'extents': self._extents, 'points': self._point_blob, 'symmetry': self._symmetry, 'gt_boxes': gt_boxes, 'im_info': im_info} if cfg.TRAIN.VERTEX_REG or cfg.TRAIN.VERTEX_REG_DELTA: sample['vertex_targets'] = vertex_targets sample['vertex_weights'] = vertex_weights return sample def __getitem__(self, index): return self._render_item() def __len__(self): return self._size # compute the voting label image in 2D def _generate_vertex_targets(self, im_label, cls_indexes, center, poses, classes, num_classes): width = im_label.shape[1] height = im_label.shape[0] vertex_targets = np.zeros((3 * num_classes, height, width), dtype=np.float32) vertex_weights = np.zeros((3 * num_classes, height, width), dtype=np.float32) c = np.zeros((2, 1), dtype=np.float32) for i in range(1, num_classes): y, x = np.where(im_label == classes[i]) I = np.where(im_label == classes[i]) ind = np.where(cls_indexes == classes[i])[0] if len(x) > 0 and len(ind) > 0: c[0] = center[ind, 0] c[1] = center[ind, 1] z = poses[int(ind)][2] R = np.tile(c, (1, len(x))) - np.vstack((x, y)) # compute the norm N = np.linalg.norm(R, axis=0) + 1e-10 # normalization R = np.divide(R, np.tile(N, (2,1))) # assignment vertex_targets[3*i+0, y, x] = R[0,:] vertex_targets[3*i+1, y, x] = R[1,:] vertex_targets[3*i+2, y, x] = math.log(z) vertex_weights[3*i+0, y, x] = cfg.TRAIN.VERTEX_W_INSIDE vertex_weights[3*i+1, y, x] = cfg.TRAIN.VERTEX_W_INSIDE vertex_weights[3*i+2, y, x] = cfg.TRAIN.VERTEX_W_INSIDE return vertex_targets, vertex_weights def _generate_vertex_deltas(self, im_label, cls_indexes, center, poses, classes, num_classes, im_depth): x_image = im_depth[:, :, 0] y_image = im_depth[:, :, 1] z_image = im_depth[:, :, 2] width = im_label.shape[1] height = im_label.shape[0] vertex_targets = np.zeros((3 * num_classes, height, width), dtype=np.float32) vertex_weights = np.zeros((3 * num_classes, height, width), dtype=np.float32) c = np.zeros((2, 1), dtype=np.float32) for i in range(1, num_classes): valid_mask = (z_image != 0.0) label_mask = (im_label == classes[i]) fin_mask = valid_mask * label_mask y, x = np.where(fin_mask) ind = np.where(cls_indexes == classes[i])[0] if len(x) > 0 and len(ind) > 0: extents_here = self._extents[i, :] largest_dim = np.sqrt(np.sum(extents_here * extents_here)) half_diameter = largest_dim / 2.0 c[0] = center[ind, 0] c[1] = center[ind, 1] if isinstance(poses, list): x_center_coord = poses[int(ind)][0] y_center_coord = poses[int(ind)][1] z_center_coord = poses[int(ind)][2] else: if len(poses.shape) == 3: x_center_coord = poses[0, 3, ind] y_center_coord = poses[1, 3, ind] z_center_coord = poses[2, 3, ind] else: x_center_coord = poses[ind, -3] y_center_coord = poses[ind, -2] z_center_coord = poses[ind, -1] targets_x = (x_image[y, x] - x_center_coord) / half_diameter targets_y = (y_image[y, x] - y_center_coord) / half_diameter targets_z = (z_image[y, x] - z_center_coord) / half_diameter vertex_targets[3 * i + 0, y, x] = targets_x vertex_targets[3 * i + 1, y, x] = targets_y vertex_targets[3 * i + 2, y, x] = targets_z vertex_weights[3 * i + 0, y, x] = cfg.TRAIN.VERTEX_W_INSIDE vertex_weights[3 * i + 1, y, x] = cfg.TRAIN.VERTEX_W_INSIDE vertex_weights[3 * i + 2, y, x] = cfg.TRAIN.VERTEX_W_INSIDE return vertex_targets, vertex_weights def _get_default_path(self): """ Return the default path where ycb_object is expected to be installed. """ return os.path.join(datasets.ROOT_DIR, 'data', 'YCB_Object') def _load_object_extents(self): extents = np.zeros((self._num_classes_all, 3), dtype=np.float32) for i in range(1, self._num_classes_all): point_file = os.path.join(self._model_path, self._classes_all[i], 'points.xyz') print(point_file) assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file) points = np.loadtxt(point_file) extents[i, :] = 2 * np.max(np.absolute(points), axis=0) return extents def _load_object_points(self, classes, extents, symmetry): points = [[] for _ in range(len(classes))] num = np.inf num_classes = len(classes) for i in range(1, num_classes): point_file = os.path.join(self._model_path, classes[i], 'points.xyz') print(point_file) assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file) points[i] = np.loadtxt(point_file) if points[i].shape[0] < num: num = points[i].shape[0] points_all = np.zeros((num_classes, num, 3), dtype=np.float32) for i in range(1, num_classes): points_all[i, :, :] = points[i][:num, :] # rescale the points point_blob = points_all.copy() for i in range(1, num_classes): # compute the rescaling factor for the points weight = 10.0 / np.amax(extents[i, :]) if weight < 10: weight = 10 if symmetry[i] > 0: point_blob[i, :, :] = 4 * weight * point_blob[i, :, :] else: point_blob[i, :, :] = weight * point_blob[i, :, :] return points, points_all, point_blob def labels_to_image(self, labels): height = labels.shape[0] width = labels.shape[1] im_label = np.zeros((height, width, 3), dtype=np.uint8) for i in range(self.num_classes): I = np.where(labels == i) im_label[I[0], I[1], :] = self._class_colors[i] return im_label def process_label_image(self, label_image): """ change label image to label index """ height = label_image.shape[0] width = label_image.shape[1] labels = np.zeros((height, width), dtype=np.int32) labels_all = np.zeros((height, width), dtype=np.int32) # label image is in BGR order index = label_image[:,:,2] + 256*label_image[:,:,1] + 256*256*label_image[:,:,0] for i in range(1, len(self._class_colors_all)): color = self._class_colors_all[i] ind = color[0] + 256*color[1] + 256*256*color[2] I = np.where(index == ind) labels_all[I[0], I[1]] = i ind = np.where(np.array(cfg.TRAIN.CLASSES) == i)[0] if len(ind) > 0: labels[I[0], I[1]] = ind return labels, labels_all ================================================ FILE: lib/datasets/ycb_self_supervision.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import torch import torch.utils.data as data import os, math import sys import os.path as osp from os.path import * import numpy as np import numpy.random as npr import cv2 import scipy.io import copy import glob try: import cPickle # Use cPickle on Python 2.7 except ImportError: import pickle as cPickle import datasets from fcn.config import cfg from utils.blob import pad_im, chromatic_transform, add_noise, add_noise_cuda from transforms3d.quaternions import mat2quat, quat2mat from utils.se3 import * from utils.pose_error import * from utils.cython_bbox import bbox_overlaps from utils.segmentation_evaluation import multilabel_metrics def VOCap(rec, prec): index = np.where(np.isfinite(rec))[0] rec = rec[index] prec = prec[index] if len(rec) == 0 or len(prec) == 0: ap = 0 else: mrec = np.insert(rec, 0, 0) mrec = np.append(mrec, 0.1) mpre = np.insert(prec, 0, 0) mpre = np.append(mpre, prec[-1]) for i in range(1, len(mpre)): mpre[i] = max(mpre[i], mpre[i-1]) i = np.where(mrec[1:] != mrec[:-1])[0] + 1 ap = np.sum(np.multiply(mrec[i] - mrec[i-1], mpre[i])) * 10 return ap class YCBSelfSupervision(data.Dataset, datasets.imdb): def __init__(self, image_set, ycb_self_supervision_path = None): self._name = 'ycb_self_supervision_' + image_set self._image_set = image_set self._ycb_self_supervision_path = self._get_default_path() if ycb_self_supervision_path is None \ else ycb_self_supervision_path self._data_path = os.path.join(self._ycb_self_supervision_path, 'data') self._model_path = os.path.join(datasets.ROOT_DIR, 'data', 'models') # define all the classes self._classes_all = ('__background__', '002_master_chef_can', '003_cracker_box', '004_sugar_box', '005_tomato_soup_can', '006_mustard_bottle', \ '007_tuna_fish_can', '008_pudding_box', '009_gelatin_box', '010_potted_meat_can', '011_banana', '019_pitcher_base', \ '021_bleach_cleanser', '024_bowl', '025_mug', '035_power_drill', '036_wood_block', '037_scissors', '040_large_marker', \ '051_large_clamp', '052_extra_large_clamp', '061_foam_brick', 'holiday_cup1', 'holiday_cup2', 'sanning_mug', \ '001_chips_can', 'block_red_big', 'block_green_big', 'block_blue_big', 'block_yellow_big', \ 'block_red_small', 'block_green_small', 'block_blue_small', 'block_yellow_small', \ 'block_red_median', 'block_green_median', 'block_blue_median', 'block_yellow_median', 'fusion_duplo_dude', 'cabinet_handle') self._num_classes_all = len(self._classes_all) 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), \ (0, 0, 128), (0, 128, 0), (128, 0, 0), (128, 128, 0), (128, 0, 128), (0, 128, 128), \ (0, 64, 0), (64, 0, 0), (0, 0, 64), (64, 64, 0), (64, 0, 64), (0, 64, 64), \ (192, 0, 0), (0, 192, 0), (0, 0, 192), (192, 192, 0), (192, 0, 192), (0, 192, 192), (32, 0, 0), \ (150, 0, 0), (0, 150, 0), (0, 0, 150), (150, 150, 0), (75, 0, 0), (0, 75, 0), (0, 0, 75), (75, 75, 0), \ (200, 0, 0), (0, 200, 0), (0, 0, 200), (200, 200, 0), (16, 16, 0), (16, 16, 16)] self._extents_all = self._load_object_extents() self._width = cfg.TRAIN.SYN_WIDTH self._height = cfg.TRAIN.SYN_HEIGHT self._intrinsic_matrix = np.array([[616.3653, 0., 310.25882], [ 0., 616.20294, 236.59981], [ 0., 0., 1. ]]) if self._width == 1280: self._intrinsic_matrix = np.array([[599.48681641, 0., 639.84338379], [ 0., 599.24389648, 366.09042358], [ 0., 0., 1. ]]) # select a subset of classes self._classes = [self._classes_all[i] for i in cfg.TRAIN.CLASSES] self._classes_test = [self._classes_all[i] for i in cfg.TEST.CLASSES] self._num_classes = len(self._classes) self._class_colors = [self._class_colors_all[i] for i in cfg.TRAIN.CLASSES] self._class_colors_test = [self._class_colors_all[i] for i in cfg.TEST.CLASSES] self._symmetry = np.array(cfg.TRAIN.SYMMETRY).astype(np.float32) self._symmetry_test = np.array(cfg.TEST.SYMMETRY).astype(np.float32) self._extents = self._extents_all[cfg.TRAIN.CLASSES] self._extents_test = self._extents_all[cfg.TEST.CLASSES] self._points, self._points_all, self._point_blob = self._load_object_points(self._classes, self._extents, self._symmetry) self._points_test, self._points_all_test, self._point_blob_test = \ self._load_object_points(self._classes_test, self._extents_test, self._symmetry_test) self._pixel_mean = torch.tensor(cfg.PIXEL_MEANS / 255.0).cuda().float() self._classes_other = [] for i in range(self._num_classes_all): if i not in cfg.TRAIN.CLASSES: # do not use clamp if i == 19 and 20 in cfg.TRAIN.CLASSES: continue if i == 20 and 19 in cfg.TRAIN.CLASSES: continue self._classes_other.append(i) self._num_classes_other = len(self._classes_other) # 3D model paths self.model_sdf_paths = ['{}/{}/textured_simple_low_res.pth'.format(self._model_path, cls) for cls in self._classes_all[1:]] self.model_colors = [np.array(self._class_colors_all[i]) / 255.0 for i in range(1, len(self._classes_all))] self.model_mesh_paths = [] for cls in self._classes_all[1:]: filename = '{}/{}/textured_simple.ply'.format(self._model_path, cls) if osp.exists(filename): self.model_mesh_paths.append(filename) continue filename = '{}/{}/textured_simple.obj'.format(self._model_path, cls) if osp.exists(filename): self.model_mesh_paths.append(filename) self.model_texture_paths = [] for cls in self._classes_all[1:]: filename = '{}/{}/texture_map.png'.format(self._model_path, cls) if osp.exists(filename): self.model_texture_paths.append(filename) else: self.model_texture_paths.append('') # target meshes self.model_colors_target = [np.array(self._class_colors_all[i]) / 255.0 for i in cfg.TRAIN.CLASSES[1:]] self.model_mesh_paths_target = [] for cls in self._classes[1:]: filename = '{}/{}/textured_simple.ply'.format(self._model_path, cls) if osp.exists(filename): self.model_mesh_paths_target.append(filename) continue filename = '{}/{}/textured_simple.obj'.format(self._model_path, cls) if osp.exists(filename): self.model_mesh_paths_target.append(filename) self.model_texture_paths_target = [] for cls in self._classes[1:]: filename = '{}/{}/texture_map.png'.format(self._model_path, cls) if osp.exists(filename): self.model_texture_paths_target.append(filename) else: self.model_texture_paths_target.append('') self._class_to_ind = dict(zip(self._classes, range(self._num_classes))) self._image_ext = '.png' self._image_index = self._load_image_set_index(image_set) if (cfg.MODE == 'TRAIN' and cfg.TRAIN.SYNTHESIZE) or (cfg.MODE == 'TEST' and cfg.TEST.SYNTHESIZE): self._size = len(self._image_index) * (cfg.TRAIN.SYN_RATIO+1) else: self._size = len(self._image_index) if self._size > cfg.TRAIN.MAX_ITERS_PER_EPOCH * cfg.TRAIN.IMS_PER_BATCH: self._size = cfg.TRAIN.MAX_ITERS_PER_EPOCH * cfg.TRAIN.IMS_PER_BATCH self._roidb = self.gt_roidb() if cfg.MODE == 'TRAIN' or cfg.TEST.VISUALIZE: self._perm = np.random.permutation(np.arange(len(self._roidb))) else: self._perm = np.arange(len(self._roidb)) self._cur = 0 self._build_uniform_poses() self.lb_shift = -0.2 self.ub_shift = 0.2 self.lb_scale = 0.8 self.ub_scale = 2.0 assert os.path.exists(self._ycb_self_supervision_path), \ 'ycb_self_supervision path does not exist: {}'.format(self._ycb_self_supervision_path) assert os.path.exists(self._data_path), \ 'Data path does not exist: {}'.format(self._data_path) # construct fake inputs label_blob = np.zeros((1, self._num_classes, self._height, self._width), dtype=np.float32) pose_blob = np.zeros((1, self._num_classes, 9), dtype=np.float32) gt_boxes = np.zeros((1, self._num_classes, 5), dtype=np.float32) # construct the meta data K = self._intrinsic_matrix Kinv = np.linalg.pinv(K) meta_data_blob = np.zeros((1, 18), dtype=np.float32) meta_data_blob[0, 0:9] = K.flatten() meta_data_blob[0, 9:18] = Kinv.flatten() self.input_labels = torch.from_numpy(label_blob).cuda() self.input_meta_data = torch.from_numpy(meta_data_blob).cuda() self.input_extents = torch.from_numpy(self._extents).cuda() self.input_gt_boxes = torch.from_numpy(gt_boxes).cuda() self.input_poses = torch.from_numpy(pose_blob).cuda() self.input_points = torch.from_numpy(self._point_blob).cuda() self.input_symmetry = torch.from_numpy(self._symmetry).cuda() def _render_item(self): height = cfg.TRAIN.SYN_HEIGHT width = cfg.TRAIN.SYN_WIDTH fx = self._intrinsic_matrix[0, 0] fy = self._intrinsic_matrix[1, 1] px = self._intrinsic_matrix[0, 2] py = self._intrinsic_matrix[1, 2] zfar = 6.0 znear = 0.01 # sample target objects if cfg.TRAIN.SYN_SAMPLE_OBJECT: maxnum = np.minimum(self.num_classes-1, cfg.TRAIN.SYN_MAX_OBJECT) num = np.random.randint(cfg.TRAIN.SYN_MIN_OBJECT, maxnum+1) perm = np.random.permutation(np.arange(self.num_classes-1)) indexes_target = perm[:num] + 1 else: num = self.num_classes - 1 indexes_target = np.arange(num) + 1 num_target = num cls_indexes = [cfg.TRAIN.CLASSES[i]-1 for i in indexes_target] # sample other objects as distractors if cfg.TRAIN.SYN_SAMPLE_DISTRACTOR: num_other = min(5, self._num_classes_other) num_selected = np.random.randint(0, num_other+1) perm = np.random.permutation(np.arange(self._num_classes_other)) indexes = perm[:num_selected] for i in range(num_selected): cls_indexes.append(self._classes_other[indexes[i]]-1) else: num_selected = 0 # sample poses num = num_target + num_selected poses_all = [] for i in range(num): qt = np.zeros((7, ), dtype=np.float32) # rotation cls = int(cls_indexes[i]) if self.pose_indexes[cls] >= len(self.pose_lists[cls]): self.pose_indexes[cls] = 0 self.pose_lists[cls] = np.random.permutation(np.arange(len(self.eulers))) yaw = self.eulers[self.pose_lists[cls][self.pose_indexes[cls]]][0] + 15 * np.random.randn() pitch = self.eulers[self.pose_lists[cls][self.pose_indexes[cls]]][1] + 15 * np.random.randn() pitch = np.clip(pitch, -90, 90) roll = self.eulers[self.pose_lists[cls][self.pose_indexes[cls]]][2] + 15 * np.random.randn() qt[3:] = euler2quat(yaw * math.pi / 180.0, pitch * math.pi / 180.0, roll * math.pi / 180.0, 'syxz') self.pose_indexes[cls] += 1 # translation bound = cfg.TRAIN.SYN_BOUND if i == 0 or i >= num_target or np.random.rand(1) > 0.5: qt[0] = np.random.uniform(-bound, bound) qt[1] = np.random.uniform(-bound, bound) qt[2] = np.random.uniform(cfg.TRAIN.SYN_TNEAR, cfg.TRAIN.SYN_TFAR) else: # sample an object nearby object_id = np.random.randint(0, i, size=1)[0] extent = np.mean(self._extents_all[cls+1, :]) flag = np.random.randint(0, 2) if flag == 0: flag = -1 qt[0] = poses_all[object_id][0] + flag * extent * np.random.uniform(1.0, 1.5) if np.absolute(qt[0]) > bound: qt[0] = poses_all[object_id][0] - flag * extent * np.random.uniform(1.0, 1.5) if np.absolute(qt[0]) > bound: qt[0] = np.random.uniform(-bound, bound) flag = np.random.randint(0, 2) if flag == 0: flag = -1 qt[1] = poses_all[object_id][1] + flag * extent * np.random.uniform(1.0, 1.5) if np.absolute(qt[1]) > bound: qt[1] = poses_all[object_id][1] - flag * extent * np.random.uniform(1.0, 1.5) if np.absolute(qt[1]) > bound: qt[1] = np.random.uniform(-bound, bound) qt[2] = poses_all[object_id][2] - extent * np.random.uniform(2.0, 4.0) if qt[2] < cfg.TRAIN.SYN_TNEAR: qt[2] = poses_all[object_id][2] + extent * np.random.uniform(2.0, 4.0) poses_all.append(qt) cfg.renderer.set_poses(poses_all) # sample lighting cfg.renderer.set_light_pos(np.random.uniform(-0.5, 0.5, 3)) intensity = np.random.uniform(0.8, 2) light_color = intensity * np.random.uniform(0.9, 1.1, 3) cfg.renderer.set_light_color(light_color) # rendering cfg.renderer.set_projection_matrix(width, height, fx, fy, px, py, znear, zfar) image_tensor = torch.cuda.FloatTensor(height, width, 4).detach() seg_tensor = torch.cuda.FloatTensor(height, width, 4).detach() pc_tensor = torch.cuda.FloatTensor(height, width, 4).detach() cfg.renderer.render(cls_indexes, image_tensor, seg_tensor, pc2_tensor=pc_tensor) image_tensor = image_tensor.flip(0) seg_tensor = seg_tensor.flip(0) pc_tensor = pc_tensor.flip(0) # foreground mask seg = seg_tensor[:,:,2] + 256*seg_tensor[:,:,1] + 256*256*seg_tensor[:,:,0] mask = (seg != 0).unsqueeze(0).repeat((3, 1, 1)).float() # RGB to BGR order im = image_tensor.cpu().numpy() im = np.clip(im, 0, 1) im = im[:, :, (2, 1, 0)] * 255 im = im.astype(np.uint8) # XYZ coordinates in camera frame im_depth = pc_tensor.cpu().numpy() im_depth = im_depth[:, :, :3] im_depth_return = im_depth[:, :, 2].copy() im_label = seg_tensor.cpu().numpy() im_label = im_label[:, :, (2, 1, 0)] * 255 im_label = np.round(im_label).astype(np.uint8) im_label = np.clip(im_label, 0, 255) im_label, im_label_all = self.process_label_image(im_label) centers = np.zeros((num, 2), dtype=np.float32) rcenters = cfg.renderer.get_centers() for i in range(num): centers[i, 0] = rcenters[i][1] * width centers[i, 1] = rcenters[i][0] * height centers = centers[:num_target, :] ''' import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(3, 2, 1) plt.imshow(im[:, :, (2, 1, 0)]) for i in range(num_target): plt.plot(centers[i, 0], centers[i, 1], 'yo') ax = fig.add_subplot(3, 2, 2) plt.imshow(im_label) ax = fig.add_subplot(3, 2, 3) plt.imshow(im_depth[:, :, 0]) ax = fig.add_subplot(3, 2, 4) plt.imshow(im_depth[:, :, 1]) ax = fig.add_subplot(3, 2, 5) plt.imshow(im_depth[:, :, 2]) plt.show() #''' # chromatic transform if cfg.TRAIN.CHROMATIC and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1: im = chromatic_transform(im) im_cuda = torch.from_numpy(im).cuda().float() / 255.0 if cfg.TRAIN.ADD_NOISE and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1: im_cuda = add_noise_cuda(im_cuda) im_cuda -= self._pixel_mean im_cuda = im_cuda.permute(2, 0, 1) if cfg.INPUT == 'DEPTH' or cfg.INPUT == 'RGBD': # depth mask z_im = im_depth[:, :, 2] mask_depth = z_im > 0.0 mask_depth = mask_depth.astype('float') mask_depth_cuda = torch.from_numpy(mask_depth).cuda().float() mask_depth_cuda.unsqueeze_(0) im_cuda_depth = torch.from_numpy(im_depth).cuda().float() if cfg.TRAIN.ADD_NOISE and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1: im_cuda_depth = add_noise_depth_cuda(im_cuda_depth) im_cuda_depth = im_cuda_depth.permute(2, 0, 1) else: im_cuda_depth = im_cuda.clone() mask_depth_cuda = torch.cuda.FloatTensor(1, height, width).fill_(0) # label blob classes = np.array(range(self.num_classes)) label_blob = np.zeros((self.num_classes, self._height, self._width), dtype=np.float32) label_blob[0, :, :] = 1.0 for i in range(1, self.num_classes): I = np.where(im_label == classes[i]) if len(I[0]) > 0: label_blob[i, I[0], I[1]] = 1.0 label_blob[0, I[0], I[1]] = 0.0 # poses and boxes pose_blob = np.zeros((self.num_classes, 9), dtype=np.float32) gt_boxes = np.zeros((self.num_classes, 5), dtype=np.float32) count = 0 for i in range(num_target): cls = int(indexes_target[i]) T = poses_all[i][:3] qt = poses_all[i][3:] I = np.where(im_label == cls) if len(I[0]) == 0: continue # compute box x3d = np.ones((4, self._points_all.shape[1]), dtype=np.float32) x3d[0, :] = self._points_all[cls,:,0] x3d[1, :] = self._points_all[cls,:,1] x3d[2, :] = self._points_all[cls,:,2] RT = np.zeros((3, 4), dtype=np.float32) RT[:3, :3] = quat2mat(qt) RT[:, 3] = T x2d = np.matmul(self._intrinsic_matrix, np.matmul(RT, x3d)) x2d[0, :] = np.divide(x2d[0, :], x2d[2, :]) x2d[1, :] = np.divide(x2d[1, :], x2d[2, :]) x1 = np.min(x2d[0, :]) y1 = np.min(x2d[1, :]) x2 = np.max(x2d[0, :]) y2 = np.max(x2d[1, :]) if x1 > width or y1 > height or x2 < 0 or y2 < 0: continue gt_boxes[count, 0] = x1 gt_boxes[count, 1] = y1 gt_boxes[count, 2] = x2 gt_boxes[count, 3] = y2 gt_boxes[count, 4] = cls pose_blob[count, 0] = 1 pose_blob[count, 1] = cls # egocentric to allocentric qt_allocentric = egocentric2allocentric(qt, T) if qt_allocentric[0] < 0: qt_allocentric = -1 * qt_allocentric pose_blob[count, 2:6] = qt_allocentric pose_blob[count, 6:] = T count += 1 # construct the meta data """ format of the meta_data intrinsic matrix: meta_data[0 ~ 8] inverse intrinsic matrix: meta_data[9 ~ 17] """ K = self._intrinsic_matrix K[2, 2] = 1 Kinv = np.linalg.pinv(K) meta_data_blob = np.zeros(18, dtype=np.float32) meta_data_blob[0:9] = K.flatten() meta_data_blob[9:18] = Kinv.flatten() # vertex regression target if cfg.TRAIN.VERTEX_REG: vertex_targets, vertex_weights = self._generate_vertex_targets(im_label, indexes_target, centers, poses_all, classes, self.num_classes) elif cfg.TRAIN.VERTEX_REG_DELTA and cfg.INPUT == 'DEPTH' or cfg.INPUT == 'RGBD': vertex_targets, vertex_weights = self._generate_vertex_deltas(im_label, indexes_target, centers, poses_all, classes, self.num_classes, im_depth) else: vertex_targets = [] vertex_weights = [] im_info = np.array([im.shape[1], im.shape[2], cfg.TRAIN.SCALES_BASE[0], 1], dtype=np.float32) sample = {'image_color': im_cuda, 'im_depth': im_depth_return, 'label': label_blob, 'mask': mask, 'meta_data': meta_data_blob, 'poses': pose_blob, 'extents': self._extents, 'points': self._point_blob, 'symmetry': self._symmetry, 'gt_boxes': gt_boxes, 'im_info': im_info, 'meta_data_path': ''} if cfg.TRAIN.VERTEX_REG or cfg.TRAIN.VERTEX_REG_DELTA: sample['vertex_targets'] = vertex_targets sample['vertex_weights'] = vertex_weights # affine transformation if cfg.TRAIN.AFFINE: shift = np.float32([np.random.uniform(self.lb_shift, self.ub_shift), np.random.uniform(self.lb_shift, self.ub_shift)]) scale = np.random.uniform(self.lb_scale, self.ub_scale) affine_matrix = np.float32([[scale, 0, shift[0]], [0, scale, shift[1]]]) affine_1 = np.eye(3, dtype=np.float32) affine_1[0, 2] = -0.5 * self._width affine_1[1, 2] = -0.5 * self._height affine_2 = np.eye(3, dtype=np.float32) affine_2[0, 0] = 1.0 / scale affine_2[0, 2] = -shift[0] * 0.5 * self._width / scale affine_2[1, 1] = 1.0 / scale affine_2[1, 2] = -shift[1] * 0.5 * self._height / scale affine_3 = np.matmul(affine_2, affine_1) affine_4 = np.matmul(np.linalg.inv(affine_1), affine_3) affine_matrix_coordinate = affine_4[:3, :] sample['affine_matrix'] = torch.from_numpy(affine_matrix).cuda() sample['affine_matrix_coordinate'] = torch.from_numpy(affine_matrix_coordinate).cuda() return sample def __getitem__(self, index): is_syn = 0 if ((cfg.MODE == 'TRAIN' and cfg.TRAIN.SYNTHESIZE) or (cfg.MODE == 'TEST' and cfg.TEST.SYNTHESIZE)) and (index % (cfg.TRAIN.SYN_RATIO+1) != 0): is_syn = 1 if is_syn: return self._render_item() if self._cur >= len(self._roidb): self._perm = np.random.permutation(np.arange(len(self._roidb))) self._cur = 0 db_ind = self._perm[self._cur] roidb = self._roidb[db_ind] self._cur += 1 # Get the input image blob random_scale_ind = npr.randint(0, high=len(cfg.TRAIN.SCALES_BASE)) im_blob, im_depth, im_scale, height, width = self._get_image_blob(roidb, random_scale_ind) # build the label blob label_blob, mask, meta_data_blob, pose_blob, gt_boxes, vertex_targets, vertex_weights \ = self._get_label_blob(roidb, self._num_classes, im_scale, height, width) im_info = np.array([im_blob.shape[1], im_blob.shape[2], im_scale, is_syn], dtype=np.float32) mask_depth_cuda = torch.cuda.FloatTensor(1, height, width).fill_(0) sample = {'image_color': im_blob, 'im_depth': im_depth, 'label': label_blob, 'mask': mask, 'meta_data': meta_data_blob, 'poses': pose_blob, 'extents': self._extents, 'points': self._point_blob, 'symmetry': self._symmetry, 'gt_boxes': gt_boxes, 'im_info': im_info, 'meta_data_path': roidb['meta_data']} if cfg.TRAIN.VERTEX_REG: sample['vertex_targets'] = vertex_targets sample['vertex_weights'] = vertex_weights return sample def _get_image_blob(self, roidb, scale_ind): # rgba rgba = pad_im(cv2.imread(roidb['image'], cv2.IMREAD_UNCHANGED), 16) if rgba.shape[2] == 4: im = np.copy(rgba[:,:,:3]) alpha = rgba[:,:,3] I = np.where(alpha == 0) im[I[0], I[1], :] = 0 else: im = rgba im_scale = cfg.TRAIN.SCALES_BASE[scale_ind] if im_scale != 1.0: im = cv2.resize(im, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_LINEAR) height = im.shape[0] width = im.shape[1] if roidb['flipped']: im = im[:, ::-1, :] # chromatic transform if cfg.TRAIN.CHROMATIC and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1: im = chromatic_transform(im) im_cuda = torch.from_numpy(im).cuda().float() / 255.0 if cfg.TRAIN.ADD_NOISE and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1: im_cuda = add_noise_cuda(im_cuda) im_cuda -= self._pixel_mean im_cuda = im_cuda.permute(2, 0, 1) # depth image im_depth = pad_im(cv2.imread(roidb['depth'], cv2.IMREAD_UNCHANGED), 16) if im_scale != 1.0: im_depth = cv2.resize(im_depth, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_NEAREST) im_depth = im_depth.astype(np.float32) / 1000.0 return im_cuda, im_depth, im_scale, height, width def _get_label_blob(self, roidb, num_classes, im_scale, height, width): """ build the label blob """ meta_data = scipy.io.loadmat(roidb['meta_data']) meta_data['cls_indexes'] = meta_data['cls_indexes'].flatten() classes = np.array(cfg.TRAIN.CLASSES) classes_test = np.array(cfg.TEST.CLASSES).flatten() intrinsic_matrix = np.matrix(meta_data['intrinsic_matrix']) fx = intrinsic_matrix[0, 0] fy = intrinsic_matrix[1, 1] px = intrinsic_matrix[0, 2] py = intrinsic_matrix[1, 2] zfar = 6.0 znear = 0.01 # poses poses = meta_data['poses'] if len(poses.shape) == 2: poses = np.reshape(poses, (3, 4, 1)) if roidb['flipped']: poses = _flip_poses(poses, meta_data['intrinsic_matrix'], width) num = poses.shape[2] # render poses to get the label image cls_indexes = [] poses_all = [] qt = np.zeros((7, ), dtype=np.float32) for i in range(num): RT = poses[:, :, i] qt[:3] = RT[:, 3] qt[3:] = mat2quat(RT[:, :3]) if cfg.MODE == 'TEST': index = np.where(classes_test == meta_data['cls_indexes'][i])[0] cls_indexes.append(index[0]) else: cls_indexes.append(meta_data['cls_indexes'][i] - 1) poses_all.append(qt.copy()) # rendering cfg.renderer.set_poses(poses_all) cfg.renderer.set_light_pos([0, 0, 0]) cfg.renderer.set_light_color([1, 1, 1]) cfg.renderer.set_projection_matrix(width, height, fx, fy, px, py, znear, zfar) image_tensor = torch.cuda.FloatTensor(height, width, 4).detach() seg_tensor = torch.cuda.FloatTensor(height, width, 4).detach() cfg.renderer.render(cls_indexes, image_tensor, seg_tensor) image_tensor = image_tensor.flip(0) seg_tensor = seg_tensor.flip(0) # semantic labels im_label = seg_tensor.cpu().numpy() im_label = im_label[:, :, (2, 1, 0)] * 255 im_label = np.round(im_label).astype(np.uint8) im_label = np.clip(im_label, 0, 255) im_label, im_label_all = self.process_label_image(im_label) centers = np.zeros((num, 2), dtype=np.float32) rcenters = cfg.renderer.get_centers() for i in range(num): centers[i, 0] = rcenters[i][1] * width centers[i, 1] = rcenters[i][0] * height # label blob label_blob = np.zeros((num_classes, height, width), dtype=np.float32) label_blob[0, :, :] = 1.0 for i in range(1, num_classes): I = np.where(im_label_all == classes[i]) if len(I[0]) > 0: label_blob[i, I[0], I[1]] = 1.0 label_blob[0, I[0], I[1]] = 0.0 ''' import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(1, 2, 1) plt.imshow(im_label) for i in range(num): plt.plot(centers[i, 0], centers[i, 1], 'yo') ax = fig.add_subplot(1, 2, 2) plt.imshow(im_label_all) plt.show() #''' # foreground mask seg = torch.from_numpy((im_label != 0).astype(np.float32)) mask = seg.unsqueeze(0).repeat((3, 1, 1)).float().cuda() # gt poses pose_blob = np.zeros((num_classes, 9), dtype=np.float32) gt_boxes = np.zeros((num_classes, 5), dtype=np.float32) count = 0 for i in range(num): cls = int(meta_data['cls_indexes'][i]) ind = np.where(classes == cls)[0] if len(ind) > 0: I = np.where(im_label == ind[0]) if len(I[0]) == 0: continue R = poses[:, :3, i] T = poses[:, 3, i] # compute box x3d = np.ones((4, self._points_all.shape[1]), dtype=np.float32) x3d[0, :] = self._points_all[ind,:,0] x3d[1, :] = self._points_all[ind,:,1] x3d[2, :] = self._points_all[ind,:,2] RT = np.zeros((3, 4), dtype=np.float32) RT[:3, :3] = R RT[:, 3] = T x2d = np.matmul(meta_data['intrinsic_matrix'], np.matmul(RT, x3d)) x2d[0, :] = np.divide(x2d[0, :], x2d[2, :]) x2d[1, :] = np.divide(x2d[1, :], x2d[2, :]) x1 = np.min(x2d[0, :]) * im_scale y1 = np.min(x2d[1, :]) * im_scale x2 = np.max(x2d[0, :]) * im_scale y2 = np.max(x2d[1, :]) * im_scale if x1 > width or y1 > height or x2 < 0 or y2 < 0: continue gt_boxes[count, 0] = x1 gt_boxes[count, 1] = y1 gt_boxes[count, 2] = x2 gt_boxes[count, 3] = y2 gt_boxes[count, 4] = ind # pose pose_blob[count, 0] = 1 pose_blob[count, 1] = ind qt = mat2quat(R) # egocentric to allocentric qt_allocentric = egocentric2allocentric(qt, T) if qt_allocentric[0] < 0: qt_allocentric = -1 * qt_allocentric pose_blob[count, 2:6] = qt_allocentric pose_blob[count, 6:] = T count += 1 # construct the meta data """ format of the meta_data intrinsic matrix: meta_data[0 ~ 8] inverse intrinsic matrix: meta_data[9 ~ 17] """ K = np.matrix(meta_data['intrinsic_matrix']) * im_scale K[2, 2] = 1 Kinv = np.linalg.pinv(K) meta_data_blob = np.zeros(18, dtype=np.float32) meta_data_blob[0:9] = K.flatten() meta_data_blob[9:18] = Kinv.flatten() # vertex regression target if cfg.TRAIN.VERTEX_REG: if roidb['flipped']: centers[:, 0] = width - centers[:, 0] vertex_targets, vertex_weights = self._generate_vertex_targets(im_label_all, meta_data['cls_indexes'], \ centers, poses_all, classes, num_classes) else: vertex_targets = [] vertex_weights = [] return label_blob, mask, meta_data_blob, pose_blob, gt_boxes, vertex_targets, vertex_weights # compute the voting label image in 2D def _generate_vertex_targets(self, im_label, cls_indexes, center, poses, classes, num_classes): width = im_label.shape[1] height = im_label.shape[0] vertex_targets = np.zeros((3 * num_classes, height, width), dtype=np.float32) vertex_weights = np.zeros((3 * num_classes, height, width), dtype=np.float32) c = np.zeros((2, 1), dtype=np.float32) for i in range(1, num_classes): y, x = np.where(im_label == classes[i]) I = np.where(im_label == classes[i]) ind = np.where(cls_indexes == classes[i])[0] if len(x) > 0 and len(ind) > 0: c[0] = center[ind, 0] c[1] = center[ind, 1] z = poses[int(ind)][2] R = np.tile(c, (1, len(x))) - np.vstack((x, y)) # compute the norm N = np.linalg.norm(R, axis=0) + 1e-10 # normalization R = np.divide(R, np.tile(N, (2,1))) # assignment vertex_targets[3*i+0, y, x] = R[0,:] vertex_targets[3*i+1, y, x] = R[1,:] vertex_targets[3*i+2, y, x] = math.log(z) vertex_weights[3*i+0, y, x] = cfg.TRAIN.VERTEX_W_INSIDE vertex_weights[3*i+1, y, x] = cfg.TRAIN.VERTEX_W_INSIDE vertex_weights[3*i+2, y, x] = cfg.TRAIN.VERTEX_W_INSIDE return vertex_targets, vertex_weights def __len__(self): return self._size def _get_default_path(self): """ Return the default path where ycb_self_supervision is expected to be installed. """ return os.path.join(datasets.ROOT_DIR, 'data', 'YCB_Self_Supervision') def _load_image_set_index(self, image_set): """ Load the indexes of images in the data folder """ image_set_file = os.path.join(self._ycb_self_supervision_path, image_set + '.txt') assert os.path.exists(image_set_file), \ 'Path does not exist: {}'.format(image_set_file) subdirs = [] with open(image_set_file) as f: for x in f.readlines(): subdirs.append(x.rstrip('\n')) image_index = [] for i in range(len(subdirs)): subdir = subdirs[i] folder = osp.join(self._data_path, subdir) filename = os.path.join(folder, '*.mat') files = glob.glob(filename) print(subdir, len(files)) for k in range(len(files)): filename = files[k] head, name = os.path.split(filename) index = subdir + '/' + name[:-9] image_index.append(index) print('=======================================================') print('%d image in %s' % (len(image_index), self._data_path)) print('=======================================================') return image_index def _load_object_points(self, classes, extents, symmetry): points = [[] for _ in range(len(classes))] num = np.inf num_classes = len(classes) for i in range(1, num_classes): point_file = os.path.join(self._model_path, classes[i], 'points.xyz') print(point_file) assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file) points[i] = np.loadtxt(point_file) if points[i].shape[0] < num: num = points[i].shape[0] points_all = np.zeros((num_classes, num, 3), dtype=np.float32) for i in range(1, num_classes): points_all[i, :, :] = points[i][:num, :] # rescale the points point_blob = points_all.copy() for i in range(1, num_classes): # compute the rescaling factor for the points weight = 10.0 / np.amax(extents[i, :]) if weight < 10: weight = 10 if symmetry[i] > 0: point_blob[i, :, :] = 4 * weight * point_blob[i, :, :] else: point_blob[i, :, :] = weight * point_blob[i, :, :] return points, points_all, point_blob def _load_object_extents(self): extents = np.zeros((self._num_classes_all, 3), dtype=np.float32) for i in range(1, self._num_classes_all): point_file = os.path.join(self._model_path, self._classes_all[i], 'points.xyz') print(point_file) assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file) points = np.loadtxt(point_file) extents[i, :] = 2 * np.max(np.absolute(points), axis=0) return extents # image def image_path_at(self, i): """ Return the absolute path to image i in the image sequence. """ return self.image_path_from_index(self.image_index[i]) def image_path_from_index(self, index): """ Construct an image path from the image's "index" identifier. """ image_path_jpg = os.path.join(self._data_path, index + '_color.jpg') image_path_png = os.path.join(self._data_path, index + '_color.png') if os.path.exists(image_path_jpg): return image_path_jpg elif os.path.exists(image_path_png): return image_path_png assert os.path.exists(image_path_jpg) or os.path.exists(image_path_png), \ 'Path does not exist: {} or {}'.format(image_path_jpg, image_path_png) # depth def depth_path_at(self, i): """ Return the absolute path to depth i in the image sequence. """ return self.depth_path_from_index(self.image_index[i]) def depth_path_from_index(self, index): """ Construct an depth path from the image's "index" identifier. """ depth_path = os.path.join(self._data_path, index + '_depth' + self._image_ext) assert os.path.exists(depth_path), \ 'Path does not exist: {}'.format(depth_path) return depth_path # camera pose def metadata_path_at(self, i): """ Return the absolute path to metadata i in the image sequence. """ return self.metadata_path_from_index(self.image_index[i]) def metadata_path_from_index(self, index): """ Construct an metadata path from the image's "index" identifier. """ metadata_path = os.path.join(self._data_path, index + '_meta.mat') assert os.path.exists(metadata_path), \ 'Path does not exist: {}'.format(metadata_path) return metadata_path def gt_roidb(self): """ Return the database of ground-truth regions of interest. This function loads/saves from/to a cache file to speed up future calls. """ gt_roidb = [self._load_ycb_self_supervision_annotation(index) for index in self._image_index] return gt_roidb def _load_ycb_self_supervision_annotation(self, index): """ Load class name and meta data """ # image path image_path = self.image_path_from_index(index) # depth path depth_path = self.depth_path_from_index(index) # metadata path metadata_path = self.metadata_path_from_index(index) return {'image': image_path, 'depth': depth_path, 'meta_data': metadata_path, 'flipped': False} def labels_to_image(self, labels): height = labels.shape[0] width = labels.shape[1] im_label = np.zeros((height, width, 3), dtype=np.uint8) for i in range(self.num_classes): I = np.where(labels == i) im_label[I[0], I[1], :] = self._class_colors[i] return im_label def process_label_image(self, label_image): """ change label image to label index """ height = label_image.shape[0] width = label_image.shape[1] labels = np.zeros((height, width), dtype=np.int32) labels_all = np.zeros((height, width), dtype=np.int32) # label image is in BGR order index = label_image[:,:,2] + 256*label_image[:,:,1] + 256*256*label_image[:,:,0] for i in range(1, len(self._class_colors_all)): color = self._class_colors_all[i] ind = color[0] + 256*color[1] + 256*256*color[2] I = np.where(index == ind) labels_all[I[0], I[1]] = i ind = np.where(np.array(cfg.TRAIN.CLASSES) == i)[0] if len(ind) > 0: labels[I[0], I[1]] = ind return labels, labels_all def render_gt_pose(self, meta_data): width = self._width height = self._height meta_data['cls_indexes'] = meta_data['cls_indexes'].flatten() classes = np.array(cfg.TRAIN.CLASSES) classes_test = np.array(cfg.TEST.CLASSES).flatten() intrinsic_matrix = np.matrix(meta_data['intrinsic_matrix']) fx = intrinsic_matrix[0, 0] fy = intrinsic_matrix[1, 1] px = intrinsic_matrix[0, 2] py = intrinsic_matrix[1, 2] zfar = 6.0 znear = 0.01 # poses poses = meta_data['poses'] if len(poses.shape) == 2: poses = np.reshape(poses, (3, 4, 1)) num = poses.shape[2] # render poses to get the label image cls_indexes = [] poses_all = [] qt = np.zeros((7, ), dtype=np.float32) for i in range(num): RT = poses[:, :, i] qt[:3] = RT[:, 3] qt[3:] = mat2quat(RT[:, :3]) if cfg.MODE == 'TEST': index = np.where(classes_test == meta_data['cls_indexes'][i])[0] cls_indexes.append(index[0]) else: cls_indexes.append(meta_data['cls_indexes'][i] - 1) poses_all.append(qt.copy()) # rendering cfg.renderer.set_poses(poses_all) cfg.renderer.set_light_pos([0, 0, 0]) cfg.renderer.set_light_color([1, 1, 1]) cfg.renderer.set_projection_matrix(width, height, fx, fy, px, py, znear, zfar) image_tensor = torch.cuda.FloatTensor(height, width, 4).detach() seg_tensor = torch.cuda.FloatTensor(height, width, 4).detach() cfg.renderer.render(cls_indexes, image_tensor, seg_tensor) image_tensor = image_tensor.flip(0) seg_tensor = seg_tensor.flip(0) # semantic labels im_label = seg_tensor.cpu().numpy() im_label = im_label[:, :, (2, 1, 0)] * 255 im_label = np.round(im_label).astype(np.uint8) im_label = np.clip(im_label, 0, 255) im_label, im_label_all = self.process_label_image(im_label) # foreground mask seg = torch.from_numpy((im_label != 0).astype(np.float32)) mask = seg.unsqueeze(0).repeat((3, 1, 1)).float().cuda() # gt boxes gt_boxes = np.zeros((self._num_classes, 5), dtype=np.float32) count = 0 selected = [] for i in range(num): cls = int(meta_data['cls_indexes'][i]) ind = np.where(classes == cls)[0] if len(ind) > 0: R = poses[:, :3, i] T = poses[:, 3, i] # compute box x3d = np.ones((4, self._points_all.shape[1]), dtype=np.float32) x3d[0, :] = self._points_all[ind,:,0] x3d[1, :] = self._points_all[ind,:,1] x3d[2, :] = self._points_all[ind,:,2] RT = np.zeros((3, 4), dtype=np.float32) RT[:3, :3] = R RT[:, 3] = T x2d = np.matmul(meta_data['intrinsic_matrix'], np.matmul(RT, x3d)) x2d[0, :] = np.divide(x2d[0, :], x2d[2, :]) x2d[1, :] = np.divide(x2d[1, :], x2d[2, :]) x1 = np.min(x2d[0, :]) y1 = np.min(x2d[1, :]) x2 = np.max(x2d[0, :]) y2 = np.max(x2d[1, :]) if x1 > width or y1 > height or x2 < 0 or y2 < 0: continue gt_boxes[count, 0] = x1 gt_boxes[count, 1] = y1 gt_boxes[count, 2] = x2 gt_boxes[count, 3] = y2 selected.append(i) count += 1 meta_data['cls_indexes'] = meta_data['cls_indexes'][selected] meta_data['poses'] = poses[:, :, selected] meta_data['im_label'] = im_label meta_data['box'] = gt_boxes[:count, :4] return meta_data def evaluation(self, output_dir): filename = os.path.join(output_dir, 'results_posecnn.mat') if os.path.exists(filename): results_all = scipy.io.loadmat(filename) print('load results from file') print(filename) distances_sys = results_all['distances_sys'] distances_non = results_all['distances_non'] errors_rotation = results_all['errors_rotation'] errors_translation = results_all['errors_translation'] results_frame_id = results_all['results_frame_id'].flatten() results_object_id = results_all['results_object_id'].flatten() results_cls_id = results_all['results_cls_id'].flatten() segmentation_precision = results_all['segmentation_precision'] segmentation_recall = results_all['segmentation_recall'] segmentation_f1 = results_all['segmentation_f1'] segmentation_count = results_all['segmentation_count'] else: # save results num_max = 100000 num_results = 2 distances_sys = np.zeros((num_max, num_results), dtype=np.float32) distances_non = np.zeros((num_max, num_results), dtype=np.float32) errors_rotation = np.zeros((num_max, num_results), dtype=np.float32) errors_translation = np.zeros((num_max, num_results), dtype=np.float32) results_frame_id = np.zeros((num_max, ), dtype=np.float32) results_object_id = np.zeros((num_max, ), dtype=np.float32) results_cls_id = np.zeros((num_max, ), dtype=np.float32) segmentation_precision = np.zeros((num_max, self._num_classes), dtype=np.float32) segmentation_recall = np.zeros((num_max, self._num_classes), dtype=np.float32) segmentation_f1 = np.zeros((num_max, self._num_classes), dtype=np.float32) segmentation_count = np.zeros((num_max, self._num_classes), dtype=np.float32) # for each image count = -1 count_file = -1 filename = os.path.join(output_dir, '*.mat') files = glob.glob(filename) for i in range(len(files)): # load result filename = files[i] print(filename) result_posecnn = scipy.io.loadmat(filename) # load gt poses filename = result_posecnn['meta_data_path'][0] print(filename) gt = scipy.io.loadmat(filename) # render gt poses gt = self.render_gt_pose(gt) # compute segmentation metrics metrics_dict = multilabel_metrics(result_posecnn['labels'].astype(np.int32), gt['im_label'].astype(np.int32), self._num_classes) count_file += 1 segmentation_precision[count_file, :] = metrics_dict['Precision'] segmentation_recall[count_file, :] = metrics_dict['Recall'] segmentation_f1[count_file, :] = metrics_dict['F-measure'] segmentation_count[count_file, :] = metrics_dict['Count'] ''' import matplotlib.pyplot as plt fig = plt.figure() im_file = filename.replace('_meta.mat', '_color.png') im = cv2.imread(im_file) ax = fig.add_subplot(2, 2, 1) plt.imshow(im[:, :, (2, 1, 0)]) for i in range(gt['box'].shape[0]): x1 = gt['box'][i, 0] y1 = gt['box'][i, 1] x2 = gt['box'][i, 2] y2 = gt['box'][i, 3] plt.gca().add_patch(plt.Rectangle((x1, y1), x2-x1, y2-y1, fill=False, edgecolor='g', linewidth=3)) ax = fig.add_subplot(2, 2, 2) plt.imshow(gt['im_label']) ax = fig.add_subplot(2, 2, 3) plt.imshow(result_posecnn['labels'].astype(np.int32)) plt.show() #''' # for each gt poses cls_indexes = gt['cls_indexes'].flatten() for j in range(len(cls_indexes)): count += 1 cls_index = cls_indexes[j] RT_gt = gt['poses'][:, :, j] results_frame_id[count] = i results_object_id[count] = j results_cls_id[count] = cls_index # network result result = result_posecnn roi_index = [] if len(result['rois']) > 0: for k in range(result['rois'].shape[0]): ind = int(result['rois'][k, 1]) cls = cfg.TRAIN.CLASSES[ind] if cls == cls_index: roi_index.append(k) # select the roi if len(roi_index) > 1: # overlaps: (rois x gt_boxes) roi_blob = result['rois'][roi_index, :] roi_blob = roi_blob[:, (0, 2, 3, 4, 5, 1)] gt_box_blob = np.zeros((1, 5), dtype=np.float32) gt_box_blob[0, 1:] = gt['box'][j, :] overlaps = bbox_overlaps( np.ascontiguousarray(roi_blob[:, :5], dtype=np.float), np.ascontiguousarray(gt_box_blob, dtype=np.float)).flatten() assignment = overlaps.argmax() roi_index = [roi_index[assignment]] if len(roi_index) > 0: RT = np.zeros((3, 4), dtype=np.float32) ind = int(result['rois'][roi_index, 1]) if ind == -1: points = self._points_clamp else: points = self._points[ind] # pose from network RT[:3, :3] = quat2mat(result['poses'][roi_index, :4].flatten()) RT[:, 3] = result['poses'][roi_index, 4:] distances_sys[count, 0] = adi(RT[:3, :3], RT[:, 3], RT_gt[:3, :3], RT_gt[:, 3], points) distances_non[count, 0] = add(RT[:3, :3], RT[:, 3], RT_gt[:3, :3], RT_gt[:, 3], points) errors_rotation[count, 0] = re(RT[:3, :3], RT_gt[:3, :3]) errors_translation[count, 0] = te(RT[:, 3], RT_gt[:, 3]) # pose after depth refinement if cfg.TEST.POSE_REFINE: RT[:3, :3] = quat2mat(result['poses_refined'][roi_index, :4].flatten()) RT[:, 3] = result['poses_refined'][roi_index, 4:] distances_sys[count, 1] = adi(RT[:3, :3], RT[:, 3], RT_gt[:3, :3], RT_gt[:, 3], points) distances_non[count, 1] = add(RT[:3, :3], RT[:, 3], RT_gt[:3, :3], RT_gt[:, 3], points) errors_rotation[count, 1] = re(RT[:3, :3], RT_gt[:3, :3]) errors_translation[count, 1] = te(RT[:, 3], RT_gt[:, 3]) else: distances_sys[count, 1] = np.inf distances_non[count, 1] = np.inf errors_rotation[count, 1] = np.inf errors_translation[count, 1] = np.inf else: distances_sys[count, :] = np.inf distances_non[count, :] = np.inf errors_rotation[count, :] = np.inf errors_translation[count, :] = np.inf distances_sys = distances_sys[:count+1, :] distances_non = distances_non[:count+1, :] errors_rotation = errors_rotation[:count+1, :] errors_translation = errors_translation[:count+1, :] results_frame_id = results_frame_id[:count+1] results_object_id = results_object_id[:count+1] results_cls_id = results_cls_id[:count+1] segmentation_precision = segmentation_precision[:count_file+1, :] segmentation_recall = segmentation_recall[:count_file+1, :] segmentation_f1 = segmentation_f1[:count_file+1, :] segmentation_count = segmentation_count[:count_file+1, :] results_all = {'distances_sys': distances_sys, 'distances_non': distances_non, 'errors_rotation': errors_rotation, 'errors_translation': errors_translation, 'results_frame_id': results_frame_id, 'results_object_id': results_object_id, 'results_cls_id': results_cls_id, 'segmentation_precision': segmentation_precision, 'segmentation_recall': segmentation_recall, 'segmentation_f1': segmentation_f1, 'segmentation_count': segmentation_count} filename = os.path.join(output_dir, 'results_posecnn.mat') scipy.io.savemat(filename, results_all) # for each class import matplotlib.pyplot as plt max_distance = 0.1 index_plot = [0, 1] color = ['r', 'b'] leng = ['PoseCNN', 'refined'] num = len(leng) ADD = np.zeros((self._num_classes_all, num), dtype=np.float32) ADDS = np.zeros((self._num_classes_all, num), dtype=np.float32) TS = np.zeros((self._num_classes_all, num), dtype=np.float32) classes = list(copy.copy(self._classes_all)) classes[0] = 'all' for k in range(self._num_classes_all): fig = plt.figure() if k == 0: index = range(len(results_cls_id)) else: index = np.where(results_cls_id == k)[0] if len(index) == 0: continue print('%s: %d objects' % (classes[k], len(index))) # distance symmetry ax = fig.add_subplot(2, 3, 1) lengs = [] for i in index_plot: D = distances_sys[index, i] ind = np.where(D > max_distance)[0] D[ind] = np.inf d = np.sort(D) n = len(d) accuracy = np.cumsum(np.ones((n, ), np.float32)) / n plt.plot(d, accuracy, color[i], linewidth=2) ADDS[k, i] = VOCap(d, accuracy) lengs.append('%s (%.2f)' % (leng[i], ADDS[k, i] * 100)) print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D)))) ax.legend(lengs) plt.xlabel('Average distance threshold in meter (symmetry)') plt.ylabel('accuracy') ax.set_title(classes[k]) # distance non-symmetry ax = fig.add_subplot(2, 3, 2) lengs = [] for i in index_plot: D = distances_non[index, i] ind = np.where(D > max_distance)[0] D[ind] = np.inf d = np.sort(D) n = len(d) accuracy = np.cumsum(np.ones((n, ), np.float32)) / n plt.plot(d, accuracy, color[i], linewidth=2) ADD[k, i] = VOCap(d, accuracy) lengs.append('%s (%.2f)' % (leng[i], ADD[k, i] * 100)) print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D)))) ax.legend(lengs) plt.xlabel('Average distance threshold in meter (non-symmetry)') plt.ylabel('accuracy') ax.set_title(classes[k]) # translation ax = fig.add_subplot(2, 3, 3) lengs = [] for i in index_plot: D = errors_translation[index, i] ind = np.where(D > max_distance)[0] D[ind] = np.inf d = np.sort(D) n = len(d) accuracy = np.cumsum(np.ones((n, ), np.float32)) / n plt.plot(d, accuracy, color[i], linewidth=2) TS[k, i] = VOCap(d, accuracy) lengs.append('%s (%.2f)' % (leng[i], TS[k, i] * 100)) print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D)))) ax.legend(lengs) plt.xlabel('Translation threshold in meter') plt.ylabel('accuracy') ax.set_title(classes[k]) # rotation histogram count = 4 for i in index_plot: ax = fig.add_subplot(2, 3, count) D = errors_rotation[index, i] ind = np.where(np.isfinite(D))[0] D = D[ind] ax.hist(D, bins=range(0, 190, 10), range=(0, 180)) plt.xlabel('Rotation angle error') plt.ylabel('count') ax.set_title(leng[i]) count += 1 # mng = plt.get_current_fig_manager() # mng.full_screen_toggle() filename = output_dir + '/' + classes[k] + '.png' plt.savefig(filename) # plt.show() # print ADD print('==================ADD======================') for k in range(len(classes)): print('%s: %f' % (classes[k], ADD[k, 0])) for k in range(len(classes)-1): print('%f' % (ADD[k+1, 0])) print('%f' % (ADD[0, 0])) print(cfg.TRAIN.SNAPSHOT_INFIX) print('===========================================') # print ADD-S print('==================ADD-S====================') for k in range(len(classes)): print('%s: %f' % (classes[k], ADDS[k, 0])) for k in range(len(classes)-1): print('%f' % (ADDS[k+1, 0])) print('%f' % (ADDS[0, 0])) print(cfg.TRAIN.SNAPSHOT_INFIX) print('===========================================') # print ADD print('==================ADD refined======================') for k in range(len(classes)): print('%s: %f' % (classes[k], ADD[k, 1])) for k in range(len(classes)-1): print('%f' % (ADD[k+1, 1])) print('%f' % (ADD[0, 1])) print(cfg.TRAIN.SNAPSHOT_INFIX) print('===========================================') # print ADD-S print('==================ADD-S refined====================') for k in range(len(classes)): print('%s: %f' % (classes[k], ADDS[k, 1])) for k in range(len(classes)-1): print('%f' % (ADDS[k+1, 1])) print('%f' % (ADDS[0, 1])) print(cfg.TRAIN.SNAPSHOT_INFIX) print('===========================================') # print segmentation precision print('==================segmentation precision====================') for i in range(self._num_classes): count = np.sum(segmentation_count[:, i]) if count > 0: precision = np.sum(segmentation_precision[:, i]) / count else: precision = 0 print('%s: %d objects, %f' % (self._classes[i], count, precision)) for i in range(self._num_classes): count = np.sum(segmentation_count[:, i]) if count > 0: precision = np.sum(segmentation_precision[:, i]) / count else: precision = 0 print('%f' % (precision)) print('===========================================') # print segmentation recall print('==================segmentation recall====================') for i in range(self._num_classes): count = np.sum(segmentation_count[:, i]) if count > 0: recall = np.sum(segmentation_recall[:, i]) / count else: recall = 0 print('%s: %d objects, %f' % (self._classes[i], count, recall)) for i in range(self._num_classes): count = np.sum(segmentation_count[:, i]) if count > 0: recall = np.sum(segmentation_recall[:, i]) / count else: recall = 0 print('%f' % (recall)) print('===========================================') # print segmentation f1 print('==================segmentation f1====================') for i in range(self._num_classes): count = np.sum(segmentation_count[:, i]) if count > 0: f1 = np.sum(segmentation_f1[:, i]) / count else: f1 = 0 print('%s: %d objects, %f' % (self._classes[i], count, f1)) for i in range(self._num_classes): count = np.sum(segmentation_count[:, i]) if count > 0: f1 = np.sum(segmentation_f1[:, i]) / count else: f1 = 0 print('%f' % (f1)) print('===========================================') ================================================ FILE: lib/datasets/ycb_video.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import torch import torch.utils.data as data import os, math import sys import os.path as osp from os.path import * import numpy as np import numpy.random as npr import cv2 import scipy.io import copy import glob try: import cPickle # Use cPickle on Python 2.7 except ImportError: import pickle as cPickle import datasets from fcn.config import cfg from utils.blob import pad_im, chromatic_transform, add_noise, add_noise_cuda from transforms3d.quaternions import mat2quat, quat2mat from utils.se3 import * from utils.pose_error import * from utils.cython_bbox import bbox_overlaps class YCBVideo(data.Dataset, datasets.imdb): def __init__(self, image_set, ycb_video_path = None): self._name = 'ycb_video_' + image_set self._image_set = image_set self._ycb_video_path = self._get_default_path() if ycb_video_path is None \ else ycb_video_path path = os.path.join(self._ycb_video_path, 'data') if not os.path.exists(path): path = os.path.join(self._ycb_video_path, 'YCB_Video_Dataset/YCB_Video_Dataset/YCB_Video_Dataset/data') self._data_path = path self._model_path = os.path.join(datasets.ROOT_DIR, 'data', 'models') # define all the classes self._classes_all = ('__background__', '002_master_chef_can', '003_cracker_box', '004_sugar_box', '005_tomato_soup_can', '006_mustard_bottle', \ '007_tuna_fish_can', '008_pudding_box', '009_gelatin_box', '010_potted_meat_can', '011_banana', '019_pitcher_base', \ '021_bleach_cleanser', '024_bowl', '025_mug', '035_power_drill', '036_wood_block', '037_scissors', '040_large_marker', \ '051_large_clamp', '052_extra_large_clamp', '061_foam_brick') self._num_classes_all = len(self._classes_all) 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), \ (128, 0, 0), (0, 128, 0), (0, 0, 128), (128, 128, 0), (128, 0, 128), (0, 128, 128), \ (64, 0, 0), (0, 64, 0), (0, 0, 64), (64, 64, 0), (64, 0, 64), (0, 64, 64), (192, 0, 0), (0, 192, 0), (0, 0, 192)] 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) self._extents_all = self._load_object_extents() self._width = 640 self._height = 480 self._intrinsic_matrix = np.array([[1.066778e+03, 0.000000e+00, 3.129869e+02], [0.000000e+00, 1.067487e+03, 2.413109e+02], [0.000000e+00, 0.000000e+00, 1.000000e+00]]) # select a subset of classes self._classes = [self._classes_all[i] for i in cfg.TRAIN.CLASSES] self._classes_test = [self._classes_all[i] for i in cfg.TEST.CLASSES] self._num_classes = len(self._classes) self._class_colors = [self._class_colors_all[i] for i in cfg.TRAIN.CLASSES] self._symmetry = self._symmetry_all[cfg.TRAIN.CLASSES] self._symmetry_test = self._symmetry_all[cfg.TEST.CLASSES] self._extents = self._extents_all[cfg.TRAIN.CLASSES] self._extents_test = self._extents_all[cfg.TEST.CLASSES] self._pixel_mean = cfg.PIXEL_MEANS / 255.0 # train classes self._points, self._points_all, self._point_blob = \ self._load_object_points(self._classes, self._extents, self._symmetry) # test classes self._points_test, self._points_all_test, self._point_blob_test = \ self._load_object_points(self._classes_test, self._extents_test, self._symmetry_test) # 3D model paths self.model_mesh_paths = ['{}/{}/textured_simple.obj'.format(self._model_path, cls) for cls in self._classes_all[1:]] self.model_sdf_paths = ['{}/{}/textured_simple_low_res.pth'.format(self._model_path, cls) for cls in self._classes_all[1:]] self.model_texture_paths = ['{}/{}/texture_map.png'.format(self._model_path, cls) for cls in self._classes_all[1:]] self.model_colors = [np.array(self._class_colors_all[i]) / 255.0 for i in range(1, len(self._classes_all))] self.model_mesh_paths_target = ['{}/{}/textured_simple.obj'.format(self._model_path, cls) for cls in self._classes[1:]] self.model_sdf_paths_target = ['{}/{}/textured_simple.sdf'.format(self._model_path, cls) for cls in self._classes[1:]] self.model_texture_paths_target = ['{}/{}/texture_map.png'.format(self._model_path, cls) for cls in self._classes[1:]] self.model_colors_target = [np.array(self._class_colors_all[i]) / 255.0 for i in cfg.TRAIN.CLASSES[1:]] self._class_to_ind = dict(zip(self._classes, range(self._num_classes))) self._image_index = self._load_image_set_index(image_set) self._size = len(self._image_index) if self._size > cfg.TRAIN.MAX_ITERS_PER_EPOCH * cfg.TRAIN.IMS_PER_BATCH: self._size = cfg.TRAIN.MAX_ITERS_PER_EPOCH * cfg.TRAIN.IMS_PER_BATCH self._roidb = self.gt_roidb() assert os.path.exists(self._ycb_video_path), \ 'ycb_video path does not exist: {}'.format(self._ycb_video_path) assert os.path.exists(self._data_path), \ 'Data path does not exist: {}'.format(self._data_path) def __getitem__(self, index): is_syn = 0 roidb = self._roidb[index] # Get the input image blob random_scale_ind = npr.randint(0, high=len(cfg.TRAIN.SCALES_BASE)) im_blob, im_depth, im_scale, height, width = self._get_image_blob(roidb, random_scale_ind) # build the label blob label_blob, mask, meta_data_blob, pose_blob, gt_boxes, vertex_targets, vertex_weights \ = self._get_label_blob(roidb, self._num_classes, im_scale, height, width) is_syn = roidb['is_syn'] im_info = np.array([im_blob.shape[1], im_blob.shape[2], im_scale, is_syn], dtype=np.float32) sample = {'image_color': im_blob, 'im_depth': im_depth, 'label': label_blob, 'mask': mask, 'meta_data': meta_data_blob, 'poses': pose_blob, 'extents': self._extents, 'points': self._point_blob, 'symmetry': self._symmetry, 'gt_boxes': gt_boxes, 'im_info': im_info, 'video_id': roidb['video_id'], 'image_id': roidb['image_id']} if cfg.TRAIN.VERTEX_REG: sample['vertex_targets'] = vertex_targets sample['vertex_weights'] = vertex_weights return sample def _get_image_blob(self, roidb, scale_ind): # rgba rgba = pad_im(cv2.imread(roidb['image'], cv2.IMREAD_UNCHANGED), 16) if rgba.shape[2] == 4: im = np.copy(rgba[:,:,:3]) alpha = rgba[:,:,3] I = np.where(alpha == 0) im[I[0], I[1], :] = 0 else: im = rgba im_scale = cfg.TRAIN.SCALES_BASE[scale_ind] if im_scale != 1.0: im = cv2.resize(im, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_LINEAR) height = im.shape[0] width = im.shape[1] if roidb['flipped']: im = im[:, ::-1, :] # chromatic transform if cfg.TRAIN.CHROMATIC and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1: im = chromatic_transform(im) if cfg.TRAIN.ADD_NOISE and cfg.MODE == 'TRAIN' and np.random.rand(1) > 0.1: im = add_noise(im) im_tensor = torch.from_numpy(im) / 255.0 im_tensor -= self._pixel_mean image_blob = im_tensor.permute(2, 0, 1).float() # depth image im_depth = pad_im(cv2.imread(roidb['depth'], cv2.IMREAD_UNCHANGED), 16) if im_scale != 1.0: im_depth = cv2.resize(im_depth, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_NEAREST) im_depth = im_depth.astype('float') / 10000.0 return image_blob, im_depth, im_scale, height, width def _get_label_blob(self, roidb, num_classes, im_scale, height, width): """ build the label blob """ meta_data = scipy.io.loadmat(roidb['meta_data']) meta_data['cls_indexes'] = meta_data['cls_indexes'].flatten() classes = np.array(cfg.TRAIN.CLASSES) # read label image im_label = pad_im(cv2.imread(roidb['label'], cv2.IMREAD_UNCHANGED), 16) if roidb['flipped']: if len(im_label.shape) == 2: im_label = im_label[:, ::-1] else: im_label = im_label[:, ::-1, :] if im_scale != 1.0: im_label = cv2.resize(im_label, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_NEAREST) label_blob = np.zeros((num_classes, height, width), dtype=np.float32) label_blob[0, :, :] = 1.0 for i in range(1, num_classes): I = np.where(im_label == classes[i]) if len(I[0]) > 0: label_blob[i, I[0], I[1]] = 1.0 label_blob[0, I[0], I[1]] = 0.0 # foreground mask seg = torch.from_numpy((im_label != 0).astype(np.float32)) mask = seg.unsqueeze(0).repeat((3, 1, 1)).float() # poses poses = meta_data['poses'] if len(poses.shape) == 2: poses = np.reshape(poses, (3, 4, 1)) if roidb['flipped']: poses = _flip_poses(poses, meta_data['intrinsic_matrix'], width) num = poses.shape[2] pose_blob = np.zeros((num_classes, 9), dtype=np.float32) gt_boxes = np.zeros((num_classes, 5), dtype=np.float32) count = 0 for i in range(num): cls = int(meta_data['cls_indexes'][i]) ind = np.where(classes == cls)[0] if len(ind) > 0: R = poses[:, :3, i] T = poses[:, 3, i] pose_blob[count, 0] = 1 pose_blob[count, 1] = ind qt = mat2quat(R) # egocentric to allocentric qt_allocentric = egocentric2allocentric(qt, T) if qt_allocentric[0] < 0: qt_allocentric = -1 * qt_allocentric pose_blob[count, 2:6] = qt_allocentric pose_blob[count, 6:] = T # compute box x3d = np.ones((4, self._points_all.shape[1]), dtype=np.float32) x3d[0, :] = self._points_all[ind,:,0] x3d[1, :] = self._points_all[ind,:,1] x3d[2, :] = self._points_all[ind,:,2] RT = np.zeros((3, 4), dtype=np.float32) RT[:3, :3] = quat2mat(qt) RT[:, 3] = T x2d = np.matmul(meta_data['intrinsic_matrix'], np.matmul(RT, x3d)) x2d[0, :] = np.divide(x2d[0, :], x2d[2, :]) x2d[1, :] = np.divide(x2d[1, :], x2d[2, :]) gt_boxes[count, 0] = np.min(x2d[0, :]) * im_scale gt_boxes[count, 1] = np.min(x2d[1, :]) * im_scale gt_boxes[count, 2] = np.max(x2d[0, :]) * im_scale gt_boxes[count, 3] = np.max(x2d[1, :]) * im_scale gt_boxes[count, 4] = ind count += 1 # construct the meta data """ format of the meta_data intrinsic matrix: meta_data[0 ~ 8] inverse intrinsic matrix: meta_data[9 ~ 17] """ K = np.matrix(meta_data['intrinsic_matrix']) * im_scale K[2, 2] = 1 Kinv = np.linalg.pinv(K) meta_data_blob = np.zeros(18, dtype=np.float32) meta_data_blob[0:9] = K.flatten() meta_data_blob[9:18] = Kinv.flatten() # vertex regression target if cfg.TRAIN.VERTEX_REG: center = meta_data['center'] if roidb['flipped']: center[:, 0] = width - center[:, 0] vertex_targets, vertex_weights = self._generate_vertex_targets(im_label, meta_data['cls_indexes'], center, poses, classes, num_classes) else: vertex_targets = [] vertex_weights = [] return label_blob, mask, meta_data_blob, pose_blob, gt_boxes, vertex_targets, vertex_weights # compute the voting label image in 2D def _generate_vertex_targets(self, im_label, cls_indexes, center, poses, classes, num_classes): width = im_label.shape[1] height = im_label.shape[0] vertex_targets = np.zeros((3 * num_classes, height, width), dtype=np.float32) vertex_weights = np.zeros((3 * num_classes, height, width), dtype=np.float32) c = np.zeros((2, 1), dtype=np.float32) for i in range(1, num_classes): y, x = np.where(im_label == classes[i]) I = np.where(im_label == classes[i]) ind = np.where(cls_indexes == classes[i])[0] if len(x) > 0 and len(ind) > 0: c[0] = center[ind, 0] c[1] = center[ind, 1] if isinstance(poses, list): z = poses[int(ind)][2] else: if len(poses.shape) == 3: z = poses[2, 3, ind] else: z = poses[ind, -1] R = np.tile(c, (1, len(x))) - np.vstack((x, y)) # compute the norm N = np.linalg.norm(R, axis=0) + 1e-10 # normalization R = np.divide(R, np.tile(N, (2,1))) # assignment vertex_targets[3*i+0, y, x] = R[0,:] vertex_targets[3*i+1, y, x] = R[1,:] vertex_targets[3*i+2, y, x] = math.log(z) vertex_weights[3*i+0, y, x] = cfg.TRAIN.VERTEX_W_INSIDE vertex_weights[3*i+1, y, x] = cfg.TRAIN.VERTEX_W_INSIDE vertex_weights[3*i+2, y, x] = cfg.TRAIN.VERTEX_W_INSIDE return vertex_targets, vertex_weights def __len__(self): return self._size def _get_default_path(self): """ Return the default path where YCB_Video is expected to be installed. """ return os.path.join(datasets.ROOT_DIR, 'data', 'YCB_Video') def _load_image_set_index(self, image_set): """ Load the indexes listed in this dataset's image set file. """ image_set_file = os.path.join(self._ycb_video_path, image_set + '.txt') assert os.path.exists(image_set_file), \ 'Path does not exist: {}'.format(image_set_file) image_index = [] video_ids_selected = set([]) video_ids_not = set([]) count = np.zeros((self.num_classes, ), dtype=np.int32) with open(image_set_file) as f: for x in f.readlines(): index = x.rstrip('\n') pos = index.find('/') video_id = index[:pos] if not video_id in video_ids_selected and not video_id in video_ids_not: filename = os.path.join(self._data_path, video_id, '000001-meta.mat') meta_data = scipy.io.loadmat(filename) cls_indexes = meta_data['cls_indexes'].flatten() flag = 0 for i in range(len(cls_indexes)): cls_index = int(cls_indexes[i]) ind = np.where(np.array(cfg.TRAIN.CLASSES) == cls_index)[0] if len(ind) > 0: count[ind] += 1 flag = 1 if flag: video_ids_selected.add(video_id) else: video_ids_not.add(video_id) if video_id in video_ids_selected: image_index.append(index) for i in range(1, self.num_classes): print('%d %s [%d/%d]' % (i, self.classes[i], count[i], len(list(video_ids_selected)))) # sample a subset for training if image_set == 'train': image_index = image_index[::5] # add synthetic data filename = os.path.join(self._data_path + '_syn', '*.mat') files = glob.glob(filename) print('adding synthetic %d data' % (len(files))) for i in range(len(files)): filename = files[i].replace(self._data_path, '../data')[:-9] image_index.append(filename) return image_index def _load_object_points(self, classes, extents, symmetry): points = [[] for _ in range(len(classes))] num = np.inf num_classes = len(classes) for i in range(1, num_classes): point_file = os.path.join(self._model_path, classes[i], 'points.xyz') print(point_file) assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file) points[i] = np.loadtxt(point_file) if points[i].shape[0] < num: num = points[i].shape[0] points_all = np.zeros((num_classes, num, 3), dtype=np.float32) for i in range(1, num_classes): points_all[i, :, :] = points[i][:num, :] # rescale the points point_blob = points_all.copy() for i in range(1, num_classes): # compute the rescaling factor for the points weight = 10.0 / np.amax(extents[i, :]) if weight < 10: weight = 10 if symmetry[i] > 0: point_blob[i, :, :] = 4 * weight * point_blob[i, :, :] else: point_blob[i, :, :] = weight * point_blob[i, :, :] return points, points_all, point_blob def _load_object_extents(self): extents = np.zeros((self._num_classes_all, 3), dtype=np.float32) for i in range(1, self._num_classes_all): point_file = os.path.join(self._model_path, self._classes_all[i], 'points.xyz') print(point_file) assert os.path.exists(point_file), 'Path does not exist: {}'.format(point_file) points = np.loadtxt(point_file) extents[i, :] = 2 * np.max(np.absolute(points), axis=0) return extents # image def image_path_at(self, i): """ Return the absolute path to image i in the image sequence. """ return self.image_path_from_index(self.image_index[i]) def image_path_from_index(self, index): """ Construct an image path from the image's "index" identifier. """ image_path = os.path.join(self._data_path, index + '-color.jpg') if not os.path.exists(image_path): image_path = os.path.join(self._data_path, index + '-color.png') assert os.path.exists(image_path), \ 'Path does not exist: {}'.format(image_path) return image_path # depth def depth_path_at(self, i): """ Return the absolute path to depth i in the image sequence. """ return self.depth_path_from_index(self.image_index[i]) def depth_path_from_index(self, index): """ Construct an depth path from the image's "index" identifier. """ depth_path = os.path.join(self._data_path, index + '-depth.png') assert os.path.exists(depth_path), \ 'Path does not exist: {}'.format(depth_path) return depth_path # label def label_path_at(self, i): """ Return the absolute path to metadata i in the image sequence. """ return self.label_path_from_index(self.image_index[i]) def label_path_from_index(self, index): """ Construct an metadata path from the image's "index" identifier. """ label_path = os.path.join(self._data_path, index + '-label.png') assert os.path.exists(label_path), \ 'Path does not exist: {}'.format(label_path) return label_path # camera pose def metadata_path_at(self, i): """ Return the absolute path to metadata i in the image sequence. """ return self.metadata_path_from_index(self.image_index[i]) def metadata_path_from_index(self, index): """ Construct an metadata path from the image's "index" identifier. """ metadata_path = os.path.join(self._data_path, index + '-meta.mat') assert os.path.exists(metadata_path), \ 'Path does not exist: {}'.format(metadata_path) return metadata_path def gt_roidb(self): """ Return the database of ground-truth regions of interest. This function loads/saves from/to a cache file to speed up future calls. """ prefix = '_class' for i in range(len(cfg.TRAIN.CLASSES)): prefix += '_%d' % cfg.TRAIN.CLASSES[i] cache_file = os.path.join(self.cache_path, self.name + prefix + '_gt_roidb.pkl') if os.path.exists(cache_file): with open(cache_file, 'rb') as fid: roidb = cPickle.load(fid) print('{} gt roidb loaded from {}'.format(self.name, cache_file)) return roidb print('loading gt...') gt_roidb = [self._load_ycb_video_annotation(index) for index in self._image_index] with open(cache_file, 'wb') as fid: cPickle.dump(gt_roidb, fid, cPickle.HIGHEST_PROTOCOL) print('wrote gt roidb to {}'.format(cache_file)) return gt_roidb def _load_ycb_video_annotation(self, index): """ Load class name and meta data """ # image path image_path = self.image_path_from_index(index) # depth path depth_path = self.depth_path_from_index(index) # label path label_path = self.label_path_from_index(index) # metadata path metadata_path = self.metadata_path_from_index(index) # is synthetic image or not if 'data_syn' in image_path: is_syn = 1 video_id = '' image_id = '' else: is_syn = 0 # parse image name pos = index.find('/') video_id = index[:pos] image_id = index[pos+1:] return {'image': image_path, 'depth': depth_path, 'label': label_path, 'meta_data': metadata_path, 'video_id': video_id, 'image_id': image_id, 'is_syn': is_syn, 'flipped': False} def labels_to_image(self, labels): height = labels.shape[0] width = labels.shape[1] im_label = np.zeros((height, width, 3), dtype=np.uint8) for i in range(self.num_classes): I = np.where(labels == i) im_label[I[0], I[1], :] = self._class_colors[i] return im_label def process_label_image(self, label_image): """ change label image to label index """ height = label_image.shape[0] width = label_image.shape[1] labels = np.zeros((height, width), dtype=np.int32) labels_all = np.zeros((height, width), dtype=np.int32) # label image is in BGR order index = label_image[:,:,2] + 256*label_image[:,:,1] + 256*256*label_image[:,:,0] for i in range(1, len(self._class_colors_all)): color = self._class_colors_all[i] ind = color[0] + 256*color[1] + 256*256*color[2] I = np.where(index == ind) labels_all[I[0], I[1]] = i ind = np.where(np.array(cfg.TRAIN.CLASSES) == i)[0] if len(ind) > 0: labels[I[0], I[1]] = ind return labels, labels_all def evaluation(self, output_dir): filename = os.path.join(output_dir, 'results_posecnn.mat') if os.path.exists(filename): results_all = scipy.io.loadmat(filename) print('load results from file') print(filename) distances_sys = results_all['distances_sys'] distances_non = results_all['distances_non'] errors_rotation = results_all['errors_rotation'] errors_translation = results_all['errors_translation'] results_seq_id = results_all['results_seq_id'].flatten() results_frame_id = results_all['results_frame_id'].flatten() results_object_id = results_all['results_object_id'].flatten() results_cls_id = results_all['results_cls_id'].flatten() else: # save results num_max = 100000 num_results = 2 distances_sys = np.zeros((num_max, num_results), dtype=np.float32) distances_non = np.zeros((num_max, num_results), dtype=np.float32) errors_rotation = np.zeros((num_max, num_results), dtype=np.float32) errors_translation = np.zeros((num_max, num_results), dtype=np.float32) results_seq_id = np.zeros((num_max, ), dtype=np.float32) results_frame_id = np.zeros((num_max, ), dtype=np.float32) results_object_id = np.zeros((num_max, ), dtype=np.float32) results_cls_id = np.zeros((num_max, ), dtype=np.float32) # for each image count = -1 for i in range(len(self._roidb)): # parse keyframe name seq_id = int(self._roidb[i]['video_id']) frame_id = int(self._roidb[i]['image_id']) # load result filename = os.path.join(output_dir, '%04d_%06d.mat' % (seq_id, frame_id)) print(filename) result_posecnn = scipy.io.loadmat(filename) # load gt poses filename = osp.join(self._data_path, '%04d/%06d-meta.mat' % (seq_id, frame_id)) print(filename) gt = scipy.io.loadmat(filename) # for each gt poses cls_indexes = gt['cls_indexes'].flatten() for j in range(len(cls_indexes)): count += 1 cls_index = cls_indexes[j] RT_gt = gt['poses'][:, :, j] results_seq_id[count] = seq_id results_frame_id[count] = frame_id results_object_id[count] = j results_cls_id[count] = cls_index # network result result = result_posecnn roi_index = [] if len(result['rois']) > 0: for k in range(result['rois'].shape[0]): ind = int(result['rois'][k, 1]) if ind == -1: cls = 19 else: cls = cfg.TRAIN.CLASSES[ind] if cls == cls_index: roi_index.append(k) # select the roi if len(roi_index) > 1: # overlaps: (rois x gt_boxes) roi_blob = result['rois'][roi_index, :] roi_blob = roi_blob[:, (0, 2, 3, 4, 5, 1)] gt_box_blob = np.zeros((1, 5), dtype=np.float32) gt_box_blob[0, 1:] = gt['box'][j, :] overlaps = bbox_overlaps( np.ascontiguousarray(roi_blob[:, :5], dtype=np.float), np.ascontiguousarray(gt_box_blob, dtype=np.float)).flatten() assignment = overlaps.argmax() roi_index = [roi_index[assignment]] if len(roi_index) > 0: RT = np.zeros((3, 4), dtype=np.float32) ind = int(result['rois'][roi_index, 1]) points = self._points[ind] # pose from network RT[:3, :3] = quat2mat(result['poses'][roi_index, :4].flatten()) RT[:, 3] = result['poses'][roi_index, 4:] distances_sys[count, 0] = adi(RT[:3, :3], RT[:, 3], RT_gt[:3, :3], RT_gt[:, 3], points) distances_non[count, 0] = add(RT[:3, :3], RT[:, 3], RT_gt[:3, :3], RT_gt[:, 3], points) errors_rotation[count, 0] = re(RT[:3, :3], RT_gt[:3, :3]) errors_translation[count, 0] = te(RT[:, 3], RT_gt[:, 3]) # pose after depth refinement if cfg.TEST.POSE_REFINE: RT[:3, :3] = quat2mat(result['poses_refined'][roi_index, :4].flatten()) RT[:, 3] = result['poses_refined'][roi_index, 4:] distances_sys[count, 1] = adi(RT[:3, :3], RT[:, 3], RT_gt[:3, :3], RT_gt[:, 3], points) distances_non[count, 1] = add(RT[:3, :3], RT[:, 3], RT_gt[:3, :3], RT_gt[:, 3], points) errors_rotation[count, 1] = re(RT[:3, :3], RT_gt[:3, :3]) errors_translation[count, 1] = te(RT[:, 3], RT_gt[:, 3]) else: distances_sys[count, 1] = np.inf distances_non[count, 1] = np.inf errors_rotation[count, 1] = np.inf errors_translation[count, 1] = np.inf else: distances_sys[count, :] = np.inf distances_non[count, :] = np.inf errors_rotation[count, :] = np.inf errors_translation[count, :] = np.inf distances_sys = distances_sys[:count+1, :] distances_non = distances_non[:count+1, :] errors_rotation = errors_rotation[:count+1, :] errors_translation = errors_translation[:count+1, :] results_seq_id = results_seq_id[:count+1] results_frame_id = results_frame_id[:count+1] results_object_id = results_object_id[:count+1] results_cls_id = results_cls_id[:count+1] results_all = {'distances_sys': distances_sys, 'distances_non': distances_non, 'errors_rotation': errors_rotation, 'errors_translation': errors_translation, 'results_seq_id': results_seq_id, 'results_frame_id': results_frame_id, 'results_object_id': results_object_id, 'results_cls_id': results_cls_id } filename = os.path.join(output_dir, 'results_posecnn.mat') scipy.io.savemat(filename, results_all) # print the results # for each class import matplotlib.pyplot as plt max_distance = 0.1 index_plot = [0, 1] color = ['r', 'b'] leng = ['PoseCNN', 'PoseCNN refined'] num = len(leng) ADD = np.zeros((self._num_classes_all, num), dtype=np.float32) ADDS = np.zeros((self._num_classes_all, num), dtype=np.float32) TS = np.zeros((self._num_classes_all, num), dtype=np.float32) classes = list(copy.copy(self._classes_all)) classes[0] = 'all' for k in range(self._num_classes_all): fig = plt.figure() if k == 0: index = range(len(results_cls_id)) else: index = np.where(results_cls_id == k)[0] if len(index) == 0: continue print('%s: %d objects' % (classes[k], len(index))) # distance symmetry ax = fig.add_subplot(2, 3, 1) lengs = [] for i in index_plot: D = distances_sys[index, i] ind = np.where(D > max_distance)[0] D[ind] = np.inf d = np.sort(D) n = len(d) accuracy = np.cumsum(np.ones((n, ), np.float32)) / n plt.plot(d, accuracy, color[i], linewidth=2) ADDS[k, i] = VOCap(d, accuracy) lengs.append('%s (%.2f)' % (leng[i], ADDS[k, i] * 100)) print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D)))) ax.legend(lengs) plt.xlabel('Average distance threshold in meter (symmetry)') plt.ylabel('accuracy') ax.set_title(classes[k]) # distance non-symmetry ax = fig.add_subplot(2, 3, 2) lengs = [] for i in index_plot: D = distances_non[index, i] ind = np.where(D > max_distance)[0] D[ind] = np.inf d = np.sort(D) n = len(d) accuracy = np.cumsum(np.ones((n, ), np.float32)) / n plt.plot(d, accuracy, color[i], linewidth=2) ADD[k, i] = VOCap(d, accuracy) lengs.append('%s (%.2f)' % (leng[i], ADD[k, i] * 100)) print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D)))) ax.legend(lengs) plt.xlabel('Average distance threshold in meter (non-symmetry)') plt.ylabel('accuracy') ax.set_title(classes[k]) # translation ax = fig.add_subplot(2, 3, 3) lengs = [] for i in index_plot: D = errors_translation[index, i] ind = np.where(D > max_distance)[0] D[ind] = np.inf d = np.sort(D) n = len(d) accuracy = np.cumsum(np.ones((n, ), np.float32)) / n plt.plot(d, accuracy, color[i], linewidth=2) TS[k, i] = VOCap(d, accuracy) lengs.append('%s (%.2f)' % (leng[i], TS[k, i] * 100)) print('%s, %s: %d objects missed' % (classes[k], leng[i], np.sum(np.isinf(D)))) ax.legend(lengs) plt.xlabel('Translation threshold in meter') plt.ylabel('accuracy') ax.set_title(classes[k]) # rotation histogram count = 4 for i in index_plot: ax = fig.add_subplot(2, 3, count) D = errors_rotation[index, i] ind = np.where(np.isfinite(D))[0] D = D[ind] ax.hist(D, bins=range(0, 190, 10), range=(0, 180)) plt.xlabel('Rotation angle error') plt.ylabel('count') ax.set_title(leng[i]) count += 1 # mng = plt.get_current_fig_manager() # mng.full_screen_toggle() filename = output_dir + '/' + classes[k] + '.png' plt.savefig(filename) # plt.show() # print ADD print('==================ADD======================') for k in range(len(classes)): print('%s: %f' % (classes[k], ADD[k, 0])) for k in range(len(classes)-1): print('%f' % (ADD[k+1, 0])) print('%f' % (ADD[0, 0])) print(cfg.TRAIN.SNAPSHOT_INFIX) print('===========================================') # print ADD-S print('==================ADD-S====================') for k in range(len(classes)): print('%s: %f' % (classes[k], ADDS[k, 0])) for k in range(len(classes)-1): print('%f' % (ADDS[k+1, 0])) print('%f' % (ADDS[0, 0])) print(cfg.TRAIN.SNAPSHOT_INFIX) print('===========================================') # print ADD print('==================ADD refined======================') for k in range(len(classes)): print('%s: %f' % (classes[k], ADD[k, 1])) for k in range(len(classes)-1): print('%f' % (ADD[k+1, 1])) print('%f' % (ADD[0, 1])) print(cfg.TRAIN.SNAPSHOT_INFIX) print('===========================================') # print ADD-S print('==================ADD-S refined====================') for k in range(len(classes)): print('%s: %f' % (classes[k], ADDS[k, 1])) for k in range(len(classes)-1): print('%f' % (ADDS[k+1, 1])) print('%f' % (ADDS[0, 1])) print(cfg.TRAIN.SNAPSHOT_INFIX) print('===========================================') ================================================ FILE: lib/fcn/__init__.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md ================================================ FILE: lib/fcn/config.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md """PoseCNN config system. This file specifies default config options for Fast R-CNN. You should not change values in this file. Instead, you should write a config file (in yaml) and use cfg_from_file(yaml_file) to load it and override the default options. Most tools in $ROOT/tools take a --cfg option to specify an override file. - See tools/{train,test}_net.py for example code that uses cfg_from_file() - See experiments/cfgs/*.yml for example YAML config override files """ import os import os.path as osp import numpy as np import math # `pip install easydict` if you don't have it from easydict import EasyDict as edict import logging __C = edict() # Consumers can get config by: # from fast_rcnn_config import cfg cfg = __C __C.FLIP_X = False __C.INPUT = 'RGBD' __C.NETWORK = 'VGG16' __C.RIG = '' __C.CAD = '' __C.POSE = '' __C.BACKGROUND = '' __C.USE_GPU_NMS = True __C.MODE = 'TRAIN' __C.INTRINSICS = () __C.DATA_PATH = '' __C.FLOW_HEIGHT = 512 __C.FLOW_WIDTH = 640 # Anchor scales for RPN __C.ANCHOR_SCALES = (8,16,32) # Anchor ratios for RPN __C.ANCHOR_RATIOS = (0.5,1,2) __C.FEATURE_STRIDE = 16 __C.gpu_id = 0 __C.instance_id = 0 # # Training options # __C.TRAIN = edict() __C.TRAIN.WEIGHT_DECAY = 0.0001 __C.TRAIN.SEGMENTATION = True __C.TRAIN.ITERNUM = 4 __C.TRAIN.HEATUP = 4 __C.TRAIN.GPUNUM = 1 __C.TRAIN.CLASSES = (0,1,2,3) __C.TRAIN.SYMMETRY = (0,0,0,0) __C.TRAIN.SLIM = False __C.TRAIN.SINGLE_FRAME = False __C.TRAIN.TRAINABLE = True __C.TRAIN.VERTEX_REG = True __C.TRAIN.VERTEX_REG_DELTA = False __C.TRAIN.POSE_REG = True __C.TRAIN.LABEL_W = 1.0 __C.TRAIN.VERTEX_W = 1.0 __C.TRAIN.VERTEX_W_INSIDE = 10.0 __C.TRAIN.POSE_W = 1.0 __C.TRAIN.BOX_W = 1.0 __C.TRAIN.HARD_LABEL_THRESHOLD = 1.0 __C.TRAIN.HARD_LABEL_SAMPLING = 1.0 __C.TRAIN.HARD_ANGLE = 15.0 __C.TRAIN.VISUALIZE = False __C.TRAIN.GAN = False __C.TRAIN.MATCHING = False __C.TRAIN.NOISE_LEVEL = 0.05 __C.TRAIN.FREEZE_LAYERS = True __C.TRAIN.MAX_ITERS_PER_EPOCH = 1000000 __C.TRAIN.UNIFORM_POSE_INTERVAL = 15 __C.TRAIN.AFFINE = False # Hough voting __C.TRAIN.HOUGH_LABEL_THRESHOLD = 100 __C.TRAIN.HOUGH_VOTING_THRESHOLD = -1 __C.TRAIN.HOUGH_SKIP_PIXELS = -1 __C.TRAIN.HOUGH_INLIER_THRESHOLD = 0.9 # synthetic training __C.TRAIN.SYNTHESIZE = False __C.TRAIN.SYN_ONLINE = False __C.TRAIN.SYN_WIDTH = 640 __C.TRAIN.SYN_HEIGHT = 480 __C.TRAIN.SYNROOT = '/var/Projects/Deep_Pose/data/LOV/data_syn/' if not os.path.exists(__C.TRAIN.SYNROOT): __C.TRAIN.SYNROOT = '/home/yuxiang/Projects/Deep_Pose/data/LOV/data_syn/' __C.TRAIN.SYNITER = 0 __C.TRAIN.SYNNUM = 80000 __C.TRAIN.SYN_RATIO = 1 __C.TRAIN.SYN_CLASS_INDEX = 1 __C.TRAIN.SYN_TNEAR = 0.5 __C.TRAIN.SYN_TFAR = 2.0 __C.TRAIN.SYN_BACKGROUND_SPECIFIC = False __C.TRAIN.SYN_BACKGROUND_SUBTRACT_MEAN = False __C.TRAIN.SYN_BACKGROUND_CONSTANT_PROB = 0.1 __C.TRAIN.SYN_BACKGROUND_AFFINE = False __C.TRAIN.SYN_SAMPLE_OBJECT = True __C.TRAIN.SYN_SAMPLE_POSE = True __C.TRAIN.SYN_STD_ROTATION = 15 __C.TRAIN.SYN_STD_TRANSLATION = 0.05 __C.TRAIN.SYN_MIN_OBJECT = 5 __C.TRAIN.SYN_MAX_OBJECT = 8 __C.TRAIN.SYN_TNEAR = 0.5 __C.TRAIN.SYN_TFAR = 2.0 __C.TRAIN.SYN_BOUND = 0.4 __C.TRAIN.SYN_SAMPLE_DISTRACTOR = True __C.TRAIN.SYN_CROP = False __C.TRAIN.SYN_CROP_SIZE = 224 __C.TRAIN.SYN_TABLE_PROB = 0.8 # autoencoder __C.TRAIN.BOOSTRAP_PIXELS = 20 # domain adaptation __C.TRAIN.ADAPT = False __C.TRAIN.ADAPT_ROOT = '' __C.TRAIN.ADAPT_NUM = 400 __C.TRAIN.ADAPT_RATIO = 1 __C.TRAIN.ADAPT_WEIGHT = 0.1 # learning rate __C.TRAIN.OPTIMIZER = 'MOMENTUM' __C.TRAIN.LEARNING_RATE = 0.0001 __C.TRAIN.MILESTONES = (100, 150, 200) __C.TRAIN.MOMENTUM = 0.9 __C.TRAIN.BETA = 0.999 __C.TRAIN.GAMMA = 0.1 __C.TRAIN.SYMSIZE = 0 # voxel grid size __C.TRAIN.GRID_SIZE = 256 # Scales to compute real features __C.TRAIN.SCALES_BASE = (0.25, 0.5, 1.0, 2.0, 3.0) # parameters for data augmentation __C.TRAIN.CHROMATIC = True __C.TRAIN.ADD_NOISE = False # Images to use per minibatch __C.TRAIN.IMS_PER_BATCH = 2 __C.TRAIN.NUM_STEPS = 5 __C.TRAIN.NUM_UNITS = 64 # Use horizontally-flipped images during training? __C.TRAIN.USE_FLIPPED = True # Iterations between snapshots __C.TRAIN.SNAPSHOT_EPOCHS = 1 # solver.prototxt specifies the snapshot path prefix, this adds an optional # infix to yield the path: [_]_iters_XYZ.caffemodel __C.TRAIN.SNAPSHOT_PREFIX = 'caffenet_fast_rcnn' __C.TRAIN.SNAPSHOT_INFIX = '' __C.TRAIN.DISPLAY = 20 __C.TRAIN.ITERS = 0 # Whether to add ground truth boxes to the pool when sampling regions __C.TRAIN.USE_GT = False # Minibatch size (number of regions of interest [ROIs]) __C.TRAIN.BATCH_SIZE = 128 # Fraction of minibatch that is labeled foreground (i.e. class > 0) __C.TRAIN.FG_FRACTION = 0.25 # Overlap threshold for a ROI to be considered foreground (if >= FG_THRESH) __C.TRAIN.FG_THRESH = 0.5 __C.TRAIN.FG_THRESH_POSE = 0.2 # Overlap threshold for a ROI to be considered background (class = 0 if # overlap in [LO, HI)) __C.TRAIN.BG_THRESH_HI = 0.5 __C.TRAIN.BG_THRESH_LO = 0.1 # Use RPN to detect objects __C.TRAIN.HAS_RPN = True # IOU >= thresh: positive example __C.TRAIN.RPN_POSITIVE_OVERLAP = 0.7 # IOU < thresh: negative example __C.TRAIN.RPN_NEGATIVE_OVERLAP = 0.3 # If an anchor satisfied by positive and negative conditions set to negative __C.TRAIN.RPN_CLOBBER_POSITIVES = False # Max number of foreground examples __C.TRAIN.RPN_FG_FRACTION = 0.5 # Total number of examples __C.TRAIN.RPN_BATCHSIZE = 256 # NMS threshold used on RPN proposals __C.TRAIN.RPN_NMS_THRESH = 0.7 # Number of top scoring boxes to keep before apply NMS to RPN proposals __C.TRAIN.RPN_PRE_NMS_TOP_N = 12000 # Number of top scoring boxes to keep after applying NMS to RPN proposals __C.TRAIN.RPN_POST_NMS_TOP_N = 2000 # Deprecated (outside weights) __C.TRAIN.RPN_BBOX_INSIDE_WEIGHTS = (1.0, 1.0, 1.0, 1.0) # Give the positive RPN examples weight of p * 1 / {num positives} # and give negatives a weight of (1 - p) # Set to -1.0 to use uniform example weighting __C.TRAIN.RPN_POSITIVE_WEIGHT = -1.0 # Normalize the targets (subtract empirical mean, divide by empirical stddev) __C.TRAIN.BBOX_NORMALIZE_TARGETS = True # Deprecated (inside weights) __C.TRAIN.BBOX_INSIDE_WEIGHTS = (1.0, 1.0, 1.0, 1.0) # Normalize the targets using "precomputed" (or made up) means and stdevs # (BBOX_NORMALIZE_TARGETS must also be True) __C.TRAIN.BBOX_NORMALIZE_TARGETS_PRECOMPUTED = True __C.TRAIN.BBOX_NORMALIZE_MEANS = (0.0, 0.0, 0.0, 0.0) __C.TRAIN.BBOX_NORMALIZE_STDS = (0.1, 0.1, 0.2, 0.2) # # Testing options # __C.TEST = edict() __C.TEST.GLOBAL_SEARCH = False __C.TEST.SEGMENTATION = True __C.TEST.SINGLE_FRAME = False __C.TEST.VERTEX_REG_2D = False __C.TEST.VERTEX_REG_3D = False __C.TEST.VISUALIZE = False __C.TEST.RANSAC = False __C.TEST.GAN = False __C.TEST.POSE_REG = False __C.TEST.POSE_REFINE = False __C.TEST.POSE_SDF = True __C.TEST.POSE_CODEBOOK = False __C.TEST.SYNTHESIZE = False __C.TEST.ROS_CAMERA = 'camera' __C.TEST.DET_THRESHOLD = 0.5 __C.TEST.BUILD_CODEBOOK = False __C.TEST.IMS_PER_BATCH = 1 __C.TEST.MEAN_SHIFT = False __C.TEST.CHECK_SIZE = False __C.TEST.NUM_SDF_ITERATIONS_INIT = 100 __C.TEST.NUM_SDF_ITERATIONS_TRACKING = 50 __C.TEST.SDF_TRANSLATION_REG = 10.0 __C.TEST.SDF_ROTATION_REG = 0.1 __C.TEST.NUM_LOST = 3 __C.TEST.ALIGN_Z_AXIS = False __C.TEST.GEN_DATA = False # Hough voting __C.TEST.HOUGH_LABEL_THRESHOLD = 100 __C.TEST.HOUGH_VOTING_THRESHOLD = -1 __C.TEST.HOUGH_SKIP_PIXELS = -1 __C.TEST.HOUGH_INLIER_THRESHOLD = 0.9 __C.TEST.CLASSES = (0,1,2,3) __C.TEST.SYMMETRY = (0,0,0,0) __C.TEST.ITERNUM = 4 # Scales to compute real features __C.TEST.SCALES_BASE = (0.25, 0.5, 1.0, 2.0, 3.0) # voxel grid size __C.TEST.GRID_SIZE = 256 ## NMS threshold used on RPN proposals __C.TEST.RPN_NMS_THRESH = 0.7 # Number of top scoring boxes to keep before apply NMS to RPN proposals __C.TEST.RPN_PRE_NMS_TOP_N = 6000 # Number of top scoring boxes to keep after applying NMS to RPN proposals __C.TEST.RPN_POST_NMS_TOP_N = 300 # Test using bounding-box regressors __C.TEST.BBOX_REG = True # Overlap threshold used for non-maximum suppression (suppress boxes with # IoU >= this threshold) __C.TEST.NMS = 0.3 # Pixel mean values (BGR order) as a (1, 1, 3) array # These are the values originally used for training VGG16 __C.PIXEL_MEANS = np.array([[[102.9801, 115.9465, 122.7717]]]) # For reproducibility __C.RNG_SEED = 3 # A small number that's used many times __C.EPS = 1e-14 # Root directory of project __C.ROOT_DIR = osp.abspath(osp.join(osp.dirname(__file__), '..', '..')) # Place outputs under an experiments directory __C.EXP_DIR = 'default' # Default GPU device id __C.GPU_ID = 0 def get_output_dir(imdb, net): """Return the directory where experimental artifacts are placed. A canonical path is built using the name from an imdb and a network (if not None). """ path = osp.abspath(osp.join(__C.ROOT_DIR, 'output', __C.EXP_DIR, imdb.name)) if net is None: return path else: return osp.join(path, net) def _merge_a_into_b(a, b): """Merge config dictionary a into config dictionary b, clobbering the options in b whenever they are also specified in a. """ if type(a) is not edict: return for k, v in a.items(): # a must specify keys that are in b if k not in b: raise KeyError('{} is not a valid config key'.format(k)) # the types must match, too if type(b[k]) is not type(v): raise ValueError(('Type mismatch ({} vs. {}) ' 'for config key: {}').format(type(b[k]), type(v), k)) # recursively merge dicts if type(v) is edict: try: _merge_a_into_b(a[k], b[k]) except: print('Error under config key: {}'.format(k)) raise else: b[k] = v def cfg_from_file(filename): """Load a config file and merge it into the default options.""" import yaml with open(filename, 'r') as f: yaml_cfg = edict(yaml.load(f)) _merge_a_into_b(yaml_cfg, __C) def yaml_from_file(filename): """Load a config file and merge it into the default options.""" import yaml with open(filename, 'r') as f: yaml_cfg = edict(yaml.load(f)) return yaml_cfg ================================================ FILE: lib/fcn/render_utils.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import torch import time import sys, os import numpy as np import cv2 import matplotlib.pyplot as plt from fcn.config import cfg from transforms3d.quaternions import quat2mat def render_image(dataset, im, rois, poses, poses_refine, labels): # label image label_image = dataset.labels_to_image(labels) im_label = im[:, :, (2, 1, 0)].copy() I = np.where(labels != 0) im_label[I[0], I[1], :] = 0.5 * label_image[I[0], I[1], :] + 0.5 * im_label[I[0], I[1], :] num = poses.shape[0] classes = dataset._classes_test class_colors = dataset._class_colors_test cls_indexes = [] poses_all = [] poses_refine_all = [] for i in range(num): if cfg.MODE == 'TEST': cls_index = int(rois[i, 1]) - 1 else: cls_index = cfg.TRAIN.CLASSES[int(rois[i, 1])] - 1 if cls_index < 0: continue cls_indexes.append(cls_index) qt = np.zeros((7, ), dtype=np.float32) qt[:3] = poses[i, 4:7] qt[3:] = poses[i, :4] poses_all.append(qt.copy()) if cfg.TEST.POSE_REFINE and poses_refine is not None: qt[:3] = poses_refine[i, 4:7] qt[3:] = poses_refine[i, :4] poses_refine_all.append(qt.copy()) cls = int(rois[i, 1]) print(classes[cls], rois[i, -1], cls_index) if cls > 0 and rois[i, -1] > cfg.TEST.DET_THRESHOLD: # draw roi x1 = rois[i, 2] y1 = rois[i, 3] x2 = rois[i, 4] y2 = rois[i, 5] cv2.rectangle(im_label, (x1, y1), (x2, y2), class_colors[cls], 2) # draw center cx = int((x1 + x2) / 2) cy = int((y1 + y2) / 2) cv2.circle(im_label, (cx, cy), 2, (255, 255, 0), 10) # rendering if len(cls_indexes) > 0 and cfg.TRAIN.POSE_REG: height = im.shape[0] width = im.shape[1] intrinsic_matrix = dataset._intrinsic_matrix fx = intrinsic_matrix[0, 0] fy = intrinsic_matrix[1, 1] px = intrinsic_matrix[0, 2] py = intrinsic_matrix[1, 2] zfar = 10.0 znear = 0.01 image_tensor = torch.cuda.FloatTensor(height, width, 4) seg_tensor = torch.cuda.FloatTensor(height, width, 4) # set renderer cfg.renderer.set_light_pos([0, 0, 0]) cfg.renderer.set_light_color([1, 1, 1]) cfg.renderer.set_projection_matrix(width, height, fx, fy, px, py, znear, zfar) # pose cfg.renderer.set_poses(poses_all) frame = cfg.renderer.render(cls_indexes, image_tensor, seg_tensor) image_tensor = image_tensor.flip(0) im_render = image_tensor.cpu().numpy() im_render = np.clip(im_render, 0, 1) im_render = im_render[:, :, :3] * 255 im_render = im_render.astype(np.uint8) im_output = 0.8 * im[:,:,(2, 1, 0)].astype(np.float32) + 1.0 * im_render.astype(np.float32) im_output = np.clip(im_output, 0, 255) # pose refine if cfg.TEST.POSE_REFINE and poses_refine is not None: cfg.renderer.set_poses(poses_refine_all) frame = cfg.renderer.render(cls_indexes, image_tensor, seg_tensor) image_tensor = image_tensor.flip(0) im_render = image_tensor.cpu().numpy() im_render = np.clip(im_render, 0, 1) im_render = im_render[:, :, :3] * 255 im_render = im_render.astype(np.uint8) im_output_refine = 0.8 * im[:,:,(2, 1, 0)].astype(np.float32) + 1.0 * im_render.astype(np.float32) im_output_refine = np.clip(im_output_refine, 0, 255) im_output_refine = im_output_refine.astype(np.uint8) else: im_output_refine = im_output.copy() else: im_output = 0.4 * im[:,:,(2, 1, 0)] im_output_refine = im_output.copy() return im_output.astype(np.uint8), im_output_refine.astype(np.uint8), im_label ================================================ FILE: lib/fcn/test_common.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import torch import time import sys, os import numpy as np import posecnn_cuda import matplotlib.pyplot as plt from transforms3d.quaternions import mat2quat, quat2mat from matplotlib.patches import Circle from fcn.config import cfg def compute_index_sdf(rois): num = rois.shape[0] index_sdf = [] for i in range(num): cls = int(rois[i, 1]) if cls == 0: continue if cfg.TRAIN.CLASSES[cls] not in cfg.TEST.CLASSES: continue if rois[i, -1] < cfg.TEST.DET_THRESHOLD: continue index_sdf.append(i) return index_sdf # SDF refinement def refine_pose(im_label, im_depth, rois, poses, meta_data, dataset, visualize=False): start_time = time.time() width = im_depth.shape[1] height = im_depth.shape[0] sdf_optim = cfg.sdf_optimizer steps = cfg.TEST.NUM_SDF_ITERATIONS_TRACKING index_sdf = compute_index_sdf(rois) # backproject depth intrinsic_matrix = meta_data[0, :9].cpu().numpy().reshape((3, 3)) fx = intrinsic_matrix[0, 0] fy = intrinsic_matrix[1, 1] px = intrinsic_matrix[0, 2] py = intrinsic_matrix[1, 2] zfar = 6.0 znear = 0.01 im_pcloud = posecnn_cuda.backproject_forward(fx, fy, px, py, im_depth)[0] dpoints = im_pcloud[:,:,:3].cpu().numpy().reshape((-1, 3)) # rendering num = len(index_sdf) poses_all = [] cls_indexes = [] for i in range(num): ind = index_sdf[i] cls = int(rois[ind, 1]) cls_render = cfg.TEST.CLASSES.index(cfg.TRAIN.CLASSES[cls]) - 1 cls_indexes.append(cls_render) qt = np.zeros((7, ), dtype=np.float32) qt[3:] = poses[ind, :4] qt[:3] = poses[ind, 4:] poses_all.append(qt) cfg.renderer.set_poses(poses_all) cfg.renderer.set_projection_matrix(width, height, fx, fy, px, py, znear, zfar) image_tensor = torch.cuda.FloatTensor(height, width, 4).detach() seg_tensor = torch.cuda.FloatTensor(height, width, 4).detach() pcloud_tensor = torch.cuda.FloatTensor(height, width, 4).detach() cfg.renderer.render(cls_indexes, image_tensor, seg_tensor, pc2_tensor=pcloud_tensor) pcloud_tensor = pcloud_tensor.flip(0) pcloud = pcloud_tensor[:,:,:3].cpu().numpy().reshape((-1, 3)) # refine translation poses_t = poses.copy() for i in range(num): ind = index_sdf[i] cls = int(rois[ind, 1]) cls_render = cfg.TEST.CLASSES.index(cfg.TRAIN.CLASSES[cls]) - 1 x1 = max(int(rois[ind, 2]), 0) y1 = max(int(rois[ind, 3]), 0) x2 = min(int(rois[ind, 4]), width-1) y2 = min(int(rois[ind, 5]), height-1) labels = torch.zeros_like(im_label) labels[y1:y2, x1:x2] = im_label[y1:y2, x1:x2] labels = labels.cpu().numpy().reshape((width * height, )) index = np.where((labels == cls) & np.isfinite(dpoints[:, 0]) & (pcloud[:, 0] != 0) & (dpoints[:, 0] != 0))[0] if len(index) > 10: T = np.mean(dpoints[index, :] - pcloud[index, :], axis=0) z_new = poses[ind, 6] + T[2] poses_t[ind, 6] = z_new poses_t[ind, 4] = (poses[ind, 4] / poses[ind, 6]) * z_new poses_t[ind, 5] = (poses[ind, 5] / poses[ind, 6]) * z_new print('object {}, class {}, z {}, z new {}'.format(i, dataset._classes_test[cls_render+1], poses[ind, 6], z_new)) if visualize: fig = plt.figure() ax = fig.add_subplot(1, 1, 1) image_tensor = image_tensor.flip(0) im = image_tensor.cpu().numpy() * 255 im = im.astype(np.uint8) plt.imshow(im) plt.show() # compare the depth depth_meas_roi = im_pcloud[:, :, 2] mask_depth_meas = depth_meas_roi > 0 mask_depth_valid = torch.isfinite(depth_meas_roi) # prepare data T_oc_init = np.zeros((num, 4, 4), dtype=np.float32) cls_index = torch.cuda.FloatTensor(0, 1) obj_index = torch.cuda.FloatTensor(0, 1) pix_index = torch.cuda.LongTensor(0, 2) for i in range(num): # pose ind = index_sdf[i] pose = poses_t[ind, :].copy() T_co = np.eye(4, dtype=np.float32) T_co[:3, :3] = quat2mat(pose[:4]) T_co[:3, 3] = pose[4:] T_oc_init[i] = np.linalg.inv(T_co) # filter out points very far away z = float(pose[6]) roi = rois[ind, :].copy() cls = int(roi[1]) extent = 1.0 * np.mean(dataset._extents[cls, :]) mask_distance = torch.abs(depth_meas_roi - z) < extent # mask label cls_render = cfg.TEST.CLASSES.index(cfg.TRAIN.CLASSES[cls]) - 1 w = roi[4] - roi[2] h = roi[5] - roi[3] x1 = max(int(roi[2] - w / 2), 0) y1 = max(int(roi[3] - h / 2), 0) x2 = min(int(roi[4] + w / 2), width - 1) y2 = min(int(roi[5] + h / 2), height - 1) if im_label is not None: labels = torch.zeros_like(im_label) labels[y1:y2, x1:x2] = im_label[y1:y2, x1:x2] mask_label = labels == cls else: mask_label = torch.zeros_like(mask_depth_meas) mask_label[y1:y2, x1:x2] = 1 mask = mask_label * mask_depth_meas * mask_depth_valid * mask_distance index_p = torch.nonzero(mask) n = index_p.shape[0] if n > 100: pix_index = torch.cat((pix_index, index_p), dim=0) index = cls_render * torch.ones((n, 1), dtype=torch.float32, device=0) cls_index = torch.cat((cls_index, index), dim=0) index = i * torch.ones((n, 1), dtype=torch.float32, device=0) obj_index = torch.cat((obj_index, index), dim=0) print('sdf {} points for object {}, class {} {}'.format(n, i, cls_render, dataset._classes_test[cls_render+1])) else: print('sdf {} points for object {}, class {} {}, no refinement'.format(n, i, cls_render, dataset._classes_test[cls_render+1])) if visualize and n <= 100: fig = plt.figure() ax = fig.add_subplot(2, 3, 1) plt.imshow(mask_label.cpu().numpy()) ax.set_title('mask label') ax = fig.add_subplot(2, 3, 2) plt.imshow(mask_depth_meas.cpu().numpy()) ax.set_title('mask_depth_meas') ax = fig.add_subplot(2, 3, 3) plt.imshow(mask_depth_valid.cpu().numpy()) ax.set_title('mask_depth_valid') ax = fig.add_subplot(2, 3, 4) plt.imshow(mask_distance.cpu().numpy()) ax.set_title('mask_distance') print(extent, z) ax = fig.add_subplot(2, 3, 5) plt.imshow(depth_meas_roi.cpu().numpy()) ax.set_title('depth') plt.show() # data n = pix_index.shape[0] print('sdf with {} points'.format(n)) if n == 0: return poses_t.copy() points = im_pcloud[pix_index[:, 0], pix_index[:, 1], :] points = torch.cat((points, cls_index, obj_index), dim=1) T_oc_opt = sdf_optim.refine_pose_layer(T_oc_init, points, steps=steps) # collect poses poses_refined = poses_t.copy() for i in range(num): RT_opt = T_oc_opt[i] ind = index_sdf[i] if RT_opt[3, 3] > 0: RT_opt = np.linalg.inv(RT_opt) poses_refined[ind, :4] = mat2quat(RT_opt[:3, :3]) poses_refined[ind, 4:] = RT_opt[:3, 3] if visualize: points = points.cpu().numpy() for i in range(num): ind = index_sdf[i] roi = rois[ind, :].copy() cls = int(roi[1]) cls = cfg.TEST.CLASSES.index(cfg.TRAIN.CLASSES[cls]) T_co_init = np.linalg.inv(T_oc_init[i]) pose = poses_refined[ind, :].copy() T_co_opt = np.eye(4, dtype=np.float32) T_co_opt[:3, :3] = quat2mat(pose[:4]) T_co_opt[:3, 3] = pose[4:] index = np.where(points[:, 4] == i)[0] if len(index) == 0: continue pts = points[index, :4].copy() pts[:, 3] = 1.0 # show points fig = plt.figure() ax = fig.add_subplot(1, 1, 1, projection='3d') points_obj = dataset._points_all_test[cls, :, :] points_init = np.matmul(np.linalg.inv(T_co_init), pts.transpose()).transpose() points_opt = np.matmul(np.linalg.inv(T_co_opt), pts.transpose()).transpose() ax.scatter(points_obj[::5, 0], points_obj[::5, 1], points_obj[::5, 2], color='yellow') ax.scatter(points_init[::5, 0], points_init[::5, 1], points_init[::5, 2], color='red') ax.scatter(points_opt[::5, 0], points_opt[::5, 1], points_opt[::5, 2], color='blue') ax.set_xlabel('X Label') ax.set_ylabel('Y Label') ax.set_zlabel('Z Label') ax.set_xlim(sdf_optim.xmins[cls-1], sdf_optim.xmaxs[cls-1]) ax.set_ylim(sdf_optim.ymins[cls-1], sdf_optim.ymaxs[cls-1]) ax.set_zlim(sdf_optim.zmins[cls-1], sdf_optim.zmaxs[cls-1]) ax.set_title(dataset._classes_test[cls]) plt.show() print('pose refine time %.6f' % (time.time() - start_time)) return poses_refined ================================================ FILE: lib/fcn/test_dataset.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import torch import torch.nn as nn import time import sys, os import numpy as np import cv2 import scipy import matplotlib.pyplot as plt from fcn.config import cfg from fcn.test_common import refine_pose from transforms3d.quaternions import mat2quat, quat2mat, qmult from utils.se3 import * from utils.nms import nms from utils.pose_error import re, te class AverageMeter(object): """Computes and stores the average and current value""" def __init__(self): self.reset() def reset(self): self.val = 0 self.avg = 0 self.sum = 0 self.count = 0 def update(self, val, n=1): self.val = val self.sum += val * n self.count += n self.avg = self.sum / self.count def __repr__(self): return '{:.3f} ({:.3f})'.format(self.val, self.avg) def test(test_loader, background_loader, network, output_dir): batch_time = AverageMeter() epoch_size = len(test_loader) enum_background = enumerate(background_loader) # switch to test mode network.eval() for i, sample in enumerate(test_loader): # if 'is_testing' in sample and sample['is_testing'] == 0: # continue end = time.time() inputs = sample['image_color'] im_info = sample['im_info'] # add background mask = sample['mask'] try: _, background = next(enum_background) except: enum_background = enumerate(background_loader) _, background = next(enum_background) if inputs.size(0) != background['background_color'].size(0): enum_background = enumerate(background_loader) _, background = next(enum_background) background_color = background['background_color'].cuda() for j in range(inputs.size(0)): is_syn = im_info[j, -1] if is_syn: inputs[j] = mask[j] * inputs[j] + (1 - mask[j]) * background_color[j] labels = sample['label'].cuda() meta_data = sample['meta_data'].cuda() extents = sample['extents'][0, :, :].repeat(cfg.TRAIN.GPUNUM, 1, 1).cuda() gt_boxes = sample['gt_boxes'].cuda() poses = sample['poses'].cuda() points = sample['points'][0, :, :, :].repeat(cfg.TRAIN.GPUNUM, 1, 1, 1).cuda() symmetry = sample['symmetry'][0, :].repeat(cfg.TRAIN.GPUNUM, 1).cuda() # compute output if cfg.TRAIN.VERTEX_REG: if cfg.TRAIN.POSE_REG: out_label, out_vertex, rois, out_pose, out_quaternion = network(inputs, labels, meta_data, extents, gt_boxes, poses, points, symmetry) # combine poses rois = rois.detach().cpu().numpy() out_pose = out_pose.detach().cpu().numpy() out_quaternion = out_quaternion.detach().cpu().numpy() num = rois.shape[0] poses = out_pose.copy() for j in range(num): cls = int(rois[j, 1]) if cls >= 0: qt = out_quaternion[j, 4*cls:4*cls+4] qt = qt / np.linalg.norm(qt) # allocentric to egocentric poses[j, 4] *= poses[j, 6] poses[j, 5] *= poses[j, 6] T = poses[j, 4:] poses[j, :4] = allocentric2egocentric(qt, T) # non-maximum suppression within class index = nms(rois, 0.5) rois = rois[index, :] poses = poses[index, :] # refine pose if cfg.TEST.POSE_REFINE: im_depth = sample['im_depth'].numpy()[0] depth_tensor = torch.from_numpy(im_depth).cuda().float() labels_out = out_label[0] poses_refined = refine_pose(labels_out, depth_tensor, rois, poses, sample['meta_data'], test_loader.dataset) else: poses_refined = [] else: out_label, out_vertex, rois, out_pose = network(inputs, labels, meta_data, extents, gt_boxes, poses, points, symmetry) rois = rois.detach().cpu().numpy() out_pose = out_pose.detach().cpu().numpy() poses = out_pose.copy() poses_refined = [] # non-maximum suppression within class index = nms(rois, 0.5) rois = rois[index, :] poses = poses[index, :] else: out_label = network(inputs, labels, meta_data, extents, gt_boxes, poses, points, symmetry) out_vertex = [] rois = [] poses = [] poses_refined = [] if cfg.TEST.VISUALIZE: _vis_test(inputs, labels, out_label, out_vertex, rois, poses, poses_refined, sample, \ test_loader.dataset._points_all, test_loader.dataset.classes, test_loader.dataset.class_colors) # measure elapsed time batch_time.update(time.time() - end) if not cfg.TEST.VISUALIZE: result = {'labels': out_label[0].detach().cpu().numpy(), 'rois': rois, 'poses': poses, 'poses_refined': poses_refined} if 'video_id' in sample and 'image_id' in sample: filename = os.path.join(output_dir, sample['video_id'][0] + '_' + sample['image_id'][0] + '.mat') else: result['meta_data_path'] = sample['meta_data_path'] print(result['meta_data_path']) filename = os.path.join(output_dir, '%06d.mat' % i) print(filename) scipy.io.savemat(filename, result, do_compression=True) print('[%d/%d], batch time %.2f' % (i, epoch_size, batch_time.val)) filename = os.path.join(output_dir, 'results_posecnn.mat') if os.path.exists(filename): os.remove(filename) def _vis_test(inputs, labels, out_label, out_vertex, rois, poses, poses_refined, sample, points, classes, class_colors): """Visualize a mini-batch for debugging.""" import matplotlib.pyplot as plt im_blob = inputs.cpu().numpy() label_blob = labels.cpu().numpy() label_pred = out_label.cpu().numpy() gt_poses = sample['poses'].numpy() meta_data_blob = sample['meta_data'].numpy() metadata = meta_data_blob[0, :] intrinsic_matrix = metadata[:9].reshape((3,3)) gt_boxes = sample['gt_boxes'].numpy() extents = sample['extents'][0, :, :].numpy() if cfg.TRAIN.VERTEX_REG or cfg.TRAIN.VERTEX_REG_DELTA: vertex_targets = sample['vertex_targets'].numpy() vertex_pred = out_vertex.detach().cpu().numpy() m = 4 n = 4 for i in range(im_blob.shape[0]): fig = plt.figure() start = 1 # show image im = im_blob[i, :, :, :].copy() im = im.transpose((1, 2, 0)) * 255.0 im += cfg.PIXEL_MEANS im = im[:, :, (2, 1, 0)] im = im.astype(np.uint8) ax = fig.add_subplot(m, n, 1) plt.imshow(im) ax.set_title('color') start += 1 # show gt boxes boxes = gt_boxes[i] for j in range(boxes.shape[0]): if boxes[j, 4] == 0: continue x1 = boxes[j, 0] y1 = boxes[j, 1] x2 = boxes[j, 2] y2 = boxes[j, 3] plt.gca().add_patch( plt.Rectangle((x1, y1), x2-x1, y2-y1, fill=False, edgecolor='g', linewidth=3)) # show gt label label_gt = label_blob[i, :, :, :] label_gt = label_gt.transpose((1, 2, 0)) height = label_gt.shape[0] width = label_gt.shape[1] num_classes = label_gt.shape[2] im_label_gt = np.zeros((height, width, 3), dtype=np.uint8) for j in range(num_classes): I = np.where(label_gt[:, :, j] > 0) im_label_gt[I[0], I[1], :] = class_colors[j] ax = fig.add_subplot(m, n, start) start += 1 plt.imshow(im_label_gt) ax.set_title('gt labels') # show predicted label label = label_pred[i, :, :] height = label.shape[0] width = label.shape[1] im_label = np.zeros((height, width, 3), dtype=np.uint8) for j in range(num_classes): I = np.where(label == j) im_label[I[0], I[1], :] = class_colors[j] ax = fig.add_subplot(m, n, start) start += 1 plt.imshow(im_label) ax.set_title('predicted labels') if cfg.TRAIN.VERTEX_REG or cfg.TRAIN.VERTEX_REG_DELTA: # show predicted boxes ax = fig.add_subplot(m, n, start) start += 1 plt.imshow(im) ax.set_title('predicted boxes') for j in range(rois.shape[0]): if rois[j, 0] != i or rois[j, -1] < cfg.TEST.DET_THRESHOLD: continue cls = rois[j, 1] x1 = rois[j, 2] y1 = rois[j, 3] x2 = rois[j, 4] y2 = rois[j, 5] plt.gca().add_patch( plt.Rectangle((x1, y1), x2-x1, y2-y1, fill=False, edgecolor=np.array(class_colors[int(cls)])/255.0, linewidth=3)) cx = (x1 + x2) / 2 cy = (y1 + y2) / 2 plt.plot(cx, cy, 'yo') # show gt poses ax = fig.add_subplot(m, n, start) start += 1 ax.set_title('gt poses') plt.imshow(im) pose_blob = gt_poses[i] for j in range(pose_blob.shape[0]): if pose_blob[j, 0] == 0: continue cls = int(pose_blob[j, 1]) # extract 3D points x3d = np.ones((4, points.shape[1]), dtype=np.float32) x3d[0, :] = points[cls,:,0] x3d[1, :] = points[cls,:,1] x3d[2, :] = points[cls,:,2] # projection RT = np.zeros((3, 4), dtype=np.float32) qt = pose_blob[j, 2:6] T = pose_blob[j, 6:] qt_new = allocentric2egocentric(qt, T) RT[:3, :3] = quat2mat(qt_new) RT[:, 3] = T x2d = np.matmul(intrinsic_matrix, np.matmul(RT, x3d)) x2d[0, :] = np.divide(x2d[0, :], x2d[2, :]) x2d[1, :] = np.divide(x2d[1, :], x2d[2, :]) plt.plot(x2d[0, :], x2d[1, :], '.', color=np.divide(class_colors[cls], 255.0), alpha=0.1) # show predicted poses ax = fig.add_subplot(m, n, start) start += 1 ax.set_title('predicted poses') plt.imshow(im) for j in range(rois.shape[0]): if rois[j, 0] != i: continue cls = int(rois[j, 1]) if cls > 0: print('%s: detection score %s' % (classes[cls], rois[j, -1])) if rois[j, -1] > cfg.TEST.DET_THRESHOLD: # extract 3D points x3d = np.ones((4, points.shape[1]), dtype=np.float32) x3d[0, :] = points[cls,:,0] x3d[1, :] = points[cls,:,1] x3d[2, :] = points[cls,:,2] # projection RT = np.zeros((3, 4), dtype=np.float32) RT[:3, :3] = quat2mat(poses[j, :4]) RT[:, 3] = poses[j, 4:7] x2d = np.matmul(intrinsic_matrix, np.matmul(RT, x3d)) x2d[0, :] = np.divide(x2d[0, :], x2d[2, :]) x2d[1, :] = np.divide(x2d[1, :], x2d[2, :]) plt.plot(x2d[0, :], x2d[1, :], '.', color=np.divide(class_colors[cls], 255.0), alpha=0.1) # show predicted refined poses if cfg.TEST.POSE_REFINE: ax = fig.add_subplot(m, n, start) start += 1 ax.set_title('predicted refined poses') plt.imshow(im) for j in range(rois.shape[0]): if rois[j, 0] != i: continue cls = int(rois[j, 1]) if rois[j, -1] > cfg.TEST.DET_THRESHOLD: # extract 3D points x3d = np.ones((4, points.shape[1]), dtype=np.float32) x3d[0, :] = points[cls,:,0] x3d[1, :] = points[cls,:,1] x3d[2, :] = points[cls,:,2] # projection RT = np.zeros((3, 4), dtype=np.float32) RT[:3, :3] = quat2mat(poses_refined[j, :4]) RT[:, 3] = poses_refined[j, 4:7] x2d = np.matmul(intrinsic_matrix, np.matmul(RT, x3d)) x2d[0, :] = np.divide(x2d[0, :], x2d[2, :]) x2d[1, :] = np.divide(x2d[1, :], x2d[2, :]) plt.plot(x2d[0, :], x2d[1, :], '.', color=np.divide(class_colors[cls], 255.0), alpha=0.1) # show gt vertex targets vertex_target = vertex_targets[i, :, :, :] center = np.zeros((3, height, width), dtype=np.float32) for j in range(1, num_classes): index = np.where(label_gt[:, :, j] > 0) if len(index[0]) > 0: center[:, index[0], index[1]] = vertex_target[3*j:3*j+3, index[0], index[1]] ax = fig.add_subplot(m, n, start) start += 1 plt.imshow(center[0,:,:]) ax.set_title('gt center x') ax = fig.add_subplot(m, n, start) start += 1 plt.imshow(center[1,:,:]) ax.set_title('gt center y') ax = fig.add_subplot(m, n, start) start += 1 plt.imshow(np.exp(center[2,:,:])) ax.set_title('gt z') # show predicted vertex targets vertex_target = vertex_pred[i, :, :, :] center = np.zeros((3, height, width), dtype=np.float32) for j in range(1, num_classes): index = np.where(label == j) if len(index[0]) > 0: center[:, index[0], index[1]] = vertex_target[3*j:3*j+3, index[0], index[1]] ax = fig.add_subplot(m, n, start) start += 1 plt.imshow(center[0,:,:]) ax.set_title('predicted center x') ax = fig.add_subplot(m, n, start) start += 1 plt.imshow(center[1,:,:]) ax.set_title('predicted center y') ax = fig.add_subplot(m, n, start) start += 1 plt.imshow(np.exp(center[2,:,:])) ax.set_title('predicted z') plt.show() ================================================ FILE: lib/fcn/test_imageset.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import torch import torch.nn.functional as F import time import sys, os import cv2 import numpy as np import matplotlib.pyplot as plt from fcn.config import cfg from fcn.render_utils import render_image from fcn.test_common import refine_pose from transforms3d.quaternions import mat2quat, quat2mat, qmult from utils.se3 import * from utils.nms import * from utils.pose_error import re, te def test_image(network, dataset, im_color, im_depth=None, im_index=None): """test on a single image""" # compute image blob im = im_color.astype(np.float32, copy=True) im -= cfg.PIXEL_MEANS height = im.shape[0] width = im.shape[1] im = np.transpose(im / 255.0, (2, 0, 1)) im = im[np.newaxis, :, :, :] K = dataset._intrinsic_matrix K[2, 2] = 1 Kinv = np.linalg.pinv(K) meta_data = np.zeros((1, 18), dtype=np.float32) meta_data[0, 0:9] = K.flatten() meta_data[0, 9:18] = Kinv.flatten() meta_data = torch.from_numpy(meta_data).cuda() if im_depth is not None: depth_tensor = torch.from_numpy(im_depth).cuda().float() else: depth_tensor = None # transfer to GPU inputs = torch.from_numpy(im).cuda() # run network if cfg.TRAIN.VERTEX_REG: if cfg.TRAIN.POSE_REG: out_label, out_vertex, rois, out_pose, out_quaternion = network(inputs, dataset.input_labels, meta_data, \ dataset.input_extents, dataset.input_gt_boxes, dataset.input_poses, dataset.input_points, dataset.input_symmetry) labels = out_label[0] # combine poses rois = rois.detach().cpu().numpy() out_pose = out_pose.detach().cpu().numpy() out_quaternion = out_quaternion.detach().cpu().numpy() num = rois.shape[0] poses = out_pose.copy() for j in range(num): cls = int(rois[j, 1]) if cls >= 0: qt = out_quaternion[j, 4*cls:4*cls+4] qt = qt / np.linalg.norm(qt) # allocentric to egocentric poses[j, 4] *= poses[j, 6] poses[j, 5] *= poses[j, 6] T = poses[j, 4:] poses[j, :4] = allocentric2egocentric(qt, T) # filter out detections index = np.where(rois[:, -1] > cfg.TEST.DET_THRESHOLD)[0] rois = rois[index, :] poses = poses[index, :] # non-maximum suppression within class index = nms(rois, 0.2) rois = rois[index, :] poses = poses[index, :] # optimize depths if cfg.TEST.POSE_REFINE and im_depth is not None: poses_refined = refine_pose(labels, depth_tensor, rois, poses, meta_data, dataset) else: poses_refined = None else: # no pose regression out_label, out_vertex, rois, out_pose = network(inputs, dataset.input_labels, meta_data, \ dataset.input_extents, dataset.input_gt_boxes, dataset.input_poses, dataset.input_points, dataset.input_symmetry) labels = out_label[0] rois = rois.detach().cpu().numpy() out_pose = out_pose.detach().cpu().numpy() poses = out_pose.copy() # filter out detections index = np.where(rois[:, -1] > cfg.TEST.DET_THRESHOLD)[0] rois = rois[index, :] poses = poses[index, :] poses_refined = None # non-maximum suppression within class index = nms(rois, 0.2) rois = rois[index, :] poses = poses[index, :] else: # segmentation only out_label = network(inputs, dataset.input_labels, dataset.input_meta_data, \ dataset.input_extents, dataset.input_gt_boxes, dataset.input_poses, dataset.input_points, dataset.input_symmetry) labels = out_label[0] rois = np.zeros((0, 7), dtype=np.float32) poses = np.zeros((0, 7), dtype=np.float32) poses_refined = None im_pose, im_pose_refined, im_label = render_image(dataset, im_color, rois, poses, poses_refined, labels.cpu().numpy()) if cfg.TEST.VISUALIZE: vis_test(dataset, im, im_depth, labels.cpu().numpy(), rois, poses, poses_refined, im_pose, im_pose_refined, out_vertex) return im_pose, im_pose_refined, im_label, labels.cpu().numpy(), rois, poses, poses_refined def vis_test(dataset, im, im_depth, label, rois, poses, poses_refined, im_pose, im_pose_refine, out_vertex=None, im_index=None): """Visualize a testing results.""" import matplotlib.pyplot as plt num_classes = len(dataset._class_colors_test) classes = dataset._classes_test class_colors = dataset._class_colors_test points = dataset._points_all_test intrinsic_matrix = dataset._intrinsic_matrix height = label.shape[0] width = label.shape[1] if out_vertex is not None: vertex_pred = out_vertex.detach().cpu().numpy() fig = plt.figure() plot = 1 m = 2 n = 3 # show image im = im[0, :, :, :].copy() im = im.transpose((1, 2, 0)) * 255.0 im += cfg.PIXEL_MEANS im = im[:, :, (2, 1, 0)] im = im.astype(np.uint8) ax = fig.add_subplot(m, n, plot) plot += 1 plt.imshow(im) plt.axis('off') ax.set_title('input image') # show predicted label im_label = dataset.labels_to_image(label) ax = fig.add_subplot(m, n, plot) plot += 1 plt.imshow(im_label) plt.axis('off') ax.set_title('predicted labels') if cfg.TRAIN.VERTEX_REG or cfg.TRAIN.VERTEX_REG_DELTA: # show predicted boxes ax = fig.add_subplot(m, n, plot) plot += 1 plt.imshow(im) plt.axis('off') ax.set_title('predicted boxes') for j in range(rois.shape[0]): cls = rois[j, 1] x1 = rois[j, 2] y1 = rois[j, 3] x2 = rois[j, 4] y2 = rois[j, 5] plt.gca().add_patch( plt.Rectangle((x1, y1), x2-x1, y2-y1, fill=False, edgecolor=np.array(class_colors[int(cls)])/255.0, linewidth=3)) cx = (x1 + x2) / 2 cy = (y1 + y2) / 2 plt.plot(cx, cy, 'yo') ''' # show predicted poses if cfg.TRAIN.POSE_REG: ax = fig.add_subplot(m, n, plot) plot += 1 ax.set_title('predicted poses') plt.imshow(im) for j in range(rois.shape[0]): cls = int(rois[j, 1]) print(classes[cls], rois[j, -1]) if cls > 0 and rois[j, -1] > cfg.TEST.DET_THRESHOLD: # extract 3D points x3d = np.ones((4, points.shape[1]), dtype=np.float32) x3d[0, :] = points[cls,:,0] x3d[1, :] = points[cls,:,1] x3d[2, :] = points[cls,:,2] # projection RT = np.zeros((3, 4), dtype=np.float32) RT[:3, :3] = quat2mat(poses[j, :4]) RT[:, 3] = poses[j, 4:7] x2d = np.matmul(intrinsic_matrix, np.matmul(RT, x3d)) x2d[0, :] = np.divide(x2d[0, :], x2d[2, :]) x2d[1, :] = np.divide(x2d[1, :], x2d[2, :]) plt.plot(x2d[0, :], x2d[1, :], '.', color=np.divide(class_colors[cls], 255.0), alpha=0.5) if out_vertex is not None: # show predicted vertex targets vertex_target = vertex_pred[0, :, :, :] center = np.zeros((3, height, width), dtype=np.float32) for j in range(1, dataset._num_classes): index = np.where(label == j) if len(index[0]) > 0: center[0, index[0], index[1]] = vertex_target[3*j, index[0], index[1]] center[1, index[0], index[1]] = vertex_target[3*j+1, index[0], index[1]] center[2, index[0], index[1]] = np.exp(vertex_target[3*j+2, index[0], index[1]]) ax = fig.add_subplot(m, n, plot) plot += 1 plt.imshow(center[0,:,:]) plt.axis('off') ax.set_title('predicted center x') ax = fig.add_subplot(m, n, plot) plot += 1 plt.imshow(center[1,:,:]) plt.axis('off') ax.set_title('predicted center y') ax = fig.add_subplot(m, n, plot) plot += 1 plt.imshow(center[2,:,:]) plt.axis('off') ax.set_title('predicted z') ''' # show depth if im_depth is not None: ax = fig.add_subplot(m, n, plot) plot += 1 plt.imshow(im_depth) plt.axis('off') ax.set_title('input depth') ax = fig.add_subplot(m, n, plot) plot += 1 plt.imshow(im_pose) plt.axis('off') ax.set_title('estimated poses') if cfg.TEST.POSE_REFINE and im_pose_refine is not None and im_depth is not None: ax = fig.add_subplot(m, n, plot) plot += 1 plt.imshow(im_pose_refine) plt.axis('off') ax.set_title('estimated poses refined') if im_index is not None: mng = plt.get_current_fig_manager() mng.resize(*mng.window.maxsize()) plt.show(block=False) plt.pause(1) filename = 'output/images/%06d.png' % im_index fig.savefig(filename) plt.close() else: plt.show() ================================================ FILE: lib/fcn/train.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import torch import torch.nn as nn import time import sys, os import numpy as np import matplotlib.pyplot as plt from fcn.config import cfg from transforms3d.quaternions import mat2quat, quat2mat, qmult from utils.se3 import * from utils.nms import * from utils.pose_error import re, te class AverageMeter(object): """Computes and stores the average and current value""" def __init__(self): self.reset() def reset(self): self.val = 0 self.avg = 0 self.sum = 0 self.count = 0 def update(self, val, n=1): self.val = val self.sum += val * n self.count += n self.avg = self.sum / self.count def __repr__(self): return '{:.3f} ({:.3f})'.format(self.val, self.avg) def loss_cross_entropy(scores, labels): """ scores: a tensor [batch_size, num_classes, height, width] labels: a tensor [batch_size, num_classes, height, width] """ cross_entropy = -torch.sum(labels * scores, dim=1) loss = torch.div(torch.sum(cross_entropy), torch.sum(labels)+1e-10) return loss def smooth_l1_loss(vertex_pred, vertex_targets, vertex_weights, sigma=1.0): sigma_2 = sigma ** 2 vertex_diff = vertex_pred - vertex_targets diff = torch.mul(vertex_weights, vertex_diff) abs_diff = torch.abs(diff) smoothL1_sign = torch.lt(abs_diff, 1. / sigma_2).float().detach() in_loss = torch.pow(diff, 2) * (sigma_2 / 2.) * smoothL1_sign \ + (abs_diff - (0.5 / sigma_2)) * (1. - smoothL1_sign) loss = torch.div( torch.sum(in_loss), torch.sum(vertex_weights) + 1e-10 ) return loss #************************************# # train PoseCNN # #************************************# ''' sample = {'image_color': im_blob, 'im_depth': im_depth, 'label': label_blob, 'mask': mask, 'meta_data': meta_data_blob, 'poses': pose_blob, 'extents': self._extents, 'points': self._point_blob, 'symmetry': self._symmetry, 'gt_boxes': gt_boxes, 'im_info': im_info, 'vertex_targets': vertex_targets, 'vertex_weights': vertex_weights} ''' def train(train_loader, background_loader, network, optimizer, epoch): batch_time = AverageMeter() losses = AverageMeter() epoch_size = len(train_loader) enum_background = enumerate(background_loader) pixel_mean = torch.from_numpy(cfg.PIXEL_MEANS.transpose(2, 0, 1) / 255.0).float() # switch to train mode network.train() for i, sample in enumerate(train_loader): end = time.time() # prepare data inputs = sample['image_color'].cuda() im_info = sample['im_info'] mask = sample['mask'].cuda() labels = sample['label'].cuda() meta_data = sample['meta_data'].cuda() extents = sample['extents'][0, :, :].repeat(cfg.TRAIN.GPUNUM, 1, 1).cuda() gt_boxes = sample['gt_boxes'].cuda() poses = sample['poses'].cuda() points = sample['points'][0, :, :, :].repeat(cfg.TRAIN.GPUNUM, 1, 1, 1).cuda() symmetry = sample['symmetry'][0, :].repeat(cfg.TRAIN.GPUNUM, 1).cuda() if cfg.TRAIN.VERTEX_REG: vertex_targets = sample['vertex_targets'].cuda() vertex_weights = sample['vertex_weights'].cuda() else: vertex_targets = [] vertex_weights = [] # add background try: _, background = next(enum_background) except: enum_background = enumerate(background_loader) _, background = next(enum_background) if inputs.size(0) != background['background_color'].size(0): enum_background = enumerate(background_loader) _, background = next(enum_background) background_color = background['background_color'].cuda() for j in range(inputs.size(0)): is_syn = im_info[j, -1] if is_syn or np.random.rand(1) > 0.5: inputs[j] = mask[j] * inputs[j] + (1 - mask[j]) * background_color[j] # visualization if cfg.TRAIN.VISUALIZE: _vis_minibatch(inputs, background, labels, vertex_targets, sample, train_loader.dataset.class_colors) # compute output if cfg.TRAIN.VERTEX_REG: if cfg.TRAIN.POSE_REG: out_logsoftmax, out_weight, out_vertex, out_logsoftmax_box, \ bbox_labels, bbox_pred, bbox_targets, bbox_inside_weights, loss_pose_tensor, poses_weight \ = network(inputs, labels, meta_data, extents, gt_boxes, poses, points, symmetry) loss_label = loss_cross_entropy(out_logsoftmax, out_weight) loss_vertex = cfg.TRAIN.VERTEX_W * smooth_l1_loss(out_vertex, vertex_targets, vertex_weights) loss_box = loss_cross_entropy(out_logsoftmax_box, bbox_labels) loss_location = smooth_l1_loss(bbox_pred, bbox_targets, bbox_inside_weights) loss_pose = torch.mean(loss_pose_tensor) loss = loss_label + loss_vertex + loss_box + loss_location + loss_pose else: out_logsoftmax, out_weight, out_vertex, out_logsoftmax_box, \ bbox_labels, bbox_pred, bbox_targets, bbox_inside_weights \ = network(inputs, labels, meta_data, extents, gt_boxes, poses, points, symmetry) loss_label = loss_cross_entropy(out_logsoftmax, out_weight) loss_vertex = cfg.TRAIN.VERTEX_W * smooth_l1_loss(out_vertex, vertex_targets, vertex_weights) loss_box = loss_cross_entropy(out_logsoftmax_box, bbox_labels) loss_location = smooth_l1_loss(bbox_pred, bbox_targets, bbox_inside_weights) loss = loss_label + loss_vertex + loss_box + loss_location else: out_logsoftmax, out_weight = network(inputs, labels, meta_data, extents, gt_boxes, poses, points, symmetry) loss = loss_cross_entropy(out_logsoftmax, out_weight) # record loss losses.update(loss.data, inputs.size(0)) # compute gradient and do optimization step optimizer.zero_grad() loss.backward() optimizer.step() # measure elapsed time batch_time.update(time.time() - end) if cfg.TRAIN.VERTEX_REG: if cfg.TRAIN.POSE_REG: num_bg = torch.sum(bbox_labels[:, 0]) num_fg = torch.sum(torch.sum(bbox_labels[:, 1:], dim=1)) num_fg_pose = torch.sum(torch.sum(poses_weight[:, 4:], dim=1)) / 4 print('[%d/%d][%d/%d], %.4f, label %.4f, center %.4f, box %.4f (%03d, %03d), loc %.4f, pose %.4f (%03d), lr %.6f, time %.2f' \ % (epoch, cfg.epochs, i, epoch_size, loss.data, loss_label.data, loss_vertex.data, loss_box.data, num_fg.data, num_bg.data, \ loss_location.data, loss_pose.data, num_fg_pose, optimizer.param_groups[0]['lr'], batch_time.val)) else: num_bg = torch.sum(bbox_labels[:, 0]) num_fg = torch.sum(torch.sum(bbox_labels[:, 1:], dim=1)) print('[%d/%d][%d/%d], %.4f, label %.4f, center %.4f, box %.4f (%03d, %03d), loc %.4f, lr %.6f, time %.2f' \ % (epoch, cfg.epochs, i, epoch_size, loss.data, loss_label.data, loss_vertex.data, loss_box.data, num_fg.data, num_bg.data, \ loss_location.data, optimizer.param_groups[0]['lr'], batch_time.val)) else: print('[%d/%d][%d/%d], loss %.4f, lr %.6f, time %.2f' \ % (epoch, cfg.epochs, i, epoch_size, loss, optimizer.param_groups[0]['lr'], batch_time.val)) cfg.TRAIN.ITERS += 1 def _get_bb3D(extent): bb = np.zeros((3, 8), dtype=np.float32) xHalf = extent[0] * 0.5 yHalf = extent[1] * 0.5 zHalf = extent[2] * 0.5 bb[:, 0] = [xHalf, yHalf, zHalf] bb[:, 1] = [-xHalf, yHalf, zHalf] bb[:, 2] = [xHalf, -yHalf, zHalf] bb[:, 3] = [-xHalf, -yHalf, zHalf] bb[:, 4] = [xHalf, yHalf, -zHalf] bb[:, 5] = [-xHalf, yHalf, -zHalf] bb[:, 6] = [xHalf, -yHalf, -zHalf] bb[:, 7] = [-xHalf, -yHalf, -zHalf] return bb def _vis_minibatch(inputs, background, labels, vertex_targets, sample, class_colors): """Visualize a mini-batch for debugging.""" import matplotlib.pyplot as plt im_blob = inputs.cpu().numpy() label_blob = labels.cpu().numpy() gt_poses = sample['poses'].numpy() meta_data_blob = sample['meta_data'].numpy() gt_boxes = sample['gt_boxes'].numpy() extents = sample['extents'][0, :, :].numpy() background_color = background['background_color'].numpy() if cfg.TRAIN.VERTEX_REG: vertex_target_blob = vertex_targets.cpu().numpy() if cfg.INPUT == 'COLOR': m = 3 n = 3 else: m = 3 n = 4 for i in range(im_blob.shape[0]): fig = plt.figure() start = 1 metadata = meta_data_blob[i, :] intrinsic_matrix = metadata[:9].reshape((3,3)) # show image if cfg.INPUT == 'COLOR' or cfg.INPUT == 'RGBD': if cfg.INPUT == 'COLOR': im = im_blob[i, :, :, :].copy() else: im = im_blob[i, :3, :, :].copy() im = im.transpose((1, 2, 0)) * 255.0 im += cfg.PIXEL_MEANS im = im[:, :, (2, 1, 0)] im = np.clip(im, 0, 255) im = im.astype(np.uint8) ax = fig.add_subplot(m, n, 1) plt.imshow(im) ax.set_title('color') start += 1 if cfg.INPUT == 'DEPTH' or cfg.INPUT == 'RGBD': if cfg.INPUT == 'DEPTH': im_depth = im_blob[i, :, :, :].copy() else: im_depth = im_blob[i, 3:6, :, :].copy() ax = fig.add_subplot(m, n, start) plt.imshow(im_depth[0, :, :]) ax.set_title('depth x') start += 1 ax = fig.add_subplot(m, n, start) plt.imshow(im_depth[1, :, :]) ax.set_title('depth y') start += 1 ax = fig.add_subplot(m, n, start) plt.imshow(im_depth[2, :, :]) ax.set_title('depth z') start += 1 if cfg.INPUT == 'RGBD': ax = fig.add_subplot(m, n, start) mask = im_blob[i, 6, :, :].copy() plt.imshow(mask) ax.set_title('depth mask') start += 1 # project the 3D box to image pose_blob = gt_poses[i] for j in range(pose_blob.shape[0]): if pose_blob[j, 0] == 0: continue class_id = int(pose_blob[j, 1]) bb3d = _get_bb3D(extents[class_id, :]) x3d = np.ones((4, 8), dtype=np.float32) x3d[0:3, :] = bb3d # projection RT = np.zeros((3, 4), dtype=np.float32) # allocentric to egocentric T = pose_blob[j, 6:] qt = allocentric2egocentric(pose_blob[j, 2:6], T) RT[:3, :3] = quat2mat(qt) # RT[:3, :3] = quat2mat(pose_blob[j, 2:6]) RT[:, 3] = pose_blob[j, 6:] x2d = np.matmul(intrinsic_matrix, np.matmul(RT, x3d)) x2d[0, :] = np.divide(x2d[0, :], x2d[2, :]) x2d[1, :] = np.divide(x2d[1, :], x2d[2, :]) x1 = np.min(x2d[0, :]) x2 = np.max(x2d[0, :]) y1 = np.min(x2d[1, :]) y2 = np.max(x2d[1, :]) plt.gca().add_patch(plt.Rectangle((x1, y1), x2-x1, y2-y1, fill=False, edgecolor='g', linewidth=3, clip_on=False)) if cfg.INPUT == 'COLOR' or cfg.INPUT == 'RGBD': im_background = background_color[i] im_background = im_background.transpose((1, 2, 0)) * 255.0 im_background += cfg.PIXEL_MEANS im_background = im_background[:, :, (2, 1, 0)] im_background = np.clip(im_background, 0, 255) im_background = im_background.astype(np.uint8) ax = fig.add_subplot(m, n, start) plt.imshow(im_background) ax.set_title('background') start += 1 # show gt boxes ax = fig.add_subplot(m, n, start) start += 1 if cfg.INPUT == 'COLOR' or cfg.INPUT == 'RGBD': plt.imshow(im) else: plt.imshow(im_depth[2, :, :]) ax.set_title('gt boxes') boxes = gt_boxes[i] for j in range(boxes.shape[0]): if boxes[j, 4] == 0: continue x1 = boxes[j, 0] y1 = boxes[j, 1] x2 = boxes[j, 2] y2 = boxes[j, 3] plt.gca().add_patch( plt.Rectangle((x1, y1), x2-x1, y2-y1, fill=False, edgecolor='g', linewidth=3, clip_on=False)) # show label label = label_blob[i, :, :, :] label = label.transpose((1, 2, 0)) height = label.shape[0] width = label.shape[1] num_classes = label.shape[2] im_label = np.zeros((height, width, 3), dtype=np.uint8) for j in range(num_classes): I = np.where(label[:, :, j] > 0) im_label[I[0], I[1], :] = class_colors[j] ax = fig.add_subplot(m, n, start) start += 1 plt.imshow(im_label) ax.set_title('label') # show vertex targets if cfg.TRAIN.VERTEX_REG: vertex_target = vertex_target_blob[i, :, :, :] center = np.zeros((3, height, width), dtype=np.float32) for j in range(1, num_classes): index = np.where(label[:, :, j] > 0) if len(index[0]) > 0: center[0, index[0], index[1]] = vertex_target[3*j, index[0], index[1]] center[1, index[0], index[1]] = vertex_target[3*j+1, index[0], index[1]] center[2, index[0], index[1]] = np.exp(vertex_target[3*j+2, index[0], index[1]]) ax = fig.add_subplot(m, n, start) start += 1 plt.imshow(center[0,:,:]) ax.set_title('center x') ax = fig.add_subplot(m, n, start) start += 1 plt.imshow(center[1,:,:]) ax.set_title('center y') ax = fig.add_subplot(m, n, start) start += 1 plt.imshow(center[2,:,:]) ax.set_title('z') plt.show() ================================================ FILE: lib/layers/ROIAlign_cuda.cu ================================================ // Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. #include #include #include #include #include // TODO make it in a common file #define CUDA_1D_KERNEL_LOOP(i, n) \ for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \ i += blockDim.x * gridDim.x) template __device__ T bilinear_interpolate(const T* bottom_data, const int height, const int width, T y, T x, const int index /* index for debug only*/) { // deal with cases that inverse elements are out of feature map boundary if (y < -1.0 || y > height || x < -1.0 || x > width) { //empty /* if (x < -1.0 && y < -1.0) return bottom_data[0]; if (x < -1.0 && y < height) { int yy = (int)y; return bottom_data[yy * width]; } if (x < -1.0 && y > height) return bottom_data[(height - 1) * width]; if (x < width && y > height) { int xx = (int)x; return bottom_data[(height - 1) * width + xx]; } if (x > width && y > height) return bottom_data[(height - 1) * width + width - 1]; if (x > width && y < -1.0) return bottom_data[width - 1]; if (x > width && y < height) { int yy = (int)y; return bottom_data[yy * width + width - 1]; } if (x < width && y < -1.0) { int xx = (int)x; return bottom_data[xx]; } */ return 0; } if (y <= 0) y = 0; if (x <= 0) x = 0; int y_low = (int) y; int x_low = (int) x; int y_high; int x_high; if (y_low >= height - 1) { y_high = y_low = height - 1; y = (T) y_low; } else { y_high = y_low + 1; } if (x_low >= width - 1) { x_high = x_low = width - 1; x = (T) x_low; } else { x_high = x_low + 1; } T ly = y - y_low; T lx = x - x_low; T hy = 1. - ly, hx = 1. - lx; // do bilinear interpolation T v1 = bottom_data[y_low * width + x_low]; T v2 = bottom_data[y_low * width + x_high]; T v3 = bottom_data[y_high * width + x_low]; T v4 = bottom_data[y_high * width + x_high]; T w1 = hy * hx, w2 = hy * lx, w3 = ly * hx, w4 = ly * lx; T val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); return val; } template __global__ void RoIAlignForward(const int nthreads, const T* bottom_data, const T spatial_scale, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, const int sampling_ratio, const T* bottom_rois, T* top_data) { CUDA_1D_KERNEL_LOOP(index, nthreads) { // (n, c, ph, pw) is an element in the pooled output int pw = index % pooled_width; int ph = (index / pooled_width) % pooled_height; int c = (index / pooled_width / pooled_height) % channels; int n = index / pooled_width / pooled_height / channels; const T* offset_bottom_rois = bottom_rois + n * 5; int roi_batch_ind = offset_bottom_rois[0]; // Do not using rounding; this implementation detail is critical T roi_start_w = offset_bottom_rois[1] * spatial_scale; T roi_start_h = offset_bottom_rois[2] * spatial_scale; T roi_end_w = offset_bottom_rois[3] * spatial_scale; T roi_end_h = offset_bottom_rois[4] * spatial_scale; // T roi_start_w = round(offset_bottom_rois[1] * spatial_scale); // T roi_start_h = round(offset_bottom_rois[2] * spatial_scale); // T roi_end_w = round(offset_bottom_rois[3] * spatial_scale); // T roi_end_h = round(offset_bottom_rois[4] * spatial_scale); // Force malformed ROIs to be 1x1 T roi_width = max(roi_end_w - roi_start_w, (T)1.); T roi_height = max(roi_end_h - roi_start_h, (T)1.); T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); const T* offset_bottom_data = bottom_data + (roi_batch_ind * channels + c) * height * width; // We use roi_bin_grid to sample the grid and mimic integral int roi_bin_grid_h = (sampling_ratio > 0) ? sampling_ratio : ceil(roi_height / pooled_height); // e.g., = 2 int roi_bin_grid_w = (sampling_ratio > 0) ? sampling_ratio : ceil(roi_width / pooled_width); // We do average (integral) pooling inside a bin const T count = roi_bin_grid_h * roi_bin_grid_w; // e.g. = 4 T output_val = 0.; for (int iy = 0; iy < roi_bin_grid_h; iy ++) // e.g., iy = 0, 1 { const T y = roi_start_h + ph * bin_size_h + static_cast(iy + .5f) * bin_size_h / static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 for (int ix = 0; ix < roi_bin_grid_w; ix ++) { const T x = roi_start_w + pw * bin_size_w + static_cast(ix + .5f) * bin_size_w / static_cast(roi_bin_grid_w); T val = bilinear_interpolate(offset_bottom_data, height, width, y, x, index); output_val += val; } } output_val /= count; top_data[index] = output_val; } } template __device__ void bilinear_interpolate_gradient( const int height, const int width, T y, T x, T & w1, T & w2, T & w3, T & w4, int & x_low, int & x_high, int & y_low, int & y_high, const int index /* index for debug only*/) { // deal with cases that inverse elements are out of feature map boundary if (y < -1.0 || y > height || x < -1.0 || x > width) { //empty w1 = w2 = w3 = w4 = 0.; x_low = x_high = y_low = y_high = -1; return; } if (y <= 0) y = 0; if (x <= 0) x = 0; y_low = (int) y; x_low = (int) x; if (y_low >= height - 1) { y_high = y_low = height - 1; y = (T) y_low; } else { y_high = y_low + 1; } if (x_low >= width - 1) { x_high = x_low = width - 1; x = (T) x_low; } else { x_high = x_low + 1; } T ly = y - y_low; T lx = x - x_low; T hy = 1. - ly, hx = 1. - lx; // reference in forward // T v1 = bottom_data[y_low * width + x_low]; // T v2 = bottom_data[y_low * width + x_high]; // T v3 = bottom_data[y_high * width + x_low]; // T v4 = bottom_data[y_high * width + x_high]; // T val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); w1 = hy * hx, w2 = hy * lx, w3 = ly * hx, w4 = ly * lx; return; } template __global__ void RoIAlignBackwardFeature(const int nthreads, const T* top_diff, const int num_rois, const T spatial_scale, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, const int sampling_ratio, T* bottom_diff, const T* bottom_rois) { CUDA_1D_KERNEL_LOOP(index, nthreads) { // (n, c, ph, pw) is an element in the pooled output int pw = index % pooled_width; int ph = (index / pooled_width) % pooled_height; int c = (index / pooled_width / pooled_height) % channels; int n = index / pooled_width / pooled_height / channels; const T* offset_bottom_rois = bottom_rois + n * 5; int roi_batch_ind = offset_bottom_rois[0]; // Do not using rounding; this implementation detail is critical T roi_start_w = offset_bottom_rois[1] * spatial_scale; T roi_start_h = offset_bottom_rois[2] * spatial_scale; T roi_end_w = offset_bottom_rois[3] * spatial_scale; T roi_end_h = offset_bottom_rois[4] * spatial_scale; // T roi_start_w = round(offset_bottom_rois[1] * spatial_scale); // T roi_start_h = round(offset_bottom_rois[2] * spatial_scale); // T roi_end_w = round(offset_bottom_rois[3] * spatial_scale); // T roi_end_h = round(offset_bottom_rois[4] * spatial_scale); // Force malformed ROIs to be 1x1 T roi_width = max(roi_end_w - roi_start_w, (T)1.); T roi_height = max(roi_end_h - roi_start_h, (T)1.); T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); T* offset_bottom_diff = bottom_diff + (roi_batch_ind * channels + c) * height * width; int top_offset = (n * channels + c) * pooled_height * pooled_width; const T* offset_top_diff = top_diff + top_offset; const T top_diff_this_bin = offset_top_diff[ph * pooled_width + pw]; // We use roi_bin_grid to sample the grid and mimic integral int roi_bin_grid_h = (sampling_ratio > 0) ? sampling_ratio : ceil(roi_height / pooled_height); // e.g., = 2 int roi_bin_grid_w = (sampling_ratio > 0) ? sampling_ratio : ceil(roi_width / pooled_width); // We do average (integral) pooling inside a bin const T count = roi_bin_grid_h * roi_bin_grid_w; // e.g. = 4 for (int iy = 0; iy < roi_bin_grid_h; iy ++) // e.g., iy = 0, 1 { const T y = roi_start_h + ph * bin_size_h + static_cast(iy + .5f) * bin_size_h / static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 for (int ix = 0; ix < roi_bin_grid_w; ix ++) { const T x = roi_start_w + pw * bin_size_w + static_cast(ix + .5f) * bin_size_w / static_cast(roi_bin_grid_w); T w1, w2, w3, w4; int x_low, x_high, y_low, y_high; bilinear_interpolate_gradient(height, width, y, x, w1, w2, w3, w4, x_low, x_high, y_low, y_high, index); T g1 = top_diff_this_bin * w1 / count; T g2 = top_diff_this_bin * w2 / count; T g3 = top_diff_this_bin * w3 / count; T g4 = top_diff_this_bin * w4 / count; if (x_low >= 0 && x_high >= 0 && y_low >= 0 && y_high >= 0) { atomicAdd(offset_bottom_diff + y_low * width + x_low, static_cast(g1)); atomicAdd(offset_bottom_diff + y_low * width + x_high, static_cast(g2)); atomicAdd(offset_bottom_diff + y_high * width + x_low, static_cast(g3)); atomicAdd(offset_bottom_diff + y_high * width + x_high, static_cast(g4)); } // if } // ix } // iy } // CUDA_1D_KERNEL_LOOP } // RoIAlignBackward at::Tensor ROIAlign_forward_cuda(const at::Tensor& input, const at::Tensor& rois, const float spatial_scale, const int pooled_height, const int pooled_width, const int sampling_ratio) { AT_ASSERTM(input.type().is_cuda(), "input must be a CUDA tensor"); AT_ASSERTM(rois.type().is_cuda(), "rois must be a CUDA tensor"); auto num_rois = rois.size(0); auto channels = input.size(1); auto height = input.size(2); auto width = input.size(3); auto output = at::empty({num_rois, channels, pooled_height, pooled_width}, input.options()); auto output_size = num_rois * pooled_height * pooled_width * channels; cudaStream_t stream = at::cuda::getCurrentCUDAStream(); dim3 grid(std::min(THCCeilDiv(output_size, 512L), 4096L)); dim3 block(512); if (output.numel() == 0) { THCudaCheck(cudaGetLastError()); return output; } AT_DISPATCH_FLOATING_TYPES(input.type(), "ROIAlign_forward", [&] { RoIAlignForward<<>>( output_size, input.contiguous().data(), spatial_scale, channels, height, width, pooled_height, pooled_width, sampling_ratio, rois.contiguous().data(), output.data()); }); THCudaCheck(cudaGetLastError()); return output; } // TODO remove the dependency on input and use instead its sizes -> save memory at::Tensor ROIAlign_backward_cuda(const at::Tensor& grad, const at::Tensor& rois, const float spatial_scale, const int pooled_height, const int pooled_width, const int batch_size, const int channels, const int height, const int width, const int sampling_ratio) { AT_ASSERTM(grad.type().is_cuda(), "grad must be a CUDA tensor"); AT_ASSERTM(rois.type().is_cuda(), "rois must be a CUDA tensor"); auto num_rois = rois.size(0); auto grad_input = at::zeros({batch_size, channels, height, width}, grad.options()); cudaStream_t stream = at::cuda::getCurrentCUDAStream(); dim3 grid(std::min(THCCeilDiv(grad.numel(), 512L), 4096L)); dim3 block(512); // handle possibly empty gradients if (grad.numel() == 0) { THCudaCheck(cudaGetLastError()); return grad_input; } AT_DISPATCH_FLOATING_TYPES(grad.type(), "ROIAlign_backward", [&] { RoIAlignBackwardFeature<<>>( grad.numel(), grad.contiguous().data(), num_rois, spatial_scale, channels, height, width, pooled_height, pooled_width, sampling_ratio, grad_input.data(), rois.contiguous().data()); }); THCudaCheck(cudaGetLastError()); return grad_input; } ================================================ FILE: lib/layers/__init__.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md ================================================ FILE: lib/layers/backproject_kernel.cu ================================================ // Copyright (c) 2020 NVIDIA Corporation. All rights reserved. // This work is licensed under the NVIDIA Source Code License - Non-commercial. Full // text can be found in LICENSE.md #include #include #include #include #include #define CUDA_1D_KERNEL_LOOP(i, n) \ for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \ i += blockDim.x * gridDim.x) template __global__ void BackprojectForward(const int nthreads, const int width, const float fx, const float fy, const float px, const float py, const Dtype* depth, Dtype* top_data) { CUDA_1D_KERNEL_LOOP(index, nthreads) { int x = index % width; int y = index / width; Dtype d = depth[index]; top_data[3 * index + 0] = d * (x - px) / fx; top_data[3 * index + 1] = d * (y - py) / fy; top_data[3 * index + 2] = d; } } std::vector backproject_cuda_forward( float fx, float fy, float px, float py, at::Tensor depth) { // run kernels cudaError_t err; const int kThreadsPerBlock = 512; int output_size; int height = depth.size(0); int width = depth.size(1); auto top_data = at::zeros({height, width, 3}, depth.options()); // compute the losses and gradients output_size = height * width; BackprojectForward<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>( output_size, width, fx, fy, px, py, depth.data(), top_data.data()); cudaDeviceSynchronize(); err = cudaGetLastError(); if(cudaSuccess != err) { fprintf( stderr, "cudaCheckError() failed: %s\n", cudaGetErrorString( err ) ); exit( -1 ); } return {top_data}; } ================================================ FILE: lib/layers/hard_label.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import math from torch import nn from torch.autograd import Function import torch import posecnn_cuda class HardLabelFunction(Function): @staticmethod def forward(ctx, prob, label, rand, threshold, sample_percentage): outputs = posecnn_cuda.hard_label_forward(threshold, sample_percentage, prob, label, rand) top_data = outputs[0] return top_data @staticmethod def backward(ctx, top_diff): outputs = posecnn_cuda.hard_label_backward(top_diff) d_prob, d_label = outputs return d_prob, d_label, None, None, None class HardLabel(nn.Module): def __init__(self, threshold, sample_percentage): super(HardLabel, self).__init__() self.threshold = threshold self.sample_percentage = sample_percentage def forward(self, prob, label, rand): return HardLabelFunction.apply(prob, label, rand, self.threshold, self.sample_percentage) ================================================ FILE: lib/layers/hard_label_kernel.cu ================================================ // Copyright (c) 2020 NVIDIA Corporation. All rights reserved. // This work is licensed under the NVIDIA Source Code License - Non-commercial. Full // text can be found in LICENSE.md #include #include #include #include #include #define CUDA_1D_KERNEL_LOOP(i, n) \ for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \ i += blockDim.x * gridDim.x) template __global__ void HardLabelForward(const int nthreads, const float threshold, const float sample_percentage, const Dtype* bottom_prob, const Dtype* bottom_label, const Dtype* bottom_rand, Dtype* top_data) { CUDA_1D_KERNEL_LOOP(index, nthreads) { if (bottom_label[index] > 0 && (bottom_prob[index] < threshold || bottom_rand[index] < sample_percentage)) top_data[index] = 1.0; } } std::vector hard_label_cuda_forward( float threshold, float sample_percentage, at::Tensor bottom_prob, at::Tensor bottom_label, at::Tensor bottom_rand) { // run kernels const int kThreadsPerBlock = 1024; int output_size; if (bottom_prob.dim() == 4) output_size = bottom_prob.size(0) * bottom_prob.size(1) * bottom_prob.size(2) * bottom_prob.size(3); else output_size = bottom_prob.size(0) * bottom_prob.size(1); auto top_data = at::zeros(bottom_prob.sizes(), bottom_prob.options()); AT_DISPATCH_FLOATING_TYPES(bottom_prob.type(), "hard_label_forward_cuda", ([&] { // compute the losses and gradients HardLabelForward<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>( output_size, threshold, sample_percentage, bottom_prob.data(), bottom_label.data(), bottom_rand.data(), top_data.data()); })); return {top_data}; } std::vector hard_label_cuda_backward( at::Tensor top_diff) { auto grad_prob = at::zeros(top_diff.sizes(), top_diff.options()); auto grad_label = at::zeros(top_diff.sizes(), top_diff.options()); return {grad_prob, grad_label}; } ================================================ FILE: lib/layers/hough_voting.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import math from torch import nn from torch.autograd import Function import torch import posecnn_cuda class HoughVotingFunction(Function): @staticmethod def forward(ctx, label, vertex, meta_data, extents, is_train, skip_pixels, \ label_threshold, inlier_threshold, voting_threshold, per_threshold): outputs = posecnn_cuda.hough_voting_forward(label, vertex, meta_data, extents, is_train, skip_pixels, \ label_threshold, inlier_threshold, voting_threshold, per_threshold) top_box = outputs[0] top_pose = outputs[1] return top_box, top_pose @staticmethod def backward(ctx, top_diff_box, top_diff_pose): return None, None, None, None, None, None, None, None, None, None class HoughVoting(nn.Module): def __init__(self, is_train=0, skip_pixels=10, label_threshold=100, inlier_threshold=0.9, voting_threshold=-1, per_threshold=0.01): super(HoughVoting, self).__init__() self.is_train = is_train self.skip_pixels = skip_pixels self.label_threshold = label_threshold self.inlier_threshold = inlier_threshold self.voting_threshold = voting_threshold self.per_threshold = per_threshold def forward(self, label, vertex, meta_data, extents): return HoughVotingFunction.apply(label, vertex, meta_data, extents, self.is_train, self.skip_pixels, \ self.label_threshold, self.inlier_threshold, self.voting_threshold, self.per_threshold) ================================================ FILE: lib/layers/hough_voting_kernel.cu ================================================ // Copyright (c) 2020 NVIDIA Corporation. All rights reserved. // This work is licensed under the NVIDIA Source Code License - Non-commercial. Full // text can be found in LICENSE.md #include #include #include #include #include #include #include #include #include #define VERTEX_CHANNELS 3 #define MAX_ROI 128 #define CUDA_1D_KERNEL_LOOP(i, n) \ for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \ i += blockDim.x * gridDim.x) __device__ inline float angle_distance(int cx, int cy, int x, int y, float u, float v) { float dx = cx - x; float dy = cy - y; float n1 = sqrt(u * u + v * v); float n2 = sqrt(dx * dx + dy * dy); float dot = u * dx + v * dy; float distance = dot / (n1 * n2); return distance; } __device__ inline float angle_distance_label(int cx, int cy, int x, int y, float u, float v, int cls, const int height, const int width, const int* labelmap) { float dx = cx - x; float dy = cy - y; float n1 = sqrt(u * u + v * v); float n2 = sqrt(dx * dx + dy * dy); float dot = u * dx + v * dy; float distance = dot / (n1 * n2); int num = 10; int count = 0; for (int i = 1; i <= num; i++) { float step = float(i) / float(num); int px = int(x + step * dx); int py = int(y + step * dy); if (px >= 0 && px < width && py >= 0 && py < height) { if (labelmap[py * width + px] == cls) count++; } } if ((float)count / float(num) < 0.5) distance = 0; return distance; } __device__ inline void project_box(int cls, const float* extents, const float* meta_data, float distance, float factor, float* threshold) { float xHalf = extents[cls * 3 + 0] * 0.5; float yHalf = extents[cls * 3 + 1] * 0.5; float zHalf = extents[cls * 3 + 2] * 0.5; float bb3D[24]; bb3D[0] = xHalf; bb3D[1] = yHalf; bb3D[2] = zHalf + distance; bb3D[3] = -xHalf; bb3D[4] = yHalf; bb3D[5] = zHalf + distance; bb3D[6] = xHalf; bb3D[7] = -yHalf; bb3D[8] = zHalf + distance; bb3D[9] = -xHalf; bb3D[10] = -yHalf; bb3D[11] = zHalf + distance; bb3D[12] = xHalf; bb3D[13] = yHalf; bb3D[14] = -zHalf + distance; bb3D[15] = -xHalf; bb3D[16] = yHalf; bb3D[17] = -zHalf + distance; bb3D[18] = xHalf; bb3D[19] = -yHalf; bb3D[20] = -zHalf + distance; bb3D[21] = -xHalf; bb3D[22] = -yHalf; bb3D[23] = -zHalf + distance; float fx = meta_data[0]; float fy = meta_data[4]; float px = meta_data[2]; float py = meta_data[5]; float minX = 1e8; float maxX = -1e8; float minY = 1e8; float maxY = -1e8; for (int i = 0; i < 8; i++) { float x = fx * (bb3D[i * 3] / bb3D[i * 3 + 2]) + px; float y = fy * (bb3D[i * 3 + 1] / bb3D[i * 3 + 2]) + py; minX = fmin(minX, x); minY = fmin(minY, y); maxX = fmax(maxX, x); maxY = fmax(maxY, y); } float width = maxX - minX + 1; float height = maxY - minY + 1; *threshold = fmax(width, height) * factor; } __global__ void compute_arrays_kernel(const int nthreads, const int* labelmap, int* arrays, int* array_size, const int height, const int width) { CUDA_1D_KERNEL_LOOP(index, nthreads) { int cls = labelmap[index]; if (cls > 0) { int size = atomicAdd(array_size + cls, 1); int offset = cls * height * width + size; arrays[offset] = index; } } } __global__ void compute_hough_kernel(const int nthreads, float* hough_space, float* hough_data, const int* labelmap, const float* vertmap, const float* extents, const float* meta_data, int* arrays, int* array_size, int* class_indexes, const int height, const int width, const int num_classes, const int count, const float inlierThreshold, const int skip_pixels) { CUDA_1D_KERNEL_LOOP(index, nthreads) { // (cls, cx, cy) is an element in the hough space int ind = index / (height * width); int cls = class_indexes[ind]; int n = index % (height * width); int cx = n % width; int cy = n / width; int size = array_size[cls]; float distance = 0; float threshold; for (int i = 0; i < size; i += skip_pixels) { int offset = cls * height * width + i; int location = arrays[offset]; int x = location % width; int y = location / width; // read the direction offset = VERTEX_CHANNELS * cls * height * width + y * width + x; float u = vertmap[offset]; offset = VERTEX_CHANNELS * cls * height * width + height * width + y * width + x; float v = vertmap[offset]; offset = VERTEX_CHANNELS * cls * height * width + 2 * height * width + y * width + x; float d = exp(vertmap[offset]); // vote if (angle_distance_label(cx, cy, x, y, u, v, cls, height, width, labelmap) > inlierThreshold) { project_box(cls, extents, meta_data, d, 0.6, &threshold); float dx = fabsf(x - cx); float dy = fabsf(y - cy); if (dx < threshold && dy < threshold) { hough_space[index]++; distance += d; } } } if (hough_space[index] > 0) { distance /= hough_space[index]; float bb_width = -1; float bb_height = -1; for (int i = 0; i < size; i += skip_pixels) { int offset = cls * height * width + i; int location = arrays[offset]; int x = location % width; int y = location / width; // read the direction offset = VERTEX_CHANNELS * cls * height * width + y * width + x; float u = vertmap[offset]; offset = VERTEX_CHANNELS * cls * height * width + height * width + y * width + x; float v = vertmap[offset]; // vote if (angle_distance_label(cx, cy, x, y, u, v, cls, height, width, labelmap) > inlierThreshold) { project_box(cls, extents, meta_data, distance, 0.6, &threshold); float dx = fabsf(x - cx); float dy = fabsf(y - cy); if (dx > bb_width && dx < threshold && dy < threshold) bb_width = dx; if (dy > bb_height && dx < threshold && dy < threshold) bb_height = dy; } } int offset = ind * height * width * 3 + 3 * (cy * width + cx); hough_data[offset] = distance; hough_data[offset + 1] = 2 * bb_height; hough_data[offset + 2] = 2 * bb_width; } } } __global__ void compute_max_indexes_kernel(const int nthreads, int* max_indexes, int index_size, int* num_max, float* hough_space, float* hough_data, int height, int width, float threshold, float perThreshold, const int is_train) { CUDA_1D_KERNEL_LOOP(index, nthreads) { // (ind, cx, cy) is an element in the hough space int ind = index / (height * width); int n = index % (height * width); int cx = n % width; int cy = n / width; int kernel_size = 3; int offset = ind * height * width * 3 + 3 * (cy * width + cx); float bb_height = hough_data[offset + 1]; float bb_width = hough_data[offset + 2]; if (hough_space[index] > threshold && bb_height > 0 && bb_width > 0) { // check if the location is local maximum int flag = 0; for (int x = cx - kernel_size; x <= cx + kernel_size; x++) { for (int y = cy - kernel_size; y <= cy + kernel_size; y++) { if (x >= 0 && x < width && y >= 0 && y < height) { if (hough_space[ind * height * width + y * width + x] > hough_space[index]) { flag = 1; break; } if (is_train == 0 && hough_space[ind * height * width + y * width + x] == hough_space[index]) { if (ind * height * width + y * width + x > index) { flag = 1; break; } } } } // check the percentage of voting if (hough_space[index] / (bb_height * bb_width) < perThreshold) flag = 1; } if (flag == 0) { // add the location to max_indexes int max_index = atomicAdd(num_max, 1); if (max_index < index_size) max_indexes[max_index] = index; } } } } __global__ void compute_rois_kernel(const int nthreads, float* top_box, float* top_pose, const float* meta_data, float* hough_space, float* hough_data, int* max_indexes, int* class_indexes, int batch_index, const int height, const int width, const int num_classes, int* num_rois, const int is_train) { CUDA_1D_KERNEL_LOOP(index, nthreads) { float scale = 0.0; int max_index = max_indexes[index]; int ind = max_index / (height * width); int cls = class_indexes[ind]; int n = max_index % (height * width); int x = n % width; int y = n / width; float fx = meta_data[0]; float fy = meta_data[4]; float px = meta_data[2]; float py = meta_data[5]; float rx = (x - px) / fx; float ry = (y - py) / fy; int offset = ind * height * width * 3 + 3 * (y * width + x); float bb_distance = hough_data[offset]; float bb_height = hough_data[offset + 1]; float bb_width = hough_data[offset + 2]; if (is_train) { int roi_index = atomicAdd(num_rois, 9); top_box[roi_index * 7 + 0] = batch_index; top_box[roi_index * 7 + 1] = cls; top_box[roi_index * 7 + 2] = x - bb_width * (0.5 + scale); top_box[roi_index * 7 + 3] = y - bb_height * (0.5 + scale); top_box[roi_index * 7 + 4] = x + bb_width * (0.5 + scale); top_box[roi_index * 7 + 5] = y + bb_height * (0.5 + scale); top_box[roi_index * 7 + 6] = hough_space[max_index]; for (int j = 0; j < 9; j++) { top_pose[(roi_index + j) * 7 + 0] = 1; top_pose[(roi_index + j) * 7 + 1] = 0; top_pose[(roi_index + j) * 7 + 2] = 0; top_pose[(roi_index + j) * 7 + 3] = 0; top_pose[(roi_index + j) * 7 + 4] = rx; top_pose[(roi_index + j) * 7 + 5] = ry; top_pose[(roi_index + j) * 7 + 6] = bb_distance; } // add jittering boxes float x1 = top_box[roi_index * 7 + 2]; float y1 = top_box[roi_index * 7 + 3]; float x2 = top_box[roi_index * 7 + 4]; float y2 = top_box[roi_index * 7 + 5]; float ww = x2 - x1; float hh = y2 - y1; // (-1, -1) roi_index++; top_box[roi_index * 7 + 0] = batch_index; top_box[roi_index * 7 + 1] = cls; top_box[roi_index * 7 + 2] = x1 - 0.05 * ww; top_box[roi_index * 7 + 3] = y1 - 0.05 * hh; top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww; top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh; top_box[roi_index * 7 + 6] = hough_space[max_index]; // (+1, -1) roi_index++; top_box[roi_index * 7 + 0] = batch_index; top_box[roi_index * 7 + 1] = cls; top_box[roi_index * 7 + 2] = x1 + 0.05 * ww; top_box[roi_index * 7 + 3] = y1 - 0.05 * hh; top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww; top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh; top_box[roi_index * 7 + 6] = hough_space[max_index]; // (-1, +1) roi_index++; top_box[roi_index * 7 + 0] = batch_index; top_box[roi_index * 7 + 1] = cls; top_box[roi_index * 7 + 2] = x1 - 0.05 * ww; top_box[roi_index * 7 + 3] = y1 + 0.05 * hh; top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww; top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh; top_box[roi_index * 7 + 6] = hough_space[max_index]; // (+1, +1) roi_index++; top_box[roi_index * 7 + 0] = batch_index; top_box[roi_index * 7 + 1] = cls; top_box[roi_index * 7 + 2] = x1 + 0.05 * ww; top_box[roi_index * 7 + 3] = y1 + 0.05 * hh; top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww; top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh; top_box[roi_index * 7 + 6] = hough_space[max_index]; // (0, -1) roi_index++; top_box[roi_index * 7 + 0] = batch_index; top_box[roi_index * 7 + 1] = cls; top_box[roi_index * 7 + 2] = x1; top_box[roi_index * 7 + 3] = y1 - 0.05 * hh; top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww; top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh; top_box[roi_index * 7 + 6] = hough_space[max_index]; // (-1, 0) roi_index++; top_box[roi_index * 7 + 0] = batch_index; top_box[roi_index * 7 + 1] = cls; top_box[roi_index * 7 + 2] = x1 - 0.05 * ww; top_box[roi_index * 7 + 3] = y1; top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww; top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh; top_box[roi_index * 7 + 6] = hough_space[max_index]; // (0, +1) roi_index++; top_box[roi_index * 7 + 0] = batch_index; top_box[roi_index * 7 + 1] = cls; top_box[roi_index * 7 + 2] = x1; top_box[roi_index * 7 + 3] = y1 + 0.05 * hh; top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww; top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh; top_box[roi_index * 7 + 6] = hough_space[max_index]; // (+1, 0) roi_index++; top_box[roi_index * 7 + 0] = batch_index; top_box[roi_index * 7 + 1] = cls; top_box[roi_index * 7 + 2] = x1 + 0.05 * ww; top_box[roi_index * 7 + 3] = y1; top_box[roi_index * 7 + 4] = top_box[roi_index * 7 + 2] + ww; top_box[roi_index * 7 + 5] = top_box[roi_index * 7 + 3] + hh; top_box[roi_index * 7 + 6] = hough_space[max_index]; } else { int roi_index = atomicAdd(num_rois, 1); top_box[roi_index * 7 + 0] = batch_index; top_box[roi_index * 7 + 1] = cls; top_box[roi_index * 7 + 2] = x - bb_width * (0.5 + scale); top_box[roi_index * 7 + 3] = y - bb_height * (0.5 + scale); top_box[roi_index * 7 + 4] = x + bb_width * (0.5 + scale); top_box[roi_index * 7 + 5] = y + bb_height * (0.5 + scale); top_box[roi_index * 7 + 6] = hough_space[max_index]; top_pose[roi_index * 7 + 0] = 1; top_pose[roi_index * 7 + 1] = 0; top_pose[roi_index * 7 + 2] = 0; top_pose[roi_index * 7 + 3] = 0; top_pose[roi_index * 7 + 4] = rx; top_pose[roi_index * 7 + 5] = ry; top_pose[roi_index * 7 + 6] = bb_distance; } } } std::vector hough_voting_cuda_forward( at::Tensor bottom_label, at::Tensor bottom_vertex, at::Tensor bottom_meta_data, at::Tensor extents, int is_train, int skip_pixels, int labelThreshold, float inlierThreshold, float votingThreshold, float perThreshold) { const int kThreadsPerBlock = 1024; int output_size; cudaError_t err; const int batch_size = bottom_vertex.size(0); const int num_classes = bottom_vertex.size(1) / VERTEX_CHANNELS; const int height = bottom_vertex.size(2); const int width = bottom_vertex.size(3); const int num_meta_data = bottom_meta_data.size(1); const int index_size = MAX_ROI / batch_size; auto top_box = at::zeros({MAX_ROI * 9, 7}, bottom_vertex.options()); auto top_pose = at::zeros({MAX_ROI * 9, 7}, bottom_vertex.options()); auto num_rois = at::zeros({1}, bottom_label.options()); for (int batch_index = 0; batch_index < batch_size; batch_index++) { const int* labelmap = bottom_label.data() + batch_index * height * width; const float* vertmap = bottom_vertex.data() + batch_index * height * width * VERTEX_CHANNELS * num_classes; const float* meta_data = bottom_meta_data.data() + batch_index * num_meta_data; // step 1: compute a label index array for each class auto arrays = at::zeros({num_classes, height * width}, bottom_label.options()); auto array_sizes = at::zeros({num_classes}, bottom_label.options()); output_size = height * width; compute_arrays_kernel<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>( output_size, labelmap, arrays.data(), array_sizes.data(), height, width); cudaThreadSynchronize(); // compute class indexes int* array_sizes_host = (int*)malloc(num_classes * sizeof(int)); int* class_indexes_host = (int*)malloc(num_classes * sizeof(int)); cudaMemcpy(array_sizes_host, array_sizes.data(), num_classes * sizeof(int), cudaMemcpyDeviceToHost); int count = 0; for (int c = 1; c < num_classes; c++) { if (array_sizes_host[c] > labelThreshold) { class_indexes_host[count] = c; count++; } // else // printf("class %d with only pixels %d\n", c, array_sizes_host[c]); } if (count == 0) { free(array_sizes_host); free(class_indexes_host); continue; } auto class_indexes = at::zeros({count}, bottom_label.options()); cudaMemcpy(class_indexes.data(), class_indexes_host, count * sizeof(int), cudaMemcpyHostToDevice); err = cudaGetLastError(); if(cudaSuccess != err) { fprintf( stderr, "cudaCheckError() failed compute label index: %s\n", cudaGetErrorString( err ) ); exit( -1 ); } // step 2: compute the hough space auto hough_space = at::zeros({count, height, width}, bottom_vertex.options()); auto hough_data = at::zeros({count, height, width, 3}, bottom_vertex.options()); output_size = count * height * width; compute_hough_kernel<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>( output_size, hough_space.data(), hough_data.data(), labelmap, vertmap, extents.data(), meta_data, arrays.data(), array_sizes.data(), class_indexes.data(), height, width, num_classes, count, inlierThreshold, skip_pixels); cudaThreadSynchronize(); err = cudaGetLastError(); if(cudaSuccess != err) { fprintf( stderr, "cudaCheckError() failed compute hough space: %s\n", cudaGetErrorString( err ) ); exit( -1 ); } // step 3: find the maximum in hough space auto num_max = at::zeros({1}, bottom_label.options()); auto max_indexes = at::zeros({index_size}, bottom_label.options()); if (votingThreshold > 0) { output_size = count * height * width; compute_max_indexes_kernel<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>( output_size, max_indexes.data(), index_size, num_max.data(), hough_space.data(), hough_data.data(), height, width, votingThreshold, perThreshold, is_train); cudaThreadSynchronize(); } else { int* max_indexes_host = (int*)malloc(count * sizeof(int)); memset(max_indexes_host, 0, count * sizeof(int)); for (int i = 0; i < count; i++) { float *hmax = thrust::max_element(thrust::device, hough_space.data() + i * height * width, hough_space.data() + (i+1) * height * width); max_indexes_host[i] = hmax - hough_space.data(); } cudaMemcpy(num_max.data(), &count, sizeof(int), cudaMemcpyHostToDevice); cudaMemcpy(max_indexes.data(), max_indexes_host, count * sizeof(int), cudaMemcpyHostToDevice); free(max_indexes_host); } err = cudaGetLastError(); if(cudaSuccess != err) { fprintf( stderr, "cudaCheckError() failed compute maximum: %s\n", cudaGetErrorString( err ) ); exit( -1 ); } // step 4: compute outputs int num_max_host; cudaMemcpy(&num_max_host, num_max.data(), sizeof(int), cudaMemcpyDeviceToHost); if (num_max_host >= index_size) { printf("hough voting num_max: %d exceeds capacity %d\n", num_max_host, index_size); num_max_host = index_size; } if (num_max_host > 0) { output_size = num_max_host; compute_rois_kernel<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>( output_size, top_box.data(), top_pose.data(), meta_data, hough_space.data(), hough_data.data(), max_indexes.data(), class_indexes.data(), batch_index, height, width, num_classes, num_rois.data(), is_train); cudaThreadSynchronize(); } // clean up free(array_sizes_host); free(class_indexes_host); err = cudaGetLastError(); if(cudaSuccess != err) { fprintf( stderr, "cudaCheckError() failed compute outputs: %s\n", cudaGetErrorString( err ) ); exit( -1 ); } } // copy outputs int num_rois_host; cudaMemcpy(&num_rois_host, num_rois.data(), sizeof(int), cudaMemcpyDeviceToHost); if (num_rois_host == 0) num_rois_host = 1; auto top_box_final = at::zeros({num_rois_host, 7}, bottom_vertex.options()); auto top_pose_final = at::zeros({num_rois_host, 7}, bottom_vertex.options()); cudaMemcpy(top_box_final.data(), top_box.data(), num_rois_host * 7 * sizeof(float), cudaMemcpyDeviceToDevice); cudaMemcpy(top_pose_final.data(), top_pose.data(), num_rois_host * 7 * sizeof(float), cudaMemcpyDeviceToDevice); return {top_box_final, top_pose_final}; } ================================================ FILE: lib/layers/point_matching_loss.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import math from torch import nn from torch.autograd import Function import torch import posecnn_cuda class PMLossFunction(Function): @staticmethod def forward(ctx, prediction, target, weight, points, symmetry, hard_angle): outputs = posecnn_cuda.pml_forward(prediction, target, weight, points, symmetry, hard_angle) loss = outputs[0] variables = outputs[1:] ctx.save_for_backward(*variables) return loss @staticmethod def backward(ctx, grad_loss): outputs = posecnn_cuda.pml_backward(grad_loss, *ctx.saved_variables) d_rotation = outputs[0] return d_rotation, None, None, None, None, None class PMLoss(nn.Module): def __init__(self, hard_angle=15): super(PMLoss, self).__init__() self.hard_angle = hard_angle def forward(self, prediction, target, weight, points, symmetry): return PMLossFunction.apply(prediction, target, weight, points, symmetry, self.hard_angle) ================================================ FILE: lib/layers/point_matching_loss_kernel.cu ================================================ // Copyright (c) 2020 NVIDIA Corporation. All rights reserved. // This work is licensed under the NVIDIA Source Code License - Non-commercial. Full // text can be found in LICENSE.md #include #include #include #include #include #define CUDA_1D_KERNEL_LOOP(i, n) \ for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \ i += blockDim.x * gridDim.x) #define POSE_CHANNELS 4 template __global__ void AveragedistanceForward(const int nthreads, const Dtype* prediction, const Dtype* target, const Dtype* weight, const Dtype* point, const Dtype* symmetry, const int batch_size, const int num_classes, const int num_points, const float hard_angle, Dtype* rotations, Dtype* losses, Dtype* diffs, Dtype* angles_batch) { CUDA_1D_KERNEL_LOOP(index_thread, nthreads) { // batch index int n = index_thread / num_points; int p = index_thread % num_points; // find the class label and pose of this object int index_cls = -1, ind; Dtype s, u, v, w; for (int i = 0; i < POSE_CHANNELS * num_classes; i += POSE_CHANNELS) { int index = n * POSE_CHANNELS * num_classes + i; if (weight[index] > 0) { index_cls = i / POSE_CHANNELS; // gt quaternion s = target[index + 0]; u = target[index + 1]; v = target[index + 2]; w = target[index + 3]; // gt rotation matrix ind = n * num_points * 6 * 9 + p * 6 * 9; rotations[ind + 0] = s * s + u * u - v * v - w * w; rotations[ind + 1] = 2 * (u * v - s * w); rotations[ind + 2] = 2 * (u * w + s * v); rotations[ind + 3] = 2 * (u * v + s * w); rotations[ind + 4] = s * s - u * u + v * v - w * w; rotations[ind + 5] = 2 * (v * w - s * u); rotations[ind + 6] = 2 * (u * w - s * v); rotations[ind + 7] = 2 * (v * w + s * u); rotations[ind + 8] = s * s - u * u - v * v + w * w; // predicted quaternion s = prediction[index + 0]; u = prediction[index + 1]; v = prediction[index + 2]; w = prediction[index + 3]; // predicted rotation matrix ind = n * num_points * 6 * 9 + p * 6 * 9 + 9; rotations[ind + 0] = s * s + u * u - v * v - w * w; rotations[ind + 1] = 2 * (u * v - s * w); rotations[ind + 2] = 2 * (u * w + s * v); rotations[ind + 3] = 2 * (u * v + s * w); rotations[ind + 4] = s * s - u * u + v * v - w * w; rotations[ind + 5] = 2 * (v * w - s * u); rotations[ind + 6] = 2 * (u * w - s * v); rotations[ind + 7] = 2 * (v * w + s * u); rotations[ind + 8] = s * s - u * u - v * v + w * w; // compute the angular distance between quarternions if (p == 0) { Dtype d = target[index + 0] * prediction[index + 0] + target[index + 1] * prediction[index + 1] + target[index + 2] * prediction[index + 2] + target[index + 3] * prediction[index + 3]; Dtype angle = acos(2 * d * d - 1) * 180.0 / 3.14159265; if (angle > hard_angle) angles_batch[n] = 1.0; } break; } } if (index_cls == -1) continue; // derivatives of Ru to quaternion ind = n * num_points * 6 * 9 + p * 6 * 9 + 18; rotations[ind + 0] = 2 * s; rotations[ind + 1] = -2 * w; rotations[ind + 2] = 2 * v; rotations[ind + 3] = 2 * w; rotations[ind + 4] = 2 * s; rotations[ind + 5] = -2 * u; rotations[ind + 6] = -2 * v; rotations[ind + 7] = 2 * u; rotations[ind + 8] = 2 * s; ind = n * num_points * 6 * 9 + p * 6 * 9 + 27; rotations[ind + 0] = 2 * u; rotations[ind + 1] = 2 * v; rotations[ind + 2] = 2 * w; rotations[ind + 3] = 2 * v; rotations[ind + 4] = -2 * u; rotations[ind + 5] = -2 * s; rotations[ind + 6] = 2 * w; rotations[ind + 7] = 2 * s; rotations[ind + 8] = -2 * u; ind = n * num_points * 6 * 9 + p * 6 * 9 + 36; rotations[ind + 0] = -2 * v; rotations[ind + 1] = 2 * u; rotations[ind + 2] = 2 * s; rotations[ind + 3] = 2 * u; rotations[ind + 4] = 2 * v; rotations[ind + 5] = 2 * w; rotations[ind + 6] = -2 * s; rotations[ind + 7] = 2 * w; rotations[ind + 8] = -2 * v; ind = n * num_points * 6 * 9 + p * 6 * 9 + 45; rotations[ind + 0] = -2 * w; rotations[ind + 1] = -2 * s; rotations[ind + 2] = 2 * u; rotations[ind + 3] = 2 * s; rotations[ind + 4] = -2 * w; rotations[ind + 5] = 2 * v; rotations[ind + 6] = 2 * u; rotations[ind + 7] = 2 * v; rotations[ind + 8] = 2 * w; // for the point int index = index_cls * num_points * 3 + p * 3; ind = n * num_points * 6 * 9 + p * 6 * 9; // rotate the first point Dtype x1 = rotations[ind + 9 + 0] * point[index + 0] + rotations[ind + 9 + 1] * point[index + 1] + rotations[ind + 9 + 2] * point[index + 2]; Dtype y1 = rotations[ind + 9 + 3] * point[index + 0] + rotations[ind + 9 + 4] * point[index + 1] + rotations[ind + 9 + 5] * point[index + 2]; Dtype z1 = rotations[ind + 9 + 6] * point[index + 0] + rotations[ind + 9 + 7] * point[index + 1] + rotations[ind + 9 + 8] * point[index + 2]; int index_min; Dtype x2, y2, z2; if (symmetry[index_cls] > 0) { // find the closet point for symmetry object Dtype dmin = FLT_MAX; for (int i = 0; i < num_points; i++) { int index2 = index_cls * num_points * 3 + i * 3; x2 = rotations[ind + 0] * point[index2 + 0] + rotations[ind + 1] * point[index2 + 1] + rotations[ind + 2] * point[index2 + 2]; y2 = rotations[ind + 3] * point[index2 + 0] + rotations[ind + 4] * point[index2 + 1] + rotations[ind + 5] * point[index2 + 2]; z2 = rotations[ind + 6] * point[index2 + 0] + rotations[ind + 7] * point[index2 + 1] + rotations[ind + 8] * point[index2 + 2]; Dtype distance = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2); if (distance < dmin) { dmin = distance; index_min = index2; } } } else index_min = index; x2 = rotations[ind + 0] * point[index_min + 0] + rotations[ind + 1] * point[index_min + 1] + rotations[ind + 2] * point[index_min + 2]; y2 = rotations[ind + 3] * point[index_min + 0] + rotations[ind + 4] * point[index_min + 1] + rotations[ind + 5] * point[index_min + 2]; z2 = rotations[ind + 6] * point[index_min + 0] + rotations[ind + 7] * point[index_min + 1] + rotations[ind + 8] * point[index_min + 2]; // smooth l1 loss Dtype distance = 0; int index_diff = n * num_points * POSE_CHANNELS * num_classes + p * POSE_CHANNELS * num_classes + POSE_CHANNELS * index_cls; for (int j = 0; j < 3; j++) { Dtype diff, df; if (j == 0) diff = x1 - x2; else if (j == 1) diff = y1 - y2; else diff = z1 - z2; if (fabs(diff) < 1) { distance += 0.5 * diff * diff; df = diff; } else { distance += fabs(diff) - 0.5; if (diff > 0) df = 1.0; else df = -1.0; } for (int k = 0; k < 3; k++) { ind = n * num_points * 6 * 9 + p * 6 * 9 + 18; diffs[index_diff + 0] += df * point[index + k] * rotations[ind + j * 3 + k] / num_points; ind = n * num_points * 6 * 9 + p * 6 * 9 + 27; diffs[index_diff + 1] += df * point[index + k] * rotations[ind + j * 3 + k] / num_points; ind = n * num_points * 6 * 9 + p * 6 * 9 + 36; diffs[index_diff + 2] += df * point[index + k] * rotations[ind + j * 3 + k] / num_points; ind = n * num_points * 6 * 9 + p * 6 * 9 + 45; diffs[index_diff + 3] += df * point[index + k] * rotations[ind + j * 3 + k] / num_points; } } losses[index_thread] = distance / num_points; } } template __global__ void sum_losses_gradients(const int nthreads, const Dtype* losses, const Dtype* diffs, const int num_classes, const int num_points, const float batch_hard, Dtype* angles, Dtype* loss_batch, Dtype* bottom_diff) { CUDA_1D_KERNEL_LOOP(index, nthreads) { int n = index / (POSE_CHANNELS * num_classes); int c = index % (POSE_CHANNELS * num_classes); bottom_diff[index] = 0; if (angles[n] > 0) { for (int p = 0; p < num_points; p++) { int index_diff = n * num_points * POSE_CHANNELS * num_classes + p * POSE_CHANNELS * num_classes + c; bottom_diff[index] += diffs[index_diff] / batch_hard; } } if (c == 0) { loss_batch[n] = 0; if (angles[n] > 0) { for (int p = 0; p < num_points; p++) loss_batch[n] += losses[n * num_points + p] / batch_hard; } } } } std::vector pml_cuda_forward( at::Tensor bottom_prediction, at::Tensor bottom_target, at::Tensor bottom_weight, at::Tensor points, at::Tensor symmetry, float hard_angle) { // run kernels cudaError_t err; const int kThreadsPerBlock = 512; int output_size; // temp losses const int batch_size = bottom_prediction.size(0); const int num_classes = points.size(1); const int num_points = points.size(2); auto losses = at::zeros({batch_size, num_points}, points.options()); auto losses_batch = at::zeros({batch_size}, points.options()); auto angles_batch = at::zeros({batch_size}, points.options()); auto top_data = at::zeros({1}, points.options()); // temp diffs auto diffs = at::zeros({batch_size, num_points, POSE_CHANNELS * num_classes}, points.options()); auto bottom_diff = at::zeros({batch_size, POSE_CHANNELS * num_classes}, points.options()); // temp rotations auto rotations = at::zeros({batch_size, num_points, 6 * 9}, points.options()); // compute the losses and gradients output_size = batch_size * num_points; AveragedistanceForward<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>( output_size, bottom_prediction.data(), bottom_target.data(), bottom_weight.data(), points.data(), symmetry.data(), batch_size, num_classes, num_points, hard_angle, rotations.data(), losses.data(), diffs.data(), angles_batch.data()); cudaDeviceSynchronize(); // sum the angle flags thrust::device_ptr angles_ptr(angles_batch.data()); float batch_hard = thrust::reduce(angles_ptr, angles_ptr + batch_size); err = cudaGetLastError(); if(cudaSuccess != err) { fprintf( stderr, "cudaCheckError() failed: %s\n", cudaGetErrorString( err ) ); exit( -1 ); } // sum the diffs output_size = batch_size * POSE_CHANNELS * num_classes; sum_losses_gradients<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>( output_size, losses.data(), diffs.data(), num_classes, num_points, batch_hard, angles_batch.data(), losses_batch.data(), bottom_diff.data()); cudaDeviceSynchronize(); // sum the loss thrust::device_ptr losses_ptr(losses_batch.data()); float loss = thrust::reduce(losses_ptr, losses_ptr + batch_size); cudaMemcpy(top_data.data(), &loss, sizeof(float), cudaMemcpyHostToDevice); err = cudaGetLastError(); if(cudaSuccess != err) { fprintf( stderr, "cudaCheckError() failed: %s\n", cudaGetErrorString( err ) ); exit( -1 ); } return {top_data, bottom_diff}; } template __global__ void AveragedistanceBackward(const int nthreads, const Dtype* top_diff, const Dtype* bottom_diff, Dtype* output) { CUDA_1D_KERNEL_LOOP(index, nthreads) { output[index] = top_diff[0] * bottom_diff[index]; } } std::vector pml_cuda_backward( at::Tensor grad_loss, at::Tensor bottom_diff) { cudaError_t err; const int kThreadsPerBlock = 512; int output_size; const int batch_size = bottom_diff.size(0); const int num_classes = bottom_diff.size(1) / POSE_CHANNELS; auto grad_rotation = at::zeros({batch_size, POSE_CHANNELS * num_classes}, bottom_diff.options()); output_size = batch_size * POSE_CHANNELS * num_classes; AveragedistanceBackward<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>( output_size, grad_loss.data(), bottom_diff.data(), grad_rotation.data()); cudaDeviceSynchronize(); err = cudaGetLastError(); if(cudaSuccess != err) { fprintf( stderr, "cudaCheckError() failed : %s\n", cudaGetErrorString( err ) ); exit( -1 ); } return {grad_rotation}; } ================================================ FILE: lib/layers/pose_target_layer.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md from __future__ import absolute_import from __future__ import division from __future__ import print_function import torch import numpy as np from fcn.config import cfg from utils.bbox_transform import bbox_transform_inv from utils.cython_bbox import bbox_overlaps # rpn_rois: (batch_ids, cls, x1, y1, x2, y2, scores) # gt_boxes: batch * num_classes * (x1, y1, x2, y2, cls) def pose_target_layer(rois, bbox_prob, bbox_pred, gt_boxes, poses, is_training): rois = rois.detach().cpu().numpy() bbox_prob = bbox_prob.detach().cpu().numpy() bbox_pred = bbox_pred.detach().cpu().numpy() gt_boxes = gt_boxes.detach().cpu().numpy() num_classes = bbox_prob.shape[1] # process boxes if cfg.TRAIN.BBOX_NORMALIZE_TARGETS_PRECOMPUTED: stds = np.tile(np.array(cfg.TRAIN.BBOX_NORMALIZE_STDS), (num_classes)) means = np.tile(np.array(cfg.TRAIN.BBOX_NORMALIZE_MEANS), (num_classes)) bbox_pred *= stds bbox_pred += means boxes = rois[:, 2:6].copy() pred_boxes = bbox_transform_inv(boxes, bbox_pred) # assign boxes for i in range(rois.shape[0]): cls = int(rois[i, 1]) rois[i, 2:6] = pred_boxes[i, cls*4:cls*4+4] rois[i, 6] = bbox_prob[i, cls] # convert boxes to (batch_ids, x1, y1, x2, y2, cls) roi_blob = rois[:, (0, 2, 3, 4, 5, 1)] gt_box_blob = np.zeros((0, 6), dtype=np.float32) pose_blob = np.zeros((0, 9), dtype=np.float32) for i in range(gt_boxes.shape[0]): for j in range(gt_boxes.shape[1]): if gt_boxes[i, j, -1] > 0: gt_box = np.zeros((1, 6), dtype=np.float32) gt_box[0, 0] = i gt_box[0, 1:5] = gt_boxes[i, j, :4] gt_box[0, 5] = gt_boxes[i, j, 4] gt_box_blob = np.concatenate((gt_box_blob, gt_box), axis=0) poses[i, j, 0] = i pose_blob = np.concatenate((pose_blob, poses[i, j, :].cpu().reshape(1, 9)), axis=0) if gt_box_blob.shape[0] == 0: num = rois.shape[0] poses_target = np.zeros((num, 4 * num_classes), dtype=np.float32) poses_weight = np.zeros((num, 4 * num_classes), dtype=np.float32) else: # overlaps: (rois x gt_boxes) overlaps = bbox_overlaps( np.ascontiguousarray(roi_blob[:, :5], dtype=np.float), np.ascontiguousarray(gt_box_blob[:, :5], dtype=np.float)) gt_assignment = overlaps.argmax(axis=1) max_overlaps = overlaps.max(axis=1) labels = gt_box_blob[gt_assignment, 5] quaternions = pose_blob[gt_assignment, 2:6] # Select foreground RoIs as those with >= FG_THRESH overlap bg_inds = np.where(max_overlaps < cfg.TRAIN.FG_THRESH_POSE)[0] labels[bg_inds] = 0 bg_inds = np.where(roi_blob[:, -1] != labels)[0] labels[bg_inds] = 0 # in training, only use the positive boxes for pose regression if is_training: fg_inds = np.where(labels > 0)[0] if len(fg_inds) > 0: rois = rois[fg_inds, :] quaternions = quaternions[fg_inds, :] labels = labels[fg_inds] # pose regression targets and weights poses_target, poses_weight = _compute_pose_targets(quaternions, labels, num_classes) return torch.from_numpy(rois).cuda(), torch.from_numpy(poses_target).cuda(), torch.from_numpy(poses_weight).cuda() def _compute_pose_targets(quaternions, labels, num_classes): """Compute pose regression targets for an image.""" num = quaternions.shape[0] poses_target = np.zeros((num, 4 * num_classes), dtype=np.float32) poses_weight = np.zeros((num, 4 * num_classes), dtype=np.float32) for i in range(num): cls = labels[i] if cls > 0 and np.linalg.norm(quaternions[i, :]) > 0: start = int(4 * cls) end = start + 4 poses_target[i, start:end] = quaternions[i, :] poses_weight[i, start:end] = 1.0 return poses_target, poses_weight ================================================ FILE: lib/layers/posecnn_layers.cpp ================================================ // Copyright (c) 2020 NVIDIA Corporation. All rights reserved. // This work is licensed under the NVIDIA Source Code License - Non-commercial. Full // text can be found in LICENSE.md #include #include #include #include #include #define CHECK_CUDA(x) AT_ASSERT(x.type().is_cuda()) #define CHECK_CONTIGUOUS(x) AT_ASSERT(x.is_contiguous()) #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x) /************************************************************ backproject depth to 3D points *************************************************************/ std::vector backproject_cuda_forward( float fx, float fy, float px, float py, at::Tensor depth); std::vector backproject_forward( float fx, float fy, float px, float py, at::Tensor depth) { CHECK_INPUT(depth); return backproject_cuda_forward(fx, fy, px, py, depth); } /************************************************************ hard label layer *************************************************************/ std::vector hard_label_cuda_forward( float threshold, float sample_percentage, at::Tensor bottom_prob, at::Tensor bottom_label, at::Tensor bottom_rand); std::vector hard_label_cuda_backward( at::Tensor top_diff); std::vector hard_label_forward( float threshold, float sample_percentage, at::Tensor bottom_prob, at::Tensor bottom_label, at::Tensor bottom_rand) { CHECK_INPUT(bottom_prob); CHECK_INPUT(bottom_label); CHECK_INPUT(bottom_rand); return hard_label_cuda_forward(threshold, sample_percentage, bottom_prob, bottom_label, bottom_rand); } std::vector hard_label_backward( at::Tensor top_diff) { CHECK_INPUT(top_diff); return hard_label_cuda_backward(top_diff); } /************************************************************ hough voting layer *************************************************************/ std::vector hough_voting_cuda_forward( at::Tensor bottom_label, at::Tensor bottom_verex, at::Tensor meta_data, at::Tensor extents, int is_train, int skip_pixels, int labelThreshold, float inlierThreshold, float votingThreshold, float perThreshold); std::vector hough_voting_forward( at::Tensor bottom_label, at::Tensor bottom_vertex, at::Tensor meta_data, at::Tensor extents, int is_train, int skip_pixels, int labelThreshold, float inlierThreshold, float votingThreshold, float perThreshold) { CHECK_INPUT(bottom_label); CHECK_INPUT(bottom_vertex); CHECK_INPUT(extents); CHECK_INPUT(meta_data); return hough_voting_cuda_forward(bottom_label, bottom_vertex, meta_data, extents, is_train, skip_pixels, labelThreshold, inlierThreshold, votingThreshold, perThreshold); } /************************************************************ roi pool layer *************************************************************/ std::vector roi_pool_cuda_forward( int pooled_height, int pooled_width, float spatial_scale, at::Tensor bottom_features, at::Tensor bottom_rois); std::vector roi_pool_cuda_backward( int batch_size, int height, int width, float spatial_scale, at::Tensor top_diff, at::Tensor bottom_rois, at::Tensor argmax_data); std::vector roi_pool_forward( int pooled_height, int pooled_width, float spatial_scale, at::Tensor bottom_features, at::Tensor bottom_rois) { CHECK_INPUT(bottom_features); CHECK_INPUT(bottom_rois); return roi_pool_cuda_forward(pooled_height, pooled_width, spatial_scale, bottom_features, bottom_rois); } std::vector roi_pool_backward( int batch_size, int height, int width, float spatial_scale, at::Tensor top_diff, at::Tensor bottom_rois, at::Tensor argmax_data) { CHECK_INPUT(top_diff); CHECK_INPUT(bottom_rois); CHECK_INPUT(argmax_data); return roi_pool_cuda_backward(batch_size, height, width, spatial_scale, top_diff, bottom_rois, argmax_data); } /************************************************************ roi align layer *************************************************************/ at::Tensor ROIAlign_forward_cuda(const at::Tensor& input, const at::Tensor& rois, const float spatial_scale, const int pooled_height, const int pooled_width, const int sampling_ratio); at::Tensor ROIAlign_backward_cuda(const at::Tensor& grad, const at::Tensor& rois, const float spatial_scale, const int pooled_height, const int pooled_width, const int batch_size, const int channels, const int height, const int width, const int sampling_ratio); // Interface for Python at::Tensor ROIAlign_forward(const at::Tensor& input, const at::Tensor& rois, const float spatial_scale, const int pooled_height, const int pooled_width, const int sampling_ratio) { return ROIAlign_forward_cuda(input, rois, spatial_scale, pooled_height, pooled_width, sampling_ratio); } at::Tensor ROIAlign_backward(const at::Tensor& grad, const at::Tensor& rois, const float spatial_scale, const int pooled_height, const int pooled_width, const int batch_size, const int channels, const int height, const int width, const int sampling_ratio) { return ROIAlign_backward_cuda(grad, rois, spatial_scale, pooled_height, pooled_width, batch_size, channels, height, width, sampling_ratio); } /************************************************************ point matching loss layer *************************************************************/ std::vector pml_cuda_forward( at::Tensor bottom_prediction, at::Tensor bottom_target, at::Tensor bottom_weight, at::Tensor points, at::Tensor symmetry, float hard_angle); std::vector pml_cuda_backward( at::Tensor grad_loss, at::Tensor bottom_diff); std::vector pml_forward( at::Tensor bottom_prediction, at::Tensor bottom_target, at::Tensor bottom_weight, at::Tensor points, at::Tensor symmetry, float hard_angle) { CHECK_INPUT(bottom_prediction); CHECK_INPUT(bottom_target); CHECK_INPUT(bottom_weight); CHECK_INPUT(points); CHECK_INPUT(symmetry); return pml_cuda_forward(bottom_prediction, bottom_target, bottom_weight, points, symmetry, hard_angle); } std::vector pml_backward( at::Tensor grad_loss, at::Tensor bottom_diff) { CHECK_INPUT(grad_loss); CHECK_INPUT(bottom_diff); return pml_cuda_backward(grad_loss, bottom_diff); } /************************************************************ sdf matching loss layer *************************************************************/ std::vector sdf_loss_cuda_forward( at::Tensor pose_delta, at::Tensor pose_init, at::Tensor sdf_grids, at::Tensor sdf_limits, at::Tensor points, at::Tensor regularization); std::vector sdf_loss_cuda_backward( at::Tensor grad_loss, at::Tensor bottom_diff); std::vector sdf_loss_forward( at::Tensor pose_delta, at::Tensor pose_init, at::Tensor sdf_grids, at::Tensor sdf_limits, at::Tensor points, at::Tensor regularization) { CHECK_INPUT(pose_delta); CHECK_INPUT(pose_init); CHECK_INPUT(sdf_grids); CHECK_INPUT(sdf_limits); CHECK_INPUT(points); CHECK_INPUT(regularization); return sdf_loss_cuda_forward(pose_delta, pose_init, sdf_grids, sdf_limits, points, regularization); } std::vector sdf_loss_backward( at::Tensor grad_loss, at::Tensor bottom_diff) { CHECK_INPUT(grad_loss); CHECK_INPUT(bottom_diff); return sdf_loss_cuda_backward(grad_loss, bottom_diff); } /********* python interface ***********/ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { m.def("backproject_forward", &backproject_forward, "backproject forward (CUDA)"); m.def("hard_label_forward", &hard_label_forward, "hard_label forward (CUDA)"); m.def("hard_label_backward", &hard_label_backward, "hard_label backward (CUDA)"); m.def("hough_voting_forward", &hough_voting_forward, "hough_voting forward (CUDA)"); m.def("roi_pool_forward", &roi_pool_forward, "roi_pool forward (CUDA)"); m.def("roi_pool_backward", &roi_pool_backward, "roi_pool backward (CUDA)"); m.def("roi_align_forward", &ROIAlign_forward, "ROIAlign_forward"); m.def("roi_align_backward", &ROIAlign_backward, "ROIAlign_backward"); m.def("pml_forward", &pml_forward, "pml forward (CUDA)"); m.def("pml_backward", &pml_backward, "pml backward (CUDA)"); m.def("sdf_loss_forward", &sdf_loss_forward, "SDF loss forward (CUDA)"); m.def("sdf_loss_backward", &sdf_loss_backward, "SDF loss backward (CUDA)"); } ================================================ FILE: lib/layers/roi_align.py ================================================ # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. import torch from torch import nn from torch.autograd import Function from torch.autograd.function import once_differentiable from torch.nn.modules.utils import _pair import posecnn_cuda class _ROIAlign(Function): @staticmethod def forward(ctx, input, roi, output_size, spatial_scale, sampling_ratio): ctx.save_for_backward(roi) ctx.output_size = _pair(output_size) ctx.spatial_scale = spatial_scale ctx.sampling_ratio = sampling_ratio ctx.input_shape = input.size() output = posecnn_cuda.roi_align_forward(input, roi, spatial_scale, output_size[0], output_size[1], sampling_ratio) return output @staticmethod @once_differentiable def backward(ctx, grad_output): rois, = ctx.saved_tensors output_size = ctx.output_size spatial_scale = ctx.spatial_scale sampling_ratio = ctx.sampling_ratio bs, ch, h, w = ctx.input_shape grad_input = posecnn_cuda.roi_align_backward( grad_output, rois, spatial_scale, output_size[0], output_size[1], bs, ch, h, w, sampling_ratio, ) return grad_input, None, None, None, None roi_align = _ROIAlign.apply class ROIAlign(nn.Module): def __init__(self, output_size, spatial_scale, sampling_ratio): super(ROIAlign, self).__init__() self.output_size = output_size self.spatial_scale = spatial_scale self.sampling_ratio = sampling_ratio def forward(self, input, rois): return roi_align(input, rois, self.output_size, self.spatial_scale, self.sampling_ratio) def __repr__(self): tmpstr = self.__class__.__name__ + "(" tmpstr += "output_size=" + str(self.output_size) tmpstr += ", spatial_scale=" + str(self.spatial_scale) tmpstr += ", sampling_ratio=" + str(self.sampling_ratio) tmpstr += ")" return tmpstr ================================================ FILE: lib/layers/roi_pooling.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import math from torch import nn from torch.autograd import Function import torch import posecnn_cuda class RoIPoolFunction(Function): @staticmethod def forward(ctx, features, rois, pool_height, pool_width, spatial_scale): outputs = posecnn_cuda.roi_pool_forward(pool_height, pool_width, spatial_scale, features, rois) top_data = outputs[0] variables = outputs[1:] variables.append(rois) ctx.feature_size = features.size() ctx.spatial_scale = spatial_scale ctx.save_for_backward(*variables) return top_data @staticmethod def backward(ctx, top_diff): argmax_data = ctx.saved_variables[0] rois = ctx.saved_variables[1] batch_size, num_channels, data_height, data_width = ctx.feature_size spatial_scale = ctx.spatial_scale outputs = posecnn_cuda.roi_pool_backward(batch_size, data_height, data_width, spatial_scale, top_diff, rois, argmax_data) d_features = outputs[0] return d_features, None, None, None, None class RoIPool(nn.Module): def __init__(self, pool_height, pool_width, spatial_scale): super(RoIPool, self).__init__() self.pool_width = int(pool_width) self.pool_height = int(pool_height) self.spatial_scale = float(spatial_scale) def forward(self, features, rois): return RoIPoolFunction.apply(features, rois, self.pool_height, self.pool_width, self.spatial_scale) ================================================ FILE: lib/layers/roi_pooling_kernel.cu ================================================ // Copyright (c) 2020 NVIDIA Corporation. All rights reserved. // This work is licensed under the NVIDIA Source Code License - Non-commercial. Full // text can be found in LICENSE.md #include #include #include #include #include #define CUDA_1D_KERNEL_LOOP(i, n) \ for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \ i += blockDim.x * gridDim.x) __global__ void ROIPoolForward(const int nthreads, const float* bottom_data, const float spatial_scale, const int height, const int width, const int channels, const int channel_rois, const int pool_height, const int pool_width, const float* bottom_rois, float* top_data, float* argmax_data) { CUDA_1D_KERNEL_LOOP(index, nthreads) { // (n, c, ph, pw) is an element in the pool output // int n = index; // int pw = n % pool_width; // n /= pool_width; // int ph = n % pool_height; // n /= pool_height; // int c = n % channels; // n /= channels; // (n, c, ph, pw) is an element in the pooled output int pw = index % pool_width; int ph = (index / pool_width) % pool_height; int c = (index / pool_width / pool_height) % channels; int n = index / pool_width / pool_height / channels; float roi_batch_ind = bottom_rois[n * channel_rois + 0]; float roi_start_w = bottom_rois[n * channel_rois + 2] * spatial_scale; float roi_start_h = bottom_rois[n * channel_rois + 3] * spatial_scale; float roi_end_w = bottom_rois[n * channel_rois + 4] * spatial_scale; float roi_end_h = bottom_rois[n * channel_rois + 5] * spatial_scale; // Force malformed ROIs to be 1x1 int roi_width = max(roi_end_w - roi_start_w + 1, 1.0); int roi_height = max(roi_end_h - roi_start_h + 1, 1.0); float bin_size_h = static_cast(roi_height) / static_cast(pool_height); float bin_size_w = static_cast(roi_width) / static_cast(pool_width); int hstart = static_cast(floor(static_cast(ph) * bin_size_h)); int wstart = static_cast(floor(static_cast(pw) * bin_size_w)); int hend = static_cast(ceil(static_cast(ph + 1) * bin_size_h)); int wend = static_cast(ceil(static_cast(pw + 1) * bin_size_w)); // Add roi offsets and clip to input boundaries hstart = min(max(int(hstart + roi_start_h), 0), height); hend = min(max(int(hend + roi_start_h), 0), height); wstart = min(max(int(wstart + roi_start_w), 0), width); wend = min(max(int(wend + roi_start_w), 0), width); bool is_empty = (hend <= hstart) || (wend <= wstart); // Define an empty pooling region to be zero float maxval = is_empty ? 0 : -FLT_MAX; // If nothing is pooled, argmax = -1 causes nothing to be backprop'd int maxidx = -1; int offset = roi_batch_ind * channels * height * width; const float* offset_bottom_data = bottom_data + offset; for (int h = hstart; h < hend; ++h) { for (int w = wstart; w < wend; ++w) { int bottom_index = c * height * width + h * width + w; if (offset_bottom_data[bottom_index] > maxval) { maxval = offset_bottom_data[bottom_index]; maxidx = bottom_index; } } } top_data[index] = maxval; argmax_data[index] = maxidx; } } std::vector roi_pool_cuda_forward( int pool_height, int pool_width, float spatial_scale, at::Tensor bottom_features, at::Tensor bottom_rois) { // run kernels const int kThreadsPerBlock = 1024; cudaError_t err; const int batch_size = bottom_features.size(0); const int num_channels = bottom_features.size(1); const int height = bottom_features.size(2); const int width = bottom_features.size(3); const int num_rois = bottom_rois.size(0); const int channel_rois = bottom_rois.size(1); auto top_data = at::zeros({num_rois, num_channels, pool_height, pool_width}, bottom_features.options()); auto top_argmax = at::zeros({num_rois, num_channels, pool_height, pool_width}, bottom_features.options()); const int output_size = num_rois * num_channels * pool_height * pool_width; ROIPoolForward<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>( output_size, bottom_features.data(), spatial_scale, height, width, num_channels, channel_rois, pool_height, pool_width, bottom_rois.data(), top_data.data(), top_argmax.data()); err = cudaGetLastError(); if(cudaSuccess != err) { fprintf( stderr, "cudaCheckError() failed : %s\n", cudaGetErrorString( err ) ); exit( -1 ); } return {top_data, top_argmax}; } __global__ void ROIPoolBackward(const int nthreads, const float* top_diff, const float spatial_scale, const int height, const int width, const int num_rois, const int channels, const int channel_rois, const int pool_height, const int pool_width, float* bottom_diff, const float* bottom_rois, const float* argmax_data) { CUDA_1D_KERNEL_LOOP(index, nthreads) { // (n, c, h, w) coords in bottom data int w = index % width; int h = (index / width) % height; int c = (index / width / height) % channels; int n = index / width / height / channels; float gradient = 0; // Accumulate gradient over all ROIs that pooled this element for (int roi_n = 0; roi_n < num_rois; roi_n++) { const float* offset_bottom_rois = bottom_rois + roi_n * channel_rois; int roi_batch_ind = int(offset_bottom_rois[0]); // Skip if ROI's batch index doesn't match n if (n != roi_batch_ind) continue; int roi_start_w = round(offset_bottom_rois[2] * spatial_scale); int roi_start_h = round(offset_bottom_rois[3] * spatial_scale); int roi_end_w = round(offset_bottom_rois[4] * spatial_scale); int roi_end_h = round(offset_bottom_rois[5] * spatial_scale); // Skip if ROI doesn't include (h, w) const bool in_roi = (w >= roi_start_w && w <= roi_end_w && h >= roi_start_h && h <= roi_end_h); if (!in_roi) continue; int offset = roi_n * channels * pool_height * pool_width; const float* offset_top_diff = top_diff + offset; const float* offset_argmax_data = argmax_data + offset; // Compute feasible set of pooled units that could have pooled // this bottom unit // Force malformed ROIs to be 1x1 int roi_width = max(roi_end_w - roi_start_w + 1, 1); int roi_height = max(roi_end_h - roi_start_h + 1, 1); float bin_size_h = static_cast(roi_height) / static_cast(pool_height); float bin_size_w = static_cast(roi_width) / static_cast(pool_width); int phstart = floor(static_cast(h - roi_start_h) / bin_size_h); int phend = ceil(static_cast(h - roi_start_h + 1) / bin_size_h); int pwstart = floor(static_cast(w - roi_start_w) / bin_size_w); int pwend = ceil(static_cast(w - roi_start_w + 1) / bin_size_w); phstart = min(max(phstart, 0), pool_height); phend = min(max(phend, 0), pool_height); pwstart = min(max(pwstart, 0), pool_width); pwend = min(max(pwend, 0), pool_width); for (int ph = phstart; ph < phend; ++ph) { for (int pw = pwstart; pw < pwend; ++pw) { if (int(offset_argmax_data[c * pool_height * pool_width + ph * pool_width + pw]) == c * height * width + h * width + w) gradient += offset_top_diff[c * pool_height * pool_width + ph * pool_width + pw]; } } } bottom_diff[index] = gradient; } } std::vector roi_pool_cuda_backward( int batch_size, int height, int width, float spatial_scale, at::Tensor top_diff, at::Tensor bottom_rois, at::Tensor argmax_data) { const int kThreadsPerBlock = 1024; cudaError_t err; const int num_rois = top_diff.size(0); const int num_channels = top_diff.size(1); const int pool_height = top_diff.size(2); const int pool_width = top_diff.size(3); const int channel_rois = bottom_rois.size(1); auto bottom_diff = at::zeros({batch_size, num_channels, height, width}, top_diff.options()); const int output_size = batch_size * num_channels * height * width; ROIPoolBackward<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>( output_size, top_diff.data(), spatial_scale, height, width, num_rois, num_channels, channel_rois, pool_height, pool_width, bottom_diff.data(), bottom_rois.data(), argmax_data.data()); err = cudaGetLastError(); if(cudaSuccess != err) { fprintf( stderr, "cudaCheckError() failed : %s\n", cudaGetErrorString( err ) ); exit(-1); } return {bottom_diff}; } ================================================ FILE: lib/layers/roi_target_layer.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md from __future__ import absolute_import from __future__ import division import torch import numpy as np import numpy.random as npr from fcn.config import cfg from utils.bbox_transform import bbox_transform from utils.cython_bbox import bbox_overlaps # rpn_rois: (batch_ids, cls, x1, y1, x2, y2, scores) # gt_boxes: batch * num_classes * (x1, y1, x2, y2, cls) def roi_target_layer(rpn_rois, gt_boxes): """ Assign object detection proposals to ground-truth targets. Produces proposal classification labels and bounding-box regression targets. """ rpn_rois = rpn_rois.detach().cpu().numpy() gt_boxes = gt_boxes.detach().cpu().numpy() num_classes = gt_boxes.shape[1] # convert boxes to (batch_ids, x1, y1, x2, y2, cls) roi_blob = rpn_rois[:, (0, 2, 3, 4, 5, 1)] gt_box_blob = np.zeros((0, 6), dtype=np.float32) for i in range(gt_boxes.shape[0]): for j in range(gt_boxes.shape[1]): if gt_boxes[i, j, -1] > 0: gt_box = np.zeros((1, 6), dtype=np.float32) gt_box[0, 0] = i gt_box[0, 1:5] = gt_boxes[i, j, :4] gt_box[0, 5] = gt_boxes[i, j, 4] gt_box_blob = np.concatenate((gt_box_blob, gt_box), axis=0) # sample rois with classification labels and bounding box regression targets labels, bbox_targets, bbox_inside_weights = _sample_rois(roi_blob, gt_box_blob, num_classes) bbox_outside_weights = np.array(bbox_inside_weights > 0).astype(np.float32) # convert labels num = labels.shape[0] label_blob = np.zeros((num, num_classes), dtype=np.float32) if np.any(roi_blob[:, -1] > 0): for i in range(num): label_blob[i, int(labels[i])] = 1.0 return torch.from_numpy(label_blob).cuda(), torch.from_numpy(bbox_targets).cuda(), \ torch.from_numpy(bbox_inside_weights).cuda(), torch.from_numpy(bbox_outside_weights).cuda() def _get_bbox_regression_labels(bbox_target_data, num_classes): """Bounding-box regression targets (bbox_target_data) are stored in a compact form N x (class, tx, ty, tw, th) This function expands those targets into the 4-of-4*K representation used by the network (i.e. only one class has non-zero targets). Returns: bbox_target (ndarray): N x 4K blob of regression targets bbox_inside_weights (ndarray): N x 4K blob of loss weights """ clss = bbox_target_data[:, 0] bbox_targets = np.zeros((clss.size, 4 * num_classes), dtype=np.float32) bbox_inside_weights = np.zeros(bbox_targets.shape, dtype=np.float32) inds = np.where(clss > 0)[0] for ind in inds: cls = clss[ind] start = int(4 * cls) end = start + 4 bbox_targets[ind, start:end] = bbox_target_data[ind, 1:] bbox_inside_weights[ind, start:end] = cfg.TRAIN.BBOX_INSIDE_WEIGHTS return bbox_targets, bbox_inside_weights def _compute_targets(ex_rois, gt_rois, labels): """Compute bounding-box regression targets for an image.""" assert ex_rois.shape[0] == gt_rois.shape[0] assert ex_rois.shape[1] == 4 assert gt_rois.shape[1] == 4 targets = bbox_transform(ex_rois, gt_rois) if cfg.TRAIN.BBOX_NORMALIZE_TARGETS_PRECOMPUTED: # Optionally normalize targets by a precomputed mean and stdev targets = ((targets - np.array(cfg.TRAIN.BBOX_NORMALIZE_MEANS)) / np.array(cfg.TRAIN.BBOX_NORMALIZE_STDS)) return np.hstack( (labels[:, np.newaxis], targets)).astype(np.float32, copy=False) def _sample_rois(all_rois, gt_boxes, num_classes): """Generate a random sample of RoIs comprising foreground and background examples. """ # all_rois (batch_ids, x1, y1, x2, y2, cls) # gt_boxes (batch_ids, x1, y1, x2, y2, cls) # overlaps: (rois x gt_boxes) if gt_boxes.shape[0] == 0: num = all_rois.shape[0] labels = np.zeros((num, 1), dtype=np.float32) bbox_targets = np.zeros((num, 4 * num_classes), dtype=np.float32) bbox_inside_weights = np.zeros(bbox_targets.shape, dtype=np.float32) else: overlaps = bbox_overlaps( np.ascontiguousarray(all_rois[:, :5], dtype=np.float), np.ascontiguousarray(gt_boxes[:, :5], dtype=np.float)) gt_assignment = overlaps.argmax(axis=1) max_overlaps = overlaps.max(axis=1) labels = gt_boxes[gt_assignment, 5] # Select foreground RoIs as those with >= FG_THRESH overlap # fg_inds = np.where(max_overlaps >= cfg.TRAIN.FG_THRESH)[0] bg_inds = np.where(max_overlaps < cfg.TRAIN.FG_THRESH)[0] labels[bg_inds] = 0 # print '{:d} rois, {:d} fg, {:d} bg'.format(all_rois.shape[0], all_rois.shape[0]-len(bg_inds), len(bg_inds)) # print all_rois bbox_target_data = _compute_targets( all_rois[:, 1:5], gt_boxes[gt_assignment, 1:5], labels) bbox_targets, bbox_inside_weights = \ _get_bbox_regression_labels(bbox_target_data, num_classes) return labels, bbox_targets, bbox_inside_weights ================================================ FILE: lib/layers/sdf_matching_loss.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import math from torch import nn from torch.autograd import Function import torch import posecnn_cuda class SDFLossFunction(Function): @staticmethod def forward(ctx, pose_delta, pose_init, sdf_grids, sdf_limits, points, regularization): outputs = posecnn_cuda.sdf_loss_forward(pose_delta, pose_init, sdf_grids, sdf_limits, points, regularization) loss = outputs[0] sdf_values = outputs[1] se3 = outputs[2] dalpha = outputs[3] J = outputs[4] variables = outputs[4:] ctx.save_for_backward(*variables) return loss, sdf_values, se3, dalpha, J @staticmethod def backward(ctx, grad_loss, grad_sdf_values, grad_se3, grad_JTJ, grad_J): outputs = posecnn_cuda.sdf_loss_backward(grad_loss, *ctx.saved_variables) d_delta = outputs[0] return d_delta, None, None, None, None class SDFLoss(nn.Module): def __init__(self): super(SDFLoss, self).__init__() def forward(self, pose_delta, pose_init, sdf_grids, sdf_limits, points, regularization): return SDFLossFunction.apply(pose_delta, pose_init, sdf_grids, sdf_limits, points, regularization) ================================================ FILE: lib/layers/sdf_matching_loss_kernel.cu ================================================ // Copyright (c) 2020 NVIDIA Corporation. All rights reserved. // This work is licensed under the NVIDIA Source Code License - Non-commercial. Full // text can be found in LICENSE.md #include #include #include #include #include #include #include #include #define CUDA_1D_KERNEL_LOOP(i, n) \ for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \ i += blockDim.x * gridDim.x) inline __device__ __host__ float lerp(float a, float b, float t) { return a + t*(b-a); } __device__ __host__ float3 operator+(const float3 &a, const float3 &b) { return make_float3(a.x+b.x, a.y+b.y, a.z+b.z); } __device__ __host__ float3 operator-(const float3 &a, const float3 &b) { return make_float3(a.x-b.x, a.y-b.y, a.z-b.z); } template inline __device__ __host__ const Dtype & getValue(const int3 & v, const int3 & dim, const Dtype* sdf_grids) { return sdf_grids[v.x * dim.y * dim.z + v.y * dim.z + v.z]; } template inline __device__ __host__ Dtype getValueInterpolated(const float3 & pGrid, const int3 & dim, const Dtype* sdf_grids) { const int x0 = (int)(pGrid.x - 0.5); const float fx = (pGrid.x - 0.5) - x0; const int y0 = (int)(pGrid.y - 0.5); const float fy = (pGrid.y - 0.5) - y0; const int z0 = (int)(pGrid.z - 0.5); const float fz = (pGrid.z - 0.5) - z0; const int x1 = x0 + 1; const int y1 = y0 + 1; const int z1 = z0 + 1; if ( !(x0 >= 0 && x1 < dim.x && y0 >= 0 && y1 < dim.y && z0 >=0 && z1 < dim.z) ) return 0.1; const float dx00 = lerp( getValue(make_int3(x0,y0,z0), dim, sdf_grids), getValue(make_int3(x1,y0,z0), dim, sdf_grids), fx); const float dx01 = lerp( getValue(make_int3(x0,y0,z1), dim, sdf_grids), getValue(make_int3(x1,y0,z1), dim, sdf_grids), fx); const float dx10 = lerp( getValue(make_int3(x0,y1,z0), dim, sdf_grids), getValue(make_int3(x1,y1,z0), dim, sdf_grids), fx); const float dx11 = lerp( getValue(make_int3(x0,y1,z1), dim, sdf_grids), getValue(make_int3(x1,y1,z1), dim, sdf_grids), fx); const float dxy0 = lerp( dx00, dx10, fy ); const float dxy1 = lerp( dx01, dx11, fy ); float dxyz = lerp( dxy0, dxy1, fz ); // penalize inside objects // if (dxyz < 0) // dxyz *= 10; return dxyz; } template inline __device__ __host__ float3 getGradientInterpolated(const float3 & pGrid, const int3 & dim, const Dtype* sdf_grids) { const float3 delta_x = make_float3(1,0,0); const float3 delta_y = make_float3(0,1,0); const float3 delta_z = make_float3(0,0,1); Dtype f_px = getValueInterpolated(pGrid + delta_x, dim, sdf_grids); Dtype f_py = getValueInterpolated(pGrid + delta_y, dim, sdf_grids); Dtype f_pz = getValueInterpolated(pGrid + delta_z, dim, sdf_grids); Dtype f_mx = getValueInterpolated(pGrid - delta_x, dim, sdf_grids); Dtype f_my = getValueInterpolated(pGrid - delta_y, dim, sdf_grids); Dtype f_mz = getValueInterpolated(pGrid - delta_z, dim, sdf_grids); float3 grad; grad.x = 0.5*(f_px - f_mx); grad.y = 0.5*(f_py - f_my); grad.z = 0.5*(f_pz - f_mz); return grad; } /*******************************************/ /* pose_delta: num_objects x 6 */ /* pose_init: num_objects x 4 x 4 */ /* sdf_grid: num_classes x c x h x w */ /* sdf_limits: num_classes x 9 */ /* points: num_points x 5 */ /*******************************************/ template __global__ void SDFdistanceForward(const int nthreads, const Dtype* pose_delta, const Dtype* pose_init, const Dtype* sdf_grids, const Dtype* sdf_limits, const Dtype* points, const int num_points, Dtype* losses, Dtype* top_values, Dtype* diffs, Dtype* JTJ, Dtype* top_se3) { typedef Sophus::SE3 SE3; typedef Eigen::Matrix Vec3; // index is the index of point CUDA_1D_KERNEL_LOOP(index, nthreads) { int cls_index = int(points[5 * index + 3]); int obj_index = int(points[5 * index + 4]); int start_index; // convert delta pose Eigen::Matrix deltaPose; start_index = 6 * obj_index; deltaPose << pose_delta[start_index + 0], pose_delta[start_index + 1], pose_delta[start_index + 2], pose_delta[start_index + 3], pose_delta[start_index + 4], pose_delta[start_index + 5]; SE3 deltaPoseMatrix = SE3::exp(deltaPose); // convert initial pose Eigen::Matrix initialPose; start_index = 16 * obj_index; initialPose << pose_init[start_index + 0], pose_init[start_index + 1], pose_init[start_index + 2], pose_init[start_index + 3], pose_init[start_index + 4], pose_init[start_index + 5], pose_init[start_index + 6], pose_init[start_index + 7], pose_init[start_index + 8], pose_init[start_index + 9], pose_init[start_index + 10], pose_init[start_index + 11], pose_init[start_index + 12], pose_init[start_index + 13], pose_init[start_index + 14], pose_init[start_index + 15]; SE3 initialPoseMatrix = SE3(initialPose); // start point of a new object if (index == 0 || int(points[5 * (index-1) + 4]) != obj_index) { SE3 pose = deltaPoseMatrix * initialPoseMatrix; Eigen::Matrix matrix = pose.matrix3x4(); int count = 0; start_index = 16 * obj_index; for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) top_se3[start_index + count++] = matrix(i, j); } top_se3[start_index + 15] = 1.0; } // convert point Vec3 point; point << points[5 * index], points[5 * index + 1], points[5 * index + 2]; // transform the point const Vec3 updatedPoint = deltaPoseMatrix * initialPoseMatrix * point; // obtain sdf value start_index = 9 * cls_index; int d0 = int(sdf_limits[start_index + 6]); int d1 = int(sdf_limits[start_index + 7]); int d2 = int(sdf_limits[start_index + 8]); float px = (updatedPoint(0) - sdf_limits[start_index + 0]) / (sdf_limits[start_index + 3] - sdf_limits[start_index + 0]) * d0; float py = (updatedPoint(1) - sdf_limits[start_index + 1]) / (sdf_limits[start_index + 4] - sdf_limits[start_index + 1]) * d1; float pz = (updatedPoint(2) - sdf_limits[start_index + 2]) / (sdf_limits[start_index + 5] - sdf_limits[start_index + 2]) * d2; float3 pGrid = make_float3(px, py, pz); int3 dim = make_int3(d0, d1, d2); Dtype value = getValueInterpolated(pGrid, dim, sdf_grids + cls_index * d0 * d1 * d2); // L2 loss int flag = 1; if (value < 0) flag = -1; value *= flag; losses[index] = 0.5 * value * value; top_values[index] = losses[index]; // L2 penalty on translation // float lambda = 0.1; // losses[index] += 0.5 * lambda * (pose_delta[0] * pose_delta[0] + pose_delta[1] * pose_delta[1] + pose_delta[2] * pose_delta[2]); // compute gradient float3 grad = getGradientInterpolated(pGrid, dim, sdf_grids + cls_index * d0 * d1 * d2); Vec3 sdfUpdate; sdfUpdate << grad.x, grad.y, grad.z; Eigen::Matrix dUpdate; dUpdate << 1, 0, 0, 0, updatedPoint(2), -updatedPoint(1), 0, 1, 0, -updatedPoint(2), 0, updatedPoint(0), 0, 0, 1, updatedPoint(1), -updatedPoint(0), 0; Eigen::Matrix J = flag * sdfUpdate.transpose() * dUpdate; // assign gradient for (int i = 0; i < 6; i++) diffs[6 * index + i] = value * J(i); // L2 penalty on translation // diffs[6 * index + 0] += lambda * pose_delta[0]; // diffs[6 * index + 1] += lambda * pose_delta[1]; // diffs[6 * index + 2] += lambda * pose_delta[2]; // compute JTJ Eigen::Matrix result = J.transpose() * J; for (int i = 0; i < 6; i++) { for (int j = 0; j < 6; j++) JTJ[36 * index + i * 6 + j] = result(i, j); } } } /* diffs: num_points x num_channels */ /* bottom_diff: num_objects x num_channels */ template __global__ void sum_gradients(const int nthreads, const Dtype* diffs, const int num_channels, const Dtype* points, Dtype* bottom_diff) { CUDA_1D_KERNEL_LOOP(index, nthreads) { int p = index / num_channels; int c = index % num_channels; int obj_index = int(points[5 * p + 4]); atomicAdd(bottom_diff + obj_index * num_channels + c, diffs[index]); } } /*******************************************/ /* pose_delta: num_objects x 6 */ /* pose_init: num_objects x 4 x 4 */ /* sdf_grid: num_classes x c x h x w */ /* sdf_limits: num_classes x 9 */ /* points: num_points x 5 */ /*******************************************/ std::vector sdf_loss_cuda_forward( at::Tensor pose_delta, at::Tensor pose_init, at::Tensor sdf_grids, at::Tensor sdf_limits, at::Tensor points, at::Tensor regularization) { // run kernels cudaError_t err; const int kThreadsPerBlock = 512; const int num_channels = 6; int output_size; // sizes const int num_objects = pose_delta.size(0); const int num_classes = sdf_grids.size(0); const int num_points = points.size(0); // temp losses auto losses = at::zeros({num_points}, points.options()); auto top_values = at::zeros({num_points}, points.options()); auto top_data = at::zeros({1}, points.options()); auto top_se3 = at::zeros({num_objects, 4, 4}, points.options()); // temp diffs auto diffs = at::zeros({num_points, num_channels}, points.options()); auto JTJ = at::zeros({num_points, num_channels, num_channels}, points.options()); auto bottom_diff = at::zeros({num_objects, num_channels}, points.options()); auto bottom_JTJ = at::zeros({num_objects, num_channels, num_channels}, points.options()); // compute the losses and gradients output_size = num_points; SDFdistanceForward<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>( output_size, pose_delta.data(), pose_init.data(), sdf_grids.data(), sdf_limits.data(), points.data(), num_points, losses.data(), top_values.data(), diffs.data(), JTJ.data(), top_se3.data()); cudaDeviceSynchronize(); err = cudaGetLastError(); if(cudaSuccess != err) { fprintf( stderr, "cudaCheckError() failed: %s\n", cudaGetErrorString( err ) ); exit( -1 ); } // sum the diffs output_size = num_points * num_channels; sum_gradients<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>( output_size, diffs.data(), num_channels, points.data(), bottom_diff.data()); output_size = num_points * num_channels * num_channels; sum_gradients<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>( output_size, JTJ.data(), num_channels * num_channels, points.data(), bottom_JTJ.data()); cudaDeviceSynchronize(); // sum the loss thrust::device_ptr losses_ptr(losses.data()); float loss = thrust::reduce(losses_ptr, losses_ptr + num_points) / num_points; cudaMemcpy(top_data.data(), &loss, sizeof(float), cudaMemcpyHostToDevice); err = cudaGetLastError(); if(cudaSuccess != err) { fprintf( stderr, "cudaCheckError() failed: %s\n", cudaGetErrorString( err ) ); exit( -1 ); } // compute Gauss Newton update float* bottom_diff_host = (float*)malloc(num_objects * num_channels * sizeof(float)); float* regularization_host = (float*)malloc(num_channels * sizeof(float)); float* bottom_JTJ_host = (float*)malloc(num_objects * num_channels * num_channels * sizeof(float)); cudaMemcpy(bottom_diff_host, bottom_diff.data(), num_objects * num_channels * sizeof(float), cudaMemcpyDeviceToHost); cudaMemcpy(regularization_host, regularization.data(), num_channels * sizeof(float), cudaMemcpyDeviceToHost); cudaMemcpy(bottom_JTJ_host, bottom_JTJ.data(), num_objects * num_channels * num_channels * sizeof(float), cudaMemcpyDeviceToHost); Eigen::Matrix J_eigen; Eigen::Matrix JTJ_eigen; float* dalpha_all = (float*)malloc(num_objects * num_channels * sizeof(float)); for (int k = 0; k < num_objects; k++) { for (int i = 0; i < num_channels; i++) { J_eigen(i) = bottom_diff_host[k * num_channels + i]; for (int j = 0; j < num_channels; j++) JTJ_eigen(i, j) = bottom_JTJ_host[k * num_channels * num_channels + i * num_channels + j]; JTJ_eigen(i, i) += regularization_host[i]; } Eigen::Matrix dalpha = JTJ_eigen.ldlt().solve(J_eigen); for (int i = 0; i < num_channels; i++) dalpha_all[k * num_channels + i] = dalpha(i); } auto bottom_delta = at::zeros({num_objects, num_channels}, points.options()); cudaMemcpy(bottom_delta.data(), dalpha_all, num_objects * num_channels * sizeof(float), cudaMemcpyHostToDevice); free(bottom_diff_host); free(regularization_host); free(bottom_JTJ_host); free(dalpha_all); return {top_data, top_values, top_se3, bottom_delta, bottom_diff}; } template __global__ void SDFdistanceBackward(const int nthreads, const Dtype* top_diff, const Dtype* bottom_diff, Dtype* output) { CUDA_1D_KERNEL_LOOP(index, nthreads) { output[index] = top_diff[0] * bottom_diff[index]; } } std::vector sdf_loss_cuda_backward( at::Tensor grad_loss, at::Tensor bottom_diff) { cudaError_t err; const int kThreadsPerBlock = 512; int output_size; const int batch_size = bottom_diff.size(0); const int num_channels = bottom_diff.size(1); auto grad_pose = at::zeros({batch_size, num_channels}, bottom_diff.options()); output_size = batch_size * num_channels; SDFdistanceBackward<<<(output_size + kThreadsPerBlock - 1) / kThreadsPerBlock, kThreadsPerBlock>>>( output_size, grad_loss.data(), bottom_diff.data(), grad_pose.data()); cudaDeviceSynchronize(); err = cudaGetLastError(); if(cudaSuccess != err) { fprintf( stderr, "cudaCheckError() failed : %s\n", cudaGetErrorString( err ) ); exit( -1 ); } return {grad_pose}; } ================================================ FILE: lib/layers/setup.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md from setuptools import setup from torch.utils.cpp_extension import BuildExtension, CUDAExtension setup( name='posecnn', ext_modules=[ CUDAExtension( name='posecnn_cuda', sources = [ 'backproject_kernel.cu', 'sdf_matching_loss_kernel.cu', 'posecnn_layers.cpp', 'hard_label_kernel.cu', 'hough_voting_kernel.cu', 'roi_pooling_kernel.cu', 'ROIAlign_cuda.cu', 'point_matching_loss_kernel.cu'], include_dirs = ['/usr/local/include/eigen3', '/usr/local/include']) ], cmdclass={ 'build_ext': BuildExtension }) ================================================ FILE: lib/networks/PoseCNN.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import torch import torch.nn as nn import torchvision.models as models import math import sys import copy from torch.nn.init import kaiming_normal_ from layers.hard_label import HardLabel from layers.hough_voting import HoughVoting from layers.roi_pooling import RoIPool from layers.point_matching_loss import PMLoss from layers.roi_target_layer import roi_target_layer from layers.pose_target_layer import pose_target_layer from fcn.config import cfg __all__ = [ 'posecnn', ] vgg16 = models.vgg16(pretrained=False) def log_softmax_high_dimension(input): num_classes = input.size()[1] m = torch.max(input, dim=1, keepdim=True)[0] if input.dim() == 4: d = input - m.repeat(1, num_classes, 1, 1) else: d = input - m.repeat(1, num_classes) e = torch.exp(d) s = torch.sum(e, dim=1, keepdim=True) if input.dim() == 4: output = d - torch.log(s.repeat(1, num_classes, 1, 1)) else: output = d - torch.log(s.repeat(1, num_classes)) return output def softmax_high_dimension(input): num_classes = input.size()[1] m = torch.max(input, dim=1, keepdim=True)[0] if input.dim() == 4: e = torch.exp(input - m.repeat(1, num_classes, 1, 1)) else: e = torch.exp(input - m.repeat(1, num_classes)) s = torch.sum(e, dim=1, keepdim=True) if input.dim() == 4: output = torch.div(e, s.repeat(1, num_classes, 1, 1)) else: output = torch.div(e, s.repeat(1, num_classes)) return output def conv(in_planes, out_planes, kernel_size=3, stride=1, relu=True): if relu: return nn.Sequential( nn.Conv2d(in_planes, out_planes, kernel_size=kernel_size, stride=stride, padding=(kernel_size-1)//2, bias=True), nn.ReLU(inplace=True)) else: return nn.Conv2d(in_planes, out_planes, kernel_size=kernel_size, stride=stride, padding=(kernel_size-1)//2, bias=True) def fc(in_planes, out_planes, relu=True): if relu: return nn.Sequential( nn.Linear(in_planes, out_planes), nn.LeakyReLU(0.1, inplace=True)) else: return nn.Linear(in_planes, out_planes) def upsample(scale_factor): return nn.Upsample(scale_factor=scale_factor, mode='bilinear') class PoseCNN(nn.Module): def __init__(self, num_classes, num_units): super(PoseCNN, self).__init__() self.num_classes = num_classes # conv features features = list(vgg16.features)[:30] # change the first conv layer for RGBD if cfg.INPUT == 'RGBD': conv0 = conv(6, 64, kernel_size=3, relu=False) conv0.weight.data[:, :3, :, :] = features[0].weight.data conv0.weight.data[:, 3:, :, :] = features[0].weight.data conv0.bias.data = features[0].bias.data features[0] = conv0 self.features = nn.ModuleList(features) self.classifier = vgg16.classifier[:-1] if cfg.TRAIN.SLIM: dim_fc = 256 self.classifier[0] = nn.Linear(512*7*7, 256) self.classifier[3] = nn.Linear(256, 256) else: dim_fc = 4096 print(self.features) print(self.classifier) # freeze some layers if cfg.TRAIN.FREEZE_LAYERS: for i in [0, 2, 5, 7, 10, 12, 14]: self.features[i].weight.requires_grad = False self.features[i].bias.requires_grad = False # semantic labeling branch self.conv4_embed = conv(512, num_units, kernel_size=1) self.conv5_embed = conv(512, num_units, kernel_size=1) self.upsample_conv5_embed = upsample(2.0) self.upsample_embed = upsample(8.0) self.conv_score = conv(num_units, num_classes, kernel_size=1) self.hard_label = HardLabel(threshold=cfg.TRAIN.HARD_LABEL_THRESHOLD, sample_percentage=cfg.TRAIN.HARD_LABEL_SAMPLING) self.dropout = nn.Dropout() if cfg.TRAIN.VERTEX_REG: # center regression branch self.conv4_vertex_embed = conv(512, 2*num_units, kernel_size=1, relu=False) self.conv5_vertex_embed = conv(512, 2*num_units, kernel_size=1, relu=False) self.upsample_conv5_vertex_embed = upsample(2.0) self.upsample_vertex_embed = upsample(8.0) self.conv_vertex_score = conv(2*num_units, 3*num_classes, kernel_size=1, relu=False) # hough voting self.hough_voting = HoughVoting(is_train=0, skip_pixels=10, label_threshold=100, \ inlier_threshold=0.9, voting_threshold=-1, per_threshold=0.01) self.roi_pool_conv4 = RoIPool(pool_height=7, pool_width=7, spatial_scale=1.0 / 8.0) self.roi_pool_conv5 = RoIPool(pool_height=7, pool_width=7, spatial_scale=1.0 / 16.0) self.fc8 = fc(dim_fc, num_classes) self.fc9 = fc(dim_fc, 4 * num_classes, relu=False) if cfg.TRAIN.POSE_REG: self.fc10 = fc(dim_fc, 4 * num_classes, relu=False) self.pml = PMLoss(hard_angle=cfg.TRAIN.HARD_ANGLE) for m in self.modules(): if isinstance(m, nn.Conv2d) or isinstance(m, nn.ConvTranspose2d): kaiming_normal_(m.weight.data) if m.bias is not None: m.bias.data.zero_() elif isinstance(m, nn.BatchNorm2d): m.weight.data.fill_(1) m.bias.data.zero_() def forward(self, x, label_gt, meta_data, extents, gt_boxes, poses, points, symmetry): # conv features for i, model in enumerate(self.features): x = model(x) if i == 22: out_conv4_3 = x if i == 29: out_conv5_3 = x # semantic labeling branch out_conv4_embed = self.conv4_embed(out_conv4_3) out_conv5_embed = self.conv5_embed(out_conv5_3) out_conv5_embed_up = self.upsample_conv5_embed(out_conv5_embed) out_embed = self.dropout(out_conv4_embed + out_conv5_embed_up) out_embed_up = self.upsample_embed(out_embed) out_score = self.conv_score(out_embed_up) out_logsoftmax = log_softmax_high_dimension(out_score) out_prob = softmax_high_dimension(out_score) out_label = torch.max(out_prob, dim=1)[1].type(torch.IntTensor).cuda() out_weight = self.hard_label(out_prob, label_gt, torch.rand(out_prob.size()).cuda()) if cfg.TRAIN.VERTEX_REG: # center regression branch out_conv4_vertex_embed = self.conv4_vertex_embed(out_conv4_3) out_conv5_vertex_embed = self.conv5_vertex_embed(out_conv5_3) out_conv5_vertex_embed_up = self.upsample_conv5_vertex_embed(out_conv5_vertex_embed) out_vertex_embed = self.dropout(out_conv4_vertex_embed + out_conv5_vertex_embed_up) out_vertex_embed_up = self.upsample_vertex_embed(out_vertex_embed) out_vertex = self.conv_vertex_score(out_vertex_embed_up) # hough voting if self.training: self.hough_voting.is_train = 1 self.hough_voting.label_threshold = cfg.TRAIN.HOUGH_LABEL_THRESHOLD self.hough_voting.voting_threshold = cfg.TRAIN.HOUGH_VOTING_THRESHOLD self.hough_voting.skip_pixels = cfg.TRAIN.HOUGH_SKIP_PIXELS self.hough_voting.inlier_threshold = cfg.TRAIN.HOUGH_INLIER_THRESHOLD else: self.hough_voting.is_train = 0 self.hough_voting.label_threshold = cfg.TEST.HOUGH_LABEL_THRESHOLD self.hough_voting.voting_threshold = cfg.TEST.HOUGH_VOTING_THRESHOLD self.hough_voting.skip_pixels = cfg.TEST.HOUGH_SKIP_PIXELS self.hough_voting.inlier_threshold = cfg.TEST.HOUGH_INLIER_THRESHOLD out_box, out_pose = self.hough_voting(out_label, out_vertex, meta_data, extents) # bounding box classification and regression branch bbox_labels, bbox_targets, bbox_inside_weights, bbox_outside_weights = roi_target_layer(out_box, gt_boxes) out_roi_conv4 = self.roi_pool_conv4(out_conv4_3, out_box) out_roi_conv5 = self.roi_pool_conv5(out_conv5_3, out_box) out_roi = out_roi_conv4 + out_roi_conv5 out_roi_flatten = out_roi.view(out_roi.size(0), -1) out_fc7 = self.classifier(out_roi_flatten) out_fc8 = self.fc8(out_fc7) out_logsoftmax_box = log_softmax_high_dimension(out_fc8) bbox_prob = softmax_high_dimension(out_fc8) bbox_label_weights = self.hard_label(bbox_prob, bbox_labels, torch.rand(bbox_prob.size()).cuda()) bbox_pred = self.fc9(out_fc7) # rotation regression branch rois, poses_target, poses_weight = pose_target_layer(out_box, bbox_prob, bbox_pred, gt_boxes, poses, self.training) if cfg.TRAIN.POSE_REG: out_qt_conv4 = self.roi_pool_conv4(out_conv4_3, rois) out_qt_conv5 = self.roi_pool_conv5(out_conv5_3, rois) out_qt = out_qt_conv4 + out_qt_conv5 out_qt_flatten = out_qt.view(out_qt.size(0), -1) out_qt_fc7 = self.classifier(out_qt_flatten) out_quaternion = self.fc10(out_qt_fc7) # point matching loss poses_pred = nn.functional.normalize(torch.mul(out_quaternion, poses_weight)) if self.training: loss_pose = self.pml(poses_pred, poses_target, poses_weight, points, symmetry) if self.training: if cfg.TRAIN.VERTEX_REG: if cfg.TRAIN.POSE_REG: return out_logsoftmax, out_weight, out_vertex, out_logsoftmax_box, bbox_label_weights, \ bbox_pred, bbox_targets, bbox_inside_weights, loss_pose, poses_weight else: return out_logsoftmax, out_weight, out_vertex, out_logsoftmax_box, bbox_label_weights, \ bbox_pred, bbox_targets, bbox_inside_weights else: return out_logsoftmax, out_weight else: if cfg.TRAIN.VERTEX_REG: if cfg.TRAIN.POSE_REG: return out_label, out_vertex, rois, out_pose, out_quaternion else: return out_label, out_vertex, rois, out_pose else: return out_label def weight_parameters(self): return [param for name, param in self.named_parameters() if 'weight' in name] def bias_parameters(self): return [param for name, param in self.named_parameters() if 'bias' in name] def posecnn(num_classes, num_units, data=None): model = PoseCNN(num_classes, num_units) if data is not None: model_dict = model.state_dict() print('model keys') print('=================================================') for k, v in model_dict.items(): print(k) print('=================================================') print('data keys') print('=================================================') for k, v in data.items(): print(k) print('=================================================') pretrained_dict = {k: v for k, v in data.items() if k in model_dict and v.size() == model_dict[k].size()} print('load the following keys from the pretrained model') print('=================================================') for k, v in pretrained_dict.items(): print(k) print('=================================================') model_dict.update(pretrained_dict) model.load_state_dict(model_dict) return model ================================================ FILE: lib/networks/__init__.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md from .PoseCNN import * ================================================ FILE: lib/sdf/__init__.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md ================================================ FILE: lib/sdf/_init_paths.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md """Set up paths for Fast R-CNN.""" import os.path as osp import sys def add_path(path): if path not in sys.path: sys.path.insert(0, path) this_dir = osp.dirname(__file__) lib_path = osp.join(this_dir, '..') add_path(lib_path) ================================================ FILE: lib/sdf/multi_sdf_optimizer.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md from sdf_utils import * class multi_sdf_optimizer(): def __init__(self, sdf_file, lr=0.01, online_calib=True, use_gpu=False): self.use_gpu = use_gpu print(' start loading sdf ... ') sdf_info = read_sdf(sdf_file) sdf = sdf_info[0] min_coords = sdf_info[1] delta = sdf_info[2] max_coords = min_coords + delta * np.array(sdf.shape) self.xmin, self.ymin, self.zmin = min_coords self.xmax, self.ymax, self.zmax = max_coords self.sdf_torch = torch.from_numpy(sdf).float().permute(1, 0, 2).unsqueeze(0).unsqueeze(1) if self.use_gpu: self.sdf_torch = self.sdf_torch.cuda() print(' sdf size = {}x{}x{}'.format(self.sdf_torch.size(2), self.sdf_torch.size(3), self.sdf_torch.size(4))) print(' minimal coordinate = ({:.4f}, {:.4f}, {:.4f}) cm'.format(self.xmin * 100, self.ymin * 100, self.zmin * 100)) print(' maximal coordinate = ({:.4f}, {:.4f}, {:.4f}) cm'.format(self.xmax * 100, self.ymax * 100, self.zmax * 100)) print(' finished loading sdf ! ') if use_gpu: self.dpose = torch.tensor([0, 0, 0, 1e-12, 1e-12, 1e-12], dtype=torch.float32, requires_grad=True, device=0) else: self.dpose = torch.tensor([0, 0, 0, 1e-12, 1e-12, 1e-12], dtype=torch.float32, requires_grad=True) self.online_calib = online_calib if online_calib: if use_gpu: self.dpose_ext = torch.tensor([0, 0, 0, 1e-12, 1e-12, 1e-12], dtype=torch.float32, requires_grad=True, device=0) else: self.dpose_ext = torch.tensor([0, 0, 0, 1e-12, 1e-12, 1e-12], dtype=torch.float32, requires_grad=True) else: self.dpose_ext = torch.tensor([0, 0, 0, 1e-12, 1e-12, 1e-12], dtype=torch.float32, requires_grad=False) if use_gpu: self.dpose_ext = self.dpose_ext.cuda() if online_calib: self.optimizer = optim.Adam([self.dpose, self.dpose_ext], lr=lr) else: self.optimizer = optim.Adam([self.dpose], lr=lr) self.loss = nn.L1Loss(reduction='sum') self.loss_extrinsics = nn.L1Loss(reduction='mean') if use_gpu: self.loss = self.loss.cuda() self.loss_ext_t = self.loss_ext_t.cuda() self.loss_extrinsics = self.loss_extrinsics.cuda() def look_up(self, samples_x, samples_y, samples_z): samples_x = torch.clamp(samples_x, self.xmin, self.xmax) samples_y = torch.clamp(samples_y, self.ymin, self.ymax) samples_z = torch.clamp(samples_z, self.zmin, self.zmax) samples_x = (samples_x - self.xmin) / (self.xmax - self.xmin) samples_y = (samples_y - self.ymin) / (self.ymax - self.ymin) samples_z = (samples_z - self.zmin) / (self.zmax - self.zmin) samples = torch.cat((samples_z.unsqueeze(0).unsqueeze(2).unsqueeze(3).unsqueeze(4), samples_x.unsqueeze(0).unsqueeze(2).unsqueeze(3).unsqueeze(4), samples_y.unsqueeze(0).unsqueeze(2).unsqueeze(3).unsqueeze(4)), dim=4) samples = samples * 2 - 1 return F.grid_sample(self.sdf_torch, samples) def compute_dist(self, d_pose, T_oc_0, ps_c): ps_o = torch.mm(Oplus(T_oc_0, d_pose, self.use_gpu), ps_c.permute(1, 0)).permute(1, 0)[:, :3] dist = self.look_up(ps_o[:, 0], ps_o[:, 1], ps_o[:, 2]) return dist def compute_dist_multiview(self, d_pose, d_pose_ext, T_oc_0, T_rc_0, ps_c, T_r0rv): # convert points to referece camera frame T_rc = Oplus(T_rc_0, d_pose_ext, self.use_gpu) T_cr = torch.inverse(T_rc) T_c0cv = torch.matmul(T_cr.unsqueeze(0), torch.matmul(T_r0rv, T_rc.unsqueeze(0))) ps_c0_all = [] for i in range(len(ps_c)): ps_c0_all.append(torch.mm(T_c0cv[i], ps_c[i].permute(1, 0)).permute(1, 0).view(-1, 4)) ps_c0 = torch.cat(ps_c0_all, dim=0) dist = self.compute_dist(d_pose, T_oc_0, ps_c0) return dist def refine_pose_singleview(self, T_co_0, ps_c, steps=100): # input T_co_0: 4x4 # ps_c: nx4 if self.use_gpu: T_oc_0 = torch.from_numpy(np.linalg.inv(T_co_0)).cuda() else: T_oc_0 = torch.from_numpy(np.linalg.inv(T_co_0)) self.dpose.data[:3] *= 0 self.dpose.data[3:] = self.dpose.data[3:] * 0 + 1e-12 for i in range(steps): self.optimizer.zero_grad() dist = self.compute_dist(self.dpose, T_oc_0, ps_c) dist_target = torch.zeros_like(dist) if self.use_gpu: dist_target = dist_target.cuda() loss = self.loss(dist, dist_target) loss.backward() self.optimizer.step() # print('step: {}, loss = {}'.format(i + 1, loss.data.cpu().item())) T_oc_opt = Oplus(T_oc_0, self.dpose, self.use_gpu) T_co_opt = np.linalg.inv(T_oc_opt.cpu().detach().numpy()) dist = torch.mean(torch.abs(dist)).detach().cpu().numpy() return T_co_opt, dist def refine_pose_multiview(self, T_co_0, T_rc_0, ps_c, T_r0rv, steps=100): # input T_co_0: 4x4 Relative pose of # T_cr_0: 4x4 Extrinsics # T_r0rv: vx4x4 Relative pose between robot frame at time 0 and time v # ps_c: tuple vXn_ix4, point cloud in each frame if self.use_gpu: T_oc_0 = torch.from_numpy(np.linalg.inv(T_co_0)).cuda() T_rc_0 = torch.from_numpy(T_rc_0).cuda() T_r0rv = torch.from_numpy(T_r0rv).cuda() else: T_oc_0 = torch.from_numpy(np.linalg.inv(T_co_0)) T_rc_0 = torch.from_numpy(T_rc_0) T_r0rv = torch.from_numpy(T_r0rv) self.dpose.data[:3] *= 0 self.dpose.data[3:] = self.dpose.data[3:] * 0 + 1e-12 self.dpose_ext.data[:3] *= 0 self.dpose_ext.data[3:] = self.dpose.data[3:] * 0 + 1e-12 for i in range(steps): self.optimizer.zero_grad() dist = self.compute_dist_multiview(self.dpose, self.dpose_ext, T_oc_0, T_rc_0, ps_c, T_r0rv) dist_target = torch.zeros_like(dist) if self.use_gpu: dist_target = dist_target.cuda() loss = self.loss(dist, dist_target) + \ self.loss_extrinsics(self.dpose_ext[[0, 1, 2, 3, 5]], torch.zeros_like(self.dpose_ext[[0, 1, 2, 3, 5]])) * 1e8 loss.backward() self.optimizer.step() # print('step: {}, loss = {}'.format(i + 1, loss.data.cpu().item())) T_oc_opt = Oplus(T_oc_0, self.dpose, self.use_gpu) T_co_opt = np.linalg.inv(T_oc_opt.cpu().detach().numpy()) T_rc_opt = Oplus(T_rc_0, self.dpose_ext, self.use_gpu) T_rc_opt = T_rc_opt.cpu().detach().numpy() dist = torch.mean(torch.abs(dist)).detach().cpu().numpy() return T_co_opt, T_rc_opt, dist ================================================ FILE: lib/sdf/sdf_optimizer.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import sys import cv2 import time from .sdf_utils import * import _init_paths from fcn.config import cfg from layers.sdf_matching_loss import SDFLoss class sdf_optimizer(): def __init__(self, classes, sdf_files, lr=0.01, optimizer='Adam', use_gpu=True): self.classes = classes self.sdf_files = sdf_files self.use_gpu = use_gpu num = len(sdf_files) self.xmins = np.zeros((num, ), dtype=np.float32) self.ymins = np.zeros((num, ), dtype=np.float32) self.zmins = np.zeros((num, ), dtype=np.float32) self.xmaxs = np.zeros((num, ), dtype=np.float32) self.ymaxs = np.zeros((num, ), dtype=np.float32) self.zmaxs = np.zeros((num, ), dtype=np.float32) sdf_torch_list = [] for i in range(len(sdf_files)): sdf_file = sdf_files[i] print(' start loading sdf from {} ... '.format(sdf_file)) if sdf_file[-3:] == 'sdf': sdf_info = read_sdf(sdf_file) sdf = sdf_info[0] min_coords = sdf_info[1] delta = sdf_info[2] max_coords = min_coords + delta * np.array(sdf.shape) self.xmins[i], self.ymins[i], self.zmins[i] = min_coords self.xmaxs[i], self.ymaxs[i], self.zmaxs[i] = max_coords sdf_torch_list.append(torch.from_numpy(sdf).float()) elif sdf_file[-3:] == 'pth': sdf_info = torch.load(sdf_file) min_coords = sdf_info['min_coords'] max_coords = sdf_info['max_coords'] self.xmins[i], self.ymins[i], self.zmins[i] = min_coords self.xmaxs[i], self.ymaxs[i], self.zmaxs[i] = max_coords sdf_torch_list.append(sdf_info['sdf_torch'][0, 0].permute(1, 0, 2)) print(' minimal coordinate = ({:.4f}, {:.4f}, {:.4f}) cm'.format(self.xmins[i] * 100, self.ymins[i] * 100, self.zmins[i] * 100)) print(' maximal coordinate = ({:.4f}, {:.4f}, {:.4f}) cm'.format(self.xmaxs[i] * 100, self.ymaxs[i] * 100, self.zmaxs[i] * 100)) print(sdf_torch_list[-1].shape) print(' finished loading sdf ! ') # combine sdfs max_shape = np.array([sdf.shape for sdf in sdf_torch_list]).max(axis=0) self.sdf_torch = torch.ones((num, max_shape[0], max_shape[1], max_shape[2]), dtype=torch.float32) self.sdf_limits = np.zeros((num, 9), dtype=np.float32) for i in range(num): size = sdf_torch_list[i].shape self.sdf_torch[i, :size[0], :size[1], :size[2]] = sdf_torch_list[i] self.sdf_limits[i, 0] = self.xmins[i] self.sdf_limits[i, 1] = self.ymins[i] self.sdf_limits[i, 2] = self.zmins[i] self.sdf_limits[i, 3] = self.xmins[i] + (self.xmaxs[i] - self.xmins[i]) * max_shape[0] / size[0] self.sdf_limits[i, 4] = self.ymins[i] + (self.ymaxs[i] - self.ymins[i]) * max_shape[1] / size[1] self.sdf_limits[i, 5] = self.zmins[i] + (self.zmaxs[i] - self.zmins[i]) * max_shape[2] / size[2] self.sdf_limits[i, 6] = max_shape[0] self.sdf_limits[i, 7] = max_shape[1] self.sdf_limits[i, 8] = max_shape[2] self.sdf_limits = torch.from_numpy(self.sdf_limits) if self.use_gpu: self.sdf_torch = self.sdf_torch.cuda() self.sdf_limits = self.sdf_limits.cuda() self.sdf_loss = SDFLoss() def look_up(self, samples_x, samples_y, samples_z): samples_x = torch.clamp(samples_x, self.xmin, self.xmax) samples_y = torch.clamp(samples_y, self.ymin, self.ymax) samples_z = torch.clamp(samples_z, self.zmin, self.zmax) samples_x = (samples_x - self.xmin) / (self.xmax - self.xmin) samples_y = (samples_y - self.ymin) / (self.ymax - self.ymin) samples_z = (samples_z - self.zmin) / (self.zmax - self.zmin) samples = torch.cat((samples_z.unsqueeze(0).unsqueeze(2).unsqueeze(3).unsqueeze(4), samples_x.unsqueeze(0).unsqueeze(2).unsqueeze(3).unsqueeze(4), samples_y.unsqueeze(0).unsqueeze(2).unsqueeze(3).unsqueeze(4)), dim=4) samples = samples * 2 - 1 return F.grid_sample(self.sdf_torch, samples, padding_mode="border") def compute_dist(self, d_pose, T_oc_0, ps_c): ps_o = torch.mm(Oplus(T_oc_0, d_pose, self.use_gpu), ps_c.permute(1, 0)).permute(1, 0)[:, :3] dist = self.look_up(ps_o[:, 0], ps_o[:, 1], ps_o[:, 2]) return torch.abs(dist) def refine_pose(self, T_co_0, ps_c, steps=100): # input T_co_0: 4x4 # ps_c: nx4 if self.use_gpu: T_oc_0 = torch.from_numpy(np.linalg.inv(T_co_0)).cuda() else: T_oc_0 = torch.from_numpy(np.linalg.inv(T_co_0)) self.dpose.data[:3] *= 0 self.dpose.data[3:] = self.dpose.data[3:] * 0 + 1e-12 self.dist = torch.zeros((ps_c.size(0),)) if self.use_gpu: self.dist = self.dist.cuda() for i in range(steps): if self.optimizer_type == 'LBFGS': def closure(): self.optimizer.zero_grad() dist = self.compute_dist(self.dpose, T_oc_0, ps_c) self.dist = dist.detach() dist_target = torch.zeros_like(dist) if self.use_gpu: dist_target = dist_target.cuda() loss = self.loss(dist, dist_target) loss.backward() return loss self.optimizer.step(closure) elif self.optimizer_type == 'Adam': self.optimizer.zero_grad() dist = self.compute_dist(self.dpose, T_oc_0, ps_c) self.dist = dist.detach() dist_target = torch.zeros_like(dist) if self.use_gpu: dist_target = dist_target.cuda() loss = self.loss(dist, dist_target) loss.backward() self.optimizer.step() # print('step: {}, loss = {}'.format(i + 1, loss.data.cpu().item())) T_oc_opt = Oplus(T_oc_0, self.dpose, self.use_gpu) T_co_opt = np.linalg.inv(T_oc_opt.cpu().detach().numpy()) dist = torch.mean(torch.abs(self.dist)).detach().cpu().numpy() return T_co_opt, dist def refine_pose_layer(self, T_oc_0, points, steps=100): # input T_co_0: mx4x4, m is the number of objects # points: nx3 in camera # construct initial pose pose_init = torch.from_numpy(T_oc_0).cuda() m = T_oc_0.shape[0] dpose = torch.zeros((m, 6), dtype=torch.float32, requires_grad=True, device=0) dpose.data[:, :3] *= 0 dpose.data[:, 3:] = dpose.data[:, 3:] * 0 + 1e-12 treg = cfg.TEST.SDF_TRANSLATION_REG rreg = cfg.TEST.SDF_ROTATION_REG regularization = torch.tensor([treg, treg, treg, rreg, rreg, rreg], dtype=torch.float32, requires_grad=False, device=0) start = time.time() for i in range(steps): # self.optimizer.zero_grad() loss, sdf_values, T_oc_opt, dalpha, J = self.sdf_loss(dpose, pose_init, self.sdf_torch, self.sdf_limits, points, regularization) # print(loss) # loss.backward() # self.optimizer.step() # JTJ = JTJ.cpu().detach().numpy() + np.diag([100, 100, 100, 0.001, 0.001, 0.001]).astype(np.float32) # J = J.cpu().detach().numpy() # dalpha = torch.from_numpy(np.matmul(np.linalg.inv(JTJ), J)).cuda() dpose = dpose - dalpha # self.dpose = self.dpose - 0.001 * J end = time.time() print('sdf refinement iterations %d, time %f' % (steps, end - start)) return T_oc_opt.cpu().detach().numpy() ================================================ FILE: lib/sdf/sdf_utils.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import torch import matplotlib.pyplot as plt import numpy as np import torch.optim as optim import torch.nn as nn import torch.nn.init as init from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused import from transforms3d.quaternions import * from transforms3d.axangles import * import torch.nn.functional as F import time def read_sdf(sdf_file): with open(sdf_file, "r") as file: lines = file.readlines() nx, ny, nz = map(int, lines[0].split(' ')) x0, y0, z0 = map(float, lines[1].split(' ')) delta = float(lines[2].strip()) data = np.zeros([nx, ny, nz]) for i, line in enumerate(lines[3:]): idx = i % nx idy = int(i / nx) % ny idz = int(i / (nx * ny)) val = float(line.strip()) data[idx, idy, idz] = val return (data, np.array([x0, y0, z0]), delta) def skew(w, gpu=False): if gpu: wc = torch.stack((torch.tensor(0, dtype=torch.float32).cuda(), -w[2], w[1], w[2], torch.tensor(0, dtype=torch.float32).cuda(), -w[0], -w[1], w[0], torch.tensor(0, dtype=torch.float32).cuda() )).view(3, 3) else: wc = torch.stack((torch.tensor(0, dtype=torch.float32), -w[2], w[1], w[2], torch.tensor(0, dtype=torch.float32), -w[0], -w[1], w[0], torch.tensor(0, dtype=torch.float32) )).view(3, 3) return wc def Exp(dq, gpu): if gpu: I = torch.eye(3, dtype=torch.float32).cuda() else: I = torch.eye(3, dtype=torch.float32) dphi = torch.norm(dq, p=2, dim=0) if dphi > 0.05: u = 1/dphi * dq ux = skew(u, gpu) if gpu: dR = I + torch.sin(dphi) * ux + (torch.tensor(1, dtype=torch.float32).cuda() - torch.cos(dphi)) * torch.mm(ux, ux) else: dR = I + torch.sin(dphi) * ux + (torch.tensor(1, dtype=torch.float32) - torch.cos(dphi)) * torch.mm(ux, ux) else: dR = I + skew(dq, gpu) return dR def Oplus(T, v, gpu=False): dR = Exp(v[3:], gpu) dt = v[:3] if gpu: dT = torch.stack((dR[0, 0], dR[0, 1], dR[0, 2], dt[0], dR[1, 0], dR[1, 1], dR[1, 2], dt[1], dR[2, 0], dR[2, 1], dR[2, 2], dt[2], torch.tensor(0, dtype=torch.float32).cuda(), torch.tensor(0, dtype=torch.float32).cuda(), torch.tensor(0, dtype=torch.float32).cuda(), torch.tensor(1, dtype=torch.float32).cuda())).view(4, 4) else: dT = torch.stack((dR[0, 0], dR[0, 1], dR[0, 2], dt[0], dR[1, 0], dR[1, 1], dR[1, 2], dt[1], dR[2, 0], dR[2, 1], dR[2, 2], dt[2], torch.tensor(0, dtype=torch.float32), torch.tensor(0, dtype=torch.float32), torch.tensor(0, dtype=torch.float32), torch.tensor(1, dtype=torch.float32))).view(4, 4) return torch.mm(T, dT) ================================================ FILE: lib/sdf/test_sdf_optimizer.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md from sdf_optimizer import * from transforms3d.quaternions import mat2quat, quat2mat import cv2 def Twc_np(pose): Twc = np.zeros((4, 4), dtype=np.float32) Twc[:3, :3] = quat2mat(pose[3:]) Twc[:3, 3] = pose[:3] Twc[3, 3] = 1 return Twc try: import cPickle as pickle except: import pickle import numpy as np from itertools import izip_longest as izip class SignedDensityField(object): """ Data is stored in the following way data[x, y, z] """ def __init__(self, data, origin, delta): self.data = data self.nx, self.ny, self.nz = data.shape self.origin = origin self.delta = delta self.max_coords = self.origin + delta * np.array(data.shape) def _rel_pos_to_idxes(self, rel_pos): i_min = np.array([0, 0, 0], dtype=np.int) i_max = np.array([self.nx - 1, self.ny - 1, self.nz - 1], dtype=np.int) return np.clip(((rel_pos - self.origin) / self.delta).astype(int), i_min, i_max) def get_distance(self, rel_pos): idxes = self._rel_pos_to_idxes(rel_pos) assert idxes.shape[0] == rel_pos.shape[0] return self.data[idxes[:, 0], idxes[:, 1], idxes[:, 2]] def dump(self, pkl_file): data = {} data['data'] = self.data data['origin'] = self.origin data['delta'] = self.delta pickle.dump(data, open(pkl_file, "wb"), protocol=2) def visualize(self, max_dist=0.1): try: from mayavi import mlab except: print("mayavi is not installed!") figure = mlab.figure('Signed Density Field') SCALE = 100 # The dimensions will be expressed in cm for better visualization. data = np.copy(self.data) data = np.minimum(max_dist, data) xmin, ymin, zmin = SCALE * self.origin xmax, ymax, zmax = SCALE * self.max_coords delta = SCALE * self.delta xi, yi, zi = np.mgrid[xmin:xmax:delta, ymin:ymax:delta, zmin:zmax:delta] data[data <= 0] -= 0.2 data = -data grid = mlab.pipeline.scalar_field(xi, yi, zi, data) vmin = np.min(data) vmax = np.max(data) mlab.pipeline.volume(grid, vmin=vmin, vmax=(vmax + vmin) / 2) mlab.axes() mlab.show() @classmethod def from_sdf(cls, sdf_file): with open(sdf_file, "r") as file: axis = 2 lines = file.readlines() nx, ny, nz = map(int, lines[0].split(' ')) print(nx, ny, nz) x0, y0, z0 = map(float, lines[1].split(' ')) print(x0, y0, z0) delta = float(lines[2].strip()) print(delta) data = np.zeros([nx, ny, nz]) for i, line in enumerate(lines[3:]): idx = i % nx idy = int(i / nx) % ny idz = int(i / (nx * ny)) val = float(line.strip()) data[idx, idy, idz] = val return cls(data, np.array([x0, y0, z0]), delta) @classmethod def from_pkl(cls, pkl_file): data = pickle.load(open(pkl_file, "r")) return cls(data['data'], data['origin'], data['delta']) if __name__ == '__main__': # object_name = '002_master_chef_can' # object_name = '037_scissors' # object_name = '061_foam_brick' object_name = '007_tuna_fish_can' visualize_sdf = False sdf_file = '../../data/YCB_Object/models/{}/textured_simple_low_res.pth'.format(object_name) sdf_optim = sdf_optimizer(sdf_file, lr=0.01, use_gpu=True, optimizer='Adam') print(torch.max(sdf_optim.sdf_torch)) print(torch.min(sdf_optim.sdf_torch)) if visualize_sdf: sdf_show = SignedDensityField.from_sdf(sdf_file) sdf_show.visualize() # load points of the same object point_file = '../../data/YCB_Object/models/{}/points.xyz'.format(object_name) points = torch.from_numpy(np.loadtxt(point_file)).float() points = torch.cat((points, torch.ones((points.size(0), 1), dtype=torch.float32)), dim=1) points_np = points.numpy() print(points_np.shape) # set ground truth pose pose_gt = np.zeros((7,), dtype=np.float32) pose_gt[:3] = np.array([1, 1, 1], dtype=np.float32) R = np.array([[-1, 0, 0], [0, np.sqrt(0.5), -np.sqrt(0.5)], [0, -np.sqrt(0.5), -np.sqrt(0.5)]], dtype=np.float32) pose_gt[3:] = mat2quat(R) # get measurements Twc_gt = Twc_np(pose_gt) points_c = np.matmul(np.linalg.inv(Twc_gt), np.transpose(points_np)).transpose() points_c = torch.from_numpy(points_c) index = np.random.permutation(np.arange(points_c.shape[0]))[:2000] points_c = points_c[index, :] print(points_c.shape) T_co_init = np.linalg.inv(Twc_gt) R_perturb = axangle2mat(np.random.rand(3,), 40 * np.random.rand() / 57.3, is_normalized=False) T_co_init[:3, :3] = np.matmul(T_co_init[:3, :3], R_perturb) T_co_init[:3, 3] += 0.01 points_init = np.matmul(np.linalg.inv(T_co_init), points_c.numpy().transpose()).transpose() # optimization points_input = points_c[:, :3].clone().cuda() T_co_opt, sdf_values = sdf_optim.refine_pose_layer(T_co_init, points_input, steps=100) print(T_co_opt) print(np.linalg.inv(Twc_gt)) np.set_printoptions(threshold=sys.maxsize) # print(sdf_values.detach().cpu().numpy()) # visualization for debugging points_opt = np.matmul(np.linalg.inv(T_co_opt), points_c.numpy().transpose()).transpose() fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(points_np[::5, 0], points_np[::5, 1], points_np[::5, 2], color='green') ax.scatter(points_init[::5, 0], points_init[::5, 1], points_init[::5, 2], color='red') ax.scatter(points_opt[::5, 0], points_opt[::5, 1], points_opt[::5, 2], color='blue') ax.set_xlabel('X Label') ax.set_ylabel('Y Label') ax.set_zlabel('Z Label') min_coor = np.min(np.array([sdf_optim.xmin, sdf_optim.ymin, sdf_optim.zmin])) max_coor = np.max(np.array([sdf_optim.xmax, sdf_optim.ymax, sdf_optim.zmax])) ax.set_xlim(min_coor, max_coor) ax.set_ylim(min_coor, max_coor) ax.set_zlim(min_coor, max_coor) plt.show() ================================================ FILE: lib/utils/__init__.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md ================================================ FILE: lib/utils/bbox.pyx ================================================ # -------------------------------------------------------- # Fast R-CNN # Copyright (c) 2015 Microsoft # Licensed under The MIT License [see LICENSE for details] # Written by Sergey Karayev # -------------------------------------------------------- cimport cython import numpy as np cimport numpy as np DTYPE = np.float ctypedef np.float_t DTYPE_t def bbox_overlaps( np.ndarray[DTYPE_t, ndim=2] boxes, np.ndarray[DTYPE_t, ndim=2] query_boxes): """ Parameters ---------- boxes: (N, 5) ndarray of float (batch_id, x1, y1, x2, y2) query_boxes: (K, 5) ndarray of float (batch_id, x1, y1, x2, y2) Returns ------- overlaps: (N, K) ndarray of overlap between boxes and query_boxes """ cdef unsigned int N = boxes.shape[0] cdef unsigned int K = query_boxes.shape[0] cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE) cdef DTYPE_t iw, ih, box_area cdef DTYPE_t ua cdef unsigned int k, n for k in range(K): box_area = ( (query_boxes[k, 2+1] - query_boxes[k, 0+1] + 1) * (query_boxes[k, 3+1] - query_boxes[k, 1+1] + 1) ) for n in range(N): if query_boxes[k, 0] == boxes[n, 0]: iw = ( min(boxes[n, 2+1], query_boxes[k, 2+1]) - max(boxes[n, 0+1], query_boxes[k, 0+1]) + 1 ) if iw > 0: ih = ( min(boxes[n, 3+1], query_boxes[k, 3+1]) - max(boxes[n, 1+1], query_boxes[k, 1+1]) + 1 ) if ih > 0: ua = float( (boxes[n, 2+1] - boxes[n, 0+1] + 1) * (boxes[n, 3+1] - boxes[n, 1+1] + 1) + box_area - iw * ih ) overlaps[n, k] = iw * ih / ua return overlaps ================================================ FILE: lib/utils/bbox_transform.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md from __future__ import absolute_import from __future__ import division from __future__ import print_function import numpy as np def bbox_transform(ex_rois, gt_rois): ex_widths = ex_rois[:, 2] - ex_rois[:, 0] + 1.0 ex_heights = ex_rois[:, 3] - ex_rois[:, 1] + 1.0 ex_ctr_x = ex_rois[:, 0] + 0.5 * ex_widths ex_ctr_y = ex_rois[:, 1] + 0.5 * ex_heights gt_widths = gt_rois[:, 2] - gt_rois[:, 0] + 1.0 gt_heights = gt_rois[:, 3] - gt_rois[:, 1] + 1.0 gt_ctr_x = gt_rois[:, 0] + 0.5 * gt_widths gt_ctr_y = gt_rois[:, 1] + 0.5 * gt_heights targets_dx = (gt_ctr_x - ex_ctr_x) / ex_widths targets_dy = (gt_ctr_y - ex_ctr_y) / ex_heights targets_dw = np.log(gt_widths / ex_widths) targets_dh = np.log(gt_heights / ex_heights) targets = np.vstack( (targets_dx, targets_dy, targets_dw, targets_dh)).transpose() return targets def bbox_transform_inv(boxes, deltas): if boxes.shape[0] == 0: return np.zeros((0, deltas.shape[1]), dtype=deltas.dtype) boxes = boxes.astype(deltas.dtype, copy=False) widths = boxes[:, 2] - boxes[:, 0] + 1.0 heights = boxes[:, 3] - boxes[:, 1] + 1.0 ctr_x = boxes[:, 0] + 0.5 * widths ctr_y = boxes[:, 1] + 0.5 * heights dx = deltas[:, 0::4] dy = deltas[:, 1::4] dw = deltas[:, 2::4] dh = deltas[:, 3::4] pred_ctr_x = dx * widths[:, np.newaxis] + ctr_x[:, np.newaxis] pred_ctr_y = dy * heights[:, np.newaxis] + ctr_y[:, np.newaxis] pred_w = np.exp(dw) * widths[:, np.newaxis] pred_h = np.exp(dh) * heights[:, np.newaxis] pred_boxes = np.zeros(deltas.shape, dtype=deltas.dtype) # x1 pred_boxes[:, 0::4] = pred_ctr_x - 0.5 * pred_w # y1 pred_boxes[:, 1::4] = pred_ctr_y - 0.5 * pred_h # x2 pred_boxes[:, 2::4] = pred_ctr_x + 0.5 * pred_w # y2 pred_boxes[:, 3::4] = pred_ctr_y + 0.5 * pred_h return pred_boxes def clip_boxes(boxes, im_shape): """ Clip boxes to image boundaries. """ # x1 >= 0 boxes[:, 0::4] = np.maximum(np.minimum(boxes[:, 0::4], im_shape[1] - 1), 0) # y1 >= 0 boxes[:, 1::4] = np.maximum(np.minimum(boxes[:, 1::4], im_shape[0] - 1), 0) # x2 < im_shape[1] boxes[:, 2::4] = np.maximum(np.minimum(boxes[:, 2::4], im_shape[1] - 1), 0) # y2 < im_shape[0] boxes[:, 3::4] = np.maximum(np.minimum(boxes[:, 3::4], im_shape[0] - 1), 0) return boxes ================================================ FILE: lib/utils/blob.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md """Blob helper functions.""" import torch import torch.nn as nn import numpy as np import cv2 import random def im_list_to_blob(ims, num_channels): """Convert a list of images into a network input. Assumes images are already prepared (means subtracted, BGR order, ...). """ max_shape = np.array([im.shape for im in ims]).max(axis=0) num_images = len(ims) blob = np.zeros((num_images, max_shape[0], max_shape[1], num_channels), dtype=np.float32) for i in xrange(num_images): im = ims[i] if num_channels == 1: blob[i, 0:im.shape[0], 0:im.shape[1], :] = im[:,:,np.newaxis] else: blob[i, 0:im.shape[0], 0:im.shape[1], :] = im return blob def prep_im_for_blob(im, pixel_means, target_size, max_size): """Mean subtract and scale an image for use in a blob.""" im = im.astype(np.float32, copy=False) im -= pixel_means im_shape = im.shape im_size_min = np.min(im_shape[0:2]) im_size_max = np.max(im_shape[0:2]) im_scale = float(target_size) / float(im_size_min) # Prevent the biggest axis from being more than MAX_SIZE if np.round(im_scale * im_size_max) > max_size: im_scale = float(max_size) / float(im_size_max) im = cv2.resize(im, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_LINEAR) return im, im_scale def pad_im(im, factor, value=0): height = im.shape[0] width = im.shape[1] pad_height = int(np.ceil(height / float(factor)) * factor - height) pad_width = int(np.ceil(width / float(factor)) * factor - width) if len(im.shape) == 3: return np.lib.pad(im, ((0, pad_height), (0, pad_width), (0,0)), 'constant', constant_values=value) elif len(im.shape) == 2: return np.lib.pad(im, ((0, pad_height), (0, pad_width)), 'constant', constant_values=value) def unpad_im(im, factor): height = im.shape[0] width = im.shape[1] pad_height = int(np.ceil(height / float(factor)) * factor - height) pad_width = int(np.ceil(width / float(factor)) * factor - width) if len(im.shape) == 3: return im[0:height-pad_height, 0:width-pad_width, :] elif len(im.shape) == 2: return im[0:height-pad_height, 0:width-pad_width] def chromatic_transform(im, label=None, d_h=None, d_s=None, d_l=None): """ Given an image array, add the hue, saturation and luminosity to the image """ # Set random hue, luminosity and saturation which ranges from -0.1 to 0.1 if d_h is None: d_h = (np.random.rand(1) - 0.5) * 0.1 * 180 if d_l is None: d_l = (np.random.rand(1) - 0.5) * 0.2 * 256 if d_s is None: d_s = (np.random.rand(1) - 0.5) * 0.2 * 256 # Convert the BGR to HLS hls = cv2.cvtColor(im, cv2.COLOR_BGR2HLS) h, l, s = cv2.split(hls) # Add the values to the image H, L, S new_h = (h + d_h) % 180 new_l = np.clip(l + d_l, 0, 255) new_s = np.clip(s + d_s, 0, 255) # Convert the HLS to BGR new_hls = cv2.merge((new_h, new_l, new_s)).astype('uint8') new_im = cv2.cvtColor(new_hls, cv2.COLOR_HLS2BGR) if label is not None: I = np.where(label > 0) new_im[I[0], I[1], :] = im[I[0], I[1], :] return new_im def add_noise(image, level = 0.1): # random number r = np.random.rand(1) # gaussian noise if r < 0.9: row,col,ch= image.shape mean = 0 noise_level = random.uniform(0, level) sigma = np.random.rand(1) * noise_level * 256 gauss = sigma * np.random.randn(row,col) + mean gauss = np.repeat(gauss[:, :, np.newaxis], ch, axis=2) noisy = image + gauss noisy = np.clip(noisy, 0, 255) else: # motion blur sizes = [3, 5, 7, 9, 11, 15] size = sizes[int(np.random.randint(len(sizes), size=1))] kernel_motion_blur = np.zeros((size, size)) if np.random.rand(1) < 0.5: kernel_motion_blur[int((size-1)/2), :] = np.ones(size) else: kernel_motion_blur[:, int((size-1)/2)] = np.ones(size) kernel_motion_blur = kernel_motion_blur / size noisy = cv2.filter2D(image, -1, kernel_motion_blur) return noisy.astype('uint8') def add_noise_depth(image, level = 0.1): row,col,ch= image.shape noise_level = random.uniform(0, level) gauss = noise_level * np.random.randn(row,col) gauss = np.repeat(gauss[:, :, np.newaxis], ch, axis=2) noisy = image + gauss return noisy def add_noise_depth_cuda(image, level = 0.1): noise_level = random.uniform(0, level) gauss = torch.randn_like(image) * noise_level noisy = image + gauss return noisy def add_gaussian_noise_cuda(image, level = 0.1): # gaussian noise noise_level = random.uniform(0, level) gauss = torch.randn_like(image) * noise_level noisy = image + gauss noisy = torch.clamp(noisy, 0, 1.0) return noisy def add_noise_cuda(image, level = 0.1): # random number r = np.random.rand(1) # gaussian noise if r < 0.8: noise_level = random.uniform(0, level) gauss = torch.randn_like(image) * noise_level noisy = image + gauss noisy = torch.clamp(noisy, 0, 1.0) else: # motion blur sizes = [3, 5, 7, 9, 11, 15] size = sizes[int(np.random.randint(len(sizes), size=1))] kernel_motion_blur = torch.zeros((size, size)) if np.random.rand(1) < 0.5: kernel_motion_blur[int((size-1)/2), :] = torch.ones(size) else: kernel_motion_blur[:, int((size-1)/2)] = torch.ones(size) kernel_motion_blur = kernel_motion_blur.cuda() / size kernel_motion_blur = kernel_motion_blur.view(1, 1, size, size) kernel_motion_blur = kernel_motion_blur.repeat(image.size(2), 1, 1, 1) motion_blur_filter = nn.Conv2d(in_channels=image.size(2), out_channels=image.size(2), kernel_size=size, groups=image.size(2), bias=False, padding=int(size/2)) motion_blur_filter.weight.data = kernel_motion_blur motion_blur_filter.weight.requires_grad = False noisy = motion_blur_filter(image.permute(2, 0, 1).unsqueeze(0)) noisy = noisy.squeeze(0).permute(1, 2, 0) return noisy ================================================ FILE: lib/utils/nms.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import numpy as np def nms(dets, thresh): cls = dets[:, 1] x1 = dets[:, 2] y1 = dets[:, 3] x2 = dets[:, 4] y2 = dets[:, 5] scores = dets[:, 6] areas = (x2 - x1 + 1) * (y2 - y1 + 1) order = scores.argsort()[::-1] keep = [] while order.size > 0: i = order[0] keep.append(i) xx1 = np.maximum(x1[i], x1[order[1:]]) yy1 = np.maximum(y1[i], y1[order[1:]]) xx2 = np.minimum(x2[i], x2[order[1:]]) yy2 = np.minimum(y2[i], y2[order[1:]]) w = np.maximum(0.0, xx2 - xx1 + 1) h = np.maximum(0.0, yy2 - yy1 + 1) inter = w * h ovr = inter / (areas[i] + areas[order[1:]] - inter) inds = np.where(~((ovr > thresh) & (cls[order[1:]] == cls[i])))[0] #inds = np.where(ovr <= thresh)[0] order = order[inds + 1] return keep ================================================ FILE: lib/utils/pose_error.py ================================================ # Author: Tomas Hodan (hodantom@cmp.felk.cvut.cz) # Center for Machine Perception, Czech Technical University in Prague # Implementation of the pose error functions described in: # Hodan et al., "On Evaluation of 6D Object Pose Estimation", ECCVW 2016 import math import numpy as np from scipy import spatial from transforms3d.quaternions import quat2mat, mat2quat def VOCap(rec, prec): index = np.where(np.isfinite(rec))[0] rec = rec[index] prec = prec[index] if len(rec) == 0 or len(prec) == 0: ap = 0 else: mrec = np.insert(rec, 0, 0) mrec = np.append(mrec, 0.1) mpre = np.insert(prec, 0, 0) mpre = np.append(mpre, prec[-1]) for i in range(1, len(mpre)): mpre[i] = max(mpre[i], mpre[i-1]) i = np.where(mrec[1:] != mrec[:-1])[0] + 1 ap = np.sum(np.multiply(mrec[i] - mrec[i-1], mpre[i])) * 10 return ap def transform_pts_Rt(pts, R, t): """ Applies a rigid transformation to 3D points. :param pts: nx3 ndarray with 3D points. :param R: 3x3 rotation matrix. :param t: 3x1 translation vector. :return: nx3 ndarray with transformed 3D points. """ assert(pts.shape[1] == 3) pts_t = R.dot(pts.T) + t.reshape((3, 1)) return pts_t.T def reproj(K, R_est, t_est, R_gt, t_gt, pts): """ reprojection error. :param K intrinsic matrix :param R_est, t_est: Estimated pose (3x3 rot. matrix and 3x1 trans. vector). :param R_gt, t_gt: GT pose (3x3 rot. matrix and 3x1 trans. vector). :param model: Object model given by a dictionary where item 'pts' is nx3 ndarray with 3D model points. :return: Error of pose_est w.r.t. pose_gt. """ pts_est = transform_pts_Rt(pts, R_est, t_est) pts_gt = transform_pts_Rt(pts, R_gt, t_gt) pixels_est = K.dot(pts_est.T) pixels_est = pixels_est.T pixels_gt = K.dot(pts_gt.T) pixels_gt = pixels_gt.T n = pts.shape[0] est = np.zeros((n, 2), dtype=np.float32); est[:, 0] = np.divide(pixels_est[:, 0], pixels_est[:, 2]) est[:, 1] = np.divide(pixels_est[:, 1], pixels_est[:, 2]) gt = np.zeros((n, 2), dtype=np.float32); gt[:, 0] = np.divide(pixels_gt[:, 0], pixels_gt[:, 2]) gt[:, 1] = np.divide(pixels_gt[:, 1], pixels_gt[:, 2]) e = np.linalg.norm(est - gt, axis=1).mean() return e def add(R_est, t_est, R_gt, t_gt, pts): """ Average Distance of Model Points for objects with no indistinguishable views - by Hinterstoisser et al. (ACCV 2012). :param R_est, t_est: Estimated pose (3x3 rot. matrix and 3x1 trans. vector). :param R_gt, t_gt: GT pose (3x3 rot. matrix and 3x1 trans. vector). :param model: Object model given by a dictionary where item 'pts' is nx3 ndarray with 3D model points. :return: Error of pose_est w.r.t. pose_gt. """ pts_est = transform_pts_Rt(pts, R_est, t_est) pts_gt = transform_pts_Rt(pts, R_gt, t_gt) e = np.linalg.norm(pts_est - pts_gt, axis=1).mean() return e def adi(R_est, t_est, R_gt, t_gt, pts): """ Average Distance of Model Points for objects with indistinguishable views - by Hinterstoisser et al. (ACCV 2012). :param R_est, t_est: Estimated pose (3x3 rot. matrix and 3x1 trans. vector). :param R_gt, t_gt: GT pose (3x3 rot. matrix and 3x1 trans. vector). :param model: Object model given by a dictionary where item 'pts' is nx3 ndarray with 3D model points. :return: Error of pose_est w.r.t. pose_gt. """ pts_est = transform_pts_Rt(pts, R_est, t_est) pts_gt = transform_pts_Rt(pts, R_gt, t_gt) # Calculate distances to the nearest neighbors from pts_gt to pts_est nn_index = spatial.cKDTree(pts_est) nn_dists, _ = nn_index.query(pts_gt, k=1) e = nn_dists.mean() return e def re(R_est, R_gt): """ Rotational Error. :param R_est: Rotational element of the estimated pose (3x1 vector). :param R_gt: Rotational element of the ground truth pose (3x1 vector). :return: Error of t_est w.r.t. t_gt. """ assert(R_est.shape == R_gt.shape == (3, 3)) error_cos = 0.5 * (np.trace(R_est.dot(np.linalg.inv(R_gt))) - 1.0) error_cos = min(1.0, max(-1.0, error_cos)) # Avoid invalid values due to numerical errors error = math.acos(error_cos) error = 180.0 * error / np.pi # [rad] -> [deg] return error def te(t_est, t_gt): """ Translational Error. :param t_est: Translation element of the estimated pose (3x1 vector). :param t_gt: Translation element of the ground truth pose (3x1 vector). :return: Error of t_est w.r.t. t_gt. """ assert(t_est.size == t_gt.size == 3) error = np.linalg.norm(t_gt - t_est) return error ================================================ FILE: lib/utils/se3.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import numpy as np from transforms3d.quaternions import mat2quat, quat2mat, qmult, qinverse from transforms3d.euler import quat2euler, mat2euler, euler2quat # RT is a 3x4 matrix def se3_inverse(RT): R = RT[0:3, 0:3] T = RT[0:3, 3].reshape((3,1)) RT_new = np.zeros((3, 4), dtype=np.float32) RT_new[0:3, 0:3] = R.transpose() RT_new[0:3, 3] = -1 * np.dot(R.transpose(), T).reshape((3)) return RT_new def se3_mul(RT1, RT2): R1 = RT1[0:3, 0:3] T1 = RT1[0:3, 3].reshape((3,1)) R2 = RT2[0:3, 0:3] T2 = RT2[0:3, 3].reshape((3,1)) RT_new = np.zeros((3, 4), dtype=np.float32) RT_new[0:3, 0:3] = np.dot(R1, R2) T_new = np.dot(R1, T2) + T1 RT_new[0:3, 3] = T_new.reshape((3)) return RT_new def egocentric2allocentric(qt, T): dx = np.arctan2(T[0], -T[2]) dy = np.arctan2(T[1], -T[2]) quat = euler2quat(-dy, -dx, 0, axes='sxyz') quat = qmult(qinverse(quat), qt) return quat def allocentric2egocentric(qt, T): dx = np.arctan2(T[0], -T[2]) dy = np.arctan2(T[1], -T[2]) quat = euler2quat(-dy, -dx, 0, axes='sxyz') quat = qmult(quat, qt) return quat def T_inv_transform(T_src, T_tgt): ''' :param T_src: :param T_tgt: :return: T_delta: delta in pixel ''' T_delta = np.zeros((3, ), dtype=np.float32) T_delta[0] = T_tgt[0] / T_tgt[2] - T_src[0] / T_src[2] T_delta[1] = T_tgt[1] / T_tgt[2] - T_src[1] / T_src[2] T_delta[2] = np.log(T_src[2] / T_tgt[2]) return T_delta def rotation_x(theta): t = theta * np.pi / 180.0 R = np.zeros((3, 3), dtype=np.float32) R[0, 0] = 1 R[1, 1] = np.cos(t) R[1, 2] = -np.sin(t) R[2, 1] = np.sin(t) R[2, 2] = np.cos(t) return R def rotation_y(theta): t = theta * np.pi / 180.0 R = np.zeros((3, 3), dtype=np.float32) R[0, 0] = np.cos(t) R[0, 2] = np.sin(t) R[1, 1] = 1 R[2, 0] = -np.sin(t) R[2, 2] = np.cos(t) return R def rotation_z(theta): t = theta * np.pi / 180.0 R = np.zeros((3, 3), dtype=np.float32) R[0, 0] = np.cos(t) R[0, 1] = -np.sin(t) R[1, 0] = np.sin(t) R[1, 1] = np.cos(t) R[2, 2] = 1 return R ================================================ FILE: lib/utils/segmentation_evaluation.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import sys, os import numpy as np import cv2 # This function is modeled off of P/R/F measure as described by Dave et al. (arXiv19) def multilabel_metrics(prediction, gt, num_classes): """ Computes F-Measure, Precision, Recall, IoU, #objects detected, #confident objects detected, #GT objects. It computes these measures only of objects, not background (0)/table (1). Uses the Hungarian algorithm to match predicted masks with ground truth masks. A "confident object" is an object that is predicted with more than 0.75 F-measure @param gt: a [H x W] numpy.ndarray with ground truth masks @param prediction: a [H x W] numpy.ndarray with predicted masks @return: a dictionary with the metrics """ precisions = np.zeros((num_classes, ), dtype=np.float32) recalls = np.zeros((num_classes, ), dtype=np.float32) f1s = np.zeros((num_classes, ), dtype=np.float32) count = np.zeros((num_classes, ), dtype=np.float32) # for each class for cls in range(num_classes): gt_mask = (gt == cls) pred_mask = (prediction == cls) A = np.logical_and(pred_mask, gt_mask) count_true = np.count_nonzero(A) count_pred = np.count_nonzero(pred_mask) count_gt = np.count_nonzero(gt_mask) # precision if count_pred > 0: precisions[cls] = float(count_true) / float(count_pred) # recall if count_gt > 0: recalls[cls] = float(count_true) / float(count_gt) count[cls] = 1 # F-measure if precisions[cls] + recalls[cls] != 0: f1s[cls] = (2 * precisions[cls] * recalls[cls]) / (precisions[cls] + recalls[cls]) return {'F-measure' : f1s, 'Precision' : precisions, 'Recall' : recalls, 'Count': count} ================================================ FILE: lib/utils/setup.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import os from os.path import join as pjoin import numpy as np from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext def find_in_path(name, path): "Find a file in a search path" #adapted fom http://code.activestate.com/recipes/52224-find-a-file-given-a-search-path/ for dir in path.split(os.pathsep): binpath = pjoin(dir, name) if os.path.exists(binpath): return os.path.abspath(binpath) return None def locate_cuda(): """Locate the CUDA environment on the system Returns a dict with keys 'home', 'nvcc', 'include', and 'lib64' and values giving the absolute path to each directory. Starts by looking for the CUDAHOME env variable. If not found, everything is based on finding 'nvcc' in the PATH. """ # first check if the CUDAHOME env variable is in use if 'CUDAHOME' in os.environ: home = os.environ['CUDAHOME'] nvcc = pjoin(home, 'bin', 'nvcc') else: # otherwise, search the PATH for NVCC default_path = pjoin(os.sep, 'usr', 'local', 'cuda', 'bin') nvcc = find_in_path('nvcc', os.environ['PATH'] + os.pathsep + default_path) if nvcc is None: raise EnvironmentError('The nvcc binary could not be ' 'located in your $PATH. Either add it to your path, or set $CUDAHOME') home = os.path.dirname(os.path.dirname(nvcc)) cudaconfig = {'home':home, 'nvcc':nvcc, 'include': pjoin(home, 'include'), 'lib64': pjoin(home, 'lib64')} for k, v in cudaconfig.items(): if not os.path.exists(v): raise EnvironmentError('The CUDA %s path could not be located in %s' % (k, v)) return cudaconfig CUDA = locate_cuda() # Obtain the numpy include directory. This logic works across numpy versions. try: numpy_include = np.get_include() except AttributeError: numpy_include = np.get_numpy_include() def customize_compiler_for_nvcc(self): """inject deep into distutils to customize how the dispatch to gcc/nvcc works. If you subclass UnixCCompiler, it's not trivial to get your subclass injected in, and still have the right customizations (i.e. distutils.sysconfig.customize_compiler) run on it. So instead of going the OO route, I have this. Note, it's kindof like a wierd functional subclassing going on.""" # tell the compiler it can processes .cu self.src_extensions.append('.cu') # save references to the default compiler_so and _comple methods default_compiler_so = self.compiler_so super = self._compile # now redefine the _compile method. This gets executed for each # object but distutils doesn't have the ability to change compilers # based on source extension: we add it. def _compile(obj, src, ext, cc_args, extra_postargs, pp_opts): if os.path.splitext(src)[1] == '.cu': # use the cuda for .cu files self.set_executable('compiler_so', CUDA['nvcc']) # use only a subset of the extra_postargs, which are 1-1 translated # from the extra_compile_args in the Extension class postargs = extra_postargs['nvcc'] else: postargs = extra_postargs['gcc'] super(obj, src, ext, cc_args, postargs, pp_opts) # reset the default compiler_so, which we might have changed for cuda self.compiler_so = default_compiler_so # inject our redefined _compile method into the class self._compile = _compile # run the customize_compiler class custom_build_ext(build_ext): def build_extensions(self): customize_compiler_for_nvcc(self.compiler) build_ext.build_extensions(self) ext_modules = [ Extension( "cython_bbox", ["bbox.pyx"], extra_compile_args={'gcc': ["-Wno-cpp", "-Wno-unused-function"]}, include_dirs = [numpy_include] ) ] setup( name='fcn', ext_modules=ext_modules, # inject our custom trigger cmdclass={'build_ext': custom_build_ext}, ) ================================================ FILE: requirement.txt ================================================ pyassimp == 4.1.3 progressbar2 pyopengl >= 3.1.0 opencv-python == 4.2.0.34 transforms3d pillow IPython matplotlib easydict pyyaml future scipy Cython ================================================ FILE: ros/_init_paths.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md """Set up paths for Fast R-CNN.""" import os.path as osp import sys def add_path(path): if path not in sys.path: sys.path.insert(0, path) this_dir = osp.dirname(__file__) # Add lib to PYTHONPATH lib_path = osp.join(this_dir, '..', 'lib') add_path(lib_path) lib_path = osp.join(this_dir, '..', 'ycb_render') add_path(lib_path) ================================================ FILE: ros/collect_images_realsense.py ================================================ #!/usr/bin/env python # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md """collect images from Intel RealSense D435""" import rospy import message_filters import cv2 import argparse import pprint import time, os, sys import os.path as osp import numpy as np import yaml from cv_bridge import CvBridge, CvBridgeError from sensor_msgs.msg import Image, CameraInfo class ImageListener: def __init__(self): self.cv_bridge = CvBridge() self.count = 0 # output dir this_dir = osp.dirname(__file__) self.outdir = osp.join(this_dir, '..', 'data', 'images') if not os.path.exists(self.outdir): os.mkdir(self.outdir) # initialize a node rospy.init_node("image_listener") rgb_sub = message_filters.Subscriber('/camera/color/image_raw', Image, queue_size=2) depth_sub = message_filters.Subscriber('/camera/aligned_depth_to_color/image_raw', Image, queue_size=2) msg = rospy.wait_for_message('/camera/color/camera_info', CameraInfo) # save camera intrinsics intrinsic_matrix = np.array(msg.K).reshape(3, 3) print(intrinsic_matrix) dict_file = {'INTRINSICS' : intrinsic_matrix.flatten().tolist()} filename = os.path.join(self.outdir, 'meta.yml') with open(filename, 'w') as file: yaml.dump(dict_file, file) queue_size = 1 slop_seconds = 0.025 ts = message_filters.ApproximateTimeSynchronizer([rgb_sub, depth_sub], queue_size, slop_seconds) ts.registerCallback(self.callback) def callback(self, rgb, depth): if depth.encoding == '32FC1': depth_32 = self.cv_bridge.imgmsg_to_cv2(depth) * 1000 depth_cv = np.array(depth_32, dtype=np.uint16) elif depth.encoding == '16UC1': depth_cv = self.cv_bridge.imgmsg_to_cv2(depth) else: rospy.logerr_throttle( 1, 'Unsupported depth type. Expected 16UC1 or 32FC1, got {}'.format( depth.encoding)) return # write images im = self.cv_bridge.imgmsg_to_cv2(rgb, 'bgr8') filename = self.outdir + '/%06d-color.png' % self.count cv2.imwrite(filename, im) print filename filename = self.outdir + '/%06d-depth.png' % self.count cv2.imwrite(filename, depth_cv) print(filename) self.count += 1 if __name__ == '__main__': # image listener listener = ImageListener() try: rospy.spin() except KeyboardInterrupt: print "Shutting down" ================================================ FILE: ros/posecnn.rviz ================================================ Panels: - Class: rviz/Displays Help Height: 0 Name: Displays Property Tree Widget: Expanded: - /Global Options1 - /Status1 - /DepthCloud1 - /DepthCloud1/Auto Size1 - /rgb_input1 - /depth_input1 - /posecnn detection1 - /posecnn1 - /TF1 - /TF1/Frames1 - /DepthCloud2 - /DepthCloud2/Auto Size1 - /posecnn+sdf1 - /deepim1 Splitter Ratio: 0.829787254 Tree Height: 540 - Class: rviz/Selection Name: Selection - Class: rviz/Tool Properties Expanded: - /2D Pose Estimate1 - /2D Nav Goal1 - /Publish Point1 Name: Tool Properties Splitter Ratio: 0.588679016 - Class: rviz/Views Expanded: - /Current View1 Name: Views Splitter Ratio: 0.5 - Class: rviz/Time Experimental: false Name: Time SyncMode: 0 SyncSource: rgb_input Toolbars: toolButtonStyle: 2 Visualization Manager: Class: "" Displays: - Alpha: 0.5 Cell Size: 1 Class: rviz/Grid Color: 160; 160; 164 Enabled: true Line Style: Line Width: 0.0299999993 Value: Lines Name: Grid Normal Cell Count: 0 Offset: X: 0 Y: 0 Z: 0 Plane: XY Plane Cell Count: 10 Reference Frame: Value: true - Alpha: 1 Auto Size: Auto Size Factor: 1 Value: true Autocompute Intensity Bounds: true Autocompute Value Bounds: Max Value: 10 Min Value: -10 Value: true Axis: Z Channel Name: intensity Class: rviz/DepthCloud Color: 255; 255; 255 Color Image Topic: /camera/color/image_raw Color Transformer: RGB8 Color Transport Hint: raw Decay Time: 0 Depth Map Topic: /camera/aligned_depth_to_color/image_raw Depth Map Transport Hint: raw Enabled: true Invert Rainbow: false Max Color: 255; 255; 255 Max Intensity: 4096 Min Color: 0; 0; 0 Min Intensity: 0 Name: DepthCloud Occlusion Compensation: Occlusion Time-Out: 30 Value: false Position Transformer: XYZ Queue Size: 5 Selectable: true Size (Pixels): 3 Style: Flat Squares Topic Filter: true Use Fixed Frame: true Use rainbow: true Value: true - Class: rviz/Image Enabled: true Image Topic: /camera/color/image_raw Max Value: 1 Median window: 5 Min Value: 0 Name: rgb_input Normalize Range: true Queue Size: 2 Transport Hint: raw Unreliable: false Value: true - Class: rviz/Image Enabled: true Image Topic: /camera/aligned_depth_to_color/image_raw Max Value: 1 Median window: 5 Min Value: 0 Name: depth_input Normalize Range: true Queue Size: 2 Transport Hint: raw Unreliable: false Value: true - Class: rviz/Image Enabled: true Image Topic: /posecnn_label_00 Max Value: 1 Median window: 5 Min Value: 0 Name: posecnn detection Normalize Range: true Queue Size: 2 Transport Hint: raw Unreliable: false Value: true - Class: rviz/Image Enabled: true Image Topic: /posecnn_pose_00 Max Value: 1 Median window: 5 Min Value: 0 Name: posecnn Normalize Range: true Queue Size: 2 Transport Hint: raw Unreliable: false Value: true - Class: rviz/TF Enabled: true Frame Timeout: 1 Frames: All Enabled: false deepim/00_extra_large_clamp_01: Value: true deepim/00_tomato_soup_can_01: Value: true measured/camera_aligned_depth_to_color_frame: Value: false measured/camera_aligned_depth_to_infra1_frame: Value: false measured/camera_color_frame: Value: false measured/camera_color_optical_frame: Value: false measured/camera_depth_frame: Value: false measured/camera_depth_optical_frame: Value: false measured/camera_infra1_frame: Value: false measured/camera_infra1_optical_frame: Value: false measured/camera_infra2_frame: Value: false measured/camera_infra2_optical_frame: Value: false measured/camera_link: Value: false posecnn/00_extra_large_clamp_01: Value: true posecnn/00_extra_large_clamp_01_refined: Value: true posecnn/00_extra_large_clamp_01_roi: Value: true posecnn/00_scissors_01: Value: true posecnn/00_scissors_01_refined: Value: true posecnn/00_scissors_01_roi: Value: true posecnn/00_scissors_02: Value: true posecnn/00_scissors_02_refined: Value: true posecnn/00_scissors_02_roi: Value: true posecnn/00_tomato_soup_can_01: Value: true posecnn/00_tomato_soup_can_01_refined: Value: true posecnn/00_tomato_soup_can_01_roi: Value: true Marker Scale: 0.5 Name: TF Show Arrows: false Show Axes: true Show Names: false Tree: measured/camera_link: measured/camera_aligned_depth_to_color_frame: measured/camera_color_optical_frame: deepim/00_extra_large_clamp_01: {} deepim/00_tomato_soup_can_01: {} posecnn/00_extra_large_clamp_01: {} posecnn/00_extra_large_clamp_01_refined: {} posecnn/00_extra_large_clamp_01_roi: {} posecnn/00_scissors_01: {} posecnn/00_scissors_01_refined: {} posecnn/00_scissors_01_roi: {} posecnn/00_scissors_02: {} posecnn/00_scissors_02_refined: {} posecnn/00_scissors_02_roi: {} posecnn/00_tomato_soup_can_01: {} posecnn/00_tomato_soup_can_01_refined: {} posecnn/00_tomato_soup_can_01_roi: {} measured/camera_aligned_depth_to_infra1_frame: measured/camera_infra1_optical_frame: {} measured/camera_color_frame: {} measured/camera_depth_frame: measured/camera_depth_optical_frame: {} measured/camera_infra1_frame: {} measured/camera_infra2_frame: measured/camera_infra2_optical_frame: {} Update Interval: 0 Value: true - Alpha: 1 Auto Size: Auto Size Factor: 1 Value: true Autocompute Intensity Bounds: true Autocompute Value Bounds: Max Value: 10 Min Value: -10 Value: true Axis: Z Channel Name: intensity Class: rviz/DepthCloud Color: 255; 255; 255 Color Image Topic: /camera/color/image_raw Color Transformer: RGB8 Color Transport Hint: raw Decay Time: 0 Depth Map Topic: /camera/aligned_depth_to_color/image_raw Depth Map Transport Hint: raw Enabled: true Invert Rainbow: false Max Color: 255; 255; 255 Max Intensity: 4096 Min Color: 0; 0; 0 Min Intensity: 0 Name: DepthCloud Occlusion Compensation: Occlusion Time-Out: 30 Value: false Position Transformer: XYZ Queue Size: 5 Selectable: true Size (Pixels): 3 Style: Flat Squares Topic Filter: true Use Fixed Frame: true Use rainbow: true Value: true - Class: rviz/Image Enabled: true Image Topic: /posecnn_pose_refined_00 Max Value: 1 Median window: 5 Min Value: 0 Name: posecnn+sdf Normalize Range: true Queue Size: 2 Transport Hint: raw Unreliable: false Value: true - Class: rviz/Image Enabled: true Image Topic: /deepim_pose_image_00 Max Value: 1 Median window: 5 Min Value: 0 Name: deepim Normalize Range: true Queue Size: 2 Transport Hint: raw Unreliable: false Value: true Enabled: true Global Options: Background Color: 48; 48; 48 Default Light: true Fixed Frame: measured/camera_color_optical_frame Frame Rate: 30 Name: root Tools: - Class: rviz/Interact Hide Inactive Objects: true - Class: rviz/MoveCamera - Class: rviz/Select - Class: rviz/FocusCamera - Class: rviz/Measure - Class: rviz/SetInitialPose Topic: /initialpose - Class: rviz/SetGoal Topic: /move_base_simple/goal - Class: rviz/PublishPoint Single click: true Topic: /clicked_point Value: true Views: Current: Class: rviz/Orbit Distance: 0.48041454 Enable Stereo Rendering: Stereo Eye Separation: 0.0599999987 Stereo Focal Distance: 1 Swap Stereo Eyes: false Value: false Focal Point: X: 0.0808260292 Y: 0.0394595489 Z: 0.310144812 Focal Shape Fixed Size: true Focal Shape Size: 0.0500000007 Invert Z Axis: false Name: Current View Near Clip Distance: 0.00999999978 Pitch: -1.56979632 Target Frame: Value: Orbit (rviz) Yaw: 4.7208395 Saved: ~ Window Geometry: Displays: collapsed: false Height: 1145 Hide Left Dock: false Hide Right Dock: false QMainWindow State: 000000ff00000000fd00000004000000000000024300000268fc0200000009fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006600fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c00610079007301000001a100000268000000e200fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000a0049006d006100670065010000037f000000b7000000000000000000000001000001ee00000268fc0200000005fb00000012007200670062005f0069006e00700075007401000001a10000012e0000001b00fffffffb0000001600640065007000740068005f0069006e00700075007401000002d5000001340000001b00fffffffb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fc0000023d000001f90000000000fffffffa000000000100000002fb0000000a0049006d0061006700650100000000ffffffff0000000000000000fb0000000a005600690065007700730000000551000001ee0000011e00fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b20000000000000000000000020000073d00000173fc010000000cfb000000220070006f007300650063006e006e00200064006500740065006300740069006f006e0100000000000001d0000000db00fffffffb0000000e0070006f007300650063006e006e01000001d6000001ce0000007e00fffffffb0000000a0049006d00610067006501000003e7000001a70000000000000000fb000000160070006f007300650063006e006e002b00730064006601000003aa000001c9000000a600fffffffb000000160070006f007300650063006e006e002b0073006400660100000302000001770000000000000000fb0000000c00640065006500700069006d0100000579000001c40000007700fffffffb0000001600640065007000740068005f0069006e0070007500740100000000000001aa0000000000000000fb00000012007200670062005f0069006e00700075007401000001b0000001c20000000000000000fb000000100050006f0073006500520042005000460100000378000001de0000000000000000fb0000000e0050006f007300650043004e004e010000055c000001e30000000000000000fb0000000a00560069006500770073030000004e00000080000002e100000197fb000000160050006f007300650043004e004e0020006f006c006401000006b30000008c0000000000000000000000030000073d00000046fc0100000002fb0000000800540069006d006501000000000000073d000003cc00fffffffb0000000800540069006d00650100000000000004500000000000000000000003000000026800000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 Selection: collapsed: false Time: collapsed: false Tool Properties: collapsed: false Views: collapsed: false Width: 1853 X: 67 Y: 27 deepim: collapsed: false depth_input: collapsed: false posecnn: collapsed: false posecnn detection: collapsed: false posecnn+sdf: collapsed: false rgb_input: collapsed: false ================================================ FILE: ros/test_images.py ================================================ #!/usr/bin/env python # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md """Test a PoseCNN on images""" import torch import torch.nn.parallel import torch.backends.cudnn as cudnn import torch.utils.data import tf import rosnode import message_filters import cv2 import torch.nn as nn import threading import argparse import pprint import time, os, sys import os.path as osp import numpy as np import time import rospy import _init_paths import networks from fcn.test_imageset import test_image from cv_bridge import CvBridge, CvBridgeError from fcn.config import cfg, cfg_from_file, get_output_dir from datasets.factory import get_dataset from std_msgs.msg import String from sensor_msgs.msg import Image, CameraInfo from transforms3d.quaternions import mat2quat, quat2mat, qmult from scipy.optimize import minimize from utils.blob import pad_im, chromatic_transform, add_noise from geometry_msgs.msg import PoseStamped from ycb_renderer import YCBRenderer from utils.se3 import * from utils.nms import * from Queue import Queue from sdf.sdf_optimizer import sdf_optimizer lock = threading.Lock() class ImageListener: def __init__(self, network, dataset): self.net = network self.dataset = dataset self.cv_bridge = CvBridge() self.renders = dict() self.im = None self.depth = None self.rgb_frame_id = None suffix = '_%02d' % (cfg.instance_id) prefix = '%02d_' % (cfg.instance_id) self.suffix = suffix self.prefix = prefix fusion_type = '' # initialize a node rospy.init_node("posecnn_rgb") self.br = tf.TransformBroadcaster() self.label_pub = rospy.Publisher('posecnn_label' + fusion_type + suffix, Image, queue_size=10) self.pose_pub = rospy.Publisher('posecnn_pose' + fusion_type + suffix, Image, queue_size=10) self.pose_refined_pub = rospy.Publisher('posecnn_pose_refined' + fusion_type + suffix, Image, queue_size=10) # create pose publisher for each known object class self.pubs = [] for i in range(1, self.dataset.num_classes): if self.dataset.classes[i][3] == '_': cls = prefix + self.dataset.classes[i][4:] else: cls = prefix + self.dataset.classes[i] cls = cls + fusion_type self.pubs.append(rospy.Publisher('/objects/prior_pose/' + cls, PoseStamped, queue_size=10)) if cfg.TEST.ROS_CAMERA == 'D435': # use RealSense D435 rgb_sub = message_filters.Subscriber('/camera/color/image_raw', Image, queue_size=10) depth_sub = message_filters.Subscriber('/camera/aligned_depth_to_color/image_raw', Image, queue_size=10) msg = rospy.wait_for_message('/camera/color/camera_info', CameraInfo) self.base_frame = 'measured/camera_color_optical_frame' elif cfg.TEST.ROS_CAMERA == 'Azure': rgb_sub = message_filters.Subscriber('/rgb/image_raw', Image, queue_size=10) depth_sub = message_filters.Subscriber('/depth_to_rgb/image_raw', Image, queue_size=10) msg = rospy.wait_for_message('/rgb/camera_info', CameraInfo) self.base_frame = 'rgb_camera_link' else: # use kinect rgb_sub = message_filters.Subscriber('/%s/rgb/image_color' % (cfg.TEST.ROS_CAMERA), Image, queue_size=2) depth_sub = message_filters.Subscriber('/%s/depth_registered/image' % (cfg.TEST.ROS_CAMERA), Image, queue_size=2) msg = rospy.wait_for_message('/%s/rgb/camera_info' % (cfg.TEST.ROS_CAMERA), CameraInfo) self.base_frame = '%s_depth_optical_frame' % (cfg.TEST.ROS_CAMERA) # update camera intrinsics K = np.array(msg.K).reshape(3, 3) self.dataset._intrinsic_matrix = K print(self.dataset._intrinsic_matrix) queue_size = 1 slop_seconds = 0.1 ts = message_filters.ApproximateTimeSynchronizer([rgb_sub, depth_sub], queue_size, slop_seconds) ts.registerCallback(self.callback_rgbd) def callback_rgbd(self, rgb, depth): if depth.encoding == '32FC1': depth_cv = self.cv_bridge.imgmsg_to_cv2(depth) elif depth.encoding == '16UC1': depth_cv = self.cv_bridge.imgmsg_to_cv2(depth).copy().astype(np.float32) depth_cv /= 1000.0 else: rospy.logerr_throttle( 1, 'Unsupported depth type. Expected 16UC1 or 32FC1, got {}'.format( depth.encoding)) return im = self.cv_bridge.imgmsg_to_cv2(rgb, 'bgr8') with lock: self.im = im.copy() self.depth = depth_cv.copy() self.rgb_frame_id = rgb.header.frame_id def run_network(self): with lock: if listener.im is None: return im = self.im.copy() depth_cv = self.depth.copy() rgb_frame_id = self.rgb_frame_id fusion_type = '' start_time = time.time() im_pose, im_pose_refined, im_label, labels, rois, poses, poses_refined = test_image(self.net, self.dataset, im, depth_cv) print("--- %s seconds ---" % (time.time() - start_time)) # publish label image label_msg = self.cv_bridge.cv2_to_imgmsg(im_label) label_msg.header.stamp = rospy.Time.now() label_msg.header.frame_id = rgb_frame_id label_msg.encoding = 'rgb8' self.label_pub.publish(label_msg) # publish pose image pose_msg = self.cv_bridge.cv2_to_imgmsg(im_pose) pose_msg.header.stamp = rospy.Time.now() pose_msg.header.frame_id = rgb_frame_id pose_msg.encoding = 'rgb8' self.pose_pub.publish(pose_msg) # publish pose refined image pose_msg = self.cv_bridge.cv2_to_imgmsg(im_pose_refined) pose_msg.header.stamp = rospy.Time.now() pose_msg.header.frame_id = rgb_frame_id pose_msg.encoding = 'rgb8' self.pose_refined_pub.publish(pose_msg) indexes = np.zeros((self.dataset.num_classes, ), dtype=np.int32) if not rois.shape[0]: return index = np.argsort(rois[:, 2]) rois = rois[index, :] poses = poses[index, :] if poses_refined is not None: poses_refined = poses_refined[index, :] for i in range(rois.shape[0]): cls = int(rois[i, 1]) if cls > 0 and rois[i, -1] > cfg.TEST.DET_THRESHOLD: if not np.any(poses[i, 4:]): continue if self.dataset.classes[cls][3] == '_': name = self.prefix + self.dataset.classes[cls][4:] else: name = self.prefix + self.dataset.classes[cls] name = name + fusion_type indexes[cls] += 1 name = name + '_%02d' % (indexes[cls]) tf_name = os.path.join("posecnn", name) # send transformation as bounding box (mis-used) n = np.linalg.norm(rois[i, 2:6]) x1 = rois[i, 2] / n y1 = rois[i, 3] / n x2 = rois[i, 4] / n y2 = rois[i, 5] / n now = rospy.Time.now() self.br.sendTransform([n, now.secs, 0], [x1, y1, x2, y2], now, tf_name + '_roi', self.base_frame) # send poses quat = [poses[i, 1], poses[i, 2], poses[i, 3], poses[i, 0]] self.br.sendTransform(poses[i, 4:7], quat, rospy.Time.now(), tf_name, self.base_frame) # send poses refined if poses_refined is not None: quat = [poses_refined[i, 1], poses_refined[i, 2], poses_refined[i, 3], poses_refined[i, 0]] self.br.sendTransform(poses_refined[i, 4:7], quat, rospy.Time.now(), tf_name + '_refined', self.base_frame) # create pose msg msg = PoseStamped() msg.header.stamp = rospy.Time.now() msg.header.frame_id = self.base_frame msg.pose.orientation.x = poses[i, 1] msg.pose.orientation.y = poses[i, 2] msg.pose.orientation.z = poses[i, 3] msg.pose.orientation.w = poses[i, 0] msg.pose.position.x = poses[i, 4] msg.pose.position.y = poses[i, 5] msg.pose.position.z = poses[i, 6] pub = self.pubs[cls - 1] pub.publish(msg) def parse_args(): """ Parse input arguments """ parser = argparse.ArgumentParser(description='Test a PoseCNN network') parser.add_argument('--gpu', dest='gpu_id', help='GPU id to use', default=0, type=int) parser.add_argument('--instance', dest='instance_id', help='PoseCNN instance id to use', default=0, type=int) parser.add_argument('--pretrained', dest='pretrained', help='initialize with pretrained checkpoint', default=None, type=str) parser.add_argument('--cfg', dest='cfg_file', help='optional config file', default=None, type=str) parser.add_argument('--dataset', dest='dataset_name', help='dataset to train on', default='shapenet_scene_train', type=str) parser.add_argument('--rand', dest='randomize', help='randomize (do not use a fixed seed)', action='store_true') parser.add_argument('--network', dest='network_name', help='name of the network', default=None, type=str) parser.add_argument('--cad', dest='cad_name', help='name of the CAD file', default=None, type=str) parser.add_argument('--pose', dest='pose_name', help='name of the pose files', default=None, type=str) parser.add_argument('--background', dest='background_name', help='name of the background file', default=None, type=str) if len(sys.argv) == 1: parser.print_help() sys.exit(1) args = parser.parse_args() return args if __name__ == '__main__': args = parse_args() print('Called with args:') print(args) if args.cfg_file is not None: cfg_from_file(args.cfg_file) print('Using config:') pprint.pprint(cfg) if not args.randomize: # fix the random seeds (numpy and caffe) for reproducibility np.random.seed(cfg.RNG_SEED) # device cfg.device = torch.device('cuda:{:d}'.format(0)) print('GPU device {:d}'.format(args.gpu_id)) cfg.gpu_id = args.gpu_id cfg.instance_id = args.instance_id # dataset cfg.MODE = 'TEST' cfg.TEST.SYNTHESIZE = False cfg.TEST.VISUALIZE = False dataset = get_dataset(args.dataset_name) # prepare network if args.pretrained: network_data = torch.load(args.pretrained) print("=> using pre-trained network '{}'".format(args.pretrained)) else: network_data = None print("no pretrained network specified") sys.exit() network = networks.__dict__[args.network_name](dataset.num_classes, cfg.TRAIN.NUM_UNITS, network_data).cuda(device=cfg.device) network = torch.nn.DataParallel(network, device_ids=[0]).cuda(device=cfg.device) cudnn.benchmark = True if cfg.TRAIN.POSE_REG: print('loading 3D models') cfg.renderer = YCBRenderer(width=cfg.TRAIN.SYN_WIDTH, height=cfg.TRAIN.SYN_HEIGHT, gpu_id=args.gpu_id, render_marker=False) model_mesh_paths = [dataset.model_mesh_paths[i-1] for i in cfg.TEST.CLASSES[1:]] model_texture_paths = [dataset.model_texture_paths[i-1] for i in cfg.TEST.CLASSES[1:]] model_colors = [dataset.model_colors[i-1] for i in cfg.TEST.CLASSES[1:]] cfg.renderer.load_objects(model_mesh_paths, model_texture_paths, model_colors) cfg.renderer.set_camera_default() print(dataset.model_mesh_paths) # load sdfs if cfg.TEST.POSE_REFINE: print('loading SDFs') sdf_files = [] for i in cfg.TEST.CLASSES[1:]: sdf_files.append(dataset.model_sdf_paths[i-1]) cfg.sdf_optimizer = sdf_optimizer(cfg.TEST.CLASSES[1:], sdf_files) # image listener network.eval() listener = ImageListener(network, dataset) while not rospy.is_shutdown(): listener.run_network() ================================================ FILE: tools/_init_paths.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md """Set up paths for Fast R-CNN.""" import os.path as osp import sys def add_path(path): if path not in sys.path: sys.path.insert(0, path) this_dir = osp.dirname(__file__) # Add lib to PYTHONPATH lib_path = osp.join(this_dir, '..', 'lib') add_path(lib_path) lib_path = osp.join(this_dir, '..', 'ycb_render') add_path(lib_path) ================================================ FILE: tools/test_images.py ================================================ #!/usr/bin/env python3 # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md """Test a PoseCNN on images""" import torch import torch.nn.parallel import torch.backends.cudnn as cudnn import torch.utils.data import argparse import pprint import time, os, sys import os.path as osp import numpy as np import cv2 import scipy.io import glob import _init_paths from fcn.test_imageset import test_image from fcn.config import cfg, cfg_from_file, yaml_from_file, get_output_dir from datasets.factory import get_dataset import networks from ycb_renderer import YCBRenderer from utils.blob import pad_im from sdf.sdf_optimizer import sdf_optimizer def parse_args(): """ Parse input arguments """ parser = argparse.ArgumentParser(description='Test a PoseCNN network') parser.add_argument('--gpu', dest='gpu_id', help='GPU id to use', default=0, type=int) parser.add_argument('--pretrained', dest='pretrained', help='initialize with pretrained checkpoint', default=None, type=str) parser.add_argument('--pretrained_encoder', dest='pretrained_encoder', help='initialize with pretrained encoder checkpoint', default=None, type=str) parser.add_argument('--codebook', dest='codebook', help='codebook', default=None, type=str) parser.add_argument('--cfg', dest='cfg_file', help='optional config file', default=None, type=str) parser.add_argument('--meta', dest='meta_file', help='optional metadata file', default=None, type=str) parser.add_argument('--dataset', dest='dataset_name', help='dataset to train on', default='shapenet_scene_train', type=str) parser.add_argument('--depth', dest='depth_name', help='depth image pattern', default='*depth.png', type=str) parser.add_argument('--color', dest='color_name', help='color image pattern', default='*color.png', type=str) parser.add_argument('--imgdir', dest='imgdir', help='path of the directory with the test images', default='data/Images', type=str) parser.add_argument('--rand', dest='randomize', help='randomize (do not use a fixed seed)', action='store_true') parser.add_argument('--network', dest='network_name', help='name of the network', default=None, type=str) parser.add_argument('--background', dest='background_name', help='name of the background file', default=None, type=str) if len(sys.argv) == 1: parser.print_help() sys.exit(1) args = parser.parse_args() return args if __name__ == '__main__': args = parse_args() print('Called with args:') print(args) if args.cfg_file is not None: cfg_from_file(args.cfg_file) if len(cfg.TEST.CLASSES) == 0: cfg.TEST.CLASSES = cfg.TRAIN.CLASSES if args.meta_file is not None: meta = yaml_from_file(args.meta_file) # overwrite test classes print(meta) if 'ycb_ids' in meta: cfg.TEST.CLASSES = [0] for i in meta.ycb_ids: cfg.TEST.CLASSES.append(i) print('TEST CLASSES:', cfg.TEST.CLASSES) if 'INTRINSICS' in meta: cfg.INTRINSICS = meta['INTRINSICS'] print('Using config:') pprint.pprint(cfg) if not args.randomize: # fix the random seeds (numpy and caffe) for reproducibility np.random.seed(cfg.RNG_SEED) # device cfg.gpu_id = args.gpu_id cfg.device = torch.device('cuda:{:d}'.format(cfg.gpu_id)) cfg.instance_id = 0 print('GPU device {:d}'.format(args.gpu_id)) # dataset cfg.MODE = 'TEST' cfg.TEST.SYNTHESIZE = False dataset = get_dataset(args.dataset_name) # overwrite intrinsics if len(cfg.INTRINSICS) > 0: K = np.array(cfg.INTRINSICS).reshape(3, 3) if cfg.TEST.SCALES_BASE[0] != 1: scale = cfg.TEST.SCALES_BASE[0] K[0, 0] *= scale K[0, 2] *= scale K[1, 1] *= scale K[1, 2] *= scale dataset._intrinsic_matrix = K print(dataset._intrinsic_matrix) # list images images_color = [] filename = os.path.join(args.imgdir, args.color_name) files = glob.glob(filename) for i in range(len(files)): filename = files[i] images_color.append(filename) images_color.sort() images_depth = [] filename = os.path.join(args.imgdir, args.depth_name) files = glob.glob(filename) for i in range(len(files)): filename = files[i] images_depth.append(filename) images_depth.sort() if cfg.TEST.VISUALIZE: index_images = np.random.permutation(len(images_color)) else: index_images = range(len(images_color)) resdir = args.imgdir + '_posecnn_results' if not os.path.exists(resdir): os.makedirs(resdir) # prepare network if args.pretrained: network_data = torch.load(args.pretrained) print("=> using pre-trained network '{}'".format(args.pretrained)) else: network_data = None print("no pretrained network specified") sys.exit() network = networks.__dict__[args.network_name](dataset.num_classes, cfg.TRAIN.NUM_UNITS, network_data).cuda(device=cfg.device) network = torch.nn.DataParallel(network, device_ids=[cfg.gpu_id]).cuda(device=cfg.device) cudnn.benchmark = True network.eval() print('loading 3D models') cfg.renderer = YCBRenderer(width=cfg.TRAIN.SYN_WIDTH, height=cfg.TRAIN.SYN_HEIGHT, gpu_id=args.gpu_id, render_marker=False) if cfg.TEST.SYNTHESIZE: cfg.renderer.load_objects(dataset.model_mesh_paths, dataset.model_texture_paths, dataset.model_colors) else: model_mesh_paths = [dataset.model_mesh_paths[i-1] for i in cfg.TEST.CLASSES[1:]] model_texture_paths = [dataset.model_texture_paths[i-1] for i in cfg.TEST.CLASSES[1:]] model_colors = [dataset.model_colors[i-1] for i in cfg.TEST.CLASSES[1:]] cfg.renderer.load_objects(model_mesh_paths, model_texture_paths, model_colors) cfg.renderer.set_camera_default() print(dataset.model_mesh_paths) # load sdfs if cfg.TEST.POSE_REFINE: print('loading SDFs') sdf_files = [] for i in cfg.TEST.CLASSES[1:]: sdf_files.append(dataset.model_sdf_paths[i-1]) cfg.sdf_optimizer = sdf_optimizer(cfg.TEST.CLASSES[1:], sdf_files) # for each image for i in index_images: im = pad_im(cv2.imread(images_color[i], cv2.IMREAD_COLOR), 16) print(images_color[i]) if len(images_depth) > 0 and osp.exists(images_depth[i]): depth = pad_im(cv2.imread(images_depth[i], cv2.IMREAD_UNCHANGED), 16) depth = depth.astype('float') / 1000.0 print(images_depth[i]) else: depth = None print('no depth image') # rescale image if necessary if cfg.TEST.SCALES_BASE[0] != 1: im_scale = cfg.TEST.SCALES_BASE[0] im = pad_im(cv2.resize(im, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_LINEAR), 16) if depth is not None: depth = pad_im(cv2.resize(depth, None, None, fx=im_scale, fy=im_scale, interpolation=cv2.INTER_NEAREST), 16) # run network im_pose, im_pose_refined, im_label, labels, rois, poses, poses_refined = test_image(network, dataset, im, depth) # save result if not cfg.TEST.VISUALIZE: # map the roi index for j in range(rois.shape[0]): rois[j, 1] = cfg.TRAIN.CLASSES.index(cfg.TEST.CLASSES[int(rois[j, 1])]) result = {'labels': labels, 'rois': rois, 'poses': poses, 'poses_refined': poses_refined, 'intrinsic_matrix': dataset._intrinsic_matrix} head, tail = os.path.split(images_color[i]) filename = os.path.join(resdir, tail + '.mat') scipy.io.savemat(filename, result, do_compression=True) # rendered image filename = os.path.join(resdir, tail + '_render.jpg') cv2.imwrite(filename, im_pose[:, :, (2, 1, 0)]) filename = os.path.join(resdir, tail + '_render_refined.jpg') cv2.imwrite(filename, im_pose_refined[:, :, (2, 1, 0)]) ================================================ FILE: tools/test_net.py ================================================ #!/usr/bin/env python3 # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md """Test a DeepIM network on an image database.""" import torch import torch.nn.parallel import torch.backends.cudnn as cudnn import torch.utils.data import argparse import pprint import time, os, sys import os.path as osp import numpy as np import random import scipy.io import _init_paths from fcn.test_dataset import test from fcn.config import cfg, cfg_from_file, get_output_dir from datasets.factory import get_dataset import networks from ycb_renderer import YCBRenderer from sdf.sdf_optimizer import sdf_optimizer def parse_args(): """ Parse input arguments """ parser = argparse.ArgumentParser(description='Test a PoseCNN network') parser.add_argument('--gpu', dest='gpu_id', help='GPU id to use', default=0, type=int) parser.add_argument('--pretrained', dest='pretrained', help='initialize with pretrained checkpoint', default=None, type=str) parser.add_argument('--cfg', dest='cfg_file', help='optional config file', default=None, type=str) parser.add_argument('--dataset', dest='dataset_name', help='dataset to train on', default='shapenet_scene_train', type=str) parser.add_argument('--dataset_background', dest='dataset_background_name', help='background dataset to train on', default='background_nvidia', type=str) parser.add_argument('--rand', dest='randomize', help='randomize (do not use a fixed seed)', action='store_true') parser.add_argument('--network', dest='network_name', help='name of the network', default=None, type=str) parser.add_argument('--background', dest='background_name', help='name of the background file', default=None, type=str) if len(sys.argv) == 1: parser.print_help() sys.exit(1) args = parser.parse_args() return args if __name__ == '__main__': args = parse_args() print('Called with args:') print(args) if args.cfg_file is not None: cfg_from_file(args.cfg_file) if len(cfg.TEST.CLASSES) == 0: cfg.TEST.CLASSES = cfg.TRAIN.CLASSES print('Using config:') pprint.pprint(cfg) if not args.randomize: # fix the random seeds (numpy and caffe) for reproducibility np.random.seed(cfg.RNG_SEED) # device cfg.gpu_id = 0 cfg.device = torch.device('cuda:{:d}'.format(cfg.gpu_id)) print('GPU device {:d}'.format(args.gpu_id)) # prepare dataset if cfg.TEST.VISUALIZE: shuffle = True np.random.seed() else: shuffle = False cfg.MODE = 'TEST' dataset = get_dataset(args.dataset_name) worker_init_fn = dataset.worker_init_fn if hasattr(dataset, 'worker_init_fn') else None dataloader = torch.utils.data.DataLoader(dataset, batch_size=cfg.TEST.IMS_PER_BATCH, shuffle=shuffle, num_workers=0, worker_init_fn=worker_init_fn) print('Use dataset `{:s}` for test'.format(dataset.name)) if cfg.TRAIN.SYN_BACKGROUND_SPECIFIC: background_dataset = get_dataset(args.dataset_background_name) else: background_dataset = get_dataset('background_coco') background_loader = torch.utils.data.DataLoader(background_dataset, batch_size=cfg.TEST.IMS_PER_BATCH, shuffle=True, num_workers=1) # overwrite intrinsics if len(cfg.INTRINSICS) > 0: K = np.array(cfg.INTRINSICS).reshape(3, 3) dataset._intrinsic_matrix = K background_dataset._intrinsic_matrix = K print(dataset._intrinsic_matrix) # output directory cfg.TEST.MODEL = args.pretrained.split('/')[-1] output_dir = get_output_dir(dataset, None) output_dir = os.path.join(output_dir, cfg.TEST.MODEL) print('Output will be saved to `{:s}`'.format(output_dir)) if not os.path.exists(output_dir): os.makedirs(output_dir) # prepare network if args.pretrained: network_data = torch.load(args.pretrained) if isinstance(network_data, dict) and 'model' in network_data: network_data = network_data['model'] print("=> using pre-trained network '{}'".format(args.pretrained)) else: network_data = None print("no pretrained network specified") sys.exit() network = networks.__dict__[args.network_name](dataset.num_classes, cfg.TRAIN.NUM_UNITS, network_data).cuda(device=cfg.device) network = torch.nn.DataParallel(network, device_ids=[cfg.gpu_id]).cuda(device=cfg.device) cudnn.benchmark = True # renderer if cfg.TEST.SYNTHESIZE or cfg.TEST.POSE_REFINE: cfg.renderer = YCBRenderer(width=cfg.TRAIN.SYN_WIDTH, height=cfg.TRAIN.SYN_HEIGHT, gpu_id=args.gpu_id, render_marker=False) if cfg.TEST.SYNTHESIZE: cfg.renderer.load_objects(dataset.model_mesh_paths, dataset.model_texture_paths, dataset.model_colors) else: model_mesh_paths = [dataset.model_mesh_paths[i-1] for i in cfg.TEST.CLASSES[1:]] model_texture_paths = [dataset.model_texture_paths[i-1] for i in cfg.TEST.CLASSES[1:]] model_colors = [dataset.model_colors[i-1] for i in cfg.TEST.CLASSES[1:]] cfg.renderer.load_objects(model_mesh_paths, model_texture_paths, model_colors) cfg.renderer.set_camera_default() # load sdfs if cfg.TEST.POSE_REFINE: print('loading SDFs') sdf_files = [] for i in cfg.TEST.CLASSES[1:]: sdf_files.append(dataset.model_sdf_paths[i-1]) cfg.sdf_optimizer = sdf_optimizer(cfg.TEST.CLASSES[1:], sdf_files) # test network test(dataloader, background_loader, network, output_dir) # evaluation dataset.evaluation(output_dir) ================================================ FILE: tools/train_net.py ================================================ #!/usr/bin/env python3 # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md """Train a PoseCNN on an image database.""" import torch import torch.nn.parallel import torch.backends.cudnn as cudnn import torch.optim import torch.utils.data import argparse import pprint import numpy as np import sys import os import os.path as osp import cv2 import _init_paths import datasets import networks from fcn.config import cfg, cfg_from_file, get_output_dir from fcn.train import train from datasets.factory import get_dataset def parse_args(): """ Parse input arguments """ parser = argparse.ArgumentParser(description='Train a PoseCNN network') parser.add_argument('--epochs', dest='epochs', help='number of epochs to train', default=40000, type=int) parser.add_argument('--startepoch', dest='startepoch', help='the starting epoch', default=0, type=int) parser.add_argument('--pretrained', dest='pretrained', help='initialize with pretrained checkpoint', default=None, type=str) parser.add_argument('--cfg', dest='cfg_file', help='optional config file', default=None, type=str) parser.add_argument('--solver', dest='solver', help='solver type', default='sgd', type=str) parser.add_argument('--dataset', dest='dataset_name', help='dataset to train on', default='shapenet_scene_train', type=str) parser.add_argument('--dataset_background', dest='dataset_background_name', help='background dataset to train on', default='background_nvidia', type=str) parser.add_argument('--rand', dest='randomize', help='randomize (do not use a fixed seed)', action='store_true') parser.add_argument('--network', dest='network_name', help='name of the network', default=None, type=str) if len(sys.argv) == 1: parser.print_help() sys.exit(1) args = parser.parse_args() return args if __name__ == '__main__': args = parse_args() print('Called with args:') print(args) if args.cfg_file is not None: cfg_from_file(args.cfg_file) print('Using config:') pprint.pprint(cfg) if not args.randomize: # fix the random seeds (numpy and caffe) for reproducibility np.random.seed(cfg.RNG_SEED) # prepare dataset cfg.MODE = 'TRAIN' dataset = get_dataset(args.dataset_name) worker_init_fn = dataset.worker_init_fn if hasattr(dataset, 'worker_init_fn') else None if cfg.TRAIN.SYNTHESIZE: num_workers = 0 else: num_workers = 4 dataloader = torch.utils.data.DataLoader(dataset, batch_size=cfg.TRAIN.IMS_PER_BATCH, shuffle=True, num_workers=num_workers, worker_init_fn=worker_init_fn) print('Use dataset `{:s}` for training'.format(dataset.name)) # background dataset if cfg.TRAIN.SYN_BACKGROUND_SPECIFIC: background_dataset = get_dataset(args.dataset_background_name) else: background_dataset = get_dataset('background_coco') background_loader = torch.utils.data.DataLoader(background_dataset, batch_size=cfg.TRAIN.IMS_PER_BATCH, shuffle=True, num_workers=4) # overwrite intrinsics if len(cfg.INTRINSICS) > 0: K = np.array(cfg.INTRINSICS).reshape(3, 3) dataset._intrinsic_matrix = K background_dataset._intrinsic_matrix = K print(dataset._intrinsic_matrix) # output directory output_dir = get_output_dir(dataset, None) print('Output will be saved to `{:s}`'.format(output_dir)) if not os.path.exists(output_dir): os.makedirs(output_dir) # prepare network if args.pretrained: network_data = torch.load(args.pretrained) if isinstance(network_data, dict) and 'model' in network_data: network_data = network_data['model'] print("=> using pre-trained network '{}'".format(args.network_name)) else: network_data = None print("=> creating network '{}'".format(args.network_name)) network = networks.__dict__[args.network_name](dataset.num_classes, cfg.TRAIN.NUM_UNITS, network_data).cuda() if torch.cuda.device_count() > 1: cfg.TRAIN.GPUNUM = torch.cuda.device_count() print("Let's use", torch.cuda.device_count(), "GPUs!") network = torch.nn.DataParallel(network).cuda() cudnn.benchmark = True # renderer if cfg.TRAIN.SYNTHESIZE: from ycb_renderer import YCBRenderer print('loading 3D models') cfg.renderer = YCBRenderer(width=cfg.TRAIN.SYN_WIDTH, height=cfg.TRAIN.SYN_HEIGHT, render_marker=False) cfg.renderer.load_objects(dataset.model_mesh_paths, dataset.model_texture_paths, dataset.model_colors) cfg.renderer.set_camera_default() print(dataset.model_mesh_paths) # optimizer assert(args.solver in ['adam', 'sgd']) print('=> setting {} solver'.format(args.solver)) param_groups = [{'params': network.module.bias_parameters(), 'weight_decay': cfg.TRAIN.WEIGHT_DECAY}, {'params': network.module.weight_parameters(), 'weight_decay': cfg.TRAIN.WEIGHT_DECAY}] if args.solver == 'adam': optimizer = torch.optim.Adam(param_groups, cfg.TRAIN.LEARNING_RATE, betas=(cfg.TRAIN.MOMENTUM, cfg.TRAIN.BETA)) elif args.solver == 'sgd': optimizer = torch.optim.SGD(param_groups, cfg.TRAIN.LEARNING_RATE, momentum=cfg.TRAIN.MOMENTUM) scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[m - args.startepoch for m in cfg.TRAIN.MILESTONES], gamma=cfg.TRAIN.GAMMA) cfg.epochs = args.epochs # main loop for epoch in range(args.startepoch, args.epochs): if args.solver == 'sgd': scheduler.step() train(dataloader, background_loader, network, optimizer, epoch) # save checkpoint if (epoch+1) % cfg.TRAIN.SNAPSHOT_EPOCHS == 0 or epoch == args.epochs - 1: state = network.module.state_dict() infix = ('_' + cfg.TRAIN.SNAPSHOT_INFIX if cfg.TRAIN.SNAPSHOT_INFIX != '' else '') filename = (cfg.TRAIN.SNAPSHOT_PREFIX + infix + '_epoch_{:d}'.format(epoch+1) + '.checkpoint.pth') torch.save(state, os.path.join(output_dir, filename)) print(filename) ================================================ FILE: ycb_render/CMakeLists.txt ================================================ cmake_minimum_required(VERSION 2.8.12) project(CppYCBRenderer) find_package(CUDA REQUIRED) set(CUDA_LIBRARIES PUBLIC ${CUDA_LIBRARIES}) include_directories(glad) add_subdirectory(pybind11) cuda_add_library(CppYCBRenderer MODULE glad/egl.c glad/gl.c cpp/ycb_renderer.cpp) target_link_libraries(CppYCBRenderer PRIVATE pybind11::module dl pthread) set_target_properties(CppYCBRenderer PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}" SUFFIX "${PYTHON_MODULE_EXTENSION}") add_executable(query_devices glad/egl.c glad/gl.c cpp/query_devices.cpp) add_executable(test_device glad/egl.c glad/gl.c cpp/test_device.cpp) target_link_libraries(query_devices dl pthread) target_link_libraries(test_device dl pthread) ================================================ FILE: ycb_render/__init__.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md ================================================ FILE: ycb_render/cpp/query_devices.cpp ================================================ // Copyright (c) 2020 NVIDIA Corporation. All rights reserved. // This work is licensed under the NVIDIA Source Code License - Non-commercial. Full // text can be found in LICENSE.md //g++ glad/egl.c glad/gl.c egl.cpp -I glad -lpthread -ldl #include #include #include #include #include #include #include #include struct EGLInternalData2 { bool m_isInitialized; int m_windowWidth; int m_windowHeight; int m_renderDevice; EGLBoolean success; EGLint num_configs; EGLConfig egl_config; EGLSurface egl_surface; EGLContext egl_context; EGLDisplay egl_display; EGLInternalData2() : m_isInitialized(false), m_windowWidth(0), m_windowHeight(0) {} }; int main(){ int m_windowWidth; int m_windowHeight; int m_renderDevice; EGLBoolean success; EGLint num_configs; EGLConfig egl_config; EGLSurface egl_surface; EGLContext egl_context; EGLDisplay egl_display; m_windowWidth = 256; m_windowHeight = 256; m_renderDevice = -1; EGLint egl_config_attribs[] = {EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_DEPTH_SIZE, 8, EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, EGL_NONE}; EGLint egl_pbuffer_attribs[] = { EGL_WIDTH, m_windowWidth, EGL_HEIGHT, m_windowHeight, EGL_NONE, }; EGLInternalData2* m_data = new EGLInternalData2(); // Load EGL functions int egl_version = gladLoaderLoadEGL(NULL); if(!egl_version) { fprintf(stderr, "failed to EGL with glad.\n"); exit(EXIT_FAILURE); }; // Query EGL Devices const int max_devices = 32; EGLDeviceEXT egl_devices[max_devices]; EGLint num_devices = 0; EGLint egl_error = eglGetError(); if (!eglQueryDevicesEXT(max_devices, egl_devices, &num_devices) || egl_error != EGL_SUCCESS) { printf("eglQueryDevicesEXT Failed.\n"); m_data->egl_display = EGL_NO_DISPLAY; } printf("%d", num_devices); return 0; } ================================================ FILE: ycb_render/cpp/test_device.cpp ================================================ // Copyright (c) 2020 NVIDIA Corporation. All rights reserved. // This work is licensed under the NVIDIA Source Code License - Non-commercial. Full // text can be found in LICENSE.md //g++ glad/egl.c glad/gl.c egl.cpp -I glad -lpthread -ldl #include #include #include #include #include #include #include #include struct EGLInternalData2 { bool m_isInitialized; int m_windowWidth; int m_windowHeight; int m_renderDevice; EGLBoolean success; EGLint num_configs; EGLConfig egl_config; EGLSurface egl_surface; EGLContext egl_context; EGLDisplay egl_display; EGLInternalData2() : m_isInitialized(false), m_windowWidth(0), m_windowHeight(0) {} }; int main(int argc, char ** argv){ int m_windowWidth; int m_windowHeight; int m_renderDevice; EGLBoolean success; EGLint num_configs; EGLConfig egl_config; EGLSurface egl_surface; EGLContext egl_context; EGLDisplay egl_display; m_windowWidth = 256; m_windowHeight = 256; m_renderDevice = -1; EGLint egl_config_attribs[] = {EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_DEPTH_SIZE, 8, EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, EGL_NONE}; EGLint egl_pbuffer_attribs[] = { EGL_WIDTH, m_windowWidth, EGL_HEIGHT, m_windowHeight, EGL_NONE, }; EGLInternalData2* m_data = new EGLInternalData2(); // Load EGL functions int egl_version = gladLoaderLoadEGL(NULL); if(!egl_version) { fprintf(stderr, "failed to EGL with glad.\n"); exit(EXIT_FAILURE); }; // Query EGL Devices const int max_devices = 32; EGLDeviceEXT egl_devices[max_devices]; EGLint num_devices = 0; EGLint egl_error = eglGetError(); if (!eglQueryDevicesEXT(max_devices, egl_devices, &num_devices) || egl_error != EGL_SUCCESS) { printf("eglQueryDevicesEXT Failed.\n"); m_data->egl_display = EGL_NO_DISPLAY; } //printf("number of devices found %d\n", num_devices); m_data->m_renderDevice = atoi(argv[1]); // Set display EGLDisplay display = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT, egl_devices[m_data->m_renderDevice], NULL); if (eglGetError() == EGL_SUCCESS && display != EGL_NO_DISPLAY) { int major, minor; EGLBoolean initialized = eglInitialize(display, &major, &minor); if (eglGetError() == EGL_SUCCESS && initialized == EGL_TRUE) { m_data->egl_display = display; } } if (!eglInitialize(m_data->egl_display, NULL, NULL)) { fprintf(stderr, "Unable to initialize EGL\n"); exit(EXIT_FAILURE); } egl_version = gladLoaderLoadEGL(m_data->egl_display); if (!egl_version) { fprintf(stderr, "Unable to reload EGL.\n"); exit(EXIT_FAILURE); } printf("Loaded EGL %d.%d after reload.\n", GLAD_VERSION_MAJOR(egl_version), GLAD_VERSION_MINOR(egl_version)); m_data->success = eglBindAPI(EGL_OPENGL_API); if (!m_data->success) { // TODO: Properly handle this error (requires change to default window // API to change return on all window types to bool). fprintf(stderr, "Failed to bind OpenGL API.\n"); exit(EXIT_FAILURE); } m_data->success = eglChooseConfig(m_data->egl_display, egl_config_attribs, &m_data->egl_config, 1, &m_data->num_configs); if (!m_data->success) { // TODO: Properly handle this error (requires change to default window // API to change return on all window types to bool). fprintf(stderr, "Failed to choose config (eglError: %d)\n", eglGetError()); exit(EXIT_FAILURE); } if (m_data->num_configs != 1) { fprintf(stderr, "Didn't get exactly one config, but %d\n", m_data->num_configs); exit(EXIT_FAILURE); } m_data->egl_surface = eglCreatePbufferSurface( m_data->egl_display, m_data->egl_config, egl_pbuffer_attribs); if (m_data->egl_surface == EGL_NO_SURFACE) { fprintf(stderr, "Unable to create EGL surface (eglError: %d)\n", eglGetError()); exit(EXIT_FAILURE); } m_data->egl_context = eglCreateContext( m_data->egl_display, m_data->egl_config, EGL_NO_CONTEXT, NULL); if (!m_data->egl_context) { fprintf(stderr, "Unable to create EGL context (eglError: %d)\n",eglGetError()); exit(EXIT_FAILURE); } m_data->success = eglMakeCurrent(m_data->egl_display, m_data->egl_surface, m_data->egl_surface, m_data->egl_context); if (!m_data->success) { fprintf(stderr, "Failed to make context current (eglError: %d)\n", eglGetError()); exit(EXIT_FAILURE); } if (!gladLoadGL(eglGetProcAddress)) { fprintf(stderr, "failed to load GL with glad.\n"); exit(EXIT_FAILURE); } const GLubyte* ven = glGetString(GL_VENDOR); printf("GL_VENDOR=%s\n", ven); const GLubyte* ren = glGetString(GL_RENDERER); printf("GL_RENDERER=%s\n", ren); const GLubyte* ver = glGetString(GL_VERSION); printf("GL_VERSION=%s\n", ver); const GLubyte* sl = glGetString(GL_SHADING_LANGUAGE_VERSION); printf("GL_SHADING_LANGUAGE_VERSION=%s\n", sl); return 0; } ================================================ FILE: ycb_render/cpp/ycb_renderer.cpp ================================================ // Copyright (c) 2020 NVIDIA Corporation. All rights reserved. // This work is licensed under the NVIDIA Source Code License - Non-commercial. Full // text can be found in LICENSE.md //g++ glad/egl.c glad/gl.c egl.cpp -I glad -lpthread -ldl #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MAX_NUM_RESOURCES 10 namespace py = pybind11; struct EGLInternalData2 { bool m_isInitialized; int m_windowWidth; int m_windowHeight; int m_renderDevice; EGLBoolean success; EGLint num_configs; EGLConfig egl_config; EGLSurface egl_surface; EGLContext egl_context; EGLDisplay egl_display; EGLInternalData2() : m_isInitialized(false), m_windowWidth(0), m_windowHeight(0) {} }; class CppYCBRenderer{ public: CppYCBRenderer(int w, int h, int d):m_windowHeight(h),m_windowWidth(w),m_renderDevice(d) {}; int m_windowWidth; int m_windowHeight; int m_renderDevice; EGLBoolean success; EGLint num_configs; EGLConfig egl_config; EGLSurface egl_surface; EGLContext egl_context; EGLDisplay egl_display; EGLInternalData2* m_data = NULL; cudaGraphicsResource* cuda_res[MAX_NUM_RESOURCES]; int init() { m_data = new EGLInternalData2(); EGLint egl_config_attribs[] = {EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_DEPTH_SIZE, 8, EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, EGL_NONE}; EGLint egl_pbuffer_attribs[] = { EGL_WIDTH, m_windowWidth, EGL_HEIGHT, m_windowHeight, EGL_NONE, }; for (int i = 0; i < MAX_NUM_RESOURCES; i++) cuda_res[i] = NULL; // Load EGL functions int egl_version = gladLoaderLoadEGL(NULL); if(!egl_version) { fprintf(stderr, "failed to EGL with glad.\n"); exit(EXIT_FAILURE); }; // Query EGL Devices const int max_devices = 32; EGLDeviceEXT egl_devices[max_devices]; EGLint num_devices = 0; EGLint egl_error = eglGetError(); if (!eglQueryDevicesEXT(max_devices, egl_devices, &num_devices) || egl_error != EGL_SUCCESS) { printf("eglQueryDevicesEXT Failed.\n"); m_data->egl_display = EGL_NO_DISPLAY; } printf("number of devices found %d\n", num_devices); m_data->m_renderDevice = m_renderDevice; // Query EGL Screens if(m_data->m_renderDevice == -1) { // Chose default screen, by trying all for (EGLint i = 0; i < num_devices; ++i) { // Set display EGLDisplay display = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT, egl_devices[i], NULL); if (eglGetError() == EGL_SUCCESS && display != EGL_NO_DISPLAY) { int major, minor; EGLBoolean initialized = eglInitialize(display, &major, &minor); if (eglGetError() == EGL_SUCCESS && initialized == EGL_TRUE) { m_data->egl_display = display; } } } } else { // Chose specific screen, by using m_renderDevice if (m_data->m_renderDevice < 0 || m_data->m_renderDevice >= num_devices) { fprintf(stderr, "Invalid render_device choice: %d < %d.\n", m_data->m_renderDevice, num_devices); exit(EXIT_FAILURE); } // Set display EGLDisplay display = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT, egl_devices[m_data->m_renderDevice], NULL); if (eglGetError() == EGL_SUCCESS && display != EGL_NO_DISPLAY) { int major, minor; EGLBoolean initialized = eglInitialize(display, &major, &minor); if (eglGetError() == EGL_SUCCESS && initialized == EGL_TRUE) { m_data->egl_display = display; } } } if (!eglInitialize(m_data->egl_display, NULL, NULL)) { fprintf(stderr, "Unable to initialize EGL\n"); exit(EXIT_FAILURE); } egl_version = gladLoaderLoadEGL(m_data->egl_display); if (!egl_version) { fprintf(stderr, "Unable to reload EGL.\n"); exit(EXIT_FAILURE); } printf("Loaded EGL %d.%d after reload.\n", GLAD_VERSION_MAJOR(egl_version), GLAD_VERSION_MINOR(egl_version)); m_data->success = eglBindAPI(EGL_OPENGL_API); if (!m_data->success) { // TODO: Properly handle this error (requires change to default window // API to change return on all window types to bool). fprintf(stderr, "Failed to bind OpenGL API.\n"); exit(EXIT_FAILURE); } m_data->success = eglChooseConfig(m_data->egl_display, egl_config_attribs, &m_data->egl_config, 1, &m_data->num_configs); if (!m_data->success) { // TODO: Properly handle this error (requires change to default window // API to change return on all window types to bool). fprintf(stderr, "Failed to choose config (eglError: %d)\n", eglGetError()); exit(EXIT_FAILURE); } if (m_data->num_configs != 1) { fprintf(stderr, "Didn't get exactly one config, but %d\n", m_data->num_configs); exit(EXIT_FAILURE); } m_data->egl_surface = eglCreatePbufferSurface( m_data->egl_display, m_data->egl_config, egl_pbuffer_attribs); if (m_data->egl_surface == EGL_NO_SURFACE) { fprintf(stderr, "Unable to create EGL surface (eglError: %d)\n", eglGetError()); exit(EXIT_FAILURE); } m_data->egl_context = eglCreateContext( m_data->egl_display, m_data->egl_config, EGL_NO_CONTEXT, NULL); if (!m_data->egl_context) { fprintf(stderr, "Unable to create EGL context (eglError: %d)\n",eglGetError()); exit(EXIT_FAILURE); } m_data->success = eglMakeCurrent(m_data->egl_display, m_data->egl_surface, m_data->egl_surface, m_data->egl_context); if (!m_data->success) { fprintf(stderr, "Failed to make context current (eglError: %d)\n", eglGetError()); exit(EXIT_FAILURE); } if (!gladLoadGL(eglGetProcAddress)) { fprintf(stderr, "failed to load GL with glad.\n"); exit(EXIT_FAILURE); } return 0; }; void query() { const GLubyte* ven = glGetString(GL_VENDOR); printf("GL_VENDOR=%s\n", ven); const GLubyte* ren = glGetString(GL_RENDERER); printf("GL_RENDERER=%s\n", ren); const GLubyte* ver = glGetString(GL_VERSION); printf("GL_VERSION=%s\n", ver); const GLubyte* sl = glGetString(GL_SHADING_LANGUAGE_VERSION); printf("GL_SHADING_LANGUAGE_VERSION=%s\n", sl); } void release() { eglTerminate(m_data->egl_display); delete m_data; for (int i = 0; i < MAX_NUM_RESOURCES; i++) { if (cuda_res[i]) { cudaError_t err = cudaGraphicsUnregisterResource(cuda_res[i]); if( err != cudaSuccess ) { std::cout << "cudaGraphicsUnregisterResource failed: " << err << std::endl; } } } } void draw(py::array_t x) { //printf("draw\n"); int size = 3 * m_windowWidth * m_windowHeight; //unsigned char *data2 = new unsigned char[size]; auto ptr = (float *) x.mutable_data(); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); glColor3f(1, 0, 0); glVertex2f(0, 1); glColor3f(0, 1, 0); glVertex2f(-1, -1); glColor3f(0, 0, 1); glVertex2f(1, -1); glEnd(); eglSwapBuffers( m_data->egl_display, m_data->egl_surface); glReadPixels(0,0,m_windowWidth,m_windowHeight,GL_RGB, GL_FLOAT, ptr); //unsigned error = lodepng::encode("test.png", (unsigned char*)data2, m_windowWidth, m_windowHeight, LCT_RGB, 8); //delete data2; } void draw_py(py::array_t x) { /*auto r = x.mutable_unchecked<3>(); // Will throw if ndim != 3 or flags.writeable is false for (ssize_t i = 0; i < r.shape(0); i++) for (ssize_t j = 0; j < r.shape(1); j++) for (ssize_t k = 0; k < r.shape(2); k++) r(i, j, k) += 1.0;*/ std::fill(x.mutable_data(), x.mutable_data() + x.size(), 42); } void map_tensor(GLuint tid, int width, int height, std::size_t data) { cudaError_t err; if (cuda_res[tid] == NULL) { err = cudaGraphicsGLRegisterImage(&(cuda_res[tid]), tid, GL_TEXTURE_2D, cudaGraphicsMapFlagsNone); if( err != cudaSuccess ) { std::cout << "cudaGraphicsGLRegisterImage failed: " << err << std::endl; } } err = cudaGraphicsMapResources(1, &(cuda_res[tid])); if( err != cudaSuccess ) { std::cout << "cudaGraphicsMapResources failed: " << err << std::endl; } cudaArray* array; err = cudaGraphicsSubResourceGetMappedArray(&array, cuda_res[tid], 0, 0); if( err != cudaSuccess ) { std::cout << "cudaGraphicsSubResourceGetMappedArray failed: " << err << std::endl; } // copy data err = cudaMemcpy2DFromArray((void*)data, width*4*sizeof(float), array, 0, 0, width*4*sizeof(float), height, cudaMemcpyDeviceToDevice); if( err != cudaSuccess ) { std::cout << "cudaMemcpy2DFromArray failed: " << err << std::endl; } err = cudaGraphicsUnmapResources(1, &(cuda_res[tid])); if( err != cudaSuccess ) { std::cout << "cudaGraphicsUnmapResources failed: " << err << std::endl; } } }; PYBIND11_MODULE(CppYCBRenderer, m) { py::class_(m, "CppYCBRenderer") .def(py::init()) .def("init", &CppYCBRenderer::init) .def("query", &CppYCBRenderer::query) .def("map_tensor", &CppYCBRenderer::map_tensor) .def("draw", &CppYCBRenderer::draw, py::arg().noconvert()) .def("release", &CppYCBRenderer::release) .def("draw_py", &CppYCBRenderer::draw_py, py::arg().noconvert()); #ifdef VERSION_INFO m.attr("__version__") = VERSION_INFO; #else m.attr("__version__") = "dev"; #endif } ================================================ FILE: ycb_render/get_available_devices.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import subprocess import os def get_available_devices(): executable_path = os.path.join(os.path.dirname(__file__), 'build') num_devices = int(subprocess.check_output( ["{}/query_devices".format(executable_path)])) available_devices = [] for i in range(num_devices): try: if b"NVIDIA" in subprocess.check_output(["{}/test_device".format(executable_path), str(i)]): available_devices.append(i) except subprocess.CalledProcessError as e: print(e) return(available_devices) if __name__ == '__main__': print(get_available_devices()) ================================================ FILE: ycb_render/glad/EGL/eglplatform.h ================================================ #ifndef __eglplatform_h_ #define __eglplatform_h_ /* ** Copyright (c) 2007-2016 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be included ** in all copies or substantial portions of the Materials. ** ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ /* Platform-specific types and definitions for egl.h * $Revision: 30994 $ on $Date: 2015-04-30 13:36:48 -0700 (Thu, 30 Apr 2015) $ * * Adopters may modify khrplatform.h and this file to suit their platform. * You are encouraged to submit all modifications to the Khronos group so that * they can be included in future versions of this file. Please submit changes * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla) * by filing a bug against product "EGL" component "Registry". */ #include /* Macros used in EGL function prototype declarations. * * EGL functions should be prototyped as: * * EGLAPI return-type EGLAPIENTRY eglFunction(arguments); * typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments); * * KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h */ #ifndef EGLAPI #define EGLAPI KHRONOS_APICALL #endif #ifndef EGLAPIENTRY #define EGLAPIENTRY KHRONOS_APIENTRY #endif #define EGLAPIENTRYP EGLAPIENTRY* /* The types NativeDisplayType, NativeWindowType, and NativePixmapType * are aliases of window-system-dependent types, such as X Display * or * Windows Device Context. They must be defined in platform-specific * code below. The EGL-prefixed versions of Native*Type are the same * types, renamed in EGL 1.3 so all types in the API start with "EGL". * * Khronos STRONGLY RECOMMENDS that you use the default definitions * provided below, since these changes affect both binary and source * portability of applications using EGL running on different EGL * implementations. */ #if defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */ #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN 1 #endif #include typedef HDC EGLNativeDisplayType; typedef HBITMAP EGLNativePixmapType; typedef HWND EGLNativeWindowType; #elif defined(__WINSCW__) || defined(__SYMBIAN32__) /* Symbian */ typedef int EGLNativeDisplayType; typedef void *EGLNativeWindowType; typedef void *EGLNativePixmapType; #elif defined(WL_EGL_PLATFORM) typedef struct wl_display *EGLNativeDisplayType; typedef struct wl_egl_pixmap *EGLNativePixmapType; typedef struct wl_egl_window *EGLNativeWindowType; #elif defined(__GBM__) typedef struct gbm_device *EGLNativeDisplayType; typedef struct gbm_bo *EGLNativePixmapType; typedef void *EGLNativeWindowType; #elif defined(__ANDROID__) || defined(ANDROID) struct ANativeWindow; struct egl_native_pixmap_t; typedef struct ANativeWindow* EGLNativeWindowType; typedef struct egl_native_pixmap_t* EGLNativePixmapType; typedef void* EGLNativeDisplayType; #elif defined(__unix__) || defined(__APPLE__) #if defined(MESA_EGL_NO_X11_HEADERS) typedef void *EGLNativeDisplayType; typedef khronos_uintptr_t EGLNativePixmapType; typedef khronos_uintptr_t EGLNativeWindowType; #else /* X11 (tentative) */ #include #include typedef Display *EGLNativeDisplayType; typedef Pixmap EGLNativePixmapType; typedef Window EGLNativeWindowType; #endif /* MESA_EGL_NO_X11_HEADERS */ #elif __HAIKU__ #include typedef void *EGLNativeDisplayType; typedef khronos_uintptr_t EGLNativePixmapType; typedef khronos_uintptr_t EGLNativeWindowType; #else #error "Platform not recognized" #endif /* EGL 1.2 types, renamed for consistency in EGL 1.3 */ typedef EGLNativeDisplayType NativeDisplayType; typedef EGLNativePixmapType NativePixmapType; typedef EGLNativeWindowType NativeWindowType; /* Define EGLint. This must be a signed integral type large enough to contain * all legal attribute names and values passed into and out of EGL, whether * their type is boolean, bitmask, enumerant (symbolic constant), integer, * handle, or other. While in general a 32-bit integer will suffice, if * handles are 64 bit types, then EGLint should be defined as a signed 64-bit * integer type. */ typedef khronos_int32_t EGLint; /* C++ / C typecast macros for special EGL handle values */ #if defined(__cplusplus) #define EGL_CAST(type, value) (static_cast(value)) #else #define EGL_CAST(type, value) ((type) (value)) #endif #endif /* __eglplatform_h */ ================================================ FILE: ycb_render/glad/KHR/khrplatform.h ================================================ #ifndef __khrplatform_h_ #define __khrplatform_h_ /* ** Copyright (c) 2008-2009 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be included ** in all copies or substantial portions of the Materials. ** ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ /* Khronos platform-specific types and definitions. * * $Revision: 32517 $ on $Date: 2016-03-11 02:41:19 -0800 (Fri, 11 Mar 2016) $ * * Adopters may modify this file to suit their platform. Adopters are * encouraged to submit platform specific modifications to the Khronos * group so that they can be included in future versions of this file. * Please submit changes by sending them to the public Khronos Bugzilla * (http://khronos.org/bugzilla) by filing a bug against product * "Khronos (general)" component "Registry". * * A predefined template which fills in some of the bug fields can be * reached using http://tinyurl.com/khrplatform-h-bugreport, but you * must create a Bugzilla login first. * * * See the Implementer's Guidelines for information about where this file * should be located on your system and for more details of its use: * http://www.khronos.org/registry/implementers_guide.pdf * * This file should be included as * #include * by Khronos client API header files that use its types and defines. * * The types in khrplatform.h should only be used to define API-specific types. * * Types defined in khrplatform.h: * khronos_int8_t signed 8 bit * khronos_uint8_t unsigned 8 bit * khronos_int16_t signed 16 bit * khronos_uint16_t unsigned 16 bit * khronos_int32_t signed 32 bit * khronos_uint32_t unsigned 32 bit * khronos_int64_t signed 64 bit * khronos_uint64_t unsigned 64 bit * khronos_intptr_t signed same number of bits as a pointer * khronos_uintptr_t unsigned same number of bits as a pointer * khronos_ssize_t signed size * khronos_usize_t unsigned size * khronos_float_t signed 32 bit floating point * khronos_time_ns_t unsigned 64 bit time in nanoseconds * khronos_utime_nanoseconds_t unsigned time interval or absolute time in * nanoseconds * khronos_stime_nanoseconds_t signed time interval in nanoseconds * khronos_boolean_enum_t enumerated boolean type. This should * only be used as a base type when a client API's boolean type is * an enum. Client APIs which use an integer or other type for * booleans cannot use this as the base type for their boolean. * * Tokens defined in khrplatform.h: * * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. * * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. * * Calling convention macros defined in this file: * KHRONOS_APICALL * KHRONOS_APIENTRY * KHRONOS_APIATTRIBUTES * * These may be used in function prototypes as: * * KHRONOS_APICALL void KHRONOS_APIENTRY funcname( * int arg1, * int arg2) KHRONOS_APIATTRIBUTES; */ /*------------------------------------------------------------------------- * Definition of KHRONOS_APICALL *------------------------------------------------------------------------- * This precedes the return type of the function in the function prototype. */ #if defined(_WIN32) && !defined(__SCITECH_SNAP__) # define KHRONOS_APICALL __declspec(dllimport) #elif defined (__SYMBIAN32__) # define KHRONOS_APICALL IMPORT_C #elif defined(__ANDROID__) # define KHRONOS_APICALL __attribute__((visibility("default"))) #else # define KHRONOS_APICALL #endif /*------------------------------------------------------------------------- * Definition of KHRONOS_APIENTRY *------------------------------------------------------------------------- * This follows the return type of the function and precedes the function * name in the function prototype. */ #if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) /* Win32 but not WinCE */ # define KHRONOS_APIENTRY __stdcall #else # define KHRONOS_APIENTRY #endif /*------------------------------------------------------------------------- * Definition of KHRONOS_APIATTRIBUTES *------------------------------------------------------------------------- * This follows the closing parenthesis of the function prototype arguments. */ #if defined (__ARMCC_2__) #define KHRONOS_APIATTRIBUTES __softfp #else #define KHRONOS_APIATTRIBUTES #endif /*------------------------------------------------------------------------- * basic type definitions *-----------------------------------------------------------------------*/ #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) /* * Using */ #include typedef int32_t khronos_int32_t; typedef uint32_t khronos_uint32_t; typedef int64_t khronos_int64_t; typedef uint64_t khronos_uint64_t; #define KHRONOS_SUPPORT_INT64 1 #define KHRONOS_SUPPORT_FLOAT 1 #elif defined(__VMS ) || defined(__sgi) /* * Using */ #include typedef int32_t khronos_int32_t; typedef uint32_t khronos_uint32_t; typedef int64_t khronos_int64_t; typedef uint64_t khronos_uint64_t; #define KHRONOS_SUPPORT_INT64 1 #define KHRONOS_SUPPORT_FLOAT 1 #elif defined(_WIN32) && !defined(__SCITECH_SNAP__) /* * Win32 */ typedef __int32 khronos_int32_t; typedef unsigned __int32 khronos_uint32_t; typedef __int64 khronos_int64_t; typedef unsigned __int64 khronos_uint64_t; #define KHRONOS_SUPPORT_INT64 1 #define KHRONOS_SUPPORT_FLOAT 1 #elif defined(__sun__) || defined(__digital__) /* * Sun or Digital */ typedef int khronos_int32_t; typedef unsigned int khronos_uint32_t; #if defined(__arch64__) || defined(_LP64) typedef long int khronos_int64_t; typedef unsigned long int khronos_uint64_t; #else typedef long long int khronos_int64_t; typedef unsigned long long int khronos_uint64_t; #endif /* __arch64__ */ #define KHRONOS_SUPPORT_INT64 1 #define KHRONOS_SUPPORT_FLOAT 1 #elif 0 /* * Hypothetical platform with no float or int64 support */ typedef int khronos_int32_t; typedef unsigned int khronos_uint32_t; #define KHRONOS_SUPPORT_INT64 0 #define KHRONOS_SUPPORT_FLOAT 0 #else /* * Generic fallback */ #include typedef int32_t khronos_int32_t; typedef uint32_t khronos_uint32_t; typedef int64_t khronos_int64_t; typedef uint64_t khronos_uint64_t; #define KHRONOS_SUPPORT_INT64 1 #define KHRONOS_SUPPORT_FLOAT 1 #endif /* * Types that are (so far) the same on all platforms */ typedef signed char khronos_int8_t; typedef unsigned char khronos_uint8_t; typedef signed short int khronos_int16_t; typedef unsigned short int khronos_uint16_t; /* * Types that differ between LLP64 and LP64 architectures - in LLP64, * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears * to be the only LLP64 architecture in current use. */ #ifdef _WIN64 typedef signed long long int khronos_intptr_t; typedef unsigned long long int khronos_uintptr_t; typedef signed long long int khronos_ssize_t; typedef unsigned long long int khronos_usize_t; #else typedef signed long int khronos_intptr_t; typedef unsigned long int khronos_uintptr_t; typedef signed long int khronos_ssize_t; typedef unsigned long int khronos_usize_t; #endif #if KHRONOS_SUPPORT_FLOAT /* * Float type */ typedef float khronos_float_t; #endif #if KHRONOS_SUPPORT_INT64 /* Time types * * These types can be used to represent a time interval in nanoseconds or * an absolute Unadjusted System Time. Unadjusted System Time is the number * of nanoseconds since some arbitrary system event (e.g. since the last * time the system booted). The Unadjusted System Time is an unsigned * 64 bit value that wraps back to 0 every 584 years. Time intervals * may be either signed or unsigned. */ typedef khronos_uint64_t khronos_utime_nanoseconds_t; typedef khronos_int64_t khronos_stime_nanoseconds_t; #endif /* * Dummy value used to pad enum types to 32 bits. */ #ifndef KHRONOS_MAX_ENUM #define KHRONOS_MAX_ENUM 0x7FFFFFFF #endif /* * Enumerated boolean type * * Values other than zero should be considered to be true. Therefore * comparisons should not be made against KHRONOS_TRUE. */ typedef enum { KHRONOS_FALSE = 0, KHRONOS_TRUE = 1, KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM } khronos_boolean_enum_t; #endif /* __khrplatform_h_ */ ================================================ FILE: ycb_render/glad/egl.c ================================================ #include #include #include #include #ifndef GLAD_IMPL_UTIL_C_ #define GLAD_IMPL_UTIL_C_ #if _MSC_VER >= 1400 #define GLAD_IMPL_UTIL_STRNCPY(dest, source, len) strncpy_s(dest, len, source, len-1); #else #define GLAD_IMPL_UTIL_STRNCPY(dest, source, len) strncpy(dest, source, len); #endif #ifdef _MSC_VER #define GLAD_IMPL_UTIL_SSCANF sscanf_s #else #define GLAD_IMPL_UTIL_SSCANF sscanf #endif #endif /* GLAD_IMPL_UTIL_C_ */ int GLAD_EGL_VERSION_1_0; int GLAD_EGL_VERSION_1_1; int GLAD_EGL_VERSION_1_2; int GLAD_EGL_VERSION_1_3; int GLAD_EGL_VERSION_1_4; int GLAD_EGL_VERSION_1_5; int GLAD_EGL_EXT_platform_device; int GLAD_EGL_EXT_platform_base; int GLAD_EGL_NV_device_cuda; int GLAD_EGL_EXT_device_enumeration; int GLAD_EGL_EXT_device_query; int GLAD_EGL_EXT_device_base; int GLAD_EGL_NV_cuda_event; PFNEGLQUERYDEVICESEXTPROC glad_eglQueryDevicesEXT; PFNEGLCREATEPBUFFERSURFACEPROC glad_eglCreatePbufferSurface; PFNEGLGETERRORPROC glad_eglGetError; PFNEGLGETPROCADDRESSPROC glad_eglGetProcAddress; PFNEGLGETCURRENTDISPLAYPROC glad_eglGetCurrentDisplay; PFNEGLQUERYAPIPROC glad_eglQueryAPI; PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC glad_eglCreatePlatformPixmapSurface; PFNEGLQUERYDISPLAYATTRIBKHRPROC glad_eglQueryDisplayAttribKHR; PFNEGLDESTROYSYNCPROC glad_eglDestroySync; PFNEGLCREATEIMAGEPROC glad_eglCreateImage; PFNEGLQUERYCONTEXTPROC glad_eglQueryContext; PFNEGLSWAPBUFFERSPROC glad_eglSwapBuffers; PFNEGLCREATECONTEXTPROC glad_eglCreateContext; PFNEGLCHOOSECONFIGPROC glad_eglChooseConfig; PFNEGLBINDAPIPROC glad_eglBindAPI; PFNEGLWAITNATIVEPROC glad_eglWaitNative; PFNEGLTERMINATEPROC glad_eglTerminate; PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC glad_eglCreatePlatformPixmapSurfaceEXT; PFNEGLRELEASETHREADPROC glad_eglReleaseThread; PFNEGLCREATEPLATFORMWINDOWSURFACEPROC glad_eglCreatePlatformWindowSurface; PFNEGLGETCONFIGATTRIBPROC glad_eglGetConfigAttrib; PFNEGLGETCURRENTSURFACEPROC glad_eglGetCurrentSurface; PFNEGLCOPYBUFFERSPROC glad_eglCopyBuffers; PFNEGLGETPLATFORMDISPLAYEXTPROC glad_eglGetPlatformDisplayEXT; PFNEGLQUERYDEVICEATTRIBEXTPROC glad_eglQueryDeviceAttribEXT; PFNEGLCREATEPIXMAPSURFACEPROC glad_eglCreatePixmapSurface; PFNEGLBINDTEXIMAGEPROC glad_eglBindTexImage; PFNEGLGETPLATFORMDISPLAYPROC glad_eglGetPlatformDisplay; PFNEGLGETDISPLAYPROC glad_eglGetDisplay; PFNEGLQUERYSTRINGPROC glad_eglQueryString; PFNEGLCLIENTWAITSYNCPROC glad_eglClientWaitSync; PFNEGLWAITSYNCPROC glad_eglWaitSync; PFNEGLDESTROYIMAGEPROC glad_eglDestroyImage; PFNEGLRELEASETEXIMAGEPROC glad_eglReleaseTexImage; PFNEGLQUERYDISPLAYATTRIBEXTPROC glad_eglQueryDisplayAttribEXT; PFNEGLDESTROYCONTEXTPROC glad_eglDestroyContext; PFNEGLQUERYDEVICESTRINGEXTPROC glad_eglQueryDeviceStringEXT; PFNEGLCREATEWINDOWSURFACEPROC glad_eglCreateWindowSurface; PFNEGLGETCURRENTCONTEXTPROC glad_eglGetCurrentContext; PFNEGLINITIALIZEPROC glad_eglInitialize; PFNEGLDESTROYSURFACEPROC glad_eglDestroySurface; PFNEGLMAKECURRENTPROC glad_eglMakeCurrent; PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC glad_eglCreatePlatformWindowSurfaceEXT; PFNEGLSWAPINTERVALPROC glad_eglSwapInterval; PFNEGLCREATESYNCPROC glad_eglCreateSync; PFNEGLGETSYNCATTRIBPROC glad_eglGetSyncAttrib; PFNEGLSURFACEATTRIBPROC glad_eglSurfaceAttrib; PFNEGLWAITGLPROC glad_eglWaitGL; PFNEGLQUERYSURFACEPROC glad_eglQuerySurface; PFNEGLGETCONFIGSPROC glad_eglGetConfigs; PFNEGLWAITCLIENTPROC glad_eglWaitClient; PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC glad_eglCreatePbufferFromClientBuffer; static void load_EGL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_EGL_VERSION_1_0) return; eglCreatePbufferSurface = (PFNEGLCREATEPBUFFERSURFACEPROC) load("eglCreatePbufferSurface", userptr); eglGetError = (PFNEGLGETERRORPROC) load("eglGetError", userptr); eglGetProcAddress = (PFNEGLGETPROCADDRESSPROC) load("eglGetProcAddress", userptr); eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) load("eglGetCurrentDisplay", userptr); eglQueryContext = (PFNEGLQUERYCONTEXTPROC) load("eglQueryContext", userptr); eglSwapBuffers = (PFNEGLSWAPBUFFERSPROC) load("eglSwapBuffers", userptr); eglCreateContext = (PFNEGLCREATECONTEXTPROC) load("eglCreateContext", userptr); eglChooseConfig = (PFNEGLCHOOSECONFIGPROC) load("eglChooseConfig", userptr); eglWaitNative = (PFNEGLWAITNATIVEPROC) load("eglWaitNative", userptr); eglTerminate = (PFNEGLTERMINATEPROC) load("eglTerminate", userptr); eglCopyBuffers = (PFNEGLCOPYBUFFERSPROC) load("eglCopyBuffers", userptr); eglGetConfigAttrib = (PFNEGLGETCONFIGATTRIBPROC) load("eglGetConfigAttrib", userptr); eglGetCurrentSurface = (PFNEGLGETCURRENTSURFACEPROC) load("eglGetCurrentSurface", userptr); eglCreatePixmapSurface = (PFNEGLCREATEPIXMAPSURFACEPROC) load("eglCreatePixmapSurface", userptr); eglGetDisplay = (PFNEGLGETDISPLAYPROC) load("eglGetDisplay", userptr); eglQueryString = (PFNEGLQUERYSTRINGPROC) load("eglQueryString", userptr); eglDestroyContext = (PFNEGLDESTROYCONTEXTPROC) load("eglDestroyContext", userptr); eglCreateWindowSurface = (PFNEGLCREATEWINDOWSURFACEPROC) load("eglCreateWindowSurface", userptr); eglInitialize = (PFNEGLINITIALIZEPROC) load("eglInitialize", userptr); eglDestroySurface = (PFNEGLDESTROYSURFACEPROC) load("eglDestroySurface", userptr); eglMakeCurrent = (PFNEGLMAKECURRENTPROC) load("eglMakeCurrent", userptr); eglWaitGL = (PFNEGLWAITGLPROC) load("eglWaitGL", userptr); eglQuerySurface = (PFNEGLQUERYSURFACEPROC) load("eglQuerySurface", userptr); eglGetConfigs = (PFNEGLGETCONFIGSPROC) load("eglGetConfigs", userptr); } static void load_EGL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_EGL_VERSION_1_1) return; eglReleaseTexImage = (PFNEGLRELEASETEXIMAGEPROC) load("eglReleaseTexImage", userptr); eglSurfaceAttrib = (PFNEGLSURFACEATTRIBPROC) load("eglSurfaceAttrib", userptr); eglBindTexImage = (PFNEGLBINDTEXIMAGEPROC) load("eglBindTexImage", userptr); eglSwapInterval = (PFNEGLSWAPINTERVALPROC) load("eglSwapInterval", userptr); } static void load_EGL_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_EGL_VERSION_1_2) return; eglBindAPI = (PFNEGLBINDAPIPROC) load("eglBindAPI", userptr); eglQueryAPI = (PFNEGLQUERYAPIPROC) load("eglQueryAPI", userptr); eglWaitClient = (PFNEGLWAITCLIENTPROC) load("eglWaitClient", userptr); eglCreatePbufferFromClientBuffer = (PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) load("eglCreatePbufferFromClientBuffer", userptr); eglReleaseThread = (PFNEGLRELEASETHREADPROC) load("eglReleaseThread", userptr); } static void load_EGL_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_EGL_VERSION_1_4) return; eglGetCurrentContext = (PFNEGLGETCURRENTCONTEXTPROC) load("eglGetCurrentContext", userptr); } static void load_EGL_VERSION_1_5( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_EGL_VERSION_1_5) return; eglDestroySync = (PFNEGLDESTROYSYNCPROC) load("eglDestroySync", userptr); eglCreateImage = (PFNEGLCREATEIMAGEPROC) load("eglCreateImage", userptr); eglGetPlatformDisplay = (PFNEGLGETPLATFORMDISPLAYPROC) load("eglGetPlatformDisplay", userptr); eglDestroyImage = (PFNEGLDESTROYIMAGEPROC) load("eglDestroyImage", userptr); eglClientWaitSync = (PFNEGLCLIENTWAITSYNCPROC) load("eglClientWaitSync", userptr); eglWaitSync = (PFNEGLWAITSYNCPROC) load("eglWaitSync", userptr); eglCreateSync = (PFNEGLCREATESYNCPROC) load("eglCreateSync", userptr); eglGetSyncAttrib = (PFNEGLGETSYNCATTRIBPROC) load("eglGetSyncAttrib", userptr); eglCreatePlatformWindowSurface = (PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) load("eglCreatePlatformWindowSurface", userptr); eglCreatePlatformPixmapSurface = (PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) load("eglCreatePlatformPixmapSurface", userptr); } static void load_EGL_EXT_platform_base( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_EGL_EXT_platform_base) return; eglCreatePlatformWindowSurfaceEXT = (PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC) load("eglCreatePlatformWindowSurfaceEXT", userptr); eglGetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC) load("eglGetPlatformDisplayEXT", userptr); eglCreatePlatformPixmapSurfaceEXT = (PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC) load("eglCreatePlatformPixmapSurfaceEXT", userptr); } static void load_EGL_EXT_device_enumeration( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_EGL_EXT_device_enumeration) return; eglQueryDevicesEXT = (PFNEGLQUERYDEVICESEXTPROC) load("eglQueryDevicesEXT", userptr); } static void load_EGL_EXT_device_query( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_EGL_EXT_device_query) return; eglQueryDisplayAttribEXT = (PFNEGLQUERYDISPLAYATTRIBEXTPROC) load("eglQueryDisplayAttribEXT", userptr); eglQueryDeviceStringEXT = (PFNEGLQUERYDEVICESTRINGEXTPROC) load("eglQueryDeviceStringEXT", userptr); eglQueryDeviceAttribEXT = (PFNEGLQUERYDEVICEATTRIBEXTPROC) load("eglQueryDeviceAttribEXT", userptr); eglQueryDisplayAttribKHR = (PFNEGLQUERYDISPLAYATTRIBKHRPROC) load("eglQueryDisplayAttribKHR", userptr); } static void load_EGL_EXT_device_base( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_EGL_EXT_device_base) return; eglQueryDisplayAttribEXT = (PFNEGLQUERYDISPLAYATTRIBEXTPROC) load("eglQueryDisplayAttribEXT", userptr); eglQueryDevicesEXT = (PFNEGLQUERYDEVICESEXTPROC) load("eglQueryDevicesEXT", userptr); eglQueryDeviceStringEXT = (PFNEGLQUERYDEVICESTRINGEXTPROC) load("eglQueryDeviceStringEXT", userptr); eglQueryDeviceAttribEXT = (PFNEGLQUERYDEVICEATTRIBEXTPROC) load("eglQueryDeviceAttribEXT", userptr); eglQueryDisplayAttribKHR = (PFNEGLQUERYDISPLAYATTRIBKHRPROC) load("eglQueryDisplayAttribKHR", userptr); } static int get_exts(EGLDisplay display, const char **extensions) { *extensions = eglQueryString(display, EGL_EXTENSIONS); return extensions != NULL; } static int has_ext(const char *extensions, const char *ext) { const char *loc; const char *terminator; if(extensions == NULL) { return 0; } while(1) { loc = strstr(extensions, ext); if(loc == NULL) { return 0; } terminator = loc + strlen(ext); if((loc == extensions || *(loc - 1) == ' ') && (*terminator == ' ' || *terminator == '\0')) { return 1; } extensions = terminator; } } static GLADapiproc glad_egl_get_proc_from_userptr(const char *name, void *userptr) { return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); } static int find_extensionsEGL(EGLDisplay display) { const char *extensions; if (!get_exts(display, &extensions)) return 0; GLAD_EGL_EXT_platform_device = has_ext(extensions, "EGL_EXT_platform_device"); GLAD_EGL_EXT_platform_base = has_ext(extensions, "EGL_EXT_platform_base"); GLAD_EGL_NV_device_cuda = has_ext(extensions, "EGL_NV_device_cuda"); GLAD_EGL_EXT_device_enumeration = has_ext(extensions, "EGL_EXT_device_enumeration"); GLAD_EGL_EXT_device_query = has_ext(extensions, "EGL_EXT_device_query"); GLAD_EGL_EXT_device_base = has_ext(extensions, "EGL_EXT_device_base"); GLAD_EGL_NV_cuda_event = has_ext(extensions, "EGL_NV_cuda_event"); return 1; } static int find_coreEGL(EGLDisplay display) { int major, minor; const char *version; if (display == NULL) { display = EGL_NO_DISPLAY; /* this is usually NULL, better safe than sorry */ } if (display == EGL_NO_DISPLAY) { display = eglGetCurrentDisplay(); } if (display == EGL_NO_DISPLAY) { display = eglGetDisplay(EGL_DEFAULT_DISPLAY); } if (display == EGL_NO_DISPLAY) { return 0; } version = eglQueryString(display, EGL_VERSION); (void) eglGetError(); if (version == NULL) { major = 1; minor = 0; } else { GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor); } GLAD_EGL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; GLAD_EGL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; GLAD_EGL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; GLAD_EGL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; GLAD_EGL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; GLAD_EGL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1; return GLAD_MAKE_VERSION(major, minor); } int gladLoadEGLUserPtr(EGLDisplay display, GLADuserptrloadfunc load, void* userptr) { int version; eglGetDisplay = (PFNEGLGETDISPLAYPROC) load("eglGetDisplay", userptr); eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) load("eglGetCurrentDisplay", userptr); eglQueryString = (PFNEGLQUERYSTRINGPROC) load("eglQueryString", userptr); eglGetError = (PFNEGLGETERRORPROC) load("eglGetError", userptr); if (eglGetDisplay == NULL || eglGetCurrentDisplay == NULL || eglQueryString == NULL || eglGetError == NULL) return 0; version = find_coreEGL(display); if (!version) return 0; load_EGL_VERSION_1_0(load, userptr); load_EGL_VERSION_1_1(load, userptr); load_EGL_VERSION_1_2(load, userptr); load_EGL_VERSION_1_4(load, userptr); load_EGL_VERSION_1_5(load, userptr); if (!find_extensionsEGL(display)) return 0; load_EGL_EXT_platform_base(load, userptr); load_EGL_EXT_device_enumeration(load, userptr); load_EGL_EXT_device_query(load, userptr); load_EGL_EXT_device_base(load, userptr); return version; } int gladLoadEGL(EGLDisplay display, GLADloadfunc load) { return gladLoadEGLUserPtr(display, glad_egl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); } #ifdef GLAD_EGL #ifndef GLAD_LOADER_LIBRARY_C_ #define GLAD_LOADER_LIBRARY_C_ #include #include #if GLAD_PLATFORM_WIN32 #include #else #include #endif static void* glad_get_dlopen_handle(const char *lib_names[], int length) { void *handle = NULL; int i; for (i = 0; i < length; ++i) { #if GLAD_PLATFORM_WIN32 #if GLAD_PLATFORM_UWP size_t buffer_size = (strlen(lib_names[i]) + 1) * sizeof(WCHAR); LPWSTR buffer = (LPWSTR) malloc(buffer_size); if (buffer != NULL) { int ret = MultiByteToWideChar(CP_ACP, 0, lib_names[i], -1, buffer, buffer_size); if (ret != 0) { handle = (void*) LoadPackagedLibrary(buffer, 0); } free((void*) buffer); } #else handle = (void*) LoadLibraryA(lib_names[i]); #endif #else handle = dlopen(lib_names[i], RTLD_LAZY | RTLD_LOCAL); #endif if (handle != NULL) { return handle; } } return NULL; } static void glad_close_dlopen_handle(void* handle) { if (handle != NULL) { #if GLAD_PLATFORM_WIN32 FreeLibrary((HMODULE) handle); #else dlclose(handle); #endif } } static GLADapiproc glad_dlsym_handle(void* handle, const char *name) { if (handle == NULL) { return NULL; } #if GLAD_PLATFORM_WIN32 return (GLADapiproc) GetProcAddress((HMODULE) handle, name); #else return GLAD_GNUC_EXTENSION (GLADapiproc) dlsym(handle, name); #endif } #endif /* GLAD_LOADER_LIBRARY_C_ */ struct _glad_egl_userptr { void *handle; PFNEGLGETPROCADDRESSPROC get_proc_address_ptr; }; static GLADapiproc glad_egl_get_proc(const char* name, void *vuserptr) { struct _glad_egl_userptr userptr = *(struct _glad_egl_userptr*) vuserptr; GLADapiproc result = NULL; result = glad_dlsym_handle(userptr.handle, name); if (result == NULL) { result = GLAD_GNUC_EXTENSION (GLADapiproc) userptr.get_proc_address_ptr(name); } return result; } static void* _egl_handle = NULL; int gladLoaderLoadEGL(EGLDisplay display) { #ifdef __APPLE__ static const char *NAMES[] = {"libEGL.dylib"}; #elif GLAD_PLATFORM_WIN32 static const char *NAMES[] = {"libEGL.dll", "EGL.dll"}; #else static const char *NAMES[] = {"libEGL.so.1", "libEGL.so"}; #endif int version = 0; int did_load = 0; struct _glad_egl_userptr userptr; if (_egl_handle == NULL) { _egl_handle = glad_get_dlopen_handle(NAMES, sizeof(NAMES) / sizeof(NAMES[0])); did_load = _egl_handle != NULL; } if (_egl_handle != NULL) { userptr.handle = _egl_handle; userptr.get_proc_address_ptr = (PFNEGLGETPROCADDRESSPROC) glad_dlsym_handle(_egl_handle, "eglGetProcAddress"); if (userptr.get_proc_address_ptr != NULL) { version = gladLoadEGLUserPtr(display, glad_egl_get_proc, &userptr); } if (!version && did_load) { glad_close_dlopen_handle(_egl_handle); _egl_handle = NULL; } } return version; } void gladLoaderUnloadEGL() { if (_egl_handle != NULL) { glad_close_dlopen_handle(_egl_handle); _egl_handle = NULL; } } #endif /* GLAD_EGL */ ================================================ FILE: ycb_render/glad/gl.c ================================================ #include #include #include #include #ifndef GLAD_IMPL_UTIL_C_ #define GLAD_IMPL_UTIL_C_ #if _MSC_VER >= 1400 #define GLAD_IMPL_UTIL_STRNCPY(dest, source, len) strncpy_s(dest, len, source, len-1); #else #define GLAD_IMPL_UTIL_STRNCPY(dest, source, len) strncpy(dest, source, len); #endif #ifdef _MSC_VER #define GLAD_IMPL_UTIL_SSCANF sscanf_s #else #define GLAD_IMPL_UTIL_SSCANF sscanf #endif #endif /* GLAD_IMPL_UTIL_C_ */ int GLAD_GL_VERSION_1_0; int GLAD_GL_VERSION_1_1; int GLAD_GL_VERSION_1_2; int GLAD_GL_VERSION_1_3; int GLAD_GL_VERSION_1_4; int GLAD_GL_VERSION_1_5; int GLAD_GL_VERSION_2_0; int GLAD_GL_VERSION_2_1; int GLAD_GL_VERSION_3_0; int GLAD_GL_VERSION_3_1; int GLAD_GL_VERSION_3_2; int GLAD_GL_VERSION_3_3; int GLAD_GL_VERSION_4_0; int GLAD_GL_VERSION_4_1; int GLAD_GL_VERSION_4_2; int GLAD_GL_VERSION_4_3; int GLAD_GL_VERSION_4_4; int GLAD_GL_VERSION_4_5; int GLAD_GL_VERSION_4_6; int GLAD_GL_ARB_point_sprite; PFNGLGETTEXTUREPARAMETERIIVPROC glad_glGetTextureParameterIiv; PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv; PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC glad_glTextureStorage3DMultisample; PFNGLEVALPOINT2PROC glad_glEvalPoint2; PFNGLVERTEXARRAYATTRIBBINDINGPROC glad_glVertexArrayAttribBinding; PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC glad_glFlushMappedNamedBufferRange; PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC glad_glGetNamedFramebufferParameteriv; PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf; PFNGLGETFLOATI_VPROC glad_glGetFloati_v; PFNGLLOADNAMEPROC glad_glLoadName; PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv; PFNGLSECONDARYCOLOR3SVPROC glad_glSecondaryColor3sv; PFNGLCOPYTEXTURESUBIMAGE1DPROC glad_glCopyTextureSubImage1D; PFNGLSECONDARYCOLOR3UIVPROC glad_glSecondaryColor3uiv; PFNGLUNIFORM1DVPROC glad_glUniform1dv; PFNGLWINDOWPOS3DVPROC glad_glWindowPos3dv; PFNGLSECONDARYCOLOR3BVPROC glad_glSecondaryColor3bv; PFNGLSECONDARYCOLOR3UIPROC glad_glSecondaryColor3ui; PFNGLGETNCOLORTABLEPROC glad_glGetnColorTable; PFNGLRASTERPOS3IPROC glad_glRasterPos3i; PFNGLACTIVETEXTUREPROC glad_glActiveTexture; PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv; PFNGLCLEARNAMEDBUFFERDATAPROC glad_glClearNamedBufferData; PFNGLNORMAL3DPROC glad_glNormal3d; PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC glad_glInvalidateNamedFramebufferSubData; PFNGLBINDBUFFERSBASEPROC glad_glBindBuffersBase; PFNGLEVALCOORD1DPROC glad_glEvalCoord1d; PFNGLGETMAPFVPROC glad_glGetMapfv; PFNGLISSYNCPROC glad_glIsSync; PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D; PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation; PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D; PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i; PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv; PFNGLVERTEX4SVPROC glad_glVertex4sv; PFNGLTEXSTORAGE2DPROC glad_glTexStorage2D; PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv; PFNGLUNIFORMMATRIX3X2DVPROC glad_glUniformMatrix3x2dv; PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv; PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv; PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex; PFNGLDEPTHRANGEINDEXEDPROC glad_glDepthRangeIndexed; PFNGLISQUERYPROC glad_glIsQuery; PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines; PFNGLGETTEXTURELEVELPARAMETERFVPROC glad_glGetTextureLevelParameterfv; PFNGLUNIFORMMATRIX4X3DVPROC glad_glUniformMatrix4x3dv; PFNGLBLITNAMEDFRAMEBUFFERPROC glad_glBlitNamedFramebuffer; PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui; PFNGLINDEXSPROC glad_glIndexs; PFNGLCOLORP3UIPROC glad_glColorP3ui; PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui; PFNGLCREATESHADERPROC glad_glCreateShader; PFNGLCLEARNAMEDFRAMEBUFFERFIPROC glad_glClearNamedFramebufferfi; PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC glad_glGetCompressedTextureImage; PFNGLCOLOR4SVPROC glad_glColor4sv; PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert; PFNGLRECTFPROC glad_glRectf; PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog; PFNGLWINDOWPOS3SPROC glad_glWindowPos3s; PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer; PFNGLCOPYIMAGESUBDATAPROC glad_glCopyImageSubData; PFNGLCOLORPOINTERPROC glad_glColorPointer; PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv; PFNGLGETMATERIALFVPROC glad_glGetMaterialfv; PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv; PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers; PFNGLGETMATERIALIVPROC glad_glGetMaterialiv; PFNGLBLENDFUNCPROC glad_glBlendFunc; PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC glad_glNamedFramebufferRenderbuffer; PFNGLNAMEDBUFFERDATAPROC glad_glNamedBufferData; PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements; PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i; PFNGLGETPROGRAMSTAGEIVPROC glad_glGetProgramStageiv; PFNGLVERTEXATTRIBLFORMATPROC glad_glVertexAttribLFormat; PFNGLVERTEX2SVPROC glad_glVertex2sv; PFNGLRECTSVPROC glad_glRectsv; PFNGLTEXTURESTORAGE2DPROC glad_glTextureStorage2D; PFNGLUNIFORM3FPROC glad_glUniform3f; PFNGLDRAWBUFFERPROC glad_glDrawBuffer; PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D; PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv; PFNGLUNIFORM4FPROC glad_glUniform4f; PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d; PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f; PFNGLSECONDARYCOLOR3UBVPROC glad_glSecondaryColor3ubv; PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers; PFNGLCLEARCOLORPROC glad_glClearColor; PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer; PFNGLGETTEXGENFVPROC glad_glGetTexGenfv; PFNGLCOLOR4DVPROC glad_glColor4dv; PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv; PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram; PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender; PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample; PFNGLVIEWPORTINDEXEDFVPROC glad_glViewportIndexedfv; PFNGLMAPGRID1FPROC glad_glMapGrid1f; PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d; PFNGLWINDOWPOS2DVPROC glad_glWindowPos2dv; PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv; PFNGLTEXGENFVPROC glad_glTexGenfv; PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv; PFNGLROTATEDPROC glad_glRotated; PFNGLCREATEQUERIESPROC glad_glCreateQueries; PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv; PFNGLTEXIMAGE1DPROC glad_glTexImage1D; PFNGLWINDOWPOS3IPROC glad_glWindowPos3i; PFNGLCLAMPCOLORPROC glad_glClampColor; PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv; PFNGLVERTEX4FPROC glad_glVertex4f; PFNGLNORMAL3FPROC glad_glNormal3f; PFNGLCOLOR3UBPROC glad_glColor3ub; PFNGLSCISSORINDEXEDPROC glad_glScissorIndexed; PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib; PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d; PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages; PFNGLTEXCOORD3SPROC glad_glTexCoord3s; PFNGLLIGHTFPROC glad_glLightf; PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv; PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv; PFNGLVERTEXATTRIBL2DPROC glad_glVertexAttribL2d; PFNGLFOGCOORDDPROC glad_glFogCoordd; PFNGLGETNPIXELMAPUIVPROC glad_glGetnPixelMapuiv; PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample; PFNGLGETQUERYBUFFEROBJECTIVPROC glad_glGetQueryBufferObjectiv; PFNGLGETSTRINGIPROC glad_glGetStringi; PFNGLRASTERPOS4SPROC glad_glRasterPos4s; PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui; PFNGLGETQUERYIVPROC glad_glGetQueryiv; PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray; PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv; PFNGLTEXPARAMETERFPROC glad_glTexParameterf; PFNGLWINDOWPOS3DPROC glad_glWindowPos3d; PFNGLGENERATETEXTUREMIPMAPPROC glad_glGenerateTextureMipmap; PFNGLDELETESYNCPROC glad_glDeleteSync; PFNGLBINDBUFFERPROC glad_glBindBuffer; PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup; PFNGLRASTERPOS2IPROC glad_glRasterPos2i; PFNGLBINDIMAGETEXTUREPROC glad_glBindImageTexture; PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer; PFNGLEVALMESH2PROC glad_glEvalMesh2; PFNGLLINKPROGRAMPROC glad_glLinkProgram; PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D; PFNGLPUSHMATRIXPROC glad_glPushMatrix; PFNGLFRAMEBUFFERPARAMETERIPROC glad_glFramebufferParameteri; PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName; PFNGLUNIFORM3DPROC glad_glUniform3d; PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv; PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D; PFNGLGETTRANSFORMFEEDBACKI64_VPROC glad_glGetTransformFeedbacki64_v; PFNGLCOMPILESHADERPROC glad_glCompileShader; PFNGLGETLIGHTFVPROC glad_glGetLightfv; PFNGLPIXELMAPUSVPROC glad_glPixelMapusv; PFNGLRASTERPOS4IPROC glad_glRasterPos4i; PFNGLUNIFORMMATRIX4X2DVPROC glad_glUniformMatrix4x2dv; PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D; PFNGLINITNAMESPROC glad_glInitNames; PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui; PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv; PFNGLMAP1FPROC glad_glMap1f; PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv; PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv; PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv; PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample; PFNGLGETVERTEXARRAYINDEXEDIVPROC glad_glGetVertexArrayIndexediv; PFNGLVERTEXARRAYELEMENTBUFFERPROC glad_glVertexArrayElementBuffer; PFNGLGETTEXGENDVPROC glad_glGetTexGendv; PFNGLCLEARNAMEDFRAMEBUFFERFVPROC glad_glClearNamedFramebufferfv; PFNGLSECONDARYCOLOR3FPROC glad_glSecondaryColor3f; PFNGLSHADERBINARYPROC glad_glShaderBinary; PFNGLMAP1DPROC glad_glMap1d; PFNGLVERTEXATTRIBL2DVPROC glad_glVertexAttribL2dv; PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d; PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv; PFNGLTEXSTORAGE2DMULTISAMPLEPROC glad_glTexStorage2DMultisample; PFNGLGENTRANSFORMFEEDBACKSPROC glad_glGenTransformFeedbacks; PFNGLCLEARBUFFERSUBDATAPROC glad_glClearBufferSubData; PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv; PFNGLGETFRAMEBUFFERPARAMETERIVPROC glad_glGetFramebufferParameteriv; PFNGLPIXELMAPFVPROC glad_glPixelMapfv; PFNGLCOLOR3FPROC glad_glColor3f; PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv; PFNGLMULTMATRIXDPROC glad_glMultMatrixd; PFNGLCOPYPIXELSPROC glad_glCopyPixels; PFNGLUNIFORM2DVPROC glad_glUniform2dv; PFNGLCOLOR3SVPROC glad_glColor3sv; PFNGLOBJECTLABELPROC glad_glObjectLabel; PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel; PFNGLINDEXFVPROC glad_glIndexfv; PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC glad_glCompressedTextureSubImage3D; PFNGLMAPGRID1DPROC glad_glMapGrid1d; PFNGLGETQUERYBUFFEROBJECTUIVPROC glad_glGetQueryBufferObjectuiv; PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv; PFNGLSELECTBUFFERPROC glad_glSelectBuffer; PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv; PFNGLPATCHPARAMETERIPROC glad_glPatchParameteri; PFNGLGETTEXTUREPARAMETERIUIVPROC glad_glGetTextureParameterIuiv; PFNGLCOLOR3IVPROC glad_glColor3iv; PFNGLMAPBUFFERPROC glad_glMapBuffer; PFNGLNORMALP3UIPROC glad_glNormalP3ui; PFNGLVERTEXPOINTERPROC glad_glVertexPointer; PFNGLGETTEXTUREPARAMETERFVPROC glad_glGetTextureParameterfv; PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer; PFNGLDEPTHRANGEFPROC glad_glDepthRangef; PFNGLTEXTUREPARAMETERIVPROC glad_glTextureParameteriv; PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv; PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv; PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv; PFNGLBINDVERTEXBUFFERSPROC glad_glBindVertexBuffers; PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv; PFNGLINDEXIPROC glad_glIndexi; PFNGLGETACTIVESUBROUTINENAMEPROC glad_glGetActiveSubroutineName; PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D; PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv; PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv; PFNGLGETTEXGENIVPROC glad_glGetTexGeniv; PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s; PFNGLPOINTSIZEPROC glad_glPointSize; PFNGLVERTEXP2UIPROC glad_glVertexP2ui; PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC glad_glMultiDrawArraysIndirectCount; PFNGLGETNTEXIMAGEPROC glad_glGetnTexImage; PFNGLCULLFACEPROC glad_glCullFace; PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri; PFNGLTEXTUREBARRIERPROC glad_glTextureBarrier; PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer; PFNGLBEGINQUERYPROC glad_glBeginQuery; PFNGLCOLOR4USPROC glad_glColor4us; PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv; PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv; PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv; PFNGLDELETETEXTURESPROC glad_glDeleteTextures; PFNGLWINDOWPOS2IVPROC glad_glWindowPos2iv; PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer; PFNGLCREATEVERTEXARRAYSPROC glad_glCreateVertexArrays; PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i; PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui; PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC glad_glCompressedTextureSubImage2D; PFNGLRECTDPROC glad_glRectd; PFNGLMULTTRANSPOSEMATRIXDPROC glad_glMultTransposeMatrixd; PFNGLTEXENVFPROC glad_glTexEnvf; PFNGLNORMAL3IPROC glad_glNormal3i; PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation; PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate; PFNGLGETINTEGERVPROC glad_glGetIntegerv; PFNGLUSEPROGRAMPROC glad_glUseProgram; PFNGLNORMAL3BVPROC glad_glNormal3bv; PFNGLPIXELSTOREIPROC glad_glPixelStorei; PFNGLNORMAL3SPROC glad_glNormal3s; PFNGLCOLOR4IVPROC glad_glColor4iv; PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv; PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident; PFNGLGETUNIFORMFVPROC glad_glGetUniformfv; PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC glad_glGetActiveSubroutineUniformName; PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv; PFNGLTEXSTORAGE3DPROC glad_glTexStorage3D; PFNGLTEXCOORD1IPROC glad_glTexCoord1i; PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC glad_glGetCompressedTextureSubImage; PFNGLVERTEXARRAYVERTEXBUFFERSPROC glad_glVertexArrayVertexBuffers; PFNGLSECONDARYCOLOR3DPROC glad_glSecondaryColor3d; PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays; PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer; PFNGLISENABLEDIPROC glad_glIsEnabledi; PFNGLBINDSAMPLERSPROC glad_glBindSamplers; PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D; PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures; PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv; PFNGLRASTERPOS4DPROC glad_glRasterPos4d; PFNGLSECONDARYCOLOR3USVPROC glad_glSecondaryColor3usv; PFNGLGETSYNCIVPROC glad_glGetSynciv; PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv; PFNGLLIGHTMODELFVPROC glad_glLightModelfv; PFNGLTEXTURESTORAGE3DPROC glad_glTextureStorage3D; PFNGLRESUMETRANSFORMFEEDBACKPROC glad_glResumeTransformFeedback; PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines; PFNGLVERTEX4FVPROC glad_glVertex4fv; PFNGLLIGHTIVPROC glad_glLightiv; PFNGLCLEARNAMEDFRAMEBUFFERIVPROC glad_glClearNamedFramebufferiv; PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv; PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv; PFNGLFOGCOORDPOINTERPROC glad_glFogCoordPointer; PFNGLUNIFORM2IPROC glad_glUniform2i; PFNGLTEXTURESUBIMAGE3DPROC glad_glTextureSubImage3D; PFNGLGETDOUBLEI_VPROC glad_glGetDoublei_v; PFNGLCLEARBUFFERDATAPROC glad_glClearBufferData; PFNGLBINDTEXTUREPROC glad_glBindTexture; PFNGLTEXTUREBUFFERRANGEPROC glad_glTextureBufferRange; PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv; PFNGLSAMPLEMASKIPROC glad_glSampleMaski; PFNGLCLEARACCUMPROC glad_glClearAccum; PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform; PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary; PFNGLDETACHSHADERPROC glad_glDetachShader; PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s; PFNGLTEXTUREPARAMETERIPROC glad_glTextureParameteri; PFNGLCOLOR3DVPROC glad_glColor3dv; PFNGLBINDSAMPLERPROC glad_glBindSampler; PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC glad_glCheckNamedFramebufferStatus; PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv; PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays; PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv; PFNGLGETFLOATVPROC glad_glGetFloatv; PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri; PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers; PFNGLSECONDARYCOLORPOINTERPROC glad_glSecondaryColorPointer; PFNGLISSAMPLERPROC glad_glIsSampler; PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv; PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv; PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl; PFNGLBINDBUFFERSRANGEPROC glad_glBindBuffersRange; PFNGLMULTIDRAWARRAYSINDIRECTPROC glad_glMultiDrawArraysIndirect; PFNGLGETMAPDVPROC glad_glGetMapdv; PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui; PFNGLVERTEXATTRIBIFORMATPROC glad_glVertexAttribIFormat; PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC glad_glDrawTransformFeedbackStreamInstanced; PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC glad_glTransformFeedbackBufferBase; PFNGLGETTEXENVIVPROC glad_glGetTexEnviv; PFNGLCOLORP3UIVPROC glad_glColorP3uiv; PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f; PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib; PFNGLGETTEXIMAGEPROC glad_glGetTexImage; PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage; PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers; PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync; PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv; PFNGLCLEARTEXIMAGEPROC glad_glClearTexImage; PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv; PFNGLUNIFORM3UIVPROC glad_glUniform3uiv; PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName; PFNGLEVALPOINT1PROC glad_glEvalPoint1; PFNGLCOLOR3USPROC glad_glColor3us; PFNGLGETTEXTURESUBIMAGEPROC glad_glGetTextureSubImage; PFNGLCOLOR3IPROC glad_glColor3i; PFNGLSECONDARYCOLOR3DVPROC glad_glSecondaryColor3dv; PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv; PFNGLVIEWPORTARRAYVPROC glad_glViewportArrayv; PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i; PFNGLVERTEXATTRIBL4DPROC glad_glVertexAttribL4d; PFNGLCOLOR4DPROC glad_glColor4d; PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation; PFNGLCOLOR4UBVPROC glad_glColor4ubv; PFNGLUNIFORMMATRIX4DVPROC glad_glUniformMatrix4dv; PFNGLUNIFORMMATRIX3X4DVPROC glad_glUniformMatrix3x4dv; PFNGLSCISSORPROC glad_glScissor; PFNGLUNIFORMSUBROUTINESUIVPROC glad_glUniformSubroutinesuiv; PFNGLVERTEX4IVPROC glad_glVertex4iv; PFNGLCOLORMASKPROC glad_glColorMask; PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate; PFNGLGETBOOLEANVPROC glad_glGetBooleanv; PFNGLVERTEX3DPROC glad_glVertex3d; PFNGLGETNAMEDBUFFERPOINTERVPROC glad_glGetNamedBufferPointerv; PFNGLVERTEXARRAYVERTEXBUFFERPROC glad_glVertexArrayVertexBuffer; PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple; PFNGLSTENCILOPPROC glad_glStencilOp; PFNGLVIEWPORTPROC glad_glViewport; PFNGLGETNPOLYGONSTIPPLEPROC glad_glGetnPolygonStipple; PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv; PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback; PFNGLCREATEPROGRAMPROC glad_glCreateProgram; PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog; PFNGLGETVERTEXARRAYINDEXED64IVPROC glad_glGetVertexArrayIndexed64iv; PFNGLTEXGENDPROC glad_glTexGend; PFNGLINDEXUBPROC glad_glIndexub; PFNGLMULTMATRIXFPROC glad_glMultMatrixf; PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui; PFNGLTEXIMAGE3DPROC glad_glTexImage3D; PFNGLGETNUNIFORMDVPROC glad_glGetnUniformdv; PFNGLRECTIVPROC glad_glRectiv; PFNGLTEXCOORD4SPROC glad_glTexCoord4s; PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D; PFNGLLOGICOPPROC glad_glLogicOp; PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv; PFNGLSECONDARYCOLOR3FVPROC glad_glSecondaryColor3fv; PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer; PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv; PFNGLCREATESAMPLERSPROC glad_glCreateSamplers; PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv; PFNGLBLENDCOLORPROC glad_glBlendColor; PFNGLLIGHTMODELIPROC glad_glLightModeli; PFNGLPOINTPARAMETERIPROC glad_glPointParameteri; PFNGLGENQUERIESPROC glad_glGenQueries; PFNGLNAMEDFRAMEBUFFERTEXTUREPROC glad_glNamedFramebufferTexture; PFNGLGETNSEPARABLEFILTERPROC glad_glGetnSeparableFilter; PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv; PFNGLCOLOR4FVPROC glad_glColor4fv; PFNGLGETVERTEXARRAYIVPROC glad_glGetVertexArrayiv; PFNGLUNIFORM1UIPROC glad_glUniform1ui; PFNGLGETNMAPFVPROC glad_glGetnMapfv; PFNGLUNIFORM4FVPROC glad_glUniform4fv; PFNGLTEXGENFPROC glad_glTexGenf; PFNGLINDEXIVPROC glad_glIndexiv; PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv; PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i; PFNGLCOLOR4USVPROC glad_glColor4usv; PFNGLDRAWBUFFERSPROC glad_glDrawBuffers; PFNGLWINDOWPOS2IPROC glad_glWindowPos2i; PFNGLTEXBUFFERRANGEPROC glad_glTexBufferRange; PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv; PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv; PFNGLMULTIDRAWELEMENTSINDIRECTPROC glad_glMultiDrawElementsIndirect; PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv; PFNGLUNIFORM3IPROC glad_glUniform3i; PFNGLGETCLIPPLANEPROC glad_glGetClipPlane; PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv; PFNGLTEXCOORD2IPROC glad_glTexCoord2i; PFNGLUNIFORM4UIPROC glad_glUniform4ui; PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC glad_glDrawElementsInstancedBaseVertexBaseInstance; PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv; PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d; PFNGLGETLIGHTIVPROC glad_glGetLightiv; PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv; PFNGLTEXTURESTORAGE1DPROC glad_glTextureStorage1D; PFNGLSTENCILMASKPROC glad_glStencilMask; PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv; PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f; PFNGLINDEXDPROC glad_glIndexd; PFNGLNORMALP3UIVPROC glad_glNormalP3uiv; PFNGLEVALMESH1PROC glad_glEvalMesh1; PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv; PFNGLVERTEXATTRIBL4DVPROC glad_glVertexAttribL4dv; PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture; PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s; PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv; PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv; PFNGLRASTERPOS3DPROC glad_glRasterPos3d; PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv; PFNGLBINDTEXTUREUNITPROC glad_glBindTextureUnit; PFNGLWAITSYNCPROC glad_glWaitSync; PFNGLMATERIALFVPROC glad_glMaterialfv; PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i; PFNGLRASTERPOS2SPROC glad_glRasterPos2s; PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv; PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv; PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate; PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv; PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv; PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv; PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex; PFNGLDEPTHFUNCPROC glad_glDepthFunc; PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f; PFNGLSHADERSOURCEPROC glad_glShaderSource; PFNGLVERTEX2IVPROC glad_glVertex2iv; PFNGLMAPNAMEDBUFFERPROC glad_glMapNamedBuffer; PFNGLCLEARDEPTHFPROC glad_glClearDepthf; PFNGLUNIFORM1FPROC glad_glUniform1f; PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d; PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v; PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC glad_glNamedFramebufferDrawBuffers; PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D; PFNGLDELETETRANSFORMFEEDBACKSPROC glad_glDeleteTransformFeedbacks; PFNGLVERTEX3IVPROC glad_glVertex3iv; PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv; PFNGLISTEXTUREPROC glad_glIsTexture; PFNGLMULTTRANSPOSEMATRIXFPROC glad_glMultTransposeMatrixf; PFNGLNEWLISTPROC glad_glNewList; PFNGLSCALEFPROC glad_glScalef; PFNGLVERTEX3FPROC glad_glVertex3f; PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv; PFNGLFOGCOORDFVPROC glad_glFogCoordfv; PFNGLMAPGRID2DPROC glad_glMapGrid2d; PFNGLWINDOWPOS2FVPROC glad_glWindowPos2fv; PFNGLREADPIXELSPROC glad_glReadPixels; PFNGLINVALIDATETEXSUBIMAGEPROC glad_glInvalidateTexSubImage; PFNGLORTHOPROC glad_glOrtho; PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv; PFNGLWINDOWPOS2SVPROC glad_glWindowPos2sv; PFNGLFOGFPROC glad_glFogf; PFNGLCOLOR3SPROC glad_glColor3s; PFNGLUNIFORM2UIVPROC glad_glUniform2uiv; PFNGLPIXELZOOMPROC glad_glPixelZoom; PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f; PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv; PFNGLVERTEX3DVPROC glad_glVertex3dv; PFNGLUNIFORM3FVPROC glad_glUniform3fv; PFNGLENABLEPROC glad_glEnable; PFNGLTEXTUREPARAMETERIUIVPROC glad_glTextureParameterIuiv; PFNGLFOGCOORDDVPROC glad_glFogCoorddv; PFNGLBUFFERDATAPROC glad_glBufferData; PFNGLPOPATTRIBPROC glad_glPopAttrib; PFNGLNORMAL3DVPROC glad_glNormal3dv; PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex; PFNGLPASSTHROUGHPROC glad_glPassThrough; PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv; PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv; PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv; PFNGLUNIFORM3DVPROC glad_glUniform3dv; PFNGLBLENDEQUATIONIPROC glad_glBlendEquationi; PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui; PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv; PFNGLVERTEX4IPROC glad_glVertex4i; PFNGLUNIFORM4UIVPROC glad_glUniform4uiv; PFNGLTEXENVFVPROC glad_glTexEnvfv; PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv; PFNGLCLEARTEXSUBIMAGEPROC glad_glClearTexSubImage; PFNGLTRANSLATEDPROC glad_glTranslated; PFNGLPOINTPARAMETERFPROC glad_glPointParameterf; PFNGLSCISSORINDEXEDVPROC glad_glScissorIndexedv; PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv; PFNGLREADBUFFERPROC glad_glReadBuffer; PFNGLENDPROC glad_glEnd; PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced; PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv; PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv; PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC glad_glCompressedTextureSubImage1D; PFNGLVERTEX2DVPROC glad_glVertex2dv; PFNGLPUSHNAMEPROC glad_glPushName; PFNGLINVALIDATEBUFFERDATAPROC glad_glInvalidateBufferData; PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv; PFNGLGENTEXTURESPROC glad_glGenTextures; PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv; PFNGLDISPATCHCOMPUTEPROC glad_glDispatchCompute; PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv; PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv; PFNGLGETPROGRAMRESOURCENAMEPROC glad_glGetProgramResourceName; PFNGLVERTEX2FVPROC glad_glVertex2fv; PFNGLCOLOR4UBPROC glad_glColor4ub; PFNGLUNIFORM3IVPROC glad_glUniform3iv; PFNGLCLIPPLANEPROC glad_glClipPlane; PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv; PFNGLUNIFORM4IPROC glad_glUniform4i; PFNGLWINDOWPOS3IVPROC glad_glWindowPos3iv; PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv; PFNGLUNIFORM2DPROC glad_glUniform2d; PFNGLPOPMATRIXPROC glad_glPopMatrix; PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline; PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv; PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv; PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv; PFNGLCOPYTEXTURESUBIMAGE2DPROC glad_glCopyTextureSubImage2D; PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders; PFNGLGETTRANSFORMFEEDBACKI_VPROC glad_glGetTransformFeedbacki_v; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv; PFNGLVERTEXARRAYATTRIBIFORMATPROC glad_glVertexArrayAttribIFormat; PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel; PFNGLGETNPIXELMAPUSVPROC glad_glGetnPixelMapusv; PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f; PFNGLCLEARSTENCILPROC glad_glClearStencil; PFNGLDISABLEPROC glad_glDisable; PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f; PFNGLGETSUBROUTINEINDEXPROC glad_glGetSubroutineIndex; PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d; PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv; PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv; PFNGLUNIFORM4IVPROC glad_glUniform4iv; PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor; PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation; PFNGLGETNCOMPRESSEDTEXIMAGEPROC glad_glGetnCompressedTexImage; PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv; PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv; PFNGLEVALCOORD2DPROC glad_glEvalCoord2d; PFNGLGETPOINTERVPROC glad_glGetPointerv; PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d; PFNGLTEXCOORD2FPROC glad_glTexCoord2f; PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData; PFNGLUNIFORMMATRIX3DVPROC glad_glUniformMatrix3dv; PFNGLSECONDARYCOLOR3IVPROC glad_glSecondaryColor3iv; PFNGLFINISHPROC glad_glFinish; PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline; PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv; PFNGLGETNMAPDVPROC glad_glGetnMapdv; PFNGLBINDTEXTURESPROC glad_glBindTextures; PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui; PFNGLCOLORMASKIPROC glad_glColorMaski; PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v; PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s; PFNGLWINDOWPOS2DPROC glad_glWindowPos2d; PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glad_glDrawArraysInstancedBaseInstance; PFNGLDRAWTRANSFORMFEEDBACKPROC glad_glDrawTransformFeedback; PFNGLWINDOWPOS2FPROC glad_glWindowPos2f; PFNGLVERTEXATTRIBLPOINTERPROC glad_glVertexAttribLPointer; PFNGLTEXCOORD4FPROC glad_glTexCoord4f; PFNGLLIGHTMODELIVPROC glad_glLightModeliv; PFNGLUNIFORM2UIPROC glad_glUniform2ui; PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays; PFNGLTEXBUFFERPROC glad_glTexBuffer; PFNGLUNIFORM2FPROC glad_glUniform2f; PFNGLTEXCOORD1DPROC glad_glTexCoord1d; PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D; PFNGLGETGRAPHICSRESETSTATUSPROC glad_glGetGraphicsResetStatus; PFNGLTEXCOORD1SPROC glad_glTexCoord1s; PFNGLINDEXSVPROC glad_glIndexsv; PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv; PFNGLSECONDARYCOLOR3IPROC glad_glSecondaryColor3i; PFNGLCALLLISTPROC glad_glCallList; PFNGLINDEXUBVPROC glad_glIndexubv; PFNGLPOLYGONMODEPROC glad_glPolygonMode; PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture; PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv; PFNGLISTRANSFORMFEEDBACKPROC glad_glIsTransformFeedback; PFNGLNAMEDBUFFERSUBDATAPROC glad_glNamedBufferSubData; PFNGLGETPROGRAMINTERFACEIVPROC glad_glGetProgramInterfaceiv; PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState; PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC glad_glClearNamedFramebufferuiv; PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv; PFNGLVERTEXARRAYATTRIBLFORMATPROC glad_glVertexArrayAttribLFormat; PFNGLVERTEX4DPROC glad_glVertex4d; PFNGLNORMAL3SVPROC glad_glNormal3sv; PFNGLRASTERPOS4FPROC glad_glRasterPos4f; PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui; PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers; PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings; PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv; PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC glad_glNamedFramebufferReadBuffer; PFNGLUNIFORMMATRIX2X3DVPROC glad_glUniformMatrix2x3dv; PFNGLVERTEXATTRIBL3DVPROC glad_glVertexAttribL3dv; PFNGLUNIFORM1UIVPROC glad_glUniform1uiv; PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv; PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v; PFNGLTEXTURESUBIMAGE2DPROC glad_glTextureSubImage2D; PFNGLNAMEDRENDERBUFFERSTORAGEPROC glad_glNamedRenderbufferStorage; PFNGLGETMAPIVPROC glad_glGetMapiv; PFNGLMATRIXMODEPROC glad_glMatrixMode; PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv; PFNGLVERTEXATTRIBL1DVPROC glad_glVertexAttribL1dv; PFNGLGETNAMEDBUFFERSUBDATAPROC glad_glGetNamedBufferSubData; PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays; PFNGLGETTEXTUREPARAMETERIVPROC glad_glGetTextureParameteriv; PFNGLVERTEX3FVPROC glad_glVertex3fv; PFNGLMATERIALIVPROC glad_glMaterialiv; PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi; PFNGLGETNHISTOGRAMPROC glad_glGetnHistogram; PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv; PFNGLENABLEVERTEXARRAYATTRIBPROC glad_glEnableVertexArrayAttrib; PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender; PFNGLDELETELISTSPROC glad_glDeleteLists; PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv; PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback; PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f; PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage; PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus; PFNGLGETINTERNALFORMATI64VPROC glad_glGetInternalformati64v; PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap; PFNGLDELETEQUERIESPROC glad_glDeleteQueries; PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC glad_glNamedFramebufferParameteri; PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex; PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d; PFNGLALPHAFUNCPROC glad_glAlphaFunc; PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC glad_glTransformFeedbackBufferRange; PFNGLLINESTIPPLEPROC glad_glLineStipple; PFNGLTEXGENIPROC glad_glTexGeni; PFNGLTEXSTORAGE3DMULTISAMPLEPROC glad_glTexStorage3DMultisample; PFNGLISVERTEXARRAYPROC glad_glIsVertexArray; PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC glad_glGetNamedRenderbufferParameteriv; PFNGLINVALIDATEFRAMEBUFFERPROC glad_glInvalidateFramebuffer; PFNGLPROGRAMBINARYPROC glad_glProgramBinary; PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv; PFNGLVERTEX3IPROC glad_glVertex3i; PFNGLSECONDARYCOLOR3BPROC glad_glSecondaryColor3b; PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv; PFNGLDISABLEIPROC glad_glDisablei; PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv; PFNGLINVALIDATETEXIMAGEPROC glad_glInvalidateTexImage; PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i; PFNGLINDEXFPROC glad_glIndexf; PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex; PFNGLGETNCONVOLUTIONFILTERPROC glad_glGetnConvolutionFilter; PFNGLGETERRORPROC glad_glGetError; PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv; PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange; PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui; PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage; PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv; PFNGLISPROGRAMPROC glad_glIsProgram; PFNGLISLISTPROC glad_glIsList; PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv; PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f; PFNGLTEXPARAMETERIPROC glad_glTexParameteri; PFNGLPUSHATTRIBPROC glad_glPushAttrib; PFNGLFRONTFACEPROC glad_glFrontFace; PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC glad_glDrawElementsInstancedBaseInstance; PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s; PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i; PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D; PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D; PFNGLGENSAMPLERSPROC glad_glGenSamplers; PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf; PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv; PFNGLPAUSETRANSFORMFEEDBACKPROC glad_glPauseTransformFeedback; PFNGLPOPNAMEPROC glad_glPopName; PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv; PFNGLEVALCOORD1FPROC glad_glEvalCoord1f; PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers; PFNGLLIGHTIPROC glad_glLighti; PFNGLTEXTUREVIEWPROC glad_glTextureView; PFNGLLOADTRANSPOSEMATRIXDPROC glad_glLoadTransposeMatrixd; PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetNamedFramebufferAttachmentParameteriv; PFNGLUNIFORM4DPROC glad_glUniform4d; PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui; PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer; PFNGLSTENCILFUNCPROC glad_glStencilFunc; PFNGLUNIFORM1IPROC glad_glUniform1i; PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv; PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC glad_glInvalidateNamedFramebufferData; PFNGLPATCHPARAMETERFVPROC glad_glPatchParameterfv; PFNGLFOGFVPROC glad_glFogfv; PFNGLVERTEXP3UIPROC glad_glVertexP3ui; PFNGLREADNPIXELSPROC glad_glReadnPixels; PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i; PFNGLVERTEXATTRIBBINDINGPROC glad_glVertexAttribBinding; PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv; PFNGLVERTEX4SPROC glad_glVertex4s; PFNGLVERTEXBINDINGDIVISORPROC glad_glVertexBindingDivisor; PFNGLTEXTUREPARAMETERFVPROC glad_glTextureParameterfv; PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv; PFNGLNORMAL3BPROC glad_glNormal3b; PFNGLGETUNIFORMSUBROUTINEUIVPROC glad_glGetUniformSubroutineuiv; PFNGLVERTEX3SVPROC glad_glVertex3sv; PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv; PFNGLGETNAMEDBUFFERPARAMETERI64VPROC glad_glGetNamedBufferParameteri64v; PFNGLDRAWPIXELSPROC glad_glDrawPixels; PFNGLCALLLISTSPROC glad_glCallLists; PFNGLTEXCOORD3IPROC glad_glTexCoord3i; PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui; PFNGLQUERYCOUNTERPROC glad_glQueryCounter; PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv; PFNGLUNIFORM1IVPROC glad_glUniform1iv; PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate; PFNGLGETNAMEDBUFFERPARAMETERIVPROC glad_glGetNamedBufferParameteriv; PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv; PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib; PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray; PFNGLMATERIALIPROC glad_glMateriali; PFNGLUNIFORM2FVPROC glad_glUniform2fv; PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv; PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC glad_glGetProgramResourceLocationIndex; PFNGLGETDOUBLEVPROC glad_glGetDoublev; PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex; PFNGLUNIFORMMATRIX2X4DVPROC glad_glUniformMatrix2x4dv; PFNGLCOLOR4BVPROC glad_glColor4bv; PFNGLGETINTERNALFORMATIVPROC glad_glGetInternalformativ; PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC glad_glGetActiveSubroutineUniformiv; PFNGLGETQUERYINDEXEDIVPROC glad_glGetQueryIndexediv; PFNGLBINDVERTEXBUFFERPROC glad_glBindVertexBuffer; PFNGLTEXCOORD3FPROC glad_glTexCoord3f; PFNGLCOLOR3UIVPROC glad_glColor3uiv; PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv; PFNGLCLEARPROC glad_glClear; PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv; PFNGLTEXCOORD2SPROC glad_glTexCoord2s; PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui; PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer; PFNGLTEXENVIPROC glad_glTexEnvi; PFNGLTEXTUREPARAMETERFPROC glad_glTextureParameterf; PFNGLMATERIALFPROC glad_glMaterialf; PFNGLGETUNIFORMDVPROC glad_glGetUniformdv; PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv; PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv; PFNGLCLEARINDEXPROC glad_glClearIndex; PFNGLDISPATCHCOMPUTEINDIRECTPROC glad_glDispatchComputeIndirect; PFNGLROTATEFPROC glad_glRotatef; PFNGLTEXTURESUBIMAGE1DPROC glad_glTextureSubImage1D; PFNGLPOLYGONOFFSETCLAMPPROC glad_glPolygonOffsetClamp; PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv; PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv; PFNGLSECONDARYCOLOR3SPROC glad_glSecondaryColor3s; PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv; PFNGLGETVERTEXATTRIBLDVPROC glad_glGetVertexAttribLdv; PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv; PFNGLSHADEMODELPROC glad_glShadeModel; PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv; PFNGLNORMAL3FVPROC glad_glNormal3fv; PFNGLISBUFFERPROC glad_glIsBuffer; PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f; PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer; PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed; PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase; PFNGLGENBUFFERSPROC glad_glGenBuffers; PFNGLTEXCOORD1FPROC glad_glTexCoord1f; PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData; PFNGLCREATETRANSFORMFEEDBACKSPROC glad_glCreateTransformFeedbacks; PFNGLMAP2FPROC glad_glMap2f; PFNGLCREATEBUFFERSPROC glad_glCreateBuffers; PFNGLCOLOR3USVPROC glad_glColor3usv; PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv; PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation; PFNGLVERTEX2DPROC glad_glVertex2d; PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC glad_glGetSubroutineUniformLocation; PFNGLINVALIDATEBUFFERSUBDATAPROC glad_glInvalidateBufferSubData; PFNGLUNIFORMMATRIX2DVPROC glad_glUniformMatrix2dv; PFNGLCLEARNAMEDBUFFERSUBDATAPROC glad_glClearNamedBufferSubData; PFNGLGETPROGRAMIVPROC glad_glGetProgramiv; PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements; PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv; PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v; PFNGLVERTEXATTRIBL1DPROC glad_glVertexAttribL1d; PFNGLGETTEXTUREIMAGEPROC glad_glGetTextureImage; PFNGLGETNUNIFORMIVPROC glad_glGetnUniformiv; PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i; PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC glad_glDrawTransformFeedbackInstanced; PFNGLGETPROGRAMRESOURCEINDEXPROC glad_glGetProgramResourceIndex; PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d; PFNGLUNMAPNAMEDBUFFERPROC glad_glUnmapNamedBuffer; PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f; PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv; PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv; PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange; PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv; PFNGLCOLORMATERIALPROC glad_glColorMaterial; PFNGLBLENDEQUATIONPROC glad_glBlendEquation; PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer; PFNGLCOLOR3DPROC glad_glColor3d; PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv; PFNGLLIGHTFVPROC glad_glLightfv; PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv; PFNGLDEPTHMASKPROC glad_glDepthMask; PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying; PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui; PFNGLVERTEXATTRIBL3DPROC glad_glVertexAttribL3d; PFNGLDRAWELEMENTSINDIRECTPROC glad_glDrawElementsIndirect; PFNGLLOADTRANSPOSEMATRIXFPROC glad_glLoadTransposeMatrixf; PFNGLENDQUERYINDEXEDPROC glad_glEndQueryIndexed; PFNGLSECONDARYCOLOR3USPROC glad_glSecondaryColor3us; PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC glad_glTextureStorage2DMultisample; PFNGLPIXELSTOREFPROC glad_glPixelStoref; PFNGLUNIFORM2IVPROC glad_glUniform2iv; PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv; PFNGLVERTEX2IPROC glad_glVertex2i; PFNGLFRUSTUMPROC glad_glFrustum; PFNGLMEMORYBARRIERPROC glad_glMemoryBarrier; PFNGLGETSTRINGPROC glad_glGetString; PFNGLLINEWIDTHPROC glad_glLineWidth; PFNGLNORMALPOINTERPROC glad_glNormalPointer; PFNGLGETNUNIFORMUIVPROC glad_glGetnUniformuiv; PFNGLDEPTHRANGEARRAYVPROC glad_glDepthRangeArrayv; PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui; PFNGLATTACHSHADERPROC glad_glAttachShader; PFNGLDRAWARRAYSPROC glad_glDrawArrays; PFNGLCOLOR4SPROC glad_glColor4s; PFNGLTEXGENDVPROC glad_glTexGendv; PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv; PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv; PFNGLENDQUERYPROC glad_glEndQuery; PFNGLWINDOWPOS2SPROC glad_glWindowPos2s; PFNGLDRAWARRAYSINDIRECTPROC glad_glDrawArraysIndirect; PFNGLRASTERPOS3SPROC glad_glRasterPos3s; PFNGLGETNPIXELMAPFVPROC glad_glGetnPixelMapfv; PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv; PFNGLRECTIPROC glad_glRecti; PFNGLUNIFORM4DVPROC glad_glUniform4dv; PFNGLBLENDEQUATIONSEPARATEIPROC glad_glBlendEquationSeparatei; PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv; PFNGLGETPROGRAMRESOURCEIVPROC glad_glGetProgramResourceiv; PFNGLINVALIDATESUBFRAMEBUFFERPROC glad_glInvalidateSubFramebuffer; PFNGLFENCESYNCPROC glad_glFenceSync; PFNGLUNIFORM3UIPROC glad_glUniform3ui; PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv; PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s; PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv; PFNGLLOADMATRIXFPROC glad_glLoadMatrixf; PFNGLTRANSLATEFPROC glad_glTranslatef; PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv; PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv; PFNGLMAPGRID2FPROC glad_glMapGrid2f; PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState; PFNGLGETUNIFORMIVPROC glad_glGetUniformiv; PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv; PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv; PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv; PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv; PFNGLINDEXDVPROC glad_glIndexdv; PFNGLBLENDFUNCIPROC glad_glBlendFunci; PFNGLISENABLEDPROC glad_glIsEnabled; PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv; PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv; PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange; PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s; PFNGLRASTERPOS2FPROC glad_glRasterPos2f; PFNGLMINSAMPLESHADINGPROC glad_glMinSampleShading; PFNGLGETQUERYBUFFEROBJECTUI64VPROC glad_glGetQueryBufferObjectui64v; PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i; PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv; PFNGLVERTEX2FPROC glad_glVertex2f; PFNGLVERTEXARRAYBINDINGDIVISORPROC glad_glVertexArrayBindingDivisor; PFNGLINDEXPOINTERPROC glad_glIndexPointer; PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding; PFNGLRENDERMODEPROC glad_glRenderMode; PFNGLTEXSTORAGE1DPROC glad_glTexStorage1D; PFNGLBUFFERSUBDATAPROC glad_glBufferSubData; PFNGLCOLOR3FVPROC glad_glColor3fv; PFNGLBITMAPPROC glad_glBitmap; PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv; PFNGLVIEWPORTINDEXEDFPROC glad_glViewportIndexedf; PFNGLRASTERPOS2DPROC glad_glRasterPos2d; PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices; PFNGLENABLEIPROC glad_glEnablei; PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D; PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate; PFNGLNAMEDBUFFERSTORAGEPROC glad_glNamedBufferStorage; PFNGLRECTSPROC glad_glRects; PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv; PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple; PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D; PFNGLSECONDARYCOLOR3UBPROC glad_glSecondaryColor3ub; PFNGLWINDOWPOS3FPROC glad_glWindowPos3f; PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv; PFNGLSHADERSTORAGEBLOCKBINDINGPROC glad_glShaderStorageBlockBinding; PFNGLLOADIDENTITYPROC glad_glLoadIdentity; PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex; PFNGLVERTEX2SPROC glad_glVertex2s; PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv; PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s; PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler; PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource; PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv; PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv; PFNGLISSHADERPROC glad_glIsShader; PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv; PFNGLTEXCOORD4IPROC glad_glTexCoord4i; PFNGLCOLOR4UIPROC glad_glColor4ui; PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv; PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv; PFNGLTEXCOORD4DPROC glad_glTexCoord4d; PFNGLSCISSORARRAYVPROC glad_glScissorArrayv; PFNGLCREATERENDERBUFFERSPROC glad_glCreateRenderbuffers; PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv; PFNGLCOLOR4FPROC glad_glColor4f; PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub; PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv; PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D; PFNGLNORMAL3IVPROC glad_glNormal3iv; PFNGLBINDIMAGETEXTURESPROC glad_glBindImageTextures; PFNGLTEXGENIVPROC glad_glTexGeniv; PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D; PFNGLSCALEDPROC glad_glScaled; PFNGLCREATEPROGRAMPIPELINESPROC glad_glCreateProgramPipelines; PFNGLBLENDFUNCSEPARATEIPROC glad_glBlendFuncSeparatei; PFNGLHINTPROC glad_glHint; PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i; PFNGLINDEXMASKPROC glad_glIndexMask; PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f; PFNGLCOLOR3BPROC glad_glColor3b; PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv; PFNGLSPECIALIZESHADERPROC glad_glSpecializeShader; PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC glad_glNamedFramebufferDrawBuffer; PFNGLGETQUERYBUFFEROBJECTI64VPROC glad_glGetQueryBufferObjecti64v; PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv; PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv; PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv; PFNGLBUFFERSTORAGEPROC glad_glBufferStorage; PFNGLVERTEX3SPROC glad_glVertex3s; PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv; PFNGLDEPTHRANGEPROC glad_glDepthRange; PFNGLRASTERPOS3FPROC glad_glRasterPos3f; PFNGLDELETESHADERPROC glad_glDeleteShader; PFNGLCOLOR3BVPROC glad_glColor3bv; PFNGLCOLOR3UBVPROC glad_glColor3ubv; PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv; PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv; PFNGLMAP2DPROC glad_glMap2d; PFNGLFOGCOORDFPROC glad_glFogCoordf; PFNGLEDGEFLAGVPROC glad_glEdgeFlagv; PFNGLCLIPCONTROLPROC glad_glClipControl; PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv; PFNGLGETTRANSFORMFEEDBACKIVPROC glad_glGetTransformFeedbackiv; PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv; PFNGLGETNMINMAXPROC glad_glGetnMinmax; PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glNamedRenderbufferStorageMultisample; PFNGLCOLORP4UIPROC glad_glColorP4ui; PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv; PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv; PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv; PFNGLVERTEXP4UIPROC glad_glVertexP4ui; PFNGLRECTFVPROC glad_glRectfv; PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback; PFNGLARRAYELEMENTPROC glad_glArrayElement; PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC glad_glNamedFramebufferTextureLayer; PFNGLBEGINPROC glad_glBegin; PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer; PFNGLTEXCOORD3DPROC glad_glTexCoord3d; PFNGLUNIFORM1FVPROC glad_glUniform1fv; PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv; PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog; PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset; PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat; PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d; PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv; PFNGLBINDTRANSFORMFEEDBACKPROC glad_glBindTransformFeedback; PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex; PFNGLDISABLEVERTEXARRAYATTRIBPROC glad_glDisableVertexArrayAttrib; PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv; PFNGLUNIFORM1DPROC glad_glUniform1d; PFNGLVERTEXATTRIBFORMATPROC glad_glVertexAttribFormat; PFNGLMEMORYBARRIERBYREGIONPROC glad_glMemoryBarrierByRegion; PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup; PFNGLCOLOR4BPROC glad_glColor4b; PFNGLTEXTUREBUFFERPROC glad_glTextureBuffer; PFNGLGETSHADERIVPROC glad_glGetShaderiv; PFNGLBEGINQUERYINDEXEDPROC glad_glBeginQueryIndexed; PFNGLCOPYNAMEDBUFFERSUBDATAPROC glad_glCopyNamedBufferSubData; PFNGLVERTEXARRAYATTRIBFORMATPROC glad_glVertexArrayAttribFormat; PFNGLMAPNAMEDBUFFERRANGEPROC glad_glMapNamedBufferRange; PFNGLCOLOR4UIVPROC glad_glColor4uiv; PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui; PFNGLWINDOWPOS3SVPROC glad_glWindowPos3sv; PFNGLFOGIVPROC glad_glFogiv; PFNGLTEXTUREPARAMETERIIVPROC glad_glTextureParameterIiv; PFNGLLISTBASEPROC glad_glListBase; PFNGLCREATEFRAMEBUFFERSPROC glad_glCreateFramebuffers; PFNGLEVALCOORD2FPROC glad_glEvalCoord2f; PFNGLVERTEX4DVPROC glad_glVertex4dv; PFNGLDELETEPROGRAMPROC glad_glDeleteProgram; PFNGLDRAWELEMENTSPROC glad_glDrawElements; PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC glad_glDrawTransformFeedbackStream; PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram; PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced; PFNGLGENLISTSPROC glad_glGenLists; PFNGLCOLOR4IPROC glad_glColor4i; PFNGLCOLOR3UIPROC glad_glColor3ui; PFNGLCREATETEXTURESPROC glad_glCreateTextures; PFNGLCOLORP4UIVPROC glad_glColorP4uiv; PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog; PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui; PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi; PFNGLCOPYTEXTURESUBIMAGE3DPROC glad_glCopyTextureSubImage3D; PFNGLEDGEFLAGPROC glad_glEdgeFlag; PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v; PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv; PFNGLGETNMAPIVPROC glad_glGetnMapiv; PFNGLRECTDVPROC glad_glRectdv; PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v; PFNGLENDLISTPROC glad_glEndList; PFNGLFLUSHPROC glad_glFlush; PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui; PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC glad_glMultiDrawElementsIndirectCount; PFNGLGETINTEGER64VPROC glad_glGetInteger64v; PFNGLLIGHTMODELFPROC glad_glLightModelf; PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv; PFNGLGETTEXTURELEVELPARAMETERIVPROC glad_glGetTextureLevelParameteriv; PFNGLLOADMATRIXDPROC glad_glLoadMatrixd; PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline; PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv; PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray; PFNGLCLEARDEPTHPROC glad_glClearDepth; PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv; PFNGLWINDOWPOS3FVPROC glad_glWindowPos3fv; PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d; PFNGLGETPROGRAMRESOURCELOCATIONPROC glad_glGetProgramResourceLocation; PFNGLTEXCOORD2DPROC glad_glTexCoord2d; PFNGLACCUMPROC glad_glAccum; PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui; PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui; PFNGLGETNUNIFORMFVPROC glad_glGetnUniformfv; PFNGLFOGIPROC glad_glFogi; PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv; PFNGLTEXENVIVPROC glad_glTexEnviv; PFNGLTEXIMAGE2DPROC glad_glTexImage2D; PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC glad_glGetActiveAtomicCounterBufferiv; PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv; PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv; PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel; static void load_GL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_1_0) return; glEvalPoint2 = (PFNGLEVALPOINT2PROC) load("glEvalPoint2", userptr); glEvalCoord2d = (PFNGLEVALCOORD2DPROC) load("glEvalCoord2d", userptr); glPixelStoref = (PFNGLPIXELSTOREFPROC) load("glPixelStoref", userptr); glTexCoord2f = (PFNGLTEXCOORD2FPROC) load("glTexCoord2f", userptr); glFinish = (PFNGLFINISHPROC) load("glFinish", userptr); glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC) load("glGetTexLevelParameterfv", userptr); glPixelTransferf = (PFNGLPIXELTRANSFERFPROC) load("glPixelTransferf", userptr); glClearAccum = (PFNGLCLEARACCUMPROC) load("glClearAccum", userptr); glLoadName = (PFNGLLOADNAMEPROC) load("glLoadName", userptr); glRasterPos2sv = (PFNGLRASTERPOS2SVPROC) load("glRasterPos2sv", userptr); glVertex2i = (PFNGLVERTEX2IPROC) load("glVertex2i", userptr); glFrustum = (PFNGLFRUSTUMPROC) load("glFrustum", userptr); glGetString = (PFNGLGETSTRINGPROC) load("glGetString", userptr); glLineWidth = (PFNGLLINEWIDTHPROC) load("glLineWidth", userptr); glColor3dv = (PFNGLCOLOR3DVPROC) load("glColor3dv", userptr); glColor4s = (PFNGLCOLOR4SPROC) load("glColor4s", userptr); glTexGendv = (PFNGLTEXGENDVPROC) load("glTexGendv", userptr); glRasterPos3s = (PFNGLRASTERPOS3SPROC) load("glRasterPos3s", userptr); glRasterPos4dv = (PFNGLRASTERPOS4DVPROC) load("glRasterPos4dv", userptr); glGetFloatv = (PFNGLGETFLOATVPROC) load("glGetFloatv", userptr); glRasterPos3i = (PFNGLRASTERPOS3IPROC) load("glRasterPos3i", userptr); glTexCoord4f = (PFNGLTEXCOORD4FPROC) load("glTexCoord4f", userptr); glGetMapfv = (PFNGLGETMAPFVPROC) load("glGetMapfv", userptr); glNormal3d = (PFNGLNORMAL3DPROC) load("glNormal3d", userptr); glLightModeliv = (PFNGLLIGHTMODELIVPROC) load("glLightModeliv", userptr); glTexCoord3sv = (PFNGLTEXCOORD3SVPROC) load("glTexCoord3sv", userptr); glEvalCoord1d = (PFNGLEVALCOORD1DPROC) load("glEvalCoord1d", userptr); glGetMapdv = (PFNGLGETMAPDVPROC) load("glGetMapdv", userptr); glRecti = (PFNGLRECTIPROC) load("glRecti", userptr); glTexCoord1d = (PFNGLTEXCOORD1DPROC) load("glTexCoord1d", userptr); glGetPixelMapfv = (PFNGLGETPIXELMAPFVPROC) load("glGetPixelMapfv", userptr); glVertex4sv = (PFNGLVERTEX4SVPROC) load("glVertex4sv", userptr); glTexCoord1s = (PFNGLTEXCOORD1SPROC) load("glTexCoord1s", userptr); glIndexsv = (PFNGLINDEXSVPROC) load("glIndexsv", userptr); glRasterPos4iv = (PFNGLRASTERPOS4IVPROC) load("glRasterPos4iv", userptr); glTexCoord2fv = (PFNGLTEXCOORD2FVPROC) load("glTexCoord2fv", userptr); glGetTexEnviv = (PFNGLGETTEXENVIVPROC) load("glGetTexEnviv", userptr); glCallList = (PFNGLCALLLISTPROC) load("glCallList", userptr); glLoadMatrixf = (PFNGLLOADMATRIXFPROC) load("glLoadMatrixf", userptr); glPolygonMode = (PFNGLPOLYGONMODEPROC) load("glPolygonMode", userptr); glTranslatef = (PFNGLTRANSLATEFPROC) load("glTranslatef", userptr); glGetTexImage = (PFNGLGETTEXIMAGEPROC) load("glGetTexImage", userptr); glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load("glGetTexParameterfv", userptr); glMapGrid2f = (PFNGLMAPGRID2FPROC) load("glMapGrid2f", userptr); glVertex4d = (PFNGLVERTEX4DPROC) load("glVertex4d", userptr); glNormal3sv = (PFNGLNORMAL3SVPROC) load("glNormal3sv", userptr); glRasterPos4f = (PFNGLRASTERPOS4FPROC) load("glRasterPos4f", userptr); glEvalCoord1dv = (PFNGLEVALCOORD1DVPROC) load("glEvalCoord1dv", userptr); glIndexs = (PFNGLINDEXSPROC) load("glIndexs", userptr); glIndexdv = (PFNGLINDEXDVPROC) load("glIndexdv", userptr); glIsEnabled = (PFNGLISENABLEDPROC) load("glIsEnabled", userptr); glGetPixelMapusv = (PFNGLGETPIXELMAPUSVPROC) load("glGetPixelMapusv", userptr); glColor3us = (PFNGLCOLOR3USPROC) load("glColor3us", userptr); glEvalPoint1 = (PFNGLEVALPOINT1PROC) load("glEvalPoint1", userptr); glColor4sv = (PFNGLCOLOR4SVPROC) load("glColor4sv", userptr); glColor3i = (PFNGLCOLOR3IPROC) load("glColor3i", userptr); glRectf = (PFNGLRECTFPROC) load("glRectf", userptr); glEvalCoord1fv = (PFNGLEVALCOORD1FVPROC) load("glEvalCoord1fv", userptr); glTexCoord1sv = (PFNGLTEXCOORD1SVPROC) load("glTexCoord1sv", userptr); glColor4d = (PFNGLCOLOR4DPROC) load("glColor4d", userptr); glColor4ubv = (PFNGLCOLOR4UBVPROC) load("glColor4ubv", userptr); glGetMaterialfv = (PFNGLGETMATERIALFVPROC) load("glGetMaterialfv", userptr); glRasterPos3iv = (PFNGLRASTERPOS3IVPROC) load("glRasterPos3iv", userptr); glGetMaterialiv = (PFNGLGETMATERIALIVPROC) load("glGetMaterialiv", userptr); glBlendFunc = (PFNGLBLENDFUNCPROC) load("glBlendFunc", userptr); glGetMapiv = (PFNGLGETMAPIVPROC) load("glGetMapiv", userptr); glMatrixMode = (PFNGLMATRIXMODEPROC) load("glMatrixMode", userptr); glScissor = (PFNGLSCISSORPROC) load("glScissor", userptr); glVertex4iv = (PFNGLVERTEX4IVPROC) load("glVertex4iv", userptr); glColorMask = (PFNGLCOLORMASKPROC) load("glColorMask", userptr); glGetBooleanv = (PFNGLGETBOOLEANVPROC) load("glGetBooleanv", userptr); glVertex2sv = (PFNGLVERTEX2SVPROC) load("glVertex2sv", userptr); glRectsv = (PFNGLRECTSVPROC) load("glRectsv", userptr); glRasterPos2f = (PFNGLRASTERPOS2FPROC) load("glRasterPos2f", userptr); glVertex3d = (PFNGLVERTEX3DPROC) load("glVertex3d", userptr); glStencilOp = (PFNGLSTENCILOPPROC) load("glStencilOp", userptr); glViewport = (PFNGLVIEWPORTPROC) load("glViewport", userptr); glMaterialiv = (PFNGLMATERIALIVPROC) load("glMaterialiv", userptr); glDrawBuffer = (PFNGLDRAWBUFFERPROC) load("glDrawBuffer", userptr); glVertex2f = (PFNGLVERTEX2FPROC) load("glVertex2f", userptr); glPixelTransferi = (PFNGLPIXELTRANSFERIPROC) load("glPixelTransferi", userptr); glGetPolygonStipple = (PFNGLGETPOLYGONSTIPPLEPROC) load("glGetPolygonStipple", userptr); glDeleteLists = (PFNGLDELETELISTSPROC) load("glDeleteLists", userptr); glRenderMode = (PFNGLRENDERMODEPROC) load("glRenderMode", userptr); glTexCoord2sv = (PFNGLTEXCOORD2SVPROC) load("glTexCoord2sv", userptr); glTexGend = (PFNGLTEXGENDPROC) load("glTexGend", userptr); glBitmap = (PFNGLBITMAPPROC) load("glBitmap", userptr); glMultMatrixf = (PFNGLMULTMATRIXFPROC) load("glMultMatrixf", userptr); glColor3fv = (PFNGLCOLOR3FVPROC) load("glColor3fv", userptr); glClearColor = (PFNGLCLEARCOLORPROC) load("glClearColor", userptr); glRectiv = (PFNGLRECTIVPROC) load("glRectiv", userptr); glGetTexGenfv = (PFNGLGETTEXGENFVPROC) load("glGetTexGenfv", userptr); glColor4dv = (PFNGLCOLOR4DVPROC) load("glColor4dv", userptr); glLogicOp = (PFNGLLOGICOPPROC) load("glLogicOp", userptr); glTexCoord4s = (PFNGLTEXCOORD4SPROC) load("glTexCoord4s", userptr); glRasterPos2d = (PFNGLRASTERPOS2DPROC) load("glRasterPos2d", userptr); glMapGrid1f = (PFNGLMAPGRID1FPROC) load("glMapGrid1f", userptr); glLightModeli = (PFNGLLIGHTMODELIPROC) load("glLightModeli", userptr); glPixelMapuiv = (PFNGLPIXELMAPUIVPROC) load("glPixelMapuiv", userptr); glTexGenfv = (PFNGLTEXGENFVPROC) load("glTexGenfv", userptr); glRotated = (PFNGLROTATEDPROC) load("glRotated", userptr); glAlphaFunc = (PFNGLALPHAFUNCPROC) load("glAlphaFunc", userptr); glRects = (PFNGLRECTSPROC) load("glRects", userptr); glPolygonStipple = (PFNGLPOLYGONSTIPPLEPROC) load("glPolygonStipple", userptr); glTexImage1D = (PFNGLTEXIMAGE1DPROC) load("glTexImage1D", userptr); glColor4fv = (PFNGLCOLOR4FVPROC) load("glColor4fv", userptr); glLineStipple = (PFNGLLINESTIPPLEPROC) load("glLineStipple", userptr); glVertex4f = (PFNGLVERTEX4FPROC) load("glVertex4f", userptr); glColor3ub = (PFNGLCOLOR3UBPROC) load("glColor3ub", userptr); glNormal3f = (PFNGLNORMAL3FPROC) load("glNormal3f", userptr); glTexGeni = (PFNGLTEXGENIPROC) load("glTexGeni", userptr); glTexCoord4dv = (PFNGLTEXCOORD4DVPROC) load("glTexCoord4dv", userptr); glTexCoord3s = (PFNGLTEXCOORD3SPROC) load("glTexCoord3s", userptr); glLightf = (PFNGLLIGHTFPROC) load("glLightf", userptr); glTexGenf = (PFNGLTEXGENFPROC) load("glTexGenf", userptr); glTexCoord3fv = (PFNGLTEXCOORD3FVPROC) load("glTexCoord3fv", userptr); glIndexiv = (PFNGLINDEXIVPROC) load("glIndexiv", userptr); glRasterPos4sv = (PFNGLRASTERPOS4SVPROC) load("glRasterPos4sv", userptr); glVertex3i = (PFNGLVERTEX3IPROC) load("glVertex3i", userptr); glColor4usv = (PFNGLCOLOR4USVPROC) load("glColor4usv", userptr); glLoadIdentity = (PFNGLLOADIDENTITYPROC) load("glLoadIdentity", userptr); glIndexf = (PFNGLINDEXFPROC) load("glIndexf", userptr); glVertex2s = (PFNGLVERTEX2SPROC) load("glVertex2s", userptr); glRasterPos4s = (PFNGLRASTERPOS4SPROC) load("glRasterPos4s", userptr); glGetClipPlane = (PFNGLGETCLIPPLANEPROC) load("glGetClipPlane", userptr); glGetError = (PFNGLGETERRORPROC) load("glGetError", userptr); glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load("glTexParameterfv", userptr); glColor4ui = (PFNGLCOLOR4UIPROC) load("glColor4ui", userptr); glTexCoord4d = (PFNGLTEXCOORD4DPROC) load("glTexCoord4d", userptr); glTexParameterf = (PFNGLTEXPARAMETERFPROC) load("glTexParameterf", userptr); glTexCoord2i = (PFNGLTEXCOORD2IPROC) load("glTexCoord2i", userptr); glTexCoord4i = (PFNGLTEXCOORD4IPROC) load("glTexCoord4i", userptr); glGetTexEnvfv = (PFNGLGETTEXENVFVPROC) load("glGetTexEnvfv", userptr); glFrontFace = (PFNGLFRONTFACEPROC) load("glFrontFace", userptr); glRasterPos2i = (PFNGLRASTERPOS2IPROC) load("glRasterPos2i", userptr); glIsList = (PFNGLISLISTPROC) load("glIsList", userptr); glGetLightiv = (PFNGLGETLIGHTIVPROC) load("glGetLightiv", userptr); glTexParameteri = (PFNGLTEXPARAMETERIPROC) load("glTexParameteri", userptr); glPushAttrib = (PFNGLPUSHATTRIBPROC) load("glPushAttrib", userptr); glColor4f = (PFNGLCOLOR4FPROC) load("glColor4f", userptr); glStencilMask = (PFNGLSTENCILMASKPROC) load("glStencilMask", userptr); glEvalMesh1 = (PFNGLEVALMESH1PROC) load("glEvalMesh1", userptr); glIndexd = (PFNGLINDEXDPROC) load("glIndexd", userptr); glNormal3iv = (PFNGLNORMAL3IVPROC) load("glNormal3iv", userptr); glRasterPos4fv = (PFNGLRASTERPOS4FVPROC) load("glRasterPos4fv", userptr); glTexGeniv = (PFNGLTEXGENIVPROC) load("glTexGeniv", userptr); glPopName = (PFNGLPOPNAMEPROC) load("glPopName", userptr); glFeedbackBuffer = (PFNGLFEEDBACKBUFFERPROC) load("glFeedbackBuffer", userptr); glEvalMesh2 = (PFNGLEVALMESH2PROC) load("glEvalMesh2", userptr); glScaled = (PFNGLSCALEDPROC) load("glScaled", userptr); glPushMatrix = (PFNGLPUSHMATRIXPROC) load("glPushMatrix", userptr); glEvalCoord1f = (PFNGLEVALCOORD1FPROC) load("glEvalCoord1f", userptr); glLighti = (PFNGLLIGHTIPROC) load("glLighti", userptr); glHint = (PFNGLHINTPROC) load("glHint", userptr); glIndexMask = (PFNGLINDEXMASKPROC) load("glIndexMask", userptr); glRasterPos3d = (PFNGLRASTERPOS3DPROC) load("glRasterPos3d", userptr); glEvalCoord2fv = (PFNGLEVALCOORD2FVPROC) load("glEvalCoord2fv", userptr); glColor3b = (PFNGLCOLOR3BPROC) load("glColor3b", userptr); glMaterialfv = (PFNGLMATERIALFVPROC) load("glMaterialfv", userptr); glStencilFunc = (PFNGLSTENCILFUNCPROC) load("glStencilFunc", userptr); glGetLightfv = (PFNGLGETLIGHTFVPROC) load("glGetLightfv", userptr); glInitNames = (PFNGLINITNAMESPROC) load("glInitNames", userptr); glRasterPos4i = (PFNGLRASTERPOS4IPROC) load("glRasterPos4i", userptr); glPixelMapusv = (PFNGLPIXELMAPUSVPROC) load("glPixelMapusv", userptr); glRasterPos2s = (PFNGLRASTERPOS2SPROC) load("glRasterPos2s", userptr); glFogfv = (PFNGLFOGFVPROC) load("glFogfv", userptr); glTexCoord3iv = (PFNGLTEXCOORD3IVPROC) load("glTexCoord3iv", userptr); glMap1f = (PFNGLMAP1FPROC) load("glMap1f", userptr); glVertex3s = (PFNGLVERTEX3SPROC) load("glVertex3s", userptr); glRasterPos3f = (PFNGLRASTERPOS3FPROC) load("glRasterPos3f", userptr); glDepthFunc = (PFNGLDEPTHFUNCPROC) load("glDepthFunc", userptr); glDepthRange = (PFNGLDEPTHRANGEPROC) load("glDepthRange", userptr); glVertex4s = (PFNGLVERTEX4SPROC) load("glVertex4s", userptr); glColor3bv = (PFNGLCOLOR3BVPROC) load("glColor3bv", userptr); glColor3ubv = (PFNGLCOLOR3UBVPROC) load("glColor3ubv", userptr); glNormal3b = (PFNGLNORMAL3BPROC) load("glNormal3b", userptr); glVertex3sv = (PFNGLVERTEX3SVPROC) load("glVertex3sv", userptr); glVertex2iv = (PFNGLVERTEX2IVPROC) load("glVertex2iv", userptr); glTexCoord4sv = (PFNGLTEXCOORD4SVPROC) load("glTexCoord4sv", userptr); glMap2d = (PFNGLMAP2DPROC) load("glMap2d", userptr); glGetTexGendv = (PFNGLGETTEXGENDVPROC) load("glGetTexGendv", userptr); glTexCoord3i = (PFNGLTEXCOORD3IPROC) load("glTexCoord3i", userptr); glCallLists = (PFNGLCALLLISTSPROC) load("glCallLists", userptr); glDrawPixels = (PFNGLDRAWPIXELSPROC) load("glDrawPixels", userptr); glMap1d = (PFNGLMAP1DPROC) load("glMap1d", userptr); glEdgeFlagv = (PFNGLEDGEFLAGVPROC) load("glEdgeFlagv", userptr); glTexCoord1dv = (PFNGLTEXCOORD1DVPROC) load("glTexCoord1dv", userptr); glRectfv = (PFNGLRECTFVPROC) load("glRectfv", userptr); glVertex3iv = (PFNGLVERTEX3IVPROC) load("glVertex3iv", userptr); glMateriali = (PFNGLMATERIALIPROC) load("glMateriali", userptr); glBegin = (PFNGLBEGINPROC) load("glBegin", userptr); glTexCoord3d = (PFNGLTEXCOORD3DPROC) load("glTexCoord3d", userptr); glNewList = (PFNGLNEWLISTPROC) load("glNewList", userptr); glPixelMapfv = (PFNGLPIXELMAPFVPROC) load("glPixelMapfv", userptr); glVertex3f = (PFNGLVERTEX3FPROC) load("glVertex3f", userptr); glColor3f = (PFNGLCOLOR3FPROC) load("glColor3f", userptr); glMultMatrixd = (PFNGLMULTMATRIXDPROC) load("glMultMatrixd", userptr); glScalef = (PFNGLSCALEFPROC) load("glScalef", userptr); glRasterPos3fv = (PFNGLRASTERPOS3FVPROC) load("glRasterPos3fv", userptr); glTexCoord1iv = (PFNGLTEXCOORD1IVPROC) load("glTexCoord1iv", userptr); glGetDoublev = (PFNGLGETDOUBLEVPROC) load("glGetDoublev", userptr); glMapGrid2d = (PFNGLMAPGRID2DPROC) load("glMapGrid2d", userptr); glReadPixels = (PFNGLREADPIXELSPROC) load("glReadPixels", userptr); glColor4bv = (PFNGLCOLOR4BVPROC) load("glColor4bv", userptr); glOrtho = (PFNGLORTHOPROC) load("glOrtho", userptr); glCopyPixels = (PFNGLCOPYPIXELSPROC) load("glCopyPixels", userptr); glFogf = (PFNGLFOGFPROC) load("glFogf", userptr); glTexCoord3f = (PFNGLTEXCOORD3FPROC) load("glTexCoord3f", userptr); glColor3s = (PFNGLCOLOR3SPROC) load("glColor3s", userptr); glColor3sv = (PFNGLCOLOR3SVPROC) load("glColor3sv", userptr); glIndexfv = (PFNGLINDEXFVPROC) load("glIndexfv", userptr); glPixelZoom = (PFNGLPIXELZOOMPROC) load("glPixelZoom", userptr); glColor3uiv = (PFNGLCOLOR3UIVPROC) load("glColor3uiv", userptr); glRasterPos2dv = (PFNGLRASTERPOS2DVPROC) load("glRasterPos2dv", userptr); glEvalCoord2dv = (PFNGLEVALCOORD2DVPROC) load("glEvalCoord2dv", userptr); glMapGrid1d = (PFNGLMAPGRID1DPROC) load("glMapGrid1d", userptr); glVertex3dv = (PFNGLVERTEX3DVPROC) load("glVertex3dv", userptr); glClear = (PFNGLCLEARPROC) load("glClear", userptr); glEnable = (PFNGLENABLEPROC) load("glEnable", userptr); glSelectBuffer = (PFNGLSELECTBUFFERPROC) load("glSelectBuffer", userptr); glRasterPos3sv = (PFNGLRASTERPOS3SVPROC) load("glRasterPos3sv", userptr); glNormal3dv = (PFNGLNORMAL3DVPROC) load("glNormal3dv", userptr); glPopAttrib = (PFNGLPOPATTRIBPROC) load("glPopAttrib", userptr); glColor3iv = (PFNGLCOLOR3IVPROC) load("glColor3iv", userptr); glTexCoord2s = (PFNGLTEXCOORD2SPROC) load("glTexCoord2s", userptr); glTexEnvi = (PFNGLTEXENVIPROC) load("glTexEnvi", userptr); glTexCoord2dv = (PFNGLTEXCOORD2DVPROC) load("glTexCoord2dv", userptr); glPassThrough = (PFNGLPASSTHROUGHPROC) load("glPassThrough", userptr); glMaterialf = (PFNGLMATERIALFPROC) load("glMaterialf", userptr); glColor4b = (PFNGLCOLOR4BPROC) load("glColor4b", userptr); glColor4uiv = (PFNGLCOLOR4UIVPROC) load("glColor4uiv", userptr); glClearIndex = (PFNGLCLEARINDEXPROC) load("glClearIndex", userptr); glRotatef = (PFNGLROTATEFPROC) load("glRotatef", userptr); glFogiv = (PFNGLFOGIVPROC) load("glFogiv", userptr); glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load("glTexParameteriv", userptr); glListBase = (PFNGLLISTBASEPROC) load("glListBase", userptr); glIndexi = (PFNGLINDEXIPROC) load("glIndexi", userptr); glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC) load("glGetTexLevelParameteriv", userptr); glVertex4i = (PFNGLVERTEX4IPROC) load("glVertex4i", userptr); glGetPixelMapuiv = (PFNGLGETPIXELMAPUIVPROC) load("glGetPixelMapuiv", userptr); glTexEnvfv = (PFNGLTEXENVFVPROC) load("glTexEnvfv", userptr); glEvalCoord2f = (PFNGLEVALCOORD2FPROC) load("glEvalCoord2f", userptr); glVertex4dv = (PFNGLVERTEX4DVPROC) load("glVertex4dv", userptr); glGetTexGeniv = (PFNGLGETTEXGENIVPROC) load("glGetTexGeniv", userptr); glPointSize = (PFNGLPOINTSIZEPROC) load("glPointSize", userptr); glTranslated = (PFNGLTRANSLATEDPROC) load("glTranslated", userptr); glColor4i = (PFNGLCOLOR4IPROC) load("glColor4i", userptr); glCullFace = (PFNGLCULLFACEPROC) load("glCullFace", userptr); glGenLists = (PFNGLGENLISTSPROC) load("glGenLists", userptr); glReadBuffer = (PFNGLREADBUFFERPROC) load("glReadBuffer", userptr); glRasterPos2fv = (PFNGLRASTERPOS2FVPROC) load("glRasterPos2fv", userptr); glEnd = (PFNGLENDPROC) load("glEnd", userptr); glVertex2dv = (PFNGLVERTEX2DVPROC) load("glVertex2dv", userptr); glColor4us = (PFNGLCOLOR4USPROC) load("glColor4us", userptr); glPushName = (PFNGLPUSHNAMEPROC) load("glPushName", userptr); glShadeModel = (PFNGLSHADEMODELPROC) load("glShadeModel", userptr); glNormal3fv = (PFNGLNORMAL3FVPROC) load("glNormal3fv", userptr); glTexCoord4iv = (PFNGLTEXCOORD4IVPROC) load("glTexCoord4iv", userptr); glColor3ui = (PFNGLCOLOR3UIPROC) load("glColor3ui", userptr); glRectd = (PFNGLRECTDPROC) load("glRectd", userptr); glTexCoord4fv = (PFNGLTEXCOORD4FVPROC) load("glTexCoord4fv", userptr); glTexCoord1f = (PFNGLTEXCOORD1FPROC) load("glTexCoord1f", userptr); glEdgeFlag = (PFNGLEDGEFLAGPROC) load("glEdgeFlag", userptr); glTexEnvf = (PFNGLTEXENVFPROC) load("glTexEnvf", userptr); glMap2f = (PFNGLMAP2FPROC) load("glMap2f", userptr); glNormal3i = (PFNGLNORMAL3IPROC) load("glNormal3i", userptr); glColor3usv = (PFNGLCOLOR3USVPROC) load("glColor3usv", userptr); glRasterPos2iv = (PFNGLRASTERPOS2IVPROC) load("glRasterPos2iv", userptr); glGetIntegerv = (PFNGLGETINTEGERVPROC) load("glGetIntegerv", userptr); glRectdv = (PFNGLRECTDVPROC) load("glRectdv", userptr); glNormal3bv = (PFNGLNORMAL3BVPROC) load("glNormal3bv", userptr); glVertex2fv = (PFNGLVERTEX2FVPROC) load("glVertex2fv", userptr); glVertex2d = (PFNGLVERTEX2DPROC) load("glVertex2d", userptr); glEndList = (PFNGLENDLISTPROC) load("glEndList", userptr); glFlush = (PFNGLFLUSHPROC) load("glFlush", userptr); glPixelStorei = (PFNGLPIXELSTOREIPROC) load("glPixelStorei", userptr); glColor4ub = (PFNGLCOLOR4UBPROC) load("glColor4ub", userptr); glNormal3s = (PFNGLNORMAL3SPROC) load("glNormal3s", userptr); glColor4iv = (PFNGLCOLOR4IVPROC) load("glColor4iv", userptr); glClipPlane = (PFNGLCLIPPLANEPROC) load("glClipPlane", userptr); glTexCoord1i = (PFNGLTEXCOORD1IPROC) load("glTexCoord1i", userptr); glLightModelf = (PFNGLLIGHTMODELFPROC) load("glLightModelf", userptr); glPopMatrix = (PFNGLPOPMATRIXPROC) load("glPopMatrix", userptr); glLoadMatrixd = (PFNGLLOADMATRIXDPROC) load("glLoadMatrixd", userptr); glRasterPos3dv = (PFNGLRASTERPOS3DVPROC) load("glRasterPos3dv", userptr); glTexCoord1fv = (PFNGLTEXCOORD1FVPROC) load("glTexCoord1fv", userptr); glTexCoord2iv = (PFNGLTEXCOORD2IVPROC) load("glTexCoord2iv", userptr); glClearDepth = (PFNGLCLEARDEPTHPROC) load("glClearDepth", userptr); glTexCoord2d = (PFNGLTEXCOORD2DPROC) load("glTexCoord2d", userptr); glRasterPos4d = (PFNGLRASTERPOS4DPROC) load("glRasterPos4d", userptr); glColorMaterial = (PFNGLCOLORMATERIALPROC) load("glColorMaterial", userptr); glAccum = (PFNGLACCUMPROC) load("glAccum", userptr); glClearStencil = (PFNGLCLEARSTENCILPROC) load("glClearStencil", userptr); glLightModelfv = (PFNGLLIGHTMODELFVPROC) load("glLightModelfv", userptr); glColor3d = (PFNGLCOLOR3DPROC) load("glColor3d", userptr); glDisable = (PFNGLDISABLEPROC) load("glDisable", userptr); glFogi = (PFNGLFOGIPROC) load("glFogi", userptr); glTexEnviv = (PFNGLTEXENVIVPROC) load("glTexEnviv", userptr); glLightfv = (PFNGLLIGHTFVPROC) load("glLightfv", userptr); glDepthMask = (PFNGLDEPTHMASKPROC) load("glDepthMask", userptr); glTexImage2D = (PFNGLTEXIMAGE2DPROC) load("glTexImage2D", userptr); glVertex3fv = (PFNGLVERTEX3FVPROC) load("glVertex3fv", userptr); glVertex4fv = (PFNGLVERTEX4FVPROC) load("glVertex4fv", userptr); glLightiv = (PFNGLLIGHTIVPROC) load("glLightiv", userptr); glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load("glGetTexParameteriv", userptr); glTexCoord3dv = (PFNGLTEXCOORD3DVPROC) load("glTexCoord3dv", userptr); } static void load_GL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_1_1) return; glVertexPointer = (PFNGLVERTEXPOINTERPROC) load("glVertexPointer", userptr); glBindTexture = (PFNGLBINDTEXTUREPROC) load("glBindTexture", userptr); glGetPointerv = (PFNGLGETPOINTERVPROC) load("glGetPointerv", userptr); glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load("glTexSubImage1D", userptr); glEdgeFlagPointer = (PFNGLEDGEFLAGPOINTERPROC) load("glEdgeFlagPointer", userptr); glIndexPointer = (PFNGLINDEXPOINTERPROC) load("glIndexPointer", userptr); glDrawElements = (PFNGLDRAWELEMENTSPROC) load("glDrawElements", userptr); glNormalPointer = (PFNGLNORMALPOINTERPROC) load("glNormalPointer", userptr); glIndexub = (PFNGLINDEXUBPROC) load("glIndexub", userptr); glDrawArrays = (PFNGLDRAWARRAYSPROC) load("glDrawArrays", userptr); glDeleteTextures = (PFNGLDELETETEXTURESPROC) load("glDeleteTextures", userptr); glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load("glCopyTexImage2D", userptr); glGenTextures = (PFNGLGENTEXTURESPROC) load("glGenTextures", userptr); glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load("glTexSubImage2D", userptr); glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load("glCopyTexImage1D", userptr); glIndexubv = (PFNGLINDEXUBVPROC) load("glIndexubv", userptr); glPopClientAttrib = (PFNGLPOPCLIENTATTRIBPROC) load("glPopClientAttrib", userptr); glAreTexturesResident = (PFNGLARETEXTURESRESIDENTPROC) load("glAreTexturesResident", userptr); glPushClientAttrib = (PFNGLPUSHCLIENTATTRIBPROC) load("glPushClientAttrib", userptr); glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC) load("glDisableClientState", userptr); glEnableClientState = (PFNGLENABLECLIENTSTATEPROC) load("glEnableClientState", userptr); glIsTexture = (PFNGLISTEXTUREPROC) load("glIsTexture", userptr); glArrayElement = (PFNGLARRAYELEMENTPROC) load("glArrayElement", userptr); glTexCoordPointer = (PFNGLTEXCOORDPOINTERPROC) load("glTexCoordPointer", userptr); glInterleavedArrays = (PFNGLINTERLEAVEDARRAYSPROC) load("glInterleavedArrays", userptr); glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load("glPolygonOffset", userptr); glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC) load("glPrioritizeTextures", userptr); glColorPointer = (PFNGLCOLORPOINTERPROC) load("glColorPointer", userptr); glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load("glCopyTexSubImage1D", userptr); glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load("glCopyTexSubImage2D", userptr); } static void load_GL_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_1_2) return; glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) load("glDrawRangeElements", userptr); glTexImage3D = (PFNGLTEXIMAGE3DPROC) load("glTexImage3D", userptr); glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load("glCopyTexSubImage3D", userptr); glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC) load("glTexSubImage3D", userptr); } static void load_GL_VERSION_1_3( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_1_3) return; glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load("glMultiTexCoord4f", userptr); glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC) load("glLoadTransposeMatrixf", userptr); glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC) load("glCompressedTexImage3D", userptr); glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load("glClientActiveTexture", userptr); glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load("glCompressedTexSubImage2D", userptr); glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC) load("glMultiTexCoord2s", userptr); glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC) load("glMultiTexCoord4i", userptr); glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC) load("glLoadTransposeMatrixd", userptr); glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC) load("glMultiTexCoord2i", userptr); glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) load("glCompressedTexSubImage3D", userptr); glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC) load("glMultiTexCoord4dv", userptr); glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC) load("glCompressedTexImage1D", userptr); glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC) load("glMultiTexCoord3s", userptr); glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC) load("glMultiTexCoord1f", userptr); glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC) load("glGetCompressedTexImage", userptr); glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC) load("glMultiTexCoord1i", userptr); glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC) load("glMultiTexCoord3f", userptr); glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC) load("glMultiTexCoord3dv", userptr); glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC) load("glMultTransposeMatrixd", userptr); glActiveTexture = (PFNGLACTIVETEXTUREPROC) load("glActiveTexture", userptr); glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC) load("glMultiTexCoord1dv", userptr); glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC) load("glMultiTexCoord3sv", userptr); glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC) load("glMultiTexCoord3d", userptr); glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load("glCompressedTexImage2D", userptr); glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC) load("glMultiTexCoord1d", userptr); glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC) load("glMultiTexCoord4d", userptr); glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC) load("glMultiTexCoord1sv", userptr); glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC) load("glMultiTexCoord4sv", userptr); glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC) load("glMultiTexCoord3i", userptr); glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC) load("glMultiTexCoord1iv", userptr); glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC) load("glMultTransposeMatrixf", userptr); glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC) load("glMultiTexCoord2fv", userptr); glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC) load("glMultiTexCoord4s", userptr); glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC) load("glMultiTexCoord2f", userptr); glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) load("glCompressedTexSubImage1D", userptr); glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC) load("glMultiTexCoord2dv", userptr); glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC) load("glMultiTexCoord2sv", userptr); glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC) load("glMultiTexCoord3iv", userptr); glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load("glSampleCoverage", userptr); glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC) load("glMultiTexCoord2iv", userptr); glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC) load("glMultiTexCoord2d", userptr); glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC) load("glMultiTexCoord1s", userptr); glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC) load("glMultiTexCoord4fv", userptr); glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC) load("glMultiTexCoord3fv", userptr); glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC) load("glMultiTexCoord4iv", userptr); glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC) load("glMultiTexCoord1fv", userptr); } static void load_GL_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_1_4) return; glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC) load("glMultiDrawElements", userptr); glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC) load("glWindowPos3sv", userptr); glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC) load("glSecondaryColor3us", userptr); glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC) load("glSecondaryColor3iv", userptr); glPointParameterf = (PFNGLPOINTPARAMETERFPROC) load("glPointParameterf", userptr); glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC) load("glSecondaryColor3s", userptr); glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC) load("glSecondaryColor3sv", userptr); glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC) load("glSecondaryColor3uiv", userptr); glWindowPos2d = (PFNGLWINDOWPOS2DPROC) load("glWindowPos2d", userptr); glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC) load("glSecondaryColor3ubv", userptr); glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC) load("glWindowPos3dv", userptr); glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC) load("glWindowPos2iv", userptr); glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC) load("glMultiDrawArrays", userptr); glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC) load("glSecondaryColor3bv", userptr); glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC) load("glSecondaryColor3ui", userptr); glWindowPos2f = (PFNGLWINDOWPOS2FPROC) load("glWindowPos2f", userptr); glWindowPos2s = (PFNGLWINDOWPOS2SPROC) load("glWindowPos2s", userptr); glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC) load("glSecondaryColor3fv", userptr); glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC) load("glPointParameteriv", userptr); glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC) load("glSecondaryColorPointer", userptr); glBlendColor = (PFNGLBLENDCOLORPROC) load("glBlendColor", userptr); glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC) load("glWindowPos2dv", userptr); glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load("glBlendFuncSeparate", userptr); glPointParameteri = (PFNGLPOINTPARAMETERIPROC) load("glPointParameteri", userptr); glFogCoordf = (PFNGLFOGCOORDFPROC) load("glFogCoordf", userptr); glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC) load("glSecondaryColor3f", userptr); glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC) load("glSecondaryColor3i", userptr); glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC) load("glSecondaryColor3ub", userptr); glWindowPos3i = (PFNGLWINDOWPOS3IPROC) load("glWindowPos3i", userptr); glWindowPos3f = (PFNGLWINDOWPOS3FPROC) load("glWindowPos3f", userptr); glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC) load("glSecondaryColor3b", userptr); glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC) load("glWindowPos3iv", userptr); glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC) load("glSecondaryColor3d", userptr); glFogCoordd = (PFNGLFOGCOORDDPROC) load("glFogCoordd", userptr); glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC) load("glWindowPos3fv", userptr); glWindowPos2i = (PFNGLWINDOWPOS2IPROC) load("glWindowPos2i", userptr); glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) load("glPointParameterfv", userptr); glFogCoordfv = (PFNGLFOGCOORDFVPROC) load("glFogCoordfv", userptr); glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC) load("glSecondaryColor3usv", userptr); glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC) load("glWindowPos2fv", userptr); glBlendEquation = (PFNGLBLENDEQUATIONPROC) load("glBlendEquation", userptr); glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC) load("glWindowPos2sv", userptr); glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC) load("glSecondaryColor3dv", userptr); glWindowPos3s = (PFNGLWINDOWPOS3SPROC) load("glWindowPos3s", userptr); glWindowPos3d = (PFNGLWINDOWPOS3DPROC) load("glWindowPos3d", userptr); glFogCoorddv = (PFNGLFOGCOORDDVPROC) load("glFogCoorddv", userptr); glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC) load("glFogCoordPointer", userptr); } static void load_GL_VERSION_1_5( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_1_5) return; glMapBuffer = (PFNGLMAPBUFFERPROC) load("glMapBuffer", userptr); glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load("glBufferSubData", userptr); glBeginQuery = (PFNGLBEGINQUERYPROC) load("glBeginQuery", userptr); glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load("glGetBufferParameteriv", userptr); glGenQueries = (PFNGLGENQUERIESPROC) load("glGenQueries", userptr); glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC) load("glGetQueryObjectuiv", userptr); glIsBuffer = (PFNGLISBUFFERPROC) load("glIsBuffer", userptr); glGetQueryiv = (PFNGLGETQUERYIVPROC) load("glGetQueryiv", userptr); glEndQuery = (PFNGLENDQUERYPROC) load("glEndQuery", userptr); glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC) load("glGetQueryObjectiv", userptr); glGenBuffers = (PFNGLGENBUFFERSPROC) load("glGenBuffers", userptr); glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) load("glGetBufferSubData", userptr); glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load("glDeleteBuffers", userptr); glIsQuery = (PFNGLISQUERYPROC) load("glIsQuery", userptr); glBindBuffer = (PFNGLBINDBUFFERPROC) load("glBindBuffer", userptr); glDeleteQueries = (PFNGLDELETEQUERIESPROC) load("glDeleteQueries", userptr); glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load("glUnmapBuffer", userptr); glBufferData = (PFNGLBUFFERDATAPROC) load("glBufferData", userptr); glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load("glGetBufferPointerv", userptr); } static void load_GL_VERSION_2_0( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_2_0) return; glUniform2i = (PFNGLUNIFORM2IPROC) load("glUniform2i", userptr); glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load("glVertexAttrib2fv", userptr); glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load("glUniformMatrix3fv", userptr); glUniform2iv = (PFNGLUNIFORM2IVPROC) load("glUniform2iv", userptr); glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load("glGetActiveUniform", userptr); glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load("glUniformMatrix4fv", userptr); glDetachShader = (PFNGLDETACHSHADERPROC) load("glDetachShader", userptr); glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load("glVertexAttrib4s", userptr); glAttachShader = (PFNGLATTACHSHADERPROC) load("glAttachShader", userptr); glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load("glVertexAttrib4Nuiv", userptr); glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load("glGetAttribLocation", userptr); glUniform2f = (PFNGLUNIFORM2FPROC) load("glUniform2f", userptr); glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load("glVertexAttrib1s", userptr); glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load("glVertexAttrib4Nsv", userptr); glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load("glVertexAttrib1f", userptr); glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load("glVertexAttrib3sv", userptr); glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load("glGetUniformiv", userptr); glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load("glVertexAttrib4sv", userptr); glCreateShader = (PFNGLCREATESHADERPROC) load("glCreateShader", userptr); glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) load("glStencilOpSeparate", userptr); glUniform3f = (PFNGLUNIFORM3FPROC) load("glUniform3f", userptr); glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load("glVertexAttrib4usv", userptr); glCreateProgram = (PFNGLCREATEPROGRAMPROC) load("glCreateProgram", userptr); glUniform4f = (PFNGLUNIFORM4FPROC) load("glUniform4f", userptr); glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) load("glGetShaderInfoLog", userptr); glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load("glVertexAttrib2d", userptr); glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load("glVertexAttrib2f", userptr); glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load("glUniformMatrix2fv", userptr); glUniform4fv = (PFNGLUNIFORM4FVPROC) load("glUniform4fv", userptr); glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load("glVertexAttrib4d", userptr); glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load("glVertexAttrib1fv", userptr); glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load("glVertexAttrib4Nubv", userptr); glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load("glVertexAttrib1sv", userptr); glDrawBuffers = (PFNGLDRAWBUFFERSPROC) load("glDrawBuffers", userptr); glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load("glGetShaderSource", userptr); glUniform3i = (PFNGLUNIFORM3IPROC) load("glUniform3i", userptr); glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load("glVertexAttrib4bv", userptr); glIsShader = (PFNGLISSHADERPROC) load("glIsShader", userptr); glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load("glVertexAttrib4iv", userptr); glIsProgram = (PFNGLISPROGRAMPROC) load("glIsProgram", userptr); glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load("glVertexAttrib1d", userptr); glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load("glVertexAttrib2dv", userptr); glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load("glVertexAttrib3f", userptr); glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load("glVertexAttrib3fv", userptr); glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load("glVertexAttrib4Nusv", userptr); glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load("glVertexAttrib4Nub", userptr); glLinkProgram = (PFNGLLINKPROGRAMPROC) load("glLinkProgram", userptr); glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load("glVertexAttrib2s", userptr); glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load("glVertexAttrib3dv", userptr); glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load("glVertexAttrib4ubv", userptr); glUniform1i = (PFNGLUNIFORM1IPROC) load("glUniform1i", userptr); glCompileShader = (PFNGLCOMPILESHADERPROC) load("glCompileShader", userptr); glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load("glBlendEquationSeparate", userptr); glDeleteShader = (PFNGLDELETESHADERPROC) load("glDeleteShader", userptr); glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load("glGetVertexAttribfv", userptr); glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load("glGetVertexAttribiv", userptr); glShaderSource = (PFNGLSHADERSOURCEPROC) load("glShaderSource", userptr); glUniform1f = (PFNGLUNIFORM1FPROC) load("glUniform1f", userptr); glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) load("glStencilFuncSeparate", userptr); glUniform1iv = (PFNGLUNIFORM1IVPROC) load("glUniform1iv", userptr); glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load("glVertexAttrib4fv", userptr); glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load("glVertexAttrib4dv", userptr); glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load("glGetActiveAttrib", userptr); glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load("glEnableVertexAttribArray", userptr); glUniform1fv = (PFNGLUNIFORM1FVPROC) load("glUniform1fv", userptr); glUniform2fv = (PFNGLUNIFORM2FVPROC) load("glUniform2fv", userptr); glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load("glVertexAttrib2sv", userptr); glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load("glVertexAttrib4Nbv", userptr); glUniform3fv = (PFNGLUNIFORM3FVPROC) load("glUniform3fv", userptr); glGetShaderiv = (PFNGLGETSHADERIVPROC) load("glGetShaderiv", userptr); glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load("glVertexAttribPointer", userptr); glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load("glGetVertexAttribPointerv", userptr); glDeleteProgram = (PFNGLDELETEPROGRAMPROC) load("glDeleteProgram", userptr); glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load("glVertexAttrib3s", userptr); glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load("glValidateProgram", userptr); glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load("glVertexAttrib4uiv", userptr); glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load("glGetVertexAttribdv", userptr); glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) load("glGetProgramInfoLog", userptr); glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC) load("glStencilMaskSeparate", userptr); glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load("glBindAttribLocation", userptr); glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load("glGetUniformLocation", userptr); glUseProgram = (PFNGLUSEPROGRAMPROC) load("glUseProgram", userptr); glGetProgramiv = (PFNGLGETPROGRAMIVPROC) load("glGetProgramiv", userptr); glUniform3iv = (PFNGLUNIFORM3IVPROC) load("glUniform3iv", userptr); glUniform4i = (PFNGLUNIFORM4IPROC) load("glUniform4i", userptr); glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load("glGetUniformfv", userptr); glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load("glVertexAttrib4Niv", userptr); glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load("glDisableVertexAttribArray", userptr); glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) load("glGetAttachedShaders", userptr); glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load("glVertexAttrib3d", userptr); glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load("glVertexAttrib4f", userptr); glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load("glVertexAttrib1dv", userptr); glUniform4iv = (PFNGLUNIFORM4IVPROC) load("glUniform4iv", userptr); } static void load_GL_VERSION_2_1( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_2_1) return; glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC) load("glUniformMatrix3x2fv", userptr); glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC) load("glUniformMatrix2x4fv", userptr); glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC) load("glUniformMatrix4x2fv", userptr); glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) load("glUniformMatrix3x4fv", userptr); glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC) load("glUniformMatrix2x3fv", userptr); glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC) load("glUniformMatrix4x3fv", userptr); } static void load_GL_VERSION_3_0( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_3_0) return; glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) load("glMapBufferRange", userptr); glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC) load("glTexParameterIuiv", userptr); glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC) load("glVertexAttribI4uiv", userptr); glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC) load("glBindFragDataLocation", userptr); glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC) load("glClearBufferuiv", userptr); glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) load("glGenVertexArrays", userptr); glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC) load("glVertexAttribI4usv", userptr); glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC) load("glVertexAttribI1iv", userptr); glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC) load("glTexParameterIiv", userptr); glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC) load("glVertexAttribI3ui", userptr); glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load("glGenFramebuffers", userptr); glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC) load("glVertexAttribI4ui", userptr); glUniform4uiv = (PFNGLUNIFORM4UIVPROC) load("glUniform4uiv", userptr); glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC) load("glEndTransformFeedback", userptr); glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC) load("glVertexAttribI1uiv", userptr); glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC) load("glGetTexParameterIuiv", userptr); glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC) load("glEndConditionalRender", userptr); glColorMaski = (PFNGLCOLORMASKIPROC) load("glColorMaski", userptr); glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC) load("glVertexAttribI4bv", userptr); glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC) load("glVertexAttribI4sv", userptr); glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load("glIsRenderbuffer", userptr); glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load("glFramebufferTexture1D", userptr); glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC) load("glGetVertexAttribIiv", userptr); glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC) load("glVertexAttribI1ui", userptr); glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC) load("glVertexAttribI2uiv", userptr); glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load("glDeleteFramebuffers", userptr); glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load("glCheckFramebufferStatus", userptr); glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC) load("glVertexAttribI3uiv", userptr); glClearBufferiv = (PFNGLCLEARBUFFERIVPROC) load("glClearBufferiv", userptr); glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC) load("glVertexAttribI4ubv", userptr); glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load("glFramebufferRenderbuffer", userptr); glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC) load("glVertexAttribIPointer", userptr); glClearBufferfi = (PFNGLCLEARBUFFERFIPROC) load("glClearBufferfi", userptr); glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load("glBindBufferBase", userptr); glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC) load("glVertexAttribI1i", userptr); glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load("glBindFramebuffer", userptr); glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC) load("glBeginConditionalRender", userptr); glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load("glGenerateMipmap", userptr); glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load("glBindRenderbuffer", userptr); glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load("glDeleteRenderbuffers", userptr); glUniform2ui = (PFNGLUNIFORM2UIPROC) load("glUniform2ui", userptr); glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) load("glDeleteVertexArrays", userptr); glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load("glRenderbufferStorageMultisample", userptr); glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC) load("glGetBooleani_v", userptr); glEnablei = (PFNGLENABLEIPROC) load("glEnablei", userptr); glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load("glFramebufferTexture2D", userptr); glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC) load("glGetUniformuiv", userptr); glUniform3ui = (PFNGLUNIFORM3UIPROC) load("glUniform3ui", userptr); glClampColor = (PFNGLCLAMPCOLORPROC) load("glClampColor", userptr); glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC) load("glGetVertexAttribIuiv", userptr); glUniform1ui = (PFNGLUNIFORM1UIPROC) load("glUniform1ui", userptr); glIsVertexArray = (PFNGLISVERTEXARRAYPROC) load("glIsVertexArray", userptr); glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) load("glBeginTransformFeedback", userptr); glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load("glRenderbufferStorage", userptr); glDisablei = (PFNGLDISABLEIPROC) load("glDisablei", userptr); glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC) load("glGetTexParameterIiv", userptr); glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC) load("glVertexAttribI2i", userptr); glIsEnabledi = (PFNGLISENABLEDIPROC) load("glIsEnabledi", userptr); glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC) load("glVertexAttribI4iv", userptr); glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load("glGenRenderbuffers", userptr); glGetStringi = (PFNGLGETSTRINGIPROC) load("glGetStringi", userptr); glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC) load("glTransformFeedbackVaryings", userptr); glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load("glGetFramebufferAttachmentParameteriv", userptr); glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load("glBindBufferRange", userptr); glUniform3uiv = (PFNGLUNIFORM3UIVPROC) load("glUniform3uiv", userptr); glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC) load("glVertexAttribI2iv", userptr); glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) load("glFlushMappedBufferRange", userptr); glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC) load("glVertexAttribI2ui", userptr); glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) load("glBindVertexArray", userptr); glUniform2uiv = (PFNGLUNIFORM2UIVPROC) load("glUniform2uiv", userptr); glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC) load("glVertexAttribI3iv", userptr); glUniform1uiv = (PFNGLUNIFORM1UIVPROC) load("glUniform1uiv", userptr); glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load("glBlitFramebuffer", userptr); glClearBufferfv = (PFNGLCLEARBUFFERFVPROC) load("glClearBufferfv", userptr); glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load("glIsFramebuffer", userptr); glUniform4ui = (PFNGLUNIFORM4UIPROC) load("glUniform4ui", userptr); glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load("glGetIntegeri_v", userptr); glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC) load("glVertexAttribI4i", userptr); glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC) load("glVertexAttribI3i", userptr); glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC) load("glGetFragDataLocation", userptr); glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) load("glGetTransformFeedbackVarying", userptr); glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load("glFramebufferTextureLayer", userptr); glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load("glFramebufferTexture3D", userptr); glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load("glGetRenderbufferParameteriv", userptr); } static void load_GL_VERSION_3_1( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_3_1) return; glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) load("glDrawArraysInstanced", userptr); glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load("glBindBufferRange", userptr); glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC) load("glGetActiveUniformName", userptr); glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) load("glGetUniformBlockIndex", userptr); glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load("glBindBufferBase", userptr); glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) load("glGetActiveUniformBlockiv", userptr); glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load("glCopyBufferSubData", userptr); glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) load("glGetUniformIndices", userptr); glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) load("glGetActiveUniformBlockName", userptr); glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load("glGetIntegeri_v", userptr); glTexBuffer = (PFNGLTEXBUFFERPROC) load("glTexBuffer", userptr); glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) load("glUniformBlockBinding", userptr); glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC) load("glDrawElementsInstanced", userptr); glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) load("glGetActiveUniformsiv", userptr); glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC) load("glPrimitiveRestartIndex", userptr); } static void load_GL_VERSION_3_2( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_3_2) return; glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) load("glDrawElementsInstancedBaseVertex", userptr); glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) load("glGetMultisamplefv", userptr); glGetInteger64v = (PFNGLGETINTEGER64VPROC) load("glGetInteger64v", userptr); glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC) load("glGetInteger64i_v", userptr); glGetSynciv = (PFNGLGETSYNCIVPROC) load("glGetSynciv", userptr); glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) load("glDrawRangeElementsBaseVertex", userptr); glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load("glFramebufferTexture", userptr); glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC) load("glGetBufferParameteri64v", userptr); glSampleMaski = (PFNGLSAMPLEMASKIPROC) load("glSampleMaski", userptr); glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) load("glTexImage3DMultisample", userptr); glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) load("glMultiDrawElementsBaseVertex", userptr); glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) load("glClientWaitSync", userptr); glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC) load("glProvokingVertex", userptr); glWaitSync = (PFNGLWAITSYNCPROC) load("glWaitSync", userptr); glDeleteSync = (PFNGLDELETESYNCPROC) load("glDeleteSync", userptr); glIsSync = (PFNGLISSYNCPROC) load("glIsSync", userptr); glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) load("glTexImage2DMultisample", userptr); glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) load("glDrawElementsBaseVertex", userptr); glFenceSync = (PFNGLFENCESYNCPROC) load("glFenceSync", userptr); } static void load_GL_VERSION_3_3( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_3_3) return; glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load("glSamplerParameterf", userptr); glGenSamplers = (PFNGLGENSAMPLERSPROC) load("glGenSamplers", userptr); glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC) load("glVertexAttribDivisor", userptr); glNormalP3uiv = (PFNGLNORMALP3UIVPROC) load("glNormalP3uiv", userptr); glNormalP3ui = (PFNGLNORMALP3UIPROC) load("glNormalP3ui", userptr); glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC) load("glTexCoordP1uiv", userptr); glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC) load("glVertexAttribP1ui", userptr); glVertexP2uiv = (PFNGLVERTEXP2UIVPROC) load("glVertexP2uiv", userptr); glVertexP3uiv = (PFNGLVERTEXP3UIVPROC) load("glVertexP3uiv", userptr); glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC) load("glVertexAttribP3uiv", userptr); glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) load("glSamplerParameterIuiv", userptr); glVertexP2ui = (PFNGLVERTEXP2UIPROC) load("glVertexP2ui", userptr); glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC) load("glTexCoordP2uiv", userptr); glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC) load("glVertexAttribP1uiv", userptr); glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load("glSamplerParameteri", userptr); glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC) load("glMultiTexCoordP3ui", userptr); glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) load("glGetQueryObjecti64v", userptr); glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) load("glGetSamplerParameterIiv", userptr); glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load("glSamplerParameterfv", userptr); glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC) load("glMultiTexCoordP2ui", userptr); glVertexP3ui = (PFNGLVERTEXP3UIPROC) load("glVertexP3ui", userptr); glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC) load("glTexCoordP2ui", userptr); glColorP4uiv = (PFNGLCOLORP4UIVPROC) load("glColorP4uiv", userptr); glBindSampler = (PFNGLBINDSAMPLERPROC) load("glBindSampler", userptr); glVertexP4uiv = (PFNGLVERTEXP4UIVPROC) load("glVertexP4uiv", userptr); glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC) load("glVertexAttribP3ui", userptr); glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) load("glGetSamplerParameterIuiv", userptr); glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) load("glBindFragDataLocationIndexed", userptr); glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC) load("glMultiTexCoordP4uiv", userptr); glIsSampler = (PFNGLISSAMPLERPROC) load("glIsSampler", userptr); glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load("glGetSamplerParameterfv", userptr); glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC) load("glTexCoordP3ui", userptr); glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) load("glVertexAttribP4uiv", userptr); glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC) load("glSecondaryColorP3uiv", userptr); glQueryCounter = (PFNGLQUERYCOUNTERPROC) load("glQueryCounter", userptr); glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) load("glGetQueryObjectui64v", userptr); glColorP3uiv = (PFNGLCOLORP3UIVPROC) load("glColorP3uiv", userptr); glColorP4ui = (PFNGLCOLORP4UIPROC) load("glColorP4ui", userptr); glVertexP4ui = (PFNGLVERTEXP4UIPROC) load("glVertexP4ui", userptr); glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load("glGetSamplerParameteriv", userptr); glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC) load("glMultiTexCoordP2uiv", userptr); glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load("glSamplerParameteriv", userptr); glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC) load("glTexCoordP3uiv", userptr); glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC) load("glTexCoordP4ui", userptr); glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC) load("glMultiTexCoordP1ui", userptr); glColorP3ui = (PFNGLCOLORP3UIPROC) load("glColorP3ui", userptr); glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC) load("glMultiTexCoordP1uiv", userptr); glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC) load("glMultiTexCoordP4ui", userptr); glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC) load("glVertexAttribP2ui", userptr); glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC) load("glSecondaryColorP3ui", userptr); glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC) load("glTexCoordP1ui", userptr); glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) load("glSamplerParameterIiv", userptr); glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load("glDeleteSamplers", userptr); glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC) load("glVertexAttribP2uiv", userptr); glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC) load("glMultiTexCoordP3uiv", userptr); glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) load("glVertexAttribP4ui", userptr); glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC) load("glTexCoordP4uiv", userptr); glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC) load("glGetFragDataIndex", userptr); } static void load_GL_VERSION_4_0( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_4_0) return; glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC) load("glBeginQueryIndexed", userptr); glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC) load("glPauseTransformFeedback", userptr); glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC) load("glUniformMatrix3x4dv", userptr); glGetUniformdv = (PFNGLGETUNIFORMDVPROC) load("glGetUniformdv", userptr); glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC) load("glUniformSubroutinesuiv", userptr); glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC) load("glEndQueryIndexed", userptr); glUniform3dv = (PFNGLUNIFORM3DVPROC) load("glUniform3dv", userptr); glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC) load("glGetProgramStageiv", userptr); glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC) load("glBlendFuncSeparatei", userptr); glBlendEquationi = (PFNGLBLENDEQUATIONIPROC) load("glBlendEquationi", userptr); glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC) load("glMinSampleShading", userptr); glUniform4d = (PFNGLUNIFORM4DPROC) load("glUniform4d", userptr); glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC) load("glUniformMatrix3dv", userptr); glUniform3d = (PFNGLUNIFORM3DPROC) load("glUniform3d", userptr); glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC) load("glGetActiveSubroutineName", userptr); glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) load("glDrawTransformFeedbackStream", userptr); glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC) load("glPatchParameterfv", userptr); glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC) load("glUniformMatrix4x2dv", userptr); glUniform1dv = (PFNGLUNIFORM1DVPROC) load("glUniform1dv", userptr); glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC) load("glDrawArraysIndirect", userptr); glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC) load("glDrawTransformFeedback", userptr); glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC) load("glGetUniformSubroutineuiv", userptr); glUniform4dv = (PFNGLUNIFORM4DVPROC) load("glUniform4dv", userptr); glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC) load("glBlendEquationSeparatei", userptr); glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) load("glGetSubroutineUniformLocation", userptr); glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC) load("glUniformMatrix2dv", userptr); glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC) load("glUniformMatrix3x2dv", userptr); glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC) load("glIsTransformFeedback", userptr); glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC) load("glDeleteTransformFeedbacks", userptr); glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) load("glGetActiveSubroutineUniformName", userptr); glUniform2d = (PFNGLUNIFORM2DPROC) load("glUniform2d", userptr); glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC) load("glGenTransformFeedbacks", userptr); glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC) load("glUniformMatrix4x3dv", userptr); glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC) load("glUniformMatrix2x4dv", userptr); glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) load("glGetActiveSubroutineUniformiv", userptr); glBlendFunci = (PFNGLBLENDFUNCIPROC) load("glBlendFunci", userptr); glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC) load("glUniformMatrix2x3dv", userptr); glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC) load("glGetQueryIndexediv", userptr); glUniform2dv = (PFNGLUNIFORM2DVPROC) load("glUniform2dv", userptr); glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC) load("glGetSubroutineIndex", userptr); glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC) load("glResumeTransformFeedback", userptr); glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC) load("glBindTransformFeedback", userptr); glUniform1d = (PFNGLUNIFORM1DPROC) load("glUniform1d", userptr); glPatchParameteri = (PFNGLPATCHPARAMETERIPROC) load("glPatchParameteri", userptr); glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC) load("glDrawElementsIndirect", userptr); glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC) load("glUniformMatrix4dv", userptr); } static void load_GL_VERSION_4_1( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_4_1) return; glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC) load("glGetDoublei_v", userptr); glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC) load("glProgramUniform4d", userptr); glGetFloati_v = (PFNGLGETFLOATI_VPROC) load("glGetFloati_v", userptr); glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC) load("glIsProgramPipeline", userptr); glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) load("glGetProgramBinary", userptr); glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC) load("glDepthRangeArrayv", userptr); glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC) load("glProgramUniform1iv", userptr); glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) load("glProgramUniformMatrix3x2dv", userptr); glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load("glProgramParameteri", userptr); glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC) load("glVertexAttribLPointer", userptr); glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) load("glProgramUniformMatrix2x3fv", userptr); glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC) load("glProgramUniform3fv", userptr); glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC) load("glProgramUniform4i", userptr); glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC) load("glProgramUniform2iv", userptr); glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC) load("glProgramUniform1dv", userptr); glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC) load("glDepthRangeIndexed", userptr); glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC) load("glDeleteProgramPipelines", userptr); glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC) load("glProgramUniform4fv", userptr); glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC) load("glVertexAttribL3dv", userptr); glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC) load("glViewportArrayv", userptr); glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC) load("glVertexAttribL4d", userptr); glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC) load("glVertexAttribL1dv", userptr); glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC) load("glProgramUniform3i", userptr); glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC) load("glCreateShaderProgramv", userptr); glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC) load("glProgramUniform3uiv", userptr); glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC) load("glViewportIndexedf", userptr); glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) load("glActiveShaderProgram", userptr); glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC) load("glViewportIndexedfv", userptr); glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC) load("glProgramUniform4uiv", userptr); glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC) load("glProgramUniform1d", userptr); glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC) load("glProgramUniform2fv", userptr); glScissorIndexed = (PFNGLSCISSORINDEXEDPROC) load("glScissorIndexed", userptr); glProgramBinary = (PFNGLPROGRAMBINARYPROC) load("glProgramBinary", userptr); glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) load("glUseProgramStages", userptr); glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC) load("glVertexAttribL2d", userptr); glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC) load("glReleaseShaderCompiler", userptr); glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC) load("glProgramUniform3dv", userptr); glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC) load("glProgramUniformMatrix3dv", userptr); glScissorArrayv = (PFNGLSCISSORARRAYVPROC) load("glScissorArrayv", userptr); glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) load("glProgramUniformMatrix3x4dv", userptr); glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC) load("glVertexAttribL4dv", userptr); glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC) load("glProgramUniform2f", userptr); glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC) load("glProgramUniform2i", userptr); glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC) load("glProgramUniformMatrix4dv", userptr); glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC) load("glProgramUniform2uiv", userptr); glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) load("glProgramUniformMatrix3x4fv", userptr); glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC) load("glProgramUniform4f", userptr); glClearDepthf = (PFNGLCLEARDEPTHFPROC) load("glClearDepthf", userptr); glShaderBinary = (PFNGLSHADERBINARYPROC) load("glShaderBinary", userptr); glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC) load("glProgramUniform2ui", userptr); glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC) load("glGetProgramPipelineiv", userptr); glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) load("glProgramUniformMatrix2x3dv", userptr); glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC) load("glVertexAttribL2dv", userptr); glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC) load("glProgramUniformMatrix2dv", userptr); glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC) load("glProgramUniformMatrix2fv", userptr); glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC) load("glGetProgramPipelineInfoLog", userptr); glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) load("glProgramUniformMatrix4x3dv", userptr); glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC) load("glGetShaderPrecisionFormat", userptr); glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC) load("glProgramUniform3d", userptr); glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) load("glProgramUniformMatrix4x2dv", userptr); glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC) load("glProgramUniform3f", userptr); glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC) load("glProgramUniform3iv", userptr); glDepthRangef = (PFNGLDEPTHRANGEFPROC) load("glDepthRangef", userptr); glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC) load("glProgramUniform4iv", userptr); glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC) load("glScissorIndexedv", userptr); glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) load("glProgramUniformMatrix2x4dv", userptr); glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC) load("glGetVertexAttribLdv", userptr); glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC) load("glProgramUniform2dv", userptr); glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC) load("glProgramUniform4dv", userptr); glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC) load("glProgramUniform1fv", userptr); glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC) load("glProgramUniform3ui", userptr); glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC) load("glProgramUniform4ui", userptr); glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC) load("glProgramUniformMatrix4fv", userptr); glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC) load("glVertexAttribL1d", userptr); glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) load("glProgramUniformMatrix3x2fv", userptr); glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) load("glProgramUniformMatrix2x4fv", userptr); glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC) load("glProgramUniform1i", userptr); glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) load("glValidateProgramPipeline", userptr); glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC) load("glBindProgramPipeline", userptr); glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC) load("glProgramUniform1uiv", userptr); glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC) load("glProgramUniform2d", userptr); glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC) load("glProgramUniformMatrix3fv", userptr); glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) load("glProgramUniformMatrix4x2fv", userptr); glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC) load("glProgramUniform1f", userptr); glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC) load("glGenProgramPipelines", userptr); glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC) load("glProgramUniform1ui", userptr); glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) load("glProgramUniformMatrix4x3fv", userptr); glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC) load("glVertexAttribL3d", userptr); } static void load_GL_VERSION_4_2( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_4_2) return; glTexStorage2D = (PFNGLTEXSTORAGE2DPROC) load("glTexStorage2D", userptr); glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC) load("glGetInternalformativ", userptr); glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC) load("glBindImageTexture", userptr); glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) load("glDrawTransformFeedbackStreamInstanced", userptr); glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) load("glDrawArraysInstancedBaseInstance", userptr); glTexStorage3D = (PFNGLTEXSTORAGE3DPROC) load("glTexStorage3D", userptr); glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) load("glDrawElementsInstancedBaseVertexBaseInstance", userptr); glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) load("glDrawTransformFeedbackInstanced", userptr); glMemoryBarrier = (PFNGLMEMORYBARRIERPROC) load("glMemoryBarrier", userptr); glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) load("glGetActiveAtomicCounterBufferiv", userptr); glTexStorage1D = (PFNGLTEXSTORAGE1DPROC) load("glTexStorage1D", userptr); glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) load("glDrawElementsInstancedBaseInstance", userptr); } static void load_GL_VERSION_4_3( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_4_3) return; glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC) load("glDispatchComputeIndirect", userptr); glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC) load("glVertexAttribLFormat", userptr); glClearBufferData = (PFNGLCLEARBUFFERDATAPROC) load("glClearBufferData", userptr); glTextureView = (PFNGLTEXTUREVIEWPROC) load("glTextureView", userptr); glGetPointerv = (PFNGLGETPOINTERVPROC) load("glGetPointerv", userptr); glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC) load("glFramebufferParameteri", userptr); glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) load("glDebugMessageCallback", userptr); glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC) load("glInvalidateBufferData", userptr); glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC) load("glGetInternalformati64v", userptr); glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC) load("glVertexAttribBinding", userptr); glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC) load("glDispatchCompute", userptr); glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC) load("glVertexBindingDivisor", userptr); glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC) load("glMultiDrawArraysIndirect", userptr); glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC) load("glGetProgramResourceName", userptr); glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) load("glDebugMessageControl", userptr); glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC) load("glGetProgramResourceiv", userptr); glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC) load("glInvalidateSubFramebuffer", userptr); glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC) load("glVertexAttribIFormat", userptr); glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC) load("glInvalidateBufferSubData", userptr); glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC) load("glTexStorage2DMultisample", userptr); glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC) load("glTexStorage3DMultisample", userptr); glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC) load("glInvalidateFramebuffer", userptr); glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC) load("glGetProgramInterfaceiv", userptr); glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC) load("glShaderStorageBlockBinding", userptr); glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC) load("glClearBufferSubData", userptr); glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC) load("glGetProgramResourceIndex", userptr); glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC) load("glInvalidateTexImage", userptr); glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC) load("glGetFramebufferParameteriv", userptr); glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) load("glGetProgramResourceLocationIndex", userptr); glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) load("glObjectPtrLabel", userptr); glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC) load("glTexBufferRange", userptr); glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC) load("glGetProgramResourceLocation", userptr); glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC) load("glMultiDrawElementsIndirect", userptr); glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC) load("glInvalidateTexSubImage", userptr); glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC) load("glBindVertexBuffer", userptr); glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) load("glDebugMessageInsert", userptr); glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) load("glGetDebugMessageLog", userptr); glObjectLabel = (PFNGLOBJECTLABELPROC) load("glObjectLabel", userptr); glGetObjectLabel = (PFNGLGETOBJECTLABELPROC) load("glGetObjectLabel", userptr); glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC) load("glCopyImageSubData", userptr); glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load("glPushDebugGroup", userptr); glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load("glPopDebugGroup", userptr); glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC) load("glVertexAttribFormat", userptr); glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) load("glGetObjectPtrLabel", userptr); } static void load_GL_VERSION_4_4( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_4_4) return; glBindSamplers = (PFNGLBINDSAMPLERSPROC) load("glBindSamplers", userptr); glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC) load("glBindImageTextures", userptr); glBufferStorage = (PFNGLBUFFERSTORAGEPROC) load("glBufferStorage", userptr); glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC) load("glBindVertexBuffers", userptr); glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC) load("glBindBuffersBase", userptr); glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC) load("glClearTexSubImage", userptr); glClearTexImage = (PFNGLCLEARTEXIMAGEPROC) load("glClearTexImage", userptr); glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC) load("glBindBuffersRange", userptr); glBindTextures = (PFNGLBINDTEXTURESPROC) load("glBindTextures", userptr); } static void load_GL_VERSION_4_5( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_4_5) return; glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC) load("glGetTextureParameterIiv", userptr); glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) load("glTextureStorage3DMultisample", userptr); glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC) load("glTextureSubImage3D", userptr); glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC) load("glVertexArrayAttribBinding", userptr); glGetnCompressedTexImage = (PFNGLGETNCOMPRESSEDTEXIMAGEPROC) load("glGetnCompressedTexImage", userptr); glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) load("glTextureStorage2DMultisample", userptr); glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) load("glFlushMappedNamedBufferRange", userptr); glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) load("glGetNamedFramebufferParameteriv", userptr); glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC) load("glTextureBufferRange", userptr); glGetnMapdv = (PFNGLGETNMAPDVPROC) load("glGetnMapdv", userptr); glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC) load("glCopyTextureSubImage1D", userptr); glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC) load("glGetnUniformuiv", userptr); glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC) load("glTextureParameteri", userptr); glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) load("glCheckNamedFramebufferStatus", userptr); glGetnColorTable = (PFNGLGETNCOLORTABLEPROC) load("glGetnColorTable", userptr); glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC) load("glClearNamedBufferData", userptr); glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) load("glInvalidateNamedFramebufferSubData", userptr); glGetnPixelMapfv = (PFNGLGETNPIXELMAPFVPROC) load("glGetnPixelMapfv", userptr); glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC) load("glGetGraphicsResetStatus", userptr); glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) load("glTransformFeedbackBufferBase", userptr); glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC) load("glNamedBufferSubData", userptr); glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) load("glClearNamedFramebufferuiv", userptr); glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC) load("glVertexArrayAttribLFormat", userptr); glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC) load("glGetTextureLevelParameterfv", userptr); glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC) load("glBlitNamedFramebuffer", userptr); glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) load("glClearNamedFramebufferfi", userptr); glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) load("glNamedFramebufferReadBuffer", userptr); glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) load("glGetCompressedTextureImage", userptr); glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC) load("glGetTextureSubImage", userptr); glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC) load("glTextureSubImage2D", userptr); glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC) load("glNamedRenderbufferStorage", userptr); glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) load("glNamedFramebufferRenderbuffer", userptr); glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC) load("glNamedBufferData", userptr); glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC) load("glGetNamedBufferSubData", userptr); glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC) load("glGetNamedBufferPointerv", userptr); glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC) load("glTextureStorage2D", userptr); glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC) load("glGetTextureParameteriv", userptr); glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC) load("glVertexArrayVertexBuffer", userptr); glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC) load("glGetQueryBufferObjectui64v", userptr); glGetnPolygonStipple = (PFNGLGETNPOLYGONSTIPPLEPROC) load("glGetnPolygonStipple", userptr); glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC) load("glVertexArrayBindingDivisor", userptr); glGetnHistogram = (PFNGLGETNHISTOGRAMPROC) load("glGetnHistogram", userptr); glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC) load("glEnableVertexArrayAttrib", userptr); glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC) load("glGetVertexArrayIndexed64iv", userptr); glGetnUniformdv = (PFNGLGETNUNIFORMDVPROC) load("glGetnUniformdv", userptr); glCreateSamplers = (PFNGLCREATESAMPLERSPROC) load("glCreateSamplers", userptr); glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) load("glNamedFramebufferParameteri", userptr); glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC) load("glNamedBufferStorage", userptr); glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) load("glNamedFramebufferTexture", userptr); glGetnSeparableFilter = (PFNGLGETNSEPARABLEFILTERPROC) load("glGetnSeparableFilter", userptr); glCreateQueries = (PFNGLCREATEQUERIESPROC) load("glCreateQueries", userptr); glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) load("glTransformFeedbackBufferRange", userptr); glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC) load("glGetVertexArrayiv", userptr); glGetnMapfv = (PFNGLGETNMAPFVPROC) load("glGetnMapfv", userptr); glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) load("glGetNamedRenderbufferParameteriv", userptr); glGetnPixelMapuiv = (PFNGLGETNPIXELMAPUIVPROC) load("glGetnPixelMapuiv", userptr); glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC) load("glGetQueryBufferObjectiv", userptr); glGetnConvolutionFilter = (PFNGLGETNCONVOLUTIONFILTERPROC) load("glGetnConvolutionFilter", userptr); glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC) load("glCreateRenderbuffers", userptr); glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC) load("glGenerateTextureMipmap", userptr); glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC) load("glTextureStorage1D", userptr); glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC) load("glCreateProgramPipelines", userptr); glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load("glGetNamedFramebufferAttachmentParameteriv", userptr); glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC) load("glBindTextureUnit", userptr); glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC) load("glGetTransformFeedbacki64_v", userptr); glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) load("glNamedFramebufferDrawBuffer", userptr); glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) load("glInvalidateNamedFramebufferData", userptr); glReadnPixels = (PFNGLREADNPIXELSPROC) load("glReadnPixels", userptr); glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC) load("glTextureParameterfv", userptr); glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC) load("glGetVertexArrayIndexediv", userptr); glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC) load("glMapNamedBuffer", userptr); glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) load("glGetNamedBufferParameteri64v", userptr); glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC) load("glVertexArrayElementBuffer", userptr); glClipControl = (PFNGLCLIPCONTROLPROC) load("glClipControl", userptr); glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) load("glClearNamedFramebufferfv", userptr); glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC) load("glGetTransformFeedbackiv", userptr); glGetnMinmax = (PFNGLGETNMINMAXPROC) load("glGetnMinmax", userptr); glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) load("glNamedRenderbufferStorageMultisample", userptr); glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) load("glNamedFramebufferDrawBuffers", userptr); glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC) load("glGetNamedBufferParameteriv", userptr); glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) load("glNamedFramebufferTextureLayer", userptr); glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) load("glClearNamedFramebufferiv", userptr); glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) load("glCompressedTextureSubImage3D", userptr); glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC) load("glDisableVertexArrayAttrib", userptr); glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC) load("glGetQueryBufferObjectuiv", userptr); glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC) load("glTextureParameterIuiv", userptr); glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC) load("glGetTextureParameterIuiv", userptr); glTextureBuffer = (PFNGLTEXTUREBUFFERPROC) load("glTextureBuffer", userptr); glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC) load("glMemoryBarrierByRegion", userptr); glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC) load("glTextureParameterf", userptr); glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC) load("glCopyNamedBufferSubData", userptr); glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC) load("glVertexArrayAttribFormat", userptr); glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC) load("glMapNamedBufferRange", userptr); glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC) load("glTextureSubImage1D", userptr); glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC) load("glGetTextureParameterfv", userptr); glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC) load("glTextureParameteriv", userptr); glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC) load("glCreateFramebuffers", userptr); glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC) load("glTextureParameterIiv", userptr); glGetnTexImage = (PFNGLGETNTEXIMAGEPROC) load("glGetnTexImage", userptr); glTextureBarrier = (PFNGLTEXTUREBARRIERPROC) load("glTextureBarrier", userptr); glCreateTextures = (PFNGLCREATETEXTURESPROC) load("glCreateTextures", userptr); glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) load("glCompressedTextureSubImage1D", userptr); glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC) load("glCopyTextureSubImage3D", userptr); glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC) load("glCreateVertexArrays", userptr); glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) load("glCompressedTextureSubImage2D", userptr); glCreateBuffers = (PFNGLCREATEBUFFERSPROC) load("glCreateBuffers", userptr); glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC) load("glCreateTransformFeedbacks", userptr); glGetnMapiv = (PFNGLGETNMAPIVPROC) load("glGetnMapiv", userptr); glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC) load("glClearNamedBufferSubData", userptr); glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC) load("glGetTextureImage", userptr); glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC) load("glGetTextureLevelParameteriv", userptr); glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC) load("glGetnUniformiv", userptr); glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) load("glGetCompressedTextureSubImage", userptr); glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC) load("glVertexArrayVertexBuffers", userptr); glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC) load("glCopyTextureSubImage2D", userptr); glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC) load("glGetTransformFeedbacki_v", userptr); glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC) load("glUnmapNamedBuffer", userptr); glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC) load("glVertexArrayAttribIFormat", userptr); glGetnPixelMapusv = (PFNGLGETNPIXELMAPUSVPROC) load("glGetnPixelMapusv", userptr); glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC) load("glGetnUniformfv", userptr); glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC) load("glTextureStorage3D", userptr); glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC) load("glGetQueryBufferObjecti64v", userptr); } static void load_GL_VERSION_4_6( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GL_VERSION_4_6) return; glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC) load("glPolygonOffsetClamp", userptr); glSpecializeShader = (PFNGLSPECIALIZESHADERPROC) load("glSpecializeShader", userptr); glMultiDrawArraysIndirectCount = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) load("glMultiDrawArraysIndirectCount", userptr); glMultiDrawElementsIndirectCount = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) load("glMultiDrawElementsIndirectCount", userptr); } #if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0) #define GLAD_GL_IS_SOME_NEW_VERSION 1 #else #define GLAD_GL_IS_SOME_NEW_VERSION 0 #endif static int get_exts( int version, const char **out_exts, unsigned int *out_num_exts_i, char ***out_exts_i) { #if GLAD_GL_IS_SOME_NEW_VERSION if(GLAD_VERSION_MAJOR(version) < 3) { #else (void) version; (void) out_num_exts_i; (void) out_exts_i; #endif if (glGetString == NULL) { return 0; } *out_exts = (const char *)glGetString(GL_EXTENSIONS); #if GLAD_GL_IS_SOME_NEW_VERSION } else { unsigned int index = 0; unsigned int num_exts_i = 0; char **exts_i = NULL; if (glGetStringi == NULL || glGetIntegerv == NULL) { return 0; } glGetIntegerv(GL_NUM_EXTENSIONS, (int*) &num_exts_i); if (num_exts_i > 0) { exts_i = (char **) malloc(num_exts_i * (sizeof *exts_i)); } if (exts_i == NULL) { return 0; } for(index = 0; index < num_exts_i; index++) { const char *gl_str_tmp = (const char*) glGetStringi(GL_EXTENSIONS, index); size_t len = strlen(gl_str_tmp) + 1; char *local_str = (char*) malloc(len * sizeof(char)); if(local_str != NULL) { GLAD_IMPL_UTIL_STRNCPY(local_str, gl_str_tmp, len); } exts_i[index] = local_str; } *out_num_exts_i = num_exts_i; *out_exts_i = exts_i; } #endif return 1; } static void free_exts(char **exts_i, unsigned int num_exts_i) { if (exts_i != NULL) { unsigned int index; for(index = 0; index < num_exts_i; index++) { free((void *) (exts_i[index])); } free((void *)exts_i); exts_i = NULL; } } static int has_ext(int version, const char *exts, unsigned int num_exts_i, char **exts_i, const char *ext) { if(GLAD_VERSION_MAJOR(version) < 3 || !GLAD_GL_IS_SOME_NEW_VERSION) { const char *extensions; const char *loc; const char *terminator; extensions = exts; if(extensions == NULL || ext == NULL) { return 0; } while(1) { loc = strstr(extensions, ext); if(loc == NULL) { return 0; } terminator = loc + strlen(ext); if((loc == extensions || *(loc - 1) == ' ') && (*terminator == ' ' || *terminator == '\0')) { return 1; } extensions = terminator; } } else { unsigned int index; for(index = 0; index < num_exts_i; index++) { const char *e = exts_i[index]; if(strcmp(e, ext) == 0) { return 1; } } } return 0; } static GLADapiproc glad_gl_get_proc_from_userptr(const char* name, void *userptr) { return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); } static int find_extensionsGL( int version) { const char *exts = NULL; unsigned int num_exts_i = 0; char **exts_i = NULL; if (!get_exts(version, &exts, &num_exts_i, &exts_i)) return 0; GLAD_GL_ARB_point_sprite = has_ext(version, exts, num_exts_i, exts_i, "GL_ARB_point_sprite"); free_exts(exts_i, num_exts_i); return 1; } static int find_coreGL(void) { int i, major, minor; const char* version; const char* prefixes[] = { "OpenGL ES-CM ", "OpenGL ES-CL ", "OpenGL ES ", NULL }; version = (const char*) glGetString(GL_VERSION); if (!version) return 0; for (i = 0; prefixes[i]; i++) { const size_t length = strlen(prefixes[i]); if (strncmp(version, prefixes[i], length) == 0) { version += length; break; } } GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor); GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; GLAD_GL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; GLAD_GL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; GLAD_GL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; GLAD_GL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1; GLAD_GL_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2; GLAD_GL_VERSION_2_1 = (major == 2 && minor >= 1) || major > 2; GLAD_GL_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3; GLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3; GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3; GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3; GLAD_GL_VERSION_4_0 = (major == 4 && minor >= 0) || major > 4; GLAD_GL_VERSION_4_1 = (major == 4 && minor >= 1) || major > 4; GLAD_GL_VERSION_4_2 = (major == 4 && minor >= 2) || major > 4; GLAD_GL_VERSION_4_3 = (major == 4 && minor >= 3) || major > 4; GLAD_GL_VERSION_4_4 = (major == 4 && minor >= 4) || major > 4; GLAD_GL_VERSION_4_5 = (major == 4 && minor >= 5) || major > 4; GLAD_GL_VERSION_4_6 = (major == 4 && minor >= 6) || major > 4; return GLAD_MAKE_VERSION(major, minor); } int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr) { int version; glGetString = (PFNGLGETSTRINGPROC) load("glGetString", userptr); if(glGetString == NULL) return 0; if(glGetString(GL_VERSION) == NULL) return 0; version = find_coreGL(); load_GL_VERSION_1_0(load, userptr); load_GL_VERSION_1_1(load, userptr); load_GL_VERSION_1_2(load, userptr); load_GL_VERSION_1_3(load, userptr); load_GL_VERSION_1_4(load, userptr); load_GL_VERSION_1_5(load, userptr); load_GL_VERSION_2_0(load, userptr); load_GL_VERSION_2_1(load, userptr); load_GL_VERSION_3_0(load, userptr); load_GL_VERSION_3_1(load, userptr); load_GL_VERSION_3_2(load, userptr); load_GL_VERSION_3_3(load, userptr); load_GL_VERSION_4_0(load, userptr); load_GL_VERSION_4_1(load, userptr); load_GL_VERSION_4_2(load, userptr); load_GL_VERSION_4_3(load, userptr); load_GL_VERSION_4_4(load, userptr); load_GL_VERSION_4_5(load, userptr); load_GL_VERSION_4_6(load, userptr); if (!find_extensionsGL(version)) return 0; return version; } int gladLoadGL( GLADloadfunc load) { return gladLoadGLUserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); } #ifdef GLAD_GL #ifndef GLAD_LOADER_LIBRARY_C_ #define GLAD_LOADER_LIBRARY_C_ #include #include #if GLAD_PLATFORM_WIN32 #include #else #include #endif static void* glad_get_dlopen_handle(const char *lib_names[], int length) { void *handle = NULL; int i; for (i = 0; i < length; ++i) { #if GLAD_PLATFORM_WIN32 #if GLAD_PLATFORM_UWP size_t buffer_size = (strlen(lib_names[i]) + 1) * sizeof(WCHAR); LPWSTR buffer = (LPWSTR) malloc(buffer_size); if (buffer != NULL) { int ret = MultiByteToWideChar(CP_ACP, 0, lib_names[i], -1, buffer, buffer_size); if (ret != 0) { handle = (void*) LoadPackagedLibrary(buffer, 0); } free((void*) buffer); } #else handle = (void*) LoadLibraryA(lib_names[i]); #endif #else handle = dlopen(lib_names[i], RTLD_LAZY | RTLD_LOCAL); #endif if (handle != NULL) { return handle; } } return NULL; } static void glad_close_dlopen_handle(void* handle) { if (handle != NULL) { #if GLAD_PLATFORM_WIN32 FreeLibrary((HMODULE) handle); #else dlclose(handle); #endif } } static GLADapiproc glad_dlsym_handle(void* handle, const char *name) { if (handle == NULL) { return NULL; } #if GLAD_PLATFORM_WIN32 return (GLADapiproc) GetProcAddress((HMODULE) handle, name); #else return GLAD_GNUC_EXTENSION (GLADapiproc) dlsym(handle, name); #endif } #endif /* GLAD_LOADER_LIBRARY_C_ */ typedef void* (GLAD_API_PTR *GLADglprocaddrfunc)(const char*); struct _glad_gl_userptr { void *gl_handle; GLADglprocaddrfunc gl_get_proc_address_ptr; }; static GLADapiproc glad_gl_get_proc(const char *name, void *vuserptr) { struct _glad_gl_userptr userptr = *(struct _glad_gl_userptr*) vuserptr; GLADapiproc result = NULL; #ifndef __APPLE__ if(userptr.gl_get_proc_address_ptr != NULL) { result = GLAD_GNUC_EXTENSION (GLADapiproc) userptr.gl_get_proc_address_ptr(name); } #endif if(result == NULL) { result = glad_dlsym_handle(userptr.gl_handle, name); } return result; } int gladLoaderLoadGL(void) { #ifdef __APPLE__ static const char *NAMES[] = { "../Frameworks/OpenGL.framework/OpenGL", "/Library/Frameworks/OpenGL.framework/OpenGL", "/System/Library/Frameworks/OpenGL.framework/OpenGL", "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL" }; #elif GLAD_PLATFORM_WIN32 static const char *NAMES[] = {"opengl32.dll"}; #else static const char *NAMES[] = { #if defined __CYGWIN__ "libGL-1.so", #endif "libGL.so.1", "libGL.so" }; #endif int version = 0; void *handle; struct _glad_gl_userptr userptr; handle = glad_get_dlopen_handle(NAMES, sizeof(NAMES) / sizeof(NAMES[0])); if (handle) { userptr.gl_handle = handle; #ifdef __APPLE__ userptr.gl_get_proc_address_ptr = NULL; #elif GLAD_PLATFORM_WIN32 userptr.gl_get_proc_address_ptr = (GLADglprocaddrfunc) glad_dlsym_handle(handle, "wglGetProcAddress"); #else userptr.gl_get_proc_address_ptr = (GLADglprocaddrfunc) glad_dlsym_handle(handle, "glXGetProcAddressARB"); #endif version = gladLoadGLUserPtr(glad_gl_get_proc, &userptr); glad_close_dlopen_handle(handle); } return version; } #endif /* GLAD_GL */ ================================================ FILE: ycb_render/glad/glad/egl.h ================================================ /** * Loader generated by glad 0.1.11a0 on Wed Jun 13 07:59:54 2018 * * Generator: C/C++ * Specification: egl * Extensions: 7 * * APIs: * - egl=1.5 * * Options: * - HEADER_ONLY = False * - DEBUG = False * - MX = False * - LOADER = True * - MX_GLOBAL = False * - ALIAS = False * * Commandline: * --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 * * Online: * 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 * */ #ifndef GLAD_EGL_H_ #define GLAD_EGL_H_ #define GLAD_EGL #define GLAD_OPTION_EGL_LOADER #ifdef __cplusplus extern "C" { #endif #ifndef GLAD_PLATFORM_H_ #define GLAD_PLATFORM_H_ #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) #define GLAD_PLATFORM_WIN32 1 #else #define GLAD_PLATFORM_WIN32 0 #endif #ifndef GLAD_PLATFORM_UWP #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) #ifdef __has_include #if __has_include() #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 #endif #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 #endif #endif #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY #include #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) #define GLAD_PLATFORM_UWP 1 #endif #endif #ifndef GLAD_PLATFORM_UWP #define GLAD_PLATFORM_UWP 0 #endif #endif #ifdef __GNUC__ #define GLAD_GNUC_EXTENSION __extension__ #else #define GLAD_GNUC_EXTENSION #endif #ifndef GLAD_API_CALL #if defined(GLAD_API_CALL_EXPORT) #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) #if defined(GLAD_API_CALL_EXPORT_BUILD) #if defined(__GNUC__) #define GLAD_API_CALL __attribute__ ((dllexport)) extern #else #define GLAD_API_CALL __declspec(dllexport) extern #endif #else #if defined(__GNUC__) #define GLAD_API_CALL __attribute__ ((dllimport)) extern #else #define GLAD_API_CALL __declspec(dllimport) extern #endif #endif #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern #else #define GLAD_API_CALL extern #endif #else #define GLAD_API_CALL extern #endif #endif #ifdef APIENTRY #define GLAD_API_PTR APIENTRY #elif GLAD_PLATFORM_WIN32 #define GLAD_API_PTR __stdcall #else #define GLAD_API_PTR #endif #define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor) #define GLAD_VERSION_MAJOR(version) (version / 10000) #define GLAD_VERSION_MINOR(version) (version % 10000) typedef void (*GLADapiproc)(void); typedef GLADapiproc (*GLADloadfunc)(const char *name); typedef GLADapiproc (*GLADuserptrloadfunc)(const char *name, void *userptr); typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); #endif /* GLAD_PLATFORM_H_ */ #define EGL_VERSION 0x3054 #define EGL_CONFIG_CAVEAT 0x3027 #define EGL_NATIVE_VISUAL_ID 0x302E #define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2 #define EGL_NATIVE_RENDERABLE 0x302D #define EGL_BAD_SURFACE 0x300D #define EGL_MULTISAMPLE_RESOLVE 0x3099 #define EGL_PIXEL_ASPECT_RATIO 0x3092 #define EGL_BLUE_SIZE 0x3022 #define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5 #define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD #define EGL_BAD_ALLOC 0x3003 #define EGL_SAMPLES 0x3031 #define EGL_SYNC_TYPE 0x30F7 #define EGL_LUMINANCE_SIZE 0x303D #define EGL_PBUFFER_BIT 0x0001 #define EGL_ALPHA_FORMAT_NONPRE EGL_VG_ALPHA_FORMAT_NONPRE #define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B #define EGL_CONTEXT_LOST 0x300E #define EGL_BUFFER_PRESERVED 0x3094 #define EGL_GL_COLORSPACE_LINEAR EGL_COLORSPACE_LINEAR #define EGL_SAMPLE_BUFFERS 0x3032 #define EGL_GL_RENDERBUFFER 0x30B9 #define EGL_UNSIGNALED 0x30F3 #define EGL_OPENGL_ES_API 0x30A0 #define EGL_EXTENSIONS 0x3055 #define EGL_GL_TEXTURE_2D 0x30B1 #define EGL_BACK_BUFFER 0x3084 #define EGL_SYNC_CONDITION 0x30F8 #define EGL_BAD_NATIVE_PIXMAP 0x300A #define EGL_CONTEXT_OPENGL_DEBUG 0x31B0 #define EGL_TEXTURE_2D 0x305F #define EGL_CONFORMANT 0x3042 #define EGL_PIXMAP_BIT 0x0002 #define EGL_SLOW_CONFIG 0x3050 #define EGL_CL_EVENT_HANDLE 0x309C #define EGL_BAD_CURRENT_SURFACE 0x3007 #define EGL_BIND_TO_TEXTURE_RGBA 0x303A #define EGL_VG_COLORSPACE_sRGB EGL_COLORSPACE_sRGB #define EGL_IMAGE_PRESERVED 0x30D2 #define EGL_SURFACE_TYPE 0x3033 #define EGL_OPENVG_BIT 0x0002 #define EGL_VERTICAL_RESOLUTION 0x3091 #define EGL_MAX_PBUFFER_PIXELS 0x302B #define EGL_DEVICE_EXT 0x322C #define EGL_SWAP_BEHAVIOR 0x3093 #define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 #define EGL_VG_ALPHA_FORMAT 0x3088 #define EGL_RENDER_BUFFER 0x3086 #define EGL_VG_COLORSPACE 0x3087 #define EGL_NO_CONTEXT EGL_CAST(EGLContext,0) #define EGL_OPENGL_API 0x30A2 #define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7 #define EGL_LUMINANCE_BUFFER 0x308F #define EGL_NO_RESET_NOTIFICATION 0x31BE #define EGL_COLORSPACE_sRGB 0x3089 #define EGL_OPENGL_ES_BIT 0x0001 #define EGL_BAD_ACCESS 0x3002 #define EGL_OPENGL_ES2_BIT 0x0004 #define EGL_LOSE_CONTEXT_ON_RESET 0x31BF #define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0) #define EGL_NO_DEVICE_EXT EGL_CAST(EGLDeviceEXT,0) #define EGL_BAD_CONFIG 0x3005 #define EGL_NO_TEXTURE 0x305C #define EGL_LARGEST_PBUFFER 0x3058 #define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 #define EGL_ALPHA_FORMAT EGL_VG_ALPHA_FORMAT #define EGL_ALPHA_MASK_SIZE 0x303E #define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4 #define EGL_CUDA_DEVICE_NV 0x323A #define EGL_VENDOR 0x3053 #define EGL_STENCIL_SIZE 0x3026 #define EGL_BAD_ATTRIBUTE 0x3004 #define EGL_DRAW 0x3059 #define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001 #define EGL_COLORSPACE EGL_VG_COLORSPACE #define EGL_SYNC_CUDA_EVENT_NV 0x323C #define EGL_OPENVG_IMAGE 0x3096 #define EGL_NO_IMAGE EGL_CAST(EGLImage,0) #define EGL_TEXTURE_TARGET 0x3081 #define EGL_CORE_NATIVE_ENGINE 0x305B #define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0) #define EGL_SIGNALED 0x30F2 #define EGL_GL_COLORSPACE 0x309D #define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0 #define EGL_WIDTH 0x3057 #define EGL_TRANSPARENT_RGB 0x3052 #define EGL_SYNC_FENCE 0x30F9 #define EGL_RENDERABLE_TYPE 0x3040 #define EGL_TRANSPARENT_BLUE_VALUE 0x3035 #define EGL_MAX_SWAP_INTERVAL 0x303C #define EGL_HEIGHT 0x3056 #define EGL_TRANSPARENT_TYPE 0x3034 #define EGL_DEPTH_SIZE 0x3025 #define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD #define EGL_FOREVER 0xFFFFFFFFFFFFFFFF #define EGL_NATIVE_VISUAL_TYPE 0x302F #define EGL_GREEN_SIZE 0x3023 #define EGL_DISPLAY_SCALING 10000 #define EGL_WINDOW_BIT 0x0004 #define EGL_BIND_TO_TEXTURE_RGB 0x3039 #define EGL_VG_COLORSPACE_LINEAR EGL_COLORSPACE_LINEAR #define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001 #define EGL_BAD_DISPLAY 0x3008 #define EGL_CONDITION_SATISFIED 0x30F6 #define EGL_SYNC_CL_EVENT 0x30FE #define EGL_COLORSPACE_LINEAR 0x308A #define EGL_NONE 0x3038 #define EGL_MATCH_NATIVE_PIXMAP 0x3041 #define EGL_MIPMAP_LEVEL 0x3083 #define EGL_PLATFORM_DEVICE_EXT 0x313F #define EGL_BAD_CONTEXT 0x3006 #define EGL_MIN_SWAP_INTERVAL 0x303B #define EGL_BAD_DEVICE_EXT 0x322B #define EGL_FALSE 0 #define EGL_TEXTURE_FORMAT 0x3080 #define EGL_GL_TEXTURE_3D 0x30B2 #define EGL_COLOR_BUFFER_TYPE 0x303F #define EGL_MAX_PBUFFER_WIDTH 0x302C #define EGL_SINGLE_BUFFER 0x3085 #define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002 #define EGL_ALPHA_SIZE 0x3021 #define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A #define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 #define EGL_SYNC_STATUS 0x30F1 #define EGL_TRUE 1 #define EGL_TIMEOUT_EXPIRED 0x30F5 #define EGL_NO_SURFACE EGL_CAST(EGLSurface,0) #define EGL_RED_SIZE 0x3024 #define EGL_TEXTURE_RGBA 0x305E #define EGL_TRANSPARENT_GREEN_VALUE 0x3036 #define EGL_GL_TEXTURE_ZOFFSET 0x30BD #define EGL_ALPHA_FORMAT_PRE EGL_VG_ALPHA_FORMAT_PRE #define EGL_UNKNOWN EGL_CAST(EGLint,-1) #define EGL_SUCCESS 0x3000 #define EGL_CONTEXT_CLIENT_VERSION 0x3098 #define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3 #define EGL_SYNC_CUDA_EVENT_COMPLETE_NV 0x323D #define EGL_BUFFER_SIZE 0x3020 #define EGL_MAX_PBUFFER_HEIGHT 0x302A #define EGL_HORIZONTAL_RESOLUTION 0x3090 #define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF #define EGL_LEVEL 0x3029 #define EGL_CONTEXT_MAJOR_VERSION EGL_CONTEXT_CLIENT_VERSION #define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 #define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8 #define EGL_READ 0x305A #define EGL_BAD_PARAMETER 0x300C #define EGL_RGB_BUFFER 0x308E #define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B #define EGL_NON_CONFORMANT_CONFIG 0x3051 #define EGL_MIPMAP_TEXTURE 0x3082 #define EGL_CONFIG_ID 0x3028 #define EGL_CONTEXT_MINOR_VERSION 0x30FB #define EGL_TRANSPARENT_RED_VALUE 0x3037 #define EGL_BUFFER_DESTROYED 0x3095 #define EGL_CONTEXT_CLIENT_TYPE 0x3097 #define EGL_BAD_NATIVE_WINDOW 0x300B #define EGL_OPENGL_BIT 0x0008 #define EGL_OPENVG_API 0x30A1 #define EGL_OPENGL_ES3_BIT 0x00000040 #define EGL_BAD_MATCH 0x3009 #define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1 #define EGL_TEXTURE_RGB 0x305D #define EGL_CLIENT_APIS 0x308D #define EGL_GL_TEXTURE_LEVEL 0x30BC #define EGL_NOT_INITIALIZED 0x3001 #define EGL_NO_SYNC EGL_CAST(EGLSync,0) #define EGL_VG_ALPHA_FORMAT_PRE 0x308C #define EGL_DONT_CARE EGL_CAST(EGLint,-1) #define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6 #define EGL_GL_COLORSPACE_SRGB EGL_COLORSPACE_sRGB #define EGL_CUDA_EVENT_HANDLE_NV 0x323B #include #include struct AHardwareBuffer; typedef unsigned int EGLBoolean; typedef unsigned int EGLenum; typedef intptr_t EGLAttribKHR; typedef intptr_t EGLAttrib; typedef void *EGLClientBuffer; typedef void *EGLConfig; typedef void *EGLContext; typedef void *EGLDeviceEXT; typedef void *EGLDisplay; typedef void *EGLImage; typedef void *EGLImageKHR; typedef void *EGLLabelKHR; typedef void *EGLObjectKHR; typedef void *EGLOutputLayerEXT; typedef void *EGLOutputPortEXT; typedef void *EGLStreamKHR; typedef void *EGLSurface; typedef void *EGLSync; typedef void *EGLSyncKHR; typedef void *EGLSyncNV; typedef void (*__eglMustCastToProperFunctionPointerType)(void); typedef khronos_utime_nanoseconds_t EGLTimeKHR; typedef khronos_utime_nanoseconds_t EGLTime; typedef khronos_utime_nanoseconds_t EGLTimeNV; typedef khronos_utime_nanoseconds_t EGLuint64NV; typedef khronos_uint64_t EGLuint64KHR; typedef khronos_stime_nanoseconds_t EGLnsecsANDROID; typedef int EGLNativeFileDescriptorKHR; typedef khronos_ssize_t EGLsizeiANDROID; typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize); typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize); struct EGLClientPixmapHI { void *pData; EGLint iWidth; EGLint iHeight; EGLint iStride; }; typedef void (GLAD_API_PTR *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message); #define EGL_VERSION_1_0 1 GLAD_API_CALL int GLAD_EGL_VERSION_1_0; #define EGL_VERSION_1_1 1 GLAD_API_CALL int GLAD_EGL_VERSION_1_1; #define EGL_VERSION_1_2 1 GLAD_API_CALL int GLAD_EGL_VERSION_1_2; #define EGL_VERSION_1_3 1 GLAD_API_CALL int GLAD_EGL_VERSION_1_3; #define EGL_VERSION_1_4 1 GLAD_API_CALL int GLAD_EGL_VERSION_1_4; #define EGL_VERSION_1_5 1 GLAD_API_CALL int GLAD_EGL_VERSION_1_5; #define EGL_EXT_platform_device 1 GLAD_API_CALL int GLAD_EGL_EXT_platform_device; #define EGL_EXT_platform_base 1 GLAD_API_CALL int GLAD_EGL_EXT_platform_base; #define EGL_NV_device_cuda 1 GLAD_API_CALL int GLAD_EGL_NV_device_cuda; #define EGL_EXT_device_enumeration 1 GLAD_API_CALL int GLAD_EGL_EXT_device_enumeration; #define EGL_EXT_device_query 1 GLAD_API_CALL int GLAD_EGL_EXT_device_query; #define EGL_EXT_device_base 1 GLAD_API_CALL int GLAD_EGL_EXT_device_base; #define EGL_NV_cuda_event 1 GLAD_API_CALL int GLAD_EGL_NV_cuda_event; typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYDEVICESEXTPROC)(EGLint max_devices, EGLDeviceEXT * devices, EGLint * num_devices); typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPBUFFERSURFACEPROC)(EGLDisplay dpy, EGLConfig config, const EGLint * attrib_list); typedef EGLint (GLAD_API_PTR *PFNEGLGETERRORPROC)(void); typedef __eglMustCastToProperFunctionPointerType (GLAD_API_PTR *PFNEGLGETPROCADDRESSPROC)(const char * procname); typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETCURRENTDISPLAYPROC)(void); typedef EGLenum (GLAD_API_PTR *PFNEGLQUERYAPIPROC)(void); typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC)(EGLDisplay dpy, EGLConfig config, void * native_pixmap, const EGLAttrib * attrib_list); typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYDISPLAYATTRIBKHRPROC)(EGLDisplay dpy, EGLint name, EGLAttrib * value); typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYSYNCPROC)(EGLDisplay dpy, EGLSync sync); typedef EGLImage (GLAD_API_PTR *PFNEGLCREATEIMAGEPROC)(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib * attrib_list); typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYCONTEXTPROC)(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint * value); typedef EGLBoolean (GLAD_API_PTR *PFNEGLSWAPBUFFERSPROC)(EGLDisplay dpy, EGLSurface surface); typedef EGLContext (GLAD_API_PTR *PFNEGLCREATECONTEXTPROC)(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint * attrib_list); typedef EGLBoolean (GLAD_API_PTR *PFNEGLCHOOSECONFIGPROC)(EGLDisplay dpy, const EGLint * attrib_list, EGLConfig * configs, EGLint config_size, EGLint * num_config); typedef EGLBoolean (GLAD_API_PTR *PFNEGLBINDAPIPROC)(EGLenum api); typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITNATIVEPROC)(EGLint engine); typedef EGLBoolean (GLAD_API_PTR *PFNEGLTERMINATEPROC)(EGLDisplay dpy); typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC)(EGLDisplay dpy, EGLConfig config, void * native_pixmap, const EGLint * attrib_list); typedef EGLBoolean (GLAD_API_PTR *PFNEGLRELEASETHREADPROC)(void); typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMWINDOWSURFACEPROC)(EGLDisplay dpy, EGLConfig config, void * native_window, const EGLAttrib * attrib_list); typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETCONFIGATTRIBPROC)(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint * value); typedef EGLSurface (GLAD_API_PTR *PFNEGLGETCURRENTSURFACEPROC)(EGLint readdraw); typedef EGLBoolean (GLAD_API_PTR *PFNEGLCOPYBUFFERSPROC)(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETPLATFORMDISPLAYEXTPROC)(EGLenum platform, void * native_display, const EGLint * attrib_list); typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYDEVICEATTRIBEXTPROC)(EGLDeviceEXT device, EGLint attribute, EGLAttrib * value); typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPIXMAPSURFACEPROC)(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint * attrib_list); typedef EGLBoolean (GLAD_API_PTR *PFNEGLBINDTEXIMAGEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint buffer); typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETPLATFORMDISPLAYPROC)(EGLenum platform, void * native_display, const EGLAttrib * attrib_list); typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETDISPLAYPROC)(EGLNativeDisplayType display_id); typedef const char * (GLAD_API_PTR *PFNEGLQUERYSTRINGPROC)(EGLDisplay dpy, EGLint name); typedef EGLint (GLAD_API_PTR *PFNEGLCLIENTWAITSYNCPROC)(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITSYNCPROC)(EGLDisplay dpy, EGLSync sync, EGLint flags); typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYIMAGEPROC)(EGLDisplay dpy, EGLImage image); typedef EGLBoolean (GLAD_API_PTR *PFNEGLRELEASETEXIMAGEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint buffer); typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYDISPLAYATTRIBEXTPROC)(EGLDisplay dpy, EGLint attribute, EGLAttrib * value); typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYCONTEXTPROC)(EGLDisplay dpy, EGLContext ctx); typedef const char * (GLAD_API_PTR *PFNEGLQUERYDEVICESTRINGEXTPROC)(EGLDeviceEXT device, EGLint name); typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEWINDOWSURFACEPROC)(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint * attrib_list); typedef EGLContext (GLAD_API_PTR *PFNEGLGETCURRENTCONTEXTPROC)(void); typedef EGLBoolean (GLAD_API_PTR *PFNEGLINITIALIZEPROC)(EGLDisplay dpy, EGLint * major, EGLint * minor); typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYSURFACEPROC)(EGLDisplay dpy, EGLSurface surface); typedef EGLBoolean (GLAD_API_PTR *PFNEGLMAKECURRENTPROC)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)(EGLDisplay dpy, EGLConfig config, void * native_window, const EGLint * attrib_list); typedef EGLBoolean (GLAD_API_PTR *PFNEGLSWAPINTERVALPROC)(EGLDisplay dpy, EGLint interval); typedef EGLSync (GLAD_API_PTR *PFNEGLCREATESYNCPROC)(EGLDisplay dpy, EGLenum type, const EGLAttrib * attrib_list); typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETSYNCATTRIBPROC)(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib * value); typedef EGLBoolean (GLAD_API_PTR *PFNEGLSURFACEATTRIBPROC)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITGLPROC)(void); typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYSURFACEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint * value); typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETCONFIGSPROC)(EGLDisplay dpy, EGLConfig * configs, EGLint config_size, EGLint * num_config); typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITCLIENTPROC)(void); typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC)(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint * attrib_list); GLAD_API_CALL PFNEGLQUERYDEVICESEXTPROC glad_eglQueryDevicesEXT; #define eglQueryDevicesEXT glad_eglQueryDevicesEXT GLAD_API_CALL PFNEGLCREATEPBUFFERSURFACEPROC glad_eglCreatePbufferSurface; #define eglCreatePbufferSurface glad_eglCreatePbufferSurface GLAD_API_CALL PFNEGLGETERRORPROC glad_eglGetError; #define eglGetError glad_eglGetError GLAD_API_CALL PFNEGLGETPROCADDRESSPROC glad_eglGetProcAddress; #define eglGetProcAddress glad_eglGetProcAddress GLAD_API_CALL PFNEGLGETCURRENTDISPLAYPROC glad_eglGetCurrentDisplay; #define eglGetCurrentDisplay glad_eglGetCurrentDisplay GLAD_API_CALL PFNEGLQUERYAPIPROC glad_eglQueryAPI; #define eglQueryAPI glad_eglQueryAPI GLAD_API_CALL PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC glad_eglCreatePlatformPixmapSurface; #define eglCreatePlatformPixmapSurface glad_eglCreatePlatformPixmapSurface GLAD_API_CALL PFNEGLQUERYDISPLAYATTRIBKHRPROC glad_eglQueryDisplayAttribKHR; #define eglQueryDisplayAttribKHR glad_eglQueryDisplayAttribKHR GLAD_API_CALL PFNEGLDESTROYSYNCPROC glad_eglDestroySync; #define eglDestroySync glad_eglDestroySync GLAD_API_CALL PFNEGLCREATEIMAGEPROC glad_eglCreateImage; #define eglCreateImage glad_eglCreateImage GLAD_API_CALL PFNEGLQUERYCONTEXTPROC glad_eglQueryContext; #define eglQueryContext glad_eglQueryContext GLAD_API_CALL PFNEGLSWAPBUFFERSPROC glad_eglSwapBuffers; #define eglSwapBuffers glad_eglSwapBuffers GLAD_API_CALL PFNEGLCREATECONTEXTPROC glad_eglCreateContext; #define eglCreateContext glad_eglCreateContext GLAD_API_CALL PFNEGLCHOOSECONFIGPROC glad_eglChooseConfig; #define eglChooseConfig glad_eglChooseConfig GLAD_API_CALL PFNEGLBINDAPIPROC glad_eglBindAPI; #define eglBindAPI glad_eglBindAPI GLAD_API_CALL PFNEGLWAITNATIVEPROC glad_eglWaitNative; #define eglWaitNative glad_eglWaitNative GLAD_API_CALL PFNEGLTERMINATEPROC glad_eglTerminate; #define eglTerminate glad_eglTerminate GLAD_API_CALL PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC glad_eglCreatePlatformPixmapSurfaceEXT; #define eglCreatePlatformPixmapSurfaceEXT glad_eglCreatePlatformPixmapSurfaceEXT GLAD_API_CALL PFNEGLRELEASETHREADPROC glad_eglReleaseThread; #define eglReleaseThread glad_eglReleaseThread GLAD_API_CALL PFNEGLCREATEPLATFORMWINDOWSURFACEPROC glad_eglCreatePlatformWindowSurface; #define eglCreatePlatformWindowSurface glad_eglCreatePlatformWindowSurface GLAD_API_CALL PFNEGLGETCONFIGATTRIBPROC glad_eglGetConfigAttrib; #define eglGetConfigAttrib glad_eglGetConfigAttrib GLAD_API_CALL PFNEGLGETCURRENTSURFACEPROC glad_eglGetCurrentSurface; #define eglGetCurrentSurface glad_eglGetCurrentSurface GLAD_API_CALL PFNEGLCOPYBUFFERSPROC glad_eglCopyBuffers; #define eglCopyBuffers glad_eglCopyBuffers GLAD_API_CALL PFNEGLGETPLATFORMDISPLAYEXTPROC glad_eglGetPlatformDisplayEXT; #define eglGetPlatformDisplayEXT glad_eglGetPlatformDisplayEXT GLAD_API_CALL PFNEGLQUERYDEVICEATTRIBEXTPROC glad_eglQueryDeviceAttribEXT; #define eglQueryDeviceAttribEXT glad_eglQueryDeviceAttribEXT GLAD_API_CALL PFNEGLCREATEPIXMAPSURFACEPROC glad_eglCreatePixmapSurface; #define eglCreatePixmapSurface glad_eglCreatePixmapSurface GLAD_API_CALL PFNEGLBINDTEXIMAGEPROC glad_eglBindTexImage; #define eglBindTexImage glad_eglBindTexImage GLAD_API_CALL PFNEGLGETPLATFORMDISPLAYPROC glad_eglGetPlatformDisplay; #define eglGetPlatformDisplay glad_eglGetPlatformDisplay GLAD_API_CALL PFNEGLGETDISPLAYPROC glad_eglGetDisplay; #define eglGetDisplay glad_eglGetDisplay GLAD_API_CALL PFNEGLQUERYSTRINGPROC glad_eglQueryString; #define eglQueryString glad_eglQueryString GLAD_API_CALL PFNEGLCLIENTWAITSYNCPROC glad_eglClientWaitSync; #define eglClientWaitSync glad_eglClientWaitSync GLAD_API_CALL PFNEGLWAITSYNCPROC glad_eglWaitSync; #define eglWaitSync glad_eglWaitSync GLAD_API_CALL PFNEGLDESTROYIMAGEPROC glad_eglDestroyImage; #define eglDestroyImage glad_eglDestroyImage GLAD_API_CALL PFNEGLRELEASETEXIMAGEPROC glad_eglReleaseTexImage; #define eglReleaseTexImage glad_eglReleaseTexImage GLAD_API_CALL PFNEGLQUERYDISPLAYATTRIBEXTPROC glad_eglQueryDisplayAttribEXT; #define eglQueryDisplayAttribEXT glad_eglQueryDisplayAttribEXT GLAD_API_CALL PFNEGLDESTROYCONTEXTPROC glad_eglDestroyContext; #define eglDestroyContext glad_eglDestroyContext GLAD_API_CALL PFNEGLQUERYDEVICESTRINGEXTPROC glad_eglQueryDeviceStringEXT; #define eglQueryDeviceStringEXT glad_eglQueryDeviceStringEXT GLAD_API_CALL PFNEGLCREATEWINDOWSURFACEPROC glad_eglCreateWindowSurface; #define eglCreateWindowSurface glad_eglCreateWindowSurface GLAD_API_CALL PFNEGLGETCURRENTCONTEXTPROC glad_eglGetCurrentContext; #define eglGetCurrentContext glad_eglGetCurrentContext GLAD_API_CALL PFNEGLINITIALIZEPROC glad_eglInitialize; #define eglInitialize glad_eglInitialize GLAD_API_CALL PFNEGLDESTROYSURFACEPROC glad_eglDestroySurface; #define eglDestroySurface glad_eglDestroySurface GLAD_API_CALL PFNEGLMAKECURRENTPROC glad_eglMakeCurrent; #define eglMakeCurrent glad_eglMakeCurrent GLAD_API_CALL PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC glad_eglCreatePlatformWindowSurfaceEXT; #define eglCreatePlatformWindowSurfaceEXT glad_eglCreatePlatformWindowSurfaceEXT GLAD_API_CALL PFNEGLSWAPINTERVALPROC glad_eglSwapInterval; #define eglSwapInterval glad_eglSwapInterval GLAD_API_CALL PFNEGLCREATESYNCPROC glad_eglCreateSync; #define eglCreateSync glad_eglCreateSync GLAD_API_CALL PFNEGLGETSYNCATTRIBPROC glad_eglGetSyncAttrib; #define eglGetSyncAttrib glad_eglGetSyncAttrib GLAD_API_CALL PFNEGLSURFACEATTRIBPROC glad_eglSurfaceAttrib; #define eglSurfaceAttrib glad_eglSurfaceAttrib GLAD_API_CALL PFNEGLWAITGLPROC glad_eglWaitGL; #define eglWaitGL glad_eglWaitGL GLAD_API_CALL PFNEGLQUERYSURFACEPROC glad_eglQuerySurface; #define eglQuerySurface glad_eglQuerySurface GLAD_API_CALL PFNEGLGETCONFIGSPROC glad_eglGetConfigs; #define eglGetConfigs glad_eglGetConfigs GLAD_API_CALL PFNEGLWAITCLIENTPROC glad_eglWaitClient; #define eglWaitClient glad_eglWaitClient GLAD_API_CALL PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC glad_eglCreatePbufferFromClientBuffer; #define eglCreatePbufferFromClientBuffer glad_eglCreatePbufferFromClientBuffer GLAD_API_CALL int gladLoadEGLUserPtr(EGLDisplay display, GLADuserptrloadfunc load, void *userptr); GLAD_API_CALL int gladLoadEGL(EGLDisplay display, GLADloadfunc load); #ifdef GLAD_EGL GLAD_API_CALL int gladLoaderLoadEGL(EGLDisplay display); GLAD_API_CALL void gladLoaderUnloadEGL(void); #endif #ifdef __cplusplus } #endif #endif ================================================ FILE: ycb_render/glad/glad/gl.h ================================================ /** * Loader generated by glad 0.1.11a0 on Wed Jun 13 07:59:51 2018 * * Generator: C/C++ * Specification: gl * Extensions: 1 * * APIs: * - gl:compatibility=4.6 * * Options: * - LOADER = True * - DEBUG = False * - ALIAS = False * - MX = False * - HEADER_ONLY = False * - MX_GLOBAL = False * * Commandline: * --api='gl:compatibility=4.6' --extensions='GL_ARB_point_sprite' c --loader * * Online: * 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 * */ #ifndef GLAD_GL_H_ #define GLAD_GL_H_ #ifdef __gl_h_ #error OpenGL header already included (API: gl), remove previous include! #endif #define __gl_h_ 1 #define GLAD_GL #define GLAD_OPTION_GL_LOADER #ifdef __cplusplus extern "C" { #endif #ifndef GLAD_PLATFORM_H_ #define GLAD_PLATFORM_H_ #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) #define GLAD_PLATFORM_WIN32 1 #else #define GLAD_PLATFORM_WIN32 0 #endif #ifndef GLAD_PLATFORM_UWP #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) #ifdef __has_include #if __has_include() #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 #endif #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 #endif #endif #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY #include #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) #define GLAD_PLATFORM_UWP 1 #endif #endif #ifndef GLAD_PLATFORM_UWP #define GLAD_PLATFORM_UWP 0 #endif #endif #ifdef __GNUC__ #define GLAD_GNUC_EXTENSION __extension__ #else #define GLAD_GNUC_EXTENSION #endif #ifndef GLAD_API_CALL #if defined(GLAD_API_CALL_EXPORT) #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) #if defined(GLAD_API_CALL_EXPORT_BUILD) #if defined(__GNUC__) #define GLAD_API_CALL __attribute__ ((dllexport)) extern #else #define GLAD_API_CALL __declspec(dllexport) extern #endif #else #if defined(__GNUC__) #define GLAD_API_CALL __attribute__ ((dllimport)) extern #else #define GLAD_API_CALL __declspec(dllimport) extern #endif #endif #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern #else #define GLAD_API_CALL extern #endif #else #define GLAD_API_CALL extern #endif #endif #ifdef APIENTRY #define GLAD_API_PTR APIENTRY #elif GLAD_PLATFORM_WIN32 #define GLAD_API_PTR __stdcall #else #define GLAD_API_PTR #endif #define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor) #define GLAD_VERSION_MAJOR(version) (version / 10000) #define GLAD_VERSION_MINOR(version) (version % 10000) typedef void (*GLADapiproc)(void); typedef GLADapiproc (*GLADloadfunc)(const char *name); typedef GLADapiproc (*GLADuserptrloadfunc)(const char *name, void *userptr); typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); #endif /* GLAD_PLATFORM_H_ */ #define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C #define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 #define GL_PROJECTION_MATRIX 0x0BA7 #define GL_MAP1_GRID_DOMAIN 0x0DD0 #define GL_INT_SAMPLER_1D_ARRAY 0x8DCE #define GL_MAX_ELEMENTS_INDICES 0x80E9 #define GL_TEXTURE_INTENSITY_TYPE 0x8C15 #define GL_TEXTURE31 0x84DF #define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC #define GL_RGBA_MODE 0x0C31 #define GL_ONE_MINUS_SRC_ALPHA 0x0303 #define GL_SAMPLE_COVERAGE_INVERT 0x80AB #define GL_R32UI 0x8236 #define GL_VERTEX_BINDING_BUFFER 0x8F4F #define GL_UNSIGNED_BYTE_3_3_2 0x8032 #define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 #define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING #define GL_QUERY_WAIT 0x8E13 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 #define GL_MINOR_VERSION 0x821C #define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 #define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 #define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB #define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 #define GL_TRIANGLE_STRIP_ADJACENCY 0x000D #define GL_MAX_LABEL_LENGTH 0x82E8 #define GL_TEXTURE_DEPTH_SIZE 0x884A #define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 #define GL_NOOP 0x1505 #define GL_COLOR_MATERIAL 0x0B57 #define GL_RG32UI 0x823C #define GL_READ_WRITE 0x88BA #define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 #define GL_4D_COLOR_TEXTURE 0x0604 #define GL_BUFFER_USAGE 0x8765 #define GL_TEXTURE_GEN_MODE 0x2500 #define GL_T2F_V3F 0x2A27 #define GL_COLOR_ATTACHMENT26 0x8CFA #define GL_INT_SAMPLER_BUFFER 0x8DD0 #define GL_R16F 0x822D #define GL_TEXTURE_BINDING_3D 0x806A #define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 #define GL_DONT_CARE 0x1100 #define GL_STREAM_READ 0x88E1 #define GL_DOUBLE_VEC4 0x8FFE #define GL_FUNC_SUBTRACT 0x800A #define GL_ACCUM_GREEN_BITS 0x0D59 #define GL_S 0x2000 #define GL_POINT_SIZE_RANGE 0x0B12 #define GL_CURRENT_SECONDARY_COLOR 0x8459 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 #define GL_DEPTH_RENDERABLE 0x8287 #define GL_FOG_COORDINATE 0x8451 #define GL_REPLACE 0x1E01 #define GL_SAMPLE_SHADING 0x8C36 #define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC #define GL_MAX_RENDERBUFFER_SIZE 0x84E8 #define GL_SEPARATE_SPECULAR_COLOR 0x81FA #define GL_LEQUAL 0x0203 #define GL_INDEX_ARRAY_POINTER 0x8091 #define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF #define GL_OPERAND0_ALPHA 0x8598 #define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A #define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 #define GL_LUMINANCE16 0x8042 #define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 #define GL_DEBUG_TYPE_POP_GROUP 0x826A #define GL_SHADER_STORAGE_BUFFER 0x90D2 #define GL_INDEX_ARRAY_TYPE 0x8085 #define GL_SCISSOR_BOX 0x0C10 #define GL_IMAGE_CLASS_2_X_16 0x82BD #define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF #define GL_OR 0x1507 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A #define GL_GREATER 0x0204 #define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A #define GL_VERTEX_BINDING_OFFSET 0x82D7 #define GL_LIGHT_MODEL_AMBIENT 0x0B53 #define GL_CW 0x0900 #define GL_CONSTANT 0x8576 #define GL_VIEW_CLASS_8_BITS 0x82CB #define GL_ALWAYS 0x0207 #define GL_RENDERBUFFER_BINDING 0x8CA7 #define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 #define GL_PIXEL_MAP_I_TO_G 0x0C73 #define GL_COMPARE_R_TO_TEXTURE 0x884E #define GL_LUMINANCE16_ALPHA16 0x8048 #define GL_INT_IMAGE_2D_RECT 0x905A #define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 #define GL_DEPTH_FUNC 0x0B74 #define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 #define GL_COMPRESSED_SLUMINANCE 0x8C4A #define GL_TEXTURE24 0x84D8 #define GL_PACK_LSB_FIRST 0x0D01 #define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 #define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 #define GL_COLOR_WRITEMASK 0x0C23 #define GL_UNIFORM_BUFFER_START 0x8A29 #define GL_CLEAR 0x1500 #define GL_UNIFORM_BLOCK_INDEX 0x8A3A #define GL_VERTEX_TEXTURE 0x829B #define GL_TEXTURE_WRAP_T 0x2803 #define GL_T2F_C4F_N3F_V3F 0x2A2C #define GL_LUMINANCE4_ALPHA4 0x8043 #define GL_SAMPLER_2D 0x8B5E #define GL_MAX_VARYING_COMPONENTS MAX_VARYING_FLOATS #define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B #define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 #define GL_GEOMETRY_SHADER_BIT 0x00000004 #define GL_DRAW_BUFFER7 0x882C #define GL_IMAGE_CLASS_4_X_8 0x82BF #define GL_POINT_SPRITE 0x8861 #define GL_SOURCE1_RGB 0x8581 #define GL_RGB 0x1907 #define GL_RG16 0x822C #define GL_VIEWPORT_BIT 0x00000800 #define GL_VERSION 0x1F02 #define GL_SAMPLE_COVERAGE 0x80A0 #define GL_INT_SAMPLER_2D_RECT 0x8DCD #define GL_RGB10_A2 0x8059 #define GL_TESS_CONTROL_TEXTURE 0x829C #define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 #define GL_TEXTURE_GREEN_SIZE 0x805D #define GL_TEXTURE2 0x84C2 #define GL_NEGATIVE_ONE_TO_ONE 0x935E #define GL_QUADRATIC_ATTENUATION 0x1209 #define GL_CLAMP_VERTEX_COLOR 0x891A #define GL_SAMPLES 0x80A9 #define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 #define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 #define GL_CLEAR_TEXTURE 0x9365 #define GL_MAX_NAME_LENGTH 0x92F6 #define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 #define GL_POLYGON_OFFSET_FILL 0x8037 #define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 #define GL_DEBUG_SOURCE_API 0x8246 #define GL_INDEX_SHIFT 0x0D12 #define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB #define GL_SHADER 0x82E1 #define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F #define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 #define GL_PROVOKING_VERTEX 0x8E4F #define GL_DEPTH_COMPONENT32F 0x8CAC #define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 #define GL_MODULATE 0x2100 #define GL_POLYGON_OFFSET_CLAMP 0x8E1B #define GL_FOG_COORDINATE_SOURCE 0x8450 #define GL_FRAMEBUFFER_COMPLETE 0x8CD5 #define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 #define GL_SAMPLER_2D_SHADOW 0x8B62 #define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 #define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D #define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD #define GL_DEBUG_TYPE_ERROR 0x824C #define GL_DOUBLEBUFFER 0x0C32 #define GL_SYNC_FLAGS 0x9115 #define GL_SAMPLER_2D_MULTISAMPLE 0x9108 #define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 #define GL_AMBIENT 0x1200 #define GL_SRC0_RGB GL_SOURCE0_RGB #define GL_EXP 0x0800 #define GL_FIXED 0x140C #define GL_NOTEQUAL 0x0205 #define GL_VIEW_CLASS_48_BITS 0x82C7 #define GL_DEPTH_STENCIL 0x84F9 #define GL_UNIFORM_TYPE 0x8A37 #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D #define GL_RGBA32F 0x8814 #define GL_MAX_NAME_STACK_DEPTH 0x0D37 #define GL_BUFFER_MAP_OFFSET 0x9121 #define GL_FOG_HINT 0x0C54 #define GL_UNPACK_ALIGNMENT 0x0CF5 #define GL_COLOR_LOGIC_OP 0x0BF2 #define GL_VERTICES_SUBMITTED 0x82EE #define GL_STENCIL_INDEX4 0x8D47 #define GL_PIXEL_MAP_G_TO_G 0x0C77 #define GL_TEXTURE_1D 0x0DE0 #define GL_NO_ERROR 0 #define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 #define GL_INTERLEAVED_ATTRIBS 0x8C8C #define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C #define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B #define GL_TRANSFORM_FEEDBACK 0x8E22 #define GL_CLIP_DEPTH_MODE 0x935D #define GL_TEXTURE_SHARED_SIZE 0x8C3F #define GL_MAX 0x8008 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 #define GL_RENDER_MODE 0x0C40 #define GL_COLOR_ATTACHMENT12 0x8CEC #define GL_LIST_BIT 0x00020000 #define GL_DOT3_RGB 0x86AE #define GL_RG16I 0x8239 #define GL_T2F_C4UB_V3F 0x2A29 #define GL_INTERNALFORMAT_RED_SIZE 0x8271 #define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 #define GL_R11F_G11F_B10F 0x8C3A #define GL_TEXTURE27 0x84DB #define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B #define GL_COEFF 0x0A00 #define GL_MAP2_VERTEX_3 0x0DB7 #define GL_QUERY 0x82E3 #define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4 #define GL_ALPHA_BITS 0x0D55 #define GL_CURRENT_FOG_COORDINATE 0x8453 #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 #define GL_SAMPLE_MASK_VALUE 0x8E52 #define GL_LINEAR_MIPMAP_LINEAR 0x2703 #define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 #define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC #define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F #define GL_MAX_CULL_DISTANCES 0x82F9 #define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C #define GL_FLOAT_MAT2x4 0x8B66 #define GL_FLOAT_VEC3 0x8B51 #define GL_RENDERBUFFER 0x8D41 #define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 #define GL_SPIR_V_EXTENSIONS 0x9553 #define GL_TEXTURE_COMPRESSION_HINT 0x84EF #define GL_TEXTURE4 0x84C4 #define GL_VERTEX_ARRAY_POINTER 0x808E #define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 #define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB #define GL_COLOR_ATTACHMENT16 0x8CF0 #define GL_ADD_SIGNED 0x8574 #define GL_RENDERER 0x1F01 #define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 #define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B #define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3 #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C #define GL_TESS_CONTROL_SHADER_BIT 0x00000008 #define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD #define GL_FILL 0x1B02 #define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 #define GL_INDEX_LOGIC_OP 0x0BF1 #define GL_IMAGE_CLASS_1_X_8 0x82C1 #define GL_RGB5_A1 0x8057 #define GL_STENCIL_INDEX 0x1901 #define GL_INT_IMAGE_2D 0x9058 #define GL_FRAMEBUFFER_UNDEFINED 0x8219 #define GL_ACCUM_RED_BITS 0x0D58 #define GL_POLYGON_OFFSET_POINT 0x2A01 #define GL_MAX_3D_TEXTURE_SIZE 0x8073 #define GL_ZOOM_Y 0x0D17 #define GL_DEBUG_SEVERITY_HIGH 0x9146 #define GL_R16 0x822A #define GL_SCISSOR_TEST 0x0C11 #define GL_RGB10_A2UI 0x906F #define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 #define GL_FOG_BIT 0x00000080 #define GL_GEOMETRY_TEXTURE 0x829E #define GL_UNIFORM_BLOCK 0x92E2 #define GL_INT_SAMPLER_CUBE 0x8DCC #define GL_PACK_SKIP_PIXELS 0x0D04 #define GL_TEXTURE_SHADOW 0x82A1 #define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC #define GL_RED_BITS 0x0D52 #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F #define GL_COLOR_ATTACHMENT6 0x8CE6 #define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 #define GL_COLOR_INDEXES 0x1603 #define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 #define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 #define GL_TEXTURE_WRAP_R 0x8072 #define GL_TESS_GEN_SPACING 0x8E77 #define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 #define GL_INTENSITY16 0x804D #define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 #define GL_COLOR_ATTACHMENT2 0x8CE2 #define GL_WRITE_ONLY 0x88B9 #define GL_GREEN_INTEGER 0x8D95 #define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 #define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 #define GL_R8UI 0x8232 #define GL_DRAW_BUFFER1 0x8826 #define GL_PIXEL_MAP_I_TO_B 0x0C74 #define GL_MEDIUM_INT 0x8DF4 #define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 #define GL_IMAGE_BINDING_LAYERED 0x8F3C #define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 #define GL_RED_BIAS 0x0D15 #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C #define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 #define GL_FLOAT 0x1406 #define GL_MAP_WRITE_BIT 0x0002 #define GL_CONDITION_SATISFIED 0x911C #define GL_NUM_ACTIVE_VARIABLES 0x9304 #define GL_PROGRAM_PIPELINE_BINDING 0x825A #define GL_OBJECT_PLANE 0x2501 #define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 #define GL_TEXTURE_ALPHA_SIZE 0x805F #define GL_COMPRESSED_LUMINANCE 0x84EA #define GL_FLOAT_MAT4x2 0x8B69 #define GL_COLOR_ATTACHMENT19 0x8CF3 #define GL_RGBA8I 0x8D8E #define GL_GEOMETRY_SUBROUTINE 0x92EB #define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE #define GL_FEEDBACK 0x1C01 #define GL_POLYGON_BIT 0x00000008 #define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 #define GL_ALPHA12 0x803D #define GL_TEXTURE_COMPRESSED 0x86A1 #define GL_FRAMEBUFFER_BINDING 0x8CA6 #define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B #define GL_TEXTURE1 0x84C1 #define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 #define GL_DOUBLE_MAT3x2 0x8F4B #define GL_ONE_MINUS_DST_ALPHA 0x0305 #define GL_CULL_FACE_MODE 0x0B45 #define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 #define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 #define GL_COLOR_RENDERABLE 0x8286 #define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD #define GL_T2F_N3F_V3F 0x2A2B #define GL_TEXTURE_DEPTH 0x8071 #define GL_DEPTH_COMPONENT16 0x81A5 #define GL_STENCIL_BACK_FAIL 0x8801 #define GL_COMPRESSED_RG_RGTC2 0x8DBD #define GL_ATTACHED_SHADERS 0x8B85 #define GL_TEXTURE_IMAGE_FORMAT 0x828F #define GL_TEXTURE_GATHER 0x82A2 #define GL_LOAD 0x0101 #define GL_DEPTH32F_STENCIL8 0x8CAD #define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 #define GL_ACTIVE_TEXTURE 0x84E0 #define GL_TEXTURE_BORDER 0x1005 #define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 #define GL_MAX_LIGHTS 0x0D31 #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B #define GL_V3F 0x2A21 #define GL_TESS_EVALUATION_TEXTURE 0x829D #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 #define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 #define GL_INTERNALFORMAT_PREFERRED 0x8270 #define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 #define GL_FRAGMENT_TEXTURE 0x829F #define GL_IMAGE_TEXEL_SIZE 0x82A7 #define GL_POINT_DISTANCE_ATTENUATION 0x8129 #define GL_RGB32I 0x8D83 #define GL_INT_VEC4 0x8B55 #define GL_FRONT 0x0404 #define GL_TEXTURE18 0x84D2 #define GL_DRAW_BUFFER9 0x882E #define GL_SHADER_COMPILER 0x8DFA #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F #define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E #define GL_INT_SAMPLER_3D 0x8DCB #define GL_RGBA16 0x805B #define GL_2D 0x0600 #define GL_FRONT_LEFT 0x0400 #define GL_UNPACK_LSB_FIRST 0x0CF1 #define GL_EQUIV 0x1509 #define GL_LIGHTING_BIT 0x00000040 #define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 #define GL_INVALID_OPERATION 0x0502 #define GL_TEXTURE25 0x84D9 #define GL_POINT_SIZE_MAX 0x8127 #define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES #define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 #define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC #define GL_SPHERE_MAP 0x2402 #define GL_RG32F 0x8230 #define GL_QUERY_NO_WAIT 0x8E14 #define GL_POINT_SIZE_MIN 0x8126 #define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB #define GL_RG8I 0x8237 #define GL_FRAGMENT_SHADER_BIT 0x00000002 #define GL_MAP2_NORMAL 0x0DB2 #define GL_TEXTURE_BLUE_SIZE 0x805E #define GL_UNSIGNED_INT_VEC4 0x8DC8 #define GL_INT_VEC3 0x8B54 #define GL_COPY_READ_BUFFER_BINDING GL_COPY_READ_BUFFER #define GL_CLIP_DISTANCE6 0x3006 #define GL_TEXTURE_SWIZZLE_B 0x8E44 #define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7 #define GL_DOUBLE_MAT2x3 0x8F49 #define GL_COLOR_ARRAY 0x8076 #define GL_DEPTH_WRITEMASK 0x0B72 #define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 #define GL_COLOR_ARRAY_STRIDE 0x8083 #define GL_PARAMETER_BUFFER 0x80EE #define GL_LINE_BIT 0x00000004 #define GL_IS_PER_PATCH 0x92E7 #define GL_DEBUG_CALLBACK_FUNCTION 0x8244 #define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 #define GL_UNSIGNED_SHORT 0x1403 #define GL_R 0x2002 #define GL_COLOR_ATTACHMENT18 0x8CF2 #define GL_IMAGE_BINDING_LEVEL 0x8F3B #define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 #define GL_TEXTURE_BORDER_COLOR 0x1004 #define GL_COLOR_SUM 0x8458 #define GL_DRAW_BUFFER5 0x882A #define GL_FRAMEBUFFER_DEFAULT 0x8218 #define GL_MAX_TEXTURE_UNITS 0x84E2 #define GL_COLOR_MATERIAL_FACE 0x0B55 #define GL_LIGHT4 0x4004 #define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD #define GL_BUFFER_MAPPED 0x88BC #define GL_DISPLAY_LIST 0x82E7 #define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 #define GL_BITMAP 0x1A00 #define GL_T2F_C3F_V3F 0x2A2A #define GL_COLOR_ATTACHMENT20 0x8CF4 #define GL_INVALID_VALUE 0x0501 #define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE #define GL_PROGRAM_SEPARABLE 0x8258 #define GL_BACK 0x0405 #define GL_TESS_GEN_VERTEX_ORDER 0x8E78 #define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 #define GL_FOG 0x0B60 #define GL_LOW_INT 0x8DF3 #define GL_ARRAY_BUFFER 0x8892 #define GL_COLOR_ARRAY_TYPE 0x8082 #define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A #define GL_COMPILE_STATUS 0x8B81 #define GL_STENCIL_INDEX16 0x8D49 #define GL_VIEW_CLASS_32_BITS 0x82C8 #define GL_R3_G3_B2 0x2A10 #define GL_QUERY_TARGET 0x82EA #define GL_CLIP_ORIGIN 0x935C #define GL_DRAW_BUFFER12 0x8831 #define GL_ONE_MINUS_SRC1_COLOR 0x88FA #define GL_TEXTURE30 0x84DE #define GL_STATIC_READ 0x88E5 #define GL_RGB565 0x8D62 #define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 #define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A #define GL_MANUAL_GENERATE_MIPMAP 0x8294 #define GL_PRIMITIVES_GENERATED 0x8C87 #define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 #define GL_ALL_BARRIER_BITS 0xFFFFFFFF #define GL_CONSTANT_ALPHA 0x8003 #define GL_RGB16_SNORM 0x8F9A #define GL_INVERT 0x150A #define GL_BLOCK_INDEX 0x92FD #define GL_MAX_VIEWPORT_DIMS 0x0D3A #define GL_TEXTURE11 0x84CB #define GL_RG 0x8227 #define GL_BUFFER_SIZE 0x8764 #define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 #define GL_GUILTY_CONTEXT_RESET 0x8253 #define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 #define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 #define GL_TEXTURE21 0x84D5 #define GL_HIGH_INT 0x8DF5 #define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5 #define GL_LESS 0x0201 #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 #define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B #define GL_AUX_BUFFERS 0x0C00 #define GL_TEXTURE_INTENSITY_SIZE 0x8061 #define GL_ACCUM_BLUE_BITS 0x0D5A #define GL_ACTIVE_ATTRIBUTES 0x8B89 #define GL_SAMPLE_MASK 0x8E51 #define GL_MAP1_INDEX 0x0D91 #define GL_UNSIGNED_INT_IMAGE_1D 0x9062 #define GL_UNPACK_SKIP_IMAGES 0x806D #define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD #define GL_BOOL_VEC3 0x8B58 #define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 #define GL_MULTISAMPLE 0x809D #define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 #define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 #define GL_LIGHT5 0x4005 #define GL_LOSE_CONTEXT_ON_RESET 0x8252 #define GL_QUERY_WAIT_INVERTED 0x8E17 #define GL_DEPTH24_STENCIL8 0x88F0 #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D #define GL_FOG_END 0x0B64 #define GL_MAX_COMBINED_DIMENSIONS 0x8282 #define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 #define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A #define GL_FLOAT_VEC2 0x8B50 #define GL_STEREO 0x0C33 #define GL_READ_PIXELS_FORMAT 0x828D #define GL_SAMPLE_POSITION 0x8E50 #define GL_DOUBLE_MAT4x3 0x8F4E #define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C #define GL_NEAREST_MIPMAP_LINEAR 0x2702 #define GL_SMOOTH 0x1D01 #define GL_BUFFER_ACCESS_FLAGS 0x911F #define GL_TEXTURE_COMPONENTS 0x1003 #define GL_CLIP_DISTANCE7 0x3007 #define GL_LUMINANCE_ALPHA 0x190A #define GL_TEXTURE_CUBE_MAP 0x8513 #define GL_NORMALIZE 0x0BA1 #define GL_SOURCE1_ALPHA 0x8589 #define GL_INT_SAMPLER_2D 0x8DCA #define GL_RGBA2 0x8055 #define GL_TEXTURE_BUFFER 0x8C2A #define GL_TEXTURE_LUMINANCE_SIZE 0x8060 #define GL_ARRAY_BUFFER_BINDING 0x8894 #define GL_OPERAND1_RGB 0x8591 #define GL_C4UB_V3F 0x2A23 #define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 #define GL_SAMPLE_BUFFERS 0x80A8 #define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 #define GL_ONE_MINUS_SRC_COLOR 0x0301 #define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE #define GL_MAX_TEXTURE_LOD_BIAS 0x84FD #define GL_INT_IMAGE_3D 0x9059 #define GL_BLEND_DST_RGB 0x80C8 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 #define GL_SHADER_STORAGE_BUFFER_START 0x90D4 #define GL_MAP2_GRID_SEGMENTS 0x0DD3 #define GL_NUM_SPIR_V_EXTENSIONS 0x9554 #define GL_COLOR_MATERIAL_PARAMETER 0x0B56 #define GL_SIGNALED 0x9119 #define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 #define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A #define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 #define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA #define GL_COPY_INVERTED 0x150C #define GL_STENCIL_COMPONENTS 0x8285 #define GL_PIXEL_MAP_I_TO_I 0x0C70 #define GL_COMPRESSED_RGB 0x84ED #define GL_BYTE 0x1400 #define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 #define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E #define GL_COMBINE_RGB 0x8571 #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F #define GL_UNIFORM_MATRIX_STRIDE 0x8A3D #define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C #define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 #define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 #define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE #define GL_DISPATCH_INDIRECT_BUFFER 0x90EE #define GL_BUFFER_ACCESS 0x88BB #define GL_STACK_UNDERFLOW 0x0504 #define GL_SUBTRACT 0x84E7 #define GL_QUERY_BUFFER_BINDING 0x9193 #define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC #define GL_PARAMETER_BUFFER_BINDING 0x80EF #define GL_STENCIL_FUNC 0x0B92 #define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 #define GL_MAP1_TEXTURE_COORD_4 0x0D96 #define GL_SMOOTH_POINT_SIZE_RANGE GL_POINT_SIZE_RANGE #define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A #define GL_ALPHA_INTEGER 0x8D97 #define GL_SPOT_CUTOFF 0x1206 #define GL_PATCHES 0x000E #define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF #define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C #define GL_RGB8I 0x8D8F #define GL_PROGRAM_PIPELINE 0x82E4 #define GL_SHADER_IMAGE_LOAD 0x82A4 #define GL_STATIC_DRAW 0x88E4 #define GL_EQUAL 0x0202 #define GL_SRGB 0x8C40 #define GL_Q 0x2003 #define GL_DRAW_BUFFER2 0x8827 #define GL_TEXTURE_GREEN_TYPE 0x8C11 #define GL_COMBINE 0x8570 #define GL_READ_BUFFER 0x0C02 #define GL_TEXTURE_BUFFER_OFFSET 0x919D #define GL_SHADING_LANGUAGE_VERSION 0x8B8C #define GL_CONTEXT_PROFILE_MASK 0x9126 #define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 #define GL_TEXTURE_BLUE_TYPE 0x8C12 #define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 #define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF #define GL_TEXTURE16 0x84D0 #define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 #define GL_ALPHA_TEST 0x0BC0 #define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 #define GL_COLOR_ATTACHMENT4 0x8CE4 #define GL_COLOR_ATTACHMENT28 0x8CFC #define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 #define GL_MEDIUM_FLOAT 0x8DF1 #define GL_COMPRESSED_SRGB 0x8C48 #define GL_PIXEL_MODE_BIT 0x00000020 #define GL_SMOOTH_LINE_WIDTH_GRANULARITY GL_LINE_WIDTH_GRANULARITY #define GL_4_BYTES 0x1409 #define GL_COMPRESSED_SRGB8_ETC2 0x9275 #define GL_IMAGE_CLASS_2_X_8 0x82C0 #define GL_POLYGON_STIPPLE_BIT 0x00000010 #define GL_CURRENT_PROGRAM 0x8B8D #define GL_STACK_OVERFLOW 0x0503 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 #define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F #define GL_BLUE_BITS 0x0D54 #define GL_SAMPLER_CUBE 0x8B60 #define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 #define GL_TRANSFORM_BIT 0x00001000 #define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E #define GL_INNOCENT_CONTEXT_RESET 0x8254 #define GL_COMPRESSED_RG 0x8226 #define GL_UNSIGNED_SHORT_5_6_5 0x8363 #define GL_FLOAT_MAT4 0x8B5C #define GL_RGB_INTEGER 0x8D98 #define GL_TRUE 1 #define GL_COLOR_ATTACHMENT21 0x8CF5 #define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 #define GL_RENDERBUFFER_RED_SIZE 0x8D50 #define GL_LEFT 0x0406 #define GL_MAP1_VERTEX_4 0x0D98 #define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 #define GL_INTENSITY4 0x804A #define GL_CURRENT_QUERY 0x8865 #define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE #define GL_QUERY_RESULT 0x8866 #define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 #define GL_UNIFORM_BUFFER_SIZE 0x8A2A #define GL_DEBUG_TYPE_PORTABILITY 0x824F #define GL_COMBINE_ALPHA 0x8572 #define GL_CURRENT_INDEX 0x0B01 #define GL_TEXTURE_COMPARE_MODE 0x884C #define GL_GENERATE_MIPMAP 0x8191 #define GL_LOW_FLOAT 0x8DF0 #define GL_MAP2_TEXTURE_COORD_3 0x0DB5 #define GL_UNSIGNED_INT_IMAGE_2D 0x9063 #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 #define GL_LOGIC_OP 0x0BF1 #define GL_BUFFER_VARIABLE 0x92E5 #define GL_NOR 0x1508 #define GL_STREAM_COPY 0x88E2 #define GL_SELECTION_BUFFER_POINTER 0x0DF3 #define GL_IMAGE_CLASS_4_X_16 0x82BC #define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 #define GL_COMPILE_AND_EXECUTE 0x1301 #define GL_VIEWPORT_SUBPIXEL_BITS 0x825C #define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B #define GL_ALPHA4 0x803B #define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 #define GL_CCW 0x0901 #define GL_FLOAT_MAT2x3 0x8B65 #define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 #define GL_DRAW_BUFFER13 0x8832 #define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 #define GL_UPPER_LEFT 0x8CA2 #define GL_COMPRESSED_ALPHA 0x84E9 #define GL_SIGNED_NORMALIZED 0x8F9C #define GL_MAX_VERTEX_STREAMS 0x8E71 #define GL_PRIMARY_COLOR 0x8577 #define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 #define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A #define GL_MAP2_VERTEX_4 0x0DB8 #define GL_FRONT_AND_BACK 0x0408 #define GL_DEBUG_TYPE_PERFORMANCE 0x8250 #define GL_ALPHA8 0x803C #define GL_IMAGE_PIXEL_TYPE 0x82AA #define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 #define GL_UNSIGNED_INT_10_10_10_2 0x8036 #define GL_EXP2 0x0801 #define GL_TEXTURE_GEN_S 0x0C60 #define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F #define GL_VIEW_CLASS_128_BITS 0x82C4 #define GL_ATOMIC_COUNTER_BUFFER 0x92C0 #define GL_LINE_RESET_TOKEN 0x0707 #define GL_CLAMP 0x2900 #define GL_PIXEL_UNPACK_BUFFER 0x88EC #define GL_RGB16UI 0x8D77 #define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 #define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 #define GL_FRAMEBUFFER_RENDERABLE 0x8289 #define GL_DIFFUSE 0x1201 #define GL_DEPTH_BIAS 0x0D1F #define GL_IMAGE_PIXEL_FORMAT 0x82A9 #define GL_FLOAT_MAT3x2 0x8B67 #define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 #define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 #define GL_FRONT_RIGHT 0x0401 #define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 #define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 #define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 #define GL_DEPTH_BITS 0x0D56 #define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 #define GL_SOURCE2_ALPHA 0x858A #define GL_AND_INVERTED 0x1504 #define GL_IMAGE_BINDING_FORMAT 0x906E #define GL_RGB8_SNORM 0x8F96 #define GL_BOOL_VEC2 0x8B57 #define GL_SAMPLER_2D_ARRAY 0x8DC1 #define GL_UNIFORM_BLOCK_BINDING 0x8A3F #define GL_VIEW_CLASS_96_BITS 0x82C5 #define GL_DEPTH_TEST 0x0B71 #define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 #define GL_SAMPLE_ALPHA_TO_ONE 0x809F #define GL_POLYGON 0x0009 #define GL_BOOL_VEC4 0x8B59 #define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 #define GL_FRACTIONAL_ODD 0x8E7B #define GL_UNIFORM 0x92E1 #define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 #define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 #define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 #define GL_ALPHA_BIAS 0x0D1D #define GL_POINT_TOKEN 0x0701 #define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 #define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 #define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD #define GL_FLOAT_MAT3 0x8B5B #define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 #define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA #define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F #define GL_NICEST 0x1102 #define GL_C3F_V3F 0x2A24 #define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B #define GL_BACK_LEFT 0x0402 #define GL_SOURCE0_RGB 0x8580 #define GL_ACTIVE_PROGRAM 0x8259 #define GL_INT_SAMPLER_2D_ARRAY 0x8DCF #define GL_STENCIL_REF 0x0B97 #define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 #define GL_DRAW_BUFFER3 0x8828 #define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE #define GL_UNIFORM_ARRAY_STRIDE 0x8A3C #define GL_BLEND_EQUATION_RGB 0x8009 #define GL_LUMINANCE 0x1909 #define GL_COMPRESSED_INTENSITY 0x84EC #define GL_LUMINANCE12 0x8041 #define GL_PACK_SKIP_IMAGES 0x806B #define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 #define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC #define GL_COLOR_ATTACHMENT17 0x8CF1 #define GL_TEXTURE_GEN_R 0x0C62 #define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C #define GL_HALF_FLOAT 0x140B #define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 #define GL_AND_REVERSE 0x1502 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 #define GL_PIXEL_PACK_BUFFER 0x88EB #define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F #define GL_INT_VEC2 0x8B53 #define GL_INDEX_OFFSET 0x0D13 #define GL_SAMPLER_1D_ARRAY 0x8DC0 #define GL_TEXTURE20 0x84D4 #define GL_LOGIC_OP_MODE 0x0BF0 #define GL_ZERO 0 #define GL_UNIFORM_BUFFER_BINDING 0x8A28 #define GL_SCISSOR_BIT 0x00080000 #define GL_TEXTURE_PRIORITY 0x8066 #define GL_DRAW_BUFFER11 0x8830 #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB #define GL_COLOR_ATTACHMENT23 0x8CF7 #define GL_NAME_STACK_DEPTH 0x0D70 #define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 #define GL_COLOR_ATTACHMENT30 0x8CFE #define GL_FOG_COORD GL_FOG_COORDINATE #define GL_IMAGE_CLASS_10_10_10_2 0x82C3 #define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC #define GL_COMMAND_BARRIER_BIT 0x00000040 #define GL_LUMINANCE4 0x803F #define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 #define GL_DEPTH_COMPONENTS 0x8284 #define GL_BGR 0x80E0 #define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED #define GL_LINE_STIPPLE 0x0B24 #define GL_COLOR_COMPONENTS 0x8283 #define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 #define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 #define GL_UNSIGNED_INT_8_8_8_8 0x8035 #define GL_XOR 0x1506 #define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E #define GL_MATRIX_MODE 0x0BA0 #define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 #define GL_INDEX_MODE 0x0C30 #define GL_MAX_VERTEX_ATTRIBS 0x8869 #define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 #define GL_NORMAL_ARRAY 0x8075 #define GL_PACK_ROW_LENGTH 0x0D02 #define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C #define GL_INDEX_WRITEMASK 0x0C21 #define GL_COLOR_ATTACHMENT0 0x8CE0 #define GL_RENDERBUFFER_HEIGHT 0x8D43 #define GL_FLOAT_MAT2 0x8B5A #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D #define GL_TEXTURE23 0x84D7 #define GL_MAX_SAMPLES 0x8D57 #define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 #define GL_AUX3 0x040C #define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 #define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 #define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF #define GL_DOUBLE_MAT2 0x8F46 #define GL_RESET_NOTIFICATION_STRATEGY 0x8256 #define GL_INDEX_CLEAR_VALUE 0x0C20 #define GL_MAX_PATCH_VERTICES 0x8E7D #define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 #define GL_COLOR_ATTACHMENT1 0x8CE1 #define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 #define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 #define GL_RGB9_E5 0x8C3D #define GL_MAX_ELEMENT_INDEX 0x8D6B #define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008 #define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 #define GL_MAP2_INDEX 0x0DB1 #define GL_TEXTURE5 0x84C5 #define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 #define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 #define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 #define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF #define GL_ONE 1 #define GL_LINE_WIDTH 0x0B21 #define GL_DRAW_INDIRECT_BUFFER 0x8F3F #define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS #define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB #define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 #define GL_DOUBLE_MAT2x4 0x8F4A #define GL_LINES_ADJACENCY 0x000A #define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 #define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 #define GL_PACK_SWAP_BYTES 0x0D00 #define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF #define GL_NORMAL_ARRAY_POINTER 0x808F #define GL_IMAGE_CLASS_11_11_10 0x82C2 #define GL_MULT 0x0103 #define GL_R16I 0x8233 #define GL_ALPHA 0x1906 #define GL_FUNC_REVERSE_SUBTRACT 0x800B #define GL_3D_COLOR 0x0602 #define GL_PROJECTION 0x1701 #define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 #define GL_NAME_LENGTH 0x92F9 #define GL_TEXTURE_DEPTH_TYPE 0x8C16 #define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 #define GL_TEXTURE_IMAGE_TYPE 0x8290 #define GL_FUNC_ADD 0x8006 #define GL_STENCIL_INDEX1 0x8D46 #define GL_SHADER_BINARY_FORMATS 0x8DF8 #define GL_RGB16I 0x8D89 #define GL_AUTO_NORMAL 0x0D80 #define GL_SYNC_FENCE 0x9116 #define GL_COLOR_ENCODING 0x8296 #define GL_GREEN_SCALE 0x0D18 #define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F #define GL_TEXTURE7 0x84C7 #define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 #define GL_DEBUG_SOURCE_OTHER 0x824B #define GL_GEOMETRY_SHADER 0x8DD9 #define GL_OR_REVERSE 0x150B #define GL_MAP1_VERTEX_3 0x0D97 #define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 #define GL_TEXTURE_SAMPLES 0x9106 #define GL_MAX_CLIP_PLANES 0x0D32 #define GL_COLOR_ATTACHMENT15 0x8CEF #define GL_PIXEL_MAP_R_TO_R 0x0C76 #define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 #define GL_SRC2_RGB GL_SOURCE2_RGB #define GL_PIXEL_MAP_S_TO_S 0x0C71 #define GL_SAMPLER_BINDING 0x8919 #define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD #define GL_PRIMITIVE_RESTART 0x8F9D #define GL_MAX_IMAGE_UNITS 0x8F38 #define GL_LIGHT0 0x4000 #define GL_BGRA 0x80E1 #define GL_FOG_INDEX 0x0B61 #define GL_VERTEX_SUBROUTINE 0x92E8 #define GL_SELECT 0x1C02 #define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 #define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 #define GL_POINT_SPRITE_ARB 0x8861 #define GL_SPOT_DIRECTION 0x1204 #define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 #define GL_CLIP_PLANE0 0x3000 #define GL_FULL_SUPPORT 0x82B7 #define GL_OPERAND0_RGB 0x8590 #define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 #define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 #define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 #define GL_VIEW_CLASS_64_BITS 0x82C6 #define GL_VIEW_CLASS_16_BITS 0x82CA #define GL_BLEND_EQUATION 0x8009 #define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C #define GL_OPERAND2_RGB 0x8592 #define GL_MAJOR_VERSION 0x821B #define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 #define GL_COMPRESSED_RED_RGTC1 0x8DBB #define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 #define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A #define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 #define GL_MIRRORED_REPEAT 0x8370 #define GL_BUFFER_MAP_LENGTH 0x9120 #define GL_BLEND_SRC 0x0BE1 #define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 #define GL_MAX_HEIGHT 0x827F #define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D #define GL_BUFFER_DATA_SIZE 0x9303 #define GL_BLUE_INTEGER 0x8D96 #define GL_TRIANGLES 0x0004 #define GL_UNKNOWN_CONTEXT_RESET 0x8255 #define GL_IMAGE_BUFFER 0x9051 #define GL_FILTER 0x829A #define GL_RGBA12 0x805A #define GL_BLEND 0x0BE2 #define GL_RGB8UI 0x8D7D #define GL_MAX_VARYING_VECTORS 0x8DFC #define GL_COLOR_ATTACHMENT3 0x8CE3 #define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E #define GL_FLOAT_VEC4 0x8B52 #define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 #define GL_SAMPLER_1D 0x8B5D #define GL_MAP1_COLOR_4 0x0D90 #define GL_TEXTURE_BIT 0x00040000 #define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 #define GL_SRC2_ALPHA GL_SOURCE2_ALPHA #define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 #define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 #define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E #define GL_STENCIL_BACK_FUNC 0x8800 #define GL_INFO_LOG_LENGTH 0x8B84 #define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A #define GL_SPOT_EXPONENT 0x1205 #define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 #define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 #define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 #define GL_LINE_WIDTH_RANGE 0x0B22 #define GL_PROGRAM_BINARY_FORMATS 0x87FF #define GL_UNPACK_SKIP_PIXELS 0x0CF4 #define GL_MAP_COHERENT_BIT 0x0080 #define GL_IMAGE_BINDING_LAYER 0x8F3D #define GL_FRAMEBUFFER_BLEND 0x828B #define GL_RGB10 0x8052 #define GL_POLYGON_OFFSET_LINE 0x2A02 #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 #define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 #define GL_R16_SNORM 0x8F98 #define GL_FRAGMENT_SHADER 0x8B30 #define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 #define GL_EDGE_FLAG 0x0B43 #define GL_TEXTURE_GATHER_SHADOW 0x82A3 #define GL_INT_IMAGE_BUFFER 0x905C #define GL_LOCATION 0x930E #define GL_SYNC_STATUS 0x9114 #define GL_MODELVIEW_STACK_DEPTH 0x0BA3 #define GL_PROGRAM_INPUT 0x92E3 #define GL_STENCIL_RENDERABLE 0x8288 #define GL_MAP_STENCIL 0x0D11 #define GL_LIGHT7 0x4007 #define GL_LAST_VERTEX_CONVENTION 0x8E4E #define GL_TEXTURE13 0x84CD #define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 #define GL_ACCUM 0x0100 #define GL_INT_2_10_10_10_REV 0x8D9F #define GL_TESS_EVALUATION_SUBROUTINE 0x92EA #define GL_2_BYTES 0x1407 #define GL_REFLECTION_MAP 0x8512 #define GL_GREEN 0x1904 #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E #define GL_RGB4 0x804F #define GL_SLUMINANCE8 0x8C47 #define GL_TRIANGLE_STRIP 0x0005 #define GL_INTERNALFORMAT_SUPPORTED 0x826F #define GL_TIME_ELAPSED 0x88BF #define GL_SEPARATE_ATTRIBS 0x8C8D #define GL_COLOR_INDEX 0x1900 #define GL_COLOR_ARRAY_POINTER 0x8090 #define GL_COMPRESSED_R11_EAC 0x9270 #define GL_CLAMP_READ_COLOR 0x891C #define GL_COPY_PIXEL_TOKEN 0x0706 #define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 #define GL_DEPTH 0x1801 #define GL_SLUMINANCE8_ALPHA8 0x8C45 #define GL_FOG_START 0x0B63 #define GL_FRAMEBUFFER_SRGB 0x8DB9 #define GL_STENCIL_FAIL 0x0B94 #define GL_LUMINANCE8_ALPHA8 0x8045 #define GL_COLOR_ATTACHMENT14 0x8CEE #define GL_INTENSITY8 0x804B #define GL_NAND 0x150E #define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 #define GL_MIN 0x8007 #define GL_SYNC_CONDITION 0x9113 #define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C #define GL_SAMPLER_BUFFER 0x8DC2 #define GL_PACK_ALIGNMENT 0x0D05 #define GL_DEPTH_SCALE 0x0D1E #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF #define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 #define GL_RG8_SNORM 0x8F95 #define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE #define GL_BOOL 0x8B56 #define GL_DST_COLOR 0x0306 #define GL_INT_SAMPLER_1D 0x8DC9 #define GL_BLEND_DST 0x0BE0 #define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 #define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE #define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 #define GL_LUMINANCE6_ALPHA2 0x8044 #define GL_DOUBLE_MAT4x2 0x8F4D #define GL_STENCIL_ATTACHMENT 0x8D20 #define GL_ACTIVE_VARIABLES 0x9305 #define GL_TEXTURE26 0x84DA #define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 #define GL_DEBUG_LOGGED_MESSAGES 0x9145 #define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA #define GL_FIXED_ONLY 0x891D #define GL_MAP1_TEXTURE_COORD_3 0x0D95 #define GL_COMPRESSED_RGBA 0x84EE #define GL_DEBUG_TYPE_MARKER 0x8268 #define GL_SHADER_STORAGE_BLOCK 0x92E6 #define GL_BLEND_COLOR 0x8005 #define GL_TEXTURE_WRAP_S 0x2802 #define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 #define GL_LIGHTING 0x0B50 #define GL_COMPATIBLE_SUBROUTINES 0x8E4B #define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC #define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D #define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D #define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E #define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 #define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 #define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB #define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD #define GL_ACTIVE_RESOURCES 0x92F5 #define GL_QUERY_NO_WAIT_INVERTED 0x8E18 #define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C #define GL_TEXTURE_RESIDENT 0x8067 #define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 #define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 #define GL_MAX_WIDTH 0x827E #define GL_LIST_MODE 0x0B30 #define GL_PACK_IMAGE_HEIGHT 0x806C #define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA #define GL_BUFFER_BINDING 0x9302 #define GL_LINE_SMOOTH_HINT 0x0C52 #define GL_TEXTURE3 0x84C3 #define GL_FLAT 0x1D00 #define GL_COPY_READ_BUFFER 0x8F36 #define GL_MAX_VARYING_FLOATS 0x8B4B #define GL_EYE_PLANE 0x2502 #define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 #define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 #define GL_TEXTURE_ENV_MODE 0x2200 #define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 #define GL_PROXY_TEXTURE_3D 0x8070 #define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A #define GL_TEXTURE_BINDING_BUFFER 0x8C2C #define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E #define GL_UNPACK_SWAP_BYTES 0x0CF0 #define GL_R32F 0x822E #define GL_DRAW_BUFFER8 0x882D #define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 #define GL_LOCATION_COMPONENT 0x934A #define GL_T4F_V4F 0x2A28 #define GL_DEPTH_BUFFER_BIT 0x00000100 #define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 #define GL_REPEAT 0x2901 #define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 #define GL_MULTISAMPLE_BIT 0x20000000 #define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 #define GL_SRC_COLOR 0x0300 #define GL_INT_IMAGE_1D 0x9057 #define GL_INTERNALFORMAT_BLUE_TYPE 0x827A #define GL_IMAGE_3D 0x904E #define GL_ONE_MINUS_DST_COLOR 0x0307 #define GL_FALSE 0 #define GL_DEPTH_STENCIL_ATTACHMENT 0x821A #define GL_MAP2_TEXTURE_COORD_2 0x0DB4 #define GL_HINT_BIT 0x00008000 #define GL_BLUE_BIAS 0x0D1B #define GL_RG16UI 0x823A #define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 #define GL_KEEP 0x1E00 #define GL_TESS_EVALUATION_SHADER 0x8E87 #define GL_STENCIL_TEST 0x0B90 #define GL_TEXTURE6 0x84C6 #define GL_DEPTH_COMPONENT24 0x81A6 #define GL_VIEWPORT_BOUNDS_RANGE 0x825D #define GL_MAX_UNIFORM_LOCATIONS 0x826E #define GL_RGBA 0x1908 #define GL_DYNAMIC_COPY 0x88EA #define GL_PACK_SKIP_ROWS 0x0D03 #define GL_LIST_INDEX 0x0B33 #define GL_IMAGE_BINDING_NAME 0x8F3A #define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F #define GL_RED_INTEGER 0x8D94 #define GL_OPERAND2_ALPHA 0x859A #define GL_INVALID_INDEX 0xFFFFFFFF #define GL_VERTEX_SHADER_INVOCATIONS 0x82F0 #define GL_TEXTURE_GEN_T 0x0C61 #define GL_TEXTURE_GEN_Q 0x0C63 #define GL_CURRENT_RASTER_COLOR 0x0B04 #define GL_RGBA4 0x8056 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 #define GL_DECAL 0x2101 #define GL_TEXTURE_SWIZZLE_R 0x8E42 #define GL_RED_SCALE 0x0D14 #define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 #define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 #define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 #define GL_PATCH_VERTICES 0x8E72 #define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 #define GL_TEXTURE_SWIZZLE_G 0x8E43 #define GL_PROGRAM_POINT_SIZE GL_VERTEX_PROGRAM_POINT_SIZE #define GL_COMPRESSED_RGB8_ETC2 0x9274 #define GL_DYNAMIC_READ 0x88E9 #define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D #define GL_POLYGON_STIPPLE 0x0B42 #define GL_ADD 0x0104 #define GL_COLOR_ATTACHMENT25 0x8CF9 #define GL_TEXTURE_ENV_COLOR 0x2201 #define GL_DEPTH_ATTACHMENT 0x8D00 #define GL_POINT_SIZE_GRANULARITY 0x0B13 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED #define GL_SRGB8 0x8C41 #define GL_LINE_STRIP_ADJACENCY 0x000B #define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER #define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 #define GL_MAX_TEXTURE_COORDS 0x8871 #define GL_COLOR_ARRAY_SIZE 0x8081 #define GL_RG8 0x822B #define GL_SRC0_ALPHA GL_SOURCE0_ALPHA #define GL_TESS_GEN_MODE 0x8E76 #define GL_COLOR_ATTACHMENT29 0x8CFD #define GL_HIGH_FLOAT 0x8DF2 #define GL_GREEN_BITS 0x0D53 #define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B #define GL_DRAW_BUFFER 0x0C01 #define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 #define GL_ACTIVE_UNIFORMS 0x8B86 #define GL_LINEAR_ATTENUATION 0x1208 #define GL_COPY_WRITE_BUFFER 0x8F37 #define GL_BITMAP_TOKEN 0x0704 #define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D #define GL_IMAGE_2D_ARRAY 0x9053 #define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE #define GL_VIEWPORT 0x0BA2 #define GL_VENDOR 0x1F00 #define GL_LIGHT1 0x4001 #define GL_CLEAR_BUFFER 0x82B4 #define GL_R8 0x8229 #define GL_RENDER 0x1C00 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A #define GL_SAMPLER_2D_RECT 0x8B63 #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC #define GL_RGBA16UI 0x8D76 #define GL_VERTEX_ARRAY_TYPE 0x807B #define GL_QUAD_STRIP 0x0008 #define GL_TEXTURE_MAX_ANISOTROPY 0x84FE #define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 #define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF #define GL_TRANSFORM_FEEDBACK_ACTIVE GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE #define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE #define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 #define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE #define GL_LINE 0x1B01 #define GL_LINK_STATUS 0x8B82 #define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF #define GL_ACTIVE_SUBROUTINES 0x8DE5 #define GL_INT 0x1404 #define GL_LUMINANCE12_ALPHA12 0x8047 #define GL_MAX_PIXEL_MAP_TABLE 0x0D34 #define GL_EYE_LINEAR 0x2400 #define GL_COLOR_ATTACHMENT13 0x8CED #define GL_POLYGON_OFFSET_UNITS 0x2A00 #define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 #define GL_VERTEX_ARRAY_STRIDE 0x807C #define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 #define GL_COLOR_ATTACHMENT11 0x8CEB #define GL_OR_INVERTED 0x150D #define GL_ACCUM_ALPHA_BITS 0x0D5B #define GL_FOG_COLOR 0x0B66 #define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE #define GL_DEBUG_TYPE_OTHER 0x8251 #define GL_LINES 0x0001 #define GL_READ_PIXELS_TYPE 0x828E #define GL_PROGRAM_OUTPUT 0x92E4 #define GL_DEPTH_RANGE 0x0B70 #define GL_INTERPOLATE 0x8575 #define GL_DOT3_RGBA 0x86AF #define GL_IMAGE_BINDING_ACCESS 0x8F3E #define GL_BGR_INTEGER 0x8D9A #define GL_GREEN_BIAS 0x0D19 #define GL_BLEND_DST_ALPHA 0x80CA #define GL_CURRENT_VERTEX_ATTRIB 0x8626 #define GL_RG_INTEGER 0x8228 #define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 #define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 #define GL_CLAMP_FRAGMENT_COLOR 0x891B #define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B #define GL_GEQUAL 0x0206 #define GL_DEPTH_CLAMP 0x864F #define GL_STATIC_COPY 0x88E6 #define GL_TEXTURE_STACK_DEPTH 0x0BA5 #define GL_COLOR_ATTACHMENT8 0x8CE8 #define GL_RGB16F 0x881B #define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 #define GL_MAX_COLOR_ATTACHMENTS 0x8CDF #define GL_DEBUG_SEVERITY_MEDIUM 0x9147 #define GL_3D 0x0601 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A #define GL_SOURCE0_ALPHA 0x8588 #define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 #define GL_ALIASED_POINT_SIZE_RANGE 0x846D #define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 #define GL_R16UI 0x8234 #define GL_SAMPLER_1D_SHADOW 0x8B61 #define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 #define GL_TEXTURE_VIEW 0x82B5 #define GL_DST_ALPHA 0x0304 #define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 #define GL_DEBUG_GROUP_STACK_DEPTH 0x826D #define GL_LUMINANCE8 0x8040 #define GL_UNSIGNED_BYTE 0x1401 #define GL_N3F_V3F 0x2A25 #define GL_ACCUM_CLEAR_VALUE 0x0B80 #define GL_SHADER_IMAGE_ATOMIC 0x82A6 #define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 #define GL_POINTS 0x0000 #define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 #define GL_ALPHA_SCALE 0x0D1C #define GL_RGBA8_SNORM 0x8F97 #define GL_MAP_COLOR 0x0D10 #define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 #define GL_VIEW_CLASS_RGTC1_RED 0x82D0 #define GL_DOUBLE_VEC2 0x8FFC #define GL_MAX_TESS_GEN_LEVEL 0x8E7E #define GL_RGB32F 0x8815 #define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 #define GL_BUFFER_MAP_POINTER 0x88BD #define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 #define GL_PIXEL_MAP_I_TO_A 0x0C75 #define GL_MAX_ELEMENTS_VERTICES 0x80E8 #define GL_MAX_LIST_NESTING 0x0B31 #define GL_IMAGE_CLASS_1_X_32 0x82BB #define GL_POLYGON_SMOOTH_HINT 0x0C53 #define GL_TEXTURE_MAG_FILTER 0x2800 #define GL_DOUBLE 0x140A #define GL_PIXEL_MAP_B_TO_B 0x0C78 #define GL_COMPRESSED_RG11_EAC 0x9272 #define GL_ZOOM_X 0x0D16 #define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 #define GL_DRAW_BUFFER15 0x8834 #define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 #define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 #define GL_BLUE_SCALE 0x0D1A #define GL_DELETE_STATUS 0x8B80 #define GL_PROGRAM 0x82E2 #define GL_QUERY_RESULT_NO_WAIT 0x9194 #define GL_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_OPERAND1_ALPHA 0x8599 #define GL_MAX_EVAL_ORDER 0x0D30 #define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 #define GL_SHADER_IMAGE_STORE 0x82A5 #define GL_PASS_THROUGH_TOKEN 0x0700 #define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 #define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 #define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD #define GL_ACCUM_BUFFER_BIT 0x00000200 #define GL_DEPTH_CLEAR_VALUE 0x0B73 #define GL_IMAGE_2D_RECT 0x904F #define GL_TEXTURE12 0x84CC #define GL_RGBA16I 0x8D88 #define GL_FRONT_FACE 0x0B46 #define GL_AUX0 0x0409 #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 #define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 #define GL_UNSIGNED_INT_VEC2 0x8DC6 #define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 #define GL_SAMPLER_3D 0x8B5F #define GL_C4F_N3F_V3F 0x2A26 #define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 #define GL_CLIP_PLANE2 0x3002 #define GL_RGBA8 0x8058 #define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 #define GL_RETURN 0x0102 #define GL_MAX_SUBROUTINES 0x8DE7 #define GL_COLOR_ATTACHMENT7 0x8CE7 #define GL_AUTO_GENERATE_MIPMAP 0x8295 #define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA #define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 #define GL_MAP_PERSISTENT_BIT 0x0040 #define GL_BACK_RIGHT 0x0403 #define GL_COMPRESSED_SRGB_ALPHA 0x8C49 #define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 #define GL_3D_COLOR_TEXTURE 0x0603 #define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE #define GL_INT_IMAGE_2D_ARRAY 0x905E #define GL_POLYGON_MODE 0x0B40 #define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 #define GL_CULL_FACE 0x0B44 #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C #define GL_TEXTURE_RED_SIZE 0x805C #define GL_R8_SNORM 0x8F94 #define GL_COMPRESSED_RED 0x8225 #define GL_IMAGE_CUBE 0x9050 #define GL_IMAGE_1D_ARRAY 0x9052 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 #define GL_NO_RESET_NOTIFICATION 0x8261 #define GL_RG16F 0x822F #define GL_POINT_SIZE 0x0B11 #define GL_SOURCE2_RGB 0x8582 #define GL_BGRA_INTEGER 0x8D9B #define GL_FASTEST 0x1101 #define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 #define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 #define GL_TYPE 0x92FA #define GL_TEXTURE10 0x84CA #define GL_TOP_LEVEL_ARRAY_SIZE 0x930C #define GL_PRIMITIVE_RESTART_INDEX 0x8F9E #define GL_DEPTH_TEXTURE_MODE 0x884B #define GL_WAIT_FAILED 0x911D #define GL_BLEND_SRC_ALPHA 0x80CB #define GL_DRAW_BUFFER14 0x8833 #define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 #define GL_IS_ROW_MAJOR 0x9300 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 #define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 #define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 #define GL_MAP_READ_BIT 0x0001 #define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 #define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 #define GL_UNIFORM_SIZE 0x8A38 #define GL_MAP2_GRID_DOMAIN 0x0DD2 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 #define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B #define GL_RGB32UI 0x8D71 #define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F #define GL_OUT_OF_MEMORY 0x0505 #define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E #define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 #define GL_LINEAR_MIPMAP_NEAREST 0x2701 #define GL_AUX2 0x040B #define GL_FOG_MODE 0x0B65 #define GL_POSITION 0x1203 #define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 #define GL_SPIR_V_BINARY 0x9552 #define GL_IMAGE_CLASS_1_X_16 0x82BE #define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 #define GL_TEXTURE_2D 0x0DE1 #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B #define GL_ALPHA16 0x803E #define GL_VIEW_CLASS_RGTC2_RG 0x82D1 #define GL_TEXTURE_WIDTH 0x1000 #define GL_PIXEL_MAP_A_TO_A 0x0C79 #define GL_MATRIX_STRIDE 0x92FF #define GL_MAX_LAYERS 0x8281 #define GL_TEXTURE15 0x84CF #define GL_TEXTURE_ALPHA_TYPE 0x8C13 #define GL_VERTEX_ATTRIB_BINDING 0x82D4 #define GL_TEXTURE28 0x84DC #define GL_QUERY_BUFFER 0x9192 #define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 #define GL_DEPTH_COMPONENT32 0x81A7 #define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B #define GL_CURRENT_NORMAL 0x0B02 #define GL_RASTERIZER_DISCARD 0x8C89 #define GL_TEXTURE19 0x84D3 #define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 #define GL_3_BYTES 0x1408 #define GL_VERTEX_ARRAY_SIZE 0x807A #define GL_DITHER 0x0BD0 #define GL_CONSTANT_ATTENUATION 0x1207 #define GL_FRAMEBUFFER 0x8D40 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 #define GL_TEXTURE_TARGET 0x1006 #define GL_STENCIL_BACK_WRITEMASK 0x8CA5 #define GL_QUADS 0x0007 #define GL_SHORT 0x1402 #define GL_RG16_SNORM 0x8F99 #define GL_SHADER_SOURCE_LENGTH 0x8B88 #define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 #define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 #define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB #define GL_EDGE_FLAG_ARRAY 0x8079 #define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 #define GL_INTERNALFORMAT_RED_TYPE 0x8278 #define GL_ALPHA_TEST_FUNC 0x0BC1 #define GL_DRAW_BUFFER6 0x882B #define GL_VIEW_CLASS_24_BITS 0x82C9 #define GL_T 0x2001 #define GL_AND 0x1501 #define GL_OBJECT_LINEAR 0x2401 #define GL_SRGB8_ALPHA8 0x8C43 #define GL_LINE_STIPPLE_PATTERN 0x0B25 #define GL_INDEX_ARRAY 0x8077 #define GL_DRAW_FRAMEBUFFER 0x8CA9 #define GL_TEXTURE_2D_MULTISAMPLE 0x9100 #define GL_READ_PIXELS 0x828C #define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 #define GL_CLIP_PLANE3 0x3003 #define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 #define GL_RGB_SCALE 0x8573 #define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E #define GL_TEXTURE14 0x84CE #define GL_DOUBLE_VEC3 0x8FFD #define GL_ISOLINES 0x8E7A #define GL_CLAMP_TO_BORDER 0x812D #define GL_PROXY_TEXTURE_CUBE_MAP 0x851B #define GL_COORD_REPLACE_ARB 0x8862 #define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E #define GL_UNPACK_IMAGE_HEIGHT 0x806E #define GL_UNIFORM_NAME_LENGTH 0x8A39 #define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC #define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 #define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 #define GL_CONTEXT_FLAGS 0x821E #define GL_TEXTURE_SWIZZLE_A 0x8E45 #define GL_R32I 0x8235 #define GL_EXTENSIONS 0x1F03 #define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 #define GL_RG32I 0x823B #define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA #define GL_LINE_SMOOTH 0x0B20 #define GL_VERTEX_BINDING_STRIDE 0x82D8 #define GL_COMPUTE_SHADER_BIT 0x00000020 #define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 #define GL_TESS_CONTROL_SHADER 0x8E88 #define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 #define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 #define GL_BLEND_SRC_RGB 0x80C9 #define GL_TEXTURE_1D_ARRAY 0x8C18 #define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 #define GL_SECONDARY_COLOR_ARRAY 0x845E #define GL_SELECTION_BUFFER_SIZE 0x0DF4 #define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 #define GL_VERTEX_ARRAY 0x8074 #define GL_POLYGON_SMOOTH 0x0B41 #define GL_MAX_INTEGER_SAMPLES 0x9110 #define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D #define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 #define GL_ZERO_TO_ONE 0x935F #define GL_INDEX_BITS 0x0D51 #define GL_SRC_ALPHA_SATURATE 0x0308 #define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 #define GL_TRIANGLE_FAN 0x0006 #define GL_FRAGMENT_DEPTH 0x8452 #define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 #define GL_BUFFER_IMMUTABLE_STORAGE 0x821F #define GL_ALPHA_TEST_REF 0x0BC2 #define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 #define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD #define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 #define GL_COLOR_ATTACHMENT31 0x8CFF #define GL_ALIASED_LINE_WIDTH_RANGE 0x846E #define GL_GENERATE_MIPMAP_HINT 0x8192 #define GL_UNIFORM_BARRIER_BIT 0x00000004 #define GL_RGB5 0x8050 #define GL_EVAL_BIT 0x00010000 #define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 #define GL_SAMPLES_PASSED 0x8914 #define GL_R8I 0x8231 #define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 #define GL_LIST_BASE 0x0B32 #define GL_TEXTURE_COMPARE_FUNC 0x884D #define GL_MAP1_GRID_SEGMENTS 0x0DD1 #define GL_NORMAL_ARRAY_TYPE 0x807E #define GL_MAX_DEPTH 0x8280 #define GL_TRANSFORM_FEEDBACK_PAUSED GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED #define GL_VERTEX_SHADER_BIT 0x00000001 #define GL_OFFSET 0x92FC #define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 #define GL_TEXTURE 0x1702 #define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF #define GL_COLOR_BUFFER_BIT 0x00004000 #define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 #define GL_AUX1 0x040A #define GL_STENCIL_BITS 0x0D57 #define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B #define GL_GEOMETRY_VERTICES_OUT 0x8916 #define GL_UNIFORM_BUFFER 0x8A11 #define GL_INT_IMAGE_1D_ARRAY 0x905D #define GL_ORDER 0x0A01 #define GL_AMBIENT_AND_DIFFUSE 0x1602 #define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY #define GL_SMOOTH_LINE_WIDTH_RANGE GL_LINE_WIDTH_RANGE #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F #define GL_INDEX_ARRAY_STRIDE 0x8086 #define GL_INT_IMAGE_CUBE 0x905B #define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 #define GL_UNSIGNED_INT_IMAGE_3D 0x9064 #define GL_STENCIL_BUFFER_BIT 0x00000400 #define GL_SUBPIXEL_BITS 0x0D50 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 #define GL_UNDEFINED_VERTEX 0x8260 #define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 #define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 #define GL_SRGB_READ 0x8297 #define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC #define GL_SRC_ALPHA 0x0302 #define GL_DEBUG_SOURCE_APPLICATION 0x824A #define GL_DRAW_PIXEL_TOKEN 0x0705 #define GL_MIRROR_CLAMP_TO_EDGE 0x8743 #define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 #define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE #define GL_BUFFER_STORAGE_FLAGS 0x8220 #define GL_DEBUG_OUTPUT 0x92E0 #define GL_LINE_TOKEN 0x0702 #define GL_CURRENT_RASTER_DISTANCE 0x0B09 #define GL_MAP2_COLOR_4 0x0DB0 #define GL_SPECULAR 0x1202 #define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 #define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF #define GL_T4F_C4F_N3F_V4F 0x2A2D #define GL_TEXTURE_BINDING_2D 0x8069 #define GL_TESS_CONTROL_SUBROUTINE 0x92E9 #define GL_CLIP_PLANE1 0x3001 #define GL_UNSIGNED_INT 0x1405 #define GL_READ_FRAMEBUFFER 0x8CA8 #define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 #define GL_MAX_TEXTURE_SIZE 0x0D33 #define GL_UNPACK_SKIP_ROWS 0x0CF3 #define GL_BUFFER 0x82E0 #define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 #define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A #define GL_TRIANGLES_ADJACENCY 0x000C #define GL_VERTEX_BINDING_DIVISOR 0x82D6 #define GL_MODELVIEW_MATRIX 0x0BA6 #define GL_C4UB_V2F 0x2A22 #define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 #define GL_RESCALE_NORMAL 0x803A #define GL_COMPILE 0x1300 #define GL_DEBUG_SEVERITY_LOW 0x9148 #define GL_NUM_EXTENSIONS 0x821D #define GL_TEXTURE22 0x84D6 #define GL_PREVIOUS 0x8578 #define GL_UNPACK_ROW_LENGTH 0x0CF2 #define GL_QUERY_COUNTER_BITS 0x8864 #define GL_LIGHT2 0x4002 #define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE #define GL_RGB12 0x8053 #define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A #define GL_TEXTURE_2D_ARRAY 0x8C1A #define GL_CONSTANT_COLOR 0x8001 #define GL_RED 0x1903 #define GL_LOCATION_INDEX 0x930F #define GL_PROXY_TEXTURE_2D 0x8064 #define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 #define GL_RENDERBUFFER_WIDTH 0x8D42 #define GL_READ_ONLY 0x88B8 #define GL_READ_FRAMEBUFFER_BINDING 0x8CAA #define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 #define GL_VERTEX_SHADER 0x8B31 #define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551 #define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 #define GL_RGBA32I 0x8D82 #define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB #define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 #define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA #define GL_LINEAR 0x2601 #define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 #define GL_TEXTURE_MIN_LOD 0x813A #define GL_LOWER_LEFT 0x8CA1 #define GL_POINT_SMOOTH_HINT 0x0C51 #define GL_LUMINANCE12_ALPHA4 0x8046 #define GL_COMPUTE_SHADER 0x91B9 #define GL_MAP2_TEXTURE_COORD_4 0x0DB6 #define GL_COPY_WRITE_BUFFER_BINDING GL_COPY_WRITE_BUFFER #define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B #define GL_NEVER 0x0200 #define GL_EMISSION 0x1600 #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D #define GL_SINGLE_COLOR 0x81F9 #define GL_MAP1_TEXTURE_COORD_1 0x0D93 #define GL_TEXTURE_HEIGHT 0x1001 #define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC #define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 #define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 #define GL_COLOR_ATTACHMENT27 0x8CFB #define GL_TIMEOUT_EXPIRED 0x911B #define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2 #define GL_UNIFORM_OFFSET 0x8A3B #define GL_ATTRIB_STACK_DEPTH 0x0BB0 #define GL_SHININESS 0x1601 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 #define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 #define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 #define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 #define GL_CONTEXT_LOST 0x0507 #define GL_STENCIL_VALUE_MASK 0x0B93 #define GL_LINE_LOOP 0x0002 #define GL_BLEND_EQUATION_ALPHA 0x883D #define GL_DOUBLE_MAT4 0x8F48 #define GL_MAP1_TEXTURE_COORD_2 0x0D94 #define GL_DYNAMIC_DRAW 0x88E8 #define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E #define GL_VALIDATE_STATUS 0x8B83 #define GL_QUERY_RESULT_AVAILABLE 0x8867 #define GL_IMAGE_1D 0x904C #define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 #define GL_TEXTURE_LOD_BIAS 0x8501 #define GL_PROGRAM_BINARY_LENGTH 0x8741 #define GL_INCR_WRAP 0x8507 #define GL_NEAREST 0x2600 #define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 #define GL_MAX_VIEWPORTS 0x825B #define GL_SRGB_ALPHA 0x8C42 #define GL_TEXTURE_STENCIL_SIZE 0x88F1 #define GL_COLOR_CLEAR_VALUE 0x0C22 #define GL_TEXTURE_BUFFER_SIZE 0x919E #define GL_LINE_STIPPLE_REPEAT 0x0B26 #define GL_NORMAL_ARRAY_STRIDE 0x807F #define GL_NEAREST_MIPMAP_NEAREST 0x2700 #define GL_RGBA8UI 0x8D7C #define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF #define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 #define GL_MIPMAP 0x8293 #define GL_DECR 0x1E03 #define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 #define GL_TEXTURE_RECTANGLE 0x84F5 #define GL_ALL_SHADER_BITS 0xFFFFFFFF #define GL_SMOOTH_POINT_SIZE_GRANULARITY GL_POINT_SIZE_GRANULARITY #define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D #define GL_POINT_SMOOTH 0x0B10 #define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 #define GL_SAMPLE_COVERAGE_VALUE 0x80AA #define GL_COPY 0x1503 #define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB #define GL_RIGHT 0x0407 #define GL_COMPUTE_TEXTURE 0x82A0 #define GL_TEXTURE_MAX_LEVEL 0x813D #define GL_RGB8 0x8051 #define GL_UNSIGNED_INT_VEC3 0x8DC7 #define GL_SRC1_COLOR 0x88F9 #define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 #define GL_STENCIL_BACK_REF 0x8CA3 #define GL_TEXTURE0 0x84C0 #define GL_TEXTURE_MAX_LOD 0x813B #define GL_SRC1_ALPHA GL_SOURCE1_ALPHA #define GL_LINE_STRIP 0x0003 #define GL_RGBA32UI 0x8D70 #define GL_SHADE_MODEL 0x0B54 #define GL_FLOAT_MAT4x3 0x8B6A #define GL_DRAW_BUFFER10 0x882F #define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E #define GL_IMAGE_2D_MULTISAMPLE 0x9055 #define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 #define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 #define GL_GEOMETRY_OUTPUT_TYPE 0x8918 #define GL_TEXTURE_RED_TYPE 0x8C10 #define GL_PIXEL_MAP_I_TO_R 0x0C72 #define GL_FOG_DENSITY 0x0B62 #define GL_CLIENT_STORAGE_BIT 0x0200 #define GL_POLYGON_OFFSET_FACTOR 0x8038 #define GL_INDEX 0x8222 #define GL_SRGB_WRITE 0x8298 #define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 #define GL_ENABLE_BIT 0x00002000 #define GL_COMPUTE_SUBROUTINE 0x92ED #define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1 #define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C #define GL_FOG_COORDINATE_ARRAY 0x8457 #define GL_COLOR_ATTACHMENT9 0x8CE9 #define GL_FLOAT_MAT3x4 0x8B68 #define GL_STREAM_DRAW 0x88E0 #define GL_UNSIGNED_NORMALIZED 0x8C17 #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 #define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF #define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 #define GL_CLIP_PLANE4 0x3004 #define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 #define GL_INTENSITY 0x8049 #define GL_INTENSITY12 0x804C #define GL_ALL_ATTRIB_BITS 0xFFFFFFFF #define GL_SRC1_RGB GL_SOURCE1_RGB #define GL_UNSIGNALED 0x9118 #define GL_COLOR_ATTACHMENT10 0x8CEA #define GL_STENCIL_INDEX8 0x8D48 #define GL_CLIP_PLANE5 0x3005 #define GL_MAX_DRAW_BUFFERS 0x8824 #define GL_RGBA_INTEGER 0x8D99 #define GL_COLOR 0x1800 #define GL_DOUBLE_MAT3 0x8F47 #define GL_ALREADY_SIGNALED 0x911A #define GL_ARRAY_STRIDE 0x92FE #define GL_TEXTURE_MIN_FILTER 0x2801 #define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D #define GL_ARRAY_SIZE 0x92FB #define GL_CLAMP_TO_EDGE 0x812F #define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 #define GL_IMAGE_2D 0x904D #define GL_CAVEAT_SUPPORT 0x82B8 #define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 #define GL_ONE_MINUS_SRC1_ALPHA 0x88FB #define GL_TEXTURE_BUFFER_BINDING 0x8C2A #define GL_VERTEX_ARRAY_BINDING 0x85B5 #define GL_INCR 0x1E02 #define GL_TEXTURE_COORD_ARRAY 0x8078 #define GL_SAMPLER_CUBE_SHADOW 0x8DC5 #define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 #define GL_COLOR_ATTACHMENT5 0x8CE5 #define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF #define GL_COLOR_ATTACHMENT24 0x8CF8 #define GL_FRACTIONAL_EVEN 0x8E7C #define GL_STENCIL_CLEAR_VALUE 0x0B91 #define GL_DRAW_BUFFER4 0x8829 #define GL_RGBA16_SNORM 0x8F9B #define GL_TEXTURE_ENV 0x2300 #define GL_POINT 0x1B00 #define GL_DOUBLE_MAT3x4 0x8F4C #define GL_CURRENT_TEXTURE_COORDS 0x0B03 #define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 #define GL_V2F 0x2A20 #define GL_RG8UI 0x8238 #define GL_MAP2_TEXTURE_COORD_1 0x0DB3 #define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A #define GL_PROJECTION_STACK_DEPTH 0x0BA4 #define GL_SAMPLER 0x82E6 #define GL_GEOMETRY_INPUT_TYPE 0x8917 #define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F #define GL_NORMAL_MAP 0x8511 #define GL_RGB16 0x8054 #define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 #define GL_DEPTH_COMPONENT 0x1902 #define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 #define GL_DRAW_BUFFER0 0x8825 #define GL_STENCIL_WRITEMASK 0x0B98 #define GL_ANY_SAMPLES_PASSED 0x8C2F #define GL_UNSIGNED_INT_24_8 0x84FA #define GL_FRAGMENT_SUBROUTINE 0x92EC #define GL_PRIMITIVES_SUBMITTED 0x82EF #define GL_MAP1_NORMAL 0x0D92 #define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 #define GL_NONE 0 #define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A #define GL_TEXTURE_3D 0x806F #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C #define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 #define GL_DYNAMIC_STORAGE_BIT 0x0100 #define GL_IMAGE_CLASS_4_X_32 0x82B9 #define GL_STENCIL 0x1802 #define GL_BLUE 0x1905 #define GL_IMAGE_CLASS_2_X_32 0x82BA #define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 #define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 #define GL_TIMESTAMP 0x8E28 #define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B #define GL_MODELVIEW 0x1700 #define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 #define GL_SET 0x150F #define GL_LIGHT6 0x4006 #define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE #define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F #define GL_TEXTURE_FILTER_CONTROL 0x8500 #define GL_QUERY_BY_REGION_WAIT 0x8E15 #define GL_COLOR_ATTACHMENT22 0x8CF6 #define GL_TEXTURE29 0x84DD #define GL_DECR_WRAP 0x8508 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB #define GL_TEXTURE_BASE_LEVEL 0x813C #define GL_COORD_REPLACE 0x8862 #define GL_TEXTURE_MATRIX 0x0BA8 #define GL_CURRENT_BIT 0x00000001 #define GL_POLYGON_TOKEN 0x0703 #define GL_POINT_BIT 0x00000002 #define GL_CURRENT_RASTER_POSITION 0x0B07 #define GL_SLUMINANCE_ALPHA 0x8C44 #define GL_RENDERBUFFER_SAMPLES 0x8CAB #define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B #define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 #define GL_ELEMENT_ARRAY_BUFFER 0x8893 #define GL_SLUMINANCE 0x8C46 #define GL_TEXTURE9 0x84C9 #define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A #define GL_CURRENT_COLOR 0x0B00 #define GL_PROXY_TEXTURE_1D 0x8063 #define GL_LAYER_PROVOKING_VERTEX 0x825E #define GL_RGBA16F 0x881A #define GL_TEXTURE8 0x84C8 #define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED #define GL_TEXTURE17 0x84D1 #define GL_INVALID_ENUM 0x0500 #define GL_NUM_SAMPLE_COUNTS 0x9380 #define GL_OBJECT_TYPE 0x9112 #define GL_DOMAIN 0x0A02 #define GL_FIRST_VERTEX_CONVENTION 0x8E4D #define GL_TEXTURE_INTERNAL_FORMAT 0x1003 #define GL_TESS_GEN_POINT_MODE 0x8E79 #define GL_TEXTURE_BINDING_1D 0x8068 #define GL_SHADER_TYPE 0x8B4F #define GL_LIGHT3 0x4003 #define GL_MAX_IMAGE_SAMPLES 0x906D #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 #define GL_CURRENT_RASTER_INDEX 0x0B05 #define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 #define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 #include #include #ifndef GLEXT_64_TYPES_DEFINED /* This code block is duplicated in glxext.h, so must be protected */ #define GLEXT_64_TYPES_DEFINED /* Define int32_t, int64_t, and uint64_t types for UST/MSC */ /* (as used in the GL_EXT_timer_query extension). */ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #include #elif defined(__sun__) || defined(__digital__) #include #if defined(__STDC__) #if defined(__arch64__) || defined(_LP64) typedef long int int64_t; typedef unsigned long int uint64_t; #else typedef long long int int64_t; typedef unsigned long long int uint64_t; #endif /* __arch64__ */ #endif /* __STDC__ */ #elif defined( __VMS ) || defined(__sgi) #include #elif defined(__SCO__) || defined(__USLC__) #include #elif defined(__UNIXOS2__) || defined(__SOL64__) typedef long int int32_t; typedef long long int int64_t; typedef unsigned long long int uint64_t; #elif defined(_WIN32) && defined(__GNUC__) #include #elif defined(_WIN32) typedef __int32 int32_t; typedef __int64 int64_t; typedef unsigned __int64 uint64_t; #else /* Fallback if nothing above works */ #include #endif #endif typedef unsigned int GLenum; typedef unsigned char GLboolean; typedef unsigned int GLbitfield; typedef void GLvoid; typedef signed char GLbyte; typedef short GLshort; typedef int GLint; typedef int GLclampx; typedef unsigned char GLubyte; typedef unsigned short GLushort; typedef unsigned int GLuint; typedef int GLsizei; typedef float GLfloat; typedef float GLclampf; typedef double GLdouble; typedef double GLclampd; typedef void *GLeglClientBufferEXT; typedef void *GLeglImageOES; typedef char GLchar; typedef char GLcharARB; #ifdef __APPLE__ typedef void *GLhandleARB; #else typedef unsigned int GLhandleARB; #endif typedef unsigned short GLhalfARB; typedef unsigned short GLhalf; typedef GLint GLfixed; #if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) typedef khronos_intptr_t GLintptr; #else typedef khronos_intptr_t GLintptr; #endif #if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) typedef khronos_ssize_t GLsizeiptr; #else typedef khronos_ssize_t GLsizeiptr; #endif typedef int64_t GLint64; typedef uint64_t GLuint64; #if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) typedef long GLintptrARB; #else typedef ptrdiff_t GLintptrARB; #endif #if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) typedef long GLsizeiptrARB; #else typedef ptrdiff_t GLsizeiptrARB; #endif typedef int64_t GLint64EXT; typedef uint64_t GLuint64EXT; typedef struct __GLsync *GLsync; struct _cl_context; struct _cl_event; typedef void (GLAD_API_PTR *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); typedef void (GLAD_API_PTR *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); typedef void (GLAD_API_PTR *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); typedef void (GLAD_API_PTR *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); typedef unsigned short GLhalfNV; typedef GLintptr GLvdpauSurfaceNV; typedef void (GLAD_API_PTR *GLVULKANPROCNV)(void); #define GL_VERSION_1_0 1 GLAD_API_CALL int GLAD_GL_VERSION_1_0; #define GL_VERSION_1_1 1 GLAD_API_CALL int GLAD_GL_VERSION_1_1; #define GL_VERSION_1_2 1 GLAD_API_CALL int GLAD_GL_VERSION_1_2; #define GL_VERSION_1_3 1 GLAD_API_CALL int GLAD_GL_VERSION_1_3; #define GL_VERSION_1_4 1 GLAD_API_CALL int GLAD_GL_VERSION_1_4; #define GL_VERSION_1_5 1 GLAD_API_CALL int GLAD_GL_VERSION_1_5; #define GL_VERSION_2_0 1 GLAD_API_CALL int GLAD_GL_VERSION_2_0; #define GL_VERSION_2_1 1 GLAD_API_CALL int GLAD_GL_VERSION_2_1; #define GL_VERSION_3_0 1 GLAD_API_CALL int GLAD_GL_VERSION_3_0; #define GL_VERSION_3_1 1 GLAD_API_CALL int GLAD_GL_VERSION_3_1; #define GL_VERSION_3_2 1 GLAD_API_CALL int GLAD_GL_VERSION_3_2; #define GL_VERSION_3_3 1 GLAD_API_CALL int GLAD_GL_VERSION_3_3; #define GL_VERSION_4_0 1 GLAD_API_CALL int GLAD_GL_VERSION_4_0; #define GL_VERSION_4_1 1 GLAD_API_CALL int GLAD_GL_VERSION_4_1; #define GL_VERSION_4_2 1 GLAD_API_CALL int GLAD_GL_VERSION_4_2; #define GL_VERSION_4_3 1 GLAD_API_CALL int GLAD_GL_VERSION_4_3; #define GL_VERSION_4_4 1 GLAD_API_CALL int GLAD_GL_VERSION_4_4; #define GL_VERSION_4_5 1 GLAD_API_CALL int GLAD_GL_VERSION_4_5; #define GL_VERSION_4_6 1 GLAD_API_CALL int GLAD_GL_VERSION_4_6; #define GL_ARB_point_sprite 1 GLAD_API_CALL int GLAD_GL_ARB_point_sprite; typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIIVPROC)(GLuint texture, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLTEXCOORDP1UIVPROC)(GLenum type, const GLuint * coords); typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC)(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (GLAD_API_PTR *PFNGLEVALPOINT2PROC)(GLint i, GLint j); typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBBINDINGPROC)(GLuint vaobj, GLuint attribindex, GLuint bindingindex); typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length); typedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC)(GLuint framebuffer, GLenum pname, GLint * param); typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERFPROC)(GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLGETFLOATI_VPROC)(GLenum target, GLuint index, GLfloat * data); typedef void (GLAD_API_PTR *PFNGLLOADNAMEPROC)(GLuint name); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIVPROC)(const GLuint * v); typedef void (GLAD_API_PTR *PFNGLUNIFORM1DVPROC)(GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BVPROC)(const GLbyte * v); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue); typedef void (GLAD_API_PTR *PFNGLGETNCOLORTABLEPROC)(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void * table); typedef void (GLAD_API_PTR *PFNGLRASTERPOS3IPROC)(GLint x, GLint y, GLint z); typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREPROC)(GLenum texture); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint * v); typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERDATAPROC)(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void * data); typedef void (GLAD_API_PTR *PFNGLNORMAL3DPROC)(GLdouble nx, GLdouble ny, GLdouble nz); typedef void (GLAD_API_PTR *PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC)(GLuint framebuffer, GLsizei numAttachments, const GLenum * attachments, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLBINDBUFFERSBASEPROC)(GLenum target, GLuint first, GLsizei count, const GLuint * buffers); typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DPROC)(GLdouble u); typedef void (GLAD_API_PTR *PFNGLGETMAPFVPROC)(GLenum target, GLenum query, GLfloat * v); typedef GLboolean (GLAD_API_PTR *PFNGLISSYNCPROC)(GLsync sync); typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPFVPROC)(GLenum map, GLfloat * values); typedef void (GLAD_API_PTR *PFNGLVERTEX4SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FVPROC)(const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint index, GLenum pname, GLuint * params); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort * v); typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices, GLint basevertex); typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEINDEXEDPROC)(GLuint index, GLdouble n, GLdouble f); typedef GLboolean (GLAD_API_PTR *PFNGLISQUERYPROC)(GLuint id); typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPIPELINESPROC)(GLsizei n, const GLuint * pipelines); typedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERFVPROC)(GLuint texture, GLint level, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef 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); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP1UIPROC)(GLenum texture, GLenum type, GLuint coords); typedef void (GLAD_API_PTR *PFNGLINDEXSPROC)(GLshort c); typedef void (GLAD_API_PTR *PFNGLCOLORP3UIPROC)(GLenum type, GLuint color); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP4UIPROC)(GLenum texture, GLenum type, GLuint coords); typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROC)(GLenum type); typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERFIPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC)(GLuint texture, GLint level, GLsizei bufSize, void * pixels); typedef void (GLAD_API_PTR *PFNGLCOLOR4SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGEINSERTPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar * buf); typedef void (GLAD_API_PTR *PFNGLRECTFPROC)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); typedef GLuint (GLAD_API_PTR *PFNGLGETDEBUGMESSAGELOGPROC)(GLuint count, GLsizei bufSize, GLenum * sources, GLenum * types, GLuint * ids, GLenum * severities, GLsizei * lengths, GLchar * messageLog); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SPROC)(GLshort x, GLshort y, GLshort z); typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); typedef 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); typedef void (GLAD_API_PTR *PFNGLCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLGETMATERIALFVPROC)(GLenum face, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IVPROC)(GLenum target, const GLint * v); typedef void (GLAD_API_PTR *PFNGLDELETESAMPLERSPROC)(GLsizei count, const GLuint * samplers); typedef void (GLAD_API_PTR *PFNGLGETMATERIALIVPROC)(GLenum face, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor); typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC)(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERDATAPROC)(GLuint buffer, GLsizeiptr size, const void * data, GLenum usage); typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTAGEIVPROC)(GLuint program, GLenum shadertype, GLenum pname, GLint * values); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAD_API_PTR *PFNGLVERTEX2SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLRECTSVPROC)(const GLshort * v1, const GLshort * v2); typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERPROC)(GLenum buf); typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); typedef void (GLAD_API_PTR *PFNGLTEXCOORDP2UIVPROC)(GLenum type, const GLuint * coords); typedef void (GLAD_API_PTR *PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBVPROC)(const GLubyte * v); typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint * framebuffers); typedef void (GLAD_API_PTR *PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAD_API_PTR *PFNGLGETTEXGENFVPROC)(GLenum coord, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLCOLOR4DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP4UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); typedef void (GLAD_API_PTR *PFNGLACTIVESHADERPROGRAMPROC)(GLuint pipeline, GLuint program); typedef void (GLAD_API_PTR *PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode); typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFVPROC)(GLuint index, const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLMAPGRID1FPROC)(GLint un, GLfloat u1, GLfloat u2); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void ** params); typedef void (GLAD_API_PTR *PFNGLTEXGENFVPROC)(GLenum coord, GLenum pname, const GLfloat * params); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLROTATEDPROC)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAD_API_PTR *PFNGLCREATEQUERIESPROC)(GLenum target, GLsizei n, GLuint * ids); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IPROC)(GLint x, GLint y, GLint z); typedef void (GLAD_API_PTR *PFNGLCLAMPCOLORPROC)(GLenum target, GLenum clamp); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLVERTEX4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAD_API_PTR *PFNGLNORMAL3FPROC)(GLfloat nx, GLfloat ny, GLfloat nz); typedef void (GLAD_API_PTR *PFNGLCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue); typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDPROC)(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLPUSHCLIENTATTRIBPROC)(GLbitfield mask); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMSTAGESPROC)(GLuint pipeline, GLbitfield stages, GLuint program); typedef void (GLAD_API_PTR *PFNGLTEXCOORD3SPROC)(GLshort s, GLshort t, GLshort r); typedef void (GLAD_API_PTR *PFNGLLIGHTFPROC)(GLenum light, GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLTEXCOORD3FVPROC)(const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DPROC)(GLuint index, GLdouble x, GLdouble y); typedef void (GLAD_API_PTR *PFNGLFOGCOORDDPROC)(GLdouble coord); typedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPUIVPROC)(GLenum map, GLsizei bufSize, GLuint * values); typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTIVPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGIPROC)(GLenum name, GLuint index); typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAD_API_PTR *PFNGLGETQUERYIVPROC)(GLenum target, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLBINDVERTEXARRAYPROC)(GLuint array); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z); typedef void (GLAD_API_PTR *PFNGLGENERATETEXTUREMIPMAPPROC)(GLuint texture); typedef void (GLAD_API_PTR *PFNGLDELETESYNCPROC)(GLsync sync); typedef void (GLAD_API_PTR *PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer); typedef void (GLAD_API_PTR *PFNGLPUSHDEBUGGROUPPROC)(GLenum source, GLuint id, GLsizei length, const GLchar * message); typedef void (GLAD_API_PTR *PFNGLRASTERPOS2IPROC)(GLint x, GLint y); typedef void (GLAD_API_PTR *PFNGLBINDIMAGETEXTUREPROC)(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); typedef void (GLAD_API_PTR *PFNGLFEEDBACKBUFFERPROC)(GLsizei size, GLenum type, GLfloat * buffer); typedef void (GLAD_API_PTR *PFNGLEVALMESH2PROC)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMPROC)(GLuint program); typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); typedef void (GLAD_API_PTR *PFNGLPUSHMATRIXPROC)(void); typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformBlockName); typedef void (GLAD_API_PTR *PFNGLUNIFORM3DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte * v); typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void * data); typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKI64_VPROC)(GLuint xfb, GLenum pname, GLuint index, GLint64 * param); typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERPROC)(GLuint shader); typedef void (GLAD_API_PTR *PFNGLGETLIGHTFVPROC)(GLenum light, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLPIXELMAPUSVPROC)(GLenum map, GLsizei mapsize, const GLushort * values); typedef void (GLAD_API_PTR *PFNGLRASTERPOS4IPROC)(GLint x, GLint y, GLint z, GLint w); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAD_API_PTR *PFNGLINITNAMESPROC)(void); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIPROC)(GLuint index, GLuint x); typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERIVPROC)(GLenum buffer, GLint drawbuffer, const GLint * value); typedef void (GLAD_API_PTR *PFNGLMAP1FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINDEXEDIVPROC)(GLuint vaobj, GLuint index, GLenum pname, GLint * param); typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYELEMENTBUFFERPROC)(GLuint vaobj, GLuint buffer); typedef void (GLAD_API_PTR *PFNGLGETTEXGENDVPROC)(GLenum coord, GLenum pname, GLdouble * params); typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERFVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue); typedef void (GLAD_API_PTR *PFNGLSHADERBINARYPROC)(GLsizei count, const GLuint * shaders, GLenum binaryformat, const void * binary, GLsizei length); typedef void (GLAD_API_PTR *PFNGLMAP1DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DVPROC)(GLuint index, const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (GLAD_API_PTR *PFNGLGENTRANSFORMFEEDBACKSPROC)(GLsizei n, GLuint * ids); typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERSUBDATAPROC)(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void * data); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLPIXELMAPFVPROC)(GLenum map, GLsizei mapsize, const GLfloat * values); typedef void (GLAD_API_PTR *PFNGLCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLMULTMATRIXDPROC)(const GLdouble * m); typedef void (GLAD_API_PTR *PFNGLCOPYPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); typedef void (GLAD_API_PTR *PFNGLUNIFORM2DVPROC)(GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLCOLOR3SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar * label); typedef void (GLAD_API_PTR *PFNGLGETOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei * length, GLchar * label); typedef void (GLAD_API_PTR *PFNGLINDEXFVPROC)(const GLfloat * c); typedef 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); typedef void (GLAD_API_PTR *PFNGLMAPGRID1DPROC)(GLint un, GLdouble u1, GLdouble u2); typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTUIVPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); typedef void (GLAD_API_PTR *PFNGLRASTERPOS3SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLSELECTBUFFERPROC)(GLsizei size, GLuint * buffer); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IVPROC)(GLuint index, const GLint * v); typedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERIPROC)(GLenum pname, GLint value); typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIUIVPROC)(GLuint texture, GLenum pname, GLuint * params); typedef void (GLAD_API_PTR *PFNGLCOLOR3IVPROC)(const GLint * v); typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERPROC)(GLenum target, GLenum access); typedef void (GLAD_API_PTR *PFNGLNORMALP3UIPROC)(GLenum type, GLuint coords); typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERFVPROC)(GLuint texture, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFPROC)(GLfloat n, GLfloat f); typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIVPROC)(GLuint texture, GLenum pname, const GLint * param); typedef void (GLAD_API_PTR *PFNGLVERTEXP2UIVPROC)(GLenum type, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4USVPROC)(GLuint index, const GLushort * v); typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params); typedef void (GLAD_API_PTR *PFNGLBINDVERTEXBUFFERSPROC)(GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizei * strides); typedef void (GLAD_API_PTR *PFNGLVERTEXP3UIVPROC)(GLenum type, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLINDEXIPROC)(GLint c); typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINENAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei * length, GLchar * name); typedef 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); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void ** pointer); typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUIVPROC)(GLenum map, GLuint * values); typedef void (GLAD_API_PTR *PFNGLGETTEXGENIVPROC)(GLenum coord, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z); typedef void (GLAD_API_PTR *PFNGLPOINTSIZEPROC)(GLfloat size); typedef void (GLAD_API_PTR *PFNGLVERTEXP2UIPROC)(GLenum type, GLuint value); typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC)(GLenum mode, const void * indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); typedef void (GLAD_API_PTR *PFNGLGETNTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void * pixels); typedef void (GLAD_API_PTR *PFNGLCULLFACEPROC)(GLenum mode); typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIPROC)(GLuint sampler, GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLTEXTUREBARRIERPROC)(void); typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); typedef void (GLAD_API_PTR *PFNGLBEGINQUERYPROC)(GLenum target, GLuint id); typedef void (GLAD_API_PTR *PFNGLCOLOR4USPROC)(GLushort red, GLushort green, GLushort blue, GLushort alpha); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble * params); typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint * textures); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLCREATEVERTEXARRAYSPROC)(GLsizei n, GLuint * arrays); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IPROC)(GLuint index, GLint x); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); typedef void (GLAD_API_PTR *PFNGLRECTDPROC)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); typedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXDPROC)(const GLdouble * m); typedef void (GLAD_API_PTR *PFNGLTEXENVFPROC)(GLenum target, GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLNORMAL3IPROC)(GLint nx, GLint ny, GLint nz); typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask); typedef void (GLAD_API_PTR *PFNGLGETINTEGERVPROC)(GLenum pname, GLint * data); typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMPROC)(GLuint program); typedef void (GLAD_API_PTR *PFNGLNORMAL3BVPROC)(const GLbyte * v); typedef void (GLAD_API_PTR *PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLNORMAL3SPROC)(GLshort nx, GLshort ny, GLshort nz); typedef void (GLAD_API_PTR *PFNGLCOLOR4IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP2UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); typedef GLboolean (GLAD_API_PTR *PFNGLARETEXTURESRESIDENTPROC)(GLsizei n, const GLuint * textures, GLboolean * residences); typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei * length, GLchar * name); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); typedef void (GLAD_API_PTR *PFNGLTEXCOORD1IPROC)(GLint s); typedef 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); typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXBUFFERSPROC)(GLuint vaobj, GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizei * strides); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue); typedef void (GLAD_API_PTR *PFNGLINTERLEAVEDARRAYSPROC)(GLenum format, GLsizei stride, const void * pointer); typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERPROC)(GLenum target); typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDIPROC)(GLenum target, GLuint index); typedef void (GLAD_API_PTR *PFNGLBINDSAMPLERSPROC)(GLuint first, GLsizei count, const GLuint * samplers); typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * data); typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESPROC)(GLsizei n, const GLuint * textures, const GLfloat * priorities); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLRASTERPOS4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USVPROC)(const GLushort * v); typedef void (GLAD_API_PTR *PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * values); typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, const GLint * param); typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFVPROC)(GLenum pname, const GLfloat * params); typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); typedef void (GLAD_API_PTR *PFNGLRESUMETRANSFORMFEEDBACKPROC)(void); typedef void (GLAD_API_PTR *PFNGLGENPROGRAMPIPELINESPROC)(GLsizei n, GLuint * pipelines); typedef void (GLAD_API_PTR *PFNGLVERTEX4FVPROC)(const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLLIGHTIVPROC)(GLenum light, GLenum pname, const GLint * params); typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERIVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint * value); typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLTEXCOORD3DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLFOGCOORDPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1); typedef 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); typedef void (GLAD_API_PTR *PFNGLGETDOUBLEI_VPROC)(GLenum target, GLuint index, GLdouble * data); typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERDATAPROC)(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void * data); typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture); typedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFERRANGEPROC)(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLSAMPLEMASKIPROC)(GLuint maskNumber, GLbitfield mask); typedef void (GLAD_API_PTR *PFNGLCLEARACCUMPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMBINARYPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLenum * binaryFormat, void * binary); typedef void (GLAD_API_PTR *PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIPROC)(GLuint texture, GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLCOLOR3DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLBINDSAMPLERPROC)(GLuint unit, GLuint sampler); typedef GLenum (GLAD_API_PTR *PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)(GLuint framebuffer, GLenum target); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSPROC)(GLenum mode, const GLint * first, const GLsizei * count, GLsizei drawcount); typedef void (GLAD_API_PTR *PFNGLRASTERPOS4DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLGETFLOATVPROC)(GLenum pname, GLfloat * data); typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIPROC)(GLuint program, GLenum pname, GLint value); typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint * renderbuffers); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); typedef GLboolean (GLAD_API_PTR *PFNGLISSAMPLERPROC)(GLuint sampler); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DVPROC)(GLenum target, const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECONTROLPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled); typedef void (GLAD_API_PTR *PFNGLBINDBUFFERSRANGEPROC)(GLenum target, GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizeiptr * sizes); typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTPROC)(GLenum mode, const void * indirect, GLsizei drawcount, GLsizei stride); typedef void (GLAD_API_PTR *PFNGLGETMAPDVPROC)(GLenum target, GLenum query, GLdouble * v); typedef void (GLAD_API_PTR *PFNGLTEXCOORDP3UIPROC)(GLenum type, GLuint coords); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC)(GLuint xfb, GLuint index, GLuint buffer); typedef void (GLAD_API_PTR *PFNGLGETTEXENVIVPROC)(GLenum target, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLCOLORP3UIVPROC)(GLenum type, const GLuint * color); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x); typedef void (GLAD_API_PTR *PFNGLPOPCLIENTATTRIBPROC)(void); typedef void (GLAD_API_PTR *PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void * pixels); typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint * buffers); typedef GLenum (GLAD_API_PTR *PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLCLEARTEXIMAGEPROC)(GLuint texture, GLint level, GLenum format, GLenum type, const void * data); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FVPROC)(GLenum target, const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIVPROC)(GLint location, GLsizei count, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMNAMEPROC)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformName); typedef void (GLAD_API_PTR *PFNGLEVALPOINT1PROC)(GLint i); typedef void (GLAD_API_PTR *PFNGLCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue); typedef 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); typedef void (GLAD_API_PTR *PFNGLCOLOR3IPROC)(GLint red, GLint green, GLint blue); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLEVALCOORD1FVPROC)(const GLfloat * u); typedef void (GLAD_API_PTR *PFNGLVIEWPORTARRAYVPROC)(GLuint first, GLsizei count, const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAD_API_PTR *PFNGLCOLOR4DPROC)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATALOCATIONPROC)(GLuint program, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLCOLOR4UBVPROC)(const GLubyte * v); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLUNIFORMSUBROUTINESUIVPROC)(GLenum shadertype, GLsizei count, const GLuint * indices); typedef void (GLAD_API_PTR *PFNGLVERTEX4IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); typedef void (GLAD_API_PTR *PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); typedef void (GLAD_API_PTR *PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean * data); typedef void (GLAD_API_PTR *PFNGLVERTEX3DPROC)(GLdouble x, GLdouble y, GLdouble z); typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPOINTERVPROC)(GLuint buffer, GLenum pname, void ** params); typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXBUFFERPROC)(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); typedef void (GLAD_API_PTR *PFNGLGETPOLYGONSTIPPLEPROC)(GLubyte * mask); typedef void (GLAD_API_PTR *PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass); typedef void (GLAD_API_PTR *PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLGETNPOLYGONSTIPPLEPROC)(GLsizei bufSize, GLubyte * pattern); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort * v); typedef void (GLAD_API_PTR *PFNGLENDTRANSFORMFEEDBACKPROC)(void); typedef GLuint (GLAD_API_PTR *PFNGLCREATEPROGRAMPROC)(void); typedef void (GLAD_API_PTR *PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog); typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINDEXED64IVPROC)(GLuint vaobj, GLuint index, GLenum pname, GLint64 * param); typedef void (GLAD_API_PTR *PFNGLTEXGENDPROC)(GLenum coord, GLenum pname, GLdouble param); typedef void (GLAD_API_PTR *PFNGLINDEXUBPROC)(GLubyte c); typedef void (GLAD_API_PTR *PFNGLMULTMATRIXFPROC)(const GLfloat * m); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP2UIPROC)(GLenum texture, GLenum type, GLuint coords); typedef 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); typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMDVPROC)(GLuint program, GLint location, GLsizei bufSize, GLdouble * params); typedef void (GLAD_API_PTR *PFNGLRECTIVPROC)(const GLint * v1, const GLint * v2); typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SPROC)(GLshort s, GLshort t, GLshort r, GLshort q); typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (GLAD_API_PTR *PFNGLLOGICOPPROC)(GLenum opcode); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FVPROC)(const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLCREATESAMPLERSPROC)(GLsizei n, GLuint * samplers); typedef void (GLAD_API_PTR *PFNGLPIXELMAPUIVPROC)(GLenum map, GLsizei mapsize, const GLuint * values); typedef void (GLAD_API_PTR *PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); typedef void (GLAD_API_PTR *PFNGLLIGHTMODELIPROC)(GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIPROC)(GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLGENQUERIESPROC)(GLsizei n, GLuint * ids); typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTUREPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); typedef void (GLAD_API_PTR *PFNGLGETNSEPARABLEFILTERPROC)(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void * row, GLsizei columnBufSize, void * column, void * span); typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUIVPROC)(GLuint id, GLenum pname, GLuint * params); typedef void (GLAD_API_PTR *PFNGLCOLOR4FVPROC)(const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYIVPROC)(GLuint vaobj, GLenum pname, GLint * param); typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIPROC)(GLint location, GLuint v0); typedef void (GLAD_API_PTR *PFNGLGETNMAPFVPROC)(GLenum target, GLenum query, GLsizei bufSize, GLfloat * v); typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLTEXGENFPROC)(GLenum coord, GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLINDEXIVPROC)(const GLint * c); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IPROC)(GLenum target, GLint s, GLint t, GLint r); typedef void (GLAD_API_PTR *PFNGLCOLOR4USVPROC)(const GLushort * v); typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSPROC)(GLsizei n, const GLenum * bufs); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IPROC)(GLint x, GLint y); typedef void (GLAD_API_PTR *PFNGLTEXBUFFERRANGEPROC)(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP1UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IVPROC)(GLuint index, const GLint * v); typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void * indirect, GLsizei drawcount, GLsizei stride); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2); typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEPROC)(GLenum plane, GLdouble * equation); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLTEXCOORD2IPROC)(GLint s, GLint t); typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x); typedef void (GLAD_API_PTR *PFNGLGETLIGHTIVPROC)(GLenum light, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE1DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (GLAD_API_PTR *PFNGLSTENCILMASKPROC)(GLuint mask); typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); typedef void (GLAD_API_PTR *PFNGLINDEXDPROC)(GLdouble c); typedef void (GLAD_API_PTR *PFNGLNORMALP3UIVPROC)(GLenum type, const GLuint * coords); typedef void (GLAD_API_PTR *PFNGLEVALMESH1PROC)(GLenum mode, GLint i1, GLint i2); typedef void (GLAD_API_PTR *PFNGLTEXCOORDP3UIVPROC)(GLenum type, const GLuint * coords); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DVPROC)(GLuint index, const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREPROC)(GLenum texture); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, const GLint * params); typedef void (GLAD_API_PTR *PFNGLRASTERPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z); typedef void (GLAD_API_PTR *PFNGLEVALCOORD2FVPROC)(const GLfloat * u); typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREUNITPROC)(GLuint unit, GLuint texture); typedef void (GLAD_API_PTR *PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); typedef void (GLAD_API_PTR *PFNGLMATERIALFVPROC)(GLenum face, GLenum pname, const GLfloat * params); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IPROC)(GLuint program, GLint location, GLint v0, GLint v1); typedef void (GLAD_API_PTR *PFNGLRASTERPOS2SPROC)(GLshort x, GLshort y); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4BVPROC)(GLuint index, const GLbyte * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4SVPROC)(GLuint index, const GLshort * v); typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIVPROC)(GLuint index, const GLuint * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIVPROC)(GLuint index, const GLuint * v); typedef void (GLAD_API_PTR *PFNGLVERTEXP4UIVPROC)(GLenum type, const GLuint * value); typedef GLuint (GLAD_API_PTR *PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint program, const GLchar * uniformBlockName); typedef void (GLAD_API_PTR *PFNGLDEPTHFUNCPROC)(GLenum func); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const* string, const GLint * length); typedef void (GLAD_API_PTR *PFNGLVERTEX2IVPROC)(const GLint * v); typedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFERPROC)(GLuint buffer, GLenum access); typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFPROC)(GLfloat d); typedef void (GLAD_API_PTR *PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DPROC)(GLenum target, GLdouble s); typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUI64VPROC)(GLuint id, GLenum pname, GLuint64 * params); typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC)(GLuint framebuffer, GLsizei n, const GLenum * bufs); typedef 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); typedef void (GLAD_API_PTR *PFNGLDELETETRANSFORMFEEDBACKSPROC)(GLsizei n, const GLuint * ids); typedef void (GLAD_API_PTR *PFNGLVERTEX3IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREPROC)(GLuint texture); typedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXFPROC)(const GLfloat * m); typedef void (GLAD_API_PTR *PFNGLNEWLISTPROC)(GLuint list, GLenum mode); typedef void (GLAD_API_PTR *PFNGLSCALEFPROC)(GLfloat x, GLfloat y, GLfloat z); typedef void (GLAD_API_PTR *PFNGLVERTEX3FPROC)(GLfloat x, GLfloat y, GLfloat z); typedef void (GLAD_API_PTR *PFNGLTEXCOORD1IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLFOGCOORDFVPROC)(const GLfloat * coord); typedef void (GLAD_API_PTR *PFNGLMAPGRID2DPROC)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FVPROC)(const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * pixels); typedef void (GLAD_API_PTR *PFNGLINVALIDATETEXSUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); typedef void (GLAD_API_PTR *PFNGLORTHOPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTIVPROC)(GLuint id, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLFOGFPROC)(GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue); typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIVPROC)(GLint location, GLsizei count, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLPIXELZOOMPROC)(GLfloat xfactor, GLfloat yfactor); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAD_API_PTR *PFNGLEVALCOORD2DVPROC)(const GLdouble * u); typedef void (GLAD_API_PTR *PFNGLVERTEX3DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLENABLEPROC)(GLenum cap); typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIUIVPROC)(GLuint texture, GLenum pname, const GLuint * params); typedef void (GLAD_API_PTR *PFNGLFOGCOORDDVPROC)(const GLdouble * coord); typedef void (GLAD_API_PTR *PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void * data, GLenum usage); typedef void (GLAD_API_PTR *PFNGLPOPATTRIBPROC)(void); typedef void (GLAD_API_PTR *PFNGLNORMAL3DVPROC)(const GLdouble * v); typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATAINDEXPROC)(GLuint program, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLPASSTHROUGHPROC)(GLfloat token); typedef void (GLAD_API_PTR *PFNGLTEXCOORD2DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLTEXCOORDP4UIVPROC)(GLenum type, const GLuint * coords); typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERUIVPROC)(GLenum buffer, GLint drawbuffer, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM3DVPROC)(GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONIPROC)(GLuint buf, GLenum mode); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLVERTEX4IPROC)(GLint x, GLint y, GLint z, GLint w); typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIVPROC)(GLint location, GLsizei count, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLTEXENVFVPROC)(GLenum target, GLenum pname, const GLfloat * params); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DVPROC)(GLenum target, const GLdouble * v); typedef 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); typedef void (GLAD_API_PTR *PFNGLTRANSLATEDPROC)(GLdouble x, GLdouble y, GLdouble z); typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDVPROC)(GLuint index, const GLint * v); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLREADBUFFERPROC)(GLenum src); typedef void (GLAD_API_PTR *PFNGLENDPROC)(void); typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UBVPROC)(GLuint index, const GLubyte * v); typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * data); typedef void (GLAD_API_PTR *PFNGLVERTEX2DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLPUSHNAMEPROC)(GLuint name); typedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer); typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIVPROC)(GLenum pname, const GLint * params); typedef void (GLAD_API_PTR *PFNGLGENTEXTURESPROC)(GLsizei n, GLuint * textures); typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FVPROC)(const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLDISPATCHCOMPUTEPROC)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); typedef void (GLAD_API_PTR *PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint * params); typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint program, GLsizei uniformCount, const GLuint * uniformIndices, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCENAMEPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name); typedef void (GLAD_API_PTR *PFNGLVERTEX2FVPROC)(const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLCOLOR4UBPROC)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint * value); typedef void (GLAD_API_PTR *PFNGLCLIPPLANEPROC)(GLenum plane, const GLdouble * equation); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, const GLint * param); typedef void (GLAD_API_PTR *PFNGLUNIFORM2DPROC)(GLint location, GLdouble x, GLdouble y); typedef void (GLAD_API_PTR *PFNGLPOPMATRIXPROC)(void); typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPIPELINEPROC)(GLuint pipeline); typedef void (GLAD_API_PTR *PFNGLRASTERPOS3DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLTEXCOORD1FVPROC)(const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLTEXCOORD2IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei * count, GLuint * shaders); typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKI_VPROC)(GLuint xfb, GLenum pname, GLuint index, GLint * param); typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBIFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAD_API_PTR *PFNGLOBJECTPTRLABELPROC)(const void * ptr, GLsizei length, const GLchar * label); typedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPUSVPROC)(GLenum map, GLsizei bufSize, GLushort * values); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FPROC)(GLuint program, GLint location, GLfloat v0); typedef void (GLAD_API_PTR *PFNGLCLEARSTENCILPROC)(GLint s); typedef void (GLAD_API_PTR *PFNGLDISABLEPROC)(GLenum cap); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef GLuint (GLAD_API_PTR *PFNGLGETSUBROUTINEINDEXPROC)(GLuint program, GLenum shadertype, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DPROC)(GLenum target, GLdouble s, GLdouble t); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP3UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FVPROC)(GLenum target, const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint * value); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISORPROC)(GLuint index, GLuint divisor); typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONPROC)(GLuint program, GLuint color, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLGETNCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint lod, GLsizei bufSize, void * pixels); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLEVALCOORD2DPROC)(GLdouble u, GLdouble v); typedef void (GLAD_API_PTR *PFNGLGETPOINTERVPROC)(GLenum pname, void ** params); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FPROC)(GLfloat s, GLfloat t); typedef void (GLAD_API_PTR *PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLFINISHPROC)(void); typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPIPELINEPROC)(GLuint pipeline); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLGETNMAPDVPROC)(GLenum target, GLenum query, GLsizei bufSize, GLdouble * v); typedef void (GLAD_API_PTR *PFNGLBINDTEXTURESPROC)(GLuint first, GLsizei count, const GLuint * textures); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP3UIPROC)(GLenum texture, GLenum type, GLuint coords); typedef void (GLAD_API_PTR *PFNGLCOLORMASKIPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTI64VPROC)(GLuint id, GLenum pname, GLint64 * params); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SPROC)(GLenum target, GLshort s, GLshort t, GLshort r); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DPROC)(GLdouble x, GLdouble y); typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKPROC)(GLenum mode, GLuint id); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FPROC)(GLfloat x, GLfloat y); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FPROC)(GLfloat s, GLfloat t, GLfloat r, GLfloat q); typedef void (GLAD_API_PTR *PFNGLLIGHTMODELIVPROC)(GLenum pname, const GLint * params); typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIPROC)(GLint location, GLuint v0, GLuint v1); typedef void (GLAD_API_PTR *PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint * arrays); typedef void (GLAD_API_PTR *PFNGLTEXBUFFERPROC)(GLenum target, GLenum internalformat, GLuint buffer); typedef void (GLAD_API_PTR *PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1); typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DPROC)(GLdouble s); typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data); typedef GLenum (GLAD_API_PTR *PFNGLGETGRAPHICSRESETSTATUSPROC)(void); typedef void (GLAD_API_PTR *PFNGLTEXCOORD1SPROC)(GLshort s); typedef void (GLAD_API_PTR *PFNGLINDEXSVPROC)(const GLshort * c); typedef void (GLAD_API_PTR *PFNGLRASTERPOS4IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IPROC)(GLint red, GLint green, GLint blue); typedef void (GLAD_API_PTR *PFNGLCALLLISTPROC)(GLuint list); typedef void (GLAD_API_PTR *PFNGLINDEXUBVPROC)(const GLubyte * c); typedef void (GLAD_API_PTR *PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode); typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef GLboolean (GLAD_API_PTR *PFNGLISTRANSFORMFEEDBACKPROC)(GLuint id); typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, const void * data); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINTERFACEIVPROC)(GLuint program, GLenum programInterface, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLDISABLECLIENTSTATEPROC)(GLenum array); typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBLFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAD_API_PTR *PFNGLVERTEX4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAD_API_PTR *PFNGLNORMAL3SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLRASTERPOS4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAD_API_PTR *PFNGLTEXCOORDP4UIPROC)(GLenum type, GLuint coords); typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers); typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC)(GLuint framebuffer, GLenum src); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DVPROC)(GLuint index, const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIVPROC)(GLint location, GLsizei count, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLTEXCOORD1SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLGETINTEGERI_VPROC)(GLenum target, GLuint index, GLint * data); typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEPROC)(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLGETMAPIVPROC)(GLenum target, GLenum query, GLint * v); typedef void (GLAD_API_PTR *PFNGLMATRIXMODEPROC)(GLenum mode); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIVPROC)(GLuint index, const GLuint * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DVPROC)(GLuint index, const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, void * data); typedef void (GLAD_API_PTR *PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint * arrays); typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIVPROC)(GLuint texture, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLVERTEX3FVPROC)(const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLMATERIALIVPROC)(GLenum face, GLenum pname, const GLint * params); typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERIPROC)(GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLGETNHISTOGRAMPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void * values); typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROGRAMVPROC)(GLenum type, GLsizei count, const GLchar *const* strings); typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXARRAYATTRIBPROC)(GLuint vaobj, GLuint index); typedef void (GLAD_API_PTR *PFNGLENDCONDITIONALRENDERPROC)(void); typedef void (GLAD_API_PTR *PFNGLDELETELISTSPROC)(GLuint list, GLsizei range); typedef void (GLAD_API_PTR *PFNGLTEXCOORD2SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC callback, const void * userParam); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FPROC)(GLenum target, GLfloat s); typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void * img); typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); typedef void (GLAD_API_PTR *PFNGLGETINTERNALFORMATI64VPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 * params); typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPPROC)(GLenum target); typedef void (GLAD_API_PTR *PFNGLDELETEQUERIESPROC)(GLsizei n, const GLuint * ids); typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC)(GLuint framebuffer, GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLint basevertex); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DPROC)(GLuint program, GLint location, GLdouble v0); typedef void (GLAD_API_PTR *PFNGLALPHAFUNCPROC)(GLenum func, GLfloat ref); typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC)(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAD_API_PTR *PFNGLLINESTIPPLEPROC)(GLint factor, GLushort pattern); typedef void (GLAD_API_PTR *PFNGLTEXGENIPROC)(GLenum coord, GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXARRAYPROC)(GLuint array); typedef void (GLAD_API_PTR *PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC)(GLuint renderbuffer, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLINVALIDATEFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum * attachments); typedef void (GLAD_API_PTR *PFNGLPROGRAMBINARYPROC)(GLuint program, GLenum binaryFormat, const void * binary, GLsizei length); typedef void (GLAD_API_PTR *PFNGLTEXCOORD4DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLVERTEX3IPROC)(GLint x, GLint y, GLint z); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue); typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLDISABLEIPROC)(GLenum target, GLuint index); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort * v); typedef void (GLAD_API_PTR *PFNGLINVALIDATETEXIMAGEPROC)(GLuint texture, GLint level); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IPROC)(GLuint index, GLint x, GLint y); typedef void (GLAD_API_PTR *PFNGLINDEXFPROC)(GLfloat c); typedef void (GLAD_API_PTR *PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index); typedef void (GLAD_API_PTR *PFNGLGETNCONVOLUTIONFILTERPROC)(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void * image); typedef GLenum (GLAD_API_PTR *PFNGLGETERRORPROC)(void); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte * v); typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length); typedef void (GLAD_API_PTR *PFNGLTEXCOORDP1UIPROC)(GLenum type, GLuint coords); typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IVPROC)(GLenum target, const GLint * v); typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPROC)(GLuint program); typedef GLboolean (GLAD_API_PTR *PFNGLISLISTPROC)(GLuint list); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLPUSHATTRIBPROC)(GLbitfield mask); typedef void (GLAD_API_PTR *PFNGLFRONTFACEPROC)(GLenum mode); typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLuint baseinstance); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SPROC)(GLenum target, GLshort s); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IPROC)(GLuint index, GLint x, GLint y, GLint z); typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); typedef void (GLAD_API_PTR *PFNGLGENSAMPLERSPROC)(GLsizei count, GLuint * samplers); typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFPROC)(GLuint sampler, GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLRASTERPOS4FVPROC)(const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLPAUSETRANSFORMFEEDBACKPROC)(void); typedef void (GLAD_API_PTR *PFNGLPOPNAMEPROC)(void); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IVPROC)(GLuint index, const GLint * v); typedef void (GLAD_API_PTR *PFNGLEVALCOORD1FPROC)(GLfloat u); typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers); typedef void (GLAD_API_PTR *PFNGLLIGHTIPROC)(GLenum light, GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLTEXTUREVIEWPROC)(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); typedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXDPROC)(const GLdouble * m); typedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLuint framebuffer, GLenum attachment, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLUNIFORM4DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z); typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTERPROC)(GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask); typedef void (GLAD_API_PTR *PFNGLUNIFORM1IPROC)(GLint location, GLint v0); typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, GLuint * params); typedef void (GLAD_API_PTR *PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC)(GLuint framebuffer, GLsizei numAttachments, const GLenum * attachments); typedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERFVPROC)(GLenum pname, const GLfloat * values); typedef void (GLAD_API_PTR *PFNGLFOGFVPROC)(GLenum pname, const GLfloat * params); typedef void (GLAD_API_PTR *PFNGLVERTEXP3UIPROC)(GLenum type, GLuint value); typedef void (GLAD_API_PTR *PFNGLREADNPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void * data); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IPROC)(GLenum target, GLint s); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBBINDINGPROC)(GLuint attribindex, GLuint bindingindex); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DVPROC)(GLenum target, const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLVERTEX4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAD_API_PTR *PFNGLVERTEXBINDINGDIVISORPROC)(GLuint bindingindex, GLuint divisor); typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFVPROC)(GLuint texture, GLenum pname, const GLfloat * param); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLNORMAL3BPROC)(GLbyte nx, GLbyte ny, GLbyte nz); typedef void (GLAD_API_PTR *PFNGLGETUNIFORMSUBROUTINEUIVPROC)(GLenum shadertype, GLint location, GLuint * params); typedef void (GLAD_API_PTR *PFNGLVERTEX3SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SVPROC)(GLenum target, const GLshort * v); typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPARAMETERI64VPROC)(GLuint buffer, GLenum pname, GLint64 * params); typedef void (GLAD_API_PTR *PFNGLDRAWPIXELSPROC)(GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); typedef void (GLAD_API_PTR *PFNGLCALLLISTSPROC)(GLsizei n, GLenum type, const void * lists); typedef void (GLAD_API_PTR *PFNGLTEXCOORD3IPROC)(GLint s, GLint t, GLint r); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1); typedef void (GLAD_API_PTR *PFNGLQUERYCOUNTERPROC)(GLuint id, GLenum target); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint * value); typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask); typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPARAMETERIVPROC)(GLuint buffer, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index); typedef void (GLAD_API_PTR *PFNGLMATERIALIPROC)(GLenum face, GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLRASTERPOS3FVPROC)(const GLfloat * v); typedef GLint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)(GLuint program, GLenum programInterface, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble * data); typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLCOLOR4BVPROC)(const GLbyte * v); typedef void (GLAD_API_PTR *PFNGLGETINTERNALFORMATIVPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint * values); typedef void (GLAD_API_PTR *PFNGLGETQUERYINDEXEDIVPROC)(GLenum target, GLuint index, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLBINDVERTEXBUFFERPROC)(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); typedef void (GLAD_API_PTR *PFNGLTEXCOORD3FPROC)(GLfloat s, GLfloat t, GLfloat r); typedef void (GLAD_API_PTR *PFNGLCOLOR3UIVPROC)(const GLuint * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte * v); typedef void (GLAD_API_PTR *PFNGLCLEARPROC)(GLbitfield mask); typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLTEXCOORD2SPROC)(GLshort s, GLshort t); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (GLAD_API_PTR *PFNGLTEXENVIPROC)(GLenum target, GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFPROC)(GLuint texture, GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLMATERIALFPROC)(GLenum face, GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLGETUNIFORMDVPROC)(GLuint program, GLint location, GLdouble * params); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, const GLuint * params); typedef void (GLAD_API_PTR *PFNGLCLEARINDEXPROC)(GLfloat c); typedef void (GLAD_API_PTR *PFNGLDISPATCHCOMPUTEINDIRECTPROC)(GLintptr indirect); typedef void (GLAD_API_PTR *PFNGLROTATEFPROC)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETCLAMPPROC)(GLfloat factor, GLfloat units, GLfloat clamp); typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, const GLuint * param); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBLDVPROC)(GLuint index, GLenum pname, GLdouble * params); typedef void (GLAD_API_PTR *PFNGLRASTERPOS2FVPROC)(const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLSHADEMODELPROC)(GLenum mode); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLNORMAL3FVPROC)(const GLfloat * v); typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERPROC)(GLuint buffer); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r); typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)(GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLBINDBUFFERBASEPROC)(GLenum target, GLuint index, GLuint buffer); typedef void (GLAD_API_PTR *PFNGLGENBUFFERSPROC)(GLsizei n, GLuint * buffers); typedef void (GLAD_API_PTR *PFNGLTEXCOORD1FPROC)(GLfloat s); typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void * data); typedef void (GLAD_API_PTR *PFNGLCREATETRANSFORMFEEDBACKSPROC)(GLsizei n, GLuint * ids); typedef 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); typedef void (GLAD_API_PTR *PFNGLCREATEBUFFERSPROC)(GLsizei n, GLuint * buffers); typedef void (GLAD_API_PTR *PFNGLCOLOR3USVPROC)(const GLushort * v); typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, GLfloat * params); typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLVERTEX2DPROC)(GLdouble x, GLdouble y); typedef GLint (GLAD_API_PTR *PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)(GLuint program, GLenum shadertype, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void * data); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLGETINTEGER64I_VPROC)(GLenum target, GLuint index, GLint64 * data); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DPROC)(GLuint index, GLdouble x); typedef void (GLAD_API_PTR *PFNGLGETTEXTUREIMAGEPROC)(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void * pixels); typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMIVPROC)(GLuint program, GLint location, GLsizei bufSize, GLint * params); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IPROC)(GLuint program, GLint location, GLint v0); typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)(GLenum mode, GLuint id, GLsizei instancecount); typedef GLuint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEINDEXPROC)(GLuint program, GLenum programInterface, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1); typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPNAMEDBUFFERPROC)(GLuint buffer); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FPROC)(GLenum target, GLfloat s, GLfloat t); typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat * params); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DVPROC)(GLenum target, const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLCOLORMATERIALPROC)(GLenum face, GLenum mode); typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONPROC)(GLenum mode); typedef 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); typedef void (GLAD_API_PTR *PFNGLCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IVPROC)(GLenum target, const GLint * v); typedef void (GLAD_API_PTR *PFNGLLIGHTFVPROC)(GLenum light, GLenum pname, const GLfloat * params); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLDEPTHMASKPROC)(GLboolean flag); typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIPROC)(GLuint program, GLint location, GLuint v0); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void * indirect); typedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXFPROC)(const GLfloat * m); typedef void (GLAD_API_PTR *PFNGLENDQUERYINDEXEDPROC)(GLenum target, GLuint index); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue); typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC)(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (GLAD_API_PTR *PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint * value); typedef void (GLAD_API_PTR *PFNGLRASTERPOS2SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLVERTEX2IPROC)(GLint x, GLint y); typedef void (GLAD_API_PTR *PFNGLFRUSTUMPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); typedef void (GLAD_API_PTR *PFNGLMEMORYBARRIERPROC)(GLbitfield barriers); typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGPROC)(GLenum name); typedef void (GLAD_API_PTR *PFNGLLINEWIDTHPROC)(GLfloat width); typedef void (GLAD_API_PTR *PFNGLNORMALPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMUIVPROC)(GLuint program, GLint location, GLsizei bufSize, GLuint * params); typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEARRAYVPROC)(GLuint first, GLsizei count, const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLTEXCOORDP2UIPROC)(GLenum type, GLuint coords); typedef void (GLAD_API_PTR *PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader); typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count); typedef void (GLAD_API_PTR *PFNGLCOLOR4SPROC)(GLshort red, GLshort green, GLshort blue, GLshort alpha); typedef void (GLAD_API_PTR *PFNGLTEXGENDVPROC)(GLenum coord, GLenum pname, const GLdouble * params); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, GLuint * params); typedef void (GLAD_API_PTR *PFNGLENDQUERYPROC)(GLenum target); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SPROC)(GLshort x, GLshort y); typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINDIRECTPROC)(GLenum mode, const void * indirect); typedef void (GLAD_API_PTR *PFNGLRASTERPOS3SPROC)(GLshort x, GLshort y, GLshort z); typedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPFVPROC)(GLenum map, GLsizei bufSize, GLfloat * values); typedef void (GLAD_API_PTR *PFNGLTEXCOORD3SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLRECTIPROC)(GLint x1, GLint y1, GLint x2, GLint y2); typedef void (GLAD_API_PTR *PFNGLUNIFORM4DVPROC)(GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEIPROC)(GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEIVPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum * props, GLsizei bufSize, GLsizei * length, GLint * params); typedef void (GLAD_API_PTR *PFNGLINVALIDATESUBFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum * attachments, GLint x, GLint y, GLsizei width, GLsizei height); typedef GLsync (GLAD_API_PTR *PFNGLFENCESYNCPROC)(GLenum condition, GLbitfield flags); typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORP3UIVPROC)(GLenum type, const GLuint * color); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort * v); typedef void (GLAD_API_PTR *PFNGLLOADMATRIXFPROC)(const GLfloat * m); typedef void (GLAD_API_PTR *PFNGLTRANSLATEFPROC)(GLfloat x, GLfloat y, GLfloat z); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVPROC)(GLenum target, const GLshort * v); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); typedef void (GLAD_API_PTR *PFNGLMAPGRID2FPROC)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); typedef void (GLAD_API_PTR *PFNGLENABLECLIENTSTATEPROC)(GLenum array); typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint * params); typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DVPROC)(const GLdouble * u); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IVPROC)(GLuint index, const GLint * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort * v); typedef void (GLAD_API_PTR *PFNGLGETMULTISAMPLEFVPROC)(GLenum pname, GLuint index, GLfloat * val); typedef void (GLAD_API_PTR *PFNGLINDEXDVPROC)(const GLdouble * c); typedef void (GLAD_API_PTR *PFNGLBLENDFUNCIPROC)(GLuint buf, GLenum src, GLenum dst); typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDPROC)(GLenum cap); typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUSVPROC)(GLenum map, GLushort * values); typedef void (GLAD_API_PTR *PFNGLRASTERPOS3IVPROC)(const GLint * v); typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SPROC)(GLenum target, GLshort s, GLshort t); typedef void (GLAD_API_PTR *PFNGLRASTERPOS2FPROC)(GLfloat x, GLfloat y); typedef void (GLAD_API_PTR *PFNGLMINSAMPLESHADINGPROC)(GLfloat value); typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTUI64VPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IPROC)(GLenum target, GLint s, GLint t); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLVERTEX2FPROC)(GLfloat x, GLfloat y); typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYBINDINGDIVISORPROC)(GLuint vaobj, GLuint bindingindex, GLuint divisor); typedef void (GLAD_API_PTR *PFNGLINDEXPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); typedef GLint (GLAD_API_PTR *PFNGLRENDERMODEPROC)(GLenum mode); typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE1DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void * data); typedef void (GLAD_API_PTR *PFNGLCOLOR3FVPROC)(const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLBITMAPPROC)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DPROC)(GLdouble x, GLdouble y); typedef void (GLAD_API_PTR *PFNGLGETUNIFORMINDICESPROC)(GLuint program, GLsizei uniformCount, const GLchar *const* uniformNames, GLuint * uniformIndices); typedef void (GLAD_API_PTR *PFNGLENABLEIPROC)(GLenum target, GLuint index); typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSTORAGEPROC)(GLuint buffer, GLsizeiptr size, const void * data, GLbitfield flags); typedef void (GLAD_API_PTR *PFNGLRECTSPROC)(GLshort x1, GLshort y1, GLshort x2, GLshort y2); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLPOLYGONSTIPPLEPROC)(const GLubyte * mask); typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z); typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLSHADERSTORAGEBLOCKBINDINGPROC)(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); typedef void (GLAD_API_PTR *PFNGLLOADIDENTITYPROC)(void); typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount, const GLint * basevertex); typedef void (GLAD_API_PTR *PFNGLVERTEX2SPROC)(GLshort x, GLshort y); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IVPROC)(GLenum target, const GLint * v); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); typedef void (GLAD_API_PTR *PFNGLRELEASESHADERCOMPILERPROC)(void); typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SVPROC)(GLenum target, const GLshort * v); typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params); typedef GLboolean (GLAD_API_PTR *PFNGLISSHADERPROC)(GLuint shader); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint * v); typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IPROC)(GLint s, GLint t, GLint r, GLint q); typedef void (GLAD_API_PTR *PFNGLCOLOR4UIPROC)(GLuint red, GLuint green, GLuint blue, GLuint alpha); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLGETTEXENVFVPROC)(GLenum target, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLTEXCOORD4DPROC)(GLdouble s, GLdouble t, GLdouble r, GLdouble q); typedef void (GLAD_API_PTR *PFNGLSCISSORARRAYVPROC)(GLuint first, GLsizei count, const GLint * v); typedef void (GLAD_API_PTR *PFNGLCREATERENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLCOLOR4FPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLNORMAL3IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLBINDIMAGETEXTURESPROC)(GLuint first, GLsizei count, const GLuint * textures); typedef void (GLAD_API_PTR *PFNGLTEXGENIVPROC)(GLenum coord, GLenum pname, const GLint * params); typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * data); typedef void (GLAD_API_PTR *PFNGLSCALEDPROC)(GLdouble x, GLdouble y, GLdouble z); typedef void (GLAD_API_PTR *PFNGLCREATEPROGRAMPIPELINESPROC)(GLsizei n, GLuint * pipelines); typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEIPROC)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); typedef void (GLAD_API_PTR *PFNGLHINTPROC)(GLenum target, GLenum mode); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IPROC)(GLenum target, GLint s, GLint t, GLint r, GLint q); typedef void (GLAD_API_PTR *PFNGLINDEXMASKPROC)(GLuint mask); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1); typedef void (GLAD_API_PTR *PFNGLCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIVPROC)(GLuint index, const GLuint * v); typedef void (GLAD_API_PTR *PFNGLSPECIALIZESHADERPROC)(GLuint shader, const GLchar * pEntryPoint, GLuint numSpecializationConstants, const GLuint * pConstantIndex, const GLuint * pConstantValue); typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)(GLuint framebuffer, GLenum buf); typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTI64VPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); typedef void (GLAD_API_PTR *PFNGLTEXCOORD3IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, const GLfloat * param); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIIVPROC)(GLuint index, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLBUFFERSTORAGEPROC)(GLenum target, GLsizeiptr size, const void * data, GLbitfield flags); typedef void (GLAD_API_PTR *PFNGLVERTEX3SPROC)(GLshort x, GLshort y, GLshort z); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f); typedef void (GLAD_API_PTR *PFNGLRASTERPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z); typedef void (GLAD_API_PTR *PFNGLDELETESHADERPROC)(GLuint shader); typedef void (GLAD_API_PTR *PFNGLCOLOR3BVPROC)(const GLbyte * v); typedef void (GLAD_API_PTR *PFNGLCOLOR3UBVPROC)(const GLubyte * v); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SVPROC)(const GLshort * v); typedef 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); typedef void (GLAD_API_PTR *PFNGLFOGCOORDFPROC)(GLfloat coord); typedef void (GLAD_API_PTR *PFNGLEDGEFLAGVPROC)(const GLboolean * flag); typedef void (GLAD_API_PTR *PFNGLCLIPCONTROLPROC)(GLenum origin, GLenum depth); typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKIVPROC)(GLuint xfb, GLenum pname, GLint * param); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEIVPROC)(GLuint pipeline, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETNMINMAXPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void * values); typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLCOLORP4UIPROC)(GLenum type, GLuint color); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SVPROC)(GLenum target, const GLshort * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLVERTEXP4UIPROC)(GLenum type, GLuint value); typedef void (GLAD_API_PTR *PFNGLRECTFVPROC)(const GLfloat * v1, const GLfloat * v2); typedef void (GLAD_API_PTR *PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode); typedef void (GLAD_API_PTR *PFNGLARRAYELEMENTPROC)(GLint i); typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (GLAD_API_PTR *PFNGLBEGINPROC)(GLenum mode); typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLTEXCOORD3DPROC)(GLdouble s, GLdouble t, GLdouble r); typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort * v); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEINFOLOGPROC)(GLuint pipeline, GLsizei bufSize, GLsizei * length, GLchar * infoLog); typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units); typedef void (GLAD_API_PTR *PFNGLGETSHADERPRECISIONFORMATPROC)(GLenum shadertype, GLenum precisiontype, GLint * range, GLint * precision); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLBINDTRANSFORMFEEDBACKPROC)(GLenum target, GLuint id); typedef void (GLAD_API_PTR *PFNGLPROVOKINGVERTEXPROC)(GLenum mode); typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXARRAYATTRIBPROC)(GLuint vaobj, GLuint index); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FVPROC)(GLenum target, const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLUNIFORM1DPROC)(GLint location, GLdouble x); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); typedef void (GLAD_API_PTR *PFNGLMEMORYBARRIERBYREGIONPROC)(GLbitfield barriers); typedef void (GLAD_API_PTR *PFNGLPOPDEBUGGROUPPROC)(void); typedef void (GLAD_API_PTR *PFNGLCOLOR4BPROC)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); typedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFERPROC)(GLuint texture, GLenum internalformat, GLuint buffer); typedef void (GLAD_API_PTR *PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLBEGINQUERYINDEXEDPROC)(GLenum target, GLuint index, GLuint id); typedef void (GLAD_API_PTR *PFNGLCOPYNAMEDBUFFERSUBDATAPROC)(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); typedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFERRANGEPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef void (GLAD_API_PTR *PFNGLCOLOR4UIVPROC)(const GLuint * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLFOGIVPROC)(GLenum pname, const GLint * params); typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIIVPROC)(GLuint texture, GLenum pname, const GLint * params); typedef void (GLAD_API_PTR *PFNGLLISTBASEPROC)(GLuint base); typedef void (GLAD_API_PTR *PFNGLCREATEFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers); typedef void (GLAD_API_PTR *PFNGLEVALCOORD2FPROC)(GLfloat u, GLfloat v); typedef void (GLAD_API_PTR *PFNGLVERTEX4DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPROC)(GLuint program); typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices); typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)(GLenum mode, GLuint id, GLuint stream); typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPROC)(GLuint program); typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount); typedef GLuint (GLAD_API_PTR *PFNGLGENLISTSPROC)(GLsizei range); typedef void (GLAD_API_PTR *PFNGLCOLOR4IPROC)(GLint red, GLint green, GLint blue, GLint alpha); typedef void (GLAD_API_PTR *PFNGLCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue); typedef void (GLAD_API_PTR *PFNGLCREATETEXTURESPROC)(GLenum target, GLsizei n, GLuint * textures); typedef void (GLAD_API_PTR *PFNGLCOLORP4UIVPROC)(GLenum type, const GLuint * color); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFIPROC)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPROC)(GLboolean flag); typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERI64VPROC)(GLenum target, GLenum pname, GLint64 * params); typedef void (GLAD_API_PTR *PFNGLRASTERPOS2IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLGETNMAPIVPROC)(GLenum target, GLenum query, GLsizei bufSize, GLint * v); typedef void (GLAD_API_PTR *PFNGLRECTDVPROC)(const GLdouble * v1, const GLdouble * v2); typedef void (GLAD_API_PTR *PFNGLGETBOOLEANI_VPROC)(GLenum target, GLuint index, GLboolean * data); typedef void (GLAD_API_PTR *PFNGLENDLISTPROC)(void); typedef void (GLAD_API_PTR *PFNGLFLUSHPROC)(void); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC)(GLenum mode, GLenum type, const void * indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); typedef void (GLAD_API_PTR *PFNGLGETINTEGER64VPROC)(GLenum pname, GLint64 * data); typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFPROC)(GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint * v); typedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERIVPROC)(GLuint texture, GLint level, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLLOADMATRIXDPROC)(const GLdouble * m); typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMPIPELINEPROC)(GLuint pipeline); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index); typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHPROC)(GLdouble depth); typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FVPROC)(const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef GLint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONPROC)(GLuint program, GLenum programInterface, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLTEXCOORD2DPROC)(GLdouble s, GLdouble t); typedef void (GLAD_API_PTR *PFNGLACCUMPROC)(GLenum op, GLfloat value); typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORP3UIPROC)(GLenum type, GLuint color); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIPROC)(GLuint index, GLuint x, GLuint y); typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMFVPROC)(GLuint program, GLint location, GLsizei bufSize, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLFOGIPROC)(GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFVPROC)(GLenum buffer, GLint drawbuffer, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLTEXENVIVPROC)(GLenum target, GLenum pname, const GLint * params); typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels); typedef void (GLAD_API_PTR *PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)(GLuint program, GLuint bufferIndex, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FVPROC)(GLenum target, const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLGETOBJECTPTRLABELPROC)(const void * ptr, GLsizei bufSize, GLsizei * length, GLchar * label); GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIIVPROC glad_glGetTextureParameterIiv; #define glGetTextureParameterIiv glad_glGetTextureParameterIiv GLAD_API_CALL PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv; #define glTexCoordP1uiv glad_glTexCoordP1uiv GLAD_API_CALL PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC glad_glTextureStorage3DMultisample; #define glTextureStorage3DMultisample glad_glTextureStorage3DMultisample GLAD_API_CALL PFNGLEVALPOINT2PROC glad_glEvalPoint2; #define glEvalPoint2 glad_glEvalPoint2 GLAD_API_CALL PFNGLVERTEXARRAYATTRIBBINDINGPROC glad_glVertexArrayAttribBinding; #define glVertexArrayAttribBinding glad_glVertexArrayAttribBinding GLAD_API_CALL PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC glad_glFlushMappedNamedBufferRange; #define glFlushMappedNamedBufferRange glad_glFlushMappedNamedBufferRange GLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC glad_glGetNamedFramebufferParameteriv; #define glGetNamedFramebufferParameteriv glad_glGetNamedFramebufferParameteriv GLAD_API_CALL PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf; #define glPixelTransferf glad_glPixelTransferf GLAD_API_CALL PFNGLGETFLOATI_VPROC glad_glGetFloati_v; #define glGetFloati_v glad_glGetFloati_v GLAD_API_CALL PFNGLLOADNAMEPROC glad_glLoadName; #define glLoadName glad_glLoadName GLAD_API_CALL PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv; #define glUniformMatrix4fv glad_glUniformMatrix4fv GLAD_API_CALL PFNGLSECONDARYCOLOR3SVPROC glad_glSecondaryColor3sv; #define glSecondaryColor3sv glad_glSecondaryColor3sv GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE1DPROC glad_glCopyTextureSubImage1D; #define glCopyTextureSubImage1D glad_glCopyTextureSubImage1D GLAD_API_CALL PFNGLSECONDARYCOLOR3UIVPROC glad_glSecondaryColor3uiv; #define glSecondaryColor3uiv glad_glSecondaryColor3uiv GLAD_API_CALL PFNGLUNIFORM1DVPROC glad_glUniform1dv; #define glUniform1dv glad_glUniform1dv GLAD_API_CALL PFNGLWINDOWPOS3DVPROC glad_glWindowPos3dv; #define glWindowPos3dv glad_glWindowPos3dv GLAD_API_CALL PFNGLSECONDARYCOLOR3BVPROC glad_glSecondaryColor3bv; #define glSecondaryColor3bv glad_glSecondaryColor3bv GLAD_API_CALL PFNGLSECONDARYCOLOR3UIPROC glad_glSecondaryColor3ui; #define glSecondaryColor3ui glad_glSecondaryColor3ui GLAD_API_CALL PFNGLGETNCOLORTABLEPROC glad_glGetnColorTable; #define glGetnColorTable glad_glGetnColorTable GLAD_API_CALL PFNGLRASTERPOS3IPROC glad_glRasterPos3i; #define glRasterPos3i glad_glRasterPos3i GLAD_API_CALL PFNGLACTIVETEXTUREPROC glad_glActiveTexture; #define glActiveTexture glad_glActiveTexture GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv; #define glVertexAttrib4Nuiv glad_glVertexAttrib4Nuiv GLAD_API_CALL PFNGLCLEARNAMEDBUFFERDATAPROC glad_glClearNamedBufferData; #define glClearNamedBufferData glad_glClearNamedBufferData GLAD_API_CALL PFNGLNORMAL3DPROC glad_glNormal3d; #define glNormal3d glad_glNormal3d GLAD_API_CALL PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC glad_glInvalidateNamedFramebufferSubData; #define glInvalidateNamedFramebufferSubData glad_glInvalidateNamedFramebufferSubData GLAD_API_CALL PFNGLBINDBUFFERSBASEPROC glad_glBindBuffersBase; #define glBindBuffersBase glad_glBindBuffersBase GLAD_API_CALL PFNGLEVALCOORD1DPROC glad_glEvalCoord1d; #define glEvalCoord1d glad_glEvalCoord1d GLAD_API_CALL PFNGLGETMAPFVPROC glad_glGetMapfv; #define glGetMapfv glad_glGetMapfv GLAD_API_CALL PFNGLISSYNCPROC glad_glIsSync; #define glIsSync glad_glIsSync GLAD_API_CALL PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D; #define glTexSubImage2D glad_glTexSubImage2D GLAD_API_CALL PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation; #define glGetAttribLocation glad_glGetAttribLocation GLAD_API_CALL PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D; #define glCopyTexImage1D glad_glCopyTexImage1D GLAD_API_CALL PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i; #define glProgramUniform4i glad_glProgramUniform4i GLAD_API_CALL PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv; #define glGetPixelMapfv glad_glGetPixelMapfv GLAD_API_CALL PFNGLVERTEX4SVPROC glad_glVertex4sv; #define glVertex4sv glad_glVertex4sv GLAD_API_CALL PFNGLTEXSTORAGE2DPROC glad_glTexStorage2D; #define glTexStorage2D glad_glTexStorage2D GLAD_API_CALL PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv; #define glTexCoord2fv glad_glTexCoord2fv GLAD_API_CALL PFNGLUNIFORMMATRIX3X2DVPROC glad_glUniformMatrix3x2dv; #define glUniformMatrix3x2dv glad_glUniformMatrix3x2dv GLAD_API_CALL PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv; #define glGetVertexAttribIuiv glad_glGetVertexAttribIuiv GLAD_API_CALL PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv; #define glVertexAttrib3sv glad_glVertexAttrib3sv GLAD_API_CALL PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex; #define glDrawRangeElementsBaseVertex glad_glDrawRangeElementsBaseVertex GLAD_API_CALL PFNGLDEPTHRANGEINDEXEDPROC glad_glDepthRangeIndexed; #define glDepthRangeIndexed glad_glDepthRangeIndexed GLAD_API_CALL PFNGLISQUERYPROC glad_glIsQuery; #define glIsQuery glad_glIsQuery GLAD_API_CALL PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines; #define glDeleteProgramPipelines glad_glDeleteProgramPipelines GLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERFVPROC glad_glGetTextureLevelParameterfv; #define glGetTextureLevelParameterfv glad_glGetTextureLevelParameterfv GLAD_API_CALL PFNGLUNIFORMMATRIX4X3DVPROC glad_glUniformMatrix4x3dv; #define glUniformMatrix4x3dv glad_glUniformMatrix4x3dv GLAD_API_CALL PFNGLBLITNAMEDFRAMEBUFFERPROC glad_glBlitNamedFramebuffer; #define glBlitNamedFramebuffer glad_glBlitNamedFramebuffer GLAD_API_CALL PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui; #define glMultiTexCoordP1ui glad_glMultiTexCoordP1ui GLAD_API_CALL PFNGLINDEXSPROC glad_glIndexs; #define glIndexs glad_glIndexs GLAD_API_CALL PFNGLCOLORP3UIPROC glad_glColorP3ui; #define glColorP3ui glad_glColorP3ui GLAD_API_CALL PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui; #define glMultiTexCoordP4ui glad_glMultiTexCoordP4ui GLAD_API_CALL PFNGLCREATESHADERPROC glad_glCreateShader; #define glCreateShader glad_glCreateShader GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERFIPROC glad_glClearNamedFramebufferfi; #define glClearNamedFramebufferfi glad_glClearNamedFramebufferfi GLAD_API_CALL PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC glad_glGetCompressedTextureImage; #define glGetCompressedTextureImage glad_glGetCompressedTextureImage GLAD_API_CALL PFNGLCOLOR4SVPROC glad_glColor4sv; #define glColor4sv glad_glColor4sv GLAD_API_CALL PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert; #define glDebugMessageInsert glad_glDebugMessageInsert GLAD_API_CALL PFNGLRECTFPROC glad_glRectf; #define glRectf glad_glRectf GLAD_API_CALL PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog; #define glGetDebugMessageLog glad_glGetDebugMessageLog GLAD_API_CALL PFNGLWINDOWPOS3SPROC glad_glWindowPos3s; #define glWindowPos3s glad_glWindowPos3s GLAD_API_CALL PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer; #define glIsFramebuffer glad_glIsFramebuffer GLAD_API_CALL PFNGLCOPYIMAGESUBDATAPROC glad_glCopyImageSubData; #define glCopyImageSubData glad_glCopyImageSubData GLAD_API_CALL PFNGLCOLORPOINTERPROC glad_glColorPointer; #define glColorPointer glad_glColorPointer GLAD_API_CALL PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv; #define glUniformMatrix4x3fv glad_glUniformMatrix4x3fv GLAD_API_CALL PFNGLGETMATERIALFVPROC glad_glGetMaterialfv; #define glGetMaterialfv glad_glGetMaterialfv GLAD_API_CALL PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv; #define glMultiTexCoord4iv glad_glMultiTexCoord4iv GLAD_API_CALL PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers; #define glDeleteSamplers glad_glDeleteSamplers GLAD_API_CALL PFNGLGETMATERIALIVPROC glad_glGetMaterialiv; #define glGetMaterialiv glad_glGetMaterialiv GLAD_API_CALL PFNGLBLENDFUNCPROC glad_glBlendFunc; #define glBlendFunc glad_glBlendFunc GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC glad_glNamedFramebufferRenderbuffer; #define glNamedFramebufferRenderbuffer glad_glNamedFramebufferRenderbuffer GLAD_API_CALL PFNGLNAMEDBUFFERDATAPROC glad_glNamedBufferData; #define glNamedBufferData glad_glNamedBufferData GLAD_API_CALL PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements; #define glMultiDrawElements glad_glMultiDrawElements GLAD_API_CALL PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i; #define glProgramUniform3i glad_glProgramUniform3i GLAD_API_CALL PFNGLGETPROGRAMSTAGEIVPROC glad_glGetProgramStageiv; #define glGetProgramStageiv glad_glGetProgramStageiv GLAD_API_CALL PFNGLVERTEXATTRIBLFORMATPROC glad_glVertexAttribLFormat; #define glVertexAttribLFormat glad_glVertexAttribLFormat GLAD_API_CALL PFNGLVERTEX2SVPROC glad_glVertex2sv; #define glVertex2sv glad_glVertex2sv GLAD_API_CALL PFNGLRECTSVPROC glad_glRectsv; #define glRectsv glad_glRectsv GLAD_API_CALL PFNGLTEXTURESTORAGE2DPROC glad_glTextureStorage2D; #define glTextureStorage2D glad_glTextureStorage2D GLAD_API_CALL PFNGLUNIFORM3FPROC glad_glUniform3f; #define glUniform3f glad_glUniform3f GLAD_API_CALL PFNGLDRAWBUFFERPROC glad_glDrawBuffer; #define glDrawBuffer glad_glDrawBuffer GLAD_API_CALL PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D; #define glTexSubImage1D glad_glTexSubImage1D GLAD_API_CALL PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv; #define glTexCoordP2uiv glad_glTexCoordP2uiv GLAD_API_CALL PFNGLUNIFORM4FPROC glad_glUniform4f; #define glUniform4f glad_glUniform4f GLAD_API_CALL PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d; #define glVertexAttrib2d glad_glVertexAttrib2d GLAD_API_CALL PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f; #define glVertexAttrib2f glad_glVertexAttrib2f GLAD_API_CALL PFNGLSECONDARYCOLOR3UBVPROC glad_glSecondaryColor3ubv; #define glSecondaryColor3ubv glad_glSecondaryColor3ubv GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers; #define glDeleteFramebuffers glad_glDeleteFramebuffers GLAD_API_CALL PFNGLCLEARCOLORPROC glad_glClearColor; #define glClearColor glad_glClearColor GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer; #define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer GLAD_API_CALL PFNGLGETTEXGENFVPROC glad_glGetTexGenfv; #define glGetTexGenfv glad_glGetTexGenfv GLAD_API_CALL PFNGLCOLOR4DVPROC glad_glColor4dv; #define glColor4dv glad_glColor4dv GLAD_API_CALL PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv; #define glMultiTexCoordP4uiv glad_glMultiTexCoordP4uiv GLAD_API_CALL PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram; #define glActiveShaderProgram glad_glActiveShaderProgram GLAD_API_CALL PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender; #define glBeginConditionalRender glad_glBeginConditionalRender GLAD_API_CALL PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample; #define glTexImage3DMultisample glad_glTexImage3DMultisample GLAD_API_CALL PFNGLVIEWPORTINDEXEDFVPROC glad_glViewportIndexedfv; #define glViewportIndexedfv glad_glViewportIndexedfv GLAD_API_CALL PFNGLMAPGRID1FPROC glad_glMapGrid1f; #define glMapGrid1f glad_glMapGrid1f GLAD_API_CALL PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d; #define glMultiTexCoord3d glad_glMultiTexCoord3d GLAD_API_CALL PFNGLWINDOWPOS2DVPROC glad_glWindowPos2dv; #define glWindowPos2dv glad_glWindowPos2dv GLAD_API_CALL PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv; #define glGetBufferPointerv glad_glGetBufferPointerv GLAD_API_CALL PFNGLTEXGENFVPROC glad_glTexGenfv; #define glTexGenfv glad_glTexGenfv GLAD_API_CALL PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv; #define glVertexAttribP4uiv glad_glVertexAttribP4uiv GLAD_API_CALL PFNGLROTATEDPROC glad_glRotated; #define glRotated glad_glRotated GLAD_API_CALL PFNGLCREATEQUERIESPROC glad_glCreateQueries; #define glCreateQueries glad_glCreateQueries GLAD_API_CALL PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv; #define glUniformMatrix3x2fv glad_glUniformMatrix3x2fv GLAD_API_CALL PFNGLTEXIMAGE1DPROC glad_glTexImage1D; #define glTexImage1D glad_glTexImage1D GLAD_API_CALL PFNGLWINDOWPOS3IPROC glad_glWindowPos3i; #define glWindowPos3i glad_glWindowPos3i GLAD_API_CALL PFNGLCLAMPCOLORPROC glad_glClampColor; #define glClampColor glad_glClampColor GLAD_API_CALL PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv; #define glUniformMatrix4x2fv glad_glUniformMatrix4x2fv GLAD_API_CALL PFNGLVERTEX4FPROC glad_glVertex4f; #define glVertex4f glad_glVertex4f GLAD_API_CALL PFNGLNORMAL3FPROC glad_glNormal3f; #define glNormal3f glad_glNormal3f GLAD_API_CALL PFNGLCOLOR3UBPROC glad_glColor3ub; #define glColor3ub glad_glColor3ub GLAD_API_CALL PFNGLSCISSORINDEXEDPROC glad_glScissorIndexed; #define glScissorIndexed glad_glScissorIndexed GLAD_API_CALL PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib; #define glPushClientAttrib glad_glPushClientAttrib GLAD_API_CALL PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d; #define glVertexAttrib4d glad_glVertexAttrib4d GLAD_API_CALL PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages; #define glUseProgramStages glad_glUseProgramStages GLAD_API_CALL PFNGLTEXCOORD3SPROC glad_glTexCoord3s; #define glTexCoord3s glad_glTexCoord3s GLAD_API_CALL PFNGLLIGHTFPROC glad_glLightf; #define glLightf glad_glLightf GLAD_API_CALL PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv; #define glTexCoord3fv glad_glTexCoord3fv GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv; #define glVertexAttrib4Nubv glad_glVertexAttrib4Nubv GLAD_API_CALL PFNGLVERTEXATTRIBL2DPROC glad_glVertexAttribL2d; #define glVertexAttribL2d glad_glVertexAttribL2d GLAD_API_CALL PFNGLFOGCOORDDPROC glad_glFogCoordd; #define glFogCoordd glad_glFogCoordd GLAD_API_CALL PFNGLGETNPIXELMAPUIVPROC glad_glGetnPixelMapuiv; #define glGetnPixelMapuiv glad_glGetnPixelMapuiv GLAD_API_CALL PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample; #define glTexImage2DMultisample glad_glTexImage2DMultisample GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTIVPROC glad_glGetQueryBufferObjectiv; #define glGetQueryBufferObjectiv glad_glGetQueryBufferObjectiv GLAD_API_CALL PFNGLGETSTRINGIPROC glad_glGetStringi; #define glGetStringi glad_glGetStringi GLAD_API_CALL PFNGLRASTERPOS4SPROC glad_glRasterPos4s; #define glRasterPos4s glad_glRasterPos4s GLAD_API_CALL PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui; #define glVertexAttribP2ui glad_glVertexAttribP2ui GLAD_API_CALL PFNGLGETQUERYIVPROC glad_glGetQueryiv; #define glGetQueryiv glad_glGetQueryiv GLAD_API_CALL PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray; #define glBindVertexArray glad_glBindVertexArray GLAD_API_CALL PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv; #define glProgramUniform3dv glad_glProgramUniform3dv GLAD_API_CALL PFNGLTEXPARAMETERFPROC glad_glTexParameterf; #define glTexParameterf glad_glTexParameterf GLAD_API_CALL PFNGLWINDOWPOS3DPROC glad_glWindowPos3d; #define glWindowPos3d glad_glWindowPos3d GLAD_API_CALL PFNGLGENERATETEXTUREMIPMAPPROC glad_glGenerateTextureMipmap; #define glGenerateTextureMipmap glad_glGenerateTextureMipmap GLAD_API_CALL PFNGLDELETESYNCPROC glad_glDeleteSync; #define glDeleteSync glad_glDeleteSync GLAD_API_CALL PFNGLBINDBUFFERPROC glad_glBindBuffer; #define glBindBuffer glad_glBindBuffer GLAD_API_CALL PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup; #define glPushDebugGroup glad_glPushDebugGroup GLAD_API_CALL PFNGLRASTERPOS2IPROC glad_glRasterPos2i; #define glRasterPos2i glad_glRasterPos2i GLAD_API_CALL PFNGLBINDIMAGETEXTUREPROC glad_glBindImageTexture; #define glBindImageTexture glad_glBindImageTexture GLAD_API_CALL PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer; #define glFeedbackBuffer glad_glFeedbackBuffer GLAD_API_CALL PFNGLEVALMESH2PROC glad_glEvalMesh2; #define glEvalMesh2 glad_glEvalMesh2 GLAD_API_CALL PFNGLLINKPROGRAMPROC glad_glLinkProgram; #define glLinkProgram glad_glLinkProgram GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D; #define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D GLAD_API_CALL PFNGLPUSHMATRIXPROC glad_glPushMatrix; #define glPushMatrix glad_glPushMatrix GLAD_API_CALL PFNGLFRAMEBUFFERPARAMETERIPROC glad_glFramebufferParameteri; #define glFramebufferParameteri glad_glFramebufferParameteri GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName; #define glGetActiveUniformBlockName glad_glGetActiveUniformBlockName GLAD_API_CALL PFNGLUNIFORM3DPROC glad_glUniform3d; #define glUniform3d glad_glUniform3d GLAD_API_CALL PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv; #define glVertexAttrib4ubv glad_glVertexAttrib4ubv GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D; #define glCompressedTexImage1D glad_glCompressedTexImage1D GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKI64_VPROC glad_glGetTransformFeedbacki64_v; #define glGetTransformFeedbacki64_v glad_glGetTransformFeedbacki64_v GLAD_API_CALL PFNGLCOMPILESHADERPROC glad_glCompileShader; #define glCompileShader glad_glCompileShader GLAD_API_CALL PFNGLGETLIGHTFVPROC glad_glGetLightfv; #define glGetLightfv glad_glGetLightfv GLAD_API_CALL PFNGLPIXELMAPUSVPROC glad_glPixelMapusv; #define glPixelMapusv glad_glPixelMapusv GLAD_API_CALL PFNGLRASTERPOS4IPROC glad_glRasterPos4i; #define glRasterPos4i glad_glRasterPos4i GLAD_API_CALL PFNGLUNIFORMMATRIX4X2DVPROC glad_glUniformMatrix4x2dv; #define glUniformMatrix4x2dv glad_glUniformMatrix4x2dv GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D; #define glFramebufferTexture1D glad_glFramebufferTexture1D GLAD_API_CALL PFNGLINITNAMESPROC glad_glInitNames; #define glInitNames glad_glInitNames GLAD_API_CALL PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui; #define glVertexAttribI1ui glad_glVertexAttribI1ui GLAD_API_CALL PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv; #define glClearBufferiv glad_glClearBufferiv GLAD_API_CALL PFNGLMAP1FPROC glad_glMap1f; #define glMap1f glad_glMap1f GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv; #define glProgramUniformMatrix4dv glad_glProgramUniformMatrix4dv GLAD_API_CALL PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv; #define glGetVertexAttribfv glad_glGetVertexAttribfv GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv; #define glGetActiveUniformBlockiv glad_glGetActiveUniformBlockiv GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample; #define glRenderbufferStorageMultisample glad_glRenderbufferStorageMultisample GLAD_API_CALL PFNGLGETVERTEXARRAYINDEXEDIVPROC glad_glGetVertexArrayIndexediv; #define glGetVertexArrayIndexediv glad_glGetVertexArrayIndexediv GLAD_API_CALL PFNGLVERTEXARRAYELEMENTBUFFERPROC glad_glVertexArrayElementBuffer; #define glVertexArrayElementBuffer glad_glVertexArrayElementBuffer GLAD_API_CALL PFNGLGETTEXGENDVPROC glad_glGetTexGendv; #define glGetTexGendv glad_glGetTexGendv GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERFVPROC glad_glClearNamedFramebufferfv; #define glClearNamedFramebufferfv glad_glClearNamedFramebufferfv GLAD_API_CALL PFNGLSECONDARYCOLOR3FPROC glad_glSecondaryColor3f; #define glSecondaryColor3f glad_glSecondaryColor3f GLAD_API_CALL PFNGLSHADERBINARYPROC glad_glShaderBinary; #define glShaderBinary glad_glShaderBinary GLAD_API_CALL PFNGLMAP1DPROC glad_glMap1d; #define glMap1d glad_glMap1d GLAD_API_CALL PFNGLVERTEXATTRIBL2DVPROC glad_glVertexAttribL2dv; #define glVertexAttribL2dv glad_glVertexAttribL2dv GLAD_API_CALL PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d; #define glMultiTexCoord4d glad_glMultiTexCoord4d GLAD_API_CALL PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv; #define glTexCoord1dv glad_glTexCoord1dv GLAD_API_CALL PFNGLTEXSTORAGE2DMULTISAMPLEPROC glad_glTexStorage2DMultisample; #define glTexStorage2DMultisample glad_glTexStorage2DMultisample GLAD_API_CALL PFNGLGENTRANSFORMFEEDBACKSPROC glad_glGenTransformFeedbacks; #define glGenTransformFeedbacks glad_glGenTransformFeedbacks GLAD_API_CALL PFNGLCLEARBUFFERSUBDATAPROC glad_glClearBufferSubData; #define glClearBufferSubData glad_glClearBufferSubData GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv; #define glProgramUniformMatrix2fv glad_glProgramUniformMatrix2fv GLAD_API_CALL PFNGLGETFRAMEBUFFERPARAMETERIVPROC glad_glGetFramebufferParameteriv; #define glGetFramebufferParameteriv glad_glGetFramebufferParameteriv GLAD_API_CALL PFNGLPIXELMAPFVPROC glad_glPixelMapfv; #define glPixelMapfv glad_glPixelMapfv GLAD_API_CALL PFNGLCOLOR3FPROC glad_glColor3f; #define glColor3f glad_glColor3f GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv; #define glProgramUniformMatrix4x3dv glad_glProgramUniformMatrix4x3dv GLAD_API_CALL PFNGLMULTMATRIXDPROC glad_glMultMatrixd; #define glMultMatrixd glad_glMultMatrixd GLAD_API_CALL PFNGLCOPYPIXELSPROC glad_glCopyPixels; #define glCopyPixels glad_glCopyPixels GLAD_API_CALL PFNGLUNIFORM2DVPROC glad_glUniform2dv; #define glUniform2dv glad_glUniform2dv GLAD_API_CALL PFNGLCOLOR3SVPROC glad_glColor3sv; #define glColor3sv glad_glColor3sv GLAD_API_CALL PFNGLOBJECTLABELPROC glad_glObjectLabel; #define glObjectLabel glad_glObjectLabel GLAD_API_CALL PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel; #define glGetObjectLabel glad_glGetObjectLabel GLAD_API_CALL PFNGLINDEXFVPROC glad_glIndexfv; #define glIndexfv glad_glIndexfv GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC glad_glCompressedTextureSubImage3D; #define glCompressedTextureSubImage3D glad_glCompressedTextureSubImage3D GLAD_API_CALL PFNGLMAPGRID1DPROC glad_glMapGrid1d; #define glMapGrid1d glad_glMapGrid1d GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTUIVPROC glad_glGetQueryBufferObjectuiv; #define glGetQueryBufferObjectuiv glad_glGetQueryBufferObjectuiv GLAD_API_CALL PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv; #define glRasterPos3sv glad_glRasterPos3sv GLAD_API_CALL PFNGLSELECTBUFFERPROC glad_glSelectBuffer; #define glSelectBuffer glad_glSelectBuffer GLAD_API_CALL PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv; #define glVertexAttribI3iv glad_glVertexAttribI3iv GLAD_API_CALL PFNGLPATCHPARAMETERIPROC glad_glPatchParameteri; #define glPatchParameteri glad_glPatchParameteri GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIUIVPROC glad_glGetTextureParameterIuiv; #define glGetTextureParameterIuiv glad_glGetTextureParameterIuiv GLAD_API_CALL PFNGLCOLOR3IVPROC glad_glColor3iv; #define glColor3iv glad_glColor3iv GLAD_API_CALL PFNGLMAPBUFFERPROC glad_glMapBuffer; #define glMapBuffer glad_glMapBuffer GLAD_API_CALL PFNGLNORMALP3UIPROC glad_glNormalP3ui; #define glNormalP3ui glad_glNormalP3ui GLAD_API_CALL PFNGLVERTEXPOINTERPROC glad_glVertexPointer; #define glVertexPointer glad_glVertexPointer GLAD_API_CALL PFNGLGETTEXTUREPARAMETERFVPROC glad_glGetTextureParameterfv; #define glGetTextureParameterfv glad_glGetTextureParameterfv GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer; #define glVertexAttribPointer glad_glVertexAttribPointer GLAD_API_CALL PFNGLDEPTHRANGEFPROC glad_glDepthRangef; #define glDepthRangef glad_glDepthRangef GLAD_API_CALL PFNGLTEXTUREPARAMETERIVPROC glad_glTextureParameteriv; #define glTextureParameteriv glad_glTextureParameteriv GLAD_API_CALL PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv; #define glVertexP2uiv glad_glVertexP2uiv GLAD_API_CALL PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv; #define glVertexAttribI4usv glad_glVertexAttribI4usv GLAD_API_CALL PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv; #define glTexParameteriv glad_glTexParameteriv GLAD_API_CALL PFNGLBINDVERTEXBUFFERSPROC glad_glBindVertexBuffers; #define glBindVertexBuffers glad_glBindVertexBuffers GLAD_API_CALL PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv; #define glVertexP3uiv glad_glVertexP3uiv GLAD_API_CALL PFNGLINDEXIPROC glad_glIndexi; #define glIndexi glad_glIndexi GLAD_API_CALL PFNGLGETACTIVESUBROUTINENAMEPROC glad_glGetActiveSubroutineName; #define glGetActiveSubroutineName glad_glGetActiveSubroutineName GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D; #define glCompressedTexSubImage3D glad_glCompressedTexSubImage3D GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv; #define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv GLAD_API_CALL PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv; #define glGetPixelMapuiv glad_glGetPixelMapuiv GLAD_API_CALL PFNGLGETTEXGENIVPROC glad_glGetTexGeniv; #define glGetTexGeniv glad_glGetTexGeniv GLAD_API_CALL PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s; #define glVertexAttrib3s glad_glVertexAttrib3s GLAD_API_CALL PFNGLPOINTSIZEPROC glad_glPointSize; #define glPointSize glad_glPointSize GLAD_API_CALL PFNGLVERTEXP2UIPROC glad_glVertexP2ui; #define glVertexP2ui glad_glVertexP2ui GLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC glad_glMultiDrawArraysIndirectCount; #define glMultiDrawArraysIndirectCount glad_glMultiDrawArraysIndirectCount GLAD_API_CALL PFNGLGETNTEXIMAGEPROC glad_glGetnTexImage; #define glGetnTexImage glad_glGetnTexImage GLAD_API_CALL PFNGLCULLFACEPROC glad_glCullFace; #define glCullFace glad_glCullFace GLAD_API_CALL PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri; #define glSamplerParameteri glad_glSamplerParameteri GLAD_API_CALL PFNGLTEXTUREBARRIERPROC glad_glTextureBarrier; #define glTextureBarrier glad_glTextureBarrier GLAD_API_CALL PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer; #define glIsRenderbuffer glad_glIsRenderbuffer GLAD_API_CALL PFNGLBEGINQUERYPROC glad_glBeginQuery; #define glBeginQuery glad_glBeginQuery GLAD_API_CALL PFNGLCOLOR4USPROC glad_glColor4us; #define glColor4us glad_glColor4us GLAD_API_CALL PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv; #define glGetVertexAttribdv glad_glGetVertexAttribdv GLAD_API_CALL PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv; #define glTexCoord4iv glad_glTexCoord4iv GLAD_API_CALL PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv; #define glProgramUniform1fv glad_glProgramUniform1fv GLAD_API_CALL PFNGLDELETETEXTURESPROC glad_glDeleteTextures; #define glDeleteTextures glad_glDeleteTextures GLAD_API_CALL PFNGLWINDOWPOS2IVPROC glad_glWindowPos2iv; #define glWindowPos2iv glad_glWindowPos2iv GLAD_API_CALL PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer; #define glVertexAttribIPointer glad_glVertexAttribIPointer GLAD_API_CALL PFNGLCREATEVERTEXARRAYSPROC glad_glCreateVertexArrays; #define glCreateVertexArrays glad_glCreateVertexArrays GLAD_API_CALL PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i; #define glVertexAttribI1i glad_glVertexAttribI1i GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui; #define glProgramUniform3ui glad_glProgramUniform3ui GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC glad_glCompressedTextureSubImage2D; #define glCompressedTextureSubImage2D glad_glCompressedTextureSubImage2D GLAD_API_CALL PFNGLRECTDPROC glad_glRectd; #define glRectd glad_glRectd GLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXDPROC glad_glMultTransposeMatrixd; #define glMultTransposeMatrixd glad_glMultTransposeMatrixd GLAD_API_CALL PFNGLTEXENVFPROC glad_glTexEnvf; #define glTexEnvf glad_glTexEnvf GLAD_API_CALL PFNGLNORMAL3IPROC glad_glNormal3i; #define glNormal3i glad_glNormal3i GLAD_API_CALL PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation; #define glBindAttribLocation glad_glBindAttribLocation GLAD_API_CALL PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate; #define glStencilMaskSeparate glad_glStencilMaskSeparate GLAD_API_CALL PFNGLGETINTEGERVPROC glad_glGetIntegerv; #define glGetIntegerv glad_glGetIntegerv GLAD_API_CALL PFNGLUSEPROGRAMPROC glad_glUseProgram; #define glUseProgram glad_glUseProgram GLAD_API_CALL PFNGLNORMAL3BVPROC glad_glNormal3bv; #define glNormal3bv glad_glNormal3bv GLAD_API_CALL PFNGLPIXELSTOREIPROC glad_glPixelStorei; #define glPixelStorei glad_glPixelStorei GLAD_API_CALL PFNGLNORMAL3SPROC glad_glNormal3s; #define glNormal3s glad_glNormal3s GLAD_API_CALL PFNGLCOLOR4IVPROC glad_glColor4iv; #define glColor4iv glad_glColor4iv GLAD_API_CALL PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv; #define glMultiTexCoordP2uiv glad_glMultiTexCoordP2uiv GLAD_API_CALL PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident; #define glAreTexturesResident glad_glAreTexturesResident GLAD_API_CALL PFNGLGETUNIFORMFVPROC glad_glGetUniformfv; #define glGetUniformfv glad_glGetUniformfv GLAD_API_CALL PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC glad_glGetActiveSubroutineUniformName; #define glGetActiveSubroutineUniformName glad_glGetActiveSubroutineUniformName GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv; #define glProgramUniformMatrix2x4fv glad_glProgramUniformMatrix2x4fv GLAD_API_CALL PFNGLTEXSTORAGE3DPROC glad_glTexStorage3D; #define glTexStorage3D glad_glTexStorage3D GLAD_API_CALL PFNGLTEXCOORD1IPROC glad_glTexCoord1i; #define glTexCoord1i glad_glTexCoord1i GLAD_API_CALL PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC glad_glGetCompressedTextureSubImage; #define glGetCompressedTextureSubImage glad_glGetCompressedTextureSubImage GLAD_API_CALL PFNGLVERTEXARRAYVERTEXBUFFERSPROC glad_glVertexArrayVertexBuffers; #define glVertexArrayVertexBuffers glad_glVertexArrayVertexBuffers GLAD_API_CALL PFNGLSECONDARYCOLOR3DPROC glad_glSecondaryColor3d; #define glSecondaryColor3d glad_glSecondaryColor3d GLAD_API_CALL PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays; #define glInterleavedArrays glad_glInterleavedArrays GLAD_API_CALL PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer; #define glUnmapBuffer glad_glUnmapBuffer GLAD_API_CALL PFNGLISENABLEDIPROC glad_glIsEnabledi; #define glIsEnabledi glad_glIsEnabledi GLAD_API_CALL PFNGLBINDSAMPLERSPROC glad_glBindSamplers; #define glBindSamplers glad_glBindSamplers GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D; #define glCompressedTexSubImage1D glad_glCompressedTexSubImage1D GLAD_API_CALL PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures; #define glPrioritizeTextures glad_glPrioritizeTextures GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv; #define glProgramUniformMatrix4x2fv glad_glProgramUniformMatrix4x2fv GLAD_API_CALL PFNGLRASTERPOS4DPROC glad_glRasterPos4d; #define glRasterPos4d glad_glRasterPos4d GLAD_API_CALL PFNGLSECONDARYCOLOR3USVPROC glad_glSecondaryColor3usv; #define glSecondaryColor3usv glad_glSecondaryColor3usv GLAD_API_CALL PFNGLGETSYNCIVPROC glad_glGetSynciv; #define glGetSynciv glad_glGetSynciv GLAD_API_CALL PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv; #define glSamplerParameterIiv glad_glSamplerParameterIiv GLAD_API_CALL PFNGLLIGHTMODELFVPROC glad_glLightModelfv; #define glLightModelfv glad_glLightModelfv GLAD_API_CALL PFNGLTEXTURESTORAGE3DPROC glad_glTextureStorage3D; #define glTextureStorage3D glad_glTextureStorage3D GLAD_API_CALL PFNGLRESUMETRANSFORMFEEDBACKPROC glad_glResumeTransformFeedback; #define glResumeTransformFeedback glad_glResumeTransformFeedback GLAD_API_CALL PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines; #define glGenProgramPipelines glad_glGenProgramPipelines GLAD_API_CALL PFNGLVERTEX4FVPROC glad_glVertex4fv; #define glVertex4fv glad_glVertex4fv GLAD_API_CALL PFNGLLIGHTIVPROC glad_glLightiv; #define glLightiv glad_glLightiv GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERIVPROC glad_glClearNamedFramebufferiv; #define glClearNamedFramebufferiv glad_glClearNamedFramebufferiv GLAD_API_CALL PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv; #define glGetTexParameteriv glad_glGetTexParameteriv GLAD_API_CALL PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv; #define glTexCoord3dv glad_glTexCoord3dv GLAD_API_CALL PFNGLFOGCOORDPOINTERPROC glad_glFogCoordPointer; #define glFogCoordPointer glad_glFogCoordPointer GLAD_API_CALL PFNGLUNIFORM2IPROC glad_glUniform2i; #define glUniform2i glad_glUniform2i GLAD_API_CALL PFNGLTEXTURESUBIMAGE3DPROC glad_glTextureSubImage3D; #define glTextureSubImage3D glad_glTextureSubImage3D GLAD_API_CALL PFNGLGETDOUBLEI_VPROC glad_glGetDoublei_v; #define glGetDoublei_v glad_glGetDoublei_v GLAD_API_CALL PFNGLCLEARBUFFERDATAPROC glad_glClearBufferData; #define glClearBufferData glad_glClearBufferData GLAD_API_CALL PFNGLBINDTEXTUREPROC glad_glBindTexture; #define glBindTexture glad_glBindTexture GLAD_API_CALL PFNGLTEXTUREBUFFERRANGEPROC glad_glTextureBufferRange; #define glTextureBufferRange glad_glTextureBufferRange GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv; #define glGetTexLevelParameterfv glad_glGetTexLevelParameterfv GLAD_API_CALL PFNGLSAMPLEMASKIPROC glad_glSampleMaski; #define glSampleMaski glad_glSampleMaski GLAD_API_CALL PFNGLCLEARACCUMPROC glad_glClearAccum; #define glClearAccum glad_glClearAccum GLAD_API_CALL PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform; #define glGetActiveUniform glad_glGetActiveUniform GLAD_API_CALL PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary; #define glGetProgramBinary glad_glGetProgramBinary GLAD_API_CALL PFNGLDETACHSHADERPROC glad_glDetachShader; #define glDetachShader glad_glDetachShader GLAD_API_CALL PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s; #define glVertexAttrib4s glad_glVertexAttrib4s GLAD_API_CALL PFNGLTEXTUREPARAMETERIPROC glad_glTextureParameteri; #define glTextureParameteri glad_glTextureParameteri GLAD_API_CALL PFNGLCOLOR3DVPROC glad_glColor3dv; #define glColor3dv glad_glColor3dv GLAD_API_CALL PFNGLBINDSAMPLERPROC glad_glBindSampler; #define glBindSampler glad_glBindSampler GLAD_API_CALL PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC glad_glCheckNamedFramebufferStatus; #define glCheckNamedFramebufferStatus glad_glCheckNamedFramebufferStatus GLAD_API_CALL PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv; #define glProgramUniform1iv glad_glProgramUniform1iv GLAD_API_CALL PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays; #define glMultiDrawArrays glad_glMultiDrawArrays GLAD_API_CALL PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv; #define glRasterPos4dv glad_glRasterPos4dv GLAD_API_CALL PFNGLGETFLOATVPROC glad_glGetFloatv; #define glGetFloatv glad_glGetFloatv GLAD_API_CALL PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri; #define glProgramParameteri glad_glProgramParameteri GLAD_API_CALL PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers; #define glDeleteRenderbuffers glad_glDeleteRenderbuffers GLAD_API_CALL PFNGLSECONDARYCOLORPOINTERPROC glad_glSecondaryColorPointer; #define glSecondaryColorPointer glad_glSecondaryColorPointer GLAD_API_CALL PFNGLISSAMPLERPROC glad_glIsSampler; #define glIsSampler glad_glIsSampler GLAD_API_CALL PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv; #define glMultiTexCoord1dv glad_glMultiTexCoord1dv GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv; #define glProgramUniformMatrix2x3fv glad_glProgramUniformMatrix2x3fv GLAD_API_CALL PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl; #define glDebugMessageControl glad_glDebugMessageControl GLAD_API_CALL PFNGLBINDBUFFERSRANGEPROC glad_glBindBuffersRange; #define glBindBuffersRange glad_glBindBuffersRange GLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTPROC glad_glMultiDrawArraysIndirect; #define glMultiDrawArraysIndirect glad_glMultiDrawArraysIndirect GLAD_API_CALL PFNGLGETMAPDVPROC glad_glGetMapdv; #define glGetMapdv glad_glGetMapdv GLAD_API_CALL PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui; #define glTexCoordP3ui glad_glTexCoordP3ui GLAD_API_CALL PFNGLVERTEXATTRIBIFORMATPROC glad_glVertexAttribIFormat; #define glVertexAttribIFormat glad_glVertexAttribIFormat GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC glad_glDrawTransformFeedbackStreamInstanced; #define glDrawTransformFeedbackStreamInstanced glad_glDrawTransformFeedbackStreamInstanced GLAD_API_CALL PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC glad_glTransformFeedbackBufferBase; #define glTransformFeedbackBufferBase glad_glTransformFeedbackBufferBase GLAD_API_CALL PFNGLGETTEXENVIVPROC glad_glGetTexEnviv; #define glGetTexEnviv glad_glGetTexEnviv GLAD_API_CALL PFNGLCOLORP3UIVPROC glad_glColorP3uiv; #define glColorP3uiv glad_glColorP3uiv GLAD_API_CALL PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f; #define glVertexAttrib1f glad_glVertexAttrib1f GLAD_API_CALL PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib; #define glPopClientAttrib glad_glPopClientAttrib GLAD_API_CALL PFNGLGETTEXIMAGEPROC glad_glGetTexImage; #define glGetTexImage glad_glGetTexImage GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage; #define glRenderbufferStorage glad_glRenderbufferStorage GLAD_API_CALL PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers; #define glDeleteBuffers glad_glDeleteBuffers GLAD_API_CALL PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync; #define glClientWaitSync glad_glClientWaitSync GLAD_API_CALL PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv; #define glProgramUniform1dv glad_glProgramUniform1dv GLAD_API_CALL PFNGLCLEARTEXIMAGEPROC glad_glClearTexImage; #define glClearTexImage glad_glClearTexImage GLAD_API_CALL PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv; #define glMultiTexCoord2fv glad_glMultiTexCoord2fv GLAD_API_CALL PFNGLUNIFORM3UIVPROC glad_glUniform3uiv; #define glUniform3uiv glad_glUniform3uiv GLAD_API_CALL PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName; #define glGetActiveUniformName glad_glGetActiveUniformName GLAD_API_CALL PFNGLEVALPOINT1PROC glad_glEvalPoint1; #define glEvalPoint1 glad_glEvalPoint1 GLAD_API_CALL PFNGLCOLOR3USPROC glad_glColor3us; #define glColor3us glad_glColor3us GLAD_API_CALL PFNGLGETTEXTURESUBIMAGEPROC glad_glGetTextureSubImage; #define glGetTextureSubImage glad_glGetTextureSubImage GLAD_API_CALL PFNGLCOLOR3IPROC glad_glColor3i; #define glColor3i glad_glColor3i GLAD_API_CALL PFNGLSECONDARYCOLOR3DVPROC glad_glSecondaryColor3dv; #define glSecondaryColor3dv glad_glSecondaryColor3dv GLAD_API_CALL PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv; #define glEvalCoord1fv glad_glEvalCoord1fv GLAD_API_CALL PFNGLVIEWPORTARRAYVPROC glad_glViewportArrayv; #define glViewportArrayv glad_glViewportArrayv GLAD_API_CALL PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i; #define glVertexAttribI4i glad_glVertexAttribI4i GLAD_API_CALL PFNGLVERTEXATTRIBL4DPROC glad_glVertexAttribL4d; #define glVertexAttribL4d glad_glVertexAttribL4d GLAD_API_CALL PFNGLCOLOR4DPROC glad_glColor4d; #define glColor4d glad_glColor4d GLAD_API_CALL PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation; #define glGetFragDataLocation glad_glGetFragDataLocation GLAD_API_CALL PFNGLCOLOR4UBVPROC glad_glColor4ubv; #define glColor4ubv glad_glColor4ubv GLAD_API_CALL PFNGLUNIFORMMATRIX4DVPROC glad_glUniformMatrix4dv; #define glUniformMatrix4dv glad_glUniformMatrix4dv GLAD_API_CALL PFNGLUNIFORMMATRIX3X4DVPROC glad_glUniformMatrix3x4dv; #define glUniformMatrix3x4dv glad_glUniformMatrix3x4dv GLAD_API_CALL PFNGLSCISSORPROC glad_glScissor; #define glScissor glad_glScissor GLAD_API_CALL PFNGLUNIFORMSUBROUTINESUIVPROC glad_glUniformSubroutinesuiv; #define glUniformSubroutinesuiv glad_glUniformSubroutinesuiv GLAD_API_CALL PFNGLVERTEX4IVPROC glad_glVertex4iv; #define glVertex4iv glad_glVertex4iv GLAD_API_CALL PFNGLCOLORMASKPROC glad_glColorMask; #define glColorMask glad_glColorMask GLAD_API_CALL PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate; #define glStencilOpSeparate glad_glStencilOpSeparate GLAD_API_CALL PFNGLGETBOOLEANVPROC glad_glGetBooleanv; #define glGetBooleanv glad_glGetBooleanv GLAD_API_CALL PFNGLVERTEX3DPROC glad_glVertex3d; #define glVertex3d glad_glVertex3d GLAD_API_CALL PFNGLGETNAMEDBUFFERPOINTERVPROC glad_glGetNamedBufferPointerv; #define glGetNamedBufferPointerv glad_glGetNamedBufferPointerv GLAD_API_CALL PFNGLVERTEXARRAYVERTEXBUFFERPROC glad_glVertexArrayVertexBuffer; #define glVertexArrayVertexBuffer glad_glVertexArrayVertexBuffer GLAD_API_CALL PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple; #define glGetPolygonStipple glad_glGetPolygonStipple GLAD_API_CALL PFNGLSTENCILOPPROC glad_glStencilOp; #define glStencilOp glad_glStencilOp GLAD_API_CALL PFNGLVIEWPORTPROC glad_glViewport; #define glViewport glad_glViewport GLAD_API_CALL PFNGLGETNPOLYGONSTIPPLEPROC glad_glGetnPolygonStipple; #define glGetnPolygonStipple glad_glGetnPolygonStipple GLAD_API_CALL PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv; #define glVertexAttrib4usv glad_glVertexAttrib4usv GLAD_API_CALL PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback; #define glEndTransformFeedback glad_glEndTransformFeedback GLAD_API_CALL PFNGLCREATEPROGRAMPROC glad_glCreateProgram; #define glCreateProgram glad_glCreateProgram GLAD_API_CALL PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog; #define glGetShaderInfoLog glad_glGetShaderInfoLog GLAD_API_CALL PFNGLGETVERTEXARRAYINDEXED64IVPROC glad_glGetVertexArrayIndexed64iv; #define glGetVertexArrayIndexed64iv glad_glGetVertexArrayIndexed64iv GLAD_API_CALL PFNGLTEXGENDPROC glad_glTexGend; #define glTexGend glad_glTexGend GLAD_API_CALL PFNGLINDEXUBPROC glad_glIndexub; #define glIndexub glad_glIndexub GLAD_API_CALL PFNGLMULTMATRIXFPROC glad_glMultMatrixf; #define glMultMatrixf glad_glMultMatrixf GLAD_API_CALL PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui; #define glMultiTexCoordP2ui glad_glMultiTexCoordP2ui GLAD_API_CALL PFNGLTEXIMAGE3DPROC glad_glTexImage3D; #define glTexImage3D glad_glTexImage3D GLAD_API_CALL PFNGLGETNUNIFORMDVPROC glad_glGetnUniformdv; #define glGetnUniformdv glad_glGetnUniformdv GLAD_API_CALL PFNGLRECTIVPROC glad_glRectiv; #define glRectiv glad_glRectiv GLAD_API_CALL PFNGLTEXCOORD4SPROC glad_glTexCoord4s; #define glTexCoord4s glad_glTexCoord4s GLAD_API_CALL PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D; #define glCopyTexImage2D glad_glCopyTexImage2D GLAD_API_CALL PFNGLLOGICOPPROC glad_glLogicOp; #define glLogicOp glad_glLogicOp GLAD_API_CALL PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv; #define glUniformMatrix2fv glad_glUniformMatrix2fv GLAD_API_CALL PFNGLSECONDARYCOLOR3FVPROC glad_glSecondaryColor3fv; #define glSecondaryColor3fv glad_glSecondaryColor3fv GLAD_API_CALL PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer; #define glBindRenderbuffer glad_glBindRenderbuffer GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv; #define glProgramUniform4uiv glad_glProgramUniform4uiv GLAD_API_CALL PFNGLCREATESAMPLERSPROC glad_glCreateSamplers; #define glCreateSamplers glad_glCreateSamplers GLAD_API_CALL PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv; #define glPixelMapuiv glad_glPixelMapuiv GLAD_API_CALL PFNGLBLENDCOLORPROC glad_glBlendColor; #define glBlendColor glad_glBlendColor GLAD_API_CALL PFNGLLIGHTMODELIPROC glad_glLightModeli; #define glLightModeli glad_glLightModeli GLAD_API_CALL PFNGLPOINTPARAMETERIPROC glad_glPointParameteri; #define glPointParameteri glad_glPointParameteri GLAD_API_CALL PFNGLGENQUERIESPROC glad_glGenQueries; #define glGenQueries glad_glGenQueries GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTUREPROC glad_glNamedFramebufferTexture; #define glNamedFramebufferTexture glad_glNamedFramebufferTexture GLAD_API_CALL PFNGLGETNSEPARABLEFILTERPROC glad_glGetnSeparableFilter; #define glGetnSeparableFilter glad_glGetnSeparableFilter GLAD_API_CALL PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv; #define glGetQueryObjectuiv glad_glGetQueryObjectuiv GLAD_API_CALL PFNGLCOLOR4FVPROC glad_glColor4fv; #define glColor4fv glad_glColor4fv GLAD_API_CALL PFNGLGETVERTEXARRAYIVPROC glad_glGetVertexArrayiv; #define glGetVertexArrayiv glad_glGetVertexArrayiv GLAD_API_CALL PFNGLUNIFORM1UIPROC glad_glUniform1ui; #define glUniform1ui glad_glUniform1ui GLAD_API_CALL PFNGLGETNMAPFVPROC glad_glGetnMapfv; #define glGetnMapfv glad_glGetnMapfv GLAD_API_CALL PFNGLUNIFORM4FVPROC glad_glUniform4fv; #define glUniform4fv glad_glUniform4fv GLAD_API_CALL PFNGLTEXGENFPROC glad_glTexGenf; #define glTexGenf glad_glTexGenf GLAD_API_CALL PFNGLINDEXIVPROC glad_glIndexiv; #define glIndexiv glad_glIndexiv GLAD_API_CALL PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv; #define glVertexAttrib1fv glad_glVertexAttrib1fv GLAD_API_CALL PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i; #define glMultiTexCoord3i glad_glMultiTexCoord3i GLAD_API_CALL PFNGLCOLOR4USVPROC glad_glColor4usv; #define glColor4usv glad_glColor4usv GLAD_API_CALL PFNGLDRAWBUFFERSPROC glad_glDrawBuffers; #define glDrawBuffers glad_glDrawBuffers GLAD_API_CALL PFNGLWINDOWPOS2IPROC glad_glWindowPos2i; #define glWindowPos2i glad_glWindowPos2i GLAD_API_CALL PFNGLTEXBUFFERRANGEPROC glad_glTexBufferRange; #define glTexBufferRange glad_glTexBufferRange GLAD_API_CALL PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv; #define glMultiTexCoordP1uiv glad_glMultiTexCoordP1uiv GLAD_API_CALL PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv; #define glVertexAttribI2iv glad_glVertexAttribI2iv GLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTPROC glad_glMultiDrawElementsIndirect; #define glMultiDrawElementsIndirect glad_glMultiDrawElementsIndirect GLAD_API_CALL PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv; #define glUniformMatrix2x4fv glad_glUniformMatrix2x4fv GLAD_API_CALL PFNGLUNIFORM3IPROC glad_glUniform3i; #define glUniform3i glad_glUniform3i GLAD_API_CALL PFNGLGETCLIPPLANEPROC glad_glGetClipPlane; #define glGetClipPlane glad_glGetClipPlane GLAD_API_CALL PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv; #define glVertexAttribP2uiv glad_glVertexAttribP2uiv GLAD_API_CALL PFNGLTEXCOORD2IPROC glad_glTexCoord2i; #define glTexCoord2i glad_glTexCoord2i GLAD_API_CALL PFNGLUNIFORM4UIPROC glad_glUniform4ui; #define glUniform4ui glad_glUniform4ui GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC glad_glDrawElementsInstancedBaseVertexBaseInstance; #define glDrawElementsInstancedBaseVertexBaseInstance glad_glDrawElementsInstancedBaseVertexBaseInstance GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv; #define glVertexAttrib4Nusv glad_glVertexAttrib4Nusv GLAD_API_CALL PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d; #define glVertexAttrib1d glad_glVertexAttrib1d GLAD_API_CALL PFNGLGETLIGHTIVPROC glad_glGetLightiv; #define glGetLightiv glad_glGetLightiv GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv; #define glProgramUniformMatrix3x4dv glad_glProgramUniformMatrix3x4dv GLAD_API_CALL PFNGLTEXTURESTORAGE1DPROC glad_glTextureStorage1D; #define glTextureStorage1D glad_glTextureStorage1D GLAD_API_CALL PFNGLSTENCILMASKPROC glad_glStencilMask; #define glStencilMask glad_glStencilMask GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv; #define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv GLAD_API_CALL PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f; #define glMultiTexCoord4f glad_glMultiTexCoord4f GLAD_API_CALL PFNGLINDEXDPROC glad_glIndexd; #define glIndexd glad_glIndexd GLAD_API_CALL PFNGLNORMALP3UIVPROC glad_glNormalP3uiv; #define glNormalP3uiv glad_glNormalP3uiv GLAD_API_CALL PFNGLEVALMESH1PROC glad_glEvalMesh1; #define glEvalMesh1 glad_glEvalMesh1 GLAD_API_CALL PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv; #define glTexCoordP3uiv glad_glTexCoordP3uiv GLAD_API_CALL PFNGLVERTEXATTRIBL4DVPROC glad_glVertexAttribL4dv; #define glVertexAttribL4dv glad_glVertexAttribL4dv GLAD_API_CALL PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture; #define glClientActiveTexture glad_glClientActiveTexture GLAD_API_CALL PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s; #define glVertexAttrib2s glad_glVertexAttrib2s GLAD_API_CALL PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv; #define glVertexAttrib3dv glad_glVertexAttrib3dv GLAD_API_CALL PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv; #define glTexParameterIiv glad_glTexParameterIiv GLAD_API_CALL PFNGLRASTERPOS3DPROC glad_glRasterPos3d; #define glRasterPos3d glad_glRasterPos3d GLAD_API_CALL PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv; #define glEvalCoord2fv glad_glEvalCoord2fv GLAD_API_CALL PFNGLBINDTEXTUREUNITPROC glad_glBindTextureUnit; #define glBindTextureUnit glad_glBindTextureUnit GLAD_API_CALL PFNGLWAITSYNCPROC glad_glWaitSync; #define glWaitSync glad_glWaitSync GLAD_API_CALL PFNGLMATERIALFVPROC glad_glMaterialfv; #define glMaterialfv glad_glMaterialfv GLAD_API_CALL PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i; #define glProgramUniform2i glad_glProgramUniform2i GLAD_API_CALL PFNGLRASTERPOS2SPROC glad_glRasterPos2s; #define glRasterPos2s glad_glRasterPos2s GLAD_API_CALL PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv; #define glVertexAttribI4bv glad_glVertexAttribI4bv GLAD_API_CALL PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv; #define glVertexAttribI4sv glad_glVertexAttribI4sv GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate; #define glBlendEquationSeparate glad_glBlendEquationSeparate GLAD_API_CALL PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv; #define glVertexAttribI3uiv glad_glVertexAttribI3uiv GLAD_API_CALL PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv; #define glVertexAttribI2uiv glad_glVertexAttribI2uiv GLAD_API_CALL PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv; #define glVertexP4uiv glad_glVertexP4uiv GLAD_API_CALL PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex; #define glGetUniformBlockIndex glad_glGetUniformBlockIndex GLAD_API_CALL PFNGLDEPTHFUNCPROC glad_glDepthFunc; #define glDepthFunc glad_glDepthFunc GLAD_API_CALL PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f; #define glProgramUniform4f glad_glProgramUniform4f GLAD_API_CALL PFNGLSHADERSOURCEPROC glad_glShaderSource; #define glShaderSource glad_glShaderSource GLAD_API_CALL PFNGLVERTEX2IVPROC glad_glVertex2iv; #define glVertex2iv glad_glVertex2iv GLAD_API_CALL PFNGLMAPNAMEDBUFFERPROC glad_glMapNamedBuffer; #define glMapNamedBuffer glad_glMapNamedBuffer GLAD_API_CALL PFNGLCLEARDEPTHFPROC glad_glClearDepthf; #define glClearDepthf glad_glClearDepthf GLAD_API_CALL PFNGLUNIFORM1FPROC glad_glUniform1f; #define glUniform1f glad_glUniform1f GLAD_API_CALL PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d; #define glMultiTexCoord1d glad_glMultiTexCoord1d GLAD_API_CALL PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v; #define glGetQueryObjectui64v glad_glGetQueryObjectui64v GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC glad_glNamedFramebufferDrawBuffers; #define glNamedFramebufferDrawBuffers glad_glNamedFramebufferDrawBuffers GLAD_API_CALL PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D; #define glTexSubImage3D glad_glTexSubImage3D GLAD_API_CALL PFNGLDELETETRANSFORMFEEDBACKSPROC glad_glDeleteTransformFeedbacks; #define glDeleteTransformFeedbacks glad_glDeleteTransformFeedbacks GLAD_API_CALL PFNGLVERTEX3IVPROC glad_glVertex3iv; #define glVertex3iv glad_glVertex3iv GLAD_API_CALL PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv; #define glUniformMatrix2x3fv glad_glUniformMatrix2x3fv GLAD_API_CALL PFNGLISTEXTUREPROC glad_glIsTexture; #define glIsTexture glad_glIsTexture GLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXFPROC glad_glMultTransposeMatrixf; #define glMultTransposeMatrixf glad_glMultTransposeMatrixf GLAD_API_CALL PFNGLNEWLISTPROC glad_glNewList; #define glNewList glad_glNewList GLAD_API_CALL PFNGLSCALEFPROC glad_glScalef; #define glScalef glad_glScalef GLAD_API_CALL PFNGLVERTEX3FPROC glad_glVertex3f; #define glVertex3f glad_glVertex3f GLAD_API_CALL PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv; #define glTexCoord1iv glad_glTexCoord1iv GLAD_API_CALL PFNGLFOGCOORDFVPROC glad_glFogCoordfv; #define glFogCoordfv glad_glFogCoordfv GLAD_API_CALL PFNGLMAPGRID2DPROC glad_glMapGrid2d; #define glMapGrid2d glad_glMapGrid2d GLAD_API_CALL PFNGLWINDOWPOS2FVPROC glad_glWindowPos2fv; #define glWindowPos2fv glad_glWindowPos2fv GLAD_API_CALL PFNGLREADPIXELSPROC glad_glReadPixels; #define glReadPixels glad_glReadPixels GLAD_API_CALL PFNGLINVALIDATETEXSUBIMAGEPROC glad_glInvalidateTexSubImage; #define glInvalidateTexSubImage glad_glInvalidateTexSubImage GLAD_API_CALL PFNGLORTHOPROC glad_glOrtho; #define glOrtho glad_glOrtho GLAD_API_CALL PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv; #define glGetQueryObjectiv glad_glGetQueryObjectiv GLAD_API_CALL PFNGLWINDOWPOS2SVPROC glad_glWindowPos2sv; #define glWindowPos2sv glad_glWindowPos2sv GLAD_API_CALL PFNGLFOGFPROC glad_glFogf; #define glFogf glad_glFogf GLAD_API_CALL PFNGLCOLOR3SPROC glad_glColor3s; #define glColor3s glad_glColor3s GLAD_API_CALL PFNGLUNIFORM2UIVPROC glad_glUniform2uiv; #define glUniform2uiv glad_glUniform2uiv GLAD_API_CALL PFNGLPIXELZOOMPROC glad_glPixelZoom; #define glPixelZoom glad_glPixelZoom GLAD_API_CALL PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f; #define glProgramUniform3f glad_glProgramUniform3f GLAD_API_CALL PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv; #define glEvalCoord2dv glad_glEvalCoord2dv GLAD_API_CALL PFNGLVERTEX3DVPROC glad_glVertex3dv; #define glVertex3dv glad_glVertex3dv GLAD_API_CALL PFNGLUNIFORM3FVPROC glad_glUniform3fv; #define glUniform3fv glad_glUniform3fv GLAD_API_CALL PFNGLENABLEPROC glad_glEnable; #define glEnable glad_glEnable GLAD_API_CALL PFNGLTEXTUREPARAMETERIUIVPROC glad_glTextureParameterIuiv; #define glTextureParameterIuiv glad_glTextureParameterIuiv GLAD_API_CALL PFNGLFOGCOORDDVPROC glad_glFogCoorddv; #define glFogCoorddv glad_glFogCoorddv GLAD_API_CALL PFNGLBUFFERDATAPROC glad_glBufferData; #define glBufferData glad_glBufferData GLAD_API_CALL PFNGLPOPATTRIBPROC glad_glPopAttrib; #define glPopAttrib glad_glPopAttrib GLAD_API_CALL PFNGLNORMAL3DVPROC glad_glNormal3dv; #define glNormal3dv glad_glNormal3dv GLAD_API_CALL PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex; #define glGetFragDataIndex glad_glGetFragDataIndex GLAD_API_CALL PFNGLPASSTHROUGHPROC glad_glPassThrough; #define glPassThrough glad_glPassThrough GLAD_API_CALL PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv; #define glTexCoord2dv glad_glTexCoord2dv GLAD_API_CALL PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv; #define glTexCoordP4uiv glad_glTexCoordP4uiv GLAD_API_CALL PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv; #define glClearBufferuiv glad_glClearBufferuiv GLAD_API_CALL PFNGLUNIFORM3DVPROC glad_glUniform3dv; #define glUniform3dv glad_glUniform3dv GLAD_API_CALL PFNGLBLENDEQUATIONIPROC glad_glBlendEquationi; #define glBlendEquationi glad_glBlendEquationi GLAD_API_CALL PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui; #define glVertexAttribI4ui glad_glVertexAttribI4ui GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv; #define glGetTexLevelParameteriv glad_glGetTexLevelParameteriv GLAD_API_CALL PFNGLVERTEX4IPROC glad_glVertex4i; #define glVertex4i glad_glVertex4i GLAD_API_CALL PFNGLUNIFORM4UIVPROC glad_glUniform4uiv; #define glUniform4uiv glad_glUniform4uiv GLAD_API_CALL PFNGLTEXENVFVPROC glad_glTexEnvfv; #define glTexEnvfv glad_glTexEnvfv GLAD_API_CALL PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv; #define glMultiTexCoord4dv glad_glMultiTexCoord4dv GLAD_API_CALL PFNGLCLEARTEXSUBIMAGEPROC glad_glClearTexSubImage; #define glClearTexSubImage glad_glClearTexSubImage GLAD_API_CALL PFNGLTRANSLATEDPROC glad_glTranslated; #define glTranslated glad_glTranslated GLAD_API_CALL PFNGLPOINTPARAMETERFPROC glad_glPointParameterf; #define glPointParameterf glad_glPointParameterf GLAD_API_CALL PFNGLSCISSORINDEXEDVPROC glad_glScissorIndexedv; #define glScissorIndexedv glad_glScissorIndexedv GLAD_API_CALL PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv; #define glProgramUniform2dv glad_glProgramUniform2dv GLAD_API_CALL PFNGLREADBUFFERPROC glad_glReadBuffer; #define glReadBuffer glad_glReadBuffer GLAD_API_CALL PFNGLENDPROC glad_glEnd; #define glEnd glad_glEnd GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced; #define glDrawArraysInstanced glad_glDrawArraysInstanced GLAD_API_CALL PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv; #define glVertexAttrib4uiv glad_glVertexAttrib4uiv GLAD_API_CALL PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv; #define glVertexAttribI4ubv glad_glVertexAttribI4ubv GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC glad_glCompressedTextureSubImage1D; #define glCompressedTextureSubImage1D glad_glCompressedTextureSubImage1D GLAD_API_CALL PFNGLVERTEX2DVPROC glad_glVertex2dv; #define glVertex2dv glad_glVertex2dv GLAD_API_CALL PFNGLPUSHNAMEPROC glad_glPushName; #define glPushName glad_glPushName GLAD_API_CALL PFNGLINVALIDATEBUFFERDATAPROC glad_glInvalidateBufferData; #define glInvalidateBufferData glad_glInvalidateBufferData GLAD_API_CALL PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv; #define glPointParameteriv glad_glPointParameteriv GLAD_API_CALL PFNGLGENTEXTURESPROC glad_glGenTextures; #define glGenTextures glad_glGenTextures GLAD_API_CALL PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv; #define glTexCoord4fv glad_glTexCoord4fv GLAD_API_CALL PFNGLDISPATCHCOMPUTEPROC glad_glDispatchCompute; #define glDispatchCompute glad_glDispatchCompute GLAD_API_CALL PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv; #define glGetUniformuiv glad_glGetUniformuiv GLAD_API_CALL PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv; #define glGetActiveUniformsiv glad_glGetActiveUniformsiv GLAD_API_CALL PFNGLGETPROGRAMRESOURCENAMEPROC glad_glGetProgramResourceName; #define glGetProgramResourceName glad_glGetProgramResourceName GLAD_API_CALL PFNGLVERTEX2FVPROC glad_glVertex2fv; #define glVertex2fv glad_glVertex2fv GLAD_API_CALL PFNGLCOLOR4UBPROC glad_glColor4ub; #define glColor4ub glad_glColor4ub GLAD_API_CALL PFNGLUNIFORM3IVPROC glad_glUniform3iv; #define glUniform3iv glad_glUniform3iv GLAD_API_CALL PFNGLCLIPPLANEPROC glad_glClipPlane; #define glClipPlane glad_glClipPlane GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv; #define glProgramUniformMatrix3x2fv glad_glProgramUniformMatrix3x2fv GLAD_API_CALL PFNGLUNIFORM4IPROC glad_glUniform4i; #define glUniform4i glad_glUniform4i GLAD_API_CALL PFNGLWINDOWPOS3IVPROC glad_glWindowPos3iv; #define glWindowPos3iv glad_glWindowPos3iv GLAD_API_CALL PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv; #define glSamplerParameteriv glad_glSamplerParameteriv GLAD_API_CALL PFNGLUNIFORM2DPROC glad_glUniform2d; #define glUniform2d glad_glUniform2d GLAD_API_CALL PFNGLPOPMATRIXPROC glad_glPopMatrix; #define glPopMatrix glad_glPopMatrix GLAD_API_CALL PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline; #define glValidateProgramPipeline glad_glValidateProgramPipeline GLAD_API_CALL PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv; #define glRasterPos3dv glad_glRasterPos3dv GLAD_API_CALL PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv; #define glTexCoord1fv glad_glTexCoord1fv GLAD_API_CALL PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv; #define glTexCoord2iv glad_glTexCoord2iv GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE2DPROC glad_glCopyTextureSubImage2D; #define glCopyTextureSubImage2D glad_glCopyTextureSubImage2D GLAD_API_CALL PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders; #define glGetAttachedShaders glad_glGetAttachedShaders GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKI_VPROC glad_glGetTransformFeedbacki_v; #define glGetTransformFeedbacki_v glad_glGetTransformFeedbacki_v GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv; #define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv GLAD_API_CALL PFNGLVERTEXARRAYATTRIBIFORMATPROC glad_glVertexArrayAttribIFormat; #define glVertexArrayAttribIFormat glad_glVertexArrayAttribIFormat GLAD_API_CALL PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel; #define glObjectPtrLabel glad_glObjectPtrLabel GLAD_API_CALL PFNGLGETNPIXELMAPUSVPROC glad_glGetnPixelMapusv; #define glGetnPixelMapusv glad_glGetnPixelMapusv GLAD_API_CALL PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f; #define glProgramUniform1f glad_glProgramUniform1f GLAD_API_CALL PFNGLCLEARSTENCILPROC glad_glClearStencil; #define glClearStencil glad_glClearStencil GLAD_API_CALL PFNGLDISABLEPROC glad_glDisable; #define glDisable glad_glDisable GLAD_API_CALL PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f; #define glVertexAttrib4f glad_glVertexAttrib4f GLAD_API_CALL PFNGLGETSUBROUTINEINDEXPROC glad_glGetSubroutineIndex; #define glGetSubroutineIndex glad_glGetSubroutineIndex GLAD_API_CALL PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d; #define glMultiTexCoord2d glad_glMultiTexCoord2d GLAD_API_CALL PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv; #define glMultiTexCoordP3uiv glad_glMultiTexCoordP3uiv GLAD_API_CALL PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv; #define glMultiTexCoord3fv glad_glMultiTexCoord3fv GLAD_API_CALL PFNGLUNIFORM4IVPROC glad_glUniform4iv; #define glUniform4iv glad_glUniform4iv GLAD_API_CALL PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor; #define glVertexAttribDivisor glad_glVertexAttribDivisor GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation; #define glBindFragDataLocation glad_glBindFragDataLocation GLAD_API_CALL PFNGLGETNCOMPRESSEDTEXIMAGEPROC glad_glGetnCompressedTexImage; #define glGetnCompressedTexImage glad_glGetnCompressedTexImage GLAD_API_CALL PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv; #define glUniformMatrix3fv glad_glUniformMatrix3fv GLAD_API_CALL PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv; #define glVertexAttrib2fv glad_glVertexAttrib2fv GLAD_API_CALL PFNGLEVALCOORD2DPROC glad_glEvalCoord2d; #define glEvalCoord2d glad_glEvalCoord2d GLAD_API_CALL PFNGLGETPOINTERVPROC glad_glGetPointerv; #define glGetPointerv glad_glGetPointerv GLAD_API_CALL PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d; #define glProgramUniform4d glad_glProgramUniform4d GLAD_API_CALL PFNGLTEXCOORD2FPROC glad_glTexCoord2f; #define glTexCoord2f glad_glTexCoord2f GLAD_API_CALL PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData; #define glCopyBufferSubData glad_glCopyBufferSubData GLAD_API_CALL PFNGLUNIFORMMATRIX3DVPROC glad_glUniformMatrix3dv; #define glUniformMatrix3dv glad_glUniformMatrix3dv GLAD_API_CALL PFNGLSECONDARYCOLOR3IVPROC glad_glSecondaryColor3iv; #define glSecondaryColor3iv glad_glSecondaryColor3iv GLAD_API_CALL PFNGLFINISHPROC glad_glFinish; #define glFinish glad_glFinish GLAD_API_CALL PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline; #define glIsProgramPipeline glad_glIsProgramPipeline GLAD_API_CALL PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv; #define glVertexAttribP1uiv glad_glVertexAttribP1uiv GLAD_API_CALL PFNGLGETNMAPDVPROC glad_glGetnMapdv; #define glGetnMapdv glad_glGetnMapdv GLAD_API_CALL PFNGLBINDTEXTURESPROC glad_glBindTextures; #define glBindTextures glad_glBindTextures GLAD_API_CALL PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui; #define glMultiTexCoordP3ui glad_glMultiTexCoordP3ui GLAD_API_CALL PFNGLCOLORMASKIPROC glad_glColorMaski; #define glColorMaski glad_glColorMaski GLAD_API_CALL PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v; #define glGetQueryObjecti64v glad_glGetQueryObjecti64v GLAD_API_CALL PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s; #define glMultiTexCoord3s glad_glMultiTexCoord3s GLAD_API_CALL PFNGLWINDOWPOS2DPROC glad_glWindowPos2d; #define glWindowPos2d glad_glWindowPos2d GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glad_glDrawArraysInstancedBaseInstance; #define glDrawArraysInstancedBaseInstance glad_glDrawArraysInstancedBaseInstance GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKPROC glad_glDrawTransformFeedback; #define glDrawTransformFeedback glad_glDrawTransformFeedback GLAD_API_CALL PFNGLWINDOWPOS2FPROC glad_glWindowPos2f; #define glWindowPos2f glad_glWindowPos2f GLAD_API_CALL PFNGLVERTEXATTRIBLPOINTERPROC glad_glVertexAttribLPointer; #define glVertexAttribLPointer glad_glVertexAttribLPointer GLAD_API_CALL PFNGLTEXCOORD4FPROC glad_glTexCoord4f; #define glTexCoord4f glad_glTexCoord4f GLAD_API_CALL PFNGLLIGHTMODELIVPROC glad_glLightModeliv; #define glLightModeliv glad_glLightModeliv GLAD_API_CALL PFNGLUNIFORM2UIPROC glad_glUniform2ui; #define glUniform2ui glad_glUniform2ui GLAD_API_CALL PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays; #define glDeleteVertexArrays glad_glDeleteVertexArrays GLAD_API_CALL PFNGLTEXBUFFERPROC glad_glTexBuffer; #define glTexBuffer glad_glTexBuffer GLAD_API_CALL PFNGLUNIFORM2FPROC glad_glUniform2f; #define glUniform2f glad_glUniform2f GLAD_API_CALL PFNGLTEXCOORD1DPROC glad_glTexCoord1d; #define glTexCoord1d glad_glTexCoord1d GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D; #define glCompressedTexImage2D glad_glCompressedTexImage2D GLAD_API_CALL PFNGLGETGRAPHICSRESETSTATUSPROC glad_glGetGraphicsResetStatus; #define glGetGraphicsResetStatus glad_glGetGraphicsResetStatus GLAD_API_CALL PFNGLTEXCOORD1SPROC glad_glTexCoord1s; #define glTexCoord1s glad_glTexCoord1s GLAD_API_CALL PFNGLINDEXSVPROC glad_glIndexsv; #define glIndexsv glad_glIndexsv GLAD_API_CALL PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv; #define glRasterPos4iv glad_glRasterPos4iv GLAD_API_CALL PFNGLSECONDARYCOLOR3IPROC glad_glSecondaryColor3i; #define glSecondaryColor3i glad_glSecondaryColor3i GLAD_API_CALL PFNGLCALLLISTPROC glad_glCallList; #define glCallList glad_glCallList GLAD_API_CALL PFNGLINDEXUBVPROC glad_glIndexubv; #define glIndexubv glad_glIndexubv GLAD_API_CALL PFNGLPOLYGONMODEPROC glad_glPolygonMode; #define glPolygonMode glad_glPolygonMode GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture; #define glFramebufferTexture glad_glFramebufferTexture GLAD_API_CALL PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv; #define glUniformMatrix3x4fv glad_glUniformMatrix3x4fv GLAD_API_CALL PFNGLISTRANSFORMFEEDBACKPROC glad_glIsTransformFeedback; #define glIsTransformFeedback glad_glIsTransformFeedback GLAD_API_CALL PFNGLNAMEDBUFFERSUBDATAPROC glad_glNamedBufferSubData; #define glNamedBufferSubData glad_glNamedBufferSubData GLAD_API_CALL PFNGLGETPROGRAMINTERFACEIVPROC glad_glGetProgramInterfaceiv; #define glGetProgramInterfaceiv glad_glGetProgramInterfaceiv GLAD_API_CALL PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState; #define glDisableClientState glad_glDisableClientState GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC glad_glClearNamedFramebufferuiv; #define glClearNamedFramebufferuiv glad_glClearNamedFramebufferuiv GLAD_API_CALL PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv; #define glGetTexParameterfv glad_glGetTexParameterfv GLAD_API_CALL PFNGLVERTEXARRAYATTRIBLFORMATPROC glad_glVertexArrayAttribLFormat; #define glVertexArrayAttribLFormat glad_glVertexArrayAttribLFormat GLAD_API_CALL PFNGLVERTEX4DPROC glad_glVertex4d; #define glVertex4d glad_glVertex4d GLAD_API_CALL PFNGLNORMAL3SVPROC glad_glNormal3sv; #define glNormal3sv glad_glNormal3sv GLAD_API_CALL PFNGLRASTERPOS4FPROC glad_glRasterPos4f; #define glRasterPos4f glad_glRasterPos4f GLAD_API_CALL PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui; #define glTexCoordP4ui glad_glTexCoordP4ui GLAD_API_CALL PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers; #define glGenRenderbuffers glad_glGenRenderbuffers GLAD_API_CALL PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings; #define glTransformFeedbackVaryings glad_glTransformFeedbackVaryings GLAD_API_CALL PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv; #define glProgramUniform4fv glad_glProgramUniform4fv GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC glad_glNamedFramebufferReadBuffer; #define glNamedFramebufferReadBuffer glad_glNamedFramebufferReadBuffer GLAD_API_CALL PFNGLUNIFORMMATRIX2X3DVPROC glad_glUniformMatrix2x3dv; #define glUniformMatrix2x3dv glad_glUniformMatrix2x3dv GLAD_API_CALL PFNGLVERTEXATTRIBL3DVPROC glad_glVertexAttribL3dv; #define glVertexAttribL3dv glad_glVertexAttribL3dv GLAD_API_CALL PFNGLUNIFORM1UIVPROC glad_glUniform1uiv; #define glUniform1uiv glad_glUniform1uiv GLAD_API_CALL PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv; #define glTexCoord1sv glad_glTexCoord1sv GLAD_API_CALL PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v; #define glGetIntegeri_v glad_glGetIntegeri_v GLAD_API_CALL PFNGLTEXTURESUBIMAGE2DPROC glad_glTextureSubImage2D; #define glTextureSubImage2D glad_glTextureSubImage2D GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEPROC glad_glNamedRenderbufferStorage; #define glNamedRenderbufferStorage glad_glNamedRenderbufferStorage GLAD_API_CALL PFNGLGETMAPIVPROC glad_glGetMapiv; #define glGetMapiv glad_glGetMapiv GLAD_API_CALL PFNGLMATRIXMODEPROC glad_glMatrixMode; #define glMatrixMode glad_glMatrixMode GLAD_API_CALL PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv; #define glVertexAttribI4uiv glad_glVertexAttribI4uiv GLAD_API_CALL PFNGLVERTEXATTRIBL1DVPROC glad_glVertexAttribL1dv; #define glVertexAttribL1dv glad_glVertexAttribL1dv GLAD_API_CALL PFNGLGETNAMEDBUFFERSUBDATAPROC glad_glGetNamedBufferSubData; #define glGetNamedBufferSubData glad_glGetNamedBufferSubData GLAD_API_CALL PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays; #define glGenVertexArrays glad_glGenVertexArrays GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIVPROC glad_glGetTextureParameteriv; #define glGetTextureParameteriv glad_glGetTextureParameteriv GLAD_API_CALL PFNGLVERTEX3FVPROC glad_glVertex3fv; #define glVertex3fv glad_glVertex3fv GLAD_API_CALL PFNGLMATERIALIVPROC glad_glMaterialiv; #define glMaterialiv glad_glMaterialiv GLAD_API_CALL PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi; #define glPixelTransferi glad_glPixelTransferi GLAD_API_CALL PFNGLGETNHISTOGRAMPROC glad_glGetnHistogram; #define glGetnHistogram glad_glGetnHistogram GLAD_API_CALL PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv; #define glCreateShaderProgramv glad_glCreateShaderProgramv GLAD_API_CALL PFNGLENABLEVERTEXARRAYATTRIBPROC glad_glEnableVertexArrayAttrib; #define glEnableVertexArrayAttrib glad_glEnableVertexArrayAttrib GLAD_API_CALL PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender; #define glEndConditionalRender glad_glEndConditionalRender GLAD_API_CALL PFNGLDELETELISTSPROC glad_glDeleteLists; #define glDeleteLists glad_glDeleteLists GLAD_API_CALL PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv; #define glTexCoord2sv glad_glTexCoord2sv GLAD_API_CALL PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback; #define glDebugMessageCallback glad_glDebugMessageCallback GLAD_API_CALL PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f; #define glMultiTexCoord1f glad_glMultiTexCoord1f GLAD_API_CALL PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage; #define glGetCompressedTexImage glad_glGetCompressedTexImage GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus; #define glCheckFramebufferStatus glad_glCheckFramebufferStatus GLAD_API_CALL PFNGLGETINTERNALFORMATI64VPROC glad_glGetInternalformati64v; #define glGetInternalformati64v glad_glGetInternalformati64v GLAD_API_CALL PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap; #define glGenerateMipmap glad_glGenerateMipmap GLAD_API_CALL PFNGLDELETEQUERIESPROC glad_glDeleteQueries; #define glDeleteQueries glad_glDeleteQueries GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC glad_glNamedFramebufferParameteri; #define glNamedFramebufferParameteri glad_glNamedFramebufferParameteri GLAD_API_CALL PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex; #define glDrawElementsBaseVertex glad_glDrawElementsBaseVertex GLAD_API_CALL PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d; #define glProgramUniform1d glad_glProgramUniform1d GLAD_API_CALL PFNGLALPHAFUNCPROC glad_glAlphaFunc; #define glAlphaFunc glad_glAlphaFunc GLAD_API_CALL PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC glad_glTransformFeedbackBufferRange; #define glTransformFeedbackBufferRange glad_glTransformFeedbackBufferRange GLAD_API_CALL PFNGLLINESTIPPLEPROC glad_glLineStipple; #define glLineStipple glad_glLineStipple GLAD_API_CALL PFNGLTEXGENIPROC glad_glTexGeni; #define glTexGeni glad_glTexGeni GLAD_API_CALL PFNGLTEXSTORAGE3DMULTISAMPLEPROC glad_glTexStorage3DMultisample; #define glTexStorage3DMultisample glad_glTexStorage3DMultisample GLAD_API_CALL PFNGLISVERTEXARRAYPROC glad_glIsVertexArray; #define glIsVertexArray glad_glIsVertexArray GLAD_API_CALL PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC glad_glGetNamedRenderbufferParameteriv; #define glGetNamedRenderbufferParameteriv glad_glGetNamedRenderbufferParameteriv GLAD_API_CALL PFNGLINVALIDATEFRAMEBUFFERPROC glad_glInvalidateFramebuffer; #define glInvalidateFramebuffer glad_glInvalidateFramebuffer GLAD_API_CALL PFNGLPROGRAMBINARYPROC glad_glProgramBinary; #define glProgramBinary glad_glProgramBinary GLAD_API_CALL PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv; #define glTexCoord4dv glad_glTexCoord4dv GLAD_API_CALL PFNGLVERTEX3IPROC glad_glVertex3i; #define glVertex3i glad_glVertex3i GLAD_API_CALL PFNGLSECONDARYCOLOR3BPROC glad_glSecondaryColor3b; #define glSecondaryColor3b glad_glSecondaryColor3b GLAD_API_CALL PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv; #define glRasterPos4sv glad_glRasterPos4sv GLAD_API_CALL PFNGLDISABLEIPROC glad_glDisablei; #define glDisablei glad_glDisablei GLAD_API_CALL PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv; #define glVertexAttrib1sv glad_glVertexAttrib1sv GLAD_API_CALL PFNGLINVALIDATETEXIMAGEPROC glad_glInvalidateTexImage; #define glInvalidateTexImage glad_glInvalidateTexImage GLAD_API_CALL PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i; #define glVertexAttribI2i glad_glVertexAttribI2i GLAD_API_CALL PFNGLINDEXFPROC glad_glIndexf; #define glIndexf glad_glIndexf GLAD_API_CALL PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex; #define glPrimitiveRestartIndex glad_glPrimitiveRestartIndex GLAD_API_CALL PFNGLGETNCONVOLUTIONFILTERPROC glad_glGetnConvolutionFilter; #define glGetnConvolutionFilter glad_glGetnConvolutionFilter GLAD_API_CALL PFNGLGETERRORPROC glad_glGetError; #define glGetError glad_glGetError GLAD_API_CALL PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv; #define glVertexAttrib4bv glad_glVertexAttrib4bv GLAD_API_CALL PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange; #define glFlushMappedBufferRange glad_glFlushMappedBufferRange GLAD_API_CALL PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui; #define glTexCoordP1ui glad_glTexCoordP1ui GLAD_API_CALL PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage; #define glSampleCoverage glad_glSampleCoverage GLAD_API_CALL PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv; #define glMultiTexCoord2iv glad_glMultiTexCoord2iv GLAD_API_CALL PFNGLISPROGRAMPROC glad_glIsProgram; #define glIsProgram glad_glIsProgram GLAD_API_CALL PFNGLISLISTPROC glad_glIsList; #define glIsList glad_glIsList GLAD_API_CALL PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv; #define glVertexAttrib2dv glad_glVertexAttrib2dv GLAD_API_CALL PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f; #define glVertexAttrib3f glad_glVertexAttrib3f GLAD_API_CALL PFNGLTEXPARAMETERIPROC glad_glTexParameteri; #define glTexParameteri glad_glTexParameteri GLAD_API_CALL PFNGLPUSHATTRIBPROC glad_glPushAttrib; #define glPushAttrib glad_glPushAttrib GLAD_API_CALL PFNGLFRONTFACEPROC glad_glFrontFace; #define glFrontFace glad_glFrontFace GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC glad_glDrawElementsInstancedBaseInstance; #define glDrawElementsInstancedBaseInstance glad_glDrawElementsInstancedBaseInstance GLAD_API_CALL PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s; #define glMultiTexCoord1s glad_glMultiTexCoord1s GLAD_API_CALL PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i; #define glVertexAttribI3i glad_glVertexAttribI3i GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D; #define glCopyTexSubImage1D glad_glCopyTexSubImage1D GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D; #define glFramebufferTexture3D glad_glFramebufferTexture3D GLAD_API_CALL PFNGLGENSAMPLERSPROC glad_glGenSamplers; #define glGenSamplers glad_glGenSamplers GLAD_API_CALL PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf; #define glSamplerParameterf glad_glSamplerParameterf GLAD_API_CALL PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv; #define glRasterPos4fv glad_glRasterPos4fv GLAD_API_CALL PFNGLPAUSETRANSFORMFEEDBACKPROC glad_glPauseTransformFeedback; #define glPauseTransformFeedback glad_glPauseTransformFeedback GLAD_API_CALL PFNGLPOPNAMEPROC glad_glPopName; #define glPopName glad_glPopName GLAD_API_CALL PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv; #define glVertexAttribI1iv glad_glVertexAttribI1iv GLAD_API_CALL PFNGLEVALCOORD1FPROC glad_glEvalCoord1f; #define glEvalCoord1f glad_glEvalCoord1f GLAD_API_CALL PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers; #define glGenFramebuffers glad_glGenFramebuffers GLAD_API_CALL PFNGLLIGHTIPROC glad_glLighti; #define glLighti glad_glLighti GLAD_API_CALL PFNGLTEXTUREVIEWPROC glad_glTextureView; #define glTextureView glad_glTextureView GLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXDPROC glad_glLoadTransposeMatrixd; #define glLoadTransposeMatrixd glad_glLoadTransposeMatrixd GLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetNamedFramebufferAttachmentParameteriv; #define glGetNamedFramebufferAttachmentParameteriv glad_glGetNamedFramebufferAttachmentParameteriv GLAD_API_CALL PFNGLUNIFORM4DPROC glad_glUniform4d; #define glUniform4d glad_glUniform4d GLAD_API_CALL PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui; #define glVertexAttribI3ui glad_glVertexAttribI3ui GLAD_API_CALL PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer; #define glEdgeFlagPointer glad_glEdgeFlagPointer GLAD_API_CALL PFNGLSTENCILFUNCPROC glad_glStencilFunc; #define glStencilFunc glad_glStencilFunc GLAD_API_CALL PFNGLUNIFORM1IPROC glad_glUniform1i; #define glUniform1i glad_glUniform1i GLAD_API_CALL PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv; #define glGetTexParameterIuiv glad_glGetTexParameterIuiv GLAD_API_CALL PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC glad_glInvalidateNamedFramebufferData; #define glInvalidateNamedFramebufferData glad_glInvalidateNamedFramebufferData GLAD_API_CALL PFNGLPATCHPARAMETERFVPROC glad_glPatchParameterfv; #define glPatchParameterfv glad_glPatchParameterfv GLAD_API_CALL PFNGLFOGFVPROC glad_glFogfv; #define glFogfv glad_glFogfv GLAD_API_CALL PFNGLVERTEXP3UIPROC glad_glVertexP3ui; #define glVertexP3ui glad_glVertexP3ui GLAD_API_CALL PFNGLREADNPIXELSPROC glad_glReadnPixels; #define glReadnPixels glad_glReadnPixels GLAD_API_CALL PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i; #define glMultiTexCoord1i glad_glMultiTexCoord1i GLAD_API_CALL PFNGLVERTEXATTRIBBINDINGPROC glad_glVertexAttribBinding; #define glVertexAttribBinding glad_glVertexAttribBinding GLAD_API_CALL PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv; #define glMultiTexCoord3dv glad_glMultiTexCoord3dv GLAD_API_CALL PFNGLVERTEX4SPROC glad_glVertex4s; #define glVertex4s glad_glVertex4s GLAD_API_CALL PFNGLVERTEXBINDINGDIVISORPROC glad_glVertexBindingDivisor; #define glVertexBindingDivisor glad_glVertexBindingDivisor GLAD_API_CALL PFNGLTEXTUREPARAMETERFVPROC glad_glTextureParameterfv; #define glTextureParameterfv glad_glTextureParameterfv GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv; #define glProgramUniformMatrix3x4fv glad_glProgramUniformMatrix3x4fv GLAD_API_CALL PFNGLNORMAL3BPROC glad_glNormal3b; #define glNormal3b glad_glNormal3b GLAD_API_CALL PFNGLGETUNIFORMSUBROUTINEUIVPROC glad_glGetUniformSubroutineuiv; #define glGetUniformSubroutineuiv glad_glGetUniformSubroutineuiv GLAD_API_CALL PFNGLVERTEX3SVPROC glad_glVertex3sv; #define glVertex3sv glad_glVertex3sv GLAD_API_CALL PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv; #define glMultiTexCoord3sv glad_glMultiTexCoord3sv GLAD_API_CALL PFNGLGETNAMEDBUFFERPARAMETERI64VPROC glad_glGetNamedBufferParameteri64v; #define glGetNamedBufferParameteri64v glad_glGetNamedBufferParameteri64v GLAD_API_CALL PFNGLDRAWPIXELSPROC glad_glDrawPixels; #define glDrawPixels glad_glDrawPixels GLAD_API_CALL PFNGLCALLLISTSPROC glad_glCallLists; #define glCallLists glad_glCallLists GLAD_API_CALL PFNGLTEXCOORD3IPROC glad_glTexCoord3i; #define glTexCoord3i glad_glTexCoord3i GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui; #define glProgramUniform2ui glad_glProgramUniform2ui GLAD_API_CALL PFNGLQUERYCOUNTERPROC glad_glQueryCounter; #define glQueryCounter glad_glQueryCounter GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv; #define glProgramUniformMatrix2x3dv glad_glProgramUniformMatrix2x3dv GLAD_API_CALL PFNGLUNIFORM1IVPROC glad_glUniform1iv; #define glUniform1iv glad_glUniform1iv GLAD_API_CALL PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate; #define glStencilFuncSeparate glad_glStencilFuncSeparate GLAD_API_CALL PFNGLGETNAMEDBUFFERPARAMETERIVPROC glad_glGetNamedBufferParameteriv; #define glGetNamedBufferParameteriv glad_glGetNamedBufferParameteriv GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv; #define glProgramUniformMatrix2dv glad_glProgramUniformMatrix2dv GLAD_API_CALL PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib; #define glGetActiveAttrib glad_glGetActiveAttrib GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray; #define glEnableVertexAttribArray glad_glEnableVertexAttribArray GLAD_API_CALL PFNGLMATERIALIPROC glad_glMateriali; #define glMateriali glad_glMateriali GLAD_API_CALL PFNGLUNIFORM2FVPROC glad_glUniform2fv; #define glUniform2fv glad_glUniform2fv GLAD_API_CALL PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv; #define glRasterPos3fv glad_glRasterPos3fv GLAD_API_CALL PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC glad_glGetProgramResourceLocationIndex; #define glGetProgramResourceLocationIndex glad_glGetProgramResourceLocationIndex GLAD_API_CALL PFNGLGETDOUBLEVPROC glad_glGetDoublev; #define glGetDoublev glad_glGetDoublev GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex; #define glDrawElementsInstancedBaseVertex glad_glDrawElementsInstancedBaseVertex GLAD_API_CALL PFNGLUNIFORMMATRIX2X4DVPROC glad_glUniformMatrix2x4dv; #define glUniformMatrix2x4dv glad_glUniformMatrix2x4dv GLAD_API_CALL PFNGLCOLOR4BVPROC glad_glColor4bv; #define glColor4bv glad_glColor4bv GLAD_API_CALL PFNGLGETINTERNALFORMATIVPROC glad_glGetInternalformativ; #define glGetInternalformativ glad_glGetInternalformativ GLAD_API_CALL PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC glad_glGetActiveSubroutineUniformiv; #define glGetActiveSubroutineUniformiv glad_glGetActiveSubroutineUniformiv GLAD_API_CALL PFNGLGETQUERYINDEXEDIVPROC glad_glGetQueryIndexediv; #define glGetQueryIndexediv glad_glGetQueryIndexediv GLAD_API_CALL PFNGLBINDVERTEXBUFFERPROC glad_glBindVertexBuffer; #define glBindVertexBuffer glad_glBindVertexBuffer GLAD_API_CALL PFNGLTEXCOORD3FPROC glad_glTexCoord3f; #define glTexCoord3f glad_glTexCoord3f GLAD_API_CALL PFNGLCOLOR3UIVPROC glad_glColor3uiv; #define glColor3uiv glad_glColor3uiv GLAD_API_CALL PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv; #define glVertexAttrib4Nbv glad_glVertexAttrib4Nbv GLAD_API_CALL PFNGLCLEARPROC glad_glClear; #define glClear glad_glClear GLAD_API_CALL PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv; #define glRasterPos2dv glad_glRasterPos2dv GLAD_API_CALL PFNGLTEXCOORD2SPROC glad_glTexCoord2s; #define glTexCoord2s glad_glTexCoord2s GLAD_API_CALL PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui; #define glVertexAttribP4ui glad_glVertexAttribP4ui GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer; #define glFramebufferTextureLayer glad_glFramebufferTextureLayer GLAD_API_CALL PFNGLTEXENVIPROC glad_glTexEnvi; #define glTexEnvi glad_glTexEnvi GLAD_API_CALL PFNGLTEXTUREPARAMETERFPROC glad_glTextureParameterf; #define glTextureParameterf glad_glTextureParameterf GLAD_API_CALL PFNGLMATERIALFPROC glad_glMaterialf; #define glMaterialf glad_glMaterialf GLAD_API_CALL PFNGLGETUNIFORMDVPROC glad_glGetUniformdv; #define glGetUniformdv glad_glGetUniformdv GLAD_API_CALL PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv; #define glProgramUniform3iv glad_glProgramUniform3iv GLAD_API_CALL PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv; #define glTexParameterIuiv glad_glTexParameterIuiv GLAD_API_CALL PFNGLCLEARINDEXPROC glad_glClearIndex; #define glClearIndex glad_glClearIndex GLAD_API_CALL PFNGLDISPATCHCOMPUTEINDIRECTPROC glad_glDispatchComputeIndirect; #define glDispatchComputeIndirect glad_glDispatchComputeIndirect GLAD_API_CALL PFNGLROTATEFPROC glad_glRotatef; #define glRotatef glad_glRotatef GLAD_API_CALL PFNGLTEXTURESUBIMAGE1DPROC glad_glTextureSubImage1D; #define glTextureSubImage1D glad_glTextureSubImage1D GLAD_API_CALL PFNGLPOLYGONOFFSETCLAMPPROC glad_glPolygonOffsetClamp; #define glPolygonOffsetClamp glad_glPolygonOffsetClamp GLAD_API_CALL PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv; #define glSamplerParameterIuiv glad_glSamplerParameterIuiv GLAD_API_CALL PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv; #define glProgramUniform4iv glad_glProgramUniform4iv GLAD_API_CALL PFNGLSECONDARYCOLOR3SPROC glad_glSecondaryColor3s; #define glSecondaryColor3s glad_glSecondaryColor3s GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv; #define glProgramUniformMatrix2x4dv glad_glProgramUniformMatrix2x4dv GLAD_API_CALL PFNGLGETVERTEXATTRIBLDVPROC glad_glGetVertexAttribLdv; #define glGetVertexAttribLdv glad_glGetVertexAttribLdv GLAD_API_CALL PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv; #define glRasterPos2fv glad_glRasterPos2fv GLAD_API_CALL PFNGLSHADEMODELPROC glad_glShadeModel; #define glShadeModel glad_glShadeModel GLAD_API_CALL PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv; #define glProgramUniform4dv glad_glProgramUniform4dv GLAD_API_CALL PFNGLNORMAL3FVPROC glad_glNormal3fv; #define glNormal3fv glad_glNormal3fv GLAD_API_CALL PFNGLISBUFFERPROC glad_glIsBuffer; #define glIsBuffer glad_glIsBuffer GLAD_API_CALL PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f; #define glMultiTexCoord3f glad_glMultiTexCoord3f GLAD_API_CALL PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer; #define glBindFramebuffer glad_glBindFramebuffer GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed; #define glBindFragDataLocationIndexed glad_glBindFragDataLocationIndexed GLAD_API_CALL PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase; #define glBindBufferBase glad_glBindBufferBase GLAD_API_CALL PFNGLGENBUFFERSPROC glad_glGenBuffers; #define glGenBuffers glad_glGenBuffers GLAD_API_CALL PFNGLTEXCOORD1FPROC glad_glTexCoord1f; #define glTexCoord1f glad_glTexCoord1f GLAD_API_CALL PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData; #define glGetBufferSubData glad_glGetBufferSubData GLAD_API_CALL PFNGLCREATETRANSFORMFEEDBACKSPROC glad_glCreateTransformFeedbacks; #define glCreateTransformFeedbacks glad_glCreateTransformFeedbacks GLAD_API_CALL PFNGLMAP2FPROC glad_glMap2f; #define glMap2f glad_glMap2f GLAD_API_CALL PFNGLCREATEBUFFERSPROC glad_glCreateBuffers; #define glCreateBuffers glad_glCreateBuffers GLAD_API_CALL PFNGLCOLOR3USVPROC glad_glColor3usv; #define glColor3usv glad_glColor3usv GLAD_API_CALL PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv; #define glGetSamplerParameterfv glad_glGetSamplerParameterfv GLAD_API_CALL PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation; #define glGetUniformLocation glad_glGetUniformLocation GLAD_API_CALL PFNGLVERTEX2DPROC glad_glVertex2d; #define glVertex2d glad_glVertex2d GLAD_API_CALL PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC glad_glGetSubroutineUniformLocation; #define glGetSubroutineUniformLocation glad_glGetSubroutineUniformLocation GLAD_API_CALL PFNGLINVALIDATEBUFFERSUBDATAPROC glad_glInvalidateBufferSubData; #define glInvalidateBufferSubData glad_glInvalidateBufferSubData GLAD_API_CALL PFNGLUNIFORMMATRIX2DVPROC glad_glUniformMatrix2dv; #define glUniformMatrix2dv glad_glUniformMatrix2dv GLAD_API_CALL PFNGLCLEARNAMEDBUFFERSUBDATAPROC glad_glClearNamedBufferSubData; #define glClearNamedBufferSubData glad_glClearNamedBufferSubData GLAD_API_CALL PFNGLGETPROGRAMIVPROC glad_glGetProgramiv; #define glGetProgramiv glad_glGetProgramiv GLAD_API_CALL PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements; #define glDrawRangeElements glad_glDrawRangeElements GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv; #define glProgramUniformMatrix4fv glad_glProgramUniformMatrix4fv GLAD_API_CALL PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v; #define glGetInteger64i_v glad_glGetInteger64i_v GLAD_API_CALL PFNGLVERTEXATTRIBL1DPROC glad_glVertexAttribL1d; #define glVertexAttribL1d glad_glVertexAttribL1d GLAD_API_CALL PFNGLGETTEXTUREIMAGEPROC glad_glGetTextureImage; #define glGetTextureImage glad_glGetTextureImage GLAD_API_CALL PFNGLGETNUNIFORMIVPROC glad_glGetnUniformiv; #define glGetnUniformiv glad_glGetnUniformiv GLAD_API_CALL PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i; #define glProgramUniform1i glad_glProgramUniform1i GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC glad_glDrawTransformFeedbackInstanced; #define glDrawTransformFeedbackInstanced glad_glDrawTransformFeedbackInstanced GLAD_API_CALL PFNGLGETPROGRAMRESOURCEINDEXPROC glad_glGetProgramResourceIndex; #define glGetProgramResourceIndex glad_glGetProgramResourceIndex GLAD_API_CALL PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d; #define glProgramUniform2d glad_glProgramUniform2d GLAD_API_CALL PFNGLUNMAPNAMEDBUFFERPROC glad_glUnmapNamedBuffer; #define glUnmapNamedBuffer glad_glUnmapNamedBuffer GLAD_API_CALL PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f; #define glMultiTexCoord2f glad_glMultiTexCoord2f GLAD_API_CALL PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv; #define glPointParameterfv glad_glPointParameterfv GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv; #define glProgramUniformMatrix3fv glad_glProgramUniformMatrix3fv GLAD_API_CALL PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange; #define glBindBufferRange glad_glBindBufferRange GLAD_API_CALL PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv; #define glMultiTexCoord2dv glad_glMultiTexCoord2dv GLAD_API_CALL PFNGLCOLORMATERIALPROC glad_glColorMaterial; #define glColorMaterial glad_glColorMaterial GLAD_API_CALL PFNGLBLENDEQUATIONPROC glad_glBlendEquation; #define glBlendEquation glad_glBlendEquation GLAD_API_CALL PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer; #define glBlitFramebuffer glad_glBlitFramebuffer GLAD_API_CALL PFNGLCOLOR3DPROC glad_glColor3d; #define glColor3d glad_glColor3d GLAD_API_CALL PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv; #define glMultiTexCoord3iv glad_glMultiTexCoord3iv GLAD_API_CALL PFNGLLIGHTFVPROC glad_glLightfv; #define glLightfv glad_glLightfv GLAD_API_CALL PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv; #define glVertexAttrib1dv glad_glVertexAttrib1dv GLAD_API_CALL PFNGLDEPTHMASKPROC glad_glDepthMask; #define glDepthMask glad_glDepthMask GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying; #define glGetTransformFeedbackVarying glad_glGetTransformFeedbackVarying GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui; #define glProgramUniform1ui glad_glProgramUniform1ui GLAD_API_CALL PFNGLVERTEXATTRIBL3DPROC glad_glVertexAttribL3d; #define glVertexAttribL3d glad_glVertexAttribL3d GLAD_API_CALL PFNGLDRAWELEMENTSINDIRECTPROC glad_glDrawElementsIndirect; #define glDrawElementsIndirect glad_glDrawElementsIndirect GLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXFPROC glad_glLoadTransposeMatrixf; #define glLoadTransposeMatrixf glad_glLoadTransposeMatrixf GLAD_API_CALL PFNGLENDQUERYINDEXEDPROC glad_glEndQueryIndexed; #define glEndQueryIndexed glad_glEndQueryIndexed GLAD_API_CALL PFNGLSECONDARYCOLOR3USPROC glad_glSecondaryColor3us; #define glSecondaryColor3us glad_glSecondaryColor3us GLAD_API_CALL PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC glad_glTextureStorage2DMultisample; #define glTextureStorage2DMultisample glad_glTextureStorage2DMultisample GLAD_API_CALL PFNGLPIXELSTOREFPROC glad_glPixelStoref; #define glPixelStoref glad_glPixelStoref GLAD_API_CALL PFNGLUNIFORM2IVPROC glad_glUniform2iv; #define glUniform2iv glad_glUniform2iv GLAD_API_CALL PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv; #define glRasterPos2sv glad_glRasterPos2sv GLAD_API_CALL PFNGLVERTEX2IPROC glad_glVertex2i; #define glVertex2i glad_glVertex2i GLAD_API_CALL PFNGLFRUSTUMPROC glad_glFrustum; #define glFrustum glad_glFrustum GLAD_API_CALL PFNGLMEMORYBARRIERPROC glad_glMemoryBarrier; #define glMemoryBarrier glad_glMemoryBarrier GLAD_API_CALL PFNGLGETSTRINGPROC glad_glGetString; #define glGetString glad_glGetString GLAD_API_CALL PFNGLLINEWIDTHPROC glad_glLineWidth; #define glLineWidth glad_glLineWidth GLAD_API_CALL PFNGLNORMALPOINTERPROC glad_glNormalPointer; #define glNormalPointer glad_glNormalPointer GLAD_API_CALL PFNGLGETNUNIFORMUIVPROC glad_glGetnUniformuiv; #define glGetnUniformuiv glad_glGetnUniformuiv GLAD_API_CALL PFNGLDEPTHRANGEARRAYVPROC glad_glDepthRangeArrayv; #define glDepthRangeArrayv glad_glDepthRangeArrayv GLAD_API_CALL PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui; #define glTexCoordP2ui glad_glTexCoordP2ui GLAD_API_CALL PFNGLATTACHSHADERPROC glad_glAttachShader; #define glAttachShader glad_glAttachShader GLAD_API_CALL PFNGLDRAWARRAYSPROC glad_glDrawArrays; #define glDrawArrays glad_glDrawArrays GLAD_API_CALL PFNGLCOLOR4SPROC glad_glColor4s; #define glColor4s glad_glColor4s GLAD_API_CALL PFNGLTEXGENDVPROC glad_glTexGendv; #define glTexGendv glad_glTexGendv GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv; #define glProgramUniformMatrix3x2dv glad_glProgramUniformMatrix3x2dv GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv; #define glGetSamplerParameterIuiv glad_glGetSamplerParameterIuiv GLAD_API_CALL PFNGLENDQUERYPROC glad_glEndQuery; #define glEndQuery glad_glEndQuery GLAD_API_CALL PFNGLWINDOWPOS2SPROC glad_glWindowPos2s; #define glWindowPos2s glad_glWindowPos2s GLAD_API_CALL PFNGLDRAWARRAYSINDIRECTPROC glad_glDrawArraysIndirect; #define glDrawArraysIndirect glad_glDrawArraysIndirect GLAD_API_CALL PFNGLRASTERPOS3SPROC glad_glRasterPos3s; #define glRasterPos3s glad_glRasterPos3s GLAD_API_CALL PFNGLGETNPIXELMAPFVPROC glad_glGetnPixelMapfv; #define glGetnPixelMapfv glad_glGetnPixelMapfv GLAD_API_CALL PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv; #define glTexCoord3sv glad_glTexCoord3sv GLAD_API_CALL PFNGLRECTIPROC glad_glRecti; #define glRecti glad_glRecti GLAD_API_CALL PFNGLUNIFORM4DVPROC glad_glUniform4dv; #define glUniform4dv glad_glUniform4dv GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEIPROC glad_glBlendEquationSeparatei; #define glBlendEquationSeparatei glad_glBlendEquationSeparatei GLAD_API_CALL PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv; #define glProgramUniform3fv glad_glProgramUniform3fv GLAD_API_CALL PFNGLGETPROGRAMRESOURCEIVPROC glad_glGetProgramResourceiv; #define glGetProgramResourceiv glad_glGetProgramResourceiv GLAD_API_CALL PFNGLINVALIDATESUBFRAMEBUFFERPROC glad_glInvalidateSubFramebuffer; #define glInvalidateSubFramebuffer glad_glInvalidateSubFramebuffer GLAD_API_CALL PFNGLFENCESYNCPROC glad_glFenceSync; #define glFenceSync glad_glFenceSync GLAD_API_CALL PFNGLUNIFORM3UIPROC glad_glUniform3ui; #define glUniform3ui glad_glUniform3ui GLAD_API_CALL PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv; #define glSecondaryColorP3uiv glad_glSecondaryColorP3uiv GLAD_API_CALL PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s; #define glVertexAttrib1s glad_glVertexAttrib1s GLAD_API_CALL PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv; #define glVertexAttrib4Nsv glad_glVertexAttrib4Nsv GLAD_API_CALL PFNGLLOADMATRIXFPROC glad_glLoadMatrixf; #define glLoadMatrixf glad_glLoadMatrixf GLAD_API_CALL PFNGLTRANSLATEFPROC glad_glTranslatef; #define glTranslatef glad_glTranslatef GLAD_API_CALL PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv; #define glMultiTexCoord4sv glad_glMultiTexCoord4sv GLAD_API_CALL PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv; #define glProgramUniform2iv glad_glProgramUniform2iv GLAD_API_CALL PFNGLMAPGRID2FPROC glad_glMapGrid2f; #define glMapGrid2f glad_glMapGrid2f GLAD_API_CALL PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState; #define glEnableClientState glad_glEnableClientState GLAD_API_CALL PFNGLGETUNIFORMIVPROC glad_glGetUniformiv; #define glGetUniformiv glad_glGetUniformiv GLAD_API_CALL PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv; #define glEvalCoord1dv glad_glEvalCoord1dv GLAD_API_CALL PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv; #define glVertexAttribI4iv glad_glVertexAttribI4iv GLAD_API_CALL PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv; #define glVertexAttrib4sv glad_glVertexAttrib4sv GLAD_API_CALL PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv; #define glGetMultisamplefv glad_glGetMultisamplefv GLAD_API_CALL PFNGLINDEXDVPROC glad_glIndexdv; #define glIndexdv glad_glIndexdv GLAD_API_CALL PFNGLBLENDFUNCIPROC glad_glBlendFunci; #define glBlendFunci glad_glBlendFunci GLAD_API_CALL PFNGLISENABLEDPROC glad_glIsEnabled; #define glIsEnabled glad_glIsEnabled GLAD_API_CALL PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv; #define glGetPixelMapusv glad_glGetPixelMapusv GLAD_API_CALL PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv; #define glRasterPos3iv glad_glRasterPos3iv GLAD_API_CALL PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange; #define glMapBufferRange glad_glMapBufferRange GLAD_API_CALL PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s; #define glMultiTexCoord2s glad_glMultiTexCoord2s GLAD_API_CALL PFNGLRASTERPOS2FPROC glad_glRasterPos2f; #define glRasterPos2f glad_glRasterPos2f GLAD_API_CALL PFNGLMINSAMPLESHADINGPROC glad_glMinSampleShading; #define glMinSampleShading glad_glMinSampleShading GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTUI64VPROC glad_glGetQueryBufferObjectui64v; #define glGetQueryBufferObjectui64v glad_glGetQueryBufferObjectui64v GLAD_API_CALL PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i; #define glMultiTexCoord2i glad_glMultiTexCoord2i GLAD_API_CALL PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv; #define glVertexAttribP3uiv glad_glVertexAttribP3uiv GLAD_API_CALL PFNGLVERTEX2FPROC glad_glVertex2f; #define glVertex2f glad_glVertex2f GLAD_API_CALL PFNGLVERTEXARRAYBINDINGDIVISORPROC glad_glVertexArrayBindingDivisor; #define glVertexArrayBindingDivisor glad_glVertexArrayBindingDivisor GLAD_API_CALL PFNGLINDEXPOINTERPROC glad_glIndexPointer; #define glIndexPointer glad_glIndexPointer GLAD_API_CALL PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding; #define glUniformBlockBinding glad_glUniformBlockBinding GLAD_API_CALL PFNGLRENDERMODEPROC glad_glRenderMode; #define glRenderMode glad_glRenderMode GLAD_API_CALL PFNGLTEXSTORAGE1DPROC glad_glTexStorage1D; #define glTexStorage1D glad_glTexStorage1D GLAD_API_CALL PFNGLBUFFERSUBDATAPROC glad_glBufferSubData; #define glBufferSubData glad_glBufferSubData GLAD_API_CALL PFNGLCOLOR3FVPROC glad_glColor3fv; #define glColor3fv glad_glColor3fv GLAD_API_CALL PFNGLBITMAPPROC glad_glBitmap; #define glBitmap glad_glBitmap GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv; #define glProgramUniform3uiv glad_glProgramUniform3uiv GLAD_API_CALL PFNGLVIEWPORTINDEXEDFPROC glad_glViewportIndexedf; #define glViewportIndexedf glad_glViewportIndexedf GLAD_API_CALL PFNGLRASTERPOS2DPROC glad_glRasterPos2d; #define glRasterPos2d glad_glRasterPos2d GLAD_API_CALL PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices; #define glGetUniformIndices glad_glGetUniformIndices GLAD_API_CALL PFNGLENABLEIPROC glad_glEnablei; #define glEnablei glad_glEnablei GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D; #define glFramebufferTexture2D glad_glFramebufferTexture2D GLAD_API_CALL PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate; #define glBlendFuncSeparate glad_glBlendFuncSeparate GLAD_API_CALL PFNGLNAMEDBUFFERSTORAGEPROC glad_glNamedBufferStorage; #define glNamedBufferStorage glad_glNamedBufferStorage GLAD_API_CALL PFNGLRECTSPROC glad_glRects; #define glRects glad_glRects GLAD_API_CALL PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv; #define glProgramUniform2fv glad_glProgramUniform2fv GLAD_API_CALL PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple; #define glPolygonStipple glad_glPolygonStipple GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D; #define glCopyTexSubImage3D glad_glCopyTexSubImage3D GLAD_API_CALL PFNGLSECONDARYCOLOR3UBPROC glad_glSecondaryColor3ub; #define glSecondaryColor3ub glad_glSecondaryColor3ub GLAD_API_CALL PFNGLWINDOWPOS3FPROC glad_glWindowPos3f; #define glWindowPos3f glad_glWindowPos3f GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv; #define glGetSamplerParameteriv glad_glGetSamplerParameteriv GLAD_API_CALL PFNGLSHADERSTORAGEBLOCKBINDINGPROC glad_glShaderStorageBlockBinding; #define glShaderStorageBlockBinding glad_glShaderStorageBlockBinding GLAD_API_CALL PFNGLLOADIDENTITYPROC glad_glLoadIdentity; #define glLoadIdentity glad_glLoadIdentity GLAD_API_CALL PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex; #define glMultiDrawElementsBaseVertex glad_glMultiDrawElementsBaseVertex GLAD_API_CALL PFNGLVERTEX2SPROC glad_glVertex2s; #define glVertex2s glad_glVertex2s GLAD_API_CALL PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv; #define glMultiTexCoord1iv glad_glMultiTexCoord1iv GLAD_API_CALL PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s; #define glMultiTexCoord4s glad_glMultiTexCoord4s GLAD_API_CALL PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler; #define glReleaseShaderCompiler glad_glReleaseShaderCompiler GLAD_API_CALL PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource; #define glGetShaderSource glad_glGetShaderSource GLAD_API_CALL PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv; #define glMultiTexCoord2sv glad_glMultiTexCoord2sv GLAD_API_CALL PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv; #define glTexParameterfv glad_glTexParameterfv GLAD_API_CALL PFNGLISSHADERPROC glad_glIsShader; #define glIsShader glad_glIsShader GLAD_API_CALL PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv; #define glVertexAttrib4iv glad_glVertexAttrib4iv GLAD_API_CALL PFNGLTEXCOORD4IPROC glad_glTexCoord4i; #define glTexCoord4i glad_glTexCoord4i GLAD_API_CALL PFNGLCOLOR4UIPROC glad_glColor4ui; #define glColor4ui glad_glColor4ui GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv; #define glProgramUniformMatrix3dv glad_glProgramUniformMatrix3dv GLAD_API_CALL PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv; #define glGetTexEnvfv glad_glGetTexEnvfv GLAD_API_CALL PFNGLTEXCOORD4DPROC glad_glTexCoord4d; #define glTexCoord4d glad_glTexCoord4d GLAD_API_CALL PFNGLSCISSORARRAYVPROC glad_glScissorArrayv; #define glScissorArrayv glad_glScissorArrayv GLAD_API_CALL PFNGLCREATERENDERBUFFERSPROC glad_glCreateRenderbuffers; #define glCreateRenderbuffers glad_glCreateRenderbuffers GLAD_API_CALL PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv; #define glVertexAttrib3fv glad_glVertexAttrib3fv GLAD_API_CALL PFNGLCOLOR4FPROC glad_glColor4f; #define glColor4f glad_glColor4f GLAD_API_CALL PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub; #define glVertexAttrib4Nub glad_glVertexAttrib4Nub GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv; #define glGetSamplerParameterIiv glad_glGetSamplerParameterIiv GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D; #define glCopyTexSubImage2D glad_glCopyTexSubImage2D GLAD_API_CALL PFNGLNORMAL3IVPROC glad_glNormal3iv; #define glNormal3iv glad_glNormal3iv GLAD_API_CALL PFNGLBINDIMAGETEXTURESPROC glad_glBindImageTextures; #define glBindImageTextures glad_glBindImageTextures GLAD_API_CALL PFNGLTEXGENIVPROC glad_glTexGeniv; #define glTexGeniv glad_glTexGeniv GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D; #define glCompressedTexImage3D glad_glCompressedTexImage3D GLAD_API_CALL PFNGLSCALEDPROC glad_glScaled; #define glScaled glad_glScaled GLAD_API_CALL PFNGLCREATEPROGRAMPIPELINESPROC glad_glCreateProgramPipelines; #define glCreateProgramPipelines glad_glCreateProgramPipelines GLAD_API_CALL PFNGLBLENDFUNCSEPARATEIPROC glad_glBlendFuncSeparatei; #define glBlendFuncSeparatei glad_glBlendFuncSeparatei GLAD_API_CALL PFNGLHINTPROC glad_glHint; #define glHint glad_glHint GLAD_API_CALL PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i; #define glMultiTexCoord4i glad_glMultiTexCoord4i GLAD_API_CALL PFNGLINDEXMASKPROC glad_glIndexMask; #define glIndexMask glad_glIndexMask GLAD_API_CALL PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f; #define glProgramUniform2f glad_glProgramUniform2f GLAD_API_CALL PFNGLCOLOR3BPROC glad_glColor3b; #define glColor3b glad_glColor3b GLAD_API_CALL PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv; #define glVertexAttribI1uiv glad_glVertexAttribI1uiv GLAD_API_CALL PFNGLSPECIALIZESHADERPROC glad_glSpecializeShader; #define glSpecializeShader glad_glSpecializeShader GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC glad_glNamedFramebufferDrawBuffer; #define glNamedFramebufferDrawBuffer glad_glNamedFramebufferDrawBuffer GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTI64VPROC glad_glGetQueryBufferObjecti64v; #define glGetQueryBufferObjecti64v glad_glGetQueryBufferObjecti64v GLAD_API_CALL PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv; #define glTexCoord3iv glad_glTexCoord3iv GLAD_API_CALL PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv; #define glSamplerParameterfv glad_glSamplerParameterfv GLAD_API_CALL PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv; #define glGetVertexAttribIiv glad_glGetVertexAttribIiv GLAD_API_CALL PFNGLBUFFERSTORAGEPROC glad_glBufferStorage; #define glBufferStorage glad_glBufferStorage GLAD_API_CALL PFNGLVERTEX3SPROC glad_glVertex3s; #define glVertex3s glad_glVertex3s GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv; #define glProgramUniform2uiv glad_glProgramUniform2uiv GLAD_API_CALL PFNGLDEPTHRANGEPROC glad_glDepthRange; #define glDepthRange glad_glDepthRange GLAD_API_CALL PFNGLRASTERPOS3FPROC glad_glRasterPos3f; #define glRasterPos3f glad_glRasterPos3f GLAD_API_CALL PFNGLDELETESHADERPROC glad_glDeleteShader; #define glDeleteShader glad_glDeleteShader GLAD_API_CALL PFNGLCOLOR3BVPROC glad_glColor3bv; #define glColor3bv glad_glColor3bv GLAD_API_CALL PFNGLCOLOR3UBVPROC glad_glColor3ubv; #define glColor3ubv glad_glColor3ubv GLAD_API_CALL PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv; #define glGetVertexAttribiv glad_glGetVertexAttribiv GLAD_API_CALL PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv; #define glTexCoord4sv glad_glTexCoord4sv GLAD_API_CALL PFNGLMAP2DPROC glad_glMap2d; #define glMap2d glad_glMap2d GLAD_API_CALL PFNGLFOGCOORDFPROC glad_glFogCoordf; #define glFogCoordf glad_glFogCoordf GLAD_API_CALL PFNGLEDGEFLAGVPROC glad_glEdgeFlagv; #define glEdgeFlagv glad_glEdgeFlagv GLAD_API_CALL PFNGLCLIPCONTROLPROC glad_glClipControl; #define glClipControl glad_glClipControl GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv; #define glGetBufferParameteriv glad_glGetBufferParameteriv GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKIVPROC glad_glGetTransformFeedbackiv; #define glGetTransformFeedbackiv glad_glGetTransformFeedbackiv GLAD_API_CALL PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv; #define glGetProgramPipelineiv glad_glGetProgramPipelineiv GLAD_API_CALL PFNGLGETNMINMAXPROC glad_glGetnMinmax; #define glGetnMinmax glad_glGetnMinmax GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glNamedRenderbufferStorageMultisample; #define glNamedRenderbufferStorageMultisample glad_glNamedRenderbufferStorageMultisample GLAD_API_CALL PFNGLCOLORP4UIPROC glad_glColorP4ui; #define glColorP4ui glad_glColorP4ui GLAD_API_CALL PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv; #define glMultiTexCoord1sv glad_glMultiTexCoord1sv GLAD_API_CALL PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv; #define glVertexAttrib4fv glad_glVertexAttrib4fv GLAD_API_CALL PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv; #define glVertexAttrib4dv glad_glVertexAttrib4dv GLAD_API_CALL PFNGLVERTEXP4UIPROC glad_glVertexP4ui; #define glVertexP4ui glad_glVertexP4ui GLAD_API_CALL PFNGLRECTFVPROC glad_glRectfv; #define glRectfv glad_glRectfv GLAD_API_CALL PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback; #define glBeginTransformFeedback glad_glBeginTransformFeedback GLAD_API_CALL PFNGLARRAYELEMENTPROC glad_glArrayElement; #define glArrayElement glad_glArrayElement GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC glad_glNamedFramebufferTextureLayer; #define glNamedFramebufferTextureLayer glad_glNamedFramebufferTextureLayer GLAD_API_CALL PFNGLBEGINPROC glad_glBegin; #define glBegin glad_glBegin GLAD_API_CALL PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer; #define glTexCoordPointer glad_glTexCoordPointer GLAD_API_CALL PFNGLTEXCOORD3DPROC glad_glTexCoord3d; #define glTexCoord3d glad_glTexCoord3d GLAD_API_CALL PFNGLUNIFORM1FVPROC glad_glUniform1fv; #define glUniform1fv glad_glUniform1fv GLAD_API_CALL PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv; #define glVertexAttrib2sv glad_glVertexAttrib2sv GLAD_API_CALL PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog; #define glGetProgramPipelineInfoLog glad_glGetProgramPipelineInfoLog GLAD_API_CALL PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset; #define glPolygonOffset glad_glPolygonOffset GLAD_API_CALL PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat; #define glGetShaderPrecisionFormat glad_glGetShaderPrecisionFormat GLAD_API_CALL PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d; #define glProgramUniform3d glad_glProgramUniform3d GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv; #define glProgramUniformMatrix4x2dv glad_glProgramUniformMatrix4x2dv GLAD_API_CALL PFNGLBINDTRANSFORMFEEDBACKPROC glad_glBindTransformFeedback; #define glBindTransformFeedback glad_glBindTransformFeedback GLAD_API_CALL PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex; #define glProvokingVertex glad_glProvokingVertex GLAD_API_CALL PFNGLDISABLEVERTEXARRAYATTRIBPROC glad_glDisableVertexArrayAttrib; #define glDisableVertexArrayAttrib glad_glDisableVertexArrayAttrib GLAD_API_CALL PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv; #define glMultiTexCoord4fv glad_glMultiTexCoord4fv GLAD_API_CALL PFNGLUNIFORM1DPROC glad_glUniform1d; #define glUniform1d glad_glUniform1d GLAD_API_CALL PFNGLVERTEXATTRIBFORMATPROC glad_glVertexAttribFormat; #define glVertexAttribFormat glad_glVertexAttribFormat GLAD_API_CALL PFNGLMEMORYBARRIERBYREGIONPROC glad_glMemoryBarrierByRegion; #define glMemoryBarrierByRegion glad_glMemoryBarrierByRegion GLAD_API_CALL PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup; #define glPopDebugGroup glad_glPopDebugGroup GLAD_API_CALL PFNGLCOLOR4BPROC glad_glColor4b; #define glColor4b glad_glColor4b GLAD_API_CALL PFNGLTEXTUREBUFFERPROC glad_glTextureBuffer; #define glTextureBuffer glad_glTextureBuffer GLAD_API_CALL PFNGLGETSHADERIVPROC glad_glGetShaderiv; #define glGetShaderiv glad_glGetShaderiv GLAD_API_CALL PFNGLBEGINQUERYINDEXEDPROC glad_glBeginQueryIndexed; #define glBeginQueryIndexed glad_glBeginQueryIndexed GLAD_API_CALL PFNGLCOPYNAMEDBUFFERSUBDATAPROC glad_glCopyNamedBufferSubData; #define glCopyNamedBufferSubData glad_glCopyNamedBufferSubData GLAD_API_CALL PFNGLVERTEXARRAYATTRIBFORMATPROC glad_glVertexArrayAttribFormat; #define glVertexArrayAttribFormat glad_glVertexArrayAttribFormat GLAD_API_CALL PFNGLMAPNAMEDBUFFERRANGEPROC glad_glMapNamedBufferRange; #define glMapNamedBufferRange glad_glMapNamedBufferRange GLAD_API_CALL PFNGLCOLOR4UIVPROC glad_glColor4uiv; #define glColor4uiv glad_glColor4uiv GLAD_API_CALL PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui; #define glVertexAttribP1ui glad_glVertexAttribP1ui GLAD_API_CALL PFNGLWINDOWPOS3SVPROC glad_glWindowPos3sv; #define glWindowPos3sv glad_glWindowPos3sv GLAD_API_CALL PFNGLFOGIVPROC glad_glFogiv; #define glFogiv glad_glFogiv GLAD_API_CALL PFNGLTEXTUREPARAMETERIIVPROC glad_glTextureParameterIiv; #define glTextureParameterIiv glad_glTextureParameterIiv GLAD_API_CALL PFNGLLISTBASEPROC glad_glListBase; #define glListBase glad_glListBase GLAD_API_CALL PFNGLCREATEFRAMEBUFFERSPROC glad_glCreateFramebuffers; #define glCreateFramebuffers glad_glCreateFramebuffers GLAD_API_CALL PFNGLEVALCOORD2FPROC glad_glEvalCoord2f; #define glEvalCoord2f glad_glEvalCoord2f GLAD_API_CALL PFNGLVERTEX4DVPROC glad_glVertex4dv; #define glVertex4dv glad_glVertex4dv GLAD_API_CALL PFNGLDELETEPROGRAMPROC glad_glDeleteProgram; #define glDeleteProgram glad_glDeleteProgram GLAD_API_CALL PFNGLDRAWELEMENTSPROC glad_glDrawElements; #define glDrawElements glad_glDrawElements GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC glad_glDrawTransformFeedbackStream; #define glDrawTransformFeedbackStream glad_glDrawTransformFeedbackStream GLAD_API_CALL PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram; #define glValidateProgram glad_glValidateProgram GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced; #define glDrawElementsInstanced glad_glDrawElementsInstanced GLAD_API_CALL PFNGLGENLISTSPROC glad_glGenLists; #define glGenLists glad_glGenLists GLAD_API_CALL PFNGLCOLOR4IPROC glad_glColor4i; #define glColor4i glad_glColor4i GLAD_API_CALL PFNGLCOLOR3UIPROC glad_glColor3ui; #define glColor3ui glad_glColor3ui GLAD_API_CALL PFNGLCREATETEXTURESPROC glad_glCreateTextures; #define glCreateTextures glad_glCreateTextures GLAD_API_CALL PFNGLCOLORP4UIVPROC glad_glColorP4uiv; #define glColorP4uiv glad_glColorP4uiv GLAD_API_CALL PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog; #define glGetProgramInfoLog glad_glGetProgramInfoLog GLAD_API_CALL PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui; #define glVertexAttribP3ui glad_glVertexAttribP3ui GLAD_API_CALL PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi; #define glClearBufferfi glad_glClearBufferfi GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE3DPROC glad_glCopyTextureSubImage3D; #define glCopyTextureSubImage3D glad_glCopyTextureSubImage3D GLAD_API_CALL PFNGLEDGEFLAGPROC glad_glEdgeFlag; #define glEdgeFlag glad_glEdgeFlag GLAD_API_CALL PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v; #define glGetBufferParameteri64v glad_glGetBufferParameteri64v GLAD_API_CALL PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv; #define glRasterPos2iv glad_glRasterPos2iv GLAD_API_CALL PFNGLGETNMAPIVPROC glad_glGetnMapiv; #define glGetnMapiv glad_glGetnMapiv GLAD_API_CALL PFNGLRECTDVPROC glad_glRectdv; #define glRectdv glad_glRectdv GLAD_API_CALL PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v; #define glGetBooleani_v glad_glGetBooleani_v GLAD_API_CALL PFNGLENDLISTPROC glad_glEndList; #define glEndList glad_glEndList GLAD_API_CALL PFNGLFLUSHPROC glad_glFlush; #define glFlush glad_glFlush GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui; #define glProgramUniform4ui glad_glProgramUniform4ui GLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC glad_glMultiDrawElementsIndirectCount; #define glMultiDrawElementsIndirectCount glad_glMultiDrawElementsIndirectCount GLAD_API_CALL PFNGLGETINTEGER64VPROC glad_glGetInteger64v; #define glGetInteger64v glad_glGetInteger64v GLAD_API_CALL PFNGLLIGHTMODELFPROC glad_glLightModelf; #define glLightModelf glad_glLightModelf GLAD_API_CALL PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv; #define glVertexAttrib4Niv glad_glVertexAttrib4Niv GLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERIVPROC glad_glGetTextureLevelParameteriv; #define glGetTextureLevelParameteriv glad_glGetTextureLevelParameteriv GLAD_API_CALL PFNGLLOADMATRIXDPROC glad_glLoadMatrixd; #define glLoadMatrixd glad_glLoadMatrixd GLAD_API_CALL PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline; #define glBindProgramPipeline glad_glBindProgramPipeline GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv; #define glProgramUniform1uiv glad_glProgramUniform1uiv GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray; #define glDisableVertexAttribArray glad_glDisableVertexAttribArray GLAD_API_CALL PFNGLCLEARDEPTHPROC glad_glClearDepth; #define glClearDepth glad_glClearDepth GLAD_API_CALL PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv; #define glGetTexParameterIiv glad_glGetTexParameterIiv GLAD_API_CALL PFNGLWINDOWPOS3FVPROC glad_glWindowPos3fv; #define glWindowPos3fv glad_glWindowPos3fv GLAD_API_CALL PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d; #define glVertexAttrib3d glad_glVertexAttrib3d GLAD_API_CALL PFNGLGETPROGRAMRESOURCELOCATIONPROC glad_glGetProgramResourceLocation; #define glGetProgramResourceLocation glad_glGetProgramResourceLocation GLAD_API_CALL PFNGLTEXCOORD2DPROC glad_glTexCoord2d; #define glTexCoord2d glad_glTexCoord2d GLAD_API_CALL PFNGLACCUMPROC glad_glAccum; #define glAccum glad_glAccum GLAD_API_CALL PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui; #define glSecondaryColorP3ui glad_glSecondaryColorP3ui GLAD_API_CALL PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui; #define glVertexAttribI2ui glad_glVertexAttribI2ui GLAD_API_CALL PFNGLGETNUNIFORMFVPROC glad_glGetnUniformfv; #define glGetnUniformfv glad_glGetnUniformfv GLAD_API_CALL PFNGLFOGIPROC glad_glFogi; #define glFogi glad_glFogi GLAD_API_CALL PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv; #define glClearBufferfv glad_glClearBufferfv GLAD_API_CALL PFNGLTEXENVIVPROC glad_glTexEnviv; #define glTexEnviv glad_glTexEnviv GLAD_API_CALL PFNGLTEXIMAGE2DPROC glad_glTexImage2D; #define glTexImage2D glad_glTexImage2D GLAD_API_CALL PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC glad_glGetActiveAtomicCounterBufferiv; #define glGetActiveAtomicCounterBufferiv glad_glGetActiveAtomicCounterBufferiv GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv; #define glProgramUniformMatrix4x3fv glad_glProgramUniformMatrix4x3fv GLAD_API_CALL PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv; #define glMultiTexCoord1fv glad_glMultiTexCoord1fv GLAD_API_CALL PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel; #define glGetObjectPtrLabel glad_glGetObjectPtrLabel GLAD_API_CALL int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr); GLAD_API_CALL int gladLoadGL( GLADloadfunc load); #ifdef GLAD_GL GLAD_API_CALL int gladLoaderLoadGL(void); #endif #ifdef __cplusplus } #endif #endif ================================================ FILE: ycb_render/glad/glad/glx.h ================================================ /** * Loader generated by glad 0.1.11a0 on Wed Jun 13 07:59:53 2018 * * Generator: C/C++ * Specification: glx * Extensions: 63 * * APIs: * - glx=1.4 * * Options: * - MX = False * - DEBUG = False * - MX_GLOBAL = False * - HEADER_ONLY = False * - LOADER = True * - ALIAS = False * * Commandline: * --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 * * Online: * 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 * */ #ifndef GLAD_GLX_H_ #define GLAD_GLX_H_ #ifdef GLX_H #error GLX header already included (API: glx), remove previous include! #endif #define GLX_H 1 #include #include #include #include #define GLAD_GLX #define GLAD_OPTION_GLX_LOADER #ifdef __cplusplus extern "C" { #endif #ifndef GLAD_PLATFORM_H_ #define GLAD_PLATFORM_H_ #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) #define GLAD_PLATFORM_WIN32 1 #else #define GLAD_PLATFORM_WIN32 0 #endif #ifndef GLAD_PLATFORM_UWP #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) #ifdef __has_include #if __has_include() #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 #endif #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 #endif #endif #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY #include #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) #define GLAD_PLATFORM_UWP 1 #endif #endif #ifndef GLAD_PLATFORM_UWP #define GLAD_PLATFORM_UWP 0 #endif #endif #ifdef __GNUC__ #define GLAD_GNUC_EXTENSION __extension__ #else #define GLAD_GNUC_EXTENSION #endif #ifndef GLAD_API_CALL #if defined(GLAD_API_CALL_EXPORT) #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) #if defined(GLAD_API_CALL_EXPORT_BUILD) #if defined(__GNUC__) #define GLAD_API_CALL __attribute__ ((dllexport)) extern #else #define GLAD_API_CALL __declspec(dllexport) extern #endif #else #if defined(__GNUC__) #define GLAD_API_CALL __attribute__ ((dllimport)) extern #else #define GLAD_API_CALL __declspec(dllimport) extern #endif #endif #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern #else #define GLAD_API_CALL extern #endif #else #define GLAD_API_CALL extern #endif #endif #ifdef APIENTRY #define GLAD_API_PTR APIENTRY #elif GLAD_PLATFORM_WIN32 #define GLAD_API_PTR __stdcall #else #define GLAD_API_PTR #endif #define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor) #define GLAD_VERSION_MAJOR(version) (version / 10000) #define GLAD_VERSION_MINOR(version) (version % 10000) typedef void (*GLADapiproc)(void); typedef GLADapiproc (*GLADloadfunc)(const char *name); typedef GLADapiproc (*GLADuserptrloadfunc)(const char *name, void *userptr); typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); #endif /* GLAD_PLATFORM_H_ */ #define GLX_RGBA_FLOAT_BIT_ARB 0x00000004 #define __GLX_NUMBER_EVENTS 17 #define GLX_X_VISUAL_TYPE 0x22 #define GLX_PRESERVED_CONTENTS 0x801B #define GLX_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 #define GLX_3DFX_WINDOW_MODE_MESA 0x1 #define GLX_RENDERER_VERSION_MESA 0x8185 #define GLX_TRANSPARENT_GREEN_VALUE 0x26 #define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB #define GLX_RENDER_TYPE_SGIX 0x8011 #define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000 #define GLX_TRANSPARENT_ALPHA_VALUE 0x28 #define GLX_AUX2_EXT 0x20E4 #define GLX_FRONT_LEFT_EXT 0x20DE #define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 #define GLX_NO_EXTENSION 3 #define GLX_DIRECT_COLOR_EXT 0x8003 #define GLX_BAD_VISUAL 4 #define GLX_BAD_CONTEXT 5 #define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA #define GLX_STEREO_NOTIFY_EXT 0x00000000 #define GLX_ACCUM_BLUE_SIZE 16 #define GLX_COVERAGE_SAMPLES_NV 100001 #define GLX_BACK_BUFFER_AGE_EXT 0x20F4 #define GLX_SLOW_VISUAL_EXT 0x8001 #define GLX_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 #define GLX_EVENT_MASK 0x801F #define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 #define GLX_SAMPLE_BUFFERS_3DFX 0x8050 #define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 #define GLX_USE_GL 1 #define GLX_PIXMAP_BIT 0x00000002 #define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 #define GLX_TRANSPARENT_RGB 0x8008 #define GLX_PRESERVED_CONTENTS_SGIX 0x801B #define GLX_GPU_NUM_PIPES_AMD 0x21A5 #define GLX_RENDER_TYPE 0x8011 #define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 #define GLX_X_VISUAL_TYPE_EXT 0x22 #define GLX_FRONT_EXT GLX_FRONT_LEFT_EXT #define GLX_TRANSPARENT_TYPE_EXT 0x23 #define GLX_HYPERPIPE_ID_SGIX 0x8030 #define GLX_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 #define GLX_RENDERER_ACCELERATED_MESA 0x8186 #define GLX_DAMAGED_SGIX 0x8020 #define GLX_STEREO 6 #define GLX_FLOAT_COMPONENTS_NV 0x20B0 #define GLX_GPU_RENDERER_STRING_AMD 0x1F01 #define GLX_SWAP_UNDEFINED_OML 0x8063 #define GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098 #define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002 #define GLX_TRUE_COLOR 0x8002 #define GLX_SAVED 0x8021 #define GLX_RENDERER_DEVICE_ID_MESA 0x8184 #define GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA 0x818C #define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 #define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 #define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 #define GLX_WINDOW_SGIX 0x8022 #define GLX_TRANSPARENT_INDEX_VALUE 0x24 #define GLX_NONE_EXT 0x8000 #define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 #define GLX_SAMPLE_BUFFERS_ARB 100000 #define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 #define GLX_VIDEO_OUT_DEPTH_NV 0x20C5 #define GLX_RENDERER_VIDEO_MEMORY_MESA 0x8187 #define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 #define GLX_TEXTURE_1D_EXT 0x20DB #define GLX_SYNC_SWAP_SGIX 0x00000001 #define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 #define GLX_VIDEO_OUT_COLOR_NV 0x20C3 #define GLX_DEPTH_BUFFER_BIT 0x00000020 #define GLX_AUX_BUFFERS_BIT 0x00000010 #define GLX_BLENDED_RGBA_SGIS 0x8025 #define GLX_DRAWABLE_TYPE_SGIX 0x8010 #define GLX_DEPTH_SIZE 12 #define GLX_SAMPLES_ARB 100001 #define GLX_VISUAL_ID_EXT 0x800B #define GLX_STEREO_TREE_EXT 0x20F5 #define GLX_NON_CONFORMANT_CONFIG 0x800D #define GLX_GPU_VENDOR_AMD 0x1F00 #define GLX_WINDOW_BIT 0x00000001 #define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 #define GLX_SAMPLES_3DFX 0x8051 #define GLX_BUFFER_SIZE 2 #define GLX_TEXTURE_2D_BIT_EXT 0x00000002 #define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9 #define GLX_CONTEXT_ES2_PROFILE_BIT_EXT GLX_CONTEXT_ES_PROFILE_BIT_EXT #define GLX_DEVICE_ID_NV 0x20CD #define GLX_WINDOW 0x8022 #define GLX_TEXTURE_2D_EXT 0x20DC #define GLX_PSEUDO_COLOR 0x8004 #define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 #define GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA 0x818A #define GLX_TEXTURE_TARGET_EXT 0x20D6 #define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 #define GLX_AUX4_EXT 0x20E6 #define GLX_STATIC_COLOR_EXT 0x8005 #define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 #define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 #define GLX_GPU_CLOCK_AMD 0x21A4 #define GLX_GPU_NUM_RB_AMD 0x21A7 #define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 #define GLX_VENDOR_NAMES_EXT 0x20F6 #define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 #define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 #define GLX_ACCUM_GREEN_SIZE 15 #define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2 #define GLX_PBUFFER 0x8023 #define GLX_RGBA_TYPE_SGIX 0x8014 #define GLX_PBUFFER_BIT 0x00000004 #define GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA 0x818D #define GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0 #define GLX_TRANSPARENT_INDEX_EXT 0x8009 #define GLX_COPY_COMPLETE_INTEL 0x8181 #define GLX_NONE 0x8000 #define GLX_PbufferClobber 0 #define GLX_RGBA 4 #define GLX_HEIGHT_SGIX 0x801E #define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91 #define GLX_SWAP_COPY_OML 0x8062 #define GLX_BACK_RIGHT_EXT 0x20E1 #define GLX_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097 #define GLX_SLOW_CONFIG 0x8001 #define GLX_RENDERER_PREFERRED_PROFILE_MESA 0x8189 #define GLX_Y_INVERTED_EXT 0x20D4 #define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 #define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 #define GLX_AUX8_EXT 0x20EA #define GLX_EXCHANGE_COMPLETE_INTEL 0x8180 #define GLX_CONTEXT_FLAGS_ARB 0x2094 #define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9 #define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 #define GLX_PBUFFER_CLOBBER_MASK 0x08000000 #define GLX_FLIP_COMPLETE_INTEL 0x8182 #define GLX_BAD_ENUM 7 #define GLX_AUX3_EXT 0x20E5 #define GLX_DONT_CARE 0xFFFFFFFF #define GLX_SAMPLE_BUFFERS_SGIS 100000 #define GLX_SWAP_INTERVAL_EXT 0x20F1 #define GLX_RENDERER_ID_MESA 0x818E #define GLX_STENCIL_SIZE 13 #define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 #define GLX_X_RENDERABLE 0x8012 #define GLX_VENDOR 0x1 #define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 #define GLX_UNIQUE_ID_NV 0x20CE #define GLX_WINDOW_BIT_SGIX 0x00000001 #define GLX_LEVEL 3 #define GLX_COLOR_SAMPLES_NV 0x20B3 #define GLX_DIRECT_COLOR 0x8003 #define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 #define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 #define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252 #define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 #define GLX_PIXMAP_BIT_SGIX 0x00000002 #define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 #define GLX_AUX6_EXT 0x20E8 #define GLX_BufferSwapComplete 1 #define GLX_COLOR_INDEX_BIT 0x00000002 #define GLX_STENCIL_BUFFER_BIT 0x00000040 #define GLX_MAX_PBUFFER_HEIGHT 0x8017 #define GLX_ACCUM_BUFFER_BIT 0x00000080 #define GLX_SWAP_METHOD_OML 0x8060 #define GLX_EXTENSIONS 0x3 #define GLX_NUM_VIDEO_SLOTS_NV 0x20F0 #define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001 #define GLX_SYNC_FRAME_SGIX 0x00000000 #define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC #define GLX_PBUFFER_WIDTH 0x8041 #define GLX_BLUE_SIZE 10 #define GLX_GRAY_SCALE 0x8006 #define GLX_STEREO_NOTIFY_MASK_EXT 0x00000001 #define GLX_AUX9_EXT 0x20EB #define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 #define GLX_EXTENSION_NAME "GLX" #define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D #define GLX_VIDEO_OUT_FRAME_NV 0x20C8 #define GLX_PBUFFER_BIT_SGIX 0x00000004 #define GLX_AUX5_EXT 0x20E7 #define GLX_HEIGHT 0x801E #define GLX_PBUFFER_HEIGHT 0x8040 #define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2 #define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 #define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 #define GLX_NO_RESET_NOTIFICATION_ARB 0x8261 #define GLX_DOUBLEBUFFER 5 #define GLX_SHARE_CONTEXT_EXT 0x800A #define GLX_X_RENDERABLE_SGIX 0x8012 #define GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA 0x8188 #define GLX_DRAWABLE_TYPE 0x8010 #define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 #define GLX_SAMPLES 100001 #define GLX_TEXTURE_RECTANGLE_EXT 0x20DD #define GLX_TRANSPARENT_RGB_EXT 0x8008 #define GLX_SCREEN_EXT 0x800C #define GLX_STATIC_COLOR 0x8005 #define GLX_RED_SIZE 8 #define GLX_TRANSPARENT_RED_VALUE 0x25 #define GLX_GREEN_SIZE 9 #define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 #define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 #define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 #define GLX_GPU_NUM_SPI_AMD 0x21A8 #define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 #define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 #define GLX_TEXTURE_FORMAT_EXT 0x20D5 #define GLX_RGBA_TYPE 0x8014 #define GLX_RENDERER_VENDOR_ID_MESA 0x8183 #define GLX_BAD_HYPERPIPE_SGIX 92 #define GLX_TRANSPARENT_INDEX 0x8009 #define GLX_BAD_ATTRIBUTE 2 #define GLX_FRONT_RIGHT_EXT 0x20DF #define GLX_STATIC_GRAY 0x8007 #define GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x20F7 #define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 #define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 #define GLX_FBCONFIG_ID_SGIX 0x8013 #define GLX_GRAY_SCALE_EXT 0x8006 #define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 #define GLX_GPU_RAM_AMD 0x21A3 #define GLX_TEXTURE_1D_BIT_EXT 0x00000001 #define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 #define GLX_RGBA_BIT_SGIX 0x00000001 #define GLX_PIPE_RECT_SGIX 0x00000001 #define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 #define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 #define GLX_PBUFFER_SGIX 0x8023 #define GLX_AUX_BUFFERS 7 #define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA #define GLX_BAD_VALUE 6 #define GLX_LARGEST_PBUFFER 0x801C #define GLX_AUX0_EXT 0x20E2 #define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 #define GLX_PSEUDO_COLOR_EXT 0x8004 #define GLX_COLOR_INDEX_TYPE 0x8015 #define GLX_SAVED_SGIX 0x8021 #define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 #define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 #define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 #define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004 #define GLX_MIPMAP_TEXTURE_EXT 0x20D7 #define GLX_ACCUM_ALPHA_SIZE 17 #define GLX_TRANSPARENT_BLUE_VALUE 0x27 #define GLX_WIDTH 0x801D #define GLX_AUX7_EXT 0x20E9 #define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A #define GLX_STATIC_GRAY_EXT 0x8007 #define GLX_MAX_PBUFFER_WIDTH 0x8016 #define GLX_CONFIG_CAVEAT 0x20 #define GLX_EVENT_MASK_SGIX 0x801F #define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 #define GLX_TRANSPARENT_TYPE 0x23 #define GLX_ALPHA_SIZE 11 #define GLX_SAMPLE_BUFFERS 100000 #define GLX_VISUAL_ID 0x800B #define GLX_LARGEST_PBUFFER_SGIX 0x801C #define GLX_SWAP_EXCHANGE_OML 0x8061 #define GLX_WIDTH_SGIX 0x801D #define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 #define GLX_SCREEN 0x800C #define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095 #define GLX_ACCUM_RED_SIZE 14 #define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 #define GLX_BAD_SCREEN 1 #define GLX_VISUAL_CAVEAT_EXT 0x20 #define GLX_BACK_LEFT_EXT 0x20E0 #define GLX_MAX_PBUFFER_PIXELS 0x8018 #define GLX_AUX1_EXT 0x20E3 #define GLX_CONTEXT_OPENGL_NO_ERROR_ARB 0x31B3 #define GLX_SAMPLES_SGIS 100001 #define GLX_TRUE_COLOR_EXT 0x8002 #define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 #define GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA 0x818B #define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 #define GLX_BACK_EXT GLX_BACK_LEFT_EXT #define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 #define GLX_DAMAGED 0x8020 #define GLX_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF #define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 #define GLX_LATE_SWAPS_TEAR_EXT 0x20F3 #define GLX_FBCONFIG_ID 0x8013 #define GLX_GPU_NUM_SIMD_AMD 0x21A6 #define GLX_RGBA_BIT 0x00000001 #define GLX_VERSION 0x2 #ifndef GLEXT_64_TYPES_DEFINED /* This code block is duplicated in glext.h, so must be protected */ #define GLEXT_64_TYPES_DEFINED /* Define int32_t, int64_t, and uint64_t types for UST/MSC */ /* (as used in the GLX_OML_sync_control extension). */ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #include #elif defined(__sun__) || defined(__digital__) #include #if defined(__STDC__) #if defined(__arch64__) || defined(_LP64) typedef long int int64_t; typedef unsigned long int uint64_t; #else typedef long long int int64_t; typedef unsigned long long int uint64_t; #endif /* __arch64__ */ #endif /* __STDC__ */ #elif defined( __VMS ) || defined(__sgi) #include #elif defined(__SCO__) || defined(__USLC__) #include #elif defined(__UNIXOS2__) || defined(__SOL64__) typedef long int int32_t; typedef long long int int64_t; typedef unsigned long long int uint64_t; #elif defined(_WIN32) && defined(__GNUC__) #include #elif defined(_WIN32) typedef __int32 int32_t; typedef __int64 int64_t; typedef unsigned __int64 uint64_t; #else /* Fallback if nothing above works */ #include #endif #endif #if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) #else #endif #if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) #else #endif typedef XID GLXFBConfigID; typedef struct __GLXFBConfigRec *GLXFBConfig; typedef XID GLXContextID; typedef struct __GLXcontextRec *GLXContext; typedef XID GLXPixmap; typedef XID GLXDrawable; typedef XID GLXWindow; typedef XID GLXPbuffer; typedef void (GLAD_API_PTR *__GLXextFuncPtr)(void); typedef XID GLXVideoCaptureDeviceNV; typedef unsigned int GLXVideoDeviceNV; typedef XID GLXVideoSourceSGIX; typedef XID GLXFBConfigIDSGIX; typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; typedef XID GLXPbufferSGIX; typedef struct { int event_type; /* GLX_DAMAGED or GLX_SAVED */ int draw_type; /* GLX_WINDOW or GLX_PBUFFER */ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came for SendEvent request */ Display *display; /* display the event was read from */ GLXDrawable drawable; /* XID of Drawable */ unsigned int buffer_mask; /* mask indicating which buffers are affected */ unsigned int aux_buffer; /* which aux buffer was affected */ int x, y; int width, height; int count; /* if nonzero, at least this many more */ } GLXPbufferClobberEvent; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ GLXDrawable drawable; /* drawable on which event was requested in event mask */ int event_type; int64_t ust; int64_t msc; int64_t sbc; } GLXBufferSwapComplete; typedef union __GLXEvent { GLXPbufferClobberEvent glxpbufferclobber; GLXBufferSwapComplete glxbufferswapcomplete; long pad[24]; } GLXEvent; typedef struct { int type; unsigned long serial; Bool send_event; Display *display; int extension; int evtype; GLXDrawable window; Bool stereo_tree; } GLXStereoNotifyEventEXT; typedef struct { int type; unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came for SendEvent request */ Display *display; /* display the event was read from */ GLXDrawable drawable; /* i.d. of Drawable */ int event_type; /* GLX_DAMAGED_SGIX or GLX_SAVED_SGIX */ int draw_type; /* GLX_WINDOW_SGIX or GLX_PBUFFER_SGIX */ unsigned int mask; /* mask indicating which buffers are affected*/ int x, y; int width, height; int count; /* if nonzero, at least this many more */ } GLXBufferClobberEventSGIX; typedef struct { char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ int networkId; } GLXHyperpipeNetworkSGIX; typedef struct { char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ int channel; unsigned int participationType; int timeSlice; } GLXHyperpipeConfigSGIX; typedef struct { char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ int srcXOrigin, srcYOrigin, srcWidth, srcHeight; int destXOrigin, destYOrigin, destWidth, destHeight; } GLXPipeRect; typedef struct { char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ int XOrigin, YOrigin, maxHeight, maxWidth; } GLXPipeRectLimits; #define GLX_VERSION_1_0 1 GLAD_API_CALL int GLAD_GLX_VERSION_1_0; #define GLX_VERSION_1_1 1 GLAD_API_CALL int GLAD_GLX_VERSION_1_1; #define GLX_VERSION_1_2 1 GLAD_API_CALL int GLAD_GLX_VERSION_1_2; #define GLX_VERSION_1_3 1 GLAD_API_CALL int GLAD_GLX_VERSION_1_3; #define GLX_VERSION_1_4 1 GLAD_API_CALL int GLAD_GLX_VERSION_1_4; #define GLX_MESA_copy_sub_buffer 1 GLAD_API_CALL int GLAD_GLX_MESA_copy_sub_buffer; #define GLX_EXT_create_context_es_profile 1 GLAD_API_CALL int GLAD_GLX_EXT_create_context_es_profile; #define GLX_SGIX_pbuffer 1 GLAD_API_CALL int GLAD_GLX_SGIX_pbuffer; #define GLX_SGI_make_current_read 1 GLAD_API_CALL int GLAD_GLX_SGI_make_current_read; #define GLX_OML_sync_control 1 GLAD_API_CALL int GLAD_GLX_OML_sync_control; #define GLX_SGIX_hyperpipe 1 GLAD_API_CALL int GLAD_GLX_SGIX_hyperpipe; #define GLX_INTEL_swap_event 1 GLAD_API_CALL int GLAD_GLX_INTEL_swap_event; #define GLX_EXT_swap_control 1 GLAD_API_CALL int GLAD_GLX_EXT_swap_control; #define GLX_NV_robustness_video_memory_purge 1 GLAD_API_CALL int GLAD_GLX_NV_robustness_video_memory_purge; #define GLX_MESA_pixmap_colormap 1 GLAD_API_CALL int GLAD_GLX_MESA_pixmap_colormap; #define GLX_ARB_fbconfig_float 1 GLAD_API_CALL int GLAD_GLX_ARB_fbconfig_float; #define GLX_EXT_fbconfig_packed_float 1 GLAD_API_CALL int GLAD_GLX_EXT_fbconfig_packed_float; #define GLX_OML_swap_method 1 GLAD_API_CALL int GLAD_GLX_OML_swap_method; #define GLX_NV_video_capture 1 GLAD_API_CALL int GLAD_GLX_NV_video_capture; #define GLX_ARB_robustness_application_isolation 1 GLAD_API_CALL int GLAD_GLX_ARB_robustness_application_isolation; #define GLX_ARB_create_context_robustness 1 GLAD_API_CALL int GLAD_GLX_ARB_create_context_robustness; #define GLX_EXT_visual_rating 1 GLAD_API_CALL int GLAD_GLX_EXT_visual_rating; #define GLX_NV_swap_group 1 GLAD_API_CALL int GLAD_GLX_NV_swap_group; #define GLX_EXT_texture_from_pixmap 1 GLAD_API_CALL int GLAD_GLX_EXT_texture_from_pixmap; #define GLX_SUN_get_transparent_index 1 GLAD_API_CALL int GLAD_GLX_SUN_get_transparent_index; #define GLX_MESA_release_buffers 1 GLAD_API_CALL int GLAD_GLX_MESA_release_buffers; #define GLX_NV_delay_before_swap 1 GLAD_API_CALL int GLAD_GLX_NV_delay_before_swap; #define GLX_EXT_buffer_age 1 GLAD_API_CALL int GLAD_GLX_EXT_buffer_age; #define GLX_MESA_agp_offset 1 GLAD_API_CALL int GLAD_GLX_MESA_agp_offset; #define GLX_EXT_visual_info 1 GLAD_API_CALL int GLAD_GLX_EXT_visual_info; #define GLX_SGI_swap_control 1 GLAD_API_CALL int GLAD_GLX_SGI_swap_control; #define GLX_EXT_import_context 1 GLAD_API_CALL int GLAD_GLX_EXT_import_context; #define GLX_SGI_video_sync 1 GLAD_API_CALL int GLAD_GLX_SGI_video_sync; #define GLX_3DFX_multisample 1 GLAD_API_CALL int GLAD_GLX_3DFX_multisample; #define GLX_ARB_multisample 1 GLAD_API_CALL int GLAD_GLX_ARB_multisample; #define GLX_EXT_framebuffer_sRGB 1 GLAD_API_CALL int GLAD_GLX_EXT_framebuffer_sRGB; #define GLX_SGI_cushion 1 GLAD_API_CALL int GLAD_GLX_SGI_cushion; #define GLX_ARB_robustness_share_group_isolation 1 GLAD_API_CALL int GLAD_GLX_ARB_robustness_share_group_isolation; #define GLX_SGIX_fbconfig 1 GLAD_API_CALL int GLAD_GLX_SGIX_fbconfig; #define GLX_NV_copy_buffer 1 GLAD_API_CALL int GLAD_GLX_NV_copy_buffer; #define GLX_SGIX_visual_select_group 1 GLAD_API_CALL int GLAD_GLX_SGIX_visual_select_group; #define GLX_EXT_swap_control_tear 1 GLAD_API_CALL int GLAD_GLX_EXT_swap_control_tear; #define GLX_ARB_create_context 1 GLAD_API_CALL int GLAD_GLX_ARB_create_context; #define GLX_AMD_gpu_association 1 GLAD_API_CALL int GLAD_GLX_AMD_gpu_association; #define GLX_MESA_query_renderer 1 GLAD_API_CALL int GLAD_GLX_MESA_query_renderer; #define GLX_EXT_create_context_es2_profile 1 GLAD_API_CALL int GLAD_GLX_EXT_create_context_es2_profile; #define GLX_MESA_swap_control 1 GLAD_API_CALL int GLAD_GLX_MESA_swap_control; #define GLX_SGIX_video_resize 1 GLAD_API_CALL int GLAD_GLX_SGIX_video_resize; #define GLX_ARB_context_flush_control 1 GLAD_API_CALL int GLAD_GLX_ARB_context_flush_control; #define GLX_NV_video_out 1 GLAD_API_CALL int GLAD_GLX_NV_video_out; #define GLX_EXT_no_config_context 1 GLAD_API_CALL int GLAD_GLX_EXT_no_config_context; #define GLX_SGIS_blended_overlay 1 GLAD_API_CALL int GLAD_GLX_SGIS_blended_overlay; #define GLX_EXT_stereo_tree 1 GLAD_API_CALL int GLAD_GLX_EXT_stereo_tree; #define GLX_ARB_create_context_no_error 1 GLAD_API_CALL int GLAD_GLX_ARB_create_context_no_error; #define GLX_EXT_libglvnd 1 GLAD_API_CALL int GLAD_GLX_EXT_libglvnd; #define GLX_ARB_create_context_profile 1 GLAD_API_CALL int GLAD_GLX_ARB_create_context_profile; #define GLX_NV_float_buffer 1 GLAD_API_CALL int GLAD_GLX_NV_float_buffer; #define GLX_MESA_set_3dfx_mode 1 GLAD_API_CALL int GLAD_GLX_MESA_set_3dfx_mode; #define GLX_ARB_framebuffer_sRGB 1 GLAD_API_CALL int GLAD_GLX_ARB_framebuffer_sRGB; #define GLX_ARB_get_proc_address 1 GLAD_API_CALL int GLAD_GLX_ARB_get_proc_address; #define GLX_SGIS_shared_multisample 1 GLAD_API_CALL int GLAD_GLX_SGIS_shared_multisample; #define GLX_NV_copy_image 1 GLAD_API_CALL int GLAD_GLX_NV_copy_image; #define GLX_NV_present_video 1 GLAD_API_CALL int GLAD_GLX_NV_present_video; #define GLX_SGIX_swap_barrier 1 GLAD_API_CALL int GLAD_GLX_SGIX_swap_barrier; #define GLX_SGIS_multisample 1 GLAD_API_CALL int GLAD_GLX_SGIS_multisample; #define GLX_SGIX_swap_group 1 GLAD_API_CALL int GLAD_GLX_SGIX_swap_group; #define GLX_ARB_vertex_buffer_object 1 GLAD_API_CALL int GLAD_GLX_ARB_vertex_buffer_object; #define GLX_NV_multisample_coverage 1 GLAD_API_CALL int GLAD_GLX_NV_multisample_coverage; typedef void (GLAD_API_PTR *PFNGLXCUSHIONSGIPROC)(Display * dpy, Window window, float cushion); typedef void (GLAD_API_PTR *PFNGLXDESTROYGLXPBUFFERSGIXPROC)(Display * dpy, GLXPbufferSGIX pbuf); typedef int (GLAD_API_PTR *PFNGLXSENDPBUFFERTOVIDEONVPROC)(Display * dpy, GLXPbuffer pbuf, int iBufferType, unsigned long * pulCounterPbuffer, GLboolean bBlock); typedef __GLXextFuncPtr (GLAD_API_PTR *PFNGLXGETPROCADDRESSARBPROC)(const GLubyte * procName); typedef GLXContext (GLAD_API_PTR *PFNGLXCREATECONTEXTATTRIBSARBPROC)(Display * dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int * attrib_list); typedef void (GLAD_API_PTR *PFNGLXJOINSWAPGROUPSGIXPROC)(Display * dpy, GLXDrawable drawable, GLXDrawable member); typedef void (GLAD_API_PTR *PFNGLXSWAPINTERVALEXTPROC)(Display * dpy, GLXDrawable drawable, int interval); typedef GLXHyperpipeConfigSGIX * (GLAD_API_PTR *PFNGLXQUERYHYPERPIPECONFIGSGIXPROC)(Display * dpy, int hpId, int * npipes); typedef int (GLAD_API_PTR *PFNGLXGETGPUINFOAMDPROC)(unsigned int id, int property, GLenum dataType, unsigned int size, void * data); typedef Status (GLAD_API_PTR *PFNGLXGETTRANSPARENTINDEXSUNPROC)(Display * dpy, Window overlay, Window underlay, long * pTransparentIndex); typedef GLXHyperpipeNetworkSGIX * (GLAD_API_PTR *PFNGLXQUERYHYPERPIPENETWORKSGIXPROC)(Display * dpy, int * npipes); typedef int (GLAD_API_PTR *PFNGLXQUERYGLXPBUFFERSGIXPROC)(Display * dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int * value); typedef GLXPixmap (GLAD_API_PTR *PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)(Display * dpy, GLXFBConfigSGIX config, Pixmap pixmap); typedef void (GLAD_API_PTR *PFNGLXCOPYCONTEXTPROC)(Display * dpy, GLXContext src, GLXContext dst, unsigned long mask); typedef GLXPbufferSGIX (GLAD_API_PTR *PFNGLXCREATEGLXPBUFFERSGIXPROC)(Display * dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int * attrib_list); typedef unsigned int (GLAD_API_PTR *PFNGLXGETGPUIDSAMDPROC)(unsigned int maxCount, unsigned int * ids); typedef Bool (GLAD_API_PTR *PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC)(GLXContext ctx); typedef int (GLAD_API_PTR *PFNGLXGETVIDEODEVICENVPROC)(Display * dpy, int screen, int numVideoDevices, GLXVideoDeviceNV * pVideoDevice); typedef void (GLAD_API_PTR *PFNGLXWAITGLPROC)(void); typedef int (GLAD_API_PTR *PFNGLXGETVIDEOSYNCSGIPROC)(unsigned int * count); typedef int (GLAD_API_PTR *PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC)(Display * dpy, int hpId); typedef int (GLAD_API_PTR *PFNGLXHYPERPIPECONFIGSGIXPROC)(Display * dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX * cfg, int * hpId); typedef int64_t (GLAD_API_PTR *PFNGLXSWAPBUFFERSMSCOMLPROC)(Display * dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); typedef GLXFBConfigSGIX * (GLAD_API_PTR *PFNGLXCHOOSEFBCONFIGSGIXPROC)(Display * dpy, int screen, int * attrib_list, int * nelements); typedef int (GLAD_API_PTR *PFNGLXWAITVIDEOSYNCSGIPROC)(int divisor, int remainder, unsigned int * count); typedef Bool (GLAD_API_PTR *PFNGLXWAITFORSBCOMLPROC)(Display * dpy, GLXDrawable drawable, int64_t target_sbc, int64_t * ust, int64_t * msc, int64_t * sbc); typedef __GLXextFuncPtr (GLAD_API_PTR *PFNGLXGETPROCADDRESSPROC)(const GLubyte * procName); typedef int (GLAD_API_PTR *PFNGLXGETSWAPINTERVALMESAPROC)(void); typedef int (GLAD_API_PTR *PFNGLXCHANNELRECTSGIXPROC)(Display * display, int screen, int channel, int x, int y, int w, int h); typedef void (GLAD_API_PTR *PFNGLXWAITXPROC)(void); typedef const char * (GLAD_API_PTR *PFNGLXQUERYSERVERSTRINGPROC)(Display * dpy, int screen, int name); typedef GLXPixmap (GLAD_API_PTR *PFNGLXCREATEGLXPIXMAPPROC)(Display * dpy, XVisualInfo * visual, Pixmap pixmap); typedef Bool (GLAD_API_PTR *PFNGLXBINDSWAPBARRIERNVPROC)(Display * dpy, GLuint group, GLuint barrier); typedef const char * (GLAD_API_PTR *PFNGLXQUERYRENDERERSTRINGMESAPROC)(Display * dpy, int screen, int renderer, int attribute); typedef void (GLAD_API_PTR *PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC)(Display * dpy, GLXVideoCaptureDeviceNV device); typedef 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); typedef void (GLAD_API_PTR *PFNGLXCOPYSUBBUFFERMESAPROC)(Display * dpy, GLXDrawable drawable, int x, int y, int width, int height); typedef GLXContext (GLAD_API_PTR *PFNGLXGETCURRENTCONTEXTPROC)(void); typedef void (GLAD_API_PTR *PFNGLXSELECTEVENTPROC)(Display * dpy, GLXDrawable draw, unsigned long event_mask); typedef int (GLAD_API_PTR *PFNGLXSWAPINTERVALSGIPROC)(int interval); typedef Bool (GLAD_API_PTR *PFNGLXQUERYSWAPGROUPNVPROC)(Display * dpy, GLXDrawable drawable, GLuint * group, GLuint * barrier); typedef Bool (GLAD_API_PTR *PFNGLXMAKECURRENTREADSGIPROC)(Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); typedef void (GLAD_API_PTR *PFNGLXQUERYDRAWABLEPROC)(Display * dpy, GLXDrawable draw, int attribute, unsigned int * value); typedef void (GLAD_API_PTR *PFNGLXCOPYBUFFERSUBDATANVPROC)(Display * dpy, GLXContext readCtx, GLXContext writeCtx, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef int (GLAD_API_PTR *PFNGLXQUERYCONTEXTPROC)(Display * dpy, GLXContext ctx, int attribute, int * value); typedef int (GLAD_API_PTR *PFNGLXGETCONFIGPROC)(Display * dpy, XVisualInfo * visual, int attrib, int * value); typedef Bool (GLAD_API_PTR *PFNGLXSET3DFXMODEMESAPROC)(int mode); typedef int (GLAD_API_PTR *PFNGLXGETVIDEOINFONVPROC)(Display * dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long * pulCounterOutputPbuffer, unsigned long * pulCounterOutputVideo); typedef Bool (GLAD_API_PTR *PFNGLXISDIRECTPROC)(Display * dpy, GLXContext ctx); typedef int (GLAD_API_PTR *PFNGLXGETFBCONFIGATTRIBPROC)(Display * dpy, GLXFBConfig config, int attribute, int * value); typedef XVisualInfo * (GLAD_API_PTR *PFNGLXGETVISUALFROMFBCONFIGPROC)(Display * dpy, GLXFBConfig config); typedef void (GLAD_API_PTR *PFNGLXBINDTEXIMAGEEXTPROC)(Display * dpy, GLXDrawable drawable, int buffer, const int * attrib_list); typedef 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); typedef Bool (GLAD_API_PTR *PFNGLXQUERYVERSIONPROC)(Display * dpy, int * maj, int * min); typedef void (GLAD_API_PTR *PFNGLXSELECTEVENTSGIXPROC)(Display * dpy, GLXDrawable drawable, unsigned long mask); typedef Bool (GLAD_API_PTR *PFNGLXGETMSCRATEOMLPROC)(Display * dpy, GLXDrawable drawable, int32_t * numerator, int32_t * denominator); typedef Bool (GLAD_API_PTR *PFNGLXQUERYRENDERERINTEGERMESAPROC)(Display * dpy, int screen, int renderer, int attribute, unsigned int * value); typedef GLXWindow (GLAD_API_PTR *PFNGLXCREATEWINDOWPROC)(Display * dpy, GLXFBConfig config, Window win, const int * attrib_list); typedef 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); typedef int (GLAD_API_PTR *PFNGLXSWAPINTERVALMESAPROC)(unsigned int interval); typedef int (GLAD_API_PTR *PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC)(Display * dpy, int timeSlice, int attrib, int size, void * returnAttribList); typedef int (GLAD_API_PTR *PFNGLXBINDVIDEOCAPTUREDEVICENVPROC)(Display * dpy, unsigned int video_capture_slot, GLXVideoCaptureDeviceNV device); typedef GLXContext (GLAD_API_PTR *PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)(Display * dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct); typedef unsigned int * (GLAD_API_PTR *PFNGLXENUMERATEVIDEODEVICESNVPROC)(Display * dpy, int screen, int * nelements); typedef int (GLAD_API_PTR *PFNGLXHYPERPIPEATTRIBSGIXPROC)(Display * dpy, int timeSlice, int attrib, int size, void * attribList); typedef void (GLAD_API_PTR *PFNGLXDESTROYPBUFFERPROC)(Display * dpy, GLXPbuffer pbuf); typedef void (GLAD_API_PTR *PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC)(Display * dpy, GLXContext readCtx, GLXContext writeCtx, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef GLXPbuffer (GLAD_API_PTR *PFNGLXCREATEPBUFFERPROC)(Display * dpy, GLXFBConfig config, const int * attrib_list); typedef const char * (GLAD_API_PTR *PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC)(int attribute); typedef int (GLAD_API_PTR *PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC)(Display * dpy, int timeSlice, int attrib, int size, void * attribList, void * returnAttribList); typedef int (GLAD_API_PTR *PFNGLXGETFBCONFIGATTRIBSGIXPROC)(Display * dpy, GLXFBConfigSGIX config, int attribute, int * value); typedef const char * (GLAD_API_PTR *PFNGLXQUERYEXTENSIONSSTRINGPROC)(Display * dpy, int screen); typedef int (GLAD_API_PTR *PFNGLXBINDVIDEODEVICENVPROC)(Display * dpy, unsigned int video_slot, unsigned int video_device, const int * attrib_list); typedef GLXContext (GLAD_API_PTR *PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC)(unsigned int id, GLXContext share_list); typedef int (GLAD_API_PTR *PFNGLXQUERYCONTEXTINFOEXTPROC)(Display * dpy, GLXContext context, int attribute, int * value); typedef void (GLAD_API_PTR *PFNGLXGETSELECTEDEVENTPROC)(Display * dpy, GLXDrawable draw, unsigned long * event_mask); typedef Display * (GLAD_API_PTR *PFNGLXGETCURRENTDISPLAYPROC)(void); typedef void (GLAD_API_PTR *PFNGLXDESTROYPIXMAPPROC)(Display * dpy, GLXPixmap pixmap); typedef void (GLAD_API_PTR *PFNGLXGETSELECTEDEVENTSGIXPROC)(Display * dpy, GLXDrawable drawable, unsigned long * mask); typedef void (GLAD_API_PTR *PFNGLXRELEASETEXIMAGEEXTPROC)(Display * dpy, GLXDrawable drawable, int buffer); typedef void (GLAD_API_PTR *PFNGLXUSEXFONTPROC)(Font font, int first, int count, int list); typedef Bool (GLAD_API_PTR *PFNGLXGETSYNCVALUESOMLPROC)(Display * dpy, GLXDrawable drawable, int64_t * ust, int64_t * msc, int64_t * sbc); typedef Bool (GLAD_API_PTR *PFNGLXJOINSWAPGROUPNVPROC)(Display * dpy, GLXDrawable drawable, GLuint group); typedef void (GLAD_API_PTR *PFNGLXSWAPBUFFERSPROC)(Display * dpy, GLXDrawable drawable); typedef Bool (GLAD_API_PTR *PFNGLXDELAYBEFORESWAPNVPROC)(Display * dpy, GLXDrawable drawable, GLfloat seconds); typedef int (GLAD_API_PTR *PFNGLXBINDHYPERPIPESGIXPROC)(Display * dpy, int hpId); typedef void (GLAD_API_PTR *PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC)(Display * dpy, GLXVideoCaptureDeviceNV device); typedef Display * (GLAD_API_PTR *PFNGLXGETCURRENTDISPLAYEXTPROC)(void); typedef GLXFBConfig * (GLAD_API_PTR *PFNGLXGETFBCONFIGSPROC)(Display * dpy, int screen, int * nelements); typedef GLXDrawable (GLAD_API_PTR *PFNGLXGETCURRENTREADDRAWABLEPROC)(void); typedef int (GLAD_API_PTR *PFNGLXRELEASEVIDEOIMAGENVPROC)(Display * dpy, GLXPbuffer pbuf); typedef Bool (GLAD_API_PTR *PFNGLXQUERYEXTENSIONPROC)(Display * dpy, int * errorb, int * event); typedef Bool (GLAD_API_PTR *PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)(GLXContext ctx); typedef XVisualInfo * (GLAD_API_PTR *PFNGLXCHOOSEVISUALPROC)(Display * dpy, int screen, int * attribList); typedef void (GLAD_API_PTR *PFNGLXDESTROYCONTEXTPROC)(Display * dpy, GLXContext ctx); typedef const char * (GLAD_API_PTR *PFNGLXGETCLIENTSTRINGPROC)(Display * dpy, int name); typedef void (GLAD_API_PTR *PFNGLXDESTROYGLXPIXMAPPROC)(Display * dpy, GLXPixmap pixmap); typedef Bool (GLAD_API_PTR *PFNGLXRESETFRAMECOUNTNVPROC)(Display * dpy, int screen); typedef int (GLAD_API_PTR *PFNGLXRELEASEVIDEODEVICENVPROC)(Display * dpy, int screen, GLXVideoDeviceNV VideoDevice); typedef GLXFBConfigSGIX (GLAD_API_PTR *PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)(Display * dpy, XVisualInfo * vis); typedef GLXContext (GLAD_API_PTR *PFNGLXCREATENEWCONTEXTPROC)(Display * dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); typedef Bool (GLAD_API_PTR *PFNGLXMAKECONTEXTCURRENTPROC)(Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); typedef Bool (GLAD_API_PTR *PFNGLXQUERYMAXSWAPGROUPSNVPROC)(Display * dpy, int screen, GLuint * maxGroups, GLuint * maxBarriers); typedef XVisualInfo * (GLAD_API_PTR *PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)(Display * dpy, GLXFBConfigSGIX config); typedef GLXDrawable (GLAD_API_PTR *PFNGLXGETCURRENTDRAWABLEPROC)(void); typedef GLXDrawable (GLAD_API_PTR *PFNGLXGETCURRENTREADDRAWABLESGIPROC)(void); typedef Bool (GLAD_API_PTR *PFNGLXQUERYFRAMECOUNTNVPROC)(Display * dpy, int screen, GLuint * count); typedef unsigned int (GLAD_API_PTR *PFNGLXGETCONTEXTGPUIDAMDPROC)(GLXContext ctx); typedef void (GLAD_API_PTR *PFNGLXBINDSWAPBARRIERSGIXPROC)(Display * dpy, GLXDrawable drawable, int barrier); typedef Bool (GLAD_API_PTR *PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)(Display * dpy, int screen, int * max); typedef GLXPixmap (GLAD_API_PTR *PFNGLXCREATEGLXPIXMAPMESAPROC)(Display * dpy, XVisualInfo * visual, Pixmap pixmap, Colormap cmap); typedef Bool (GLAD_API_PTR *PFNGLXMAKECURRENTPROC)(Display * dpy, GLXDrawable drawable, GLXContext ctx); typedef void (GLAD_API_PTR *PFNGLXDESTROYWINDOWPROC)(Display * dpy, GLXWindow win); typedef int (GLAD_API_PTR *PFNGLXBINDVIDEOIMAGENVPROC)(Display * dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer); typedef int (GLAD_API_PTR *PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC)(Display * dpy, GLXVideoCaptureDeviceNV device, int attribute, int * value); typedef int (GLAD_API_PTR *PFNGLXQUERYCHANNELDELTASSGIXPROC)(Display * display, int screen, int channel, int * x, int * y, int * w, int * h); typedef GLXVideoCaptureDeviceNV * (GLAD_API_PTR *PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC)(Display * dpy, int screen, int * nelements); typedef GLXContext (GLAD_API_PTR *PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)(unsigned int id, GLXContext share_context, const int * attribList); typedef GLXContext (GLAD_API_PTR *PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC)(void); typedef int (GLAD_API_PTR *PFNGLXQUERYCHANNELRECTSGIXPROC)(Display * display, int screen, int channel, int * dx, int * dy, int * dw, int * dh); typedef GLXContext (GLAD_API_PTR *PFNGLXCREATECONTEXTPROC)(Display * dpy, XVisualInfo * vis, GLXContext shareList, Bool direct); typedef void (GLAD_API_PTR *PFNGLXFREECONTEXTEXTPROC)(Display * dpy, GLXContext context); typedef GLXContextID (GLAD_API_PTR *PFNGLXGETCONTEXTIDEXTPROC)(const GLXContext context); typedef Bool (GLAD_API_PTR *PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)(int attribute, unsigned int * value); typedef GLXFBConfig * (GLAD_API_PTR *PFNGLXCHOOSEFBCONFIGPROC)(Display * dpy, int screen, const int * attrib_list, int * nelements); typedef int (GLAD_API_PTR *PFNGLXBINDCHANNELTOWINDOWSGIXPROC)(Display * display, int screen, int channel, Window window); typedef int (GLAD_API_PTR *PFNGLXCHANNELRECTSYNCSGIXPROC)(Display * display, int screen, int channel, GLenum synctype); typedef GLXContext (GLAD_API_PTR *PFNGLXIMPORTCONTEXTEXTPROC)(Display * dpy, GLXContextID contextID); typedef Bool (GLAD_API_PTR *PFNGLXRELEASEBUFFERSMESAPROC)(Display * dpy, GLXDrawable drawable); typedef GLXPixmap (GLAD_API_PTR *PFNGLXCREATEPIXMAPPROC)(Display * dpy, GLXFBConfig config, Pixmap pixmap, const int * attrib_list); typedef unsigned int (GLAD_API_PTR *PFNGLXGETAGPOFFSETMESAPROC)(const void * pointer); GLAD_API_CALL PFNGLXCUSHIONSGIPROC glad_glXCushionSGI; #define glXCushionSGI glad_glXCushionSGI GLAD_API_CALL PFNGLXDESTROYGLXPBUFFERSGIXPROC glad_glXDestroyGLXPbufferSGIX; #define glXDestroyGLXPbufferSGIX glad_glXDestroyGLXPbufferSGIX GLAD_API_CALL PFNGLXSENDPBUFFERTOVIDEONVPROC glad_glXSendPbufferToVideoNV; #define glXSendPbufferToVideoNV glad_glXSendPbufferToVideoNV GLAD_API_CALL PFNGLXGETPROCADDRESSARBPROC glad_glXGetProcAddressARB; #define glXGetProcAddressARB glad_glXGetProcAddressARB GLAD_API_CALL PFNGLXCREATECONTEXTATTRIBSARBPROC glad_glXCreateContextAttribsARB; #define glXCreateContextAttribsARB glad_glXCreateContextAttribsARB GLAD_API_CALL PFNGLXJOINSWAPGROUPSGIXPROC glad_glXJoinSwapGroupSGIX; #define glXJoinSwapGroupSGIX glad_glXJoinSwapGroupSGIX GLAD_API_CALL PFNGLXSWAPINTERVALEXTPROC glad_glXSwapIntervalEXT; #define glXSwapIntervalEXT glad_glXSwapIntervalEXT GLAD_API_CALL PFNGLXQUERYHYPERPIPECONFIGSGIXPROC glad_glXQueryHyperpipeConfigSGIX; #define glXQueryHyperpipeConfigSGIX glad_glXQueryHyperpipeConfigSGIX GLAD_API_CALL PFNGLXGETGPUINFOAMDPROC glad_glXGetGPUInfoAMD; #define glXGetGPUInfoAMD glad_glXGetGPUInfoAMD GLAD_API_CALL PFNGLXGETTRANSPARENTINDEXSUNPROC glad_glXGetTransparentIndexSUN; #define glXGetTransparentIndexSUN glad_glXGetTransparentIndexSUN GLAD_API_CALL PFNGLXQUERYHYPERPIPENETWORKSGIXPROC glad_glXQueryHyperpipeNetworkSGIX; #define glXQueryHyperpipeNetworkSGIX glad_glXQueryHyperpipeNetworkSGIX GLAD_API_CALL PFNGLXQUERYGLXPBUFFERSGIXPROC glad_glXQueryGLXPbufferSGIX; #define glXQueryGLXPbufferSGIX glad_glXQueryGLXPbufferSGIX GLAD_API_CALL PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC glad_glXCreateGLXPixmapWithConfigSGIX; #define glXCreateGLXPixmapWithConfigSGIX glad_glXCreateGLXPixmapWithConfigSGIX GLAD_API_CALL PFNGLXCOPYCONTEXTPROC glad_glXCopyContext; #define glXCopyContext glad_glXCopyContext GLAD_API_CALL PFNGLXCREATEGLXPBUFFERSGIXPROC glad_glXCreateGLXPbufferSGIX; #define glXCreateGLXPbufferSGIX glad_glXCreateGLXPbufferSGIX GLAD_API_CALL PFNGLXGETGPUIDSAMDPROC glad_glXGetGPUIDsAMD; #define glXGetGPUIDsAMD glad_glXGetGPUIDsAMD GLAD_API_CALL PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC glad_glXDeleteAssociatedContextAMD; #define glXDeleteAssociatedContextAMD glad_glXDeleteAssociatedContextAMD GLAD_API_CALL PFNGLXGETVIDEODEVICENVPROC glad_glXGetVideoDeviceNV; #define glXGetVideoDeviceNV glad_glXGetVideoDeviceNV GLAD_API_CALL PFNGLXWAITGLPROC glad_glXWaitGL; #define glXWaitGL glad_glXWaitGL GLAD_API_CALL PFNGLXGETVIDEOSYNCSGIPROC glad_glXGetVideoSyncSGI; #define glXGetVideoSyncSGI glad_glXGetVideoSyncSGI GLAD_API_CALL PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC glad_glXDestroyHyperpipeConfigSGIX; #define glXDestroyHyperpipeConfigSGIX glad_glXDestroyHyperpipeConfigSGIX GLAD_API_CALL PFNGLXHYPERPIPECONFIGSGIXPROC glad_glXHyperpipeConfigSGIX; #define glXHyperpipeConfigSGIX glad_glXHyperpipeConfigSGIX GLAD_API_CALL PFNGLXSWAPBUFFERSMSCOMLPROC glad_glXSwapBuffersMscOML; #define glXSwapBuffersMscOML glad_glXSwapBuffersMscOML GLAD_API_CALL PFNGLXCHOOSEFBCONFIGSGIXPROC glad_glXChooseFBConfigSGIX; #define glXChooseFBConfigSGIX glad_glXChooseFBConfigSGIX GLAD_API_CALL PFNGLXWAITVIDEOSYNCSGIPROC glad_glXWaitVideoSyncSGI; #define glXWaitVideoSyncSGI glad_glXWaitVideoSyncSGI GLAD_API_CALL PFNGLXWAITFORSBCOMLPROC glad_glXWaitForSbcOML; #define glXWaitForSbcOML glad_glXWaitForSbcOML GLAD_API_CALL PFNGLXGETPROCADDRESSPROC glad_glXGetProcAddress; #define glXGetProcAddress glad_glXGetProcAddress GLAD_API_CALL PFNGLXGETSWAPINTERVALMESAPROC glad_glXGetSwapIntervalMESA; #define glXGetSwapIntervalMESA glad_glXGetSwapIntervalMESA GLAD_API_CALL PFNGLXCHANNELRECTSGIXPROC glad_glXChannelRectSGIX; #define glXChannelRectSGIX glad_glXChannelRectSGIX GLAD_API_CALL PFNGLXWAITXPROC glad_glXWaitX; #define glXWaitX glad_glXWaitX GLAD_API_CALL PFNGLXQUERYSERVERSTRINGPROC glad_glXQueryServerString; #define glXQueryServerString glad_glXQueryServerString GLAD_API_CALL PFNGLXCREATEGLXPIXMAPPROC glad_glXCreateGLXPixmap; #define glXCreateGLXPixmap glad_glXCreateGLXPixmap GLAD_API_CALL PFNGLXBINDSWAPBARRIERNVPROC glad_glXBindSwapBarrierNV; #define glXBindSwapBarrierNV glad_glXBindSwapBarrierNV GLAD_API_CALL PFNGLXQUERYRENDERERSTRINGMESAPROC glad_glXQueryRendererStringMESA; #define glXQueryRendererStringMESA glad_glXQueryRendererStringMESA GLAD_API_CALL PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC glad_glXReleaseVideoCaptureDeviceNV; #define glXReleaseVideoCaptureDeviceNV glad_glXReleaseVideoCaptureDeviceNV GLAD_API_CALL PFNGLXWAITFORMSCOMLPROC glad_glXWaitForMscOML; #define glXWaitForMscOML glad_glXWaitForMscOML GLAD_API_CALL PFNGLXCOPYSUBBUFFERMESAPROC glad_glXCopySubBufferMESA; #define glXCopySubBufferMESA glad_glXCopySubBufferMESA GLAD_API_CALL PFNGLXGETCURRENTCONTEXTPROC glad_glXGetCurrentContext; #define glXGetCurrentContext glad_glXGetCurrentContext GLAD_API_CALL PFNGLXSELECTEVENTPROC glad_glXSelectEvent; #define glXSelectEvent glad_glXSelectEvent GLAD_API_CALL PFNGLXSWAPINTERVALSGIPROC glad_glXSwapIntervalSGI; #define glXSwapIntervalSGI glad_glXSwapIntervalSGI GLAD_API_CALL PFNGLXQUERYSWAPGROUPNVPROC glad_glXQuerySwapGroupNV; #define glXQuerySwapGroupNV glad_glXQuerySwapGroupNV GLAD_API_CALL PFNGLXMAKECURRENTREADSGIPROC glad_glXMakeCurrentReadSGI; #define glXMakeCurrentReadSGI glad_glXMakeCurrentReadSGI GLAD_API_CALL PFNGLXQUERYDRAWABLEPROC glad_glXQueryDrawable; #define glXQueryDrawable glad_glXQueryDrawable GLAD_API_CALL PFNGLXCOPYBUFFERSUBDATANVPROC glad_glXCopyBufferSubDataNV; #define glXCopyBufferSubDataNV glad_glXCopyBufferSubDataNV GLAD_API_CALL PFNGLXQUERYCONTEXTPROC glad_glXQueryContext; #define glXQueryContext glad_glXQueryContext GLAD_API_CALL PFNGLXGETCONFIGPROC glad_glXGetConfig; #define glXGetConfig glad_glXGetConfig GLAD_API_CALL PFNGLXSET3DFXMODEMESAPROC glad_glXSet3DfxModeMESA; #define glXSet3DfxModeMESA glad_glXSet3DfxModeMESA GLAD_API_CALL PFNGLXGETVIDEOINFONVPROC glad_glXGetVideoInfoNV; #define glXGetVideoInfoNV glad_glXGetVideoInfoNV GLAD_API_CALL PFNGLXISDIRECTPROC glad_glXIsDirect; #define glXIsDirect glad_glXIsDirect GLAD_API_CALL PFNGLXGETFBCONFIGATTRIBPROC glad_glXGetFBConfigAttrib; #define glXGetFBConfigAttrib glad_glXGetFBConfigAttrib GLAD_API_CALL PFNGLXGETVISUALFROMFBCONFIGPROC glad_glXGetVisualFromFBConfig; #define glXGetVisualFromFBConfig glad_glXGetVisualFromFBConfig GLAD_API_CALL PFNGLXBINDTEXIMAGEEXTPROC glad_glXBindTexImageEXT; #define glXBindTexImageEXT glad_glXBindTexImageEXT GLAD_API_CALL PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC glad_glXBlitContextFramebufferAMD; #define glXBlitContextFramebufferAMD glad_glXBlitContextFramebufferAMD GLAD_API_CALL PFNGLXQUERYVERSIONPROC glad_glXQueryVersion; #define glXQueryVersion glad_glXQueryVersion GLAD_API_CALL PFNGLXSELECTEVENTSGIXPROC glad_glXSelectEventSGIX; #define glXSelectEventSGIX glad_glXSelectEventSGIX GLAD_API_CALL PFNGLXGETMSCRATEOMLPROC glad_glXGetMscRateOML; #define glXGetMscRateOML glad_glXGetMscRateOML GLAD_API_CALL PFNGLXQUERYRENDERERINTEGERMESAPROC glad_glXQueryRendererIntegerMESA; #define glXQueryRendererIntegerMESA glad_glXQueryRendererIntegerMESA GLAD_API_CALL PFNGLXCREATEWINDOWPROC glad_glXCreateWindow; #define glXCreateWindow glad_glXCreateWindow GLAD_API_CALL PFNGLXCOPYIMAGESUBDATANVPROC glad_glXCopyImageSubDataNV; #define glXCopyImageSubDataNV glad_glXCopyImageSubDataNV GLAD_API_CALL PFNGLXSWAPINTERVALMESAPROC glad_glXSwapIntervalMESA; #define glXSwapIntervalMESA glad_glXSwapIntervalMESA GLAD_API_CALL PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC glad_glXQueryHyperpipeAttribSGIX; #define glXQueryHyperpipeAttribSGIX glad_glXQueryHyperpipeAttribSGIX GLAD_API_CALL PFNGLXBINDVIDEOCAPTUREDEVICENVPROC glad_glXBindVideoCaptureDeviceNV; #define glXBindVideoCaptureDeviceNV glad_glXBindVideoCaptureDeviceNV GLAD_API_CALL PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC glad_glXCreateContextWithConfigSGIX; #define glXCreateContextWithConfigSGIX glad_glXCreateContextWithConfigSGIX GLAD_API_CALL PFNGLXENUMERATEVIDEODEVICESNVPROC glad_glXEnumerateVideoDevicesNV; #define glXEnumerateVideoDevicesNV glad_glXEnumerateVideoDevicesNV GLAD_API_CALL PFNGLXHYPERPIPEATTRIBSGIXPROC glad_glXHyperpipeAttribSGIX; #define glXHyperpipeAttribSGIX glad_glXHyperpipeAttribSGIX GLAD_API_CALL PFNGLXDESTROYPBUFFERPROC glad_glXDestroyPbuffer; #define glXDestroyPbuffer glad_glXDestroyPbuffer GLAD_API_CALL PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC glad_glXNamedCopyBufferSubDataNV; #define glXNamedCopyBufferSubDataNV glad_glXNamedCopyBufferSubDataNV GLAD_API_CALL PFNGLXCREATEPBUFFERPROC glad_glXCreatePbuffer; #define glXCreatePbuffer glad_glXCreatePbuffer GLAD_API_CALL PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC glad_glXQueryCurrentRendererStringMESA; #define glXQueryCurrentRendererStringMESA glad_glXQueryCurrentRendererStringMESA GLAD_API_CALL PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC glad_glXQueryHyperpipeBestAttribSGIX; #define glXQueryHyperpipeBestAttribSGIX glad_glXQueryHyperpipeBestAttribSGIX GLAD_API_CALL PFNGLXGETFBCONFIGATTRIBSGIXPROC glad_glXGetFBConfigAttribSGIX; #define glXGetFBConfigAttribSGIX glad_glXGetFBConfigAttribSGIX GLAD_API_CALL PFNGLXQUERYEXTENSIONSSTRINGPROC glad_glXQueryExtensionsString; #define glXQueryExtensionsString glad_glXQueryExtensionsString GLAD_API_CALL PFNGLXBINDVIDEODEVICENVPROC glad_glXBindVideoDeviceNV; #define glXBindVideoDeviceNV glad_glXBindVideoDeviceNV GLAD_API_CALL PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC glad_glXCreateAssociatedContextAMD; #define glXCreateAssociatedContextAMD glad_glXCreateAssociatedContextAMD GLAD_API_CALL PFNGLXQUERYCONTEXTINFOEXTPROC glad_glXQueryContextInfoEXT; #define glXQueryContextInfoEXT glad_glXQueryContextInfoEXT GLAD_API_CALL PFNGLXGETSELECTEDEVENTPROC glad_glXGetSelectedEvent; #define glXGetSelectedEvent glad_glXGetSelectedEvent GLAD_API_CALL PFNGLXGETCURRENTDISPLAYPROC glad_glXGetCurrentDisplay; #define glXGetCurrentDisplay glad_glXGetCurrentDisplay GLAD_API_CALL PFNGLXDESTROYPIXMAPPROC glad_glXDestroyPixmap; #define glXDestroyPixmap glad_glXDestroyPixmap GLAD_API_CALL PFNGLXGETSELECTEDEVENTSGIXPROC glad_glXGetSelectedEventSGIX; #define glXGetSelectedEventSGIX glad_glXGetSelectedEventSGIX GLAD_API_CALL PFNGLXRELEASETEXIMAGEEXTPROC glad_glXReleaseTexImageEXT; #define glXReleaseTexImageEXT glad_glXReleaseTexImageEXT GLAD_API_CALL PFNGLXUSEXFONTPROC glad_glXUseXFont; #define glXUseXFont glad_glXUseXFont GLAD_API_CALL PFNGLXGETSYNCVALUESOMLPROC glad_glXGetSyncValuesOML; #define glXGetSyncValuesOML glad_glXGetSyncValuesOML GLAD_API_CALL PFNGLXJOINSWAPGROUPNVPROC glad_glXJoinSwapGroupNV; #define glXJoinSwapGroupNV glad_glXJoinSwapGroupNV GLAD_API_CALL PFNGLXSWAPBUFFERSPROC glad_glXSwapBuffers; #define glXSwapBuffers glad_glXSwapBuffers GLAD_API_CALL PFNGLXDELAYBEFORESWAPNVPROC glad_glXDelayBeforeSwapNV; #define glXDelayBeforeSwapNV glad_glXDelayBeforeSwapNV GLAD_API_CALL PFNGLXBINDHYPERPIPESGIXPROC glad_glXBindHyperpipeSGIX; #define glXBindHyperpipeSGIX glad_glXBindHyperpipeSGIX GLAD_API_CALL PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC glad_glXLockVideoCaptureDeviceNV; #define glXLockVideoCaptureDeviceNV glad_glXLockVideoCaptureDeviceNV GLAD_API_CALL PFNGLXGETCURRENTDISPLAYEXTPROC glad_glXGetCurrentDisplayEXT; #define glXGetCurrentDisplayEXT glad_glXGetCurrentDisplayEXT GLAD_API_CALL PFNGLXGETFBCONFIGSPROC glad_glXGetFBConfigs; #define glXGetFBConfigs glad_glXGetFBConfigs GLAD_API_CALL PFNGLXGETCURRENTREADDRAWABLEPROC glad_glXGetCurrentReadDrawable; #define glXGetCurrentReadDrawable glad_glXGetCurrentReadDrawable GLAD_API_CALL PFNGLXRELEASEVIDEOIMAGENVPROC glad_glXReleaseVideoImageNV; #define glXReleaseVideoImageNV glad_glXReleaseVideoImageNV GLAD_API_CALL PFNGLXQUERYEXTENSIONPROC glad_glXQueryExtension; #define glXQueryExtension glad_glXQueryExtension GLAD_API_CALL PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC glad_glXMakeAssociatedContextCurrentAMD; #define glXMakeAssociatedContextCurrentAMD glad_glXMakeAssociatedContextCurrentAMD GLAD_API_CALL PFNGLXCHOOSEVISUALPROC glad_glXChooseVisual; #define glXChooseVisual glad_glXChooseVisual GLAD_API_CALL PFNGLXDESTROYCONTEXTPROC glad_glXDestroyContext; #define glXDestroyContext glad_glXDestroyContext GLAD_API_CALL PFNGLXGETCLIENTSTRINGPROC glad_glXGetClientString; #define glXGetClientString glad_glXGetClientString GLAD_API_CALL PFNGLXDESTROYGLXPIXMAPPROC glad_glXDestroyGLXPixmap; #define glXDestroyGLXPixmap glad_glXDestroyGLXPixmap GLAD_API_CALL PFNGLXRESETFRAMECOUNTNVPROC glad_glXResetFrameCountNV; #define glXResetFrameCountNV glad_glXResetFrameCountNV GLAD_API_CALL PFNGLXRELEASEVIDEODEVICENVPROC glad_glXReleaseVideoDeviceNV; #define glXReleaseVideoDeviceNV glad_glXReleaseVideoDeviceNV GLAD_API_CALL PFNGLXGETFBCONFIGFROMVISUALSGIXPROC glad_glXGetFBConfigFromVisualSGIX; #define glXGetFBConfigFromVisualSGIX glad_glXGetFBConfigFromVisualSGIX GLAD_API_CALL PFNGLXCREATENEWCONTEXTPROC glad_glXCreateNewContext; #define glXCreateNewContext glad_glXCreateNewContext GLAD_API_CALL PFNGLXMAKECONTEXTCURRENTPROC glad_glXMakeContextCurrent; #define glXMakeContextCurrent glad_glXMakeContextCurrent GLAD_API_CALL PFNGLXQUERYMAXSWAPGROUPSNVPROC glad_glXQueryMaxSwapGroupsNV; #define glXQueryMaxSwapGroupsNV glad_glXQueryMaxSwapGroupsNV GLAD_API_CALL PFNGLXGETVISUALFROMFBCONFIGSGIXPROC glad_glXGetVisualFromFBConfigSGIX; #define glXGetVisualFromFBConfigSGIX glad_glXGetVisualFromFBConfigSGIX GLAD_API_CALL PFNGLXGETCURRENTDRAWABLEPROC glad_glXGetCurrentDrawable; #define glXGetCurrentDrawable glad_glXGetCurrentDrawable GLAD_API_CALL PFNGLXGETCURRENTREADDRAWABLESGIPROC glad_glXGetCurrentReadDrawableSGI; #define glXGetCurrentReadDrawableSGI glad_glXGetCurrentReadDrawableSGI GLAD_API_CALL PFNGLXQUERYFRAMECOUNTNVPROC glad_glXQueryFrameCountNV; #define glXQueryFrameCountNV glad_glXQueryFrameCountNV GLAD_API_CALL PFNGLXGETCONTEXTGPUIDAMDPROC glad_glXGetContextGPUIDAMD; #define glXGetContextGPUIDAMD glad_glXGetContextGPUIDAMD GLAD_API_CALL PFNGLXBINDSWAPBARRIERSGIXPROC glad_glXBindSwapBarrierSGIX; #define glXBindSwapBarrierSGIX glad_glXBindSwapBarrierSGIX GLAD_API_CALL PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC glad_glXQueryMaxSwapBarriersSGIX; #define glXQueryMaxSwapBarriersSGIX glad_glXQueryMaxSwapBarriersSGIX GLAD_API_CALL PFNGLXCREATEGLXPIXMAPMESAPROC glad_glXCreateGLXPixmapMESA; #define glXCreateGLXPixmapMESA glad_glXCreateGLXPixmapMESA GLAD_API_CALL PFNGLXMAKECURRENTPROC glad_glXMakeCurrent; #define glXMakeCurrent glad_glXMakeCurrent GLAD_API_CALL PFNGLXDESTROYWINDOWPROC glad_glXDestroyWindow; #define glXDestroyWindow glad_glXDestroyWindow GLAD_API_CALL PFNGLXBINDVIDEOIMAGENVPROC glad_glXBindVideoImageNV; #define glXBindVideoImageNV glad_glXBindVideoImageNV GLAD_API_CALL PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC glad_glXQueryVideoCaptureDeviceNV; #define glXQueryVideoCaptureDeviceNV glad_glXQueryVideoCaptureDeviceNV GLAD_API_CALL PFNGLXQUERYCHANNELDELTASSGIXPROC glad_glXQueryChannelDeltasSGIX; #define glXQueryChannelDeltasSGIX glad_glXQueryChannelDeltasSGIX GLAD_API_CALL PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC glad_glXEnumerateVideoCaptureDevicesNV; #define glXEnumerateVideoCaptureDevicesNV glad_glXEnumerateVideoCaptureDevicesNV GLAD_API_CALL PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC glad_glXCreateAssociatedContextAttribsAMD; #define glXCreateAssociatedContextAttribsAMD glad_glXCreateAssociatedContextAttribsAMD GLAD_API_CALL PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC glad_glXGetCurrentAssociatedContextAMD; #define glXGetCurrentAssociatedContextAMD glad_glXGetCurrentAssociatedContextAMD GLAD_API_CALL PFNGLXQUERYCHANNELRECTSGIXPROC glad_glXQueryChannelRectSGIX; #define glXQueryChannelRectSGIX glad_glXQueryChannelRectSGIX GLAD_API_CALL PFNGLXCREATECONTEXTPROC glad_glXCreateContext; #define glXCreateContext glad_glXCreateContext GLAD_API_CALL PFNGLXFREECONTEXTEXTPROC glad_glXFreeContextEXT; #define glXFreeContextEXT glad_glXFreeContextEXT GLAD_API_CALL PFNGLXGETCONTEXTIDEXTPROC glad_glXGetContextIDEXT; #define glXGetContextIDEXT glad_glXGetContextIDEXT GLAD_API_CALL PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC glad_glXQueryCurrentRendererIntegerMESA; #define glXQueryCurrentRendererIntegerMESA glad_glXQueryCurrentRendererIntegerMESA GLAD_API_CALL PFNGLXCHOOSEFBCONFIGPROC glad_glXChooseFBConfig; #define glXChooseFBConfig glad_glXChooseFBConfig GLAD_API_CALL PFNGLXBINDCHANNELTOWINDOWSGIXPROC glad_glXBindChannelToWindowSGIX; #define glXBindChannelToWindowSGIX glad_glXBindChannelToWindowSGIX GLAD_API_CALL PFNGLXCHANNELRECTSYNCSGIXPROC glad_glXChannelRectSyncSGIX; #define glXChannelRectSyncSGIX glad_glXChannelRectSyncSGIX GLAD_API_CALL PFNGLXIMPORTCONTEXTEXTPROC glad_glXImportContextEXT; #define glXImportContextEXT glad_glXImportContextEXT GLAD_API_CALL PFNGLXRELEASEBUFFERSMESAPROC glad_glXReleaseBuffersMESA; #define glXReleaseBuffersMESA glad_glXReleaseBuffersMESA GLAD_API_CALL PFNGLXCREATEPIXMAPPROC glad_glXCreatePixmap; #define glXCreatePixmap glad_glXCreatePixmap GLAD_API_CALL PFNGLXGETAGPOFFSETMESAPROC glad_glXGetAGPOffsetMESA; #define glXGetAGPOffsetMESA glad_glXGetAGPOffsetMESA GLAD_API_CALL int gladLoadGLXUserPtr(Display *display, int screen, GLADuserptrloadfunc load, void *userptr); GLAD_API_CALL int gladLoadGLX(Display *display, int screen, GLADloadfunc load); #ifdef GLAD_GLX GLAD_API_CALL int gladLoaderLoadGLX(Display *display, int screen); GLAD_API_CALL void gladLoaderUnloadGLX(void); #endif #ifdef __cplusplus } #endif #endif ================================================ FILE: ycb_render/glad/glx_dyn.c ================================================ #include #include #include #include #ifdef DYNAMIC_LOAD_X11_FUNCTIONS #include #endif typedef Display* (* PFNXOPENDISPLAY) (_Xconst char* a); typedef Screen* (* PFNXDEFAULTSCREENOFDISPLAY) (Display*); typedef int (* PFNXSCREENNUMBEROFSCREEN) (Screen*); typedef struct { void* library; PFNXOPENDISPLAY XOpenDisplay; PFNXDEFAULTSCREENOFDISPLAY XDefaultScreenOfDisplay; PFNXSCREENNUMBEROFSCREEN XScreenNumberOfScreen; } X11Struct; #ifdef DYNAMIC_LOAD_X11_FUNCTIONS void initX11Struct(X11Struct *x11) { const char *X11_LIBRARY = "libX11.so.6"; x11->library = dlopen(X11_LIBRARY, RTLD_LOCAL | RTLD_NOW); if (!x11->library) { fprintf(stderr, "Error opening X11 library %s\n", X11_LIBRARY); exit(EXIT_FAILURE); } int missingFunc = 0; missingFunc = ((x11->XOpenDisplay = (PFNXOPENDISPLAY) dlsym(x11->library,"XOpenDisplay"))==NULL) | missingFunc; if (missingFunc) { fprintf(stderr, "Error: missing func XOpenDisplay in %s, exiting!\n", X11_LIBRARY); exit(EXIT_FAILURE);} missingFunc = ((x11->XDefaultScreenOfDisplay = (PFNXDEFAULTSCREENOFDISPLAY) dlsym(x11->library,"XDefaultScreenOfDisplay"))==NULL) | missingFunc; if (missingFunc) { fprintf(stderr, "Error: missing func XScreenNumberOfScreen in %s, exiting!\n", X11_LIBRARY); exit(EXIT_FAILURE);} missingFunc = ((x11->XScreenNumberOfScreen = (PFNXSCREENNUMBEROFSCREEN) dlsym(x11->library,"XScreenNumberOfScreen"))==NULL) | missingFunc; if (missingFunc) { fprintf(stderr, "Error: missing func XScreenNumberOfScreen in %s, exiting!\n", X11_LIBRARY); exit(EXIT_FAILURE);} if (!missingFunc) { printf("X11 functions dynamically loaded using dlopen/dlsym OK!\n");} } #else void initX11Struct(X11Struct *x11) { x11->XOpenDisplay = XOpenDisplay; x11->XDefaultScreenOfDisplay = XDefaultScreenOfDisplay; x11->XScreenNumberOfScreen = XScreenNumberOfScreen; } #endif // DYNAMIC_LOAD_X11_FUNCTIONS #ifndef GLAD_IMPL_UTIL_C_ #define GLAD_IMPL_UTIL_C_ #if _MSC_VER >= 1400 #define GLAD_IMPL_UTIL_STRNCPY(dest, source, len) strncpy_s(dest, len, source, len-1); #else #define GLAD_IMPL_UTIL_STRNCPY(dest, source, len) strncpy(dest, source, len); #endif #ifdef _MSC_VER #define GLAD_IMPL_UTIL_SSCANF sscanf_s #else #define GLAD_IMPL_UTIL_SSCANF sscanf #endif #endif /* GLAD_IMPL_UTIL_C_ */ int GLAD_GLX_VERSION_1_0; int GLAD_GLX_VERSION_1_1; int GLAD_GLX_VERSION_1_2; int GLAD_GLX_VERSION_1_3; int GLAD_GLX_VERSION_1_4; int GLAD_GLX_MESA_copy_sub_buffer; int GLAD_GLX_EXT_create_context_es_profile; int GLAD_GLX_SGIX_pbuffer; int GLAD_GLX_SGI_make_current_read; int GLAD_GLX_OML_sync_control; int GLAD_GLX_SGIX_hyperpipe; int GLAD_GLX_INTEL_swap_event; int GLAD_GLX_EXT_swap_control; int GLAD_GLX_NV_robustness_video_memory_purge; int GLAD_GLX_MESA_pixmap_colormap; int GLAD_GLX_ARB_fbconfig_float; int GLAD_GLX_EXT_fbconfig_packed_float; int GLAD_GLX_OML_swap_method; int GLAD_GLX_NV_video_capture; int GLAD_GLX_ARB_robustness_application_isolation; int GLAD_GLX_ARB_create_context_robustness; int GLAD_GLX_EXT_visual_rating; int GLAD_GLX_NV_swap_group; int GLAD_GLX_EXT_texture_from_pixmap; int GLAD_GLX_SUN_get_transparent_index; int GLAD_GLX_MESA_release_buffers; int GLAD_GLX_NV_delay_before_swap; int GLAD_GLX_EXT_buffer_age; int GLAD_GLX_MESA_agp_offset; int GLAD_GLX_EXT_visual_info; int GLAD_GLX_SGI_swap_control; int GLAD_GLX_EXT_import_context; int GLAD_GLX_SGI_video_sync; int GLAD_GLX_3DFX_multisample; int GLAD_GLX_ARB_multisample; int GLAD_GLX_EXT_framebuffer_sRGB; int GLAD_GLX_SGI_cushion; int GLAD_GLX_ARB_robustness_share_group_isolation; int GLAD_GLX_SGIX_fbconfig; int GLAD_GLX_NV_copy_buffer; int GLAD_GLX_SGIX_visual_select_group; int GLAD_GLX_EXT_swap_control_tear; int GLAD_GLX_ARB_create_context; int GLAD_GLX_AMD_gpu_association; int GLAD_GLX_MESA_query_renderer; int GLAD_GLX_EXT_create_context_es2_profile; int GLAD_GLX_MESA_swap_control; int GLAD_GLX_SGIX_video_resize; int GLAD_GLX_ARB_context_flush_control; int GLAD_GLX_NV_video_out; int GLAD_GLX_EXT_no_config_context; int GLAD_GLX_SGIS_blended_overlay; int GLAD_GLX_EXT_stereo_tree; int GLAD_GLX_ARB_create_context_no_error; int GLAD_GLX_EXT_libglvnd; int GLAD_GLX_ARB_create_context_profile; int GLAD_GLX_NV_float_buffer; int GLAD_GLX_MESA_set_3dfx_mode; int GLAD_GLX_ARB_framebuffer_sRGB; int GLAD_GLX_ARB_get_proc_address; int GLAD_GLX_SGIS_shared_multisample; int GLAD_GLX_NV_copy_image; int GLAD_GLX_NV_present_video; int GLAD_GLX_SGIX_swap_barrier; int GLAD_GLX_SGIS_multisample; int GLAD_GLX_SGIX_swap_group; int GLAD_GLX_ARB_vertex_buffer_object; int GLAD_GLX_NV_multisample_coverage; PFNGLXCUSHIONSGIPROC glad_glXCushionSGI; PFNGLXDESTROYGLXPBUFFERSGIXPROC glad_glXDestroyGLXPbufferSGIX; PFNGLXSENDPBUFFERTOVIDEONVPROC glad_glXSendPbufferToVideoNV; PFNGLXGETPROCADDRESSARBPROC glad_glXGetProcAddressARB; PFNGLXCREATECONTEXTATTRIBSARBPROC glad_glXCreateContextAttribsARB; PFNGLXJOINSWAPGROUPSGIXPROC glad_glXJoinSwapGroupSGIX; PFNGLXSWAPINTERVALEXTPROC glad_glXSwapIntervalEXT; PFNGLXQUERYHYPERPIPECONFIGSGIXPROC glad_glXQueryHyperpipeConfigSGIX; PFNGLXGETGPUINFOAMDPROC glad_glXGetGPUInfoAMD; PFNGLXGETTRANSPARENTINDEXSUNPROC glad_glXGetTransparentIndexSUN; PFNGLXQUERYHYPERPIPENETWORKSGIXPROC glad_glXQueryHyperpipeNetworkSGIX; PFNGLXQUERYGLXPBUFFERSGIXPROC glad_glXQueryGLXPbufferSGIX; PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC glad_glXCreateGLXPixmapWithConfigSGIX; PFNGLXCOPYCONTEXTPROC glad_glXCopyContext; PFNGLXCREATEGLXPBUFFERSGIXPROC glad_glXCreateGLXPbufferSGIX; PFNGLXGETGPUIDSAMDPROC glad_glXGetGPUIDsAMD; PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC glad_glXDeleteAssociatedContextAMD; PFNGLXGETVIDEODEVICENVPROC glad_glXGetVideoDeviceNV; PFNGLXWAITGLPROC glad_glXWaitGL; PFNGLXGETVIDEOSYNCSGIPROC glad_glXGetVideoSyncSGI; PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC glad_glXDestroyHyperpipeConfigSGIX; PFNGLXHYPERPIPECONFIGSGIXPROC glad_glXHyperpipeConfigSGIX; PFNGLXSWAPBUFFERSMSCOMLPROC glad_glXSwapBuffersMscOML; PFNGLXCHOOSEFBCONFIGSGIXPROC glad_glXChooseFBConfigSGIX; PFNGLXWAITVIDEOSYNCSGIPROC glad_glXWaitVideoSyncSGI; PFNGLXWAITFORSBCOMLPROC glad_glXWaitForSbcOML; PFNGLXGETPROCADDRESSPROC glad_glXGetProcAddress; PFNGLXGETSWAPINTERVALMESAPROC glad_glXGetSwapIntervalMESA; PFNGLXCHANNELRECTSGIXPROC glad_glXChannelRectSGIX; PFNGLXWAITXPROC glad_glXWaitX; PFNGLXQUERYSERVERSTRINGPROC glad_glXQueryServerString; PFNGLXCREATEGLXPIXMAPPROC glad_glXCreateGLXPixmap; PFNGLXBINDSWAPBARRIERNVPROC glad_glXBindSwapBarrierNV; PFNGLXQUERYRENDERERSTRINGMESAPROC glad_glXQueryRendererStringMESA; PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC glad_glXReleaseVideoCaptureDeviceNV; PFNGLXWAITFORMSCOMLPROC glad_glXWaitForMscOML; PFNGLXCOPYSUBBUFFERMESAPROC glad_glXCopySubBufferMESA; PFNGLXGETCURRENTCONTEXTPROC glad_glXGetCurrentContext; PFNGLXSELECTEVENTPROC glad_glXSelectEvent; PFNGLXSWAPINTERVALSGIPROC glad_glXSwapIntervalSGI; PFNGLXQUERYSWAPGROUPNVPROC glad_glXQuerySwapGroupNV; PFNGLXMAKECURRENTREADSGIPROC glad_glXMakeCurrentReadSGI; PFNGLXQUERYDRAWABLEPROC glad_glXQueryDrawable; PFNGLXCOPYBUFFERSUBDATANVPROC glad_glXCopyBufferSubDataNV; PFNGLXQUERYCONTEXTPROC glad_glXQueryContext; PFNGLXGETCONFIGPROC glad_glXGetConfig; PFNGLXSET3DFXMODEMESAPROC glad_glXSet3DfxModeMESA; PFNGLXGETVIDEOINFONVPROC glad_glXGetVideoInfoNV; PFNGLXISDIRECTPROC glad_glXIsDirect; PFNGLXGETFBCONFIGATTRIBPROC glad_glXGetFBConfigAttrib; PFNGLXGETVISUALFROMFBCONFIGPROC glad_glXGetVisualFromFBConfig; PFNGLXBINDTEXIMAGEEXTPROC glad_glXBindTexImageEXT; PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC glad_glXBlitContextFramebufferAMD; PFNGLXQUERYVERSIONPROC glad_glXQueryVersion; PFNGLXSELECTEVENTSGIXPROC glad_glXSelectEventSGIX; PFNGLXGETMSCRATEOMLPROC glad_glXGetMscRateOML; PFNGLXQUERYRENDERERINTEGERMESAPROC glad_glXQueryRendererIntegerMESA; PFNGLXCREATEWINDOWPROC glad_glXCreateWindow; PFNGLXCOPYIMAGESUBDATANVPROC glad_glXCopyImageSubDataNV; PFNGLXSWAPINTERVALMESAPROC glad_glXSwapIntervalMESA; PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC glad_glXQueryHyperpipeAttribSGIX; PFNGLXBINDVIDEOCAPTUREDEVICENVPROC glad_glXBindVideoCaptureDeviceNV; PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC glad_glXCreateContextWithConfigSGIX; PFNGLXENUMERATEVIDEODEVICESNVPROC glad_glXEnumerateVideoDevicesNV; PFNGLXHYPERPIPEATTRIBSGIXPROC glad_glXHyperpipeAttribSGIX; PFNGLXDESTROYPBUFFERPROC glad_glXDestroyPbuffer; PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC glad_glXNamedCopyBufferSubDataNV; PFNGLXCREATEPBUFFERPROC glad_glXCreatePbuffer; PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC glad_glXQueryCurrentRendererStringMESA; PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC glad_glXQueryHyperpipeBestAttribSGIX; PFNGLXGETFBCONFIGATTRIBSGIXPROC glad_glXGetFBConfigAttribSGIX; PFNGLXQUERYEXTENSIONSSTRINGPROC glad_glXQueryExtensionsString; PFNGLXBINDVIDEODEVICENVPROC glad_glXBindVideoDeviceNV; PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC glad_glXCreateAssociatedContextAMD; PFNGLXQUERYCONTEXTINFOEXTPROC glad_glXQueryContextInfoEXT; PFNGLXGETSELECTEDEVENTPROC glad_glXGetSelectedEvent; PFNGLXGETCURRENTDISPLAYPROC glad_glXGetCurrentDisplay; PFNGLXDESTROYPIXMAPPROC glad_glXDestroyPixmap; PFNGLXGETSELECTEDEVENTSGIXPROC glad_glXGetSelectedEventSGIX; PFNGLXRELEASETEXIMAGEEXTPROC glad_glXReleaseTexImageEXT; PFNGLXUSEXFONTPROC glad_glXUseXFont; PFNGLXGETSYNCVALUESOMLPROC glad_glXGetSyncValuesOML; PFNGLXJOINSWAPGROUPNVPROC glad_glXJoinSwapGroupNV; PFNGLXSWAPBUFFERSPROC glad_glXSwapBuffers; PFNGLXDELAYBEFORESWAPNVPROC glad_glXDelayBeforeSwapNV; PFNGLXBINDHYPERPIPESGIXPROC glad_glXBindHyperpipeSGIX; PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC glad_glXLockVideoCaptureDeviceNV; PFNGLXGETCURRENTDISPLAYEXTPROC glad_glXGetCurrentDisplayEXT; PFNGLXGETFBCONFIGSPROC glad_glXGetFBConfigs; PFNGLXGETCURRENTREADDRAWABLEPROC glad_glXGetCurrentReadDrawable; PFNGLXRELEASEVIDEOIMAGENVPROC glad_glXReleaseVideoImageNV; PFNGLXQUERYEXTENSIONPROC glad_glXQueryExtension; PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC glad_glXMakeAssociatedContextCurrentAMD; PFNGLXCHOOSEVISUALPROC glad_glXChooseVisual; PFNGLXDESTROYCONTEXTPROC glad_glXDestroyContext; PFNGLXGETCLIENTSTRINGPROC glad_glXGetClientString; PFNGLXDESTROYGLXPIXMAPPROC glad_glXDestroyGLXPixmap; PFNGLXRESETFRAMECOUNTNVPROC glad_glXResetFrameCountNV; PFNGLXRELEASEVIDEODEVICENVPROC glad_glXReleaseVideoDeviceNV; PFNGLXGETFBCONFIGFROMVISUALSGIXPROC glad_glXGetFBConfigFromVisualSGIX; PFNGLXCREATENEWCONTEXTPROC glad_glXCreateNewContext; PFNGLXMAKECONTEXTCURRENTPROC glad_glXMakeContextCurrent; PFNGLXQUERYMAXSWAPGROUPSNVPROC glad_glXQueryMaxSwapGroupsNV; PFNGLXGETVISUALFROMFBCONFIGSGIXPROC glad_glXGetVisualFromFBConfigSGIX; PFNGLXGETCURRENTDRAWABLEPROC glad_glXGetCurrentDrawable; PFNGLXGETCURRENTREADDRAWABLESGIPROC glad_glXGetCurrentReadDrawableSGI; PFNGLXQUERYFRAMECOUNTNVPROC glad_glXQueryFrameCountNV; PFNGLXGETCONTEXTGPUIDAMDPROC glad_glXGetContextGPUIDAMD; PFNGLXBINDSWAPBARRIERSGIXPROC glad_glXBindSwapBarrierSGIX; PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC glad_glXQueryMaxSwapBarriersSGIX; PFNGLXCREATEGLXPIXMAPMESAPROC glad_glXCreateGLXPixmapMESA; PFNGLXMAKECURRENTPROC glad_glXMakeCurrent; PFNGLXDESTROYWINDOWPROC glad_glXDestroyWindow; PFNGLXBINDVIDEOIMAGENVPROC glad_glXBindVideoImageNV; PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC glad_glXQueryVideoCaptureDeviceNV; PFNGLXQUERYCHANNELDELTASSGIXPROC glad_glXQueryChannelDeltasSGIX; PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC glad_glXEnumerateVideoCaptureDevicesNV; PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC glad_glXCreateAssociatedContextAttribsAMD; PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC glad_glXGetCurrentAssociatedContextAMD; PFNGLXQUERYCHANNELRECTSGIXPROC glad_glXQueryChannelRectSGIX; PFNGLXCREATECONTEXTPROC glad_glXCreateContext; PFNGLXFREECONTEXTEXTPROC glad_glXFreeContextEXT; PFNGLXGETCONTEXTIDEXTPROC glad_glXGetContextIDEXT; PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC glad_glXQueryCurrentRendererIntegerMESA; PFNGLXCHOOSEFBCONFIGPROC glad_glXChooseFBConfig; PFNGLXBINDCHANNELTOWINDOWSGIXPROC glad_glXBindChannelToWindowSGIX; PFNGLXCHANNELRECTSYNCSGIXPROC glad_glXChannelRectSyncSGIX; PFNGLXIMPORTCONTEXTEXTPROC glad_glXImportContextEXT; PFNGLXRELEASEBUFFERSMESAPROC glad_glXReleaseBuffersMESA; PFNGLXCREATEPIXMAPPROC glad_glXCreatePixmap; PFNGLXGETAGPOFFSETMESAPROC glad_glXGetAGPOffsetMESA; static void load_GLX_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_VERSION_1_0) return; glXWaitGL = (PFNGLXWAITGLPROC) load("glXWaitGL", userptr); glXWaitX = (PFNGLXWAITXPROC) load("glXWaitX", userptr); glXGetConfig = (PFNGLXGETCONFIGPROC) load("glXGetConfig", userptr); glXQueryVersion = (PFNGLXQUERYVERSIONPROC) load("glXQueryVersion", userptr); glXCreateContext = (PFNGLXCREATECONTEXTPROC) load("glXCreateContext", userptr); glXQueryExtension = (PFNGLXQUERYEXTENSIONPROC) load("glXQueryExtension", userptr); glXGetCurrentContext = (PFNGLXGETCURRENTCONTEXTPROC) load("glXGetCurrentContext", userptr); glXMakeCurrent = (PFNGLXMAKECURRENTPROC) load("glXMakeCurrent", userptr); glXCopyContext = (PFNGLXCOPYCONTEXTPROC) load("glXCopyContext", userptr); glXIsDirect = (PFNGLXISDIRECTPROC) load("glXIsDirect", userptr); glXCreateGLXPixmap = (PFNGLXCREATEGLXPIXMAPPROC) load("glXCreateGLXPixmap", userptr); glXGetCurrentDrawable = (PFNGLXGETCURRENTDRAWABLEPROC) load("glXGetCurrentDrawable", userptr); glXUseXFont = (PFNGLXUSEXFONTPROC) load("glXUseXFont", userptr); glXChooseVisual = (PFNGLXCHOOSEVISUALPROC) load("glXChooseVisual", userptr); glXDestroyContext = (PFNGLXDESTROYCONTEXTPROC) load("glXDestroyContext", userptr); glXDestroyGLXPixmap = (PFNGLXDESTROYGLXPIXMAPPROC) load("glXDestroyGLXPixmap", userptr); glXSwapBuffers = (PFNGLXSWAPBUFFERSPROC) load("glXSwapBuffers", userptr); } static void load_GLX_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_VERSION_1_1) return; glXQueryServerString = (PFNGLXQUERYSERVERSTRINGPROC) load("glXQueryServerString", userptr); glXGetClientString = (PFNGLXGETCLIENTSTRINGPROC) load("glXGetClientString", userptr); glXQueryExtensionsString = (PFNGLXQUERYEXTENSIONSSTRINGPROC) load("glXQueryExtensionsString", userptr); } static void load_GLX_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_VERSION_1_2) return; glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC) load("glXGetCurrentDisplay", userptr); } static void load_GLX_VERSION_1_3( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_VERSION_1_3) return; glXQueryContext = (PFNGLXQUERYCONTEXTPROC) load("glXQueryContext", userptr); glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC) load("glXGetFBConfigs", userptr); glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC) load("glXDestroyPixmap", userptr); glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC) load("glXCreateNewContext", userptr); glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC) load("glXGetCurrentReadDrawable", userptr); glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC) load("glXMakeContextCurrent", userptr); glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC) load("glXDestroyWindow", userptr); glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC) load("glXChooseFBConfig", userptr); glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC) load("glXCreatePixmap", userptr); glXSelectEvent = (PFNGLXSELECTEVENTPROC) load("glXSelectEvent", userptr); glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC) load("glXGetFBConfigAttrib", userptr); glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC) load("glXDestroyPbuffer", userptr); glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC) load("glXCreatePbuffer", userptr); glXCreateWindow = (PFNGLXCREATEWINDOWPROC) load("glXCreateWindow", userptr); glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC) load("glXGetSelectedEvent", userptr); glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC) load("glXQueryDrawable", userptr); glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC) load("glXGetVisualFromFBConfig", userptr); } static void load_GLX_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_VERSION_1_4) return; glXGetProcAddress = (PFNGLXGETPROCADDRESSPROC) load("glXGetProcAddress", userptr); } static void load_GLX_MESA_copy_sub_buffer( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_MESA_copy_sub_buffer) return; glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC) load("glXCopySubBufferMESA", userptr); } static void load_GLX_SGIX_pbuffer( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_SGIX_pbuffer) return; glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC) load("glXDestroyGLXPbufferSGIX", userptr); glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC) load("glXQueryGLXPbufferSGIX", userptr); glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC) load("glXCreateGLXPbufferSGIX", userptr); glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC) load("glXGetSelectedEventSGIX", userptr); glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC) load("glXSelectEventSGIX", userptr); } static void load_GLX_SGI_make_current_read( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_SGI_make_current_read) return; glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC) load("glXGetCurrentReadDrawableSGI", userptr); glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC) load("glXMakeCurrentReadSGI", userptr); } static void load_GLX_OML_sync_control( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_OML_sync_control) return; glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC) load("glXWaitForMscOML", userptr); glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC) load("glXGetSyncValuesOML", userptr); glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC) load("glXWaitForSbcOML", userptr); glXSwapBuffersMscOML = (PFNGLXSWAPBUFFERSMSCOMLPROC) load("glXSwapBuffersMscOML", userptr); glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC) load("glXGetMscRateOML", userptr); } static void load_GLX_SGIX_hyperpipe( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_SGIX_hyperpipe) return; glXQueryHyperpipeBestAttribSGIX = (PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) load("glXQueryHyperpipeBestAttribSGIX", userptr); glXQueryHyperpipeAttribSGIX = (PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) load("glXQueryHyperpipeAttribSGIX", userptr); glXDestroyHyperpipeConfigSGIX = (PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) load("glXDestroyHyperpipeConfigSGIX", userptr); glXHyperpipeConfigSGIX = (PFNGLXHYPERPIPECONFIGSGIXPROC) load("glXHyperpipeConfigSGIX", userptr); glXHyperpipeAttribSGIX = (PFNGLXHYPERPIPEATTRIBSGIXPROC) load("glXHyperpipeAttribSGIX", userptr); glXQueryHyperpipeConfigSGIX = (PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) load("glXQueryHyperpipeConfigSGIX", userptr); glXQueryHyperpipeNetworkSGIX = (PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) load("glXQueryHyperpipeNetworkSGIX", userptr); glXBindHyperpipeSGIX = (PFNGLXBINDHYPERPIPESGIXPROC) load("glXBindHyperpipeSGIX", userptr); } static void load_GLX_EXT_swap_control( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_EXT_swap_control) return; glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC) load("glXSwapIntervalEXT", userptr); } static void load_GLX_MESA_pixmap_colormap( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_MESA_pixmap_colormap) return; glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC) load("glXCreateGLXPixmapMESA", userptr); } static void load_GLX_NV_video_capture( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_NV_video_capture) return; glXQueryVideoCaptureDeviceNV = (PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC) load("glXQueryVideoCaptureDeviceNV", userptr); glXEnumerateVideoCaptureDevicesNV = (PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC) load("glXEnumerateVideoCaptureDevicesNV", userptr); glXBindVideoCaptureDeviceNV = (PFNGLXBINDVIDEOCAPTUREDEVICENVPROC) load("glXBindVideoCaptureDeviceNV", userptr); glXLockVideoCaptureDeviceNV = (PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC) load("glXLockVideoCaptureDeviceNV", userptr); glXReleaseVideoCaptureDeviceNV = (PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC) load("glXReleaseVideoCaptureDeviceNV", userptr); } static void load_GLX_NV_swap_group( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_NV_swap_group) return; glXQueryFrameCountNV = (PFNGLXQUERYFRAMECOUNTNVPROC) load("glXQueryFrameCountNV", userptr); glXQueryMaxSwapGroupsNV = (PFNGLXQUERYMAXSWAPGROUPSNVPROC) load("glXQueryMaxSwapGroupsNV", userptr); glXResetFrameCountNV = (PFNGLXRESETFRAMECOUNTNVPROC) load("glXResetFrameCountNV", userptr); glXJoinSwapGroupNV = (PFNGLXJOINSWAPGROUPNVPROC) load("glXJoinSwapGroupNV", userptr); glXBindSwapBarrierNV = (PFNGLXBINDSWAPBARRIERNVPROC) load("glXBindSwapBarrierNV", userptr); glXQuerySwapGroupNV = (PFNGLXQUERYSWAPGROUPNVPROC) load("glXQuerySwapGroupNV", userptr); } static void load_GLX_EXT_texture_from_pixmap( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_EXT_texture_from_pixmap) return; glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC) load("glXReleaseTexImageEXT", userptr); glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC) load("glXBindTexImageEXT", userptr); } static void load_GLX_SUN_get_transparent_index( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_SUN_get_transparent_index) return; glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC) load("glXGetTransparentIndexSUN", userptr); } static void load_GLX_MESA_release_buffers( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_MESA_release_buffers) return; glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC) load("glXReleaseBuffersMESA", userptr); } static void load_GLX_NV_delay_before_swap( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_NV_delay_before_swap) return; glXDelayBeforeSwapNV = (PFNGLXDELAYBEFORESWAPNVPROC) load("glXDelayBeforeSwapNV", userptr); } static void load_GLX_MESA_agp_offset( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_MESA_agp_offset) return; glXGetAGPOffsetMESA = (PFNGLXGETAGPOFFSETMESAPROC) load("glXGetAGPOffsetMESA", userptr); } static void load_GLX_SGI_swap_control( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_SGI_swap_control) return; glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC) load("glXSwapIntervalSGI", userptr); } static void load_GLX_EXT_import_context( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_EXT_import_context) return; glXGetCurrentDisplayEXT = (PFNGLXGETCURRENTDISPLAYEXTPROC) load("glXGetCurrentDisplayEXT", userptr); glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC) load("glXImportContextEXT", userptr); glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC) load("glXFreeContextEXT", userptr); glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC) load("glXGetContextIDEXT", userptr); glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC) load("glXQueryContextInfoEXT", userptr); } static void load_GLX_SGI_video_sync( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_SGI_video_sync) return; glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC) load("glXGetVideoSyncSGI", userptr); glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC) load("glXWaitVideoSyncSGI", userptr); } static void load_GLX_SGI_cushion( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_SGI_cushion) return; glXCushionSGI = (PFNGLXCUSHIONSGIPROC) load("glXCushionSGI", userptr); } static void load_GLX_SGIX_fbconfig( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_SGIX_fbconfig) return; glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC) load("glXGetFBConfigAttribSGIX", userptr); glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) load("glXCreateGLXPixmapWithConfigSGIX", userptr); glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) load("glXCreateContextWithConfigSGIX", userptr); glXGetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) load("glXGetVisualFromFBConfigSGIX", userptr); glXChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC) load("glXChooseFBConfigSGIX", userptr); glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) load("glXGetFBConfigFromVisualSGIX", userptr); } static void load_GLX_NV_copy_buffer( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_NV_copy_buffer) return; glXNamedCopyBufferSubDataNV = (PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC) load("glXNamedCopyBufferSubDataNV", userptr); glXCopyBufferSubDataNV = (PFNGLXCOPYBUFFERSUBDATANVPROC) load("glXCopyBufferSubDataNV", userptr); } static void load_GLX_ARB_create_context( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_ARB_create_context) return; glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC) load("glXCreateContextAttribsARB", userptr); } static void load_GLX_AMD_gpu_association( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_AMD_gpu_association) return; glXCreateAssociatedContextAttribsAMD = (PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) load("glXCreateAssociatedContextAttribsAMD", userptr); glXBlitContextFramebufferAMD = (PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC) load("glXBlitContextFramebufferAMD", userptr); glXGetCurrentAssociatedContextAMD = (PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC) load("glXGetCurrentAssociatedContextAMD", userptr); glXGetContextGPUIDAMD = (PFNGLXGETCONTEXTGPUIDAMDPROC) load("glXGetContextGPUIDAMD", userptr); glXMakeAssociatedContextCurrentAMD = (PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) load("glXMakeAssociatedContextCurrentAMD", userptr); glXGetGPUIDsAMD = (PFNGLXGETGPUIDSAMDPROC) load("glXGetGPUIDsAMD", userptr); glXCreateAssociatedContextAMD = (PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC) load("glXCreateAssociatedContextAMD", userptr); glXDeleteAssociatedContextAMD = (PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC) load("glXDeleteAssociatedContextAMD", userptr); glXGetGPUInfoAMD = (PFNGLXGETGPUINFOAMDPROC) load("glXGetGPUInfoAMD", userptr); } static void load_GLX_MESA_query_renderer( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_MESA_query_renderer) return; glXQueryCurrentRendererStringMESA = (PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC) load("glXQueryCurrentRendererStringMESA", userptr); glXQueryCurrentRendererIntegerMESA = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC) load("glXQueryCurrentRendererIntegerMESA", userptr); glXQueryRendererStringMESA = (PFNGLXQUERYRENDERERSTRINGMESAPROC) load("glXQueryRendererStringMESA", userptr); glXQueryRendererIntegerMESA = (PFNGLXQUERYRENDERERINTEGERMESAPROC) load("glXQueryRendererIntegerMESA", userptr); } static void load_GLX_MESA_swap_control( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_MESA_swap_control) return; glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC) load("glXGetSwapIntervalMESA", userptr); glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC) load("glXSwapIntervalMESA", userptr); } static void load_GLX_SGIX_video_resize( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_SGIX_video_resize) return; glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC) load("glXBindChannelToWindowSGIX", userptr); glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC) load("glXChannelRectSyncSGIX", userptr); glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC) load("glXQueryChannelDeltasSGIX", userptr); glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC) load("glXQueryChannelRectSGIX", userptr); glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC) load("glXChannelRectSGIX", userptr); } static void load_GLX_NV_video_out( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_NV_video_out) return; glXGetVideoInfoNV = (PFNGLXGETVIDEOINFONVPROC) load("glXGetVideoInfoNV", userptr); glXSendPbufferToVideoNV = (PFNGLXSENDPBUFFERTOVIDEONVPROC) load("glXSendPbufferToVideoNV", userptr); glXReleaseVideoImageNV = (PFNGLXRELEASEVIDEOIMAGENVPROC) load("glXReleaseVideoImageNV", userptr); glXBindVideoImageNV = (PFNGLXBINDVIDEOIMAGENVPROC) load("glXBindVideoImageNV", userptr); glXReleaseVideoDeviceNV = (PFNGLXRELEASEVIDEODEVICENVPROC) load("glXReleaseVideoDeviceNV", userptr); glXGetVideoDeviceNV = (PFNGLXGETVIDEODEVICENVPROC) load("glXGetVideoDeviceNV", userptr); } static void load_GLX_MESA_set_3dfx_mode( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_MESA_set_3dfx_mode) return; glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC) load("glXSet3DfxModeMESA", userptr); } static void load_GLX_ARB_get_proc_address( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_ARB_get_proc_address) return; glXGetProcAddressARB = (PFNGLXGETPROCADDRESSARBPROC) load("glXGetProcAddressARB", userptr); } static void load_GLX_NV_copy_image( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_NV_copy_image) return; glXCopyImageSubDataNV = (PFNGLXCOPYIMAGESUBDATANVPROC) load("glXCopyImageSubDataNV", userptr); } static void load_GLX_NV_present_video( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_NV_present_video) return; glXBindVideoDeviceNV = (PFNGLXBINDVIDEODEVICENVPROC) load("glXBindVideoDeviceNV", userptr); glXEnumerateVideoDevicesNV = (PFNGLXENUMERATEVIDEODEVICESNVPROC) load("glXEnumerateVideoDevicesNV", userptr); } static void load_GLX_SGIX_swap_barrier( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_SGIX_swap_barrier) return; glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC) load("glXBindSwapBarrierSGIX", userptr); glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) load("glXQueryMaxSwapBarriersSGIX", userptr); } static void load_GLX_SGIX_swap_group( GLADuserptrloadfunc load, void* userptr) { if(!GLAD_GLX_SGIX_swap_group) return; glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC) load("glXJoinSwapGroupSGIX", userptr); } static int has_ext(Display *display, int screen, const char *ext) { const char *terminator; const char *loc; const char *extensions; if(!GLAD_GLX_VERSION_1_1) return 0; extensions = glXQueryExtensionsString(display, screen); if(extensions == NULL || ext == NULL) return 0; while(1) { loc = strstr(extensions, ext); if(loc == NULL) break; terminator = loc + strlen(ext); if((loc == extensions || *(loc - 1) == ' ') && (*terminator == ' ' || *terminator == '\0')) { return 1; } extensions = terminator; } return 0; } static GLADapiproc glad_glx_get_proc_from_userptr(const char* name, void *userptr) { return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); } static int find_extensionsGLX(Display *display, int screen) { GLAD_GLX_MESA_copy_sub_buffer = has_ext(display, screen, "GLX_MESA_copy_sub_buffer"); GLAD_GLX_EXT_create_context_es_profile = has_ext(display, screen, "GLX_EXT_create_context_es_profile"); GLAD_GLX_SGIX_pbuffer = has_ext(display, screen, "GLX_SGIX_pbuffer"); GLAD_GLX_SGI_make_current_read = has_ext(display, screen, "GLX_SGI_make_current_read"); GLAD_GLX_OML_sync_control = has_ext(display, screen, "GLX_OML_sync_control"); GLAD_GLX_SGIX_hyperpipe = has_ext(display, screen, "GLX_SGIX_hyperpipe"); GLAD_GLX_INTEL_swap_event = has_ext(display, screen, "GLX_INTEL_swap_event"); GLAD_GLX_EXT_swap_control = has_ext(display, screen, "GLX_EXT_swap_control"); GLAD_GLX_NV_robustness_video_memory_purge = has_ext(display, screen, "GLX_NV_robustness_video_memory_purge"); GLAD_GLX_MESA_pixmap_colormap = has_ext(display, screen, "GLX_MESA_pixmap_colormap"); GLAD_GLX_ARB_fbconfig_float = has_ext(display, screen, "GLX_ARB_fbconfig_float"); GLAD_GLX_EXT_fbconfig_packed_float = has_ext(display, screen, "GLX_EXT_fbconfig_packed_float"); GLAD_GLX_OML_swap_method = has_ext(display, screen, "GLX_OML_swap_method"); GLAD_GLX_NV_video_capture = has_ext(display, screen, "GLX_NV_video_capture"); GLAD_GLX_ARB_robustness_application_isolation = has_ext(display, screen, "GLX_ARB_robustness_application_isolation"); GLAD_GLX_ARB_create_context_robustness = has_ext(display, screen, "GLX_ARB_create_context_robustness"); GLAD_GLX_EXT_visual_rating = has_ext(display, screen, "GLX_EXT_visual_rating"); GLAD_GLX_NV_swap_group = has_ext(display, screen, "GLX_NV_swap_group"); GLAD_GLX_EXT_texture_from_pixmap = has_ext(display, screen, "GLX_EXT_texture_from_pixmap"); GLAD_GLX_SUN_get_transparent_index = has_ext(display, screen, "GLX_SUN_get_transparent_index"); GLAD_GLX_MESA_release_buffers = has_ext(display, screen, "GLX_MESA_release_buffers"); GLAD_GLX_NV_delay_before_swap = has_ext(display, screen, "GLX_NV_delay_before_swap"); GLAD_GLX_EXT_buffer_age = has_ext(display, screen, "GLX_EXT_buffer_age"); GLAD_GLX_MESA_agp_offset = has_ext(display, screen, "GLX_MESA_agp_offset"); GLAD_GLX_EXT_visual_info = has_ext(display, screen, "GLX_EXT_visual_info"); GLAD_GLX_SGI_swap_control = has_ext(display, screen, "GLX_SGI_swap_control"); GLAD_GLX_EXT_import_context = has_ext(display, screen, "GLX_EXT_import_context"); GLAD_GLX_SGI_video_sync = has_ext(display, screen, "GLX_SGI_video_sync"); GLAD_GLX_3DFX_multisample = has_ext(display, screen, "GLX_3DFX_multisample"); GLAD_GLX_ARB_multisample = has_ext(display, screen, "GLX_ARB_multisample"); GLAD_GLX_EXT_framebuffer_sRGB = has_ext(display, screen, "GLX_EXT_framebuffer_sRGB"); GLAD_GLX_SGI_cushion = has_ext(display, screen, "GLX_SGI_cushion"); GLAD_GLX_ARB_robustness_share_group_isolation = has_ext(display, screen, "GLX_ARB_robustness_share_group_isolation"); GLAD_GLX_SGIX_fbconfig = has_ext(display, screen, "GLX_SGIX_fbconfig"); GLAD_GLX_NV_copy_buffer = has_ext(display, screen, "GLX_NV_copy_buffer"); GLAD_GLX_SGIX_visual_select_group = has_ext(display, screen, "GLX_SGIX_visual_select_group"); GLAD_GLX_EXT_swap_control_tear = has_ext(display, screen, "GLX_EXT_swap_control_tear"); GLAD_GLX_ARB_create_context = has_ext(display, screen, "GLX_ARB_create_context"); GLAD_GLX_AMD_gpu_association = has_ext(display, screen, "GLX_AMD_gpu_association"); GLAD_GLX_MESA_query_renderer = has_ext(display, screen, "GLX_MESA_query_renderer"); GLAD_GLX_EXT_create_context_es2_profile = has_ext(display, screen, "GLX_EXT_create_context_es2_profile"); GLAD_GLX_MESA_swap_control = has_ext(display, screen, "GLX_MESA_swap_control"); GLAD_GLX_SGIX_video_resize = has_ext(display, screen, "GLX_SGIX_video_resize"); GLAD_GLX_ARB_context_flush_control = has_ext(display, screen, "GLX_ARB_context_flush_control"); GLAD_GLX_NV_video_out = has_ext(display, screen, "GLX_NV_video_out"); GLAD_GLX_EXT_no_config_context = has_ext(display, screen, "GLX_EXT_no_config_context"); GLAD_GLX_SGIS_blended_overlay = has_ext(display, screen, "GLX_SGIS_blended_overlay"); GLAD_GLX_EXT_stereo_tree = has_ext(display, screen, "GLX_EXT_stereo_tree"); GLAD_GLX_ARB_create_context_no_error = has_ext(display, screen, "GLX_ARB_create_context_no_error"); GLAD_GLX_EXT_libglvnd = has_ext(display, screen, "GLX_EXT_libglvnd"); GLAD_GLX_ARB_create_context_profile = has_ext(display, screen, "GLX_ARB_create_context_profile"); GLAD_GLX_NV_float_buffer = has_ext(display, screen, "GLX_NV_float_buffer"); GLAD_GLX_MESA_set_3dfx_mode = has_ext(display, screen, "GLX_MESA_set_3dfx_mode"); GLAD_GLX_ARB_framebuffer_sRGB = has_ext(display, screen, "GLX_ARB_framebuffer_sRGB"); GLAD_GLX_ARB_get_proc_address = has_ext(display, screen, "GLX_ARB_get_proc_address"); GLAD_GLX_SGIS_shared_multisample = has_ext(display, screen, "GLX_SGIS_shared_multisample"); GLAD_GLX_NV_copy_image = has_ext(display, screen, "GLX_NV_copy_image"); GLAD_GLX_NV_present_video = has_ext(display, screen, "GLX_NV_present_video"); GLAD_GLX_SGIX_swap_barrier = has_ext(display, screen, "GLX_SGIX_swap_barrier"); GLAD_GLX_SGIS_multisample = has_ext(display, screen, "GLX_SGIS_multisample"); GLAD_GLX_SGIX_swap_group = has_ext(display, screen, "GLX_SGIX_swap_group"); GLAD_GLX_ARB_vertex_buffer_object = has_ext(display, screen, "GLX_ARB_vertex_buffer_object"); GLAD_GLX_NV_multisample_coverage = has_ext(display, screen, "GLX_NV_multisample_coverage"); return 1; } static int find_coreGLX(Display **display, int *screen) { X11Struct x11; initX11Struct(&x11); int major = 0, minor = 0; if(*display == NULL) { *display = x11.XOpenDisplay(0); if (*display == NULL) { return 0; } *screen = x11.XScreenNumberOfScreen(x11.XDefaultScreenOfDisplay(*display)); } glXQueryVersion(*display, &major, &minor); GLAD_GLX_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; GLAD_GLX_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; GLAD_GLX_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; GLAD_GLX_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; GLAD_GLX_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; return GLAD_MAKE_VERSION(major, minor); } int gladLoadGLXUserPtr(Display *display, int screen, GLADuserptrloadfunc load, void *userptr) { int version; glXQueryVersion = (PFNGLXQUERYVERSIONPROC) load("glXQueryVersion", userptr); if(glXQueryVersion == NULL) return 0; version = find_coreGLX(&display, &screen); load_GLX_VERSION_1_0(load, userptr); load_GLX_VERSION_1_1(load, userptr); load_GLX_VERSION_1_2(load, userptr); load_GLX_VERSION_1_3(load, userptr); load_GLX_VERSION_1_4(load, userptr); if (!find_extensionsGLX(display, screen)) return 0; load_GLX_MESA_copy_sub_buffer(load, userptr); load_GLX_SGIX_pbuffer(load, userptr); load_GLX_SGI_make_current_read(load, userptr); load_GLX_OML_sync_control(load, userptr); load_GLX_SGIX_hyperpipe(load, userptr); load_GLX_EXT_swap_control(load, userptr); load_GLX_MESA_pixmap_colormap(load, userptr); load_GLX_NV_video_capture(load, userptr); load_GLX_NV_swap_group(load, userptr); load_GLX_EXT_texture_from_pixmap(load, userptr); load_GLX_SUN_get_transparent_index(load, userptr); load_GLX_MESA_release_buffers(load, userptr); load_GLX_NV_delay_before_swap(load, userptr); load_GLX_MESA_agp_offset(load, userptr); load_GLX_SGI_swap_control(load, userptr); load_GLX_EXT_import_context(load, userptr); load_GLX_SGI_video_sync(load, userptr); load_GLX_SGI_cushion(load, userptr); load_GLX_SGIX_fbconfig(load, userptr); load_GLX_NV_copy_buffer(load, userptr); load_GLX_ARB_create_context(load, userptr); load_GLX_AMD_gpu_association(load, userptr); load_GLX_MESA_query_renderer(load, userptr); load_GLX_MESA_swap_control(load, userptr); load_GLX_SGIX_video_resize(load, userptr); load_GLX_NV_video_out(load, userptr); load_GLX_MESA_set_3dfx_mode(load, userptr); load_GLX_ARB_get_proc_address(load, userptr); load_GLX_NV_copy_image(load, userptr); load_GLX_NV_present_video(load, userptr); load_GLX_SGIX_swap_barrier(load, userptr); load_GLX_SGIX_swap_group(load, userptr); return version; } int gladLoadGLX(Display *display, int screen, GLADloadfunc load) { return gladLoadGLXUserPtr(display, screen, glad_glx_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); } #ifdef GLAD_GLX #ifndef GLAD_LOADER_LIBRARY_C_ #define GLAD_LOADER_LIBRARY_C_ #include #include #if GLAD_PLATFORM_WIN32 #include #else #include #endif static void* glad_get_dlopen_handle(const char *lib_names[], int length) { void *handle = NULL; int i; for (i = 0; i < length; ++i) { #if GLAD_PLATFORM_WIN32 #if GLAD_PLATFORM_UWP size_t buffer_size = (strlen(lib_names[i]) + 1) * sizeof(WCHAR); LPWSTR buffer = (LPWSTR) malloc(buffer_size); if (buffer != NULL) { int ret = MultiByteToWideChar(CP_ACP, 0, lib_names[i], -1, buffer, buffer_size); if (ret != 0) { handle = (void*) LoadPackagedLibrary(buffer, 0); } free((void*) buffer); } #else handle = (void*) LoadLibraryA(lib_names[i]); #endif #else handle = dlopen(lib_names[i], RTLD_LAZY | RTLD_LOCAL); #endif if (handle != NULL) { return handle; } } return NULL; } static void glad_close_dlopen_handle(void* handle) { if (handle != NULL) { #if GLAD_PLATFORM_WIN32 FreeLibrary((HMODULE) handle); #else dlclose(handle); #endif } } static GLADapiproc glad_dlsym_handle(void* handle, const char *name) { if (handle == NULL) { return NULL; } #if GLAD_PLATFORM_WIN32 return (GLADapiproc) GetProcAddress((HMODULE) handle, name); #else return GLAD_GNUC_EXTENSION (GLADapiproc) dlsym(handle, name); #endif } #endif /* GLAD_LOADER_LIBRARY_C_ */ typedef void* (GLAD_API_PTR *GLADglxprocaddrfunc)(const char*); static GLADapiproc glad_glx_get_proc(const char *name, void *userptr) { return GLAD_GNUC_EXTENSION ((GLADapiproc (*)(const char *name)) userptr)(name); } static void* _glx_handle; int gladLoaderLoadGLX(Display *display, int screen) { static const char *NAMES[] = { #if defined __CYGWIN__ "libGL-1.so", #endif "libGL.so.1", "libGL.so" }; int version = 0; int did_load = 0; GLADglxprocaddrfunc loader; if (_glx_handle == NULL) { _glx_handle = glad_get_dlopen_handle(NAMES, sizeof(NAMES) / sizeof(NAMES[0])); did_load = _glx_handle != NULL; } if (_glx_handle != NULL) { loader = (GLADglxprocaddrfunc) glad_dlsym_handle(_glx_handle, "glXGetProcAddressARB"); if (loader != NULL) { version = gladLoadGLXUserPtr(display, screen, glad_glx_get_proc, GLAD_GNUC_EXTENSION (void*) loader); } if (!version && did_load) { glad_close_dlopen_handle(_glx_handle); _glx_handle = NULL; } } return version; } void gladLoaderUnloadGLX() { if (_glx_handle != NULL) { glad_close_dlopen_handle(_glx_handle); _glx_handle = NULL; } } #endif /* GLAD_GLX */ ================================================ FILE: ycb_render/glad/linmath.h ================================================ #ifndef LINMATH_H #define LINMATH_H #include #ifdef _MSC_VER #define inline __inline #endif #define LINMATH_H_DEFINE_VEC(n) \ typedef float vec##n[n]; \ static inline void vec##n##_add(vec##n r, vec##n const a, vec##n const b) \ { \ int i; \ for(i=0; i 1e-4) { mat4x4 T, C, S = {{0}}; vec3_norm(u, u); mat4x4_from_vec3_mul_outer(T, u, u); S[1][2] = u[0]; S[2][1] = -u[0]; S[2][0] = u[1]; S[0][2] = -u[1]; S[0][1] = u[2]; S[1][0] = -u[2]; mat4x4_scale(S, S, s); mat4x4_identity(C); mat4x4_sub(C, C, T); mat4x4_scale(C, C, c); mat4x4_add(T, T, C); mat4x4_add(T, T, S); T[3][3] = 1.; mat4x4_mul(R, M, T); } else { mat4x4_dup(R, M); } } static inline void mat4x4_rotate_X(mat4x4 Q, mat4x4 M, float angle) { float s = sinf(angle); float c = cosf(angle); mat4x4 R = { {1.f, 0.f, 0.f, 0.f}, {0.f, c, s, 0.f}, {0.f, -s, c, 0.f}, {0.f, 0.f, 0.f, 1.f} }; mat4x4_mul(Q, M, R); } static inline void mat4x4_rotate_Y(mat4x4 Q, mat4x4 M, float angle) { float s = sinf(angle); float c = cosf(angle); mat4x4 R = { { c, 0.f, s, 0.f}, { 0.f, 1.f, 0.f, 0.f}, { -s, 0.f, c, 0.f}, { 0.f, 0.f, 0.f, 1.f} }; mat4x4_mul(Q, M, R); } static inline void mat4x4_rotate_Z(mat4x4 Q, mat4x4 M, float angle) { float s = sinf(angle); float c = cosf(angle); mat4x4 R = { { c, s, 0.f, 0.f}, { -s, c, 0.f, 0.f}, { 0.f, 0.f, 1.f, 0.f}, { 0.f, 0.f, 0.f, 1.f} }; mat4x4_mul(Q, M, R); } static inline void mat4x4_invert(mat4x4 T, mat4x4 M) { float idet; float s[6]; float c[6]; s[0] = M[0][0]*M[1][1] - M[1][0]*M[0][1]; s[1] = M[0][0]*M[1][2] - M[1][0]*M[0][2]; s[2] = M[0][0]*M[1][3] - M[1][0]*M[0][3]; s[3] = M[0][1]*M[1][2] - M[1][1]*M[0][2]; s[4] = M[0][1]*M[1][3] - M[1][1]*M[0][3]; s[5] = M[0][2]*M[1][3] - M[1][2]*M[0][3]; c[0] = M[2][0]*M[3][1] - M[3][0]*M[2][1]; c[1] = M[2][0]*M[3][2] - M[3][0]*M[2][2]; c[2] = M[2][0]*M[3][3] - M[3][0]*M[2][3]; c[3] = M[2][1]*M[3][2] - M[3][1]*M[2][2]; c[4] = M[2][1]*M[3][3] - M[3][1]*M[2][3]; c[5] = M[2][2]*M[3][3] - M[3][2]*M[2][3]; /* Assumes it is invertible */ idet = 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] ); T[0][0] = ( M[1][1] * c[5] - M[1][2] * c[4] + M[1][3] * c[3]) * idet; T[0][1] = (-M[0][1] * c[5] + M[0][2] * c[4] - M[0][3] * c[3]) * idet; T[0][2] = ( M[3][1] * s[5] - M[3][2] * s[4] + M[3][3] * s[3]) * idet; T[0][3] = (-M[2][1] * s[5] + M[2][2] * s[4] - M[2][3] * s[3]) * idet; T[1][0] = (-M[1][0] * c[5] + M[1][2] * c[2] - M[1][3] * c[1]) * idet; T[1][1] = ( M[0][0] * c[5] - M[0][2] * c[2] + M[0][3] * c[1]) * idet; T[1][2] = (-M[3][0] * s[5] + M[3][2] * s[2] - M[3][3] * s[1]) * idet; T[1][3] = ( M[2][0] * s[5] - M[2][2] * s[2] + M[2][3] * s[1]) * idet; T[2][0] = ( M[1][0] * c[4] - M[1][1] * c[2] + M[1][3] * c[0]) * idet; T[2][1] = (-M[0][0] * c[4] + M[0][1] * c[2] - M[0][3] * c[0]) * idet; T[2][2] = ( M[3][0] * s[4] - M[3][1] * s[2] + M[3][3] * s[0]) * idet; T[2][3] = (-M[2][0] * s[4] + M[2][1] * s[2] - M[2][3] * s[0]) * idet; T[3][0] = (-M[1][0] * c[3] + M[1][1] * c[1] - M[1][2] * c[0]) * idet; T[3][1] = ( M[0][0] * c[3] - M[0][1] * c[1] + M[0][2] * c[0]) * idet; T[3][2] = (-M[3][0] * s[3] + M[3][1] * s[1] - M[3][2] * s[0]) * idet; T[3][3] = ( M[2][0] * s[3] - M[2][1] * s[1] + M[2][2] * s[0]) * idet; } static inline void mat4x4_orthonormalize(mat4x4 R, mat4x4 M) { float s = 1.; vec3 h; mat4x4_dup(R, M); vec3_norm(R[2], R[2]); s = vec3_mul_inner(R[1], R[2]); vec3_scale(h, R[2], s); vec3_sub(R[1], R[1], h); vec3_norm(R[2], R[2]); s = vec3_mul_inner(R[1], R[2]); vec3_scale(h, R[2], s); vec3_sub(R[1], R[1], h); vec3_norm(R[1], R[1]); s = vec3_mul_inner(R[0], R[1]); vec3_scale(h, R[1], s); vec3_sub(R[0], R[0], h); vec3_norm(R[0], R[0]); } static inline void mat4x4_frustum(mat4x4 M, float l, float r, float b, float t, float n, float f) { M[0][0] = 2.f*n/(r-l); M[0][1] = M[0][2] = M[0][3] = 0.f; M[1][1] = 2.f*n/(t-b); M[1][0] = M[1][2] = M[1][3] = 0.f; M[2][0] = (r+l)/(r-l); M[2][1] = (t+b)/(t-b); M[2][2] = -(f+n)/(f-n); M[2][3] = -1.f; M[3][2] = -2.f*(f*n)/(f-n); M[3][0] = M[3][1] = M[3][3] = 0.f; } static inline void mat4x4_ortho(mat4x4 M, float l, float r, float b, float t, float n, float f) { M[0][0] = 2.f/(r-l); M[0][1] = M[0][2] = M[0][3] = 0.f; M[1][1] = 2.f/(t-b); M[1][0] = M[1][2] = M[1][3] = 0.f; M[2][2] = -2.f/(f-n); M[2][0] = M[2][1] = M[2][3] = 0.f; M[3][0] = -(r+l)/(r-l); M[3][1] = -(t+b)/(t-b); M[3][2] = -(f+n)/(f-n); M[3][3] = 1.f; } static inline void mat4x4_perspective(mat4x4 m, float y_fov, float aspect, float n, float f) { /* NOTE: Degrees are an unhandy unit to work with. * linmath.h uses radians for everything! */ float const a = 1.f / (float) tan(y_fov / 2.f); m[0][0] = a / aspect; m[0][1] = 0.f; m[0][2] = 0.f; m[0][3] = 0.f; m[1][0] = 0.f; m[1][1] = a; m[1][2] = 0.f; m[1][3] = 0.f; m[2][0] = 0.f; m[2][1] = 0.f; m[2][2] = -((f + n) / (f - n)); m[2][3] = -1.f; m[3][0] = 0.f; m[3][1] = 0.f; m[3][2] = -((2.f * f * n) / (f - n)); m[3][3] = 0.f; } static inline void mat4x4_look_at(mat4x4 m, vec3 eye, vec3 center, vec3 up) { /* Adapted from Android's OpenGL Matrix.java. */ /* See the OpenGL GLUT documentation for gluLookAt for a description */ /* of the algorithm. We implement it in a straightforward way: */ /* TODO: The negation of of can be spared by swapping the order of * operands in the following cross products in the right way. */ vec3 f; vec3 s; vec3 t; vec3_sub(f, center, eye); vec3_norm(f, f); vec3_mul_cross(s, f, up); vec3_norm(s, s); vec3_mul_cross(t, s, f); m[0][0] = s[0]; m[0][1] = t[0]; m[0][2] = -f[0]; m[0][3] = 0.f; m[1][0] = s[1]; m[1][1] = t[1]; m[1][2] = -f[1]; m[1][3] = 0.f; m[2][0] = s[2]; m[2][1] = t[2]; m[2][2] = -f[2]; m[2][3] = 0.f; m[3][0] = 0.f; m[3][1] = 0.f; m[3][2] = 0.f; m[3][3] = 1.f; mat4x4_translate_in_place(m, -eye[0], -eye[1], -eye[2]); } typedef float quat[4]; static inline void quat_identity(quat q) { q[0] = q[1] = q[2] = 0.f; q[3] = 1.f; } static inline void quat_add(quat r, quat a, quat b) { int i; for(i=0; i<4; ++i) r[i] = a[i] + b[i]; } static inline void quat_sub(quat r, quat a, quat b) { int i; for(i=0; i<4; ++i) r[i] = a[i] - b[i]; } static inline void quat_mul(quat r, quat p, quat q) { vec3 w; vec3_mul_cross(r, p, q); vec3_scale(w, p, q[3]); vec3_add(r, r, w); vec3_scale(w, q, p[3]); vec3_add(r, r, w); r[3] = p[3]*q[3] - vec3_mul_inner(p, q); } static inline void quat_scale(quat r, quat v, float s) { int i; for(i=0; i<4; ++i) r[i] = v[i] * s; } static inline float quat_inner_product(quat a, quat b) { float p = 0.f; int i; for(i=0; i<4; ++i) p += b[i]*a[i]; return p; } static inline void quat_conj(quat r, quat q) { int i; for(i=0; i<3; ++i) r[i] = -q[i]; r[3] = q[3]; } static inline void quat_rotate(quat r, float angle, vec3 axis) { int i; vec3 v; vec3_scale(v, axis, sinf(angle / 2)); for(i=0; i<3; ++i) r[i] = v[i]; r[3] = cosf(angle / 2); } #define quat_norm vec4_norm static inline void quat_mul_vec3(vec3 r, quat q, vec3 v) { /* * Method by Fabian 'ryg' Giessen (of Farbrausch) t = 2 * cross(q.xyz, v) v' = v + q.w * t + cross(q.xyz, t) */ vec3 t = {q[0], q[1], q[2]}; vec3 u = {q[0], q[1], q[2]}; vec3_mul_cross(t, t, v); vec3_scale(t, t, 2); vec3_mul_cross(u, u, t); vec3_scale(t, t, q[3]); vec3_add(r, v, t); vec3_add(r, r, u); } static inline void mat4x4_from_quat(mat4x4 M, quat q) { float a = q[3]; float b = q[0]; float c = q[1]; float d = q[2]; float a2 = a*a; float b2 = b*b; float c2 = c*c; float d2 = d*d; M[0][0] = a2 + b2 - c2 - d2; M[0][1] = 2.f*(b*c + a*d); M[0][2] = 2.f*(b*d - a*c); M[0][3] = 0.f; M[1][0] = 2*(b*c - a*d); M[1][1] = a2 - b2 + c2 - d2; M[1][2] = 2.f*(c*d + a*b); M[1][3] = 0.f; M[2][0] = 2.f*(b*d + a*c); M[2][1] = 2.f*(c*d - a*b); M[2][2] = a2 - b2 - c2 + d2; M[2][3] = 0.f; M[3][0] = M[3][1] = M[3][2] = 0.f; M[3][3] = 1.f; } static inline void mat4x4o_mul_quat(mat4x4 R, mat4x4 M, quat q) { /* XXX: The way this is written only works for othogonal matrices. */ /* TODO: Take care of non-orthogonal case. */ quat_mul_vec3(R[0], q, M[0]); quat_mul_vec3(R[1], q, M[1]); quat_mul_vec3(R[2], q, M[2]); R[3][0] = R[3][1] = R[3][2] = 0.f; R[3][3] = 1.f; } static inline void quat_from_mat4x4(quat q, mat4x4 M) { float r=0.f; int i; int perm[] = { 0, 1, 2, 0, 1 }; int *p = perm; for(i = 0; i<3; i++) { float m = M[i][i]; if( m < r ) continue; m = r; p = &perm[i]; } r = (float) sqrt(1.f + M[p[0]][p[0]] - M[p[1]][p[1]] - M[p[2]][p[2]] ); if(r < 1e-6) { q[0] = 1.f; q[1] = q[2] = q[3] = 0.f; return; } q[0] = r/2.f; q[1] = (M[p[0]][p[1]] - M[p[1]][p[0]])/(2.f*r); q[2] = (M[p[2]][p[0]] - M[p[0]][p[2]])/(2.f*r); q[3] = (M[p[2]][p[1]] - M[p[1]][p[2]])/(2.f*r); } #endif ================================================ FILE: ycb_render/glutils/__init__.py ================================================ ================================================ FILE: ycb_render/glutils/_trackball.py ================================================ # -*- coding: utf-8 -*- # # Copyright (c) 2014 Nicolas Rougier # 2008 Roger Allen # 1993, 1994, Silicon Graphics, Inc. # ALL RIGHTS RESERVED # Permission to use, copy, modify, and distribute this software for # any purpose and without fee is hereby granted, provided that the above # copyright notice appear in all copies and that both the copyright notice # and this permission notice appear in supporting documentation, and that # the name of Silicon Graphics, Inc. not be used in advertising # or publicity pertaining to distribution of the software without specific, # written prior permission. # # THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" # AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, # INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR # FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON # GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, # SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY # KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, # LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF # THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN # ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON # ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE # POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. # # US Government Users Restricted Rights # Use, duplication, or disclosure by the Government is subject to # restrictions set forth in FAR 52.227.19(c)(2) or subparagraph # (c)(1)(ii) of the Rights in Technical Data and Computer Software # clause at DFARS 252.227-7013 and/or in similar or successor # clauses in the FAR or the DOD or NASA FAR Supplement. # Unpublished-- rights reserved under the copyright laws of the # United States. Contractor/manufacturer is Silicon Graphics, # Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. # # Originally implemented by Gavin Bell, lots of ideas from Thant Tessman # and the August '88 issue of Siggraph's "Computer Graphics," pp. 121-129. # and David M. Ciemiewicz, Mark Grossman, Henry Moreton, and Paul Haeberli # # Note: See the following for more information on quaternions: # # - Shoemake, K., Animating rotation with quaternion curves, Computer # Graphics 19, No 3 (Proc. SIGGRAPH'85), 245-254, 1985. # - Pletinckx, D., Quaternion calculus as a basic tool in computer # graphics, The Visual Computer 5, 2-13, 1989. # ----------------------------------------------------------------------------- ''' Provides a virtual trackball for 3D scene viewing Example usage: trackball = Trackball(45,30) @window.event def on_mouse_drag(x, y, dx, dy, button): trackball.drag(x,y,dx,dy) @window.event def on_resize(width,height): glViewport(0, 0, window.width, window.height) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(45, window.width / float(window.height), .1, 1000) glMatrixMode (GL_MODELVIEW) glLoadIdentity () glTranslatef (0, 0, -3) glMultMatrixf(trackball.model) You can also set trackball orientation directly by setting theta and phi value expressed in degrees. Theta relates to the rotation angle around X axis while phi relates to the rotation angle around Z axis. ''' import math import numpy as np # Some useful functions on vectors # ----------------------------------------------------------------------------- def _v_add(v1, v2): return [v1[0]+v2[0], v1[1]+v2[1], v1[2]+v2[2]] def _v_sub(v1, v2): return [v1[0]-v2[0], v1[1]-v2[1], v1[2]-v2[2]] def _v_mul(v, s): return [v[0]*s, v[1]*s, v[2]*s] def _v_dot(v1, v2): return v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2] def _v_cross(v1, v2): return [(v1[1]*v2[2]) - (v1[2]*v2[1]), (v1[2]*v2[0]) - (v1[0]*v2[2]), (v1[0]*v2[1]) - (v1[1]*v2[0])] def _v_length(v): return math.sqrt(_v_dot(v,v)) def _v_normalize(v): try: return _v_mul(v,1.0/_v_length(v)) except ZeroDivisionError: return v # Some useful functions on quaternions # ----------------------------------------------------------------------------- def _q_add(q1,q2): t1 = _v_mul(q1, q2[3]) t2 = _v_mul(q2, q1[3]) t3 = _v_cross(q2, q1) tf = _v_add(t1, t2) tf = _v_add(t3, tf) tf.append(q1[3]*q2[3]-_v_dot(q1,q2)) return tf def _q_mul(q, s): return [q[0]*s, q[1]*s, q[2]*s, q[3]*s] def _q_dot(q1, q2): return q1[0]*q2[0] + q1[1]*q2[1] + q1[2]*q2[2] + q1[3]*q2[3] def _q_length(q): return math.sqrt(_q_dot(q,q)) def _q_normalize(q): try: return _q_mul(q,1.0/_q_length(q)) except ZeroDivisionError: return q def _q_from_axis_angle(v, phi): q = _v_mul(_v_normalize(v), math.sin(phi/2.0)) q.append(math.cos(phi/2.0)) return q def _q_rotmatrix(q): m = np.zeros(16,np.float32) m[0*4+0] = 1.0 - 2.0*(q[1]*q[1] + q[2]*q[2]) m[0*4+1] = 2.0 * (q[0]*q[1] - q[2]*q[3]) m[0*4+2] = 2.0 * (q[2]*q[0] + q[1]*q[3]) m[0*4+3] = 0.0 m[1*4+0] = 2.0 * (q[0]*q[1] + q[2]*q[3]) m[1*4+1] = 1.0 - 2.0*(q[2]*q[2] + q[0]*q[0]) m[1*4+2] = 2.0 * (q[1]*q[2] - q[0]*q[3]) m[1*4+3] = 0.0 m[2*4+0] = 2.0 * (q[2]*q[0] - q[1]*q[3]) m[2*4+1] = 2.0 * (q[1]*q[2] + q[0]*q[3]) m[2*4+2] = 1.0 - 2.0*(q[1]*q[1] + q[0]*q[0]) m[3*4+3] = 1.0 return m.reshape(4,4) class Trackball(object): """ Virtual trackball for 3D scene viewing """ def __init__(self, theta=0, phi=0): """ Build a new trackball with specified view """ self._rotation = [0,0,0,1] self._count = 0 self._model = np.zeros((4,4),np.float32) self._RENORMCOUNT = 97 self._TRACKBALLSIZE = 0.8 self._set_orientation(theta,phi) self._x = 0.0 self._y = 0.0 def drag_to (self, x, y, dx, dy): """ Move trackball view from x,y to x+dx,y+dy. """ q = self._rotate(x,y,dx,dy) self._rotation = _q_add(q,self._rotation) self._count += 1 if self._count > self._RENORMCOUNT: self._rotation = _q_normalize(self._rotation) self._count = 0 self._model = _q_rotmatrix(self._rotation) @property def model(self): """ Model transformation (read-only) """ return self._model @property def theta(self): """ Angle (in degrees) around the z axis """ self._theta, _ = self._get_orientation() return self._theta @theta.setter def theta(self, theta): self._set_orientation(math.fmod(theta,360.0), math.fmod(self._phi,360.0)) @property def phi(self): """ Angle (in degrees) around the x axis """ _, self._phi = self._get_orientation() return self._phi @phi.setter def phi(self, phi): self._set_orientation(math.fmod(self._theta,360.), math.fmod(phi,360.0)) def _get_orientation(self): ''' Return current computed orientation (theta,phi). ''' q0,q1,q2,q3 = self._rotation ax = math.atan(2*(q0*q1+q2*q3)/(1-2*(q1*q1+q2*q2)))*180.0/math.pi az = math.atan(2*(q0*q3+q1*q2)/(1-2*(q2*q2+q3*q3)))*180.0/math.pi return -az,ax def _set_orientation(self, theta, phi): ''' Computes rotation corresponding to theta and phi. ''' self._theta = theta self._phi = phi angle = self._theta*(math.pi/180.0) sine = math.sin(0.5*angle) xrot = [1*sine, 0, 0, math.cos(0.5*angle)] angle = self._phi*(math.pi/180.0) sine = math.sin(0.5*angle); zrot = [0, 0, sine, math.cos(0.5*angle)] self._rotation = _q_add(xrot, zrot) self._model = _q_rotmatrix(self._rotation) def _project(self, r, x, y): ''' Project an x,y pair onto a sphere of radius r OR a hyperbolic sheet if we are away from the center of the sphere. ''' d = math.sqrt(x*x + y*y) if (d < r * 0.70710678118654752440): # Inside sphere z = math.sqrt(r*r - d*d) else: # On hyperbola t = r / 1.41421356237309504880 z = t*t / d return z def _rotate(self, x, y, dx, dy): ''' Simulate a track-ball. Project the points onto the virtual trackball, then figure out the axis of rotation, which is the cross product of x,y and x+dx,y+dy. Note: This is a deformed trackball-- this is a trackball in the center, but is deformed into a hyperbolic sheet of rotation away from the center. This particular function was chosen after trying out several variations. ''' if not dx and not dy: return [ 0.0, 0.0, 0.0, 1.0] last = [x, y, self._project(self._TRACKBALLSIZE, x, y)] new = [x+dx, y+dy, self._project(self._TRACKBALLSIZE, x+dx, y+dy)] a = _v_cross(new, last) d = _v_sub(last, new) t = _v_length(d) / (2.0*self._TRACKBALLSIZE) if (t > 1.0): t = 1.0 if (t < -1.0): t = -1.0 phi = 2.0 * math.asin(t) return _q_from_axis_angle(a,phi) ================================================ FILE: ycb_render/glutils/glcontext.py ================================================ """Headless GPU-accelerated OpenGL context creation on Google Colaboratory. Typical usage: # Optional PyOpenGL configuratiopn can be done here. # import OpenGL # OpenGL.ERROR_CHECKING = True # 'glcontext' must be imported before any OpenGL.* API. from lucid.misc.gl.glcontext import create_opengl_context # Now it's safe to import OpenGL and EGL functions import OpenGL.GL as gl # create_opengl_context() creates a GL context that is attached to an # offscreen surface of the specified size. Note that rendering to buffers # of other sizes and formats is still possible with OpenGL Framebuffers. # # Users are expected to directly use the EGL API in case more advanced # context management is required. width, height = 640, 480 create_opengl_context((width, height)) # OpenGL context is available here. """ from __future__ import print_function # pylint: disable=unused-import,g-import-not-at-top,g-statement-before-imports import os os.environ['PYOPENGL_PLATFORM'] = 'egl' try: import OpenGL except: print('This module depends on PyOpenGL.') print('Please run "\033[1m!pip install -q pyopengl\033[0m" ' 'prior importing this module.') raise import ctypes from ctypes import pointer from ctypes import util from ctypes.util import find_library # OpenGL loading workaround. # # * PyOpenGL tries to load libGL, but we need libOpenGL, see [1,2]. # This could have been solved by a symlink libGL->libOpenGL, but: # # * Python 2.7 can't find libGL and linEGL due to a bug (see [3]) # in ctypes.util, that was only wixed in Python 3.6. # # So, the only solution I've found is to monkeypatch ctypes.util # [1] https://devblogs.nvidia.com/egl-eye-opengl-visualization-without-x-server/ # [2] https://devblogs.nvidia.com/linking-opengl-server-side-rendering/ # [3] https://bugs.python.org/issue9998 _find_library_old = ctypes.util.find_library try: def _find_library_new(name): return { 'GL': 'libOpenGL.so', 'EGL': 'libEGL.so', }.get(name, _find_library_old(name)) ctypes.util.find_library = _find_library_new import OpenGL.GL as gl import OpenGL.EGL as egl except: print('Unable to load OpenGL libraries. ' 'Make sure you use GPU-enabled backend.') print('Press "Runtime->Change runtime type" and set ' '"Hardware accelerator" to GPU.') raise finally: ctypes.util.find_library = _find_library_old class Context: def __init__(self): pass def create_opengl_context(self, surface_size=(640, 480)): """Create offscreen OpenGL context and make it current. Users are expected to directly use EGL API in case more advanced context management is required. Args: surface_size: (width, height), size of the offscreen rendering surface. """ egl_display = egl.eglGetDisplay(egl.EGL_DEFAULT_DISPLAY) major, minor = egl.EGLint(), egl.EGLint() egl.eglInitialize(egl_display, pointer(major), pointer(minor)) config_attribs = [ egl.EGL_SURFACE_TYPE, egl.EGL_PBUFFER_BIT, egl.EGL_BLUE_SIZE, 8, egl.EGL_GREEN_SIZE, 8, egl.EGL_RED_SIZE, 8, egl.EGL_DEPTH_SIZE, 24, egl.EGL_RENDERABLE_TYPE, egl.EGL_OPENGL_BIT, egl.EGL_NONE ] # if need MSAA https://www.khronos.org/opengl/wiki/Multisampling config_attribs = (egl.EGLint * len(config_attribs))(*config_attribs) num_configs = egl.EGLint() egl_cfg = egl.EGLConfig() egl.eglChooseConfig(egl_display, config_attribs, pointer(egl_cfg), 1, pointer(num_configs)) width, height = surface_size pbuffer_attribs = [ egl.EGL_WIDTH, width, egl.EGL_HEIGHT, height, egl.EGL_NONE, ] pbuffer_attribs = (egl.EGLint * len(pbuffer_attribs))(*pbuffer_attribs) egl_surf = egl.eglCreatePbufferSurface(egl_display, egl_cfg, pbuffer_attribs) egl.eglBindAPI(egl.EGL_OPENGL_API) egl_context = egl.eglCreateContext(egl_display, egl_cfg, egl.EGL_NO_CONTEXT, None) egl.eglMakeCurrent(egl_display, egl_surf, egl_surf, egl_context) self.display = egl_display def destroy(self): egl.eglTerminate(self.display) ================================================ FILE: ycb_render/glutils/glrenderer.py ================================================ """OpenGL Mesh rendering utils.""" from contextlib import contextmanager import numpy as np import OpenGL.GL as gl from .meshutil import perspective from PIL import Image import numpy as np class GLObject(object): def __del__(self): self.release() def __enter__(self): bind_func, const = self._bind bind_func(const, self) def __exit__(self, *args): bind_func, const = self._bind bind_func(const, 0) class FBO(GLObject): _bind = gl.glBindFramebuffer, gl.GL_FRAMEBUFFER def __init__(self): self._as_parameter_ = gl.glGenFramebuffers(1) def release(self): gl.glDeleteFramebuffers(1, [self._as_parameter_]) class Texture(GLObject): _bind = gl.glBindTexture, gl.GL_TEXTURE_2D def __init__(self): self._as_parameter_ = gl.glGenTextures(1) def release(self): gl.glDeleteTextures([self._as_parameter_]) class Shader(GLObject): def __init__(self, vp_code, fp_code): # Importing here, when gl context is already present. # Otherwise get expection on Python3 because of PyOpenGL bug. from OpenGL.GL import shaders self._as_parameter_ = self._shader = shaders.compileProgram( shaders.compileShader(vp_code, gl.GL_VERTEX_SHADER), shaders.compileShader(fp_code, gl.GL_FRAGMENT_SHADER) ) self._uniforms = {} def release(self): gl.glDeleteProgram(self._as_parameter_) def __getitem__(self, uniform_name): if uniform_name not in self._uniforms: self._uniforms[uniform_name] = gl.glGetUniformLocation(self, uniform_name) return self._uniforms[uniform_name] def __enter__(self): return self._shader.__enter__() def __exit__(self, *args): return self._shader.__exit__(*args) class MeshRenderer(object): def __init__(self, size): self.size = size self.fbo = FBO() self.color_tex = Texture() self.depth_tex = Texture() w, h = size with self.color_tex: gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA32F, w, h, 0, gl.GL_RGBA, gl.GL_FLOAT, None) with self.depth_tex: gl.glTexImage2D.wrappedOperation( gl.GL_TEXTURE_2D, 0, gl.GL_DEPTH24_STENCIL8, w, h, 0, gl.GL_DEPTH_STENCIL, gl.GL_UNSIGNED_INT_24_8, None) with self.fbo: gl.glFramebufferTexture2D(gl.GL_FRAMEBUFFER, gl.GL_COLOR_ATTACHMENT0, gl.GL_TEXTURE_2D, self.color_tex, 0) gl.glFramebufferTexture2D(gl.GL_FRAMEBUFFER, gl.GL_DEPTH_STENCIL_ATTACHMENT, gl.GL_TEXTURE_2D, self.depth_tex, 0) gl.glViewport(0, 0, w, h) assert gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER) == gl.GL_FRAMEBUFFER_COMPLETE self.shader = Shader(vp_code=''' #version 130 uniform mat4 MVP; in vec4 data; out vec4 aData; void main() { aData = data; gl_Position = MVP * gl_Vertex; } ''', fp_code=''' #version 130 in vec4 aData; out vec4 fragColor; void main() { fragColor = aData; } ''') self.fovy = 10.0 self.aspect = 1.0 * w / h self.znear, self.zfar = 0.01, 100.0 @contextmanager def _bind_attrib(self, i, arr): if arr is None: yield return arr = np.ascontiguousarray(arr, np.float32) coord_n = arr.shape[-1] gl.glEnableVertexAttribArray(i) gl.glVertexAttribPointer(i, coord_n, gl.GL_FLOAT, gl.GL_FALSE, 0, arr) yield gl.glDisableVertexAttribArray(i) def proj_matrix(self): return perspective(self.fovy, self.aspect, self.znear, self.zfar) def render_mesh(self, position, uv, face=None, clear_color=[0, 0, 0, 0], modelview=np.eye(4)): MVP = modelview.T.dot(self.proj_matrix()) MVP = np.ascontiguousarray(MVP, np.float32) position = np.ascontiguousarray(position, np.float32) with self.fbo: gl.glClearColor(*clear_color) gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT) with self.shader, self._bind_attrib(0, position), self._bind_attrib(1, uv): gl.glUniformMatrix4fv(self.shader['MVP'], 1, gl.GL_FALSE, MVP) gl.glEnable(gl.GL_DEPTH_TEST) if face is not None: face = np.ascontiguousarray(face, np.uint32) gl.glDrawElements(gl.GL_TRIANGLES, face.size, gl.GL_UNSIGNED_INT, face) else: vert_n = position.size // position.shape[-1] gl.glDrawArrays(gl.GL_TRIANGLES, 0, vert_n) gl.glDisable(gl.GL_DEPTH_TEST) w, h = self.size frame = gl.glReadPixels(0, 0, w, h, gl.GL_RGBA, gl.GL_FLOAT) # from IPython import embed; embed() frame = frame.reshape(h, w, 4) # fix PyOpenGL bug # frame = frame.repeat(4, axis=2) # frame = (1 - frame) * 100 frame = frame[::-1, ::-1] # verical flip to match GL convention return frame def loadTexture(self, path): img = Image.open(path).transpose(Image.FLIP_TOP_BOTTOM) img_data = np.fromstring(img.tostring(), np.uint8) width, height = img.size # glTexImage2D expects the first element of the image data to be the # bottom-left corner of the image. Subsequent elements go left to right, # with subsequent lines going from bottom to top. # However, the image data was created with PIL Image tostring and numpy's # fromstring, which means we have to do a bit of reorganization. The first # element in the data output by tostring() will be the top-left corner of # the image, with following values going left-to-right and lines going # top-to-bottom. So, we need to flip the vertical coordinate (y). texture = gl.glGenTextures(1) gl.glPixelStorei(gl.GL_UNPACK_ALIGNMENT, 1) gl.glBindTexture(gl.GL_TEXTURE_2D, texture) gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR_MIPMAP_LINEAR) gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_CLAMP_TO_EDGE) gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_CLAMP_TO_EDGE) gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, width, height, 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, img_data) gl.glGenerateMipmap(gl.GL_TEXTURE_2D) return texture ================================================ FILE: ycb_render/glutils/meshutil.py ================================================ """3D mesh manipulation utilities.""" from builtins import str from collections import OrderedDict import numpy as np from transforms3d import quaternions from transforms3d.quaternions import axangle2quat, mat2quat, quat2mat def frustum(left, right, bottom, top, znear, zfar): """Create view frustum matrix.""" assert right != left assert bottom != top assert znear != zfar M = np.zeros((4, 4), dtype=np.float32) M[0, 0] = +2.0 * znear / (right - left) M[2, 0] = (right + left) / (right - left) M[1, 1] = +2.0 * znear / (top - bottom) M[3, 1] = (top + bottom) / (top - bottom) M[2, 2] = -(zfar + znear) / (zfar - znear) M[3, 2] = -2.0 * znear * zfar / (zfar - znear) M[2, 3] = -1.0 return M def perspective(fovy, aspect, znear, zfar): """Create perspective projection matrix.""" assert znear != zfar h = np.tan(fovy / 360.0 * np.pi) * znear w = h * aspect return frustum(-w, w, -h, h, znear, zfar) def anorm(x, axis=None, keepdims=False): """Compute L2 norms alogn specified axes.""" return np.sqrt((x * x).sum(axis=axis, keepdims=keepdims)) def normalize(v, axis=None, eps=1e-10): """L2 Normalize along specified axes.""" return v / max(anorm(v, axis=axis, keepdims=True), eps) def lookat(eye, target=[0, 0, 0], up=[0, 1, 0]): """Generate LookAt modelview matrix.""" eye = np.float32(eye) forward = normalize(target - eye) side = normalize(np.cross(forward, up)) up = np.cross(side, forward) M = np.eye(4, dtype=np.float32) R = M[:3, :3] R[:] = [side, up, -forward] M[:3, 3] = -R.dot(eye) return M def sample_view(min_dist, max_dist=None): '''Sample random camera position. Sample origin directed camera position in given distance range from the origin. ModelView matrix is returned. ''' if max_dist is None: max_dist = min_dist dist = np.random.uniform(min_dist, max_dist) eye = np.random.normal(size=3) eye = normalize(eye) * dist return lookat(eye) def homotrans(M, p): p = np.asarray(p) if p.shape[-1] == M.shape[1] - 1: p = np.append(p, np.ones_like(p[..., :1]), -1) p = np.dot(p, M.T) return p[..., :-1] / p[..., -1:] def _parse_vertex_tuple(s): """Parse vertex indices in '/' separated form (like 'i/j/k', 'i//k' ...).""" vt = [0, 0, 0] for i, c in enumerate(s.split('/')): if c: vt[i] = int(c) return tuple(vt) def _unify_rows(a): """Unify lengths of each row of a.""" lens = np.fromiter(map(len, a), np.int32) if not (lens[0] == lens).all(): out = np.zeros((len(a), lens.max()), np.float32) for i, row in enumerate(a): out[i, :lens[i]] = row else: out = np.float32(a) return out def load_obj(fn): """Load 3d mesh form .obj' file. Args: fn: Input file name or file-like object. Returns: dictionary with the following keys (some of which may be missing): position: np.float32, (n, 3) array, vertex positions uv: np.float32, (n, 2) array, vertex uv coordinates normal: np.float32, (n, 3) array, vertex uv normals face: np.int32, (k*3,) traingular face indices """ position = [np.zeros(3, dtype=np.float32)] normal = [np.zeros(3, dtype=np.float32)] uv = [np.zeros(2, dtype=np.float32)] tuple2idx = OrderedDict() trinagle_indices = [] input_file = open(fn) if isinstance(fn, str) else fn for line in input_file: line = line.strip() if not line or line[0] == '#': continue line = line.split(' ', 1) tag = line[0] if len(line) > 1: line = line[1] else: line = '' if tag == 'v': position.append(np.fromstring(line, sep=' ')) elif tag == 'vt': uv.append(np.fromstring(line, sep=' ')) elif tag == 'vn': normal.append(np.fromstring(line, sep=' ')) elif tag == 'f': output_face_indices = [] for chunk in line.split(): # tuple order: pos_idx, uv_idx, normal_idx vt = _parse_vertex_tuple(chunk) if vt not in tuple2idx: # create a new output vertex? tuple2idx[vt] = len(tuple2idx) output_face_indices.append(tuple2idx[vt]) # generate face triangles for i in range(1, len(output_face_indices) - 1): for vi in [0, i, i + 1]: trinagle_indices.append(output_face_indices[vi]) outputs = {} outputs['face'] = np.int32(trinagle_indices) pos_idx, uv_idx, normal_idx = np.int32(list(tuple2idx)).T if np.any(pos_idx): outputs['position'] = _unify_rows(position)[pos_idx] if np.any(uv_idx): outputs['uv'] = _unify_rows(uv)[uv_idx] if np.any(normal_idx): outputs['normal'] = _unify_rows(normal)[normal_idx] return outputs def normalize_mesh(mesh): '''Scale mesh to fit into -1..1 cube''' mesh = dict(mesh) pos = mesh['position'][:, :3].copy() pos -= (pos.max(0) + pos.min(0)) / 2.0 pos /= np.abs(pos).max() mesh['position'] = pos return mesh def quat2rotmat(quat): quat_mat = np.eye(4) quat_mat[:3,:3] = quaternions.quat2mat(quat) return quat_mat def mat2rotmat(mat): quat_mat = np.eye(4) quat_mat[:3,:3] = mat return quat_mat def quat2rotmat(quat): quat_mat = np.eye(4) quat_mat[:3,:3] = quaternions.quat2mat(quat) return quat_mat def xyz2mat(xyz): trans_mat = np.eye(4) trans_mat[-1, :3] = xyz return trans_mat def mat2xyz(mat): xyz = mat[-1,:3] xyz[np.isnan(xyz)] = 0 return xyz def safemat2quat(mat): quat = np.array([1,0,0,0]) try: quat = mat2quat(mat) except: pass quat[np.isnan(quat)] = 0 return quat def unpack_pose(pose): unpacked = np.eye(4) unpacked[:3, :3] = quat2mat(pose[3:]) unpacked[:3, 3] = pose[:3] return unpacked def pack_pose(pose): packed = np.zeros(7) packed[:3] = pose[:3, 3] packed[3:] = safemat2quat(pose[:3, :3]) return packed ================================================ FILE: ycb_render/glutils/trackball.py ================================================ # ----------------------------------------------------------------------------- # Copyright (c) 2009-2016 Nicolas P. Rougier. All rights reserved. # Distributed under the (new) BSD License. # ----------------------------------------------------------------------------- import numpy as np from . import _trackball import platform if platform.python_version().startswith('3'): from .meshutil import * else: from meshutil import * class Trackball(): """ 3D trackball transform :param float aspect: Indicate what is the aspect ratio of the object displayed. This is necessary to convert pixel drag move in oject space coordinates. Default is None. :param float znear: Near clip plane. Default is 2. :param float zfar: Distance clip plane. Default is 1000. :param float theta: Angle (in degrees) around the z axis. Default is 45. :param float phi: Angle (in degrees) around the x axis. Default is 45. :param float distance: Distance from the trackball to the object. Default is 8. :param float zoom: Zoom level. Default is 35. The trackball transform simulates a virtual trackball (3D) that can rotate around the origin using intuitive mouse gestures. The transform is connected to the following events: * ``on_attach``: Transform initialization * ``on_resize``: Tranform update to maintain aspect * ``on_mouse_scroll``: Zoom in & out (user action) * ``on_mouse_grab``: Drag (user action) **Usage example**: .. code:: python vertex = ''' attribute vec2 position; void main() { gl_Position = (vec4(position, 0.0, 1.0)); } ''' ... window = app.Window(width=800, height=800) program = gloo.Program(vertex, fragment, count=4) ... program['transform'] = Trackball(aspect=1) window.attach(program['transform']) ... """ aliases = { "view" : "trackball_view", "model" : "trackball_model", "projection" : "trackball_projection" } def __init__(self, width, height, cam_pos=[0,0,2.0]): """ Initialize the transform. """ self._aspect = 1 self._znear = 0.2 self._zfar = 6.0 theta = 45 phi = 45 distance = np.linalg.norm(cam_pos) self._distance = -distance self._zoom = 1 self._width = width self._height = height self._window_aspect = 1.5 self._trackball = _trackball.Trackball(45,45) aspect = self._window_aspect * self._aspect self._projection = perspective(self._zoom, aspect, self._znear, self._zfar) self.property = {} self._view = np.eye(4, dtype=np.float32) self._view[:3, 3] = -np.array(cam_pos) self.property["view"] = self._view self.property["model"] = np.eye(4) # self.set_distance(self._distance) @property def distance(self): """ Distance from the trackball to the object """ return self._distance # @distance.setter # def distance(self, distance): # """ Distance from the trackball to the object """ # self._view = np.eye(4, dtype=np.float32) # self._view[2, 3] = -self._distance # self.property["view"] = self._view @property def theta(self): """ Angle (in degrees) around the z axis """ return self._trackball.theta @theta.setter def theta(self, theta): """ Angle (in degrees) around the z axis """ self._trackball.theta = theta self.property["model"] = self._trackball.model @property def phi(self): """ Angle (in degrees) around the x axis """ return self._trackball.phi @phi.setter def phi(self, phi): """ Angle (in degrees) around the x axis """ self._trackball.phi = phi self.property["model"] = self._trackball.model @property def zoom(self): """ Zoom level (aperture angle in degrees) """ return self._zoom @phi.setter def zoom(self, value): """ Zoom level (aperture angle in degrees) """ aspect = self._window_aspect * self._aspect self._zoom = min(max(value, 1.0), 179.0) self.property['projection'] = glm.perspective(self._zoom, aspect, self._znear, self._zfar) @property def aspect(self): """ Projection aspect """ return self._aspect @aspect.setter def aspect(self, value): """ Projection aspect """ aspect = self._window_aspect * self._aspect self.property['projection'] = glm.perspective(self._zoom, aspect, self._znear, self._zfar) def on_attach(self, program): self.property["view"] = self._view self.property["model"] = self._trackball.model self.property["projection"] = self._projection def on_resize(self, width, height): self._width = float(width) self._height = float(height) self._window_aspect = self._width / self._height aspect = self._window_aspect * self._aspect self.property['projection'] = perspective(self._zoom, aspect, self._znear, self._zfar) def on_mouse_drag(self, x, y, dx, dy, button=None): width = self._width height = self._height x = (x*2.0 - width)/width dx = (2.*dx)/width y = (height - y*2.0)/height dy = -(2.*dy)/height self._trackball.drag_to(x,y,dx,dy) self.property["model"] = self._trackball.model def on_mouse_scroll(self, x, y, dx, dy): width = self._width height = self._height aspect = self._window_aspect * self._aspect self._zoom = min(max(self._zoom*(1-dy/100), 1.0), 179.0) self.property['projection'] = perspective(self._zoom, aspect, self._znear, self._zfar) def reinit(self, cam_pos): self._zoom = 1 self._window_aspect = 1.5 self._trackball = _trackball.Trackball(45,45) aspect = self._window_aspect * self._aspect self._projection = perspective(self._zoom, aspect, self._znear, self._zfar) self.property = {} self._view = np.eye(4, dtype=np.float32) self._view[:3, 3] = -np.array(cam_pos) self.property["view"] = self._view self.property["projection"] = np.eye(4) self.property["model"] = np.eye(4) self._trackball._model = np.eye(4) ================================================ FILE: ycb_render/glutils/utils.py ================================================ colormap = [[1,0,0], [0,1,0], [0,0,1]] ================================================ FILE: ycb_render/setup.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import os import re import sys import platform import subprocess from setuptools import setup, Extension from setuptools.command.build_ext import build_ext from distutils.version import LooseVersion class CMakeExtension(Extension): def __init__(self, name, sourcedir=''): Extension.__init__(self, name, sources=[]) self.sourcedir = os.path.abspath(sourcedir) class CMakeBuild(build_ext): def run(self): try: out = subprocess.check_output(['cmake', '--version']) except OSError: raise RuntimeError("CMake must be installed to build the following extensions: " + ", ".join(e.name for e in self.extensions)) if platform.system() == "Windows": cmake_version = LooseVersion( re.search(r'version\s*([\d.]+)', out.decode()).group(1)) if cmake_version < '3.1.0': raise RuntimeError("CMake >= 3.1.0 is required on Windows") for ext in self.extensions: self.build_extension(ext) def build_extension(self, ext): extdir = os.path.abspath(os.path.dirname( self.get_ext_fullpath(ext.name))) cmake_args = ['-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + extdir, '-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=' + os.path.join(extdir, 'build'), '-DPYTHON_EXECUTABLE=' + sys.executable] cfg = 'Debug' if self.debug else 'Release' build_args = ['--config', cfg] if platform.system() == "Windows": cmake_args += [ '-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{}={}'.format(cfg.upper(), extdir)] if sys.maxsize > 2**32: cmake_args += ['-A', 'x64'] build_args += ['--', '/m'] else: cmake_args += ['-DCMAKE_BUILD_TYPE=' + cfg] build_args += ['--', '-j2'] env = os.environ.copy() env['CXXFLAGS'] = '{} -DVERSION_INFO=\\"{}\\"'.format(env.get('CXXFLAGS', ''), self.distribution.get_version()) if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) subprocess.check_call(['cmake', ext.sourcedir] + cmake_args, cwd=self.build_temp, env=env) subprocess.check_call(['cmake', '--build', '.'] + build_args, cwd=self.build_temp) setup( name='CppYCBRenderer', version='0.0.1', author='Fei Xia', author_email='xf1280@gmail.com', description='A test project using pybind11 and CMake', long_description='', ext_modules=[CMakeExtension('CppYCBRenderer')], cmdclass=dict(build_ext=CMakeBuild), zip_safe=False, ) ================================================ FILE: ycb_render/shaders/frag.shader ================================================ #version 460 uniform sampler2D texUnit; in vec2 theCoords; in vec3 Normal; in vec3 Normal_cam; in vec3 FragPos; in vec3 Instance_color; in vec3 Pos_cam; in vec3 Pos_obj; layout (location = 0) out vec4 outputColour; layout (location = 1) out vec4 NormalColour; layout (location = 2) out vec4 InstanceColour; layout (location = 3) out vec4 PCObject; layout (location = 4) out vec4 PCColour; uniform vec3 light_position; // in world coordinate uniform vec3 light_color; // light color void main() { float ambientStrength = 0.2; vec3 ambient = ambientStrength * light_color; vec3 lightDir = normalize(light_position - FragPos); float diff = max(dot(Normal, lightDir), 0.0); vec3 diffuse = diff * light_color; outputColour = texture(texUnit, theCoords) * vec4(diffuse + ambient, 1); NormalColour = vec4((Normal_cam + 1) / 2,1); InstanceColour = vec4(Instance_color,1); PCObject = vec4(Pos_obj,1); PCColour = vec4(Pos_cam,1); } ================================================ FILE: ycb_render/shaders/frag_blinnphong.shader ================================================ #version 460 uniform sampler2D texUnit; in vec2 theCoords; in vec3 Normal; in vec3 Normal_cam; in vec3 FragPos; in vec3 Instance_color; in vec3 Pos_cam; in vec3 Pos_obj; in float inverse_normal; layout (location = 0) out vec4 outputColour; layout (location = 1) out vec4 NormalColour; layout (location = 2) out vec4 InstanceColour; layout (location = 3) out vec4 PCObject; layout (location = 4) out vec4 PCColour; uniform vec3 light_position; // in world coordinate uniform vec3 light_color; // light color uniform vec3 world_light_pos1; uniform vec3 world_light_pos2; uniform vec3 mat_ambient; uniform vec3 mat_diffuse; uniform vec3 mat_specular; uniform float mat_shininess; void main() { if (inverse_normal > 0) discard; vec4 texColor = texture(texUnit, theCoords); if(texColor.a < 0.1) discard; // attenuation float a = 1.0f; float b = 0.5f; float c = 0.25f; float r = length(light_position - Pos_obj); float scalar = (a + b*r + c*r*r); if(scalar < 0.00000001) scalar = 0.0; else scalar = 1.0/scalar; vec3 norm = normalize(Normal); vec3 ambient = mat_ambient * light_color; vec3 lightDir = normalize(light_position - FragPos); float diff = max(dot(norm, lightDir), 0.0); vec3 diffuse = diff * light_color * mat_diffuse; vec3 viewDir = normalize(Pos_cam - FragPos); vec3 reflectDir = reflect(-lightDir, norm); float spec = pow(max(dot(viewDir, reflectDir), 0.0), mat_shininess); vec3 specular = light_color * (spec * mat_specular); // gamma correction vec3 linearColour = ambient + scalar*(diffuse + specular); vec3 gamma = vec3(1.0/2.2); outputColour = texColor * vec4(pow(linearColour, gamma), 1); // add few more lights // lightDir = normalize(world_light_pos1 - FragPos); // diff = max(dot(norm, lightDir), 0.0); // diffuse = diff * light_color * mat_diffuse; // viewDir = normalize(Pos_cam - FragPos); // reflectDir = reflect(-lightDir, norm); // spec = pow(max(dot(viewDir, reflectDir), 0.0), mat_shininess); // specular = light_color * (spec * mat_specular); // outputColour += texture(texUnit, theCoords) * vec4(diffuse + ambient + specular, 1); // lightDir = normalize(world_light_pos2 - FragPos); // diff = max(dot(norm, lightDir), 0.0); // diffuse = diff * light_color * mat_diffuse; // viewDir = normalize(Pos_cam - FragPos); // reflectDir = reflect(-lightDir, norm); // spec = pow(max(dot(viewDir, reflectDir), 0.0), mat_shininess); // specular = light_color * (spec * mat_specular); // outputColour += texture(texUnit, theCoords) * vec4(ambient + scalar*(diffuse + specular), 1); //NormalColour = vec4((Normal_cam + 1) / 2,1); NormalColour = vec4(Normal_cam,1); InstanceColour = vec4(Instance_color,1); PCObject = vec4(Pos_obj,1); PCColour = vec4(Pos_cam,1); } ================================================ FILE: ycb_render/shaders/frag_mat.shader ================================================ #version 460 in vec3 Normal; in vec3 Normal_cam; in vec3 FragPos; in vec3 Instance_color; in vec3 Pos_cam; in vec3 Pos_obj; in float inverse_normal; uniform vec3 mat_ambient; uniform vec3 mat_diffuse; uniform vec3 mat_specular; uniform float mat_shininess; layout (location = 0) out vec4 outputColour; layout (location = 1) out vec4 NormalColour; layout (location = 2) out vec4 InstanceColour; layout (location = 3) out vec4 PCObject; layout (location = 4) out vec4 PCColour; uniform vec3 light_position; // in world coordinate uniform vec3 light_color; // light color void main() { if (inverse_normal > 0) discard; // discard the wrong pixel vec3 norm = normalize(Normal); vec3 ambient = mat_ambient * light_color; vec3 lightDir = normalize(light_position - FragPos); float diff = max(dot(norm, lightDir), 0.0); vec3 diffuse = diff * light_color * mat_diffuse; vec3 viewDir = normalize(Pos_cam - FragPos); vec3 reflectDir = reflect(-lightDir, norm); float spec = pow(max(dot(viewDir, reflectDir), 0.0), mat_shininess); vec3 specular = light_color * (spec * mat_specular); outputColour = vec4(ambient + diffuse + specular, 1); //NormalColour = vec4((Normal_cam + 1) / 2,1); NormalColour = vec4(Normal_cam,1); InstanceColour = vec4(Instance_color,1); PCObject = vec4(Pos_obj,1); PCColour = vec4(Pos_cam,1); } ================================================ FILE: ycb_render/shaders/frag_simple.shader ================================================ #version 460 layout (location = 0) out vec4 outputColour; layout (location = 1) out vec4 NormalColour; layout (location = 2) out vec4 InstanceColour; layout (location = 3) out vec4 PCColour; void main() { outputColour = vec4(0.1, 0.1, 0.1, 1.0); NormalColour = vec4(0,0,0,0); InstanceColour = vec4(0,0,0,0); PCColour = vec4(0,0,0,0); } ================================================ FILE: ycb_render/shaders/frag_textureless.shader ================================================ #version 460 in vec3 theColor; in vec3 Normal; in vec3 Normal_cam; in vec3 FragPos; in vec3 Instance_color; in vec3 Pos_cam; in vec3 Pos_obj; in float inverse_normal; layout (location = 0) out vec4 outputColour; layout (location = 1) out vec4 NormalColour; layout (location = 2) out vec4 InstanceColour; layout (location = 3) out vec4 PCObject; layout (location = 4) out vec4 PCColour; uniform vec3 light_position; // in world coordinate uniform vec3 light_color; // light color uniform vec3 mat_ambient; uniform vec3 mat_diffuse; uniform vec3 mat_specular; uniform float mat_shininess; void main() { //float ambientStrength = 0.2; //vec3 ambient = ambientStrength * light_color; //vec3 lightDir = normalize(light_position - FragPos); //float diff = max(dot(Normal, lightDir), 0.0); //vec3 diffuse = diff * light_color; if (inverse_normal > 0) discard; // discard the wrong pixel vec3 norm = normalize(Normal); vec3 ambient = mat_ambient * light_color; vec3 lightDir = normalize(light_position - FragPos); float diff = max(dot(norm, lightDir), 0.0); vec3 diffuse = diff * light_color * mat_diffuse; vec3 viewDir = normalize(Pos_cam - FragPos); vec3 reflectDir = reflect(-lightDir, norm); float spec = pow(max(dot(viewDir, reflectDir), 0.0), mat_shininess); vec3 specular = light_color * (spec * mat_specular); outputColour = vec4(theColor, 1) * vec4(diffuse + ambient + specular, 1); NormalColour = vec4((Normal_cam + 1) / 2,1); InstanceColour = vec4(Instance_color,1); PCObject = vec4(Pos_obj,1); PCColour = vec4(Pos_cam,1); } ================================================ FILE: ycb_render/shaders/vert.shader ================================================ #version 460 uniform mat4 V; uniform mat4 P; uniform mat4 pose_rot; uniform mat4 pose_trans; uniform vec3 instance_color; layout (location=0) in vec3 position; layout (location=1) in vec3 normal; layout (location=2) in vec2 texCoords; out vec2 theCoords; out vec3 Normal; out vec3 FragPos; out vec3 Normal_cam; out vec3 Instance_color; out vec3 Pos_cam; out vec3 Pos_obj; void main() { gl_Position = P * V * pose_trans * pose_rot * vec4(position, 1); vec4 world_position4 = pose_trans * pose_rot * vec4(position, 1); FragPos = vec3(world_position4.xyz / world_position4.w); // in world coordinate Normal = normalize(mat3(pose_rot) * normal); // in world coordinate Normal_cam = normalize(mat3(V) * mat3(pose_rot) * normal); // in camera coordinate vec4 pos_cam4 = V * pose_trans * pose_rot * vec4(position, 1); Pos_cam = pos_cam4.xyz / pos_cam4.w; Pos_obj = position; theCoords = texCoords; Instance_color = instance_color; } ================================================ FILE: ycb_render/shaders/vert_blinnphong.shader ================================================ #version 460 uniform mat4 V; uniform mat4 P; uniform mat4 pose_rot; uniform mat4 pose_trans; uniform vec3 instance_color; layout (location=0) in vec3 position; layout (location=1) in vec3 normal; layout (location=2) in vec2 texCoords; out vec2 theCoords; out vec3 Normal; out vec3 FragPos; out vec3 Normal_cam; out vec3 Instance_color; out vec3 Pos_cam; out vec3 Pos_obj; out float inverse_normal; void main() { gl_Position = P * V * pose_trans * pose_rot * vec4(position, 1); vec4 world_position4 = pose_trans * pose_rot * vec4(position, 1); FragPos = vec3(world_position4.xyz / world_position4.w); // in world coordinate Normal = normalize(mat3(pose_rot) * normal); // in world coordinate Normal_cam = normalize(mat3(V) * mat3(pose_rot) * normal); // in camera coordinate vec4 pos_cam4 = V * pose_trans * pose_rot * vec4(position, 1); Pos_cam = pos_cam4.xyz / pos_cam4.w; Pos_obj = position; float normalDir = dot(Normal_cam, Pos_cam); inverse_normal = normalDir; theCoords = texCoords; Instance_color = instance_color; } ================================================ FILE: ycb_render/shaders/vert_mat.shader ================================================ #version 460 uniform mat4 V; uniform mat4 P; uniform mat4 pose_rot; uniform mat4 pose_trans; uniform vec3 instance_color; layout (location=0) in vec3 position; layout (location=1) in vec3 normal; out vec3 Normal; out vec3 FragPos; out vec3 Normal_cam; out vec3 Instance_color; out vec3 Pos_cam; out vec3 Pos_obj; out float inverse_normal; void main() { gl_Position = P * V * pose_trans * pose_rot * vec4(position, 1); vec4 world_position4 = pose_trans * pose_rot * vec4(position, 1); FragPos = vec3(world_position4.xyz / world_position4.w); // in world coordinate Normal = normalize(mat3(pose_rot) * normal); // in world coordinate Normal_cam = normalize(mat3(V) * mat3(pose_rot) * normal); // in camera coordinate vec4 pos_cam4 = V * pose_trans * pose_rot * vec4(position, 1); Pos_cam = pos_cam4.xyz / pos_cam4.w; float normalDir = dot(Normal_cam, Pos_cam); Pos_obj = position; Instance_color = instance_color; inverse_normal = normalDir; } ================================================ FILE: ycb_render/shaders/vert_simple.shader ================================================ #version 460 uniform mat4 V; uniform mat4 P; layout (location=0) in vec3 position; layout (location=1) in vec3 normal; layout (location=2) in vec2 texCoords; void main() { gl_Position = P * V * vec4(position,1); } ================================================ FILE: ycb_render/shaders/vert_textureless.shader ================================================ #version 460 uniform mat4 V; uniform mat4 P; uniform mat4 pose_rot; uniform mat4 pose_trans; uniform vec3 instance_color; layout (location=0) in vec3 position; layout (location=1) in vec3 normal; layout (location=2) in vec3 color; out vec3 theColor; out vec3 Normal; out vec3 FragPos; out vec3 Normal_cam; out vec3 Instance_color; out vec3 Pos_cam; out vec3 Pos_obj; out float inverse_normal; void main() { gl_Position = P * V * pose_trans * pose_rot * vec4(position, 1); vec4 world_position4 = pose_trans * pose_rot * vec4(position, 1); FragPos = vec3(world_position4.xyz / world_position4.w); // in world coordinate Normal = normalize(mat3(pose_rot) * normal); // in world coordinate Normal_cam = normalize(mat3(V) * mat3(pose_rot) * normal); // in camera coordinate vec4 pos_cam4 = V * pose_trans * pose_rot * vec4(position, 1); Pos_cam = pos_cam4.xyz / pos_cam4.w; Pos_obj = position; float normalDir = dot(Normal_cam, Pos_cam); theColor = color; Instance_color = instance_color; inverse_normal = normalDir; } ================================================ FILE: ycb_render/visualize_sim.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import torch import cv2 import numpy as np import glob from transforms3d.quaternions import mat2quat, quat2mat from ycb_renderer_sim import YCBRenderer if __name__ == '__main__': model_path = '.' width = 640 height = 480 files = glob.glob('data/*.npy') renderer = YCBRenderer(width=width, height=height, render_marker=True) models = ['003_cracker_box', '004_sugar_box', '005_tomato_soup_can', '006_mustard_bottle', '010_potted_meat_can'] colors = [[0, 1, 0], [0, 0, 1], [1, 1, 0], [1, 0, 1], [0.5, 0.5, 0]] # models = ['003_cracker_box'] # colors = [[0, 1, 0]] obj_paths = [ '{}/models_sim/{}/meshes/{}.obj'.format(model_path, item, item) for item in models] texture_paths = [ '{}/models_sim/{}/meshes/texture_map.png'.format(model_path, item) for item in models] renderer.load_objects(obj_paths, texture_paths, colors) renderer.set_fov(60) renderer.set_light_pos([0, 0, 0]) renderer.set_camera([0, 0, 0], [1, 0, 0], [0, 0, 1]) image_tensor = torch.cuda.FloatTensor(height, width, 4).detach() seg_tensor = torch.cuda.FloatTensor(height, width, 4).detach() RT_object = np.zeros((3, 4), dtype=np.float32) RT_camera = np.zeros((3, 4), dtype=np.float32) for file_path in files[1:]: print file_path data = np.load(file_path).item() cls_indexes = [] poses = [] print('object_labels', data['object_labels']) print('fov', data['horizontal_fov']) for i, object_name in enumerate(data['object_labels']): cls_index = -1 for j in range(len(models)): if object_name in models[j]: cls_index = j break if cls_index >= 0: cls_indexes.append(cls_index) RT = np.zeros((3, 4), dtype=np.float32) w = data['relative_poses'][i][0] x = data['relative_poses'][i][1] y = data['relative_poses'][i][2] z = data['relative_poses'][i][3] RT[:3, :3] = quat2mat([w, x, y, z]) x = data['relative_poses'][i][4] y = data['relative_poses'][i][5] z = data['relative_poses'][i][6] RT[:, 3] = [x, y, z] print RT qt = np.zeros((7, ), dtype=np.float32) qt[3:] = mat2quat(RT[:3, :3]) qt[:3] = RT[:, 3] print qt poses.append(qt) print('object_name: {}, relative_qt = {}, absolute_qt = {}'.format(data['object_labels'][i], data['relative_poses'][i], data['absolute_poses'][i])) renderer.set_poses(poses) renderer.render(cls_indexes, image_tensor, seg_tensor) image_tensor = image_tensor.flip(0) seg_tensor = seg_tensor.flip(0) # RGB to BGR order im = image_tensor.cpu().numpy() im = np.clip(im, 0, 1) im = im[:, :, (2, 1, 0)] * 255 im = im.astype(np.uint8) im_label = seg_tensor.cpu().numpy() im_label = im_label[:, :, (2, 1, 0)] * 255 im_label = np.round(im_label).astype(np.uint8) im_label = np.clip(im_label, 0, 255) import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(2, 2, 1) plt.imshow(data['rgb'][:, :, (2, 1, 0)]) ax = fig.add_subplot(2, 2, 2) mask = np.squeeze(data['segmentation'], -1).astype(np.uint8) mask *= 40 plt.imshow(mask) ax = fig.add_subplot(2, 2, 3) plt.imshow(im[:, :, (2, 1, 0)]) ax = fig.add_subplot(2, 2, 4) plt.imshow(im_label[:, :, (2, 1, 0)]) plt.show() ================================================ FILE: ycb_render/ycb_renderer.py ================================================ # Copyright (c) 2020 NVIDIA Corporation. All rights reserved. # This work is licensed under the NVIDIA Source Code License - Non-commercial. Full # text can be found in LICENSE.md import sys import ctypes import torch import time import argparse from pprint import pprint from PIL import Image import glutils.glcontext as glcontext import OpenGL.GL as GL import cv2 import numpy as np import platform PYTHON2 = True if platform.python_version().startswith('3'): PYTHON2 = False from pyassimp import * from glutils.meshutil import perspective, lookat, xyz2mat, quat2rotmat, mat2xyz, safemat2quat,homotrans, mat2rotmat, unpack_pose, pack_pose from glutils.trackball import Trackball from transforms3d.quaternions import axangle2quat, mat2quat, qmult, qinverse from transforms3d.euler import quat2euler, mat2euler, euler2quat import CppYCBRenderer from numpy.linalg import inv, norm try: from .get_available_devices import * except: from get_available_devices import * MAX_NUM_OBJECTS = 3 from glutils.utils import colormap def loadTexture(path): img = Image.open(path).transpose(Image.FLIP_TOP_BOTTOM) img_data = np.fromstring(img.tobytes(), np.uint8) width, height = img.size texture = GL.glGenTextures(1) GL.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1) GL.glBindTexture(GL.GL_TEXTURE_2D, texture) GL.glTexParameterf( GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR) GL.glTexParameterf( GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR_MIPMAP_LINEAR) GL.glTexParameterf( GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT) #.GL_CLAMP_TO_EDGE GL_REPEAT GL.glTexParameterf( GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT) if img.mode == 'RGBA': GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, width, height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, img_data) else: GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB, width, height, 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, img_data) GL.glGenerateMipmap(GL.GL_TEXTURE_2D) return texture class YCBRenderer: def __init__(self, width=512, height=512, gpu_id=0, render_marker=False, robot=''): self.render_marker = render_marker self.VAOs = [] self.VBOs = [] self.materials = [] self.textures = [] self.is_textured = [] self.is_materialed = [] self.objects = [] self.texUnitUniform = None self.width = width self.height = height self.vertices = [] self.faces = [] self.poses_trans = [] self.poses_rot = [] self.instances = [] self.extents = [] self.robot = robot if len(self.robot) > 3: self._offset_map = self.load_offset() else: self._offset_map = None self.r = CppYCBRenderer.CppYCBRenderer(width, height, get_available_devices()[gpu_id]) self.r.init() self.glstring = GL.glGetString(GL.GL_VERSION) from OpenGL.GL import shaders self.shaders = shaders 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]] self.lightcolor = [1, 1, 1] cur_dir = os.path.dirname(os.path.abspath(__file__)) vertexShader = self.shaders.compileShader( open(os.path.join(cur_dir, 'shaders/vert.shader')).readlines(), GL.GL_VERTEX_SHADER) fragmentShader = self.shaders.compileShader( open(os.path.join(cur_dir,'shaders/frag.shader')).readlines(), GL.GL_FRAGMENT_SHADER) vertexShader_textureMat = self.shaders.compileShader( open(os.path.join(cur_dir,'shaders/vert_blinnphong.shader')).readlines(), GL.GL_VERTEX_SHADER) fragmentShader_textureMat = self.shaders.compileShader( open(os.path.join(cur_dir,'shaders/frag_blinnphong.shader')).readlines(), GL.GL_FRAGMENT_SHADER) vertexShader_textureless = self.shaders.compileShader( open(os.path.join(cur_dir,'shaders/vert_textureless.shader')).readlines(), GL.GL_VERTEX_SHADER) fragmentShader_textureless = self.shaders.compileShader( open(os.path.join(cur_dir,'shaders/frag_textureless.shader')).readlines(), GL.GL_FRAGMENT_SHADER) #try with the easiest shader first, and then look at Gl apply material vertexShader_material = self.shaders.compileShader( open(os.path.join(cur_dir,'shaders/vert_mat.shader')).readlines(), GL.GL_VERTEX_SHADER) fragmentShader_material = self.shaders.compileShader( open(os.path.join(cur_dir,'shaders/frag_mat.shader')).readlines(), GL.GL_FRAGMENT_SHADER) vertexShader_simple = self.shaders.compileShader( open(os.path.join(cur_dir,'shaders/vert_simple.shader')).readlines(), GL.GL_VERTEX_SHADER) fragmentShader_simple = self.shaders.compileShader( open(os.path.join(cur_dir,'shaders/frag_simple.shader')).readlines(), GL.GL_FRAGMENT_SHADER) self.shaderProgram = self.shaders.compileProgram(vertexShader, fragmentShader) self.shaderProgram_textureless = self.shaders.compileProgram(vertexShader_textureless, fragmentShader_textureless) self.shaderProgram_simple = self.shaders.compileProgram(vertexShader_simple, fragmentShader_simple) self.shaderProgram_material = self.shaders.compileProgram(vertexShader_material, fragmentShader_material) self.shaderProgram_textureMat = self.shaders.compileProgram(vertexShader_textureMat, fragmentShader_textureMat) self.texUnitUniform_textureMat = GL.glGetUniformLocation(self.shaderProgram_textureMat, 'texUnit') self.lightpos = [0, 0, 0] self.fbo = GL.glGenFramebuffers(1) self.color_tex = GL.glGenTextures(1) self.color_tex_2 = GL.glGenTextures(1) self.color_tex_3 = GL.glGenTextures(1) self.color_tex_4 = GL.glGenTextures(1) self.color_tex_5 = GL.glGenTextures(1) self.depth_tex = GL.glGenTextures(1) GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex) GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width, self.height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None) GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_2) GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width, self.height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None) GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_3) GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width, self.height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None) GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_4) GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width, self.height, 0, GL.GL_RGBA, GL.GL_FLOAT, None) GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_5) GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width, self.height, 0, GL.GL_RGBA, GL.GL_FLOAT, None) GL.glBindTexture(GL.GL_TEXTURE_2D, self.depth_tex) GL.glTexImage2D.wrappedOperation( GL.GL_TEXTURE_2D, 0, GL.GL_DEPTH24_STENCIL8, self.width, self.height, 0, GL.GL_DEPTH_STENCIL, GL.GL_UNSIGNED_INT_24_8, None) GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.fbo) GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, GL.GL_TEXTURE_2D, self.color_tex, 0) GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT1, GL.GL_TEXTURE_2D, self.color_tex_2, 0) GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT2, GL.GL_TEXTURE_2D, self.color_tex_3, 0) GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT3, GL.GL_TEXTURE_2D, self.color_tex_4, 0) GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT4, GL.GL_TEXTURE_2D, self.color_tex_5, 0) GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_DEPTH_STENCIL_ATTACHMENT, GL.GL_TEXTURE_2D, self.depth_tex, 0) GL.glViewport(0, 0, self.width, self.height) GL.glDrawBuffers(5, [GL.GL_COLOR_ATTACHMENT0, GL.GL_COLOR_ATTACHMENT1, GL.GL_COLOR_ATTACHMENT2, GL.GL_COLOR_ATTACHMENT3, GL.GL_COLOR_ATTACHMENT4]) assert GL.glCheckFramebufferStatus( GL.GL_FRAMEBUFFER) == GL.GL_FRAMEBUFFER_COMPLETE self.fov = 20 self.camera = [1, 0, 0] self.target = [0, 0, 0] self.up = [0, 0, 1] P = perspective(self.fov, float(self.width) / float(self.height), 0.01, 100) V = lookat( self.camera, self.target, up=self.up) self.V = np.ascontiguousarray(V, np.float32) self.P = np.ascontiguousarray(P, np.float32) self.grid = self.generate_grid() #added mouse interaction self.is_rotating = False def generate_grid(self): VAO = GL.glGenVertexArrays(1) GL.glBindVertexArray(VAO) vertexData = [] for i in np.arange(-1, 1, 0.05): vertexData.append([i, 0, -1, 0, 0, 0, 0, 0]) vertexData.append([i, 0, 1, 0, 0, 0, 0, 0]) vertexData.append([1, 0, i, 0, 0, 0, 0, 0]) vertexData.append([-1, 0, i, 0, 0, 0, 0, 0]) vertexData = np.array(vertexData).astype(np.float32) * 3 # Need VBO for triangle vertices and texture UV coordinates VBO = GL.glGenBuffers(1) GL.glBindBuffer(GL.GL_ARRAY_BUFFER, VBO) GL.glBufferData(GL.GL_ARRAY_BUFFER, vertexData.nbytes, vertexData, GL.GL_STATIC_DRAW) # enable array and set up data positionAttrib = GL.glGetAttribLocation(self.shaderProgram_simple, 'position') GL.glEnableVertexAttribArray(0) GL.glVertexAttribPointer(positionAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 32, None) GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0) GL.glBindVertexArray(0) return VAO def load_object(self, obj_path, texture_path, scale=1.0): is_materialed = True textures = [] start_time = time.time() vertices, faces, materials, texture_paths = self.load_mesh(obj_path, scale) print('load mesh {:s} time:{:.3f}'.format(obj_path, time.time() - start_time)) # compute extent vertices_all = vertices[0] for idx in range(1, len(vertices)): vertices_all += vertices[idx] extent = 2 * np.max(np.absolute(vertices_all[:, :3]), axis=0) self.vertices.append(vertices_all[:, :3]) self.extents.append(extent) start_time = time.time() self.materials.append(materials) is_textured = [] is_colored = [] for texture_path in texture_paths: is_texture = False is_color = False if texture_path == '': textures.append(texture_path) elif texture_path == 'color': is_color = True textures.append(texture_path) else: texture_path = os.path.join('/'.join(obj_path.split('/')[:-1]), texture_path) texture = loadTexture(texture_path) textures.append(texture) is_texture = True is_textured.append(is_texture) is_colored.append(is_color) self.textures.append(textures) self.is_textured.append(is_textured) self.is_materialed.append(is_materialed) if is_materialed:# and True in is_textured: #for compatability for idx in range(len(vertices)): vertexData = vertices[idx].astype(np.float32) face = faces[idx] VAO = GL.glGenVertexArrays(1) GL.glBindVertexArray(VAO) # Need VBO for triangle vertices and texture UV coordinates VBO = GL.glGenBuffers(1) GL.glBindBuffer(GL.GL_ARRAY_BUFFER, VBO) GL.glBufferData(GL.GL_ARRAY_BUFFER, vertexData.nbytes, vertexData, GL.GL_STATIC_DRAW) if is_textured[idx]: positionAttrib = GL.glGetAttribLocation(self.shaderProgram_textureMat, 'position') normalAttrib = GL.glGetAttribLocation(self.shaderProgram_textureMat, 'normal') coordsAttrib = GL.glGetAttribLocation(self.shaderProgram_textureMat, 'texCoords') elif is_colored[idx]: positionAttrib = GL.glGetAttribLocation(self.shaderProgram_textureless, 'position') normalAttrib = GL.glGetAttribLocation(self.shaderProgram_textureless, 'normal') colorAttrib = GL.glGetAttribLocation(self.shaderProgram_textureless, 'color') else: positionAttrib = GL.glGetAttribLocation(self.shaderProgram_material, 'position') normalAttrib = GL.glGetAttribLocation(self.shaderProgram_material, 'normal') GL.glEnableVertexAttribArray(0) GL.glEnableVertexAttribArray(1) # the last parameter is a pointer if is_textured[idx]: GL.glEnableVertexAttribArray(2) GL.glVertexAttribPointer(positionAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 32, None) GL.glVertexAttribPointer(normalAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 32, ctypes.c_void_p(12)) GL.glVertexAttribPointer(coordsAttrib, 2, GL.GL_FLOAT, GL.GL_TRUE, 32, ctypes.c_void_p(24)) elif is_colored[idx]: GL.glEnableVertexAttribArray(2) GL.glVertexAttribPointer(positionAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 36, None) GL.glVertexAttribPointer(normalAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 36, ctypes.c_void_p(12)) GL.glVertexAttribPointer(colorAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 36, ctypes.c_void_p(24)) else: GL.glVertexAttribPointer(positionAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 24, None) GL.glVertexAttribPointer(normalAttrib, 3, GL.GL_FLOAT, GL.GL_FALSE, 24, ctypes.c_void_p(12)) GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0) GL.glBindVertexArray(0) self.VAOs.append(VAO) self.VBOs.append(VBO) self.faces.append(face) self.objects.append(obj_path) self.poses_rot.append(np.eye(4)) self.poses_trans.append(np.eye(4)) print('buffer time:{:.3f}'.format(time.time() - start_time)) def load_offset(self): cur_path = os.path.abspath(os.path.dirname(__file__)) offset_file = os.path.join(cur_path, 'robotPose', self.robot + '_models', 'center_offset.txt') model_file = os.path.join(cur_path, 'robotPose', self.robot + '_models', 'models.txt') with open(model_file, "r+") as file: content = file.readlines() model_paths = [path.strip().split('/')[-1] for path in content] offset = np.loadtxt(offset_file).astype(np.float32) offset_map = {} for i in range(offset.shape[0]): offset_map[model_paths[i]] = offset[i, :] #extent max - min in mesh, center = (max + min)/2 return offset_map def load_mesh(self, path, scale=1.0): mesh_file = path.strip().split('/')[-1] # for offset the robot mesh scene = load(path) #load collada offset = np.zeros(3) if self._offset_map is not None and mesh_file in self._offset_map: offset = self._offset_map[mesh_file] return self.recursive_load(scene.rootnode, [], [], [], [], offset, scale, [[], [], []]) def recursive_load(self, node, vertices, faces, materials, texture_paths, offset, scale=1, repeated=[[], [], []]): if node.meshes: transform = node.transformation for idx, mesh in enumerate(node.meshes): if mesh.faces.shape[-1] != 3: #ignore Line Set continue mat = mesh.material texture_path = False if hasattr(mat, 'properties'): file = ('file', long(1)) if PYTHON2 else ('file', 1) if file in mat.properties: texture_paths.append(mat.properties[file]) texture_path = True else: texture_paths.append('') mat_diffuse = np.array(mat.properties['diffuse'])[:3] mat_specular = np.array(mat.properties['specular'])[:3] mat_ambient = np.array(mat.properties['ambient'])[:3] #phong shader if 'shininess' in mat.properties: mat_shininess = max(mat.properties['shininess'], 1) #avoid the 0 shininess else: mat_shininess = 1 mesh_vertex = homotrans(transform,mesh.vertices) - offset #subtract the offset if mesh.normals.shape[0] > 0: mesh_normals = transform[:3,:3].dot(mesh.normals.transpose()).transpose() #normal stays the same else: mesh_normals = np.zeros_like(mesh_vertex) mesh_normals[:,-1] = 1 if texture_path: vertices.append(np.concatenate([mesh_vertex * scale, mesh_normals, mesh.texturecoords[0, :, :2]], axis=-1)) elif mesh.colors is not None and len(mesh.colors.shape) > 2: vertices.append(np.concatenate([mesh_vertex * scale, mesh_normals, mesh.colors[0, :, :3]], axis=-1)) # texture_paths[-1] = 'color' else: vertices.append(np.concatenate([mesh_vertex * scale, mesh_normals], axis=-1)) faces.append(mesh.faces) materials.append(np.hstack([mat_diffuse, mat_specular, mat_ambient, mat_shininess])) for child in node.children: self.recursive_load(child, vertices, faces, materials, texture_paths, offset, scale, repeated) return vertices, faces, materials, texture_paths def load_objects(self, obj_paths, texture_paths, colors=[[0.9, 0, 0], [0.6, 0, 0], [0.3, 0, 0]], scale=None): if scale is None: scale = [1]*len(obj_paths) self.colors = colors for i in range(len(obj_paths)): self.load_object(obj_paths[i], texture_paths[i], scale[i]) if i == 0: self.instances.append(0) else: self.instances.append(self.instances[-1] + len(self.materials[i-1])) #offset print(self.extents) def set_camera(self, camera, target, up): self.camera = camera self.target = target self.up = up V = lookat( self.camera, self.target, up=self.up) self.V = np.ascontiguousarray(V, np.float32) def set_camera_default(self): self.V = np.eye(4) def set_fov(self, fov): self.fov = fov # this is vertical fov P = perspective(self.fov, float(self.width) / float(self.height), 0.01, 100) self.P = np.ascontiguousarray(P, np.float32) def set_projection_matrix(self, w, h, fu, fv, u0, v0, znear, zfar): L = -(u0) * znear / fu; R = +(w-u0) * znear / fu; T = -(v0) * znear / fv; B = +(h-v0) * znear / fv; P = np.zeros((4, 4), dtype=np.float32); P[0, 0] = 2 * znear / (R-L); P[1, 1] = 2 * znear / (T-B); P[2, 0] = (R+L)/(L-R); P[2, 1] = (T+B)/(B-T); P[2, 2] = (zfar +znear) / (zfar - znear); P[2, 3] = 1.0; P[3, 2] = (2*zfar*znear)/(znear - zfar); self.P = P def set_light_color(self, color): self.lightcolor = color def render(self, cls_indexes, image_tensor, seg_tensor, normal_tensor=None, pc1_tensor=None, pc2_tensor=None): frame = 0 GL.glClearColor(0, 0, 0, 1) GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) GL.glEnable(GL.GL_DEPTH_TEST) #GL.glLightModeli(GL.GL_LIGHT_MODEL_TWO_SIDE, GL.GL_TRUE) if self.render_marker: # render some grid and directions GL.glUseProgram(self.shaderProgram_simple) GL.glBindVertexArray(self.grid) GL.glUniformMatrix4fv(GL.glGetUniformLocation( self.shaderProgram_simple, 'V'), 1, GL.GL_TRUE, self.V) GL.glUniformMatrix4fv(GL.glGetUniformLocation( self.shaderProgram_simple, 'P'), 1, GL.GL_FALSE, self.P) GL.glDrawElements(GL.GL_LINES, 160, GL.GL_UNSIGNED_INT, np.arange(160, dtype=np.int)) GL.glBindVertexArray(0) GL.glUseProgram(0) # end rendering markers size = 0 for i in range(len(cls_indexes)): index = cls_indexes[i] is_materialed = self.is_materialed[index] if is_materialed: num = len(self.materials[index]) for idx in range(num): is_texture = self.is_textured[index][idx] #index if is_texture: shader = self.shaderProgram_textureMat elif self.textures[index][idx] == 'color': shader = self.shaderProgram_textureless else: shader = self.shaderProgram_material GL.glUseProgram(shader) GL.glUniformMatrix4fv(GL.glGetUniformLocation(shader, 'V'), 1, GL.GL_TRUE, self.V) GL.glUniformMatrix4fv(GL.glGetUniformLocation(shader, 'P'), 1, GL.GL_FALSE, self.P) GL.glUniformMatrix4fv(GL.glGetUniformLocation(shader, 'pose_trans'), 1, GL.GL_FALSE, self.poses_trans[i]) GL.glUniformMatrix4fv(GL.glGetUniformLocation(shader, 'pose_rot'), 1, GL.GL_TRUE, self.poses_rot[i]) GL.glUniform3f(GL.glGetUniformLocation(shader, 'light_position'), *self.lightpos) GL.glUniform3f(GL.glGetUniformLocation(shader, 'instance_color'), *self.colors[index]) GL.glUniform3f(GL.glGetUniformLocation(shader, 'light_color'), *self.lightcolor) GL.glUniform3f(GL.glGetUniformLocation(shader, 'mat_diffuse'), *self.materials[index][idx][:3]) GL.glUniform3f(GL.glGetUniformLocation(shader, 'mat_specular'), *self.materials[index][idx][3:6]) GL.glUniform3f(GL.glGetUniformLocation(shader, 'mat_ambient'), *self.materials[index][idx][6:9]) GL.glUniform1f(GL.glGetUniformLocation(shader, 'mat_shininess'), self.materials[index][idx][-1]) try: if is_texture: GL.glActiveTexture(GL.GL_TEXTURE0) GL.glBindTexture(GL.GL_TEXTURE_2D, self.textures[index][idx]) #self.instances[index] GL.glUniform1i(self.texUnitUniform_textureMat, 0) GL.glBindVertexArray(self.VAOs[self.instances[index]+idx]) # GL.glDrawElements(GL.GL_TRIANGLES, self.faces[self.instances[index]+idx].size, GL.GL_UNSIGNED_INT, self.faces[self.instances[index]+idx]) finally: GL.glBindVertexArray(0) GL.glUseProgram(0) GL.glDisable(GL.GL_DEPTH_TEST) # mapping self.r.map_tensor(int(self.color_tex), int(self.width), int(self.height), image_tensor.data_ptr()) self.r.map_tensor(int(self.color_tex_3), int(self.width), int(self.height), seg_tensor.data_ptr()) if normal_tensor is not None: self.r.map_tensor(int(self.color_tex_2), int(self.width), int(self.height), normal_tensor.data_ptr()) if pc1_tensor is not None: self.r.map_tensor(int(self.color_tex_4), int(self.width), int(self.height), pc1_tensor.data_ptr()) if pc2_tensor is not None: self.r.map_tensor(int(self.color_tex_5), int(self.width), int(self.height), pc2_tensor.data_ptr()) ''' GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT0) frame = GL.glReadPixels(0, 0, self.width, self.height, GL.GL_BGRA, GL.GL_FLOAT) #frame = np.frombuffer(frame,dtype = np.float32).reshape(self.width, self.height, 4) frame = frame.reshape(self.height, self.width, 4)[::-1, :] # GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT1) #normal = GL.glReadPixels(0, 0, self.width, self.height, GL.GL_BGRA, GL.GL_FLOAT) #normal = np.frombuffer(frame, dtype=np.uint8).reshape(self.width, self.height, 4) #normal = normal[::-1, ] GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT2) seg = GL.glReadPixels(0, 0, self.width, self.height, GL.GL_BGRA, GL.GL_FLOAT) #seg = np.frombuffer(frame, dtype=np.uint8).reshape(self.width, self.height, 4) seg = seg.reshape(self.height, self.width, 4)[::-1, :] #pc = GL.glReadPixels(0, 0, self.width, self.height, GL.GL_DEPTH_COMPONENT, GL.GL_FLOAT) # seg = np.frombuffer(frame, dtype=np.uint8).reshape(self.width, self.height, 4) #pc = np.stack([pc,pc, pc, np.ones(pc.shape)], axis = -1) #pc = pc[::-1, ] #pc = (1-pc) * 10 # points in object coordinate GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT3) pc2 = GL.glReadPixels(0, 0, self.width, self.height, GL.GL_RGBA, GL.GL_FLOAT) pc2 = pc2.reshape(self.height, self.width, 4)[::-1, :] pc2 = pc2[:,:,:3] # points in camera coordinate GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT4) pc3 = GL.glReadPixels(0, 0, self.width, self.height, GL.GL_RGBA, GL.GL_FLOAT) pc3 = pc3.reshape(self.height, self.width, 4)[::-1, :] pc3 = pc3[:,:,:3] return [frame, seg, pc2, pc3] ''' def set_light_pos(self, light): self.lightpos = light def get_num_objects(self): return len(self.objects) def set_poses(self, poses): self.poses_rot = [np.ascontiguousarray( quat2rotmat(item[3:])) for item in poses] self.poses_trans = [np.ascontiguousarray( xyz2mat(item[:3])) for item in poses] def set_allocentric_poses(self, poses): self.poses_rot = [] self.poses_trans = [] for pose in poses: x, y, z = pose[:3] quat_input = pose[3:] dx = np.arctan2(x, -z) dy = np.arctan2(y, -z) # print(dx, dy) quat = euler2quat(-dy, -dx, 0, axes='sxyz') quat = qmult(quat, quat_input) self.poses_rot.append(np.ascontiguousarray(quat2rotmat(quat))) self.poses_trans.append(np.ascontiguousarray(xyz2mat(pose[:3]))) def release(self): print(self.glstring) self.clean() self.r.release() def clean(self): GL.glDeleteTextures([self.color_tex, self.color_tex_2, self.color_tex_3, self.color_tex_4, self.depth_tex]) self.color_tex = None self.color_tex_2 = None self.color_tex_3 = None self.color_tex_4 = None self.depth_tex = None GL.glDeleteFramebuffers(1, [self.fbo]) self.fbo = None GL.glDeleteBuffers(len(self.VAOs), self.VAOs) self.VAOs = [] GL.glDeleteBuffers(len(self.VBOs), self.VBOs) self.VBOs = [] GL.glDeleteTextures(self.textures) self.textures = [] self.objects = [] # GC should free things here self.faces = [] # GC should free things here self.poses_trans = [] # GC should free things here self.poses_rot = [] # GC should free things here def transform_vector(self, vec): vec = np.array(vec) zeros = np.zeros_like(vec) vec_t = self.transform_point(vec) zero_t = self.transform_point(zeros) v = vec_t - zero_t return v def transform_point(self, vec): vec = np.array(vec) if vec.shape[0] == 3: v = self.V.dot(np.concatenate([vec, np.array([1])])) return v[:3]/v[-1] elif vec.shape[0] == 4: v = self.V.dot(vec) return v/v[-1] else: return None def transform_pose(self, pose): pose_rot = quat2rotmat(pose[3:]) pose_trans = xyz2mat(pose[:3]) pose_cam = self.V.dot(pose_trans.T).dot(pose_rot).T return np.concatenate([mat2xyz(pose_cam), safemat2quat(pose_cam[:3, :3].T)]) def get_num_instances(self): return len(self.instances) def get_poses(self): mat = [self.V.dot(self.poses_trans[i].T).dot( self.poses_rot[i]).T for i in range(self.get_num_instances())] poses = [np.concatenate( [mat2xyz(item), safemat2quat(item[:3, :3].T)]) for item in mat] return poses def get_egocentric_poses(self): return self.get_poses() def get_allocentric_poses(self): poses = self.get_poses() poses_allocentric = [] for pose in poses: dx = np.arctan2(pose[0], -pose[2]) dy = np.arctan2(pose[1], -pose[2]) quat = euler2quat(-dy, -dx, 0, axes='sxyz') quat = qmult(qinverse(quat), pose[3:]) poses_allocentric.append(np.concatenate([pose[:3], quat])) #print(quat, pose[3:], pose[:3]) return poses_allocentric def get_centers(self): centers = [] for i in range(len(self.poses_trans)): pose_trans = self.poses_trans[i] proj = (self.P.T.dot(self.V.dot( pose_trans.T).dot(np.array([0, 0, 0, 1])))) proj /= proj[-1] centers.append(proj[:2]) centers = np.array(centers) centers = (centers + 1) / 2.0 centers[:, 1] = 1 - centers[:, 1] centers = centers[:, ::-1] # in y, x order return centers def vis(self, poses, cls_indexes, color_idx=None, color_list=None, cam_pos=[0, 0, 2.0], V=None, distance=2.0, shifted_pose=None, interact=0, window_name='test'): """ a complicated visualization module """ theta = 0 cam_x, cam_y, cam_z = cam_pos sample = [] new_poses = [] origin = np.linalg.inv(unpack_pose(poses[0])) if shifted_pose is not None: origin = np.linalg.inv(shifted_pose) for pose in poses: pose = unpack_pose(pose) pose = origin.dot(pose) new_poses.append(pack_pose(pose)) poses = new_poses cam_pos = np.array([cam_x, cam_y, cam_z]) self.set_camera(cam_pos, cam_pos * 2 , [0, 1, 0]) if V is not None: self.V = V cam_pos = V[:3, 3] self.set_light_pos(cam_pos) self.set_poses(poses) mouse_events = { 'view_dir': - self.V[:3, 3], 'view_origin': np.array([0, 0, 0.]), # anchor '_mouse_ix': -1, '_mouse_iy': -1, 'down': False, 'shift': False, 'trackball': Trackball(self.width, self.height, cam_pos=cam_pos) } image_tensor = torch.cuda.FloatTensor(self.height, self.width, 4).detach() seg_tensor = torch.cuda.FloatTensor(self.height, self.width, 4).detach() def update_dir(): view_dir = mouse_events['view_origin'] - self.V[:3, 3] self.set_camera(self.V[:3, 3], self.V[:3, 3] - view_dir, [0, 1, 0]) # would shift along the sphere self.V = self.V.dot(mouse_events['trackball'].property["model"].T) def change_dir(event, x, y, flags, param): # fix later to be a finalized version if event == cv2.EVENT_LBUTTONDOWN: mouse_events['_mouse_ix'], mouse_events['_mouse_iy'] = x, y mouse_events['down'] = True if event == cv2.EVENT_MBUTTONDOWN: mouse_events['_mouse_ix'], mouse_events['_mouse_iy'] = x, y mouse_events['shift'] = True if event == cv2.EVENT_MOUSEMOVE: if mouse_events['down']: dx = (x - mouse_events['_mouse_ix']) / -10. dy = (y - mouse_events['_mouse_iy']) / -10. mouse_events['trackball'].on_mouse_drag(x,y,dx,dy) update_dir() if mouse_events['shift']: dx = (x - mouse_events['_mouse_ix']) / (-4000. / self.V[2, 3]) dy = (y - mouse_events['_mouse_iy']) / (-4000. / self.V[2, 3]) self.V[:3, 3] += 0.5 * np.array([dx, dy, 0]) mouse_events['view_origin'] += 0.5 * np.array([-dx, dy, 0]) # change update_dir() if event == cv2.EVENT_LBUTTONUP: mouse_events['down'] = False if event == cv2.EVENT_MBUTTONUP: mouse_events['shift'] = False if interact > 0: cv2.namedWindow(window_name) cv2.setMouseCallback(window_name, change_dir) # update_dir() img = np.zeros([self.height, self.width, 3]) while True: new_cam_pos = -self.V[:3, :3].T.dot(self.V[:3, 3]) q = cv2.waitKey(3) if interact > 0: if q == ord('w'): cam_z += 0.05 elif q == ord('s'): cam_z -= 0.05 interact = 2 elif q == ord('u'): interact = 1 elif q == ord('a'): theta -= 0.1 elif q == ord('d'): theta += 0.1 elif q == ord('x'): self.V[:3, 3] += 0.02 * (self.V[:3, 3] - mouse_events['view_origin']) update_dir() elif q == ord('c'): # move closer self.V[:3, 3] -= 0.02 * (self.V[:3, 3] - mouse_events['view_origin']) update_dir() elif q == ord('z'): # reset self.set_camera(cam_pos, cam_pos * 2 , [0, 1, 0]) mouse_events['trackball'].reinit(cam_pos) mouse_events['view_origin'] = np.zeros(3) elif q == ord('i'): for pose in poses: pose[1] += 0.02 elif q == ord('k'): for pose in poses: pose[1] -= 0.02 elif q == ord('j'): for pose in poses: pose[0] -= 0.02 elif q == ord('l'): for pose in poses: pose[0] += 0.02 elif q == ord('n'): print('camera V', self.V) elif q == ord('p'): cur_dir = os.path.dirname(os.path.abspath(__file__)) Image.fromarray( (np.clip(frame[0][:, :, [2,1,0]] * 255, 0, 255)).astype(np.uint8)).save(cur_dir + '/test.png') elif q == ord('q'): # wth break elif q == ord('r'): # rotate for pose in poses: pose[3:] = qmult(axangle2quat( [0, 0, 1], 5/180.0 * np.pi), pose[3:]) self.set_poses(poses) self.set_light_pos(new_cam_pos) # in world coordinate self.render(cls_indexes, image_tensor, seg_tensor) image_tensor = image_tensor.flip(0) img = image_tensor.cpu().numpy() img = np.clip(img, 0, 1) img = img[:, :, :3] * 255 img = img.astype(np.uint8) if interact > 0: cv2.imshow(window_name, img[:,:,::-1]) if interact < 2: break return img camera_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]]) def parse_args(): """ Parse input arguments """ parser = argparse.ArgumentParser(description='Train a Fast R-CNN network') parser.add_argument('--model_path', dest='model_path', help='path of the ycb models', default='../data', type=str) parser.add_argument('--robot_name', dest='robot_name', help='robot name', default='', type=str) args = parser.parse_args() return args if __name__ == '__main__': args = parse_args() model_path = args.model_path robot_name = args.robot_name width = 640 height = 480 renderer = YCBRenderer(width=width, height=height, render_marker=True, robot=robot_name) if robot_name == 'baxter': from robotPose.robot_pykdl import * print('robot name', robot_name) models = ['S0', 'S1', 'E0', 'E1', 'W0', 'W1', 'W2'] #models = ['E1'] obj_paths = [ 'robotPose/{}_models/{}.DAE'.format(robot_name,item) for item in models] colors = [ [0.1*(idx+1),0,0] for idx in range(len(models))] texture_paths = ['' for item in models] elif robot_name == 'panda_arm': from robotPose.robot_pykdl import * print('robot name', robot_name) models = ['link1', 'link2', 'link3', 'link4', 'link5', 'link6', 'link7', 'hand', 'finger', 'finger'] #models = ['link4'] obj_paths = [ 'robotPose/{}_models/{}.DAE'.format(robot_name,item) for item in models] colors = [ [0,0.1*(idx+1),0] for idx in range(len(models))] texture_paths = ['' for item in models] else: models = ["003_cracker_box", "002_master_chef_can", "011_banana"] colors = [[0.9, 0, 0], [0.6, 0, 0], [0.3, 0, 0]] obj_paths = [ '{}/models/{}/textured_simple.obj'.format(model_path, item) for item in models] texture_paths = [ '{}/models/{}/texture_map.png'.format(model_path, item) for item in models] print(obj_paths) renderer.load_objects(obj_paths, texture_paths, colors) # mat = pose2mat(pose) pose = np.array([-0.025801208, 0.08432201, 0.004528991, 0.9992879, -0.0021458883, 0.0304758, 0.022142926]) pose2 = np.array([-0.56162935, 0.05060109, -0.028915625, 0.6582951, 0.03479896, -0.036391996, -0.75107396]) pose3 = np.array([0.22380374, 0.019853603, 0.12159989, 0.9992879, -0.0021458883, 0.0304758, 0.022142926]) theta = 0 z = 1 fix_pos = [np.sin(theta), z, np.cos(theta)] renderer.set_camera(fix_pos, [0, 0, 0], [0, 1, 0]) fix_pos = np.zeros(3) renderer.set_poses([pose, pose2, pose3]) cls_indexes = [0, 1, 2] if robot_name == 'baxter' or robot_name == 'panda_arm' : import scipy.io as sio robot = robot_kinematics(robot_name) poses = [] if robot_name == 'baxter': base_link = 'right_arm_mount' else: base_link = 'panda_link0' pose, joint = robot.gen_rand_pose(base_link) cls_indexes = range(len(models)) pose = robot.offset_pose_center(pose, dir='off', base_link=base_link) #print pose_hand #pose = np.load('%s.npy'%robot_name) for i in range(len(pose)): pose_i = pose[i] quat = mat2quat(pose_i[:3,:3]) trans = pose_i[:3,3] poses.append(np.hstack((trans,quat))) renderer.set_poses(poses) renderer.V = camera_extrinsics renderer.set_projection_matrix(640,480,525,525,319.5,239.5,0.0001,6) fix_pos = renderer.V[:3, 3].reshape([1,3]).copy() renderer.set_light_pos([1, 1, 1]) renderer.set_light_color([1.0, 1.0, 1.0]) image_tensor = torch.cuda.FloatTensor(height, width, 4).detach() seg_tensor = torch.cuda.FloatTensor(height, width, 4).detach() import time start = time.time() while True: renderer.render(cls_indexes, image_tensor, seg_tensor) image_tensor = image_tensor.flip(0) seg_tensor = seg_tensor.flip(0) frame = [image_tensor.cpu().numpy(), seg_tensor.cpu().numpy()] centers = renderer.get_centers() for center in centers: x = int(center[1] * width) y = int(center[0] * height) frame[0][y-2:y+2, x-2:x+2, :] = 1 frame[1][y-2:y+2, x-2:x+2, :] = 1 if len(sys.argv) > 2 and sys.argv[2] == 'headless': # print(np.mean(frame[0])) theta += 0.001 if theta > 1: break else: #import matplotlib.pyplot as plt #plt.imshow(np.concatenate(frame, axis=1)) # plt.show() cv2.imshow('test', cv2.cvtColor( np.concatenate(frame, axis=1), cv2.COLOR_RGB2BGR)) q = cv2.waitKey(16) if q == ord('w'): z += 0.05 elif q == ord('s'): z -= 0.05 elif q == ord('a'): theta -= 0.1 elif q == ord('d'): theta += 0.1 elif q == ord('p'): Image.fromarray( (frame[0][:, :, :3] * 255).astype(np.uint8)).save('test.png') elif q == ord('q'): break elif q == ord('r'): # rotate pose[3:] = qmult(axangle2quat( [0, 0, 1], 5/180.0 * np.pi), pose[3:]) pose2[3:] = qmult(axangle2quat( [0, 0, 1], 5 / 180.0 * np.pi), pose2[3:]) pose3[3:] = qmult(axangle2quat( [0, 0, 1], 5 / 180.0 * np.pi), pose3[3:]) renderer.set_poses([pose, pose2, pose3]) cam_pos = fix_pos + np.array([np.sin(theta), z, np.cos(theta)]) if robot_name == 'baxter' or robot_name == 'panda_arm' : renderer.V[:3, 3] = np.array(cam_pos) else: cam_pos = fix_pos + np.array([np.sin(theta), z, np.cos(theta)]) renderer.set_camera(cam_pos, [0, 0, 0], [0, 1, 0]) #renderer.set_light_pos(cam_pos) dt = time.time() - start print("{} fps".format(1000 / dt)) renderer.release()