Tests & Snippets
⊹ Notes Python Embeding
Topic Link
Releases de CPython https://github.com/python/cpython/tags
Extension et embedding https://docs.python.org/3.10/extending/index.html
Empaqueter des binaires https://packaging.python.org/en/latest/guides/packaging-binary-extensions/

📖 Notes:

  • CPython est simplement le code source de Python non-compilé.
  • Blender, qui a un des meilleurs Python intégrés, n'utilise rien d'autres que l'API de CPython (pas Cython, cffi, SWIG ou Numba)
  • Le header <Python.h> doit être inclus avant tout autre module.

🚀 Objectifs:


🛠️ Compilation de CPython dans du C++:

1. Téléchargement de CPython

  • La première étape est de télécharger une version stable du code source depuis une release (tag) du dépôt de CPython.
  • Ce code est compatible avec l'utilisation de CMake pour la compilation du projet.
Warning
Le téléchargement devrait être fait dans le cmake, pas à la volée depuis le github de CPython.
Il semblerait que ces blocs puissent comprendre plusieurs lignes.
// header
void GLArea::on_realize();
Note
Cette fonction doit être appelée avant toute autre opération.
Todo:
Implémenter la prise en charge de la récupération d'erreurs.
Bug:
Ce bloc signale la présence d'un bug connu.
Deprecated:
Ce block indique la présence d'une entité en voie de déprécation (ou déjà supprimée).
Invariant
Ceci est un état maintenu par un objet ou un algorithme.

Ceci est une citation si je ne me trompe pas.

// header
void on_realize() override;
// implémentation
void GLArea::on_realize() {
Gtk::GLArea::on_realize(); // À ne pas oublier !!!
make_current();
GLenum error = glGetError();
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
}

2. Contenu du CMakeLists.txt

3. Configuration des variables d'environnement

Création d'entités customs en C++

  • Créer les données à rendre (vertices, faces, uv, couleurs, ...)
  • Créer les shaders, les compiler (vérifier le status de compilation), les assembler en programme et libérer les shaders de base.
  • Générer un VAO et le bind avant de continuer.
  • Générer un VBO, le bind, et y transférer les données de vertices.
  • Générer un EBO, le bind, et y transférer les données de faces.
  • Renseigner les informations d'interprétation du contenu du VBO (offset, stride, ...) et activer les attributs qui y sont contenus.
  • Unbind le VAO puis tous les autres buffers. Procédure (et ordre à suivre) pour debind les buffers:
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

Notes

  • Ne pas oublier le tag GL_DEPTH_BUFFER_BIT dans glClear() si set_has_depth_buffer(true) a été utilisé dans le constructeur. Sinon, rien ne sera rendu à l'écran sauf si la fenêtre est resized.
  • Quand on fait un setup de rendu, le VAO doit être le premier unbound, sinon, il record le fait qu'on fasse debind les buffers.
  • Dans la fonction glVertexAttribPointer, le premier index est celui qui doit être donné à glEnableVertexAttribArray ainsi que celui dans le shader dans (layout = N).

3. Le rendu

  • Les buffers sont automatiquement swapped dans on_render().

4. Destruction du contexte

  • on_unrealize est émis quand le contexte OpenGL est encore valide, juste avant que l'objet de soit détruit. C'est le moment de détruire toutes les ressources OpenGL (qui ne seront plus accessible quand le contexte OpenGL ne sera plus valide).

📌 Epoxy:

  • Équivalent de GLAD ou même GLEW, permet de faciliter l'utilisation de fonctions OpenGL.
  • Le header doit absolument être le premier de son unité de compilation. La solution trouvée a été de mettre Epoxy dans le .cpp uniquement. Configuration utilisée:
// main.cpp
#include <vector>
#include <gtkmm.h>
#include "header.hpp"
#include "other-header.hpp"
// header
#include <gtkmm/glarea.h>
// implementation
#include "header.hpp"
#include <epoxy/gl.h>
#include <epoxy/glx.h>