Giter VIP home page Giter VIP logo

jupyter_freecad's Introduction

FreeCAD inside Jupyter Notebook

Documentation Status Codacy Badge Language grade: Python

Introduction

A better IPython and Jupyter Notebook Integration for FreeCAD

Currently, FreeCAD's IPython and Jupyter Notebook integration can only provide visualization by running the entire FreeCAD GUI alongside the notebook. Besides not being elegant it brings many problems with it, like not being able to save the visualizations inside the notebook for sharing or bringing visual complexity of the entire GUI into the view instead of just displaying the 3D model. It is therefore important to find a way to visualize FreeCAD's 3D scene in the IPython display system as supported by Jupyter Notebook.

Tackling the open issue “IPython / Jupyter support” I aim to implement a IPython compatible visualization of FreeCAD’s 3D Open Inventor scene graph. To achieve this I intend to choose a suitable JavaScript library able to render a 3D scene graph and to implement a mapping between it and the Open Inventor scene graph. After this as a byproduct I want to implement a better WebGL export based on the scene graph instead of document objects as currently found in FreeCAD. For this I can reuse and integrate the scene graph mapping component. Lastly I want to document the results in the Wiki and create an example Jupyter notebook.

This project is part of Google Summer of Code 2020 and the corresponding thread in the FreeCAD forum can be found here. I wrote a blog post about the project here. My full project proposal can be found here.

Demo

Check out this static demo notebook, it gives an idea about the functionality even though selection and other interactivity is missing.

FreeCAD rendering inside the notebook demo

Current state

The freecadviewer module was only tested with basic shapes from the Part workbench so far. It's something to build on. There are some open problems for which I didn't have time before the GSoC deadline (see TODO in source):

  • highlighting of edges does not work (reason unclear, I couldn't find the error)
  • displaying the object names
  • showing vertices
  • typing the document object
  • fixed light source instead of the lightsource moving with rotation
  • problem with mocking modules in the documentation, the mock objects show up on the generated page: example

Future work

  • expanding the viewer to more FreeCAD workbenches with different scene graph structure
  • more advanced rotation and navigation
  • implementing the so much functionality in Javascript that selection will work on a static page

How to

Local install

Currently tested on Ubuntu 18.04.4 LTS and Debian 10 aka Buster.

  • Install FreeCAD, e.g. the daily build:
    sudo add-apt-repository ppa:freecad-maintainers/freecad-daily
    sudo apt-get update
    sudo apt-get install freecad-daily
    
  • Install Jupyter Notebook: sudo apt install jupyter-notebook
  • Clone this repository: git clone [email protected]:kryptokommunist/Jupyter_FreeCAD.git
  • Link external workbench (IPythonFreeCADViewer) from this repo to FreeCAD (use correct paths for your install):
    sudo ln -s /home/kryptokommunist/Documents/Jupyter_FreeCAD/IPythonFreeCADViewer/ /usr/shared/freecad-daily/Mod/Jupyter
    
  • Change working directory to this folder and install requirements:
    pip3 install -r requirements.txt
    
  • Install pythreejs to the notebook:
    jupyter nbextension install --py --symlink --sys-prefix pythreejs
    jupyter nbextension enable --py --sys-prefix pythreejs    
    
  • Start Jupyter Notebook with jupyter notebook
  • Check if you can render the example notebook. It should look somewhat like this.

Development

The relevant file can be found at IPythonFreeCADViewer/freecadviewer.py. Tools used for development are pylint for linting and mypy for static type checking. It can be useful to run the code inside the notebook first for faster development iterations.

I will continue to improve the project in the future. You can find the repository here. If you use the module and encounter any issues or just find it useful, don't hesitate to post to the forum thread or let me know with a tweet or an issue in the repository.

Thanks to my mentors @ickby, @kkremitzki, @yorik and the entire FreeCAD community for running such an awesome project. Thanks to @fluepke for hosting the development server.

Documentation

An API documentation is hosted on readthedocs.

jupyter_freecad's People

Contributors

kryptokommunist avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

jupyter_freecad's Issues

Trying to setup on Mac

Trying to setup onMac
sudo apt install jupyter-notebook`

Gives error
Unable to locate an executable at "/Library/Java/JavaVirtualMachines/jdk-15.0.1.jdk/Contents/Home/bin/apt" (-1)

ls /Library/Java/J*/jdk-15.0.1.jdk/C*/Home/bin

Gives
jaotc javap jfr jmod jstat jar jcmd jhsdb jpackage jstatd jarsigner jconsole jimage jps keytool java jdb jinfo jrunscript rmid javac jdeprscan jlink jshell rmiregistry javadoc jdeps jmap jstack serialver

Try to make the code run on MacOS BigSur : Error => No module named 'FreeCAD'

Hello,

I tried to implement the module for Jupiter notebook on MacOS and put the following :

"
import sys, os
JUPYTER_REPO_PATH = "/Users/myself/Jupyter_FreeCAD-master"
sys.path.append("/Applications/FreeCAD.app/Contents/Resources/lib/python3.6/site-packages")
sys.path.append(JUPYTER_REPO_PATH + "IPythonFreeCADViewer")
import FreeCAD, FreeCADGui
from freecadviewer import render_document, get_document_renderer

FreeCADGui.setupWithoutGUI()
"

The error that appears is related to the FreeCAD module:

"

ModuleNotFoundError Traceback (most recent call last)
in
8 sys.path.append(JUPYTER_REPO_PATH + "IPythonFreeCADViewer")
9
---> 10 import FreeCAD, FreeCADGui
11 from freecadviewer import render_document, get_document_renderer
12

ModuleNotFoundError: No module named 'FreeCAD'
"

but the module freecad (not FreeCAD) has been installed via Conda : "conda install FreeCAD" and the package is "freecad-0.18.3".

Minimal Prototype

Workflow:

  • Open Jupyter Notebook
    • import FreeCAD
    • use a function from a minimal external FreeCAD module to display some output

Deliverables:

  • external module
  • documentation on replicating the setup to follow the workflow

Open questions:

  • Can I extract the object name from the coin node?
    • otherwise I will have to do a manual mapping between them to display the name properly

Documentation does not give correct clone command.

Documentation gives clone command as git clone [email protected]:kryptokommunist/Jupyter_FreeCAD.git
which fails
Cloning into 'Jupyter_FreeCAD'...
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.`

Correct command using the Github copy facility is
git clone https://github.com/kryptokommunist/Jupyter_FreeCAD.git

Trying to adapt RealThunders notebook to work here

ln[1] : `import sys, os

#JUPYTER_REPO_PATH = "/opt/jupyter_freecad/"
JUPYTER_REPO_PATH = "/Users/keithsloan/Jupyter_FreeCAD"

#sys.path.append("/opt/freecad/freecad_build/lib")
sys.path.append("/Applications/FreeCAD_0.19-E.app/Contents/Resources/lib/python3.8/site-packages")
sys.path.append(JUPYTER_REPO_PATH + "IPythonFreeCADViewer")

import FreeCAD, FreeCADGui
from pivy import coin
from freecadviewer import render_document, get_document_renderer

FreeCADGui.setupWithoutGUI()
`

ln[2] : `scadstr='''
module example_intersection()
{
intersection() {
difference() {
union() {
cube([30, 30, 30], center = true);
translate([0, 0, -25])
cube([15, 15, 50], center = true);
}
union() {
cube([50, 10, 10], center = true);
cube([10, 50, 10], center = true);
cube([10, 10, 50], center = true);
}
}
translate([0, 0, 5])
cylinder(h = 50, r1 = 20, r2 = 5, center = true);
}
}

example_intersection();
'''
import OpenSCADUtils, importCSG
doc=FreeCAD.activeDocument() or FreeCAD.newDocument()
obj = doc.getObject('OpenSCADPart')
if obj:
for o in App.getDependentObjects(obj.Group, 1):
doc.removeObject(o.Name)
doc.removeObject(obj.Name)

covert the above OpenSCAD script into CSG script

tmpfilename=OpenSCADUtils.callopenscadstring(scadstr,'csg')
try:
# remember the existing objects
objset = set(doc.Objects)
# import CSG file
importCSG.insert(tmpfilename, doc.Name)
# find all new objects
objs = [obj for obj in doc.Objects if obj not in objset]
# create a part contain to hold new objects
group = doc.addObject('App::Part', 'OpenSCADPart')
group.Group = objs
# recompute and adjust the view to include the newly created objects
doc.recompute()
Gui.Selection.addSelection(group)
Gui.runCommand('Std_ViewSelectionExtend')
Gui.Selection.clearSelection()
finally:
os.unlink(tmpfilename)`

Gives error `ModuleNotFoundError Traceback (most recent call last)
in
22 example_intersection();
23 '''
---> 24 import OpenSCADUtils, importCSG
25 doc=FreeCAD.activeDocument() or FreeCAD.newDocument()
26 obj = doc.getObject('OpenSCADPart')

~/Library/Preferences/FreeCAD/Mod/OpenSCAD_Alt_Import/OpenSCADUtils.py in
31
32 try:
---> 33 from PySide import QtGui
34 _encoding = QtGui.QApplication.UnicodeUTF8
35 def translate(context, text):

/Applications/FreeCAD_0.19-E.app/Contents/Resources/Ext/PySide/init.py in
1 # PySide wrapper
----> 2 from PySide2 import version
3 from PySide2 import version_info

/Applications/FreeCAD_0.19-E.app/Contents/Resources/lib/python3.8/site-packages/PySide2/init.py in
49 os.environ['PATH'] = path
50
---> 51 _setupQtDirectories()

/Applications/FreeCAD_0.19-E.app/Contents/Resources/lib/python3.8/site-packages/PySide2/init.py in _setupQtDirectories()
19 # loads the libraries into the process memory beforehand, and
20 # thus takes care of it for us.
---> 21 import shiboken2
22 # Trigger signature initialization.
23 type.signature

/Applications/FreeCAD_0.19-E.app/Contents/Resources/lib/python3.8/site-packages/shiboken2/init.py in
25 import typing
26
---> 27 from .shiboken2 import *
28
29 # Trigger signature initialization.

ModuleNotFoundError: No module named 'shiboken2.shiboken2'
`

Trying to create a notebook to run on Mac.

Have tried to create a notebook to run on Mac
`import sys, os

#JUPYTER_REPO_PATH = "/opt/jupyter_freecad/"
JUPYTER_REPO_PATH = "/Users/keithsloan/Jupyter_FreeCAD"

#sys.path.append("/opt/freecad/freecad_build/lib")
sys.path.append("/Applications/FreeCAD_0.19-E.app/Contents/Resources/lib")
sys.path.append(JUPYTER_REPO_PATH + "IPythonFreeCADViewer")

import FreeCAD, FreeCADGui
from freecadviewer import render_document, get_document_renderer

FreeCADGui.setupWithoutGUI()`

But when I run I get
"ModuleNotFoundError Traceback (most recent call last)
in
9
10 import FreeCAD, FreeCADGui
---> 11 from freecadviewer import render_document, get_document_renderer
12
13 FreeCADGui.setupWithoutGUI()

~/Library/Preferences/FreeCAD/Mod/Jupyter/freecadviewer.py in
36 Picker, VertexNormalsHelper, PointLight, AmbientLight, PerspectiveCamera,
37 MeshLambertMaterial, OrbitControls, Renderer
---> 38 from pivy import coin
39 import numpy as np
40 from ipywidgets import HTML

ModuleNotFoundError: No module named 'pivy'
"
Yet if I try in FreeCAD python console
from privy import coin
It appears to work
`>>> from pivy import coin

print(dir(coin))
['COIN_MAJOR_VERSION', 'COIN_MICRO_VERSION', 'COIN_MINOR_VERSION', 'COIN_NAVIGATION_EVENT_PREFIX', 'COIN_NAVIGATION_PAN_TARGET_EVENT_PREFIX', 'COIN_NAVIGATION_ROTATE_TARGET_EVENT_PREFIX', 'COIN_NAVIGATION_SEEK_EVENT_PREFIX', 'COIN_NAVIGATION_SPIN_EVENT_PREFIX', 'COIN_NAVIGATION_ZOOM_TARGET_EVENT_PREFIX', 'COIN_VERSION', 'FALSE', 'GLU_AUTO_LOAD_MATRIX', 'GLU_CULLING', 'GLU_DISPLAY_MODE', 'GLU_DOMAIN_DISTANCE', 'GLU_ERROR', 'GLU_EXTENSIONS', 'GLU_FILL', 'GLU_LINE', 'GLU_MAP1_TRIM_2', 'GLU_MAP1_TRIM_3', 'GLU_NURBS_BEGIN', 'GLU_NURBS_BEGIN_DATA', 'GLU_NURBS_COLOR', 'GLU_NURBS_COLOR_DATA', 'GLU_NURBS_END', 'GLU_NURBS_END_DATA', 'GLU_NURBS_ERROR', 'GLU_NURBS_MODE', 'GLU_NURBS_NORMAL', 'GLU_NURBS_NORMAL_DATA', 'GLU_NURBS_RENDERER', 'GLU_NURBS_TESSELLATOR', 'GLU_NURBS_TEXTURE_COORD', 'GLU_NURBS_TEXTURE_COORD_DATA', 'GLU_NURBS_VERTEX', 'GLU_NURBS_VERTEX_DATA', 'GLU_OBJECT_PARAMETRIC_ERROR', 'GLU_OBJECT_PATH_LENGTH', 'GLU_OUTLINE_PATCH', 'GLU_OUTLINE_POLYGON', 'GLU_PARAMETRIC_ERROR', 'GLU_PARAMETRIC_TOLERANCE', 'GLU_PATH_LENGTH', 'GLU_POINT', 'GLU_SAMPLING_METHOD', 'GLU_SAMPLING_TOLERANCE', 'GLU_SILHOUETTE', 'GLU_TESS_BEGIN', 'GLU_TESS_BEGIN_DATA', 'GLU_TESS_COMBINE', 'GLU_TESS_END', 'GLU_TESS_END_DATA', 'GLU_TESS_ERROR', 'GLU_TESS_ERROR_DATA', 'GLU_TESS_MISSING_BEGIN_CONTOUR', 'GLU_TESS_MISSING_BEGIN_POLYGON', 'GLU_TESS_MISSING_END_CONTOUR', 'GLU_TESS_MISSING_END_POLYGON', 'GLU_TESS_NEED_COMBINE_CALLBACK', 'GLU_TESS_VERTEX', 'GLU_TESS_VERTEX_DATA', 'GLU_U_STEP', 'GLU_VERSION', 'GLU_V_STEP', 'GLX_DRAWABLE_TYPE', 'GLX_MAX_PBUFFER_HEIGHT', 'GLX_MAX_PBUFFER_PIXELS', 'GLX_MAX_PBUFFER_WIDTH', 'GLX_PBUFFER_BIT', 'GLX_PBUFFER_HEIGHT', 'GLX_PBUFFER_WIDTH', 'GLX_RENDER_TYPE', 'GLX_RGBA_BIT', 'GLX_RGBA_TYPE', 'GL_ACTIVE_TEXTURE', 'GL_ADD_SIGNED', 'GL_ALL_CLIENT_ATTRIB_BITS', 'GL_ALPHA16F_ARB', 'GL_ALPHA32F_ARB', 'GL_ARRAY_BUFFER', 'GL_BGR', 'GL_BIAS_BY_NEGATIVE_ONE_HALF_NV', 'GL_BUFFER_ACCESS', 'GL_BUFFER_MAPPED', 'GL_BUFFER_MAP_POINTER', 'GL_C3F_V3F', 'GL_C4F_N3F_V3F', 'GL_C4UB_V3F', 'GL_CLAMP_TO_BORDER', 'GL_CLAMP_TO_EDGE', 'GL_CLIENT_ACTIVE_TEXTURE', 'GL_CLIENT_ALL_ATTRIB_BITS', 'GL_CLIENT_PIXEL_STORE_BIT', 'GL_CLIENT_VERTEX_ARRAY_BIT', 'GL_COLOR_ARRAY', 'GL_COLOR_ATTACHMENT0', 'GL_COLOR_ATTACHMENT0_EXT', 'GL_COLOR_ATTACHMENT1', 'GL_COLOR_ATTACHMENT10', 'GL_COLOR_ATTACHMENT10_EXT', 'GL_COLOR_ATTACHMENT11', 'GL_COLOR_ATTACHMENT11_EXT', 'GL_COLOR_ATTACHMENT12', 'GL_COLOR_ATTACHMENT12_EXT', 'GL_COLOR_ATTACHMENT13', 'GL_COLOR_ATTACHMENT13_EXT', 'GL_COLOR_ATTACHMENT14', 'GL_COLOR_ATTACHMENT14_EXT', 'GL_COLOR_ATTACHMENT15', 'GL_COLOR_ATTACHMENT15_EXT', 'GL_COLOR_ATTACHMENT1_EXT', 'GL_COLOR_ATTACHMENT2', 'GL_COLOR_ATTACHMENT2_EXT', 'GL_COLOR_ATTACHMENT3', 'GL_COLOR_ATTACHMENT3_EXT', 'GL_COLOR_ATTACHMENT4', 'GL_COLOR_ATTACHMENT4_EXT', 'GL_COLOR_ATTACHMENT5', 'GL_COLOR_ATTACHMENT5_EXT', 'GL_COLOR_ATTACHMENT6', 'GL_COLOR_ATTACHMENT6_EXT', 'GL_COLOR_ATTACHMENT7', 'GL_COLOR_ATTACHMENT7_EXT', 'GL_COLOR_ATTACHMENT8', 'GL_COLOR_ATTACHMENT8_EXT', 'GL_COLOR_ATTACHMENT9', 'GL_COLOR_ATTACHMENT9_EXT', 'GL_COLOR_INDEX12_EXT', 'GL_COLOR_INDEX16_EXT', 'GL_COLOR_INDEX1_EXT', 'GL_COLOR_INDEX2_EXT', 'GL_COLOR_INDEX4_EXT', 'GL_COLOR_INDEX8_EXT', 'GL_COLOR_SUM_ARB', 'GL_COLOR_SUM_CLAMP_NV', 'GL_COLOR_TABLE', 'GL_COLOR_TABLE_ALPHA_SIZE_EXT', 'GL_COLOR_TABLE_BLUE_SIZE_EXT', 'GL_COLOR_TABLE_FORMAT_EXT', 'GL_COLOR_TABLE_GREEN_SIZE_EXT', 'GL_COLOR_TABLE_INTENSITY_SIZE_EXT', 'GL_COLOR_TABLE_LUMINANCE_SIZE_EXT', 'GL_COLOR_TABLE_RED_SIZE_EXT', 'GL_COLOR_TABLE_WIDTH', 'GL_COMBINE', 'GL_COMBINER0_NV', 'GL_COMBINER1_NV', 'GL_COMBINER2_NV', 'GL_COMBINER3_NV', 'GL_COMBINER4_NV', 'GL_COMBINER5_NV', 'GL_COMBINER6_NV', 'GL_COMBINER7_NV', 'GL_COMBINER_AB_DOT_PRODUCT_NV', 'GL_COMBINER_AB_OUTPUT_NV', 'GL_COMBINER_BIAS_NV', 'GL_COMBINER_CD_DOT_PRODUCT_NV', 'GL_COMBINER_CD_OUTPUT_NV', 'GL_COMBINER_COMPONENT_USAGE_NV', 'GL_COMBINER_INPUT_NV', 'GL_COMBINER_MAPPING_NV', 'GL_COMBINER_MUX_SUM_NV', 'GL_COMBINER_SCALE_NV', 'GL_COMBINER_SUM_OUTPUT_NV', 'GL_COMBINE_ALPHA', 'GL_COMBINE_RGB', 'GL_COMPARE_R_TO_TEXTURE', 'GL_COMPRESSED_ALPHA_ARB', 'GL_COMPRESSED_INTENSITY_ARB', 'GL_COMPRESSED_LUMINANCE_ALPHA_ARB', 'GL_COMPRESSED_LUMINANCE_ARB', 'GL_COMPRESSED_RGBA_ARB', 'GL_COMPRESSED_RGB_ARB', 'GL_COMPRESSED_TEXTURE_FORMATS_ARB', 'GL_CONSTANT', 'GL_CONSTANT_COLOR0_NV', 'GL_CONSTANT_COLOR1_NV', 'GL_CONST_EYE_NV', 'GL_CULL_FRAGMENT_NV', 'GL_CULL_MODES_NV', 'GL_CURRENT_MATRIX_ARB', 'GL_CURRENT_MATRIX_STACK_DEPTH_ARB', 'GL_CURRENT_QUERY', 'GL_CURRENT_VERTEX_ATTRIB_ARB', 'GL_DEPENDENT_AR_TEXTURE_2D_NV', 'GL_DEPENDENT_GB_TEXTURE_2D_NV', 'GL_DEPTH24_STENCIL8', 'GL_DEPTH_ATTACHMENT', 'GL_DEPTH_ATTACHMENT_EXT', 'GL_DEPTH_COMPONENT16', 'GL_DEPTH_COMPONENT24', 'GL_DEPTH_COMPONENT32', 'GL_DEPTH_STENCIL', 'GL_DEPTH_STENCIL_ATTACHMENT', 'GL_DEPTH_TEXTURE_MODE', 'GL_DISCARD_NV', 'GL_DOT3_RGB', 'GL_DOT3_RGBA', 'GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV', 'GL_DOT_PRODUCT_DEPTH_REPLACE_NV', 'GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV', 'GL_DOT_PRODUCT_NV', 'GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV', 'GL_DOT_PRODUCT_TEXTURE_2D_NV', 'GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV', 'GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV', 'GL_DRAW_FRAMEBUFFER', 'GL_DRAW_FRAMEBUFFER_BINDING', 'GL_DSDT8_MAG8_INTENSITY8_NV', 'GL_DSDT8_MAG8_NV', 'GL_DSDT8_NV', 'GL_DSDT_MAG_INTENSITY_NV', 'GL_DSDT_MAG_NV', 'GL_DSDT_MAG_VIB_NV', 'GL_DSDT_NV', 'GL_DS_BIAS_NV', 'GL_DS_SCALE_NV', 'GL_DT_BIAS_NV', 'GL_DT_SCALE_NV', 'GL_DYNAMIC_COPY', 'GL_DYNAMIC_DRAW', 'GL_DYNAMIC_READ', 'GL_ELEMENT_ARRAY_BUFFER', 'GL_EXPAND_NEGATE_NV', 'GL_EXPAND_NORMAL_NV', 'GL_E_TIMES_F_NV', 'GL_FLOAT_MAT2_ARB', 'GL_FLOAT_MAT3_ARB', 'GL_FLOAT_MAT4_ARB', 'GL_FLOAT_VEC2_ARB', 'GL_FLOAT_VEC3_ARB', 'GL_FLOAT_VEC4_ARB', 'GL_FRAGMENT_PROGRAM_ARB', 'GL_FRAGMENT_SHADER_ARB', 'GL_FRAMEBUFFER', 'GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE', 'GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE', 'GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING', 'GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE', 'GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE', 'GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE', 'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME', 'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT', 'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE', 'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT', 'GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE', 'GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE', 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET', 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT', 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE', 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT', 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER', 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL', 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT', 'GL_FRAMEBUFFER_BINDING', 'GL_FRAMEBUFFER_BINDING_EXT', 'GL_FRAMEBUFFER_COMPLETE', 'GL_FRAMEBUFFER_COMPLETE_EXT', 'GL_FRAMEBUFFER_DEFAULT', 'GL_FRAMEBUFFER_EXT', 'GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT', 'GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT', 'GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT', 'GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER', 'GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT', 'GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT', 'GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT', 'GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT', 'GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT', 'GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT', 'GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE', 'GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER', 'GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT', 'GL_FRAMEBUFFER_UNDEFINED', 'GL_FRAMEBUFFER_UNSUPPORTED', 'GL_FRAMEBUFFER_UNSUPPORTED_EXT', 'GL_FUNC_ADD', 'GL_FUNC_REVERSE_SUBTRACT', 'GL_FUNC_SUBTRACT', 'GL_GENERATE_MIPMAP_HINT_SGIS', 'GL_GENERATE_MIPMAP_SGIS', 'GL_GEOMETRY_INPUT_TYPE_EXT', 'GL_GEOMETRY_OUTPUT_TYPE_EXT', 'GL_GEOMETRY_SHADER_EXT', 'GL_GEOMETRY_VERTICES_OUT_EXT', 'GL_GLEXT_PROTOTYPES', 'GL_HALF_BIAS_NEGATE_NV', 'GL_HALF_BIAS_NORMAL_NV', 'GL_HILO16_NV', 'GL_HILO_NV', 'GL_HI_BIAS_NV', 'GL_HI_SCALE_NV', 'GL_INDEX', 'GL_INDEX_ARRAY', 'GL_INTENSITY16F_ARB', 'GL_INTENSITY32F_ARB', 'GL_INTERPOLATE', 'GL_INT_VEC2_ARB', 'GL_INT_VEC3_ARB', 'GL_INT_VEC4_ARB', 'GL_INVALID_FRAMEBUFFER_OPERATION', 'GL_INVALID_FRAMEBUFFER_OPERATION_EXT', 'GL_LO_BIAS_NV', 'GL_LO_SCALE_NV', 'GL_LUMINANCE16F_ARB', 'GL_LUMINANCE32F_ARB', 'GL_LUMINANCE_ALPHA16F_ARB', 'GL_LUMINANCE_ALPHA32F_ARB', 'GL_MAGNITUDE_BIAS_NV', 'GL_MAGNITUDE_SCALE_NV', 'GL_MATRIX0_ARB', 'GL_MATRIX10_ARB', 'GL_MATRIX11_ARB', 'GL_MATRIX12_ARB', 'GL_MATRIX13_ARB', 'GL_MATRIX14_ARB', 'GL_MATRIX15_ARB', 'GL_MATRIX16_ARB', 'GL_MATRIX17_ARB', 'GL_MATRIX18_ARB', 'GL_MATRIX19_ARB', 'GL_MATRIX1_ARB', 'GL_MATRIX20_ARB', 'GL_MATRIX21_ARB', 'GL_MATRIX22_ARB', 'GL_MATRIX23_ARB', 'GL_MATRIX24_ARB', 'GL_MATRIX25_ARB', 'GL_MATRIX26_ARB', 'GL_MATRIX27_ARB', 'GL_MATRIX28_ARB', 'GL_MATRIX29_ARB', 'GL_MATRIX2_ARB', 'GL_MATRIX30_ARB', 'GL_MATRIX31_ARB', 'GL_MATRIX3_ARB', 'GL_MATRIX4_ARB', 'GL_MATRIX5_ARB', 'GL_MATRIX6_ARB', 'GL_MATRIX7_ARB', 'GL_MATRIX8_ARB', 'GL_MATRIX9_ARB', 'GL_MAX', 'GL_MAX_3D_TEXTURE_SIZE', 'GL_MAX_COLOR_ATTACHMENTS', 'GL_MAX_COLOR_ATTACHMENTS_EXT', 'GL_MAX_CUBE_MAP_TEXTURE_SIZE', 'GL_MAX_GENERAL_COMBINERS_NV', 'GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT', 'GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT', 'GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT', 'GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT', 'GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT', 'GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB', 'GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB', 'GL_MAX_PROGRAM_ATTRIBS_ARB', 'GL_MAX_PROGRAM_ENV_PARAMETERS_ARB', 'GL_MAX_PROGRAM_INSTRUCTIONS_ARB', 'GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB', 'GL_MAX_PROGRAM_MATRICES_ARB', 'GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB', 'GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB', 'GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB', 'GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB', 'GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB', 'GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB', 'GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB', 'GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB', 'GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB', 'GL_MAX_PROGRAM_PARAMETERS_ARB', 'GL_MAX_PROGRAM_TEMPORARIES_ARB', 'GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB', 'GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB', 'GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT', 'GL_MAX_RECTANGLE_TEXT
`

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.